@magic-xpa/gui 4.1100.0-dev4110.98 → 4.1100.0

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 (195) hide show
  1. package/README.md +7 -7
  2. package/{esm2020 → esm2022}/index.mjs +71 -71
  3. package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
  4. package/esm2022/src/Commands.mjs +184 -0
  5. package/esm2022/src/Events.mjs +425 -0
  6. package/{esm2020 → esm2022}/src/EventsProcessor.mjs +66 -66
  7. package/{esm2020 → esm2022}/src/FocusManager.mjs +33 -33
  8. package/esm2022/src/GuiConstants.mjs +68 -0
  9. package/{esm2020 → esm2022}/src/GuiEnums.mjs +301 -300
  10. package/esm2022/src/GuiEnvironment.mjs +4 -0
  11. package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
  12. package/esm2022/src/Manager.mjs +91 -0
  13. package/esm2022/src/UIBridge.mjs +33 -0
  14. package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
  15. package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
  16. package/esm2022/src/gui/GuiMgControl.mjs +123 -0
  17. package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
  18. package/esm2022/src/gui/KeyboardItem.mjs +135 -0
  19. package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
  20. package/esm2022/src/gui/MgValue.mjs +16 -0
  21. package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
  22. package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
  23. package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
  24. package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
  25. package/esm2022/src/gui/low/GuiInteractive.mjs +178 -0
  26. package/esm2022/src/gui/low/Style.mjs +20 -0
  27. package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
  28. package/esm2022/src/management/data/BlobType.mjs +281 -0
  29. package/esm2022/src/management/data/DcValues.mjs +214 -0
  30. package/{esm2020 → esm2022}/src/management/data/DcValuesBuilderBase.mjs +95 -95
  31. package/esm2022/src/management/data/FieldDef.mjs +331 -0
  32. package/{esm2020 → esm2022}/src/management/data/FieldsTable.mjs +54 -54
  33. package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
  34. package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
  35. package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
  36. package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
  37. package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
  38. package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
  39. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
  40. package/{esm2020 → esm2022}/src/management/data/RecordUtils.mjs +360 -360
  41. package/esm2022/src/management/data/VectorType.mjs +612 -0
  42. package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
  43. package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
  44. package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
  45. package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
  46. package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +305 -0
  47. package/esm2022/src/management/gui/ControlTable.mjs +118 -0
  48. package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
  49. package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
  50. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
  51. package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
  52. package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
  53. package/esm2022/src/management/gui/Helps.mjs +237 -0
  54. package/esm2022/src/management/gui/MgControlBase.mjs +1869 -0
  55. package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
  56. package/esm2022/src/management/gui/PIC.mjs +1185 -0
  57. package/{esm2020 → esm2022}/src/management/gui/PropDefaults.mjs +229 -229
  58. package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
  59. package/esm2022/src/management/gui/PropTable.mjs +221 -0
  60. package/esm2022/src/management/gui/Property.mjs +1362 -0
  61. package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
  62. package/{esm2020 → esm2022}/src/management/gui/ValidationDetailsBase.mjs +93 -93
  63. package/{esm2020 → esm2022}/src/management/gui/WrongFormatException.mjs +29 -29
  64. package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
  65. package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
  66. package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
  67. package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
  68. package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
  69. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
  70. package/{esm2020 → esm2022}/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -41
  71. package/{esm2020 → esm2022}/src/util/MemoryUtil.mjs +34 -34
  72. package/esm2022/src/util/ObjectReference.mjs +36 -0
  73. package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
  74. package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16086 -16095
  75. package/fesm2022/magic-xpa-gui.mjs.map +1 -0
  76. package/index.d.ts +70 -70
  77. package/package.json +6 -12
  78. package/src/Commands.d.ts +40 -40
  79. package/src/Events.d.ts +157 -155
  80. package/src/EventsProcessor.d.ts +13 -13
  81. package/src/FocusManager.d.ts +8 -8
  82. package/src/GuiConstants.d.ts +65 -65
  83. package/src/GuiEnums.d.ts +283 -282
  84. package/src/GuiEnvironment.d.ts +4 -4
  85. package/src/IFlowMonitorQueue.d.ts +3 -3
  86. package/src/Manager.d.ts +26 -26
  87. package/src/UIBridge.d.ts +16 -16
  88. package/src/env/IEnvironment.d.ts +31 -31
  89. package/src/gui/ControlBase.d.ts +4 -4
  90. package/src/gui/GuiMgControl.d.ts +38 -38
  91. package/src/gui/GuiMgForm.d.ts +3 -3
  92. package/src/gui/KeyboardItem.d.ts +18 -18
  93. package/src/gui/LastFocusedVal.d.ts +7 -7
  94. package/src/gui/MgValue.d.ts +15 -15
  95. package/src/gui/PropParentInterface.d.ts +13 -13
  96. package/src/gui/low/DialogHandler.d.ts +4 -4
  97. package/src/gui/low/GuiCommand.d.ts +37 -37
  98. package/src/gui/low/GuiCommandQueue.d.ts +13 -13
  99. package/src/gui/low/GuiInteractive.d.ts +55 -55
  100. package/src/gui/low/Style.d.ts +19 -19
  101. package/src/management/RuntimeContextBase.d.ts +23 -23
  102. package/src/management/data/BlobType.d.ts +29 -29
  103. package/src/management/data/DcValues.d.ts +33 -33
  104. package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
  105. package/src/management/data/FieldDef.d.ts +53 -53
  106. package/src/management/data/FieldsTable.d.ts +16 -16
  107. package/src/management/data/GuiDataViewBase.d.ts +27 -27
  108. package/src/management/data/GuiFieldBase.d.ts +17 -17
  109. package/src/management/data/IRecord.d.ts +12 -12
  110. package/src/management/data/IReferencedObject.d.ts +5 -5
  111. package/src/management/data/NUM_TYPE.d.ts +103 -103
  112. package/src/management/data/ObjectReferenceBase.d.ts +16 -16
  113. package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
  114. package/src/management/data/RecordUtils.d.ts +21 -21
  115. package/src/management/data/VectorType.d.ts +52 -52
  116. package/src/management/data/VectorTypeBase.d.ts +8 -8
  117. package/src/management/events/IActionManager.d.ts +7 -7
  118. package/src/management/events/IGuiEventsManager.d.ts +20 -20
  119. package/src/management/exp/ExpressionInterface.d.ts +242 -242
  120. package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
  121. package/src/management/gui/ControlTable.d.ts +28 -28
  122. package/src/management/gui/DisplayConvertor.d.ts +103 -103
  123. package/src/management/gui/FieldValidator.d.ts +35 -35
  124. package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
  125. package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
  126. package/src/management/gui/HebrewDate.d.ts +46 -46
  127. package/src/management/gui/Helps.d.ts +51 -51
  128. package/src/management/gui/MgControlBase.d.ts +225 -223
  129. package/src/management/gui/MgFormBase.d.ts +160 -160
  130. package/src/management/gui/PIC.d.ts +108 -108
  131. package/src/management/gui/PropDefaults.d.ts +7 -7
  132. package/src/management/gui/PropInterface.d.ts +244 -243
  133. package/src/management/gui/PropTable.d.ts +33 -33
  134. package/src/management/gui/Property.d.ts +121 -121
  135. package/src/management/gui/ValidationDetails.d.ts +52 -52
  136. package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
  137. package/src/management/gui/WrongFormatException.d.ts +9 -9
  138. package/src/management/tasks/GuiDataCollection.d.ts +4 -4
  139. package/src/management/tasks/GuiTaskBase.d.ts +150 -150
  140. package/src/management/tasks/IMGDataTable.d.ts +10 -10
  141. package/src/management/tasks/ITask.d.ts +6 -6
  142. package/src/management/tasks/MgTimer.d.ts +8 -8
  143. package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
  144. package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
  145. package/src/util/MemoryUtil.d.ts +6 -6
  146. package/src/util/ObjectReference.d.ts +9 -9
  147. package/src/util/UsernamePasswordCredentials.d.ts +18 -18
  148. package/esm2020/src/Commands.mjs +0 -184
  149. package/esm2020/src/Events.mjs +0 -420
  150. package/esm2020/src/GuiConstants.mjs +0 -68
  151. package/esm2020/src/GuiEnvironment.mjs +0 -4
  152. package/esm2020/src/Manager.mjs +0 -91
  153. package/esm2020/src/UIBridge.mjs +0 -32
  154. package/esm2020/src/gui/GuiMgControl.mjs +0 -125
  155. package/esm2020/src/gui/KeyboardItem.mjs +0 -135
  156. package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
  157. package/esm2020/src/gui/MgValue.mjs +0 -16
  158. package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
  159. package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
  160. package/esm2020/src/gui/low/GuiInteractive.mjs +0 -176
  161. package/esm2020/src/gui/low/Style.mjs +0 -20
  162. package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
  163. package/esm2020/src/management/data/BlobType.mjs +0 -281
  164. package/esm2020/src/management/data/DcValues.mjs +0 -214
  165. package/esm2020/src/management/data/FieldDef.mjs +0 -331
  166. package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
  167. package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
  168. package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
  169. package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
  170. package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
  171. package/esm2020/src/management/data/VectorType.mjs +0 -612
  172. package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
  173. package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
  174. package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +0 -307
  175. package/esm2020/src/management/gui/ControlTable.mjs +0 -118
  176. package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
  177. package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
  178. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
  179. package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
  180. package/esm2020/src/management/gui/Helps.mjs +0 -237
  181. package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
  182. package/esm2020/src/management/gui/MgFormBase.mjs +0 -741
  183. package/esm2020/src/management/gui/PIC.mjs +0 -1185
  184. package/esm2020/src/management/gui/PropTable.mjs +0 -221
  185. package/esm2020/src/management/gui/Property.mjs +0 -1356
  186. package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
  187. package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
  188. package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
  189. package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
  190. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
  191. package/esm2020/src/util/ObjectReference.mjs +0 -36
  192. package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
  193. package/fesm2015/magic-xpa-gui.mjs +0 -16391
  194. package/fesm2015/magic-xpa-gui.mjs.map +0 -1
  195. package/fesm2020/magic-xpa-gui.mjs.map +0 -1
