@dignite-ng/expand.dynamic-form 3.1.12 → 3.2.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.
|
@@ -174,15 +174,50 @@ export class TreeConfigComponent {
|
|
|
174
174
|
get keyInput() {
|
|
175
175
|
return this.nodeForm?.get('key');
|
|
176
176
|
}
|
|
177
|
-
|
|
177
|
+
/**
|
|
178
|
+
* 验证器:检查字符串格式和唯一性
|
|
179
|
+
* @description 格式只允许字母、数字、下划线和短横线,且值在树中必须唯一
|
|
180
|
+
*/
|
|
181
|
+
keyValidator() {
|
|
178
182
|
return (control) => {
|
|
179
183
|
const regex = /^[a-zA-Z0-9_-]+$/;
|
|
180
184
|
if (control.value && !regex.test(control.value)) {
|
|
181
185
|
return { repetition: this._LocalizationService.instant(`Cms::SlugValidatorsText`) };
|
|
182
186
|
}
|
|
187
|
+
// 检查唯一性
|
|
188
|
+
if (control.value && this.isKeyExists(control.value)) {
|
|
189
|
+
return { repetition: this._LocalizationService.instant(`Cms::ValueAlreadyExis`) };
|
|
190
|
+
}
|
|
183
191
|
return null;
|
|
184
192
|
};
|
|
185
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* 检查 key 是否在树中已存在
|
|
196
|
+
* @param key 要检查的 key 值
|
|
197
|
+
* @returns 如果存在返回 true,否则返回 false
|
|
198
|
+
*/
|
|
199
|
+
isKeyExists(key) {
|
|
200
|
+
const currentKey = this.selectTree?.key;
|
|
201
|
+
return this.findKeyInNodes(this.nodes, key, currentKey);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 递归查找 key 是否存在于节点中
|
|
205
|
+
* @param nodes 节点数组
|
|
206
|
+
* @param targetKey 要查找的 key
|
|
207
|
+
* @param excludeKey 要排除的 key(编辑时排除当前节点)
|
|
208
|
+
* @returns 如果找到返回 true,否则返回 false
|
|
209
|
+
*/
|
|
210
|
+
findKeyInNodes(nodes, targetKey, excludeKey) {
|
|
211
|
+
for (const node of nodes) {
|
|
212
|
+
if (node.key === targetKey && node.key !== excludeKey) {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
if (node.children?.length && this.findKeyInNodes(node.children, targetKey, excludeKey)) {
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
186
221
|
/**创建节点 */
|
|
187
222
|
addNodeBtn() {
|
|
188
223
|
this.isVisible = true;
|
|
@@ -190,7 +225,7 @@ export class TreeConfigComponent {
|
|
|
190
225
|
this.selectTree = null;
|
|
191
226
|
this.nodeForm = this.fb.group({
|
|
192
227
|
title: ['', Validators.required],
|
|
193
|
-
key: ['', [Validators.required, this.
|
|
228
|
+
key: ['', [Validators.required, this.keyValidator()]],
|
|
194
229
|
isChecked: [false],
|
|
195
230
|
children: new FormArray([]),
|
|
196
231
|
});
|
|
@@ -202,7 +237,7 @@ export class TreeConfigComponent {
|
|
|
202
237
|
this.selectTree = node;
|
|
203
238
|
this.nodeForm = this.fb.group({
|
|
204
239
|
title: [node.title, Validators.required],
|
|
205
|
-
key: [node.key, [Validators.required, this.
|
|
240
|
+
key: [node.key, [Validators.required, this.keyValidator()]],
|
|
206
241
|
isChecked: [node.origin?.isChecked ?? false],
|
|
207
242
|
children: new FormArray([]),
|
|
208
243
|
});
|
|
@@ -214,7 +249,7 @@ export class TreeConfigComponent {
|
|
|
214
249
|
this.selectTree = node;
|
|
215
250
|
this.nodeForm = this.fb.group({
|
|
216
251
|
title: ['', Validators.required],
|
|
217
|
-
key: ['', [Validators.required, this.
|
|
252
|
+
key: ['', [Validators.required, this.keyValidator()]],
|
|
218
253
|
isChecked: [false],
|
|
219
254
|
children: new FormArray([]),
|
|
220
255
|
});
|
|
@@ -583,4 +618,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
583
618
|
type: ViewChild,
|
|
584
619
|
args: ['nodeModalSubmit', { static: false }]
|
|
585
620
|
}] } });
|
|
586
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsU0FBUyxFQUNULFdBQVcsRUFFWCxTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7O0FBT25ELE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFBb0IsRUFBZSxFQUFVLGVBQWdDO1FBQXpELE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUE2QnJFLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQThEeEMsWUFBWTtRQUNaLHFCQUFxQjtRQUNyQix5RkFBeUY7UUFDekYsK0NBQStDO1FBQy9DLElBQUk7UUFFSixZQUFZO1FBQ1osVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUVsQixZQUFZO1FBQ1osbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFFM0IsWUFBWTtRQUNaLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBOER0QixhQUFhO1FBQ2Isa0JBQWEsR0FBa0IsS0FBSyxDQUFDO1FBQ3JDLFdBQVc7UUFDWCxjQUFTLEdBQWtCLEtBQUssQ0FBQztRQUVqQyxxQkFBcUI7UUFDckIsY0FBUyxHQUFrQixLQUFLLENBQUM7UUFjekIseUJBQW9CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUExTHFCLENBQUM7SUFHakYsSUFDVyxJQUFJLENBQUMsQ0FBTTtRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBSUQsSUFDVyxRQUFRLENBQUMsQ0FBTTtRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBSUQsSUFDVyxNQUFNLENBQUMsQ0FBWTtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsbUJBQW1CLENBQWMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFjLENBQUM7SUFDekUsQ0FBQztJQUdELEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVztZQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3JFLElBQUksU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekQsQ0FBQztnQkFFRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDaEMsOEVBQThFO2dCQUM5RSxpQ0FBaUM7Z0JBQ2pDLGlDQUFpQztnQkFDakMseUVBQXlFO2dCQUN6RSxzQ0FBc0M7Z0JBQ3RDLE1BQU07Z0JBQ04sMkJBQTJCO2dCQUMzQixJQUFJO2dCQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7b0JBQ2hDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUI7aUJBQ3BDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTix5QkFBeUI7WUFDM0IsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILDZCQUE2QjtJQUM3Qix3REFBd0Q7SUFDeEQsc0NBQXNDO0lBQ3RDLHFEQUFxRDtJQUNyRCxpQ0FBaUM7SUFDakMscUNBQXFDO0lBQ3JDLFFBQVE7SUFDUixJQUFJO0lBQ0oseUJBQXlCO0lBQ3pCLG9CQUFvQixDQUFDLEtBQUs7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMzQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUMxQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFpQkQsaUJBQWlCO0lBQ2pCLGNBQWMsQ0FBQyxLQUFVO1FBQ3ZCLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDekMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7YUFBTSxDQUFDO1lBQ04sY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUVyQyxvQkFBb0I7UUFDcEIsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELCtCQUErQjtJQUMvQixXQUFXLENBQUMsS0FBWSxFQUFFLFFBQWlCO1FBQ3pDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHFCQUFxQjtJQUNiLGNBQWMsQ0FBQyxLQUFZO1FBQ2pDLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVk7SUFDSixtQkFBbUI7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWE7WUFDaEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQWdCRCxZQUFZO0lBQ0osWUFBWTtRQUNsQixPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQWdCLENBQUM7SUFDbEQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLENBQUMsT0FBd0IsRUFBaUMsRUFBRTtZQUNqRSxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQztZQUNqQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO1lBQ3RGLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVO0lBQ1YsVUFBVTtRQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDNUIsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDaEMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQzNELFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNsQixRQUFRLEVBQUUsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxVQUFVO0lBQ1YsV0FBVyxDQUFDLElBQVM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUM1QixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDeEMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUNqRSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUM7WUFDNUMsUUFBUSxFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsV0FBVztJQUNYLGtCQUFrQixDQUFDLElBQVM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUM1QixLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNoQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDM0QsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFdBQVc7SUFDWCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUNELFlBQVk7SUFDWixnQkFBZ0I7UUFDZCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQWdCLENBQUM7UUFFdkYsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLFFBQVE7Z0JBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEQsVUFBVTtnQkFDVixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsY0FBYyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPO2dCQUNQLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVE7WUFDUixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsYUFBYTtJQUNMLFlBQVksQ0FBQyxLQUFZLEVBQUUsU0FBaUIsRUFBRSxPQUFZO1FBQ2hFLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbEYsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGNBQWM7SUFDTixxQkFBcUIsQ0FBQyxJQUFTLEVBQUUsV0FBZ0I7UUFDdkQsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDekMsQ0FBQztJQUVELFVBQVU7SUFDVixpQkFBaUIsQ0FBQyxJQUFTO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFlBQVk7SUFDSixVQUFVLENBQUMsS0FBWSxFQUFFLFNBQWlCO1FBQ2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMvQixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDL0UsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDRCQUE0QjtJQUNwQix3QkFBd0I7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRSxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDTixtQkFBbUIsQ0FBQyxJQUFTO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDN0MsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM1QyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztZQUNuQyxRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMEJBQTBCO0lBQ2xCLFNBQVMsQ0FBQyxJQUFTO1FBQ3pCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakQsT0FBTztZQUNMLEtBQUs7WUFDTCxHQUFHO1lBQ0gsU0FBUztZQUNULFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQy9FLENBQUM7SUFDSixDQUFDO0lBRUQsc0NBQXNDO0lBQzlCLHlCQUF5QixDQUFDLFdBQWtCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU0sTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNsQixHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ2pCLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEtBQUs7Z0JBQ25DLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUN6RixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFFBQVE7SUFDUixjQUFjLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxPQUFPO1FBQ1AsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBZ0IsQ0FBQztRQUN2RixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGdDQUFnQztJQUN4QixrQkFBa0IsQ0FBQyxLQUFZO1FBQ3JDLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1Ysa0JBQWtCLENBQUMsS0FBWSxFQUFFLE1BQWdCO1FBQ3ZELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWM7SUFDZCxpQkFBaUIsQ0FBQyxLQUFVLEVBQUUsSUFBUztRQUNyQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBZ0IsQ0FBQztRQUN2RixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO1FBRTNDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3RELElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtJQUNULGVBQWUsQ0FBQyxLQUFZO1FBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7SUFDVCxjQUFjLENBQUMsS0FBWSxFQUFFLFNBQWlCLEVBQUUsT0FBZ0I7UUFDdEUsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO2dCQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNwRixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsb0JBQW9CO0lBQ1osa0JBQWtCLENBQUMsUUFBZSxFQUFFLE9BQWdCO1FBQzFELEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsS0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFDMUIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO0lBQ0wscUJBQXFCLENBQUMsS0FBWSxFQUFFLFNBQWlCLEVBQUUsU0FBYyxJQUFJO1FBQy9FLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN4QixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDeEYsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDZCQUE2QjtJQUNyQixrQkFBa0IsQ0FBQyxLQUFZLEVBQUUsU0FBaUIsRUFBRSxPQUFnQjtRQUMxRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3hGLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRO0lBQ1IsUUFBUSxDQUFDLEtBQVU7UUFDakIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNoQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFdEIsV0FBVztRQUNYLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBRXpCLHlCQUF5QjtRQUN6QixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNkLGdCQUFnQjtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFdBQVc7WUFDWCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGFBQWE7SUFDTCxlQUFlLENBQ3JCLEtBQVksRUFDWixTQUFpQixFQUNqQixTQUFnQixJQUFJLEVBQ3BCLFFBQWdCLENBQUMsQ0FBQztRQUVsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZGLElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGlCQUFpQjtJQUNULGdCQUFnQixDQUN0QixLQUFZLEVBQ1osU0FBaUIsRUFDakIsT0FBWSxFQUNaLFFBQWdCO1FBRWhCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLFdBQVcsR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUNFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTTtnQkFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFDdEUsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLGtCQUFrQixDQUFDLElBQVM7UUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDbEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxvQkFBb0I7SUFDWixrQkFBa0IsQ0FBQyxRQUFlO1FBQ3hDLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsaUJBQWlCO0lBQ1QsYUFBYSxDQUFDLEtBQVksRUFBRSxHQUFXO1FBQzdDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDckQsSUFBSSxLQUFLO29CQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzNGLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUEwQixFQUFFLEVBQUU7WUFDaEQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLE1BQU0sQ0FBQztZQUM3RSxRQUFRLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBcm1CVSxtQkFBbUI7a0dBQW5CLG1CQUFtQix1VkMzQmhDLHd1UEFzSFk7OzJGRDNGQyxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsZ0JBQWdCOzhHQVNmLElBQUk7c0JBRGQsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQVFLLE1BQU07c0JBRGhCLEtBQUs7Z0JBV3NDLFdBQVc7c0JBQXRELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFxSk8sZUFBZTtzQkFBL0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yICovXHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQXJyYXksXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmVlQ29uZmlnIH0gZnJvbSAnLi90cmVlLWNvbmZpZyc7XHJcbmltcG9ydCB7IFRvUGlueWluU2VydmljZSB9IGZyb20gJ0BkaWduaXRlLW5nL2V4cGFuZC5jb3JlJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RmLXRyZWUtY29uZmlnJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RyZWUtY29uZmlnLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlQ29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgdG9QaW55aW5TZXJ2aWNlOiBUb1BpbnlpblNlcnZpY2UpIHt9XHJcbiAgLyoq6KGo5Y2V5o6n5Lu257G75Z6LICovXHJcbiAgX3R5cGU6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgdHlwZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3R5cGUgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6YCJ5oup55qE6KGo5Y2V5L+h5oGvICovXHJcbiAgX3NlbGVjdGVkOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHY6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6KGo5Y2V5a6e5L2TICovXHJcbiAgZm9ybUVudGl0eTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBFbnRpdHkodjogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLmZvcm1FbnRpdHkgPSB2O1xyXG4gICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgfVxyXG4gIGdldCBmb3JtQ29uZmlndXJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1FbnRpdHk/LmdldCgnZm9ybUNvbmZpZ3VyYXRpb24nKSBhcyBGb3JtR3JvdXA7XHJcbiAgfVxyXG4gIGdldCBUcmVlT3B0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWd1cmF0aW9uPy5jb250cm9sc1snVHJlZVZpZXcuTm9kZXMnXSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XHJcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIGFzeW5jIGRhdGFMb2FkZWQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtRW50aXR5ICYmIHRoaXMuX3R5cGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEFmdGVySW5pdCgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgdGhpcy5mb3JtRW50aXR5Py5zZXRDb250cm9sKCdmb3JtQ29uZmlndXJhdGlvbicsIHRoaXMuZmIuZ3JvdXAobmV3IFRyZWVDb25maWcoKSkpO1xyXG4gICAgICB0aGlzLlRyZWVPcHRpb25zPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKV0pO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIOaJi+WKqOinpuWPkeWPmOabtOajgOa1i1xyXG4gICAgICB0aGlzLnN1Ym1pdGNsaWNrPy5uYXRpdmVFbGVtZW50Py5jbGljaygpO1xyXG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQgJiYgdGhpcy5fc2VsZWN0ZWQuZm9ybUNvbnRyb2xOYW1lID09IHRoaXMuX3R5cGUpIHtcclxuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvblsnVHJlZVZpZXcuTm9kZXMnXTtcclxuICAgICAgICBpZiAodHJlZU5vZGVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXModHJlZU5vZGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICAgICAgLy8gZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uWydUcmVlVmlldy5Ob2RlcyddKSB7XHJcbiAgICAgICAgLy8gICBmb3IgKGNvbnN0IGtleSBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50W2tleV07XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNhcGl0YWxpemVkS2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpO1xyXG4gICAgICAgIC8vICAgICBlbGVtZW50W2NhcGl0YWxpemVkS2V5XSA9IGl0ZW07XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAuLi50aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvbixcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5b2T6YCJ5oup6aG555qE5paH5pys5Y+R55Sf5Y+Y5YyW5pe277yM5pu05paw5a+55bqU55qE5YC8XHJcbiAgICogQHBhcmFtIGV2ZW50IOi+k+WFpeS6i+S7tuWvueixoVxyXG4gICAqIEBwYXJhbSBpbmRleCDpgInmi6npobnnmoTntKLlvJXkvY3nva5cclxuICAgKiBAZGVzY3JpcHRpb24g5aaC5p6c6YCJ5oup6aG55bey5pyJVmFsdWXlgLzliJnkuI3lpITnkIbvvIzlkKbliJnlsIbkuK3mlofmlofmnKzovazmjaLkuLrmi7zpn7PkvZzkuLpWYWx1ZeWAvFxyXG4gICAqL1xyXG4gIC8vIHRleHRDaGFuZ2UoZXZlbnQsIGluZGV4KSB7XHJcbiAgLy8gICBjb25zdCBUcmVlT3B0aW9uc0l0ZW0gPSB0aGlzLlRyZWVPcHRpb25zLmF0KGluZGV4KTtcclxuICAvLyAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gIC8vICAgaWYgKFRyZWVPcHRpb25zSXRlbS5nZXQoJ1ZhbHVlJyk/LnZhbHVlKSByZXR1cm47XHJcbiAgLy8gICBUcmVlT3B0aW9uc0l0ZW0ucGF0Y2hWYWx1ZSh7XHJcbiAgLy8gICAgIFZhbHVlOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG4gIC8qKuWtl+auteagh+etvmlucHV05aSx5Y675qCH54K555Sf5oiQ5a2X5q615ZCN5a2XICovXHJcbiAgZGlzUGxheU5hbWVJbnB1dEJsdXIoZXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5ub2RlRm9ybSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBwaW55aW4gPSB0aGlzLnRvUGlueWluU2VydmljZS5nZXQodmFsdWUpO1xyXG4gICAgY29uc3QgbmFtZUlucHV0ID0gdGhpcy5ub2RlRm9ybS5nZXQoJ2tleScpO1xyXG4gICAgaWYgKCFuYW1lSW5wdXQgfHwgbmFtZUlucHV0LnZhbHVlKSByZXR1cm47XHJcbiAgICBuYW1lSW5wdXQucGF0Y2hWYWx1ZShwaW55aW4pO1xyXG4gIH1cclxuXHJcbiAgLyoq6LCD5pW06KGo5qC85L2N572uICovXHJcbiAgLy8gZHJvcChldmVudDogYW55KSB7XHJcbiAgLy8gICBtb3ZlSXRlbUluQXJyYXkodGhpcy5UcmVlT3B0aW9ucy5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAvLyAgIHRoaXMuVHJlZU9wdGlvbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLyoqdHJlZeaVsOaNriAqL1xyXG4gIG5vZGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvKirlt7LlsZXlvIDnmoToioLngrkgKi9cclxuICBhbkV4cGFuZGVkTm9kZTogYW55W10gPSBbXTtcclxuXHJcbiAgLyoq5piv5ZCm5YWo6YOo5bGV5byAICovXHJcbiAgaXNBbGxFeHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICAvKirngrnlh7vlsZXlvIDmoJHoioLngrnlm77moIfop6blj5EgKi9cclxuICBuekV4cGFuZENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgYW5FeHBhbmRlZE5vZGUgPSB0aGlzLmFuRXhwYW5kZWROb2RlO1xyXG4gICAgaWYgKGFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKGV2ZW50Lm5vZGUua2V5KSkge1xyXG4gICAgICBhbkV4cGFuZGVkTm9kZSA9IGFuRXhwYW5kZWROb2RlLmZpbHRlcihrZXkgPT4ga2V5ICE9PSBldmVudC5ub2RlLmtleSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbkV4cGFuZGVkTm9kZS5wdXNoKGV2ZW50Lm5vZGUua2V5KTtcclxuICAgIH1cclxuICAgIHRoaXMuYW5FeHBhbmRlZE5vZGUgPSBhbkV4cGFuZGVkTm9kZTtcclxuXHJcbiAgICAvLyDmo4Dmn6XmmK/lkKbmiYDmnInmnInlrZDoioLngrnnmoToioLngrnpg73lt7LlsZXlvIBcclxuICAgIC8vIGNvbnN0IGFsbEtleXMgPSB0aGlzLmdldEFsbE5vZGVLZXlzKHRoaXMubm9kZXMpO1xyXG4gICAgdGhpcy5pc0FsbEV4cGFuZGVkID0gYW5FeHBhbmRlZE5vZGUubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIC8qKuWIh+aNouWxleW8gC/mlLbnvKnmiYDmnInoioLngrkgKi9cclxuICB0b2dnbGVFeHBhbmRBbGwoKSB7XHJcbiAgICB0aGlzLmlzQWxsRXhwYW5kZWQgPSAhdGhpcy5pc0FsbEV4cGFuZGVkO1xyXG4gICAgdGhpcy5hbkV4cGFuZGVkTm9kZSA9IHRoaXMuaXNBbGxFeHBhbmRlZCA/IHRoaXMuZ2V0QWxsTm9kZUtleXModGhpcy5ub2RlcykgOiBbXTtcclxuICAgIGlmICghdGhpcy5pc0FsbEV4cGFuZGVkKSB7XHJcbiAgICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5zZXRFeHBhbmRlZCh0aGlzLm5vZGVzLCBmYWxzZSldO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICAvL+mAkuW9kuiuvue9rm5vZGVz5Lit55qEZXhwYW5kZWTlgLwg5bm25LiU6L+U5Zue5LiA5Liq5pWw57uEXHJcbiAgc2V0RXhwYW5kZWQobm9kZXM6IGFueVtdLCBleHBhbmRlZDogYm9vbGVhbik6IHN0cmluZ1tdIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWQ7XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy5zZXRFeHBhbmRlZChub2RlLmNoaWxkcmVuLCBleHBhbmRlZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBub2RlcztcclxuICB9XHJcblxyXG4gIC8qKuiOt+WPluaJgOacieacieWtkOiKgueCueeahOiKgueCueeahGtleSAqL1xyXG4gIHByaXZhdGUgZ2V0QWxsTm9kZUtleXMobm9kZXM6IGFueVtdKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAga2V5cy5wdXNoKG5vZGUua2V5KTtcclxuICAgICAgICBrZXlzLnB1c2goLi4udGhpcy5nZXRBbGxOb2RlS2V5cyhub2RlLmNoaWxkcmVuKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoq5qOA5p+l5piv5ZCm5pyJ5Lu75L2V6IqC54K55YyF5ZCr5a2Q6IqC54K5ICovXHJcbiAgaGFzQW55Tm9kZVdpdGhDaGlsZHJlbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldEFsbE5vZGVLZXlzKHRoaXMubm9kZXMpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvKirmm7TmlrDlsZXlvIDnirbmgIEgKi9cclxuICBwcml2YXRlIHVwZGF0ZUV4cGFuZGVkU3RhdGUoKSB7XHJcbiAgICBjb25zdCBhbGxLZXlzID0gdGhpcy5nZXRBbGxOb2RlS2V5cyh0aGlzLm5vZGVzKTtcclxuICAgIHRoaXMuaXNBbGxFeHBhbmRlZCA9XHJcbiAgICAgIGFsbEtleXMubGVuZ3RoID4gMCAmJiBhbGxLZXlzLmV2ZXJ5KGtleSA9PiB0aGlzLmFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKGtleSkpO1xyXG4gIH1cclxuICAvKirmraPlnKjmk43kvZznmoToioLngrnpobkgKi9cclxuICBzZWxlY3RUcmVlOiBhbnk7XHJcbiAgLyoq5piv5ZCm5Yib5bu65a2Q6IqC54K5ICovXHJcbiAgaXNDcmVhdGVDaGlsZDogYm9vbGVhbiB8IGFueSA9IGZhbHNlO1xyXG4gIC8qKuaooeaAgeahhueKtuaAgSAqL1xyXG4gIGlzVmlzaWJsZTogYm9vbGVhbiB8IGFueSA9IGZhbHNlO1xyXG5cclxuICAvKirnlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cclxuICBtb2RhbEJ1c3k6IGJvb2xlYW4gfCBhbnkgPSBmYWxzZTtcclxuICAvKirliJvlu7rooajljZUgKi9cclxuICBub2RlRm9ybTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKirooajljZXmjqfku7bmqKHmnb8t5Yqo5oCB6LWL5YC86KGo5Y2V5o6n5Lu2ICovXHJcbiAgQFZpZXdDaGlsZCgnbm9kZU1vZGFsU3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pIG5vZGVNb2RhbFN1Ym1pdDogRWxlbWVudFJlZjtcclxuXHJcbiAgLyoq55Sf5oiQR1VJRCAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVHdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuICB9XHJcbiAgZ2V0IGtleUlucHV0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMubm9kZUZvcm0/LmdldCgna2V5JykgYXMgRm9ybUNvbnRyb2w7XHJcbiAgfVxyXG4gIHByaXZhdGUgX0xvY2FsaXphdGlvblNlcnZpY2UgPSBpbmplY3QoTG9jYWxpemF0aW9uU2VydmljZSk7XHJcbiAgU2x1Z1JlZ0V4VmFsaWRhdG9yKCkge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9PiB7XHJcbiAgICAgIGNvbnN0IHJlZ2V4ID0gL15bYS16QS1aMC05Xy1dKyQvO1xyXG4gICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiAhcmVnZXgudGVzdChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiB7IHJlcGV0aXRpb246IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgQ21zOjpTbHVnVmFsaWRhdG9yc1RleHRgKSB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKuWIm+W7uuiKgueCuSAqL1xyXG4gIGFkZE5vZGVCdG4oKSB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLmlzQ3JlYXRlQ2hpbGQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0VHJlZSA9IG51bGw7XHJcbiAgICB0aGlzLm5vZGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHRpdGxlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBrZXk6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuU2x1Z1JlZ0V4VmFsaWRhdG9yKCldXSxcclxuICAgICAgaXNDaGVja2VkOiBbZmFsc2VdLFxyXG4gICAgICBjaGlsZHJlbjogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoq57yW6L6R6IqC54K5ICovXHJcbiAgZWRpdEl0ZW1CdG4obm9kZTogYW55KSB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLmlzQ3JlYXRlQ2hpbGQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0VHJlZSA9IG5vZGU7XHJcbiAgICB0aGlzLm5vZGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHRpdGxlOiBbbm9kZS50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGtleTogW25vZGUua2V5LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5TbHVnUmVnRXhWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBpc0NoZWNrZWQ6IFtub2RlLm9yaWdpbj8uaXNDaGVja2VkID8/IGZhbHNlXSxcclxuICAgICAgY2hpbGRyZW46IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKuWIm+W7uuWtkOiKgueCuSAqL1xyXG4gIGNyZWF0ZUNoaWxkSXRlbUJ0bihub2RlOiBhbnkpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNDcmVhdGVDaGlsZCA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdFRyZWUgPSBub2RlO1xyXG4gICAgdGhpcy5ub2RlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB0aXRsZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAga2V5OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLlNsdWdSZWdFeFZhbGlkYXRvcigpXV0sXHJcbiAgICAgIGlzQ2hlY2tlZDogW2ZhbHNlXSxcclxuICAgICAgY2hpbGRyZW46IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKumHjee9ruaooeaAgeahhiAqL1xyXG4gIHJlc2V0TW9kYWwoKSB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0NyZWF0ZUNoaWxkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdFRyZWUgPSBudWxsO1xyXG4gIH1cclxuICAvKirliJvlu7rnvJbovpHkv53lrZggKi9cclxuICBjcmVhdGVPckVkaXRTYXZlKCkge1xyXG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5ub2RlRm9ybTtcclxuICAgIGNvbnN0IHsgc2VsZWN0VHJlZSwgaXNDcmVhdGVDaGlsZCwgbm9kZXMsIGFuRXhwYW5kZWROb2RlIH0gPSB0aGlzO1xyXG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24uY29udHJvbHNbJ1RyZWVWaWV3Lk11bHRpcGxlJ10gYXMgRm9ybUNvbnRyb2w7XHJcblxyXG4gICAgaWYgKHNlbGVjdFRyZWUpIHtcclxuICAgICAgaWYgKGlzQ3JlYXRlQ2hpbGQpIHtcclxuICAgICAgICAvLyDliJvlu7rlrZDoioLngrlcclxuICAgICAgICB0aGlzLmFkZENoaWxkTm9kZShub2Rlcywgc2VsZWN0VHJlZS5rZXksIHZhbHVlKTtcclxuICAgICAgICAvLyDoh6rliqjlsZXlvIDniLboioLngrlcclxuICAgICAgICBpZiAoIWFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKHNlbGVjdFRyZWUua2V5KSkge1xyXG4gICAgICAgICAgdGhpcy5hbkV4cGFuZGVkTm9kZSA9IFsuLi5hbkV4cGFuZGVkTm9kZSwgc2VsZWN0VHJlZS5rZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDnvJbovpHoioLngrlcclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVCeVJlZmVyZW5jZShzZWxlY3RUcmVlLm9yaWdpbiwgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDliJvlu7rmoLnoioLngrlcclxuICAgICAgbm9kZXMucHVzaCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Y2V6YCJ5qih5byP5LiL77yM5aaC5p6c5b2T5YmN6IqC54K56KKr6YCJ5Lit77yM5riF6Zmk5YW25LuW6IqC54K555qE6YCJ5Lit54q25oCBXHJcbiAgICBpZiAoIWlzTXVsdGlwbGUudmFsdWUgJiYgdmFsdWUuaXNDaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKG5vZGVzKTtcclxuICAgICAgdGhpcy5zZXROb2RlQ2hlY2tlZE9ubHkobm9kZXMsIHZhbHVlLmtleSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ub2RlcyA9IFsuLi5ub2Rlc107XHJcbiAgICB0aGlzLnN5bmNUcmVlT3B0aW9uc0Zyb21Ob2RlcygpO1xyXG4gICAgdGhpcy51cGRhdGVFeHBhbmRlZFN0YXRlKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnJlc2V0TW9kYWwoKTtcclxuICB9XHJcblxyXG4gIC8qKumAkuW9kua3u+WKoOWtkOiKgueCuSAqL1xyXG4gIHByaXZhdGUgYWRkQ2hpbGROb2RlKG5vZGVzOiBhbnlbXSwgcGFyZW50S2V5OiBzdHJpbmcsIG5ld05vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gcGFyZW50S2V5KSB7XHJcbiAgICAgICAgaWYgKCFub2RlLmNoaWxkcmVuKSBub2RlLmNoaWxkcmVuID0gW107XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5hZGRDaGlsZE5vZGUobm9kZS5jaGlsZHJlbiwgcGFyZW50S2V5LCBuZXdOb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirpgJrov4flvJXnlKjmm7TmlrDoioLngrkgKi9cclxuICBwcml2YXRlIHVwZGF0ZU5vZGVCeVJlZmVyZW5jZShub2RlOiBhbnksIHVwZGF0ZWREYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIG5vZGUudGl0bGUgPSB1cGRhdGVkRGF0YS50aXRsZTtcclxuICAgIG5vZGUua2V5ID0gdXBkYXRlZERhdGEua2V5O1xyXG4gICAgbm9kZS5pc0NoZWNrZWQgPSB1cGRhdGVkRGF0YS5pc0NoZWNrZWQ7XHJcbiAgfVxyXG5cclxuICAvKirliKDpmaToioLngrkgKi9cclxuICBkZWxldGVNZW51SXRlbUJ0bihub2RlOiBhbnkpIHtcclxuICAgIHRoaXMuZGVsZXRlTm9kZSh0aGlzLm5vZGVzLCBub2RlLmtleSk7XHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gICAgdGhpcy5zeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRXhwYW5kZWRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5Yig6Zmk6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBkZWxldGVOb2RlKG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKG5vZGVzW2ldLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuZGVsZXRlTm9kZShub2Rlc1tpXS5jaGlsZHJlbiwgdGFyZ2V0S2V5KSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirlkIzmraUgbm9kZXMg5YiwIFRyZWVPcHRpb25zICovXHJcbiAgcHJpdmF0ZSBzeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKSB7XHJcbiAgICB0aGlzLlRyZWVPcHRpb25zLmNsZWFyKCk7XHJcbiAgICBjb25zdCBjbGVhbmVkTm9kZXMgPSB0aGlzLm5vZGVzLm1hcChub2RlID0+IHRoaXMuY2xlYW5Ob2RlKG5vZGUpKTtcclxuICAgIGNsZWFuZWROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICB0aGlzLlRyZWVPcHRpb25zLnB1c2godGhpcy5jcmVhdGVUcmVlRm9ybUdyb3VwKG5vZGUpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5Yib5bu65qCR6KGo5Y2V57uEICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVUcmVlRm9ybUdyb3VwKG5vZGU6IGFueSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5ldyBGb3JtQXJyYXkoW10pO1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVUcmVlRm9ybUdyb3VwKGNoaWxkKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBUZXh0OiBbbm9kZS50aXRsZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIFZhbHVlOiBbbm9kZS5rZXkgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBTZWxlY3RlZDogW25vZGUuaXNDaGVja2VkID8/IGZhbHNlXSxcclxuICAgICAgQ2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKirmuIXnkIboioLngrnkuK3nmoQgbmctem9ycm8g5YaF6YOo5a2X5q61ICovXHJcbiAgcHJpdmF0ZSBjbGVhbk5vZGUobm9kZTogYW55KTogYW55IHtcclxuICAgIGNvbnN0IHsgdGl0bGUsIGtleSwgaXNDaGVja2VkLCBjaGlsZHJlbiB9ID0gbm9kZTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICBrZXksXHJcbiAgICAgIGlzQ2hlY2tlZCxcclxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuPy5sZW5ndGggPyBjaGlsZHJlbi5tYXAoY2hpbGQgPT4gdGhpcy5jbGVhbk5vZGUoY2hpbGQpKSA6IFtdLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKuWwhiBUcmVlT3B0aW9ucyDmlbDmja7nu5PmnoTovazmjaLkuLogbm9kZXMg5pWw5o2u57uT5p6EICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0VHJlZU9wdGlvbnNUb05vZGVzKHRyZWVPcHRpb25zOiBhbnlbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdHJlZU9wdGlvbnMpIHtcclxuICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgIHRpdGxlOiBvcHRpb24uVGV4dCxcclxuICAgICAgICBrZXk6IG9wdGlvbi5WYWx1ZSxcclxuICAgICAgICBpc0NoZWNrZWQ6IG9wdGlvbi5TZWxlY3RlZCA/PyBmYWxzZSxcclxuICAgICAgICBjaGlsZHJlbjogb3B0aW9uLkNoaWxkcmVuPy5sZW5ndGggPyB0aGlzLmNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXMob3B0aW9uLkNoaWxkcmVuKSA6IFtdLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKirorr7nva4gKi9cclxuICB0b2dnbGVNdWx0aXBsZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmNsZWFyQWxsQ2hlY2tlZCh0aGlzLm5vZGVzKTtcclxuICAgIHJldHVybjtcclxuICAgIGNvbnN0IGlzTXVsdGlwbGUgPSB0aGlzLmZvcm1Db25maWd1cmF0aW9uLmNvbnRyb2xzWydUcmVlVmlldy5NdWx0aXBsZSddIGFzIEZvcm1Db250cm9sO1xyXG4gICAgaWYgKCFpc011bHRpcGxlLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKHRoaXMubm9kZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hcHBseU11bHRpcGxlTG9naWModGhpcy5ub2Rlcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gICAgdGhpcy5zeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKuW6lOeUqOWkmumAiemAu+i+ke+8mumAieS4reeahOiKgueCueWQjOaXtumAieS4reWFtuaJgOacieWtkOiKgueCueWSjOeItuiKgueCuSAqL1xyXG4gIHByaXZhdGUgYXBwbHlNdWx0aXBsZUxvZ2ljKG5vZGVzOiBhbnlbXSkge1xyXG4gICAgY29uc3QgY2hlY2tlZEtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICB0aGlzLmNvbGxlY3RDaGVja2VkS2V5cyhub2RlcywgY2hlY2tlZEtleXMpO1xyXG4gICAgY2hlY2tlZEtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICB0aGlzLnNldE5vZGVDaGVja2VkKG5vZGVzLCBrZXksIHRydWUpO1xyXG4gICAgICB0aGlzLnNldFBhcmVudE5vZGVzQ2hlY2tlZChub2Rlcywga2V5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoq5pS26ZuG5omA5pyJ6YCJ5Lit6IqC54K555qEa2V5ICovXHJcbiAgcHJpdmF0ZSBjb2xsZWN0Q2hlY2tlZEtleXMobm9kZXM6IGFueVtdLCByZXN1bHQ6IHN0cmluZ1tdKSB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgaWYgKG5vZGUuaXNDaGVja2VkKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZS5rZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNvbGxlY3RDaGVja2VkS2V5cyhub2RlLmNoaWxkcmVuLCByZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKirliIfmjaLoioLngrnpgInkuK3nirbmgIEgKi9cclxuICB0b2dnbGVOb2RlQ2hlY2tlZChldmVudDogYW55LCBub2RlOiBhbnkpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24uY29udHJvbHNbJ1RyZWVWaWV3Lk11bHRpcGxlJ10gYXMgRm9ybUNvbnRyb2w7XHJcbiAgICBjb25zdCBuZXdDaGVja2VkID0gIW5vZGUub3JpZ2luPy5pc0NoZWNrZWQ7XHJcblxyXG4gICAgaWYgKCFpc011bHRpcGxlLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKHRoaXMubm9kZXMpO1xyXG4gICAgICBpZiAobmV3Q2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuc2V0Tm9kZUNoZWNrZWRPbmx5KHRoaXMubm9kZXMsIG5vZGUua2V5LCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXROb2RlQ2hlY2tlZCh0aGlzLm5vZGVzLCBub2RlLmtleSwgbmV3Q2hlY2tlZCk7XHJcbiAgICAgIGlmIChuZXdDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRQYXJlbnROb2Rlc0NoZWNrZWQodGhpcy5ub2Rlcywgbm9kZS5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ub2RlcyA9IFsuLi50aGlzLm5vZGVzXTtcclxuICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKirmuIXpmaTmiYDmnInoioLngrnnmoTpgInkuK3nirbmgIEgKi9cclxuICBwcml2YXRlIGNsZWFyQWxsQ2hlY2tlZChub2RlczogYW55W10pIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBub2RlLmlzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbENoZWNrZWQobm9kZS5jaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKuiuvue9ruaMh+WumuiKgueCueeahOmAieS4reeKtuaAgSAqL1xyXG4gIHByaXZhdGUgc2V0Tm9kZUNoZWNrZWQobm9kZXM6IGFueVtdLCB0YXJnZXRLZXk6IHN0cmluZywgY2hlY2tlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuc2V0Q2hpbGRyZW5DaGVja2VkKG5vZGUuY2hpbGRyZW4sIGNoZWNrZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuc2V0Tm9kZUNoZWNrZWQobm9kZS5jaGlsZHJlbiwgdGFyZ2V0S2V5LCBjaGVja2VkKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLorr7nva7miYDmnInlrZDoioLngrnnmoTpgInkuK3nirbmgIEgKi9cclxuICBwcml2YXRlIHNldENoaWxkcmVuQ2hlY2tlZChjaGlsZHJlbjogYW55W10sIGNoZWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuaXNDaGVja2VkID0gY2hlY2tlZDtcclxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnNldENoaWxkcmVuQ2hlY2tlZChjaGlsZC5jaGlsZHJlbiwgY2hlY2tlZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKumAieS4reaJgOacieeItuiKgueCuSAqL1xyXG4gIHByaXZhdGUgc2V0UGFyZW50Tm9kZXNDaGVja2VkKG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcsIHBhcmVudDogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgcGFyZW50LmlzQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnNldFBhcmVudE5vZGVzQ2hlY2tlZCh0aGlzLm5vZGVzLCBwYXJlbnQua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiB0aGlzLnNldFBhcmVudE5vZGVzQ2hlY2tlZChub2RlLmNoaWxkcmVuLCB0YXJnZXRLZXksIG5vZGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuS7heiuvue9ruaMh+WumuiKgueCueeahOmAieS4reeKtuaAge+8jOS4jeW9seWTjeWtkOiKgueCueWSjOeItuiKgueCuSAqL1xyXG4gIHByaXZhdGUgc2V0Tm9kZUNoZWNrZWRPbmx5KG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcsIGNoZWNrZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIG5vZGUuaXNDaGVja2VkID0gY2hlY2tlZDtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuc2V0Tm9kZUNoZWNrZWRPbmx5KG5vZGUuY2hpbGRyZW4sIHRhcmdldEtleSwgY2hlY2tlZCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoq5ouW5ou9ICovXHJcbiAgZHJvcE92ZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZHJhZ05vZGUgPSBldmVudC5kcmFnTm9kZTtcclxuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBldmVudC5ub2RlO1xyXG4gICAgY29uc3QgcG9zID0gZXZlbnQucG9zO1xyXG5cclxuICAgIC8vIOenu+mZpOiiq+aLluaLveeahOiKgueCuVxyXG4gICAgY29uc3QgZHJhZ2dlZERhdGEgPSB0aGlzLnJlbW92ZU5vZGVCeUtleSh0aGlzLm5vZGVzLCBkcmFnTm9kZS5rZXkpO1xyXG4gICAgaWYgKCFkcmFnZ2VkRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIHBvczogMD3lhoXpg6gsIC0xPeS4iuaWuSwgMT3kuIvmlrlcclxuICAgIGlmIChwb3MgPT09IDApIHtcclxuICAgICAgLy8g5pS+5YWl55uu5qCH6IqC54K55YaF6YOo5L2c5Li65a2Q6IqC54K5XHJcbiAgICAgIHRoaXMuYWRkQ2hpbGROb2RlKHRoaXMubm9kZXMsIHRhcmdldE5vZGUua2V5LCBkcmFnZ2VkRGF0YSk7XHJcbiAgICAgIGlmICghdGhpcy5hbkV4cGFuZGVkTm9kZS5pbmNsdWRlcyh0YXJnZXROb2RlLmtleSkpIHtcclxuICAgICAgICB0aGlzLmFuRXhwYW5kZWROb2RlID0gWy4uLnRoaXMuYW5FeHBhbmRlZE5vZGUsIHRhcmdldE5vZGUua2V5XTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5pS+5Zyo55uu5qCH6IqC54K55YmN5ZCOXHJcbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZUJlc2lkZSh0aGlzLm5vZGVzLCB0YXJnZXROb2RlLmtleSwgZHJhZ2dlZERhdGEsIHBvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ub2RlcyA9IFsuLi50aGlzLm5vZGVzXTtcclxuICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKirnp7vpmaTlubbov5Tlm57oioLngrkgKi9cclxuICBwcml2YXRlIHJlbW92ZU5vZGVCeUtleShcclxuICAgIG5vZGVzOiBhbnlbXSxcclxuICAgIHRhcmdldEtleTogc3RyaW5nLFxyXG4gICAgcGFyZW50OiBhbnlbXSA9IG51bGwsXHJcbiAgICBpbmRleDogbnVtYmVyID0gLTFcclxuICApOiBhbnkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAobm9kZXNbaV0ua2V5ID09PSB0YXJnZXRLZXkpIHtcclxuICAgICAgICByZXR1cm4gbm9kZXMuc3BsaWNlKGksIDEpWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnJlbW92ZU5vZGVCeUtleShub2Rlc1tpXS5jaGlsZHJlbiwgdGFyZ2V0S2V5LCBub2Rlc1tpXS5jaGlsZHJlbiwgaSk7XHJcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoq5Zyo55uu5qCH6IqC54K55peB6L655o+S5YWl6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBpbnNlcnROb2RlQmVzaWRlKFxyXG4gICAgbm9kZXM6IGFueVtdLFxyXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmcsXHJcbiAgICBuZXdOb2RlOiBhbnksXHJcbiAgICBwb3NpdGlvbjogbnVtYmVyXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChub2Rlc1tpXS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gcG9zaXRpb24gPT09IC0xID8gaSA6IGkgKyAxO1xyXG4gICAgICAgIG5vZGVzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3Tm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIG5vZGVzW2ldLmNoaWxkcmVuPy5sZW5ndGggJiZcclxuICAgICAgICB0aGlzLmluc2VydE5vZGVCZXNpZGUobm9kZXNbaV0uY2hpbGRyZW4sIHRhcmdldEtleSwgbmV3Tm9kZSwgcG9zaXRpb24pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirliKTmlq3oioLngrnnmoTlrZDoioLngrnmmK/lkKbmnInooqvpgInkuK3nmoQgKi9cclxuICBoYXNDaGlsZHJlbkNoZWNrZWQobm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAobm9kZS5vcmlnaW4/LmlzQ2hlY2tlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcmlnaW5Ob2RlID0gdGhpcy5maW5kTm9kZUJ5S2V5KHRoaXMubm9kZXMsIG5vZGUua2V5KTtcclxuICAgIGlmICghb3JpZ2luTm9kZT8uY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5oYXNBbnlDaGlsZENoZWNrZWQob3JpZ2luTm9kZS5jaGlsZHJlbik7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLmo4Dmn6XlrZDoioLngrnmmK/lkKbmnInooqvpgInkuK3nmoQgKi9cclxuICBwcml2YXRlIGhhc0FueUNoaWxkQ2hlY2tlZChjaGlsZHJlbjogYW55W10pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcclxuICAgICAgaWYgKGNoaWxkLmlzQ2hlY2tlZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGlsZC5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuaGFzQW55Q2hpbGRDaGVja2VkKGNoaWxkLmNoaWxkcmVuKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirmoLnmja4ga2V5IOafpeaJvuiKgueCuSAqL1xyXG4gIHByaXZhdGUgZmluZE5vZGVCeUtleShub2RlczogYW55W10sIGtleTogc3RyaW5nKTogYW55IHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IGtleSkge1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZE5vZGVCeUtleShub2RlLmNoaWxkcmVuLCBrZXkpO1xyXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl1bZGF0YS1pbmRldGVybWluYXRlXScpO1xyXG4gICAgY2hlY2tib3hlcy5mb3JFYWNoKChjaGVja2JveDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zdCBpbmRldGVybWluYXRlID0gY2hlY2tib3guZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV0ZXJtaW5hdGUnKSA9PT0gJ3RydWUnO1xyXG4gICAgICBjaGVja2JveC5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1FbnRpdHlcIj5cclxuICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImZvcm1Db25maWd1cmF0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBcIj57eydBYnBEeW5hbWljRm9ybTo6Tm9kZXMnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaGFzQW55Tm9kZVdpdGhDaGlsZHJlbigpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodCBtcy0yXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiLS1icy1idG4tcGFkZGluZy15OiAuMjVyZW07IC0tYnMtYnRuLXBhZGRpbmcteDogLjVyZW07IC0tYnMtYnRuLWZvbnQtc2l6ZTogLjc1cmVtO1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwidG9nZ2xlRXhwYW5kQWxsKClcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBbbmdDbGFzc109XCJpc0FsbEV4cGFuZGVkID8gJ2ZhLWNvbXByZXNzJyA6ICdmYS1leHBhbmQnXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhcmsgc29mdCBtcy0yIGZsb2F0LWVuZFwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiYWRkTm9kZUJ0bigpXCI+e3snQWJwRHluYW1pY0Zvcm06OkFkZE5vZGUnIHxcclxuICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIgcC0yIHJvdW5kZWQtMiBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYgKG5vZGVzLmxlbmd0aD4wKSB7XHJcbiA8YWJwLXRyZWUgY2xhc3M9XCJtYi0yXCIgW25vZGVzXT1cIm5vZGVzXCIgW2NoZWNrYWJsZV09XCJmYWxzZVwiIChkcm9wT3Zlcik9XCJkcm9wT3ZlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobnpFeHBhbmRDaGFuZ2UpPVwibnpFeHBhbmRDaGFuZ2UoJGV2ZW50KVwiIFtleHBhbmRlZEtleXNdPVwiYW5FeHBhbmRlZE5vZGVcIiBbZHJhZ2dhYmxlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21lbnUgbGV0LW5vZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIChjbGljay5zdG9wKT1cImVkaXRJdGVtQnRuKG5vZGUpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiBtZS0xIGZhIGZhLXBlbmNpbFwiPjwvaT57eydBYnBVaTo6RWRpdCcgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrLnN0b3ApPVwiY3JlYXRlQ2hpbGRJdGVtQnRuKG5vZGUpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiBtZS0xIGZhIGZhLXBsdXNcIj48L2k+e3snQWJwRHluYW1pY0Zvcm06OkFkZFN1Yk5vZGUnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIChjbGljay5zdG9wKT1cImRlbGV0ZU1lbnVJdGVtQnRuKG5vZGUpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiBtZS0xIGZhIGZhLXJlbW92ZVwiPjwvaT57eydBYnBVaTo6RGVsZXRlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGFicFRyZWVOb2RlVGVtcGxhdGUgbGV0LW5vZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInRvZ2dsZU5vZGVDaGVja2VkKCRldmVudCwgbm9kZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJub2RlLm9yaWdpbj8uaXNDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV0ZXJtaW5hdGVdPVwiaGFzQ2hpbGRyZW5DaGVja2VkKG5vZGUpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bm9kZS50aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGFicFRyZWVFeHBhbmRlZEljb25UZW1wbGF0ZSBsZXQtbm9kZSBsZXQtb3JpZ2luPVwib3JpZ2luXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwibm9kZS5jaGlsZHJlbi5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGUuaXNFeHBhbmRlZCA/IG1pbnVzSWNvbiA6IHBsdXNJY29uXCI+PC9uZy1jb250YWluZXI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtaW51c0ljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS41IDBjNi4zNDcgMCAxMS41IDUuMTUzIDExLjUgMTEuNXMtNS4xNTMgMTEuNS0xMS41IDExLjUtMTEuNS01LjE1My0xMS41LTExLjUgNS4xNTMtMTEuNSAxMS41LTExLjV6bTAgMWM1Ljc5NSAwIDEwLjUgNC43MDUgMTAuNSAxMC41cy00LjcwNSAxMC41LTEwLjUgMTAuNS0xMC41LTQuNzA1LTEwLjUtMTAuNSA0LjcwNS0xMC41IDEwLjUtMTAuNXptLTYuNSAxMGgxM3YxaC0xM3YtMXpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGx1c0ljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS41IDBjNi4zNDcgMCAxMS41IDUuMTUzIDExLjUgMTEuNXMtNS4xNTMgMTEuNS0xMS41IDExLjUtMTEuNS01LjE1My0xMS41LTExLjUgNS4xNTMtMTEuNSAxMS41LTExLjV6bTAgMWM1Ljc5NSAwIDEwLjUgNC43MDUgMTAuNSAxMC41cy00LjcwNSAxMC41LTEwLjUgMTAuNS0xMC41LTQuNzA1LTEwLjUtMTAuNSA0LjcwNS0xMC41IDEwLjUtMTAuNXptLjUgMTBoNnYxaC02djZoLTF2LTZoLTZ2LTFoNnYtNmgxdjZ6XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvYWJwLXRyZWU+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibm9kZXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJ0ZXh0LW11dGVkIFwiPnt7J0FicER5bmFtaWNGb3JtOjpQbGVhc2VBZGROb2RlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9ufX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJUcmVlT3B0aW9ucz8uZXJyb3JzPy5yZXF1aXJlZFwiIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBcIj5cclxuICAgICAgICAgICAgICAgIHt7J0FicFZhbGlkYXRpb246OlRoaXNGaWVsZElzUmVxdWlyZWQuJyB8IGFicExvY2FsaXphdGlvbjogJ05vZGVzJ319XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2staW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJ0b2dnbGVNdWx0aXBsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJUcmVlVmlldy5NdWx0aXBsZVwiIGlkPVwiTXVsdGlwbGVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJNdWx0aXBsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J0FicER5bmFtaWNGb3JtOjpNdWx0aXBsZScgfCBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGFicEluaXQpPVwic3VibWl0Y2xpY2s/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWNrKClcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCJcclxuICAgICAgICAgICAgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZm9ybT5cclxuXHJcblxyXG48IS0tIFtvcHRpb25zXT1cInsgc2l6ZTogQ3VycmVudFNlbGVjdGlvblRhYmxlQ29udHJvbE5hbWU9PT0nTWF0cml4Jz8neGwnOicnICxzY3JvbGxhYmxlOmZhbHNlIH1cIiAodmlzaWJsZUNoYW5nZSk9XCJ0YWJsZVNlbGVjdFZpc2libGVDaGFuZ2UoJGV2ZW50KVwiLS0+XHJcbjxhYnAtbW9kYWwgWyh2aXNpYmxlKV09XCJpc1Zpc2libGVcIiBbYnVzeV09XCJtb2RhbEJ1c3lcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxyXG4gICAgICAgIDxoMz57e2lzQ3JlYXRlQ2hpbGQgPyAoJ0FicER5bmFtaWNGb3JtOjpBZGRTdWJOb2RlJyB8IGFicExvY2FsaXphdGlvbikgOiAoc2VsZWN0VHJlZSA/ICgnQWJwVWk6OkVkaXQnIHxcclxuICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9uKSA6ICgnQ21zOjpOZXcnIHwgYWJwTG9jYWxpemF0aW9uKSl9fTwvaDM+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGVyUmVmPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj48aSBjbGFzcz1cImZhIGZhLXB1bHNlIGZhLXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZUZvcm07IGVsc2UgbG9hZGVyUmVmXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwic2l0ZXMtbW9kYWwtZm9ybVwiICNteUZvcm09XCJuZ0Zvcm1cIiBbZm9ybUdyb3VwXT1cIm5vZGVGb3JtXCIgKHN1Ym1pdCk9XCJjcmVhdGVPckVkaXRTYXZlKClcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiICNub2RlTW9kYWxTdWJtaXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnQWJwRHluYW1pY0Zvcm06Ok5vZGVJdGVtVGV4dCcgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBbcGxhY2Vob2xkZXJdPVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiZGlzUGxheU5hbWVJbnB1dEJsdXIoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdBYnBEeW5hbWljRm9ybTo6U2VsZWN0TGlzdEl0ZW1WYWx1ZScgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCIgW3BsYWNlaG9sZGVyXT1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlciBpbnZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJrZXlJbnB1dD8uZXJyb3JzPy5yZXBldGl0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3trZXlJbnB1dD8uZXJyb3JzPy5yZXBldGl0aW9ufX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2staW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0NoZWNrZWRcIiBpZD1cImlzU2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImlzU2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FicER5bmFtaWNGb3JtOjpTZWxlY3RlZCcgfCBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgYWJwQ2xvc2U+e3snQWJwVWk6OkNsb3NlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgPGFicC1idXR0b24gaWNvbkNsYXNzPVwiZmEgZmEtY2hlY2tcIiBbZGlzYWJsZWRdPVwiIW5vZGVGb3JtLnZhbGlkXCJcclxuICAgICAgICAgICAgKGFicENsaWNrKT1cIm5vZGVNb2RhbFN1Ym1pdC5uYXRpdmVFbGVtZW50LmNsaWNrKClcIj57eydBYnBVaTo6U2F2ZScgfFxyXG4gICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fTwvYWJwLWJ1dHRvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvYWJwLW1vZGFsPiJdfQ==
|
|
621
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsU0FBUyxFQUNULFdBQVcsRUFFWCxTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7O0FBT25ELE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFBb0IsRUFBZSxFQUFVLGVBQWdDO1FBQXpELE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUE2QnJFLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQThEeEMsWUFBWTtRQUNaLHFCQUFxQjtRQUNyQix5RkFBeUY7UUFDekYsK0NBQStDO1FBQy9DLElBQUk7UUFFSixZQUFZO1FBQ1osVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUVsQixZQUFZO1FBQ1osbUJBQWMsR0FBVSxFQUFFLENBQUM7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LGFBQWEsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBem9CVSxtQkFBbUI7a0dBQW5CLG1CQUFtQix1VkMzQmhDLHd1UEFzSFk7OzJGRDNGQyxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsZ0JBQWdCOzhHQVNmLElBQUk7c0JBRGQsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQVFLLE1BQU07c0JBRGhCLEtBQUs7Z0JBV3NDLFdBQVc7c0JBQXRELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFxSk8sZUFBZTtzQkFBL0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yICovXHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQXJyYXksXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmVlQ29uZmlnIH0gZnJvbSAnLi90cmVlLWNvbmZpZyc7XHJcbmltcG9ydCB7IFRvUGlueWluU2VydmljZSB9IGZyb20gJ0BkaWduaXRlLW5nL2V4cGFuZC5jb3JlJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RmLXRyZWUtY29uZmlnJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RyZWUtY29uZmlnLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlQ29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgdG9QaW55aW5TZXJ2aWNlOiBUb1BpbnlpblNlcnZpY2UpIHt9XHJcbiAgLyoq6KGo5Y2V5o6n5Lu257G75Z6LICovXHJcbiAgX3R5cGU6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgdHlwZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3R5cGUgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6YCJ5oup55qE6KGo5Y2V5L+h5oGvICovXHJcbiAgX3NlbGVjdGVkOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHY6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6KGo5Y2V5a6e5L2TICovXHJcbiAgZm9ybUVudGl0eTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBFbnRpdHkodjogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLmZvcm1FbnRpdHkgPSB2O1xyXG4gICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgfVxyXG4gIGdldCBmb3JtQ29uZmlndXJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1FbnRpdHk/LmdldCgnZm9ybUNvbmZpZ3VyYXRpb24nKSBhcyBGb3JtR3JvdXA7XHJcbiAgfVxyXG4gIGdldCBUcmVlT3B0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWd1cmF0aW9uPy5jb250cm9sc1snVHJlZVZpZXcuTm9kZXMnXSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XHJcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIGFzeW5jIGRhdGFMb2FkZWQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtRW50aXR5ICYmIHRoaXMuX3R5cGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEFmdGVySW5pdCgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgdGhpcy5mb3JtRW50aXR5Py5zZXRDb250cm9sKCdmb3JtQ29uZmlndXJhdGlvbicsIHRoaXMuZmIuZ3JvdXAobmV3IFRyZWVDb25maWcoKSkpO1xyXG4gICAgICB0aGlzLlRyZWVPcHRpb25zPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKV0pO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIOaJi+WKqOinpuWPkeWPmOabtOajgOa1i1xyXG4gICAgICB0aGlzLnN1Ym1pdGNsaWNrPy5uYXRpdmVFbGVtZW50Py5jbGljaygpO1xyXG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQgJiYgdGhpcy5fc2VsZWN0ZWQuZm9ybUNvbnRyb2xOYW1lID09IHRoaXMuX3R5cGUpIHtcclxuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvblsnVHJlZVZpZXcuTm9kZXMnXTtcclxuICAgICAgICBpZiAodHJlZU5vZGVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXModHJlZU5vZGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICAgICAgLy8gZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uWydUcmVlVmlldy5Ob2RlcyddKSB7XHJcbiAgICAgICAgLy8gICBmb3IgKGNvbnN0IGtleSBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50W2tleV07XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNhcGl0YWxpemVkS2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpO1xyXG4gICAgICAgIC8vICAgICBlbGVtZW50W2NhcGl0YWxpemVkS2V5XSA9IGl0ZW07XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAuLi50aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvbixcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5b2T6YCJ5oup6aG555qE5paH5pys5Y+R55Sf5Y+Y5YyW5pe277yM5pu05paw5a+55bqU55qE5YC8XHJcbiAgICogQHBhcmFtIGV2ZW50IOi+k+WFpeS6i+S7tuWvueixoVxyXG4gICAqIEBwYXJhbSBpbmRleCDpgInmi6npobnnmoTntKLlvJXkvY3nva5cclxuICAgKiBAZGVzY3JpcHRpb24g5aaC5p6c6YCJ5oup6aG55bey5pyJVmFsdWXlgLzliJnkuI3lpITnkIbvvIzlkKbliJnlsIbkuK3mlofmlofmnKzovazmjaLkuLrmi7zpn7PkvZzkuLpWYWx1ZeWAvFxyXG4gICAqL1xyXG4gIC8vIHRleHRDaGFuZ2UoZXZlbnQsIGluZGV4KSB7XHJcbiAgLy8gICBjb25zdCBUcmVlT3B0aW9uc0l0ZW0gPSB0aGlzLlRyZWVPcHRpb25zLmF0KGluZGV4KTtcclxuICAvLyAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gIC8vICAgaWYgKFRyZWVPcHRpb25zSXRlbS5nZXQoJ1ZhbHVlJyk/LnZhbHVlKSByZXR1cm47XHJcbiAgLy8gICBUcmVlT3B0aW9uc0l0ZW0ucGF0Y2hWYWx1ZSh7XHJcbiAgLy8gICAgIFZhbHVlOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG4gIC8qKuWtl+auteagh+etvmlucHV05aSx5Y675qCH54K555Sf5oiQ5a2X5q615ZCN5a2XICovXHJcbiAgZGlzUGxheU5hbWVJbnB1dEJsdXIoZXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5ub2RlRm9ybSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBwaW55aW4gPSB0aGlzLnRvUGlueWluU2VydmljZS5nZXQodmFsdWUpO1xyXG4gICAgY29uc3QgbmFtZUlucHV0ID0gdGhpcy5ub2RlRm9ybS5nZXQoJ2tleScpO1xyXG4gICAgaWYgKCFuYW1lSW5wdXQgfHwgbmFtZUlucHV0LnZhbHVlKSByZXR1cm47XHJcbiAgICBuYW1lSW5wdXQucGF0Y2hWYWx1ZShwaW55aW4pO1xyXG4gIH1cclxuXHJcbiAgLyoq6LCD5pW06KGo5qC85L2N572uICovXHJcbiAgLy8gZHJvcChldmVudDogYW55KSB7XHJcbiAgLy8gICBtb3ZlSXRlbUluQXJyYXkodGhpcy5UcmVlT3B0aW9ucy5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAvLyAgIHRoaXMuVHJlZU9wdGlvbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLyoqdHJlZeaVsOaNriAqL1xyXG4gIG5vZGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvKirlt7LlsZXlvIDnmoToioLngrkgKi9cclxuICBhbkV4cGFuZGVkTm9kZTogYW55W10gPSBbXTtcclxuXHJcbiAgLyoq5piv5ZCm5YWo6YOo5bGV5byAICovXHJcbiAgaXNBbGxFeHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICAvKirngrnlh7vlsZXlvIDmoJHoioLngrnlm77moIfop6blj5EgKi9cclxuICBuekV4cGFuZENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgYW5FeHBhbmRlZE5vZGUgPSB0aGlzLmFuRXhwYW5kZWROb2RlO1xyXG4gICAgaWYgKGFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKGV2ZW50Lm5vZGUua2V5KSkge1xyXG4gICAgICBhbkV4cGFuZGVkTm9kZSA9IGFuRXhwYW5kZWROb2RlLmZpbHRlcihrZXkgPT4ga2V5ICE9PSBldmVudC5ub2RlLmtleSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbkV4cGFuZGVkTm9kZS5wdXNoKGV2ZW50Lm5vZGUua2V5KTtcclxuICAgIH1cclxuICAgIHRoaXMuYW5FeHBhbmRlZE5vZGUgPSBhbkV4cGFuZGVkTm9kZTtcclxuXHJcbiAgICAvLyDmo4Dmn6XmmK/lkKbmiYDmnInmnInlrZDoioLngrnnmoToioLngrnpg73lt7LlsZXlvIBcclxuICAgIC8vIGNvbnN0IGFsbEtleXMgPSB0aGlzLmdldEFsbE5vZGVLZXlzKHRoaXMubm9kZXMpO1xyXG4gICAgdGhpcy5pc0FsbEV4cGFuZGVkID0gYW5FeHBhbmRlZE5vZGUubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIC8qKuWIh+aNouWxleW8gC/mlLbnvKnmiYDmnInoioLngrkgKi9cclxuICB0b2dnbGVFeHBhbmRBbGwoKSB7XHJcbiAgICB0aGlzLmlzQWxsRXhwYW5kZWQgPSAhdGhpcy5pc0FsbEV4cGFuZGVkO1xyXG4gICAgdGhpcy5hbkV4cGFuZGVkTm9kZSA9IHRoaXMuaXNBbGxFeHBhbmRlZCA/IHRoaXMuZ2V0QWxsTm9kZUtleXModGhpcy5ub2RlcykgOiBbXTtcclxuICAgIGlmICghdGhpcy5pc0FsbEV4cGFuZGVkKSB7XHJcbiAgICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5zZXRFeHBhbmRlZCh0aGlzLm5vZGVzLCBmYWxzZSldO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICAvL+mAkuW9kuiuvue9rm5vZGVz5Lit55qEZXhwYW5kZWTlgLwg5bm25LiU6L+U5Zue5LiA5Liq5pWw57uEXHJcbiAgc2V0RXhwYW5kZWQobm9kZXM6IGFueVtdLCBleHBhbmRlZDogYm9vbGVhbik6IHN0cmluZ1tdIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWQ7XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy5zZXRFeHBhbmRlZChub2RlLmNoaWxkcmVuLCBleHBhbmRlZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBub2RlcztcclxuICB9XHJcblxyXG4gIC8qKuiOt+WPluaJgOacieacieWtkOiKgueCueeahOiKgueCueeahGtleSAqL1xyXG4gIHByaXZhdGUgZ2V0QWxsTm9kZUtleXMobm9kZXM6IGFueVtdKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAga2V5cy5wdXNoKG5vZGUua2V5KTtcclxuICAgICAgICBrZXlzLnB1c2goLi4udGhpcy5nZXRBbGxOb2RlS2V5cyhub2RlLmNoaWxkcmVuKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoq5qOA5p+l5piv5ZCm5pyJ5Lu75L2V6IqC54K55YyF5ZCr5a2Q6IqC54K5ICovXHJcbiAgaGFzQW55Tm9kZVdpdGhDaGlsZHJlbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldEFsbE5vZGVLZXlzKHRoaXMubm9kZXMpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvKirmm7TmlrDlsZXlvIDnirbmgIEgKi9cclxuICBwcml2YXRlIHVwZGF0ZUV4cGFuZGVkU3RhdGUoKSB7XHJcbiAgICBjb25zdCBhbGxLZXlzID0gdGhpcy5nZXRBbGxOb2RlS2V5cyh0aGlzLm5vZGVzKTtcclxuICAgIHRoaXMuaXNBbGxFeHBhbmRlZCA9XHJcbiAgICAgIGFsbEtleXMubGVuZ3RoID4gMCAmJiBhbGxLZXlzLmV2ZXJ5KGtleSA9PiB0aGlzLmFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKGtleSkpO1xyXG4gIH1cclxuICAvKirmraPlnKjmk43kvZznmoToioLngrnpobkgKi9cclxuICBzZWxlY3RUcmVlOiBhbnk7XHJcbiAgLyoq5piv5ZCm5Yib5bu65a2Q6IqC54K5ICovXHJcbiAgaXNDcmVhdGVDaGlsZDogYm9vbGVhbiB8IGFueSA9IGZhbHNlO1xyXG4gIC8qKuaooeaAgeahhueKtuaAgSAqL1xyXG4gIGlzVmlzaWJsZTogYm9vbGVhbiB8IGFueSA9IGZhbHNlO1xyXG5cclxuICAvKirnlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cclxuICBtb2RhbEJ1c3k6IGJvb2xlYW4gfCBhbnkgPSBmYWxzZTtcclxuICAvKirliJvlu7rooajljZUgKi9cclxuICBub2RlRm9ybTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKirooajljZXmjqfku7bmqKHmnb8t5Yqo5oCB6LWL5YC86KGo5Y2V5o6n5Lu2ICovXHJcbiAgQFZpZXdDaGlsZCgnbm9kZU1vZGFsU3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pIG5vZGVNb2RhbFN1Ym1pdDogRWxlbWVudFJlZjtcclxuXHJcbiAgLyoq55Sf5oiQR1VJRCAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVHdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuICB9XHJcbiAgZ2V0IGtleUlucHV0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMubm9kZUZvcm0/LmdldCgna2V5JykgYXMgRm9ybUNvbnRyb2w7XHJcbiAgfVxyXG4gIHByaXZhdGUgX0xvY2FsaXphdGlvblNlcnZpY2UgPSBpbmplY3QoTG9jYWxpemF0aW9uU2VydmljZSk7XHJcbiAgLyoqXHJcbiAgICog6aqM6K+B5Zmo77ya5qOA5p+l5a2X56ym5Liy5qC85byP5ZKM5ZSv5LiA5oCnXHJcbiAgICogQGRlc2NyaXB0aW9uIOagvOW8j+WPquWFgeiuuOWtl+avjeOAgeaVsOWtl+OAgeS4i+WIkue6v+WSjOefreaoque6v++8jOS4lOWAvOWcqOagkeS4reW/hemhu+WUr+S4gFxyXG4gICAqL1xyXG4gIGtleVZhbGlkYXRvcigpIHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICBjb25zdCByZWdleCA9IC9eW2EtekEtWjAtOV8tXSskLztcclxuICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgIXJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4geyByZXBldGl0aW9uOiB0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYENtczo6U2x1Z1ZhbGlkYXRvcnNUZXh0YCkgfTtcclxuICAgICAgfVxyXG4gICAgICAvLyDmo4Dmn6XllK/kuIDmgKdcclxuICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgdGhpcy5pc0tleUV4aXN0cyhjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiB7IHJlcGV0aXRpb246IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgQ21zOjpWYWx1ZUFscmVhZHlFeGlzYCkgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIOajgOafpSBrZXkg5piv5ZCm5Zyo5qCR5Lit5bey5a2Y5ZyoXHJcbiAgICogQHBhcmFtIGtleSDopoHmo4Dmn6XnmoQga2V5IOWAvFxyXG4gICAqIEByZXR1cm5zIOWmguaenOWtmOWcqOi/lOWbniB0cnVl77yM5ZCm5YiZ6L+U5ZueIGZhbHNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0tleUV4aXN0cyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY3VycmVudEtleSA9IHRoaXMuc2VsZWN0VHJlZT8ua2V5O1xyXG4gICAgcmV0dXJuIHRoaXMuZmluZEtleUluTm9kZXModGhpcy5ub2Rlcywga2V5LCBjdXJyZW50S2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOmAkuW9kuafpeaJviBrZXkg5piv5ZCm5a2Y5Zyo5LqO6IqC54K55LitXHJcbiAgICogQHBhcmFtIG5vZGVzIOiKgueCueaVsOe7hFxyXG4gICAqIEBwYXJhbSB0YXJnZXRLZXkg6KaB5p+l5om+55qEIGtleVxyXG4gICAqIEBwYXJhbSBleGNsdWRlS2V5IOimgeaOkumZpOeahCBrZXnvvIjnvJbovpHml7bmjpLpmaTlvZPliY3oioLngrnvvIlcclxuICAgKiBAcmV0dXJucyDlpoLmnpzmib7liLDov5Tlm54gdHJ1Ze+8jOWQpuWImei/lOWbniBmYWxzZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmluZEtleUluTm9kZXMobm9kZXM6IGFueVtdLCB0YXJnZXRLZXk6IHN0cmluZywgZXhjbHVkZUtleT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gdGFyZ2V0S2V5ICYmIG5vZGUua2V5ICE9PSBleGNsdWRlS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiB0aGlzLmZpbmRLZXlJbk5vZGVzKG5vZGUuY2hpbGRyZW4sIHRhcmdldEtleSwgZXhjbHVkZUtleSkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoq5Yib5bu66IqC54K5ICovXHJcbiAgYWRkTm9kZUJ0bigpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNDcmVhdGVDaGlsZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RUcmVlID0gbnVsbDtcclxuICAgIHRoaXMubm9kZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdGl0bGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGtleTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5rZXlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBpc0NoZWNrZWQ6IFtmYWxzZV0sXHJcbiAgICAgIGNoaWxkcmVuOiBuZXcgRm9ybUFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKirnvJbovpHoioLngrkgKi9cclxuICBlZGl0SXRlbUJ0bihub2RlOiBhbnkpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNDcmVhdGVDaGlsZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RUcmVlID0gbm9kZTtcclxuICAgIHRoaXMubm9kZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdGl0bGU6IFtub2RlLnRpdGxlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAga2V5OiBbbm9kZS5rZXksIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmtleVZhbGlkYXRvcigpXV0sXHJcbiAgICAgIGlzQ2hlY2tlZDogW25vZGUub3JpZ2luPy5pc0NoZWNrZWQgPz8gZmFsc2VdLFxyXG4gICAgICBjaGlsZHJlbjogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoq5Yib5bu65a2Q6IqC54K5ICovXHJcbiAgY3JlYXRlQ2hpbGRJdGVtQnRuKG5vZGU6IGFueSkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0NyZWF0ZUNoaWxkID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0VHJlZSA9IG5vZGU7XHJcbiAgICB0aGlzLm5vZGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHRpdGxlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBrZXk6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMua2V5VmFsaWRhdG9yKCldXSxcclxuICAgICAgaXNDaGVja2VkOiBbZmFsc2VdLFxyXG4gICAgICBjaGlsZHJlbjogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoq6YeN572u5qih5oCB5qGGICovXHJcbiAgcmVzZXRNb2RhbCgpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzQ3JlYXRlQ2hpbGQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0VHJlZSA9IG51bGw7XHJcbiAgfVxyXG4gIC8qKuWIm+W7uue8lui+keS/neWtmCAqL1xyXG4gIGNyZWF0ZU9yRWRpdFNhdmUoKSB7XHJcbiAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLm5vZGVGb3JtO1xyXG4gICAgY29uc3QgeyBzZWxlY3RUcmVlLCBpc0NyZWF0ZUNoaWxkLCBub2RlcywgYW5FeHBhbmRlZE5vZGUgfSA9IHRoaXM7XHJcbiAgICBjb25zdCBpc011bHRpcGxlID0gdGhpcy5mb3JtQ29uZmlndXJhdGlvbi5jb250cm9sc1snVHJlZVZpZXcuTXVsdGlwbGUnXSBhcyBGb3JtQ29udHJvbDtcclxuXHJcbiAgICBpZiAoc2VsZWN0VHJlZSkge1xyXG4gICAgICBpZiAoaXNDcmVhdGVDaGlsZCkge1xyXG4gICAgICAgIC8vIOWIm+W7uuWtkOiKgueCuVxyXG4gICAgICAgIHRoaXMuYWRkQ2hpbGROb2RlKG5vZGVzLCBzZWxlY3RUcmVlLmtleSwgdmFsdWUpO1xyXG4gICAgICAgIC8vIOiHquWKqOWxleW8gOeItuiKgueCuVxyXG4gICAgICAgIGlmICghYW5FeHBhbmRlZE5vZGUuaW5jbHVkZXMoc2VsZWN0VHJlZS5rZXkpKSB7XHJcbiAgICAgICAgICB0aGlzLmFuRXhwYW5kZWROb2RlID0gWy4uLmFuRXhwYW5kZWROb2RlLCBzZWxlY3RUcmVlLmtleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOe8lui+keiKgueCuVxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZUJ5UmVmZXJlbmNlKHNlbGVjdFRyZWUub3JpZ2luLCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWIm+W7uuagueiKgueCuVxyXG4gICAgICBub2Rlcy5wdXNoKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDljZXpgInmqKHlvI/kuIvvvIzlpoLmnpzlvZPliY3oioLngrnooqvpgInkuK3vvIzmuIXpmaTlhbbku5boioLngrnnmoTpgInkuK3nirbmgIFcclxuICAgIGlmICghaXNNdWx0aXBsZS52YWx1ZSAmJiB2YWx1ZS5pc0NoZWNrZWQpIHtcclxuICAgICAgdGhpcy5jbGVhckFsbENoZWNrZWQobm9kZXMpO1xyXG4gICAgICB0aGlzLnNldE5vZGVDaGVja2VkT25seShub2RlcywgdmFsdWUua2V5LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLm5vZGVzXTtcclxuICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUV4cGFuZGVkU3RhdGUoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMucmVzZXRNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5re75Yqg5a2Q6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBhZGRDaGlsZE5vZGUobm9kZXM6IGFueVtdLCBwYXJlbnRLZXk6IHN0cmluZywgbmV3Tm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgaWYgKG5vZGUua2V5ID09PSBwYXJlbnRLZXkpIHtcclxuICAgICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIG5vZGUuY2hpbGRyZW4gPSBbXTtcclxuICAgICAgICBub2RlLmNoaWxkcmVuLnB1c2gobmV3Tm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiB0aGlzLmFkZENoaWxkTm9kZShub2RlLmNoaWxkcmVuLCBwYXJlbnRLZXksIG5ld05vZGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKumAmui/h+W8leeUqOabtOaWsOiKgueCuSAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTm9kZUJ5UmVmZXJlbmNlKG5vZGU6IGFueSwgdXBkYXRlZERhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgbm9kZS50aXRsZSA9IHVwZGF0ZWREYXRhLnRpdGxlO1xyXG4gICAgbm9kZS5rZXkgPSB1cGRhdGVkRGF0YS5rZXk7XHJcbiAgICBub2RlLmlzQ2hlY2tlZCA9IHVwZGF0ZWREYXRhLmlzQ2hlY2tlZDtcclxuICB9XHJcblxyXG4gIC8qKuWIoOmZpOiKgueCuSAqL1xyXG4gIGRlbGV0ZU1lbnVJdGVtQnRuKG5vZGU6IGFueSkge1xyXG4gICAgdGhpcy5kZWxldGVOb2RlKHRoaXMubm9kZXMsIG5vZGUua2V5KTtcclxuICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlc107XHJcbiAgICB0aGlzLnN5bmNUcmVlT3B0aW9uc0Zyb21Ob2RlcygpO1xyXG4gICAgdGhpcy51cGRhdGVFeHBhbmRlZFN0YXRlKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLliKDpmaToioLngrkgKi9cclxuICBwcml2YXRlIGRlbGV0ZU5vZGUobm9kZXM6IGFueVtdLCB0YXJnZXRLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAobm9kZXNbaV0ua2V5ID09PSB0YXJnZXRLZXkpIHtcclxuICAgICAgICBub2Rlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGVzW2ldLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5kZWxldGVOb2RlKG5vZGVzW2ldLmNoaWxkcmVuLCB0YXJnZXRLZXkpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuWQjOatpSBub2RlcyDliLAgVHJlZU9wdGlvbnMgKi9cclxuICBwcml2YXRlIHN5bmNUcmVlT3B0aW9uc0Zyb21Ob2RlcygpIHtcclxuICAgIHRoaXMuVHJlZU9wdGlvbnMuY2xlYXIoKTtcclxuICAgIGNvbnN0IGNsZWFuZWROb2RlcyA9IHRoaXMubm9kZXMubWFwKG5vZGUgPT4gdGhpcy5jbGVhbk5vZGUobm9kZSkpO1xyXG4gICAgY2xlYW5lZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgIHRoaXMuVHJlZU9wdGlvbnMucHVzaCh0aGlzLmNyZWF0ZVRyZWVGb3JtR3JvdXAobm9kZSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLliJvlu7rmoJHooajljZXnu4QgKi9cclxuICBwcml2YXRlIGNyZWF0ZVRyZWVGb3JtR3JvdXAobm9kZTogYW55KTogRm9ybUdyb3VwIHtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gbmV3IEZvcm1BcnJheShbXSk7XHJcbiAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZVRyZWVGb3JtR3JvdXAoY2hpbGQpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIFRleHQ6IFtub2RlLnRpdGxlIHx8ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgVmFsdWU6IFtub2RlLmtleSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIFNlbGVjdGVkOiBbbm9kZS5pc0NoZWNrZWQgPz8gZmFsc2VdLFxyXG4gICAgICBDaGlsZHJlbjogY2hpbGRyZW4sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKua4heeQhuiKgueCueS4reeahCBuZy16b3JybyDlhoXpg6jlrZfmrrUgKi9cclxuICBwcml2YXRlIGNsZWFuTm9kZShub2RlOiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3QgeyB0aXRsZSwga2V5LCBpc0NoZWNrZWQsIGNoaWxkcmVuIH0gPSBub2RlO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIGtleSxcclxuICAgICAgaXNDaGVja2VkLFxyXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4/Lmxlbmd0aCA/IGNoaWxkcmVuLm1hcChjaGlsZCA9PiB0aGlzLmNsZWFuTm9kZShjaGlsZCkpIDogW10sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoq5bCGIFRyZWVPcHRpb25zIOaVsOaNrue7k+aehOi9rOaNouS4uiBub2RlcyDmlbDmja7nu5PmnoQgKi9cclxuICBwcml2YXRlIGNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXModHJlZU9wdGlvbnM6IGFueVtdKTogYW55W10ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0cmVlT3B0aW9ucykge1xyXG4gICAgICByZXN1bHQucHVzaCh7XHJcbiAgICAgICAgdGl0bGU6IG9wdGlvbi5UZXh0LFxyXG4gICAgICAgIGtleTogb3B0aW9uLlZhbHVlLFxyXG4gICAgICAgIGlzQ2hlY2tlZDogb3B0aW9uLlNlbGVjdGVkID8/IGZhbHNlLFxyXG4gICAgICAgIGNoaWxkcmVuOiBvcHRpb24uQ2hpbGRyZW4/Lmxlbmd0aCA/IHRoaXMuY29udmVydFRyZWVPcHRpb25zVG9Ob2RlcyhvcHRpb24uQ2hpbGRyZW4pIDogW10sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKuiuvue9riAqL1xyXG4gIHRvZ2dsZU11bHRpcGxlKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKHRoaXMubm9kZXMpO1xyXG4gICAgcmV0dXJuO1xyXG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24uY29udHJvbHNbJ1RyZWVWaWV3Lk11bHRpcGxlJ10gYXMgRm9ybUNvbnRyb2w7XHJcbiAgICBpZiAoIWlzTXVsdGlwbGUudmFsdWUpIHtcclxuICAgICAgdGhpcy5jbGVhckFsbENoZWNrZWQodGhpcy5ub2Rlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFwcGx5TXVsdGlwbGVMb2dpYyh0aGlzLm5vZGVzKTtcclxuICAgIH1cclxuICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlc107XHJcbiAgICB0aGlzLnN5bmNUcmVlT3B0aW9uc0Zyb21Ob2RlcygpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoq5bqU55So5aSa6YCJ6YC76L6R77ya6YCJ5Lit55qE6IqC54K55ZCM5pe26YCJ5Lit5YW25omA5pyJ5a2Q6IqC54K55ZKM54i26IqC54K5ICovXHJcbiAgcHJpdmF0ZSBhcHBseU11bHRpcGxlTG9naWMobm9kZXM6IGFueVtdKSB7XHJcbiAgICBjb25zdCBjaGVja2VkS2V5czogc3RyaW5nW10gPSBbXTtcclxuICAgIHRoaXMuY29sbGVjdENoZWNrZWRLZXlzKG5vZGVzLCBjaGVja2VkS2V5cyk7XHJcbiAgICBjaGVja2VkS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0Tm9kZUNoZWNrZWQobm9kZXMsIGtleSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2V0UGFyZW50Tm9kZXNDaGVja2VkKG5vZGVzLCBrZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKirmlLbpm4bmiYDmnInpgInkuK3oioLngrnnmoRrZXkgKi9cclxuICBwcml2YXRlIGNvbGxlY3RDaGVja2VkS2V5cyhub2RlczogYW55W10sIHJlc3VsdDogc3RyaW5nW10pIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5pc0NoZWNrZWQpIHtcclxuICAgICAgICByZXN1bHQucHVzaChub2RlLmtleSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGVjdENoZWNrZWRLZXlzKG5vZGUuY2hpbGRyZW4sIHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKuWIh+aNouiKgueCuemAieS4reeKtuaAgSAqL1xyXG4gIHRvZ2dsZU5vZGVDaGVja2VkKGV2ZW50OiBhbnksIG5vZGU6IGFueSkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBpc011bHRpcGxlID0gdGhpcy5mb3JtQ29uZmlndXJhdGlvbi5jb250cm9sc1snVHJlZVZpZXcuTXVsdGlwbGUnXSBhcyBGb3JtQ29udHJvbDtcclxuICAgIGNvbnN0IG5ld0NoZWNrZWQgPSAhbm9kZS5vcmlnaW4/LmlzQ2hlY2tlZDtcclxuXHJcbiAgICBpZiAoIWlzTXVsdGlwbGUudmFsdWUpIHtcclxuICAgICAgdGhpcy5jbGVhckFsbENoZWNrZWQodGhpcy5ub2Rlcyk7XHJcbiAgICAgIGlmIChuZXdDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5zZXROb2RlQ2hlY2tlZE9ubHkodGhpcy5ub2Rlcywgbm9kZS5rZXksIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldE5vZGVDaGVja2VkKHRoaXMubm9kZXMsIG5vZGUua2V5LCBuZXdDaGVja2VkKTtcclxuICAgICAgaWYgKG5ld0NoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLnNldFBhcmVudE5vZGVzQ2hlY2tlZCh0aGlzLm5vZGVzLCBub2RlLmtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gICAgdGhpcy5zeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKua4hemZpOaJgOacieiKgueCueeahOmAieS4reeKtuaAgSAqL1xyXG4gIHByaXZhdGUgY2xlYXJBbGxDaGVja2VkKG5vZGVzOiBhbnlbXSkge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIG5vZGUuaXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQWxsQ2hlY2tlZChub2RlLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoq6K6+572u5oyH5a6a6IqC54K555qE6YCJ5Lit54q25oCBICovXHJcbiAgcHJpdmF0ZSBzZXROb2RlQ2hlY2tlZChub2RlczogYW55W10sIHRhcmdldEtleTogc3RyaW5nLCBjaGVja2VkOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgaWYgKG5vZGUua2V5ID09PSB0YXJnZXRLZXkpIHtcclxuICAgICAgICBub2RlLmlzQ2hlY2tlZCA9IGNoZWNrZWQ7XHJcbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5zZXRDaGlsZHJlbkNoZWNrZWQobm9kZS5jaGlsZHJlbiwgY2hlY2tlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5zZXROb2RlQ2hlY2tlZChub2RlLmNoaWxkcmVuLCB0YXJnZXRLZXksIGNoZWNrZWQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKumAkuW9kuiuvue9ruaJgOacieWtkOiKgueCueeahOmAieS4reeKtuaAgSAqL1xyXG4gIHByaXZhdGUgc2V0Q2hpbGRyZW5DaGVja2VkKGNoaWxkcmVuOiBhbnlbXSwgY2hlY2tlZDogYm9vbGVhbikge1xyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICBjaGlsZC5pc0NoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q2hpbGRyZW5DaGVja2VkKGNoaWxkLmNoaWxkcmVuLCBjaGVja2VkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoq6YCJ5Lit5omA5pyJ54i26IqC54K5ICovXHJcbiAgcHJpdmF0ZSBzZXRQYXJlbnROb2Rlc0NoZWNrZWQobm9kZXM6IGFueVtdLCB0YXJnZXRLZXk6IHN0cmluZywgcGFyZW50OiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgaWYgKG5vZGUua2V5ID09PSB0YXJnZXRLZXkpIHtcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICBwYXJlbnQuaXNDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuc2V0UGFyZW50Tm9kZXNDaGVja2VkKHRoaXMubm9kZXMsIHBhcmVudC5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuc2V0UGFyZW50Tm9kZXNDaGVja2VkKG5vZGUuY2hpbGRyZW4sIHRhcmdldEtleSwgbm9kZSkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoq5LuF6K6+572u5oyH5a6a6IqC54K555qE6YCJ5Lit54q25oCB77yM5LiN5b2x5ZON5a2Q6IqC54K55ZKM54i26IqC54K5ICovXHJcbiAgcHJpdmF0ZSBzZXROb2RlQ2hlY2tlZE9ubHkobm9kZXM6IGFueVtdLCB0YXJnZXRLZXk6IHN0cmluZywgY2hlY2tlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5zZXROb2RlQ2hlY2tlZE9ubHkobm9kZS5jaGlsZHJlbiwgdGFyZ2V0S2V5LCBjaGVja2VkKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirmi5bmi70gKi9cclxuICBkcm9wT3ZlcihldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBkcmFnTm9kZSA9IGV2ZW50LmRyYWdOb2RlO1xyXG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IGV2ZW50Lm5vZGU7XHJcbiAgICBjb25zdCBwb3MgPSBldmVudC5wb3M7XHJcblxyXG4gICAgLy8g56e76Zmk6KKr5ouW5ou955qE6IqC54K5XHJcbiAgICBjb25zdCBkcmFnZ2VkRGF0YSA9IHRoaXMucmVtb3ZlTm9kZUJ5S2V5KHRoaXMubm9kZXMsIGRyYWdOb2RlLmtleSk7XHJcbiAgICBpZiAoIWRyYWdnZWREYXRhKSByZXR1cm47XHJcblxyXG4gICAgLy8gcG9zOiAwPeWGhemDqCwgLTE95LiK5pa5LCAxPeS4i+aWuVxyXG4gICAgaWYgKHBvcyA9PT0gMCkge1xyXG4gICAgICAvLyDmlL7lhaXnm67moIfoioLngrnlhoXpg6jkvZzkuLrlrZDoioLngrlcclxuICAgICAgdGhpcy5hZGRDaGlsZE5vZGUodGhpcy5ub2RlcywgdGFyZ2V0Tm9kZS5rZXksIGRyYWdnZWREYXRhKTtcclxuICAgICAgaWYgKCF0aGlzLmFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKHRhcmdldE5vZGUua2V5KSkge1xyXG4gICAgICAgIHRoaXMuYW5FeHBhbmRlZE5vZGUgPSBbLi4udGhpcy5hbkV4cGFuZGVkTm9kZSwgdGFyZ2V0Tm9kZS5rZXldO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDmlL7lnKjnm67moIfoioLngrnliY3lkI5cclxuICAgICAgdGhpcy5pbnNlcnROb2RlQmVzaWRlKHRoaXMubm9kZXMsIHRhcmdldE5vZGUua2V5LCBkcmFnZ2VkRGF0YSwgcG9zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gICAgdGhpcy5zeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKuenu+mZpOW5tui/lOWbnuiKgueCuSAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlTm9kZUJ5S2V5KFxyXG4gICAgbm9kZXM6IGFueVtdLFxyXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmcsXHJcbiAgICBwYXJlbnQ6IGFueVtdID0gbnVsbCxcclxuICAgIGluZGV4OiBudW1iZXIgPSAtMVxyXG4gICk6IGFueSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChub2Rlc1tpXS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIHJldHVybiBub2Rlcy5zcGxpY2UoaSwgMSlbMF07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGVzW2ldLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMucmVtb3ZlTm9kZUJ5S2V5KG5vZGVzW2ldLmNoaWxkcmVuLCB0YXJnZXRLZXksIG5vZGVzW2ldLmNoaWxkcmVuLCBpKTtcclxuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKirlnKjnm67moIfoioLngrnml4Hovrnmj5LlhaXoioLngrkgKi9cclxuICBwcml2YXRlIGluc2VydE5vZGVCZXNpZGUoXHJcbiAgICBub2RlczogYW55W10sXHJcbiAgICB0YXJnZXRLZXk6IHN0cmluZyxcclxuICAgIG5ld05vZGU6IGFueSxcclxuICAgIHBvc2l0aW9uOiBudW1iZXJcclxuICApOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKG5vZGVzW2ldLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBwb3NpdGlvbiA9PT0gLTEgPyBpIDogaSArIDE7XHJcbiAgICAgICAgbm9kZXMuc3BsaWNlKGluc2VydEluZGV4LCAwLCBuZXdOb2RlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgbm9kZXNbaV0uY2hpbGRyZW4/Lmxlbmd0aCAmJlxyXG4gICAgICAgIHRoaXMuaW5zZXJ0Tm9kZUJlc2lkZShub2Rlc1tpXS5jaGlsZHJlbiwgdGFyZ2V0S2V5LCBuZXdOb2RlLCBwb3NpdGlvbilcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuWIpOaWreiKgueCueeahOWtkOiKgueCueaYr+WQpuacieiiq+mAieS4reeahCAqL1xyXG4gIGhhc0NoaWxkcmVuQ2hlY2tlZChub2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmIChub2RlLm9yaWdpbj8uaXNDaGVja2VkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9yaWdpbk5vZGUgPSB0aGlzLmZpbmROb2RlQnlLZXkodGhpcy5ub2Rlcywgbm9kZS5rZXkpO1xyXG4gICAgaWYgKCFvcmlnaW5Ob2RlPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmhhc0FueUNoaWxkQ2hlY2tlZChvcmlnaW5Ob2RlLmNoaWxkcmVuKTtcclxuICB9XHJcblxyXG4gIC8qKumAkuW9kuajgOafpeWtkOiKgueCueaYr+WQpuacieiiq+mAieS4reeahCAqL1xyXG4gIHByaXZhdGUgaGFzQW55Q2hpbGRDaGVja2VkKGNoaWxkcmVuOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICBpZiAoY2hpbGQuaXNDaGVja2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5oYXNBbnlDaGlsZENoZWNrZWQoY2hpbGQuY2hpbGRyZW4pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuagueaNriBrZXkg5p+l5om+6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBmaW5kTm9kZUJ5S2V5KG5vZGVzOiBhbnlbXSwga2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTm9kZUJ5S2V5KG5vZGUuY2hpbGRyZW4sIGtleSk7XHJcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgY29uc3QgY2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXVtkYXRhLWluZGV0ZXJtaW5hdGVdJyk7XHJcbiAgICBjaGVja2JveGVzLmZvckVhY2goKGNoZWNrYm94OiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IGluZGV0ZXJtaW5hdGUgPSBjaGVja2JveC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXRlcm1pbmF0ZScpID09PSAndHJ1ZSc7XHJcbiAgICAgIGNoZWNrYm94LmluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUVudGl0eVwiPlxyXG4gICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZm9ybUNvbmZpZ3VyYXRpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIFwiPnt7J0FicER5bmFtaWNGb3JtOjpOb2RlcycgfCBhYnBMb2NhbGl6YXRpb259fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJoYXNBbnlOb2RlV2l0aENoaWxkcmVuKClcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0IG1zLTJcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCItLWJzLWJ0bi1wYWRkaW5nLXk6IC4yNXJlbTsgLS1icy1idG4tcGFkZGluZy14OiAuNXJlbTsgLS1icy1idG4tZm9udC1zaXplOiAuNzVyZW07XCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJ0b2dnbGVFeHBhbmRBbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIFtuZ0NsYXNzXT1cImlzQWxsRXhwYW5kZWQgPyAnZmEtY29tcHJlc3MnIDogJ2ZhLWV4cGFuZCdcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGFyayBzb2Z0IG1zLTIgZmxvYXQtZW5kXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJhZGROb2RlQnRuKClcIj57eydBYnBEeW5hbWljRm9ybTo6QWRkTm9kZScgfFxyXG4gICAgICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlciBwLTIgcm91bmRlZC0yIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIEBpZiAobm9kZXMubGVuZ3RoPjApIHtcclxuIDxhYnAtdHJlZSBjbGFzcz1cIm1iLTJcIiBbbm9kZXNdPVwibm9kZXNcIiBbY2hlY2thYmxlXT1cImZhbHNlXCIgKGRyb3BPdmVyKT1cImRyb3BPdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChuekV4cGFuZENoYW5nZSk9XCJuekV4cGFuZENoYW5nZSgkZXZlbnQpXCIgW2V4cGFuZGVkS2V5c109XCJhbkV4cGFuZGVkTm9kZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWVudSBsZXQtbm9kZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrLnN0b3ApPVwiZWRpdEl0ZW1CdG4obm9kZSlcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiIG1lLTEgZmEgZmEtcGVuY2lsXCI+PC9pPnt7J0FicFVpOjpFZGl0JyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2suc3RvcCk9XCJjcmVhdGVDaGlsZEl0ZW1CdG4obm9kZSlcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiIG1lLTEgZmEgZmEtcGx1c1wiPjwvaT57eydBYnBEeW5hbWljRm9ybTo6QWRkU3ViTm9kZScgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrLnN0b3ApPVwiZGVsZXRlTWVudUl0ZW1CdG4obm9kZSlcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiIG1lLTEgZmEgZmEtcmVtb3ZlXCI+PC9pPnt7J0FicFVpOjpEZWxldGUnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgYWJwVHJlZU5vZGVUZW1wbGF0ZSBsZXQtbm9kZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwidG9nZ2xlTm9kZUNoZWNrZWQoJGV2ZW50LCBub2RlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIm5vZGUub3JpZ2luPy5pc0NoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaW5kZXRlcm1pbmF0ZV09XCJoYXNDaGlsZHJlbkNoZWNrZWQobm9kZSlcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tub2RlLnRpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgYWJwVHJlZUV4cGFuZGVkSWNvblRlbXBsYXRlIGxldC1ub2RlIGxldC1vcmlnaW49XCJvcmlnaW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCJub2RlLmNoaWxkcmVuLmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZS5pc0V4cGFuZGVkID8gbWludXNJY29uIDogcGx1c0ljb25cIj48L25nLWNvbnRhaW5lcj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21pbnVzSWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMGM2LjM0NyAwIDExLjUgNS4xNTMgMTEuNSAxMS41cy01LjE1MyAxMS41LTExLjUgMTEuNS0xMS41LTUuMTUzLTExLjUtMTEuNSA1LjE1My0xMS41IDExLjUtMTEuNXptMCAxYzUuNzk1IDAgMTAuNSA0LjcwNSAxMC41IDEwLjVzLTQuNzA1IDEwLjUtMTAuNSAxMC41LTEwLjUtNC43MDUtMTAuNS0xMC41IDQuNzA1LTEwLjUgMTAuNS0xMC41em0tNi41IDEwaDEzdjFoLTEzdi0xelwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbHVzSWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMGM2LjM0NyAwIDExLjUgNS4xNTMgMTEuNSAxMS41cy01LjE1MyAxMS41LTExLjUgMTEuNS0xMS41LTUuMTUzLTExLjUtMTEuNSA1LjE1My0xMS41IDExLjUtMTEuNXptMCAxYzUuNzk1IDAgMTAuNSA0LjcwNSAxMC41IDEwLjVzLTQuNzA1IDEwLjUtMTAuNSAxMC41LTEwLjUtNC43MDUtMTAuNS0xMC41IDQuNzA1LTEwLjUgMTAuNS0xMC41em0uNSAxMGg2djFoLTZ2NmgtMXYtNmgtNnYtMWg2di02aDF2NnpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9hYnAtdHJlZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJub2Rlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtbXV0ZWQgXCI+e3snQWJwRHluYW1pY0Zvcm06OlBsZWFzZUFkZE5vZGUnIHxcclxuICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlRyZWVPcHRpb25zPy5lcnJvcnM/LnJlcXVpcmVkXCIgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIFwiPlxyXG4gICAgICAgICAgICAgICAge3snQWJwVmFsaWRhdGlvbjo6VGhpc0ZpZWxkSXNSZXF1aXJlZC4nIHwgYWJwTG9jYWxpemF0aW9uOiAnTm9kZXMnfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInRvZ2dsZU11bHRpcGxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIlRyZWVWaWV3Lk11bHRpcGxlXCIgaWQ9XCJNdWx0aXBsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cIk11bHRpcGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snQWJwRHluYW1pY0Zvcm06Ok11bHRpcGxlJyB8IGFicExvY2FsaXphdGlvbn19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoYWJwSW5pdCk9XCJzdWJtaXRjbGljaz8ubmF0aXZlRWxlbWVudD8uY2xpY2soKVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxyXG4gICAgICAgICAgICAjc3VibWl0Y2xpY2s+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5cclxuXHJcbjwhLS0gW29wdGlvbnNdPVwieyBzaXplOiBDdXJyZW50U2VsZWN0aW9uVGFibGVDb250cm9sTmFtZT09PSdNYXRyaXgnPyd4bCc6JycgLHNjcm9sbGFibGU6ZmFsc2UgfVwiICh2aXNpYmxlQ2hhbmdlKT1cInRhYmxlU2VsZWN0VmlzaWJsZUNoYW5nZSgkZXZlbnQpXCItLT5cclxuPGFicC1tb2RhbCBbKHZpc2libGUpXT1cImlzVmlzaWJsZVwiIFtidXN5XT1cIm1vZGFsQnVzeVwiPlxyXG4gICAgPG5nLXRlbXBsYXRlICNhYnBIZWFkZXI+XHJcbiAgICAgICAgPGgzPnt7aXNDcmVhdGVDaGlsZCA/ICgnQWJwRHluYW1pY0Zvcm06OkFkZFN1Yk5vZGUnIHwgYWJwTG9jYWxpemF0aW9uKSA6IChzZWxlY3RUcmVlID8gKCdBYnBVaTo6RWRpdCcgfFxyXG4gICAgICAgICAgICBhYnBMb2NhbGl6YXRpb24pIDogKCdDbXM6Ok5ldycgfCBhYnBMb2NhbGl6YXRpb24pKX19PC9oMz5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI2FicEJvZHk+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNsb2FkZXJSZWY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxpIGNsYXNzPVwiZmEgZmEtcHVsc2UgZmEtc3Bpbm5lclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlRm9ybTsgZWxzZSBsb2FkZXJSZWZcIj5cclxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJzaXRlcy1tb2RhbC1mb3JtXCIgI215Rm9ybT1cIm5nRm9ybVwiIFtmb3JtR3JvdXBdPVwibm9kZUZvcm1cIiAoc3VibWl0KT1cImNyZWF0ZU9yRWRpdFNhdmUoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgI25vZGVNb2RhbFN1Ym1pdCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdBYnBEeW5hbWljRm9ybTo6Tm9kZUl0ZW1UZXh0JyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFtwbGFjZWhvbGRlcl09XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJkaXNQbGF5TmFtZUlucHV0Qmx1cigkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0FicER5bmFtaWNGb3JtOjpTZWxlY3RMaXN0SXRlbVZhbHVlJyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiBbcGxhY2Vob2xkZXJdPVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyIGludmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cImtleUlucHV0Py5lcnJvcnM/LnJlcGV0aXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2tleUlucHV0Py5lcnJvcnM/LnJlcGV0aXRpb259fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImlzQ2hlY2tlZFwiIGlkPVwiaXNTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiaXNTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQWJwRHluYW1pY0Zvcm06OlNlbGVjdGVkJyB8IGFicExvY2FsaXphdGlvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBhYnBDbG9zZT57eydBYnBVaTo6Q2xvc2UnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cclxuICAgICAgICA8YWJwLWJ1dHRvbiBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiIFtkaXNhYmxlZF09XCIhbm9kZUZvcm0udmFsaWRcIlxyXG4gICAgICAgICAgICAoYWJwQ2xpY2spPVwibm9kZU1vZGFsU3VibWl0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKVwiPnt7J0FicFVpOjpTYXZlJyB8XHJcbiAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9hYnAtYnV0dG9uPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9hYnAtbW9kYWw+Il19
|
|
@@ -1640,15 +1640,50 @@ class TreeConfigComponent {
|
|
|
1640
1640
|
get keyInput() {
|
|
1641
1641
|
return this.nodeForm?.get('key');
|
|
1642
1642
|
}
|
|
1643
|
-
|
|
1643
|
+
/**
|
|
1644
|
+
* 验证器:检查字符串格式和唯一性
|
|
1645
|
+
* @description 格式只允许字母、数字、下划线和短横线,且值在树中必须唯一
|
|
1646
|
+
*/
|
|
1647
|
+
keyValidator() {
|
|
1644
1648
|
return (control) => {
|
|
1645
1649
|
const regex = /^[a-zA-Z0-9_-]+$/;
|
|
1646
1650
|
if (control.value && !regex.test(control.value)) {
|
|
1647
1651
|
return { repetition: this._LocalizationService.instant(`Cms::SlugValidatorsText`) };
|
|
1648
1652
|
}
|
|
1653
|
+
// 检查唯一性
|
|
1654
|
+
if (control.value && this.isKeyExists(control.value)) {
|
|
1655
|
+
return { repetition: this._LocalizationService.instant(`Cms::ValueAlreadyExis`) };
|
|
1656
|
+
}
|
|
1649
1657
|
return null;
|
|
1650
1658
|
};
|
|
1651
1659
|
}
|
|
1660
|
+
/**
|
|
1661
|
+
* 检查 key 是否在树中已存在
|
|
1662
|
+
* @param key 要检查的 key 值
|
|
1663
|
+
* @returns 如果存在返回 true,否则返回 false
|
|
1664
|
+
*/
|
|
1665
|
+
isKeyExists(key) {
|
|
1666
|
+
const currentKey = this.selectTree?.key;
|
|
1667
|
+
return this.findKeyInNodes(this.nodes, key, currentKey);
|
|
1668
|
+
}
|
|
1669
|
+
/**
|
|
1670
|
+
* 递归查找 key 是否存在于节点中
|
|
1671
|
+
* @param nodes 节点数组
|
|
1672
|
+
* @param targetKey 要查找的 key
|
|
1673
|
+
* @param excludeKey 要排除的 key(编辑时排除当前节点)
|
|
1674
|
+
* @returns 如果找到返回 true,否则返回 false
|
|
1675
|
+
*/
|
|
1676
|
+
findKeyInNodes(nodes, targetKey, excludeKey) {
|
|
1677
|
+
for (const node of nodes) {
|
|
1678
|
+
if (node.key === targetKey && node.key !== excludeKey) {
|
|
1679
|
+
return true;
|
|
1680
|
+
}
|
|
1681
|
+
if (node.children?.length && this.findKeyInNodes(node.children, targetKey, excludeKey)) {
|
|
1682
|
+
return true;
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
return false;
|
|
1686
|
+
}
|
|
1652
1687
|
/**创建节点 */
|
|
1653
1688
|
addNodeBtn() {
|
|
1654
1689
|
this.isVisible = true;
|
|
@@ -1656,7 +1691,7 @@ class TreeConfigComponent {
|
|
|
1656
1691
|
this.selectTree = null;
|
|
1657
1692
|
this.nodeForm = this.fb.group({
|
|
1658
1693
|
title: ['', Validators.required],
|
|
1659
|
-
key: ['', [Validators.required, this.
|
|
1694
|
+
key: ['', [Validators.required, this.keyValidator()]],
|
|
1660
1695
|
isChecked: [false],
|
|
1661
1696
|
children: new FormArray([]),
|
|
1662
1697
|
});
|
|
@@ -1668,7 +1703,7 @@ class TreeConfigComponent {
|
|
|
1668
1703
|
this.selectTree = node;
|
|
1669
1704
|
this.nodeForm = this.fb.group({
|
|
1670
1705
|
title: [node.title, Validators.required],
|
|
1671
|
-
key: [node.key, [Validators.required, this.
|
|
1706
|
+
key: [node.key, [Validators.required, this.keyValidator()]],
|
|
1672
1707
|
isChecked: [node.origin?.isChecked ?? false],
|
|
1673
1708
|
children: new FormArray([]),
|
|
1674
1709
|
});
|
|
@@ -1680,7 +1715,7 @@ class TreeConfigComponent {
|
|
|
1680
1715
|
this.selectTree = node;
|
|
1681
1716
|
this.nodeForm = this.fb.group({
|
|
1682
1717
|
title: ['', Validators.required],
|
|
1683
|
-
key: ['', [Validators.required, this.
|
|
1718
|
+
key: ['', [Validators.required, this.keyValidator()]],
|
|
1684
1719
|
isChecked: [false],
|
|
1685
1720
|
children: new FormArray([]),
|
|
1686
1721
|
});
|