@magic-xpa/angular 4.1100.0-dev4110.99 → 4.1101.0-dev4111.269

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 (170) hide show
  1. package/README.md +5 -5
  2. package/{esm2020 → esm2022}/index.mjs +59 -59
  3. package/{esm2020 → esm2022}/magic-xpa-angular.mjs +1 -1
  4. package/esm2022/src/controls.metadata.model.mjs +183 -0
  5. package/{esm2020 → esm2022}/src/interfaces/sub-form-definition.iterface.mjs +1 -1
  6. package/{esm2020 → esm2022}/src/magic.core.module.mjs +159 -160
  7. package/{esm2020 → esm2022}/src/services/ISubformMagicService.mjs +1 -1
  8. package/esm2022/src/services/OverlayWindowService.mjs +245 -0
  9. package/esm2022/src/services/StylesMapManager.mjs +28 -0
  10. package/esm2022/src/services/accessor.magic.service.mjs +358 -0
  11. package/esm2022/src/services/commands-collector.magic.service.mjs +47 -0
  12. package/esm2022/src/services/component-list.magic.service.mjs +45 -0
  13. package/{esm2020 → esm2022}/src/services/confirmation.components.magic.provider.mjs +21 -21
  14. package/esm2022/src/services/engine.magic.service.mjs +80 -0
  15. package/{esm2020 → esm2022}/src/services/exit.magic.service.mjs +13 -13
  16. package/esm2022/src/services/magic-color.service.mjs +101 -0
  17. package/{esm2020 → esm2022}/src/services/magic.lazy.loader.service.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/services/magic.providers.mjs +24 -24
  19. package/esm2022/src/services/magic.services.mjs +36 -0
  20. package/esm2022/src/services/mg-date-adapter.mjs +108 -0
  21. package/{esm2020 → esm2022}/src/services/overlay.conainer.magic.provider.mjs +14 -14
  22. package/esm2022/src/services/router-commands.magic.service.mjs +31 -0
  23. package/esm2022/src/services/subform.magic.service.mjs +195 -0
  24. package/esm2022/src/services/table.magic.service.mjs +81 -0
  25. package/esm2022/src/services/task.magics.service.mjs +648 -0
  26. package/esm2022/src/services/title.magic.service.mjs +19 -0
  27. package/esm2022/src/ui/GuiInteractiveExecutor.mjs +114 -0
  28. package/esm2022/src/ui/components/base-magic-alert.component.mjs +24 -0
  29. package/esm2022/src/ui/components/base-magic-confirm.component.mjs +24 -0
  30. package/esm2022/src/ui/components/magic-alert.component.mjs +36 -0
  31. package/esm2022/src/ui/components/magic-confirmation-box.component.mjs +42 -0
  32. package/esm2022/src/ui/directives/NonMagicControlDirective.mjs +58 -0
  33. package/esm2022/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +29 -0
  34. package/esm2022/src/ui/directives/magic/checkbox.magic.directive.mjs +100 -0
  35. package/esm2022/src/ui/directives/magic/combobox.magic.directive.mjs +37 -0
  36. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +27 -0
  37. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +85 -0
  38. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +32 -0
  39. package/esm2022/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +28 -0
  40. package/{esm2020 → esm2022}/src/ui/directives/magic/nocontrol.magic.directive.mjs +193 -193
  41. package/esm2022/src/ui/directives/magic/row.magic.directive.mjs +62 -0
  42. package/esm2022/src/ui/directives/magic-focus.directive.mjs +20 -0
  43. package/esm2022/src/ui/directives/magic.directive.mjs +232 -0
  44. package/esm2022/src/ui/directives/magicViewContainerRef.directive.mjs +20 -0
  45. package/esm2022/src/ui/directives/mgformat.magic.directive.mjs +579 -0
  46. package/esm2022/src/ui/directives/range-validator.magic.directive.mjs +60 -0
  47. package/{esm2020 → esm2022}/src/ui/magic-confirmationBox.mjs +41 -41
  48. package/{esm2020 → esm2022}/src/ui/magic-modal/base-magic-overlay-container.mjs +22 -22
  49. package/esm2022/src/ui/magic-modal/magic-modal-form.mjs +6 -0
  50. package/{esm2020 → esm2022}/src/ui/magic-modal/magic-modal-interface.mjs +1 -1
  51. package/esm2022/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +125 -0
  52. package/esm2022/src/ui/magic-modal/magic-overlay-container.mjs +162 -0
  53. package/esm2022/src/ui/magic-root.component.mjs +236 -0
  54. package/esm2022/src/ui/mgerror.magic.component.mjs +125 -0
  55. package/esm2022/src/ui/pipes/date.magic.pipe.mjs +106 -0
  56. package/esm2022/src/ui/pipes/time.magic.pipe.mjs +52 -0
  57. package/esm2022/src/ui/pipes/time24.magic.pipe.mjs +35 -0
  58. package/esm2022/src/ui/router-container.magic.component.mjs +115 -0
  59. package/{esm2020 → esm2022}/src/ui/subform.magic.component.mjs +50 -46
  60. package/esm2022/src/ui/task-base.magic.component.mjs +91 -0
  61. package/{esm2020 → esm2022}/src/ui/utils.mjs +53 -53
  62. package/{fesm2020 → fesm2022}/magic-xpa-angular.mjs +4933 -4495
  63. package/fesm2022/magic-xpa-angular.mjs.map +1 -0
  64. package/index.d.ts +58 -58
  65. package/package.json +10 -16
  66. package/src/controls.metadata.model.d.ts +62 -62
  67. package/src/interfaces/sub-form-definition.iterface.d.ts +12 -12
  68. package/src/magic.core.module.d.ts +41 -41
  69. package/src/services/ISubformMagicService.d.ts +4 -4
  70. package/src/services/OverlayWindowService.d.ts +30 -31
  71. package/src/services/StylesMapManager.d.ts +5 -5
  72. package/src/services/accessor.magic.service.d.ts +69 -69
  73. package/src/services/commands-collector.magic.service.d.ts +15 -15
  74. package/src/services/component-list.magic.service.d.ts +23 -23
  75. package/src/services/confirmation.components.magic.provider.d.ts +8 -8
  76. package/src/services/engine.magic.service.d.ts +27 -27
  77. package/src/services/exit.magic.service.d.ts +6 -6
  78. package/src/services/magic-color.service.d.ts +19 -19
  79. package/src/services/magic.lazy.loader.service.d.ts +6 -6
  80. package/src/services/magic.providers.d.ts +107 -107
  81. package/src/services/magic.services.d.ts +16 -16
  82. package/src/services/mg-date-adapter.d.ts +38 -40
  83. package/src/services/overlay.conainer.magic.provider.d.ts +7 -7
  84. package/src/services/router-commands.magic.service.d.ts +17 -17
  85. package/src/services/subform.magic.service.d.ts +43 -43
  86. package/src/services/table.magic.service.d.ts +30 -30
  87. package/src/services/task.magics.service.d.ts +100 -100
  88. package/src/services/title.magic.service.d.ts +9 -9
  89. package/src/ui/GuiInteractiveExecutor.d.ts +22 -22
  90. package/src/ui/components/base-magic-alert.component.d.ts +10 -10
  91. package/src/ui/components/base-magic-confirm.component.d.ts +10 -10
  92. package/src/ui/components/magic-alert.component.d.ts +6 -6
  93. package/src/ui/components/magic-confirmation-box.component.d.ts +6 -6
  94. package/src/ui/directives/NonMagicControlDirective.d.ts +26 -26
  95. package/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.d.ts +9 -9
  96. package/src/ui/directives/magic/checkbox.magic.directive.d.ts +22 -9
  97. package/src/ui/directives/magic/combobox.magic.directive.d.ts +10 -10
  98. package/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.d.ts +7 -7
  99. package/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.d.ts +23 -17
  100. package/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.d.ts +7 -7
  101. package/src/ui/directives/magic/input.noformcontrol.magic.directive.d.ts +9 -9
  102. package/src/ui/directives/magic/nocontrol.magic.directive.d.ts +18 -18
  103. package/src/ui/directives/magic/row.magic.directive.d.ts +17 -17
  104. package/src/ui/directives/magic-focus.directive.d.ts +9 -9
  105. package/src/ui/directives/magic.directive.d.ts +45 -44
  106. package/src/ui/directives/magicViewContainerRef.directive.d.ts +8 -8
  107. package/src/ui/directives/mgformat.magic.directive.d.ts +38 -31
  108. package/src/ui/directives/range-validator.magic.directive.d.ts +17 -17
  109. package/src/ui/magic-confirmationBox.d.ts +6 -6
  110. package/src/ui/magic-modal/base-magic-overlay-container.d.ts +5 -5
  111. package/src/ui/magic-modal/magic-modal-form.d.ts +5 -5
  112. package/src/ui/magic-modal/magic-modal-interface.d.ts +10 -10
  113. package/src/ui/magic-modal/magic-overlay-container-wrapper.d.ts +30 -31
  114. package/src/ui/magic-modal/magic-overlay-container.d.ts +24 -25
  115. package/src/ui/magic-root.component.d.ts +43 -40
  116. package/src/ui/mgerror.magic.component.d.ts +20 -20
  117. package/src/ui/pipes/date.magic.pipe.d.ts +17 -17
  118. package/src/ui/pipes/time.magic.pipe.d.ts +11 -11
  119. package/src/ui/pipes/time24.magic.pipe.d.ts +10 -10
  120. package/src/ui/router-container.magic.component.d.ts +29 -30
  121. package/src/ui/subform.magic.component.d.ts +16 -16
  122. package/src/ui/task-base.magic.component.d.ts +34 -34
  123. package/src/ui/utils.d.ts +9 -9
  124. package/esm2020/src/controls.metadata.model.mjs +0 -180
  125. package/esm2020/src/services/OverlayWindowService.mjs +0 -236
  126. package/esm2020/src/services/StylesMapManager.mjs +0 -28
  127. package/esm2020/src/services/accessor.magic.service.mjs +0 -356
  128. package/esm2020/src/services/commands-collector.magic.service.mjs +0 -46
  129. package/esm2020/src/services/component-list.magic.service.mjs +0 -46
  130. package/esm2020/src/services/engine.magic.service.mjs +0 -82
  131. package/esm2020/src/services/magic-color.service.mjs +0 -99
  132. package/esm2020/src/services/magic.services.mjs +0 -31
  133. package/esm2020/src/services/mg-date-adapter.mjs +0 -109
  134. package/esm2020/src/services/router-commands.magic.service.mjs +0 -28
  135. package/esm2020/src/services/subform.magic.service.mjs +0 -184
  136. package/esm2020/src/services/table.magic.service.mjs +0 -77
  137. package/esm2020/src/services/task.magics.service.mjs +0 -624
  138. package/esm2020/src/services/title.magic.service.mjs +0 -18
  139. package/esm2020/src/ui/GuiInteractiveExecutor.mjs +0 -105
  140. package/esm2020/src/ui/components/base-magic-alert.component.mjs +0 -23
  141. package/esm2020/src/ui/components/base-magic-confirm.component.mjs +0 -23
  142. package/esm2020/src/ui/components/magic-alert.component.mjs +0 -35
  143. package/esm2020/src/ui/components/magic-confirmation-box.component.mjs +0 -41
  144. package/esm2020/src/ui/directives/NonMagicControlDirective.mjs +0 -49
  145. package/esm2020/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +0 -28
  146. package/esm2020/src/ui/directives/magic/checkbox.magic.directive.mjs +0 -28
  147. package/esm2020/src/ui/directives/magic/combobox.magic.directive.mjs +0 -36
  148. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +0 -27
  149. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +0 -52
  150. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +0 -32
  151. package/esm2020/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +0 -27
  152. package/esm2020/src/ui/directives/magic/row.magic.directive.mjs +0 -58
  153. package/esm2020/src/ui/directives/magic-focus.directive.mjs +0 -19
  154. package/esm2020/src/ui/directives/magic.directive.mjs +0 -215
  155. package/esm2020/src/ui/directives/magicViewContainerRef.directive.mjs +0 -19
  156. package/esm2020/src/ui/directives/mgformat.magic.directive.mjs +0 -408
  157. package/esm2020/src/ui/directives/range-validator.magic.directive.mjs +0 -58
  158. package/esm2020/src/ui/magic-modal/magic-modal-form.mjs +0 -8
  159. package/esm2020/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +0 -121
  160. package/esm2020/src/ui/magic-modal/magic-overlay-container.mjs +0 -159
  161. package/esm2020/src/ui/magic-root.component.mjs +0 -203
  162. package/esm2020/src/ui/mgerror.magic.component.mjs +0 -119
  163. package/esm2020/src/ui/pipes/date.magic.pipe.mjs +0 -105
  164. package/esm2020/src/ui/pipes/time.magic.pipe.mjs +0 -51
  165. package/esm2020/src/ui/pipes/time24.magic.pipe.mjs +0 -34
  166. package/esm2020/src/ui/router-container.magic.component.mjs +0 -108
  167. package/esm2020/src/ui/task-base.magic.component.mjs +0 -86
  168. package/fesm2015/magic-xpa-angular.mjs +0 -4865
  169. package/fesm2015/magic-xpa-angular.mjs.map +0 -1
  170. package/fesm2020/magic-xpa-angular.mjs.map +0 -1
