@magic-xpa/gui 4.1100.0-dev4110.99 → 4.1101.0-dev4111.271

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
@@ -1,510 +0,0 @@
1
- import { NNumber, NotImplementedException, NString, RefParam } from "@magic-xpa/mscorelib";
2
- import { Constants, Logger_LogLevels, XMLConstants, XmlParser } from "@magic-xpa/utils";
3
- import { PropTable } from "../gui/PropTable";
4
- import { Property } from "../gui/Property";
5
- import { PropInterface } from "../gui/PropInterface";
6
- import { Commands } from "../../Commands";
7
- import { Events } from "../../Events";
8
- import { GuiConstants } from "../../GuiConstants";
9
- import { GuiDataCollection } from "./GuiDataCollection";
10
- import { CommandType, HtmlProperties } from "../../GuiEnums";
11
- export class GuiTaskBase {
12
- Init() {
13
- this.DataView.Init();
14
- }
15
- get RouterPath() {
16
- return this.routerPath;
17
- }
18
- get RouterParams() {
19
- return this.routeParams;
20
- }
21
- get InDefaultRouterOutlet() {
22
- return this.inDefaultRouterOutlet;
23
- }
24
- get IsBlockingBatch() {
25
- return !this._isMainPrg && this.isOpenWin() && !this._allowEvents && !this.IsInteractive;
26
- }
27
- constructor() {
28
- this._flowMonitor = null;
29
- this._keyboardMappingState = 0xFFFF0000;
30
- this._refreshType = "T";
31
- this._lastParkedCtrl = null;
32
- this._brkLevel = null;
33
- this._brkLevelIndex = -1;
34
- this._mainLevel = null;
35
- this._level = "\0";
36
- this._enteredRecLevel = false;
37
- this._currParkedFld = null;
38
- this.isInRecompute = false;
39
- this.CurrentEditingControl = null;
40
- this.shouldResumeSubformLayout = true;
41
- this.ApplicationGuid = null;
42
- this.ProgramIsn = 0;
43
- this.TaskIsn = 0;
44
- this.ContextID = 0;
45
- this.IsSubForm = false;
46
- this._ctlIdx = 0;
47
- this._compIdx = 0;
48
- this._isPrg = false;
49
- this._isMainPrg = false;
50
- this.IsInteractive = false;
51
- this._taskTag = null;
52
- this._openWin = false;
53
- this._allowEvents = false;
54
- this.Form = null;
55
- this._propTab = null;
56
- this._helpTab = null;
57
- this.IconFileName = null;
58
- this.IsParallel = false;
59
- this.DataView = null;
60
- this.ActionManager = null;
61
- this.StudioParentTask = null;
62
- this.routerPath = null;
63
- this.routeParams = null;
64
- this.inDefaultRouterOutlet = false;
65
- this.IsSubtask = false;
66
- this.DataViewWasRetrieved = false;
67
- this.TaskPrefixExecuted = false;
68
- this._nullArithmetic = Constants.NULL_ARITH_USE_DEF;
69
- this._propTab = new PropTable(this);
70
- }
71
- getTaskTag() {
72
- return this._taskTag;
73
- }
74
- getCtlIdx() {
75
- return this._ctlIdx;
76
- }
77
- isMainProg() {
78
- return this._isMainPrg;
79
- }
80
- getTopMostForm() {
81
- let form = null;
82
- if (this.Form !== null)
83
- form = this.Form.getTopMostForm();
84
- return form;
85
- }
86
- getCtrl(ctrlIdx) {
87
- return this.Form.getCtrl(ctrlIdx);
88
- }
89
- setMode(val) {
90
- if (this.getMode() !== val) {
91
- this.setProp(PropInterface.PROP_TYPE_TASK_MODE, val);
92
- if (this._flowMonitor !== null)
93
- this._flowMonitor.addTaskCngMode(val, this.GetTaskDetails());
94
- }
95
- }
96
- getMode() {
97
- let taskMode = Constants.TASK_MODE_MODIFY;
98
- let prop = this._propTab.getPropById(PropInterface.PROP_TYPE_TASK_MODE);
99
- if (prop !== null) {
100
- taskMode = prop.GetComputedValue();
101
- }
102
- return taskMode;
103
- }
104
- SetInRecompute(inRecompute) {
105
- this.isInRecompute = inRecompute;
106
- }
107
- IsInRecompute() {
108
- return this.isInRecompute;
109
- }
110
- resetRefreshType() {
111
- this._refreshType = Constants.TASK_REFRESH_NONE;
112
- }
113
- getRefreshType() {
114
- return this._refreshType;
115
- }
116
- SetRefreshType(refreshType) {
117
- switch (refreshType) {
118
- case Constants.TASK_REFRESH_FORM:
119
- case Constants.TASK_REFRESH_TABLE:
120
- case Constants.TASK_REFRESH_CURR_REC:
121
- this._refreshType = refreshType;
122
- break;
123
- default:
124
- break;
125
- }
126
- }
127
- GetRouterParams() {
128
- return this.routeParams;
129
- }
130
- getLastParkedCtrl() {
131
- return this._lastParkedCtrl;
132
- }
133
- isOpenWin() {
134
- return this._openWin;
135
- }
136
- async checkProp(propId, defaultRetVal) {
137
- let prop = this.getProp(propId);
138
- if (prop !== null)
139
- return await prop.getValueBoolean();
140
- return defaultRetVal;
141
- }
142
- getClickedControl() {
143
- let clickedCtrl = Events.GetRuntimeContext(null).CurrentClickedCtrl;
144
- if (clickedCtrl !== null && clickedCtrl.getForm().getTask() !== this)
145
- clickedCtrl = null;
146
- return clickedCtrl;
147
- }
148
- getKeyboardMappingState() {
149
- return this._keyboardMappingState;
150
- }
151
- isStateEnabled(state) {
152
- return (state & this._keyboardMappingState) > 0;
153
- }
154
- setKeyboardMappingState(state, on) {
155
- this._keyboardMappingState = on
156
- ? GuiTaskBase.mkInt(GuiTaskBase.hiShrt(this._keyboardMappingState) & ~state, GuiTaskBase.loShrt(this._keyboardMappingState) | state)
157
- : GuiTaskBase.mkInt(GuiTaskBase.hiShrt(this._keyboardMappingState) | state, GuiTaskBase.loShrt(this._keyboardMappingState) & ~state);
158
- }
159
- static hiShrt(n) {
160
- return (n & 0xffff0000) >> 16;
161
- }
162
- static loShrt(n) {
163
- return n & 0x0000ffff;
164
- }
165
- static mkInt(n1, n2) {
166
- return n1 << 16 | n2;
167
- }
168
- getHelpItem(idx) {
169
- if (this._helpTab !== null)
170
- return this._helpTab.getHelp(idx);
171
- }
172
- setProp(propId, val) {
173
- this._propTab.setProp(propId, val, this, "T");
174
- }
175
- setBrkLevel(cBrkLevel, NewBrkLevelIndex) {
176
- this._brkLevel = cBrkLevel;
177
- this._brkLevelIndex = NewBrkLevelIndex;
178
- this.setMainLevel(cBrkLevel);
179
- }
180
- getBrkLevel() {
181
- return this._brkLevel;
182
- }
183
- getBrkLevelIndex() {
184
- return this._brkLevelIndex;
185
- }
186
- setMainLevel(cBrkLevel) {
187
- if (cBrkLevel !== null && cBrkLevel.length > 0) {
188
- let level = cBrkLevel.charAt(0);
189
- if (level === Constants.TASK_LEVEL_NONE || level === Constants.TASK_LEVEL_TASK ||
190
- level === Constants.TASK_LEVEL_RECORD)
191
- this._mainLevel = cBrkLevel;
192
- }
193
- }
194
- getMainLevel() {
195
- return this._mainLevel;
196
- }
197
- setLevel(cLevel) {
198
- this._level = cLevel;
199
- if (this._level === Constants.TASK_LEVEL_RECORD)
200
- this._enteredRecLevel = true;
201
- }
202
- getLevel() {
203
- return this._level;
204
- }
205
- setDataSynced(synced) {
206
- }
207
- getNullArithmetic() {
208
- return this._nullArithmetic;
209
- }
210
- setLastParkedCtrl(ctrl) {
211
- this._lastParkedCtrl = ctrl;
212
- this._currParkedFld = ((this._lastParkedCtrl !== null)
213
- ? this._lastParkedCtrl.getField()
214
- : null);
215
- this.CurrentEditingControl = ctrl;
216
- }
217
- getCurrField() {
218
- return this._currParkedFld;
219
- }
220
- setCurrField(currField) {
221
- this._currParkedFld = currField;
222
- }
223
- getCurrFieldIdx() {
224
- if (this._currParkedFld !== null)
225
- return this._currParkedFld.getId();
226
- return -1;
227
- }
228
- getFieldByValueStr(valueStr, parent, vee) {
229
- if (arguments.length === 1)
230
- return this.getFieldByValueStr_0(valueStr);
231
- else
232
- return this.getFieldByValueStr_1(valueStr, parent, vee);
233
- }
234
- getFieldByValueStr_0(valueStr) {
235
- let parent;
236
- let vee;
237
- let refParent = new RefParam(parent);
238
- let refVee = new RefParam(vee);
239
- return this.getFieldByValueStr_1(valueStr, refParent, refVee);
240
- }
241
- getFieldByValueStr_1(valueStr, parent, vee) {
242
- parent.value = vee.value = 0;
243
- let tempField = null;
244
- let comma = valueStr.indexOf(",");
245
- if (comma > 0) {
246
- let parentId = NNumber.Parse(valueStr.substr(0, comma));
247
- let fldIdx = NNumber.Parse(valueStr.substr(comma + 1));
248
- tempField = ((parentId !== 0)
249
- ? this.getFieldDef(parentId, fldIdx)
250
- : this.getFieldDef(fldIdx));
251
- parent.value = parentId;
252
- vee.value = fldIdx;
253
- }
254
- return tempField;
255
- }
256
- getMainProgFieldByValueStr(valueStr) {
257
- let fldIdx = NNumber.Parse(valueStr) - 1;
258
- return this.getFieldDef(fldIdx);
259
- }
260
- getFieldDef(fldIdOrParent, fldIdx) {
261
- if (arguments.length === 1)
262
- return this.getField_0(fldIdOrParent);
263
- else
264
- return this.getField_1(fldIdOrParent, fldIdx);
265
- }
266
- getField_0(fldId) {
267
- return this.DataView.getField(fldId);
268
- }
269
- async InitForm() {
270
- if (this.Form !== null && this.isOpenWin()) {
271
- this.Form.InInitForm = true;
272
- await this.Form.init();
273
- this.SetRefreshType(Constants.TASK_REFRESH_FORM);
274
- await this.RefreshDisplay();
275
- Commands.beginInvoke();
276
- this.Form.InInitForm = false;
277
- }
278
- }
279
- ResumeSubformLayout() {
280
- if (this.Form !== null) {
281
- let subFormCtrl = this.Form.getSubFormCtrl();
282
- if (subFormCtrl !== null && this.shouldResumeSubformLayout) {
283
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, subFormCtrl, 0, HtmlProperties.Visible, subFormCtrl.isVisible());
284
- this.shouldResumeSubformLayout = false;
285
- }
286
- }
287
- }
288
- GetLastParkedCtrlName(depth) {
289
- let ancestor = this.GetTaskAncestor(depth);
290
- if (ancestor === null || ancestor._lastParkedCtrl === null)
291
- return "";
292
- return ancestor._lastParkedCtrl.Name;
293
- }
294
- getForm() {
295
- return this.Form;
296
- }
297
- SetForm(value) {
298
- this.Form = value;
299
- return value;
300
- }
301
- checkIfExistProp(propId) {
302
- let exist = false;
303
- if (this._propTab !== null) {
304
- let prop = this._propTab.getPropById(propId);
305
- exist = (prop !== null);
306
- }
307
- return exist;
308
- }
309
- getProp(propId) {
310
- let prop = null;
311
- if (this._propTab !== null) {
312
- prop = this._propTab.getPropById(propId);
313
- if (prop === null) {
314
- prop = Property.getDefaultProp(propId, GuiConstants.PARENT_TYPE_TASK, this);
315
- if (prop !== null) {
316
- prop.StudioValue = prop.getOrgValue();
317
- this._propTab.addProp(prop);
318
- }
319
- }
320
- }
321
- return prop;
322
- }
323
- GetComputedProperty(propId) {
324
- let prop = null;
325
- if (this._propTab !== null)
326
- prop = this._propTab.getPropById(propId);
327
- return prop;
328
- }
329
- getCompIdx() {
330
- return this._compIdx;
331
- }
332
- IsFirstRefreshOfProps() {
333
- throw new NotImplementedException();
334
- }
335
- async EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
336
- let result = null;
337
- wasEvaluated.value = false;
338
- if (alwaysEvaluate || this.DataViewWasRetrieved) {
339
- result = await this.CalculateExpression(expId, resType, length);
340
- wasEvaluated.value = true;
341
- }
342
- return result;
343
- }
344
- GetExpressionStorage(expId) {
345
- return this.GetExpressionStorage(expId);
346
- }
347
- async CalculateExpression(expId, resType, length) {
348
- return Promise.resolve("");
349
- }
350
- isStarted() {
351
- return true;
352
- }
353
- isAborting() {
354
- return false;
355
- }
356
- getField_1(parent, fldIdx) {
357
- switch (parent) {
358
- case 0:
359
- return this.getFieldDef(fldIdx);
360
- case GuiTaskBase.MAIN_PRG_PARENT_ID:
361
- let compMainProg = GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, this._ctlIdx);
362
- return compMainProg.getFieldDef(fldIdx);
363
- default:
364
- parent--;
365
- if (this.StudioParentTask != null)
366
- return this.StudioParentTask.getFieldDef(parent, fldIdx);
367
- return null;
368
- }
369
- }
370
- fillAttributes(parser) {
371
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
372
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
373
- let tag = parser.getXMLsubstring(endContext);
374
- parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_TASK) + XMLConstants.MG_TAG_TASK.length);
375
- let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
376
- for (let j = 0; j < tokens.length; j = j + 2) {
377
- let attribute = tokens.get_Item(j);
378
- let valueStr = tokens.get_Item(j + 1);
379
- if (!this.setAttribute(attribute, valueStr) && Events.ShouldLog(Logger_LogLevels.Development))
380
- Events.WriteDevToLog(NString.Format("In TaskBase.fillAttributes(): Unprocessed(!) attribute: '{0}' = '{1}'", attribute, valueStr));
381
- }
382
- parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
383
- }
384
- }
385
- setAttribute(attribute, valueStr) {
386
- let isTagProcessed = true;
387
- switch (attribute) {
388
- case XMLConstants.MG_ATTR_APPL_GUID:
389
- this.ApplicationGuid = valueStr;
390
- break;
391
- case XMLConstants.MG_ATTR_PROGRAM_ISN:
392
- this.ProgramIsn = NNumber.Parse(valueStr);
393
- break;
394
- case XMLConstants.MG_ATTR_TASK_ISN:
395
- this.TaskIsn = NNumber.Parse(valueStr);
396
- break;
397
- case XMLConstants.MG_ATTR_TOOLKIT_PARENT_TASK:
398
- if (NNumber.Parse(valueStr) !== 0)
399
- this.StudioParentTask = GuiDataCollection.MGDataTable.GetTaskByID(valueStr);
400
- this.IsSubtask = true;
401
- break;
402
- case XMLConstants.MG_ATTR_TASKID:
403
- this.setTaskId(valueStr);
404
- if (Events.ShouldLog(Logger_LogLevels.Development))
405
- Events.WriteDevToLog("TASK: " + this._taskTag);
406
- break;
407
- case XMLConstants.MG_ATTR_CTL_IDX:
408
- this.setCtlAndCompIdx(valueStr);
409
- break;
410
- case XMLConstants.MG_ATTR_MAINPRG:
411
- this.setMainPrg(valueStr);
412
- break;
413
- case XMLConstants.MG_ATTR_NULL_ARITHMETIC:
414
- this.setNullArithmetic(valueStr);
415
- break;
416
- case XMLConstants.MG_ATTR_INTERACTIVE:
417
- this.setIsInteracive(valueStr);
418
- break;
419
- case XMLConstants.MG_ATTR_OPEN_WIN:
420
- this.setOpenWin(valueStr);
421
- break;
422
- case XMLConstants.MG_ATTR_ALLOW_EVENTS:
423
- this.SetAllowEvents(valueStr);
424
- break;
425
- case XMLConstants.MG_ATTR_ISPRG:
426
- this.setIsPrg(valueStr);
427
- break;
428
- case XMLConstants.MG_ATTR_ICON_FILE_NAME:
429
- this.IconFileName = valueStr;
430
- break;
431
- case XMLConstants.MG_ATTR_PARALLEL:
432
- this.IsParallel = XmlParser.getBoolean(valueStr);
433
- break;
434
- case XMLConstants.MG_ATTR_ROUTER_PATH:
435
- if (valueStr.trim() != "")
436
- this.routerPath = valueStr;
437
- break;
438
- case XMLConstants.MG_ATTR_IN_DEFAULT_ROUTER_OUTLET:
439
- this.inDefaultRouterOutlet = XmlParser.getBoolean(valueStr);
440
- break;
441
- default:
442
- isTagProcessed = false;
443
- break;
444
- }
445
- return isTagProcessed;
446
- }
447
- FormInitData(parentForm) {
448
- let alreadySetParentForm = false;
449
- let refAlreadySetParentForm = new RefParam(alreadySetParentForm);
450
- if (this.Form === null)
451
- this.Form = this.ConstructMgForm(refAlreadySetParentForm);
452
- if (!alreadySetParentForm)
453
- this.Form.ParentForm = parentForm;
454
- if (Events.ShouldLog(Logger_LogLevels.Development))
455
- Events.WriteDevToLog("form");
456
- this.Form.fillData(this);
457
- return this.Form;
458
- }
459
- setTaskId(valueStr) {
460
- this._taskTag = valueStr;
461
- }
462
- setCtlAndCompIdx(valueStr) {
463
- let i = valueStr.indexOf(",");
464
- if (i > -1) {
465
- this._ctlIdx = NNumber.Parse(valueStr.substr(0, i));
466
- this._compIdx = NNumber.Parse(valueStr.substr(i + 1));
467
- }
468
- }
469
- GetAncestorTaskContainingForm() {
470
- let parentTask = this.GetTaskAncestor(1);
471
- while (parentTask !== null && parentTask.getForm() === null) {
472
- parentTask = parentTask.GetTaskAncestor(1);
473
- }
474
- return parentTask;
475
- }
476
- setMainPrg(valueStr) {
477
- this._isMainPrg = XmlParser.getBoolean(valueStr);
478
- }
479
- setNullArithmetic(valueStr) {
480
- this._nullArithmetic = valueStr.charAt(0);
481
- }
482
- setIsInteracive(valueStr) {
483
- this.IsInteractive = XmlParser.getBoolean(valueStr);
484
- }
485
- setOpenWin(valueStr) {
486
- this._openWin = XmlParser.getBoolean(valueStr);
487
- }
488
- SetOpenWin(valuebool) {
489
- this._openWin = valuebool;
490
- }
491
- SetAllowEvents(valueStr) {
492
- this._allowEvents = XmlParser.getBoolean(valueStr);
493
- }
494
- setIsPrg(valueStr) {
495
- this._isPrg = XmlParser.getBoolean(valueStr);
496
- }
497
- ShouldEvaluatePropertyLocally(propId) {
498
- return false;
499
- }
500
- WriteToMessagePane(msg) {
501
- if (msg != null)
502
- console.log(msg);
503
- }
504
- WriteToMessagePanebyMsgId(msgId) {
505
- let msg = Events.GetMessageString(msgId);
506
- this.WriteToMessagePane(msg);
507
- }
508
- }
509
- GuiTaskBase.MAIN_PRG_PARENT_ID = 32768;
510
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpVGFza0Jhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvdGFza3MvR3VpVGFza0Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFPLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDL0YsT0FBTyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBb0IsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBT3hHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUkzQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzdELE1BQU0sT0FBZ0IsV0FBVztJQTZDeEIsSUFBSTtRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBYUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzNGLENBQUM7SUFFRDtRQTFFQSxpQkFBWSxHQUFzQixJQUFJLENBQUM7UUFDL0IsMEJBQXFCLEdBQVcsVUFBVSxDQUFDO1FBQ25ELGlCQUFZLEdBQVcsR0FBRyxDQUFDO1FBQzNCLG9CQUFlLEdBQWtCLElBQUksQ0FBQztRQUM5QixjQUFTLEdBQVcsSUFBSSxDQUFDO1FBQ3pCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsZUFBVSxHQUFXLElBQUksQ0FBQztRQUMxQixXQUFNLEdBQVcsSUFBSSxDQUFDO1FBQzlCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxtQkFBYyxHQUFpQixJQUFJLENBQUM7UUFDNUIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHOUIsMEJBQXFCLEdBQWtCLElBQUksQ0FBQztRQUNwQyw4QkFBeUIsR0FBWSxJQUFJLENBQUM7UUFDbEQsb0JBQWUsR0FBVyxJQUFJLENBQUM7UUFDL0IsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFDdEIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFDeEIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUN0QyxTQUFJLEdBQWUsSUFBSSxDQUFDO1FBQ3hCLGFBQVEsR0FBYyxJQUFJLENBQUM7UUFDM0IsYUFBUSxHQUFVLElBQUksQ0FBQztRQUV2QixpQkFBWSxHQUFXLElBQUksQ0FBQztRQUU1QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBQ2pDLGtCQUFhLEdBQW1CLElBQUksQ0FBQztRQUNyQyxxQkFBZ0IsR0FBZ0IsSUFBSSxDQUFDO1FBRTdCLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDeEIsZ0JBQVcsR0FBYyxJQUFJLENBQUM7UUFDaEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBa0IvQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUt0Qyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFVbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBS0QsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBS0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBS0QsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBTUQsY0FBYztRQUNaLElBQUksSUFBSSxHQUFlLElBQUksQ0FBQztRQUU1QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSTtZQUNwQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQU1wQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFLRCxPQUFPLENBQUMsT0FBZTtRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFPRCxPQUFPLENBQUMsR0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUk7Z0JBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztTQUNoRTtJQUNILENBQUM7SUFNRCxPQUFPO1FBQ0wsSUFBSSxRQUFRLEdBQVcsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1FBQ2xELElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDcEM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsY0FBYyxDQUFDLFdBQW9CO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFJRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztJQUNsRCxDQUFDO0lBTUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBTUQsY0FBYyxDQUFDLFdBQW1CO1FBQ2hDLFFBQVEsV0FBVyxFQUFFO1lBQ25CLEtBQUssU0FBUyxDQUFDLGlCQUFpQixDQUFDO1lBQ2pDLEtBQUssU0FBUyxDQUFDLGtCQUFrQixDQUFDO1lBQ2xDLEtBQUssU0FBUyxDQUFDLHFCQUFxQjtnQkFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7Z0JBQ2hDLE1BQU07WUFFUjtnQkFDRSxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBS0QsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFJRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFPRCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQWMsRUFBRSxhQUFzQjtRQUNwRCxJQUFJLElBQUksR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksSUFBSSxLQUFLLElBQUk7WUFDZixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFLRCxpQkFBaUI7UUFDZixJQUFJLFdBQVcsR0FBa0IsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1FBRW5GLElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSTtZQUNsRSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXJCLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFJRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztJQU9ELGNBQWMsQ0FBQyxLQUFhO1FBQzFCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFPRCx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsRUFBVztRQUNoRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRTtZQUM3QixDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3BJLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6SSxDQUFDO0lBSUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFTO1FBQ3JCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFJRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQVM7UUFDckIsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQ3hCLENBQUM7SUFLRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQVUsRUFBRSxFQUFVO1FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQU9ELE9BQU8sQ0FBQyxNQUFjLEVBQUUsR0FBVztRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBS0QsV0FBVyxDQUFDLFNBQWlCLEVBQUUsZ0JBQXdCO1FBQ3JELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7UUFFdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBS0QsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBTUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFLRCxZQUFZLENBQUMsU0FBaUI7UUFDNUIsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlDLElBQUksS0FBSyxHQUFXLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEMsSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLGVBQWUsSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLGVBQWU7Z0JBQzVFLEtBQUssS0FBSyxTQUFTLENBQUMsaUJBQWlCO2dCQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztTQUMvQjtJQUNILENBQUM7SUFLRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFNRCxRQUFRLENBQUMsTUFBYztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLGlCQUFpQjtZQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFLRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFLRCxhQUFhLENBQUMsTUFBZTtJQUM3QixDQUFDO0lBS0QsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFNRCxpQkFBaUIsQ0FBQyxJQUFtQjtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQztZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUU7WUFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBS0QsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBS0QsWUFBWSxDQUFDLFNBQXVCO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFLRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUk7WUFDOUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBSUQsa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxNQUF5QixFQUFFLEdBQXNCO1FBQ3BGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDOztZQUUzQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxRQUFnQjtRQUMzQyxJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLEdBQVcsQ0FBQztRQUNoQixJQUFJLFNBQVMsR0FBcUIsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsSUFBSSxNQUFNLEdBQXFCLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQU9PLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsTUFBd0IsRUFBRSxHQUFxQjtRQUM1RixNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksU0FBUyxHQUFhLElBQUksQ0FBQztRQUMvQixJQUFJLEtBQUssR0FBVyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNiLElBQUksUUFBUSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLE1BQU0sR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsU0FBUyxHQUFHLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQU9ELDBCQUEwQixDQUFDLFFBQWdCO1FBRXpDLElBQUksTUFBTSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBSUQsV0FBVyxDQUFDLGFBQXFCLEVBQUUsTUFBZTtRQUNoRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7O1lBRXRDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQU1PLFVBQVUsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUtELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUd2QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBRWpELE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRTVCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBS0QsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDdEIsSUFBSSxXQUFXLEdBQWlDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0UsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFFMUQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFDbkUsY0FBYyxDQUFDLE9BQU8sRUFBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFFckQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQzthQUN4QztTQUNGO0lBQ0gsQ0FBQztJQU1ELHFCQUFxQixDQUFDLEtBQWE7UUFDakMsSUFBSSxRQUFRLEdBQTZCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLEtBQUssSUFBSTtZQUN4RCxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7SUFDdkMsQ0FBQztJQU1ELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQU1ELE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztRQUUzQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZELEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztTQUN6QjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQU9ELE9BQU8sQ0FBQyxNQUFjO1FBQ3BCLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUl6QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVFLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3QjthQUNGO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFjO1FBQ2hDLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUN4QixJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS0QsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBTUQscUJBQXFCO1FBQ25CLE1BQU0sSUFBSSx1QkFBdUIsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFhRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBYSxFQUFFLE9BQXlCLEVBQUUsTUFBYyxFQUFFLGtCQUEyQixFQUFFLFdBQTZCLEVBQUUsY0FBdUIsRUFBRSxZQUErQjtRQUNyTSxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUM7UUFDMUIsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBSSxjQUFjLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQy9DLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWE7UUFDaEMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQVdELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsT0FBeUIsRUFBRSxNQUFjO1FBQ2hGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBV0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELFVBQVU7UUFDUixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUE4Q08sVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBRS9DLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxDQUFDO2dCQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVsQyxLQUFLLFdBQVcsQ0FBQyxrQkFBa0I7Z0JBRWpDLElBQUksWUFBWSxHQUE4QixpQkFBaUIsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlILE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUxQztnQkFDRSxNQUFNLEVBQUUsQ0FBQztnQkFDVCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO29CQUMvQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUtELGNBQWMsQ0FBQyxNQUFpQjtRQUM5QixJQUFJLFVBQVUsR0FBVyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDcEcsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFFaEUsSUFBSSxHQUFHLEdBQVcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFOUYsSUFBSSxNQUFNLEdBQWlCLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFaEgsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BELElBQUksU0FBUyxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLElBQUksUUFBUSxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7b0JBQzNGLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyx1RUFBdUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUN0STtZQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3JHO0lBQ0gsQ0FBQztJQUtELFlBQVksQ0FBQyxTQUFpQixFQUFFLFFBQWdCO1FBQzlDLElBQUksY0FBYyxHQUFZLElBQUksQ0FBQztRQUVuQyxRQUFRLFNBQVMsRUFBRTtZQUNqQixLQUFLLFlBQVksQ0FBQyxpQkFBaUI7Z0JBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO2dCQUNoQyxNQUFNO1lBRVIsS0FBSyxZQUFZLENBQUMsbUJBQW1CO2dCQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFDLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxnQkFBZ0I7Z0JBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsTUFBTTtZQUVSLEtBQUssWUFBWSxDQUFDLDJCQUEyQjtnQkFDM0MsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBZ0IsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFM0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxjQUFjO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO29CQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pELE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxlQUFlO2dCQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hDLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxlQUFlO2dCQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixNQUFNO1lBRVIsS0FBSyxZQUFZLENBQUMsdUJBQXVCO2dCQUN2QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxtQkFBbUI7Z0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxnQkFBZ0I7Z0JBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFCLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxvQkFBb0I7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlCLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxhQUFhO2dCQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QixNQUFNO1lBRVIsS0FBSyxZQUFZLENBQUMsc0JBQXNCO2dCQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztnQkFDN0IsTUFBTTtZQUdSLEtBQUssWUFBWSxDQUFDLGdCQUFnQjtnQkFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNO1lBRVIsS0FBSyxZQUFZLENBQUMsbUJBQW1CO2dCQUNuQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO29CQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztnQkFDN0IsTUFBTTtZQUVSLEtBQUssWUFBWSxDQUFDLGdDQUFnQztnQkFDaEQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVELE1BQU07WUFFUjtnQkFDRSxjQUFjLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixNQUFNO1NBQ1Q7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBUUQsWUFBWSxDQUFDLFVBQXNCO1FBQ2pDLElBQUksb0JBQW9CLEdBQVksS0FBSyxDQUFDO1FBQzFDLElBQUksdUJBQXVCLEdBQXNCLElBQUksUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFcEYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUk7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLG9CQUFvQjtZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFcEMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQztZQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBS0QsU0FBUyxDQUFDLFFBQWdCO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFLTyxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUN2QyxJQUFJLENBQUMsR0FBVyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7SUFDSCxDQUFDO0lBTUQsNkJBQTZCO1FBQzNCLElBQUksVUFBVSxHQUE2QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNELFVBQVUsR0FBZ0IsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RDtRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFNTyxVQUFVLENBQUMsUUFBZ0I7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFNTyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQU1PLGVBQWUsQ0FBQyxRQUFnQjtRQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQU1PLFVBQVUsQ0FBQyxRQUFnQjtRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQU1ELFVBQVUsQ0FBQyxTQUFrQjtRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUM1QixDQUFDO0lBTUQsY0FBYyxDQUFDLFFBQWdCO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBTU8sUUFBUSxDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsNkJBQTZCLENBQUMsTUFBYztRQUMxQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFRRCxrQkFBa0IsQ0FBQyxHQUFXO1FBRTVCLElBQUksR0FBRyxJQUFJLElBQUk7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFRRCx5QkFBeUIsQ0FBQyxLQUFhO1FBQ3JDLElBQUksR0FBRyxHQUFXLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7QUF4N0JnQiw4QkFBa0IsR0FBVyxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3QsIE5OdW1iZXIsIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uLCBOU3RyaW5nLCBSZWZQYXJhbX0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7Q29uc3RhbnRzLCBMb2dnZXJfTG9nTGV2ZWxzLCBTdG9yYWdlQXR0cmlidXRlLCBYTUxDb25zdGFudHMsIFhtbFBhcnNlcn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtJVGFza30gZnJvbSBcIi4vSVRhc2tcIjtcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tIFwiLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtJRmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uLy4uL0lGbG93TW9uaXRvclF1ZXVlXCI7XHJcbmltcG9ydCB7TWdDb250cm9sQmFzZX0gZnJvbSBcIi4uL2d1aS9NZ0NvbnRyb2xCYXNlXCI7XHJcbmltcG9ydCB7R3VpRmllbGRCYXNlfSBmcm9tIFwiLi4vZGF0YS9HdWlGaWVsZEJhc2VcIjtcclxuaW1wb3J0IHtNZ0Zvcm1CYXNlfSBmcm9tIFwiLi4vZ3VpL01nRm9ybUJhc2VcIjtcclxuaW1wb3J0IHtQcm9wVGFibGV9IGZyb20gXCIuLi9ndWkvUHJvcFRhYmxlXCI7XHJcbmltcG9ydCB7SGVscHMsIE1hZ2ljSGVscH0gZnJvbSBcIi4uL2d1aS9IZWxwc1wiO1xyXG5pbXBvcnQge0d1aURhdGFWaWV3QmFzZX0gZnJvbSBcIi4uL2RhdGEvR3VpRGF0YVZpZXdCYXNlXCI7XHJcbmltcG9ydCB7SUFjdGlvbk1hbmFnZXJ9IGZyb20gXCIuLi9ldmVudHMvSUFjdGlvbk1hbmFnZXJcIjtcclxuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcIi4uL2d1aS9Qcm9wZXJ0eVwiO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gXCIuLi9ndWkvUHJvcEludGVyZmFjZVwiO1xyXG5pbXBvcnQge0ZpZWxkRGVmfSBmcm9tIFwiLi4vZGF0YS9GaWVsZERlZlwiO1xyXG5pbXBvcnQge0NvbW1hbmRzfSBmcm9tIFwiLi4vLi4vQ29tbWFuZHNcIjtcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gXCIuLi8uLi9FdmVudHNcIjtcclxuaW1wb3J0IHtHdWlDb25zdGFudHN9IGZyb20gXCIuLi8uLi9HdWlDb25zdGFudHNcIjtcclxuaW1wb3J0IHtHdWlEYXRhQ29sbGVjdGlvbn0gZnJvbSBcIi4vR3VpRGF0YUNvbGxlY3Rpb25cIjtcclxuaW1wb3J0IHsgQ29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL0d1aUVudW1zXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyB0YXNrIHByb3BlcnRpZXMgKCsgZmV3IGFjY2VzcyBtZXRob2RzKSByZXF1aXJlZCBhbmQgcmVsZXZhbnQgZm9yIHRoZSBHVUkgbmFtZXNwYWNlLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR3VpVGFza0Jhc2UgaW1wbGVtZW50cyBJVGFzaywgUHJvcFBhcmVudEludGVyZmFjZSB7XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyBNQUlOX1BSR19QQVJFTlRfSUQ6IG51bWJlciA9IDMyNzY4O1xyXG4gIF9mbG93TW9uaXRvcjogSUZsb3dNb25pdG9yUXVldWUgPSBudWxsO1xyXG4gIHByaXZhdGUgX2tleWJvYXJkTWFwcGluZ1N0YXRlOiBudW1iZXIgPSAweEZGRkYwMDAwO1xyXG4gIF9yZWZyZXNoVHlwZTogc3RyaW5nID0gXCJUXCI7XHJcbiAgX2xhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9icmtMZXZlbDogc3RyaW5nID0gbnVsbDsgLy8gdGhlIHJ1bnRpbWUgbGV2ZWwgKFJlY29yZCAgU3VmZml4LCBHdWlUYXNrQmFzZSBQcmVmaXgsIGV0Yy4pXHJcbiAgcHJpdmF0ZSBfYnJrTGV2ZWxJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBfbWFpbkxldmVsOiBzdHJpbmcgPSBudWxsOyAvLyB0aGUgcnVudGltZSBtYWlubGV2ZWxcclxuICBwcml2YXRlIF9sZXZlbDogc3RyaW5nID0gXCJcXDBcIjsgLy8gJ0MnID0gaW4gY29udHJvbCwgJ1InID0gaW4gcmVjb3JkIChvdXQgb2YgY29udHJvbCksICdUJyA9IGluIHRhc2sgKG91dCBvZiByZWNvcmQpXHJcbiAgX2VudGVyZWRSZWNMZXZlbDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUUlVFIG9ubHkgaWYgdGhlIHRhc2sgd2FzIGV2ZXIgbW92ZWQgdG8gcmVjb3JkIGxldmVsLlxyXG4gIF9jdXJyUGFya2VkRmxkOiBHdWlGaWVsZEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgaXNJblJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gIC8vIFRoaXMgZmxhZyByZXByZXNlbnRzIHRoZSBjdXJyZW50IGVkaXRpbmcgY29udHJvbC5cclxuICAvLyBJdCBpcyByZXNldCB0byBudWxsIHdoZW4gd2UgYXJlIGluIGJldHdlZW4gc2V0dGluZyB0aGUgZm9jdXMgYW5kIG9uY2Ugd2Ugc2V0IHRoZSBmb2N1cyB0byBjb250cm9sIHRoZW4gd2Ugc2V0IHRoaXMgZmxhZyB0byBjdXJyZW50IGZvY3VzZWQgY29udHJvbC5cclxuICBDdXJyZW50RWRpdGluZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgc2hvdWxkUmVzdW1lU3ViZm9ybUxheW91dDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQXBwbGljYXRpb25HdWlkOiBzdHJpbmcgPSBudWxsO1xyXG4gIFByb2dyYW1Jc246IG51bWJlciA9IDA7XHJcbiAgVGFza0lzbjogbnVtYmVyID0gMDtcclxuICBDb250ZXh0SUQ6IG51bWJlciA9IDA7XHJcbiAgSXNTdWJGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX2N0bElkeDogbnVtYmVyID0gMDtcclxuICBfY29tcElkeDogbnVtYmVyID0gMDtcclxuICBfaXNQcmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfaXNNYWluUHJnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNJbnRlcmFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF90YXNrVGFnOiBzdHJpbmcgPSBudWxsO1xyXG4gIF9vcGVuV2luOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfYWxsb3dFdmVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICBfcHJvcFRhYjogUHJvcFRhYmxlID0gbnVsbDtcclxuICBfaGVscFRhYjogSGVscHMgPSBudWxsO1xyXG4gIF9udWxsQXJpdGhtZXRpYzogc3RyaW5nO1xyXG4gIEljb25GaWxlTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgSXNQYXJhbGxlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIERhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSBudWxsO1xyXG4gIEFjdGlvbk1hbmFnZXI6IElBY3Rpb25NYW5hZ2VyID0gbnVsbDtcclxuICBTdHVkaW9QYXJlbnRUYXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7IC8vIHBhcmVudCB0YXNrIG9mIHRoZSBzdWJ0YXNrIGJ5IHRvb2xraXQgdHJlZS5cclxuXHJcbiAgcHJpdmF0ZSByb3V0ZXJQYXRoOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByb3RlY3RlZCByb3V0ZVBhcmFtczogTGlzdDxhbnk+ID0gbnVsbDtcclxuICBwcml2YXRlIGluRGVmYXVsdFJvdXRlck91dGxldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFJvdXRlclBhdGgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnJvdXRlclBhdGg7XHJcbiAgfVxyXG5cclxuICBnZXQgUm91dGVyUGFyYW1zKCk6IExpc3Q8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBJbkRlZmF1bHRSb3V0ZXJPdXRsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbkRlZmF1bHRSb3V0ZXJPdXRsZXQ7XHJcbiAgfVxyXG5cclxuICBJc1N1YnRhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBEYXRhVmlld1dhc1JldHJpZXZlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSB2aWV3IHdhcyByZXRyaWV2ZWQsIGkuZS4gaXQgaXMgcG9zc2libGUgdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnNcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBwcmVmaXggd2FzIHBlcmZvcm1lZCBmb3IgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBUYXNrUHJlZml4RXhlY3V0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrIHNob3VsZCBibG9jayBhY3RpdmF0aW9uIG9mIGl0cyBhY3Nlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBJc0Jsb2NraW5nQmF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuX2lzTWFpblByZyAmJiB0aGlzLmlzT3BlbldpbigpICYmICF0aGlzLl9hbGxvd0V2ZW50cyAmJiAhdGhpcy5Jc0ludGVyYWN0aXZlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9udWxsQXJpdGhtZXRpYyA9IENvbnN0YW50cy5OVUxMX0FSSVRIX1VTRV9ERUY7XHJcbiAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGFzayBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFza1RhZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tUYWc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdGwgaWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdGxJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jdGxJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgdGFzayBpcyBhIG1haW4gcHJvZ3JhbSBvZiBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBjb21wb25lbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTWFpblByb2coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNNYWluUHJnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBtZ2Zvcm0gb2YgdGhlIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbClcclxuICAgICAgZm9ybSA9IHRoaXMuRm9ybS5nZXRUb3BNb3N0Rm9ybSgpO1xyXG4gICAgLy8gZWxzZVxyXG4gICAgLy8gQXNzZXJ0IHNob3VsZCBub3QgYmUgaGVyZSBiZWNhdXNlIHdlIGhhdmUgZGlmZmVyZW50IGNvbmRpdGlvbnMgZm9yIFJDICYgT0wuXHJcbiAgICAvLyBPdGhlciB0aGVuIE1haW4gUHJvZ3JhbSwgdGFzaydzIGZvcm0gc2hvdWxkIG5vdCBiZSBudWxsLlxyXG4gICAgLy8gRGVidWcuQXNzZXJ0KGlzTWFpblByb2coKSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcmVxdWVzdGVkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN0cmwoY3RybElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5Gb3JtLmdldEN0cmwoY3RybElkeCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIHRoZSBjdXJyZW50IHRhc2sgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+bmV3IHRhc2sgbW9kZTwvcGFyYW0+XHJcbiAgc2V0TW9kZSh2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2V0TW9kZSgpICE9PSB2YWwpIHtcclxuICAgICAgdGhpcy5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERSwgdmFsKTtcclxuICAgICAgaWYgKHRoaXMuX2Zsb3dNb25pdG9yICE9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuX2Zsb3dNb25pdG9yLmFkZFRhc2tDbmdNb2RlKHZhbCwgdGhpcy5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0YXNrIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1vZGUoKTogc3RyaW5nIHtcclxuICAgIGxldCB0YXNrTW9kZTogc3RyaW5nID0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlk7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERSk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICB0YXNrTW9kZSA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhc2tNb2RlO1xyXG4gIH1cclxuXHJcbiAgU2V0SW5SZWNvbXB1dGUoaW5SZWNvbXB1dGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNJblJlY29tcHV0ZSA9IGluUmVjb21wdXRlO1xyXG4gIH1cclxuXHJcbiAgSXNJblJlY29tcHV0ZSgpIDogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0luUmVjb21wdXRlO1xyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgcmVmcmVzaCB0eXBlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFJlZnJlc2hUeXBlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJlZnJlc2ggdHlwZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRSZWZyZXNoVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcmVmcmVzaCB0eXBlIGZvciB0aGUgbmV4dCBSZWZyZXNoRGlzcGxheSgpIGNhbGxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVmcmVzaFR5cGVcIj50aGUgbmV3IHJlZnJlc2ggdHlwZTwvcGFyYW0+XHJcbiAgU2V0UmVmcmVzaFR5cGUocmVmcmVzaFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChyZWZyZXNoVHlwZSkge1xyXG4gICAgICBjYXNlIENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STTpcclxuICAgICAgY2FzZSBDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFOlxyXG4gICAgICBjYXNlIENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUM6XHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaFR5cGUgPSByZWZyZXNoVHlwZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRSb3V0ZXJQYXJhbXMoKTogTGlzdDxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJvdXRlUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBsYXN0IHBhcmtlZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0UGFya2VkQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9sYXN0UGFya2VkQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSBvcGVuIHdpbmRvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNPcGVuV2luKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wZW5XaW47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyByZXR1cm5zIGl0cyBib29sZWFuIHZhbHVlIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPmlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdDwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AocHJvcElkKTtcclxuICAgIGlmIChwcm9wICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIHJldHVybiBkZWZhdWx0UmV0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNsaWNrZWQgY29udHJvbCBvbiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2xpY2tlZENvbnRyb2woKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgY2xpY2tlZEN0cmw6IE1nQ29udHJvbEJhc2UgPSBFdmVudHMuR2V0UnVudGltZUNvbnRleHQobnVsbCkuQ3VycmVudENsaWNrZWRDdHJsO1xyXG5cclxuICAgIGlmIChjbGlja2VkQ3RybCAhPT0gbnVsbCAmJiBjbGlja2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpICE9PSB0aGlzKVxyXG4gICAgICBjbGlja2VkQ3RybCA9IG51bGw7XHJcblxyXG4gICAgcmV0dXJuIGNsaWNrZWRDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBrZXlib2FyZE1hcHBpbmdTdGF0ZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0S2V5Ym9hcmRNYXBwaW5nU3RhdGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9rZXlib2FyZE1hcHBpbmdTdGF0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgc3RhdGUgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGF0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1N0YXRlRW5hYmxlZChzdGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHN0YXRlICYgdGhpcy5fa2V5Ym9hcmRNYXBwaW5nU3RhdGUpID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXRzIHRoZSBzdGF0ZSBvbi9vZmZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhdGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25cIj48L3BhcmFtPlxyXG4gIHNldEtleWJvYXJkTWFwcGluZ1N0YXRlKHN0YXRlOiBudW1iZXIsIG9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9rZXlib2FyZE1hcHBpbmdTdGF0ZSA9IG9uXHJcbiAgICAgID8gR3VpVGFza0Jhc2UubWtJbnQoR3VpVGFza0Jhc2UuaGlTaHJ0KHRoaXMuX2tleWJvYXJkTWFwcGluZ1N0YXRlKSAmIH5zdGF0ZSwgR3VpVGFza0Jhc2UubG9TaHJ0KHRoaXMuX2tleWJvYXJkTWFwcGluZ1N0YXRlKSB8IHN0YXRlKVxyXG4gICAgICA6IEd1aVRhc2tCYXNlLm1rSW50KEd1aVRhc2tCYXNlLmhpU2hydCh0aGlzLl9rZXlib2FyZE1hcHBpbmdTdGF0ZSkgfCBzdGF0ZSwgR3VpVGFza0Jhc2UubG9TaHJ0KHRoaXMuX2tleWJvYXJkTWFwcGluZ1N0YXRlKSAmIH5zdGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaGlnaGVyIGhhbGYgb2YgdGhlIGludGVnZXI8L3JldHVybnM+XHJcbiAgc3RhdGljIGhpU2hydChuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChuICYgMHhmZmZmMDAwMCkgPj4gMTY7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbG93IGhhbGYgb2YgdGhlIGludGVnZXI8L3JldHVybnM+XHJcbiAgc3RhdGljIGxvU2hydChuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIG4gJiAweDAwMDBmZmZmO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuMVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuMlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB1bml0ZXMgbG93IGhhbHZlcyBvZiAyIGludGVnZXJzIC8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgbWtJbnQobjE6IG51bWJlciwgbjI6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbjEgPDwgMTYgfCBuMjtcclxuICB9XHJcblxyXG4gIGdldEhlbHBJdGVtKGlkeDogbnVtYmVyKTogTWFnaWNIZWxwIHtcclxuICAgIGlmICh0aGlzLl9oZWxwVGFiICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5faGVscFRhYi5nZXRIZWxwKGlkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgcHJvcGVydHkgb2YgdGhlIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBzZXRQcm9wKHByb3BJZDogbnVtYmVyLCB2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvcFRhYi5zZXRQcm9wKHByb3BJZCwgdmFsLCB0aGlzLCBcIlRcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBydW50aW1lIGxldmVsIG9mIHRoZSB0YXNrIChSZWNvcmQgU3VmZml4LCBHdWlUYXNrQmFzZSBQcmVmaXgsIGV0Yy4pXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRCcmtMZXZlbChjQnJrTGV2ZWw6IHN0cmluZywgTmV3QnJrTGV2ZWxJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9icmtMZXZlbCA9IGNCcmtMZXZlbDtcclxuICAgIHRoaXMuX2Jya0xldmVsSW5kZXggPSBOZXdCcmtMZXZlbEluZGV4O1xyXG5cclxuICAgIHRoaXMuc2V0TWFpbkxldmVsKGNCcmtMZXZlbCk7IC8vIFVwZGF0ZSB0aGUgTWFpbkxldmVsIGFjY29yZGluZyB0byB0aGUgbmV3IExldmVsXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcnVudGltZSBsZXZlbCBvZiB0aGUgdGFzayAoUmVjb3JkIFN1ZmZpeCwgR3VpVGFza0Jhc2UgUHJlZml4LCBldGMuKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0QnJrTGV2ZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9icmtMZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGlkIG9mIHRoZSBjdXJyZW50IGV4ZWN1dGluZyBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBpbnQgaWQgb2YgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGhhbmRsZXI8L3JldHVybnM+XHJcbiAgZ2V0QnJrTGV2ZWxJbmRleCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jya0xldmVsSW5kZXg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBydW50aW1lIG1haW5sZXZlbCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0TWFpbkxldmVsKGNCcmtMZXZlbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoY0Jya0xldmVsICE9PSBudWxsICYmIGNCcmtMZXZlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBsZXZlbDogc3RyaW5nID0gY0Jya0xldmVsLmNoYXJBdCgwKTtcclxuICAgICAgLyogdGhlbiBNQUlOTEVWRUwgaXMgdXBkYXRlZCBvbmx5IGlmIHRoZSBhY3R1YWwgTGV2ZWwgaXMgYSBUQVNLIG9yIFJFQ09SRCAoIG9yIG5vbmUgKSBsZXZlbCAqL1xyXG4gICAgICBpZiAobGV2ZWwgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX05PTkUgfHwgbGV2ZWwgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgfHxcclxuICAgICAgICBsZXZlbCA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKVxyXG4gICAgICAgIHRoaXMuX21haW5MZXZlbCA9IGNCcmtMZXZlbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJ1bnRpbWUgbWFpbmxldmVsIG9mIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNYWluTGV2ZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9tYWluTGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBsZXZlbCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjTGV2ZWxcIj4nQycgPSBpbiBjb250cm9sLCAnUicgPSBpbiByZWNvcmQgKG91dCBvZiBjb250cm9sKSwgJ1QnID0gaW4gdGFzayAob3V0IG9mIHJlY29yZCkgICAgICAvLy8gPC9wYXJhbT5cclxuICBzZXRMZXZlbChjTGV2ZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fbGV2ZWwgPSBjTGV2ZWw7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xldmVsID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpXHJcbiAgICAgIHRoaXMuX2VudGVyZWRSZWNMZXZlbCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsZXZlbCBvZiB0aGUgdGFzazogJ0MnID0gaW4gY29udHJvbCwgJ1InID0gaW4gcmVjb3JkIChvdXQgb2YgY29udHJvbCksICdUJyA9IGluIHRhc2sgKG91dCBvZiByZWNvcmQpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMZXZlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgRGF0YVN5bmNlZCBwcm9wZXJ0eSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREYXRhU3luY2VkKHN5bmNlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgc2NoZW1lIGZvciBudWxsIGFyaXRobWV0aWNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE51bGxBcml0aG1ldGljKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbnVsbEFyaXRobWV0aWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBsYXN0IHBhcmtlZCBjb250cm9sIGluIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+bGFzdCBmb2N1c2VkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHNldExhc3RQYXJrZWRDdHJsKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xhc3RQYXJrZWRDdHJsID0gY3RybDtcclxuICAgIHRoaXMuX2N1cnJQYXJrZWRGbGQgPSAoKHRoaXMuX2xhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICA/IHRoaXMuX2xhc3RQYXJrZWRDdHJsLmdldEZpZWxkKClcclxuICAgICAgOiBudWxsKTtcclxuICAgIHRoaXMuQ3VycmVudEVkaXRpbmdDb250cm9sID0gY3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgY3VycmVudCBmaWVsZCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckZpZWxkKCk6IEd1aUZpZWxkQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclBhcmtlZEZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgY3VycmVudCBmaWVsZCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q3VyckZpZWxkKGN1cnJGaWVsZDogR3VpRmllbGRCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUGFya2VkRmxkID0gY3VyckZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaWVsZCBvZiB0aGUgY3VycmVudCBwYXJrZWQgY29udHJvbCBvciAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyRmllbGRJZHgoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9jdXJyUGFya2VkRmxkICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5fY3VyclBhcmtlZEZsZC5nZXRJZCgpO1xyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRCeVZhbHVlU3RyKHZhbHVlU3RyOiBzdHJpbmcpOiBGaWVsZERlZjtcclxuICBnZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZywgcGFyZW50OiBSZWZQYXJhbTxudW1iZXI+LCB2ZWU6IFJlZlBhcmFtPG51bWJlcj4pOiBGaWVsZERlZjtcclxuICBnZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZywgcGFyZW50PzogUmVmUGFyYW08bnVtYmVyPiwgdmVlPzogUmVmUGFyYW08bnVtYmVyPik6IEZpZWxkRGVmIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEJ5VmFsdWVTdHJfMCh2YWx1ZVN0cik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkQnlWYWx1ZVN0cl8xKHZhbHVlU3RyLCBwYXJlbnQsIHZlZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkQnlWYWx1ZVN0cl8wKHZhbHVlU3RyOiBzdHJpbmcpOiBGaWVsZERlZiB7XHJcbiAgICBsZXQgcGFyZW50OiBudW1iZXI7XHJcbiAgICBsZXQgdmVlOiBudW1iZXI7XHJcbiAgICBsZXQgcmVmUGFyZW50OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKHBhcmVudCk7XHJcbiAgICBsZXQgcmVmVmVlOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKHZlZSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEJ5VmFsdWVTdHJfMSh2YWx1ZVN0ciwgcmVmUGFyZW50LCByZWZWZWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGZpZWxkIGJ5ICd2YWx1ZVN0cidcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RmllbGRCeVZhbHVlU3RyXzEodmFsdWVTdHI6IHN0cmluZywgcGFyZW50OiBSZWZQYXJhbTxudW1iZXI+LCB2ZWU6IFJlZlBhcmFtPG51bWJlcj4pOiBGaWVsZERlZiB7XHJcbiAgICBwYXJlbnQudmFsdWUgPSB2ZWUudmFsdWUgPSAwO1xyXG4gICAgbGV0IHRlbXBGaWVsZDogRmllbGREZWYgPSBudWxsO1xyXG4gICAgbGV0IGNvbW1hOiBudW1iZXIgPSB2YWx1ZVN0ci5pbmRleE9mKFwiLFwiKTtcclxuICAgIGlmIChjb21tYSA+IDApIHtcclxuICAgICAgbGV0IHBhcmVudElkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cigwLCBjb21tYSkpO1xyXG4gICAgICBsZXQgZmxkSWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cihjb21tYSArIDEpKTtcclxuICAgICAgdGVtcEZpZWxkID0gKChwYXJlbnRJZCAhPT0gMClcclxuICAgICAgICA/IHRoaXMuZ2V0RmllbGREZWYocGFyZW50SWQsIGZsZElkeClcclxuICAgICAgICA6IHRoaXMuZ2V0RmllbGREZWYoZmxkSWR4KSk7XHJcbiAgICAgIHBhcmVudC52YWx1ZSA9IHBhcmVudElkO1xyXG4gICAgICB2ZWUudmFsdWUgPSBmbGRJZHg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcEZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGZpZWxkIGZyb20gYSAxLWJhc2VkIG1haW4gcHJvZyBhcmd1bWVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TWFpblByb2dGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZyk6IEZpZWxkRGVmIHtcclxuICAgIC8vIHN0cmluZyBpcyAxLWJhc2VkIC0gbmVlZCB0byBzdWJ0cmFjdCAxIHRvIGdldCB0byAwLWJhc2VkIHZhbHVlXHJcbiAgICBsZXQgZmxkSWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKSAtIDE7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWVsZERlZihmbGRJZHgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGREZWYoZmxkSWQ6IG51bWJlcik6IEZpZWxkRGVmO1xyXG4gIGdldEZpZWxkRGVmKHBhcmVudDogbnVtYmVyLCBmbGRJZHg6IG51bWJlcik6IEZpZWxkRGVmO1xyXG4gIGdldEZpZWxkRGVmKGZsZElkT3JQYXJlbnQ6IG51bWJlciwgZmxkSWR4PzogbnVtYmVyKTogRmllbGREZWYge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkXzAoZmxkSWRPclBhcmVudCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkXzEoZmxkSWRPclBhcmVudCwgZmxkSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCBieSBpdHMgaWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkXCI+aWQgb2YgdGhlIGZpZWxkIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZF8wKGZsZElkOiBudW1iZXIpOiBGaWVsZERlZiB7XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhVmlldy5nZXRGaWVsZChmbGRJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgdGFzaydzIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBJbml0Rm9ybSgpIHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwgJiYgdGhpcy5pc09wZW5XaW4oKSkge1xyXG4gICAgICB0aGlzLkZvcm0uSW5Jbml0Rm9ybSA9IHRydWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuRm9ybS5pbml0KCk7XHJcblxyXG5cclxuICAgICAgdGhpcy5TZXRSZWZyZXNoVHlwZShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheSgpO1xyXG5cclxuICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgdGhpcy5Gb3JtLkluSW5pdEZvcm0gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVzdW1lIHN1YmZvcm0gbGF5b3V0XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIFJlc3VtZVN1YmZvcm1MYXlvdXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBzdWJGb3JtQ3RybDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICBpZiAoc3ViRm9ybUN0cmwgIT09IG51bGwgJiYgdGhpcy5zaG91bGRSZXN1bWVTdWJmb3JtTGF5b3V0KSB7XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgdmlzaWJsZSBwcm9wZXJ0eVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgc3ViRm9ybUN0cmwsIDAsXHJcbiAgICAgICAgICAgSHRtbFByb3BlcnRpZXMuVmlzaWJsZSAsIHN1YkZvcm1DdHJsLmlzVmlzaWJsZSgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG91bGRSZXN1bWVTdWJmb3JtTGF5b3V0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sIHdoaWNoIHdhcyBsYXN0IHBhcmtlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXB0aFwiPnRoZSBnZW5lcmF0aW9uPC9wYXJhbT5cclxuICBHZXRMYXN0UGFya2VkQ3RybE5hbWUoZGVwdGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYW5jZXN0b3I6IEd1aVRhc2tCYXNlID0gPEd1aVRhc2tCYXNlPnRoaXMuR2V0VGFza0FuY2VzdG9yKGRlcHRoKTtcclxuICAgIGlmIChhbmNlc3RvciA9PT0gbnVsbCB8fCBhbmNlc3Rvci5fbGFzdFBhcmtlZEN0cmwgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgcmV0dXJuIGFuY2VzdG9yLl9sYXN0UGFya2VkQ3RybC5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgZm9ybSBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBGb3JtIGlzIHRoZSBmb3JtIG9mIHRoZSB0YXNrPC9yZXR1cm5zPlxyXG4gIGdldEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5Gb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgdGFzaydzIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IEZvcm0gaXMgdGhlIGZvcm0gb2YgdGhlIHRhc2s8L3JldHVybnM+XHJcbiAgU2V0Rm9ybSh2YWx1ZTogTWdGb3JtQmFzZSk6IE1nRm9ybUJhc2Uge1xyXG4gICAgdGhpcy5Gb3JtID0gdmFsdWU7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmRXhpc3RQcm9wKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGV4aXN0ID0gKHByb3AgIT09IG51bGwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV4aXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHRhc2sgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+SWQgb2YgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCB0aGVuIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBhbmQgZ2l2ZSBpdCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLLCB0aGlzKTtcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcHJvcC5TdHVkaW9WYWx1ZSA9IHByb3AuZ2V0T3JnVmFsdWUoKTtcclxuICAgICAgICAgIHRoaXMuX3Byb3BUYWIuYWRkUHJvcChwcm9wKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcbiAgR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGNvbXBvbmVudCBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgaXMgZmlyc3QgcmVmcmVzaFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKTogYm9vbGVhbiB7XHJcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhc3NlZCBJRC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+RXhwIElEPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+ZXhwZWN0ZWQgcmV0dXJuIHR5cGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbmd0aFwiPkV4cGVjdGVkIGxlbiAtIGlzIG5vdCB1c2VkLCBpdCBtdXN0IGJlIGhlcmUgYmVjYXVzZSBvZiBjb21wdXRhYmlsaXR5IHdpdGggUmljaCBDbGllbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPnNob3VsZCB0aGUgcmVzdWx0IGJlIHVuaWNvZGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhbHdheXNFdmFsdWF0ZVwiPmZvciBmb3JtIHByb3BlcnRpZXMgYW5kIHNvbWUgY29udHJvbCBwcm9wZXJ0aWVzIHdlIGFsd2F5cyBldmFsdWF0ZSBleHByZXNzaW9uczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwid2FzRXZhbHVhdGVkXCI+aW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gd2FzIGV2YWx1YXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmV2YWx1YXRlZCB2YWx1ZTwvcmV0dXJucz5cclxuICBhc3luYyBFdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIsIGNvbnRlbnRUeXBlVW5pY29kZTogYm9vbGVhbiwgcmVzQ2VsbFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGFsd2F5c0V2YWx1YXRlOiBib29sZWFuLCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICB3YXNFdmFsdWF0ZWQudmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoYWx3YXlzRXZhbHVhdGUgfHwgdGhpcy5EYXRhVmlld1dhc1JldHJpZXZlZCkge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkNhbGN1bGF0ZUV4cHJlc3Npb24oZXhwSWQsIHJlc1R5cGUsIGxlbmd0aCk7XHJcbiAgICAgIHdhc0V2YWx1YXRlZC52YWx1ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxjdWxhdGUgZXhwcmVzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPlRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+VGhlIGV4cGVjdGVkIHJlc3VsdCB0eXBlLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+VGhlIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0LjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVVbmljb2RlXCI+RGVub3RlcyB3aGV0aGVyIHRoZSByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgYSB1bmljb2RlIHN0cmluZy48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+Tm90IHVzZWQuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIENhbGN1bGF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz57XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjcmVhdGVzIGEgbWdmb3JtIG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhYnN0cmFjdCBDb25zdHJ1Y3RNZ0Zvcm0oYWxyZWFkeVNldFBhcmVudEZvcm06IFJlZlBhcmFtPGJvb2xlYW4+KTogTWdGb3JtQmFzZSA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaXMgc3RhcnRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGVsbHMgd2hldGhlciB0aGUgdGFzayBpcyBhYm9ydGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNBYm9ydGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGFuY2VzdG9yIG9mIHRoZSBHdWlUYXNrQmFzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+b2YgdGhlIGFuY2VzdG9yIHRhc2s8L3BhcmFtPlxyXG4gIGFic3RyYWN0IEdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uOiBudW1iZXIpOiBJVGFzaztcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGNvbnRleHQgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhYnN0cmFjdCBHZXRDb250ZXh0VGFzaygpOiBJVGFzaztcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRhc2sgZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWJzdHJhY3QgR2V0VGFza0RlcHRoKCk6IG51bWJlcjtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZWZyZXNoIHRoZSBkaXNwbGF5LCBwYWludCB0aGUgY29udHJvbHMgYW5kIHRoZWlyIHByb3BlcnRpZXMgYWdhaW4gPC9zdW1tYXJ5PlxyXG4gIGFic3RyYWN0IFJlZnJlc2hEaXNwbGF5KCk6IHZvaWQgO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLyBUT0RPIHNhZGhhbiByZW1vdmUgdW51c2VkXHJcbiAgLy8gYWJzdHJhY3QgYXN5bmMgZ2V0RmllbGRWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSBkaXNwbGF5IHZhbHVlIG9mIGEgZmllbGQuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYWJzdHJhY3QgZ2V0RmllbGREaXNwbGF5VmFsdWUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPik6IHZvaWQgO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IHVwZGF0ZXMgdGhlIGZpZWxkJ3MgdmFsdWUgYW5kIHN0YXJ0cyByZWNvbXB1dGUuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYWJzdHJhY3QgVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogdm9pZCA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgYSBmaWVsZCBmcm9tIHRoZSB0YXNrLnRyYXZlbCBieSBwYXJlbnRzIChpLmUuIE5PVCBieSB0cmlnZ2VyaW5nIHRhc2tzKS48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj5nZW5lcmF0aW9uIG51bWJlciAoMCBpcyBjdXJyZW50IHRhc2spPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBmaWVsZCBpbmRleCB3aXRoaW4gaXRzIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGlkIG9mIHRoZSBmaWVsZCBkZXNjcmliZWQgYnkgcGFyZW50ICsgaWR4PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RmllbGRfMShwYXJlbnQ6IG51bWJlciwgZmxkSWR4OiBudW1iZXIpOiBGaWVsZERlZiB7XHJcblxyXG4gICAgc3dpdGNoIChwYXJlbnQpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkRGVmKGZsZElkeCk7XHJcblxyXG4gICAgICBjYXNlIEd1aVRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRDpcclxuICAgICAgICAvLyBmaW5kIHRoZSBtYWluIHByb2dyYW0gdXNpbmcgdGhlIGNvbXBvbmVudCBpZCAoY3RsIGlkeClcclxuICAgICAgICBsZXQgY29tcE1haW5Qcm9nOiBHdWlUYXNrQmFzZSA9IDxHdWlUYXNrQmFzZT4gR3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgdGhpcy5fY3RsSWR4KTtcclxuICAgICAgICByZXR1cm4gY29tcE1haW5Qcm9nLmdldEZpZWxkRGVmKGZsZElkeCk7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHBhcmVudC0tO1xyXG4gICAgICAgIGlmICh0aGlzLlN0dWRpb1BhcmVudFRhc2sgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiB0aGlzLlN0dWRpb1BhcmVudFRhc2suZ2V0RmllbGREZWYocGFyZW50LCBmbGRJZHgpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBhdHRyaWJ1dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsQXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKSArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSy5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vucy5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShqKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShqICsgMSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlU3RyKSAmJiBFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJJbiBUYXNrQmFzZS5maWxsQXR0cmlidXRlcygpOiBVbnByb2Nlc3NlZCghKSBhdHRyaWJ1dGU6ICd7MH0nID0gJ3sxfSdcIiwgYXR0cmlidXRlLCB2YWx1ZVN0cikpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpICsgMSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQVBQTF9HVUlEOlxyXG4gICAgICAgIHRoaXMuQXBwbGljYXRpb25HdWlkID0gdmFsdWVTdHI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BST0dSQU1fSVNOOlxyXG4gICAgICAgIHRoaXMuUHJvZ3JhbUlzbiA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLX0lTTjpcclxuICAgICAgICB0aGlzLlRhc2tJc24gPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVE9PTEtJVF9QQVJFTlRfVEFTSzpcclxuICAgICAgICBpZiAoTk51bWJlci5QYXJzZSh2YWx1ZVN0cikgIT09IDApXHJcbiAgICAgICAgICB0aGlzLlN0dWRpb1BhcmVudFRhc2sgPSA8R3VpVGFza0Jhc2U+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0VGFza0J5SUQodmFsdWVTdHIpO1xyXG5cclxuICAgICAgICB0aGlzLklzU3VidGFzayA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRDpcclxuICAgICAgICB0aGlzLnNldFRhc2tJZCh2YWx1ZVN0cik7XHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhcIlRBU0s6IFwiICsgdGhpcy5fdGFza1RhZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NUTF9JRFg6XHJcbiAgICAgICAgdGhpcy5zZXRDdGxBbmRDb21wSWR4KHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUFJTlBSRzpcclxuICAgICAgICB0aGlzLnNldE1haW5QcmcodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OVUxMX0FSSVRITUVUSUM6XHJcbiAgICAgICAgdGhpcy5zZXROdWxsQXJpdGhtZXRpYyh2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSQUNUSVZFOlxyXG4gICAgICAgIHRoaXMuc2V0SXNJbnRlcmFjaXZlKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfT1BFTl9XSU46XHJcbiAgICAgICAgdGhpcy5zZXRPcGVuV2luKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQUxMT1dfRVZFTlRTOlxyXG4gICAgICAgIHRoaXMuU2V0QWxsb3dFdmVudHModmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU1BSRzpcclxuICAgICAgICB0aGlzLnNldElzUHJnKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUNPTl9GSUxFX05BTUU6XHJcbiAgICAgICAgdGhpcy5JY29uRmlsZU5hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BBUkFMTEVMOlxyXG4gICAgICAgIHRoaXMuSXNQYXJhbGxlbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUk9VVEVSX1BBVEg6XHJcbiAgICAgICAgaWYgKHZhbHVlU3RyLnRyaW0oKSAhPSBcIlwiKVxyXG4gICAgICAgICAgdGhpcy5yb3V0ZXJQYXRoID0gdmFsdWVTdHI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lOX0RFRkFVTFRfUk9VVEVSX09VVExFVDpcclxuICAgICAgICB0aGlzLmluRGVmYXVsdFJvdXRlck91dGxldCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNUYWdQcm9jZXNzZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXQgZGF0YSBmb3IgZm9ybSBhbmQgcmV0dXJuIHRoZSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3VuZFRhZ05hbWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudEZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgRm9ybUluaXREYXRhKHBhcmVudEZvcm06IE1nRm9ybUJhc2UpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCBhbHJlYWR5U2V0UGFyZW50Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlZkFscmVhZHlTZXRQYXJlbnRGb3JtOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShhbHJlYWR5U2V0UGFyZW50Rm9ybSk7XHJcblxyXG4gICAgaWYgKHRoaXMuRm9ybSA9PT0gbnVsbClcclxuICAgICAgdGhpcy5Gb3JtID0gdGhpcy5Db25zdHJ1Y3RNZ0Zvcm0ocmVmQWxyZWFkeVNldFBhcmVudEZvcm0pO1xyXG5cclxuICAgIGlmICghYWxyZWFkeVNldFBhcmVudEZvcm0pXHJcbiAgICAgIHRoaXMuRm9ybS5QYXJlbnRGb3JtID0gcGFyZW50Rm9ybTtcclxuXHJcbiAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coXCJmb3JtXCIpO1xyXG5cclxuICAgIHRoaXMuRm9ybS5maWxsRGF0YSh0aGlzKTtcclxuICAgIHJldHVybiB0aGlzLkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRhc2sgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFRhc2tJZCh2YWx1ZVN0cjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrVGFnID0gdmFsdWVTdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGN0bElkeCAmIGNvbXBJZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0Q3RsQW5kQ29tcElkeCh2YWx1ZVN0cjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gdmFsdWVTdHIuaW5kZXhPZihcIixcIik7XHJcbiAgICBpZiAoaSA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX2N0bElkeCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIuc3Vic3RyKDAsIGkpKTtcclxuICAgICAgdGhpcy5fY29tcElkeCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIuc3Vic3RyKGkgKyAxKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCBhbmNlc3RvciB0YXNrIGNvbnRhaW5pbmcgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPkd1aVRhc2tCYXNlPC9yZXR1cm5zPlxyXG4gIEdldEFuY2VzdG9yVGFza0NvbnRhaW5pbmdGb3JtKCk6IEd1aVRhc2tCYXNlIHtcclxuICAgIGxldCBwYXJlbnRUYXNrOiBHdWlUYXNrQmFzZSA9IDxHdWlUYXNrQmFzZT50aGlzLkdldFRhc2tBbmNlc3RvcigxKTtcclxuICAgIHdoaWxlIChwYXJlbnRUYXNrICE9PSBudWxsICYmIHBhcmVudFRhc2suZ2V0Rm9ybSgpID09PSBudWxsKSB7XHJcbiAgICAgIHBhcmVudFRhc2sgPSA8R3VpVGFza0Jhc2U+cGFyZW50VGFzay5HZXRUYXNrQW5jZXN0b3IoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBpc01haW5QcmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldE1haW5QcmcodmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5faXNNYWluUHJnID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgbnVsbEFyaXRobWV0aWNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldE51bGxBcml0aG1ldGljKHZhbHVlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX251bGxBcml0aG1ldGljID0gdmFsdWVTdHIuY2hhckF0KDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgaXNJbnRlcmFjdGl2ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0SXNJbnRlcmFjaXZlKHZhbHVlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuSXNJbnRlcmFjdGl2ZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IG9wZW5XaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldE9wZW5XaW4odmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3BlbldpbiA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IG9wZW5XaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBTZXRPcGVuV2luKHZhbHVlYm9vbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fb3BlbldpbiA9IHZhbHVlYm9vbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVN0clwiPjwvcGFyYW0+XHJcbiAgU2V0QWxsb3dFdmVudHModmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWxsb3dFdmVudHMgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBpc1ByZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0SXNQcmcodmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5faXNQcmcgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgfVxyXG5cclxuICBTaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYWJzdHJhY3QgR2V0VGFza0RldGFpbHMoKTogc3RyaW5nO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBTZXRzIHRoZSBtZXNzYWdlIG9uIHRoZSBtZXNzYWdlIHBhbmUgb2Ygc3RhdHVzIGJhci48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+bWVzc2FnZSB0byBiZSBzaG93bjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+dG8gYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFdyaXRlVG9NZXNzYWdlUGFuZShtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gU3RvcnkgMTQ5MzE2IDogc2VuZCBtZXNzYWdlIHRvIGNvbnNvbGVcclxuICAgIGlmIChtc2cgIT0gbnVsbClcclxuICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgd3JpdGUgYSBtZXNzYWdlIHRvIHN0YXR1cyBiYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXNnSWRcIj5pZCBvZiBtZXNzYWdlIHRvIGJlIHdyaXR0ZW48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNvdW5kQmVlcFwiPjwvcGFyYW0+XHJcbiAgV3JpdGVUb01lc3NhZ2VQYW5lYnlNc2dJZChtc2dJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbXNnOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhtc2dJZCk7XHJcbiAgICB0aGlzLldyaXRlVG9NZXNzYWdlUGFuZShtc2cpO1xyXG4gIH1cclxufVxyXG4iXX0=