tnx-shared 5.3.429 → 5.3.430
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/tnx-shared.umd.js +398 -251
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/base/component-base-with-button.d.ts +2 -0
- package/classes/base/component-base-with-button.d.ts.map +1 -1
- package/classes/base/data-form-base.d.ts +32 -0
- package/classes/base/data-form-base.d.ts.map +1 -1
- package/classes/base/list-component-base.d.ts.map +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
- package/esm2015/classes/base/component-base-with-button.js +6 -1
- package/esm2015/classes/base/data-form-base.js +150 -20
- package/esm2015/classes/base/list-component-base.js +2 -1
- package/esm2015/components/crud/crud-form/crud-form.component.js +1 -1
- package/esm2015/components/tn-dialog/tn-dialog.component.js +2 -2
- package/fesm2015/tnx-shared.js +313 -178
- package/fesm2015/tnx-shared.js.map +1 -1
- package/package.json +2 -2
- package/tnx-shared.metadata.json +1 -1
|
@@ -19,6 +19,7 @@ import { MasterDataService } from '../../services/master-data.service';
|
|
|
19
19
|
import { ModuleConfigService } from '../../services/module-config.service';
|
|
20
20
|
import { NotifierService } from '../../services/notifier.service';
|
|
21
21
|
import { UserService } from '../../services/user.service';
|
|
22
|
+
import { WorkflowPermissionDetailService } from '../../services/workflow-permission-detail.service';
|
|
22
23
|
import { FormState, KeyFlashShow } from '../constants';
|
|
23
24
|
import { isLiteralObject, isValidDate } from '../environment-schema';
|
|
24
25
|
import { AutoCompletePickerControlSchema, CheckboxControlSchema, ContainerSchema, CrudFormData, CrudFormSetting, CrudListSetting, CustomControlSchema, DateTimeControlSchema, DropdownControlSchema, EditorControlSchema, EnumLogType, EventData, EventType, FileManagerControlSchema, LogColumn, LogSetting, MaskControlSchema, Operator, SwitchControlSchema, TableSchema, TextAreaControlSchema, TitleSchema } from '../form-schema';
|
|
@@ -47,6 +48,8 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
47
48
|
this.autoGetDetail = true;
|
|
48
49
|
this.autoSave = true;
|
|
49
50
|
this.isCloseForm = true;
|
|
51
|
+
// Khi lưu bằng workflow action: tạm chặn đóng form lúc lưu, chỉ đóng sau khi action chạy xong
|
|
52
|
+
this._suppressOnSaved = false;
|
|
50
53
|
this.saving = false;
|
|
51
54
|
this.getDetailPlusUrl = null;
|
|
52
55
|
this.insertPlusUrl = null;
|
|
@@ -71,6 +74,7 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
71
74
|
this._entityMetadataService = this._injector.get(EntityMetadataService);
|
|
72
75
|
this._userService = this._injector.get(UserService);
|
|
73
76
|
this._commonService = this._injector.get(CommonService);
|
|
77
|
+
this._workflowPermissionDetailService = this._injector.get(WorkflowPermissionDetailService);
|
|
74
78
|
}
|
|
75
79
|
ngOnInit() {
|
|
76
80
|
// this.checkPermission(this.model.data.basePermission);
|
|
@@ -185,6 +189,110 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
185
189
|
evt.rootModel[FieldWorkflowCodeInCrudForm] = workflowSetting.workflowCode;
|
|
186
190
|
}
|
|
187
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Lấy trạng thái quy trình hiện tại của bản ghi, gắn các field __trangThai/__textTrangThai/__workflowCode/__permission
|
|
194
|
+
* vào data và sinh danh sách nút hành động quy trình (this.buttons) khi bản ghi đã chạy quy trình.
|
|
195
|
+
* Yêu cầu: this.setting.baseService đã được cấu hình và this.crudList được truyền từ crud-list cha.
|
|
196
|
+
*/
|
|
197
|
+
generateWorkflowButton(data) {
|
|
198
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
199
|
+
// Lấy ra trạng thái quy trình
|
|
200
|
+
const lstItemStatus = (yield this._workflowPermissionDetailService.changeEndpoint(this.setting.baseService).getAll([
|
|
201
|
+
this.newFilter('itemId', Operator.equal, data.id),
|
|
202
|
+
], 'itemId,userId,trangThai,textTrangThai,workflowCode,permission', [], 'ForCrudList')).data;
|
|
203
|
+
if (lstItemStatus == null) {
|
|
204
|
+
return this._notifierService.showWarning('Không lấy được thông tin trạng thái hiện tại của bản ghi');
|
|
205
|
+
}
|
|
206
|
+
let itemStatus = null;
|
|
207
|
+
if (!lstItemStatus.length) {
|
|
208
|
+
itemStatus = {
|
|
209
|
+
textTrangThai: 'Chưa chạy quy trình'
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
data.startedWorkflow = true;
|
|
214
|
+
itemStatus = lstItemStatus.find(q => (q.permission & PermissionBase.EDIT) == PermissionBase.EDIT);
|
|
215
|
+
if (itemStatus == null) {
|
|
216
|
+
itemStatus = lstItemStatus[0];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
data.__trangThai = itemStatus.trangThai;
|
|
220
|
+
data.__textTrangThai = itemStatus.textTrangThai;
|
|
221
|
+
data.__workflowCode = itemStatus.workflowCode;
|
|
222
|
+
data.__permission = itemStatus.permission;
|
|
223
|
+
if (data.startedWorkflow && this.crudList) {
|
|
224
|
+
const actions = yield this.crudList.getActionWorkflow(data);
|
|
225
|
+
if (!Array.isArray(actions))
|
|
226
|
+
return;
|
|
227
|
+
// Chỉ bọc các action lấy từ getActionAllow; các nút phụ (Thu hồi, Cho ý kiến,
|
|
228
|
+
// Xem lịch sử, Chuyển xử lý) giữ nguyên hành vi gốc
|
|
229
|
+
actions.filter(b => b.isActionAllow).forEach(b => this._decorateWorkflowActionButton(b));
|
|
230
|
+
this.buttons = actions;
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Gắn hành vi cho 1 nút action quy trình (lấy từ getActionAllow):
|
|
236
|
+
* - Khi form đang sửa: thêm tiền tố nhãn; nếu dữ liệu thay đổi thì lưu trước (không đóng form), lưu lỗi thì dừng.
|
|
237
|
+
* - Chạy action gốc, và đóng form sau khi action thực sự hoàn tất.
|
|
238
|
+
*/
|
|
239
|
+
_decorateWorkflowActionButton(button) {
|
|
240
|
+
const isEdit = this._isFormEdit();
|
|
241
|
+
const runAction = button.command;
|
|
242
|
+
if (isEdit) {
|
|
243
|
+
button.label = this.workflowButtonLabelPrefix + button.label;
|
|
244
|
+
}
|
|
245
|
+
button.command = () => __awaiter(this, void 0, void 0, function* () {
|
|
246
|
+
if (this.model.submitting)
|
|
247
|
+
return;
|
|
248
|
+
if (isEdit && this._isWorkflowDataChanged()) {
|
|
249
|
+
this.model.submitting = true;
|
|
250
|
+
this._suppressOnSaved = true; // không đóng form khi lưu
|
|
251
|
+
const saved = yield this.save();
|
|
252
|
+
this._suppressOnSaved = false;
|
|
253
|
+
if (!saved)
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (!runAction)
|
|
257
|
+
return;
|
|
258
|
+
this._closeFormWhenWorkflowProcessed();
|
|
259
|
+
yield runAction();
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Đóng form (phát onSaved) đúng một lần khi crudList báo action quy trình đã xử lý xong.
|
|
264
|
+
*/
|
|
265
|
+
_closeFormWhenWorkflowProcessed() {
|
|
266
|
+
var _a;
|
|
267
|
+
const processed = (_a = this.crudList) === null || _a === void 0 ? void 0 : _a.onProcessedWorkflow;
|
|
268
|
+
if (!processed)
|
|
269
|
+
return;
|
|
270
|
+
const sub = processed.subscribe(() => {
|
|
271
|
+
sub.unsubscribe();
|
|
272
|
+
this.onSaved.emit({ id: this.model.data.id, insert: false, isCloseForm: true });
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* So sánh dữ liệu hiện tại với snapshot lúc tải (logSetting.valueBeforeUpdate) để biết form có thay đổi không.
|
|
277
|
+
* Chuẩn hoá cả 2 qua crudForm.getMinimizeData (bỏ _status/_errors/_source, resolve dropdown object về giá trị thô)
|
|
278
|
+
* để so sánh ổn định. Nếu không có snapshot thì coi như có thay đổi (luôn lưu) cho an toàn.
|
|
279
|
+
*/
|
|
280
|
+
/**
|
|
281
|
+
* Form có tham gia quy trình hay không (dựa trên cấu hình parentSetting) - cùng điều kiện với biến hasWorkflow trong addSchemaBase.
|
|
282
|
+
*/
|
|
283
|
+
_hasWorkflow() {
|
|
284
|
+
var _a;
|
|
285
|
+
return !!(this.parentSetting
|
|
286
|
+
&& ((this.parentSetting.workflowSettingNew && ((_a = this.parentSetting.workflowSettingNew.workflows) === null || _a === void 0 ? void 0 : _a.length) > 0)
|
|
287
|
+
|| this.parentSetting.isWorkflowTree));
|
|
288
|
+
}
|
|
289
|
+
_isWorkflowDataChanged() {
|
|
290
|
+
if (!this.logSetting.valueBeforeUpdate || !this.crudForm)
|
|
291
|
+
return true;
|
|
292
|
+
const current = JSON.stringify(this.crudForm.getMinimizeData(this.model.data));
|
|
293
|
+
const before = JSON.stringify(this.crudForm.getMinimizeData(this.logSetting.valueBeforeUpdate));
|
|
294
|
+
return current !== before;
|
|
295
|
+
}
|
|
188
296
|
_handleFormReady(formEvent) {
|
|
189
297
|
return __awaiter(this, void 0, void 0, function* () {
|
|
190
298
|
yield this.__handleFormReady(formEvent);
|
|
@@ -246,7 +354,9 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
246
354
|
}
|
|
247
355
|
yield this._processAfterGetData(response.data);
|
|
248
356
|
yield this.onAfterGetDetail(response.data);
|
|
249
|
-
|
|
357
|
+
// Lưu snapshot dữ liệu trước khi sửa khi: bật log HOẶC form có quy trình
|
|
358
|
+
// (để so sánh thay đổi, quyết định có cần lưu trước khi chạy action quy trình hay không)
|
|
359
|
+
if (this.logSetting.isEnableLog || this._hasWorkflow()) {
|
|
250
360
|
this.logSetting.valueBeforeUpdate = this._commonService.cloneObject(response.data);
|
|
251
361
|
}
|
|
252
362
|
}
|
|
@@ -357,6 +467,11 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
357
467
|
if (this.logSetting.isEnableLog) {
|
|
358
468
|
this.getLogValueAfterLoadDetail();
|
|
359
469
|
}
|
|
470
|
+
// Sinh nút hành động quy trình tập trung: form chỉ cần được truyền [crudList] và có cấu hình workflow,
|
|
471
|
+
// không cần tự gọi generateWorkflowButton trong modifyDetailData.
|
|
472
|
+
if (this._hasWorkflow() && this.crudList) {
|
|
473
|
+
yield this.generateWorkflowButton(data);
|
|
474
|
+
}
|
|
360
475
|
});
|
|
361
476
|
}
|
|
362
477
|
getLogValueAfterLoadDetail() {
|
|
@@ -665,21 +780,24 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
665
780
|
this.triggerSaveFileUpload();
|
|
666
781
|
if (this.autoSave) {
|
|
667
782
|
if (this._isFormEdit() || this._isFormView()) {
|
|
668
|
-
yield this.onUpdate();
|
|
783
|
+
return yield this.onUpdate();
|
|
669
784
|
}
|
|
670
785
|
else if (this._isFormAddNew()) {
|
|
671
|
-
yield this.onInsert();
|
|
786
|
+
return yield this.onInsert();
|
|
672
787
|
}
|
|
673
788
|
else {
|
|
674
789
|
// form view, do nothing
|
|
790
|
+
return false;
|
|
675
791
|
}
|
|
676
792
|
}
|
|
677
793
|
else {
|
|
678
794
|
this.handleManualSave();
|
|
795
|
+
return true;
|
|
679
796
|
}
|
|
680
797
|
}
|
|
681
798
|
else {
|
|
682
799
|
this.model.submitting = false;
|
|
800
|
+
return false;
|
|
683
801
|
}
|
|
684
802
|
});
|
|
685
803
|
}
|
|
@@ -751,8 +869,8 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
751
869
|
}
|
|
752
870
|
const confirmed = yield this.createConfirmIfRequire();
|
|
753
871
|
if (!confirmed)
|
|
754
|
-
return;
|
|
755
|
-
yield this._insert();
|
|
872
|
+
return false;
|
|
873
|
+
return yield this._insert();
|
|
756
874
|
});
|
|
757
875
|
}
|
|
758
876
|
createConfirmIfRequire() {
|
|
@@ -774,29 +892,34 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
774
892
|
}
|
|
775
893
|
_insert() {
|
|
776
894
|
return __awaiter(this, void 0, void 0, function* () {
|
|
777
|
-
this.getPromiseActionInsert()
|
|
895
|
+
return this.getPromiseActionInsert()
|
|
778
896
|
.then((response) => __awaiter(this, void 0, void 0, function* () {
|
|
779
897
|
this.model.submitting = false;
|
|
780
898
|
this.showMessageAfterInsert(response.success, response);
|
|
781
899
|
if (response.success) {
|
|
782
900
|
this.model.data.id = response.data;
|
|
783
901
|
yield this.onAfterSave(response);
|
|
784
|
-
this.
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
902
|
+
if (!this._suppressOnSaved) {
|
|
903
|
+
this.onSaved.emit({
|
|
904
|
+
id: this.model.data.id,
|
|
905
|
+
insert: true,
|
|
906
|
+
isCloseForm: this.isCloseForm
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
return true;
|
|
789
910
|
}
|
|
790
911
|
else {
|
|
791
912
|
this.handleInsertError(response);
|
|
913
|
+
return false;
|
|
792
914
|
}
|
|
793
915
|
}), error => {
|
|
794
916
|
if (!error.error.success && error.error.errorCheckExist) {
|
|
795
917
|
this.model.submitting = false;
|
|
796
|
-
return;
|
|
918
|
+
return false;
|
|
797
919
|
}
|
|
798
920
|
this.model.submitting = false;
|
|
799
921
|
this.showMessageAfterInsert(false, error);
|
|
922
|
+
return false;
|
|
800
923
|
});
|
|
801
924
|
});
|
|
802
925
|
}
|
|
@@ -808,32 +931,38 @@ export class DataFormBase extends ComponentBaseWithButton {
|
|
|
808
931
|
onUpdate() {
|
|
809
932
|
return __awaiter(this, void 0, void 0, function* () {
|
|
810
933
|
this.setDefaultValue(this.model.data);
|
|
811
|
-
this.getPromiseActionUpdate()
|
|
934
|
+
const updatePromise = this.getPromiseActionUpdate()
|
|
812
935
|
.then((response) => __awaiter(this, void 0, void 0, function* () {
|
|
813
936
|
this.model.submitting = false;
|
|
814
937
|
this.showMessageAfterUpdate(response.success, response);
|
|
815
938
|
if (response.success) {
|
|
816
939
|
yield this.onAfterSave(response);
|
|
817
|
-
this.
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
940
|
+
if (!this._suppressOnSaved) {
|
|
941
|
+
this.onSaved.emit({
|
|
942
|
+
id: this.model.data.id,
|
|
943
|
+
insert: false,
|
|
944
|
+
isCloseForm: this.isCloseForm
|
|
945
|
+
});
|
|
946
|
+
}
|
|
947
|
+
return true;
|
|
822
948
|
}
|
|
823
949
|
else {
|
|
824
950
|
this.handleUpdateError(response);
|
|
951
|
+
return false;
|
|
825
952
|
}
|
|
826
953
|
}), error => {
|
|
827
954
|
if (!error.error.success && error.error.errorCheckExist) {
|
|
828
955
|
this.model.submitting = false;
|
|
829
|
-
return;
|
|
956
|
+
return false;
|
|
830
957
|
}
|
|
831
958
|
this.model.submitting = false;
|
|
832
959
|
this.showMessageAfterUpdate(false, error);
|
|
960
|
+
return false;
|
|
833
961
|
});
|
|
834
962
|
if (this.logSetting.isEnableLog) {
|
|
835
963
|
this.logSetting.arrValueAfterUpdate = [];
|
|
836
964
|
}
|
|
965
|
+
return updatePromise;
|
|
837
966
|
});
|
|
838
967
|
}
|
|
839
968
|
handleUpdateError(response) {
|
|
@@ -944,6 +1073,7 @@ DataFormBase.propDecorators = {
|
|
|
944
1073
|
parentSetting: [{ type: Input }],
|
|
945
1074
|
model: [{ type: Input }],
|
|
946
1075
|
forceOnlyView: [{ type: Input }],
|
|
1076
|
+
crudList: [{ type: Input }],
|
|
947
1077
|
onSave: [{ type: Output }],
|
|
948
1078
|
onSaved: [{ type: Output }],
|
|
949
1079
|
onCancel: [{ type: Output }],
|
|
@@ -951,4 +1081,4 @@ DataFormBase.propDecorators = {
|
|
|
951
1081
|
onFormReady: [{ type: Output }],
|
|
952
1082
|
onDataBinded: [{ type: Output }]
|
|
953
1083
|
};
|
|
954
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1mb3JtLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvY2xhc3Nlcy9iYXNlL2RhdGEtZm9ybS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUVILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDekcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1B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QkFDTixNQUFNO3VCQUNOLE1BQU07d0JBQ04sTUFBTTswQkFDTixNQUFNOzJCQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2ZpbGV1cGxvYWQnO1xuaW1wb3J0IHsgQ29udHJvbFRyZWVOb2RlLCBDcnVkRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY3J1ZC9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDT05GSUdfQ0FMRU5EQVJfVklFVE5BTUVTRSB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvY2FsZW5kYXIuY29uZmlnJztcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRleHQuY29uc3RhbnQnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUJvb2xlYW4sIEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2wsIEZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybSB9IGZyb20gJy4uLy4uL2NvbnN0L2NvbW1vbic7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL2VudW1zL2NvbW1vbic7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcbmltcG9ydCB7IFJlc3BvbnNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Jlc3BvbnNlLXJlc3VsdCc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tUm91dGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2N1c3RvbS1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEb21TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZG9tLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LW1ldGFkYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFzdGVyRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYXN0ZXItZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtU3RhdGUsIEtleUZsYXNoU2hvdyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0xpdGVyYWxPYmplY3QsIGlzVmFsaWREYXRlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQtc2NoZW1hJztcbmltcG9ydCB7XG4gICAgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSxcbiAgICBDaGVja2JveENvbnRyb2xTY2hlbWEsXG4gICAgQ29udGFpbmVyU2NoZW1hLFxuICAgIENydWRGb3JtRGF0YSxcbiAgICBDcnVkRm9ybVNldHRpbmcsXG4gICAgQ3J1ZExpc3RTZXR0aW5nLFxuICAgIEN1c3RvbUNvbnRyb2xTY2hlbWEsXG4gICAgRGF0ZVRpbWVDb250cm9sU2NoZW1hLFxuICAgIERyb3Bkb3duQ29udHJvbFNjaGVtYSxcbiAgICBFZGl0b3JDb250cm9sU2NoZW1hLFxuICAgIEVudW1Mb2dUeXBlLFxuICAgIEV2ZW50RGF0YSxcbiAgICBFdmVudFR5cGUsXG4gICAgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hLFxuICAgIEZvcm1Db250cm9sQmFzZSxcbiAgICBMb2dDb2x1bW4sXG4gICAgTG9nU2V0dGluZyxcbiAgICBNYXNrQ29udHJvbFNjaGVtYSxcbiAgICBPcGVyYXRvcixcbiAgICBTd2l0Y2hDb250cm9sU2NoZW1hLFxuICAgIFRhYmxlU2NoZW1hLFxuICAgIFRleHRBcmVhQ29udHJvbFNjaGVtYSxcbiAgICBUaXRsZVNjaGVtYVxufSBmcm9tICcuLi9mb3JtLXNjaGVtYSc7XG5pbXBvcnQgeyBDb21wb25lbnRCYXNlV2l0aEJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50LWJhc2Utd2l0aC1idXR0b24nO1xuaW1wb3J0IHsgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhRm9ybUJhc2UgZXh0ZW5kcyBDb21wb25lbnRCYXNlV2l0aEJ1dHRvbiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBWaWV3Q2hpbGQoQ3J1ZEZvcm1Db21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBjcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnZm9ybUVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBmb3JtRWxlbWVudDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdwVXBsb2FkJywgeyBzdGF0aWM6IHRydWUgfSkgcFVwbG9hZDogRmlsZVVwbG9hZDtcblxuICAgIEBJbnB1dCgpIHBhcmVudFNldHRpbmc6IENydWRMaXN0U2V0dGluZztcbiAgICBASW5wdXQoKSBtb2RlbDogQ3J1ZEZvcm1EYXRhID0gbmV3IENydWRGb3JtRGF0YSgpO1xuICAgIEBJbnB1dCgpIGZvcmNlT25seVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBvblNhdmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uU2F2ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbk1lc3NhZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uRm9ybVJlYWR5OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkRhdGFCaW5kZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBkb05vdENoZWNrQmFzZVNlcnZpY2UgPSBmYWxzZTtcbiAgICBwcml2YXRlIG5vdENvbmZpZ0Jhc2VTZXJ2aWNlTWVzc2FnZSA9ICdDaMawYSBj4bqldSBow6xuaCBDUlVEIGJhc2Ugc2VydmljZSc7XG4gICAgbWVzc2FnZUluc2VydFN1Y2Nlc3MgPSAnJztcbiAgICBtZXNzYWdlVXBkYXRlU3VjY2VzcyA9ICcnO1xuICAgIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcbiAgICBsb2dTZXR0aW5nOiBMb2dTZXR0aW5nID0gbmV3IExvZ1NldHRpbmcoKTtcblxuICAgIHZpID0gQ09ORklHX0NBTEVOREFSX1ZJRVROQU1FU0U7XG5cbiAgICBmb3JtQ29udHJvbHM6IGFueTtcbiAgICBmb3JtQ29udHJvbHNMaXN0ID0ge307XG4gICAgZW52aXJvbm1lbnQ6IGFueSA9IHt9O1xuICAgIG1kV2lkdGhXb3JrZmxvdzogbnVtYmVyO1xuXG4gICAgYXV0b0dldERldGFpbCA9IHRydWU7XG4gICAgYXV0b1NhdmUgPSB0cnVlO1xuICAgIGlzQ2xvc2VGb3JtID0gdHJ1ZTtcbiAgICBtZXNzYWdlQ29uZmlybVNhdmU6IHN0cmluZztcbiAgICBzYXZpbmcgPSBmYWxzZTtcbiAgICBnZXREZXRhaWxQbHVzVXJsID0gbnVsbDtcbiAgICBpbnNlcnRQbHVzVXJsID0gbnVsbDtcbiAgICB1cGRhdGVQbHVzVXJsID0gbnVsbDtcbiAgICBkeW5hbWljQ29udHJvbDogYW55ID0ge307XG4gICAgc2V0VmFsaWRhdGVGb3JtID0gdHJ1ZTtcbiAgICBoYXZlRW50aXR5TWV0YWRhdGFBUEkgPSB0cnVlO1xuICAgIGlzQmFzZU1vZGVsID0gdHJ1ZTtcbiAgICBhdXRvR2VuZXJhdGVJZCA9IHRydWU7XG4gICAgcHVibGljIF9faXNGb3JtVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcbiAgICBwdWJsaWMgX21hc3RlckRhdGFTZXJ2aWNlOiBNYXN0ZXJEYXRhU2VydmljZTtcbiAgICBwdWJsaWMgX3JvdXRlcjogUm91dGVyO1xuICAgIHB1YmxpYyBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlO1xuICAgIHB1YmxpYyBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZTtcbiAgICBwdWJsaWMgX2N1c3RvbVJvdXRlclNlcnZpY2U6IEN1c3RvbVJvdXRlclNlcnZpY2U7XG4gICAgcHVibGljIF9jcnVkU2VydmljZTogQ3J1ZFNlcnZpY2U7XG4gICAgcHVibGljIF9kb21TZXJ2aWNlOiBEb21TZXJ2aWNlO1xuICAgIHB1YmxpYyBfZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBFbnRpdHlNZXRhZGF0YVNlcnZpY2U7XG4gICAgcHVibGljIF91c2VyU2VydmljZTogVXNlclNlcnZpY2U7XG4gICAgcHVibGljIF9udW1iZXJQaXBlOiBEZWNpbWFsUGlwZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBfaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XG4gICAgICAgIGNvbnN0IG1vZHVsZUNvbmZpZ1NlcnZpY2UgPSBfaW5qZWN0b3IuZ2V0KE1vZHVsZUNvbmZpZ1NlcnZpY2UpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudDtcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5vdGlmaWVyU2VydmljZSk7XG4gICAgICAgIHRoaXMuX251bWJlclBpcGUgPSB0aGlzLl9pbmplY3Rvci5nZXQoRGVjaW1hbFBpcGUpO1xuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChNYXN0ZXJEYXRhU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3JvdXRlciA9IHRoaXMuX2luamVjdG9yLmdldChSb3V0ZXIpO1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZSA9IHRoaXMuX2luamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ3VzdG9tUm91dGVyU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KENydWRTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fZG9tU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChEb21TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fZW50aXR5TWV0YWRhdGFTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEVudGl0eU1ldGFkYXRhU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChDb21tb25TZXJ2aWNlKTtcblxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICAvLyB0aGlzLmNoZWNrUGVybWlzc2lvbih0aGlzLm1vZGVsLmRhdGEuYmFzZVBlcm1pc3Npb24pO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5nID0gbmV3IENydWRGb3JtU2V0dGluZygpO1xuICAgICAgICBjb25zdCBjYXVIaW5oTmdoaWVwVnUgPSB0aGlzLmVudmlyb25tZW50Py5jYXVIaW5oTmdoaWVwVnU7XG4gICAgICAgIGlmIChjYXVIaW5oTmdoaWVwVnUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhdUhpbmhOZ2hpZXBWdSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U2V0dGluZ1trZXldID09IHRoaXMuc2V0dGluZ1trZXldXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZ1trZXldICE9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAmJiBjYXVIaW5oTmdoaWVwVnVba2V5XSAhPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nW2tleV0gIT0gY2F1SGluaE5naGllcFZ1W2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nW2tleV0gPSBjYXVIaW5oTmdoaWVwVnVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIH1cbiAgICBjaGVja1Blcm1pc3Npb24oYmFzZVBlcm1pc3Npb24pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNCYXNlTW9kZWwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9PSBGb3JtU3RhdGUuRURJVCkge1xuICAgICAgICAgICAgICAgIGlmIChiYXNlUGVybWlzc2lvbiAmIFBlcm1pc3Npb25CYXNlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YS5pc0J1aWxkSW5BbGwgJiYgIXRoaXMuX3VzZXJTZXJ2aWNlLmlzU3VwZXJVc2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuVklFVztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9faXNGb3JtVmlldyA9IHRoaXMuX2lzRm9ybVZpZXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFNjaGVtYUJhc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl91c2VyU2VydmljZS5pc1N1cGVyVXNlcigpXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsLmRhdGEuaGFzQnVpbGRJblxuICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYVxuICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBTd2l0Y2hDb250cm9sU2NoZW1hKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdpc0J1aWxkSW4nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0tow7NhIG3DoycsXG4gICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgU3dpdGNoQ29udHJvbFNjaGVtYSh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnaXNCdWlsZEluQWxsJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdLaMOzYSBi4bqjbiBnaGknLFxuICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiA0XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nXG4gICAgICAgICAgICAmJiB0aGlzLl9pc0Zvcm1BZGROZXcoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBkYXRhU291cmNlID0gW10sIGRlZmF1bHRWYWx1ZSA9IG51bGwsIGhhc1dvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBpbml0RGF0YVRhc2tGb3JtOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3ICYmIHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcud29ya2Zsb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LndvcmtmbG93cztcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LndvcmtmbG93Q29kZTtcbiAgICAgICAgICAgICAgICBoYXNXb3JrZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhLmNyZWF0ZVRhc2tJbnN0ZWFkID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5jcmVhdGVUYXNrSW5zdGVhZDtcbiAgICAgICAgICAgICAgICBpbml0RGF0YVRhc2tGb3JtLmlkTG9haUNvbmdWaWVjID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5pZExvYWlDb25nVmllY0RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgaW5pdERhdGFUYXNrRm9ybS5fX3RlbXBsYXRlVGFza05hbWUgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LnRlbXBsYXRlVGFza05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudFNldHRpbmcuaXNXb3JrZmxvd1RyZWUpIHtcbiAgICAgICAgICAgICAgICBoYXNXb3JrZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzV29ya2Zsb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gbmV3IEN1c3RvbUNvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogMTIsXG4gICAgICAgICAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnbm8tcGFkZGluZycsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGluaXREYXRhVGFza0Zvcm0sXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8ICFyb290TW9kZWwuY3JlYXRlVGFza0luc3RlYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBEcm9wZG93bkNvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IEZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUXV5IHRyw6xuaCBz4butIGThu6VuZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGaWVsZDogJ2NvZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkOiAndGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogdGhpcy5tZFdpZHRoV29ya2Zsb3cgfHwgMTIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVDYWNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8IHJvb3RNb2RlbC5jcmVhdGVUYXNrSW5zdGVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlZDogYXN5bmMgKGV2dDogRXZlbnREYXRhKSA9PiBhd2FpdCB0aGlzLmhhbmRsZUNoYW5nZVdvcmtmbG93Q29kZShldnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25BZGp1c3RlZFZhbHVlOiBhc3luYyAoZXZ0OiBFdmVudERhdGEpID0+IGF3YWl0IHRoaXMuaGFuZGxlQ2hhbmdlV29ya2Zsb3dDb2RlKGV2dClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3XG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcudGFza0luc2lkZUJ1c2luZXNzRm9ybVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGl0bGVTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDw7RuZyB2aeG7h2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8ICFyb290TW9kZWwuY3JlYXRlVGFza0luc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZVdvcmtmbG93Q29kZShldnQ6IEV2ZW50RGF0YSkge1xuXG4gICAgfVxuXG4gICAgc2V0V29ya2Zsb3dEYXRhc291cmNlKGV2dDogRXZlbnREYXRhLCB3b3JrZmxvd1NldHRpbmcpIHtcbiAgICAgICAgZXZ0LmZvcm1Db250cm9sc1tGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dLmRhdGFTb3VyY2UgPSB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzO1xuICAgICAgICBpZiAoIWV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSkge1xuICAgICAgICAgICAgZXZ0LnJvb3RNb2RlbFtGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93Q29kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5zb21lKHggPT4geC5jb2RlID09IGV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSkpIHtcbiAgICAgICAgICAgIGV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSA9IHdvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfaGFuZGxlRm9ybVJlYWR5KGZvcm1FdmVudDogRXZlbnREYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX19oYW5kbGVGb3JtUmVhZHkoZm9ybUV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9faGFuZGxlRm9ybVJlYWR5KGZvcm1FdmVudDogRXZlbnREYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5kb05vdENoZWNrQmFzZVNlcnZpY2UgJiYgIXRoaXMuc2V0dGluZy5iYXNlU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMubm90Q29uZmlnQmFzZVNlcnZpY2VNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1Db250cm9scyA9IGZvcm1FdmVudC5mb3JtQ29udHJvbHM7XG4gICAgICAgIGF3YWl0IHRoaXMub25Gb3JtSW5pdGlhbGl6ZWQoZm9ybUV2ZW50KTtcbiAgICAgICAgdGhpcy5vbkZvcm1SZWFkeS5lbWl0KHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMsXG4gICAgICAgICAgICBzZXR0aW5nOiB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgICBmb3JtRXZlbnRcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJHZXREZXRhaWwoKTtcbiAgICB9XG5cbiAgICBfdHJpZ2dlckdldERldGFpbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0dldERldGFpbCkge1xuICAgICAgICAgICAgdGhpcy5nZXREZXRhaWwoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5pbml0Q29udHJvbERlZmF1bHRWYWx1ZUZyb21FeHRlcm5hbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25CZWZvcmVHZXREZXRhaWwoKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T2JqZWN0RGV0YWlsKCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5nZXREZXRhaWxXaXRoUGVybWlzc2lvbih0aGlzLm1vZGVsLmRhdGEuaWQsIHRoaXMubW9kZWwuZGF0YS5waWQsIHRoaXMuZ2V0RGV0YWlsUGx1c1VybCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RGV0YWlsQ3VzdG9tKCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXREZXRhaWwoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdENoZWNrID0gYXdhaXQgdGhpcy5nZXREZXRhaWxDdXN0b20oKTtcbiAgICAgICAgLy8gS2jDtG5nIG92ZXJyaWRlXG4gICAgICAgIGlmIChyZXN1bHRDaGVjayA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRm9ybUFkZE5ldygpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZUdldERldGFpbCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc2V0SXNMb2FkZWREYXRhRWRpdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRPYmplY3REZXRhaWwoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1vZGlmeURldGFpbERhdGEocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3Byb2Nlc3NBZnRlckdldERhdGEocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyR2V0RGV0YWlsKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ1NldHRpbmcuaXNFbmFibGVMb2cpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXR0aW5nLnZhbHVlQmVmb3JlVXBkYXRlID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdChyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuY3J1ZEZvcm0uX3Jvb3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBFdmVudFR5cGUuRk9STV9SRUFEWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLmNydWRGb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXREYXRhQWRkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RGVmYXVsdFNldHRpbmdGaWxlQ29udHJvbChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE92ZXJyaWRlIGPDoWNoIGzhuqV5IGThu68gbGnhu4d1IGdldERldGFpbFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRDaGVjay5zdWNjZXNzICYmIHJlc3VsdENoZWNrLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwuZm9ybVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkVESVQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc2V0SXNMb2FkZWREYXRhRWRpdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubW9kaWZ5RGV0YWlsRGF0YShyZXN1bHRDaGVjay5kYXRhKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm9jZXNzQWZ0ZXJHZXREYXRhKHJlc3VsdENoZWNrLmRhdGEpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlckdldERldGFpbChyZXN1bHRDaGVjay5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkFERDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuY3J1ZEZvcm0uX3Jvb3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLmNydWRGb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXREYXRhQWRkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RGVmYXVsdFNldHRpbmdGaWxlQ29udHJvbChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdERhdGFBZGQoZXZ0OiBFdmVudERhdGEpIHsgfVxuXG4gICAgcHJpdmF0ZSBpbml0RGVmYXVsdFNldHRpbmdGaWxlQ29udHJvbChldnQ6IEV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoIWV2dC5yb290TW9kZWwuaWQgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYS5zb21lKHAgPT4gKHAgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpKSkge1xuICAgICAgICAgICAgZXZ0LnJvb3RNb2RlbC5pZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGjhuqNpIGfhu41pIGjDoG0gbsOgeSBraGkgb3ZlcnJpZGUgZ2V0RGV0YWlsXG4gICAgICovXG4gICAgYXN5bmMgX3Byb2Nlc3NBZnRlckdldERhdGEoZGF0YSkge1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIER1eeG7h3QgY8OhYyBjb250cm9sIGRhdGV0aW1lIMSR4buDIGNvbnZlcnQgdmFsdWUgc2FuZyBkYXRldGltZVxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhEYXRlVmFsdWUoc2NoZW1hLCBkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEuX19kaXNhYmxlRWRpdCA9IHRoaXMubW9kZWwuZGF0YS5fX2Rpc2FibGVFZGl0O1xuXG4gICAgICAgIC8vIFNldCBiYXNlUGVybWlzc2lvbiB04burIGNydWRsaXN0XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEuYmFzZVBlcm1pc3Npb24gJiYgdGhpcy5tb2RlbC5kYXRhLmJhc2VQZXJtaXNzaW9uID09PSBQZXJtaXNzaW9uQmFzZS5GVUxMKSB7XG4gICAgICAgICAgICBkYXRhLmJhc2VQZXJtaXNzaW9uID0gdGhpcy5tb2RlbC5kYXRhLmJhc2VQZXJtaXNzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RlbC5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYgKGRhdGEucGlkICYmIGRhdGEucGlkICE9IHRoaXMuZ3VpZEVtcHR5ICYmIGRhdGEuYmFzZVBlcm1pc3Npb25CeVBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUGVybWlzc2lvbihkYXRhLmJhc2VQZXJtaXNzaW9uQnlQaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Blcm1pc3Npb24oZGF0YS5iYXNlUGVybWlzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZm9yY2VPbmx5Vmlldykge1xuICAgICAgICAgICAgdGhpcy5fX2lzRm9ybVZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuVklFVztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLmNydWRGb3JtLnN3aXRjaFZpZXdNb2RlKHRoaXMuX19pc0Zvcm1WaWV3KTtcbiAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc3dpdGNoRm9ybVN0YXRlRm9yVXNlcnBpY2tlcih0aGlzLl9pc0Zvcm1BZGROZXcoKSk7XG4gICAgICAgICAgICB0aGlzLmNydWRGb3JtLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5zZXRJc0xvYWRlZERhdGFFZGl0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZVxuICAgICAgICAgICAgJiYgdGhpcy5oYXZlRW50aXR5TWV0YWRhdGFBUEkgLy8gc2V0dGluZyDEkeG7gyBmaXggbOG7l2kgayBsb2FkIGRjIGVudGl0eSBtZXRhZGF0YSBjaG8gY8ahIGPhuqV1IHThu5UgY2jhu6ljIHNlcnZpY2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnRpdHlNZXRhZGF0YVNlcnZpY2UubG9hZCh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UsIHRoaXMuY29udGV4dCwgdHJ1ZSk7IC8vIGZvcmNlIGxvYWQgxJHhu4MgxJHhu41jIHThu6sgY3NkbFxuICAgICAgICAgICAgY29uc3QgZW5hYmxlVmVyc2lvbiA9IHRoaXMuX2VudGl0eU1ldGFkYXRhU2VydmljZS5nZXRCeUNvZGUoJ2VuYWJsZVZlcnNpb24nKTtcbiAgICAgICAgICAgIGlmIChlbmFibGVWZXJzaW9uID09ICcxJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5maWx0ZXJDaGVja0V4aXN0QnlWZXJzaW9uID0gW1xuICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnY29kZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3Iubm90RXF1YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbC5kYXRhLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzYWJsZUJ1aWxkSW5GaWVsZCgpO1xuICAgICAgICBpZiAodGhpcy5sb2dTZXR0aW5nLmlzRW5hYmxlTG9nKSB7XG4gICAgICAgICAgICB0aGlzLmdldExvZ1ZhbHVlQWZ0ZXJMb2FkRGV0YWlsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMb2dWYWx1ZUFmdGVyTG9hZERldGFpbCgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZm9ybUNvbnRyb2xzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNydWRGb3JtLmZvcm1Db250cm9sc1tjb250cm9sTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xOYW1lLmluY2x1ZGVzKCcuJykgfHwgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbY29udHJvbE5hbWVdPy5oaWRkZW4gPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfHwgIShjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiBjb250cm9sLl9jb21wb25lbnQuZGF0YVNvdXJjZS5tYXAocCA9PiBwLmxhYmVsKS5qb2luKCcsICcpIHx8IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFmdGVyOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDIwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZml4RGF0ZVZhbHVlKGNvbnRyb2wsIHBhcmVudE1vZGVsLCBwYXJlbnRQYXRoPykge1xuICAgICAgICBsZXQgX3BhcmVudFBhdGggPSBjb250cm9sLmZpZWxkO1xuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcblxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXhEYXRlVmFsdWUoc3ViQ29udHJvbCwgaXRlbSwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpeERhdGVWYWx1ZShzdWJDb250cm9sLCBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgX3BhcmVudFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udHJvbC50aW1lT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyhwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWREYXRlKGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBkYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmdldFRpbWUocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlQnVpbGRJbkZpZWxkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzRm9ybUFkZE5ldygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhLmlzQnVpbGRJbkFsbCAmJiAhdGhpcy5fdXNlclNlcnZpY2UuaXNTdXBlclVzZXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRkUmVxdWlyZWRWYWxpZGF0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHNjaGVtYS52YWxpZGF0b3JzKSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleGlzdCkge1xuICAgICAgICAgICAgc2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgUmVxdWlyZWRWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZW1hLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfcmVtb3ZlUmVxdWlyZWRWYWxpZGF0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBzY2hlbWEudmFsaWRhdG9ycykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjaGVtYS52YWxpZGF0b3JzID0gdmFsaWRhdG9ycztcbiAgICAgICAgc2NoZW1hLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX3NldE1vZGVsVmFsdWUoZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5jcnVkRm9ybS5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChmaWVsZCk7XG4gICAgICAgIHRoaXMuX3NldE1vZGVsVmFsdWVCeU5vZGUobm9kZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIF9zZXRNb2RlbFZhbHVlQnlOb2RlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgdmFsdWU6IGFueSkge1xuICAgICAgICBub2RlLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbW9kaWZ5RGV0YWlsRGF0YShkYXRhKSB7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJTYXZlKCkge1xuICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkFmdGVyR2V0TG9nVmFsdWUoKSB7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTaW5nbGVMYWJlbChjb250cm9sLCBkYXRhU291cmNlLCB2YWx1ZVBhcmFtKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBkYXRhU291cmNlLmZpbmQocCA9PiBwPy52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdID09IHZhbHVlUGFyYW0pO1xuICAgICAgICBpZiAoISFyZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmNHZXRMYWJlbCA9IGNvbnRyb2wuZnVuY0dldExhYmVsO1xuICAgICAgICAgICAgaWYgKGZ1bmNHZXRMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNHZXRMYWJlbChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Py5sYWJlbCA/PyByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmxvZ1NldHRpbmcuZW1wdHlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwcml2YXRlIGdldE11bHRpcGxlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgdmFsdWVQYXJhbSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHZhbHVlUGFyYW0uc29tZShwID0+IHAgPT0gTnVtYmVyKHApKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlUGFyYW0gPSB2YWx1ZVBhcmFtLm1hcChwID0+IE51bWJlcihwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggeyB9XG4gICAgICAgIGxldCByZXN1bHQgPSBkYXRhU291cmNlXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gdmFsdWVQYXJhbS5pbmNsdWRlcyhwLnZhbHVlW2NvbnRyb2wudmFsdWVGaWVsZF0pKVxuICAgICAgICAgICAgLm1hcChwID0+IGNvbnRyb2wuZnVuY0dldExhYmVsKHAudmFsdWUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmxvZ1NldHRpbmcuZW1wdHlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFkZFNpbmdsZVByb3BlcnR5TG9nKGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ0NvbHVtbiA9IHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLmZpbmQocCA9PiBwLmZpZWxkID09IGNvbnRyb2wuZmllbGQpO1xuICAgICAgICAgICAgbGV0IGRhdGFTb3VyY2UgPSBjb250cm9sLl9jb21wb25lbnQuc2VsZWN0ZWRWYWx1ZU9iamVjdDtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhU291cmNlKSkgZGF0YVNvdXJjZSA9IFtkYXRhU291cmNlXTtcbiAgICAgICAgICAgIGxvZ0NvbHVtbi52YWx1ZUFmdGVyID0gdGhpcy5nZXRTaW5nbGVMYWJlbChjb250cm9sLCBkYXRhU291cmNlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICBsb2dDb2x1bW4udmlzaWJsZSA9IGxvZ0NvbHVtbi52YWx1ZUJlZm9yZSAhPT0gbG9nQ29sdW1uLnZhbHVlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbDtcbiAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IExvZ0NvbHVtbih7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb250cm9sLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVCZWZvcmU6IHRoaXMuZ2V0U2luZ2xlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgb2xkVmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUFmdGVyOiB0aGlzLmdldFNpbmdsZUxhYmVsKGNvbnRyb2wsIGRhdGFTb3VyY2UsIG5ld1ZhbHVlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZE11bHRpcGxlUHJvcGVydHlMb2coY29udHJvbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgbG9nQ29sdW1uID0gdGhpcy5sb2dTZXR0aW5nLmFyclZhbHVlQWZ0ZXJVcGRhdGUuZmluZChwID0+IHAuZmllbGQgPT0gY29udHJvbC5maWVsZCk7XG4gICAgICAgICAgICBsb2dDb2x1bW4udmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBsb2dDb2x1bW4udmFsdWVBZnRlciA9IHRoaXMuZ2V0TXVsdGlwbGVMYWJlbChjb250cm9sLCBjb250cm9sLl9jb21wb25lbnQuc2VsZWN0ZWRWYWx1ZU9iamVjdCwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWw7XG4gICAgICAgICAgICB0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29udHJvbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbnRyb2wubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiB0aGlzLmdldE11bHRpcGxlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgb2xkVmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUFmdGVyOiB0aGlzLmdldE11bHRpcGxlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgbmV3VmFsdWUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0TG9nVmFsdWVEZWZhdWx0KGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICBjb25zdCBpc051bGxPbGRWYWx1ZSA9IHRoaXMuaXNOdWxsT3JFbXB0eShvbGRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGlzTnVsbE5ld1ZhbHVlID0gdGhpcy5pc051bGxPckVtcHR5KG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGNvbnRyb2wuc2hvd1RpbWUgPyAnSEg6bW0gZGQvTU0veXl5eScgOiAnZGQvTU0veXl5eSc7XG4gICAgICAgICAgICBvbGRWYWx1ZSA9IGlzTnVsbE9sZFZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiB0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0ob2xkVmFsdWUsIGZvcm1hdCk7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGlzTnVsbE5ld1ZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiB0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0obmV3VmFsdWUsIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBvbGRWYWx1ZSA9IGlzTnVsbE9sZFZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiB0aGlzLl9udW1iZXJQaXBlLnRyYW5zZm9ybShvbGRWYWx1ZSwgJycsICd2aS1WTicpO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc051bGxOZXdWYWx1ZSA/IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlIDogdGhpcy5fbnVtYmVyUGlwZS50cmFuc2Zvcm0obmV3VmFsdWUsICcnLCAndmktVk4nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBvbGRWYWx1ZSA9IGlzTnVsbE9sZFZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiBEYXRhU291cmNlQm9vbGVhbi5maW5kKHAgPT4gcC5pZCA9PSBvbGRWYWx1ZSk/LnRlbjtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNOdWxsTmV3VmFsdWUgPyB0aGlzLmxvZ1NldHRpbmcuZW1wdHlWYWx1ZSA6IERhdGFTb3VyY2VCb29sZWFuLmZpbmQocCA9PiBwLmlkID09IG5ld1ZhbHVlKT8udGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbb2xkVmFsdWUsIG5ld1ZhbHVlXTtcbiAgICB9XG5cbiAgICBnZXRMb2dWYWx1ZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsb25lTW9kZWwgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmNsb25lT2JqZWN0KHRoaXMubW9kZWwuZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZm9ybUNvbnRyb2xzKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sTmFtZS5pbmNsdWRlcygnLicpIHx8IHRoaXMuY3J1ZEZvcm0uZm9ybUNvbnRyb2xzW2NvbnRyb2xOYW1lXT8uaGlkZGVuID09PSB0cnVlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbY29udHJvbE5hbWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5sb2dTZXR0aW5nLnZhbHVlQmVmb3JlVXBkYXRlW2NvbnRyb2wuZmllbGRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY2xvbmVNb2RlbFtjb250cm9sLmZpZWxkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCghdGhpcy5pc051bGxPckVtcHR5KG9sZFZhbHVlKSB8fCAhdGhpcy5pc051bGxPckVtcHR5KG5ld1ZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIShjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Mb2dUeXBlOiBFbnVtTG9nVHlwZS5UYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSB8fCBjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc011bHRpcGxlICYmIG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTaW5nbGVQcm9wZXJ0eUxvZyhjb250cm9sLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNNdWx0aXBsZSAmJiAhdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheShvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNdWx0aXBsZVByb3BlcnR5TG9nKGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXJlVmFsdWVzRXF1YWwobmV3VmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZUJlZm9yZSwgdmFsdWVBZnRlcl0gPSB0aGlzLmdldExvZ1ZhbHVlRGVmYXVsdChjb250cm9sLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiB2YWx1ZUJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQWZ0ZXI6IHZhbHVlQWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTG9nVHlwZTogKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbnRyb2xTY2hlbWEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBFbnVtTG9nVHlwZS5UYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRW51bUxvZ1R5cGUuTm9ybWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJy0tLS1sb2cgZGF0YSBmYWlsLS0tLScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXJlVmFsdWVzRXF1YWwodmFsdWUxOiBhbnksIHZhbHVlMjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlMSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcmVBcnJheXNFcXVhbCh2YWx1ZTEsIHZhbHVlMik7IC8vIFNvIHPDoW5oIGFycmF5XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdvYmplY3QnICYmIHZhbHVlMSAhPT0gbnVsbCAmJiB2YWx1ZTIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZU9iamVjdHNFcXVhbCh2YWx1ZTEsIHZhbHVlMik7IC8vIFNvIHPDoW5oIG9iamVjdHNcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXJlQXJyYXlzRXF1YWwoYXJyMTogYW55W10sIGFycjI6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHJldHVybiBmYWxzZTsgLy8gS2jDoWMgxJHhu5kgZMOgaVxuICAgICAgICByZXR1cm4gYXJyMS5ldmVyeSgoaXRlbSwgaW5kZXgpID0+IHRoaXMuYXJlVmFsdWVzRXF1YWwoaXRlbSwgYXJyMltpbmRleF0pKTsgLy8gU28gc8OhbmggdHLDqm4gdOG7q25nIHBo4bqnbiB04butIGPhu6dhIGFycmF5XG4gICAgfVxuXG4gICAgYXJlT2JqZWN0c0VxdWFsKG9iajE6IGFueSwgb2JqMjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqMSk7XG4gICAgICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqMik7XG4gICAgICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOyAvLyBLaMOhYyDEkeG7mSBkw6BpXG4gICAgICAgIHJldHVybiBrZXlzMS5ldmVyeShrZXkgPT5cbiAgICAgICAgICAgIG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICAgICAgdGhpcy5hcmVWYWx1ZXNFcXVhbChvYmoxW2tleV0sIG9iajJba2V5XSkgIC8vIFNvIHPDoW5oIHRyw6puIHThu6tuZyBwaOG6p24gdOG7rSBj4bunYSBvYmplY3RcbiAgICAgICAgKTtcbiAgICB9XG5cblxuICAgIGlzTnVsbE9yRW1wdHkoaW5wdXQ6IGFueSkge1xuICAgICAgICBpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCAmJiBpbnB1dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aCA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbnB1dC50b1N0cmluZygpLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgc2F2ZSgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkID0gYXdhaXQgdGhpcy52YWxpZGF0ZUZvcm1CYXNlKCk7XG4gICAgICAgIGlmICh2YWxpZGF0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ1NldHRpbmcuaXNFbmFibGVMb2cpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubG9nU2V0dGluZy5pc0N1c3RvbUFsbCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldExvZ1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGPhuqV1IGjDrG5oIHRow6ptXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyR2V0TG9nVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGEubG9nTWV0YURhdGEgPSB0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5maWx0ZXIocCA9PiBwLnZpc2libGUpLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLmZpbHRlcihwID0+IHAudmlzaWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVTYXZlKCk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJTYXZlRmlsZVVwbG9hZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNGb3JtRWRpdCgpIHx8IHRoaXMuX2lzRm9ybVZpZXcoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uVXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2lzRm9ybUFkZE5ldygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25JbnNlcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvcm0gdmlldywgZG8gbm90aGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTWFudWFsU2F2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVNYW51YWxTYXZlKCkge1xuXG4gICAgfVxuXG4gICAgdHJpZ2dlclNhdmVGaWxlVXBsb2FkKCkge1xuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlNBVkVfRklMRV9JTl9GT1JNKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0UmVzdWx0VmFsaWRhdGUoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRm9ybUJhc2UoKTtcbiAgICB9XG5cbiAgICBhc3luYyB2YWxpZGF0ZUZvcm0ocmVzdWx0VmFsaWRhdGVCYXNlOiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVGb3JtQmFzZSgpIHtcbiAgICAgICAgbGV0IHJlc3VsdFZhbGlkYXRlQmFzZSA9IHRydWU7XG4gICAgICAgIC8vIEPDsyB0aOG7gyBjw7MgZm9ybSBrIGPDsyBjcnVkLWZvcm0gKFbDrCBsw6AgZm9ybSBtYXN0ZXIgY+G7p2EgY8OhYyBmb3JtIGNvbilcbiAgICAgICAgaWYgKHRoaXMuY3J1ZEZvcm0pIHtcbiAgICAgICAgICAgIHJlc3VsdFZhbGlkYXRlQmFzZSA9IGF3YWl0IHRoaXMuY3J1ZEZvcm0udmFsaWRhdGVGb3JtKHRoaXMuc2V0VmFsaWRhdGVGb3JtKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHRWYWxpZGF0ZSA9IGF3YWl0IHRoaXMudmFsaWRhdGVGb3JtKHJlc3VsdFZhbGlkYXRlQmFzZSk7XG4gICAgICAgIC8vIELhu48gY2hlY2sgdmFsaWQgZm9ybSBjw7RuZyB2aeG7h2MuIG7hur91IG5oxrAgZm9ybSBjw7RuZyB2aeG7h2Mga2jDtG5nIHZhbGlkIHRow6wga2jDtG5nIHThu7EgxJHhu5luZyB04bqhbyBjw7RuZyB2aeG7h2NcbiAgICAgICAgLy8gaWYgKHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF1cbiAgICAgICAgLy8gICAgICYmIHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF0uX2NvbXBvbmVudFxuICAgICAgICAvLyApIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhc2tGb3JtID0gdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXS5fY29tcG9uZW50O1xuICAgICAgICAvLyAgICAgY29uc3QgcmVzdWx0VmFsaWRhdGVGb3JtVGFzayA9IGF3YWl0IHRhc2tGb3JtLl9nZXRSZXN1bHRWYWxpZGF0ZSgpO1xuICAgICAgICAvLyAgICAgcmVzdWx0VmFsaWRhdGUgPSByZXN1bHRWYWxpZGF0ZUZvcm1UYXNrICYmIHJlc3VsdFZhbGlkYXRlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiByZXN1bHRWYWxpZGF0ZSAmJiByZXN1bHRWYWxpZGF0ZUJhc2U7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlRm9ybUNvbnRyb2woZmllbGRQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNydWRGb3JtLnZhbGlkYXRlRm9ybUNvbnRyb2woZmllbGRQYXRoKTtcbiAgICB9XG5cbiAgICBfY2xlYW5Gb3JtKCkge1xuICAgICAgICB0aGlzLmNydWRGb3JtLmNsZWFuKCk7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJDb250cm9sQ2hhbmdlKGZpZWxkUGF0aCkge1xuICAgICAgICB0aGlzLmNydWRGb3JtLnRyaWdnZXJDaGFuZ2UoZmllbGRQYXRoKTtcbiAgICB9XG5cbiAgICBvbkJlZm9yZVNhdmUoKTogdm9pZCB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIH1cblxuICAgIG9uQWZ0ZXJTYXZlKHJlc3BvbnNlOiBSZXNwb25zZVJlc3VsdCk6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB9XG5cblxuICAgIGFzeW5jIG9uQWZ0ZXJHZXREZXRhaWwoZGF0YT86IGFueVtdKSB7XG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uSW5zZXJ0KCkge1xuICAgICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSh0aGlzLm1vZGVsLmRhdGEpO1xuICAgICAgICBpZiAodGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXVxuICAgICAgICAgICAgJiYgdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXS5fY29tcG9uZW50XG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgdGFza0Zvcm0gPSB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdLl9jb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRWYWxpZGF0ZUZvcm1UYXNrID0gYXdhaXQgdGFza0Zvcm0uX2dldFJlc3VsdFZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0VmFsaWRhdGVGb3JtVGFzaykge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5pdGVtQ29uZ1ZpZWMgPSB0YXNrRm9ybS5tb2RlbC5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEuY3JlYXRlVGFza0luc3RlYWQpIHtcbiAgICAgICAgICAgIC8vIHJlc2V0IGZpZWxkIF9Xb3JrZmxvd0NvZGUgxJHhu4MgYmFja2VuZCBraMO0bmcgY2jhuqF5IHF1eSB0csOsbmggYuG6o24gZ2hpXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jcmVhdGVDb25maXJtSWZSZXF1aXJlKCk7XG4gICAgICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuX2luc2VydCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQ29uZmlybUlmUmVxdWlyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZUNvbmZpcm1TYXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKHRoaXMubWVzc2FnZUNvbmZpcm1TYXZlKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luc2VydCgpIHtcbiAgICAgICAgdGhpcy5nZXRQcm9taXNlQWN0aW9uSW5zZXJ0KClcbiAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJJbnNlcnQocmVzcG9uc2Uuc3VjY2VzcywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5pZCA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlclNhdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2F2ZWQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbC5kYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbG9zZUZvcm06IHRoaXMuaXNDbG9zZUZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluc2VydEVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvci5lcnJvci5zdWNjZXNzICYmIGVycm9yLmVycm9yLmVycm9yQ2hlY2tFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJJbnNlcnQoZmFsc2UsIGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFByb21pc2VBY3Rpb25JbnNlcnQoKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnBvc3QodGhpcy5tb2RlbC5kYXRhLCB0aGlzLmluc2VydFBsdXNVcmwpO1xuICAgIH1cblxuICAgIGhhbmRsZUluc2VydEVycm9yKHJlc3BvbnNlPzogYW55KSB7XG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uVXBkYXRlKCkge1xuICAgICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSh0aGlzLm1vZGVsLmRhdGEpO1xuICAgICAgICB0aGlzLmdldFByb21pc2VBY3Rpb25VcGRhdGUoKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2VBZnRlclVwZGF0ZShyZXNwb25zZS5zdWNjZXNzLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyU2F2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TYXZlZC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLm1vZGVsLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbG9zZUZvcm06IHRoaXMuaXNDbG9zZUZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVVwZGF0ZUVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvci5lcnJvci5zdWNjZXNzICYmIGVycm9yLmVycm9yLmVycm9yQ2hlY2tFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJVcGRhdGUoZmFsc2UsIGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmxvZ1NldHRpbmcuaXNFbmFibGVMb2cpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVVcGRhdGVFcnJvcihyZXNwb25zZT86IGFueSkge1xuXG4gICAgfVxuXG4gICAgZ2V0UHJvbWlzZUFjdGlvblVwZGF0ZSgpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UucHV0KHRoaXMubW9kZWwuZGF0YS5pZC50b1N0cmluZygpLCB0aGlzLm1vZGVsLmRhdGEsIHRoaXMudXBkYXRlUGx1c1VybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREZWZhdWx0VmFsdWUobW9kZWwpIHtcbiAgICAgICAgaWYgKG1vZGVsLmlzQnVpbGRJbiA9PT0gbnVsbCB8fCBtb2RlbC5pc0J1aWxkSW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbW9kZWwuaXNCdWlsZEluID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZWwuaXNCdWlsZEluQWxsID09PSBudWxsIHx8IG1vZGVsLmlzQnVpbGRJbkFsbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtb2RlbC5pc0J1aWxkSW5BbGwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nPy5lbmFibGVSZW9yZGVyUm93ICYmIHRoaXMucGFyZW50U2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhW3RoaXMucGFyZW50U2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZF0gPz89IHRoaXMucGFyZW50TW9kZWwudG90YWwgKyAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd01lc3NhZ2VBZnRlckluc2VydChpc1N1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZSwgZXJyb3I/OiBhbnkpIHtcbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VJbnNlcnRTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2VzcyA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnTUVTU0FHRS5JTlNFUlRfREFUQV9TVUNDRVNTJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLm1lc3NhZ2VJbnNlcnRTdWNjZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93TWVzc2FnZUFmdGVyVXBkYXRlKGlzU3VjY2VzczogYm9vbGVhbiA9IGZhbHNlLCBlcnJvcj86IGFueSkge1xuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGVTdWNjZXNzID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdNRVNTQUdFLlVQREFURV9EQVRBX1NVQ0NFU1MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VVcGRhdGVTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlcnJvci5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGVycm9yLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ8OzIGzhu5dpIHjhuqN5IHJhLCBsacOqbiBo4buHIHF14bqjbiB0cuG7iyB2acOqbiDEkeG7gyBiaeG6v3QgdGjDqm0gY2hpIHRp4bq/dCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25Gb3JtSW5pdGlhbGl6ZWQoZGF0YTogRXZlbnREYXRhKSB7XG5cbiAgICB9XG5cbiAgICBfaGFuZGxlQWZ0ZXJUcmluaEt5KGV2dCkge1xuICAgICAgICBkZWxldGUgdGhpcy5tb2RlbC5kYXRhW0tleUZsYXNoU2hvd107XG4gICAgICAgIHRoaXMuX2hhbmRsZUNhbmNlbChldnQpO1xuICAgIH1cblxuICAgIF9oYW5kbGVTYXZlKGV2dCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5zdWJtaXR0aW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICB0aGlzLm9uU2F2ZS5lbWl0KGV2dCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZUNhbmNlbChldnQpIHtcbiAgICAgICAgdGhpcy5vbkNhbmNlbC5lbWl0KGV2dCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZU1lc3NhZ2UoZXZ0KSB7XG4gICAgICAgIHRoaXMub25NZXNzYWdlLmVtaXQoZXZ0KTtcbiAgICB9XG5cbiAgICBfc2V0RGlzYWJsZUNvbnRyb2wodW5pcXVlRmllbGQsIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbdW5pcXVlRmllbGRdLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBfc2V0SGlkZGVuQ29udHJvbCh1bmlxdWVGaWVsZCwgaXNIaWRkZW4pIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbdW5pcXVlRmllbGRdLmhpZGRlbiA9IGlzSGlkZGVuO1xuICAgIH1cblxuICAgIF9nZXRGb3JtU3RhdGUoKTogRm9ybVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZm9ybVN0YXRlO1xuICAgIH1cblxuICAgIF9pc0Zvcm1BZGROZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtU3RhdGUoKSA9PSBGb3JtU3RhdGUuQUREO1xuICAgIH1cblxuICAgIF9pc0Zvcm1FZGl0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Rm9ybVN0YXRlKCkgPT0gRm9ybVN0YXRlLkVESVQ7XG4gICAgfVxuXG4gICAgX2lzRm9ybVZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtU3RhdGUoKSA9PSBGb3JtU3RhdGUuVklFVztcbiAgICB9XG59XG4iXX0=
|
|
1084
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1mb3JtLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvY2xhc3Nlcy9iYXNlL2RhdGEtZm9ybS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUVILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDekcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1B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aUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7MEJBQzlDLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3NCQUN6QyxTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs0QkFFckMsS0FBSztvQkFDTCxLQUFLOzRCQUNMLEtBQUs7dUJBRUwsS0FBSztxQkFFTCxNQUFNO3NCQUNOLE1BQU07dUJBQ04sTUFBTTt3QkFDTixNQUFNOzBCQUNOLE1BQU07MkJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY2ltYWxQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvZmlsZXVwbG9hZCc7XG5pbXBvcnQgeyBDb250cm9sVHJlZU5vZGUsIENydWRGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jcnVkL2NydWQtZm9ybS9jcnVkLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IENPTkZJR19DQUxFTkRBUl9WSUVUTkFNRVNFIH0gZnJvbSAnLi4vLi4vY29uZmlncy9jYWxlbmRhci5jb25maWcnO1xuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XG5pbXBvcnQgeyBEYXRhU291cmNlQm9vbGVhbiwgRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbCwgRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtIH0gZnJvbSAnLi4vLi4vY29uc3QvY29tbW9uJztcbmltcG9ydCB7IFBlcm1pc3Npb25CYXNlIH0gZnJvbSAnLi4vLi4vZW51bXMvY29tbW9uJztcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xuaW1wb3J0IHsgUmVzcG9uc2VSZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVzcG9uc2UtcmVzdWx0JztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21tb24uc2VydmljZSc7XG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21Sb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY3VzdG9tLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7IERvbVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kb20uc2VydmljZSc7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRpdHktbWV0YWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBNYXN0ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21hc3Rlci1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kdWxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZHVsZS1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtmbG93UGVybWlzc2lvbkRldGFpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy93b3JrZmxvdy1wZXJtaXNzaW9uLWRldGFpbC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1TdGF0ZSwgS2V5Rmxhc2hTaG93IH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGlzTGl0ZXJhbE9iamVjdCwgaXNWYWxpZERhdGUgfSBmcm9tICcuLi9lbnZpcm9ubWVudC1zY2hlbWEnO1xuaW1wb3J0IHtcbiAgICBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLFxuICAgIENoZWNrYm94Q29udHJvbFNjaGVtYSxcbiAgICBDb250YWluZXJTY2hlbWEsXG4gICAgQ3J1ZEZvcm1EYXRhLFxuICAgIENydWRGb3JtU2V0dGluZyxcbiAgICBDcnVkTGlzdFNldHRpbmcsXG4gICAgQ3VzdG9tQ29udHJvbFNjaGVtYSxcbiAgICBEYXRlVGltZUNvbnRyb2xTY2hlbWEsXG4gICAgRHJvcGRvd25Db250cm9sU2NoZW1hLFxuICAgIEVkaXRvckNvbnRyb2xTY2hlbWEsXG4gICAgRW51bUxvZ1R5cGUsXG4gICAgRXZlbnREYXRhLFxuICAgIEV2ZW50VHlwZSxcbiAgICBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEsXG4gICAgRm9ybUNvbnRyb2xCYXNlLFxuICAgIExvZ0NvbHVtbixcbiAgICBMb2dTZXR0aW5nLFxuICAgIE1hc2tDb250cm9sU2NoZW1hLFxuICAgIE9wZXJhdG9yLFxuICAgIFN3aXRjaENvbnRyb2xTY2hlbWEsXG4gICAgVGFibGVTY2hlbWEsXG4gICAgVGV4dEFyZWFDb250cm9sU2NoZW1hLFxuICAgIFRpdGxlU2NoZW1hXG59IGZyb20gJy4uL2Zvcm0tc2NoZW1hJztcbmltcG9ydCB7IENvbXBvbmVudEJhc2VXaXRoQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnQtYmFzZS13aXRoLWJ1dHRvbic7XG5pbXBvcnQgeyBSZXF1aXJlZFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGFGb3JtQmFzZSBleHRlbmRzIENvbXBvbmVudEJhc2VXaXRoQnV0dG9uIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQFZpZXdDaGlsZChDcnVkRm9ybUNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIGNydWRGb3JtOiBDcnVkRm9ybUNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdmb3JtRWxlbWVudCcsIHsgc3RhdGljOiB0cnVlIH0pIGZvcm1FbGVtZW50OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3BVcGxvYWQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwVXBsb2FkOiBGaWxlVXBsb2FkO1xuXG4gICAgQElucHV0KCkgcGFyZW50U2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nO1xuICAgIEBJbnB1dCgpIG1vZGVsOiBDcnVkRm9ybURhdGEgPSBuZXcgQ3J1ZEZvcm1EYXRhKCk7XG4gICAgQElucHV0KCkgZm9yY2VPbmx5VmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8vIFRoYW0gY2hp4bq/dSB04bubaSBjcnVkLWxpc3QgY2hhIChkw7luZyDEkeG7gyBzaW5oIG7DunQgaMOgbmggxJHhu5luZyBxdXkgdHLDrG5oKS4gxJDhu4Mga2nhu4N1IGFueSBuaOG6sW0gdHLDoW5oIGNpcmN1bGFyIGltcG9ydC5cbiAgICBASW5wdXQoKSBjcnVkTGlzdDogYW55O1xuXG4gICAgQE91dHB1dCgpIG9uU2F2ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25TYXZlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uTWVzc2FnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25Gb3JtUmVhZHk6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uRGF0YUJpbmRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIGRvTm90Q2hlY2tCYXNlU2VydmljZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgbm90Q29uZmlnQmFzZVNlcnZpY2VNZXNzYWdlID0gJ0NoxrBhIGPhuqV1IGjDrG5oIENSVUQgYmFzZSBzZXJ2aWNlJztcbiAgICBtZXNzYWdlSW5zZXJ0U3VjY2VzcyA9ICcnO1xuICAgIG1lc3NhZ2VVcGRhdGVTdWNjZXNzID0gJyc7XG4gICAgc2V0dGluZzogQ3J1ZEZvcm1TZXR0aW5nID0gbmV3IENydWRGb3JtU2V0dGluZygpO1xuICAgIGxvZ1NldHRpbmc6IExvZ1NldHRpbmcgPSBuZXcgTG9nU2V0dGluZygpO1xuXG4gICAgdmkgPSBDT05GSUdfQ0FMRU5EQVJfVklFVE5BTUVTRTtcblxuICAgIGZvcm1Db250cm9sczogYW55O1xuICAgIGZvcm1Db250cm9sc0xpc3QgPSB7fTtcbiAgICBlbnZpcm9ubWVudDogYW55ID0ge307XG4gICAgbWRXaWR0aFdvcmtmbG93OiBudW1iZXI7XG5cbiAgICBhdXRvR2V0RGV0YWlsID0gdHJ1ZTtcbiAgICBhdXRvU2F2ZSA9IHRydWU7XG4gICAgaXNDbG9zZUZvcm0gPSB0cnVlO1xuICAgIC8vIEtoaSBsxrB1IGLhurFuZyB3b3JrZmxvdyBhY3Rpb246IHThuqFtIGNo4bq3biDEkcOzbmcgZm9ybSBsw7pjIGzGsHUsIGNo4buJIMSRw7NuZyBzYXUga2hpIGFjdGlvbiBjaOG6oXkgeG9uZ1xuICAgIHByaXZhdGUgX3N1cHByZXNzT25TYXZlZCA9IGZhbHNlO1xuICAgIG1lc3NhZ2VDb25maXJtU2F2ZTogc3RyaW5nO1xuICAgIHNhdmluZyA9IGZhbHNlO1xuICAgIGdldERldGFpbFBsdXNVcmwgPSBudWxsO1xuICAgIGluc2VydFBsdXNVcmwgPSBudWxsO1xuICAgIHVwZGF0ZVBsdXNVcmwgPSBudWxsO1xuICAgIGR5bmFtaWNDb250cm9sOiBhbnkgPSB7fTtcbiAgICBzZXRWYWxpZGF0ZUZvcm0gPSB0cnVlO1xuICAgIGhhdmVFbnRpdHlNZXRhZGF0YUFQSSA9IHRydWU7XG4gICAgaXNCYXNlTW9kZWwgPSB0cnVlO1xuICAgIGF1dG9HZW5lcmF0ZUlkID0gdHJ1ZTtcbiAgICBwdWJsaWMgX19pc0Zvcm1WaWV3OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgX25vdGlmaWVyU2VydmljZTogTm90aWZpZXJTZXJ2aWNlO1xuICAgIHB1YmxpYyBfbWFzdGVyRGF0YVNlcnZpY2U6IE1hc3RlckRhdGFTZXJ2aWNlO1xuICAgIHB1YmxpYyBfcm91dGVyOiBSb3V0ZXI7XG4gICAgcHVibGljIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGU7XG4gICAgcHVibGljIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlO1xuICAgIHB1YmxpYyBfY3VzdG9tUm91dGVyU2VydmljZTogQ3VzdG9tUm91dGVyU2VydmljZTtcbiAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZTtcbiAgICBwdWJsaWMgX2RvbVNlcnZpY2U6IERvbVNlcnZpY2U7XG4gICAgcHVibGljIF9lbnRpdHlNZXRhZGF0YVNlcnZpY2U6IEVudGl0eU1ldGFkYXRhU2VydmljZTtcbiAgICBwdWJsaWMgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZTtcbiAgICBwdWJsaWMgX251bWJlclBpcGU6IERlY2ltYWxQaXBlO1xuICAgIHB1YmxpYyBfd29ya2Zsb3dQZXJtaXNzaW9uRGV0YWlsU2VydmljZTogV29ya2Zsb3dQZXJtaXNzaW9uRGV0YWlsU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBfaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XG4gICAgICAgIGNvbnN0IG1vZHVsZUNvbmZpZ1NlcnZpY2UgPSBfaW5qZWN0b3IuZ2V0KE1vZHVsZUNvbmZpZ1NlcnZpY2UpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudDtcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5vdGlmaWVyU2VydmljZSk7XG4gICAgICAgIHRoaXMuX251bWJlclBpcGUgPSB0aGlzLl9pbmplY3Rvci5nZXQoRGVjaW1hbFBpcGUpO1xuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChNYXN0ZXJEYXRhU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3JvdXRlciA9IHRoaXMuX2luamVjdG9yLmdldChSb3V0ZXIpO1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZSA9IHRoaXMuX2luamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ3VzdG9tUm91dGVyU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KENydWRTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fZG9tU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChEb21TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fZW50aXR5TWV0YWRhdGFTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEVudGl0eU1ldGFkYXRhU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChDb21tb25TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fd29ya2Zsb3dQZXJtaXNzaW9uRGV0YWlsU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChXb3JrZmxvd1Blcm1pc3Npb25EZXRhaWxTZXJ2aWNlKTtcblxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICAvLyB0aGlzLmNoZWNrUGVybWlzc2lvbih0aGlzLm1vZGVsLmRhdGEuYmFzZVBlcm1pc3Npb24pO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5nID0gbmV3IENydWRGb3JtU2V0dGluZygpO1xuICAgICAgICBjb25zdCBjYXVIaW5oTmdoaWVwVnUgPSB0aGlzLmVudmlyb25tZW50Py5jYXVIaW5oTmdoaWVwVnU7XG4gICAgICAgIGlmIChjYXVIaW5oTmdoaWVwVnUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhdUhpbmhOZ2hpZXBWdSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U2V0dGluZ1trZXldID09IHRoaXMuc2V0dGluZ1trZXldXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZ1trZXldICE9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAmJiBjYXVIaW5oTmdoaWVwVnVba2V5XSAhPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nW2tleV0gIT0gY2F1SGluaE5naGllcFZ1W2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nW2tleV0gPSBjYXVIaW5oTmdoaWVwVnVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIH1cbiAgICBjaGVja1Blcm1pc3Npb24oYmFzZVBlcm1pc3Npb24pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNCYXNlTW9kZWwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmZvcm1TdGF0ZSA9PSBGb3JtU3RhdGUuRURJVCkge1xuICAgICAgICAgICAgICAgIGlmIChiYXNlUGVybWlzc2lvbiAmIFBlcm1pc3Npb25CYXNlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YS5pc0J1aWxkSW5BbGwgJiYgIXRoaXMuX3VzZXJTZXJ2aWNlLmlzU3VwZXJVc2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuVklFVztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9faXNGb3JtVmlldyA9IHRoaXMuX2lzRm9ybVZpZXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFNjaGVtYUJhc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl91c2VyU2VydmljZS5pc1N1cGVyVXNlcigpXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsXG4gICAgICAgICAgICAmJiB0aGlzLm1vZGVsLmRhdGEuaGFzQnVpbGRJblxuICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYVxuICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBTd2l0Y2hDb250cm9sU2NoZW1hKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdpc0J1aWxkSW4nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0tow7NhIG3DoycsXG4gICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgU3dpdGNoQ29udHJvbFNjaGVtYSh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnaXNCdWlsZEluQWxsJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdLaMOzYSBi4bqjbiBnaGknLFxuICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiA0XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nXG4gICAgICAgICAgICAmJiB0aGlzLl9pc0Zvcm1BZGROZXcoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBkYXRhU291cmNlID0gW10sIGRlZmF1bHRWYWx1ZSA9IG51bGwsIGhhc1dvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBpbml0RGF0YVRhc2tGb3JtOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3ICYmIHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcud29ya2Zsb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LndvcmtmbG93cztcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LndvcmtmbG93Q29kZTtcbiAgICAgICAgICAgICAgICBoYXNXb3JrZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhLmNyZWF0ZVRhc2tJbnN0ZWFkID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5jcmVhdGVUYXNrSW5zdGVhZDtcbiAgICAgICAgICAgICAgICBpbml0RGF0YVRhc2tGb3JtLmlkTG9haUNvbmdWaWVjID0gdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5pZExvYWlDb25nVmllY0RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgaW5pdERhdGFUYXNrRm9ybS5fX3RlbXBsYXRlVGFza05hbWUgPSB0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3LnRlbXBsYXRlVGFza05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudFNldHRpbmcuaXNXb3JrZmxvd1RyZWUpIHtcbiAgICAgICAgICAgICAgICBoYXNXb3JrZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzV29ya2Zsb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gbmV3IEN1c3RvbUNvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogMTIsXG4gICAgICAgICAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnbm8tcGFkZGluZycsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGluaXREYXRhVGFza0Zvcm0sXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8ICFyb290TW9kZWwuY3JlYXRlVGFza0luc3RlYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBEcm9wZG93bkNvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IEZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUXV5IHRyw6xuaCBz4butIGThu6VuZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGaWVsZDogJ2NvZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkOiAndGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogdGhpcy5tZFdpZHRoV29ya2Zsb3cgfHwgMTIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVDYWNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8IHJvb3RNb2RlbC5jcmVhdGVUYXNrSW5zdGVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlZDogYXN5bmMgKGV2dDogRXZlbnREYXRhKSA9PiBhd2FpdCB0aGlzLmhhbmRsZUNoYW5nZVdvcmtmbG93Q29kZShldnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25BZGp1c3RlZFZhbHVlOiBhc3luYyAoZXZ0OiBFdmVudERhdGEpID0+IGF3YWl0IHRoaXMuaGFuZGxlQ2hhbmdlV29ya2Zsb3dDb2RlKGV2dClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmcud29ya2Zsb3dTZXR0aW5nTmV3XG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcudGFza0luc2lkZUJ1c2luZXNzRm9ybVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGl0bGVTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDw7RuZyB2aeG7h2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbkNoZWNrOiAocm9vdE1vZGVsKSA9PiAhcm9vdE1vZGVsIHx8ICFyb290TW9kZWwuY3JlYXRlVGFza0luc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZVdvcmtmbG93Q29kZShldnQ6IEV2ZW50RGF0YSkge1xuXG4gICAgfVxuXG4gICAgc2V0V29ya2Zsb3dEYXRhc291cmNlKGV2dDogRXZlbnREYXRhLCB3b3JrZmxvd1NldHRpbmcpIHtcbiAgICAgICAgZXZ0LmZvcm1Db250cm9sc1tGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dLmRhdGFTb3VyY2UgPSB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzO1xuICAgICAgICBpZiAoIWV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSkge1xuICAgICAgICAgICAgZXZ0LnJvb3RNb2RlbFtGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93Q29kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5zb21lKHggPT4geC5jb2RlID09IGV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSkpIHtcbiAgICAgICAgICAgIGV2dC5yb290TW9kZWxbRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtXSA9IHdvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBM4bqleSB0cuG6oW5nIHRow6FpIHF1eSB0csOsbmggaGnhu4duIHThuqFpIGPhu6dhIGLhuqNuIGdoaSwgZ+G6r24gY8OhYyBmaWVsZCBfX3RyYW5nVGhhaS9fX3RleHRUcmFuZ1RoYWkvX193b3JrZmxvd0NvZGUvX19wZXJtaXNzaW9uXG4gICAgICogdsOgbyBkYXRhIHbDoCBzaW5oIGRhbmggc8OhY2ggbsO6dCBow6BuaCDEkeG7mW5nIHF1eSB0csOsbmggKHRoaXMuYnV0dG9ucykga2hpIGLhuqNuIGdoaSDEkcOjIGNo4bqheSBxdXkgdHLDrG5oLlxuICAgICAqIFnDqnUgY+G6p3U6IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSDEkcOjIMSRxrDhu6NjIGPhuqV1IGjDrG5oIHbDoCB0aGlzLmNydWRMaXN0IMSRxrDhu6NjIHRydXnhu4FuIHThu6sgY3J1ZC1saXN0IGNoYS5cbiAgICAgKi9cbiAgICBhc3luYyBnZW5lcmF0ZVdvcmtmbG93QnV0dG9uKGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55OyB9KSB7XG4gICAgICAgIC8vIEzhuqV5IHJhIHRy4bqhbmcgdGjDoWkgcXV5IHRyw6xuaFxuICAgICAgICBjb25zdCBsc3RJdGVtU3RhdHVzID0gKGF3YWl0IHRoaXMuX3dvcmtmbG93UGVybWlzc2lvbkRldGFpbFNlcnZpY2UuY2hhbmdlRW5kcG9pbnQodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKS5nZXRBbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdGhpcy5uZXdGaWx0ZXIoJ2l0ZW1JZCcsIE9wZXJhdG9yLmVxdWFsLCBkYXRhLmlkKSxcbiAgICAgICAgICAgIF0sICdpdGVtSWQsdXNlcklkLHRyYW5nVGhhaSx0ZXh0VHJhbmdUaGFpLHdvcmtmbG93Q29kZSxwZXJtaXNzaW9uJyxcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgJ0ZvckNydWRMaXN0J1xuICAgICAgICApKS5kYXRhO1xuICAgICAgICBpZiAobHN0SXRlbVN0YXR1cyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdLaMO0bmcgbOG6pXkgxJHGsOG7o2MgdGjDtG5nIHRpbiB0cuG6oW5nIHRow6FpIGhp4buHbiB04bqhaSBj4bunYSBi4bqjbiBnaGknKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXRlbVN0YXR1cyA9IG51bGw7XG4gICAgICAgIGlmICghbHN0SXRlbVN0YXR1cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW1TdGF0dXMgPSB7XG4gICAgICAgICAgICAgICAgdGV4dFRyYW5nVGhhaTogJ0NoxrBhIGNo4bqheSBxdXkgdHLDrG5oJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEuc3RhcnRlZFdvcmtmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIGl0ZW1TdGF0dXMgPSBsc3RJdGVtU3RhdHVzLmZpbmQocSA9PiAocS5wZXJtaXNzaW9uICYgUGVybWlzc2lvbkJhc2UuRURJVCkgPT0gUGVybWlzc2lvbkJhc2UuRURJVCk7XG4gICAgICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaXRlbVN0YXR1cyA9IGxzdEl0ZW1TdGF0dXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLl9fdHJhbmdUaGFpID0gaXRlbVN0YXR1cy50cmFuZ1RoYWk7XG4gICAgICAgIGRhdGEuX190ZXh0VHJhbmdUaGFpID0gaXRlbVN0YXR1cy50ZXh0VHJhbmdUaGFpO1xuICAgICAgICBkYXRhLl9fd29ya2Zsb3dDb2RlID0gaXRlbVN0YXR1cy53b3JrZmxvd0NvZGU7XG4gICAgICAgIGRhdGEuX19wZXJtaXNzaW9uID0gaXRlbVN0YXR1cy5wZXJtaXNzaW9uO1xuICAgICAgICBpZiAoZGF0YS5zdGFydGVkV29ya2Zsb3cgJiYgdGhpcy5jcnVkTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IGF3YWl0IHRoaXMuY3J1ZExpc3QuZ2V0QWN0aW9uV29ya2Zsb3coZGF0YSk7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWN0aW9ucykpIHJldHVybjtcbiAgICAgICAgICAgIC8vIENo4buJIGLhu41jIGPDoWMgYWN0aW9uIGzhuqV5IHThu6sgZ2V0QWN0aW9uQWxsb3c7IGPDoWMgbsO6dCBwaOG7pSAoVGh1IGjhu5NpLCBDaG8gw70ga2nhur9uLFxuICAgICAgICAgICAgLy8gWGVtIGzhu4tjaCBz4butLCBDaHV54buDbiB44butIGzDvSkgZ2nhu68gbmd1ecOqbiBow6BuaCB2aSBn4buRY1xuICAgICAgICAgICAgYWN0aW9ucy5maWx0ZXIoYiA9PiBiLmlzQWN0aW9uQWxsb3cpLmZvckVhY2goYiA9PiB0aGlzLl9kZWNvcmF0ZVdvcmtmbG93QWN0aW9uQnV0dG9uKGIpKTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9ucyA9IGFjdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBH4bqvbiBow6BuaCB2aSBjaG8gMSBuw7p0IGFjdGlvbiBxdXkgdHLDrG5oIChs4bqleSB04burIGdldEFjdGlvbkFsbG93KTpcbiAgICAgKiAtIEtoaSBmb3JtIMSRYW5nIHPhu61hOiB0aMOqbSB0aeG7gW4gdOG7kSBuaMOjbjsgbuG6v3UgZOG7ryBsaeG7h3UgdGhheSDEkeG7lWkgdGjDrCBsxrB1IHRyxrDhu5tjIChraMO0bmcgxJHDs25nIGZvcm0pLCBsxrB1IGzhu5dpIHRow6wgZOG7q25nLlxuICAgICAqIC0gQ2jhuqF5IGFjdGlvbiBn4buRYywgdsOgIMSRw7NuZyBmb3JtIHNhdSBraGkgYWN0aW9uIHRo4buxYyBz4buxIGhvw6BuIHThuqV0LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlY29yYXRlV29ya2Zsb3dBY3Rpb25CdXR0b24oYnV0dG9uOiBhbnkpIHtcbiAgICAgICAgY29uc3QgaXNFZGl0ID0gdGhpcy5faXNGb3JtRWRpdCgpO1xuICAgICAgICBjb25zdCBydW5BY3Rpb24gPSBidXR0b24uY29tbWFuZDtcbiAgICAgICAgaWYgKGlzRWRpdCkge1xuICAgICAgICAgICAgYnV0dG9uLmxhYmVsID0gdGhpcy53b3JrZmxvd0J1dHRvbkxhYmVsUHJlZml4ICsgYnV0dG9uLmxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIGJ1dHRvbi5jb21tYW5kID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuc3VibWl0dGluZykgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGlzRWRpdCAmJiB0aGlzLl9pc1dvcmtmbG93RGF0YUNoYW5nZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VwcHJlc3NPblNhdmVkID0gdHJ1ZTsgICAvLyBraMO0bmcgxJHDs25nIGZvcm0ga2hpIGzGsHVcbiAgICAgICAgICAgICAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMuc2F2ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1cHByZXNzT25TYXZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICghc2F2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcnVuQWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUZvcm1XaGVuV29ya2Zsb3dQcm9jZXNzZWQoKTtcbiAgICAgICAgICAgIGF3YWl0IHJ1bkFjdGlvbigpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIMSQw7NuZyBmb3JtIChwaMOhdCBvblNhdmVkKSDEkcO6bmcgbeG7mXQgbOG6p24ga2hpIGNydWRMaXN0IGLDoW8gYWN0aW9uIHF1eSB0csOsbmggxJHDoyB44butIGzDvSB4b25nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3NlRm9ybVdoZW5Xb3JrZmxvd1Byb2Nlc3NlZCgpIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gdGhpcy5jcnVkTGlzdD8ub25Qcm9jZXNzZWRXb3JrZmxvdztcbiAgICAgICAgaWYgKCFwcm9jZXNzZWQpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3ViID0gcHJvY2Vzc2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMub25TYXZlZC5lbWl0KHsgaWQ6IHRoaXMubW9kZWwuZGF0YS5pZCwgaW5zZXJ0OiBmYWxzZSwgaXNDbG9zZUZvcm06IHRydWUgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvIHPDoW5oIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSB24bubaSBzbmFwc2hvdCBsw7pjIHThuqNpIChsb2dTZXR0aW5nLnZhbHVlQmVmb3JlVXBkYXRlKSDEkeG7gyBiaeG6v3QgZm9ybSBjw7MgdGhheSDEkeG7lWkga2jDtG5nLlxuICAgICAqIENodeG6qW4gaG/DoSBj4bqjIDIgcXVhIGNydWRGb3JtLmdldE1pbmltaXplRGF0YSAoYuG7jyBfc3RhdHVzL19lcnJvcnMvX3NvdXJjZSwgcmVzb2x2ZSBkcm9wZG93biBvYmplY3QgduG7gSBnacOhIHRy4buLIHRow7QpXG4gICAgICogxJHhu4Mgc28gc8Ohbmgg4buVbiDEkeG7i25oLiBO4bq/dSBraMO0bmcgY8OzIHNuYXBzaG90IHRow6wgY29pIG5oxrAgY8OzIHRoYXkgxJHhu5VpIChsdcO0biBsxrB1KSBjaG8gYW4gdG/DoG4uXG4gICAgICovXG4gICAgLyoqXG4gICAgICogRm9ybSBjw7MgdGhhbSBnaWEgcXV5IHRyw6xuaCBoYXkga2jDtG5nIChk4buxYSB0csOqbiBj4bqldSBow6xuaCBwYXJlbnRTZXR0aW5nKSAtIGPDuW5nIMSRaeG7gXUga2nhu4duIHbhu5tpIGJp4bq/biBoYXNXb3JrZmxvdyB0cm9uZyBhZGRTY2hlbWFCYXNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2hhc1dvcmtmbG93KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEodGhpcy5wYXJlbnRTZXR0aW5nXG4gICAgICAgICAgICAmJiAoKHRoaXMucGFyZW50U2V0dGluZy53b3JrZmxvd1NldHRpbmdOZXcgJiYgdGhpcy5wYXJlbnRTZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy53b3JrZmxvd3M/Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wYXJlbnRTZXR0aW5nLmlzV29ya2Zsb3dUcmVlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNXb3JrZmxvd0RhdGFDaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMubG9nU2V0dGluZy52YWx1ZUJlZm9yZVVwZGF0ZSB8fCAhdGhpcy5jcnVkRm9ybSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNydWRGb3JtLmdldE1pbmltaXplRGF0YSh0aGlzLm1vZGVsLmRhdGEpKTtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jcnVkRm9ybS5nZXRNaW5pbWl6ZURhdGEodGhpcy5sb2dTZXR0aW5nLnZhbHVlQmVmb3JlVXBkYXRlKSk7XG4gICAgICAgIHJldHVybiBjdXJyZW50ICE9PSBiZWZvcmU7XG4gICAgfVxuXG4gICAgYXN5bmMgX2hhbmRsZUZvcm1SZWFkeShmb3JtRXZlbnQ6IEV2ZW50RGF0YSkge1xuICAgICAgICBhd2FpdCB0aGlzLl9faGFuZGxlRm9ybVJlYWR5KGZvcm1FdmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfX2hhbmRsZUZvcm1SZWFkeShmb3JtRXZlbnQ6IEV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuZG9Ob3RDaGVja0Jhc2VTZXJ2aWNlICYmICF0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyh0aGlzLm5vdENvbmZpZ0Jhc2VTZXJ2aWNlTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBmb3JtRXZlbnQuZm9ybUNvbnRyb2xzO1xuICAgICAgICBhd2FpdCB0aGlzLm9uRm9ybUluaXRpYWxpemVkKGZvcm1FdmVudCk7XG4gICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdCh7XG4gICAgICAgICAgICBlbGVtZW50OiB0aGlzLFxuICAgICAgICAgICAgc2V0dGluZzogdGhpcy5zZXR0aW5nLFxuICAgICAgICAgICAgZm9ybUV2ZW50XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmlnZ2VyR2V0RGV0YWlsKCk7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJHZXREZXRhaWwoKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9HZXREZXRhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RGV0YWlsKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uQmVmb3JlR2V0RGV0YWlsKCkge1xuICAgIH1cblxuICAgIGFzeW5jIGdldE9iamVjdERldGFpbCgpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UuZ2V0RGV0YWlsV2l0aFBlcm1pc3Npb24odGhpcy5tb2RlbC5kYXRhLmlkLCB0aGlzLm1vZGVsLmRhdGEucGlkLCB0aGlzLmdldERldGFpbFBsdXNVcmwpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldERldGFpbEN1c3RvbSgpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RGV0YWlsKCkge1xuICAgICAgICBjb25zdCByZXN1bHRDaGVjayA9IGF3YWl0IHRoaXMuZ2V0RGV0YWlsQ3VzdG9tKCk7XG4gICAgICAgIC8vIEtow7RuZyBvdmVycmlkZVxuICAgICAgICBpZiAocmVzdWx0Q2hlY2sgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0Zvcm1BZGROZXcoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVHZXREZXRhaWwoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRGb3JtLnNldElzTG9hZGVkRGF0YUVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0RGV0YWlsKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tb2RpZnlEZXRhaWxEYXRhKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm9jZXNzQWZ0ZXJHZXREYXRhKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlckdldERldGFpbChyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAvLyBMxrB1IHNuYXBzaG90IGThu68gbGnhu4d1IHRyxrDhu5tjIGtoaSBz4butYSBraGk6IGLhuq10IGxvZyBIT+G6tkMgZm9ybSBjw7MgcXV5IHRyw6xuaFxuICAgICAgICAgICAgICAgIC8vICjEkeG7gyBzbyBzw6FuaCB0aGF5IMSR4buVaSwgcXV54bq/dCDEkeG7i25oIGPDsyBj4bqnbiBsxrB1IHRyxrDhu5tjIGtoaSBjaOG6oXkgYWN0aW9uIHF1eSB0csOsbmggaGF5IGtow7RuZylcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dTZXR0aW5nLmlzRW5hYmxlTG9nIHx8IHRoaXMuX2hhc1dvcmtmbG93KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXR0aW5nLnZhbHVlQmVmb3JlVXBkYXRlID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdChyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuY3J1ZEZvcm0uX3Jvb3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBFdmVudFR5cGUuRk9STV9SRUFEWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLmNydWRGb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXREYXRhQWRkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RGVmYXVsdFNldHRpbmdGaWxlQ29udHJvbChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE92ZXJyaWRlIGPDoWNoIGzhuqV5IGThu68gbGnhu4d1IGdldERldGFpbFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRDaGVjay5zdWNjZXNzICYmIHJlc3VsdENoZWNrLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwuZm9ybVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkVESVQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc2V0SXNMb2FkZWREYXRhRWRpdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubW9kaWZ5RGV0YWlsRGF0YShyZXN1bHRDaGVjay5kYXRhKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm9jZXNzQWZ0ZXJHZXREYXRhKHJlc3VsdENoZWNrLmRhdGEpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlckdldERldGFpbChyZXN1bHRDaGVjay5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkFERDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuY3J1ZEZvcm0uX3Jvb3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnZm9ybVJlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLmNydWRGb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXREYXRhQWRkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RGVmYXVsdFNldHRpbmdGaWxlQ29udHJvbChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdERhdGFBZGQoZXZ0OiBFdmVudERhdGEpIHsgfVxuXG4gICAgcHJpdmF0ZSBpbml0RGVmYXVsdFNldHRpbmdGaWxlQ29udHJvbChldnQ6IEV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoIWV2dC5yb290TW9kZWwuaWQgJiYgdGhpcy5zZXR0aW5nLnNjaGVtYS5zb21lKHAgPT4gKHAgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpKSkge1xuICAgICAgICAgICAgZXZ0LnJvb3RNb2RlbC5pZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGjhuqNpIGfhu41pIGjDoG0gbsOgeSBraGkgb3ZlcnJpZGUgZ2V0RGV0YWlsXG4gICAgICovXG4gICAgYXN5bmMgX3Byb2Nlc3NBZnRlckdldERhdGEoZGF0YSkge1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIER1eeG7h3QgY8OhYyBjb250cm9sIGRhdGV0aW1lIMSR4buDIGNvbnZlcnQgdmFsdWUgc2FuZyBkYXRldGltZVxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhEYXRlVmFsdWUoc2NoZW1hLCBkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEuX19kaXNhYmxlRWRpdCA9IHRoaXMubW9kZWwuZGF0YS5fX2Rpc2FibGVFZGl0O1xuXG4gICAgICAgIC8vIFNldCBiYXNlUGVybWlzc2lvbiB04burIGNydWRsaXN0XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEuYmFzZVBlcm1pc3Npb24gJiYgdGhpcy5tb2RlbC5kYXRhLmJhc2VQZXJtaXNzaW9uID09PSBQZXJtaXNzaW9uQmFzZS5GVUxMKSB7XG4gICAgICAgICAgICBkYXRhLmJhc2VQZXJtaXNzaW9uID0gdGhpcy5tb2RlbC5kYXRhLmJhc2VQZXJtaXNzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RlbC5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYgKGRhdGEucGlkICYmIGRhdGEucGlkICE9IHRoaXMuZ3VpZEVtcHR5ICYmIGRhdGEuYmFzZVBlcm1pc3Npb25CeVBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUGVybWlzc2lvbihkYXRhLmJhc2VQZXJtaXNzaW9uQnlQaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Blcm1pc3Npb24oZGF0YS5iYXNlUGVybWlzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZm9yY2VPbmx5Vmlldykge1xuICAgICAgICAgICAgdGhpcy5fX2lzRm9ybVZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5mb3JtU3RhdGUgPSBGb3JtU3RhdGUuVklFVztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLmNydWRGb3JtLnN3aXRjaFZpZXdNb2RlKHRoaXMuX19pc0Zvcm1WaWV3KTtcbiAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uc3dpdGNoRm9ybVN0YXRlRm9yVXNlcnBpY2tlcih0aGlzLl9pc0Zvcm1BZGROZXcoKSk7XG4gICAgICAgICAgICB0aGlzLmNydWRGb3JtLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5jcnVkRm9ybS5zZXRJc0xvYWRlZERhdGFFZGl0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZVxuICAgICAgICAgICAgJiYgdGhpcy5oYXZlRW50aXR5TWV0YWRhdGFBUEkgLy8gc2V0dGluZyDEkeG7gyBmaXggbOG7l2kgayBsb2FkIGRjIGVudGl0eSBtZXRhZGF0YSBjaG8gY8ahIGPhuqV1IHThu5UgY2jhu6ljIHNlcnZpY2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnRpdHlNZXRhZGF0YVNlcnZpY2UubG9hZCh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UsIHRoaXMuY29udGV4dCwgdHJ1ZSk7IC8vIGZvcmNlIGxvYWQgxJHhu4MgxJHhu41jIHThu6sgY3NkbFxuICAgICAgICAgICAgY29uc3QgZW5hYmxlVmVyc2lvbiA9IHRoaXMuX2VudGl0eU1ldGFkYXRhU2VydmljZS5nZXRCeUNvZGUoJ2VuYWJsZVZlcnNpb24nKTtcbiAgICAgICAgICAgIGlmIChlbmFibGVWZXJzaW9uID09ICcxJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5maWx0ZXJDaGVja0V4aXN0QnlWZXJzaW9uID0gW1xuICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnY29kZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3Iubm90RXF1YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbC5kYXRhLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzYWJsZUJ1aWxkSW5GaWVsZCgpO1xuICAgICAgICBpZiAodGhpcy5sb2dTZXR0aW5nLmlzRW5hYmxlTG9nKSB7XG4gICAgICAgICAgICB0aGlzLmdldExvZ1ZhbHVlQWZ0ZXJMb2FkRGV0YWlsKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5oIG7DunQgaMOgbmggxJHhu5luZyBxdXkgdHLDrG5oIHThuq1wIHRydW5nOiBmb3JtIGNo4buJIGPhuqduIMSRxrDhu6NjIHRydXnhu4FuIFtjcnVkTGlzdF0gdsOgIGPDsyBj4bqldSBow6xuaCB3b3JrZmxvdyxcbiAgICAgICAgLy8ga2jDtG5nIGPhuqduIHThu7EgZ+G7jWkgZ2VuZXJhdGVXb3JrZmxvd0J1dHRvbiB0cm9uZyBtb2RpZnlEZXRhaWxEYXRhLlxuICAgICAgICBpZiAodGhpcy5faGFzV29ya2Zsb3coKSAmJiB0aGlzLmNydWRMaXN0KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlV29ya2Zsb3dCdXR0b24oZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMb2dWYWx1ZUFmdGVyTG9hZERldGFpbCgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZm9ybUNvbnRyb2xzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNydWRGb3JtLmZvcm1Db250cm9sc1tjb250cm9sTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xOYW1lLmluY2x1ZGVzKCcuJykgfHwgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbY29udHJvbE5hbWVdPy5oaWRkZW4gPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfHwgIShjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiBjb250cm9sLl9jb21wb25lbnQuZGF0YVNvdXJjZS5tYXAocCA9PiBwLmxhYmVsKS5qb2luKCcsICcpIHx8IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFmdGVyOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDIwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZml4RGF0ZVZhbHVlKGNvbnRyb2wsIHBhcmVudE1vZGVsLCBwYXJlbnRQYXRoPykge1xuICAgICAgICBsZXQgX3BhcmVudFBhdGggPSBjb250cm9sLmZpZWxkO1xuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcblxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXhEYXRlVmFsdWUoc3ViQ29udHJvbCwgaXRlbSwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpeERhdGVWYWx1ZShzdWJDb250cm9sLCBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgX3BhcmVudFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udHJvbC50aW1lT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyhwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWREYXRlKGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBkYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmdldFRpbWUocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlQnVpbGRJbkZpZWxkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzRm9ybUFkZE5ldygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhLmlzQnVpbGRJbkFsbCAmJiAhdGhpcy5fdXNlclNlcnZpY2UuaXNTdXBlclVzZXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRkUmVxdWlyZWRWYWxpZGF0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHNjaGVtYS52YWxpZGF0b3JzKSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleGlzdCkge1xuICAgICAgICAgICAgc2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgUmVxdWlyZWRWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZW1hLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfcmVtb3ZlUmVxdWlyZWRWYWxpZGF0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBzY2hlbWEudmFsaWRhdG9ycykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjaGVtYS52YWxpZGF0b3JzID0gdmFsaWRhdG9ycztcbiAgICAgICAgc2NoZW1hLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX3NldE1vZGVsVmFsdWUoZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5jcnVkRm9ybS5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChmaWVsZCk7XG4gICAgICAgIHRoaXMuX3NldE1vZGVsVmFsdWVCeU5vZGUobm9kZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIF9zZXRNb2RlbFZhbHVlQnlOb2RlKG5vZGU6IENvbnRyb2xUcmVlTm9kZSwgdmFsdWU6IGFueSkge1xuICAgICAgICBub2RlLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbW9kaWZ5RGV0YWlsRGF0YShkYXRhKSB7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJTYXZlKCkge1xuICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkFmdGVyR2V0TG9nVmFsdWUoKSB7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTaW5nbGVMYWJlbChjb250cm9sLCBkYXRhU291cmNlLCB2YWx1ZVBhcmFtKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBkYXRhU291cmNlLmZpbmQocCA9PiBwPy52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdID09IHZhbHVlUGFyYW0pO1xuICAgICAgICBpZiAoISFyZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmNHZXRMYWJlbCA9IGNvbnRyb2wuZnVuY0dldExhYmVsO1xuICAgICAgICAgICAgaWYgKGZ1bmNHZXRMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNHZXRMYWJlbChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Py5sYWJlbCA/PyByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmxvZ1NldHRpbmcuZW1wdHlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwcml2YXRlIGdldE11bHRpcGxlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgdmFsdWVQYXJhbSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHZhbHVlUGFyYW0uc29tZShwID0+IHAgPT0gTnVtYmVyKHApKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlUGFyYW0gPSB2YWx1ZVBhcmFtLm1hcChwID0+IE51bWJlcihwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggeyB9XG4gICAgICAgIGxldCByZXN1bHQgPSBkYXRhU291cmNlXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gdmFsdWVQYXJhbS5pbmNsdWRlcyhwLnZhbHVlW2NvbnRyb2wudmFsdWVGaWVsZF0pKVxuICAgICAgICAgICAgLm1hcChwID0+IGNvbnRyb2wuZnVuY0dldExhYmVsKHAudmFsdWUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmxvZ1NldHRpbmcuZW1wdHlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFkZFNpbmdsZVByb3BlcnR5TG9nKGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ0NvbHVtbiA9IHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLmZpbmQocCA9PiBwLmZpZWxkID09IGNvbnRyb2wuZmllbGQpO1xuICAgICAgICAgICAgbGV0IGRhdGFTb3VyY2UgPSBjb250cm9sLl9jb21wb25lbnQuc2VsZWN0ZWRWYWx1ZU9iamVjdDtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhU291cmNlKSkgZGF0YVNvdXJjZSA9IFtkYXRhU291cmNlXTtcbiAgICAgICAgICAgIGxvZ0NvbHVtbi52YWx1ZUFmdGVyID0gdGhpcy5nZXRTaW5nbGVMYWJlbChjb250cm9sLCBkYXRhU291cmNlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICBsb2dDb2x1bW4udmlzaWJsZSA9IGxvZ0NvbHVtbi52YWx1ZUJlZm9yZSAhPT0gbG9nQ29sdW1uLnZhbHVlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbDtcbiAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IExvZ0NvbHVtbih7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb250cm9sLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVCZWZvcmU6IHRoaXMuZ2V0U2luZ2xlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgb2xkVmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUFmdGVyOiB0aGlzLmdldFNpbmdsZUxhYmVsKGNvbnRyb2wsIGRhdGFTb3VyY2UsIG5ld1ZhbHVlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZE11bHRpcGxlUHJvcGVydHlMb2coY29udHJvbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgbG9nQ29sdW1uID0gdGhpcy5sb2dTZXR0aW5nLmFyclZhbHVlQWZ0ZXJVcGRhdGUuZmluZChwID0+IHAuZmllbGQgPT0gY29udHJvbC5maWVsZCk7XG4gICAgICAgICAgICBsb2dDb2x1bW4udmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBsb2dDb2x1bW4udmFsdWVBZnRlciA9IHRoaXMuZ2V0TXVsdGlwbGVMYWJlbChjb250cm9sLCBjb250cm9sLl9jb21wb25lbnQuc2VsZWN0ZWRWYWx1ZU9iamVjdCwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWw7XG4gICAgICAgICAgICB0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29udHJvbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbnRyb2wubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiB0aGlzLmdldE11bHRpcGxlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgb2xkVmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUFmdGVyOiB0aGlzLmdldE11bHRpcGxlTGFiZWwoY29udHJvbCwgZGF0YVNvdXJjZSwgbmV3VmFsdWUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0TG9nVmFsdWVEZWZhdWx0KGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICBjb25zdCBpc051bGxPbGRWYWx1ZSA9IHRoaXMuaXNOdWxsT3JFbXB0eShvbGRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGlzTnVsbE5ld1ZhbHVlID0gdGhpcy5pc051bGxPckVtcHR5KG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGNvbnRyb2wuc2hvd1RpbWUgPyAnSEg6bW0gZGQvTU0veXl5eScgOiAnZGQvTU0veXl5eSc7XG4gICAgICAgICAgICBvbGRWYWx1ZSA9IGlzTnVsbE9sZFZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiB0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0ob2xkVmFsdWUsIGZvcm1hdCk7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGlzTnVsbE5ld1ZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiB0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0obmV3VmFsdWUsIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBvbGRWYWx1ZSA9IGlzTnVsbE9sZFZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiB0aGlzLl9udW1iZXJQaXBlLnRyYW5zZm9ybShvbGRWYWx1ZSwgJycsICd2aS1WTicpO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc051bGxOZXdWYWx1ZSA/IHRoaXMubG9nU2V0dGluZy5lbXB0eVZhbHVlIDogdGhpcy5fbnVtYmVyUGlwZS50cmFuc2Zvcm0obmV3VmFsdWUsICcnLCAndmktVk4nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBvbGRWYWx1ZSA9IGlzTnVsbE9sZFZhbHVlID8gdGhpcy5sb2dTZXR0aW5nLmVtcHR5VmFsdWUgOiBEYXRhU291cmNlQm9vbGVhbi5maW5kKHAgPT4gcC5pZCA9PSBvbGRWYWx1ZSk/LnRlbjtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNOdWxsTmV3VmFsdWUgPyB0aGlzLmxvZ1NldHRpbmcuZW1wdHlWYWx1ZSA6IERhdGFTb3VyY2VCb29sZWFuLmZpbmQocCA9PiBwLmlkID09IG5ld1ZhbHVlKT8udGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbb2xkVmFsdWUsIG5ld1ZhbHVlXTtcbiAgICB9XG5cbiAgICBnZXRMb2dWYWx1ZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsb25lTW9kZWwgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmNsb25lT2JqZWN0KHRoaXMubW9kZWwuZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZm9ybUNvbnRyb2xzKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sTmFtZS5pbmNsdWRlcygnLicpIHx8IHRoaXMuY3J1ZEZvcm0uZm9ybUNvbnRyb2xzW2NvbnRyb2xOYW1lXT8uaGlkZGVuID09PSB0cnVlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbY29udHJvbE5hbWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5sb2dTZXR0aW5nLnZhbHVlQmVmb3JlVXBkYXRlW2NvbnRyb2wuZmllbGRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY2xvbmVNb2RlbFtjb250cm9sLmZpZWxkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCghdGhpcy5pc051bGxPckVtcHR5KG9sZFZhbHVlKSB8fCAhdGhpcy5pc051bGxPckVtcHR5KG5ld1ZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIShjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Mb2dUeXBlOiBFbnVtTG9nVHlwZS5UYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSB8fCBjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc011bHRpcGxlICYmIG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTaW5nbGVQcm9wZXJ0eUxvZyhjb250cm9sLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNNdWx0aXBsZSAmJiAhdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheShvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNdWx0aXBsZVByb3BlcnR5TG9nKGNvbnRyb2wsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXJlVmFsdWVzRXF1YWwobmV3VmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZUJlZm9yZSwgdmFsdWVBZnRlcl0gPSB0aGlzLmdldExvZ1ZhbHVlRGVmYXVsdChjb250cm9sLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dDb2x1bW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbnRyb2wuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmVmb3JlOiB2YWx1ZUJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQWZ0ZXI6IHZhbHVlQWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTG9nVHlwZTogKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbnRyb2xTY2hlbWEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBFbnVtTG9nVHlwZS5UYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRW51bUxvZ1R5cGUuTm9ybWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJy0tLS1sb2cgZGF0YSBmYWlsLS0tLScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXJlVmFsdWVzRXF1YWwodmFsdWUxOiBhbnksIHZhbHVlMjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlMSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcmVBcnJheXNFcXVhbCh2YWx1ZTEsIHZhbHVlMik7IC8vIFNvIHPDoW5oIGFycmF5XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdvYmplY3QnICYmIHZhbHVlMSAhPT0gbnVsbCAmJiB2YWx1ZTIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZU9iamVjdHNFcXVhbCh2YWx1ZTEsIHZhbHVlMik7IC8vIFNvIHPDoW5oIG9iamVjdHNcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXJlQXJyYXlzRXF1YWwoYXJyMTogYW55W10sIGFycjI6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHJldHVybiBmYWxzZTsgLy8gS2jDoWMgxJHhu5kgZMOgaVxuICAgICAgICByZXR1cm4gYXJyMS5ldmVyeSgoaXRlbSwgaW5kZXgpID0+IHRoaXMuYXJlVmFsdWVzRXF1YWwoaXRlbSwgYXJyMltpbmRleF0pKTsgLy8gU28gc8OhbmggdHLDqm4gdOG7q25nIHBo4bqnbiB04butIGPhu6dhIGFycmF5XG4gICAgfVxuXG4gICAgYXJlT2JqZWN0c0VxdWFsKG9iajE6IGFueSwgb2JqMjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqMSk7XG4gICAgICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqMik7XG4gICAgICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOyAvLyBLaMOhYyDEkeG7mSBkw6BpXG4gICAgICAgIHJldHVybiBrZXlzMS5ldmVyeShrZXkgPT5cbiAgICAgICAgICAgIG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICAgICAgdGhpcy5hcmVWYWx1ZXNFcXVhbChvYmoxW2tleV0sIG9iajJba2V5XSkgIC8vIFNvIHPDoW5oIHRyw6puIHThu6tuZyBwaOG6p24gdOG7rSBj4bunYSBvYmplY3RcbiAgICAgICAgKTtcbiAgICB9XG5cblxuICAgIGlzTnVsbE9yRW1wdHkoaW5wdXQ6IGFueSkge1xuICAgICAgICBpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCAmJiBpbnB1dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aCA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbnB1dC50b1N0cmluZygpLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkID0gYXdhaXQgdGhpcy52YWxpZGF0ZUZvcm1CYXNlKCk7XG4gICAgICAgIGlmICh2YWxpZGF0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ1NldHRpbmcuaXNFbmFibGVMb2cpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubG9nU2V0dGluZy5pc0N1c3RvbUFsbCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldExvZ1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGPhuqV1IGjDrG5oIHRow6ptXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyR2V0TG9nVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGEubG9nTWV0YURhdGEgPSB0aGlzLmxvZ1NldHRpbmcuYXJyVmFsdWVBZnRlclVwZGF0ZS5maWx0ZXIocCA9PiBwLnZpc2libGUpLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHRoaXMubG9nU2V0dGluZy5hcnJWYWx1ZUFmdGVyVXBkYXRlLmZpbHRlcihwID0+IHAudmlzaWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVTYXZlKCk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJTYXZlRmlsZVVwbG9hZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNGb3JtRWRpdCgpIHx8IHRoaXMuX2lzRm9ybVZpZXcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vblVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9pc0Zvcm1BZGROZXcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbkluc2VydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybSB2aWV3LCBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1hbnVhbFNhdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlTWFudWFsU2F2ZSgpIHtcblxuICAgIH1cblxuICAgIHRyaWdnZXJTYXZlRmlsZVVwbG9hZCgpIHtcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5TQVZFX0ZJTEVfSU5fRk9STSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2dldFJlc3VsdFZhbGlkYXRlKCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZUZvcm1CYXNlKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtKHJlc3VsdFZhbGlkYXRlQmFzZTogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRm9ybUJhc2UoKSB7XG4gICAgICAgIGxldCByZXN1bHRWYWxpZGF0ZUJhc2UgPSB0cnVlO1xuICAgICAgICAvLyBDw7MgdGjhu4MgY8OzIGZvcm0gayBjw7MgY3J1ZC1mb3JtIChWw6wgbMOgIGZvcm0gbWFzdGVyIGPhu6dhIGPDoWMgZm9ybSBjb24pXG4gICAgICAgIGlmICh0aGlzLmNydWRGb3JtKSB7XG4gICAgICAgICAgICByZXN1bHRWYWxpZGF0ZUJhc2UgPSBhd2FpdCB0aGlzLmNydWRGb3JtLnZhbGlkYXRlRm9ybSh0aGlzLnNldFZhbGlkYXRlRm9ybSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0VmFsaWRhdGUgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRm9ybShyZXN1bHRWYWxpZGF0ZUJhc2UpO1xuICAgICAgICAvLyBC4buPIGNoZWNrIHZhbGlkIGZvcm0gY8O0bmcgdmnhu4djLiBu4bq/dSBuaMawIGZvcm0gY8O0bmcgdmnhu4djIGtow7RuZyB2YWxpZCB0aMOsIGtow7RuZyB04buxIMSR4buZbmcgdOG6oW8gY8O0bmcgdmnhu4djXG4gICAgICAgIC8vIGlmICh0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdXG4gICAgICAgIC8vICAgICAmJiB0aGlzLmR5bmFtaWNDb250cm9sW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdLl9jb21wb25lbnRcbiAgICAgICAgLy8gKSB7XG4gICAgICAgIC8vICAgICBjb25zdCB0YXNrRm9ybSA9IHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF0uX2NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlc3VsdFZhbGlkYXRlRm9ybVRhc2sgPSBhd2FpdCB0YXNrRm9ybS5fZ2V0UmVzdWx0VmFsaWRhdGUoKTtcbiAgICAgICAgLy8gICAgIHJlc3VsdFZhbGlkYXRlID0gcmVzdWx0VmFsaWRhdGVGb3JtVGFzayAmJiByZXN1bHRWYWxpZGF0ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gcmVzdWx0VmFsaWRhdGUgJiYgcmVzdWx0VmFsaWRhdGVCYXNlO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUZvcm1Db250cm9sKGZpZWxkUGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcnVkRm9ybS52YWxpZGF0ZUZvcm1Db250cm9sKGZpZWxkUGF0aCk7XG4gICAgfVxuXG4gICAgX2NsZWFuRm9ybSgpIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5jbGVhbigpO1xuICAgIH1cblxuICAgIF90cmlnZ2VyQ29udHJvbENoYW5nZShmaWVsZFBhdGgpIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS50cmlnZ2VyQ2hhbmdlKGZpZWxkUGF0aCk7XG4gICAgfVxuXG4gICAgb25CZWZvcmVTYXZlKCk6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB9XG5cbiAgICBvbkFmdGVyU2F2ZShyZXNwb25zZTogUmVzcG9uc2VSZXN1bHQpOiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgfVxuXG5cbiAgICBhc3luYyBvbkFmdGVyR2V0RGV0YWlsKGRhdGE/OiBhbnlbXSkge1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkluc2VydCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWUodGhpcy5tb2RlbC5kYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF1cbiAgICAgICAgICAgICYmIHRoaXMuZHluYW1pY0NvbnRyb2xbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF0uX2NvbXBvbmVudFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHRhc2tGb3JtID0gdGhpcy5keW5hbWljQ29udHJvbFtGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sXS5fY29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0VmFsaWRhdGVGb3JtVGFzayA9IGF3YWl0IHRhc2tGb3JtLl9nZXRSZXN1bHRWYWxpZGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdFZhbGlkYXRlRm9ybVRhc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGEuaXRlbUNvbmdWaWVjID0gdGFza0Zvcm0ubW9kZWwuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhLmNyZWF0ZVRhc2tJbnN0ZWFkKSB7XG4gICAgICAgICAgICAvLyByZXNldCBmaWVsZCBfV29ya2Zsb3dDb2RlIMSR4buDIGJhY2tlbmQga2jDtG5nIGNo4bqheSBxdXkgdHLDrG5oIGLhuqNuIGdoaVxuICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhW0ZpZWxkV29ya2Zsb3dDb2RlSW5DcnVkRm9ybV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29uZmlybUlmUmVxdWlyZSgpO1xuICAgICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faW5zZXJ0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb25maXJtSWZSZXF1aXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlQ29uZmlybVNhdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0odGhpcy5tZXNzYWdlQ29uZmlybVNhdmUpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5zZXJ0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9taXNlQWN0aW9uSW5zZXJ0KClcbiAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlQWZ0ZXJJbnNlcnQocmVzcG9uc2Uuc3VjY2VzcywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5pZCA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25BZnRlclNhdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3N1cHByZXNzT25TYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNhdmVkLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLm1vZGVsLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VGb3JtOiB0aGlzLmlzQ2xvc2VGb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5zZXJ0RXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IuZXJyb3Iuc3VjY2VzcyAmJiBlcnJvci5lcnJvci5lcnJvckNoZWNrRXhpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZUFmdGVySW5zZXJ0KGZhbHNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UHJvbWlzZUFjdGlvbkluc2VydCgpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UucG9zdCh0aGlzLm1vZGVsLmRhdGEsIHRoaXMuaW5zZXJ0UGx1c1VybCk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW5zZXJ0RXJyb3IocmVzcG9uc2U/OiBhbnkpIHtcblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25VcGRhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKHRoaXMubW9kZWwuZGF0YSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVByb21pc2UgPSB0aGlzLmdldFByb21pc2VBY3Rpb25VcGRhdGUoKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2VBZnRlclVwZGF0ZShyZXNwb25zZS5zdWNjZXNzLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyU2F2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc3VwcHJlc3NPblNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2F2ZWQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWwuZGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VGb3JtOiB0aGlzLmlzQ2xvc2VGb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVXBkYXRlRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IuZXJyb3Iuc3VjY2VzcyAmJiBlcnJvci5lcnJvci5lcnJvckNoZWNrRXhpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZUFmdGVyVXBkYXRlKGZhbHNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubG9nU2V0dGluZy5pc0VuYWJsZUxvZykge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXR0aW5nLmFyclZhbHVlQWZ0ZXJVcGRhdGUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXBkYXRlUHJvbWlzZTtcbiAgICB9XG5cbiAgICBoYW5kbGVVcGRhdGVFcnJvcihyZXNwb25zZT86IGFueSkge1xuXG4gICAgfVxuXG4gICAgZ2V0UHJvbWlzZUFjdGlvblVwZGF0ZSgpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UucHV0KHRoaXMubW9kZWwuZGF0YS5pZC50b1N0cmluZygpLCB0aGlzLm1vZGVsLmRhdGEsIHRoaXMudXBkYXRlUGx1c1VybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREZWZhdWx0VmFsdWUobW9kZWwpIHtcbiAgICAgICAgaWYgKG1vZGVsLmlzQnVpbGRJbiA9PT0gbnVsbCB8fCBtb2RlbC5pc0J1aWxkSW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbW9kZWwuaXNCdWlsZEluID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZWwuaXNCdWlsZEluQWxsID09PSBudWxsIHx8IG1vZGVsLmlzQnVpbGRJbkFsbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtb2RlbC5pc0J1aWxkSW5BbGwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nPy5lbmFibGVSZW9yZGVyUm93ICYmIHRoaXMucGFyZW50U2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhW3RoaXMucGFyZW50U2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZF0gPz89IHRoaXMucGFyZW50TW9kZWwudG90YWwgKyAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd01lc3NhZ2VBZnRlckluc2VydChpc1N1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZSwgZXJyb3I/OiBhbnkpIHtcbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VJbnNlcnRTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2VzcyA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnTUVTU0FHRS5JTlNFUlRfREFUQV9TVUNDRVNTJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlSW5zZXJ0U3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLm1lc3NhZ2VJbnNlcnRTdWNjZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93TWVzc2FnZUFmdGVyVXBkYXRlKGlzU3VjY2VzczogYm9vbGVhbiA9IGZhbHNlLCBlcnJvcj86IGFueSkge1xuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VVcGRhdGVTdWNjZXNzID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdNRVNTQUdFLlVQREFURV9EQVRBX1NVQ0NFU1MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VVcGRhdGVTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMubWVzc2FnZVVwZGF0ZVN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlcnJvci5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGVycm9yLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ8OzIGzhu5dpIHjhuqN5IHJhLCBsacOqbiBo4buHIHF14bqjbiB0cuG7iyB2acOqbiDEkeG7gyBiaeG6v3QgdGjDqm0gY2hpIHRp4bq/dCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25Gb3JtSW5pdGlhbGl6ZWQoZGF0YTogRXZlbnREYXRhKSB7XG5cbiAgICB9XG5cbiAgICBfaGFuZGxlQWZ0ZXJUcmluaEt5KGV2dCkge1xuICAgICAgICBkZWxldGUgdGhpcy5tb2RlbC5kYXRhW0tleUZsYXNoU2hvd107XG4gICAgICAgIHRoaXMuX2hhbmRsZUNhbmNlbChldnQpO1xuICAgIH1cblxuICAgIF9oYW5kbGVTYXZlKGV2dCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5zdWJtaXR0aW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMubW9kZWwuc3VibWl0dGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICB0aGlzLm9uU2F2ZS5lbWl0KGV2dCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZUNhbmNlbChldnQpIHtcbiAgICAgICAgdGhpcy5vbkNhbmNlbC5lbWl0KGV2dCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZU1lc3NhZ2UoZXZ0KSB7XG4gICAgICAgIHRoaXMub25NZXNzYWdlLmVtaXQoZXZ0KTtcbiAgICB9XG5cbiAgICBfc2V0RGlzYWJsZUNvbnRyb2wodW5pcXVlRmllbGQsIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbdW5pcXVlRmllbGRdLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBfc2V0SGlkZGVuQ29udHJvbCh1bmlxdWVGaWVsZCwgaXNIaWRkZW4pIHtcbiAgICAgICAgdGhpcy5jcnVkRm9ybS5mb3JtQ29udHJvbHNbdW5pcXVlRmllbGRdLmhpZGRlbiA9IGlzSGlkZGVuO1xuICAgIH1cblxuICAgIF9nZXRGb3JtU3RhdGUoKTogRm9ybVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZm9ybVN0YXRlO1xuICAgIH1cblxuICAgIF9pc0Zvcm1BZGROZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtU3RhdGUoKSA9PSBGb3JtU3RhdGUuQUREO1xuICAgIH1cblxuICAgIF9pc0Zvcm1FZGl0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Rm9ybVN0YXRlKCkgPT0gRm9ybVN0YXRlLkVESVQ7XG4gICAgfVxuXG4gICAgX2lzRm9ybVZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtU3RhdGUoKSA9PSBGb3JtU3RhdGUuVklFVztcbiAgICB9XG59XG4iXX0=
|