@simpleangularcontrols/sac-common 10.0.0-rc.2 → 10.0.0-rc.21

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.
Files changed (140) hide show
  1. package/bundles/simpleangularcontrols-sac-common.umd.js +2232 -1604
  2. package/bundles/simpleangularcontrols-sac-common.umd.js.map +1 -1
  3. package/bundles/simpleangularcontrols-sac-common.umd.min.js +1 -1
  4. package/bundles/simpleangularcontrols-sac-common.umd.min.js.map +1 -1
  5. package/common/basedatetimecontrol.d.ts +100 -14
  6. package/common/baseinputcontrol.d.ts +0 -4
  7. package/common/basemodelcontrol.d.ts +55 -27
  8. package/common/baseuploadcontrol.d.ts +71 -55
  9. package/controls/checkbox/checkbox.d.ts +12 -3
  10. package/controls/checkbox/radiobutton.d.ts +61 -26
  11. package/controls/contextmenu/contextmenu.d.ts +26 -19
  12. package/controls/contextmenu/contextmenu.interface.d.ts +3 -0
  13. package/controls/contextmenu/contextmenuitem.d.ts +5 -0
  14. package/controls/contextmenu/contextmenuitembutton.d.ts +21 -20
  15. package/controls/datetime/date.d.ts +28 -31
  16. package/controls/datetime/datetime.d.ts +27 -31
  17. package/controls/datetime/time.d.ts +26 -30
  18. package/controls/dialog/dialog.d.ts +31 -43
  19. package/controls/grid/grid.d.ts +38 -36
  20. package/controls/grid/gridbutton.d.ts +13 -13
  21. package/controls/grid/gridcolumn.d.ts +8 -8
  22. package/controls/grid/gridcolumnaction.d.ts +3 -3
  23. package/controls/grid/gridcolumnbase.d.ts +45 -37
  24. package/controls/grid/gridimage.d.ts +2 -2
  25. package/controls/grid/model.d.ts +51 -42
  26. package/controls/grid/paging.d.ts +41 -43
  27. package/controls/input/input.d.ts +3 -3
  28. package/controls/input/inputarea.d.ts +5 -5
  29. package/controls/input/inputpassword.d.ts +7 -7
  30. package/controls/input/inputsearch.d.ts +13 -4
  31. package/controls/layout/formlayout.d.ts +17 -1
  32. package/controls/list/buildvaluestring.d.ts +6 -0
  33. package/controls/list/dropdown.d.ts +9 -51
  34. package/controls/list/dropdownoptions.d.ts +38 -0
  35. package/controls/multilanguage/multilanguageinput.d.ts +2 -2
  36. package/controls/multilanguage/multilanguageinputarea.d.ts +4 -4
  37. package/controls/static/formcontainer.d.ts +7 -3
  38. package/controls/tooltip/tooltip.d.ts +76 -69
  39. package/controls/treeview/treeview.d.ts +107 -107
  40. package/esm2015/common/basedatetimecontrol.js +185 -30
  41. package/esm2015/common/baseinputcontrol.js +2 -7
  42. package/esm2015/common/basemodelcontrol.js +109 -57
  43. package/esm2015/common/baseuploadcontrol.js +92 -59
  44. package/esm2015/controls/checkbox/checkbox.js +29 -6
  45. package/esm2015/controls/checkbox/radiobutton.js +94 -45
  46. package/esm2015/controls/contextmenu/contextmenu.interface.js +1 -0
  47. package/esm2015/controls/contextmenu/contextmenu.interface.ngfactory.js +7 -0
  48. package/esm2015/controls/contextmenu/contextmenu.js +22 -23
  49. package/esm2015/controls/contextmenu/contextmenuitem.js +13 -2
  50. package/esm2015/controls/contextmenu/contextmenuitembutton.js +34 -25
  51. package/esm2015/controls/datetime/date.js +44 -43
  52. package/esm2015/controls/datetime/datetime.js +43 -43
  53. package/esm2015/controls/datetime/time.js +43 -43
  54. package/esm2015/controls/dialog/dialog.js +41 -83
  55. package/esm2015/controls/grid/grid.js +21 -21
  56. package/esm2015/controls/grid/gridbutton.js +19 -13
  57. package/esm2015/controls/grid/gridcolumn.js +14 -7
  58. package/esm2015/controls/grid/gridcolumnaction.js +6 -5
  59. package/esm2015/controls/grid/gridcolumnbase.js +67 -55
  60. package/esm2015/controls/grid/gridimage.js +3 -3
  61. package/esm2015/controls/grid/model.js +51 -30
  62. package/esm2015/controls/grid/paging.js +40 -42
  63. package/esm2015/controls/input/input.js +6 -8
  64. package/esm2015/controls/input/inputarea.js +19 -12
  65. package/esm2015/controls/input/inputpassword.js +12 -12
  66. package/esm2015/controls/input/inputsearch.js +35 -6
  67. package/esm2015/controls/layout/formlayout.js +20 -8
  68. package/esm2015/controls/list/buildvaluestring.js +18 -0
  69. package/esm2015/controls/{treeview/ngtreeitemaction.ngfactory.js → list/buildvaluestring.ngfactory.js} +1 -1
  70. package/esm2015/controls/list/dropdown.js +16 -114
  71. package/esm2015/controls/list/dropdownoptions.js +72 -0
  72. package/esm2015/controls/{treeview/treeviewchild.ngfactory.js → list/dropdownoptions.ngfactory.js} +1 -1
  73. package/esm2015/controls/multilanguage/multilanguageinput.js +8 -14
  74. package/esm2015/controls/multilanguage/multilanguageinputarea.js +9 -15
  75. package/esm2015/controls/static/formcontainer.js +16 -5
  76. package/esm2015/controls/tooltip/tooltip.js +126 -245
  77. package/esm2015/controls/treeview/treeview.js +276 -231
  78. package/esm2015/interfaces/ISacConfigurationService.js +1 -1
  79. package/esm2015/interfaces/ISacIconService.js +1 -1
  80. package/esm2015/interfaces/ISacUploadEventCompleteState.js +1 -0
  81. package/esm2015/interfaces/ISacUploadEventCompleteState.ngfactory.js +7 -0
  82. package/esm2015/interfaces/ISacValidationKeyService.js +1 -1
  83. package/esm2015/interfaces/treeviewaction.interface.js +1 -0
  84. package/esm2015/interfaces/treeviewaction.interface.ngfactory.js +7 -0
  85. package/esm2015/public_api.js +15 -8
  86. package/esm2015/services/sac-configuration.service.js +31 -5
  87. package/esm2015/services/sac-icon.service.js +37 -1
  88. package/esm2015/services/sac-localisation.service.js +69 -180
  89. package/esm2015/services/sac-validationkey.service.js +12 -9
  90. package/esm2015/simpleangularcontrols-sac-common.js +1 -7
  91. package/esm2015/utilities/enums.js +5 -1
  92. package/esm2015/utilities/guid.js +4 -2
  93. package/esm2015/utilities/popuphelper.js +343 -0
  94. package/esm2015/utilities/popuphelper.ngfactory.js +7 -0
  95. package/esm2015/validation/equals.validator.js +14 -0
  96. package/esm2015/validation/equals.validator.ngfactory.js +7 -0
  97. package/esm2015/validation/isDateValid.js +9 -1
  98. package/esm2015/validation/mintextlength.validator.js +23 -0
  99. package/esm2015/validation/mintextlength.validator.ngfactory.js +7 -0
  100. package/esm2015/validation/notequals.validator.js +14 -0
  101. package/esm2015/validation/{minlength.validator.ngfactory.js → notequals.validator.ngfactory.js} +1 -1
  102. package/esm2015/validation/validation.class.js +35 -6
  103. package/fesm2015/simpleangularcontrols-sac-common.js +2070 -1498
  104. package/fesm2015/simpleangularcontrols-sac-common.js.map +1 -1
  105. package/interfaces/ISacConfigurationService.d.ts +20 -0
  106. package/interfaces/ISacIconService.d.ts +24 -0
  107. package/interfaces/ISacUploadEventCompleteState.d.ts +5 -0
  108. package/interfaces/ISacUploadEventCompleteState.ngfactory.d.ts +1 -0
  109. package/interfaces/ISacValidationKeyService.d.ts +2 -2
  110. package/interfaces/treeviewaction.interface.d.ts +4 -0
  111. package/interfaces/treeviewaction.interface.ngfactory.d.ts +1 -0
  112. package/package.json +2 -2
  113. package/public_api.d.ts +13 -6
  114. package/services/sac-configuration.service.d.ts +40 -0
  115. package/services/sac-icon.service.d.ts +49 -1
  116. package/services/sac-localisation.service.d.ts +10 -10
  117. package/services/sac-validationkey.service.d.ts +7 -7
  118. package/simpleangularcontrols-sac-common-10.0.0-rc.21.tgz +0 -0
  119. package/simpleangularcontrols-sac-common.d.ts +0 -6
  120. package/simpleangularcontrols-sac-common.metadata.json +1 -1
  121. package/utilities/enums.d.ts +3 -1
  122. package/utilities/popuphelper.d.ts +83 -0
  123. package/utilities/popuphelper.ngfactory.d.ts +1 -0
  124. package/validation/equals.validator.d.ts +2 -0
  125. package/validation/equals.validator.ngfactory.d.ts +1 -0
  126. package/validation/mintextlength.validator.d.ts +2 -0
  127. package/validation/mintextlength.validator.ngfactory.d.ts +1 -0
  128. package/validation/notequals.validator.d.ts +2 -0
  129. package/validation/notequals.validator.ngfactory.d.ts +1 -0
  130. package/validation/validation.class.d.ts +22 -3
  131. package/controls/treeview/ngtreeitemaction.d.ts +0 -40
  132. package/controls/treeview/treeviewchild.d.ts +0 -12
  133. package/esm2015/controls/treeview/ngtreeitemaction.js +0 -60
  134. package/esm2015/controls/treeview/treeviewchild.js +0 -18
  135. package/esm2015/validation/minlength.validator.js +0 -21
  136. package/simpleangularcontrols-sac-common-10.0.0-rc.2.tgz +0 -0
  137. package/validation/minlength.validator.d.ts +0 -2
  138. /package/controls/{treeview/ngtreeitemaction.ngfactory.d.ts → contextmenu/contextmenu.interface.ngfactory.d.ts} +0 -0
  139. /package/controls/{treeview/treeviewchild.ngfactory.d.ts → list/buildvaluestring.ngfactory.d.ts} +0 -0
  140. /package/{validation/minlength.validator.ngfactory.d.ts → controls/list/dropdownoptions.ngfactory.d.ts} +0 -0
