ngx-bimplus-components 0.0.159-29471-1 → 0.0.160
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/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.mjs +5 -40
- package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.mjs +2 -5
- package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.mjs +5 -5
- package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.mjs +7 -115
- package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +1 -1
- package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.mjs +1 -1
- package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.mjs +32 -12
- package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.mjs +3 -3
- package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.mjs +1 -1
- package/esm2022/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.mjs +7 -3
- package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.component.mjs +4 -42
- package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.interface.mjs +2 -4
- package/esm2022/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.mjs +8 -31
- package/esm2022/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.mjs +8 -34
- package/esm2022/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.mjs +1 -1
- package/esm2022/lib/components/object-properties-header/object-properties-header.component.mjs +6 -48
- package/esm2022/lib/components/object-properties-header/object-properties-header.interface.mjs +1 -1
- package/esm2022/lib/components/resizable-panel/resizable-panel.component.mjs +10 -54
- package/esm2022/public-api.mjs +1 -22
- package/fesm2022/ngx-bimplus-components.mjs +112 -4329
- package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
- package/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.d.ts +3 -14
- package/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.d.ts +1 -7
- package/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.d.ts +3 -16
- package/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.d.ts +0 -4
- package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +1 -1
- package/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.d.ts +3 -3
- package/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.d.ts +7 -5
- package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.d.ts +12 -12
- package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.d.ts +3 -3
- package/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.d.ts +1 -0
- package/lib/components/bimplus-object-structure/bimplus-object-structure.component.d.ts +1 -5
- package/lib/components/bimplus-object-structure/bimplus-object-structure.interface.d.ts +0 -2
- package/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.d.ts +1 -8
- package/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.d.ts +1 -11
- package/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.d.ts +1 -1
- package/lib/components/object-properties-header/object-properties-header.component.d.ts +4 -13
- package/lib/components/object-properties-header/object-properties-header.interface.d.ts +0 -8
- package/lib/components/resizable-panel/resizable-panel.component.d.ts +3 -12
- package/package.json +4 -12
- package/public-api.d.ts +0 -21
- package/assets/images/default/Attachment_18_gray.svg +0 -1
- package/assets/images/default/Attachment_18_maincolor.svg +0 -3
- package/assets/images/default/Attachmentlink_18_gray.svg +0 -7
- package/assets/images/default/Attachmentlink_18_maincolor.svg +0 -7
- package/assets/images/default/Comments_18_gray.svg +0 -1
- package/assets/images/default/Comments_18_maincolor.svg +0 -4
- package/assets/images/default/Links_18_gray.svg +0 -1
- package/assets/images/default/Links_18_maincolor.svg +0 -4
- package/assets/images/default/Refresh_18_gray.svg +0 -1
- package/assets/images/default/bimplus_WebIcons_Cross_Disabled.svg +0 -1
- package/assets/images/default/ic_models.svg +0 -3
- package/assets/images/default/ic_models_maincolor.svg +0 -3
- package/assets/images/default/icn_grid_attachments.png +0 -0
- package/assets/images/default/icn_grid_hyperlinks.png +0 -0
- package/assets/images/default/progress-spinner.svg +0 -1
- package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.component.mjs +0 -114
- package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.interface.mjs +0 -38
- package/esm2022/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.mjs +0 -95
- package/esm2022/lib/components/bimplus-attachments/services/bimplus-attachments.service.mjs +0 -32
- package/esm2022/lib/components/bimplus-comment/IComment.mjs +0 -2
- package/esm2022/lib/components/bimplus-comment/bimplus-comment.component.mjs +0 -118
- package/esm2022/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.mjs +0 -64
- package/esm2022/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.mjs +0 -161
- package/esm2022/lib/components/bimplus-input-number/bimplus-input-number.component.mjs +0 -85
- package/esm2022/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.mjs +0 -92
- package/esm2022/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.mjs +0 -78
- package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.mjs +0 -385
- package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.mjs +0 -3
- package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.mjs +0 -104
- package/esm2022/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.mjs +0 -2
- package/esm2022/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.mjs +0 -77
- package/esm2022/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.mjs +0 -83
- package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.component.mjs +0 -35
- package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.service.mjs +0 -35
- package/esm2022/lib/components/bimplus-status-bar/statusBar.mjs +0 -2
- package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.mjs +0 -38
- package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.mjs +0 -10
- package/esm2022/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.mjs +0 -89
- package/esm2022/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.mjs +0 -33
- package/esm2022/lib/components/bimplus-textarea/autoResizeTextarea.directive.mjs +0 -83
- package/esm2022/lib/components/bimplus-textarea/bimplus-textarea.component.mjs +0 -128
- package/esm2022/lib/components/links-to-documents/links-to-documents.component.mjs +0 -373
- package/esm2022/lib/components/object-hyperlinks/object-hyperlinks.component.mjs +0 -145
- package/esm2022/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.mjs +0 -36
- package/esm2022/lib/components/object-preview/object-preview.component.mjs +0 -284
- package/esm2022/lib/components/object-preview/object-preview.interface.mjs +0 -2
- package/esm2022/lib/components/object-properties/object-properties.component.mjs +0 -536
- package/esm2022/lib/components/object-properties/object-properties.interface.mjs +0 -2
- package/esm2022/lib/components/object-properties/object-properties.service.mjs +0 -26
- package/esm2022/lib/components/object-properties-group/object-properties-group.component.mjs +0 -124
- package/esm2022/lib/components/object-properties-group/object-property-value/object-property-value.component.mjs +0 -55
- package/esm2022/lib/pipes/bit-converter.pipe.mjs +0 -46
- package/esm2022/lib/pipes/get-attribute-value-as-string.pipe.mjs +0 -173
- package/esm2022/lib/pipes/get-attribute-value.pipe.mjs +0 -162
- package/esm2022/lib/pipes/round.pipe.mjs +0 -20
- package/esm2022/lib/services/decorators.service.mjs +0 -65
- package/esm2022/lib/utils/objectProperties.mjs +0 -9
- package/esm2022/lib/validators/double-enum.validator.mjs +0 -17
- package/esm2022/lib/validators/double.validator.mjs +0 -23
- package/esm2022/lib/validators/guid-enum.validator.mjs +0 -17
- package/esm2022/lib/validators/guid.validator.mjs +0 -11
- package/esm2022/lib/validators/integer.validator.mjs +0 -20
- package/esm2022/lib/validators/string-combobox.validator.mjs +0 -17
- package/esm2022/lib/validators/string-enum.validator.mjs +0 -17
- package/lib/components/bimplus-attachments/bimplus-attachments.component.d.ts +0 -39
- package/lib/components/bimplus-attachments/bimplus-attachments.interface.d.ts +0 -33
- package/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.d.ts +0 -30
- package/lib/components/bimplus-attachments/services/bimplus-attachments.service.d.ts +0 -8
- package/lib/components/bimplus-comment/IComment.d.ts +0 -4
- package/lib/components/bimplus-comment/bimplus-comment.component.d.ts +0 -39
- package/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.d.ts +0 -18
- package/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.d.ts +0 -41
- package/lib/components/bimplus-input-number/bimplus-input-number.component.d.ts +0 -26
- package/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.d.ts +0 -28
- package/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.d.ts +0 -22
- package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.d.ts +0 -87
- package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.d.ts +0 -10
- package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.d.ts +0 -20
- package/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.d.ts +0 -11
- package/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.d.ts +0 -29
- package/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.d.ts +0 -24
- package/lib/components/bimplus-status-bar/bimplus-status-bar.component.d.ts +0 -14
- package/lib/components/bimplus-status-bar/bimplus-status-bar.service.d.ts +0 -14
- package/lib/components/bimplus-status-bar/statusBar.d.ts +0 -4
- package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.d.ts +0 -16
- package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.d.ts +0 -18
- package/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.d.ts +0 -36
- package/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.d.ts +0 -15
- package/lib/components/bimplus-textarea/autoResizeTextarea.directive.d.ts +0 -24
- package/lib/components/bimplus-textarea/bimplus-textarea.component.d.ts +0 -42
- package/lib/components/links-to-documents/links-to-documents.component.d.ts +0 -68
- package/lib/components/object-hyperlinks/object-hyperlinks.component.d.ts +0 -32
- package/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.d.ts +0 -15
- package/lib/components/object-preview/object-preview.component.d.ts +0 -45
- package/lib/components/object-preview/object-preview.interface.d.ts +0 -5
- package/lib/components/object-properties/object-properties.component.d.ts +0 -78
- package/lib/components/object-properties/object-properties.interface.d.ts +0 -22
- package/lib/components/object-properties/object-properties.service.d.ts +0 -12
- package/lib/components/object-properties-group/object-properties-group.component.d.ts +0 -29
- package/lib/components/object-properties-group/object-property-value/object-property-value.component.d.ts +0 -14
- package/lib/pipes/bit-converter.pipe.d.ts +0 -17
- package/lib/pipes/get-attribute-value-as-string.pipe.d.ts +0 -35
- package/lib/pipes/get-attribute-value.pipe.d.ts +0 -35
- package/lib/pipes/round.pipe.d.ts +0 -7
- package/lib/services/decorators.service.d.ts +0 -12
- package/lib/utils/objectProperties.d.ts +0 -2
- package/lib/validators/double-enum.validator.d.ts +0 -2
- package/lib/validators/double.validator.d.ts +0 -2
- package/lib/validators/guid-enum.validator.d.ts +0 -2
- package/lib/validators/guid.validator.d.ts +0 -2
- package/lib/validators/integer.validator.d.ts +0 -2
- package/lib/validators/string-combobox.validator.d.ts +0 -2
- package/lib/validators/string-enum.validator.d.ts +0 -2
|
@@ -1,536 +0,0 @@
|
|
|
1
|
-
import { Component, ViewEncapsulation, Input, signal, EventEmitter, Output } from '@angular/core';
|
|
2
|
-
import { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';
|
|
3
|
-
import { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';
|
|
4
|
-
import { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';
|
|
5
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
6
|
-
import { ObjectStructureNodeBuilder, } from '../bimplus-object-structure/bimplus-object-structure.interface';
|
|
7
|
-
import { from, BehaviorSubject } from 'rxjs';
|
|
8
|
-
import { BimplusObjectStructureComponent } from '../bimplus-object-structure/bimplus-object-structure.component';
|
|
9
|
-
import { ComplexPropertiesNodeBuilder, } from '../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';
|
|
10
|
-
import { BimplusObjectComplexPropertiesComponent } from '../bimplus-object-complex-properties/bimplus-object-complex-properties.component';
|
|
11
|
-
import { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';
|
|
12
|
-
import { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';
|
|
13
|
-
import { ObjectPropertiesGroupComponent } from '../object-properties-group/object-properties-group.component';
|
|
14
|
-
import { isObjectPropertyValueBlank } from '../../utils/objectProperties';
|
|
15
|
-
import { FormGroup, ReactiveFormsModule, FormControl, Validators } from '@angular/forms';
|
|
16
|
-
import { GetAttributeValue } from '../../pipes/get-attribute-value.pipe';
|
|
17
|
-
import { doubleValidator } from '../../validators/double.validator';
|
|
18
|
-
import { integerValidator } from '../../validators/integer.validator';
|
|
19
|
-
import { guidValidator } from '../../validators/guid.validator';
|
|
20
|
-
import { doubleEnumValidator } from '../../validators/double-enum.validator';
|
|
21
|
-
import { ObjectPreviewComponent } from "../object-preview/object-preview.component";
|
|
22
|
-
import { guidEnumValidator } from '../../validators/guid-enum.validator';
|
|
23
|
-
import { stringEnumValidator } from '../../validators/string-enum.validator';
|
|
24
|
-
import { stringComboboxValidator } from '../../validators/string-combobox.validator';
|
|
25
|
-
import * as i0 from "@angular/core";
|
|
26
|
-
import * as i1 from "@ngx-translate/core";
|
|
27
|
-
import * as i2 from "@angular/forms";
|
|
28
|
-
import * as i3 from "./object-properties.service";
|
|
29
|
-
export class ObjectPropertiesComponent extends BimplusLocalizedWidgetComponent {
|
|
30
|
-
_objectPropertiesGroupForm(group_name) {
|
|
31
|
-
const _groupForm = this._objectPropertiesForm;
|
|
32
|
-
return _groupForm.controls[group_name];
|
|
33
|
-
}
|
|
34
|
-
constructor(translateService, formBuilder, cdr, objectPropertiesService) {
|
|
35
|
-
super(translateService);
|
|
36
|
-
this.formBuilder = formBuilder;
|
|
37
|
-
this.cdr = cdr;
|
|
38
|
-
this.objectPropertiesService = objectPropertiesService;
|
|
39
|
-
this._objectPropertiesForm = new FormGroup({});
|
|
40
|
-
this._editMode = signal(false);
|
|
41
|
-
this._objectStructure = null;
|
|
42
|
-
this._complexProperties = null;
|
|
43
|
-
this.api = null;
|
|
44
|
-
this.revision = undefined;
|
|
45
|
-
this._canUpdateObject = signal(false);
|
|
46
|
-
this._rootObjectId = "";
|
|
47
|
-
this.isSaveButtonDisabled$ = new BehaviorSubject(true);
|
|
48
|
-
this.visibleNodeSignal = signal({ id: "", visible: false, opaque: false });
|
|
49
|
-
this.opaqueNodeSignal = signal({ id: "", visible: false, opaque: false });
|
|
50
|
-
this._currentObjectId$ = new BehaviorSubject("");
|
|
51
|
-
this._currentPropertiesObjectId$ = new BehaviorSubject("");
|
|
52
|
-
this.buttonRowItems = [];
|
|
53
|
-
this.configEditProperties = [];
|
|
54
|
-
this.configEditedProperties = [];
|
|
55
|
-
this.updatedObjectProperties = new EventEmitter();
|
|
56
|
-
this.objectAttributeGroups = signal([]);
|
|
57
|
-
this.initialFormValues = "";
|
|
58
|
-
}
|
|
59
|
-
get objectStructure() {
|
|
60
|
-
return this._objectStructure;
|
|
61
|
-
}
|
|
62
|
-
get complexProperties() {
|
|
63
|
-
return this._complexProperties;
|
|
64
|
-
}
|
|
65
|
-
set canUpdateObject(canUpdateObject) {
|
|
66
|
-
this._canUpdateObject.set(canUpdateObject);
|
|
67
|
-
}
|
|
68
|
-
set rootObjectId(id) {
|
|
69
|
-
this._currentObjectId$.next(id);
|
|
70
|
-
this._createObjectStructure(id, this.revision);
|
|
71
|
-
this._rootObjectId = id;
|
|
72
|
-
}
|
|
73
|
-
get rootObjectId() {
|
|
74
|
-
return this._rootObjectId;
|
|
75
|
-
}
|
|
76
|
-
_editPropertiesButtonsConfiguration() {
|
|
77
|
-
this.configEditProperties.push({
|
|
78
|
-
id: 'edit-properties',
|
|
79
|
-
title: this.translateService.instant('_Edit_properties'),
|
|
80
|
-
tooltip: this.translateService.instant('_Edit_properties'),
|
|
81
|
-
disabled: !this._canUpdateObject(),
|
|
82
|
-
buttonStyle: 'primary',
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
_editedPropertiesButtonsConfiguration() {
|
|
86
|
-
this.configEditedProperties.push({
|
|
87
|
-
id: 'save-changed-properties',
|
|
88
|
-
title: this.translateService.instant('_Save'),
|
|
89
|
-
tooltip: this.translateService.instant('_Save'),
|
|
90
|
-
disabled: this.isSaveButtonDisabled$,
|
|
91
|
-
buttonStyle: 'primary',
|
|
92
|
-
});
|
|
93
|
-
this.configEditedProperties.push({
|
|
94
|
-
id: 'cancel-editing-properties',
|
|
95
|
-
title: this.translateService.instant('_Cancel'),
|
|
96
|
-
tooltip: this.translateService.instant('_Cancel'),
|
|
97
|
-
disabled: false,
|
|
98
|
-
buttonStyle: 'secondary',
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
ngOnInit() {
|
|
102
|
-
this._editPropertiesButtonsConfiguration();
|
|
103
|
-
this._editedPropertiesButtonsConfiguration();
|
|
104
|
-
this.buttonRowItems = this.configEditProperties;
|
|
105
|
-
this.subscribeProperties();
|
|
106
|
-
}
|
|
107
|
-
subscribeProperties() {
|
|
108
|
-
this._currentPropertiesObjectId$.subscribe({
|
|
109
|
-
next: (id) => {
|
|
110
|
-
if (id) {
|
|
111
|
-
this._createObjectProperties(id, this.revision);
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
this._currentObjectId$.subscribe({
|
|
116
|
-
next: (id) => {
|
|
117
|
-
this._currentPropertiesObjectId$.next(id);
|
|
118
|
-
this._createComplexPropertiestructure(id, this.revision);
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
handleObjectStructureNodeSelected(node) {
|
|
123
|
-
console.log(node);
|
|
124
|
-
this._currentObjectId$.next(node.id);
|
|
125
|
-
}
|
|
126
|
-
handleObjectStructureNodeVisible(node) {
|
|
127
|
-
const objNode = {
|
|
128
|
-
id: node.id,
|
|
129
|
-
visible: node.visible,
|
|
130
|
-
opaque: node.opaque
|
|
131
|
-
};
|
|
132
|
-
this.visibleNodeSignal.set(objNode); // Update the signal
|
|
133
|
-
}
|
|
134
|
-
handleObjectStructureNodeOpaque(node) {
|
|
135
|
-
const objNode = {
|
|
136
|
-
id: node.id,
|
|
137
|
-
visible: node.visible,
|
|
138
|
-
opaque: node.opaque
|
|
139
|
-
};
|
|
140
|
-
this.opaqueNodeSignal.set(objNode); // Update the signal
|
|
141
|
-
}
|
|
142
|
-
handleComplexPropertyNodeSelected(node) {
|
|
143
|
-
console.log(node);
|
|
144
|
-
this._currentPropertiesObjectId$.next(node.id);
|
|
145
|
-
}
|
|
146
|
-
_loadObjectStructure(objectId, revision) {
|
|
147
|
-
if (!this.api) {
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
if (!objectId) {
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
return from(this.api.objects.getTopology(objectId, revision, false, false, undefined));
|
|
154
|
-
}
|
|
155
|
-
_createObjectStructure(objectId, revision) {
|
|
156
|
-
this._loadObjectStructure(objectId, revision)?.subscribe({
|
|
157
|
-
next: (structureData) => {
|
|
158
|
-
if (structureData) {
|
|
159
|
-
this._objectStructure =
|
|
160
|
-
ObjectStructureNodeBuilder.createFromResponse(structureData);
|
|
161
|
-
}
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
_loadObjectComplexPropertiesStructure(objectId, revision) {
|
|
166
|
-
if (!this.api) {
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
if (!objectId) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
return from(this.api.objects.getComplexPropertiesTopology(objectId, revision));
|
|
173
|
-
}
|
|
174
|
-
_createComplexPropertiestructure(objectId, revision) {
|
|
175
|
-
this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({
|
|
176
|
-
next: (structureData) => {
|
|
177
|
-
if (structureData) {
|
|
178
|
-
const complexProps = ComplexPropertiesNodeBuilder.createFromResponse(structureData);
|
|
179
|
-
if (complexProps?.children?.length) {
|
|
180
|
-
this._complexProperties = complexProps;
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
this._complexProperties = null;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
},
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
_loadObjectProperties(objectId, revision) {
|
|
190
|
-
if (!this.api) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
if (!objectId) {
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
return from(this.api.objects.get(objectId, revision, '8', undefined, false, undefined));
|
|
197
|
-
}
|
|
198
|
-
_createObjectProperties(objectId, revision) {
|
|
199
|
-
this._loadObjectProperties(objectId, revision)?.subscribe({
|
|
200
|
-
// properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut
|
|
201
|
-
// any for json response
|
|
202
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
203
|
-
next: (propertiesData) => {
|
|
204
|
-
this.objectPropertiesService.setModel(propertiesData);
|
|
205
|
-
this.objectAttributeGroups.set(this._createAttributeGroupsFromResponse(propertiesData));
|
|
206
|
-
},
|
|
207
|
-
error: () => {
|
|
208
|
-
this.objectAttributeGroups.set([]);
|
|
209
|
-
},
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
213
|
-
_tooltip(attrib) {
|
|
214
|
-
const nameTitle = this.translateService.instant('_Name');
|
|
215
|
-
const name = attrib.name ? attrib.name : '';
|
|
216
|
-
const descriptionTitle = this.translateService.instant('description');
|
|
217
|
-
const description = attrib.description;
|
|
218
|
-
const uuidTitle = this.translateService.instant('_UUID');
|
|
219
|
-
const uuid = attrib.id;
|
|
220
|
-
if (description === null ||
|
|
221
|
-
description === undefined ||
|
|
222
|
-
description === '') {
|
|
223
|
-
return `${nameTitle}: ${name}\n${uuidTitle}: ${uuid}`;
|
|
224
|
-
}
|
|
225
|
-
return `${nameTitle}: ${name}\n${descriptionTitle}: ${description}\n${uuidTitle}: ${uuid}`;
|
|
226
|
-
}
|
|
227
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
228
|
-
_createAttributeGroupsFromResponse(propertiesData) {
|
|
229
|
-
const groups = [];
|
|
230
|
-
let localizedAttribGroups = null;
|
|
231
|
-
if (propertiesData.localizedAttributeGroups) {
|
|
232
|
-
localizedAttribGroups = propertiesData.localizedAttributeGroups;
|
|
233
|
-
}
|
|
234
|
-
if (!propertiesData.attributes) {
|
|
235
|
-
return groups;
|
|
236
|
-
}
|
|
237
|
-
const attribGroups = propertiesData.attributes;
|
|
238
|
-
for (const [groupName, attribsObject] of Object.entries(attribGroups)) {
|
|
239
|
-
const newGroup = {
|
|
240
|
-
name: groupName,
|
|
241
|
-
expanded: false,
|
|
242
|
-
attributes: [],
|
|
243
|
-
};
|
|
244
|
-
if (localizedAttribGroups?.[groupName]) {
|
|
245
|
-
newGroup.name = localizedAttribGroups[groupName];
|
|
246
|
-
}
|
|
247
|
-
if (!attribsObject) {
|
|
248
|
-
continue;
|
|
249
|
-
}
|
|
250
|
-
for (const attrib of Object.values(attribsObject)) {
|
|
251
|
-
const newAttrib = {
|
|
252
|
-
id: attrib.id,
|
|
253
|
-
name: attrib.name,
|
|
254
|
-
description: attrib.description,
|
|
255
|
-
value: attrib.value,
|
|
256
|
-
group: attrib.group,
|
|
257
|
-
type: attrib.type,
|
|
258
|
-
unit: attrib.unit,
|
|
259
|
-
decimal: attrib.decimal,
|
|
260
|
-
control: attrib.control,
|
|
261
|
-
enumdefinition: attrib.enumdefinition,
|
|
262
|
-
isChangeable: attrib.isChangeable,
|
|
263
|
-
tooltip: this._tooltip(attrib),
|
|
264
|
-
minValue: attrib.minValue,
|
|
265
|
-
maxValue: attrib.maxValue,
|
|
266
|
-
};
|
|
267
|
-
newGroup.attributes.push(newAttrib);
|
|
268
|
-
}
|
|
269
|
-
groups.push(newGroup);
|
|
270
|
-
}
|
|
271
|
-
return groups;
|
|
272
|
-
}
|
|
273
|
-
_deleteForm() {
|
|
274
|
-
this._objectPropertiesForm = new FormGroup({});
|
|
275
|
-
}
|
|
276
|
-
_createForm() {
|
|
277
|
-
const _getAttributeValue = new GetAttributeValue();
|
|
278
|
-
const _form = {};
|
|
279
|
-
this.objectAttributeGroups().forEach(groupAttributes => {
|
|
280
|
-
const _form_group = {};
|
|
281
|
-
groupAttributes.attributes.forEach(attribute => {
|
|
282
|
-
if ((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type)) && !attribute.control) {
|
|
283
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [Validators.pattern(/^(false|true|0|1)$/i)] : []);
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
if ((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type))
|
|
287
|
-
&& (typeof attribute.control === 'string' && /^checkbox$/i.test(attribute.control))) {
|
|
288
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute));
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
if ((typeof attribute.type === 'string' && /^string$/i.test(attribute.type)) && !attribute.control) {
|
|
292
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute));
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
if ((typeof attribute.type === 'string' && /^double$/i.test(attribute.type)) && !attribute.control) {
|
|
296
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [doubleValidator(attribute.minValue, attribute.maxValue)] : []);
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
if ((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type)) && !attribute.control) {
|
|
300
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [integerValidator(attribute.minValue, attribute.maxValue)] : []);
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
if ((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type)) && !attribute.control) {
|
|
304
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [guidValidator()] : []);
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
if ((typeof attribute.type === 'string' && /^double$/i.test(attribute.type))
|
|
308
|
-
&& (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
|
|
309
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []);
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
if ((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type))
|
|
313
|
-
&& (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
|
|
314
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [guidEnumValidator(attribute.enumdefinition)] : []);
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
if ((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type))
|
|
318
|
-
&& (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
|
|
319
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []);
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
if ((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))
|
|
323
|
-
&& (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
|
|
324
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [stringEnumValidator(attribute.enumdefinition)] : []);
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
if ((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))
|
|
328
|
-
&& (typeof attribute.control === 'string' && /^combobox$/i.test(attribute.control))) {
|
|
329
|
-
_form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [stringComboboxValidator(attribute.enumdefinition)] : []);
|
|
330
|
-
return;
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
_form[groupAttributes.name] = this.formBuilder.group(_form_group);
|
|
334
|
-
});
|
|
335
|
-
this._objectPropertiesForm = this.formBuilder.group(_form);
|
|
336
|
-
this.initialFormValues = JSON.stringify(this._objectPropertiesForm.value);
|
|
337
|
-
this._objectPropertiesForm.valueChanges.subscribe({
|
|
338
|
-
next: (value) => {
|
|
339
|
-
const changed = JSON.stringify(value) !== this.initialFormValues;
|
|
340
|
-
this.isSaveButtonDisabled$.next(!(this._objectPropertiesForm.valid && changed));
|
|
341
|
-
}
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
_getPropertyName(uuid) {
|
|
345
|
-
const attrGroups = this.objectAttributeGroups();
|
|
346
|
-
for (const attrGroup of attrGroups) {
|
|
347
|
-
for (const attr of attrGroup.attributes) {
|
|
348
|
-
if (attr.id === uuid) {
|
|
349
|
-
return attr.name;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
return '';
|
|
354
|
-
}
|
|
355
|
-
_getPropertyType(uuid) {
|
|
356
|
-
const attrGroups = this.objectAttributeGroups();
|
|
357
|
-
for (const attrGroup of attrGroups) {
|
|
358
|
-
for (const attr of attrGroup.attributes) {
|
|
359
|
-
if (attr.id === uuid) {
|
|
360
|
-
return attr.type;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
return '';
|
|
365
|
-
}
|
|
366
|
-
_getPropertyControl(uuid) {
|
|
367
|
-
const attrGroups = this.objectAttributeGroups();
|
|
368
|
-
for (const attrGroup of attrGroups) {
|
|
369
|
-
for (const attr of attrGroup.attributes) {
|
|
370
|
-
if (attr.id === uuid) {
|
|
371
|
-
return attr.control;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
return '';
|
|
376
|
-
}
|
|
377
|
-
_convertValueToBoolean(value) {
|
|
378
|
-
return /^true$/i.test(value) || /^1$/i.test(value);
|
|
379
|
-
}
|
|
380
|
-
_convertValueToDouble(value) {
|
|
381
|
-
return parseFloat(value);
|
|
382
|
-
}
|
|
383
|
-
_hasBeenValueChanged(uuid, value) {
|
|
384
|
-
const attrGroups = this.objectAttributeGroups();
|
|
385
|
-
for (const attrGroup of attrGroups) {
|
|
386
|
-
for (const attr of attrGroup.attributes) {
|
|
387
|
-
if (attr.id === uuid) {
|
|
388
|
-
return value !== attr.value;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
return false;
|
|
393
|
-
}
|
|
394
|
-
_getChangedData(formGroup) {
|
|
395
|
-
const changedData = {};
|
|
396
|
-
Object.keys(formGroup.controls).forEach(key => {
|
|
397
|
-
const control = formGroup.get(key);
|
|
398
|
-
if (control instanceof FormControl) {
|
|
399
|
-
// If it's a FormControl and it's dirty, capture the changed value
|
|
400
|
-
if (control.dirty) {
|
|
401
|
-
const propName = this._getPropertyName(key);
|
|
402
|
-
const propType = this._getPropertyType(key);
|
|
403
|
-
// const propControl: string = this._getPropertyControl(key);
|
|
404
|
-
if (propName === '') {
|
|
405
|
-
const _newValue = {
|
|
406
|
-
id: key,
|
|
407
|
-
value: control.value
|
|
408
|
-
};
|
|
409
|
-
changedData[key] = _newValue;
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
if (/^boolean$/i.test(propType)) {
|
|
413
|
-
const _val = this._convertValueToBoolean(control.value);
|
|
414
|
-
if (this._hasBeenValueChanged(key, _val)) {
|
|
415
|
-
const _newValue = {
|
|
416
|
-
id: key,
|
|
417
|
-
value: _val
|
|
418
|
-
};
|
|
419
|
-
changedData[propName] = _newValue;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
else if (/^double$/i.test(propType)) {
|
|
423
|
-
const _val = this._convertValueToDouble(control.value);
|
|
424
|
-
if (this._hasBeenValueChanged(key, _val)) {
|
|
425
|
-
const _newValue = {
|
|
426
|
-
id: key,
|
|
427
|
-
value: _val
|
|
428
|
-
};
|
|
429
|
-
changedData[propName] = _newValue;
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
else {
|
|
433
|
-
const _val = control.value;
|
|
434
|
-
if (this._hasBeenValueChanged(key, control.value)) {
|
|
435
|
-
const _newValue = {
|
|
436
|
-
id: key,
|
|
437
|
-
value: _val
|
|
438
|
-
};
|
|
439
|
-
changedData[propName] = _newValue;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
else if (control instanceof FormGroup) {
|
|
446
|
-
if (control.dirty) {
|
|
447
|
-
// Recursively get changed data from nested FormGroup
|
|
448
|
-
const nestedChanges = this._getChangedData(control);
|
|
449
|
-
if (Object.keys(nestedChanges).length > 0) {
|
|
450
|
-
changedData[key] = nestedChanges;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
});
|
|
455
|
-
return changedData;
|
|
456
|
-
}
|
|
457
|
-
_saveObjectProperties() {
|
|
458
|
-
const saveData = {};
|
|
459
|
-
saveData['id'] = this._currentObjectId$.value;
|
|
460
|
-
saveData['unsaved'] = true;
|
|
461
|
-
saveData['attributes'] = this._getChangedData(this._objectPropertiesForm);
|
|
462
|
-
this.saveObjectProperties(saveData);
|
|
463
|
-
}
|
|
464
|
-
buttonClicked($event) {
|
|
465
|
-
if ($event.id === 'edit-properties') {
|
|
466
|
-
this._editMode.set(true);
|
|
467
|
-
this._createForm();
|
|
468
|
-
console.log('Edit properties clicked');
|
|
469
|
-
this.buttonRowItems = this.configEditedProperties;
|
|
470
|
-
}
|
|
471
|
-
if ($event.id === 'save-changed-properties') {
|
|
472
|
-
this._saveObjectProperties();
|
|
473
|
-
this._editMode.set(false);
|
|
474
|
-
this._deleteForm();
|
|
475
|
-
this.buttonRowItems = this.configEditProperties;
|
|
476
|
-
console.log('Save changed properties clicked');
|
|
477
|
-
}
|
|
478
|
-
if ($event.id === 'cancel-editing-properties') {
|
|
479
|
-
this._editMode.set(false);
|
|
480
|
-
this._deleteForm();
|
|
481
|
-
this.buttonRowItems = this.configEditProperties;
|
|
482
|
-
console.log('Cancel edit properties clicked');
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
hasSetAnyAttribute(objectAttributeGroup) {
|
|
486
|
-
return objectAttributeGroup.attributes.some((attrib) => {
|
|
487
|
-
return !isObjectPropertyValueBlank(attrib);
|
|
488
|
-
});
|
|
489
|
-
}
|
|
490
|
-
saveObjectProperties(data) {
|
|
491
|
-
const selectedObjectId = this._currentPropertiesObjectId$.value;
|
|
492
|
-
if (!data || !selectedObjectId) {
|
|
493
|
-
return;
|
|
494
|
-
}
|
|
495
|
-
if (!this.api) {
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
from(this.api.objects.put(selectedObjectId, JSON.stringify(data))).subscribe({
|
|
499
|
-
next: (response) => {
|
|
500
|
-
this._createObjectProperties(selectedObjectId, this.revision);
|
|
501
|
-
this._createObjectStructure(selectedObjectId, this.revision);
|
|
502
|
-
this.updatedObjectProperties.emit({ id: selectedObjectId, request: data, response });
|
|
503
|
-
},
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ObjectPropertiesComponent, deps: [{ token: i1.TranslateService }, { token: i2.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.ObjectPropertiesService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
507
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ObjectPropertiesComponent, isStandalone: true, selector: "lib-object-properties", inputs: { api: "api", revision: "revision", canUpdateObject: "canUpdateObject", rootObjectId: "rootObjectId" }, outputs: { updatedObjectProperties: "updatedObjectProperties" }, usesInheritance: true, ngImport: i0, template: "<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n/>\r\n\r\n<div class=\"object-properties\">\r\n\r\n <lib-bimplus-scrollable-container>\r\n <lib-expansion-panel class=\"object-properties-preview-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_3D preview\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-preview \r\n [api]=\"api\" \r\n [revision]=\"revision\" \r\n [objectId]=\"rootObjectId\"\r\n [visibleNode]=\"visibleNodeSignal()\"\t\r\n [opaqueNode]=\"opaqueNodeSignal()\"\r\n />\r\n </lib-expansion-panel>\r\n <!-- Object structure-->\r\n <lib-expansion-panel class=\"object-properties-object-structure-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_Object structure\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n @if (objectStructure) {\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n (nodeVisible)= \"handleObjectStructureNodeVisible($event)\"\r\n (nodeOpaque)= \"handleObjectStructureNodeOpaque($event)\" \r\n />\r\n }\r\n </lib-expansion-panel>\r\n <!-- End Object structure-->\r\n\r\n <!-- Complex properties-->\r\n @if(complexProperties){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\"> {{\"_Object multiproperties tree\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n <!-- End Complex properties-->\r\n\r\n @if(objectAttributeGroups().length > 0){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\">{{\"_Object properties\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <form [formGroup]=\"_objectPropertiesForm\" class=\"input-form\">\r\n @for (attribGroup of objectAttributeGroups(); track attribGroup) {\r\n @if(_editMode() || hasSetAnyAttribute(attribGroup)){\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-group-header\"> {{attribGroup.name}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-properties-group\r\n [attributesGroup]=\"attribGroup\"\r\n [editMode]=\"_editMode()\"\r\n [canUpdateObject]=\"_canUpdateObject()\"\r\n [objectPropertiesForm]=\"_objectPropertiesGroupForm(attribGroup.name)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n }\r\n </form>\r\n </lib-expansion-panel>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n</div>\r\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.object-properties{margin-left:.8rem;position:relative;flex:1}.object-properties .object-structure-header,.object-properties .object-properties-header{font-weight:700;text-transform:uppercase;font-size:1.4rem}.object-properties .object-properties-group-header{line-height:2.4rem}.object-properties lib-bimplus-object-structure{--bimplus-object-structure-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-object-complex-properties{--bimplus-object-complex-properties-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-scrollable-container{position:absolute;top:0;bottom:0;flex:1;width:100%}.object-properties .object-properties-object-structure-panel .expansion-panel,.object-properties lib-object-preview{margin-top:.8rem}\n"], dependencies: [{ kind: "component", type: ExpansionPanelComponent, selector: "lib-expansion-panel", inputs: ["expanded"] }, { kind: "component", type: ExpansionPanelHeaderComponent, selector: "lib-expansion-panel-header" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BimplusObjectStructureComponent, selector: "lib-bimplus-object-structure", inputs: ["objectStructure"], outputs: ["nodeSelected", "nodeVisible", "nodeOpaque"] }, { kind: "component", type: BimplusObjectComplexPropertiesComponent, selector: "lib-bimplus-object-complex-properties", inputs: ["complexProperties"], outputs: ["nodeSelected"] }, { kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items", "isMultiple", "canUpdateObject"], outputs: ["fileChanged", "buttonClicked"] }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: ObjectPropertiesGroupComponent, selector: "lib-object-properties-group", inputs: ["editMode", "objectPropertiesForm", "canUpdateObject", "attributesGroup"] }, { kind: "component", type: ObjectPreviewComponent, selector: "lib-object-preview", inputs: ["api", "objectId", "revision", "visibleNode", "opaqueNode"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
508
|
-
}
|
|
509
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ObjectPropertiesComponent, decorators: [{
|
|
510
|
-
type: Component,
|
|
511
|
-
args: [{ selector: 'lib-object-properties', standalone: true, imports: [
|
|
512
|
-
ExpansionPanelComponent,
|
|
513
|
-
ExpansionPanelHeaderComponent,
|
|
514
|
-
TranslateModule,
|
|
515
|
-
BimplusObjectStructureComponent,
|
|
516
|
-
BimplusObjectComplexPropertiesComponent,
|
|
517
|
-
BimplusButtonsRowComponent,
|
|
518
|
-
BimplusScrollableContainerComponent,
|
|
519
|
-
ObjectPropertiesGroupComponent,
|
|
520
|
-
ObjectPropertiesGroupComponent,
|
|
521
|
-
ObjectPreviewComponent,
|
|
522
|
-
ReactiveFormsModule,
|
|
523
|
-
GetAttributeValue
|
|
524
|
-
], encapsulation: ViewEncapsulation.ShadowDom, template: "<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n/>\r\n\r\n<div class=\"object-properties\">\r\n\r\n <lib-bimplus-scrollable-container>\r\n <lib-expansion-panel class=\"object-properties-preview-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_3D preview\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-preview \r\n [api]=\"api\" \r\n [revision]=\"revision\" \r\n [objectId]=\"rootObjectId\"\r\n [visibleNode]=\"visibleNodeSignal()\"\t\r\n [opaqueNode]=\"opaqueNodeSignal()\"\r\n />\r\n </lib-expansion-panel>\r\n <!-- Object structure-->\r\n <lib-expansion-panel class=\"object-properties-object-structure-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_Object structure\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n @if (objectStructure) {\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n (nodeVisible)= \"handleObjectStructureNodeVisible($event)\"\r\n (nodeOpaque)= \"handleObjectStructureNodeOpaque($event)\" \r\n />\r\n }\r\n </lib-expansion-panel>\r\n <!-- End Object structure-->\r\n\r\n <!-- Complex properties-->\r\n @if(complexProperties){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\"> {{\"_Object multiproperties tree\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n <!-- End Complex properties-->\r\n\r\n @if(objectAttributeGroups().length > 0){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\">{{\"_Object properties\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <form [formGroup]=\"_objectPropertiesForm\" class=\"input-form\">\r\n @for (attribGroup of objectAttributeGroups(); track attribGroup) {\r\n @if(_editMode() || hasSetAnyAttribute(attribGroup)){\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-group-header\"> {{attribGroup.name}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-properties-group\r\n [attributesGroup]=\"attribGroup\"\r\n [editMode]=\"_editMode()\"\r\n [canUpdateObject]=\"_canUpdateObject()\"\r\n [objectPropertiesForm]=\"_objectPropertiesGroupForm(attribGroup.name)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n }\r\n </form>\r\n </lib-expansion-panel>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n</div>\r\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.object-properties{margin-left:.8rem;position:relative;flex:1}.object-properties .object-structure-header,.object-properties .object-properties-header{font-weight:700;text-transform:uppercase;font-size:1.4rem}.object-properties .object-properties-group-header{line-height:2.4rem}.object-properties lib-bimplus-object-structure{--bimplus-object-structure-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-object-complex-properties{--bimplus-object-complex-properties-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-scrollable-container{position:absolute;top:0;bottom:0;flex:1;width:100%}.object-properties .object-properties-object-structure-panel .expansion-panel,.object-properties lib-object-preview{margin-top:.8rem}\n"] }]
|
|
525
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.ObjectPropertiesService }], propDecorators: { api: [{
|
|
526
|
-
type: Input
|
|
527
|
-
}], revision: [{
|
|
528
|
-
type: Input
|
|
529
|
-
}], canUpdateObject: [{
|
|
530
|
-
type: Input
|
|
531
|
-
}], rootObjectId: [{
|
|
532
|
-
type: Input
|
|
533
|
-
}], updatedObjectProperties: [{
|
|
534
|
-
type: Output
|
|
535
|
-
}] } });
|
|
536
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXByb3BlcnRpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LXByb3BlcnRpZXMvb2JqZWN0LXByb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LXByb3BlcnRpZXMvb2JqZWN0LXByb3BlcnRpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDUCxpQkFBaUIsRUFDakIsS0FBSyxFQUVMLE1BQU0sRUFHUixZQUFZLEVBQ1osTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pILE9BQU8sRUFDTCxlQUFlLEVBRWhCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUVMLDBCQUEwQixHQUMzQixNQUFNLGdFQUFnRSxDQUFDO0FBR3hFLE9BQU8sRUFDTCxJQUFJLEVBQ0YsZUFBZSxFQUNsQixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pILE9BQU8sRUFFTCw0QkFBNEIsR0FDN0IsTUFBTSxrRkFBa0YsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxrRkFBa0YsQ0FBQztBQUszSSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUts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Qix1Q0FBdUM7d0JBQ3ZDLDBCQUEwQjt3QkFDMUIsbUNBQW1DO3dCQUNuQyw4QkFBOEI7d0JBQzlCLDhCQUE4Qjt3QkFDOUIsc0JBQXNCO3dCQUN0QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEIsaUJBR2MsaUJBQWlCLENBQUMsU0FBUztxTEFtQ2pDLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBS08sWUFBWTtzQkFBeEIsS0FBSztnQkFxQkksdUJBQXVCO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnRcclxuICAsIFZpZXdFbmNhcHN1bGF0aW9uXHJcbiAgLCBJbnB1dFxyXG4gICwgT25Jbml0XHJcbiAgLCBzaWduYWxcclxuICAsIFdyaXRhYmxlU2lnbmFsXHJcbiAgLCBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV4cGFuc2lvblBhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vZXhwYW5zaW9uLXBhbmVsL2V4cGFuc2lvbi1wYW5lbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFeHBhbnNpb25QYW5lbEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2V4cGFuc2lvbi1wYW5lbC1oZWFkZXIvZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0L2JpbXBsdXMtbG9jYWxpemVkLXdpZGdldC5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIFRyYW5zbGF0ZU1vZHVsZVxyXG4gICwgVHJhbnNsYXRlU2VydmljZVxyXG59IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE9iamVjdFN0cnVjdHVyZU5vZGUsXHJcbiAgT2JqZWN0U3RydWN0dXJlTm9kZUJ1aWxkZXIsXHJcbn0gZnJvbSAnLi4vYmltcGx1cy1vYmplY3Qtc3RydWN0dXJlL2JpbXBsdXMtb2JqZWN0LXN0cnVjdHVyZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQcmV2aWV3T2JqZWN0IH0gZnJvbSAnLi4vb2JqZWN0LXByZXZpZXcvb2JqZWN0LXByZXZpZXcuaW50ZXJmYWNlJztcclxuaW1wb3J0ICogYXMgV2ViU2RrIGZyb20gJ2JpbXBsdXMtd2Vic2RrJztcclxuaW1wb3J0IHtcclxuICBmcm9tXHJcbiAgLCBCZWhhdmlvclN1YmplY3RcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQmltcGx1c09iamVjdFN0cnVjdHVyZUNvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtb2JqZWN0LXN0cnVjdHVyZS9iaW1wbHVzLW9iamVjdC1zdHJ1Y3R1cmUuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBDb21wbGV4UHJvcGVydGllc05vZGUsXHJcbiAgQ29tcGxleFByb3BlcnRpZXNOb2RlQnVpbGRlcixcclxufSBmcm9tICcuLi9iaW1wbHVzLW9iamVjdC1jb21wbGV4LXByb3BlcnRpZXMvYmltcGx1cy1vYmplY3QtY29tcGxleC1wcm9wZXJ0aWVzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEJpbXBsdXNPYmplY3RDb21wbGV4UHJvcGVydGllc0NvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtb2JqZWN0LWNvbXBsZXgtcHJvcGVydGllcy9iaW1wbHVzLW9iamVjdC1jb21wbGV4LXByb3BlcnRpZXMuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBPYmplY3RBdHRyaWJ1dGUsXHJcbiAgT2JqZWN0QXR0cmlidXRlR3JvdXAsXHJcbn0gZnJvbSAnLi9vYmplY3QtcHJvcGVydGllcy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtYnV0dG9ucy1yb3cvYmltcGx1cy1idXR0b25zLXJvdy5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIEJpbXBsdXNCdXR0b25Sb3dJdGVtLFxyXG4gIEJpbXBsdXNCdXR0b25DbGlja0V2ZW50LFxyXG59IGZyb20gJy4uL2JpbXBsdXMtYnV0dG9ucy1yb3cvYmltcGx1cy1idXR0b25zLXJvdy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIvYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBPYmplY3RQcm9wZXJ0aWVzR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9vYmplY3QtcHJvcGVydGllcy1ncm91cC9vYmplY3QtcHJvcGVydGllcy1ncm91cC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBpc09iamVjdFByb3BlcnR5VmFsdWVCbGFuayB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdFByb3BlcnRpZXMnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Hcm91cFxyXG4gICwgUmVhY3RpdmVGb3Jtc01vZHVsZVxyXG4gICwgRm9ybUJ1aWxkZXJcclxuICAsIEZvcm1Db250cm9sXHJcbiAgLCBWYWxpZGF0b3JzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBHZXRBdHRyaWJ1dGVWYWx1ZSB9IGZyb20gJy4uLy4uL3BpcGVzL2dldC1hdHRyaWJ1dGUtdmFsdWUucGlwZSc7XHJcbmltcG9ydCB7IGRvdWJsZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvZG91YmxlLnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IGludGVnZXJWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL2ludGVnZXIudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgZ3VpZFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvZ3VpZC52YWxpZGF0b3InO1xyXG5pbXBvcnQgeyBkb3VibGVFbnVtVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9kb3VibGUtZW51bS52YWxpZGF0b3InO1xyXG5pbXBvcnQgeyBPYmplY3RQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSBcIi4uL29iamVjdC1wcmV2aWV3L29iamVjdC1wcmV2aWV3LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBPYmplY3RQcm9wZXJ0aWVzU2VydmljZSB9IGZyb20gJy4vb2JqZWN0LXByb3BlcnRpZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IGd1aWRFbnVtVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9ndWlkLWVudW0udmFsaWRhdG9yJztcclxuaW1wb3J0IHsgc3RyaW5nRW51bVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvc3RyaW5nLWVudW0udmFsaWRhdG9yJztcclxuaW1wb3J0IHsgc3RyaW5nQ29tYm9ib3hWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N0cmluZy1jb21ib2JveC52YWxpZGF0b3InO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItb2JqZWN0LXByb3BlcnRpZXMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRXhwYW5zaW9uUGFuZWxDb21wb25lbnQsXHJcbiAgICBFeHBhbnNpb25QYW5lbEhlYWRlckNvbXBvbmVudCxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIEJpbXBsdXNPYmplY3RTdHJ1Y3R1cmVDb21wb25lbnQsXHJcbiAgICBCaW1wbHVzT2JqZWN0Q29tcGxleFByb3BlcnRpZXNDb21wb25lbnQsXHJcbiAgICBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudCxcclxuICAgIEJpbXBsdXNTY3JvbGxhYmxlQ29udGFpbmVyQ29tcG9uZW50LFxyXG4gICAgT2JqZWN0UHJvcGVydGllc0dyb3VwQ29tcG9uZW50LFxyXG4gICAgT2JqZWN0UHJvcGVydGllc0dyb3VwQ29tcG9uZW50LFxyXG4gICAgT2JqZWN0UHJldmlld0NvbXBvbmVudCxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBHZXRBdHRyaWJ1dGVWYWx1ZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL29iamVjdC1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9vYmplY3QtcHJvcGVydGllcy5jb21wb25lbnQubGVzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBPYmplY3RQcm9wZXJ0aWVzQ29tcG9uZW50XHJcbiAgZXh0ZW5kcyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXRcclxue1xyXG4gIHByb3RlY3RlZCBfb2JqZWN0UHJvcGVydGllc0Zvcm0gID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gIHByb3RlY3RlZCBfb2JqZWN0UHJvcGVydGllc0dyb3VwRm9ybShncm91cF9uYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgX2dyb3VwRm9ybTogRm9ybUdyb3VwID0gdGhpcy5fb2JqZWN0UHJvcGVydGllc0Zvcm07XHJcbiAgICByZXR1cm4gX2dyb3VwRm9ybS5jb250cm9sc1tncm91cF9uYW1lXSBhcyBGb3JtR3JvdXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyXHJcbiAgICAsIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICAgLCBwcml2YXRlIHJlYWRvbmx5IG9iamVjdFByb3BlcnRpZXNTZXJ2aWNlOiBPYmplY3RQcm9wZXJ0aWVzU2VydmljZSApXHJcbiAge1xyXG4gICAgc3VwZXIodHJhbnNsYXRlU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2VkaXRNb2RlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIF9vYmplY3RTdHJ1Y3R1cmU6IE9iamVjdFN0cnVjdHVyZU5vZGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgZ2V0IG9iamVjdFN0cnVjdHVyZSgpOiBPYmplY3RTdHJ1Y3R1cmVOb2RlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0U3RydWN0dXJlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29tcGxleFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0aWVzTm9kZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBnZXQgY29tcGxleFByb3BlcnRpZXMoKTogQ29tcGxleFByb3BlcnRpZXNOb2RlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcGxleFByb3BlcnRpZXM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBhcGk6IFdlYlNkay5BcGkgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSByZXZpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgX2NhblVwZGF0ZU9iamVjdCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcbiAgQElucHV0KCkgc2V0IGNhblVwZGF0ZU9iamVjdChjYW5VcGRhdGVPYmplY3Q6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NhblVwZGF0ZU9iamVjdC5zZXQoY2FuVXBkYXRlT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Jvb3RPYmplY3RJZCA6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgc2V0IHJvb3RPYmplY3RJZChpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50T2JqZWN0SWQkLm5leHQoaWQpO1xyXG4gICAgdGhpcy5fY3JlYXRlT2JqZWN0U3RydWN0dXJlKGlkLCB0aGlzLnJldmlzaW9uKTtcclxuICAgIHRoaXMuX3Jvb3RPYmplY3RJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJvb3RPYmplY3RJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jvb3RPYmplY3RJZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTYXZlQnV0dG9uRGlzYWJsZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSB2aXNpYmxlTm9kZVNpZ25hbDpXcml0YWJsZVNpZ25hbDxQcmV2aWV3T2JqZWN0PiA9IHNpZ25hbCh7aWQ6XCJcIix2aXNpYmxlOmZhbHNlLG9wYXF1ZTpmYWxzZX0pO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvcGFxdWVOb2RlU2lnbmFsOldyaXRhYmxlU2lnbmFsPFByZXZpZXdPYmplY3Q+ID0gc2lnbmFsKHtpZDpcIlwiLHZpc2libGU6ZmFsc2Usb3BhcXVlOmZhbHNlfSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRPYmplY3RJZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gKFwiXCIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRQcm9wZXJ0aWVzT2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+IChcIlwiKTtcclxuXHJcbiAgYnV0dG9uUm93SXRlbXM6IEFycmF5PEJpbXBsdXNCdXR0b25Sb3dJdGVtPiA9IFtdO1xyXG4gIGNvbmZpZ0VkaXRQcm9wZXJ0aWVzOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXTtcclxuICBjb25maWdFZGl0ZWRQcm9wZXJ0aWVzOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpIHVwZGF0ZWRPYmplY3RQcm9wZXJ0aWVzID0gbmV3IEV2ZW50RW1pdHRlcjx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4oKTtcclxuXHJcbiAgX2VkaXRQcm9wZXJ0aWVzQnV0dG9uc0NvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICB0aGlzLmNvbmZpZ0VkaXRQcm9wZXJ0aWVzLnB1c2goe1xyXG4gICAgICBpZDogJ2VkaXQtcHJvcGVydGllcycsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0VkaXRfcHJvcGVydGllcycpLFxyXG4gICAgICB0b29sdGlwOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0VkaXRfcHJvcGVydGllcycpLFxyXG4gICAgICBkaXNhYmxlZDogIXRoaXMuX2NhblVwZGF0ZU9iamVjdCgpLFxyXG4gICAgICBidXR0b25TdHlsZTogJ3ByaW1hcnknLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZWRpdGVkUHJvcGVydGllc0J1dHRvbnNDb25maWd1cmF0aW9uKCkge1xyXG4gICAgdGhpcy5jb25maWdFZGl0ZWRQcm9wZXJ0aWVzLnB1c2goe1xyXG4gICAgICBpZDogJ3NhdmUtY2hhbmdlZC1wcm9wZXJ0aWVzJyxcclxuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfU2F2ZScpLFxyXG4gICAgICB0b29sdGlwOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX1NhdmUnKSxcclxuICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNTYXZlQnV0dG9uRGlzYWJsZWQkLFxyXG4gICAgICBidXR0b25TdHlsZTogJ3ByaW1hcnknLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNvbmZpZ0VkaXRlZFByb3BlcnRpZXMucHVzaCh7XHJcbiAgICAgIGlkOiAnY2FuY2VsLWVkaXRpbmctcHJvcGVydGllcycsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0NhbmNlbCcpLFxyXG4gICAgICB0b29sdGlwOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0NhbmNlbCcpLFxyXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgIGJ1dHRvblN0eWxlOiAnc2Vjb25kYXJ5JyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9lZGl0UHJvcGVydGllc0J1dHRvbnNDb25maWd1cmF0aW9uKCk7XHJcbiAgICB0aGlzLl9lZGl0ZWRQcm9wZXJ0aWVzQnV0dG9uc0NvbmZpZ3VyYXRpb24oKTtcclxuXHJcbiAgICB0aGlzLmJ1dHRvblJvd0l0ZW1zID0gdGhpcy5jb25maWdFZGl0UHJvcGVydGllcztcclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVByb3BlcnRpZXMoKTsgIFxyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlUHJvcGVydGllcygpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRQcm9wZXJ0aWVzT2JqZWN0SWQkLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChpZCkgPT4ge1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgdGhpcy5fY3JlYXRlT2JqZWN0UHJvcGVydGllcyhpZCwgdGhpcy5yZXZpc2lvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoaWQpID0+IHtcclxuICAgICAgICB0aGlzLl9jdXJyZW50UHJvcGVydGllc09iamVjdElkJC5uZXh0KGlkKTtcclxuICAgICAgICB0aGlzLl9jcmVhdGVDb21wbGV4UHJvcGVydGllc3RydWN0dXJlKGlkLCB0aGlzLnJldmlzaW9uKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZVNlbGVjdGVkKG5vZGU6IE9iamVjdFN0cnVjdHVyZU5vZGUpIHtcclxuICAgIGNvbnNvbGUubG9nKG5vZGUpO1xyXG4gICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5uZXh0KG5vZGUuaWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZVZpc2libGUobm9kZSA6IE9iamVjdFN0cnVjdHVyZU5vZGUpe1xyXG4gICAgY29uc3Qgb2JqTm9kZTogUHJldmlld09iamVjdCA9IHtcclxuICAgICAgaWQ6bm9kZS5pZCxcclxuICAgICAgdmlzaWJsZTogbm9kZS52aXNpYmxlLFxyXG4gICAgICBvcGFxdWU6IG5vZGUub3BhcXVlfTtcclxuICAgIHRoaXMudmlzaWJsZU5vZGVTaWduYWwuc2V0KG9iak5vZGUpOyAvLyBVcGRhdGUgdGhlIHNpZ25hbFxyXG4gIH1cclxuXHJcbiAgaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZU9wYXF1ZShub2RlIDogT2JqZWN0U3RydWN0dXJlTm9kZSl7XHJcbiAgICBjb25zdCBvYmpOb2RlOiBQcmV2aWV3T2JqZWN0ID0ge1xyXG4gICAgICBpZDpub2RlLmlkLFxyXG4gICAgICB2aXNpYmxlOiBub2RlLnZpc2libGUsXHJcbiAgICAgIG9wYXF1ZTogbm9kZS5vcGFxdWV9O1xyXG4gICAgdGhpcy5vcGFxdWVOb2RlU2lnbmFsLnNldChvYmpOb2RlKTsgLy8gVXBkYXRlIHRoZSBzaWduYWxcclxuICB9XHJcbiAgXHJcblxyXG4gIGhhbmRsZUNvbXBsZXhQcm9wZXJ0eU5vZGVTZWxlY3RlZChub2RlIDogQ29tcGxleFByb3BlcnRpZXNOb2RlKXtcclxuICAgIGNvbnNvbGUubG9nKG5vZGUpO1xyXG4gICAgdGhpcy5fY3VycmVudFByb3BlcnRpZXNPYmplY3RJZCQubmV4dChub2RlLmlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRPYmplY3RTdHJ1Y3R1cmUob2JqZWN0SWQ6IHN0cmluZywgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCF0aGlzLmFwaSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvYmplY3RJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMuYXBpLm9iamVjdHMuZ2V0VG9wb2xvZ3kob2JqZWN0SWQsIHJldmlzaW9uLCBmYWxzZSwgZmFsc2UsIHVuZGVmaW5lZClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVPYmplY3RTdHJ1Y3R1cmUoXHJcbiAgICBvYmplY3RJZDogc3RyaW5nLFxyXG4gICAgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgdGhpcy5fbG9hZE9iamVjdFN0cnVjdHVyZShvYmplY3RJZCwgcmV2aXNpb24pPy5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoc3RydWN0dXJlRGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChzdHJ1Y3R1cmVEYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLl9vYmplY3RTdHJ1Y3R1cmUgPVxyXG4gICAgICAgICAgICBPYmplY3RTdHJ1Y3R1cmVOb2RlQnVpbGRlci5jcmVhdGVGcm9tUmVzcG9uc2Uoc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkT2JqZWN0Q29tcGxleFByb3BlcnRpZXNTdHJ1Y3R1cmUoXHJcbiAgICBvYmplY3RJZDogc3RyaW5nLFxyXG4gICAgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgaWYgKCF0aGlzLmFwaSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvYmplY3RJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMuYXBpLm9iamVjdHMuZ2V0Q29tcGxleFByb3BlcnRpZXNUb3BvbG9neShvYmplY3RJZCwgcmV2aXNpb24pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlQ29tcGxleFByb3BlcnRpZXN0cnVjdHVyZShcclxuICAgIG9iamVjdElkOiBzdHJpbmcsXHJcbiAgICByZXZpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9sb2FkT2JqZWN0Q29tcGxleFByb3BlcnRpZXNTdHJ1Y3R1cmUob2JqZWN0SWQsIHJldmlzaW9uKT8uc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHN0cnVjdHVyZURhdGEpID0+IHtcclxuICAgICAgICBpZiAoc3RydWN0dXJlRGF0YSkge1xyXG4gICAgICAgICAgY29uc3QgY29tcGxleFByb3BzID1cclxuICAgICAgICAgICAgQ29tcGxleFByb3BlcnRpZXNOb2RlQnVpbGRlci5jcmVhdGVGcm9tUmVzcG9uc2Uoc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgICBpZiAoY29tcGxleFByb3BzPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBsZXhQcm9wZXJ0aWVzID0gY29tcGxleFByb3BzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcGxleFByb3BlcnRpZXMgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9iamVjdEF0dHJpYnV0ZUdyb3VwcyA9IHNpZ25hbDxPYmplY3RBdHRyaWJ1dGVHcm91cFtdPihbXSk7XHJcblxyXG4gIHByaXZhdGUgX2xvYWRPYmplY3RQcm9wZXJ0aWVzKFxyXG4gICAgb2JqZWN0SWQ6IHN0cmluZyxcclxuICAgIHJldmlzaW9uOiBudW1iZXIgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIGlmICghdGhpcy5hcGkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb2JqZWN0SWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLmFwaS5vYmplY3RzLmdldChvYmplY3RJZCwgcmV2aXNpb24sICc4JywgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU9iamVjdFByb3BlcnRpZXMoXHJcbiAgICBvYmplY3RJZDogc3RyaW5nLFxyXG4gICAgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgdGhpcy5fbG9hZE9iamVjdFByb3BlcnRpZXMob2JqZWN0SWQsIHJldmlzaW9uKT8uc3Vic2NyaWJlKHtcclxuICAgICAgLy8gcHJvcGVydGllcyByZXNwb25zZSBpcyBiYWRseSBzdHJ1Y3R1cmVkLCBuZWFybHkgaW1wb3NzaWJsZSB0byBjcmVhdGUgY2xhc3Mgc3RydWN0dXJlIGZyb20gaXQuIFRoZXJlZm9yZSB1c2luZyBzaG9ydGN1dFxyXG4gICAgICAvLyBhbnkgZm9yIGpzb24gcmVzcG9uc2VcclxuXHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICBuZXh0OiAocHJvcGVydGllc0RhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMub2JqZWN0UHJvcGVydGllc1NlcnZpY2Uuc2V0TW9kZWwocHJvcGVydGllc0RhdGEpO1xyXG4gICAgICAgIHRoaXMub2JqZWN0QXR0cmlidXRlR3JvdXBzLnNldCh0aGlzLl9jcmVhdGVBdHRyaWJ1dGVHcm91cHNGcm9tUmVzcG9uc2UocHJvcGVydGllc0RhdGEpKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9iamVjdEF0dHJpYnV0ZUdyb3Vwcy5zZXQoW10pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBwcml2YXRlIF90b29sdGlwKGF0dHJpYjogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWVUaXRsZTogc3RyaW5nID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19OYW1lJyk7XHJcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBhdHRyaWIubmFtZSA/IGF0dHJpYi5uYW1lIDogJyc7XHJcbiAgICBjb25zdCBkZXNjcmlwdGlvblRpdGxlOiBzdHJpbmcgPVxyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZGVzY3JpcHRpb24nKTtcclxuICAgIGNvbnN0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBhdHRyaWIuZGVzY3JpcHRpb247XHJcbiAgICBjb25zdCB1dWlkVGl0bGU6IHN0cmluZyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfVVVJRCcpO1xyXG4gICAgY29uc3QgdXVpZDogc3RyaW5nID0gYXR0cmliLmlkO1xyXG4gICAgaWYgKFxyXG4gICAgICBkZXNjcmlwdGlvbiA9PT0gbnVsbCB8fFxyXG4gICAgICBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIGRlc2NyaXB0aW9uID09PSAnJ1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBgJHtuYW1lVGl0bGV9OiAke25hbWV9XFxuJHt1dWlkVGl0bGV9OiAke3V1aWR9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHtuYW1lVGl0bGV9OiAke25hbWV9XFxuJHtkZXNjcmlwdGlvblRpdGxlfTogJHtkZXNjcmlwdGlvbn1cXG4ke3V1aWRUaXRsZX06ICR7dXVpZH1gO1xyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcHJpdmF0ZSBfY3JlYXRlQXR0cmlidXRlR3JvdXBzRnJvbVJlc3BvbnNlKHByb3BlcnRpZXNEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGdyb3VwczogQXJyYXk8T2JqZWN0QXR0cmlidXRlR3JvdXA+ID0gW107XHJcbiAgICBsZXQgbG9jYWxpemVkQXR0cmliR3JvdXBzID0gbnVsbDtcclxuICAgIGlmIChwcm9wZXJ0aWVzRGF0YS5sb2NhbGl6ZWRBdHRyaWJ1dGVHcm91cHMpIHtcclxuICAgICAgbG9jYWxpemVkQXR0cmliR3JvdXBzID0gcHJvcGVydGllc0RhdGEubG9jYWxpemVkQXR0cmlidXRlR3JvdXBzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcHJvcGVydGllc0RhdGEuYXR0cmlidXRlcykge1xyXG4gICAgICByZXR1cm4gZ3JvdXBzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGF0dHJpYkdyb3VwcyA9IHByb3BlcnRpZXNEYXRhLmF0dHJpYnV0ZXM7XHJcbiAgICBmb3IgKGNvbnN0IFtncm91cE5hbWUsIGF0dHJpYnNPYmplY3RdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYkdyb3VwcykpIHtcclxuICAgICAgY29uc3QgbmV3R3JvdXA6IE9iamVjdEF0dHJpYnV0ZUdyb3VwID0ge1xyXG4gICAgICAgIG5hbWU6IGdyb3VwTmFtZSxcclxuICAgICAgICBleHBhbmRlZDogZmFsc2UsXHJcbiAgICAgICAgYXR0cmlidXRlczogW10sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAobG9jYWxpemVkQXR0cmliR3JvdXBzPy5bZ3JvdXBOYW1lXSkge1xyXG4gICAgICAgIG5ld0dyb3VwLm5hbWUgPSBsb2NhbGl6ZWRBdHRyaWJHcm91cHNbZ3JvdXBOYW1lXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFhdHRyaWJzT2JqZWN0KSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgYXR0cmliIG9mIE9iamVjdC52YWx1ZXMoYXR0cmlic09iamVjdCkpIHtcclxuICAgICAgICBjb25zdCBuZXdBdHRyaWI6IE9iamVjdEF0dHJpYnV0ZSA9IHtcclxuICAgICAgICAgIGlkOiBhdHRyaWIuaWQsXHJcbiAgICAgICAgICBuYW1lOiBhdHRyaWIubmFtZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBhdHRyaWIuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICB2YWx1ZTogYXR0cmliLnZhbHVlLFxyXG4gICAgICAgICAgZ3JvdXA6IGF0dHJpYi5ncm91cCxcclxuICAgICAgICAgIHR5cGU6IGF0dHJpYi50eXBlLFxyXG4gICAgICAgICAgdW5pdDogYXR0cmliLnVuaXQsXHJcbiAgICAgICAgICBkZWNpbWFsOiBhdHRyaWIuZGVjaW1hbCxcclxuICAgICAgICAgIGNvbnRyb2w6IGF0dHJpYi5jb250cm9sLFxyXG4gICAgICAgICAgZW51bWRlZmluaXRpb246IGF0dHJpYi5lbnVtZGVmaW5pdGlvbixcclxuICAgICAgICAgIGlzQ2hhbmdlYWJsZTogYXR0cmliLmlzQ2hhbmdlYWJsZSxcclxuICAgICAgICAgIHRvb2x0aXA6IHRoaXMuX3Rvb2x0aXAoYXR0cmliKSxcclxuICAgICAgICAgIG1pblZhbHVlOiBhdHRyaWIubWluVmFsdWUsXHJcbiAgICAgICAgICBtYXhWYWx1ZTogYXR0cmliLm1heFZhbHVlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG5ld0dyb3VwLmF0dHJpYnV0ZXMucHVzaChuZXdBdHRyaWIpO1xyXG4gICAgICB9XHJcbiAgICAgIGdyb3Vwcy5wdXNoKG5ld0dyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ3JvdXBzO1xyXG4gIH1cclxuXHJcbiAgX2RlbGV0ZUZvcm0oKSB7XHJcbiAgICB0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsRm9ybVZhbHVlczogc3RyaW5nID0gXCJcIjtcclxuICBfY3JlYXRlRm9ybSgpIHtcclxuICAgIGNvbnN0IF9nZXRBdHRyaWJ1dGVWYWx1ZSA9IG5ldyBHZXRBdHRyaWJ1dGVWYWx1ZSgpO1xyXG4gICAgY29uc3QgX2Zvcm06IHsgW2tleTogc3RyaW5nXTogRm9ybUdyb3VwIH0gPSB7fTtcclxuICAgIHRoaXMub2JqZWN0QXR0cmlidXRlR3JvdXBzKCkuZm9yRWFjaChncm91cEF0dHJpYnV0ZXMgPT4ge1xyXG4gICAgICBjb25zdCBfZm9ybV9ncm91cDogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB8IG51bGwgfSA9IHt9O1xyXG4gICAgICBncm91cEF0dHJpYnV0ZXMuYXR0cmlidXRlcy5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7XHJcbiAgICAgICAgaWYoKHR5cGVvZiBhdHRyaWJ1dGUudHlwZSA9PT0gJ3N0cmluZycgJiYgL15ib29sZWFuJC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKSAmJiAhYXR0cmlidXRlLmNvbnRyb2wpIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgICAsIGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUgPyBbVmFsaWRhdG9ycy5wYXR0ZXJuKC9eKGZhbHNlfHRydWV8MHwxKSQvaSldIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eYm9vbGVhbiQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSlcclxuICAgICAgICAgICAgJiYgKHR5cGVvZiBhdHRyaWJ1dGUuY29udHJvbCA9PT0gJ3N0cmluZycgJiYgL15jaGVja2JveCQvaS50ZXN0KGF0dHJpYnV0ZS5jb250cm9sKSlcclxuICAgICAgICAgIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9ec3RyaW5nJC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKSAmJiAhYXR0cmlidXRlLmNvbnRyb2wpIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoKHR5cGVvZiBhdHRyaWJ1dGUudHlwZSA9PT0gJ3N0cmluZycgJiYgL15kb3VibGUkL2kudGVzdChhdHRyaWJ1dGUudHlwZSkpICYmICFhdHRyaWJ1dGUuY29udHJvbCkge1xyXG4gICAgICAgICAgX2Zvcm1fZ3JvdXBbYXR0cmlidXRlLmlkXSA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcclxuICAgICAgICAgICAgX2dldEF0dHJpYnV0ZVZhbHVlLnRyYW5zZm9ybShhdHRyaWJ1dGUpXHJcbiAgICAgICAgICAgICwgYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSA/IFtkb3VibGVWYWxpZGF0b3IoYXR0cmlidXRlLm1pblZhbHVlLCBhdHRyaWJ1dGUubWF4VmFsdWUpXSA6IFtdXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZigodHlwZW9mIGF0dHJpYnV0ZS50eXBlID09PSAnc3RyaW5nJyAmJiAvXmludCgzMik/JC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKSAmJiAhYXR0cmlidXRlLmNvbnRyb2wpIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgICAsIGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUgPyBbaW50ZWdlclZhbGlkYXRvcihhdHRyaWJ1dGUubWluVmFsdWUsIGF0dHJpYnV0ZS5tYXhWYWx1ZSldIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eZ3VpZCQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSkgJiYgIWF0dHJpYnV0ZS5jb250cm9sKSB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICAgLCBhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlID8gW2d1aWRWYWxpZGF0b3IoKV0gOiBbXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoKHR5cGVvZiBhdHRyaWJ1dGUudHlwZSA9PT0gJ3N0cmluZycgJiYgL15kb3VibGUkL2kudGVzdChhdHRyaWJ1dGUudHlwZSkpXHJcbiAgICAgICAgICAmJiAodHlwZW9mIGF0dHJpYnV0ZS5jb250cm9sID09PSAnc3RyaW5nJyAmJiAvXmVudW1lcmF0aW9uJC9pLnRlc3QoYXR0cmlidXRlLmNvbnRyb2wpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgX2Zvcm1fZ3JvdXBbYXR0cmlidXRlLmlkXSA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcclxuICAgICAgICAgICAgX2dldEF0dHJpYnV0ZVZhbHVlLnRyYW5zZm9ybShhdHRyaWJ1dGUpXHJcbiAgICAgICAgICAgICwgYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSA/IFtkb3VibGVFbnVtVmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eZ3VpZCQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSlcclxuICAgICAgICAgICYmICh0eXBlb2YgYXR0cmlidXRlLmNvbnRyb2wgPT09ICdzdHJpbmcnICYmIC9eZW51bWVyYXRpb24kL2kudGVzdChhdHRyaWJ1dGUuY29udHJvbCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICAgLCBhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlID8gW2d1aWRFbnVtVmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eaW50KDMyKT8kL2kudGVzdChhdHRyaWJ1dGUudHlwZSkpXHJcbiAgICAgICAgICAmJiAodHlwZW9mIGF0dHJpYnV0ZS5jb250cm9sID09PSAnc3RyaW5nJyAmJiAvXmVudW1lcmF0aW9uJC9pLnRlc3QoYXR0cmlidXRlLmNvbnRyb2wpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgX2Zvcm1fZ3JvdXBbYXR0cmlidXRlLmlkXSA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcclxuICAgICAgICAgICAgX2dldEF0dHJpYnV0ZVZhbHVlLnRyYW5zZm9ybShhdHRyaWJ1dGUpXHJcbiAgICAgICAgICAgICwgYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSA/IFtkb3VibGVFbnVtVmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9ec3RyaW5nJC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKVxyXG4gICAgICAgICAgJiYgKHR5cGVvZiBhdHRyaWJ1dGUuY29udHJvbCA9PT0gJ3N0cmluZycgJiYgL15lbnVtZXJhdGlvbiQvaS50ZXN0KGF0dHJpYnV0ZS5jb250cm9sKSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgICAsIGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUgPyBbc3RyaW5nRW51bVZhbGlkYXRvcihhdHRyaWJ1dGUuZW51bWRlZmluaXRpb24pXSA6IFtdXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZigodHlwZW9mIGF0dHJpYnV0ZS50eXBlID09PSAnc3RyaW5nJyAmJiAvXnN0cmluZyQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSlcclxuICAgICAgICAgICYmICh0eXBlb2YgYXR0cmlidXRlLmNvbnRyb2wgPT09ICdzdHJpbmcnICYmIC9eY29tYm9ib3gkL2kudGVzdChhdHRyaWJ1dGUuY29udHJvbCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICAgLCBhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlID8gW3N0cmluZ0NvbWJvYm94VmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAgIF9mb3JtW2dyb3VwQXR0cmlidXRlcy5uYW1lXSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoX2Zvcm1fZ3JvdXApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoX2Zvcm0pO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhbEZvcm1WYWx1ZXMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybS52YWx1ZSk7XHJcbiAgICB0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlZDogYm9vbGVhbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKSAhPT0gdGhpcy5pbml0aWFsRm9ybVZhbHVlcztcclxuICAgICAgICB0aGlzLmlzU2F2ZUJ1dHRvbkRpc2FibGVkJC5uZXh0KCEodGhpcy5fb2JqZWN0UHJvcGVydGllc0Zvcm0udmFsaWQgJiYgY2hhbmdlZCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFByb3BlcnR5TmFtZSh1dWlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYXR0ckdyb3VwczogT2JqZWN0QXR0cmlidXRlR3JvdXBbXSA9IHRoaXMub2JqZWN0QXR0cmlidXRlR3JvdXBzKCk7XHJcbiAgICBmb3IgKGNvbnN0IGF0dHJHcm91cCBvZiBhdHRyR3JvdXBzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyR3JvdXAuYXR0cmlidXRlcykge1xyXG4gICAgICAgIGlmIChhdHRyLmlkID09PSB1dWlkKSB7XHJcbiAgICAgICAgICByZXR1cm4gYXR0ci5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UHJvcGVydHlUeXBlKHV1aWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhdHRyR3JvdXBzOiBPYmplY3RBdHRyaWJ1dGVHcm91cFtdID0gdGhpcy5vYmplY3RBdHRyaWJ1dGVHcm91cHMoKTtcclxuICAgIGZvciAoY29uc3QgYXR0ckdyb3VwIG9mIGF0dHJHcm91cHMpIHtcclxuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJHcm91cC5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHIuaWQgPT09IHV1aWQpIHtcclxuICAgICAgICAgIHJldHVybiBhdHRyLnR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQcm9wZXJ0eUNvbnRyb2wodXVpZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGF0dHJHcm91cHM6IE9iamVjdEF0dHJpYnV0ZUdyb3VwW10gPSB0aGlzLm9iamVjdEF0dHJpYnV0ZUdyb3VwcygpO1xyXG4gICAgZm9yIChjb25zdCBhdHRyR3JvdXAgb2YgYXR0ckdyb3Vwcykge1xyXG4gICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0ckdyb3VwLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICBpZiAoYXR0ci5pZCA9PT0gdXVpZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGF0dHIuY29udHJvbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbnZlcnRWYWx1ZVRvQm9vbGVhbih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gL150cnVlJC9pLnRlc3QodmFsdWUpIHx8IC9eMSQvaS50ZXN0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbnZlcnRWYWx1ZVRvRG91YmxlKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFzQmVlblZhbHVlQ2hhbmdlZCh1dWlkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdHRyR3JvdXBzOiBPYmplY3RBdHRyaWJ1dGVHcm91cFtdID0gdGhpcy5vYmplY3RBdHRyaWJ1dGVHcm91cHMoKTtcclxuICAgIGZvciAoY29uc3QgYXR0ckdyb3VwIG9mIGF0dHJHcm91cHMpIHtcclxuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJHcm91cC5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHIuaWQgPT09IHV1aWQpIHtcclxuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gYXR0ci52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldENoYW5nZWREYXRhKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0ge1xyXG4gICAgY29uc3QgY2hhbmdlZERhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge307XHJcblxyXG4gICAgT2JqZWN0LmtleXMoZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGtleSk7XHJcblxyXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgLy8gSWYgaXQncyBhIEZvcm1Db250cm9sIGFuZCBpdCdzIGRpcnR5LCBjYXB0dXJlIHRoZSBjaGFuZ2VkIHZhbHVlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGlydHkpIHtcclxuICAgICAgICAgIGNvbnN0IHByb3BOYW1lOiBzdHJpbmcgPSB0aGlzLl9nZXRQcm9wZXJ0eU5hbWUoa2V5KTtcclxuICAgICAgICAgIGNvbnN0IHByb3BUeXBlOiBzdHJpbmcgPSB0aGlzLl9nZXRQcm9wZXJ0eVR5cGUoa2V5KTtcclxuICAgICAgICAgIC8vIGNvbnN0IHByb3BDb250cm9sOiBzdHJpbmcgPSB0aGlzLl9nZXRQcm9wZXJ0eUNvbnRyb2woa2V5KTtcclxuICAgICAgICAgIGlmKHByb3BOYW1lID09PSAnJykge1xyXG4gICAgICAgICAgICBjb25zdCBfbmV3VmFsdWUgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IGtleSxcclxuICAgICAgICAgICAgICB2YWx1ZTogY29udHJvbC52YWx1ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjaGFuZ2VkRGF0YVtrZXldID0gX25ld1ZhbHVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYoL15ib29sZWFuJC9pLnRlc3QocHJvcFR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgX3ZhbDogYm9vbGVhbiA9IHRoaXMuX2NvbnZlcnRWYWx1ZVRvQm9vbGVhbihjb250cm9sLnZhbHVlKTtcclxuICAgICAgICAgICAgICBpZih0aGlzLl9oYXNCZWVuVmFsdWVDaGFuZ2VkKGtleSwgX3ZhbCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IF9uZXdWYWx1ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92YWxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VkRGF0YVtwcm9wTmFtZV0gPSBfbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoL15kb3VibGUkL2kudGVzdChwcm9wVHlwZSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBfdmFsOiBudW1iZXIgPSB0aGlzLl9jb252ZXJ0VmFsdWVUb0RvdWJsZShjb250cm9sLnZhbHVlKTtcclxuICAgICAgICAgICAgICBpZih0aGlzLl9oYXNCZWVuVmFsdWVDaGFuZ2VkKGtleSwgX3ZhbCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IF9uZXdWYWx1ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92YWxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VkRGF0YVtwcm9wTmFtZV0gPSBfbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IF92YWw6IHN0cmluZyA9IGNvbnRyb2wudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmKHRoaXMuX2hhc0JlZW5WYWx1ZUNoYW5nZWQoa2V5LCBjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgX25ld1ZhbHVlID0ge1xyXG4gICAgICAgICAgICAgICAgICBpZDoga2V5LFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZhbFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNoYW5nZWREYXRhW3Byb3BOYW1lXSA9IF9uZXdWYWx1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgIGlmKGNvbnRyb2wuZGlydHkpIHtcclxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBjaGFuZ2VkIGRhdGEgZnJvbSBuZXN0ZWQgRm9ybUdyb3VwXHJcbiAgICAgICAgICBjb25zdCBuZXN0ZWRDaGFuZ2VzID0gdGhpcy5fZ2V0Q2hhbmdlZERhdGEoY29udHJvbCk7XHJcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobmVzdGVkQ2hhbmdlcykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjaGFuZ2VkRGF0YVtrZXldID0gbmVzdGVkQ2hhbmdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjaGFuZ2VkRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NhdmVPYmplY3RQcm9wZXJ0aWVzKCkge1xyXG4gICAgY29uc3Qgc2F2ZURhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge307XHJcbiAgICBzYXZlRGF0YVsnaWQnXSA9IHRoaXMuX2N1cnJlbnRPYmplY3RJZCQudmFsdWU7XHJcbiAgICBzYXZlRGF0YVsndW5zYXZlZCddID0gdHJ1ZTtcclxuICAgIHNhdmVEYXRhWydhdHRyaWJ1dGVzJ10gPSB0aGlzLl9nZXRDaGFuZ2VkRGF0YSh0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybSk7XHJcbiAgICB0aGlzLnNhdmVPYmplY3RQcm9wZXJ0aWVzKHNhdmVEYXRhKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBidXR0b25DbGlja2VkKCRldmVudDogQmltcGx1c0J1dHRvbkNsaWNrRXZlbnQpIHtcclxuICAgIGlmICgkZXZlbnQuaWQgPT09ICdlZGl0LXByb3BlcnRpZXMnKSB7XHJcbiAgICAgIHRoaXMuX2VkaXRNb2RlLnNldCh0cnVlKTtcclxuICAgICAgdGhpcy5fY3JlYXRlRm9ybSgpO1xyXG4gICAgICBjb25zb2xlLmxvZygnRWRpdCBwcm9wZXJ0aWVzIGNsaWNrZWQnKTtcclxuICAgICAgdGhpcy5idXR0b25Sb3dJdGVtcyA9IHRoaXMuY29uZmlnRWRpdGVkUHJvcGVydGllcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoJGV2ZW50LmlkID09PSAnc2F2ZS1jaGFuZ2VkLXByb3BlcnRpZXMnKSB7XHJcbiAgICAgIHRoaXMuX3NhdmVPYmplY3RQcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMuX2VkaXRNb2RlLnNldChmYWxzZSk7XHJcbiAgICAgIHRoaXMuX2RlbGV0ZUZvcm0oKTtcclxuICAgICAgdGhpcy5idXR0b25Sb3dJdGVtcyA9IHRoaXMuY29uZmlnRWRpdFByb3BlcnRpZXM7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdTYXZlIGNoYW5nZWQgcHJvcGVydGllcyBjbGlja2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCRldmVudC5pZCA9PT0gJ2NhbmNlbC1lZGl0aW5nLXByb3BlcnRpZXMnKSB7XHJcbiAgICAgIHRoaXMuX2VkaXRNb2RlLnNldChmYWxzZSk7XHJcbiAgICAgIHRoaXMuX2RlbGV0ZUZvcm0oKTtcclxuICAgICAgdGhpcy5idXR0b25Sb3dJdGVtcyA9IHRoaXMuY29uZmlnRWRpdFByb3BlcnRpZXM7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDYW5jZWwgZWRpdCBwcm9wZXJ0aWVzIGNsaWNrZWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhc1NldEFueUF0dHJpYnV0ZShvYmplY3RBdHRyaWJ1dGVHcm91cDogT2JqZWN0QXR0cmlidXRlR3JvdXApIHtcclxuICAgIHJldHVybiBvYmplY3RBdHRyaWJ1dGVHcm91cC5hdHRyaWJ1dGVzLnNvbWUoKGF0dHJpYikgPT4ge1xyXG4gICAgICByZXR1cm4gIWlzT2JqZWN0UHJvcGVydHlWYWx1ZUJsYW5rKGF0dHJpYik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzYXZlT2JqZWN0UHJvcGVydGllcyhkYXRhOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRPYmplY3RJZCA9IHRoaXMuX2N1cnJlbnRQcm9wZXJ0aWVzT2JqZWN0SWQkLnZhbHVlO1xyXG4gICAgaWYgKCFkYXRhIHx8ICFzZWxlY3RlZE9iamVjdElkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuYXBpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBmcm9tKHRoaXMuYXBpLm9iamVjdHMucHV0KHNlbGVjdGVkT2JqZWN0SWQsIEpTT04uc3RyaW5naWZ5KGRhdGEpKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3BvbnNlOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZU9iamVjdFByb3BlcnRpZXMoc2VsZWN0ZWRPYmplY3RJZCwgdGhpcy5yZXZpc2lvbik7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlT2JqZWN0U3RydWN0dXJlKHNlbGVjdGVkT2JqZWN0SWQsIHRoaXMucmV2aXNpb24pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZE9iamVjdFByb3BlcnRpZXMuZW1pdCh7IGlkOiBzZWxlY3RlZE9iamVjdElkLCByZXF1ZXN0OiBkYXRhLCByZXNwb25zZSB9KTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8bGliLWJpbXBsdXMtYnV0dG9ucy1yb3dcclxuICBbaXRlbXNdPVwiYnV0dG9uUm93SXRlbXNcIlxyXG4gIChidXR0b25DbGlja2VkKT1cImJ1dHRvbkNsaWNrZWQoJGV2ZW50KVwiXHJcbi8+XHJcblxyXG48ZGl2IGNsYXNzPVwib2JqZWN0LXByb3BlcnRpZXNcIj5cclxuXHJcbiAgPGxpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxyXG4gICAgPGxpYi1leHBhbnNpb24tcGFuZWwgY2xhc3M9XCJvYmplY3QtcHJvcGVydGllcy1wcmV2aWV3LXBhbmVsXCI+XHJcbiAgICAgIDxsaWItZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm9iamVjdC1zdHJ1Y3R1cmUtaGVhZGVyXCI+e3tcIl8zRCBwcmV2aWV3XCIgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9saWItZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgPGxpYi1vYmplY3QtcHJldmlldyBcclxuICAgICAgICBbYXBpXT1cImFwaVwiIFxyXG4gICAgICAgIFtyZXZpc2lvbl09XCJyZXZpc2lvblwiIFxyXG4gICAgICAgIFtvYmplY3RJZF09XCJyb290T2JqZWN0SWRcIlxyXG4gICAgICAgIFt2aXNpYmxlTm9kZV09XCJ2aXNpYmxlTm9kZVNpZ25hbCgpXCJcdFxyXG4gICAgICAgIFtvcGFxdWVOb2RlXT1cIm9wYXF1ZU5vZGVTaWduYWwoKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2xpYi1leHBhbnNpb24tcGFuZWw+XHJcbiAgICA8IS0tIE9iamVjdCBzdHJ1Y3R1cmUtLT5cclxuICAgIDxsaWItZXhwYW5zaW9uLXBhbmVsIGNsYXNzPVwib2JqZWN0LXByb3BlcnRpZXMtb2JqZWN0LXN0cnVjdHVyZS1wYW5lbFwiPlxyXG4gICAgICA8bGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvYmplY3Qtc3RydWN0dXJlLWhlYWRlclwiPnt7XCJfT2JqZWN0IHN0cnVjdHVyZVwiIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgIEBpZiAob2JqZWN0U3RydWN0dXJlKSB7XHJcbiAgICAgICAgPGxpYi1iaW1wbHVzLW9iamVjdC1zdHJ1Y3R1cmVcclxuICAgICAgICAgIFtvYmplY3RTdHJ1Y3R1cmVdPVwib2JqZWN0U3RydWN0dXJlXCJcclxuICAgICAgICAgIChub2RlU2VsZWN0ZWQpPVwiaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgICAgKG5vZGVWaXNpYmxlKT0gXCJoYW5kbGVPYmplY3RTdHJ1Y3R1cmVOb2RlVmlzaWJsZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChub2RlT3BhcXVlKT0gIFwiaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZU9wYXF1ZSgkZXZlbnQpXCIgICAgICAgICAgXHJcbiAgICAgICAgLz5cclxuICAgICAgfVxyXG4gICAgPC9saWItZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgPCEtLSBFbmQgT2JqZWN0IHN0cnVjdHVyZS0tPlxyXG5cclxuICAgIDwhLS0gQ29tcGxleCBwcm9wZXJ0aWVzLS0+XHJcbiAgICBAaWYoY29tcGxleFByb3BlcnRpZXMpe1xyXG4gICAgICA8bGliLWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICA8bGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9iamVjdC1wcm9wZXJ0aWVzLWhlYWRlclwiPiB7e1wiX09iamVjdCBtdWx0aXByb3BlcnRpZXMgdHJlZVwiIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgPC9saWItZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8bGliLWJpbXBsdXMtb2JqZWN0LWNvbXBsZXgtcHJvcGVydGllc1xyXG4gICAgICAgICAgW2NvbXBsZXhQcm9wZXJ0aWVzXT1cImNvbXBsZXhQcm9wZXJ0aWVzXCJcclxuICAgICAgICAgIChub2RlU2VsZWN0ZWQpPVwiaGFuZGxlQ29tcGxleFByb3BlcnR5Tm9kZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIH1cclxuICAgIDwhLS0gRW5kIENvbXBsZXggcHJvcGVydGllcy0tPlxyXG5cclxuICAgIEBpZihvYmplY3RBdHRyaWJ1dGVHcm91cHMoKS5sZW5ndGggPiAwKXtcclxuICAgICAgPGxpYi1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgPGxpYi1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJvYmplY3QtcHJvcGVydGllcy1oZWFkZXJcIj57e1wiX09iamVjdCBwcm9wZXJ0aWVzXCIgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICA8L2xpYi1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiX29iamVjdFByb3BlcnRpZXNGb3JtXCIgY2xhc3M9XCJpbnB1dC1mb3JtXCI+XHJcbiAgICAgICAgICBAZm9yIChhdHRyaWJHcm91cCBvZiBvYmplY3RBdHRyaWJ1dGVHcm91cHMoKTsgdHJhY2sgYXR0cmliR3JvdXApIHtcclxuICAgICAgICAgICAgQGlmKF9lZGl0TW9kZSgpIHx8IGhhc1NldEFueUF0dHJpYnV0ZShhdHRyaWJHcm91cCkpe1xyXG4gICAgICAgICAgICAgIDxsaWItZXhwYW5zaW9uLXBhbmVsIFtleHBhbmRlZF09XCJhdHRyaWJHcm91cC5leHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9iamVjdC1wcm9wZXJ0aWVzLWdyb3VwLWhlYWRlclwiPiB7e2F0dHJpYkdyb3VwLm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8bGliLW9iamVjdC1wcm9wZXJ0aWVzLWdyb3VwXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzR3JvdXBdPVwiYXR0cmliR3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiX2VkaXRNb2RlKClcIlxyXG4gICAgICAgICAgICAgICAgICBbY2FuVXBkYXRlT2JqZWN0XT1cIl9jYW5VcGRhdGVPYmplY3QoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtvYmplY3RQcm9wZXJ0aWVzRm9ybV09XCJfb2JqZWN0UHJvcGVydGllc0dyb3VwRm9ybShhdHRyaWJHcm91cC5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9saWItZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgfVxyXG4gIDwvbGliLWJpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXI+XHJcbjwvZGl2PlxyXG4iXX0=
|