@magic-xpa/angular 4.1200.0-dev4120.6 → 4.1200.0-dev4120.60

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