@@ -1,322 +1,367 @@
1
- import { ContentChild, Directive, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
1
+ import { SacBaseModelControl } from '../../common/basemodelcontrol';
2
+ import { Validation } from '../../validation';
3
+ import { SacFormLayoutCommon } from '../layout/formlayout';
4
+ import { Directive, EventEmitter, Host, Injector, Input, Output, TemplateRef } from '@angular/core';
2
5
  /**
3
6
  * Basis Komponente für SacTreeView
4
7
  */
5
- export class SacTreeViewCommon {
6
- constructor() {
8
+ export class SacTreeviewCommon extends SacBaseModelControl {
9
+ // #endregion Properties
10
+ // #region Constructors
11
+ /**
12
+ * Constructor
13
+ * @param injector Service Injector
14
+ */
15
+ constructor(formlayout, injector) {
16
+ super(formlayout, injector);
17
+ // #region Properties
7
18
  /**
8
- * Das Property enthielt array of nodes. Default value: empty array [].
19
+ * Event when Action is clicked on Node. An object of the type 'TreeviewAction' is returned. In the default case, 'action' in this object is always the value 'default'. The value can be changed via the 'templateaction'.
9
20
  */
10
- this.nodes = [];
21
+ this.actionclicked = new EventEmitter();
11
22
  /**
12
- * Das Property enthielt node attribute: 'isCollapsed'. Es wird benutzt beim rendering. Für Expand/Collapsed Sicht des Node(Wert)
23
+ * Property on the data object that contains the children of the structure element. Must be an array of objects. The default value is 'children'
13
24
  */
14
- this.collapseAttr = 'isCollapsed';
25
+ this.attrchildren = 'children';
15
26
  /**
16
- * Das Property enthielt node attribute: 'isSelected'. Es wird benutzt beim Vorbereitung des Data des TreeView
27
+ * Defines the property on the 'data' object with which the actions for a node can be deactivated. A 'disabled' property is used by default.
17
28
  */
18
- this.selectAttr = 'isSelected';
29
+ this.attrdisableaction = 'disabled';
19
30
  /**
20
- * Das Property enthielt node attribute: 'isIndeterminate'. Es wird benutzt beim Vorbereitung des Data des TreeView
31
+ * Property on the 'data' object that stores the expanded state. Property must be of type boolean. Default is 'expanded'
21
32
  */
22
- this.inDeterminateAttr = 'isIndeterminate';
33
+ this.attrexanded = 'expanded';
23
34
  /**
24
- * Providen data for tree.
35
+ * Property for saving the HoverState on the field. If the property is not present on the node, it is automatically created and removed again. The value can usually be left at the default value unless there is a conflict with a property on the node that is required for other purposes.
25
36
  */
26
- this._data = [];
37
+ this.attrhoverstate = 'hoverstate';
27
38
  /**
28
- * Input property für den Namen des TreeView. Type string. Default value: ""
39
+ * Property on 'data' object, which contains the icon for the node. By default, the property is not set, which hides the icon in the node.
29
40
  */
30
- this.name = '';
41
+ this.attricon = null;
31
42
  /**
32
- * A flag indicating data is flatten in array and prepare is required.(Default
33
- * is false).
43
+ * property on the 'data' object contains an ID of the node. The default is 'id'. If the property is set to NULL, the selectedId event is no longer triggered.
34
44
  */
35
- this.prepareData = false;
45
+ this.attrid = 'id';
36
46
  /**
37
- * Attribute for Text in Tree
47
+ * Property on 'data' object, which contains the label for the node. Default is 'label'
38
48
  */
39
- this.textAttr = 'data';
49
+ this.attrlabel = 'label';
40
50
  /**
41
- * Name of ID property in input data.
51
+ * Property on 'data' object, which defines whether the node is selected or not. It should be ensured that only 1 node has the value for Selected set to true. Default is 'selected'.
42
52
  */
43
- this.idAttr = 'id';
53
+ this.attrselected = 'selected';
44
54
  /**
45
- * Name of parent property in input data.
55
+ * Event when a node is collapsed. Returns the node element as a parameter
46
56
  */
47
- this.parentAttr = 'PARENT_ID';
57
+ this.collabsed = new EventEmitter();
48
58
  /**
49
- * Name of children list property in input data.
59
+ * The property contains an array of nodes. The data must already map the tree via child properties.
50
60
  */
51
- this.childrenAttr = 'children';
61
+ this.data = [];
52
62
  /**
53
- * Output Emitter. Emit das ID des selected Node.
63
+ * Activates the 'expand' and 'collabse' event even if a node has no children. This is helpful if node elements are to be reloaded at runtime.
54
64
  */
55
- this.selectedidchange = new EventEmitter();
65
+ this.enableasynchload = false;
56
66
  /**
57
- * Output Emitter. Emit das TextAttr des selected Node.
67
+ * Activates Ellipsis on the node labels
58
68
  */
59
- this.selectedtextchanged = new EventEmitter();
69
+ this.enableellipsis = true;
60
70
  /**
61
- * Output Emitter. Emit wenn ein Node selektiert wird.
71
+ * Event when a node is expanded. Returns the node element as a parameter
62
72
  */
63
- this.selecteditem = new EventEmitter();
64
- }
65
- /**
66
- * Getter für Data des TreeView
67
- */
68
- get data() {
69
- return this._data;
73
+ this.expanded = new EventEmitter();
74
+ /**
75
+ * Defines whether an icon for the expanded/collapsed status should be displayed.
76
+ */
77
+ this.expandedstate = true;
78
+ /**
79
+ * A node must be selected
80
+ */
81
+ this.isrequired = false;
82
+ /**
83
+ * Name of the TreeView control
84
+ */
85
+ this.name = '';
86
+ /**
87
+ * Event when a node is selected. Returns the id attribute as a parameter. The event is not triggered if 'attrid' is not set.
88
+ */
89
+ this.selected = new EventEmitter();
90
+ /**
91
+ * Event when a node is selected. Returns the node element as a parameter.
92
+ */
93
+ this.selectednode = new EventEmitter();
94
+ /**
95
+ * Resource Key für Validation Message Required bei Control
96
+ */
97
+ this.validationmessagerequired = this.validationKeyService.ValidationErrorRequired;
98
+ /**
99
+ * Resource Key für Validation Message Required in Validation Summary
100
+ */
101
+ this.validationmessagesummaryrequired = this.validationKeyService.ValidationErrorSummaryRequired;
70
102
  }
71
- /**
72
- * Input Property für Data des TreeView
73
- */
74
- set data(value) {
75
- this._data = value;
76
- this.nodes = value;
77
- // this.nodes.forEach(node => node["typeId"] = "13")
78
- this.LoadTree();
79
- if (this._collapseAll !== undefined) {
80
- this.collapseAllNode(this._collapseAll);
81
- }
103
+ // #endregion Constructors
104
+ // #region Public Getters And Setters
105
+ get iconAction() {
106
+ return this.iconService.TreeviewNodeActionIcon;
82
107
  }
83
108
  /**
84
- * Die Directive erhält die actions für das TreeView
109
+ * CSS icon for folders in tree there are collabsed
110
+ * @returns css class with icon
85
111
  */
86
- set treeviewTemplate(v) {
87
- this.template = v;
112
+ get iconFolderCollabsed() {
113
+ return this.iconService.TreeviewNodeClosedIcon;
88
114
  }
89
115
  /**
90
- * Getter für das TreeView Template
116
+ * CSS icon class for folders without subfolders
117
+ * @returns css class with icon
91
118
  */
92
- get treeviewTemplate() {
93
- return this.template;
119
+ get iconFolderEmpty() {
120
+ return this.iconService.TreeviewNodeEmptyIcon;
94
121
  }
95
122
  /**
96
- * Setter property. Deffiniert das FileIcon für das TreeView
123
+ * CSS icon for folders in tree there are expanded
124
+ * @returns css class with icon
97
125
  */
98
- set treefileicon(v) {
99
- this.fileicontemplate = v;
126
+ get iconFolderOpen() {
127
+ return this.iconService.TreeviewNodeOpenIcon;
100
128
  }
129
+ // #endregion Public Getters And Setters
130
+ // #region Public Methods
101
131
  /**
102
- * Getter property. Ergibt das FileIcon für das TreeView
132
+ * Creates an array of a certain size. Is required for a For in the UI, as Angular does not support counting loops
133
+ * @param size Size of the array
134
+ * @returns Array
103
135
  */
104
- get treefileicon() {
105
- return this.fileicontemplate;
136
+ count(size) {
137
+ return new Array(size);
106
138
  }
107
- // @Input("titleAction") _titleAction: string
108
- /**
109
- * Collapse or expand all parent nodes.
110
- */
111
- set collapseall(value) {
112
- this._collapseAll = value;
113
- if (this.nodes && this.nodes.length && this.nodes.length > 0) {
114
- this.collapseAllNode(this._collapseAll);
139
+ getChildren(node) {
140
+ if (!node || !this.attrchildren) {
141
+ return [];
142
+ }
143
+ let children = node[this.attrchildren];
144
+ if (!Array.isArray(children)) {
145
+ return [];
115
146
  }
116
- // this._recursiveEdit(
117
- // this.nodes, this.childrenAttr, this.collapseAttr, this._collapseAll);
118
- // this.cd.detectChanges();
147
+ return children;
119
148
  }
120
- /**
121
- * Getter für das collapse property. Ergibt boolean Wert, ob die Items collapsed/expand sind.
122
- */
123
- get collapseall() {
124
- return this._collapseAll;
149
+ getStringField(node, fieldname) {
150
+ if (!node) {
151
+ return '';
152
+ }
153
+ if (!fieldname) {
154
+ return node;
155
+ }
156
+ let value = node[fieldname];
157
+ if (!value) {
158
+ return '';
159
+ }
160
+ return value;
125
161
  }
126
- /**
127
- * Select or deselect all nodes.
128
- */
129
- set selectall(value) {
130
- this._selectAll = value;
131
- this._recursiveEdit(this.nodes, this.childrenAttr, this.selectAttr, value);
132
- this._recursiveEdit(this.nodes, this.childrenAttr, this.inDeterminateAttr, false);
162
+ hasChildren(node) {
163
+ return this.getChildren(node).length > 0;
133
164
  }
134
- /**
135
- * Input property - setter. Deffiniert das ID des selektierten Item(node)
136
- */
137
- set selectedid(v) {
138
- this.selectedNode = this.findNode(this.nodes, v, this.idAttr);
139
- // if (this.selectedNode) {
140
- // this.selectedIdEmitter.emit(this.selectedNode[this.idAttr]);
141
- // this.selectedTextEmitter.emit(this.selectedNode[this.textAttr]);
142
- // }
165
+ isDisabledState(node) {
166
+ if (!node || !this.attrdisableaction) {
167
+ return false;
168
+ }
169
+ let value = node[this.attrdisableaction];
170
+ return value === true || value === 'true';
143
171
  }
144
- /**
145
- * Getter. Ergibt das ID des selektierten Item(node)
146
- */
147
- get selectedId() {
148
- return this.selectedNode ? this.selectedNode[this.idAttr] : null;
172
+ isExpandedState(node) {
173
+ if (!node || !this.attrexanded) {
174
+ return false;
175
+ }
176
+ let value = node[this.attrexanded];
177
+ return value === true || value === 'true';
149
178
  }
150
- /**
151
- * Setter für das selektierte Wert(node). Wenn aufgerufen das ID und TextAttr des selected Node wird emitted
152
- */
153
- set selectedNode(v) {
154
- this._selectedNode = v;
155
- if (this._selectedNode) {
156
- this.selectedidchange.emit(this.selectedId);
157
- this.selectedtextchanged.emit(v[this.textAttr]);
179
+ isHoverState(node) {
180
+ if (!node || !this.attrhoverstate) {
181
+ return false;
158
182
  }
183
+ let value = node[this.attrhoverstate];
184
+ return value === true || value === 'true';
159
185
  }
160
- /**
161
- * Getter für das selektierte Wert(node). Ergibt das selektierte Wert(node).
162
- */
163
- get selectedNode() {
164
- return this._selectedNode;
186
+ isSelectedState(node) {
187
+ if (!node || !this.attrselected) {
188
+ return false;
189
+ }
190
+ let value = node[this.attrselected];
191
+ return value === true || value === 'true';
165
192
  }
166
193
  /**
167
- * A lifecycle hook that is called after Angular has initialized all data-bound properties of a directive.
168
- * Define an ngOnInit() method to handle any additional initialization tasks.
194
+ * Method is called by clicking an action
195
+ * @param action action and node
169
196
  */
170
- ngOnInit() {
171
- this.collapseAllNode(this._collapseAll);
172
- if (this.selectedId)
173
- this.openSelectedNode(this.nodes);
197
+ onActionClicked(action) {
198
+ this.actionclicked.emit(action);
174
199
  }
175
200
  /**
176
- * Funktion setzt alle parent items recusiv zum selected node
177
- * auf collapsed = false
201
+ * Method is called when Node in Tree is clicked
202
+ * @param node Selected Node
178
203
  */
179
- openSelectedNode(data) {
180
- let result = false;
181
- for (let i = 0; i < data.length; i++) {
182
- if (data[i][this.childrenAttr].length &&
183
- data[i][this.idAttr] != this.selectedId)
184
- result = this.openSelectedNode(data[i][this.childrenAttr]);
185
- if (result || data[i][this.idAttr] == this.selectedId) {
186
- data[i][this.collapseAttr] = false;
187
- return true;
188
- }
204
+ onNodeClicked(node) {
205
+ if (this.isDisabledState(node) || this.isSelectedState(node)) {
206
+ this.invertExpandedState(node);
189
207
  }
190
- return false;
208
+ this.setSelectedState(node);
191
209
  }
192
210
  /**
193
- * Die Methode vorbereitet die Daten für das TreeView. Die Funktion sollte geändert werden abhängig von dem kommenden Daten (wenn array)
211
+ * Sets the hover state on a node
212
+ * @param node Node on which the status is set
213
+ * @param state Activate or deactivate HoverState
194
214
  */
195
- LoadTree() {
196
- //if the tree structure require array the function below should be changed
197
- const cloned = this._data.map((x) => Object.assign({}, x));
198
- // If data is flat, prepare data with recursive function.
199
- this.nodes = this.prepareData ? this._getPreparedData(cloned) : this._data;
200
- }
201
- /**
202
- * Die Methode collapse/expand den selectierten Node
203
- */
204
- onCollapseClick(node) {
205
- if (node[this.childrenAttr].length) {
206
- node[this.collapseAttr] = !node[this.collapseAttr];
215
+ setHoverState(node, state) {
216
+ if (!node || !this.attrhoverstate) {
217
+ return;
218
+ }
219
+ if (state) {
220
+ node[this.attrhoverstate] = true;
221
+ return;
207
222
  }
223
+ if (!node.hasOwnProperty(this.attrhoverstate)) {
224
+ return;
225
+ }
226
+ delete node[this.attrhoverstate];
208
227
  }
209
228
  /**
210
- * Die Methode set den selektierten Node und emit es.
229
+ * Sets the selected state on a node
230
+ * @param node Node which is marked as Selected
211
231
  */
212
- onClick(node) {
213
- this.selectedNode = node;
214
- this.selecteditem.emit(this.selectedNode);
215
- // this.cd.detectChanges();
232
+ setSelectedState(node) {
233
+ if (!node || !this.attrselected) {
234
+ return;
235
+ }
236
+ // reset selected state of any node
237
+ this.data.forEach((rootNode) => this.resetSelectedState(rootNode));
238
+ // set selected node as selected
239
+ node[this.attrselected] = true;
240
+ // Extract ID from Node
241
+ const idValue = node[this.attrid];
242
+ // Update ngModel
243
+ this.setValue(idValue);
244
+ // Raise Selected Events
245
+ this.selectednode.emit(node);
246
+ if (!this.attrid) {
247
+ return;
248
+ }
249
+ let id = this.getStringField(node, this.attrid);
250
+ this.selected.emit(id);
216
251
  }
217
252
  /**
218
- * Die Methode wird ein event mit Meldung zu Parent emit-en.
253
+ * Validates the model state of the control
254
+ * @param c Control instance
255
+ * @returns Returns a validation error, if present. Otherwise, as Result is NULL
219
256
  */
220
- sendMsgToParent(msg) {
221
- this.selecteditem.emit(msg);
257
+ validateData(c) {
258
+ let error = null;
259
+ if (this.isrequired) {
260
+ error = Validation.required(this.validationmessagerequired, this.validationmessagesummaryrequired)(c);
261
+ }
262
+ return error;
222
263
  }
223
264
  /**
224
- * Die Methode wird alle Nodes collapse
265
+ * Saves the data from the model binding
266
+ * @param value Id of the selected node
225
267
  */
226
- collapseAllNode(command) {
227
- this.nodes.forEach((node) => {
228
- if (node[this.childrenAttr].length) {
229
- collapseAllHIdden(node, this.collapseAttr, command, this.childrenAttr);
268
+ writeValue(value) {
269
+ super.writeValue(value);
270
+ // Do not preselct item when tree is empty
271
+ if (!this.data) {
272
+ return;
273
+ }
274
+ this.data.forEach((root) => {
275
+ const result = this.findNodeById(root, value);
276
+ if (result !== null) {
277
+ this.setSelectedState(result);
230
278
  }
231
279
  });
232
- function collapseAllHIdden(node, collapseAttr, command, childrenAttr) {
233
- node[collapseAttr] = command;
234
- node.children.forEach((child) => {
235
- if (child[childrenAttr].length) {
236
- collapseAllHIdden(child, collapseAttr, command, childrenAttr);
237
- }
238
- });
239
- }
240
280
  }
281
+ // #endregion Public Methods
282
+ // #region Private Methods
241
283
  /**
242
- * Funktion gibt node aus der liste zurück, welches das Value auf dem gewünschten Attribut hat
243
- * Wenn node nicht gefunden wird, wird null zurück gegeben
244
- * @param data Liste der nodes
245
- * @param searchValue Das gesuchte value
246
- * @param attr Der namen des Attributs auf dem das value gesucht wird
284
+ * Searches for a node based on the value in the ID attribute
285
+ * @param node Node
286
+ * @param value Value of the Id attribute
287
+ * @returns Returns the node if it is found. If not, NULL is returned.
247
288
  */
248
- findNode(data, searchValue, attr) {
249
- let result = null;
250
- for (let i = 0; i < data.length; i++) {
251
- if (data[i][attr] == searchValue)
252
- result = data[i];
253
- else {
254
- if (data[i][this.childrenAttr].length) {
255
- let recursiveResult = this.findNode(data[i][this.childrenAttr], searchValue, attr);
256
- if (recursiveResult)
257
- result = recursiveResult;
258
- }
259
- }
289
+ findNodeById(node, value) {
290
+ if (!this.attrid || !node) {
291
+ return null;
260
292
  }
261
- return result;
262
- }
263
- /**
264
- * Die Methode editiert (recursive) alle eingegebene Nodes abhängig von gegebenen Attibute und Value Kriterien.
265
- */
266
- _recursiveEdit(list, childrenAttr, attr, value) {
267
- if (Array.isArray(list)) {
268
- for (let i = 0, len = list.length; i < len; i++) {
269
- list[i][attr] = value;
270
- if (list[i][childrenAttr].length) {
271
- this._recursiveEdit(list[i][childrenAttr], childrenAttr, attr, value);
272
- }
293
+ if (node[this.attrid] === value) {
294
+ return node;
295
+ }
296
+ const children = this.getChildren(node);
297
+ for (let child of children) {
298
+ const result = this.findNodeById(child, value);
299
+ if (result !== null) {
300
+ return result;
273
301
  }
274
302
  }
303
+ return null;
275
304
  }
276
- /**
277
- * Die Methode erstellt eine standarte Sicht-Liste von Nodes
278
- */
279
- _getPreparedData(list) {
280
- const tree = [], lookup = {};
281
- for (let i = 0, len = list.length; i < len; i++) {
282
- lookup[list[i][this.idAttr]] = list[i];
283
- list[i][this.childrenAttr] = [];
284
- list[i][this.collapseAttr] = true;
285
- list[i][this.selectAttr] = false;
286
- list[i][this.inDeterminateAttr] = false;
305
+ invertExpandedState(node) {
306
+ if (!node || !this.attrexanded) {
307
+ return;
287
308
  }
288
- for (let i = 0, len = list.length; i < len; i++) {
289
- if (list[i][this.parentAttr]) {
290
- lookup[list[i][this.parentAttr]][this.childrenAttr].push(list[i]);
291
- }
292
- else {
293
- tree.push(list[i]);
294
- }
309
+ // Items with no children cannot be collabsed
310
+ if (!this.hasChildren(node) && !(this.enableasynchload === true || this.enableasynchload === 'true')) {
311
+ return;
312
+ }
313
+ let value = node[this.attrexanded];
314
+ if (value === true || value === 'true') {
315
+ this.collabsed.emit(node);
316
+ node[this.attrexanded] = false;
317
+ }
318
+ else {
319
+ this.expanded.emit(node);
320
+ node[this.attrexanded] = true;
295
321
  }
296
- return tree;
322
+ }
323
+ resetSelectedState(node) {
324
+ if (!node || !this.attrselected) {
325
+ return;
326
+ }
327
+ node[this.attrselected] = false;
328
+ this.getChildren(node).forEach((child) => {
329
+ this.resetSelectedState(child);
330
+ });
297
331
  }
298
332
  }
299
- SacTreeViewCommon.decorators = [
333
+ SacTreeviewCommon.decorators = [
300
334
  { type: Directive }
301
335
  ];
302
- SacTreeViewCommon.propDecorators = {
336
+ SacTreeviewCommon.ctorParameters = () => [
337
+ { type: SacFormLayoutCommon, decorators: [{ type: Host }] },
338
+ { type: Injector }
339
+ ];
340
+ SacTreeviewCommon.propDecorators = {
341
+ actionclicked: [{ type: Output }],
342
+ attrchildren: [{ type: Input }],
343
+ attrdisableaction: [{ type: Input }],
344
+ attrexanded: [{ type: Input }],
345
+ attrhoverstate: [{ type: Input }],
346
+ attricon: [{ type: Input }],
347
+ attrid: [{ type: Input }],
348
+ attrlabel: [{ type: Input }],
349
+ attrselected: [{ type: Input }],
350
+ collabsed: [{ type: Output }],
303
351
  data: [{ type: Input }],
304
- template: [{ type: Input }],
305
- treeviewTemplate: [{ type: ContentChild, args: ['actions', { static: true },] }],
306
- fileicontemplate: [{ type: Input }],
307
- treefileicon: [{ type: ContentChild, args: ['treefileicon', { static: true },] }],
352
+ enableasynchload: [{ type: Input }],
353
+ enableellipsis: [{ type: Input }],
354
+ expanded: [{ type: Output }],
355
+ expandedstate: [{ type: Input }],
356
+ isrequired: [{ type: Input }],
308
357
  name: [{ type: Input }],
309
- prepareData: [{ type: Input }],
310
- textAttr: [{ type: Input }],
311
- idAttr: [{ type: Input }],
312
- parentAttr: [{ type: Input }],
313
- childrenAttr: [{ type: Input }],
314
- title: [{ type: Input }],
315
- collapseall: [{ type: Input }],
316
- selectall: [{ type: Input }],
317
- selectedid: [{ type: Input }],
318
- selectedidchange: [{ type: Output }],
319
- selectedtextchanged: [{ type: Output }],
320
- selecteditem: [{ type: Output }]
358
+ selected: [{ type: Output }],
359
+ selectednode: [{ type: Output }],
360
+ showactionalways: [{ type: Input }],
361
+ templateaction: [{ type: Input }],
362
+ templateicon: [{ type: Input }],
363
+ templatelabel: [{ type: Input }],
364
+ validationmessagerequired: [{ type: Input }],
365
+ validationmessagesummaryrequired: [{ type: Input }]
321
366
  };
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZXZpZXcuanMiLCJzb3VyY2VSb290IjoiQzovUHJvamVrdGUvc2ltcGxlYW5ndWxhcmNvbnRyb2xzLW5nMTAvY2guam5ldHdvcmsuc2FjLWNvbnRyb2xzL3Byb2plY3RzL3NhYy1jb21tb24vc3JjLyIsInNvdXJjZXMiOlsiY29udHJvbHMvdHJlZXZpZXcvdHJlZXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCOztHQUVHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUQ5QjtRQVlFOztXQUVHO1FBQ0ksVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUV6Qjs7V0FFRztRQUNJLGlCQUFZLEdBQUcsYUFBYSxDQUFDO1FBRXBDOztXQUVHO1FBQ0ksZUFBVSxHQUFHLFlBQVksQ0FBQztRQUVqQzs7V0FFRztRQUNJLHNCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBRTdDOztXQUVHO1FBQ0ssVUFBSyxHQUFVLEVBQUUsQ0FBQztRQW9FMUI7O1dBRUc7UUFFSCxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBRWxCOzs7V0FHRztRQUNNLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRTdCOztXQUVHO1FBQ00sYUFBUSxHQUFHLE1BQU0sQ0FBQztRQUUzQjs7V0FFRztRQUNNLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFFdkI7O1dBRUc7UUFDTSxlQUFVLEdBQUcsV0FBVyxDQUFDO1FBRWxDOztXQUVHO1FBQ00saUJBQVksR0FBRyxVQUFVLENBQUM7UUEyRm5DOztXQUVHO1FBRUgscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFOUQ7O1dBRUc7UUFFSCx3QkFBbUIsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV2RTs7V0FFRztRQUVILGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7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Q29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbnRlbnRDaGlsZCxcclxuICBEaXJlY3RpdmUsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKipcclxuICogQmFzaXMgS29tcG9uZW50ZSBmw7xyIFNhY1RyZWVWaWV3XHJcbiAqL1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGNsYXNzIFNhY1RyZWVWaWV3Q29tbW9uIGltcGxlbWVudHMgT25Jbml0IHtcclxuICAvKipcclxuICAgKiBEYXMgUHJvcGVydHkgZW50aGllbHQgYm9vbGVhbiBXZXJ0IHVuZCBkZWZmaW5pZXJ0LCBvYiBhbGxlIEl0ZW1zIGNvbGxhcHNlZCBzaW5kLiBEZWZhdWx0IHZhbHVlOiB1bmRlZmluZWQvbnVsbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBfY29sbGFwc2VBbGw6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIERhcyBQcm9wZXJ0eSBlbnRoaWVsdCBib29sZWFuIFdlcnQgdW5kIGRlZmZpbmllcnQsIG9iIGFsbGUgSXRlbXMgc2VsZWN0ZWQgc2luZC4gRGVmYXVsdCB2YWx1ZTogdW5kZWZpbmVkL251bGxcclxuICAgKi9cclxuICBwcml2YXRlIF9zZWxlY3RBbGw6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIERhcyBQcm9wZXJ0eSBlbnRoaWVsdCBhcnJheSBvZiBub2Rlcy4gRGVmYXVsdCB2YWx1ZTogZW1wdHkgYXJyYXkgW10uXHJcbiAgICovXHJcbiAgcHVibGljIG5vZGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBEYXMgUHJvcGVydHkgZW50aGllbHQgbm9kZSBhdHRyaWJ1dGU6ICdpc0NvbGxhcHNlZCcuIEVzIHdpcmQgYmVudXR6dCBiZWltIHJlbmRlcmluZy4gRsO8ciBFeHBhbmQvQ29sbGFwc2VkIFNpY2h0IGRlcyBOb2RlKFdlcnQpXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlQXR0ciA9ICdpc0NvbGxhcHNlZCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhcyBQcm9wZXJ0eSBlbnRoaWVsdCBub2RlIGF0dHJpYnV0ZTogJ2lzU2VsZWN0ZWQnLiBFcyB3aXJkIGJlbnV0enQgYmVpbSBWb3JiZXJlaXR1bmcgZGVzIERhdGEgZGVzIFRyZWVWaWV3XHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdEF0dHIgPSAnaXNTZWxlY3RlZCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhcyBQcm9wZXJ0eSBlbnRoaWVsdCBub2RlIGF0dHJpYnV0ZTogJ2lzSW5kZXRlcm1pbmF0ZScuIEVzIHdpcmQgYmVudXR6dCBiZWltIFZvcmJlcmVpdHVuZyBkZXMgRGF0YSBkZXMgVHJlZVZpZXdcclxuICAgKi9cclxuICBwdWJsaWMgaW5EZXRlcm1pbmF0ZUF0dHIgPSAnaXNJbmRldGVybWluYXRlJztcclxuXHJcbiAgLyoqXHJcbiAgICogUHJvdmlkZW4gZGF0YSBmb3IgdHJlZS5cclxuICAgKi9cclxuICBwcml2YXRlIF9kYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBHZXR0ZXIgZsO8ciBEYXRhIGRlcyBUcmVlVmlld1xyXG4gICAqL1xyXG4gIGdldCBkYXRhKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5wdXQgUHJvcGVydHkgZsO8ciBEYXRhIGRlcyBUcmVlVmlld1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRhdGEodmFsdWU6IGFueVtdKSB7XHJcbiAgICB0aGlzLl9kYXRhID0gdmFsdWU7XHJcbiAgICB0aGlzLm5vZGVzID0gdmFsdWU7XHJcblxyXG4gICAgLy8gdGhpcy5ub2Rlcy5mb3JFYWNoKG5vZGUgPT4gbm9kZVtcInR5cGVJZFwiXSA9IFwiMTNcIilcclxuXHJcbiAgICB0aGlzLkxvYWRUcmVlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2NvbGxhcHNlQWxsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZUFsbE5vZGUodGhpcy5fY29sbGFwc2VBbGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5wdXQgUHJvcGVydHkgZsO8ciB0ZW1wbGF0ZSBkZXMgVHJlZVZpZXcuIFR5cGU6IFRlbXBsYXRlUmVmPGFueT4uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqXHJcbiAgICogRGllIERpcmVjdGl2ZSBlcmjDpGx0IGRpZSBhY3Rpb25zIGbDvHIgZGFzIFRyZWVWaWV3XHJcbiAgICovXHJcbiAgQENvbnRlbnRDaGlsZCgnYWN0aW9ucycsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHVibGljIHNldCB0cmVldmlld1RlbXBsYXRlKHY6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgIHRoaXMudGVtcGxhdGUgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0dGVyIGbDvHIgZGFzIFRyZWVWaWV3IFRlbXBsYXRlXHJcbiAgICovXHJcbiAgcHVibGljIGdldCB0cmVldmlld1RlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnB1dCBwcm9wZXJ0eSBlcmjDpGx0IEljb24gZsO8ciBkYXMgVGVtcGxhdGVcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGZpbGVpY29udGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHRlciBwcm9wZXJ0eS4gRGVmZmluaWVydCBkYXMgRmlsZUljb24gZsO8ciBkYXMgVHJlZVZpZXdcclxuICAgKi9cclxuICBAQ29udGVudENoaWxkKCd0cmVlZmlsZWljb24nLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHB1YmxpYyBzZXQgdHJlZWZpbGVpY29uKHY6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgIHRoaXMuZmlsZWljb250ZW1wbGF0ZSA9IHY7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXR0ZXIgcHJvcGVydHkuIEVyZ2lidCBkYXMgRmlsZUljb24gZsO8ciBkYXMgVHJlZVZpZXdcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IHRyZWVmaWxlaWNvbigpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbGVpY29udGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnB1dCBwcm9wZXJ0eSBmw7xyIGRlbiBOYW1lbiBkZXMgVHJlZVZpZXcuIFR5cGUgc3RyaW5nLiBEZWZhdWx0IHZhbHVlOiBcIlwiXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBuYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQSBmbGFnIGluZGljYXRpbmcgZGF0YSBpcyBmbGF0dGVuIGluIGFycmF5IGFuZCBwcmVwYXJlIGlzIHJlcXVpcmVkLihEZWZhdWx0XHJcbiAgICogaXMgZmFsc2UpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHByZXBhcmVEYXRhID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dHJpYnV0ZSBmb3IgVGV4dCBpbiBUcmVlXHJcbiAgICovXHJcbiAgQElucHV0KCkgdGV4dEF0dHIgPSAnZGF0YSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hbWUgb2YgSUQgcHJvcGVydHkgaW4gaW5wdXQgZGF0YS5cclxuICAgKi9cclxuICBASW5wdXQoKSBpZEF0dHIgPSAnaWQnO1xyXG5cclxuICAvKipcclxuICAgKiBOYW1lIG9mIHBhcmVudCBwcm9wZXJ0eSBpbiBpbnB1dCBkYXRhLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBhcmVudEF0dHIgPSAnUEFSRU5UX0lEJztcclxuXHJcbiAgLyoqXHJcbiAgICogTmFtZSBvZiBjaGlsZHJlbiBsaXN0IHByb3BlcnR5IGluIGlucHV0IGRhdGEuXHJcbiAgICovXHJcbiAgQElucHV0KCkgY2hpbGRyZW5BdHRyID0gJ2NoaWxkcmVuJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGl0bGUgZGVzIFRyZWV2aWV3XHJcbiAgICovXHJcbiAgQElucHV0KCkgdGl0bGU7XHJcblxyXG4gIC8vIEBJbnB1dChcInRpdGxlQWN0aW9uXCIpIF90aXRsZUFjdGlvbjogc3RyaW5nXHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxhcHNlIG9yIGV4cGFuZCBhbGwgcGFyZW50IG5vZGVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNvbGxhcHNlYWxsKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9jb2xsYXBzZUFsbCA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMubm9kZXMgJiYgdGhpcy5ub2Rlcy5sZW5ndGggJiYgdGhpcy5ub2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuY29sbGFwc2VBbGxOb2RlKHRoaXMuX2NvbGxhcHNlQWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGlzLl9yZWN1cnNpdmVFZGl0KFxyXG4gICAgLy8gICB0aGlzLm5vZGVzLCB0aGlzLmNoaWxkcmVuQXR0ciwgdGhpcy5jb2xsYXBzZUF0dHIsIHRoaXMuX2NvbGxhcHNlQWxsKTtcclxuXHJcbiAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHRlciBmw7xyIGRhcyBjb2xsYXBzZSBwcm9wZXJ0eS4gRXJnaWJ0IGJvb2xlYW4gV2VydCwgb2IgZGllIEl0ZW1zIGNvbGxhcHNlZC9leHBhbmQgc2luZC5cclxuICAgKi9cclxuICBnZXQgY29sbGFwc2VhbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sbGFwc2VBbGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZWxlY3Qgb3IgZGVzZWxlY3QgYWxsIG5vZGVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNlbGVjdGFsbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2VsZWN0QWxsID0gdmFsdWU7XHJcbiAgICB0aGlzLl9yZWN1cnNpdmVFZGl0KHRoaXMubm9kZXMsIHRoaXMuY2hpbGRyZW5BdHRyLCB0aGlzLnNlbGVjdEF0dHIsIHZhbHVlKTtcclxuICAgIHRoaXMuX3JlY3Vyc2l2ZUVkaXQoXHJcbiAgICAgIHRoaXMubm9kZXMsXHJcbiAgICAgIHRoaXMuY2hpbGRyZW5BdHRyLFxyXG4gICAgICB0aGlzLmluRGV0ZXJtaW5hdGVBdHRyLFxyXG4gICAgICBmYWxzZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElucHV0IHByb3BlcnR5IC0gc2V0dGVyLiBEZWZmaW5pZXJ0IGRhcyBJRCBkZXMgc2VsZWt0aWVydGVuIEl0ZW0obm9kZSlcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzZWxlY3RlZGlkKHY6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZE5vZGUgPSB0aGlzLmZpbmROb2RlKHRoaXMubm9kZXMsIHYsIHRoaXMuaWRBdHRyKTtcclxuXHJcbiAgICAvLyBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHtcclxuICAgIC8vICAgdGhpcy5zZWxlY3RlZElkRW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0ZWROb2RlW3RoaXMuaWRBdHRyXSk7XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWRUZXh0RW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0ZWROb2RlW3RoaXMudGV4dEF0dHJdKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHRlci4gRXJnaWJ0IGRhcyBJRCBkZXMgc2VsZWt0aWVydGVuIEl0ZW0obm9kZSlcclxuICAgKi9cclxuICBnZXQgc2VsZWN0ZWRJZCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlID8gdGhpcy5zZWxlY3RlZE5vZGVbdGhpcy5pZEF0dHJdIDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhcyBQcm9wZXJ0eSBlcmjDpGx0IGRhcyBzZWxla3RpZXJ0ZSBXZXJ0KG5vZGUpLiBEZWZhdWx0IHZhbHVlOiB1bmRlZmluZWQvbnVsbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3NlbGVjdGVkTm9kZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dGVyIGbDvHIgZGFzIHNlbGVrdGllcnRlIFdlcnQobm9kZSkuIFdlbm4gYXVmZ2VydWZlbiBkYXMgSUQgdW5kIFRleHRBdHRyIGRlcyBzZWxlY3RlZCBOb2RlIHdpcmQgZW1pdHRlZFxyXG4gICAqL1xyXG4gIHNldCBzZWxlY3RlZE5vZGUodjogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZE5vZGUgPSB2O1xyXG5cclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE5vZGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZGlkY2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZElkKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZHRleHRjaGFuZ2VkLmVtaXQodlt0aGlzLnRleHRBdHRyXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXR0ZXIgZsO8ciBkYXMgc2VsZWt0aWVydGUgV2VydChub2RlKS4gRXJnaWJ0IGRhcyBzZWxla3RpZXJ0ZSBXZXJ0KG5vZGUpLlxyXG4gICAqL1xyXG4gIGdldCBzZWxlY3RlZE5vZGUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZE5vZGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPdXRwdXQgRW1pdHRlci4gRW1pdCBkYXMgSUQgZGVzIHNlbGVjdGVkIE5vZGUuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWRpZGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogT3V0cHV0IEVtaXR0ZXIuIEVtaXQgZGFzIFRleHRBdHRyIGRlcyBzZWxlY3RlZCBOb2RlLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkdGV4dGNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE91dHB1dCBFbWl0dGVyLiBFbWl0IHdlbm4gZWluIE5vZGUgc2VsZWt0aWVydCB3aXJkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkaXRlbTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBBbmd1bGFyIGhhcyBpbml0aWFsaXplZCBhbGwgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIG9mIGEgZGlyZWN0aXZlLlxyXG4gICAqIERlZmluZSBhbiBuZ09uSW5pdCgpIG1ldGhvZCB0byBoYW5kbGUgYW55IGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNvbGxhcHNlQWxsTm9kZSh0aGlzLl9jb2xsYXBzZUFsbCk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZCkgdGhpcy5vcGVuU2VsZWN0ZWROb2RlKHRoaXMubm9kZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVua3Rpb24gc2V0enQgYWxsZSBwYXJlbnQgaXRlbXMgcmVjdXNpdiB6dW0gc2VsZWN0ZWQgbm9kZVxyXG4gICAqIGF1ZiBjb2xsYXBzZWQgPSBmYWxzZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgb3BlblNlbGVjdGVkTm9kZShkYXRhKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGRhdGFbaV1bdGhpcy5jaGlsZHJlbkF0dHJdLmxlbmd0aCAmJlxyXG4gICAgICAgIGRhdGFbaV1bdGhpcy5pZEF0dHJdICE9IHRoaXMuc2VsZWN0ZWRJZFxyXG4gICAgICApXHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5vcGVuU2VsZWN0ZWROb2RlKGRhdGFbaV1bdGhpcy5jaGlsZHJlbkF0dHJdKTtcclxuICAgICAgaWYgKHJlc3VsdCB8fCBkYXRhW2ldW3RoaXMuaWRBdHRyXSA9PSB0aGlzLnNlbGVjdGVkSWQpIHtcclxuICAgICAgICBkYXRhW2ldW3RoaXMuY29sbGFwc2VBdHRyXSA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaWUgTWV0aG9kZSB2b3JiZXJlaXRldCBkaWUgRGF0ZW4gZsO8ciBkYXMgVHJlZVZpZXcuIERpZSBGdW5rdGlvbiBzb2xsdGUgZ2XDpG5kZXJ0IHdlcmRlbiBhYmjDpG5naWcgdm9uIGRlbSBrb21tZW5kZW4gRGF0ZW4gKHdlbm4gYXJyYXkpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBMb2FkVHJlZSgpIHtcclxuICAgIC8vaWYgdGhlIHRyZWUgc3RydWN0dXJlIHJlcXVpcmUgYXJyYXkgdGhlIGZ1bmN0aW9uIGJlbG93IHNob3VsZCBiZSBjaGFuZ2VkXHJcbiAgICBjb25zdCBjbG9uZWQgPSB0aGlzLl9kYXRhLm1hcCgoeCkgPT4gT2JqZWN0LmFzc2lnbih7fSwgeCkpO1xyXG5cclxuICAgIC8vIElmIGRhdGEgaXMgZmxhdCwgcHJlcGFyZSBkYXRhIHdpdGggcmVjdXJzaXZlIGZ1bmN0aW9uLlxyXG4gICAgdGhpcy5ub2RlcyA9IHRoaXMucHJlcGFyZURhdGEgPyB0aGlzLl9nZXRQcmVwYXJlZERhdGEoY2xvbmVkKSA6IHRoaXMuX2RhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaWUgTWV0aG9kZSBjb2xsYXBzZS9leHBhbmQgZGVuIHNlbGVjdGllcnRlbiBOb2RlXHJcbiAgICovXHJcbiAgb25Db2xsYXBzZUNsaWNrKG5vZGUpIHtcclxuICAgIGlmIChub2RlW3RoaXMuY2hpbGRyZW5BdHRyXS5sZW5ndGgpIHtcclxuICAgICAgbm9kZVt0aGlzLmNvbGxhcHNlQXR0cl0gPSAhbm9kZVt0aGlzLmNvbGxhcHNlQXR0cl07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaWUgTWV0aG9kZSBzZXQgZGVuIHNlbGVrdGllcnRlbiBOb2RlIHVuZCBlbWl0IGVzLlxyXG4gICAqL1xyXG4gIG9uQ2xpY2sobm9kZSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZE5vZGUgPSBub2RlO1xyXG4gICAgdGhpcy5zZWxlY3RlZGl0ZW0uZW1pdCh0aGlzLnNlbGVjdGVkTm9kZSk7XHJcbiAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpZSBNZXRob2RlIHdpcmQgZWluIGV2ZW50IG1pdCBNZWxkdW5nIHp1IFBhcmVudCBlbWl0LWVuLlxyXG4gICAqL1xyXG4gIHNlbmRNc2dUb1BhcmVudChtc2cpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRpdGVtLmVtaXQobXNnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpZSBNZXRob2RlIHdpcmQgYWxsZSBOb2RlcyBjb2xsYXBzZVxyXG4gICAqL1xyXG4gIGNvbGxhcHNlQWxsTm9kZShjb21tYW5kKSB7XHJcbiAgICB0aGlzLm5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgaWYgKG5vZGVbdGhpcy5jaGlsZHJlbkF0dHJdLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbGxhcHNlQWxsSElkZGVuKG5vZGUsIHRoaXMuY29sbGFwc2VBdHRyLCBjb21tYW5kLCB0aGlzLmNoaWxkcmVuQXR0cik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZnVuY3Rpb24gY29sbGFwc2VBbGxISWRkZW4obm9kZSwgY29sbGFwc2VBdHRyLCBjb21tYW5kLCBjaGlsZHJlbkF0dHIpIHtcclxuICAgICAgbm9kZVtjb2xsYXBzZUF0dHJdID0gY29tbWFuZDtcclxuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGNoaWxkW2NoaWxkcmVuQXR0cl0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBjb2xsYXBzZUFsbEhJZGRlbihjaGlsZCwgY29sbGFwc2VBdHRyLCBjb21tYW5kLCBjaGlsZHJlbkF0dHIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5rdGlvbiBnaWJ0IG5vZGUgYXVzIGRlciBsaXN0ZSB6dXLDvGNrLCB3ZWxjaGVzIGRhcyBWYWx1ZSBhdWYgZGVtIGdld8O8bnNjaHRlbiBBdHRyaWJ1dCBoYXRcclxuICAgKiBXZW5uIG5vZGUgbmljaHQgZ2VmdW5kZW4gd2lyZCwgd2lyZCBudWxsIHp1csO8Y2sgZ2VnZWJlblxyXG4gICAqIEBwYXJhbSBkYXRhIExpc3RlIGRlciBub2Rlc1xyXG4gICAqIEBwYXJhbSBzZWFyY2hWYWx1ZSBEYXMgZ2VzdWNodGUgdmFsdWVcclxuICAgKiBAcGFyYW0gYXR0ciBEZXIgbmFtZW4gZGVzIEF0dHJpYnV0cyBhdWYgZGVtIGRhcyB2YWx1ZSBnZXN1Y2h0IHdpcmRcclxuICAgKi9cclxuICBwcml2YXRlIGZpbmROb2RlKGRhdGEsIHNlYXJjaFZhbHVlLCBhdHRyKTogYW55IHtcclxuICAgIGxldCByZXN1bHQ6IGFueSA9IG51bGw7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGRhdGFbaV1bYXR0cl0gPT0gc2VhcmNoVmFsdWUpIHJlc3VsdCA9IGRhdGFbaV07XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkYXRhW2ldW3RoaXMuY2hpbGRyZW5BdHRyXS5sZW5ndGgpIHtcclxuICAgICAgICAgIGxldCByZWN1cnNpdmVSZXN1bHQgPSB0aGlzLmZpbmROb2RlKFxyXG4gICAgICAgICAgICBkYXRhW2ldW3RoaXMuY2hpbGRyZW5BdHRyXSxcclxuICAgICAgICAgICAgc2VhcmNoVmFsdWUsXHJcbiAgICAgICAgICAgIGF0dHJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAocmVjdXJzaXZlUmVzdWx0KSByZXN1bHQgPSByZWN1cnNpdmVSZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGllIE1ldGhvZGUgZWRpdGllcnQgKHJlY3Vyc2l2ZSkgYWxsZSBlaW5nZWdlYmVuZSBOb2RlcyBhYmjDpG5naWcgdm9uIGdlZ2ViZW5lbiBBdHRpYnV0ZSB1bmQgVmFsdWUgS3JpdGVyaWVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3JlY3Vyc2l2ZUVkaXQobGlzdCwgY2hpbGRyZW5BdHRyLCBhdHRyLCB2YWx1ZSkge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBsaXN0W2ldW2F0dHJdID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKGxpc3RbaV1bY2hpbGRyZW5BdHRyXS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuX3JlY3Vyc2l2ZUVkaXQobGlzdFtpXVtjaGlsZHJlbkF0dHJdLCBjaGlsZHJlbkF0dHIsIGF0dHIsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpZSBNZXRob2RlIGVyc3RlbGx0IGVpbmUgc3RhbmRhcnRlIFNpY2h0LUxpc3RlIHZvbiBOb2Rlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldFByZXBhcmVkRGF0YShsaXN0KSB7XHJcbiAgICBjb25zdCB0cmVlID0gW10sXHJcbiAgICAgIGxvb2t1cCA9IHt9O1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgbG9va3VwW2xpc3RbaV1bdGhpcy5pZEF0dHJdXSA9IGxpc3RbaV07XHJcbiAgICAgIGxpc3RbaV1bdGhpcy5jaGlsZHJlbkF0dHJdID0gW107XHJcbiAgICAgIGxpc3RbaV1bdGhpcy5jb2xsYXBzZUF0dHJdID0gdHJ1ZTtcclxuICAgICAgbGlzdFtpXVt0aGlzLnNlbGVjdEF0dHJdID0gZmFsc2U7XHJcbiAgICAgIGxpc3RbaV1bdGhpcy5pbkRldGVybWluYXRlQXR0cl0gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGlmIChsaXN0W2ldW3RoaXMucGFyZW50QXR0cl0pIHtcclxuICAgICAgICBsb29rdXBbbGlzdFtpXVt0aGlzLnBhcmVudEF0dHJdXVt0aGlzLmNoaWxkcmVuQXR0cl0ucHVzaChsaXN0W2ldKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0cmVlLnB1c2gobGlzdFtpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJlZTtcclxuICB9XHJcbn1cclxuIl19
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZXZpZXcuanMiLCJzb3VyY2VSb290IjoiQzovUHJvamVrdGUvc2ltcGxlYW5ndWxhcmNvbnRyb2xzLW5nMTAvY2guam5ldHdvcmsuc2FjLWNvbnRyb2xzL3Byb2plY3RzL3NhYy1jb21tb24vc3JjLyIsInNvdXJjZXMiOlsiY29udHJvbHMvdHJlZXZpZXcvdHJlZXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHcEc7O0dBRUc7QUFFSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsbUJBQXdCO0lBdUozRCx3QkFBd0I7SUFFeEIsdUJBQXVCO0lBRXZCOzs7T0FHRztJQUNILFlBQW9CLFVBQStCLEVBQUUsUUFBa0I7UUFDbkUsS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQS9KaEMscUJBQXFCO1FBRXJCOztXQUVHO1FBRUksa0JBQWEsR0FBaUMsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFeEY7O1dBRUc7UUFFSSxpQkFBWSxHQUFHLFVBQVUsQ0FBQztRQUVqQzs7V0FFRztRQUNhLHNCQUFpQixHQUFHLFVBQVUsQ0FBQztRQUUvQzs7V0FFRztRQUVJLGdCQUFXLEdBQUcsVUFBVSxDQUFDO1FBRWhDOztXQUVHO1FBRUksbUJBQWMsR0FBRyxZQUFZLENBQUM7UUFFckM7O1dBRUc7UUFFSSxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUV0Qzs7V0FFRztRQUVJLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBRXBDOztXQUVHO1FB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QUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQVM7UUFDaEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDN0IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7WUFwY0osU0FBUzs7O1lBUEQsbUJBQW1CLHVCQXVLWCxJQUFJO1lBdEttQixRQUFROzs7NEJBYTNDLE1BQU07MkJBTU4sS0FBSztnQ0FNTCxLQUFLOzBCQUtMLEtBQUs7NkJBTUwsS0FBSzt1QkFNTCxLQUFLO3FCQU1MLEtBQUs7d0JBTUwsS0FBSzsyQkFNTCxLQUFLO3dCQU1MLE1BQU07bUJBTU4sS0FBSzsrQkFNTCxLQUFLOzZCQU1MLEtBQUs7dUJBTUwsTUFBTTs0QkFNTixLQUFLO3lCQU1MLEtBQUs7bUJBTUwsS0FBSzt1QkFNTCxNQUFNOzJCQU1OLE1BQU07K0JBTU4sS0FBSzs2QkFNTCxLQUFLOzJCQU1MLEtBQUs7NEJBTUwsS0FBSzt3Q0FNTCxLQUFLOytDQUtMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTYWNCYXNlTW9kZWxDb250cm9sIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Jhc2Vtb2RlbGNvbnRyb2wnO1xyXG5pbXBvcnQgeyBUcmVldmlld0FjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdHJlZXZpZXdhY3Rpb24uaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gJy4uLy4uL3ZhbGlkYXRpb24nO1xyXG5pbXBvcnQgeyBTYWNGb3JtTGF5b3V0Q29tbW9uIH0gZnJvbSAnLi4vbGF5b3V0L2Zvcm1sYXlvdXQnO1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSG9zdCwgSW5qZWN0b3IsIElucHV0LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8qKlxyXG4gKiBCYXNpcyBLb21wb25lbnRlIGbDvHIgU2FjVHJlZVZpZXdcclxuICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgY2xhc3MgU2FjVHJlZXZpZXdDb21tb24gZXh0ZW5kcyBTYWNCYXNlTW9kZWxDb250cm9sPGFueT4ge1xyXG4gICAgLy8gI3JlZ2lvbiBQcm9wZXJ0aWVzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudCB3aGVuIEFjdGlvbiBpcyBjbGlja2VkIG9uIE5vZGUuICBBbiBvYmplY3Qgb2YgdGhlIHR5cGUgJ1RyZWV2aWV3QWN0aW9uJyBpcyByZXR1cm5lZC4gSW4gdGhlIGRlZmF1bHQgY2FzZSwgJ2FjdGlvbicgaW4gdGhpcyBvYmplY3QgaXMgYWx3YXlzIHRoZSB2YWx1ZSAnZGVmYXVsdCcuIFRoZSB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlICd0ZW1wbGF0ZWFjdGlvbicuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGFjdGlvbmNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxUcmVldmlld0FjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWV2aWV3QWN0aW9uPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcGVydHkgb24gdGhlIGRhdGEgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNoaWxkcmVuIG9mIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudC4gTXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAnY2hpbGRyZW4nXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYXR0cmNoaWxkcmVuID0gJ2NoaWxkcmVuJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIHByb3BlcnR5IG9uIHRoZSAnZGF0YScgb2JqZWN0IHdpdGggd2hpY2ggdGhlIGFjdGlvbnMgZm9yIGEgbm9kZSBjYW4gYmUgZGVhY3RpdmF0ZWQuIEEgJ2Rpc2FibGVkJyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBhdHRyZGlzYWJsZWFjdGlvbiA9ICdkaXNhYmxlZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wZXJ0eSBvbiB0aGUgJ2RhdGEnIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgZXhwYW5kZWQgc3RhdGUuIFByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLiBEZWZhdWx0IGlzICdleHBhbmRlZCdcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhdHRyZXhhbmRlZCA9ICdleHBhbmRlZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wZXJ0eSBmb3Igc2F2aW5nIHRoZSBIb3ZlclN0YXRlIG9uIHRoZSBmaWVsZC4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50IG9uIHRoZSBub2RlLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHJlbW92ZWQgYWdhaW4uIFRoZSB2YWx1ZSBjYW4gdXN1YWxseSBiZSBsZWZ0IGF0IHRoZSBkZWZhdWx0IHZhbHVlIHVubGVzcyB0aGVyZSBpcyBhIGNvbmZsaWN0IHdpdGggYSBwcm9wZXJ0eSBvbiB0aGUgbm9kZSB0aGF0IGlzIHJlcXVpcmVkIGZvciBvdGhlciBwdXJwb3Nlcy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhdHRyaG92ZXJzdGF0ZSA9ICdob3ZlcnN0YXRlJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3BlcnR5IG9uICdkYXRhJyBvYmplY3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBpY29uIGZvciB0aGUgbm9kZS4gQnkgZGVmYXVsdCwgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQsIHdoaWNoIGhpZGVzIHRoZSBpY29uIGluIHRoZSBub2RlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGF0dHJpY29uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHByb3BlcnR5IG9uIHRoZSAnZGF0YScgb2JqZWN0IGNvbnRhaW5zIGFuIElEIG9mIHRoZSBub2RlLiBUaGUgZGVmYXVsdCBpcyAnaWQnLiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIE5VTEwsIHRoZSBzZWxlY3RlZElkIGV2ZW50IGlzIG5vIGxvbmdlciB0cmlnZ2VyZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYXR0cmlkOiBzdHJpbmcgfCBudWxsID0gJ2lkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3BlcnR5IG9uICdkYXRhJyBvYmplY3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBsYWJlbCBmb3IgdGhlIG5vZGUuIERlZmF1bHQgaXMgJ2xhYmVsJ1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGF0dHJsYWJlbCA9ICdsYWJlbCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wZXJ0eSBvbiAnZGF0YScgb2JqZWN0LCB3aGljaCBkZWZpbmVzIHdoZXRoZXIgdGhlIG5vZGUgaXMgc2VsZWN0ZWQgb3Igbm90LiBJdCBzaG91bGQgYmUgZW5zdXJlZCB0aGF0IG9ubHkgMSBub2RlIGhhcyB0aGUgdmFsdWUgZm9yIFNlbGVjdGVkIHNldCB0byB0cnVlLiBEZWZhdWx0IGlzICdzZWxlY3RlZCcuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYXR0cnNlbGVjdGVkID0gJ3NlbGVjdGVkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IHdoZW4gYSBub2RlIGlzIGNvbGxhcHNlZC4gUmV0dXJucyB0aGUgbm9kZSBlbGVtZW50IGFzIGEgcGFyYW1ldGVyXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGNvbGxhYnNlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBwcm9wZXJ0eSBjb250YWlucyBhbiBhcnJheSBvZiBub2Rlcy4gVGhlIGRhdGEgbXVzdCBhbHJlYWR5IG1hcCB0aGUgdHJlZSB2aWEgY2hpbGQgcHJvcGVydGllcy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGVzIHRoZSAnZXhwYW5kJyBhbmQgJ2NvbGxhYnNlJyBldmVudCBldmVuIGlmIGEgbm9kZSBoYXMgbm8gY2hpbGRyZW4uIFRoaXMgaXMgaGVscGZ1bCBpZiBub2RlIGVsZW1lbnRzIGFyZSB0byBiZSByZWxvYWRlZCBhdCBydW50aW1lLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVuYWJsZWFzeW5jaGxvYWQ6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdGl2YXRlcyBFbGxpcHNpcyBvbiB0aGUgbm9kZSBsYWJlbHNcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlbmFibGVlbGxpcHNpcyA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudCB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gUmV0dXJucyB0aGUgbm9kZSBlbGVtZW50IGFzIGEgcGFyYW1ldGVyXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGV4cGFuZGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIGFuIGljb24gZm9yIHRoZSBleHBhbmRlZC9jb2xsYXBzZWQgc3RhdHVzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZXhwYW5kZWRzdGF0ZTogYm9vbGVhbiB8IHN0cmluZyA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG5vZGUgbXVzdCBiZSBzZWxlY3RlZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5hbWUgb2YgdGhlIFRyZWVWaWV3IGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IHdoZW4gYSBub2RlIGlzIHNlbGVjdGVkLiBSZXR1cm5zIHRoZSBpZCBhdHRyaWJ1dGUgYXMgYSBwYXJhbWV0ZXIuIFRoZSBldmVudCBpcyBub3QgdHJpZ2dlcmVkIGlmICdhdHRyaWQnIGlzIG5vdCBzZXQuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgd2hlbiBhIG5vZGUgaXMgc2VsZWN0ZWQuIFJldHVybnMgdGhlIG5vZGUgZWxlbWVudCBhcyBhIHBhcmFtZXRlci5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgc2VsZWN0ZWRub2RlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGF0IHRoZSBhY3Rpb24gdGVtcGxhdGUgaXMgZGlzcGxheWVkIGluZGVwZW5kZW50bHkgb2YgdGhlIHNlbGVjdGVkIHN0YXRlLiBJZiB0aGUgdmFsdWUgaXMgJ3RydWUnLCB0aGUgYWN0aW9uIHRlbXBsYXRlIGlzIGRpc3BsYXllZCBmb3IgZXZlcnkgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93YWN0aW9uYWx3YXlzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3VzdG9tIHRlbXBsYXRlIGZvciBhY3Rpb25zIHBlciBub2RlLiBUZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZTogJ25vZGUnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdGVtcGxhdGVhY3Rpb246IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gdGVtcGxhdGUgZm9yIGljb24gcGVyIG5vZGUuIFRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlOiAnbm9kZSdcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0ZW1wbGF0ZWljb246IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBsYWJlbCBhcmVhIHBlciBub2RlLiBUZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZTogJ25vZGUnIGFuZCAnbGFiZWwnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdGVtcGxhdGVsYWJlbDogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc291cmNlIEtleSBmw7xyIFZhbGlkYXRpb24gTWVzc2FnZSBSZXF1aXJlZCBiZWkgQ29udHJvbFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGlvbm1lc3NhZ2VyZXF1aXJlZDogc3RyaW5nID0gdGhpcy52YWxpZGF0aW9uS2V5U2VydmljZS5WYWxpZGF0aW9uRXJyb3JSZXF1aXJlZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc291cmNlIEtleSBmw7xyIFZhbGlkYXRpb24gTWVzc2FnZSBSZXF1aXJlZCBpbiBWYWxpZGF0aW9uIFN1bW1hcnlcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB2YWxpZGF0aW9ubWVzc2FnZXN1bW1hcnlyZXF1aXJlZDogc3RyaW5nID0gdGhpcy52YWxpZGF0aW9uS2V5U2VydmljZS5WYWxpZGF0aW9uRXJyb3JTdW1tYXJ5UmVxdWlyZWQ7XHJcblxyXG4gICAgLy8gI2VuZHJlZ2lvbiBQcm9wZXJ0aWVzXHJcblxyXG4gICAgLy8gI3JlZ2lvbiBDb25zdHJ1Y3RvcnNcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgU2VydmljZSBJbmplY3RvclxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIGZvcm1sYXlvdXQ6IFNhY0Zvcm1MYXlvdXRDb21tb24sIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGZvcm1sYXlvdXQsIGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAjZW5kcmVnaW9uIENvbnN0cnVjdG9yc1xyXG5cclxuICAgIC8vICNyZWdpb24gUHVibGljIEdldHRlcnMgQW5kIFNldHRlcnNcclxuXHJcbiAgICBwdWJsaWMgZ2V0IGljb25BY3Rpb24oKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5UcmVldmlld05vZGVBY3Rpb25JY29uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ1NTIGljb24gZm9yIGZvbGRlcnMgaW4gdHJlZSB0aGVyZSBhcmUgY29sbGFic2VkXHJcbiAgICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaWNvbkZvbGRlckNvbGxhYnNlZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLlRyZWV2aWV3Tm9kZUNsb3NlZEljb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDU1MgaWNvbiBjbGFzcyBmb3IgZm9sZGVycyB3aXRob3V0IHN1YmZvbGRlcnNcclxuICAgICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpY29uRm9sZGVyRW1wdHkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5UcmVldmlld05vZGVFbXB0eUljb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDU1MgaWNvbiBmb3IgZm9sZGVycyBpbiB0cmVlIHRoZXJlIGFyZSBleHBhbmRlZFxyXG4gICAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJPcGVuKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuVHJlZXZpZXdOb2RlT3Blbkljb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xyXG5cclxuICAgIC8vICNyZWdpb24gUHVibGljIE1ldGhvZHNcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYSBjZXJ0YWluIHNpemUuIElzIHJlcXVpcmVkIGZvciBhIEZvciBpbiB0aGUgVUksIGFzIEFuZ3VsYXIgZG9lcyBub3Qgc3VwcG9ydCBjb3VudGluZyBsb29wc1xyXG4gICAgICogQHBhcmFtIHNpemUgU2l6ZSBvZiB0aGUgYXJyYXlcclxuICAgICAqIEByZXR1cm5zIEFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3VudChzaXplOiBudW1iZXIpOiBBcnJheTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheShzaXplKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hpbGRyZW4obm9kZTogYW55KTogYW55W10ge1xyXG4gICAgICAgIGlmICghbm9kZSB8fCAhdGhpcy5hdHRyY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gbm9kZVt0aGlzLmF0dHJjaGlsZHJlbl07XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTdHJpbmdGaWVsZChub2RlOiBhbnksIGZpZWxkbmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBpZiAoIW5vZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFmaWVsZG5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSBub2RlW2ZpZWxkbmFtZV07XHJcblxyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNDaGlsZHJlbihub2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZHJlbihub2RlKS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0Rpc2FibGVkU3RhdGUobm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLmF0dHJkaXNhYmxlYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB2YWx1ZSA9IG5vZGVbdGhpcy5hdHRyZGlzYWJsZWFjdGlvbl07XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZSc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRXhwYW5kZWRTdGF0ZShub2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMuYXR0cmV4YW5kZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHZhbHVlID0gbm9kZVt0aGlzLmF0dHJleGFuZGVkXTtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNIb3ZlclN0YXRlKG5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghbm9kZSB8fCAhdGhpcy5hdHRyaG92ZXJzdGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSBub2RlW3RoaXMuYXR0cmhvdmVyc3RhdGVdO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1NlbGVjdGVkU3RhdGUobm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLmF0dHJzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSBub2RlW3RoaXMuYXR0cnNlbGVjdGVkXTtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCBpcyBjYWxsZWQgYnkgY2xpY2tpbmcgYW4gYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uIGFjdGlvbiBhbmQgbm9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25BY3Rpb25DbGlja2VkKGFjdGlvbjogVHJlZXZpZXdBY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmFjdGlvbmNsaWNrZWQuZW1pdChhY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIGlzIGNhbGxlZCB3aGVuIE5vZGUgaW4gVHJlZSBpcyBjbGlja2VkXHJcbiAgICAgKiBAcGFyYW0gbm9kZSBTZWxlY3RlZCBOb2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk5vZGVDbGlja2VkKG5vZGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRGlzYWJsZWRTdGF0ZShub2RlKSB8fCB0aGlzLmlzU2VsZWN0ZWRTdGF0ZShub2RlKSkge1xyXG4gICAgICAgICAgICB0aGlzLmludmVydEV4cGFuZGVkU3RhdGUobm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkU3RhdGUobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3ZlciBzdGF0ZSBvbiBhIG5vZGVcclxuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgb24gd2hpY2ggdGhlIHN0YXR1cyBpcyBzZXRcclxuICAgICAqIEBwYXJhbSBzdGF0ZSBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIEhvdmVyU3RhdGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEhvdmVyU3RhdGUobm9kZTogYW55LCBzdGF0ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghbm9kZSB8fCAhdGhpcy5hdHRyaG92ZXJzdGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgICAgICAgbm9kZVt0aGlzLmF0dHJob3ZlcnN0YXRlXSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghbm9kZS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmF0dHJob3ZlcnN0YXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWxldGUgbm9kZVt0aGlzLmF0dHJob3ZlcnN0YXRlXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNlbGVjdGVkIHN0YXRlIG9uIGEgbm9kZVxyXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB3aGljaCBpcyBtYXJrZWQgYXMgU2VsZWN0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFNlbGVjdGVkU3RhdGUobm9kZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLmF0dHJzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXNldCBzZWxlY3RlZCBzdGF0ZSBvZiBhbnkgbm9kZVxyXG4gICAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb290Tm9kZSkgPT4gdGhpcy5yZXNldFNlbGVjdGVkU3RhdGUocm9vdE5vZGUpKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IHNlbGVjdGVkIG5vZGUgYXMgc2VsZWN0ZWRcclxuICAgICAgICBub2RlW3RoaXMuYXR0cnNlbGVjdGVkXSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIEV4dHJhY3QgSUQgZnJvbSBOb2RlXHJcbiAgICAgICAgY29uc3QgaWRWYWx1ZSA9IG5vZGVbdGhpcy5hdHRyaWRdO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgbmdNb2RlbFxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUoaWRWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIFJhaXNlIFNlbGVjdGVkIEV2ZW50c1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRub2RlLmVtaXQobm9kZSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hdHRyaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGlkID0gdGhpcy5nZXRTdHJpbmdGaWVsZChub2RlLCB0aGlzLmF0dHJpZCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlcyB0aGUgbW9kZWwgc3RhdGUgb2YgdGhlIGNvbnRyb2xcclxuICAgICAqIEBwYXJhbSBjIENvbnRyb2wgaW5zdGFuY2VcclxuICAgICAqIEByZXR1cm5zIFJldHVybnMgYSB2YWxpZGF0aW9uIGVycm9yLCBpZiBwcmVzZW50LiBPdGhlcndpc2UsIGFzIFJlc3VsdCBpcyBOVUxMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZURhdGEoYzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG4gICAgICAgIGxldCBlcnJvcjogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc3JlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gVmFsaWRhdGlvbi5yZXF1aXJlZCh0aGlzLnZhbGlkYXRpb25tZXNzYWdlcmVxdWlyZWQsIHRoaXMudmFsaWRhdGlvbm1lc3NhZ2VzdW1tYXJ5cmVxdWlyZWQpKGMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2F2ZXMgdGhlIGRhdGEgZnJvbSB0aGUgbW9kZWwgYmluZGluZ1xyXG4gICAgICogQHBhcmFtIHZhbHVlIElkIG9mIHRoZSBzZWxlY3RlZCBub2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci53cml0ZVZhbHVlKHZhbHVlKTtcclxuXHJcbiAgICAgICAgLy8gRG8gbm90IHByZXNlbGN0IGl0ZW0gd2hlbiB0cmVlIGlzIGVtcHR5XHJcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goKHJvb3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kTm9kZUJ5SWQocm9vdCwgdmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZFN0YXRlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAjZW5kcmVnaW9uIFB1YmxpYyBNZXRob2RzXHJcblxyXG4gICAgLy8gI3JlZ2lvbiBQcml2YXRlIE1ldGhvZHNcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlYXJjaGVzIGZvciBhIG5vZGUgYmFzZWQgb24gdGhlIHZhbHVlIGluIHRoZSBJRCBhdHRyaWJ1dGVcclxuICAgICAqIEBwYXJhbSBub2RlIE5vZGVcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUgSWQgYXR0cmlidXRlXHJcbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBub2RlIGlmIGl0IGlzIGZvdW5kLiBJZiBub3QsIE5VTEwgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluZE5vZGVCeUlkKG5vZGU6IGFueSwgdmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF0dHJpZCB8fCAhbm9kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChub2RlW3RoaXMuYXR0cmlkXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4obm9kZSk7XHJcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kTm9kZUJ5SWQoY2hpbGQsIHZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbnZlcnRFeHBhbmRlZFN0YXRlKG5vZGU6IGFueSkge1xyXG4gICAgICAgIGlmICghbm9kZSB8fCAhdGhpcy5hdHRyZXhhbmRlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJdGVtcyB3aXRoIG5vIGNoaWxkcmVuIGNhbm5vdCBiZSBjb2xsYWJzZWRcclxuICAgICAgICBpZiAoIXRoaXMuaGFzQ2hpbGRyZW4obm9kZSkgJiYgISh0aGlzLmVuYWJsZWFzeW5jaGxvYWQgPT09IHRydWUgfHwgdGhpcy5lbmFibGVhc3luY2hsb2FkID09PSAndHJ1ZScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB2YWx1ZSA9IG5vZGVbdGhpcy5hdHRyZXhhbmRlZF07XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sbGFic2VkLmVtaXQobm9kZSk7XHJcbiAgICAgICAgICAgIG5vZGVbdGhpcy5hdHRyZXhhbmRlZF0gPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkLmVtaXQobm9kZSk7XHJcbiAgICAgICAgICAgIG5vZGVbdGhpcy5hdHRyZXhhbmRlZF0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0U2VsZWN0ZWRTdGF0ZShub2RlOiBhbnkpIHtcclxuICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMuYXR0cnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5vZGVbdGhpcy5hdHRyc2VsZWN0ZWRdID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW4obm9kZSkuZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkU3RhdGUoY2hpbGQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICNlbmRyZWdpb24gUHJpdmF0ZSBNZXRob2RzXHJcbn1cclxuIl19