@@ -1,624 +0,0 @@
1
- import { EventEmitter, Injectable } from '@angular/core';
2
- import { FormControl, FormGroup } from '@angular/forms';
3
- import { filter } from 'rxjs/operators';
4
- import { Subject } from 'rxjs';
5
- import { isNullOrUndefined, isUndefined } from '@magic-xpa/mscorelib';
6
- import { StylesMapManager } from './StylesMapManager';
7
- import { EngineMagicService } from './engine.magic.service';
8
- import { Records } from '../controls.metadata.model';
9
- import { CommandType, GuiConstants, HtmlProperties } from '@magic-xpa/gui';
10
- import { NString, StringBuilder } from '@magic-xpa/mscorelib';
11
- import { StorageAttribute } from '@magic-xpa/utils';
12
- import { getGuiEventObj } from '@magic-xpa/engine';
13
- import { GuiInteractiveExecutor } from '../ui/GuiInteractiveExecutor';
14
- import { OverlayWindowService } from './OverlayWindowService';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "./engine.magic.service";
17
- import * as i2 from "./OverlayWindowService";
18
- export class TaskMagicService {
19
- constructor(magic, overlayWindowService) {
20
- this.magic = magic;
21
- this.overlayWindowService = overlayWindowService;
22
- this.Records = new Records();
23
- this.formGroups = [];
24
- this.refreshDom = new Subject();
25
- this.detectChanges = new Subject();
26
- this.interactiveCommands = new Subject();
27
- this.OnSelectedRowChanged = new EventEmitter();
28
- this.customPropertiesSubject = new Subject();
29
- this.recordsCountChangeSubject = new Subject();
30
- this.mgLoadSubject = new Subject();
31
- this.oldPageSize = 0;
32
- this.Records.setGuiTopIndex(0);
33
- this.mgInputDateFormat = null;
34
- }
35
- getIsLoggenIn() {
36
- return this.magic.getIsLoggedIn();
37
- }
38
- get taskId() {
39
- return this._taskId;
40
- }
41
- set taskId(value) {
42
- this._taskId = value;
43
- }
44
- get ScreenControlsData() {
45
- return this.Records.list['0'];
46
- }
47
- settemplate(value) {
48
- this.template = value;
49
- }
50
- buildScreenModeControls() {
51
- const group = new FormGroup({});
52
- for (const key in this.template) {
53
- if (this.template[key] == '0') {
54
- let fc = new FormControl('');
55
- this.setStubValue(0, fc, key);
56
- group.addControl(key, fc);
57
- }
58
- }
59
- this.ScreenModeControls = group;
60
- }
61
- isTableControl(id) {
62
- return this.template[id] == '1';
63
- }
64
- getMgInputDateFormat() { return this.mgInputDateFormat; }
65
- getFormControl(guiRowid, id) {
66
- let c;
67
- let group = this.isTableControl(id) ? this.formGroups[guiRowid] : this.ScreenModeControls;
68
- if (!isNullOrUndefined(group)) {
69
- group.get(id);
70
- c = group.controls[id];
71
- }
72
- return c;
73
- }
74
- setInputTextValue(controlId, guiRowid, val) {
75
- this.setValue(controlId, guiRowid, this.ConvertValToNative(controlId, 0, val));
76
- const fc = this.getFormControl(guiRowid, controlId);
77
- if (!isNullOrUndefined(val))
78
- fc.setValue(val);
79
- }
80
- buildTableRowControls(guiRowId) {
81
- const group = new FormGroup({});
82
- for (const key in this.template) {
83
- if (this.template[key] == '1') {
84
- let fc = new FormControl('');
85
- this.setStubValue(guiRowId, fc, key);
86
- group.addControl(key, fc);
87
- }
88
- }
89
- this.formGroups[guiRowId] = group;
90
- }
91
- updateRecordsBeforeCurrentView(value) {
92
- this.Records.recordsBeforeCurrentView = value;
93
- }
94
- setIncludesFirst(value) {
95
- this.Records.includesFirst = value;
96
- }
97
- setIncludesLast(value) {
98
- this.Records.includesLast = value;
99
- }
100
- markRowAsCreated(guiRowId) {
101
- this.Records.markRowAsCreated(guiRowId);
102
- }
103
- markRowAsNotCreated(guiRowId) {
104
- this.Records.markRowAsNotCreated(guiRowId);
105
- }
106
- startRowEditing(guiRowId) {
107
- this.Records.startRowEditing(guiRowId);
108
- }
109
- stopRowEditing(guiRowId) {
110
- this.Records.stopRowEditing(guiRowId);
111
- }
112
- isRowInRowEditing(guiRowId) {
113
- return this.Records.isRowInRowEditing(guiRowId);
114
- }
115
- setIsEmptyDataView(isEmpty) {
116
- if (this.Records.isEmptyDataView !== isEmpty) {
117
- if (isEmpty)
118
- this.recordsCountChangeSubject.next(0);
119
- this.Records.isEmptyDataView = isEmpty;
120
- this.tableService.refreshDataSource();
121
- this.refreshView();
122
- }
123
- }
124
- initTask(taskId, taskDescription) {
125
- this.Records.createFirst();
126
- this.oldPageSize = 0;
127
- if (this.IsStub()) {
128
- this.loadData();
129
- }
130
- else {
131
- this.taskId = taskId;
132
- this.settemplate(taskDescription);
133
- }
134
- this.buildScreenModeControls();
135
- if (!isNullOrUndefined(this.subscribeRefreshDom))
136
- this.subscribeRefreshDom.unsubscribe();
137
- if (!isNullOrUndefined(this.subscribeInteractiveCommands))
138
- this.subscribeInteractiveCommands.unsubscribe();
139
- this.subscribeRefreshDom = this.magic.refreshDom.pipe(filter(command => command.TaskTag === this.taskId))
140
- .subscribe(command => {
141
- this.executeCommand(command);
142
- });
143
- this.subscribeInteractiveCommands = this.magic.interactiveCommands
144
- .pipe(filter(command => command.TaskTag === this.taskId))
145
- .subscribe(command => {
146
- this.executeInteractiveCommand(command);
147
- });
148
- }
149
- refreshView() {
150
- this.detectChanges.next('');
151
- }
152
- insertEvent(guiEvent) {
153
- guiEvent.TaskID = this.taskId;
154
- this.magic.insertEvent(guiEvent);
155
- }
156
- GetControlPictureMask(controlName) {
157
- return this.magic.GetControlPictureMask(this.taskId, controlName);
158
- }
159
- ValidateControlValue(controlName, value) {
160
- return this.magic.ValidateControlValue(this.taskId, controlName, value);
161
- }
162
- GetRangedValue(controlName, value) {
163
- return this.magic.GetRangedValue(this.taskId, controlName, value);
164
- }
165
- GetFldRanges(controlName) {
166
- return this.magic.GetFldRanges(this.taskId, controlName);
167
- }
168
- getProperty(controlId, prop, guiRowId) {
169
- if (isNullOrUndefined(guiRowId))
170
- guiRowId = '0';
171
- if (this.IsStub())
172
- return this.getPropertyStub(this.Records.list[guiRowId], controlId, prop);
173
- else {
174
- let rec = this.Records.list[guiRowId];
175
- if (isNullOrUndefined(rec))
176
- debugger;
177
- else
178
- return this.Records.list[guiRowId].getProperty(controlId, prop);
179
- }
180
- }
181
- getPropertyStub(ControlsProperties, controlId, prop) {
182
- ControlsProperties = ControlsProperties.ControlsProperties;
183
- if (controlId in ControlsProperties) {
184
- if (prop in ControlsProperties[controlId].properties) {
185
- return ControlsProperties[controlId].properties[prop];
186
- }
187
- }
188
- return '';
189
- }
190
- getStyleStub(ControlsProperties, controlId, styleName) {
191
- ControlsProperties = ControlsProperties.ControlsProperties;
192
- return ControlsProperties[controlId].stylesMap.get(styleName);
193
- }
194
- getClasses(controlId, guiRowId) {
195
- if (isNullOrUndefined(guiRowId))
196
- guiRowId = '0';
197
- return this.Records.list[guiRowId].getControlMetadata(controlId).classes;
198
- }
199
- getStyle(controlId, styleName, guiRowId) {
200
- if (isNullOrUndefined(guiRowId))
201
- guiRowId = '0';
202
- if (this.IsStub())
203
- return this.getStyleStub(this.Records.list[guiRowId], controlId, styleName);
204
- else {
205
- let magicValue = this.Records.list[guiRowId].getControlMetadata(controlId).stylesMap.get(styleName);
206
- return StylesMapManager.magicValueGetStyle(styleName, magicValue);
207
- }
208
- }
209
- getValue(controlId, guiRowId) {
210
- if (isNullOrUndefined(guiRowId))
211
- guiRowId = '0';
212
- return this.Records.list.length > +guiRowId ? this.Records.list[guiRowId].values[controlId] : '';
213
- }
214
- getFormattedValue(controlName, val, rowId) {
215
- return this.magic.GetFormattedValue(this.taskId, controlName, val, rowId);
216
- }
217
- setValue(controlId, guiRowId, value) {
218
- return this.Records.list[guiRowId].setValue(controlId, value);
219
- }
220
- executeInteractiveCommand(guiInteractiveCommand) {
221
- GuiInteractiveExecutor.executeInteractiveCommand(this, guiInteractiveCommand, this.overlayWindowService);
222
- this.interactiveCommands.next(guiInteractiveCommand);
223
- }
224
- handleSetProperty(command, isTableChild) {
225
- let controlId = command.CtrlName;
226
- let dvRowId = (command.line || 0);
227
- let guiRowId = this.getGuiRowId(dvRowId, isTableChild);
228
- let properties;
229
- if (command.Operation === HtmlProperties.SelectedRow) {
230
- if (command.obj1 !== GuiConstants.NO_ROW_SELECTED) {
231
- guiRowId = this.getGuiRowId(command.obj1, true);
232
- properties = this.Records.list[guiRowId].getControlMetadata(controlId);
233
- properties.properties.set(command.Operation, command.line);
234
- this.tableService.selectRow(guiRowId.toString());
235
- this.OnSelectedRowChanged.emit(guiRowId.toString());
236
- }
237
- }
238
- else if (command.Operation === HtmlProperties.Enabled) {
239
- let c = this.getFormControl(guiRowId.toString(), controlId);
240
- if (!isNullOrUndefined(c)) {
241
- if (command.obj1)
242
- c.enable();
243
- else
244
- c.disable();
245
- }
246
- properties = this.Records.list[guiRowId].getControlMetadata(controlId);
247
- properties.properties.set(command.Operation, command.obj1);
248
- }
249
- else {
250
- properties = this.Records.list[guiRowId].getControlMetadata(controlId);
251
- properties.properties.set(command.Operation, command.obj1);
252
- }
253
- }
254
- executeCommand(command) {
255
- let dvRowId = (command.line || 0);
256
- let guiRowId = 0;
257
- let controlId = command.CtrlName;
258
- let properties;
259
- let isTableChild = this.isTableControl(controlId);
260
- if (command.obj !== null)
261
- isTableChild = isTableChild || command.obj.IsTableChild;
262
- guiRowId = this.getGuiRowId(dvRowId, isTableChild);
263
- switch (command.CommandType) {
264
- case CommandType.SET_IS_LOGGED_IN:
265
- break;
266
- case CommandType.SET_TABLE_TOP_INDEX:
267
- this.tableService.setTableTopIndex(command.number);
268
- break;
269
- case CommandType.REFRESH_TASK:
270
- this.tableService.refreshDataSource();
271
- this.refreshView();
272
- break;
273
- case CommandType.SET_TABLE_ITEMS_COUNT:
274
- if (!isUndefined(command.number)) {
275
- this.tableService.updateTableSize(command.number);
276
- if (command.number > 0 && this.Records.sizeUpdated &&
277
- !this.Records.isEmptyDataView) {
278
- this.recordsCountChangeSubject.next(command.number);
279
- this.Records.sizeUpdated = false;
280
- }
281
- }
282
- break;
283
- case CommandType.SET_CHUNK_SIZE:
284
- if (!isUndefined(command.number)) {
285
- this.tableService.setChunkSize(command.number);
286
- }
287
- break;
288
- case CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW:
289
- this.updateRecordsBeforeCurrentView(command.number);
290
- break;
291
- case CommandType.CREATE_TABLE_ROW:
292
- guiRowId = this.getGuiRowId(command.number, true);
293
- this.buildTableRowControls(guiRowId);
294
- this.markRowAsCreated(guiRowId);
295
- break;
296
- case CommandType.SET_IS_ROW_EDITING:
297
- guiRowId = this.getGuiRowId(command.line, command.value);
298
- this.startRowEditing(guiRowId);
299
- break;
300
- case CommandType.SET_NOT_IS_ROW_EDITING:
301
- guiRowId = this.getGuiRowId(command.line, command.value);
302
- this.stopRowEditing(guiRowId);
303
- break;
304
- case CommandType.UNDO_CREATE_TABLE_ROW:
305
- this.markRowAsNotCreated(this.getGuiRowId(command.number, true));
306
- break;
307
- case CommandType.SET_TABLE_INCLUDES_FIRST:
308
- this.setIncludesFirst(command.Bool1);
309
- break;
310
- case CommandType.SET_TABLE_INCLUDES_LAST:
311
- this.setIncludesLast(command.Bool1);
312
- break;
313
- case CommandType.SET_PROPERTY:
314
- this.handleSetProperty(command, isTableChild);
315
- if (command.Operation == HtmlProperties.ReadOnly ||
316
- command.Operation == HtmlProperties.ItemsList)
317
- this.refreshDom.next(command);
318
- break;
319
- case CommandType.PROP_SET_USER_PROPERTY:
320
- properties = this.Records.list[guiRowId].getControlMetadata(controlId);
321
- if (properties.userProperties.get(command.Operation) !== command.obj1) {
322
- properties.userProperties.set(command.Operation, command.obj1);
323
- this.customPropertiesSubject.next({ propertyName: controlId + '~' + command.Operation, value: command.obj1, rowId: guiRowId });
324
- }
325
- break;
326
- case CommandType.PROP_SET_CUSTOM_VALIDATOR:
327
- {
328
- properties = this.Records.list[guiRowId].getControlMetadata(controlId);
329
- let control = this.getFormControl(guiRowId.toString(), controlId);
330
- if (control != null) {
331
- properties.customValidators.set(command.Operation, command.obj1);
332
- if (control.validator != null)
333
- control.setValidators([control.validator, this.customValidator(guiRowId.toString(), controlId)]);
334
- else
335
- control.setValidators(this.customValidator(guiRowId.toString(), controlId));
336
- control.updateValueAndValidity();
337
- }
338
- }
339
- break;
340
- case CommandType.SET_CLASS:
341
- properties = this.Records.list[guiRowId].getControlMetadata(controlId);
342
- properties.setClass(command.Operation, command.obj1);
343
- break;
344
- case CommandType.SET_STYLE:
345
- properties = this.Records.list[guiRowId].getControlMetadata(controlId);
346
- properties.setStyle(command.Operation, command.obj1);
347
- break;
348
- case CommandType.SET_ATTRIBUTE:
349
- properties = this.Records.list[0].getControlMetadata(controlId);
350
- properties.dataType = String.fromCharCode(command.number);
351
- break;
352
- case CommandType.SET_VALUE:
353
- this.Records.list[guiRowId].values[controlId] = command.value;
354
- let c = this.getFormControl(guiRowId.toString(), controlId);
355
- if (!isNullOrUndefined(c)) {
356
- c.setValue(this.ConvertValFromNative(controlId, command.line, command.value));
357
- }
358
- break;
359
- case CommandType.CREATE_SUB_FORM:
360
- this.mgSubformService.addSubformComp(command.CtrlName, command.userDropFormat.toString(), command.str, command.fileName, command.contextID, command.params, command.Bool1);
361
- break;
362
- case CommandType.CLOSE_SUB_FORM:
363
- this.mgSubformService.deleteSubformComp(command.CtrlName, command.userDropFormat.toString());
364
- break;
365
- case CommandType.SET_EMPTY_DATAVIEW:
366
- this.setIsEmptyDataView(command.Bool1);
367
- break;
368
- case CommandType.SET_FOCUS:
369
- this.refreshDom.next(command);
370
- break;
371
- case CommandType.SET_WC_IDLE:
372
- this.mgLoadSubject.next();
373
- break;
374
- }
375
- }
376
- customValidator(rowid, id) {
377
- return (control) => {
378
- let controlMetadata;
379
- controlMetadata = this.Records.list[rowid].getControlMetadata(id);
380
- for (let key of controlMetadata.customValidators.keys()) {
381
- let validator = controlMetadata.customValidators.get(key);
382
- if (!validator.isValid()) {
383
- return { [key]: true };
384
- }
385
- }
386
- return null;
387
- };
388
- }
389
- ConvertValToNative(controlId, rowId, val) {
390
- let properties;
391
- properties = this.Records.list[0].getControlMetadata(controlId);
392
- switch (properties.dataType) {
393
- case StorageAttribute.BOOLEAN: {
394
- if (typeof val === 'string') {
395
- let ranges = this.GetFldRanges(controlId);
396
- let found = ranges.indexOf(',');
397
- let trueOption = ranges.substr(0, found);
398
- let falseOption = ranges.substr(found + 1);
399
- if (NString.Equals(val, trueOption, true))
400
- return true;
401
- else if (NString.Equals(val, falseOption, true))
402
- return false;
403
- else
404
- return val;
405
- }
406
- else
407
- return val;
408
- }
409
- case StorageAttribute.TIME: {
410
- if (typeof val === 'string') {
411
- let idx = val.indexOf(':', 0);
412
- let hours = +val.substr(0, idx);
413
- let minutes = +val.substr(idx + 1, 2);
414
- let seconds = 0;
415
- if (val.length > 5) {
416
- idx = val.indexOf(':', idx + 1);
417
- if (idx >= 0)
418
- seconds = +val.substr(idx + 1, 2);
419
- }
420
- if (val.indexOf('PM') > 0)
421
- hours += 12;
422
- let dt = new Date();
423
- dt.setHours(hours);
424
- dt.setMinutes(minutes);
425
- dt.setSeconds(seconds);
426
- return dt;
427
- }
428
- else
429
- return val;
430
- }
431
- case StorageAttribute.NUMERIC:
432
- if (isUndefined(val))
433
- return val;
434
- else
435
- return (val != null) ? (typeof val === 'string') ? val : +val : null;
436
- default:
437
- return val;
438
- }
439
- }
440
- ConvertValFromNative(controlId, rowId, val) {
441
- let properties;
442
- properties = this.Records.list[0].getControlMetadata(controlId);
443
- switch (properties.dataType) {
444
- case StorageAttribute.TIME: {
445
- if (val instanceof Date) {
446
- let str = new StringBuilder();
447
- let format = val.getHours() > 9 ? '{0}' : '0{0}';
448
- str.AppendFormat(format, val.getHours().toString());
449
- str.Append(':');
450
- format = val.getMinutes() > 9 ? '{0}' : '0{0}';
451
- str.AppendFormat(format, val.getMinutes().toString());
452
- if (val.getSeconds() > 0) {
453
- str.Append(':');
454
- format = val.getSeconds() > 9 ? '{0}' : '0{0}';
455
- str.AppendFormat(format, val.getSeconds().toString());
456
- }
457
- return str.ToString();
458
- }
459
- else
460
- return val;
461
- }
462
- case StorageAttribute.BOOLEAN: {
463
- let properties;
464
- properties = this.Records.list['0'].getControlMetadata(controlId);
465
- if (typeof val === 'boolean' && properties.rangeValidator) {
466
- let ranges = this.GetFldRanges(controlId);
467
- let found = ranges.indexOf(',');
468
- let trueOption = ranges.substr(0, found);
469
- let falseOption = ranges.substr(found + 1);
470
- if (val)
471
- return trueOption;
472
- else
473
- return falseOption;
474
- }
475
- else
476
- return val;
477
- }
478
- default:
479
- return val;
480
- }
481
- }
482
- resize(pageSize, topGuiRowId) {
483
- let guiEvent = getGuiEventObj('resize', 'table', 0);
484
- guiEvent.PageSize = pageSize;
485
- guiEvent.Line = topGuiRowId;
486
- this.insertEvent(guiEvent);
487
- }
488
- onScrollDown() {
489
- if (!this.Records.includesLast) {
490
- let guiEvent = getGuiEventObj('getRows', '', 0);
491
- guiEvent.Line = this.formGroups.length;
492
- this.insertEvent(guiEvent);
493
- }
494
- }
495
- setTitle(newTitle) {
496
- this.mgTitleService.setTitle(newTitle);
497
- }
498
- getGuiRowId(dvRowId, isTableControl) {
499
- return (isTableControl ? dvRowId + this.Records.recordsBeforeCurrentView : 0);
500
- }
501
- getDvRowId(guiRowId) {
502
- return (guiRowId - this.Records.recordsBeforeCurrentView);
503
- }
504
- dispose() {
505
- this.refreshDom.complete();
506
- this.detectChanges.complete();
507
- this.subscribeInteractiveCommands.unsubscribe();
508
- this.subscribeRefreshDom.unsubscribe();
509
- this.interactiveCommands.complete();
510
- this.customPropertiesSubject.complete();
511
- this.OnSelectedRowChanged.complete();
512
- }
513
- onComboboxSelectionChanged(event, idx, line) {
514
- let guiEvent = getGuiEventObj('selectionchanged', idx, line);
515
- if (typeof (event) == 'number') {
516
- guiEvent.Value = event;
517
- }
518
- else {
519
- if (!isNullOrUndefined(event.target)) {
520
- let indexes = new Array(event.target.selectedOptions.length);
521
- for (let i = 0; i < event.target.selectedOptions.length; i++) {
522
- indexes[i] = event.target.selectedOptions[i].index;
523
- }
524
- guiEvent.Value = indexes.join(',');
525
- }
526
- else
527
- guiEvent.Value = event.value;
528
- }
529
- this.insertEvent(guiEvent);
530
- }
531
- onListBoxSelectionChanged(event, idx) {
532
- let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
533
- let selectedOptions;
534
- if (!isNullOrUndefined(event.target))
535
- selectedOptions = event.target.selectedOptions;
536
- else
537
- selectedOptions = event.source.selectedOptions.selected;
538
- let length = selectedOptions.length;
539
- let indexes = new Array(length);
540
- for (let i = 0; i < length; i++) {
541
- if (!isNullOrUndefined(event.target))
542
- indexes[i] = (selectedOptions[i]).index;
543
- else
544
- indexes[i] = (selectedOptions[i]).value;
545
- }
546
- guiEvent.Value = indexes;
547
- this.insertEvent(guiEvent);
548
- }
549
- onCheckChanged(event, idx, rowId) {
550
- if (typeof rowId === 'undefined')
551
- rowId = 0;
552
- let guiEvent = getGuiEventObj('selectionchanged', idx, rowId);
553
- if (typeof (event) == 'boolean') {
554
- guiEvent.Value = event;
555
- }
556
- else {
557
- if (typeof event.target === 'undefined')
558
- guiEvent.Value = (event).checked;
559
- else
560
- guiEvent.Value = (event.target).checked;
561
- }
562
- this.insertEvent(guiEvent);
563
- }
564
- mgOnTabSelectionChanged(idx, layer) {
565
- let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
566
- guiEvent.Value = layer.toString();
567
- this.insertEvent(guiEvent);
568
- }
569
- mgOnRadioSelectionChanged(idx) {
570
- let result = this.getFormControl('0', idx);
571
- let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
572
- if (typeof result.value !== 'number')
573
- guiEvent.Value = result.value.index;
574
- else
575
- guiEvent.Value = result.value.toString();
576
- this.insertEvent(guiEvent);
577
- }
578
- close() {
579
- this.insertEvent(getGuiEventObj('close', null, 0));
580
- }
581
- IsStub() {
582
- return this.magic.isStub;
583
- }
584
- saveData(data) {
585
- this.magic.saveData(data);
586
- }
587
- createData() {
588
- let myData = {
589
- records: this.Records,
590
- template: this.template
591
- };
592
- let text = 'loadData():any {\n' +
593
- ' let stubData = ' + JSON.stringify(myData) + ';\n' +
594
- ' this.loadStubData(stubData);}';
595
- console.log(text);
596
- this.saveData(text);
597
- }
598
- loadStubData(stubData) {
599
- this.Records = stubData.records;
600
- this.settemplate(stubData.template);
601
- this.taskId = '1';
602
- for (let i = 0; i < this.Records.list.length; i++)
603
- this.buildTableRowControls(i);
604
- }
605
- loadData() {
606
- alert('Please, overwrite method loadData');
607
- }
608
- setStubValue(guiRowId, fc, name) {
609
- if (this.IsStub()) {
610
- try {
611
- let val = this.Records.list[guiRowId].values[name];
612
- fc.setValue(val);
613
- }
614
- catch (e) {
615
- }
616
- }
617
- }
618
- }
619
- TaskMagicService.ɵfac = function TaskMagicService_Factory(t) { return new (t || TaskMagicService)(i0.ɵɵinject(i1.EngineMagicService), i0.ɵɵinject(i2.OverlayWindowService)); };
620
- TaskMagicService.ɵprov = i0.ɵɵdefineInjectable({ token: TaskMagicService, factory: TaskMagicService.ɵfac });
621
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaskMagicService, [{
622
- type: Injectable
623
- }], function () { return [{ type: i1.EngineMagicService }, { type: i2.OverlayWindowService }]; }, null); })();
624
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5tYWdpY3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL3Rhc2subWFnaWNzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixXQUFXLEVBQUUsU0FBUyxFQUFnQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQWtCLE9BQU8sRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxXQUFXLEVBQStCLFlBQVksRUFBa0IsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFZLE1BQU0sbUJBQW1CLENBQUM7QUFJNUQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFNNUQsTUFBTSxPQUFPLGdCQUFnQjtJQXVGM0IsWUFBc0IsS0FBeUIsRUFBVSxvQkFBMEM7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Z0I7dUZBQWhCLGdCQUFnQjtjQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFdmVudEVtaXR0ZXIsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZCwgaXNVbmRlZmluZWR9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtTdHlsZXNNYXBNYW5hZ2VyfSBmcm9tICcuL1N0eWxlc01hcE1hbmFnZXInO1xyXG5cclxuaW1wb3J0IHtFbmdpbmVNYWdpY1NlcnZpY2V9IGZyb20gJy4vZW5naW5lLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge0NvbnRyb2xNZXRhZGF0YSwgUmVjb3Jkc30gZnJvbSAnLi4vY29udHJvbHMubWV0YWRhdGEubW9kZWwnO1xyXG5pbXBvcnQge0NvbW1hbmRUeXBlLCBDdXN0b21WYWxpZGF0b3IsIEd1aUNvbW1hbmQsIEd1aUNvbnN0YW50cywgR3VpSW50ZXJhY3RpdmUsIEh0bWxQcm9wZXJ0aWVzfSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcblxyXG5pbXBvcnQge05TdHJpbmcsIFN0cmluZ0J1aWxkZXJ9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtTdG9yYWdlQXR0cmlidXRlfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtnZXRHdWlFdmVudE9iaiwgSUd1aUV2ZW50fSBmcm9tICdAbWFnaWMteHBhL2VuZ2luZSc7XHJcbmltcG9ydCB7U3ViZm9ybU1hZ2ljU2VydmljZX0gZnJvbSAnLi9zdWJmb3JtLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge1RpdGxlTWFnaWNTZXJ2aWNlfSBmcm9tICcuL3RpdGxlLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FjY2Vzc29yTWFnaWNTZXJ2aWNlfSBmcm9tICcuL2FjY2Vzc29yLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge0d1aUludGVyYWN0aXZlRXhlY3V0b3J9IGZyb20gJy4uL3VpL0d1aUludGVyYWN0aXZlRXhlY3V0b3InO1xyXG5pbXBvcnQge092ZXJsYXlXaW5kb3dTZXJ2aWNlfSBmcm9tICcuL092ZXJsYXlXaW5kb3dTZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBNYWluIHNlcnZpY2UgdG8gY29ubmVjdCB0aGUgVUkgd2l0aCB0aGUgTWFnaWMgV2ViQ0xpZW50XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUYXNrTWFnaWNTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB0byBwcm92aWRlIHRhYmxlLXJlbGF0ZWQgZnVuY3Rpb25hbGl0aWVzXHJcbiAgICovXHJcbiAgcHVibGljIHRhYmxlU2VydmljZTogYW55O1xyXG4gIC8qKlxyXG4gICAqIENvbGxlY3Rpb24gb2YgZGF0YSBmb3IgYWxsIGNvbnRyb2xzXHJcbiAgICovXHJcbiAgUmVjb3JkczogYW55ID0gbmV3IFJlY29yZHMoKTtcclxuICAvKipcclxuICAgKiBGb3JtR3JvdXAgY29sbGVjdGlvbiBmb3IgbGluZSBtb2RlXHJcbiAgICovXHJcbiAgZm9ybUdyb3VwczogQXJyYXk8Rm9ybUdyb3VwPiA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIEZvcm1Hcm91cCBmb3IgYWxsIGNvbnRyb2xzIGluIHNjcmVlbiBtb2RlXHJcbiAgICovXHJcbiAgU2NyZWVuTW9kZUNvbnRyb2xzOiBGb3JtR3JvdXA7XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHJlZnJlc2hEb206IFN1YmplY3Q8R3VpQ29tbWFuZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzdWJzY3JpYmVSZWZyZXNoRG9tOiBTdWJzY3JpcHRpb247XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGRldGVjdENoYW5nZXM6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN1YnNjcmliZUludGVyYWN0aXZlQ29tbWFuZHM6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGludGVyYWN0aXZlQ29tbWFuZHM6IFN1YmplY3Q8R3VpSW50ZXJhY3RpdmU+PSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICogVGhpcyBldmVudCBpcyBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIHJvdyBpbiBhIHRhYmxlIGNoYW5nZXMuXHJcbiAgICovXHJcbiAgT25TZWxlY3RlZFJvd0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjdXN0b21Qcm9wZXJ0aWVzU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICByZWNvcmRzQ291bnRDaGFuZ2VTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBtZ0xvYWRTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIHRlbXBsYXRlOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nOyB9O1xyXG4gIC8qKlxyXG4gICAqIFNlcnZpY2UgdG8gcHJvdmlkZSBzdWJmb3JtLXJlbGF0ZWQgZnVuY3Rpb25hbGl0aWVzXHJcbiAgICovXHJcbiAgcHVibGljIG1nU3ViZm9ybVNlcnZpY2U6IFN1YmZvcm1NYWdpY1NlcnZpY2U7XHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB0byBwcm92aWRlIHRoZSB0aXRsZS1jaGFuZ2UgZnVuY3Rpb25hbGl0eVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtZ1RpdGxlU2VydmljZTogVGl0bGVNYWdpY1NlcnZpY2U7XHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB3aGljaCBlbmFibGVzIGdldHRpbmcvc2V0dGluZyB2YWx1ZXMgZnJvbS90byB0aGUgTWFnaWMgV2ViQ2xpZW50IGVuZ2luZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtZ0FjY2Vzc29yU2VydmljZTogQWNjZXNzb3JNYWdpY1NlcnZpY2U7XHJcblxyXG4gIHB1YmxpYyBtZ0lucHV0RGF0ZUZvcm1hdDtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIG9sZFBhZ2VTaXplID0gMDtcclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gIG1hZ2ljXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIG1hZ2ljOiBFbmdpbmVNYWdpY1NlcnZpY2UsIHByaXZhdGUgb3ZlcmxheVdpbmRvd1NlcnZpY2U6IE92ZXJsYXlXaW5kb3dTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLlJlY29yZHMuc2V0R3VpVG9wSW5kZXgoMCk7XHJcbiAgICB0aGlzLm1nSW5wdXREYXRlRm9ybWF0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gICAvKipcclxuICAgKiByZXR1cm5zIHRydWUgaWYgdXNlZCBpcyBsb2dnZWQgaW5cclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRJc0xvZ2dlbkluKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuZ2V0SXNMb2dnZWRJbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWQgb2YgdGFzayB0byB3aGljaCB0aGlzIHNlcnZpY2UgcmVmZXJzXHJcbiAgICovXHJcbiAgX3Rhc2tJZDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiByZXR1cm5zIHRoZSB0YXNrIElkXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBnZXQgdGFza0lkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRhc2sgSWRcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHRhc2sgaWQgdG8gc2V0XHJcbiAgICovXHJcbiAgc2V0IHRhc2tJZCh2YWx1ZSkge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICB0aGlzLl90YXNrSWQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRhc2sncyBkYXRhIGluIFNjcmVlbiBtb2RlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBnZXQgU2NyZWVuQ29udHJvbHNEYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVjb3Jkcy5saXN0WycwJ107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0dGVtcGxhdGUodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy50ZW1wbGF0ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyB0aGUgRm9ybUNvbnRyb2wgZm9yIGVhY2ggYW5kIGV2ZXJ5IGNvbnRyb2xcclxuICAgKi9cclxuICBidWlsZFNjcmVlbk1vZGVDb250cm9scygpIHtcclxuICAgIGNvbnN0IGdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudGVtcGxhdGUpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnRlbXBsYXRlW2tleV0gPT0gJzAnKSB7XHJcbiAgICAgICAgbGV0IGZjID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgICAgICB0aGlzLnNldFN0dWJWYWx1ZSgwLCBmYywga2V5KTtcclxuICAgICAgICBncm91cC5hZGRDb250cm9sKGtleSwgZmMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5TY3JlZW5Nb2RlQ29udHJvbHMgPSBncm91cDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElzIHRoZSBjb250cm9sIGEgdGFibGUgY29udHJvbFxyXG4gICAqIEBwYXJhbSBpZCBJZCBvZiB0aGUgY29udHJvbFxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgaXNUYWJsZUNvbnRyb2woaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVbaWRdID09ICcxJztcclxuICB9XHJcblxyXG4gIGdldE1nSW5wdXREYXRlRm9ybWF0KCk6IHN0cmluZyB7cmV0dXJuIHRoaXMubWdJbnB1dERhdGVGb3JtYXQ7fVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBGb3JtQ29udHJvbCBvZiBhIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gZ3VpUm93aWQgSWQgb2YgdGhlIHJlcXVlc3RlZCByb3dcclxuICAgKiBAcGFyYW0gaWQgSWQgb2YgdGhlIGNvbnRyb2xcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGdldEZvcm1Db250cm9sKGd1aVJvd2lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgbGV0IGM6IEFic3RyYWN0Q29udHJvbDtcclxuICAgIGxldCBncm91cDogRm9ybUdyb3VwID0gdGhpcy5pc1RhYmxlQ29udHJvbChpZCkgPyB0aGlzLmZvcm1Hcm91cHNbZ3VpUm93aWRdIDogdGhpcy5TY3JlZW5Nb2RlQ29udHJvbHM7XHJcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGdyb3VwKSkge1xyXG4gICAgICBncm91cC5nZXQoaWQpO1xyXG4gICAgICBjID0gZ3JvdXAuY29udHJvbHNbaWRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBoYW5kbGUgdGhlIGNoYW5nZSBvZiB0ZXh0IGZvciBpbnB1dCBjb250cm9sIGluc2lkZSB0YWJsZVxyXG4gICAqIEBwYXJhbSAgZ3VpUm93SWQgSWQgb2YgdGhlIHJvdyBmb3Igd2hpY2ggdGhlIEZvcm1Db250cm9scyBhcmUgYnVpbHRcclxuICAgKiBzZXQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgZm9ybWNvbnRyb2xcclxuICAgKi9cclxuICBzZXRJbnB1dFRleHRWYWx1ZShjb250cm9sSWQ6IHN0cmluZywgZ3VpUm93aWQ6IHN0cmluZywgdmFsOiBhbnkpIHtcclxuICAgIHRoaXMuc2V0VmFsdWUoY29udHJvbElkLCBndWlSb3dpZCwgdGhpcy5Db252ZXJ0VmFsVG9OYXRpdmUoY29udHJvbElkLCAwLCB2YWwpKTtcclxuXHJcbiAgICBjb25zdCBmYyA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2woZ3VpUm93aWQsIGNvbnRyb2xJZCk7XHJcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHZhbCkpXHJcbiAgICAgIGZjLnNldFZhbHVlKHZhbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZCB0aGUgRm9ybUNvbnRyb2xzIGZvciBhIHRhYmxlIHJvd1xyXG4gICAqIEBwYXJhbSAgZ3VpUm93SWQgSWQgb2YgdGhlIHJvdyBmb3Igd2hpY2ggdGhlIEZvcm1Db250cm9scyBhcmUgYnVpbHRcclxuICAgKi9cclxuICBidWlsZFRhYmxlUm93Q29udHJvbHMoZ3VpUm93SWQ6IG51bWJlcikge1xyXG5cclxuICAgIGNvbnN0IGdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnRlbXBsYXRlKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZVtrZXldID09ICcxJykge1xyXG4gICAgICAgIGxldCBmYyA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XHJcbiAgICAgICAgdGhpcy5zZXRTdHViVmFsdWUoZ3VpUm93SWQsIGZjLCBrZXkpO1xyXG4gICAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBmYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZm9ybUdyb3Vwc1tndWlSb3dJZF0gPSBncm91cDtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICB1cGRhdGVSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5SZWNvcmRzLnJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHNldEluY2x1ZGVzRmlyc3QodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5pbmNsdWRlc0ZpcnN0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0SW5jbHVkZXNMYXN0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMuaW5jbHVkZXNMYXN0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgbWFya1Jvd0FzQ3JlYXRlZChndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMubWFya1Jvd0FzQ3JlYXRlZChndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgbWFya1Jvd0FzTm90Q3JlYXRlZChndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMubWFya1Jvd0FzTm90Q3JlYXRlZChndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN0YXJ0Um93RWRpdGluZyhndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMuc3RhcnRSb3dFZGl0aW5nKGd1aVJvd0lkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzdG9wUm93RWRpdGluZyhndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMuc3RvcFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGlzUm93SW5Sb3dFZGl0aW5nKGd1aVJvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMuaXNSb3dJblJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHNldElzRW1wdHlEYXRhVmlldyhpc0VtcHR5OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5SZWNvcmRzLmlzRW1wdHlEYXRhVmlldyAhPT0gaXNFbXB0eSkge1xyXG5cclxuICAgICAgaWYgKGlzRW1wdHkpXHJcbiAgICAgICAgdGhpcy5yZWNvcmRzQ291bnRDaGFuZ2VTdWJqZWN0Lm5leHQoMCk7XHJcblxyXG4gICAgICB0aGlzLlJlY29yZHMuaXNFbXB0eURhdGFWaWV3ID0gaXNFbXB0eTtcclxuICAgICAgdGhpcy50YWJsZVNlcnZpY2UucmVmcmVzaERhdGFTb3VyY2UoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoVmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSB0aGUgc2VydmljZSB0byB3b3JrIHdpdGggdGhlIHRhc2tcclxuICAgKiBAcGFyYW0gdGFza0lkIElkIG9mIHRoZSB0YXNrXHJcbiAgICogQHBhcmFtIHRhc2tEZXNjcmlwdGlvblxyXG4gICAqL1xyXG4gIGluaXRUYXNrKHRhc2tJZCwgdGFza0Rlc2NyaXB0aW9uKSB7XHJcbiAgICB0aGlzLlJlY29yZHMuY3JlYXRlRmlyc3QoKTtcclxuICAgIHRoaXMub2xkUGFnZVNpemUgPSAwO1xyXG4gICAgaWYgKHRoaXMuSXNTdHViKCkpIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50YXNrSWQgPSB0YXNrSWQ7XHJcbiAgICAgIHRoaXMuc2V0dGVtcGxhdGUodGFza0Rlc2NyaXB0aW9uKTtcclxuICAgIH1cclxuICAgIHRoaXMuYnVpbGRTY3JlZW5Nb2RlQ29udHJvbHMoKTtcclxuXHJcbiAgICAvLyByZW1vdmUgcHJldmlvdXMgc3Vic2NyaXB0aW9uc1xyXG4gICAgaWYoIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbSkpXHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbS51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYoIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc3Vic2NyaWJlSW50ZXJhY3RpdmVDb21tYW5kcykpXHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlSW50ZXJhY3RpdmVDb21tYW5kcy51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbSA9IHRoaXMubWFnaWMucmVmcmVzaERvbS5waXBlKGZpbHRlcihjb21tYW5kID0+IGNvbW1hbmQuVGFza1RhZyA9PT0gdGhpcy50YXNrSWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKGNvbW1hbmQgPT4ge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVGFzayBcIiArIGNvbW1hbmQuVGFza1RhZyArIFwiY29tbWFuZCBcIiArIGNvbW1hbmQuQ29tbWFuZFR5cGUpO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVJbnRlcmFjdGl2ZUNvbW1hbmRzID0gdGhpcy5tYWdpYy5pbnRlcmFjdGl2ZUNvbW1hbmRzXHJcbiAgICAgIC5waXBlKGZpbHRlcihjb21tYW5kID0+IGNvbW1hbmQuVGFza1RhZyA9PT0gdGhpcy50YXNrSWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKGNvbW1hbmQgPT4ge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVGFzayBcIiArIGNvbW1hbmQuVGFza1RhZyArIFwiY29tbWFuZCBcIiArIGNvbW1hbmQuQ29tbWFuZFR5cGUpO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZUludGVyYWN0aXZlQ29tbWFuZChjb21tYW5kKTtcclxuICAgICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICByZWZyZXNoVmlldygpIHtcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcy5uZXh0KCcnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydCBhbiBldmVudCB0byB0aGUgTWFnaWMgV2ViQ2xpZW50IGV2ZW50IHF1ZXVlXHJcbiAgICogQHBhcmFtIGd1aUV2ZW50IFRoZSBldmVudCB0byBpbnNlcnRcclxuICAgKi9cclxuICBpbnNlcnRFdmVudChndWlFdmVudDogSUd1aUV2ZW50KTogdm9pZCB7XHJcbiAgICBndWlFdmVudC5UYXNrSUQgPSB0aGlzLnRhc2tJZDtcclxuICAgIHRoaXMubWFnaWMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIEdldENvbnRyb2xQaWN0dXJlTWFzayhjb250cm9sTmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLkdldENvbnRyb2xQaWN0dXJlTWFzayh0aGlzLnRhc2tJZCwgY29udHJvbE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBjb250cm9sIHZhbHVlLCB1c2luZyB0aGUgTWFnaWMgV2ViQ2xpZW50XHJcbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lIElkIG9mIHZhbGlkYXRlZCBjb250cm9sXHJcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZFxyXG4gICAqIEByZXR1cm5zIElmIHZhbGlkYXRpb24gZmFpbHMsIHJldHVybnMgZXJyb3IgbWVzc2FnZSwgZWxzZSByZXR1cm5zIG51bGxcclxuICAgKi9cclxuICBWYWxpZGF0ZUNvbnRyb2xWYWx1ZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLlZhbGlkYXRlQ29udHJvbFZhbHVlKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIEdldFJhbmdlZFZhbHVlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuR2V0UmFuZ2VkVmFsdWUodGhpcy50YXNrSWQsIGNvbnRyb2xOYW1lLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgR2V0RmxkUmFuZ2VzKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuR2V0RmxkUmFuZ2VzKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIHByb3AgUHJvcGVydHlcclxuICAgKiBAcGFyYW0gZ3VpUm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICogQHJldHVybnMgUHJvcGVydHkgdmFsdWVcclxuICAgKi9cclxuICBnZXRQcm9wZXJ0eShjb250cm9sSWQ6IHN0cmluZywgcHJvcDogSHRtbFByb3BlcnRpZXMsIGd1aVJvd0lkPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIGlmICh0aGlzLklzU3R1YigpKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVN0dWIodGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLCBjb250cm9sSWQsIHByb3ApO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCByZWMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF07XHJcbiAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZChyZWMpKVxyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRQcm9wZXJ0eShjb250cm9sSWQsIHByb3ApO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBnZXRQcm9wZXJ0eVN0dWIoQ29udHJvbHNQcm9wZXJ0aWVzOiBhbnksIGNvbnRyb2xJZCwgcHJvcCkge1xyXG4gICAgQ29udHJvbHNQcm9wZXJ0aWVzID0gQ29udHJvbHNQcm9wZXJ0aWVzLkNvbnRyb2xzUHJvcGVydGllcztcclxuICAgIGlmIChjb250cm9sSWQgaW4gQ29udHJvbHNQcm9wZXJ0aWVzKSB7XHJcbiAgICAgIGlmIChwcm9wIGluIENvbnRyb2xzUHJvcGVydGllc1tjb250cm9sSWRdLnByb3BlcnRpZXMpIHtcclxuICAgICAgICByZXR1cm4gQ29udHJvbHNQcm9wZXJ0aWVzW2NvbnRyb2xJZF0ucHJvcGVydGllc1twcm9wXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldFN0eWxlU3R1YihDb250cm9sc1Byb3BlcnRpZXM6IGFueSwgY29udHJvbElkLCBzdHlsZU5hbWU6IHN0cmluZykge1xyXG4gICAgQ29udHJvbHNQcm9wZXJ0aWVzID0gQ29udHJvbHNQcm9wZXJ0aWVzLkNvbnRyb2xzUHJvcGVydGllcztcclxuICAgIHJldHVybiBDb250cm9sc1Byb3BlcnRpZXNbY29udHJvbElkXS5zdHlsZXNNYXAuZ2V0KHN0eWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIENTUyBjbGFzc2VzIHVzZWQgZm9yIHRoaXMgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyBTdHJpbmcgY29udGFpbmluZyB0aGUgY2xhc3NlcyBjdXJyZW50bHkgZGVmaW5lZCBmb3IgdGhpcyBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0Q2xhc3Nlcyhjb250cm9sSWQ6IHN0cmluZywgZ3VpUm93SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGd1aVJvd0lkKSlcclxuICAgICAgZ3VpUm93SWQgPSAnMCc7XHJcbiAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpLmNsYXNzZXM7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHN0eWxlIHVzZWQgZm9yIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBzdHlsZU5hbWUgTmFtZSBvZiBzdHlsZVxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyB2YWx1ZSBvZiBzdHlsZSBvZiB0aGUgY29udHJvbFxyXG4gICAqL1xyXG4gIGdldFN0eWxlKGNvbnRyb2xJZDogc3RyaW5nLCBzdHlsZU5hbWU6IHN0cmluZywgZ3VpUm93SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGd1aVJvd0lkKSlcclxuICAgICAgZ3VpUm93SWQgPSAnMCc7XHJcbiAgICBpZiAodGhpcy5Jc1N0dWIoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3R5bGVTdHViKHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXSwgY29udHJvbElkLCBzdHlsZU5hbWUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBtYWdpY1ZhbHVlID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpLnN0eWxlc01hcC5nZXQoc3R5bGVOYW1lKTtcclxuICAgICAgcmV0dXJuIFN0eWxlc01hcE1hbmFnZXIubWFnaWNWYWx1ZUdldFN0eWxlKHN0eWxlTmFtZSwgbWFnaWNWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyB2YWx1ZSBvZiB0aGUgY29udHJvbFxyXG4gICAqL1xyXG4gIGdldFZhbHVlKGNvbnRyb2xJZDogc3RyaW5nLCBndWlSb3dJZD86IHN0cmluZykge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGd1aVJvd0lkKSlcclxuICAgICAgZ3VpUm93SWQgPSAnMCc7XHJcbiAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3QubGVuZ3RoID4gK2d1aVJvd0lkID8gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLnZhbHVlc1tjb250cm9sSWRdIDogJyc7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgYSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIHZhbHVlIG9mIHRoZSBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0Rm9ybWF0dGVkVmFsdWUoY29udHJvbE5hbWU6IHN0cmluZywgdmFsOiBhbnksIHJvd0lkPzogc3RyaW5nKTogc3RyaW5nIHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5HZXRGb3JtYXR0ZWRWYWx1ZSh0aGlzLnRhc2tJZCwgY29udHJvbE5hbWUsIHZhbCwgcm93SWQpO1xyXG4gfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gZ3VpUm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNldFxyXG4gICAqL1xyXG4gIHNldFZhbHVlKGNvbnRyb2xJZDogc3RyaW5nLCBndWlSb3dJZDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLnNldFZhbHVlKGNvbnRyb2xJZCwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBleGVjdXRlSW50ZXJhY3RpdmVDb21tYW5kKGd1aUludGVyYWN0aXZlQ29tbWFuZDogR3VpSW50ZXJhY3RpdmUpXHJcbiAge1xyXG4gICAgR3VpSW50ZXJhY3RpdmVFeGVjdXRvci5leGVjdXRlSW50ZXJhY3RpdmVDb21tYW5kKHRoaXMsIGd1aUludGVyYWN0aXZlQ29tbWFuZCwgdGhpcy5vdmVybGF5V2luZG93U2VydmljZSk7XHJcbiAgICB0aGlzLmludGVyYWN0aXZlQ29tbWFuZHMubmV4dChndWlJbnRlcmFjdGl2ZUNvbW1hbmQpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgaGFuZGxlU2V0UHJvcGVydHkoY29tbWFuZDogR3VpQ29tbWFuZCwgaXNUYWJsZUNoaWxkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgY29udHJvbElkID0gY29tbWFuZC5DdHJsTmFtZTtcclxuICAgIGxldCBkdlJvd0lkOiBudW1iZXIgPSAoY29tbWFuZC5saW5lIHx8IDApO1xyXG4gICAgbGV0IGd1aVJvd0lkOiBudW1iZXIgPSB0aGlzLmdldEd1aVJvd0lkKGR2Um93SWQsIGlzVGFibGVDaGlsZCk7XHJcbiAgICBsZXQgcHJvcGVydGllczogQ29udHJvbE1ldGFkYXRhO1xyXG5cclxuICAgIGlmIChjb21tYW5kLk9wZXJhdGlvbiA9PT0gSHRtbFByb3BlcnRpZXMuU2VsZWN0ZWRSb3cpIHtcclxuICAgICAgaWYgKGNvbW1hbmQub2JqMSAhPT0gR3VpQ29uc3RhbnRzLk5PX1JPV19TRUxFQ1RFRCkge1xyXG4gICAgICAgIGd1aVJvd0lkID0gdGhpcy5nZXRHdWlSb3dJZChjb21tYW5kLm9iajEsIHRydWUpO1xyXG4gICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgcHJvcGVydGllcy5wcm9wZXJ0aWVzLnNldChjb21tYW5kLk9wZXJhdGlvbiwgY29tbWFuZC5saW5lKTtcclxuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5zZWxlY3RSb3coZ3VpUm93SWQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgdGhpcy5PblNlbGVjdGVkUm93Q2hhbmdlZC5lbWl0KGd1aVJvd0lkLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQuT3BlcmF0aW9uID09PSBIdG1sUHJvcGVydGllcy5FbmFibGVkKSB7XHJcbiAgICAgIGxldCBjID0gdGhpcy5nZXRGb3JtQ29udHJvbChndWlSb3dJZC50b1N0cmluZygpLCBjb250cm9sSWQpO1xyXG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGMpKSB7XHJcbiAgICAgICAgaWYgKGNvbW1hbmQub2JqMSlcclxuICAgICAgICAgIGMuZW5hYmxlKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYy5kaXNhYmxlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgcHJvcGVydGllcy5wcm9wZXJ0aWVzLnNldChjb21tYW5kLk9wZXJhdGlvbiwgY29tbWFuZC5vYmoxKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgIHByb3BlcnRpZXMucHJvcGVydGllcy5zZXQoPEh0bWxQcm9wZXJ0aWVzPmNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQ6IEd1aUNvbW1hbmQpOiB2b2lkIHtcclxuICAgIGxldCBkdlJvd0lkOiBudW1iZXIgPSAoY29tbWFuZC5saW5lIHx8IDApO1xyXG4gICAgbGV0IGd1aVJvd0lkOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGNvbnRyb2xJZCA9IGNvbW1hbmQuQ3RybE5hbWU7XHJcbiAgICBsZXQgcHJvcGVydGllczogQ29udHJvbE1ldGFkYXRhO1xyXG4gICAgbGV0IGlzVGFibGVDaGlsZDogYm9vbGVhbiA9IHRoaXMuaXNUYWJsZUNvbnRyb2woY29udHJvbElkKTtcclxuXHJcbiAgICAvLyBGb3Igbm9uLWlucHV0IHR5cGUgY29udHJvbHMgb24gdGFibGUuXHJcbiAgICBpZiAoY29tbWFuZC5vYmogIT09IG51bGwpXHJcbiAgICAgIGlzVGFibGVDaGlsZCA9IGlzVGFibGVDaGlsZCB8fCBjb21tYW5kLm9iai5Jc1RhYmxlQ2hpbGQ7XHJcblxyXG4gICAgZ3VpUm93SWQgPSB0aGlzLmdldEd1aVJvd0lkKGR2Um93SWQsIGlzVGFibGVDaGlsZCk7XHJcblxyXG4gICAgc3dpdGNoIChjb21tYW5kLkNvbW1hbmRUeXBlKSB7XHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX0lTX0xPR0dFRF9JTjpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1RBQkxFX1RPUF9JTkRFWDpcclxuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRUYWJsZVRvcEluZGV4KGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0s6XHJcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UucmVmcmVzaERhdGFTb3VyY2UoKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JVEVNU19DT1VOVDpcclxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGNvbW1hbmQubnVtYmVyKSkge1xyXG4gICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UudXBkYXRlVGFibGVTaXplKGNvbW1hbmQubnVtYmVyKTtcclxuXHJcbiAgICAgICAgICBpZiAoY29tbWFuZC5udW1iZXIgPiAwICYmIHRoaXMuUmVjb3Jkcy5zaXplVXBkYXRlZCAmJlxyXG4gICAgICAgICAgICAhdGhpcy5SZWNvcmRzLmlzRW1wdHlEYXRhVmlldykge1xyXG4gICAgICAgICAgICB0aGlzLnJlY29yZHNDb3VudENoYW5nZVN1YmplY3QubmV4dChjb21tYW5kLm51bWJlcik7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjb3Jkcy5zaXplVXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfQ0hVTktfU0laRTpcclxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGNvbW1hbmQubnVtYmVyKSkge1xyXG4gICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0Q2h1bmtTaXplKGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVzpcclxuICAgICAgICB0aGlzLnVwZGF0ZVJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyhjb21tYW5kLm51bWJlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLkNSRUFURV9UQUJMRV9ST1c6XHJcbiAgICAgICAgZ3VpUm93SWQgPSB0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQubnVtYmVyLCB0cnVlKTtcclxuICAgICAgICB0aGlzLmJ1aWxkVGFibGVSb3dDb250cm9scyhndWlSb3dJZCk7XHJcbiAgICAgICAgdGhpcy5tYXJrUm93QXNDcmVhdGVkKGd1aVJvd0lkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX0lTX1JPV19FRElUSU5HOlxyXG4gICAgICAgIGd1aVJvd0lkID0gdGhpcy5nZXRHdWlSb3dJZChjb21tYW5kLmxpbmUsIGNvbW1hbmQudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc3RhcnRSb3dFZGl0aW5nKGd1aVJvd0lkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX05PVF9JU19ST1dfRURJVElORzpcclxuICAgICAgICBndWlSb3dJZCA9IHRoaXMuZ2V0R3VpUm93SWQoY29tbWFuZC5saW5lLCBjb21tYW5kLnZhbHVlKTtcclxuICAgICAgICB0aGlzLnN0b3BSb3dFZGl0aW5nKGd1aVJvd0lkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlVORE9fQ1JFQVRFX1RBQkxFX1JPVzpcclxuICAgICAgICB0aGlzLm1hcmtSb3dBc05vdENyZWF0ZWQodGhpcy5nZXRHdWlSb3dJZChjb21tYW5kLm51bWJlciwgdHJ1ZSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNUOlxyXG4gICAgICAgIHRoaXMuc2V0SW5jbHVkZXNGaXJzdChjb21tYW5kLkJvb2wxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfTEFTVDpcclxuICAgICAgICB0aGlzLnNldEluY2x1ZGVzTGFzdChjb21tYW5kLkJvb2wxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWTpcclxuICAgICAgICB0aGlzLmhhbmRsZVNldFByb3BlcnR5KGNvbW1hbmQsIGlzVGFibGVDaGlsZCk7XHJcbiAgICAgICAgaWYgKGNvbW1hbmQuT3BlcmF0aW9uID09IEh0bWxQcm9wZXJ0aWVzLlJlYWRPbmx5IHx8XHJcbiAgICAgICAgICBjb21tYW5kLk9wZXJhdGlvbiA9PSBIdG1sUHJvcGVydGllcy5JdGVtc0xpc3QpXHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hEb20ubmV4dChjb21tYW5kKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuUFJPUF9TRVRfVVNFUl9QUk9QRVJUWTpcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZCwgc2V0IHRoZSBwcm9wZXJ0eSBhbmQgcmFpc2UgdGhlIHN1YmplY3RcclxuICAgICAgICBpZihwcm9wZXJ0aWVzLnVzZXJQcm9wZXJ0aWVzLmdldChjb21tYW5kLk9wZXJhdGlvbikhPT0gY29tbWFuZC5vYmoxKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzLnVzZXJQcm9wZXJ0aWVzLnNldChjb21tYW5kLk9wZXJhdGlvbiwgY29tbWFuZC5vYmoxKTtcclxuICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIG9mIGZvcm1hdCA8Y29udHJvbE5hbWU+fjxwcm9wZXJ0eU5hbWU+XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNTdWJqZWN0Lm5leHQoeyBwcm9wZXJ0eU5hbWU6IGNvbnRyb2xJZCArICd+JyArIGNvbW1hbmQuT3BlcmF0aW9uLCB2YWx1ZTogY29tbWFuZC5vYmoxLCByb3dJZDogZ3VpUm93SWQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5QUk9QX1NFVF9DVVNUT01fVkFMSURBVE9SOiB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG5cclxuICAgICAgICAgIGxldCBjb250cm9sID0gdGhpcy5nZXRGb3JtQ29udHJvbChndWlSb3dJZC50b1N0cmluZygpLCBjb250cm9sSWQpO1xyXG4gICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmN1c3RvbVZhbGlkYXRvcnMuc2V0KGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3IgIT0gbnVsbClcclxuICAgICAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoW2NvbnRyb2wudmFsaWRhdG9yLCB0aGlzLmN1c3RvbVZhbGlkYXRvcihndWlSb3dJZC50b1N0cmluZygpLCBjb250cm9sSWQpXSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5jdXN0b21WYWxpZGF0b3IoZ3VpUm93SWQudG9TdHJpbmcoKSwgY29udHJvbElkKSk7XHJcblxyXG4gICAgICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfQ0xBU1M6XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgICBwcm9wZXJ0aWVzLnNldENsYXNzKGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfU1RZTEU6XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgICBwcm9wZXJ0aWVzLnNldFN0eWxlKGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfQVRUUklCVVRFOlxyXG4gICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFswXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgICBwcm9wZXJ0aWVzLmRhdGFUeXBlID0gPFN0b3JhZ2VBdHRyaWJ1dGU+U3RyaW5nLmZyb21DaGFyQ29kZShjb21tYW5kLm51bWJlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICBDb21tYW5kVHlwZS5TRVRfVkFMVUU6XHJcbiAgICAgICAgdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLnZhbHVlc1tjb250cm9sSWRdID0gY29tbWFuZC52YWx1ZTtcclxuICAgICAgICBsZXQgYyA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2woZ3VpUm93SWQudG9TdHJpbmcoKSwgY29udHJvbElkKTtcclxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGMpKSB7XHJcbiAgICAgICAgICBjLnNldFZhbHVlKHRoaXMuQ29udmVydFZhbEZyb21OYXRpdmUoY29udHJvbElkLCBjb21tYW5kLmxpbmUsIGNvbW1hbmQudmFsdWUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5DUkVBVEVfU1VCX0ZPUk06XHJcbiAgICAgICAgdGhpcy5tZ1N1YmZvcm1TZXJ2aWNlLmFkZFN1YmZvcm1Db21wKGNvbW1hbmQuQ3RybE5hbWUsIGNvbW1hbmQudXNlckRyb3BGb3JtYXQudG9TdHJpbmcoKSwgY29tbWFuZC5zdHIsIGNvbW1hbmQuZmlsZU5hbWUsIGNvbW1hbmQuY29udGV4dElELCBjb21tYW5kLnBhcmFtcywgY29tbWFuZC5Cb29sMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLkNMT1NFX1NVQl9GT1JNOlxyXG4gICAgICAgIHRoaXMubWdTdWJmb3JtU2VydmljZS5kZWxldGVTdWJmb3JtQ29tcChjb21tYW5kLkN0cmxOYW1lLCBjb21tYW5kLnVzZXJEcm9wRm9ybWF0LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfRU1QVFlfREFUQVZJRVc6XHJcbiAgICAgICAgdGhpcy5zZXRJc0VtcHR5RGF0YVZpZXcoY29tbWFuZC5Cb29sMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9GT0NVUzpcclxuICAgICAgICB0aGlzLnJlZnJlc2hEb20ubmV4dChjb21tYW5kKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1dDX0lETEU6XHJcbiAgICAgICAgdGhpcy5tZ0xvYWRTdWJqZWN0Lm5leHQoKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICBjdXN0b20gdmFsaWRhdG9yXHJcbiAgKi9cclxuICBjdXN0b21WYWxpZGF0b3Iocm93aWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcclxuXHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xyXG4gICAgICBsZXQgY29udHJvbE1ldGFkYXRhOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICAgIGNvbnRyb2xNZXRhZGF0YSA9IHRoaXMuUmVjb3Jkcy5saXN0W3Jvd2lkXS5nZXRDb250cm9sTWV0YWRhdGEoaWQpO1xyXG4gICAgICBmb3IgKGxldCBrZXkgb2YgY29udHJvbE1ldGFkYXRhLmN1c3RvbVZhbGlkYXRvcnMua2V5cygpKSB7XHJcbiAgICAgICAgbGV0IHZhbGlkYXRvciA9IGNvbnRyb2xNZXRhZGF0YS5jdXN0b21WYWxpZGF0b3JzLmdldChrZXkpO1xyXG4gICAgICAgIGlmICghKDxDdXN0b21WYWxpZGF0b3I+dmFsaWRhdG9yKS5pc1ZhbGlkKCkpIHtcclxuICAgICAgICAgIHJldHVybiB7IFtrZXldOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENPbnZlcnQgYSB2YWx1ZSBmcm9tIE1hZ2ljIGZvcm1hdCB0byBuYXRpdmUgZm9ybWF0XHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtICByb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcGFyYW0gdmFsIFZhbHVlIHRvIGNvbnZlcnRcclxuICAgKiBAcmV0dXJucyBDb252ZXJ0ZWQgdmFsdWVcclxuICAgKi9cclxuICBDb252ZXJ0VmFsVG9OYXRpdmUoY29udHJvbElkOiBzdHJpbmcsIHJvd0lkOiBudW1iZXIsIHZhbDogYW55KTogYW55IHtcclxuXHJcbiAgICBsZXQgcHJvcGVydGllczogQ29udHJvbE1ldGFkYXRhO1xyXG4gICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0WzBdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG5cclxuICAgIHN3aXRjaCAocHJvcGVydGllcy5kYXRhVHlwZSkge1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46IHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGxldCByYW5nZXM6IHN0cmluZyA9IHRoaXMuR2V0RmxkUmFuZ2VzKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgICBsZXQgZm91bmQ6IG51bWJlciA9IHJhbmdlcy5pbmRleE9mKCcsJyk7XHJcbiAgICAgICAgICBsZXQgdHJ1ZU9wdGlvbjogc3RyaW5nID0gcmFuZ2VzLnN1YnN0cigwLCBmb3VuZCk7XHJcbiAgICAgICAgICBsZXQgZmFsc2VPcHRpb246IHN0cmluZyA9IHJhbmdlcy5zdWJzdHIoZm91bmQgKyAxKTtcclxuICAgICAgICAgIGlmIChOU3RyaW5nLkVxdWFscyh2YWwsIHRydWVPcHRpb24sIHRydWUpKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIGVsc2UgaWYgKE5TdHJpbmcuRXF1YWxzKHZhbCwgZmFsc2VPcHRpb24sIHRydWUpKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRToge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyl7XHJcbiAgICAgICAgbGV0IGlkeCA9IHZhbC5pbmRleE9mKCc6JywwKTtcclxuICAgICAgICBsZXQgaG91cnM6IG51bWJlciA9ICt2YWwuc3Vic3RyKDAsIGlkeCk7XHJcbiAgICAgICAgbGV0IG1pbnV0ZXM6IG51bWJlciA9ICt2YWwuc3Vic3RyKGlkeCsxLCAyKTtcclxuICAgICAgICBsZXQgc2Vjb25kcyA9IDA7XHJcbiAgICAgICAgaWYgKHZhbC5sZW5ndGggPiA1KSB7XHJcbiAgICAgICAgICBpZHggPSB2YWwuaW5kZXhPZignOicsIGlkeCArIDEpO1xyXG4gICAgICAgICAgaWYgKGlkeCA+PSAwKVxyXG4gICAgICAgICAgICBzZWNvbmRzID0gK3ZhbC5zdWJzdHIoaWR4ICsgMSwgMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWwuaW5kZXhPZignUE0nKT4wKVxyXG4gICAgICAgICAgaG91cnMgKz0gMTI7XHJcbiAgICAgICAgbGV0IGR0OiBEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBkdC5zZXRIb3Vycyhob3Vycyk7XHJcbiAgICAgICAgZHQuc2V0TWludXRlcyhtaW51dGVzKTtcclxuICAgICAgICBkdC5zZXRTZWNvbmRzKHNlY29uZHMpO1xyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIGR0O1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsKSlcclxuICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgZWxzZSByZXR1cm4gKHZhbCAhPSBudWxsKSA/ICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgPyB2YWwgOiArdmFsIDogbnVsbDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBhIHZhbHVlIGZyb20gbmF0aXZlIHRvIE1hZ2ljIGZvcm1hdFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSAgcm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICogQHBhcmFtIHZhbCBWYWx1ZSB0byBjb252ZXJ0XHJcbiAgICogQHJldHVybnMgQ29udmVydGVkIHZhbHVlXHJcbiAgICovXHJcbiAgQ29udmVydFZhbEZyb21OYXRpdmUoY29udHJvbElkOiBzdHJpbmcsIHJvd0lkOiBudW1iZXIsIHZhbDogYW55KTogYW55IHtcclxuXHJcbiAgICBsZXQgcHJvcGVydGllczogQ29udHJvbE1ldGFkYXRhO1xyXG4gICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0WzBdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG5cclxuICAgIHN3aXRjaCAocHJvcGVydGllcy5kYXRhVHlwZSkge1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6IHtcclxuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSB2YWwuZ2V0SG91cnMoKSA+IDkgPyAnezB9JyA6ICcwezB9JztcclxuICAgICAgICAgIHN0ci5BcHBlbmRGb3JtYXQoZm9ybWF0LCB2YWwuZ2V0SG91cnMoKS50b1N0cmluZygpKTtcclxuICAgICAgICAgIHN0ci5BcHBlbmQoJzonKTtcclxuICAgICAgICAgIGZvcm1hdCA9IHZhbC5nZXRNaW51dGVzKCkgPiA5ID8gJ3swfScgOiAnMHswfSc7XHJcbiAgICAgICAgICBzdHIuQXBwZW5kRm9ybWF0KGZvcm1hdCwgdmFsLmdldE1pbnV0ZXMoKS50b1N0cmluZygpKTtcclxuICAgICAgICAgIGlmICggdmFsLmdldFNlY29uZHMoKSA+IDApIHtcclxuICAgICAgICAgICAgc3RyLkFwcGVuZCgnOicpO1xyXG4gICAgICAgICAgICBmb3JtYXQgPSB2YWwuZ2V0U2Vjb25kcygpID4gOSA/ICd7MH0nIDogJzB7MH0nO1xyXG4gICAgICAgICAgICBzdHIuQXBwZW5kRm9ybWF0KGZvcm1hdCwgdmFsLmdldFNlY29uZHMoKS50b1N0cmluZygpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBzdHIuVG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46IHtcclxuICAgICAgICBsZXQgcHJvcGVydGllczogQ29udHJvbE1ldGFkYXRhO1xyXG4gICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFsnMCddLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicgJiYgcHJvcGVydGllcy5yYW5nZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgbGV0IHJhbmdlczogc3RyaW5nID0gdGhpcy5HZXRGbGRSYW5nZXMoY29udHJvbElkKTtcclxuICAgICAgICAgIGxldCBmb3VuZDogbnVtYmVyID0gcmFuZ2VzLmluZGV4T2YoJywnKTtcclxuICAgICAgICAgIGxldCB0cnVlT3B0aW9uOiBzdHJpbmcgPSByYW5nZXMuc3Vic3RyKDAsIGZvdW5kKTtcclxuICAgICAgICAgIGxldCBmYWxzZU9wdGlvbjogc3RyaW5nID0gcmFuZ2VzLnN1YnN0cihmb3VuZCArIDEpO1xyXG4gICAgICAgICAgaWYgKHZhbClcclxuICAgICAgICAgICAgcmV0dXJuIHRydWVPcHRpb247XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZU9wdGlvbjtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSByZXNpemUgYW5kIGFsc28gZmV0Y2ggY2h1bmsgb2YgcmVjb3JkcyBpZiBoYXZpbmcgYW4gZW1wdHkgdmlldy5cclxuICAgKiBAaWdub3JlXHJcbiAgICogQHBhcmFtIHBhZ2VTaXplIDogUGFnZVNpemVcclxuICAgKiBAcGFyYW0gdG9wR3VpUm93SWQgOiBHdWlSb3dJZCBvZiBmaXJzdCByZWNvcmQgaW4gdmlldy5cclxuICAgKi9cclxuICAgcmVzaXplKHBhZ2VTaXplOiBudW1iZXIsIHRvcEd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3Jlc2l6ZScsICd0YWJsZScsIDApO1xyXG4gICAgZ3VpRXZlbnQuUGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuXHJcbiAgICAvL0FzICdnZXRSb3dzJyBldmVudCBhbHNvIGdldHMgZXhlY3V0ZWQsIHNldCB0aGUgZ3VpRXZlbnQuTGluZSBwYXJhbWV0ZXIuXHJcbiAgICBndWlFdmVudC5MaW5lID0gdG9wR3VpUm93SWQ7XHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgZGF0YSBmb3IgbmV3IHRhYmxlIHJvd3Mgd2hlbiBzY3JvbGxpbmcgZG9uZVxyXG4gICAqL1xyXG4gIG9uU2Nyb2xsRG93bigpIHtcclxuICAgIGlmICghdGhpcy5SZWNvcmRzLmluY2x1ZGVzTGFzdCkge1xyXG4gICAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdnZXRSb3dzJywgJycsIDApO1xyXG4gICAgICBndWlFdmVudC5MaW5lID0gdGhpcy5mb3JtR3JvdXBzLmxlbmd0aDtcclxuICAgICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBuZXcgYnJvd3NlciB3aW5kb3cgdGl0bGVcclxuICAgKiBAcGFyYW0gbmV3VGl0bGUgTmV3IHdpbmRvdyB0aXRsZVxyXG4gICAqL1xyXG4gIHNldFRpdGxlKG5ld1RpdGxlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubWdUaXRsZVNlcnZpY2Uuc2V0VGl0bGUobmV3VGl0bGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBnZXRHdWlSb3dJZChkdlJvd0lkOiBudW1iZXIsIGlzVGFibGVDb250cm9sOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoaXNUYWJsZUNvbnRyb2wgPyBkdlJvd0lkICsgdGhpcy5SZWNvcmRzLnJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA6IDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZ2V0RHZSb3dJZChndWlSb3dJZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoZ3VpUm93SWQgLSB0aGlzLlJlY29yZHMucmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFuIHVwIHRoZSBzZXJ2aWNlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZFxyXG4gICAqL1xyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICAgdGhpcy5yZWZyZXNoRG9tLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmRldGVjdENoYW5nZXMuY29tcGxldGUoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlSW50ZXJhY3RpdmVDb21tYW5kcy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVSZWZyZXNoRG9tLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgdGhpcy5pbnRlcmFjdGl2ZUNvbW1hbmRzLmNvbXBsZXRlKCk7XHJcbiAgICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzU3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgIHRoaXMuT25TZWxlY3RlZFJvd0NoYW5nZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAvL0V2ZW50czpcclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHRoZSBDb21ib2JveCBcImNoYW5nZVwiIGV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50ICBUaGUgZXZlbnQgcmVjZWl2ZWQgZnJvbSB0aGUgVUlcclxuICAgKiBAcGFyYW0gaWR4IElkIG9mIHRoZSBjb250cm9sIHJhaXNpbmcgdGhlIGV2ZW50XHJcbiAgICogQHBhcmFtIGxpbmUgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICovXHJcbiAgb25Db21ib2JveFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQ6IEV2ZW50LCBpZHg6IHN0cmluZywgbGluZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdzZWxlY3Rpb25jaGFuZ2VkJywgaWR4LCBsaW5lKTtcclxuXHJcbiAgICBpZiAodHlwZW9mIChldmVudCkgPT0gJ251bWJlcicpIHtcclxuICAgICAgICBndWlFdmVudC5WYWx1ZSA9IGV2ZW50O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChldmVudC50YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleGVzOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KCg8YW55PmV2ZW50LnRhcmdldCkuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKDxhbnk+ZXZlbnQudGFyZ2V0KS5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ZXNbaV0gPSAoPEhUTUxPcHRpb25FbGVtZW50Pig8YW55PmV2ZW50LnRhcmdldCkuc2VsZWN0ZWRPcHRpb25zW2ldKS5pbmRleDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBndWlFdmVudC5WYWx1ZSA9IGluZGV4ZXMuam9pbignLCcpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBndWlFdmVudC5WYWx1ZSA9ICg8YW55PmV2ZW50KS52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0aGUgTGlzdGJveCBcImNoYW5nZVwiIGV2ZW50XHJcbiAgICogQHBhcmFtICBldmVudCBUaGUgZXZlbnQgcmVjZWl2ZWQgZnJvbSB0aGUgVUlcclxuICAgKiBAcGFyYW0gaWR4IElkIG9mIHRoZSBjb250cm9sIHJhaXNpbmcgdGhlIGV2ZW50XHJcbiAgICovXHJcbiAgb25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChldmVudDogRXZlbnQsIGlkeDogc3RyaW5nKSB7XHJcbiAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdzZWxlY3Rpb25jaGFuZ2VkJywgaWR4LCAwKTtcclxuXHJcbiAgICBsZXQgc2VsZWN0ZWRPcHRpb25zO1xyXG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChldmVudC50YXJnZXQpKVxyXG4gICAgICBzZWxlY3RlZE9wdGlvbnMgPSAoPGFueT5ldmVudC50YXJnZXQpLnNlbGVjdGVkT3B0aW9ucztcclxuICAgIGVsc2VcclxuICAgICAgc2VsZWN0ZWRPcHRpb25zID0gKDxhbnk+ZXZlbnQpLnNvdXJjZS5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQ7XHJcblxyXG4gICAgbGV0IGxlbmd0aCA9IHNlbGVjdGVkT3B0aW9ucy5sZW5ndGg7XHJcbiAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPihsZW5ndGgpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChldmVudC50YXJnZXQpKVxyXG4gICAgICAgIGluZGV4ZXNbaV0gPSAoc2VsZWN0ZWRPcHRpb25zW2ldKS5pbmRleDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGluZGV4ZXNbaV0gPSAoc2VsZWN0ZWRPcHRpb25zW2ldKS52YWx1ZTtcclxuICAgIH1cclxuICAgIGd1aUV2ZW50LlZhbHVlID0gPGFueT5pbmRleGVzOyAvLyBUT0RPOiBmaXhcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHRoZSBDaGVja2JveCBcImNoYW5nZVwiIGV2ZW50XHJcbiAgICogQHBhcmFtICBldmVudCBUaGUgZXZlbnQgcmVjZWl2ZWQgZnJvbSB0aGUgVUlcclxuICAgKiBAcGFyYW0gaWR4IElkIG9mIHRoZSBjb250cm9sIHJhaXNpbmcgdGhlIGV2ZW50XHJcbiAgICogQHBhcmFtICByb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKi9cclxuICBvbkNoZWNrQ2hhbmdlZChldmVudDogRXZlbnQsIGlkeDogc3RyaW5nLCByb3dJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAodHlwZW9mIHJvd0lkID09PSAndW5kZWZpbmVkJylcclxuICAgICAgcm93SWQgPSAwO1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaignc2VsZWN0aW9uY2hhbmdlZCcsIGlkeCwgcm93SWQpO1xyXG5cclxuICAgIGlmICh0eXBlb2YgKGV2ZW50KSA9PSAnYm9vbGVhbicpIHtcclxuICAgICAgICBndWlFdmVudC5WYWx1ZSA9IGV2ZW50O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudC50YXJnZXQgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICBndWlFdmVudC5WYWx1ZSA9ICg8YW55PihldmVudCkpLmNoZWNrZWQ7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBndWlFdmVudC5WYWx1ZSA9ICg8YW55PihldmVudC50YXJnZXQpKS5jaGVja2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHRhYiBzZWxlY3Rpb24gY2hhbmdlLCBjYXVzZWQgYnkgVUkgZXZlbnRzXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqIEBwYXJhbSAgbGF5ZXIgSWQgb2Ygc2VsZWN0ZWQgdGFicGFnZVxyXG4gICAqL1xyXG4gIG1nT25UYWJTZWxlY3Rpb25DaGFuZ2VkKGlkeDogc3RyaW5nLCBsYXllcjogbnVtYmVyKSB7XHJcbiAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdzZWxlY3Rpb25jaGFuZ2VkJywgaWR4LCAwKTtcclxuICAgIGd1aUV2ZW50LlZhbHVlID0gbGF5ZXIudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0aGUgUmFkaW8gYnV0dG9uIFwiY2hhbmdlXCIgZXZlbnRcclxuICAgKiBAcGFyYW0gIGV2ZW50IFRoZSBldmVudCByZWNlaXZlZCBmcm9tIHRoZSBVSVxyXG4gICAqIEBwYXJhbSBpZHggSWQgb2YgdGhlIGNvbnRyb2wgcmFpc2luZyB0aGUgZXZlbnRcclxuICAgKi9cclxuICBtZ09uUmFkaW9TZWxlY3Rpb25DaGFuZ2VkKGlkeDogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5nZXRGb3JtQ29udHJvbCgnMCcsIGlkeCk7XHJcbiAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdzZWxlY3Rpb25jaGFuZ2VkJywgaWR4LCAwKTtcclxuICAgIGlmKHR5cGVvZiByZXN1bHQudmFsdWUgIT09ICdudW1iZXInKVxyXG4gICAgICBndWlFdmVudC5WYWx1ZSA9IHJlc3VsdC52YWx1ZS5pbmRleDtcclxuICAgIGVsc2VcclxuICAgICAgZ3VpRXZlbnQuVmFsdWUgPSAgcmVzdWx0LnZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydHMgdGhlIFwiY2xvc2VcIiBldmVudCB0byB0aGUgbWFnaWMgV2ViQ2xpZW50IGV2ZW50IHF1ZXVlXHJcbiAgICovXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGdldEd1aUV2ZW50T2JqKCdjbG9zZScsIG51bGwsIDApKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgSXNTdHViKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuaXNTdHViO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgLy8vU3R1YiBoYW5kbGluZ1xyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBqc29uRGF0YTogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2F2ZURhdGEoZGF0YTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm1hZ2ljLnNhdmVEYXRhKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBjcmVhdGVEYXRhKCkge1xyXG4gICAgbGV0IG15RGF0YSA9IHtcclxuICAgICAgcmVjb3JkczogdGhpcy5SZWNvcmRzLFxyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZVxyXG4gICAgfTtcclxuICAgIGxldCB0ZXh0OiBzdHJpbmcgPSAnbG9hZERhdGEoKTphbnkgICB7XFxuJyArXHJcbiAgICAgICcgICAgbGV0IHN0dWJEYXRhID0gJyArIEpTT04uc3RyaW5naWZ5KG15RGF0YSkgKyAnO1xcbicgK1xyXG4gICAgICAnICAgIHRoaXMubG9hZFN0dWJEYXRhKHN0dWJEYXRhKTt9JztcclxuICAgIGNvbnNvbGUubG9nKHRleHQpO1xyXG4gICAgdGhpcy5zYXZlRGF0YSh0ZXh0KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIGxvYWRTdHViRGF0YShzdHViRGF0YTogYW55KSB7XHJcblxyXG4gICAgdGhpcy5SZWNvcmRzID0gc3R1YkRhdGEucmVjb3JkcztcclxuICAgIHRoaXMuc2V0dGVtcGxhdGUoc3R1YkRhdGEudGVtcGxhdGUpO1xyXG4gICAgdGhpcy50YXNrSWQgPSAnMSc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuUmVjb3Jkcy5saXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICB0aGlzLmJ1aWxkVGFibGVSb3dDb250cm9scyhpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwdWJsaWMgbG9hZERhdGEoKSB7XHJcbiAgICBhbGVydCgnUGxlYXNlLCBvdmVyd3JpdGUgbWV0aG9kIGxvYWREYXRhJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0U3R1YlZhbHVlKGd1aVJvd0lkOiBudW1iZXIsIGZjOiBGb3JtQ29udHJvbCwgbmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5Jc1N0dWIoKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCB2YWwgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0udmFsdWVzW25hbWVdO1xyXG4gICAgICAgIGZjLnNldFZhbHVlKHZhbCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRW5kIG9mIHN0dWIgaGFuZGxpblxyXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbn1cclxuXHJcbiJdfQ==