@@ -0,0 +1,1869 @@
1
+ import { ApplicationException, Debug, Exception, List, NNumber, NString, RefParam, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
2
+ import { GuiFieldBase } from '../data/GuiFieldBase';
3
+ import { ChoiceUtils, Constants, InternalInterface, MagicProperties, MgControlType, Misc, SEQ_2_STR, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
4
+ import { PIC } from './PIC';
5
+ import { PropTable } from './PropTable';
6
+ import { ValidationDetails } from './ValidationDetails';
7
+ import { FieldDef } from '../data/FieldDef';
8
+ import { Property } from './Property';
9
+ import { Manager } from '../../Manager';
10
+ import { CommandType, HtmlProperties } from '../../GuiEnums';
11
+ import { Commands } from '../../Commands';
12
+ import { NUM_TYPE } from '../data/NUM_TYPE';
13
+ import { PropInterface } from './PropInterface';
14
+ import { Events } from '../../Events';
15
+ import { EMPTY_DCREF } from '../data/DcValues';
16
+ import { DisplayConvertor } from './DisplayConvertor';
17
+ import { BlobType } from '../data/BlobType';
18
+ import { VectorType } from '../data/VectorType';
19
+ import { ObjectReference } from '../../util/ObjectReference';
20
+ import { GuiConstants } from '../../GuiConstants';
21
+ import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
22
+ import { FocusManager } from '../../FocusManager';
23
+ export class MgControlBase extends GuiControlPropertyAdapter {
24
+ _ditIdx = 0;
25
+ _linkedControls = null;
26
+ _field = null;
27
+ _picStr = null;
28
+ _choiceDisps = null;
29
+ _choiceLayerList = null;
30
+ _choiceLinks = null;
31
+ _choiceNums = null;
32
+ _containerDitIdx = -1;
33
+ _currReadOnly = null;
34
+ _dataCtrl = false;
35
+ _dcTableRefs = null;
36
+ _firstRefreshProperties = true;
37
+ _form = null;
38
+ _hasValidItmAndDispVal = false;
39
+ _controlIsn = -1;
40
+ _linkedParentDitIdx = -1;
41
+ _orgChoiceDisps = null;
42
+ _parentTable = null;
43
+ _pic = null;
44
+ _picExpExists = false;
45
+ _prevIsNulls = null;
46
+ _prevPicExpResult = null;
47
+ _prevValues = null;
48
+ _propTab = null;
49
+ _range = null;
50
+ _rangeChanged = false;
51
+ _valExpId = 0;
52
+ _vd = null;
53
+ _dcValId = -2;
54
+ parent = 0;
55
+ veeIndx = 0;
56
+ SourceTableReference = null;
57
+ ClipBoardDataExists = false;
58
+ DataType = StorageAttribute.NONE;
59
+ KeyStrokeOn = false;
60
+ ModifiedByUser = false;
61
+ Value = null;
62
+ IsNull = false;
63
+ forceRefresh = false;
64
+ _isModal;
65
+ set Form(value) {
66
+ this._form = value;
67
+ this.GuiMgForm = value;
68
+ }
69
+ get Form() {
70
+ return this._form;
71
+ }
72
+ get ControlIsn() {
73
+ return this._controlIsn;
74
+ }
75
+ RefreshOnVisible = false;
76
+ InControl = false;
77
+ ValidateControl = false;
78
+ PromptHelp = null;
79
+ constructor(type, parentMgForm, parentControl) {
80
+ super();
81
+ if (arguments.length === 0) {
82
+ this.constructor_0();
83
+ return;
84
+ }
85
+ this.constructor_1(type, parentMgForm, parentControl);
86
+ }
87
+ constructor_0() {
88
+ this._linkedControls = new List();
89
+ this.DataType = StorageAttribute.NONE;
90
+ }
91
+ constructor_1(type, parentMgForm, parentControl) {
92
+ this.constructor_0();
93
+ this.initReferences(parentMgForm);
94
+ this.Type = type;
95
+ this._containerDitIdx = parentControl;
96
+ this._linkedParentDitIdx = parentControl;
97
+ this._propTab = new PropTable(this);
98
+ this.createArrays(false);
99
+ }
100
+ get UniqueName() {
101
+ return this.Name;
102
+ }
103
+ get TaskTag() {
104
+ return this.Form.getTask().getTaskTag();
105
+ }
106
+ checkIfExistProp(propId) {
107
+ let exist = false;
108
+ if (this._propTab !== null) {
109
+ let propById = this._propTab.getPropById(propId);
110
+ exist = (propById !== null);
111
+ }
112
+ return exist;
113
+ }
114
+ getProp(propId) {
115
+ let prop = null;
116
+ if (this._propTab !== null) {
117
+ prop = this._propTab.getPropById(propId);
118
+ if (prop === null) {
119
+ prop = Property.getDefaultProp(propId, 'C', this);
120
+ if (prop !== null) {
121
+ this._propTab.addProp(prop);
122
+ }
123
+ }
124
+ }
125
+ return prop;
126
+ }
127
+ getForm() {
128
+ return this.Form;
129
+ }
130
+ getCompIdx() {
131
+ return this.getForm().getTask().getCompIdx();
132
+ }
133
+ IsFirstRefreshOfProps() {
134
+ return this._firstRefreshProperties;
135
+ }
136
+ async EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
137
+ return await this.getForm().getTask().EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated);
138
+ }
139
+ GetExpressionStorage(expId) {
140
+ return this.getForm().getTask().GetExpressionStorage(expId);
141
+ }
142
+ GetComputedProperty(propId) {
143
+ let prop = null;
144
+ if (this._propTab !== null)
145
+ prop = this._propTab.getPropById(propId);
146
+ return prop;
147
+ }
148
+ initReferences(mgForm) {
149
+ this.Form = mgForm;
150
+ }
151
+ createArrays(forceCreateArrays) {
152
+ if (this._firstRefreshProperties || forceCreateArrays) {
153
+ if (this.SupportsDataSource()) {
154
+ this._dcTableRefs = new List();
155
+ }
156
+ this._prevValues = new List();
157
+ if (!forceCreateArrays) {
158
+ this._currReadOnly = new List();
159
+ }
160
+ this._choiceDisps = new List();
161
+ this._orgChoiceDisps = new List();
162
+ this._choiceLinks = new List();
163
+ this._choiceNums = new List();
164
+ this._prevIsNulls = new List();
165
+ this._choiceLayerList = new List();
166
+ if (!this.IsRepeatable && !super.isTableControl()) {
167
+ this.updateArrays(1);
168
+ }
169
+ }
170
+ }
171
+ async SetFocus(ctrl, line, activateForm) {
172
+ await FocusManager.SetFocus(ctrl.getForm().getTask(), ctrl, line, activateForm);
173
+ }
174
+ InsertArrays(idx, count) {
175
+ this._prevValues.InsertRange(new Array(count));
176
+ this._prevIsNulls.InsertRange(new Array(count));
177
+ this._currReadOnly.InsertRange(new Array(count));
178
+ this._choiceDisps.InsertRange(new Array(count));
179
+ this._orgChoiceDisps.InsertRange(new Array(count));
180
+ this._choiceLinks.InsertRange(new Array(count));
181
+ this._choiceLayerList.InsertRange(new Array(count));
182
+ this._choiceNums.InsertRange(new Array(count));
183
+ if (this.SupportsDataSource())
184
+ this._dcTableRefs.InsertRange(new Array(count));
185
+ this._propTab.InsertPrevValueArray(count);
186
+ }
187
+ updateArrays(newSize) {
188
+ this._prevValues.SetSize(newSize);
189
+ this._prevIsNulls.SetSize(newSize);
190
+ this._currReadOnly.SetSize(newSize);
191
+ this._choiceDisps.SetSize(newSize);
192
+ this._orgChoiceDisps.SetSize(newSize);
193
+ this._choiceLinks.SetSize(newSize);
194
+ this._choiceLayerList.SetSize(newSize);
195
+ this._choiceNums.SetSize(newSize);
196
+ if (this.SupportsDataSource()) {
197
+ this._dcTableRefs.SetSize(newSize);
198
+ }
199
+ this._propTab.updatePrevValueArray(newSize);
200
+ }
201
+ updatePrevValArrays(newSize) {
202
+ this._propTab.updatePrevValueArray(newSize);
203
+ }
204
+ fillData(mgForm, ditIdx, parser) {
205
+ if (this.Form === null) {
206
+ this.initReferences(mgForm);
207
+ }
208
+ this._ditIdx = ditIdx;
209
+ while (this.initInnerObjects(parser.getNextTag(), parser)) {
210
+ }
211
+ if (this.DataType === StorageAttribute.BLOB && this._picStr === null) {
212
+ this._picStr = "";
213
+ }
214
+ if (this._picStr !== null && typeof this.DataType !== "undefined") {
215
+ this.setPIC(this._picStr);
216
+ }
217
+ else {
218
+ switch (this.Type) {
219
+ case MgControlType.CTRL_TYPE_IMAGE:
220
+ case MgControlType.CTRL_TYPE_BROWSER:
221
+ case MgControlType.CTRL_TYPE_BUTTON:
222
+ if (this.DataType === StorageAttribute.NONE)
223
+ this.DataType = StorageAttribute.ALPHA;
224
+ break;
225
+ case MgControlType.CTRL_TYPE_TABLE:
226
+ case MgControlType.CTRL_TYPE_COLUMN:
227
+ case MgControlType.CTRL_TYPE_SUBFORM:
228
+ case MgControlType.CTRL_TYPE_GROUP:
229
+ case MgControlType.CTRL_TYPE_FRAME_SET:
230
+ case MgControlType.CTRL_TYPE_FRAME_FORM:
231
+ case MgControlType.CTRL_TYPE_CONTAINER:
232
+ case MgControlType.CTRL_TYPE_LINE:
233
+ break;
234
+ default:
235
+ Events.WriteExceptionToLog(NString.Format("in Control.fillData(): missing datatype or picture string for control: {0}", this.Name));
236
+ break;
237
+ }
238
+ }
239
+ if (super.isTableControl()) {
240
+ this.Form.setTableCtrl(this);
241
+ }
242
+ this.createArrays(false);
243
+ }
244
+ initInnerObjects(foundTagName, parser) {
245
+ if (foundTagName === null)
246
+ return false;
247
+ if (foundTagName === XMLConstants.MG_TAG_PROP) {
248
+ if (this._propTab === null)
249
+ this._propTab = new PropTable(this);
250
+ this._propTab.fillData(this, 'C', parser);
251
+ }
252
+ else if (foundTagName === XMLConstants.MG_TAG_CONTROL)
253
+ this.parseAttributes(parser);
254
+ else if (foundTagName === "SourceTable")
255
+ this.ParseSourceTable(parser);
256
+ else if (foundTagName === "/" + XMLConstants.MG_TAG_CONTROL) {
257
+ parser.setCurrIndex2EndOfTag();
258
+ return false;
259
+ }
260
+ else {
261
+ Events.WriteExceptionToLog(NString.Format("There is no such tag in Control. Insert else if to Control.initInnerObjects for {0}", foundTagName));
262
+ return false;
263
+ }
264
+ return true;
265
+ }
266
+ ParseSourceTable(parser) {
267
+ parser.setCurrIndex2EndOfTag();
268
+ let objRefStr = parser.ReadToEndOfCurrentElement();
269
+ let sourceTableReference = ObjectReference.FromXML(objRefStr.trim());
270
+ this.SourceTableReference = sourceTableReference;
271
+ parser.setCurrIndex2EndOfTag();
272
+ }
273
+ parseAttributes(parser) {
274
+ let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
275
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
276
+ let tag = parser.getXMLsubstring(endContext);
277
+ parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_CONTROL) + XMLConstants.MG_TAG_CONTROL.length);
278
+ let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
279
+ for (let i = 0; i < tokens.length; i = i + 2) {
280
+ let attribute = tokens.get_Item(i);
281
+ let valueStr = tokens.get_Item(i + 1);
282
+ this.SetAttribute(attribute, valueStr);
283
+ }
284
+ parser.setCurrIndex(endContext + 1);
285
+ }
286
+ else {
287
+ Events.WriteExceptionToLog("in Control.FillName() out of string bounds");
288
+ }
289
+ }
290
+ SetAttribute(attribute, valueStr) {
291
+ let isTagProcessed = true;
292
+ switch (attribute) {
293
+ case XMLConstants.MG_ATTR_TYPE:
294
+ this.Type = valueStr[0];
295
+ break;
296
+ case XMLConstants.MG_ATTR_DATA_CTRL:
297
+ this._dataCtrl = XmlParser.getBoolean(valueStr);
298
+ break;
299
+ case XMLConstants.MG_ATTR_LINKED_PARENT:
300
+ this.setLinkedParentIdx(XmlParser.getInt(valueStr));
301
+ break;
302
+ case XMLConstants.MG_ATTR_CONTAINER:
303
+ this.setContainer(XmlParser.getInt(valueStr));
304
+ break;
305
+ case XMLConstants.MG_ATTR_CONTROL_ISN:
306
+ this._controlIsn = XmlParser.getInt(valueStr);
307
+ break;
308
+ case XMLConstants.MG_ATTR_IS_MODAL:
309
+ this._isModal = XmlParser.getBoolean(valueStr);
310
+ break;
311
+ case XMLConstants.MG_ATTR_CONTROL_Z_ORDER:
312
+ break;
313
+ case XMLConstants.MG_HOR_ALIGMENT_IS_INHERITED:
314
+ break;
315
+ default:
316
+ isTagProcessed = false;
317
+ break;
318
+ }
319
+ return isTagProcessed;
320
+ }
321
+ setImage() {
322
+ let newVal = this.Value;
323
+ if (newVal === null || this.IsNull) {
324
+ newVal = "";
325
+ }
326
+ if (this.DataType === StorageAttribute.BLOB) {
327
+ }
328
+ else {
329
+ this.setImageWithFileName(newVal);
330
+ }
331
+ }
332
+ setImageWithFileName(fileName) {
333
+ if (fileName === null) {
334
+ fileName = "";
335
+ }
336
+ fileName = Events.TranslateLogicalName(fileName);
337
+ if (!Misc.IsWebUrl(fileName))
338
+ fileName = Events.GetAssetsURL() + "/images/" + fileName;
339
+ if (this.IsImageButton()) {
340
+ Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, fileName);
341
+ }
342
+ else {
343
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Image, fileName);
344
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), fileName);
345
+ }
346
+ }
347
+ setContainer(containerIdx) {
348
+ this._containerDitIdx = containerIdx;
349
+ let container = null;
350
+ if (this._containerDitIdx !== -1) {
351
+ container = this.Form.getCtrl(this._containerDitIdx);
352
+ }
353
+ if (container !== null && container.Type === MgControlType.CTRL_TYPE_TABLE) {
354
+ this._parentTable = container;
355
+ }
356
+ this.IsRepeatable = (this._parentTable !== null && !super.isColumnControl());
357
+ }
358
+ getName() {
359
+ return this.Name;
360
+ }
361
+ getLinkedControls() {
362
+ return this._linkedControls;
363
+ }
364
+ isRepeatable() {
365
+ return this.IsRepeatable;
366
+ }
367
+ IsModal() {
368
+ return this._isModal;
369
+ }
370
+ getDisplayLine(useLineForItems) {
371
+ let line = 0;
372
+ if (this.IsRepeatable || (useLineForItems && super.isTableControl())) {
373
+ line = this.Form.DisplayLine;
374
+ }
375
+ return line;
376
+ }
377
+ isVisible() {
378
+ let result = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true);
379
+ if (result) {
380
+ result = this.isParentPropValue(PropInterface.PROP_TYPE_VISIBLE);
381
+ }
382
+ return result;
383
+ }
384
+ isEnabled() {
385
+ return this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true);
386
+ }
387
+ isModifiable() {
388
+ let modifiable = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFIABLE, true);
389
+ let taskInQuery = this.getForm().getTask().getMode() === Constants.TASK_MODE_QUERY;
390
+ let modifyInQuery = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false);
391
+ let result = modifiable && (modifyInQuery || !taskInQuery);
392
+ if (result && this._field != null) {
393
+ result = (this._field.DbModifiable || this.getForm().getTask().getMode() === Constants.TASK_MODE_CREATE);
394
+ }
395
+ return result;
396
+ }
397
+ getDcVals() {
398
+ let dataView = this.getForm().getTask().DataView;
399
+ let dcv = null;
400
+ if (this._dcValId === EMPTY_DCREF) {
401
+ dcv = ((this.DataType === StorageAttribute.BLOB_VECTOR) ? dataView.getEmptyChoiceForVectors() : dataView.getEmptyChoice());
402
+ }
403
+ else {
404
+ if (this._dcValId > -1) {
405
+ dcv = dataView.getDcValues(this._dcValId);
406
+ }
407
+ }
408
+ return dcv;
409
+ }
410
+ getPrevIsNull() {
411
+ let line = this.getDisplayLine(true);
412
+ let currObj = this._prevIsNulls.get_Item(line);
413
+ let curr;
414
+ if (currObj === null) {
415
+ curr = false;
416
+ this._prevIsNulls.set_Item(line, curr);
417
+ }
418
+ else {
419
+ curr = currObj;
420
+ }
421
+ return curr;
422
+ }
423
+ setPrevIsNull(newValue) {
424
+ this._prevIsNulls.set_Item(this.getDisplayLine(true), newValue);
425
+ }
426
+ setPIC(picStr) {
427
+ if (super.isButton()) {
428
+ this._picStr = (super.IsImageButton() ? "" + XMLConstants.FILE_NAME_SIZE.toString() : Events.Translate(picStr));
429
+ }
430
+ else {
431
+ this._picStr = picStr;
432
+ }
433
+ this._pic = new PIC(this._picStr, this.DataType, this.getForm().getTask().getCompIdx());
434
+ if (this._dataCtrl && this._picStr.indexOf('H') > -1) {
435
+ this._pic.setHebrew();
436
+ }
437
+ }
438
+ getPIC() {
439
+ if (this._picExpExists)
440
+ this._pic.setFormatExp(this._picExpExists);
441
+ return this._pic;
442
+ }
443
+ getParent() {
444
+ let retParent = this.Form;
445
+ if (this._containerDitIdx !== -1) {
446
+ retParent = this.Form.getCtrl(this._containerDitIdx);
447
+ }
448
+ else {
449
+ if (this.Form.isSubForm()) {
450
+ retParent = this.Form.getSubFormCtrl();
451
+ }
452
+ }
453
+ return retParent;
454
+ }
455
+ getField() {
456
+ return this._field;
457
+ }
458
+ setField(fieldOrFieldStrID) {
459
+ if (fieldOrFieldStrID === null || fieldOrFieldStrID instanceof GuiFieldBase) {
460
+ this.setField_0(fieldOrFieldStrID);
461
+ return;
462
+ }
463
+ this.setField_1(fieldOrFieldStrID);
464
+ }
465
+ setField_0(field) {
466
+ this._field = field;
467
+ if (field !== null) {
468
+ this._field.SetControl(this);
469
+ }
470
+ }
471
+ setField_1(fieldStrID) {
472
+ let returnField = this.getFieldByValueStr(fieldStrID);
473
+ if (returnField !== null) {
474
+ this._field = returnField;
475
+ this._field.SetControl(this);
476
+ return;
477
+ }
478
+ throw new ApplicationException("in Control.setField(): illegal field identifier: " + fieldStrID);
479
+ }
480
+ setPicStr(format, expId) {
481
+ this._picStr = format;
482
+ if (expId > 0) {
483
+ this._picExpExists = true;
484
+ }
485
+ }
486
+ setRange(newRange) {
487
+ this._range = newRange;
488
+ this._vd = null;
489
+ }
490
+ setValExp(expId) {
491
+ this._valExpId = expId;
492
+ }
493
+ buildCopyPicture(oldVal, newVal) {
494
+ if (super.isTableControl() || super.isColumnControl()) {
495
+ return null;
496
+ }
497
+ else {
498
+ let copyVD = this.getCopyOfVD();
499
+ copyVD.setValue(newVal);
500
+ copyVD.setOldValue(oldVal);
501
+ return copyVD;
502
+ }
503
+ }
504
+ getCopyOfVD() {
505
+ let result;
506
+ if (this._vd === null) {
507
+ result = new ValidationDetails(this.Value, this.Value, this._range, this._pic, this);
508
+ }
509
+ else {
510
+ result = new ValidationDetails(this._vd);
511
+ }
512
+ return result;
513
+ }
514
+ getRanges() {
515
+ return this._range;
516
+ }
517
+ getRangedValue(newVal) {
518
+ let vd;
519
+ vd = this.buildPicture(this.Value, newVal);
520
+ vd.evaluate();
521
+ this.ModifiedByUser = true;
522
+ let val = vd.getDispValue();
523
+ return (val.toString());
524
+ }
525
+ validate(newVal) {
526
+ let vd;
527
+ let modified = this.ModifiedByUser;
528
+ this.ModifiedByUser = true;
529
+ vd = this.buildPicture(this.Value, newVal);
530
+ vd.evaluate();
531
+ this.ModifiedByUser = modified;
532
+ if (vd.ValidationFailed)
533
+ return vd.ErrorMessage;
534
+ else
535
+ return null;
536
+ }
537
+ getFieldByValueStr(valueStr) {
538
+ let refParent = new RefParam(this.parent);
539
+ let refVeeIndx = new RefParam(this.veeIndx);
540
+ let ret = this.getForm().getTask().getFieldByValueStr(valueStr, refParent, refVeeIndx);
541
+ this.parent = refParent.value;
542
+ this.veeIndx = refVeeIndx.value;
543
+ return ret;
544
+ }
545
+ hasContainer() {
546
+ return this._containerDitIdx !== -1;
547
+ }
548
+ getLayer() {
549
+ return this.Layer;
550
+ }
551
+ computePIC(picExpResult) {
552
+ let picResult = (picExpResult !== null && super.isButton()) ? Events.Translate(picExpResult) : picExpResult;
553
+ if (this._prevPicExpResult === null || !(this._prevPicExpResult === picResult)) {
554
+ this._pic = new PIC(picResult, this.DataType, this.getForm().getTask().getCompIdx());
555
+ this._prevPicExpResult = picResult;
556
+ }
557
+ return this._pic;
558
+ }
559
+ getCurrentIndexOfChoice() {
560
+ let selectedIndice = [-1];
561
+ let val = this.Value;
562
+ if (!NString.IsNullOrEmpty(val)) {
563
+ let array2 = val.split(',');
564
+ selectedIndice = new Array(array2.length);
565
+ for (let iCtr = 0; iCtr < array2.length; iCtr = iCtr + 1) {
566
+ let num = NNumber.Parse(array2[iCtr]);
567
+ selectedIndice[iCtr] = ((num >= 0) ? num : -1);
568
+ }
569
+ }
570
+ return selectedIndice;
571
+ }
572
+ IsMultipleSelectionListBox() {
573
+ return super.isListBox();
574
+ }
575
+ IsDateTimePicture() {
576
+ return this._pic.getAttr() === StorageAttribute.DATE || this._pic.getAttr() === StorageAttribute.TIME;
577
+ }
578
+ SupportsDataSource() {
579
+ return super.isSelectionCtrl() || super.isTabControl() || super.isRadio() || this.HasAutocomplete();
580
+ }
581
+ HasAutocomplete() {
582
+ if (super.isTextControl())
583
+ return this.getProp(PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC).GetComputedValueBoolean();
584
+ return false;
585
+ }
586
+ async getIndexOfChoice(mgVal, line, isNull) {
587
+ let splitCommaSeperatedVals = this.IsMultipleSelectionListBox();
588
+ await this.computeChoice(line);
589
+ let isVectorValue = this.getField() !== null && this.getField().getType() === StorageAttribute.BLOB_VECTOR;
590
+ return this.getDcVals().getIndexOf(mgVal, isVectorValue, isNull, this._choiceLinks.get_Item(line), this._choiceNums.get_Item(line), splitCommaSeperatedVals);
591
+ }
592
+ async getDispVals(line, execComputeChoice) {
593
+ if (execComputeChoice) {
594
+ await this.computeChoice(line);
595
+ }
596
+ if (super.isTabControl()) {
597
+ return this._orgChoiceDisps.get_Item(line);
598
+ }
599
+ else {
600
+ return this._choiceDisps.get_Item(line);
601
+ }
602
+ }
603
+ emptyChoice(line) {
604
+ let value = new Array(0);
605
+ this._choiceDisps.set_Item(line, value);
606
+ this._orgChoiceDisps.set_Item(line, value);
607
+ this._choiceLinks.set_Item(line, value);
608
+ this._choiceLayerList.set_Item(line, value);
609
+ }
610
+ async computeChoice(line) {
611
+ let fromHelp = [
612
+ "\\\\", "\\-", "\\,"
613
+ ];
614
+ let toHelp = [
615
+ "XX", "XX", "XX"
616
+ ];
617
+ let task = this.getForm().getTask();
618
+ let dataView = task.DataView;
619
+ let dcv = dataView.getDcValues(this._dcValId);
620
+ let currDcId = this.getDcRef();
621
+ let choiceDispStr = null;
622
+ let choiceLinkStr = "";
623
+ let optionsValid = true;
624
+ let trimToLength = -1;
625
+ let dataType = this.DataType;
626
+ let isItemsListTreatedAsDisplayList = false;
627
+ try {
628
+ if (this._choiceLinks.get_Item(line) === null || (this.isDataCtrl() && currDcId !== this._dcValId)) {
629
+ if (dataType === StorageAttribute.BLOB_VECTOR) {
630
+ dataType = this.getField().getCellsType();
631
+ }
632
+ let dispVals = dcv.getDispVals();
633
+ let dispProp = this.getProp(PropInterface.PROP_TYPE_DISPLAY_LIST);
634
+ let linkProp = this.getProp(PropInterface.PROP_TYPE_LABEL);
635
+ if (dispProp !== null) {
636
+ choiceDispStr = await dispProp.getValue();
637
+ }
638
+ if (linkProp !== null) {
639
+ choiceLinkStr = await linkProp.getValue();
640
+ }
641
+ if (choiceLinkStr === null || StrUtil.rtrim(choiceLinkStr).length === 0) {
642
+ choiceLinkStr = "";
643
+ }
644
+ if (choiceDispStr === null || StrUtil.rtrim(choiceDispStr).length === 0) {
645
+ if (!this.isDataCtrl() || dispVals === null || dispVals.length === 0) {
646
+ choiceDispStr = choiceLinkStr;
647
+ }
648
+ else {
649
+ choiceDispStr = (choiceLinkStr = "");
650
+ }
651
+ isItemsListTreatedAsDisplayList = true;
652
+ }
653
+ choiceDispStr = Events.Translate(choiceDispStr);
654
+ if (dataType === StorageAttribute.NUMERIC) {
655
+ choiceLinkStr = StrUtil.searchAndReplace(choiceLinkStr, "\\-", "-");
656
+ }
657
+ let helpStr = StrUtil.searchAndReplace(choiceLinkStr, fromHelp, toHelp);
658
+ let sTok = StrUtil.tokenize(helpStr, ",");
659
+ let linkSize = (helpStr !== "") ? sTok.length : 0;
660
+ let helpStrDisp = StrUtil.searchAndReplace(choiceDispStr, fromHelp, toHelp);
661
+ sTok = StrUtil.tokenize(helpStrDisp, ",");
662
+ let displaySize = (helpStrDisp !== "") ? sTok.length : 0;
663
+ if (linkSize !== displaySize && displaySize > 0) {
664
+ choiceDispStr = choiceLinkStr;
665
+ isItemsListTreatedAsDisplayList = true;
666
+ }
667
+ let size = linkSize;
668
+ let choiceLink = new Array(size);
669
+ this._choiceLinks.set_Item(line, choiceLink);
670
+ if (dataType === StorageAttribute.NUMERIC || dataType === StorageAttribute.DATE || dataType === StorageAttribute.TIME) {
671
+ this._choiceNums.set_Item(line, new Array(size));
672
+ }
673
+ let orgChoiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, false, true, !isItemsListTreatedAsDisplayList);
674
+ this._orgChoiceDisps.set_Item(line, orgChoiceDisp);
675
+ let choiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, super.isSelectionCtrl() || super.isTabControl(), true, !isItemsListTreatedAsDisplayList);
676
+ this._choiceDisps.set_Item(line, choiceDisp);
677
+ if (this.getField() !== null) {
678
+ trimToLength = this.getField().getSize();
679
+ }
680
+ let token = null;
681
+ let helpToken = null;
682
+ let tokenBuffer;
683
+ for (let i = 0, currPos = 0, nextPos = 0; i < size && optionsValid; i++) {
684
+ nextPos = currPos;
685
+ nextPos = helpStr.indexOf(',', nextPos);
686
+ if (nextPos === currPos)
687
+ token = helpToken = "";
688
+ else if (nextPos === -1) {
689
+ token = choiceLinkStr.substr(currPos);
690
+ helpToken = helpStr.substr(currPos);
691
+ }
692
+ else {
693
+ token = choiceLinkStr.substr(currPos, (nextPos) - (currPos));
694
+ helpToken = helpStr.substr(currPos, (nextPos) - (currPos));
695
+ }
696
+ currPos = nextPos + 1;
697
+ switch (dataType) {
698
+ case StorageAttribute.ALPHA:
699
+ case StorageAttribute.MEMO:
700
+ case StorageAttribute.UNICODE:
701
+ case StorageAttribute.BLOB_VECTOR:
702
+ token = StrUtil.ltrim(token);
703
+ helpToken = StrUtil.ltrim(helpToken);
704
+ if (helpToken.indexOf('\\') >= 0) {
705
+ tokenBuffer = new StringBuilder();
706
+ for (let tokenPos = 0; tokenPos < helpToken.length; tokenPos++)
707
+ if (helpToken[tokenPos] !== '\\')
708
+ tokenBuffer.Append(token[tokenPos]);
709
+ else if (tokenPos === helpToken.length - 1)
710
+ tokenBuffer.Append(' ');
711
+ token = tokenBuffer.ToString();
712
+ }
713
+ token = StrUtil.makePrintableTokens(token, SEQ_2_STR);
714
+ if (this.isSelectionCtrl() || this.isTabControl())
715
+ token = ChoiceUtils.RemoveAcclCharFromOptions(new StringBuilder(token));
716
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && dataType === StorageAttribute.ALPHA) {
717
+ if (trimToLength !== -1 && UtilStrByteMode.lenB(token) > trimToLength)
718
+ token = UtilStrByteMode.leftB(token, trimToLength);
719
+ }
720
+ else {
721
+ if (trimToLength !== -1 && token.length > trimToLength)
722
+ token = token.substr(0, trimToLength);
723
+ }
724
+ choiceLink[i] = token;
725
+ break;
726
+ case StorageAttribute.NUMERIC:
727
+ case StorageAttribute.DATE:
728
+ case StorageAttribute.TIME:
729
+ let picture = PIC.buildPicture(dataType, token, task.getCompIdx(), false);
730
+ optionsValid = this.optionIsValid(token);
731
+ choiceLink[i] = DisplayConvertor.Instance.disp2mg(token.trim(), picture, task.getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
732
+ ((this._choiceNums.get_Item(line)))[i] = new NUM_TYPE(choiceLink[i]);
733
+ break;
734
+ case StorageAttribute.BOOLEAN:
735
+ choiceLink[i] = (1 - i).toString();
736
+ break;
737
+ default:
738
+ break;
739
+ }
740
+ }
741
+ if (!optionsValid)
742
+ this.emptyChoice(line);
743
+ }
744
+ }
745
+ catch (ex) {
746
+ if (ex instanceof Exception) {
747
+ optionsValid = false;
748
+ this.emptyChoice(line);
749
+ Events.WriteExceptionToLog(NString.Format("{0} : {1}", ex.GetType(), ex.Message));
750
+ }
751
+ else
752
+ throw ex;
753
+ }
754
+ this._hasValidItmAndDispVal = optionsValid;
755
+ }
756
+ getTopMostForm() {
757
+ return this.getForm().getTopMostForm();
758
+ }
759
+ setUrl() {
760
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, 0, this.Value);
761
+ }
762
+ async getMgValue(dispVal) {
763
+ let mgVal = null;
764
+ if (super.isCheckBox()) {
765
+ mgVal = dispVal ? "1" : "0";
766
+ }
767
+ else {
768
+ if (super.isSelectionCtrl() || super.isTabControl() || super.isRadio()) {
769
+ let line = this.getDisplayLine(true);
770
+ if (line < 0)
771
+ line = 0;
772
+ if (typeof dispVal === "number")
773
+ dispVal = dispVal.toString();
774
+ if (Array.isArray(dispVal))
775
+ dispVal = dispVal.join(',').toString();
776
+ if (dispVal === "") {
777
+ mgVal = dispVal;
778
+ }
779
+ else {
780
+ mgVal = await this.getLinkValue(dispVal, line);
781
+ }
782
+ if (mgVal === null) {
783
+ let refMgVal = new RefParam(mgVal);
784
+ if (this._field !== null) {
785
+ mgVal = refMgVal.value;
786
+ }
787
+ }
788
+ }
789
+ else {
790
+ let blobContentType = (this._field !== null) ? this._field.getContentType() : BlobType.CONTENT_TYPE_UNKNOWN;
791
+ mgVal = DisplayConvertor.Instance.disp2mg(dispVal, this._pic, this.getForm().getTask().getCompIdx(), blobContentType);
792
+ }
793
+ }
794
+ return mgVal;
795
+ }
796
+ async getLinkValue(selectedIndice, line) {
797
+ let size = 0;
798
+ let result = NString.Empty;
799
+ let temp = new List();
800
+ await this.computeChoice(line);
801
+ let choiceLink = this._choiceLinks.get_Item(line);
802
+ if (choiceLink !== null) {
803
+ size = choiceLink.length;
804
+ }
805
+ let linkIndice = this.getLinkIdxFromLayer(Misc.GetIntArray(selectedIndice));
806
+ let array2 = linkIndice;
807
+ for (let i = 0; i < array2.length; i = i + 1) {
808
+ let idx = array2[i];
809
+ if (idx >= size) {
810
+ let dcVals = this.getDcVals();
811
+ temp.push(dcVals.getLinkValue(idx - size));
812
+ }
813
+ else {
814
+ if (idx >= 0 && idx < choiceLink.length) {
815
+ temp.push(choiceLink[idx]);
816
+ }
817
+ else {
818
+ temp.push(null);
819
+ }
820
+ }
821
+ }
822
+ if (this.DataType === StorageAttribute.BLOB_VECTOR) {
823
+ let vectorType = new VectorType(this.getField());
824
+ for (let indx = 0; indx < temp.length; indx = indx + 1) {
825
+ vectorType.setVecCell(indx + 1, temp.get_Item(indx), temp.get_Item(indx) === null);
826
+ }
827
+ result = vectorType.toString();
828
+ }
829
+ else {
830
+ if (temp.length > 1) {
831
+ result = temp.join(",");
832
+ }
833
+ else {
834
+ result = temp.get_Item(0);
835
+ }
836
+ }
837
+ return result;
838
+ }
839
+ setText() {
840
+ let displayLine = this.getDisplayLine(true);
841
+ let mlsTranslatedValue = this.Value;
842
+ if (super.isButton()) {
843
+ mlsTranslatedValue = Events.Translate(this.Value);
844
+ }
845
+ if (this.isTextControl() || this.isButton())
846
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, displayLine, mlsTranslatedValue);
847
+ else
848
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, displayLine, HtmlProperties.Text, mlsTranslatedValue);
849
+ }
850
+ setRadioChecked(index) {
851
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), index);
852
+ Commands.beginInvoke();
853
+ if (index !== GuiConstants.DEFAULT_VALUE_INT) {
854
+ this.setControlToFocus();
855
+ }
856
+ }
857
+ setControlToFocus() {
858
+ if (this.getField() !== null) {
859
+ this.getField().ControlToFocus = this;
860
+ }
861
+ }
862
+ setCheckBoxValue(line, mgVal) {
863
+ let checkState = DisplayConvertor.toBoolean(mgVal);
864
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, line, checkState);
865
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.CheckBoxIndeterminate, this.IsNull);
866
+ }
867
+ setAsThreeState() {
868
+ this._propTab.setProp(PropInterface.PROP_TYPE_THREE_STATES, "1", this, "C");
869
+ }
870
+ isThreeStateCheckBox() {
871
+ let isThreeStateCheckBox = false;
872
+ if (this.isCheckBox())
873
+ isThreeStateCheckBox = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_THREE_STATES, false);
874
+ return isThreeStateCheckBox;
875
+ }
876
+ async refreshAndSetItemListByDataSource(line, valueChanged) {
877
+ if (this.SupportsDataSource()) {
878
+ let currDcId = this.getDcRef();
879
+ if (this._rangeChanged) {
880
+ valueChanged = true;
881
+ }
882
+ this._rangeChanged = false;
883
+ if (this.isDataCtrl() && currDcId !== this._dcValId) {
884
+ valueChanged = true;
885
+ await this.refreshAndSetItemsList(line, true);
886
+ this.setDcRef(this._dcValId);
887
+ }
888
+ }
889
+ return valueChanged;
890
+ }
891
+ setDcRef(dcId) {
892
+ this._dcTableRefs.set_Item(this.getDcLineNum(), dcId);
893
+ }
894
+ setImageList(url) {
895
+ }
896
+ async updatePropertyLogicNesting(propId, commandType, val, updateThis) {
897
+ if (updateThis) {
898
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), commandType === CommandType.PROP_SET_VISIBLE ? HtmlProperties.Visible : HtmlProperties.Enabled, val);
899
+ }
900
+ await this.updateChildrenPropValue(propId, commandType, val);
901
+ }
902
+ SetEnabled(val) {
903
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Enabled, val);
904
+ }
905
+ async updateChildrenPropValue(propId, commandType, val) {
906
+ if (!super.isTableControl()) {
907
+ for (let i = 0; i < this._linkedControls.length; i = i + 1) {
908
+ let child = this._linkedControls.get_Item(i);
909
+ if (child.IsFirstRefreshOfProps())
910
+ continue;
911
+ let childValue = (child.GetComputedBooleanProperty(propId, true));
912
+ childValue = childValue && val;
913
+ let childOnCurrentLayer = this.isChildOnCurrentLayer(child);
914
+ if (commandType === CommandType.PROP_SET_VISIBLE) {
915
+ if (childValue) {
916
+ childValue = childOnCurrentLayer;
917
+ }
918
+ await child.updateChildrenPropValue(propId, commandType, childValue);
919
+ }
920
+ }
921
+ if (super.isSubform()) {
922
+ await this.updateSubformChildrenPropValue(propId, commandType, val);
923
+ }
924
+ }
925
+ }
926
+ isDescendentOfControl(control) {
927
+ let isContained = false;
928
+ if (control !== null) {
929
+ let parent = this.getParent();
930
+ if (parent instanceof MgControlBase) {
931
+ if (parent === control) {
932
+ isContained = true;
933
+ }
934
+ else {
935
+ let parentControl = ((parent instanceof MgControlBase) ? parent : null);
936
+ if (control.Type === MgControlType.CTRL_TYPE_COLUMN && parentControl !== null && parentControl.Type === MgControlType.CTRL_TYPE_TABLE && control.Layer === this.Layer)
937
+ isContained = true;
938
+ else
939
+ isContained = (parent.isDescendentOfControl(control));
940
+ }
941
+ }
942
+ }
943
+ return isContained;
944
+ }
945
+ updateSubformChildrenPropValue(propId, commandType, val) {
946
+ }
947
+ isChildOnCurrentLayer(child) {
948
+ let ret = true;
949
+ if (super.isChoiceControl()) {
950
+ let parentLayer = 0;
951
+ if (this.Value !== null) {
952
+ parentLayer = this.getCurrentLinkIdx() + 1;
953
+ }
954
+ let layer = child.getLayer();
955
+ if (parentLayer !== layer && layer > 0) {
956
+ ret = false;
957
+ }
958
+ }
959
+ return ret;
960
+ }
961
+ getCurrentLinkIdx() {
962
+ let currLinkIdx = 0;
963
+ if (super.isChoiceControl() || this.HasAutocomplete()) {
964
+ let currentLayers = this.getCurrentIndexOfChoice();
965
+ let currLinkIndice = this.getLinkIdxFromLayer(currentLayers);
966
+ currLinkIdx = currLinkIndice[0];
967
+ }
968
+ return currLinkIdx;
969
+ }
970
+ getLayerFromLinkIdx(indice) {
971
+ let layers = new Array(indice.length);
972
+ for (let iCtr = 0; iCtr < indice.length; iCtr = iCtr + 1) {
973
+ let idx = indice[iCtr];
974
+ layers[iCtr] = idx;
975
+ if (super.isTabControl() && idx >= 0) {
976
+ let line = this.getDisplayLine(false);
977
+ if (line < 0) {
978
+ line = 0;
979
+ }
980
+ let layerList = this._choiceLayerList.get_Item(line);
981
+ if (layerList !== null && layerList.length > 0) {
982
+ layers[iCtr] = layerList.indexOf((idx + 1).toString());
983
+ }
984
+ }
985
+ }
986
+ return layers;
987
+ }
988
+ getLinkIdxFromLayer(layers) {
989
+ let linkIndice = new Array(layers.length);
990
+ for (let iCtr = 0; iCtr < layers.length; iCtr = iCtr + 1) {
991
+ let layer = layers[iCtr];
992
+ linkIndice[iCtr] = layer;
993
+ if (super.isTabControl()) {
994
+ if (layer < 0) {
995
+ linkIndice[iCtr] = 0;
996
+ }
997
+ else {
998
+ let line = this.getDisplayLine(false);
999
+ if (line < 0) {
1000
+ line = 0;
1001
+ }
1002
+ let layerList = this._choiceLayerList.get_Item(line);
1003
+ if (layerList !== null && typeof layerList !== "undefined" && layerList.length !== 0 && layer < layerList.length) {
1004
+ linkIndice[iCtr] = NNumber.Parse(layerList[layer]) - 1;
1005
+ }
1006
+ }
1007
+ }
1008
+ }
1009
+ return linkIndice;
1010
+ }
1011
+ isParentPropValue(propId) {
1012
+ let column = this.Form.getControlColumn(this);
1013
+ let parent = this.getLinkedParent(true);
1014
+ let result;
1015
+ if (parent === null) {
1016
+ result = true;
1017
+ }
1018
+ else {
1019
+ if (!parent.GetComputedBooleanProperty(propId, true)) {
1020
+ result = false;
1021
+ }
1022
+ else {
1023
+ if (!parent.isChildOnCurrentLayer(this)) {
1024
+ result = false;
1025
+ }
1026
+ else {
1027
+ result = (!(column !== null && !column.GetComputedBooleanProperty(propId, true)) && parent.isParentPropValue(propId));
1028
+ }
1029
+ }
1030
+ }
1031
+ return result;
1032
+ }
1033
+ getLinkedParent(checkSubformFather) {
1034
+ if (this._linkedParentDitIdx !== -1) {
1035
+ return this.Form.getCtrl(this._linkedParentDitIdx);
1036
+ }
1037
+ else {
1038
+ if (checkSubformFather && this.Form.isSubForm()) {
1039
+ return this.Form.getSubFormCtrl();
1040
+ }
1041
+ else {
1042
+ return null;
1043
+ }
1044
+ }
1045
+ }
1046
+ SetCurrReadOnly(newVal) {
1047
+ this._currReadOnly.set_Item(this.getDisplayLine(true), newVal);
1048
+ }
1049
+ GetCurrReadOnly() {
1050
+ let line = super.isTableControl() ? 0 : this.getDisplayLine(true);
1051
+ let currObj = this._currReadOnly.get_Item(line);
1052
+ let curr;
1053
+ if (currObj === null) {
1054
+ curr = false;
1055
+ this._currReadOnly.set_Item(line, curr);
1056
+ }
1057
+ else {
1058
+ curr = currObj;
1059
+ }
1060
+ return curr;
1061
+ }
1062
+ isDataCtrl() {
1063
+ return this._dataCtrl;
1064
+ }
1065
+ getDcRef() {
1066
+ let line = this.getDcLineNum();
1067
+ let obj = this._dcTableRefs.get_Item(this.getDcLineNum());
1068
+ let dcId;
1069
+ if (obj === null) {
1070
+ dcId = -2;
1071
+ this._dcTableRefs.set_Item(line, dcId);
1072
+ }
1073
+ else {
1074
+ dcId = obj;
1075
+ }
1076
+ return dcId;
1077
+ }
1078
+ getDcLineNum() {
1079
+ return this.IsRepeatable ? this.Form.DisplayLine : 0;
1080
+ }
1081
+ optionIsValid(option) {
1082
+ let isValid = true;
1083
+ if (this.DataType === StorageAttribute.NUMERIC && option.length > 0 && option.indexOf('0') === -1) {
1084
+ let convertNum = new NUM_TYPE();
1085
+ convertNum.num_4_a_std(option);
1086
+ if (convertNum.num_is_zero()) {
1087
+ isValid = false;
1088
+ }
1089
+ }
1090
+ return isValid;
1091
+ }
1092
+ async getOrderedDispList(choiceDispList, line) {
1093
+ let choiceLayerStr = "";
1094
+ let dispArryList = new List();
1095
+ let layerArryList = new List();
1096
+ let layerProp = this.getProp(PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST);
1097
+ if (layerProp !== null) {
1098
+ choiceLayerStr = await layerProp.getValue();
1099
+ }
1100
+ if (choiceLayerStr === null || StrUtil.rtrim(choiceLayerStr).length === 0) {
1101
+ choiceLayerStr = "";
1102
+ }
1103
+ if (choiceLayerStr.length > 0 && choiceDispList.length > 0) {
1104
+ let layerList = choiceLayerStr.split(",");
1105
+ let posCopyIndex = -1;
1106
+ for (let index = 0; index < layerList.length; index = index + 1) {
1107
+ let currLayerListVal = layerList[index].trim();
1108
+ if (!(layerArryList.indexOf(currLayerListVal) !== -1)) {
1109
+ let refPosCopyIndex = new RefParam(posCopyIndex);
1110
+ let isNumber = NNumber.TryParse(currLayerListVal, refPosCopyIndex);
1111
+ posCopyIndex = refPosCopyIndex.value;
1112
+ if (isNumber && posCopyIndex > 0 && posCopyIndex <= choiceDispList.length) {
1113
+ dispArryList.push((choiceDispList[posCopyIndex - 1]).trim());
1114
+ layerArryList.push(currLayerListVal);
1115
+ }
1116
+ }
1117
+ }
1118
+ }
1119
+ let result;
1120
+ if (dispArryList.length === 0) {
1121
+ result = choiceDispList;
1122
+ this._choiceLayerList.set_Item(line, new Array(0));
1123
+ }
1124
+ else {
1125
+ result = new Array(dispArryList.length);
1126
+ for (let _ai = 0; _ai < result.length; ++_ai)
1127
+ result[_ai] = null;
1128
+ result = dispArryList.ToArray();
1129
+ this._choiceLayerList.set_Item(line, layerArryList.ToArray());
1130
+ }
1131
+ return result;
1132
+ }
1133
+ resetPrevVal() {
1134
+ let line = this.getDisplayLine(true);
1135
+ if (line < 0) {
1136
+ line = 0;
1137
+ }
1138
+ this._prevValues.set_Item(line, null);
1139
+ this.setPrevIsNull_ToNull();
1140
+ }
1141
+ setPrevIsNull_ToNull() {
1142
+ this._prevIsNulls.set_Item(this.getDisplayLine(true), null);
1143
+ }
1144
+ expressionSetAsData() {
1145
+ return this._valExpId > 0;
1146
+ }
1147
+ clearRange(line) {
1148
+ this._orgChoiceDisps.set_Item(line, null);
1149
+ this._choiceDisps.set_Item(line, null);
1150
+ this._choiceLinks.set_Item(line, null);
1151
+ this._choiceLayerList.set_Item(line, null);
1152
+ }
1153
+ haveToCheckParentValue() {
1154
+ let ret = false;
1155
+ if (this._linkedParentDitIdx !== -1) {
1156
+ if (!this.isContainedInLinkedParent()) {
1157
+ ret = true;
1158
+ }
1159
+ else {
1160
+ if (this.Form.getCtrl(this._linkedParentDitIdx).isTabControl() || this.Form.getCtrl(this._linkedParentDitIdx).isGroup()) {
1161
+ ret = true;
1162
+ }
1163
+ }
1164
+ }
1165
+ else {
1166
+ if (this.Form.isSubForm()) {
1167
+ ret = true;
1168
+ }
1169
+ }
1170
+ return ret;
1171
+ }
1172
+ isContainedInLinkedParent() {
1173
+ return this._containerDitIdx !== -1 && this._containerDitIdx === this._linkedParentDitIdx;
1174
+ }
1175
+ static combineStringArrays(firstStrings, lastStrings) {
1176
+ let result = new Array();
1177
+ if (firstStrings !== null)
1178
+ result = result.concat(firstStrings);
1179
+ if (lastStrings !== null)
1180
+ result = result.concat(lastStrings);
1181
+ return result;
1182
+ }
1183
+ GetComputedBooleanProperty(propId, defaultRetVal, line) {
1184
+ if (arguments.length === 2 && (propId === null || propId.constructor === Number) && (defaultRetVal === null || defaultRetVal.constructor === Boolean)) {
1185
+ return this.GetComputedBooleanProperty_0(propId, defaultRetVal);
1186
+ }
1187
+ return this.GetComputedBooleanProperty_1(propId, defaultRetVal, line);
1188
+ }
1189
+ GetComputedBooleanProperty_0(propId, defaultRetVal) {
1190
+ let result = defaultRetVal;
1191
+ let prop = this.GetComputedProperty(propId);
1192
+ if (prop !== null) {
1193
+ result = prop.GetComputedValueBoolean();
1194
+ }
1195
+ return result;
1196
+ }
1197
+ GetComputedBooleanProperty_1(propId, defaultRetVal, line) {
1198
+ let result = defaultRetVal;
1199
+ if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1200
+ let prop = this.GetComputedProperty(propId);
1201
+ if (prop !== null) {
1202
+ let val = prop.getPrevValue(line);
1203
+ if (val !== null) {
1204
+ result = DisplayConvertor.toBoolean(val);
1205
+ }
1206
+ }
1207
+ }
1208
+ else {
1209
+ result = this.GetComputedBooleanProperty(propId, defaultRetVal);
1210
+ }
1211
+ return result;
1212
+ }
1213
+ async checkPropWithLine(propId, defaultRetVal, line) {
1214
+ let result = defaultRetVal;
1215
+ if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1216
+ let prop = this.getProp(propId);
1217
+ if (prop !== null) {
1218
+ let val = prop.getPrevValue(line);
1219
+ if (val !== null) {
1220
+ result = DisplayConvertor.toBoolean(val);
1221
+ }
1222
+ }
1223
+ }
1224
+ else {
1225
+ result = await this.checkProp(propId, defaultRetVal);
1226
+ }
1227
+ return result;
1228
+ }
1229
+ async checkProp(propId, defaultRetVal) {
1230
+ let result = defaultRetVal;
1231
+ let prop = this.getProp(propId);
1232
+ if (prop !== null) {
1233
+ result = await prop.getValueBoolean();
1234
+ }
1235
+ return result;
1236
+ }
1237
+ isPropertyRepeatable(propId) {
1238
+ let isRepeatable = this.IsRepeatable;
1239
+ if (isRepeatable) {
1240
+ return true;
1241
+ }
1242
+ else {
1243
+ return super.isTableControl() && Property.isRepeatableInTable();
1244
+ }
1245
+ }
1246
+ async SetAndRefreshDisplayValue(mgVal, isNull) {
1247
+ let dcRangeIsEmpty = true;
1248
+ if (mgVal === null) {
1249
+ this.Value = "";
1250
+ if (!isNull)
1251
+ mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1252
+ }
1253
+ else {
1254
+ if (super.isChoiceControl()) {
1255
+ let line = this.getDisplayLine(true);
1256
+ if (line < 0) {
1257
+ line = 0;
1258
+ }
1259
+ let layers = this.getLayerFromLinkIdx(await this.getIndexOfChoice(mgVal, line, isNull));
1260
+ if (layers[0] < 0 && super.isTabControl()) {
1261
+ layers[0] = 0;
1262
+ mgVal = await this.getLinkValue(layers[0].toString(), line);
1263
+ isNull = false;
1264
+ if (this._field !== null && mgVal !== null) {
1265
+ await this._field.getTask().UpdateFieldValueAndStartRecompute(this._field, mgVal, isNull);
1266
+ }
1267
+ }
1268
+ this.Value = Misc.GetCommaSeperatedString(layers);
1269
+ dcRangeIsEmpty = false;
1270
+ }
1271
+ }
1272
+ if (dcRangeIsEmpty) {
1273
+ if (!super.isCheckBox() && (this._field === null || !isNull || !this._field.hasNullDisplayValue())) {
1274
+ try {
1275
+ if ((super.isImageControl() && this.DataType === StorageAttribute.BLOB) || super.IsImageButton()) {
1276
+ this.Value = mgVal;
1277
+ }
1278
+ else {
1279
+ if ((this._field === null && isNull) && (this.DataType === StorageAttribute.NUMERIC || this.DataType === StorageAttribute.DATE || this.DataType === StorageAttribute.TIME || this.DataType === StorageAttribute.BOOLEAN)) {
1280
+ this.Value = mgVal;
1281
+ }
1282
+ else {
1283
+ let inControl = this.InControl;
1284
+ this.Value = DisplayConvertor.Instance.mg2disp(mgVal, this._range, this._pic, true, super.isSelectionCtrl(), this.getForm().getTask().getCompIdx(), inControl);
1285
+ }
1286
+ }
1287
+ if (typeof this.Value === 'string' && (!this._pic.isAttrNumeric() || this._pic.isLeft())) {
1288
+ this.rtrimValue();
1289
+ }
1290
+ }
1291
+ catch (innerException) {
1292
+ if (innerException instanceof ApplicationException) {
1293
+ Events.WriteExceptionToLog(new ApplicationException(NString.Format("Control: '{0}', mgval: {1}", this.Name, mgVal), innerException));
1294
+ this.Value = "";
1295
+ mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1296
+ }
1297
+ else
1298
+ throw innerException;
1299
+ }
1300
+ }
1301
+ else {
1302
+ if (this.isCheckBox())
1303
+ this.Value = DisplayConvertor.toBoolean(mgVal);
1304
+ else
1305
+ this.Value = mgVal;
1306
+ }
1307
+ }
1308
+ if ((super.isImageControl() && this.DataType !== StorageAttribute.BLOB) || super.IsImageButton()) {
1309
+ mgVal = Events.TranslateLogicalName(mgVal);
1310
+ }
1311
+ this.IsNull = isNull;
1312
+ await this.RefreshDisplayValue(mgVal);
1313
+ }
1314
+ UpdateModifiedByUser(newValue) {
1315
+ if (!(super.isButton() || super.isImageControl())) {
1316
+ let ctrlCurrIsNull = this.IsNull;
1317
+ let valChanged = (this.isDifferentValue(newValue, false, false));
1318
+ if (!valChanged) {
1319
+ if (this.CanGetNullFromControlValue()) {
1320
+ valChanged = (ctrlCurrIsNull !== this.isNullValue(newValue));
1321
+ }
1322
+ }
1323
+ if (valChanged || this.KeyStrokeOn) {
1324
+ this.ModifiedByUser = true;
1325
+ }
1326
+ }
1327
+ }
1328
+ rtrimValue() {
1329
+ if ((super.isImageControl() && this.DataType === StorageAttribute.BLOB) || super.IsImageButton()) {
1330
+ this.Value = NString.TrimEnd(this.Value);
1331
+ }
1332
+ else {
1333
+ let minimumValueLength = this.getMinimumValueLength();
1334
+ if (this.Value.length > minimumValueLength) {
1335
+ let str = this.Value.substr(minimumValueLength);
1336
+ this.Value = this.Value.substr(0, minimumValueLength);
1337
+ this.Value = this.Value + StrUtil.rtrimWithNull(str, true);
1338
+ }
1339
+ if (super.isTextControl() && this.DataType === StorageAttribute.NUMERIC) {
1340
+ this.Value = NString.TrimEnd(this.Value);
1341
+ }
1342
+ }
1343
+ }
1344
+ getMinimumValueLength() {
1345
+ let minLength = this._pic.getMaskLength();
1346
+ while (minLength > 0 && !this._pic.picIsMask(minLength - 1)) {
1347
+ minLength = minLength - 1;
1348
+ }
1349
+ return minLength;
1350
+ }
1351
+ isNullValue(str) {
1352
+ let retIsNullControl = false;
1353
+ if (this.CanGetNullFromControlValue() && str === "") {
1354
+ retIsNullControl = true;
1355
+ }
1356
+ return retIsNullControl;
1357
+ }
1358
+ CanGetNullFromControlValue() {
1359
+ return this.isThreeStateCheckBox() && (this._field == null || this._field.NullAllowed);
1360
+ }
1361
+ isChoiceNull(idx) {
1362
+ let result;
1363
+ if (idx >= 0) {
1364
+ let dcVals = this.getDcVals();
1365
+ return dcVals.isNull(idx);
1366
+ }
1367
+ else {
1368
+ return result;
1369
+ }
1370
+ }
1371
+ async ComputeAndRefreshDisplayValue(forceRefresh) {
1372
+ if (forceRefresh) {
1373
+ this.resetPrevVal();
1374
+ }
1375
+ if (this._valExpId > 0) {
1376
+ let wasEvaluated;
1377
+ let refWasEvaluated = new RefParam(wasEvaluated);
1378
+ let retExp = await this.EvaluateExpression(this._valExpId, this.DataType, this._pic.getSize(), true, StorageAttribute.SKIP, false, refWasEvaluated);
1379
+ wasEvaluated = refWasEvaluated.value;
1380
+ if (wasEvaluated) {
1381
+ await this.SetAndRefreshDisplayValue(retExp, retExp === null);
1382
+ }
1383
+ }
1384
+ else {
1385
+ if (this._field !== null) {
1386
+ let value = NString.Empty;
1387
+ let isNull = false;
1388
+ let refValue = new RefParam(value);
1389
+ let refIsNull = new RefParam(isNull);
1390
+ this._field.getTask().getFieldDisplayValue(this._field, refValue, refIsNull);
1391
+ value = refValue.value;
1392
+ isNull = refIsNull.value;
1393
+ await this.SetAndRefreshDisplayValue(value, isNull);
1394
+ }
1395
+ else {
1396
+ if (!super.isTableControl() && !super.isColumnControl()) {
1397
+ await this.RefreshDisplayValue(this.Value);
1398
+ }
1399
+ }
1400
+ }
1401
+ }
1402
+ ShouldRefreshOnControlEnter() {
1403
+ return this.Type === MgControlType.CTRL_TYPE_TEXT && this.getField() !== null && (this.getField().getType() === StorageAttribute.DATE ||
1404
+ this.getField().getType() === StorageAttribute.TIME || this.getField().getType() === StorageAttribute.NUMERIC);
1405
+ }
1406
+ async RefreshDisplayValue(mgVal) {
1407
+ let line = this.getDisplayLine(true);
1408
+ let valueChanged = true;
1409
+ let saveValueChanged = valueChanged;
1410
+ if (line < 0) {
1411
+ line = 0;
1412
+ }
1413
+ try {
1414
+ let prevValue = this._prevValues.get_Item(line);
1415
+ let prevNull = this.getPrevIsNull();
1416
+ if (StorageAttributeCheck.IsTypeAlphaOrUnicode(this.DataType)) {
1417
+ if (StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue) ||
1418
+ (mgVal !== null && StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue))) {
1419
+ valueChanged = false;
1420
+ }
1421
+ if (prevNull !== this.IsNull) {
1422
+ valueChanged = true;
1423
+ }
1424
+ }
1425
+ else {
1426
+ ;
1427
+ if (mgVal === prevValue || (mgVal !== null && mgVal === prevValue))
1428
+ valueChanged = false;
1429
+ if (prevNull !== this.IsNull)
1430
+ valueChanged = true;
1431
+ }
1432
+ this._prevValues.set_Item(line, mgVal);
1433
+ this.setPrevIsNull(this.IsNull);
1434
+ switch (this.Type) {
1435
+ case MgControlType.CTRL_TYPE_TABLE:
1436
+ case MgControlType.CTRL_TYPE_COLUMN:
1437
+ case MgControlType.CTRL_TYPE_LABEL:
1438
+ case MgControlType.CTRL_TYPE_SUBFORM:
1439
+ case MgControlType.CTRL_TYPE_GROUP:
1440
+ case MgControlType.CTRL_TYPE_STATUS_BAR:
1441
+ case MgControlType.CTRL_TYPE_FRAME_SET:
1442
+ case MgControlType.CTRL_TYPE_CONTAINER:
1443
+ case MgControlType.CTRL_TYPE_FRAME_FORM:
1444
+ case MgControlType.CTRL_TYPE_SB_LABEL:
1445
+ case MgControlType.CTRL_TYPE_LINE:
1446
+ return;
1447
+ case MgControlType.CTRL_TYPE_BROWSER:
1448
+ if (valueChanged && this.Value != null)
1449
+ this.setUrl();
1450
+ return;
1451
+ case MgControlType.CTRL_TYPE_IMAGE:
1452
+ case MgControlType.CTRL_TYPE_SB_IMAGE:
1453
+ if (valueChanged && this.Value != null)
1454
+ this.setImage();
1455
+ return;
1456
+ case MgControlType.CTRL_TYPE_CHECKBOX:
1457
+ if (valueChanged || this.forceRefresh)
1458
+ this.setCheckBoxValue(line, mgVal);
1459
+ return;
1460
+ case MgControlType.CTRL_TYPE_TAB:
1461
+ case MgControlType.CTRL_TYPE_COMBO:
1462
+ case MgControlType.CTRL_TYPE_LIST:
1463
+ saveValueChanged = valueChanged;
1464
+ valueChanged = await this.refreshAndSetItemListByDataSource(line, valueChanged);
1465
+ if (valueChanged) {
1466
+ let prevDisplayValue = null;
1467
+ if (saveValueChanged === valueChanged) {
1468
+ if (prevValue !== null) {
1469
+ prevDisplayValue = this.getLayerFromLinkIdx(await this.getIndexOfChoice(prevValue, line, prevNull));
1470
+ for (let i = 0; i < prevDisplayValue.length; i = i + 1) {
1471
+ if (prevDisplayValue[i] === GuiConstants.DEFAULT_VALUE_INT) {
1472
+ prevDisplayValue[i] = GuiConstants.DEFAULT_LIST_VALUE;
1473
+ }
1474
+ }
1475
+ }
1476
+ }
1477
+ let indice = Misc.GetIntArray(this.Value);
1478
+ if (this.isTabControl()) {
1479
+ let currentLayer = this.getCurrentLinkIdx();
1480
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedValue, indice[0].toString());
1481
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedLayer, currentLayer.toString());
1482
+ }
1483
+ if (this.IsMultipleSelectionListBox()) {
1484
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, line, indice);
1485
+ }
1486
+ else
1487
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, line, +this.Value);
1488
+ }
1489
+ break;
1490
+ case MgControlType.CTRL_TYPE_BUTTON:
1491
+ case MgControlType.CTRL_TYPE_TEXT:
1492
+ if (this.HasAutocomplete())
1493
+ await this.refreshAndSetItemListByDataSource(line, valueChanged);
1494
+ if (valueChanged) {
1495
+ if (this.IsImageButton()) {
1496
+ this.setImageWithFileName(this.Value);
1497
+ }
1498
+ else
1499
+ this.setText();
1500
+ }
1501
+ else
1502
+ return;
1503
+ break;
1504
+ case MgControlType.CTRL_TYPE_RADIO:
1505
+ valueChanged = await this.refreshAndSetItemListByDataSource(line, valueChanged);
1506
+ if (!valueChanged)
1507
+ return;
1508
+ this.setRadioChecked(+this.Value);
1509
+ break;
1510
+ default:
1511
+ Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() unknown type: {0}", this.Type));
1512
+ return;
1513
+ }
1514
+ if (super.isChoiceControl() && valueChanged)
1515
+ await this.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, await this.checkProp(PropInterface.PROP_TYPE_VISIBLE, true), false);
1516
+ }
1517
+ catch (ex_360) {
1518
+ if (ex_360 instanceof Exception) {
1519
+ Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() for control: {0}", this.Name));
1520
+ }
1521
+ else
1522
+ throw ex_360;
1523
+ }
1524
+ }
1525
+ async RefreshDisplay(onlyRepeatableProps) {
1526
+ if (isNullOrUndefined(onlyRepeatableProps))
1527
+ onlyRepeatableProps = false;
1528
+ await this.RefreshDisplay_1(onlyRepeatableProps);
1529
+ }
1530
+ async RefreshDisplay_1(onlyRepeatableProps) {
1531
+ if (!(super.isSubform() && this.GetSubformMgForm() !== null && this.GetSubformMgForm().inRefreshDisplay())) {
1532
+ await this.refreshProperties(onlyRepeatableProps);
1533
+ if (this.ShouldComputeAndRefreshOnClosedForm()) {
1534
+ await this.ComputeAndRefreshDisplayValue(false);
1535
+ }
1536
+ let isParkableCtrl = !(await this.isParkable(false)) || !await this.isModifiable();
1537
+ if (this.GetCurrReadOnly() !== isParkableCtrl) {
1538
+ this.SetCurrReadOnly(isParkableCtrl);
1539
+ await Manager.SetReadOnlyControl(this, isParkableCtrl);
1540
+ }
1541
+ let mustInputProperty = this.GetComputedProperty(PropInterface.PROP_TYPE_MUST_INPUT);
1542
+ if (mustInputProperty != null && mustInputProperty.isExpression()) {
1543
+ let prevMustInput = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MUST_INPUT, false);
1544
+ if (prevMustInput !== await this.checkProp(PropInterface.PROP_TYPE_MUST_INPUT, false))
1545
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.MustInput, !prevMustInput);
1546
+ }
1547
+ else if (mustInputProperty != null) {
1548
+ let mustInputVal = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MUST_INPUT, false);
1549
+ if (mustInputVal)
1550
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.MustInput, mustInputVal);
1551
+ }
1552
+ if (!this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_TAB_IN, true))
1553
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.TabIndex, -1);
1554
+ }
1555
+ }
1556
+ ShouldComputeAndRefreshOnClosedForm() {
1557
+ return true;
1558
+ }
1559
+ async refreshProperties(onlyRepeatableProps) {
1560
+ if (this._field !== null && this.DataType !== StorageAttribute.NONE && this._firstRefreshProperties)
1561
+ Commands.addWithNumber(CommandType.SET_ATTRIBUTE, this, this.DataType.charCodeAt(0));
1562
+ if (this._propTab !== null) {
1563
+ try {
1564
+ if (this._firstRefreshProperties) {
1565
+ this.createDefaultProps();
1566
+ await this.ZoomButtonInitialization();
1567
+ }
1568
+ if (!(await this._propTab.RefreshDisplay(false, onlyRepeatableProps))) {
1569
+ Events.WriteExceptionToLog(NString.Format("Control '{0}': Not all properties could be set", this.getName()));
1570
+ }
1571
+ if (this._firstRefreshProperties) {
1572
+ if (!onlyRepeatableProps) {
1573
+ this._firstRefreshProperties = false;
1574
+ }
1575
+ }
1576
+ }
1577
+ catch (ex) {
1578
+ if (ex instanceof Exception) {
1579
+ let msg = new StringBuilder(NString.Format("Control '{0}': {1}", this.getName(), ex.Message));
1580
+ Events.WriteExceptionToLog(msg.ToString());
1581
+ }
1582
+ else
1583
+ throw ex;
1584
+ }
1585
+ }
1586
+ }
1587
+ async refreshTabForLayerList(line) {
1588
+ let currentLinkValue = null;
1589
+ if (this.getForm().Opened) {
1590
+ let indice = this.getCurrentIndexOfChoice();
1591
+ let currentLayer = indice[0];
1592
+ currentLinkValue = await this.getLinkValue(currentLayer.toString(), line);
1593
+ }
1594
+ await this.refreshAndSetItemsList(line, false);
1595
+ if (this.getForm().Opened) {
1596
+ await this.SetAndRefreshDisplayValue(currentLinkValue, this.IsNull);
1597
+ }
1598
+ }
1599
+ async refreshAndSetItemsList(line, execComputeChoice) {
1600
+ if (execComputeChoice) {
1601
+ this.clearRange(line);
1602
+ }
1603
+ let optionsStrings = await this.refreshDispRange(execComputeChoice);
1604
+ if (super.isChoiceControl() || this.HasAutocomplete()) {
1605
+ let options = optionsStrings.map((displayValue, index) => {
1606
+ return { index, displayValue };
1607
+ });
1608
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
1609
+ }
1610
+ }
1611
+ async refreshDispRange(execComputeChoice) {
1612
+ let selectCmd = new Array(0);
1613
+ let line = this.getDisplayLine(true);
1614
+ if (line < 0) {
1615
+ line = 0;
1616
+ }
1617
+ if (this.SupportsDataSource()) {
1618
+ let dataView = this.getForm().getTask().DataView;
1619
+ let dcv = dataView.getDcValues(this._dcValId);
1620
+ let dispVals = await this.getDispVals(line, execComputeChoice);
1621
+ if (this._hasValidItmAndDispVal) {
1622
+ selectCmd = MgControlBase.combineStringArrays(dispVals, dcv.getDispVals());
1623
+ }
1624
+ }
1625
+ else {
1626
+ selectCmd = await this.getDispVals(line, execComputeChoice);
1627
+ }
1628
+ this._rangeChanged = true;
1629
+ return await this.getOrderedDispList(selectCmd, line);
1630
+ }
1631
+ async refreshItmRange(execComputeChoice) {
1632
+ Debug.Assert(this.SupportsDataSource());
1633
+ let orderedItmList = new Array(0);
1634
+ let line = this.getDisplayLine(false);
1635
+ if (line < 0) {
1636
+ line = 0;
1637
+ }
1638
+ if (execComputeChoice) {
1639
+ await this.computeChoice(line);
1640
+ }
1641
+ let linkVals = this._choiceLinks.get_Item(line);
1642
+ let dataView = this.getForm().getTask().DataView;
1643
+ let dcv = dataView.getDcValues(this._dcValId);
1644
+ if (this._hasValidItmAndDispVal) {
1645
+ orderedItmList = MgControlBase.combineStringArrays(linkVals, dcv.GetLinkVals());
1646
+ }
1647
+ return await this.getOrderedDispList(orderedItmList, line);
1648
+ }
1649
+ async GetItemsRange() {
1650
+ return await this.refreshItmRange(false);
1651
+ }
1652
+ async GetDisplayRange() {
1653
+ return await this.refreshDispRange(false);
1654
+ }
1655
+ createDefaultProps() {
1656
+ this.getProp(PropInterface.PROP_TYPE_VISIBLE);
1657
+ this.getProp(PropInterface.PROP_TYPE_ENABLED);
1658
+ if (super.isTableControl()) {
1659
+ this.getProp(PropInterface.PROP_TYPE_SCROLL_BAR);
1660
+ }
1661
+ }
1662
+ setLinkedParentIdx(linkedParentDitIdx) {
1663
+ this._linkedParentDitIdx = linkedParentDitIdx;
1664
+ }
1665
+ buildPicture(oldVal, val) {
1666
+ if (super.isTableControl() || super.isColumnControl())
1667
+ return null;
1668
+ if (this._picExpExists) {
1669
+ this._vd = null;
1670
+ }
1671
+ if (this._vd === null) {
1672
+ this._vd = new ValidationDetails(oldVal, val, this._range, this._pic, this);
1673
+ }
1674
+ else {
1675
+ this._vd.setValue(val);
1676
+ this._vd.setOldValue(oldVal);
1677
+ }
1678
+ return this._vd;
1679
+ }
1680
+ isDifferentValue(newValue, isNull, checkNullValue) {
1681
+ let ctrlCurrValue = this.Value;
1682
+ let valChanged = false;
1683
+ if (newValue instanceof Date) {
1684
+ if (this.DataType === StorageAttribute.DATE)
1685
+ valChanged = !this.CompareDate(newValue, ctrlCurrValue);
1686
+ else
1687
+ valChanged = !this.CompareTime(newValue, ctrlCurrValue);
1688
+ }
1689
+ if (typeof newValue === 'boolean' || typeof newValue === 'number') {
1690
+ if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string') {
1691
+ let newValuestr = newValue.toString();
1692
+ valChanged = (newValuestr !== ctrlCurrValue);
1693
+ }
1694
+ else {
1695
+ valChanged = (newValue !== ctrlCurrValue);
1696
+ }
1697
+ }
1698
+ else {
1699
+ if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string' && Array.isArray(newValue)) {
1700
+ let newValueStr = newValue.join(',').toString();
1701
+ valChanged = !(StrUtil.rtrim(newValueStr) === StrUtil.rtrim(ctrlCurrValue));
1702
+ }
1703
+ else {
1704
+ let ctrlCurrIsNull = this.IsNull;
1705
+ valChanged = !(StrUtil.rtrim(newValue) === StrUtil.rtrim(ctrlCurrValue));
1706
+ if (!valChanged && checkNullValue) {
1707
+ valChanged = (isNull !== ctrlCurrIsNull);
1708
+ }
1709
+ }
1710
+ }
1711
+ return valChanged;
1712
+ }
1713
+ CompareDate(d1, d2) {
1714
+ let retval;
1715
+ if (d1 === null && d2 === null)
1716
+ retval = true;
1717
+ else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1718
+ retval = false;
1719
+ else if (d1.getFullYear() === d2.getFullYear()
1720
+ && d1.getDate() === d2.getDate()
1721
+ && d1.getMonth() === d2.getMonth())
1722
+ retval = true;
1723
+ return retval;
1724
+ }
1725
+ CompareTime(d1, d2) {
1726
+ let retval;
1727
+ if (d1 === null && d2 === null)
1728
+ retval = true;
1729
+ else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1730
+ retval = false;
1731
+ else if (d1.getHours() === d2.getHours()
1732
+ && d1.getMinutes() === d2.getMinutes()
1733
+ && d1.getSeconds() === d2.getSeconds())
1734
+ retval = true;
1735
+ return retval;
1736
+ }
1737
+ isColumnSortable() {
1738
+ let isSortable = false;
1739
+ if (this.Type === MgControlType.CTRL_TYPE_COLUMN && this._propTab.propExists(PropInterface.PROP_TYPE_SORT_COLUMN)) {
1740
+ isSortable = this.GetComputedProperty(PropInterface.PROP_TYPE_SORT_COLUMN).GetComputedValueBoolean();
1741
+ }
1742
+ return isSortable;
1743
+ }
1744
+ getColumnChildControl() {
1745
+ if (this.Type !== MgControlType.CTRL_TYPE_COLUMN)
1746
+ return null;
1747
+ let linkedControls = this._parentTable.getLinkedControls();
1748
+ return linkedControls.find((control) => (control.getLayer() === this.getLayer() && control.Type !== MgControlType.CTRL_TYPE_COLUMN && !control.IsTableHeaderChild));
1749
+ }
1750
+ getControlNameForHandlerSearch() {
1751
+ let childControl = this.getColumnChildControl();
1752
+ if (childControl !== null) {
1753
+ return childControl.Name;
1754
+ }
1755
+ else
1756
+ return this.Name;
1757
+ }
1758
+ linkCtrl(ctrl) {
1759
+ this._linkedControls.push(ctrl);
1760
+ }
1761
+ removeRefFromField() {
1762
+ if (this._field !== null) {
1763
+ this._field.RemoveControl(this);
1764
+ }
1765
+ }
1766
+ getDitIdx() {
1767
+ return this._ditIdx;
1768
+ }
1769
+ setDcValId(dcValId) {
1770
+ this._dcValId = dcValId;
1771
+ }
1772
+ SetKeyboardLanguage() {
1773
+ Commands.beginInvoke();
1774
+ }
1775
+ Init() {
1776
+ }
1777
+ async IsParkable() {
1778
+ return await this.isParkable(true);
1779
+ }
1780
+ HasExpOrParentTaskField() {
1781
+ let task = this.getForm().getTask();
1782
+ return (this.getField() === null || this.getField().getTask() !== task);
1783
+ }
1784
+ async isParkable(checkEnabledAndVisible) {
1785
+ let result;
1786
+ result = !super.isTableControl() && !super.isColumnControl();
1787
+ let task = this.getForm().getTask();
1788
+ if (result) {
1789
+ result = task.IsInteractive;
1790
+ }
1791
+ if (result && task.DataView.isEmptyDataview() && this._field !== null && this._field.PartOfDataview) {
1792
+ result = false;
1793
+ }
1794
+ if (result) {
1795
+ if (!super.isSubform()) {
1796
+ result = ((this._field !== null && this._field.getTask() === task) || this.isButton());
1797
+ }
1798
+ if (result && checkEnabledAndVisible) {
1799
+ result = (this.isEnabled() && this.isVisible());
1800
+ }
1801
+ if ((result && this._parentTable !== null) && checkEnabledAndVisible) {
1802
+ result = (this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true) && this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true));
1803
+ }
1804
+ }
1805
+ return result;
1806
+ }
1807
+ RaiseControlHitOnLeftClickOfMouseDown() {
1808
+ let raiseCtrlHit = false;
1809
+ if (!super.IsHyperTextButton() && !super.isRadio() && !super.isTabControl()) {
1810
+ raiseCtrlHit = true;
1811
+ }
1812
+ return raiseCtrlHit;
1813
+ }
1814
+ GetVarIndex() {
1815
+ return 0;
1816
+ }
1817
+ RaiseControlHitOnMouseDown(leftClickWasPressed) {
1818
+ let raiseCtrlHit = false;
1819
+ if (leftClickWasPressed) {
1820
+ if (this.RaiseControlHitOnLeftClickOfMouseDown()) {
1821
+ raiseCtrlHit = true;
1822
+ }
1823
+ }
1824
+ return raiseCtrlHit;
1825
+ }
1826
+ OnSubformClick() {
1827
+ Manager.EventsManager.addGuiTriggeredEventWithTaskAndCode(this.getForm().getTask(), InternalInterface.MG_ACT_HIT);
1828
+ }
1829
+ GetSubformMgForm() {
1830
+ return null;
1831
+ }
1832
+ PropertyExists(id) {
1833
+ return this._propTab.propExists(id);
1834
+ }
1835
+ toString() {
1836
+ return "{" + this.constructor.name + ": " + MgControlType[this.Type] + "}";
1837
+ }
1838
+ isDateZero(val) {
1839
+ let zeroDate = false;
1840
+ if (val instanceof Date) {
1841
+ if (val.getMonth() === 0 && val.getFullYear() === 0 && val.getDay() === 0)
1842
+ zeroDate = true;
1843
+ }
1844
+ return zeroDate;
1845
+ }
1846
+ IsDefaultRouterOutlet() {
1847
+ return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_DEFAULT_OUTLET, false));
1848
+ }
1849
+ IsRouterOutlet() {
1850
+ return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_IS_ROUTER_OUTLET, false));
1851
+ }
1852
+ async ZoomButtonInitialization() {
1853
+ if (this.isTextControl() && this.checkIfExistProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)) {
1854
+ let connectedButton = this.Form.CtrlTab.GetControlByIsn((await (await this.getProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)).getValueInt()));
1855
+ if (connectedButton) {
1856
+ let imageFileName = null;
1857
+ if (connectedButton.IsImageButton() && connectedButton.PropertyExists(PropInterface.PROP_TYPE_IMAGE_FILENAME)) {
1858
+ imageFileName = await (await connectedButton.getProp(PropInterface.PROP_TYPE_IMAGE_FILENAME)).getValue();
1859
+ if (!Misc.IsWebUrl(imageFileName))
1860
+ imageFileName = Events.GetAssetsURL() + "/images/" + imageFileName;
1861
+ Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, imageFileName);
1862
+ }
1863
+ this.ConnectedControl = connectedButton;
1864
+ connectedButton.ConnectedControl = this;
1865
+ }
1866
+ }
1867
+ }
1868
+ }
1869
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDbEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMx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QUMsRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUV6RztnQkFHRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO2dCQUN4QyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2FBQ3pDO1NBQ0Y7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIERlYnVnLFxyXG4gIEV4Y2VwdGlvbixcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyLFxyXG4gIGlzTnVsbE9yVW5kZWZpbmVkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge0d1aU1nQ29udHJvbH0gZnJvbSAnLi4vLi4vZ3VpL0d1aU1nQ29udHJvbCc7XHJcbmltcG9ydCB7UHJvcFBhcmVudEludGVyZmFjZX0gZnJvbSAnLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0d1aUZpZWxkQmFzZX0gZnJvbSAnLi4vZGF0YS9HdWlGaWVsZEJhc2UnO1xyXG5pbXBvcnQge1xyXG4gIENob2ljZVV0aWxzLFxyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBNYWdpY1Byb3BlcnRpZXMsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIFNFUV8yX1NUUixcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjayxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxTdHJCeXRlTW9kZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7TWdGb3JtQmFzZX0gZnJvbSAnLi9NZ0Zvcm1CYXNlJztcclxuaW1wb3J0IHtQSUN9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHtQcm9wVGFibGV9IGZyb20gJy4vUHJvcFRhYmxlJztcclxuaW1wb3J0IHtWYWxpZGF0aW9uRGV0YWlsc30gZnJvbSAnLi9WYWxpZGF0aW9uRGV0YWlscyc7XHJcbmltcG9ydCB7RmllbGREZWZ9IGZyb20gJy4uL2RhdGEvRmllbGREZWYnO1xyXG5pbXBvcnQge1Byb3BlcnR5fSBmcm9tICcuL1Byb3BlcnR5JztcclxuaW1wb3J0IHtHdWlUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQge01hbmFnZXJ9IGZyb20gJy4uLy4uL01hbmFnZXInO1xyXG5pbXBvcnQge0NvbW1hbmRUeXBlLCBIdG1sUHJvcGVydGllc30gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQge0NvbW1hbmRzfSBmcm9tICcuLi8uLi9Db21tYW5kcyc7XHJcbmltcG9ydCB7TlVNX1RZUEV9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gJy4vUHJvcEludGVyZmFjZSc7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQge0RjVmFsdWVzLCBFTVBUWV9EQ1JFRn0gZnJvbSAnLi4vZGF0YS9EY1ZhbHVlcyc7XHJcbmltcG9ydCB7R3VpRGF0YVZpZXdCYXNlfSBmcm9tICcuLi9kYXRhL0d1aURhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7RGlzcGxheUNvbnZlcnRvcn0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHtCbG9iVHlwZX0gZnJvbSAnLi4vZGF0YS9CbG9iVHlwZSc7XHJcbmltcG9ydCB7VmVjdG9yVHlwZX0gZnJvbSAnLi4vZGF0YS9WZWN0b3JUeXBlJztcclxuaW1wb3J0IHtPYmplY3RSZWZlcmVuY2V9IGZyb20gJy4uLy4uL3V0aWwvT2JqZWN0UmVmZXJlbmNlJztcclxuaW1wb3J0IHtHdWlDb25zdGFudHN9IGZyb20gJy4uLy4uL0d1aUNvbnN0YW50cyc7XHJcbmltcG9ydCB7R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcn0gZnJvbSAnLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyJztcclxuaW1wb3J0IHtGb2N1c01hbmFnZXJ9IGZyb20gJy4uLy4uL0ZvY3VzTWFuYWdlcic7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBkYXRhIGZvciA8Y29udHJvbD4gLi4uPC9jb250cm9sPiB0YWdcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1nQ29udHJvbEJhc2UgZXh0ZW5kcyBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIGltcGxlbWVudHMgUHJvcFBhcmVudEludGVyZmFjZSB7XHJcblxyXG4gIC8vIGZpeGVkIGRlZmVjdCAjOjgxNDk4LCB3aGlsZSBSVCBpcyBzZXQgZGVmYXVsdCB2YWx1ZSB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGNvbnRyb2xcclxuICAvLyB0byB0aGUgdmFsdWUgd2lsbCBzZXQgdG8gdGhlIGNvbnRyb2xcclxuXHJcbiAgX2RpdElkeDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9saW5rZWRDb250cm9sczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7IC8vIGFycmF5IG9mIGNvbnRyb2xzIHRoYXQgYXJlIGxpbmtlZCB0byB0aGlzIGNvbnRyb2xcclxuICBfZmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIGNvbnRyb2xcclxuICBwcml2YXRlIF9waWNTdHI6IHN0cmluZyA9IG51bGw7XHJcbiAgX2Nob2ljZURpc3BzOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIGhvbGRzIHRoZVxyXG4gIF9jaG9pY2VMYXllckxpc3Q6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gdGhlIG9yZGVyIG9uIHdoaWNoIHRhYnMgdG8gYmUgZGlzcGxheWVkXHJcbiAgX2Nob2ljZUxpbmtzOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIGhvbGRzIHRoZVxyXG4gIF9jaG9pY2VOdW1zOiBMaXN0PE5VTV9UWVBFW10+ID0gbnVsbDsgIC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIHdpdGggbnVtZXJpY1xyXG4gIHByaXZhdGUgX2NvbnRhaW5lckRpdElkeDogbnVtYmVyID0gLTE7XHJcbiAgX2N1cnJSZWFkT25seTogTGlzdDxib29sZWFuPiA9IG51bGw7IC8vIGEgaGlzdG9yeSBhcnJheSBmb3IgcmVhZG9ubHkgcGFyYW1cclxuICBwcml2YXRlIF9kYXRhQ3RybDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUaGUgZGF0YSBjb250cm9sIGZsYWcgc3RhdGVzIHRoYXQgdGhpc1xyXG4gIF9kY1RhYmxlUmVmczogTGlzdDxudW1iZXI+ID0gbnVsbDsgLy8gcmVmZXJlbmNlcyB0byBkY1ZhbHMgZm9yIGVhY2ggbGluZSBvZiBhIGNvbnRyb2wgaXMgYSBkYXRhIGNvbnRyb2xcclxuICBwcml2YXRlIF9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9mb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9oYXNWYWxpZEl0bUFuZERpc3BWYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfY29udHJvbElzbjogbnVtYmVyID0gLTE7IC8vIGZvciBjdXJyZW50IGlzblxyXG5cclxuICBwcml2YXRlIF9saW5rZWRQYXJlbnREaXRJZHg6IG51bWJlciA9IC0xOyAvLyBub3QgdHJpZ2dlciBhbnkgZXZlbnQgaGFuZGxlciwgd2hpbGUgcGFya2luZyBpbiB0aGlzIGNvbnRyb2xcclxuICBfb3JnQ2hvaWNlRGlzcHM6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gZm9yIFRBQiBDb250cm9sIHNhdmUgdGhlIG9yZyBvcHRpb24gKHdpdGggdGhlICYpXHJcbiAgX3BhcmVudFRhYmxlOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDsgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBNYWdpYyBUYWJsZSBmb3JcclxuICBfcGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY0V4cEV4aXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9wcmV2SXNOdWxsczogTGlzdDxib29sZWFuPiA9IG51bGw7IC8vIGZvciBOVUxMXHJcbiAgcHJpdmF0ZSBfcHJldlBpY0V4cFJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICBfcHJldlZhbHVlczogTGlzdDxzdHJpbmc+ID0gbnVsbDsgLy8gcmVmZXJlbmNlcyB0byBwcmV2aW91cyB2YWx1ZXMgb2YgdGhlXHJcbiAgX3Byb3BUYWI6IFByb3BUYWJsZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmFuZ2U6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmFuZ2VDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7IC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIHRydWUgaWYgdGhlaXIgcmFuZ2VcclxuXHJcbiAgX3ZhbEV4cElkOiBudW1iZXIgPSAwOyAvLyByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGV4cHJlc3Npb25cclxuICBwcml2YXRlIF92ZDogVmFsaWRhdGlvbkRldGFpbHMgPSBudWxsO1xyXG4gIHByaXZhdGUgX2RjVmFsSWQ6IG51bWJlciA9IC0yO1xyXG4gIHBhcmVudDogbnVtYmVyID0gMDtcclxuICB2ZWVJbmR4OiBudW1iZXIgPSAwO1xyXG4gIFNvdXJjZVRhYmxlUmVmZXJlbmNlOiBPYmplY3RSZWZlcmVuY2UgPSBudWxsO1xyXG4gIENsaXBCb2FyZERhdGFFeGlzdHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBEYXRhVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICBLZXlTdHJva2VPbjogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIGlmIHRoZSB1c2VyIHByZXNzZWQgYSBrZXlcclxuICBNb2RpZmllZEJ5VXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIElzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZvcmNlUmVmcmVzaCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc01vZGFsIDogYm9vbGVhbjsgLy9hcHBsaWNhYmxlIGZvciBzdWJmb3JtLCBpZiBzdWJmb3JtIGlzIE1vZGFsXHJcblxyXG4gIHByb3RlY3RlZCBzZXQgRm9ybSh2YWx1ZTogTWdGb3JtQmFzZSkge1xyXG4gICAgdGhpcy5fZm9ybSA9IHZhbHVlO1xyXG4gICAgdGhpcy5HdWlNZ0Zvcm0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXQgRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IENvbnRyb2xJc24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sSXNuO1xyXG4gIH1cclxuXHJcbiAgUmVmcmVzaE9uVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlLCBpZiB0aGUgc3ViZm9ybSBtdXN0IGJlIHJlZnJlc2hlZCBvbiBiZWNvbWUgdmlzaWJsZVxyXG4gIEluQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFZhbGlkYXRlQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFByb21wdEhlbHA6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vIHRoZSBwcm9tcHQgaGVscCB0ZXh0IGFzc2lnbmVkIHRvIGNvbnRyb2xcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3Rvcih0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik7XHJcbiAgY29uc3RydWN0b3IodHlwZT86IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybT86IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w/OiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHR5cGUsIHBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRDb250cm9scyA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICB0aGlzLkRhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuaW5pdFJlZmVyZW5jZXMocGFyZW50TWdGb3JtKTtcclxuICAgIHRoaXMuVHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLl9jb250YWluZXJEaXRJZHggPSBwYXJlbnRDb250cm9sO1xyXG4gICAgdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4ID0gcGFyZW50Q29udHJvbDtcclxuICAgIHRoaXMuX3Byb3BUYWIgPSBuZXcgUHJvcFRhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5jcmVhdGVBcnJheXMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFVuaXF1ZU5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVGFza1RhZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRUYXNrKCkuZ2V0VGFza1RhZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGNoZWNrSWZFeGlzdFByb3AocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBleGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHByb3BCeUlkOiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgICAgZXhpc3QgPSAocHJvcEJ5SWQgIT09IG51bGwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV4aXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGlmIChwcm9wID09PSBudWxsKSB7XHJcbiAgICAgICAgcHJvcCA9IFByb3BlcnR5LmdldERlZmF1bHRQcm9wKHByb3BJZCwgJ0MnLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QgdGhlbiBjcmVhdGUgYSBuZXcgcHJvcGVydHkgYW5kIGdpdmUgaXQgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9wcm9wVGFiLmFkZFByb3AocHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmb3JtIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29tcElkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBmaXJzdCByZWZyZXNoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzRmlyc3RSZWZyZXNoT2ZQcm9wcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW5ndGhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzQ2VsbFR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFsd2F5c0V2YWx1YXRlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ3YXNFdmFsdWF0ZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRXZhbHVhdGVFeHByZXNzaW9uKGV4cElkOiBudW1iZXIsIHJlc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbmd0aDogbnVtYmVyLCBjb250ZW50VHlwZVVuaWNvZGU6IGJvb2xlYW4sIHJlc0NlbGxUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBhbHdheXNFdmFsdWF0ZTogYm9vbGVhbiwgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkV2YWx1YXRlRXhwcmVzc2lvbihleHBJZCwgcmVzVHlwZSwgbGVuZ3RoLCBjb250ZW50VHlwZVVuaWNvZGUsIHJlc0NlbGxUeXBlLCBhbHdheXNFdmFsdWF0ZSwgd2FzRXZhbHVhdGVkKTtcclxuICB9XHJcblxyXG4gIEdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkOiBudW1iZXIpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCB0aGF0IGFscmVhZHkgd2FzIGNvbXB1dGVkXHJcbiAgLy8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNyZWF0ZSBhIHByb3BlcnR5IGlmIGl0IGlzbid0IGV4aXN0LlxyXG4gIC8vLyBNYXkgd2UgbmVlZCB0byBjcmVhdGUgYSBwcm9wZXJ0eSBhbmQgdXNlIGl0cyBkZWZhdWx0IHZhbHVlLlxyXG4gIC8vLyBJbiBQaGFzZSAyIGluIFJlZnJlc2hQcm9wZXJ0aWVzIG1ldGhvZCB3ZSdsbCBjcmVhdGUgYW5kIGNvbXB1dGUgcHJvcGVydGllcyxcclxuICAvLy8gcGVyaGFwcyB3ZSBuZWVkIGNyZWF0ZSBhbGwgcHJvcGVydGllcyBub3Qgb25seSB0aG9zZSB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgSWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBHZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbClcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXRpYWxpemluZyBvZiBpbm5lciByZWZlcmVuY2UgdG8gdGhlIHRhc2sgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPnJlZmVyZW5jZSB0byB0aGUgdGFzayBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0UmVmZXJlbmNlcyhtZ0Zvcm06IE1nRm9ybUJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuRm9ybSA9IG1nRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbiB0aGUgZmlyc3QgdGltZSB0aGF0IHdlIHJlZnJlc2ggdGhlIGNvbnRyb2wgbmVlZCB0byBjcmVhdGUgYXJyYXlzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlQ3JlYXRlQXJyYXlzXCI+Y3JlYXRlIGFycmF5cyBpbiBhbnkgY2FzZTwvcGFyYW0+XHJcbiAgY3JlYXRlQXJyYXlzKGZvcmNlQ3JlYXRlQXJyYXlzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcyB8fCBmb3JjZUNyZWF0ZUFycmF5cykge1xyXG5cclxuICAgICAgLy8gZm9yIFNFTEVDVCBjb250cm9scywgYWx3YXlzIGluaXRpYWxpemUgREMgdGFibGUgc2luY2Ugd2UgdXNlIGl0IHRvIG1lcmdlIGNob2ljZXMgZnJvbSB0aGVcclxuICAgICAgLy8gcHJvcCBsaXN0IHdpdGggY2hvaWNlcyBmcm9tIHRoZSBEQVRBIENPTlRST0wuXHJcbiAgICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgICAgdGhpcy5fZGNUYWJsZVJlZnMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMgPSBuZXcgTGlzdCgpO1xyXG5cclxuICAgICAgLy8gVGhlIHByb3BlcnR5IFBST1BfU0VUX1JFQURfT05MWSBpcyBzZXQgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEJ5IGRlZmF1bHRcclxuICAgICAgLy8gdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZSwgc28gd2UgZG8gbm90IHNldCBpdC5cclxuICAgICAgLy8gQnV0IGZvciB0aGUgcGhhbnRvbSB0YXNrIGlmIHRoaXMgcHJvcGVydHkgd2FzIHRydWUsIGFuZCB3ZSBleGl0IHRoZSBwaGFudG9tIGFuZCBhZ2FpbiBlbnRlciBpbnRvXHJcbiAgICAgIC8vIHRoaXMgcGhhbnRvbSB0aGUgcHJvcGVydHkgYmVjb21lcyBmYWxzZS5cclxuICAgICAgLy8gU28gd2UgbmVlZCB0byBzYXZlIHRoZSBwcmV2aW91cyBfY3VyclJlYWRPbmx5IHZhbHVlIGZvciB0aGUgcGhhbnRvbSB0YXNrLlxyXG4gICAgICBpZiAoIWZvcmNlQ3JlYXRlQXJyYXlzKSB7XHJcbiAgICAgICAgdGhpcy5fY3VyclJlYWRPbmx5ID0gbmV3IExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9jaG9pY2VEaXNwcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGlua3MgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VOdW1zID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fcHJldklzTnVsbHMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QgPSBuZXcgTGlzdCgpO1xyXG4gICAgICBpZiAoIXRoaXMuSXNSZXBlYXRhYmxlICYmICFzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBcnJheXMoMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBjb250cm9sIGFuZCByZWZyZXNoZXMgcHJvbXB0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPkNvbnRyb2wgdG8gaGF2ZSBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPmxpbmUgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWZyZXNoUHJvbXB0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhY3RpdmF0ZUZvcm1cIj53aGV0aGVyIHRvIGFjdGl2YXRlIGEgZm9ybSBhZnRlciBzZXRmb2N1cyBvciBub3Q8L3BhcmFtPlxyXG4gIGFzeW5jIFNldEZvY3VzKGN0cmw6IE1nQ29udHJvbEJhc2UsIGxpbmU6IG51bWJlciwgYWN0aXZhdGVGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLCBjdHJsLCBsaW5lLCBhY3RpdmF0ZUZvcm0pO1xyXG4gIH1cclxuXHJcbiAgSW5zZXJ0QXJyYXlzKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkluc2VydFJhbmdlKCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLkluc2VydFJhbmdlKCBuZXcgQXJyYXkoY291bnQpKTtcclxuXHJcbiAgICB0aGlzLl9jdXJyUmVhZE9ubHkuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLkluc2VydFJhbmdlKCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLkluc2VydFJhbmdlKCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VOdW1zLkluc2VydFJhbmdlKG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgaWYgKHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpXHJcbiAgICAgIHRoaXMuX2RjVGFibGVSZWZzLkluc2VydFJhbmdlKG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fcHJvcFRhYi5JbnNlcnRQcmV2VmFsdWVBcnJheSggY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSBhcnJheSdzIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBuZXdTaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIHVwZGF0ZUFycmF5cyhuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jdXJyUmVhZE9ubHkuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZURpc3BzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGlua3MuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTnVtcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgaWYgKHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpIHtcclxuICAgICAgdGhpcy5fZGNUYWJsZVJlZnMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3Byb3BUYWIudXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVQcmV2VmFsQXJyYXlzKG5ld1NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvcFRhYi51cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gcGFyc2UgaW5wdXQgc3RyaW5nIGFuZCBmaWxsIGlubmVyIGRhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPnRvIHBhcmVudCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpdGlkeFwiPm51bWJlciBvZiB0aGUgQ29udHJvbCBpbiBDb250cm9sIFRhYmxlPC9wYXJhbT5cclxuICBmaWxsRGF0YShtZ0Zvcm06IE1nRm9ybUJhc2UsIGRpdElkeDogbnVtYmVyLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuRm9ybSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmluaXRSZWZlcmVuY2VzKG1nRm9ybSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kaXRJZHggPSBkaXRJZHg7XHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHBhcnNlcikpIHtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB0aGUgZGF0YXR5cGUgaXMgQkxPQiwgaXRzIHBpY3R1cmUgd291bGQgYmUgYmxhbmsuIEJ1dCBhZnRlciB2ZXJzaW9uICM5N1xyXG4gICAgLy8gb2YgQXBwU2VyaWFsaXplci5jcyAoY2hhbmdlZCBmb3IgIzQ4NTcyMiksIGJsYW5rIHBpY3R1cmUgaXMgbm90IHNlcmlhbGl6ZWQuXHJcbiAgICAvLyBTbywgd2UgbmVlZCB0byBleHBsaWNpdGx5IHNldCBpdCB0byBibGFuayBoZXJlLlxyXG4gICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiAmJiB0aGlzLl9waWNTdHIgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGljU3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9waWNTdHIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuRGF0YVR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgdGhpcy5zZXRQSUModGhpcy5fcGljU3RyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT046XHJcbiAgICAgICAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FKVxyXG4gICAgICAgICAgICB0aGlzLkRhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEU6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU46XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfR1JPVVA6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9GUkFNRV9TRVQ6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9GUkFNRV9GT1JNOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09OVEFJTkVSOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElORTpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIENvbnRyb2wuZmlsbERhdGEoKTogbWlzc2luZyBkYXRhdHlwZSBvciBwaWN0dXJlIHN0cmluZyBmb3IgY29udHJvbDogezB9XCIsIHRoaXMuTmFtZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICB0aGlzLkZvcm0uc2V0VGFibGVDdHJsKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jcmVhdGVBcnJheXMoZmFsc2UpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+bmFtZSBvZiB0YWcsIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiBpZiBuZXh0IHRhZyBpcyBpbm5lciB0YWc8L3JldHVybnM+XHJcbiAgaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKSB7XHJcbiAgICAgIGlmICh0aGlzLl9wcm9wVGFiID09PSBudWxsKVxyXG4gICAgICAgIHRoaXMuX3Byb3BUYWIgPSBuZXcgUHJvcFRhYmxlKHRoaXMpO1xyXG5cclxuICAgICAgdGhpcy5fcHJvcFRhYi5maWxsRGF0YSh0aGlzLCAnQycsIHBhcnNlcik7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpXHJcbiAgICAgIHRoaXMucGFyc2VBdHRyaWJ1dGVzKHBhcnNlcik7XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFwiU291cmNlVGFibGVcIilcclxuICAgICAgdGhpcy5QYXJzZVNvdXJjZVRhYmxlKHBhcnNlcik7XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFwiL1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gQ29udHJvbC4gSW5zZXJ0IGVsc2UgaWYgdG8gQ29udHJvbC5pbml0SW5uZXJPYmplY3RzIGZvciB7MH1cIiwgZm91bmRUYWdOYW1lKSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUGFyc2VTb3VyY2VUYWJsZShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgbGV0IG9ialJlZlN0cjogc3RyaW5nID0gcGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgIGxldCBzb3VyY2VUYWJsZVJlZmVyZW5jZTogT2JqZWN0UmVmZXJlbmNlID0gT2JqZWN0UmVmZXJlbmNlLkZyb21YTUwob2JqUmVmU3RyLnRyaW0oKSk7XHJcblxyXG4gICAgdGhpcy5Tb3VyY2VUYWJsZVJlZmVyZW5jZSA9IHNvdXJjZVRhYmxlUmVmZXJlbmNlO1xyXG4gICAgLy8gU2tpcCB0aGUgY2xvc2luZyA8L3Byb3A+IHRhZ1xyXG4gICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgY29udHJvbCBmcm9tIHRoZSBYTUxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgcGFyc2VBdHRyaWJ1dGVzKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFwiPlwiLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuXHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpICsgWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSkvKidcIicqLztcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpID0gaSArIDIpIHtcclxuICAgICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSB0b2tlbnMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSB0b2tlbnMuZ2V0X0l0ZW0oaSArIDEpO1xyXG5cclxuICAgICAgICB0aGlzLlNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlU3RyKTtcclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyAxKTsgLy8gdG8gZGVsZXRlIFwiPlwiIHRvb1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gQ29udHJvbC5GaWxsTmFtZSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgdGhlIGNvbnRyb2wgYXR0cmlidXRlcyBpbiBwYXJzaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhZ1Byb2Nlc3NlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UWVBFOlxyXG4gICAgICAgIHRoaXMuVHlwZSA9IHZhbHVlU3RyWzBdIGFzIE1nQ29udHJvbFR5cGU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfREFUQV9DVFJMOlxyXG4gICAgICAgIHRoaXMuX2RhdGFDdHJsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0xJTktFRF9QQVJFTlQ6XHJcbiAgICAgICAgdGhpcy5zZXRMaW5rZWRQYXJlbnRJZHgoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRBSU5FUjpcclxuICAgICAgICB0aGlzLnNldENvbnRhaW5lcihYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVFJPTF9JU046XHJcbiAgICAgICAgdGhpcy5fY29udHJvbElzbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX01PREFMOlxyXG4gICAgICAgIHRoaXMuX2lzTW9kYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVFJPTF9aX09SREVSOlxyXG4gICAgICAgIC8vVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfSE9SX0FMSUdNRU5UX0lTX0lOSEVSSVRFRDpcclxuICAgICAgICAvL1RPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNUYWdQcm9jZXNzZWQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIGltYWdlIG9uIHRoZSBjb250cm9sIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWxlTmFtZVwiPjwvcGFyYW0+XHJcbiAgc2V0SW1hZ2UoKTogdm9pZCB7XHJcbiAgICBsZXQgbmV3VmFsOiBzdHJpbmcgPSB0aGlzLlZhbHVlO1xyXG4gICAgaWYgKG5ld1ZhbCA9PT0gbnVsbCB8fCB0aGlzLklzTnVsbCkge1xyXG4gICAgICBuZXdWYWwgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikge1xyXG4gICAgICAvLyBUT0RPIC0gY2hlY2sgaWYgc2hvdWxkIGJlIHN1cHBvcnRlZCAuXHJcbiAgICAgIC8vIENvbW1hbmRzLmFkZEFzeW5jKENvbW1hbmRUeXBlLlBST1BfU0VUX0lNQUdFX0RBVEEsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBCbG9iVHlwZS5nZXRCeXRlcyhuZXdWYWwpLCBwcm9wLmdldFZhbHVlSW50KCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0SW1hZ2VXaXRoRmlsZU5hbWUobmV3VmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEltYWdlV2l0aEZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChmaWxlTmFtZSA9PT0gbnVsbCkge1xyXG4gICAgICBmaWxlTmFtZSA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBmaWxlTmFtZSA9IEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZShmaWxlTmFtZSk7XHJcblxyXG4gICAgaWYgKCFNaXNjLklzV2ViVXJsKGZpbGVOYW1lKSlcclxuICAgICAgZmlsZU5hbWUgPSBFdmVudHMuR2V0QXNzZXRzVVJMKCkgK1wiL2ltYWdlcy9cIiArIGZpbGVOYW1lO1xyXG5cclxuICAgIGlmICh0aGlzLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfU1RZTEUsIHRoaXMsIDAsIE1hZ2ljUHJvcGVydGllcy5JbWFnZUZpbGUsIGZpbGVOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5JbWFnZSwgZmlsZU5hbWUpO1xyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGZpbGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIGxheW91dCBvbmx5IGlmIHRoZSByYWRpbyBpcyBub3Qgb24gdGFibGUuIGZvciB0YWJsZSwgaXQgaXMgZG9uZVxyXG4gICAgLy8gZnJvbSBMZ1JhZGlvQ29udGFpbmVyLnNldFNwZWNpZmljQ29udHJvbFByb3BlcnRpZXMoKS5cclxuXHJcbiAgICAvLyBpZiAoc3VwZXIuaXNSYWRpbygpICYmICF0aGlzLklzUmVwZWF0YWJsZSkge1xyXG4gICAgLy8gICBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5FWEVDVVRFX0xBWU9VVCwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGZhbHNlKTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBjb250YWluZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29udGFpbmVySWR4XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldENvbnRhaW5lcihjb250YWluZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29udGFpbmVyRGl0SWR4ID0gY29udGFpbmVySWR4O1xyXG4gICAgbGV0IGNvbnRhaW5lcjogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICBjb250YWluZXIgPSB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9jb250YWluZXJEaXRJZHgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb250YWluZXIgIT09IG51bGwgJiYgY29udGFpbmVyLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudFRhYmxlID0gY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jc1JlcGVhdGFibGUgPSAodGhpcy5fcGFyZW50VGFibGUgIT09IG51bGwgJiYgIXN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG5hbWUgb2YgdGhlIENvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIC8vIGlmICh0aGlzLmlzUmVwZWF0YWJsZSgpKSB7XHJcbiAgICAvLyAgIHJldHVybiBzdXBlci5nZXROYW1lKHRoaXMuRm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGlua2VkQ29udHJvbHMoKTogTGlzdDxNZ0NvbnRyb2xCYXNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGlua2VkQ29udHJvbHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhlIGNvbnRyb2wgaXMgcmVwZWF0YWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUmVwZWF0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLklzUmVwZWF0YWJsZTtcclxuICB9XHJcblxyXG4gIElzTW9kYWwoKSA6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybnMgY3VycmVudCBkaXNwbGF5IGxpbmUgb2YgY29udHJvbDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1c2VMaW5lRm9ySXRlbXNcIj5pZiB0cnVlLCB1c2UgY3VycmVudCBsaW5lIGZvciB0cmVlPC9wYXJhbT5cclxuICBnZXREaXNwbGF5TGluZSh1c2VMaW5lRm9ySXRlbXM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5Jc1JlcGVhdGFibGUgfHwgKHVzZUxpbmVGb3JJdGVtcyAmJiBzdXBlci5pc1RhYmxlQ29udHJvbCgpKSkge1xyXG4gICAgICBsaW5lID0gdGhpcy5Gb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIHZpc2liaWxpdHkgY29uc2lkZXJpbmcgcGFyZW50IHZpc2liaWxpdHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgdHJ1ZSk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuaXNQYXJlbnRQcm9wVmFsdWUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBlbmFibGVkIGNvbnNpZGVyaW5nIHBhcmVudCBlbmFibGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRyb2wgaXMgbW9kaWZpYWJsZSBhbmQgdGhlIHRhc2sgbW9kZSBpcyBub3QgcXVlcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTW9kaWZpYWJsZSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgbW9kaWZpYWJsZTogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZJQUJMRSwgdHJ1ZSk7XHJcbiAgICBsZXQgdGFza0luUXVlcnk6IGJvb2xlYW4gPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZO1xyXG4gICAgbGV0IG1vZGlmeUluUXVlcnk6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWSwgZmFsc2UpO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBtb2RpZmlhYmxlICYmIChtb2RpZnlJblF1ZXJ5IHx8ICF0YXNrSW5RdWVyeSk7XHJcbiAgICBpZiAocmVzdWx0ICYmIHRoaXMuX2ZpZWxkICE9IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gKHRoaXMuX2ZpZWxkLkRiTW9kaWZpYWJsZSB8fCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGRjIHZhbHVlcyBvZiB0aGlzIGRhdGEgY29udHJvbCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGNWYWxzKCk6IERjVmFsdWVzIHtcclxuICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2RjVmFsSWQgPT09IEVNUFRZX0RDUkVGKSB7XHJcbiAgICAgIGRjdiA9ICgodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBkYXRhVmlldy5nZXRFbXB0eUNob2ljZUZvclZlY3RvcnMoKSA6IGRhdGFWaWV3LmdldEVtcHR5Q2hvaWNlKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9kY1ZhbElkID4gLTEpIHtcclxuICAgICAgICBkY3YgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRjdjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN1cnJlbnQgaXNOdWxsIGFjY29yZGluZyB0byB0aGUgY29udHJvbCdzIGN1cnJlbnQgbGluZSBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIFByZXZJc051bGwgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0UHJldklzTnVsbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IGN1cnJPYmo6IGFueSA9IHRoaXMuX3ByZXZJc051bGxzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgbGV0IGN1cnI6IGJvb2xlYW47XHJcbiAgICBpZiAoY3Vyck9iaiA9PT0gbnVsbCkge1xyXG4gICAgICBjdXJyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKGxpbmUsIGN1cnIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN1cnIgPSA8Ym9vbGVhbj5jdXJyT2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcHJldklzTnVsbCB2YWx1ZSBvZiB0aGUgcHJldklzTnVsbCBhcnJheVxyXG4gIC8vLyAgIHRoZSBuZXdWYWx1ZSBjYW4gYmUgTlVMTCBvciBib29sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPlxyXG4gIHNldFByZXZJc051bGwobmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSksIG5ld1ZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+PC9wYXJhbT5cclxuICBzZXRQSUMocGljU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBmb3IgcHVzaCBidXR0b24sIHRyYW5zbGF0ZSB0aGUgZm9ybWF0LlxyXG4gICAgaWYgKHN1cGVyLmlzQnV0dG9uKCkpIHtcclxuICAgICAgdGhpcy5fcGljU3RyID0gKHN1cGVyLklzSW1hZ2VCdXR0b24oKSA/IFwiXCIgKyBYTUxDb25zdGFudHMuRklMRV9OQU1FX1NJWkUudG9TdHJpbmcoKSA6IEV2ZW50cy5UcmFuc2xhdGUocGljU3RyKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fcGljU3RyID0gcGljU3RyO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGljID0gbmV3IFBJQyh0aGlzLl9waWNTdHIsIHRoaXMuRGF0YVR5cGUsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9kYXRhQ3RybCAmJiB0aGlzLl9waWNTdHIuaW5kZXhPZignSCcpID4gLTEpIHtcclxuICAgICAgdGhpcy5fcGljLnNldEhlYnJldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcGljdHVyZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBQSUMgcmVmZXJlbmNlPC9yZXR1cm5zPlxyXG4gIGdldFBJQygpOiBQSUMge1xyXG4gICAgaWYgKHRoaXMuX3BpY0V4cEV4aXN0cylcclxuICAgICAgdGhpcy5fcGljLnNldEZvcm1hdEV4cCh0aGlzLl9waWNFeHBFeGlzdHMpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3BpYztcclxuICB9XHJcblxyXG5cclxuLy8vIDxyZXR1cm5zPiB0aGUgcGFyZW50IG9mIHRoZSBjb250cm9sIGNhbiBiZSBUYWJsZVxcVGFiXFxDaG9pY2UgY29udHJvbFxcRm9ybTwvcmV0dXJucz5cclxuICBnZXRQYXJlbnQoKTogYW55IHtcclxuICAgIGxldCByZXRQYXJlbnQ6IGFueSA9IHRoaXMuRm9ybTtcclxuICAgIGlmICh0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xKSB7XHJcbiAgICAgIHJldFBhcmVudCA9IHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2NvbnRhaW5lckRpdElkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgIHJldFBhcmVudCA9IHRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0UGFyZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpZWxkIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGaWVsZCgpOiBHdWlGaWVsZEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFNldCB0aGUgZmllbGQgb2YgdGhlIGNvbnRyb2wgYnkgdGhlIGZpZWxkIG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmaWVsZFwiPjwvcGFyYW0+XHJcbiAgc2V0RmllbGQoZmllbGRPckZpZWxkU3RySUQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGZpZWxkT3JGaWVsZFN0cklEID09PSBudWxsIHx8IGZpZWxkT3JGaWVsZFN0cklEIGluc3RhbmNlb2YgR3VpRmllbGRCYXNlKSB7XHJcbiAgICAgIHRoaXMuc2V0RmllbGRfMChmaWVsZE9yRmllbGRTdHJJRCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0RmllbGRfMShmaWVsZE9yRmllbGRTdHJJRCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWVsZF8wKGZpZWxkOiBHdWlGaWVsZEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpZWxkID0gZmllbGQ7XHJcbiAgICBpZiAoZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmllbGQuU2V0Q29udHJvbCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sIGJ5IGEgc3RyaW5nIGZpZWxkIGlkZW50aWZpZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj50aGUgZmllbGQgaWRlbnRpZmllcjogXCJwYXJlbnRJZCxmaWVsZElkeFwiL3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0RmllbGRfMShmaWVsZFN0cklEOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCByZXR1cm5GaWVsZDogR3VpRmllbGRCYXNlID0gdGhpcy5nZXRGaWVsZEJ5VmFsdWVTdHIoZmllbGRTdHJJRCk7XHJcbiAgICBpZiAocmV0dXJuRmllbGQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmllbGQgPSByZXR1cm5GaWVsZDtcclxuICAgICAgdGhpcy5fZmllbGQuU2V0Q29udHJvbCh0aGlzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gQ29udHJvbC5zZXRGaWVsZCgpOiBpbGxlZ2FsIGZpZWxkIGlkZW50aWZpZXI6IFwiICsgZmllbGRTdHJJRCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBwaWN0dXJlIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1hdFwiPnRoZSBmb3JtYXQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV4cElkXCI+YW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybWF0PC9wYXJhbT5cclxuICBzZXRQaWNTdHIoZm9ybWF0OiBzdHJpbmcsIGV4cElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3BpY1N0ciA9IGZvcm1hdDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgICB0aGlzLl9waWNFeHBFeGlzdHMgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHJhbmdlIG9mIHRoZSBjb250cm9sIGFuZCBjbGVhcnMgdGhlIG1hc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3UmFuZ2VcIj5pcyB0aGUgbmV3IHJhbmdlPC9wYXJhbT5cclxuICBzZXRSYW5nZShuZXdSYW5nZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yYW5nZSA9IG5ld1JhbmdlO1xyXG4gICAgdGhpcy5fdmQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJleHBJZFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBleHByZXNzaW9uPC9wYXJhbT5cclxuICBzZXRWYWxFeHAoZXhwSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFsRXhwSWQgPSBleHBJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgY29weSBvZiB2YWxpZGF0aW9uIGRldGFpbHMgd2l0aCBuZXcgJiBvbGQgdmFsdWUgd2l0aG91dCBjaGFuZ2luZyByZWFsIHZhbGlkYXRpb24gZGV0YWlsc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbGRWYWxcIj52YWx1ZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWxcIj52YWx1ZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgYnVpbGRDb3B5UGljdHVyZShvbGRWYWw6IHN0cmluZywgbmV3VmFsOiBzdHJpbmcpOiBWYWxpZGF0aW9uRGV0YWlscyB7XHJcbiAgICBpZiAoc3VwZXIuaXNUYWJsZUNvbnRyb2woKSB8fCBzdXBlci5pc0NvbHVtbkNvbnRyb2woKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgY29weVZEOiBWYWxpZGF0aW9uRGV0YWlscyA9IHRoaXMuZ2V0Q29weU9mVkQoKTtcclxuICAgICAgY29weVZELnNldFZhbHVlKG5ld1ZhbCk7XHJcbiAgICAgIGNvcHlWRC5zZXRPbGRWYWx1ZShvbGRWYWwpO1xyXG4gICAgICByZXR1cm4gY29weVZEO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIGNvcHkgb2YgdmFsaWRhdGlvbiBkZXRhaWxzLCB3aXRob3V0IGluZmx1ZW5jZSB0byB0aGUgcmVhbCB2YWxpZGF0aW9uIGRldGFpbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0Q29weU9mVkQoKTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG4gICAgbGV0IHJlc3VsdDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICBpZiAodGhpcy5fdmQgPT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzKHRoaXMuVmFsdWUsIHRoaXMuVmFsdWUsIHRoaXMuX3JhbmdlLCB0aGlzLl9waWMsIHRoaXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uRGV0YWlscyh0aGlzLl92ZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCByYW5nZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJhbmdlcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCByYW5nZWQgdmFsdWUgZm9yIGlucHV0IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSYW5nZWRWYWx1ZShuZXdWYWw6IGFueSk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHZkOiBWYWxpZGF0aW9uRGV0YWlscztcclxuICAgIHZkID0gdGhpcy5idWlsZFBpY3R1cmUodGhpcy5WYWx1ZSwgbmV3VmFsKTtcclxuICAgIHZkLmV2YWx1YXRlKCk7XHJcblxyXG4gICAgLy8gdXNlciBoYXMgbW9kaWZpZWQgdmFsdWUsIHNvIHdlIGFyZSBoZXJlIC4uLk1vZGlmaWVkQnlVc2VyIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZVxyXG4gICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRzIHZhbHVlIHdhcyB3cm9uZ1xyXG4gICAgbGV0IHZhbDogYW55ICA9IHZkLmdldERpc3BWYWx1ZSgpXHJcbiAgICByZXR1cm4gKHZhbC50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB2YWxpZGF0ZSB1c2VyIGlucHV0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICB2YWxpZGF0ZShuZXdWYWw6IGFueSk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHZkOiBWYWxpZGF0aW9uRGV0YWlscztcclxuICAgIGxldCBtb2RpZmllZDogYm9vbGVhbiA9IHRoaXMuTW9kaWZpZWRCeVVzZXI7XHJcbiAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTtcclxuICAgIHZkID0gdGhpcy5idWlsZFBpY3R1cmUodGhpcy5WYWx1ZSwgbmV3VmFsKTtcclxuICAgIHZkLmV2YWx1YXRlKCk7XHJcbiAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gbW9kaWZpZWQ7XHJcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRzIHZhbHVlIHdhcyB3cm9uZ1xyXG4gICAgaWYgKHZkLlZhbGlkYXRpb25GYWlsZWQpXHJcbiAgICAgIHJldHVybiB2ZC5FcnJvck1lc3NhZ2U7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZyk6IEd1aUZpZWxkQmFzZSB7XHJcblxyXG4gICAgbGV0IHJlZlBhcmVudDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KHRoaXMucGFyZW50KTtcclxuICAgIGxldCByZWZWZWVJbmR4OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4odGhpcy52ZWVJbmR4KTtcclxuICAgIGxldCByZXQ6IEd1aUZpZWxkQmFzZSA9IDxHdWlGaWVsZEJhc2U+dGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldEZpZWxkQnlWYWx1ZVN0cih2YWx1ZVN0ciwgcmVmUGFyZW50LCByZWZWZWVJbmR4KTtcclxuICAgIHRoaXMucGFyZW50ID0gcmVmUGFyZW50LnZhbHVlO1xyXG4gICAgdGhpcy52ZWVJbmR4ID0gcmVmVmVlSW5keC52YWx1ZTtcclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGhhcyBjb250YWluZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaGFzQ29udGFpbmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lckRpdElkeCAhPT0gLTE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyBsYXllciBvZiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExheWVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5MYXllcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlcyB0aGUgcGljIHVzaW5nIHRoZSByZXN1bHQgb2YgdGhlIGZvcm1hdCBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY0V4cFJlc3VsdFwiPnRoZSByZXN1bHQgb2YgdGhlIGZvcm1hdCBleHByZXNzaW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFBJQyByZWZlcmVuY2UgPC9yZXR1cm5zPlxyXG4gIGNvbXB1dGVQSUMocGljRXhwUmVzdWx0OiBzdHJpbmcpOiBQSUMge1xyXG4gICAgLy8gZm9yIHB1c2ggYnV0dG9uLCB0cmFuc2xhdGUgdGhlIGZvcm1hdC5cclxuICAgIGxldCBwaWNSZXN1bHQ6IHN0cmluZyA9IChwaWNFeHBSZXN1bHQgIT09IG51bGwgJiYgc3VwZXIuaXNCdXR0b24oKSkgPyBFdmVudHMuVHJhbnNsYXRlKHBpY0V4cFJlc3VsdCkgOiBwaWNFeHBSZXN1bHQ7XHJcblxyXG4gICAgLy8gY29uc3RydWN0IGEgbmV3IHBpY3R1cmUgb25seSBpZiB0aGUgZXhwcmVzc2lvbiByZXN1bHQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHByZXZpb3VzIHJlc3VsdFxyXG4gICAgaWYgKHRoaXMuX3ByZXZQaWNFeHBSZXN1bHQgPT09IG51bGwgfHwgISh0aGlzLl9wcmV2UGljRXhwUmVzdWx0ID09PSBwaWNSZXN1bHQpKSB7XHJcbiAgICAgIHRoaXMuX3BpYyA9IG5ldyBQSUMocGljUmVzdWx0LCB0aGlzLkRhdGFUeXBlLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgdGhpcy5fcHJldlBpY0V4cFJlc3VsdCA9IHBpY1Jlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9waWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldHMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNob2ljZSBpbiB0aGUgY2hvaWNlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5pbmRleCBvZiB0aGUgY3VycmVudCBjaG9pY2U8L3JldHVybnM+XHJcbiAgZ2V0Q3VycmVudEluZGV4T2ZDaG9pY2UoKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IHNlbGVjdGVkSW5kaWNlOiBudW1iZXJbXSA9IFstMV07XHJcblxyXG4gICAgbGV0IHZhbDogc3RyaW5nID0gdGhpcy5WYWx1ZTtcclxuXHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWwpKSB7XHJcbiAgICAgIGxldCBhcnJheTI6IHN0cmluZ1tdID0gdmFsLnNwbGl0KCcsJy8qJywnKi8pO1xyXG4gICAgICBzZWxlY3RlZEluZGljZSA9IG5ldyBBcnJheTxudW1iZXI+KGFycmF5Mi5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgYXJyYXkyLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgICAgbGV0IG51bTogbnVtYmVyID0gTk51bWJlci5QYXJzZShhcnJheTJbaUN0cl0pO1xyXG4gICAgICAgIHNlbGVjdGVkSW5kaWNlW2lDdHJdID0gKChudW0gPj0gMCkgPyBudW0gOiAtMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3RlZEluZGljZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0cnVlIGlzIG11bHRpIHNlbGVjdGlvbiBsaXN0IGJveCBlbHNlIGZhbHNlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBlci5pc0xpc3RCb3goKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0cnVlIGlmIGNvbnRyb2wgcGljdHVyZSBpcyBkYXRlIG9yIHRpbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSXNEYXRlVGltZVBpY3R1cmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGljLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IHRoaXMuX3BpYy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0aGlzIGNvbnRyb2wgc3VwcG9ydCBkYXRhIHNvdXJjZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTdXBwb3J0c0RhdGFTb3VyY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCkgfHwgc3VwZXIuaXNUYWJDb250cm9sKCkgfHwgc3VwZXIuaXNSYWRpbygpIHx8IHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkgO1xyXG4gIH1cclxuXHJcbiAgSGFzQXV0b2NvbXBsZXRlKCkge1xyXG4gICAgaWYgKHN1cGVyLmlzVGV4dENvbnRyb2woKSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX0NPTVBMRVRFX01PREVfV0MpLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGhlIGFycmF5IG9mIGluZGljZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIGxpbmsgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgcmVxdWVzdGVkIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzTnVsbFwiPnRydWUgaWYgbWdWYWwgcmVwcmVzZW50cyBhIG51bGwgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYXJyYXkgb2YgaW5kaWNlPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldEluZGV4T2ZDaG9pY2UobWdWYWw6IHN0cmluZywgbGluZTogbnVtYmVyLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XHJcblxyXG4gICAgLy8gaWYgdGhlIGNvbnRyb2wgaXMgbGlzdGJveCB3aXRoIHNpbmdsZSBzZWxlY3Rpb24gbW9kZSwgYW5kIHRoZSB2YWx1ZSBpcyBjb21tYSBzZXBhcmF0ZWQsIHRoZW4gd2Ugc2hvdWxkIG5vdCBzcGxpdCB2YWx1ZSBvbiBjb21tYS5cclxuICAgIGxldCBzcGxpdENvbW1hU2VwZXJhdGVkVmFsczogYm9vbGVhbiA9IHRoaXMuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcblxyXG4gICAgbGV0IGlzVmVjdG9yVmFsdWU6IGJvb2xlYW4gPSB0aGlzLmdldEZpZWxkKCkgIT09IG51bGwgJiYgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjtcclxuICAgIHJldHVybiB0aGlzLmdldERjVmFscygpLmdldEluZGV4T2YobWdWYWwsIGlzVmVjdG9yVmFsdWUsIGlzTnVsbCwgdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSksIHRoaXMuX2Nob2ljZU51bXMuZ2V0X0l0ZW0obGluZSksIHNwbGl0Q29tbWFTZXBlcmF0ZWRWYWxzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gcGFyc2VkIGNvbnRlbnQgb2YgUFJPUF9UWVBFX0RJU1BMQVlfTElTVDwvcmV0dXJucz5cclxuICBhc3luYyBnZXREaXNwVmFscyhsaW5lOiBudW1iZXIsIGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgaWYgKGV4ZWNDb21wdXRlQ2hvaWNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuICAgIH1cclxuICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fb3JnQ2hvaWNlRGlzcHMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2Nob2ljZURpc3BzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGVtcHR5Q2hvaWNlKGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHZhbHVlOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDApO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGlua3Muc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlcyB0aGUgY2hvaWNlcyBvZiBhIFNFTEVDVCBjb250cm9sIHRoYXQgb3JpZ2luYXRlIGZyb20gdGhlIGNvbnRyb2wncyBwcm9wZXJ0aWVzIChpbiBjb250cmFzdCB0b1xyXG4gIC8vLyAgIHRoZSBvbmVzIG9yaWdpbmF0aW5nIGZyb20gdGhlIHVuZGVybGF5aW5nIHRhYmxlIG9mIGEgZGF0YSBjb250cm9sKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlQ2hvaWNlKGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZyb21IZWxwOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJcXFxcXFxcXFwiLCBcIlxcXFwtXCIsIFwiXFxcXCxcIlxyXG4gICAgXTtcclxuICAgIGxldCB0b0hlbHA6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlhYXCIsIFwiWFhcIiwgXCJYWFwiXHJcbiAgICBdO1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGRhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSB0YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgIGxldCBjdXJyRGNJZDogbnVtYmVyID0gdGhpcy5nZXREY1JlZigpO1xyXG4gICAgbGV0IGNob2ljZURpc3BTdHI6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgY2hvaWNlTGlua1N0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBvcHRpb25zVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHRyaW1Ub0xlbmd0aDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZGF0YVR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLkRhdGFUeXBlO1xyXG4gICAgbGV0IGlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgLy8gcmUtY29tcHV0ZSB2YWx1ZXMgb25seSBpZiB0aGV5IGFyZSBub3QgdmFsaWQgb3IgdGhlIERDIHdhcyBjaGFuZ2VkIChkdWUgdG9IZWxwIHJlY29tcHV0ZSlcclxuICAgICAgaWYgKHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpID09PSBudWxsIHx8ICh0aGlzLmlzRGF0YUN0cmwoKSAmJiBjdXJyRGNJZCAhPT0gdGhpcy5fZGNWYWxJZCkpIHtcclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIGRhdGFUeXBlID0gdGhpcy5nZXRGaWVsZCgpLmdldENlbGxzVHlwZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZGlzcFZhbHM6IHN0cmluZ1tdID0gZGN2LmdldERpc3BWYWxzKCk7XHJcbiAgICAgICAgbGV0IGRpc3BQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1QpO1xyXG4gICAgICAgIGxldCBsaW5rUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpO1xyXG4gICAgICAgIGlmIChkaXNwUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGF3YWl0IGRpc3BQcm9wLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaW5rUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY2hvaWNlTGlua1N0ciA9IGF3YWl0IGxpbmtQcm9wLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaG9pY2VMaW5rU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlTGlua1N0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNob2ljZURpc3BTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VEaXNwU3RyKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGlmICghdGhpcy5pc0RhdGFDdHJsKCkgfHwgZGlzcFZhbHMgPT09IG51bGwgfHwgZGlzcFZhbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNob2ljZURpc3BTdHIgPSBjaG9pY2VMaW5rU3RyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNob2ljZURpc3BTdHIgPSAoY2hvaWNlTGlua1N0ciA9IFwiXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNob2ljZURpc3BTdHIgPSBFdmVudHMuVHJhbnNsYXRlKGNob2ljZURpc3BTdHIpO1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZUxpbmtTdHIsIFwiXFxcXC1cIiwgXCItXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVscFN0cjogc3RyaW5nID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZUxpbmtTdHIsIGZyb21IZWxwLCB0b0hlbHApO1xyXG4gICAgICAgIGxldCBzVG9rOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoaGVscFN0ciwgXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaW5rU2l6ZTogbnVtYmVyID0gKGhlbHBTdHIgIT09IFwiXCIpID8gc1Rvay5sZW5ndGggOiAwO1xyXG4gICAgICAgIGxldCBoZWxwU3RyRGlzcDogc3RyaW5nID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZURpc3BTdHIsIGZyb21IZWxwLCB0b0hlbHApO1xyXG4gICAgICAgIHNUb2sgPSBTdHJVdGlsLnRva2VuaXplKGhlbHBTdHJEaXNwLCBcIixcIik7XHJcbiAgICAgICAgbGV0IGRpc3BsYXlTaXplOiBudW1iZXIgPSAoaGVscFN0ckRpc3AgIT09IFwiXCIpID8gc1Rvay5sZW5ndGggOiAwO1xyXG5cclxuICAgICAgICBpZiAobGlua1NpemUgIT09IGRpc3BsYXlTaXplICYmIGRpc3BsYXlTaXplID4gMCkge1xyXG4gICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGNob2ljZUxpbmtTdHI7XHJcbiAgICAgICAgICBpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlciA9IGxpbmtTaXplO1xyXG4gICAgICAgIGxldCBjaG9pY2VMaW5rOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KHNpemUpO1xyXG4gICAgICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIGNob2ljZUxpbmspO1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICAgICAgdGhpcy5fY2hvaWNlTnVtcy5zZXRfSXRlbShsaW5lLCBuZXcgQXJyYXk8TlVNX1RZUEU+KHNpemUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCBkaXNwbGF5IHZhbHVlc1xyXG4gICAgICAgIGxldCBvcmdDaG9pY2VEaXNwOiBzdHJpbmdbXSA9IENob2ljZVV0aWxzLkdldERpc3BsYXlMaXN0RnJvbVN0cmluZyhjaG9pY2VEaXNwU3RyLCBmYWxzZSwgdHJ1ZSwgIWlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QpO1xyXG4gICAgICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIG9yZ0Nob2ljZURpc3ApO1xyXG4gICAgICAgIGxldCBjaG9pY2VEaXNwOiBzdHJpbmdbXSA9IENob2ljZVV0aWxzLkdldERpc3BsYXlMaXN0RnJvbVN0cmluZyhjaG9pY2VEaXNwU3RyLCBzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSwgdHJ1ZSwgIWlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QpO1xyXG4gICAgICAgIHRoaXMuX2Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIGNob2ljZURpc3ApO1xyXG4gICAgICAgIGlmICh0aGlzLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRyaW1Ub0xlbmd0aCA9IHRoaXMuZ2V0RmllbGQoKS5nZXRTaXplKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbGV0IHRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGxldCBoZWxwVG9rZW46IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbGV0IHRva2VuQnVmZmVyOiBTdHJpbmdCdWlsZGVyO1xyXG4gICAgICAgIC8vIEFkZCBsaW5rIHZhbHVlcy5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBjdXJyUG9zOiBudW1iZXIgPSAwLCBuZXh0UG9zID0gMDsgaSA8IHNpemUgJiYgb3B0aW9uc1ZhbGlkOyBpKyspIHtcclxuICAgICAgICAgIG5leHRQb3MgPSBjdXJyUG9zO1xyXG4gICAgICAgICAgbmV4dFBvcyA9IGhlbHBTdHIuaW5kZXhPZignLCcsIG5leHRQb3MpO1xyXG5cclxuICAgICAgICAgIGlmIChuZXh0UG9zID09PSBjdXJyUG9zKVxyXG4gICAgICAgICAgICB0b2tlbiA9IGhlbHBUb2tlbiA9IFwiXCI7XHJcbiAgICAgICAgICBlbHNlIGlmIChuZXh0UG9zID09PSAtMSkge1xyXG4gICAgICAgICAgICB0b2tlbiA9IGNob2ljZUxpbmtTdHIuc3Vic3RyKGN1cnJQb3MpO1xyXG4gICAgICAgICAgICBoZWxwVG9rZW4gPSBoZWxwU3RyLnN1YnN0cihjdXJyUG9zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0b2tlbiA9IGNob2ljZUxpbmtTdHIuc3Vic3RyKGN1cnJQb3MsIChuZXh0UG9zKSAtIChjdXJyUG9zKSk7XHJcbiAgICAgICAgICAgIGhlbHBUb2tlbiA9IGhlbHBTdHIuc3Vic3RyKGN1cnJQb3MsIChuZXh0UG9zKSAtIChjdXJyUG9zKSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY3VyclBvcyA9IG5leHRQb3MgKyAxO1xyXG5cclxuICAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTzpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICAgICAgICB0b2tlbiA9IFN0clV0aWwubHRyaW0odG9rZW4pO1xyXG4gICAgICAgICAgICAgIGhlbHBUb2tlbiA9IFN0clV0aWwubHRyaW0oaGVscFRva2VuKTtcclxuICAgICAgICAgICAgICBpZiAoaGVscFRva2VuLmluZGV4T2YoJ1xcXFwnKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0b2tlblBvczogbnVtYmVyID0gMDsgdG9rZW5Qb3MgPCBoZWxwVG9rZW4ubGVuZ3RoOyB0b2tlblBvcysrKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoaGVscFRva2VuW3Rva2VuUG9zXSAhPT0gJ1xcXFwnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRva2VuQnVmZmVyLkFwcGVuZCh0b2tlblt0b2tlblBvc10pO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlblBvcyA9PT0gaGVscFRva2VuLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5CdWZmZXIuQXBwZW5kKCcgJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbkJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0b2tlbiA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0b2tlbiwgU0VRXzJfU1RSKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSB8fCB0aGlzLmlzVGFiQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgdG9rZW4gPSBDaG9pY2VVdGlscy5SZW1vdmVBY2NsQ2hhckZyb21PcHRpb25zKG5ldyBTdHJpbmdCdWlsZGVyKHRva2VuKSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGNob2ljZUxpbmsgc2l6ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHNpemUgb2YgdGhlIGZpZWxkLCBzbyB0cmltIGl0LlxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpbVRvTGVuZ3RoICE9PSAtMSAmJiBVdGlsU3RyQnl0ZU1vZGUubGVuQih0b2tlbikgPiB0cmltVG9MZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgIHRva2VuID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRva2VuLCB0cmltVG9MZW5ndGgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0cmltVG9MZW5ndGggIT09IC0xICYmIHRva2VuLmxlbmd0aCA+IHRyaW1Ub0xlbmd0aClcclxuICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoMCwgdHJpbVRvTGVuZ3RoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSB0b2tlbjtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAgICAgbGV0IHBpY3R1cmU6IFBJQyA9IFBJQy5idWlsZFBpY3R1cmUoZGF0YVR5cGUsIHRva2VuLCB0YXNrLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIG9wdGlvbnNWYWxpZCA9IHRoaXMub3B0aW9uSXNWYWxpZCh0b2tlbik7XHJcbiAgICAgICAgICAgICAgY2hvaWNlTGlua1tpXSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0b2tlbi50cmltKCksIHBpY3R1cmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmdldENvbXBJZHgoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgICAgICAgICAoKHRoaXMuX2Nob2ljZU51bXMuZ2V0X0l0ZW0obGluZSkpKVtpXSA9IG5ldyBOVU1fVFlQRShjaG9pY2VMaW5rW2ldKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSAoMSAtIGkpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvcHRpb25zVmFsaWQpXHJcbiAgICAgICAgICB0aGlzLmVtcHR5Q2hvaWNlKGxpbmUpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBvcHRpb25zVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVtcHR5Q2hvaWNlKGxpbmUpO1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IDogezF9XCIsIGV4LkdldFR5cGUoKSwgZXguTWVzc2FnZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCA9IG9wdGlvbnNWYWxpZDtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBmb3JtIG9mIHRoZSBzdWJmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRvcE1vc3RGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpLmdldFRvcE1vc3RGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVwbGFjZSB0aGUgdXJsIG9uIGJyb3dzZXIgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRVcmwoKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgMCwgdGhpcy5WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgaW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gd2l0aG91dCBjaGFuZ2luZyB0aGUgY29udHJvbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsXCI+dGhlIGRpc3BsYXllZCB2YWx1ZSB3aXRoIHRoZSBtYXNraW5nIGNoYXJhY3RlcnM8L3BhcmFtPlxyXG4gIGFzeW5jIGdldE1nVmFsdWUoZGlzcFZhbDogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNDaGVja0JveCgpKSB7XHJcbiAgICAgIG1nVmFsID0gZGlzcFZhbCA/IFwiMVwiIDogXCIwXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpIHx8IHN1cGVyLmlzUmFkaW8oKSkge1xyXG5cclxuICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGxpbmUgPCAwKVxyXG4gICAgICAgICAgbGluZSA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcFZhbCA9PT0gXCJudW1iZXJcIilcclxuICAgICAgICAgIGRpc3BWYWwgPSBkaXNwVmFsLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3BWYWwpKVxyXG4gICAgICAgICAgZGlzcFZhbCA9IGRpc3BWYWwuam9pbignLCcpLnRvU3RyaW5nKCk7XHJcblxyXG5cclxuICAgICAgICBpZiAoZGlzcFZhbCA9PT0gXCJcIikge1xyXG4gICAgICAgICAgbWdWYWwgPSBkaXNwVmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIG1nVmFsID0gYXdhaXQgdGhpcy5nZXRMaW5rVmFsdWUoZGlzcFZhbCwgbGluZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZ1ZhbCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gVGhlIGRhdGEgY29udHJvbCB3aWxsIG5ldmVyIHJldHVybiBhbiBpbGxlZ2FsIHZhbHVlIGFzIGEgcmVzdWx0IG9mIGEgdXNlciBzZWxlY3Rpb25cclxuICAgICAgICAgIC8vIGJ1dCBhcyBhIHJlc3VsdCBvZiBhbiBpbml0IGV4cHJlc3Npb24sIHVwZGF0ZSBvcGVyYXRpb24gb3IgdmFsdWVzIG9mIGRhdGEgaW5cclxuICAgICAgICAgIC8vIHRoZSByZWNvcmQuIFRoZXJlZm9yZSwgdGhlIHNhbWUgaWxsZWdhbCB2YWx1ZSBzaG91bGQgYmUgdGFrZW4gZnJvbSBpdHMgc291cmNlLFxyXG4gICAgICAgICAgLy8gd2hpY2ggaXMgYSBmaWVsZCBvciBhbiBleHByZXNzaW9uLiAoRWh1ZCAxOS1qdW4tMjAwMSlcclxuICAgICAgICAgIGxldCByZWZNZ1ZhbDogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbTxzdHJpbmc+KG1nVmFsKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBtZ1ZhbCA9IHJlZk1nVmFsLnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgYmxvYkNvbnRlbnRUeXBlOiBzdHJpbmcgPSAodGhpcy5fZmllbGQgIT09IG51bGwpID8gdGhpcy5fZmllbGQuZ2V0Q29udGVudFR5cGUoKSA6IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOO1xyXG4gICAgICAgIG1nVmFsID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKGRpc3BWYWwsIHRoaXMuX3BpYywgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgYmxvYkNvbnRlbnRUeXBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1nVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgZm9yIGluZGljZSBwYXNzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZWxlY3RlZEluZGljZVwiPmNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5jb21tYSBzZXBhcmF0ZWQgdmFsdWVzPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldExpbmtWYWx1ZShzZWxlY3RlZEluZGljZTogc3RyaW5nLCBsaW5lOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBOU3RyaW5nLkVtcHR5O1xyXG4gICAgbGV0IHRlbXA6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcblxyXG4gICAgbGV0IGNob2ljZUxpbms6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSk7XHJcblxyXG4gICAgaWYgKGNob2ljZUxpbmsgIT09IG51bGwpIHtcclxuICAgICAgLy8gY29tcHV0ZSBzaXplIG9mIGRpc3BsYXllZCB2YWx1ZXMgYXJyYXlcclxuICAgICAgc2l6ZSA9IGNob2ljZUxpbmsubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IGxpbmtJbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRMaW5rSWR4RnJvbUxheWVyKE1pc2MuR2V0SW50QXJyYXkoc2VsZWN0ZWRJbmRpY2UpKTtcclxuXHJcbiAgICBsZXQgYXJyYXkyOiBudW1iZXJbXSA9IGxpbmtJbmRpY2U7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXkyLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IGFycmF5MltpXTtcclxuICAgICAgaWYgKGlkeCA+PSBzaXplKSB7XHJcbiAgICAgICAgbGV0IGRjVmFsczogRGNWYWx1ZXMgPSB0aGlzLmdldERjVmFscygpO1xyXG4gICAgICAgIHRlbXAucHVzaChkY1ZhbHMuZ2V0TGlua1ZhbHVlKGlkeCAtIHNpemUpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgY2hvaWNlTGluay5sZW5ndGgpIHtcclxuICAgICAgICAgIHRlbXAucHVzaChjaG9pY2VMaW5rW2lkeF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRlbXAucHVzaChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICBsZXQgdmVjdG9yVHlwZTogVmVjdG9yVHlwZSA9IG5ldyBWZWN0b3JUeXBlKHRoaXMuZ2V0RmllbGQoKSk7XHJcbiAgICAgIGZvciAobGV0IGluZHg6IG51bWJlciA9IDA7IGluZHggPCB0ZW1wLmxlbmd0aDsgaW5keCA9IGluZHggKyAxKSB7XHJcbiAgICAgICAgdmVjdG9yVHlwZS5zZXRWZWNDZWxsKGluZHggKyAxLCB0ZW1wLmdldF9JdGVtKGluZHgpLCB0ZW1wLmdldF9JdGVtKGluZHgpID09PSBudWxsKTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSB2ZWN0b3JUeXBlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRlbXAuam9pbihcIixcIik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVtcC5nZXRfSXRlbSgwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGV4dCBvbiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRUZXh0KCk6IHZvaWQge1xyXG4gICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IG1sc1RyYW5zbGF0ZWRWYWx1ZTogYW55ID0gdGhpcy5WYWx1ZTtcclxuICAgIGlmIChzdXBlci5pc0J1dHRvbigpKSB7XHJcbiAgICAgIG1sc1RyYW5zbGF0ZWRWYWx1ZSA9IEV2ZW50cy5UcmFuc2xhdGUodGhpcy5WYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1RleHRDb250cm9sKCkgfHwgdGhpcy5pc0J1dHRvbigpKVxyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgZGlzcGxheUxpbmUsIG1sc1RyYW5zbGF0ZWRWYWx1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgZGlzcGxheUxpbmUsIC8qXCJpbm5lckhUTUxcIiovIEh0bWxQcm9wZXJ0aWVzLlRleHQsIG1sc1RyYW5zbGF0ZWRWYWx1ZSk7XHJcblxyXG4gICAgLy8gQ29tbWFuZHMuYWRkQXN5bmMoQ29tbWFuZFR5cGUuUFJPUF9TRVRfVEVYVCwgdGhpcywgZGlzcGxheUxpbmUsIG1sc1RyYW5zbGF0ZWRWYWx1ZSwgMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcmFkaW8gYnV0dG9uIGNoZWNrZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFkaW9MaW5lXCI+aXMgdGhlIGxpbmUgb2YgdGhlIHJhZGlvIHRoYXQgbmVlZCB0byBiZSBTZXQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0UmFkaW9DaGVja2VkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGluZGV4KTtcclxuICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcblxyXG4gICAgLy8gc2V0IGNvbnRyb2wgdG8gZm9jdXNcclxuICAgIGlmIChpbmRleCAhPT0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfVkFMVUVfSU5UKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29udHJvbFRvRm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldENvbnRyb2xUb0ZvY3VzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmdldEZpZWxkKCkuQ29udHJvbFRvRm9jdXMgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBDaGVja0JveCBWYWx1ZSB0byB0aGUgY2hlY2sgYm94IGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2V0Q2hlY2tCb3hWYWx1ZShsaW5lOiBudW1iZXIsIG1nVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjaGVja1N0YXRlOiBib29sZWFuID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4obWdWYWwpO1xyXG4gICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsIGNoZWNrU3RhdGUpO1xyXG4gICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuQ2hlY2tCb3hJbmRldGVybWluYXRlLCB0aGlzLklzTnVsbCk7XHJcbiAgfVxyXG5cclxuICBzZXRBc1RocmVlU3RhdGUoKXtcclxuICAgIHRoaXMuX3Byb3BUYWIuc2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9USFJFRV9TVEFURVMsIFwiMVwiLCB0aGlzLCBcIkNcIik7XHJcbiAgfVxyXG5cclxuICBpc1RocmVlU3RhdGVDaGVja0JveCgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RocmVlU3RhdGVDaGVja0JveCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmKHRoaXMuaXNDaGVja0JveCgpKVxyXG4gICAgICBpc1RocmVlU3RhdGVDaGVja0JveCA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEhSRUVfU1RBVEVTLCBmYWxzZSk7XHJcbiAgICByZXR1cm4gaXNUaHJlZVN0YXRlQ2hlY2tCb3g7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVDaGFuZ2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmU6IG51bWJlciwgdmFsdWVDaGFuZ2VkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICBsZXQgY3VyckRjSWQ6IG51bWJlciA9IHRoaXMuZ2V0RGNSZWYoKTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSByYW5nZSB3YXMgY2hhbmdlZCB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoZSBjb3JyZWN0IGNob2ljZSBvcHRpb25cclxuICAgICAgaWYgKHRoaXMuX3JhbmdlQ2hhbmdlZCkge1xyXG4gICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcmFuZ2VDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0YUN0cmwoKSAmJiBjdXJyRGNJZCAhPT0gdGhpcy5fZGNWYWxJZCkge1xyXG5cclxuICAgICAgICAvLyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogc2VydmVyIHdyaXRlcyBvcHRpb25MaXN0IHRvIHRoZSBIVE1MLiBObyBuZWVkIHRvIGFwcGx5XHJcbiAgICAgICAgLy8gdGhlbVxyXG4gICAgICAgIC8vIGZvciB0aGUgZmlyc3QgdGltZS5cclxuICAgICAgICAvLyBmb3JjZSB1cGRhdGUgb2YgdGhlIHZhbHVlIHdoZW5ldmVyIHRoZSBzZXQgb2Ygb3B0aW9ucyBpcyByZXBsYWNlZFxyXG4gICAgICAgIC8vIGlmIChmb3JtLmZvcm1SZWZyZXNoZWQoKSB8fCBmb3JjZVJlZnJlc2gpXHJcblxyXG4gICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGNSZWYodGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBkY3JlZiBmb3IgdGhlIGN1cnJlbnQgdGFibGUgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkY0lkXCI+dGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIGRjdmFsczwvcGFyYW0+XHJcbiAgc2V0RGNSZWYoZGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1RhYmxlUmVmcy5zZXRfSXRlbSh0aGlzLmdldERjTGluZU51bSgpLCBkY0lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXBsYWNlIHRoZSBpbWFnZSBsaXN0IG9mIGFuIGJ1dHRvbiBjb250cm9sIHdpdGggdGhlIGltYWdlIGF0IHRoZSBnaXZlbiBVUkxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEltYWdlTGlzdCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGUgYm9vbGVhbiBwcm9wZXJ0eShleDp2aXNpYmxlXFxlbmFibGUpIG9mIGNvbnRyb2wgYW5kIGl0J3MgY2hpbGRyZW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+cHJvcGVydHkgaWQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+Y29tbWFuZCB0eXBlIHRoYXQgYmVsb25nIHRvIHRoZSBwcm9wIGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1cGRhdGVUaGlzXCI+PC9wYXJhbT5cclxuICBhc3luYyB1cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4sIHVwZGF0ZVRoaXM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmICh2YWwgJiYgdGhpcy5oYXZlVG9DaGVja1BhcmVudFZhbHVlKCkpIHtcclxuICAgIC8vICB2YWwgPSB0aGlzLmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCk7XHJcbiAgICAvLyB9XHJcbiAgICBpZiAodXBkYXRlVGhpcykge1xyXG5cclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUgPyBIdG1sUHJvcGVydGllcy5WaXNpYmxlIDogSHRtbFByb3BlcnRpZXMuRW5hYmxlZCwgdmFsKTtcclxuXHJcbiAgICB9XHJcbiAgICAvLyB0b2RvOiBzaG91bGQgZ28gb3ZlciBvbmx5IGxpbmtlZCBjb250cm9scyAtIG5vdCBjaGlsZHJlbiBjb250cm9scywgbmVlZCB0byBjaGVjayB3aXRoIFBNIHRoaXMgYmVoYXZpb3JcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgdmFsKTtcclxuICB9XHJcblxyXG4gIFNldEVuYWJsZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5FbmFibGVkLCB2YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZXMgdmlzaWJpbGl0eSBvZiBjb250cm9scyBsaW5rZWQgdG8gdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgdXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKCFzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIC8vIGluIHRhYmxlIGFsbCBjaGlsZHJlbiBhcmUgY29udGFpbmVkLFxyXG4gICAgICAvLyB0YWJsZSdzIHZpc2liaWxpdHlcXGVuYWJsZSB3aWxsIGFmZmVjdCB0aGVtXHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fbGlua2VkQ29udHJvbHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuXHJcbiAgICAgICAgbGV0IGNoaWxkOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fbGlua2VkQ29udHJvbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgLy8gRGVmZWN0IDExNzI5NC4gRG8gbm90IGNvbnRpbnVlIGZvciB0aGUgZmlyc3QgdGltZS4gSXQgYWZmZWN0cyBvbiB0aGUgcGxhY2VtZW50LlxyXG4gICAgICAgIGlmIChjaGlsZC5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGRWYWx1ZTogYm9vbGVhbiA9IChjaGlsZC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIHRydWUpKTtcclxuXHJcbiAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkVmFsdWUgJiYgdmFsO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGRPbkN1cnJlbnRMYXllcjogYm9vbGVhbiA9IHRoaXMuaXNDaGlsZE9uQ3VycmVudExheWVyKGNoaWxkKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbW1hbmRUeXBlID09PSBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFKSB7XHJcblxyXG4gICAgICAgICAgaWYgKGNoaWxkVmFsdWUpIHtcclxuICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkT25DdXJyZW50TGF5ZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBjaGlsZC51cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCBjaGlsZFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN1cGVyLmlzU3ViZm9ybSgpKSB7XHJcbiAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3ViZm9ybUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRyb2wgaXMgZGVzY2VuZGFudCBvZiBzcGVjaWZpZWQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0Rlc2NlbmRlbnRPZkNvbnRyb2woY29udHJvbDogR3VpTWdDb250cm9sKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNDb250YWluZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoY29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcGFyZW50OiBhbnkgPSB0aGlzLmdldFBhcmVudCgpO1xyXG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTWdDb250cm9sQmFzZSkge1xyXG4gICAgICAgIGlmIChwYXJlbnQgPT09IGNvbnRyb2wpIHtcclxuICAgICAgICAgIGlzQ29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiBjdXJyZW50IGNvbnRyb2wgYmVsb25ncyB0byB0YWJsZSwgdGhlbiBpdCBpcyBhbHNvIGEgZGVzY2VuZGFudCBvZiB0aGUgY29sdW1uIGNvbnRyb2wgdG9cclxuICAgICAgICAgIC8vIHdoaWNoIGl0IGJlbG9uZ3MuIEFjY29yZGluZyB0byBvdXIgaGllcmFyY2h5LCB0aGUgY29udHJvbCBpcyBkaXJlY3QgZGVzY2VuZGFudCBvZiB0YWJsZVxyXG4gICAgICAgICAgLy8gY29udHJvbDsgaGVuY2UsIHdlIG5lZWQgdG8gaGFuZGxlIGNvbHVtbiBjb250cm9sXHJcblxyXG4gICAgICAgICAgbGV0IHBhcmVudENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSAoKHBhcmVudCBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpID8gPE1nQ29udHJvbEJhc2U+cGFyZW50IDogbnVsbCk7XHJcbiAgICAgICAgICBpZiAoY29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4gJiYgcGFyZW50Q29udHJvbCAhPT0gbnVsbCAmJiBwYXJlbnRDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFICYmIGNvbnRyb2wuTGF5ZXIgPT09IHRoaXMuTGF5ZXIpXHJcbiAgICAgICAgICAgIGlzQ29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaXNDb250YWluZWQgPSAoKDxNZ0NvbnRyb2xCYXNlPnBhcmVudCkuaXNEZXNjZW5kZW50T2ZDb250cm9sKGNvbnRyb2wpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc0NvbnRhaW5lZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGVzIHZpc2liaWxpdHkgb3IgZW5hYmxlIHByb3BlcnR5IG9mIHN1YmZvcm0gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+SWQgb2YgdmlzaWJpbGl0eSBvciBlbmFibGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj50eXBlIG9mIHRoZSBHVUkgY29tbWFuZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj52YWx1ZSBmb3IgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICB1cGRhdGVTdWJmb3JtQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGNoaWxkJ3MgbGF5ZXIgaXMgZXF1YWwgdG8gY3VycmVudCBsYXllciBvZiB0aGUgcGFyZW50LCByZWxhdmFudCBmb3IgdGFiIGNvbnRyb2wgZm9yIGFsbCBvdGhlclxyXG4gIC8vLyAgIGNvbnRyb2xzIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGlsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHBhcmVudCBpcyBub3QgdGFiIGNvbnRyb2wgb3IgcGFyZW50IGlzIHRhYiBjb250cm9sIHdpdGggc2FtZSBsYXllcjwvcmV0dXJucz5cclxuICBpc0NoaWxkT25DdXJyZW50TGF5ZXIoY2hpbGQ6IE1nQ29udHJvbEJhc2UpOiBib29sZWFuIHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgY29udHJvbCBoYXMgc2FtZSBsYXllciB0aGF0IGlzIGN1cnJlbnRseSBzZXQgb24gaXQncyBwYXJlbnQgdGFiIGNvbnRyb2xcclxuICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICBsZXQgcGFyZW50TGF5ZXI6IG51bWJlciA9IDA7XHJcbiAgICAgIGlmICh0aGlzLlZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50TGF5ZXIgPSB0aGlzLmdldEN1cnJlbnRMaW5rSWR4KCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBsYXllcjogbnVtYmVyID0gY2hpbGQuZ2V0TGF5ZXIoKTtcclxuICAgICAgaWYgKHBhcmVudExheWVyICE9PSBsYXllciAmJiBsYXllciA+IDApIHtcclxuICAgICAgICAvLyBzb25zIG9mIGxheWVyIDAgZGlzcGxheWVkIGFsd2F5c1xyXG4gICAgICAgIHJldCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBjdXJyZW50IGxpbmsgSWR4IG9mIGNob2ljZSBjb250cm9scywgb3IgemVybyBmb3Igb3RoZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN1cnJlbnRMaW5rSWR4KCk6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyckxpbmtJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpIHx8IHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkpIHtcclxuICAgICAgbGV0IGN1cnJlbnRMYXllcnM6IG51bWJlcltdID0gdGhpcy5nZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpO1xyXG4gICAgICBsZXQgY3VyckxpbmtJbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRMaW5rSWR4RnJvbUxheWVyKGN1cnJlbnRMYXllcnMpO1xyXG4gICAgICBjdXJyTGlua0lkeCA9IGN1cnJMaW5rSW5kaWNlWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJMaW5rSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXRzIGxheWVyIGZyb20gdGhlIHNlbGVjdGVkIGluZGljZSBwYXNzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5rSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YXJyYXkgb2YgbGF5ZXIgdmFsdWVzLjwvcmV0dXJucz5cclxuICBnZXRMYXllckZyb21MaW5rSWR4KGluZGljZTogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgbGF5ZXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGluZGljZS5sZW5ndGgpO1xyXG5cclxuICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCBpbmRpY2UubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgbGV0IGlkeDogbnVtYmVyID0gaW5kaWNlW2lDdHJdO1xyXG4gICAgICAvLyBCeSBkZWZhdWx0LCBsYXllciA9IGxpbmtJZHggdW5sZXNzIGl0IGlzIGEgVGFiIGNvbnRyb2xcclxuXHJcbiAgICAgIGxheWVyc1tpQ3RyXSA9IGlkeDtcclxuXHJcbiAgICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSAmJiBpZHggPj0gMCkge1xyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgICAgIGxpbmUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbGF5ZXJMaXN0OiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxheWVyTGlzdC5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgICBpZiAobGF5ZXJMaXN0ICE9PSBudWxsICYmIGxheWVyTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsYXllcnNbaUN0cl0gPSBsYXllckxpc3QuaW5kZXhPZigoaWR4ICsgMSkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGF5ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSBzZWxlY3RlZCBpbmRpY2UgZm9yIHNlbGVjdGVkIHZhbHVlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxheWVyc1wiPmFuIGFycmF5IG9mIGN1cnJlbnQgbGF5ZXJzIHRhYiBjb250cm9scy4gSXQgY2FuIGJlIGFycmF5IGJlY2F1c2Ugb2YgbXVsdGlwbGUgc2VsZWN0aW9uLjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmFycmF5IG9mIGluZGljZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldExpbmtJZHhGcm9tTGF5ZXIobGF5ZXJzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuICAgIGxldCBsaW5rSW5kaWNlOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGxheWVycy5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGxheWVycy5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICBsZXQgbGF5ZXI6IG51bWJlciA9IGxheWVyc1tpQ3RyXTtcclxuICAgICAgbGlua0luZGljZVtpQ3RyXSA9IGxheWVyO1xyXG4gICAgICBpZiAoc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICBpZiAobGF5ZXIgPCAwKSB7XHJcbiAgICAgICAgICBsaW5rSW5kaWNlW2lDdHJdID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICAgICAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbGF5ZXJMaXN0OiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxheWVyTGlzdC5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgICAgIGlmIChsYXllckxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxheWVyTGlzdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBsYXllckxpc3QubGVuZ3RoICE9PSAwICYmIGxheWVyIDwgbGF5ZXJMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsaW5rSW5kaWNlW2lDdHJdID0gTk51bWJlci5QYXJzZShsYXllckxpc3RbbGF5ZXJdKSAtIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGlua0luZGljZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWN1cnNpdmUgbWV0aG9kLCBjaGVja3MgaWYgcGFyZW50IG9mIHRoZSBjaGlsZCBpcyB2aXNpYmxlXFxlbmFibGUsIHVsdGlsIHRoZXJlIGlzIG5vIHBhcmVudCBvciBmb3VuZFxyXG4gIC8vLyAgIHBhcmVudCB0aGF0IGlzIGhpZGRlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNQYXJlbnRQcm9wVmFsdWUocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjb2x1bW46IE1nQ29udHJvbEJhc2UgPSB0aGlzLkZvcm0uZ2V0Q29udHJvbENvbHVtbih0aGlzKTtcclxuICAgIGxldCBwYXJlbnQ6IE1nQ29udHJvbEJhc2UgPSA8TWdDb250cm9sQmFzZT50aGlzLmdldExpbmtlZFBhcmVudCh0cnVlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgLy8gbm8gbW9yZSBwYXJlbnRzXHJcbiAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gcGFyZW50IGlzIGhpZGRlblxyXG4gICAgICBpZiAoIXBhcmVudC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIHRydWUpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnQuaXNDaGlsZE9uQ3VycmVudExheWVyKHRoaXMpKSB7XHJcbiAgICAgICAgICAvLyBwYXJlbnQgaXMgdGFiIGNvbnRyb2wgd2l0aCBjdXJyZW50IGxheWVyXHJcbiAgICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSBjaGlsZCdzIGxheWVyXHJcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBmb3IgdGFibGUgY2hpbGRyZW4gY2hlY2sgaWYgY29sdW1uIHZpc2libGVcclxuICAgICAgICAgIHJlc3VsdCA9ICghKGNvbHVtbiAhPT0gbnVsbCAmJiAhY29sdW1uLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpICYmIHBhcmVudC5pc1BhcmVudFByb3BWYWx1ZShwcm9wSWQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGNvbnRyb2wgdG8gd2hpY2ggdGhpcyBjb250cm9sIGlzIGxpbmtlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja1N1YmZvcm1GYXRoZXJcIj5pZiB0cnVlIGNoZWNrIGZvciBTdWJmb3JtIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGlua2VkUGFyZW50KGNoZWNrU3ViZm9ybUZhdGhlcjogYm9vbGVhbik6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIge1xyXG5cclxuICAgIGlmICh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggIT09IC0xKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChjaGVja1N1YmZvcm1GYXRoZXIgJiYgdGhpcy5Gb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgY3VycmVudCBsaW5lIHZhbHVlIG9mIHRoZSByZWFkT25seSBoaXN0b3J5IGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0PC9wYXJhbT5cclxuICBTZXRDdXJyUmVhZE9ubHkobmV3VmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUmVhZE9ubHkuc2V0X0l0ZW0odGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKSwgbmV3VmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN1cnJlbnQgcmVhZE9ubHkgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sJ3MgY3VycmVudCBsaW5lIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVhZE9ubHkgdmFsdWU8L3JldHVybnM+XHJcbiAgR2V0Q3VyclJlYWRPbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHN1cGVyLmlzVGFibGVDb250cm9sKCkgPyAwIDogdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBjdXJyT2JqOiBhbnkgPSB0aGlzLl9jdXJyUmVhZE9ubHkuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICBsZXQgY3VycjogYm9vbGVhbjtcclxuICAgIGlmIChjdXJyT2JqID09PSBudWxsKSB7XHJcbiAgICAgIGN1cnIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fY3VyclJlYWRPbmx5LnNldF9JdGVtKGxpbmUsIGN1cnIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN1cnIgPSA8Ym9vbGVhbj5jdXJyT2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgY29udHJvbCBpcyBhIERhdGEgQ29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNEYXRhQ3RybCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGRjcmVmIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsaW5lIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZGNJZDwvcmV0dXJucz5cclxuICBnZXREY1JlZigpOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGNMaW5lTnVtKCk7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLl9kY1RhYmxlUmVmcy5nZXRfSXRlbSh0aGlzLmdldERjTGluZU51bSgpKTtcclxuICAgIGxldCBkY0lkOiBudW1iZXI7XHJcbiAgICBpZiAob2JqID09PSBudWxsKSB7XHJcbiAgICAgIGRjSWQgPSAtMjtcclxuICAgICAgdGhpcy5fZGNUYWJsZVJlZnMuc2V0X0l0ZW0obGluZSwgZGNJZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGNJZCA9IDxudW1iZXI+b2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRjSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBmb3IgYSBkYXRhIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0RGNMaW5lTnVtKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1JlcGVhdGFibGUgPyB0aGlzLkZvcm0uRGlzcGxheUxpbmUgOiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZSBvbmUgY2hvaWNlIG9wdGlvbiBmcm9tIGl0ZW1zIGxpc3QgaXMgdmFsaWQuIFRoZSBjaGVjayBpcyBvbmx5IGZvciBpdGVtcyBsaXN0IGFuZCBub3QgZm9yIHRoZVxyXG4gIC8vLyAgIGRhdGEgc291cmNlIG9wdGlvbnMsIChGWUk6IGZvciB0aGUgb3B0aW9uIGZyb20gdGhlIERhdGFDdHJsLCB3ZSBhcmUgbm90IGNhbGxpbmcgdGhpc1xyXG4gIC8vLyAgIG1ldGhvZCwgTk8gQ0hFQ0sgSVMgRE9ORSkgaW4gb25saW5lIDpjaV9jaGVja19yYW5nZV9zdHJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3B0aW9uOlwiPm9uZSBvcHRpb24gZnJvbSB0aGUgaXRlbXMgbGlzdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIG9wdGlvbklzVmFsaWQob3B0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmIG9wdGlvbi5sZW5ndGggPiAwICYmIG9wdGlvbi5pbmRleE9mKCcwJykgPT09IC0xKSB7XHJcbiAgICAgIGxldCBjb252ZXJ0TnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBjb252ZXJ0TnVtLm51bV80X2Ffc3RkKG9wdGlvbik7XHJcbiAgICAgIGlmIChjb252ZXJ0TnVtLm51bV9pc196ZXJvKCkpIHtcclxuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByZXBhcmVzIGFuZCByZXR1cm5zIHRoZSBvcmRlcmVkIGxpc3QgYmFzZWQgb24gbGF5ZXJzIGluIGxheWVyTGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaG9pY2VEaXNwTGlzdFwiPnVub3JkZXJlZCBsaXN0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JkZXJlZERpc3BMaXN0KGNob2ljZURpc3BMaXN0OiBzdHJpbmdbXSwgbGluZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG5cclxuICAgIGxldCBjaG9pY2VMYXllclN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBkaXNwQXJyeUxpc3Q6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCBsYXllckFycnlMaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgbGF5ZXJQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFX0xBWUVSU19MSVNUKTtcclxuXHJcbiAgICBpZiAobGF5ZXJQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIGNob2ljZUxheWVyU3RyID0gYXdhaXQgbGF5ZXJQcm9wLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNob2ljZUxheWVyU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlTGF5ZXJTdHIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjaG9pY2VMYXllclN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hvaWNlTGF5ZXJTdHIubGVuZ3RoID4gMCAmJiBjaG9pY2VEaXNwTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gY2hvaWNlTGF5ZXJTdHIuc3BsaXQoXCIsXCIpO1xyXG4gICAgICBsZXQgcG9zQ29weUluZGV4OiBudW1iZXIgPSAtMTtcclxuICAgICAgZm9yIChsZXQgaW5kZXg6IG51bWJlciA9IDA7IGluZGV4IDwgbGF5ZXJMaXN0Lmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDEpIHtcclxuICAgICAgICBsZXQgY3VyckxheWVyTGlzdFZhbDogc3RyaW5nID0gbGF5ZXJMaXN0W2luZGV4XS50cmltKCk7XHJcbiAgICAgICAgaWYgKCEobGF5ZXJBcnJ5TGlzdC5pbmRleE9mKGN1cnJMYXllckxpc3RWYWwpICE9PSAtMSkpIHtcclxuICAgICAgICAgIGxldCByZWZQb3NDb3B5SW5kZXg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihwb3NDb3B5SW5kZXgpO1xyXG4gICAgICAgICAgbGV0IGlzTnVtYmVyOiBib29sZWFuID0gTk51bWJlci5UcnlQYXJzZShjdXJyTGF5ZXJMaXN0VmFsLCByZWZQb3NDb3B5SW5kZXgpO1xyXG4gICAgICAgICAgcG9zQ29weUluZGV4ID0gcmVmUG9zQ29weUluZGV4LnZhbHVlO1xyXG5cclxuICAgICAgICAgIC8vIHBvc0NvcHlJbmRleCBpcyAxQmFzZWQsIHNvIG11c3Qgbm90IGJlIHplcm8uIEFsc28sIGl0IG11c3Qgbm90IGJlXHJcbiAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gbm8gb2YgZWxlbWVudHMgaW4gdGhlIERpcGxheUxpc3QuXHJcblxyXG4gICAgICAgICAgaWYgKGlzTnVtYmVyICYmIHBvc0NvcHlJbmRleCA+IDAgJiYgcG9zQ29weUluZGV4IDw9IGNob2ljZURpc3BMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBkaXNwQXJyeUxpc3QucHVzaCgoY2hvaWNlRGlzcExpc3RbcG9zQ29weUluZGV4IC0gMV0pLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIGxheWVyQXJyeUxpc3QucHVzaChjdXJyTGF5ZXJMaXN0VmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmdbXTtcclxuICAgIGlmIChkaXNwQXJyeUxpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IGNob2ljZURpc3BMaXN0O1xyXG4gICAgICB0aGlzLl9jaG9pY2VMYXllckxpc3Quc2V0X0l0ZW0obGluZSwgbmV3IEFycmF5PHN0cmluZz4oMCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KGRpc3BBcnJ5TGlzdC5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IHJlc3VsdC5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICAgIHJlc3VsdFtfYWldID0gbnVsbDtcclxuXHJcbiAgICAgIHJlc3VsdCA9IGRpc3BBcnJ5TGlzdC5Ub0FycmF5KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBsYXllckFycnlMaXN0LlRvQXJyYXkoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBwcmV2aW91cyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsKCk6IHZvaWQge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5zZXRQcmV2SXNOdWxsX1RvTnVsbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vICAgc2V0cyB0aGUgcHJldklzTnVsbCB2YWx1ZSBvZiB0aGUgcHJldklzTnVsbCBhcnJheVxyXG4gIC8vLyAgIHRoZSBuZXdWYWx1ZSBjYW4gYmUgTlVMTCBvciBib29sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRQcmV2SXNOdWxsX1RvTnVsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSksIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgYW4gZXhwcmVzc2lvbiB3YXMgc2V0IGFzIHRoZSBkYXRhPC9yZXR1cm5zPlxyXG4gIGV4cHJlc3Npb25TZXRBc0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsRXhwSWQgPiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGxlZCB3aGVuZXZlciB0aGUgY2hvaWNlIGxpc3Qgb2YgYSBTRUxFQ1QgY29udHJvbCBoYXMgY2hhbmdlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJSYW5nZShsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYXZlIHRvIGNoZWNrIHBhcmVudCB2aXNpYmlsaXR5XFxlbmFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlLCBpZiB0aGUgY29udHJvbCBpcyBjb25uZWN0ZWQgdG8gYSBjb250YWluZXIgb3IgdGhlIHRhc2sgaXMgYSBzdWJmb208L3JldHVybnM+XHJcbiAgaGF2ZVRvQ2hlY2tQYXJlbnRWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggIT09IC0xKSB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb250YWluZWRJbkxpbmtlZFBhcmVudCgpKSB7XHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjb250YWluZWQgdGFiIGNoaWxkcmVuIG9mIGFsbCBsYXllcnMgYXJlIG9uIHRoZSBzYW1lIHdpbmRvdyxcclxuICAgICAgLy8gc28gd2UgbXVzdCBoYW5kbGUgdGhlcmUgdmlzaWJpbGl0eVxcZW5hYmxlXHJcblxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fbGlua2VkUGFyZW50RGl0SWR4KS5pc1RhYkNvbnRyb2woKSB8fCB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpLmlzR3JvdXAoKSkge1xyXG4gICAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5Gb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgY29udHJvbCBpcyBjb250YWluIGluIGl0cyBsaW5rZWQgcGFyZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ29udGFpbmVkSW5MaW5rZWRQYXJlbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSAmJiB0aGlzLl9jb250YWluZXJEaXRJZHggPT09IHRoaXMuX2xpbmtlZFBhcmVudERpdElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb21iaW5lIHR3byBzdHJpbmdzIGFycmF5IGludG8gb25lLiBFYWNoIG9mIHRoZSBvcmlnaW5hbCBhcnJheXMgbWF5IGJlIG51bGwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZpcnN0U3RyaW5nc1wiPnRoZSBmaXJzdCBzdHJpbmdzIGFycmF5IHRoYXQgd2lsbCBhbHdheXMgb2NjdXB5IHRoZSBmaXJzdCBhcnJheSBjZWxsczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsYXN0U3RyaW5nc1wiPnRoZSBsYXN0IHN0cmluZ3MgYXJyYXkgdGhhdCB3aWxsIGFsd2F5cyBvY2N1cHkgdGhlIGxhc3QgYXJyYXkgY2VsbHM8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY29tYmluZWQgU3RyaW5ncyBhcnJheTwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBjb21iaW5lU3RyaW5nQXJyYXlzKGZpcnN0U3RyaW5nczogc3RyaW5nW10sIGxhc3RTdHJpbmdzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuXHJcbiAgICBpZiAoZmlyc3RTdHJpbmdzICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGZpcnN0U3RyaW5ncyk7XHJcblxyXG4gICAgaWYgKGxhc3RTdHJpbmdzICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGxhc3RTdHJpbmdzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuLCBsaW5lPzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiAocHJvcElkID09PSBudWxsIHx8IHByb3BJZC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAoZGVmYXVsdFJldFZhbCA9PT0gbnVsbCB8fCBkZWZhdWx0UmV0VmFsLmNvbnN0cnVjdG9yID09PSBCb29sZWFuKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8wKHByb3BJZCwgZGVmYXVsdFJldFZhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8xKHByb3BJZCwgZGVmYXVsdFJldFZhbCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgYm9vbGVhbiBjb21wdXRlZCB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICBwcml2YXRlIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBwcm9wLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCAtIGlmIHRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgYW5kIHRoZSBsaW5lIGlzXHJcbiAgLy8vIGRpZmZlcmVudCB0aGFuIHRoZSBmb3JtcyBjdXJyZW50IGxpbmUgdGhlbiByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjb250cm9sIHByb3BlcnR5IGF0IHRoYXQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgbnVtYmVyIGluIHRhYmxlIGluIHdoaWNoIHRoZSBjb250cm9sIGlzIGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMShwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbiwgbGluZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Byb3BlcnR5UmVwZWF0YWJsZShwcm9wSWQpICYmIHRoaXMuRm9ybS5EaXNwbGF5TGluZSAhPT0gbGluZSkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkocHJvcElkKTtcclxuICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBwcm9wLmdldFByZXZWYWx1ZShsaW5lKTtcclxuICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCBkZWZhdWx0UmV0VmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2wgLSBpZiB0aGUgY29udHJvbCBpcyByZXBlYXRhYmxlIGFuZCB0aGUgbGluZSBpc1xyXG4gIC8vLyAgIGRpZmZlcmVudCB0aGFuIHRoZSBmb3JtcyBjdXJyZW50IGxpbmUgdGhlbiByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjb250cm9sIHByb3BlcnR5IGF0IHRoYXRcclxuICAvLy8gICBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBudW1iZXIgaW4gdGFibGUgaW4gd2hpY2ggdGhlIGNvbnRyb2wgaXMgbG9jYXRlZDwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wV2l0aExpbmUocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4sIGxpbmU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNQcm9wZXJ0eVJlcGVhdGFibGUocHJvcElkKSAmJiB0aGlzLkZvcm0uRGlzcGxheUxpbmUgIT09IGxpbmUpIHtcclxuICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKHByb3BJZCk7XHJcbiAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gcHJvcC5nZXRQcmV2VmFsdWUobGluZSk7XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChwcm9wSWQsIGRlZmF1bHRSZXRWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChwcm9wSWQpO1xyXG4gICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHByb3BJZCBwcm9wZXJ0eSBpcyByZXBlYXRhYmxlIGZvciB0aGlzIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUHJvcGVydHlSZXBlYXRhYmxlKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSZXBlYXRhYmxlOiBib29sZWFuID0gdGhpcy5Jc1JlcGVhdGFibGU7XHJcbiAgICBpZiAoaXNSZXBlYXRhYmxlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBzdXBlci5pc1RhYmxlQ29udHJvbCgpICYmIFByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhbmQgdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGluIG1hZ2ljIGludGVybmFsIGZvcm1hdCB0byBiZSBkaXNwbGF5ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbDogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkY1JhbmdlSXNFbXB0eTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgaWYgKG1nVmFsID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuVmFsdWUgPSBcIlwiO1xyXG4gICAgICAvLyBRQ1IgMzA4NDc1IC0gY29udHJvbHMgdGhhdCBhcmUgSW5pdGlhbGl6ZWQgd2l0aCBudWxsIHNob3VsZCBiZSBnaXZlbiBtYWdpYyBkZWZhdWx0IHZhbHVlLlxyXG4gICAgICBpZiAoIWlzTnVsbClcclxuICAgICAgICBtZ1ZhbCA9IEZpZWxkRGVmLmdldE1hZ2ljRGVmYXVsdFZhbHVlKHRoaXMuRGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsYXllcnM6IG51bWJlcltdID0gdGhpcy5nZXRMYXllckZyb21MaW5rSWR4KGF3YWl0IHRoaXMuZ2V0SW5kZXhPZkNob2ljZShtZ1ZhbCwgbGluZSwgaXNOdWxsKSk7XHJcblxyXG4gICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBubyBzZWxlY3Rpb24gZm9yIGEgdGFiIGNvbnRyb2wuXHJcbiAgICAgICAgLy8gU28sIGlmIHRoZXJlIGlzIG5vIFRhYiB0byBiZSBzZWxlY3RlZCwgc2VsZWN0IHRoZSBmaXJzdCBUYWIgYW5kXHJcbiAgICAgICAgLy8gYWxzbyB1cGRhdGUgdGhlIGZpZWxkJ3MgdmFsdWUgYWNjb3JkaW5nbHkuXHJcblxyXG4gICAgICAgIGlmIChsYXllcnNbMF0gPCAwICYmIHN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBsYXllcnNbMF0gPSAwO1xyXG4gICAgICAgICAgbWdWYWwgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShsYXllcnNbMF0udG9TdHJpbmcoKSwgbGluZSk7XHJcbiAgICAgICAgICBpc051bGwgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiBtZ1ZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoPEd1aVRhc2tCYXNlPnRoaXMuX2ZpZWxkLmdldFRhc2soKSkuVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2ZpZWxkLCBtZ1ZhbCwgaXNOdWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IE1pc2MuR2V0Q29tbWFTZXBlcmF0ZWRTdHJpbmcobGF5ZXJzKTtcclxuICAgICAgICBkY1JhbmdlSXNFbXB0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICM0NTAyNDg6IGFuIGVtcHR5IHJhbmdlIGluIHRoZSBkYXRhIGNvbnRyb2wgY2F1c2VkIGRlbGV0aW5nIHRoZSB2YWx1ZVxyXG4gICAgLy8gb2YgdGhlIGNvbnRyb2wgd2hlbiBsZWF2aW5nIGl0LiBOb3csIHRoZSByYW5nZSBvZiB0aGUgY29udHJvbCBpcyB1c2VkIHdoZW5cclxuICAgIC8vIHRoZSBkYXRhIGNvbnRyb2wgcmFuZ2UgaXMgZW1wdHkuXHJcbiAgICBpZiAoZGNSYW5nZUlzRW1wdHkpIHtcclxuICAgICAgaWYgKCFzdXBlci5pc0NoZWNrQm94KCkgJiYgKHRoaXMuX2ZpZWxkID09PSBudWxsIHx8ICFpc051bGwgfHwgIXRoaXMuX2ZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuX2ZpZWxkID09PSBudWxsICYmIGlzTnVsbCkgJiYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FIHx8IHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTikpIHtcclxuICAgICAgICAgICAgICB0aGlzLlZhbHVlID0gbWdWYWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGV0IGluQ29udHJvbDogYm9vbGVhbiA9IHRoaXMuSW5Db250cm9sO1xyXG4gICAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AobWdWYWwsIHRoaXMuX3JhbmdlLCB0aGlzLl9waWMsIHRydWUsIHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBpbkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEZWZlY3QgIyAxMzg4MDMgOiBGaXggdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdW5pUGFhUy4gRG8gbm90IGNhbGwgcnRyaW1WYWx1ZSgpIHdoZW4gcmVmcmVzaGluZyB0aGUgZGlzcGxheSBpZiB0aGUgZGF0YSB0eXBlXHJcbiAgICAgICAgICAvLyBpcyBub3QgbnVtZXJpYyBvciBsZWZ0IGp1c3RpZnkgcHJvcGVydHkgaXMgTm8uXHJcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuVmFsdWUgPT09ICdzdHJpbmcnICYmICghdGhpcy5fcGljLmlzQXR0ck51bWVyaWMoKSB8fCB0aGlzLl9waWMuaXNMZWZ0KCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucnRyaW1WYWx1ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGlubmVyRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoaW5uZXJFeGNlcHRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sOiAnezB9JywgbWd2YWw6IHsxfVwiLCB0aGlzLk5hbWUsIG1nVmFsKSwgaW5uZXJFeGNlcHRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIG1nVmFsID0gRmllbGREZWYuZ2V0TWFnaWNEZWZhdWx0VmFsdWUodGhpcy5EYXRhVHlwZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGlubmVyRXhjZXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NoZWNrQm94KCkpXHJcbiAgICAgICAgICB0aGlzLlZhbHVlID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4obWdWYWwpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gVHJhbnNsYXRlIGxvZ2ljYWwgbmFtZSBmb3IgaW1hZ2UgY29udHJvbC5cclxuICAgIGlmICgoc3VwZXIuaXNJbWFnZUNvbnRyb2woKSAmJiB0aGlzLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHx8IHN1cGVyLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICBtZ1ZhbCA9IEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZShtZ1ZhbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLklzTnVsbCA9IGlzTnVsbDtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyBpZiB0aGUgY29udHJvbCdzIHZhbHVlIGlzIG1vZGlmaWVkIGFuZCBpZiBzbywgdXBkYXRlcyB0aGUgTW9kaWZpZWRCeVVzZXIgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1ZhbHVlXCI+PC9wYXJhbT5cclxuICBVcGRhdGVNb2RpZmllZEJ5VXNlcihuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gRm9yIGltYWdlIGNvbnRyb2wgYW5kIGltYWdlIGJ1dHRvbiwgdGhlIHZhbHVlIHdvdWxkIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiBCdXQsIGlmIGl0IGhhc1xyXG4gICAgLy8gYSBsb2dpY2FsIG5hbWUsIGl0IGlzIHJlcGxhY2VkLiBPciBpZiBpdCBpcyBmaWxlU2VydmVyIGdldCwgdGhlIHZhbHVlIGlzIHJlcGxhY2VkIGJ5IGEgc2VydmVyIHVybC5cclxuICAgIC8vIEluIGJvdGggdGhlc2UgY2FzZXMsIHdlIHNob3VsZCBub3QgbWFyayBpdCBhcyBtb2RpZmllZC5cclxuICAgIGlmICghKHN1cGVyLmlzQnV0dG9uKCkgfHwgc3VwZXIuaXNJbWFnZUNvbnRyb2woKSkpIHtcclxuICAgICAgbGV0IGN0cmxDdXJySXNOdWxsOiBib29sZWFuID0gdGhpcy5Jc051bGw7XHJcbiAgICAgIGxldCB2YWxDaGFuZ2VkOiBib29sZWFuID0gKHRoaXMuaXNEaWZmZXJlbnRWYWx1ZShuZXdWYWx1ZSwgZmFsc2UsIGZhbHNlKSk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgdmFsdWUgZGlkbid0IGNoYW5nZSB0aGVuIGxldCdzIGNoZWNrIGlmIHRoZSBudWxsaXR5IGhhdmUgY2hhbmdlZFxyXG4gICAgICBpZiAoIXZhbENoYW5nZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5DYW5HZXROdWxsRnJvbUNvbnRyb2xWYWx1ZSgpKSB7XHJcbiAgICAgICAgICB2YWxDaGFuZ2VkID0gKGN0cmxDdXJySXNOdWxsICE9PSB0aGlzLmlzTnVsbFZhbHVlKG5ld1ZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWxDaGFuZ2VkIHx8IHRoaXMuS2V5U3Ryb2tlT24pIHtcclxuICAgICAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJUcmltcyB0aGUgY29udHJvbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBydHJpbVZhbHVlKCk6IHZvaWQge1xyXG4gICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgIHRoaXMuVmFsdWUgPSBOU3RyaW5nLlRyaW1FbmQodGhpcy5WYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG1pbmltdW1WYWx1ZUxlbmd0aDogbnVtYmVyID0gdGhpcy5nZXRNaW5pbXVtVmFsdWVMZW5ndGgoKTtcclxuICAgICAgLy8gUlRyaW0gdGhlIHZhbHVlIGJleW9uZCB0aGlzIGluZGV4XHJcbiAgICAgIGlmICh0aGlzLlZhbHVlLmxlbmd0aCA+IG1pbmltdW1WYWx1ZUxlbmd0aCkge1xyXG4gICAgICAgIGxldCBzdHI6IHN0cmluZyA9IHRoaXMuVmFsdWUuc3Vic3RyKG1pbmltdW1WYWx1ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIC8vIGNvcHkgdGhlIG1pbmltdW0gbGVuZ3RoIHZhbHVlIGFzIGlzXHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IHRoaXMuVmFsdWUuc3Vic3RyKDAsIG1pbmltdW1WYWx1ZUxlbmd0aCk7XHJcbiAgICAgICAgLy8gcnRyaW0gdGhlIHZhbHVlIGJleW9uZCBtaW5pbXVtIGxlbmd0aFxyXG4gICAgICAgIHRoaXMuVmFsdWUgPSB0aGlzLlZhbHVlICsgU3RyVXRpbC5ydHJpbVdpdGhOdWxsKHN0ciwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFsd2F5cyB0cmltIHRoZSBudW1lcmljIHZhbHVlLlxyXG4gICAgICBpZiAoc3VwZXIuaXNUZXh0Q29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykge1xyXG4gICAgICAgIHRoaXMuVmFsdWUgPSBOU3RyaW5nLlRyaW1FbmQodGhpcy5WYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGxlbmd0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRNaW5pbXVtVmFsdWVMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW5MZW5ndGg6IG51bWJlciA9IHRoaXMuX3BpYy5nZXRNYXNrTGVuZ3RoKCk7XHJcblxyXG4gICAgLy8gdHJhdmVyc2UgZnJvbSByaWdodCB0aWxsIGEgdmFsaWQgbWFzayBjaGFyIGlzIGVuY291bnRlcmVkXHJcbiAgICB3aGlsZSAobWluTGVuZ3RoID4gMCAmJiAhdGhpcy5fcGljLnBpY0lzTWFzayhtaW5MZW5ndGggLSAxKSkge1xyXG4gICAgICBtaW5MZW5ndGggPSBtaW5MZW5ndGggLSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1pbkxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNOdWxsVmFsdWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCByZXRJc051bGxDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5DYW5HZXROdWxsRnJvbUNvbnRyb2xWYWx1ZSgpICYmIHN0ciA9PT0gXCJcIikge1xyXG4gICAgICByZXRJc051bGxDb250cm9sID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRJc051bGxDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRoaXMgY29udHJvbCBjYW4gZ2V0IG51bGwgdmFsdWUgZnJvbSB0aGUgY29udHJvbCBoaW1zZWxmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUaHJlZVN0YXRlQ2hlY2tCb3goKSAmJiAodGhpcy5fZmllbGQgPT0gbnVsbCB8fCB0aGlzLl9maWVsZC5OdWxsQWxsb3dlZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgc3BlY2lmaWMgaW5kZXggY29ycmVzcG9uZHMgdG8gYSBudWxsIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNDaG9pY2VOdWxsKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgIGxldCBkY1ZhbHM6IERjVmFsdWVzID0gdGhpcy5nZXREY1ZhbHMoKTtcclxuICAgICAgcmV0dXJuIGRjVmFscy5pc051bGwoaWR4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wdXRlcyB0aGUgY29udHJvbCdzIHZhbHVlIGVpdGhlciBmcm9tIGV4cHJlc3Npb24gb3IgZmllbGQgYW5kIHJlZnJlc2hlcyB0aGUgR1VJIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JjZVJlZnJlc2hcIj48L3BhcmFtPlxyXG4gIGFzeW5jIENvbXB1dGVBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGZvcmNlUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICB0aGlzLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxFeHBJZCA+IDApIHtcclxuICAgICAgbGV0IHdhc0V2YWx1YXRlZDogYm9vbGVhbjtcclxuICAgICAgbGV0IHJlZldhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4od2FzRXZhbHVhdGVkKTtcclxuXHJcbiAgICAgIGxldCByZXRFeHA6IHN0cmluZyA9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5FdmFsdWF0ZUV4cHJlc3Npb24odGhpcy5fdmFsRXhwSWQsIHRoaXMuRGF0YVR5cGUsIHRoaXMuX3BpYy5nZXRTaXplKCksIHRydWUsIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgZmFsc2UsIHJlZldhc0V2YWx1YXRlZCk7XHJcbiAgICAgIHdhc0V2YWx1YXRlZCA9IHJlZldhc0V2YWx1YXRlZC52YWx1ZTtcclxuICAgICAgaWYgKHdhc0V2YWx1YXRlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShyZXRFeHAsIHJldEV4cCA9PT0gbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCByZWZWYWx1ZTogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbTxzdHJpbmc+KHZhbHVlKTtcclxuICAgICAgICBsZXQgcmVmSXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbTxib29sZWFuPihpc051bGwpO1xyXG4gICAgICAgICg8R3VpVGFza0Jhc2U+dGhpcy5fZmllbGQuZ2V0VGFzaygpKS5nZXRGaWVsZERpc3BsYXlWYWx1ZSh0aGlzLl9maWVsZCwgcmVmVmFsdWUsIHJlZklzTnVsbCk7XHJcbiAgICAgICAgdmFsdWUgPSByZWZWYWx1ZS52YWx1ZTtcclxuICAgICAgICBpc051bGwgPSByZWZJc051bGwudmFsdWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKHZhbHVlLCBpc051bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiAhc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlWYWx1ZSh0aGlzLlZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRGVjaWRlcyBpZiB0aGUgY29udHJvbCBzaG91bGQgYmUgcmVmcmVzaGVkIHdoaWxlIGVudGVyaW5nIGEgY29udHJvbC4gVmFsdWVzIGZvciBzb21lIGRhdGEgdHlwZXNcclxuICAvLy8gYXJlIGRpc3BsYXllZCBkaWZmZXJlbnRseSB3aGlsZSBwYXJrZWQgb24gdGhlIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQgJiYgdGhpcy5nZXRGaWVsZCgpICE9PSBudWxsICYmICh0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHxcclxuICAgICAgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FIHx8IHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheWVkIHZhbHVlIG9ubHkgKHdpdGhvdXQgdGhlIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2wpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+aXMgdGhlIG1hZ2ljIGludGVybmFsIHZhbHVlIG9mIHRoZSBwcmVzZW50YXRpb24gdmFsdWU8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5VmFsdWUobWdWYWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBsZXQgdmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBzYXZlVmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdmFsdWVDaGFuZ2VkO1xyXG5cclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIC8vIEFUVEVOVElPTjpcclxuICAgIC8vIHRoZSB1c2Ugb2YgdGhlIGZ1bmN0aW9uIGdldE5hbWUoKSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBuYW1lIG1lbWJlciB2YXJpYWJsZVxyXG4gICAgLy8gaXMgdG8gZW5oYW5jZSB0aGUgdXNlIG9mIGNvbnRyb2xzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gYSB0YWJsZVxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgbGV0IHByZXZWYWx1ZTogc3RyaW5nID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgbGV0IHByZXZOdWxsOiBib29sZWFuID0gdGhpcy5nZXRQcmV2SXNOdWxsKCk7XHJcblxyXG4gICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKHRoaXMuRGF0YVR5cGUpKSB7XHJcbiAgICAgICAgaWYgKFN0clV0aWwucnRyaW0obWdWYWwpID09PSBTdHJVdGlsLnJ0cmltKHByZXZWYWx1ZSkgfHxcclxuICAgICAgICAgIChtZ1ZhbCAhPT0gbnVsbCAmJiBTdHJVdGlsLnJ0cmltKG1nVmFsKSA9PT0gU3RyVXRpbC5ydHJpbShwcmV2VmFsdWUpKSkge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJldk51bGwgIT09IHRoaXMuSXNOdWxsKSB7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICA7XHJcbiAgICAgICAgaWYgKG1nVmFsID09PSBwcmV2VmFsdWUgfHwgKG1nVmFsICE9PSBudWxsICYmIG1nVmFsID09PSBwcmV2VmFsdWUpKVxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChwcmV2TnVsbCAhPT0gdGhpcy5Jc051bGwpXHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIG1nVmFsKTtcclxuICAgICAgdGhpcy5zZXRQcmV2SXNOdWxsKHRoaXMuSXNOdWxsKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0dST1VQOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1RBVFVTX0JBUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX1NFVDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTlRBSU5FUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX0ZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TQl9MQUJFTDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJTkU6XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUjpcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQgJiYgdGhpcy5WYWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLnNldFVybCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU0JfSU1BR0U6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkICYmIHRoaXMuVmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5zZXRJbWFnZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YOlxyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCB8fCAgdGhpcy5mb3JjZVJlZnJlc2gpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tCb3hWYWx1ZShsaW5lLCBtZ1ZhbCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09NQk86XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUOlxyXG4gICAgICAgICAgc2F2ZVZhbHVlQ2hhbmdlZCA9IHZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGZpeGVkIGJ1ZyM6Nzc2MjE1LCA4MDA3NjMsOTQxODQxLCB0aGUgcHJldlZhbHVlIGlzIHNhdmUgYXMgbWd2YWwgbmVlZCB0byBjb252ZXJ0IHRvIGxheWVyXHJcbiAgICAgICAgICAgIGxldCBwcmV2RGlzcGxheVZhbHVlOiBudW1iZXJbXSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBGaXggYnVnIzo3ODQzOTFcclxuICAgICAgICAgICAgLy8gSWYgSXRlbUxpc3Qgd2FzIHVwZGF0ZSByZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UgdGhlbiB0aGUgdmFsdWUgbXVzdCBiZSBzZXRcclxuXHJcbiAgICAgICAgICAgIGlmIChzYXZlVmFsdWVDaGFuZ2VkID09PSB2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBpZiAocHJldlZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwcmV2RGlzcGxheVZhbHVlID0gdGhpcy5nZXRMYXllckZyb21MaW5rSWR4KGF3YWl0IHRoaXMuZ2V0SW5kZXhPZkNob2ljZShwcmV2VmFsdWUsIGxpbmUsIHByZXZOdWxsKSk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcHJldkRpc3BsYXlWYWx1ZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocHJldkRpc3BsYXlWYWx1ZVtpXSA9PT0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfVkFMVUVfSU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldkRpc3BsYXlWYWx1ZVtpXSA9IEd1aUNvbnN0YW50cy5ERUZBVUxUX0xJU1RfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGluZGljZSA9IE1pc2MuR2V0SW50QXJyYXkodGhpcy5WYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyZW50TGF5ZXIgPSB0aGlzLmdldEN1cnJlbnRMaW5rSWR4KCk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFZhbHVlLCBpbmRpY2VbMF0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZExheWVyLCBjdXJyZW50TGF5ZXIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgbGluZSwgaW5kaWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsICt0aGlzLlZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5IYXNBdXRvY29tcGxldGUoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZSwgdmFsdWVDaGFuZ2VkKTtcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgLy8gaWYgKGZvcm0uZm9ybVJlZnJlc2hlZCgpIHx8IGZvcmNlUmVmcmVzaCB8fCB2YWxFeHAgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAvLyB2YWxFeHAuY29tcHV0ZWRCeUNsaWVudE9ubHkoKSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRJbWFnZVdpdGhGaWxlTmFtZSh0aGlzLlZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPOlxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZSwgdmFsdWVDaGFuZ2VkKTtcclxuICAgICAgICAgIGlmICghdmFsdWVDaGFuZ2VkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB0aGlzLnNldFJhZGlvQ2hlY2tlZCgrdGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAvLyBzZXRSYWRpb0NoZWNrZWQodmFsdWUgLmxlbmd0aCgpID09IDAgPyBERUZBVUxUX1ZBTFVFX0lOVCA6IEludGVnZXIucGFyc2VJbnQodmFsdWUpKTtcclxuICAgICAgICAgIC8vIGlmICghdGFzay5zdGFydFByb2Nlc3MoKSlcclxuICAgICAgICAgIC8vIGd1aU1hbmFnZXIuc2V0Rm9jdXModGhpcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5SZWZyZXNoRGlzcGxheVZhbHVlKCkgdW5rbm93biB0eXBlOiB7MH1cIiwgdGhpcy5UeXBlKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSAmJiB2YWx1ZUNoYW5nZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFLCBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCB0cnVlKSwgZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoZXhfMzYwKSB7XHJcbiAgICAgIGlmIChleF8zNjAgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIENvbnRyb2wuUmVmcmVzaERpc3BsYXlWYWx1ZSgpIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4XzM2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KG9ubHlSZXBlYXRhYmxlUHJvcHM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQob25seVJlcGVhdGFibGVQcm9wcykpXHJcbiAgICAgIG9ubHlSZXBlYXRhYmxlUHJvcHMgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlfMShvbmx5UmVwZWF0YWJsZVByb3BzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBjb250cm9sIGluY2x1ZGluZyBpdHMgdmFsdWUgYW5kIGl0cyBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZXBlYXRhYmxlUHJvcHNcIj5pZiBjb250cm9sIHRyZWUgLSByZWZyZXNoZXMgb25seSByZXBlYXRhYmxlIHRyZWUgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBSZWZyZXNoRGlzcGxheV8xKG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAjNDIyMjUwLiBTa2lwIHRoZSByZWZyZXNoIGRpc3BsYXkgb2YgdGhlIHBhcmVudCdzIHN1YmZvcm0gY29udHJvbCBpZiB0aGUgZm9ybSBpbnNpZGUgaXQgaXMgc3RpbGwgaW4gaXRzIFJlZnJlc2hEaXNwbGF5LlxyXG4gICAgaWYgKCEoc3VwZXIuaXNTdWJmb3JtKCkgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkgIT09IG51bGwgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKSkge1xyXG5cclxuICAgICAgLy8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wcyk7XHJcblxyXG4gICAgICAvLyBjb21wdXRlIGFuZCBkaXNwbGF5IHRoZSB2YWx1ZS5cclxuICAgICAgaWYgKHRoaXMuU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleGVjdXRlcyB0aGUgcmVhZG9ubHkgY29tbWFuZCBvbmx5IGlmIG5lZWRlZFxyXG4gICAgICBsZXQgaXNQYXJrYWJsZUN0cmw6IGJvb2xlYW4gPSAhKGF3YWl0IHRoaXMuaXNQYXJrYWJsZShmYWxzZSkpIHx8ICEgYXdhaXQgdGhpcy5pc01vZGlmaWFibGUoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldEN1cnJSZWFkT25seSgpICE9PSBpc1BhcmthYmxlQ3RybCkge1xyXG4gICAgICAgIHRoaXMuU2V0Q3VyclJlYWRPbmx5KGlzUGFya2FibGVDdHJsKTtcclxuICAgICAgICBhd2FpdCBNYW5hZ2VyLlNldFJlYWRPbmx5Q29udHJvbCh0aGlzLCBpc1BhcmthYmxlQ3RybCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtdXN0SW5wdXRQcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCk7XHJcbiAgICAgIC8vIG5lZWQgdG8gY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgY29udHJvbCdzIGRhdGEgaXMgYW4gZXhwcmVzc2lvblxyXG4gICAgICAvLyBvciB0aGUgZm9ybWF0IGlzIGV4cHJlc3Npb24uIFdoZW4gdGhlIGZvcm1hdCBpcyBjaGFuZ2VkLCB0aGUgZGlzcGxheSB2YWwgbWF5IGNoYW5nZSBhcyB3ZWxsLlxyXG4gICAgICBpZiAobXVzdElucHV0UHJvcGVydHkgIT0gbnVsbCAmJiBtdXN0SW5wdXRQcm9wZXJ0eS5pc0V4cHJlc3Npb24oKSkge1xyXG5cclxuICAgICAgICBsZXQgcHJldk11c3RJbnB1dDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAocHJldk11c3RJbnB1dCAhPT0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpKVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLk11c3RJbnB1dCwgIXByZXZNdXN0SW5wdXQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYobXVzdElucHV0UHJvcGVydHkgIT0gbnVsbCl7XHJcbiAgICAgICAgbGV0IG11c3RJbnB1dFZhbDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpO1xyXG4gICAgICAgIGlmKG11c3RJbnB1dFZhbClcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLk11c3RJbnB1dCwgbXVzdElucHV0VmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9JTiwgdHJ1ZSkpXHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuVGFiSW5kZXgsIC0xKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBSaWNoIENsaWVudCBjb21wdXRlIGFuZCByZWZyZXNoIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhbHdheXMsIGFsc28gaWYgdGhlIGZvcm0gaXMgbm90IHlldCBvcGVuZWQuXHJcbiAgLy8vIEZvciBPbmxpbmUgb25seSBmb3Igb3BlbmVkIGZvcm1zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRDb21wdXRlQW5kUmVmcmVzaE9uQ2xvc2VkRm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBSZWZyZXNoZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2wuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbmx5UmVwZWF0YWJsZVByb3BzXCI+PC9wYXJhbT5cclxuICBhc3luYyByZWZyZXNoUHJvcGVydGllcyhvbmx5UmVwZWF0YWJsZVByb3BzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSAmJiB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzKVxyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9BVFRSSUJVVEUsIHRoaXMsIHRoaXMuRGF0YVR5cGUuY2hhckNvZGVBdCgwKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0UHJvcHMoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ab29tQnV0dG9uSW5pdGlhbGl6YXRpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuX3Byb3BUYWIuUmVmcmVzaERpc3BsYXkoZmFsc2UsIG9ubHlSZXBlYXRhYmxlUHJvcHMpKSkge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sICd7MH0nOiBOb3QgYWxsIHByb3BlcnRpZXMgY291bGQgYmUgc2V0XCIsIHRoaXMuZ2V0TmFtZSgpKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcykge1xyXG4gICAgICAgICAgaWYgKCFvbmx5UmVwZWF0YWJsZVByb3BzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgbXNnOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sICd7MH0nOiB7MX1cIiwgdGhpcy5nZXROYW1lKCksIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKG1zZy5Ub1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hUYWJGb3JMYXllckxpc3QobGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VycmVudExpbmtWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBoYXMgYWxyZWFkeSBvcGVuZWQsIGdldCB0aGUgY3VycmVudCBsaW5rIHZhbHVlIGJlZm9yZVxyXG4gICAgLy8gY2hhbmdpbmcgdGhlIGxheWVyIGxpc3QgaS5lLiBiZWZvcmUgY2FsbGluZyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KCkuXHJcbiAgICAvLyBBbmQgdGhlbiwgYWZ0ZXIgY2hhbmdpbmcgdGhlIGxheWVyIGxpc3QsIHNlbGVjdCB0aGUgVEFCIGNvcnJlc3BvbmRpbmdcclxuICAgIC8vIHRvIHRoZSBjdXJyZW50IGxpbmsgdmFsdWUuXHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkuT3BlbmVkKSB7XHJcbiAgICAgIGxldCBpbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpO1xyXG4gICAgICBsZXQgY3VycmVudExheWVyOiBudW1iZXIgPSBpbmRpY2VbMF07XHJcbiAgICAgIGN1cnJlbnRMaW5rVmFsdWUgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShjdXJyZW50TGF5ZXIudG9TdHJpbmcoKSwgbGluZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgZmFsc2UpO1xyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpLk9wZW5lZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLlNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoY3VycmVudExpbmtWYWx1ZSwgdGhpcy5Jc051bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGl0ZW0gbGlzdCBhbmQgc2V0IGl0IGludG8gdGhlIGd1aSBjb250cm9sIGlmIGl0IGlzIGNvbWJvIGJveCAsIHJlZnJlc2ggYWxzbyB0aGUgdmlzaWJsZVxyXG4gIC8vLyAgIGxpbmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICB0aGlzLmNsZWFyUmFuZ2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9uc1N0cmluZ3M6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSB8fCB0aGlzLkhhc0F1dG9jb21wbGV0ZSgpKSB7XHJcblxyXG4gICAgICBsZXQgb3B0aW9ucyA9IG9wdGlvbnNTdHJpbmdzLm1hcCgoZGlzcGxheVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7aW5kZXgsIGRpc3BsYXlWYWx1ZX1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgY2hvaWNlIGxpc3Qgb2YgYSBTRUxFQ1QgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaERpc3BSYW5nZShleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIGxldCBzZWxlY3RDbWQ6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMCk7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuXHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgbGV0IGRpc3BWYWxzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMuZ2V0RGlzcFZhbHMobGluZSwgZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCkge1xyXG4gICAgICAgIHNlbGVjdENtZCA9IE1nQ29udHJvbEJhc2UuY29tYmluZVN0cmluZ0FycmF5cyhkaXNwVmFscywgZGN2LmdldERpc3BWYWxzKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc2VsZWN0Q21kID0gYXdhaXQgdGhpcy5nZXREaXNwVmFscyhsaW5lLCBleGVjQ29tcHV0ZUNob2ljZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yYW5nZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0T3JkZXJlZERpc3BMaXN0KHNlbGVjdENtZCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlZnJlc2ggdGhlIGl0ZW1zIGxpc3Qgb2YgdGhlIHNlbGVjdGlvbiBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhlY0NvbXB1dGVDaG9pY2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgcmVmcmVzaEl0bVJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG5cclxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciBzZWxlY3Rpb24gY29udHJvbC5cclxuICAgIERlYnVnLkFzc2VydCh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKTtcclxuICAgIGxldCBvcmRlcmVkSXRtTGlzdDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigwKTtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgbGlua1ZhbHM6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICBpZiAodGhpcy5faGFzVmFsaWRJdG1BbmREaXNwVmFsKSB7XHJcbiAgICAgIG9yZGVyZWRJdG1MaXN0ID0gTWdDb250cm9sQmFzZS5jb21iaW5lU3RyaW5nQXJyYXlzKGxpbmtWYWxzLCBkY3YuR2V0TGlua1ZhbHMoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0T3JkZXJlZERpc3BMaXN0KG9yZGVyZWRJdG1MaXN0LCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBpdGVtcyB2YWx1ZXMgZnJvbSBkYXRhIHNvdXJjZSAmIGl0ZW0gbGlzdCBwcm9wZXJ0eS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0SXRlbXNSYW5nZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoSXRtUmFuZ2UoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGRpc3BsYXkgdmFsdWVzIGZyb20gZGF0YSBzb3VyY2UgJiBkaXNwbGF5IGxpc3QgcHJvcGVydHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldERpc3BsYXlSYW5nZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0UHJvcHMoKSB7XHJcbiAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSk7XHJcblxyXG4gICAgLy8gRml4ZWQgYnVnIzo3ODE3NDFcclxuICAgIC8vIGluIDEuOSAtLT5cclxuICAgIC8vIHdoZW4gYXNrIGFib3V0IGFueSBwcm9wZXJ0eShQUk9QX1RZUEVfRU5BQkxFRCkgd2Ugd2FzIGNyZWF0ZWQgdGhlIGRlZmF1bHQgcHJvcGVydHkgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSh0cnVlKS5cclxuICAgIC8vIGFuZCB3aGVuIGdldCB0byBSZWZyZXNoUHJvcHMgb2YgdGhlIHByb3BlcnR5IFwiUFJPUF9UWVBFX0VOQUJMRURcIiB3ZSB3YXMgYWRkIGNvbW1hbmQgdG8gdGhlIHF1ZXVlIGluIGd1aSB0aHJlYWRcclxuICAgIC8vIHRoZSBjb21tYW5kIHdhcyB3YXMgdXBkYXRlIHRoZSBUYWdEYXRhLkVuYWJsZSB0byBiZSBcInRydWVcIlxyXG4gICAgLy8gaW4gMi4wIC0tPlxyXG4gICAgLy8gd2UgdXNlaW5nIGEgbmV3IG1ldGhvZCBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eSgpIHRoYXQgbm90IGNyZWF0ZWQgYW55IGRlZmF1bHQgcHJvcGVydHkgYW5kIG5vIGdldCB0byByZWZyZXNoUHJvcFxyXG4gICAgLy8gb24gdGhlIHByb3BlcnR5IGFuZCB0aGUgdmFsdWUgb24gdGhlIENvbnRyb2wuRW5hYmxlIHdhcyB3cm9uZ1xyXG4gICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQpO1xyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IExpbmtlZCBQYXJlbnQgSWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5rZWRQYXJlbnREaXRJZHhcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0TGlua2VkUGFyZW50SWR4KGxpbmtlZFBhcmVudERpdElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggPSBsaW5rZWRQYXJlbnREaXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB2YWxpZGF0aW9uIGRldGFpbHMgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZFZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGJ1aWxkUGljdHVyZShvbGRWYWw6IGFueSwgdmFsOiBhbnkpOiBWYWxpZGF0aW9uRGV0YWlscyB7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkgfHwgc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9waWNFeHBFeGlzdHMpIHtcclxuICAgICAgdGhpcy5fdmQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3ZkID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZkID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzKG9sZFZhbCwgdmFsLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0aGlzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl92ZC5zZXRWYWx1ZSh2YWwpO1xyXG4gICAgICB0aGlzLl92ZC5zZXRPbGRWYWx1ZShvbGRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl92ZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVja3MgaWYgdGhlIHNlbnQgdmFsdWUgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGNvbnRyb2wncyBleGlzdGluZyB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiTmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2hlY2tOdWxsVmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEaWZmZXJlbnRWYWx1ZShuZXdWYWx1ZTogYW55LCBpc051bGw6IGJvb2xlYW4sIGNoZWNrTnVsbFZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IGN0cmxDdXJyVmFsdWU6IGFueSA9IHRoaXMuVmFsdWU7XHJcbiAgICBsZXQgdmFsQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSlcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIXRoaXMuQ29tcGFyZURhdGUobmV3VmFsdWUsIGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICF0aGlzLkNvbXBhcmVUaW1lKG5ld1ZhbHVlLCBjdHJsQ3VyclZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG5ld1ZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSAmJiB0eXBlb2YgY3RybEN1cnJWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBsZXQgbmV3VmFsdWVzdHIgPSBuZXdWYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAobmV3VmFsdWVzdHIgIT09IGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAobmV3VmFsdWUgIT09IGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25DdHJsKCkgJiYgdHlwZW9mIGN0cmxDdXJyVmFsdWUgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpKSB7XHJcbiAgICAgICAgbGV0IG5ld1ZhbHVlU3RyID0gbmV3VmFsdWUuam9pbignLCcpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICEoU3RyVXRpbC5ydHJpbShuZXdWYWx1ZVN0cikgPT09IFN0clV0aWwucnRyaW0oY3RybEN1cnJWYWx1ZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBjdHJsQ3VycklzTnVsbDogYm9vbGVhbiA9IHRoaXMuSXNOdWxsO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhKFN0clV0aWwucnRyaW0obmV3VmFsdWUpID09PSBTdHJVdGlsLnJ0cmltKGN0cmxDdXJyVmFsdWUpKTtcclxuICAgICAgICBpZiAoIXZhbENoYW5nZWQgJiYgY2hlY2tOdWxsVmFsdWUpIHtcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSAoaXNOdWxsICE9PSBjdHJsQ3VycklzTnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIENvbXBhcmVEYXRlKGQxOiBEYXRlLCBkMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldHZhbDogYm9vbGVhbjtcclxuICAgIGlmIChkMSA9PT0gbnVsbCAmJiBkMiA9PT0gbnVsbClcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKChkMSA9PT0gbnVsbCAmJiBkMiAhPT0gbnVsbCkgfHwgKGQxICE9PSBudWxsICYmIGQyID09PSBudWxsKSlcclxuICAgICAgcmV0dmFsID0gZmFsc2U7XHJcbiAgICBlbHNlIGlmIChkMS5nZXRGdWxsWWVhcigpID09PSBkMi5nZXRGdWxsWWVhcigpXHJcbiAgICAgICYmIGQxLmdldERhdGUoKSA9PT0gZDIuZ2V0RGF0ZSgpXHJcbiAgICAgICYmIGQxLmdldE1vbnRoKCkgPT09IGQyLmdldE1vbnRoKCkpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG4gIH1cclxuXHJcbiAgQ29tcGFyZVRpbWUoZDE6IERhdGUsIGQyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0dmFsOiBib29sZWFuO1xyXG4gICAgaWYgKGQxID09PSBudWxsICYmIGQyID09PSBudWxsKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoKGQxID09PSBudWxsICYmIGQyICE9PSBudWxsKSB8fCAoZDEgIT09IG51bGwgJiYgZDIgPT09IG51bGwpKVxyXG4gICAgICByZXR2YWwgPSBmYWxzZTtcclxuICAgIGVsc2UgaWYgKGQxLmdldEhvdXJzKCkgPT09IGQyLmdldEhvdXJzKClcclxuICAgICAgJiYgZDEuZ2V0TWludXRlcygpID09PSBkMi5nZXRNaW51dGVzKClcclxuICAgICAgJiYgZDEuZ2V0U2Vjb25kcygpID09PSBkMi5nZXRTZWNvbmRzKCkpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgY29sdW1uJ3Mgc29ydGFibGUgcHJvcGVydHkgaXMgc2V0IHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDb2x1bW5Tb3J0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1NvcnRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmIHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTikpIHtcclxuICAgICAgaXNTb3J0YWJsZSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTikuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNTb3J0YWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGZpcnN0IGNoaWxkIE1nQ29udHJvbCBvZiBjb2x1bW4gaS5lLiBmaWVsZCBhdHRhY2hlZCB0byBjb2x1bW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcblxyXG4gIGdldENvbHVtbkNoaWxkQ29udHJvbCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmICh0aGlzLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTilcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgbGV0IGxpbmtlZENvbnRyb2xzOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gdGhpcy5fcGFyZW50VGFibGUuZ2V0TGlua2VkQ29udHJvbHMoKTtcclxuXHJcbiAgICByZXR1cm4gbGlua2VkQ29udHJvbHMuZmluZCgoY29udHJvbDogTWdDb250cm9sQmFzZSkgPT4gKGNvbnRyb2wuZ2V0TGF5ZXIoKSA9PT0gdGhpcy5nZXRMYXllcigpICYmIGNvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmICFjb250cm9sLklzVGFibGVIZWFkZXJDaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBjb250cm9sIG5hbWUgZm9yIGhhbmRsZXIgc2VhcmNoIHByb3Bvc2UuXHJcbiAgLy8vICAgVGhlIGNvbnRyb2wgaXRzZWxmLCBtYXkgbm90IGhhdmUgYSBuYW1lIGZvciBoYW5kbGVyIHNlYXJjaCAobGlrZSBjb2x1bW4gY29udHJvbCwgaW4gd2hpY2ggd2UgbmVlZCB0byB1c2VcclxuICAvLy8gICB0aGUgY2hpbGQgY29udHJvbCBuYW1lIGZvciBoYW5kbGVycyBzZWFyY2gpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbnRyb2xOYW1lRm9ySGFuZGxlclNlYXJjaCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNoaWxkQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk7XHJcbiAgICBpZiAoY2hpbGRDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBjaGlsZENvbnRyb2wuTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIGxpbmtlZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBsaW5rQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRDb250cm9scy5wdXNoKGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGNvbnRyb2wgZnJvbSB0aGUgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZkZyb21GaWVsZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9maWVsZC5SZW1vdmVDb250cm9sKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGRpdCBpbmRleCBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGl0SWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIGRjVmFsSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRjVmFsSWRcIj48L3BhcmFtPlxyXG4gIHNldERjVmFsSWQoZGNWYWxJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1ZhbElkID0gZGNWYWxJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpZiB0aGUgcGljdHVyZSBkZWZpbmUgYXMgaGVicmV3IHRoZW4gc2V0IHRoZSBsYW5nIHRvIGhlYnJldywgb3RoZXJ3aXNlIHJlc3RvcmUgdGhlIGxhbmdcclxuICAvLy8gICBUaGUgc2FtZSB3ZSBkb2luZyBmb3Igb25saW5lIDplZHRfZWRpdC5jcHAgOiBTZXRLZXlib2FyZExhbmd1YWdlKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdG9yZUxhbmdcIj48L3BhcmFtPlxyXG4gIFNldEtleWJvYXJkTGFuZ3VhZ2UoKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbml0aWFsaXplIGNvbnRyb2wgcHJvcGVydGllcyBmb3IgZGVyaXZlZCBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4oaW50ZXJuYWwpXHJcbiAgLy8vIGNoZWNrcyBpZiBjb250cm9sIGlzIHBhcmthYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIElzUGFya2FibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pc1BhcmthYmxlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PihpbnRlcm5hbClcclxuICAvLy8gY2hlY2tzIGlmIGNvbnRyb2wgaGFzIGV4cHJlc3Npb24gb3IgUGFyZW50IHRhc2sgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSGFzRXhwT3JQYXJlbnRUYXNrRmllbGQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICByZXR1cm4gKHRoaXMuZ2V0RmllbGQoKSA9PT0gbnVsbCB8fCB0aGlzLmdldEZpZWxkKCkuZ2V0VGFzaygpICE9PSB0YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tFbmFibGVkQW5kVmlzaWJsZVwiPmNoZWNrIGVuYWJsZWQgYW5kIHZpc2libGUgcHJvcGVydGllcyB0b288L3BhcmFtPlxyXG4gIGFzeW5jIGlzUGFya2FibGUoY2hlY2tFbmFibGVkQW5kVmlzaWJsZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICByZXN1bHQgPSAhc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiAhc3VwZXIuaXNDb2x1bW5Db250cm9sKCk7XHJcblxyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgLy8gbm9uIGludGVyYWN0aXZlIC0+IG5vdCBwYXJrYWJsZS5cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgcmVzdWx0ID0gdGFzay5Jc0ludGVyYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQgJiYgdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSAmJiB0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5QYXJ0T2ZEYXRhdmlldykge1xyXG4gICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgLy8gUUNSICM0NDExNzcuIFdoZW4gd2UgY2hlY2sgdGhlIHN1YmZvcm0gcGFyayBhYmlsaXR5LCB3ZSBuZWVkIHRvIGNoZWNrIGFsc28gaXQncyB2aXNpYmlsaXR5IGFuZCBlbmFibGUgcHJvcGVydGllcy5cclxuICAgICAgaWYgKCFzdXBlci5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gKCh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5nZXRUYXNrKCkgPT09IHRhc2spIHx8IHRoaXMuaXNCdXR0b24oKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdCAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5pc1Zpc2libGUoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgocmVzdWx0ICYmIHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsKSAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpICYmIHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmFpc2UgQUNUX0NUUkxfSElUIG9uIGxlZnQgbW91c2UgY2xpY2sgaWYgaXQgbWVldHMgZm9sbG93aW5nIGNvbmRpdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmFpc2VDb250cm9sSGl0T25MZWZ0Q2xpY2tPZk1vdXNlRG93bigpOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICghc3VwZXIuSXNIeXBlclRleHRCdXR0b24oKSAmJiAhc3VwZXIuaXNSYWRpbygpICYmICFzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICByYWlzZUN0cmxIaXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhaXNlQ3RybEhpdDtcclxuICB9XHJcblxyXG4gIEdldFZhckluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgJ0NvbnRyb2wgSGl0JyBldmVudCBzaG91bGQgYmUgcmFpc2VkIG9uIG1vdXNlIGRvd24uXHJcbiAgLy8vIFRoZSBtZXRob2Qgd2FzIGV4dHJhY3RlZCBmcm9tIHByb2Nlc3NNb3VzZURvd24sIHNpbmNlIHdlIG1pZ2h0IGhhdmUgZGlmZmVyZW50XHJcbiAgLy8vIGJlaGF2aW9ycyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRyZWUgY29udHJvbHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZWZ0Q2xpY2tXYXNQcmVzc2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFJhaXNlQ29udHJvbEhpdE9uTW91c2VEb3duKGxlZnRDbGlja1dhc1ByZXNzZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChsZWZ0Q2xpY2tXYXNQcmVzc2VkKSB7XHJcbiAgICAgIGlmICh0aGlzLlJhaXNlQ29udHJvbEhpdE9uTGVmdENsaWNrT2ZNb3VzZURvd24oKSkge1xyXG4gICAgICAgIHJhaXNlQ3RybEhpdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByYWlzZUN0cmxIaXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZSBNR19BQ1RfSElUIG9uIHRoZSBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE9uU3ViZm9ybUNsaWNrKCk6IHZvaWQge1xyXG4gICAgTWFuYWdlci5FdmVudHNNYW5hZ2VyLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0hJVCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgTWdGb3JtIG9mIHRoZSBzdWJmb3JtIGNvbnRyb2wgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0U3ViZm9ybU1nRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUHJvcGVydHlFeGlzdHMoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhpZCk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IFwiICsgTWdDb250cm9sVHlwZVt0aGlzLlR5cGVdICsgXCJ9XCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyBpZiBuZXcgZGF0ZSBpcyAwPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+IFRoZSB2YWx1ZSB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNEYXRlWmVybyh2YWw6IERhdGUpIHtcclxuICAgIGxldCB6ZXJvRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgaWYgKHZhbC5nZXRNb250aCgpID09PSAwICYmIHZhbC5nZXRGdWxsWWVhcigpID09PSAwICYmIHZhbC5nZXREYXkoKSA9PT0gMClcclxuICAgICAgICB6ZXJvRGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gemVyb0RhdGU7XHJcbiAgfVxyXG5cclxuICBJc0RlZmF1bHRSb3V0ZXJPdXRsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSAmJiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9PVVRMRVQsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBJc1JvdXRlck91dGxldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNICYmIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVULCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgWm9vbUJ1dHRvbkluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaXNUZXh0Q29udHJvbCgpICYmIHRoaXMuY2hlY2tJZkV4aXN0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MKSkge1xyXG4gICAgICBsZXQgY29ubmVjdGVkQnV0dG9uOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5Gb3JtLkN0cmxUYWIuR2V0Q29udHJvbEJ5SXNuKChhd2FpdCAoYXdhaXQgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0wpKS5nZXRWYWx1ZUludCgpKSk7XHJcblxyXG4gICAgICBpZiAoY29ubmVjdGVkQnV0dG9uKSB7XHJcbiAgICAgICAgLy8gaW1hZ2UgYnV0dG9uIC0gY2FsY3VsYXRlIGFjY29yZGluZyB0byBpbWFnZVxyXG4gICAgICAgIGxldCBpbWFnZUZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGlmIChjb25uZWN0ZWRCdXR0b24uSXNJbWFnZUJ1dHRvbigpICYmIGNvbm5lY3RlZEJ1dHRvbi5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkpIHtcclxuICAgICAgICAgIGltYWdlRmlsZU5hbWUgPSBhd2FpdCAoYXdhaXQgY29ubmVjdGVkQnV0dG9uLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpKS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgaWYgKCFNaXNjLklzV2ViVXJsKGltYWdlRmlsZU5hbWUpKVxyXG4gICAgICAgICAgICBpbWFnZUZpbGVOYW1lID0gRXZlbnRzLkdldEFzc2V0c1VSTCgpICsgXCIvaW1hZ2VzL1wiICsgaW1hZ2VGaWxlTmFtZTtcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9TVFlMRSwgdGhpcywgMCwgTWFnaWNQcm9wZXJ0aWVzLkltYWdlRmlsZSwgaW1hZ2VGaWxlTmFtZSk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc3RvcmUgdGhlIGVkaXQgY29udHJvbCBvbiB0aGUgYnV0dG9uXHJcbiAgICAgICAgdGhpcy5Db25uZWN0ZWRDb250cm9sID0gY29ubmVjdGVkQnV0dG9uO1xyXG4gICAgICAgIGNvbm5lY3RlZEJ1dHRvbi5Db25uZWN0ZWRDb250cm9sID0gdGhpcztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=