@sapui5/sap.fe.test 1.104.1 → 1.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,414 +2,461 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/ui/model/odata/v4/ODataMetaModel"], function (ODataMetaModel) {
5
+ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/InternalEditFlow", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/SideEffects", "sap/ui/base/Event", "sap/ui/core/mvc/Controller", "sap/ui/core/mvc/View", "sap/ui/model/CompositeBinding", "sap/ui/model/odata/v4/Context", "sap/ui/model/odata/v4/ODataContextBinding", "sap/ui/model/odata/v4/ODataListBinding", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/ODataModel", "sap/ui/model/odata/v4/ODataPropertyBinding"], function (generic, EditFlow, InternalEditFlow, InternalRouting, SideEffects, Event, Controller, View, CompositeBinding, Context, ODataContextBinding, ODataListBinding, ODataMetaModel, ODataModel, ODataPropertyBinding) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
+ var mock = generic.mock;
9
10
 
10
- function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
11
-
12
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
13
-
14
- var MockContext = /*#__PURE__*/function () {
15
- function MockContext(oValues, oBinding) {
16
- var _this = this;
17
-
18
- this.isKeptAlive = false;
19
- this.getProperty = jest.fn(function (key) {
20
- return _this.oValues[key];
21
- });
22
- this.requestProperty = jest.fn(function (key) {
23
- return Promise.resolve(_this.oValues[key]);
24
- });
25
- this.setProperty = jest.fn(function (key, value) {
26
- _this.oValues[key] = value;
27
- return _this.oValues[key];
28
- });
29
- this.getObject = jest.fn(function (path) {
30
- var result = path ? _this.oValues[path] : _this.oValues;
31
-
32
- if (!result && path && path.indexOf("/") > -1) {
33
- var parts = path.split("/");
34
- result = parts.reduce(function (sum, part) {
35
- sum = part ? sum[part] : sum;
36
- return sum;
37
- }, _this.oValues);
38
- }
39
-
40
- return result;
41
- });
42
- this.getPath = jest.fn(function () {
43
- return _this.oValues["$path"];
44
- });
45
- this.getBinding = jest.fn(function () {
46
- return _this.oBinding;
47
- });
48
- this.getModel = jest.fn(function () {
49
- var _this$oBinding;
11
+ /**
12
+ * Factory function to create a new MockContext.
13
+ *
14
+ * @param oContextData A map of the different properties of the context. The value for the key '$path' will be returned by the 'getPath' method
15
+ * @param oBinding The binding of the context
16
+ * @param isInactive Is the context iniactive or not
17
+ * @returns A new MockContext
18
+ */
19
+ function createMockContext(oContextData, oBinding, isInactive) {
20
+ // Ugly workaround to get a proper mock pbject, as Context isn't properly exported from UI5
21
+ var mocked = mock(Object.getPrototypeOf(Context.createNewContext(null, null, "/e")));
22
+ mocked._isKeptAlive = false;
23
+ mocked._contextData = oContextData || {};
24
+ mocked._oBinding = oBinding;
25
+ mocked._isInactive = !!isInactive; // Default behavior
26
+
27
+ mocked.mock.isA.mockImplementation(function (sClassName) {
28
+ return sClassName === "sap.ui.model.odata.v4.Context";
29
+ });
30
+ mocked.mock.getProperty.mockImplementation(function (key) {
31
+ return mocked._contextData[key];
32
+ });
33
+ mocked.mock.requestProperty.mockImplementation(function (key) {
34
+ return Promise.resolve(mocked._contextData[key]);
35
+ });
36
+ mocked.mock.requestObject.mockImplementation(function (key) {
37
+ return Promise.resolve(mocked._contextData[key]);
38
+ });
39
+ mocked.mock.setProperty.mockImplementation(function (key, value) {
40
+ mocked._contextData[key] = value;
41
+ return mocked._contextData[key];
42
+ });
43
+ mocked.mock.getObject.mockImplementation(function (path) {
44
+ var result = path ? mocked._contextData[path] : mocked._contextData;
45
+
46
+ if (!result && path && path.indexOf("/") > -1) {
47
+ var parts = path.split("/");
48
+ result = parts.reduce(function (sum, part) {
49
+ sum = part ? sum[part] : sum;
50
+ return sum;
51
+ }, mocked._contextData);
52
+ }
50
53
 
51
- return (_this$oBinding = _this.oBinding) === null || _this$oBinding === void 0 ? void 0 : _this$oBinding.getModel();
52
- });
53
- this.isTransient = jest.fn();
54
- this.setKeepAlive = jest.fn(function (bool, _fnOnBeforeDestroy, _bRequestMessages) {
55
- _this.isKeptAlive = bool;
56
- });
57
- this.isKeepAlive = jest.fn(function () {
58
- return _this.isKeptAlive;
59
- });
60
- this.requestSideEffects = jest.fn();
61
- this.requestObject = jest.fn();
62
- this.oValues = oValues;
63
- this.oBinding = oBinding;
64
- }
54
+ return result;
55
+ });
56
+ mocked.mock.getPath.mockImplementation(function () {
57
+ return mocked._contextData["$path"];
58
+ });
59
+ mocked.mock.getBinding.mockImplementation(function () {
60
+ return mocked._oBinding;
61
+ });
62
+ mocked.mock.getModel.mockImplementation(function () {
63
+ var _mocked$_oBinding;
65
64
 
66
- _exports.MockContext = MockContext;
67
- var _proto = MockContext.prototype;
65
+ return (_mocked$_oBinding = mocked._oBinding) === null || _mocked$_oBinding === void 0 ? void 0 : _mocked$_oBinding.getModel();
66
+ });
67
+ mocked.mock.setKeepAlive.mockImplementation(function (bool, _fnOnBeforeDestroy, _bRequestMessages) {
68
+ mocked._isKeptAlive = bool;
69
+ });
70
+ mocked.mock.isKeepAlive.mockImplementation(function () {
71
+ return mocked._isKeptAlive;
72
+ });
73
+ mocked.mock.isInactive.mockImplementation(function () {
74
+ return mocked._isInactive;
75
+ });
76
+ return mocked;
77
+ }
78
+ /**
79
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockContext instead.
80
+ */
68
81
 
69
- _proto.isA = function isA(sClassName) {
70
- return sClassName === "sap.ui.model.odata.v4.Context";
71
- };
72
82
 
73
- return MockContext;
74
- }();
83
+ _exports.createMockContext = createMockContext;
84
+ var MockContext = createMockContext;
85
+ /**
86
+ * Utility type to mock a sap.ui.base.Event
87
+ */
75
88
 
76
89
  _exports.MockContext = MockContext;
77
90
 
78
- var MockUI5Element = function MockUI5Element() {
79
- this.bindingContext = new MockContext({});
80
- this.getBinding = jest.fn();
81
- this.getBindingContext = jest.fn().mockReturnValue(this.bindingContext);
82
- this.getBindingInfo = jest.fn();
83
- this.data = jest.fn();
84
- this.getModel = jest.fn();
85
- this.getParent = jest.fn();
86
- };
87
-
88
- _exports.MockUI5Element = MockUI5Element;
91
+ /**
92
+ * Factory function to create a new MockEvent.
93
+ *
94
+ * @param params The parameters of the event
95
+ * @returns A new MockEvent
96
+ */
97
+ function createMockEvent(params) {
98
+ var mocked = mock(Event);
99
+ mocked._params = params || {}; // Default behavior
89
100
 
90
- var MockControl = /*#__PURE__*/function (_MockUI5Element) {
91
- _inheritsLoose(MockControl, _MockUI5Element);
101
+ mocked.mock.getParameter.mockImplementation(function (name) {
102
+ return mocked._params[name];
103
+ });
104
+ return mocked;
105
+ }
106
+ /**
107
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockEvent instead.
108
+ */
92
109
 
93
- function MockControl() {
94
- var _this2;
95
110
 
96
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
97
- args[_key] = arguments[_key];
98
- }
111
+ _exports.createMockEvent = createMockEvent;
112
+ var MockEvent = createMockEvent;
113
+ /**
114
+ * Utility type to mock a sap.ui.model.odata.v4.ODataListBinding
115
+ */
99
116
 
100
- _this2 = _MockUI5Element.call.apply(_MockUI5Element, [this].concat(args)) || this;
101
- _this2.getBindingContext = jest.fn();
102
- _this2.getModel = jest.fn();
103
- return _this2;
104
- }
117
+ _exports.MockEvent = MockEvent;
105
118
 
106
- _exports.MockControl = MockControl;
107
- return MockControl;
108
- }(MockUI5Element);
119
+ /**
120
+ * Factory function to create a new MockListBinding.
121
+ *
122
+ * @param aContextData An array of objects holding the different properties of the contexts referenced by the ListBinding
123
+ * @param oMockModel The model of the ListBinding
124
+ * @returns A new MockListBinding
125
+ */
126
+ function createMockListBinding(aContextData, oMockModel) {
127
+ var mocked = mock(ODataListBinding);
128
+ aContextData = aContextData || [];
129
+ mocked._aMockContexts = aContextData.map(function (contextData) {
130
+ return createMockContext(contextData, mocked);
131
+ });
132
+ mocked._mockModel = oMockModel; // Utility API
109
133
 
110
- _exports.MockControl = MockControl;
134
+ mocked.setModel = function (model) {
135
+ mocked._mockModel = model;
136
+ }; // Default behavior
111
137
 
112
- var MockEvent = function MockEvent() {
113
- var _this3 = this;
114
138
 
115
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
116
- var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new MockUI5Element();
117
- this.getParameter = jest.fn(function (name) {
118
- return _this3.params[name];
139
+ mocked.mock.isA.mockImplementation(function (sClassName) {
140
+ return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
141
+ });
142
+ mocked.mock.requestContexts.mockImplementation(function () {
143
+ return Promise.resolve(mocked._aMockContexts);
119
144
  });
120
- this.getSource = jest.fn(function () {
121
- return _this3.source;
145
+ mocked.mock.getCurrentContexts.mockImplementation(function () {
146
+ return mocked._aMockContexts;
122
147
  });
123
- this.params = params;
124
- this.source = source;
125
- };
148
+ mocked.mock.getAllCurrentContexts.mockImplementation(function () {
149
+ return mocked._aMockContexts;
150
+ });
151
+ mocked.mock.getModel.mockImplementation(function () {
152
+ return mocked._mockModel;
153
+ });
154
+ mocked.mock.getUpdateGroupId.mockReturnValue("auto");
155
+ return mocked;
156
+ }
126
157
  /**
127
- * Mock class for OData V4 ListBinding
158
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockListBinding instead.
128
159
  */
129
160
 
130
161
 
131
- _exports.MockEvent = MockEvent;
132
-
133
- var MockListBinding = /*#__PURE__*/function () {
134
- function MockListBinding(aContexts, mockModel) {
135
- var _this4 = this;
136
-
137
- this.setAggregation = jest.fn();
138
- this.filter = jest.fn();
139
- this.sort = jest.fn();
140
- this.getQueryOptionsFromParameters = jest.fn();
141
- this.getPath = jest.fn();
142
- this.isSuspended = jest.fn();
143
- this.resume = jest.fn();
144
- this.refresh = jest.fn();
145
- this.suspend = jest.fn();
146
- this.requestContexts = jest.fn(function () {
147
- return Promise.resolve(_this4.aMockContexts);
148
- });
149
- this.getCurrentContexts = jest.fn(function () {
150
- return _this4.aMockContexts;
151
- });
152
- this.getModel = jest.fn(function () {
153
- return _this4.mockModel;
154
- });
155
- this.getUpdateGroupId = jest.fn(function () {
156
- return "auto";
157
- });
158
- this.mockModel = mockModel;
159
- aContexts = aContexts || [];
160
- this.aMockContexts = aContexts.map(function (context) {
161
- return new MockContext(context, _this4);
162
- });
163
- }
164
-
165
- _exports.MockListBinding = MockListBinding;
166
- var _proto2 = MockListBinding.prototype;
167
-
168
- _proto2.isA = function isA(sClassName) {
169
- return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
170
- };
171
-
172
- _proto2.setModel = function setModel(oModel) {
173
- this.mockModel = oModel;
174
- } // Mocked API
175
- ;
176
-
177
- return MockListBinding;
178
- }();
162
+ _exports.createMockListBinding = createMockListBinding;
163
+ var MockListBinding = createMockListBinding;
164
+ /**
165
+ * Utility type to mock a sap.ui.model.odata.v4.ODataPropertyBinding
166
+ */
179
167
 
180
168
  _exports.MockListBinding = MockListBinding;
181
169
 
182
- var MockPropertyBinding = /*#__PURE__*/function () {
183
- function MockPropertyBinding(mockModel, mockPath) {
184
- var _this5 = this;
185
-
186
- this.getModel = jest.fn(function () {
187
- return _this5.mockModel;
188
- });
189
- this.getPath = jest.fn(function () {
190
- return _this5.mockPath;
191
- });
192
- this.getValue = jest.fn(function () {
193
- var _this5$mockModel;
194
-
195
- return _this5 === null || _this5 === void 0 ? void 0 : (_this5$mockModel = _this5.mockModel) === null || _this5$mockModel === void 0 ? void 0 : _this5$mockModel.getProperty("/".concat(_this5.mockPath));
196
- });
197
- this.setModel(mockModel);
198
- this.setPath(mockPath);
199
- }
200
-
201
- _exports.MockPropertyBinding = MockPropertyBinding;
202
- var _proto3 = MockPropertyBinding.prototype;
170
+ /**
171
+ * Factory function to create a new MockPropertyBinding.
172
+ *
173
+ * @param value The value returnd by the PropertyBinding
174
+ * @param path The path of the PropertyBinding
175
+ * @param oMockModel The model of the PropertyBinding
176
+ * @returns A new MockPropertyBinding
177
+ */
178
+ function createMockPropertyBinding(value, path, oMockModel) {
179
+ var mocked = mock(ODataPropertyBinding);
180
+ mocked._mockModel = oMockModel;
181
+ mocked._value = value;
182
+ mocked._path = path; // Default behavior
203
183
 
204
- _proto3.isA = function isA(sClassName) {
184
+ mocked.mock.isA.mockImplementation(function (sClassName) {
205
185
  return sClassName === "sap/ui/model/odata/v4/ODataPropertyBinding";
206
- };
207
-
208
- _proto3.setModel = function setModel(oModel) {
209
- this.mockModel = oModel;
210
- };
186
+ });
187
+ mocked.mock.getModel.mockImplementation(function () {
188
+ return mocked._mockModel;
189
+ });
190
+ mocked.mock.getValue.mockImplementation(function () {
191
+ return mocked._value;
192
+ });
193
+ mocked.mock.getPath.mockImplementation(function () {
194
+ return mocked._path;
195
+ });
196
+ return mocked;
197
+ }
198
+ /**
199
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockPropertyBinding instead.
200
+ */
211
201
 
212
- _proto3.setPath = function setPath(path) {
213
- this.mockPath = path ? path : "";
214
- };
215
202
 
216
- return MockPropertyBinding;
217
- }();
203
+ _exports.createMockPropertyBinding = createMockPropertyBinding;
204
+ var MockPropertyBinding = createMockPropertyBinding;
205
+ /**
206
+ * Utility type to mock a sap.ui.model.CompositeBinding
207
+ */
218
208
 
219
209
  _exports.MockPropertyBinding = MockPropertyBinding;
220
210
 
221
- var MockCompositeBinding = /*#__PURE__*/function () {
222
- function MockCompositeBinding(aBindings) {
223
- var _this6 = this;
211
+ /**
212
+ * Factory function to create a new MockCompositeBinding.
213
+ *
214
+ * @param aBindings The bindings of the CompositeBinding
215
+ * @returns A new MockCompositeBinding
216
+ */
217
+ function createMockCompositeBinding(aBindings) {
218
+ var mocked = mock(CompositeBinding);
219
+ mocked._aBindings = aBindings; // Default behavior
224
220
 
225
- this.getBindings = jest.fn(function () {
226
- return _this6.aBindings;
227
- });
228
- this.getValue = jest.fn(function () {
229
- return _this6.aBindings.map(function (binding) {
230
- return binding.getValue();
231
- });
221
+ mocked.mock.isA.mockImplementation(function (sClassName) {
222
+ return sClassName === "sap.ui.model.CompositeBinding";
223
+ });
224
+ mocked.mock.getBindings.mockImplementation(function () {
225
+ return mocked._aBindings;
226
+ });
227
+ mocked.mock.getValue.mockImplementation(function () {
228
+ return mocked._aBindings.map(function (binding) {
229
+ return binding.getValue();
232
230
  });
233
- this.aBindings = aBindings;
234
- }
231
+ });
232
+ return mocked;
233
+ }
234
+ /**
235
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockCompositeBinding instead.
236
+ */
235
237
 
236
- _exports.MockCompositeBinding = MockCompositeBinding;
237
- var _proto4 = MockCompositeBinding.prototype;
238
238
 
239
- _proto4.isA = function isA(sClassName) {
240
- return sClassName === "sap.ui.model.CompositeBinding";
241
- };
242
-
243
- return MockCompositeBinding;
244
- }();
239
+ _exports.createMockCompositeBinding = createMockCompositeBinding;
240
+ var MockCompositeBinding = createMockCompositeBinding;
241
+ /**
242
+ * Utility type to mock a sap.ui.model.odata.v4.ODataContextBinding
243
+ */
245
244
 
246
245
  _exports.MockCompositeBinding = MockCompositeBinding;
247
246
 
248
- var MockContextBinding = /*#__PURE__*/function () {
249
- function MockContextBinding(oContext, mockModel) {
250
- var _this7 = this;
251
-
252
- this.isKeptAlive = false;
253
- this.getBoundContext = jest.fn(function () {
254
- return _this7.oMockContext;
255
- });
256
- this.attachEventOnce = jest.fn();
257
- this.getModel = jest.fn(function () {
258
- return _this7.mockModel;
259
- });
260
- this.setParameter = jest.fn();
261
- this.execute = jest.fn().mockResolvedValue(true);
262
- this.getGroupId = jest.fn();
263
- this.mockModel = mockModel;
264
- this.oMockContext = new MockContext(oContext || {}, this);
265
- }
266
-
267
- _exports.MockContextBinding = MockContextBinding;
268
- var _proto5 = MockContextBinding.prototype;
247
+ /**
248
+ * Factory function to create a new MockContextBinding.
249
+ *
250
+ * @param oContext The context of the ContextBinding
251
+ * @param oMockModel The model of the ContextBinding
252
+ * @returns A new MockContextBinding
253
+ */
254
+ function createMockContextBinding(oContext, oMockModel) {
255
+ var mocked = mock(ODataContextBinding);
256
+ mocked.mockModel = oMockModel;
257
+ mocked.oMockContext = createMockContext(oContext || {}, mocked); // Utility API
269
258
 
270
- _proto5.isA = function isA(sClassName) {
271
- return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
259
+ mocked.getInternalMockContext = function () {
260
+ return mocked.oMockContext;
272
261
  };
273
262
 
274
- _proto5.getInternalMockContext = function getInternalMockContext() {
275
- return this.oMockContext;
276
- };
263
+ mocked.setModel = function (oModel) {
264
+ mocked.mockModel = oModel;
265
+ }; // Default behavior
277
266
 
278
- _proto5.setModel = function setModel(oModel) {
279
- this.mockModel = oModel;
280
- } // Mocked API
281
- ;
282
267
 
283
- return MockContextBinding;
284
- }();
268
+ mocked.mock.isA.mockImplementation(function (sClassName) {
269
+ return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
270
+ });
271
+ mocked.mock.getBoundContext.mockImplementation(function () {
272
+ return mocked.oMockContext;
273
+ });
274
+ mocked.mock.getModel.mockImplementation(function () {
275
+ return mocked.mockModel;
276
+ });
277
+ mocked.mock.execute.mockResolvedValue(true);
278
+ return mocked;
279
+ }
285
280
  /**
286
- * Mock class for OData V4 MetaModel
281
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockContextBinding instead.
287
282
  */
288
283
 
289
284
 
285
+ _exports.createMockContextBinding = createMockContextBinding;
286
+ var MockContextBinding = createMockContextBinding;
287
+ /**
288
+ * Utility type to mock a sap.ui.model.odata.v4.ODataMetaModel
289
+ */
290
+
290
291
  _exports.MockContextBinding = MockContextBinding;
291
292
 
292
- var MockMetaModel = function MockMetaModel(oMetaData) {
293
- var _this8 = this;
293
+ /**
294
+ * Factory function to create a new MockMetaModel.
295
+ *
296
+ * @param oMetaData A map of the different metadata properties of the MetaModel (path -> value).
297
+ * @returns A new MockMetaModel
298
+ */
299
+ function createMockMetaModel(oMetaData) {
300
+ var mocked = mock(ODataMetaModel);
301
+ mocked.oMetaContext = createMockContext(oMetaData || {}); // Default behavior
294
302
 
295
- this.getMetaContext = jest.fn(function (sPath) {
296
- return new MockContext({
303
+ mocked.mock.getMetaContext.mockImplementation(function (sPath) {
304
+ return createMockContext({
297
305
  $path: sPath
298
306
  });
299
307
  });
300
- this.getObject = jest.fn(function (sPath) {
301
- return _this8.oMetaContext.getProperty(sPath);
308
+ mocked.mock.getObject.mockImplementation(function (sPath) {
309
+ return mocked.oMetaContext.getProperty(sPath);
302
310
  });
303
- this.requestObject = jest.fn();
304
- this.createBindingContext = jest.fn(function (sPath) {
305
- return new MockContext({
311
+ mocked.mock.createBindingContext.mockImplementation(function (sPath) {
312
+ return createMockContext({
306
313
  $path: sPath
307
314
  });
308
315
  });
309
- this.getMetaPath = jest.fn(function (sPath) {
316
+ mocked.mock.getMetaPath.mockImplementation(function (sPath) {
310
317
  var metamodel = new ODataMetaModel();
311
318
  return sPath ? metamodel.getMetaPath(sPath) : sPath;
312
319
  });
313
- this.getContext = jest.fn();
314
- this.oMetaContext = new MockContext(oMetaData || {});
315
- } // Mocked API
316
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
317
- ;
320
+ return mocked;
321
+ }
318
322
  /**
319
- * Mock class for OData V4 Model
323
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockMetaModel instead.
320
324
  */
321
325
 
322
326
 
323
- _exports.MockMetaModel = MockMetaModel;
327
+ _exports.createMockMetaModel = createMockMetaModel;
328
+ var MockMetaModel = createMockMetaModel;
329
+ /**
330
+ * Utility type to mock a sap.ui.model.odata.v4.ODataModel
331
+ */
324
332
 
325
- var MockModel = /*#__PURE__*/function () {
326
- function MockModel(mockListBinding, mockContextBinding) {
327
- var _this9 = this;
333
+ _exports.MockMetaModel = MockMetaModel;
328
334
 
329
- this.bindList = jest.fn(function () {
330
- return _this9.mockListBinding;
331
- });
332
- this.bindContext = jest.fn(function () {
333
- return _this9.mockContextBinding;
334
- });
335
- this.getMetaModel = jest.fn(function () {
336
- return _this9.oMetaModel;
337
- });
338
- this.getProperty = jest.fn();
339
- this.setProperty = jest.fn();
340
- this.requestObject = jest.fn();
341
- this.getKeepAliveContext = jest.fn();
342
- this.mockListBinding = mockListBinding;
343
- this.mockContextBinding = mockContextBinding;
344
-
345
- if (mockListBinding) {
346
- mockListBinding.setModel(this);
347
- }
335
+ /**
336
+ * Factory function to create a new MockModel.
337
+ *
338
+ * @param oMockListBinding A list binding that will be returned when calling bindList.
339
+ * @param oMockContextBinding A context binding that will be returned when calling bindContext.
340
+ * @returns A new MockModel
341
+ */
342
+ function createMockModel(oMockListBinding, oMockContextBinding) {
343
+ var mocked = mock(ODataModel);
344
+ mocked.mockListBinding = oMockListBinding;
345
+ mocked.mockContextBinding = oMockContextBinding;
348
346
 
349
- if (mockContextBinding) {
350
- mockContextBinding.setModel(this);
351
- }
352
- } // Factories
347
+ if (oMockListBinding) {
348
+ oMockListBinding.setModel(mocked);
349
+ }
353
350
 
351
+ if (oMockContextBinding) {
352
+ oMockContextBinding.setModel(mocked);
353
+ } // Utility API
354
354
 
355
- _exports.MockModel = MockModel;
356
355
 
357
- MockModel.modelFromListBinding = function modelFromListBinding(mockListBinding) {
358
- return new MockModel(mockListBinding);
359
- };
356
+ mocked.setMetaModel = function (oMetaModel) {
357
+ mocked.oMetaModel = oMetaModel;
358
+ }; // Default behavior
360
359
 
361
- MockModel.modelFromContextBinding = function modelFromContextBinding(mockContextBinding) {
362
- return new MockModel(undefined, mockContextBinding);
363
- };
364
360
 
365
- var _proto6 = MockModel.prototype;
361
+ mocked.mock.bindList.mockImplementation(function () {
362
+ return mocked.mockListBinding;
363
+ });
364
+ mocked.mock.bindContext.mockImplementation(function () {
365
+ return mocked.mockContextBinding;
366
+ });
367
+ mocked.mock.getMetaModel.mockImplementation(function () {
368
+ return mocked.oMetaModel;
369
+ });
370
+ return mocked;
371
+ }
372
+ /**
373
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockModel instead.
374
+ */
366
375
 
367
- _proto6.setMetaModel = function setMetaModel(oMetaModel) {
368
- this.oMetaModel = oMetaModel;
369
- } // Mocked API
370
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
371
- ;
372
376
 
373
- return MockModel;
374
- }();
377
+ _exports.createMockModel = createMockModel;
378
+ var MockModel = createMockModel;
379
+ /**
380
+ * Factory function to create a new MockModel used with a listBinding.
381
+ *
382
+ * @param oMockListBinding A list binding that will be returned when calling bindList.
383
+ * @returns A new MockModel
384
+ */
375
385
 
376
386
  _exports.MockModel = MockModel;
377
387
 
378
- var MockView = /*#__PURE__*/function () {
379
- function MockView() {
380
- this.getController = jest.fn();
381
- this.getBindingContext = jest.fn();
382
- this.getModel = jest.fn();
383
- this.getViewData = jest.fn();
384
- this.getId = jest.fn();
385
- }
388
+ function createMockModelFromListBinding(oMockListBinding) {
389
+ return createMockModel(oMockListBinding);
390
+ }
391
+ /**
392
+ * Factory function to create a new MockModel used with a contextBinding.
393
+ *
394
+ * @param oMockContextBinding A context binding that will be returned when calling bindContext.
395
+ * @returns A new MockModel
396
+ */
397
+
398
+
399
+ _exports.createMockModelFromListBinding = createMockModelFromListBinding;
400
+
401
+ function createMockModelFromContextBinding(oMockContextBinding) {
402
+ return createMockModel(undefined, oMockContextBinding);
403
+ }
404
+ /**
405
+ * Utility type to mock a sap.ui.core.mvc.View
406
+ */
407
+
408
+
409
+ _exports.createMockModelFromContextBinding = createMockModelFromContextBinding;
386
410
 
387
- _exports.MockView = MockView;
388
- var _proto7 = MockView.prototype;
411
+ /**
412
+ * Factory function to create a new MockView.
413
+ *
414
+ * @returns A new MockView
415
+ */
416
+ function createMockView() {
417
+ var mocked = mock(View); // Default behavior
389
418
 
390
- _proto7.isA = function isA(sClassName) {
419
+ mocked.mock.isA.mockImplementation(function (sClassName) {
391
420
  return sClassName === "sap.ui.core.mvc.View";
392
- };
421
+ });
422
+ return mocked;
423
+ }
424
+ /**
425
+ * For compatibility reasons, we keep a new operator. Use the factory function createMockView instead.
426
+ */
427
+
393
428
 
394
- return MockView;
395
- }();
429
+ _exports.createMockView = createMockView;
430
+ var MockView = createMockView;
431
+ /**
432
+ * Utility type to mock a sap.fe.core.PageController
433
+ */
396
434
 
397
435
  _exports.MockView = MockView;
398
436
 
399
- var MockController = function MockController() {
400
- this.getView = jest.fn().mockReturnValue(new MockView());
401
- this._routing = {
402
- navigateToTarget: jest.fn()
403
- };
404
- this._editFlow = {
405
- syncTask: jest.fn()
406
- };
407
- this._sideEffects = {
408
- handleFieldChange: jest.fn()
409
- };
410
- this.isA = jest.fn().mockReturnValue(false);
411
- };
437
+ /**
438
+ * Factory function to create a new MockController.
439
+ *
440
+ * @returns A new MockController
441
+ */
442
+ function createMockController() {
443
+ var mocked = mock(Controller);
444
+ mocked._routing = mock(InternalRouting);
445
+ mocked._editFlow = mock(InternalEditFlow);
446
+ mocked._sideEffects = mock(SideEffects);
447
+ mocked.editFlow = mock(EditFlow); // Default Behavior
448
+
449
+ mocked.mock.getView.mockReturnValue(createMockView());
450
+ mocked.mock.isA.mockReturnValue(false);
451
+ return mocked;
452
+ }
453
+ /**
454
+ * For compatibility reasons, we keep a new operator. Use the factory function mockController instead.
455
+ */
456
+
412
457
 
458
+ _exports.createMockController = createMockController;
459
+ var MockController = createMockController;
413
460
  _exports.MockController = MockController;
414
461
 
415
462
  /**
@@ -419,12 +466,12 @@ sap.ui.define(["sap/ui/model/odata/v4/ODataMetaModel"], function (ODataMetaModel
419
466
  * @returns Mocked model, view and controller instances
420
467
  */
421
468
  function mockMVC(existing) {
422
- var model = (existing === null || existing === void 0 ? void 0 : existing.model) || new MockModel();
423
- var view = (existing === null || existing === void 0 ? void 0 : existing.view) || new MockView();
424
- var controller = (existing === null || existing === void 0 ? void 0 : existing.controller) || new MockController();
425
- view.getController.mockReturnValue(controller);
426
- view.getModel.mockReturnValue(model);
427
- controller.getView.mockReturnValue(view);
469
+ var model = (existing === null || existing === void 0 ? void 0 : existing.model) || createMockModel();
470
+ var view = (existing === null || existing === void 0 ? void 0 : existing.view) || createMockView();
471
+ var controller = (existing === null || existing === void 0 ? void 0 : existing.controller) || createMockController();
472
+ view.mock.getController.mockReturnValue(controller);
473
+ view.mock.getModel.mockReturnValue(model);
474
+ controller.mock.getView.mockReturnValue(view);
428
475
  return {
429
476
  model: model,
430
477
  view: view,
@@ -435,4 +482,4 @@ sap.ui.define(["sap/ui/model/odata/v4/ODataMetaModel"], function (ODataMetaModel
435
482
  _exports.mockMVC = mockMVC;
436
483
  return _exports;
437
484
  }, false);
438
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJpc0tlcHRBbGl2ZSIsImdldFByb3BlcnR5IiwiamVzdCIsImZuIiwia2V5IiwicmVxdWVzdFByb3BlcnR5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJpc1RyYW5zaWVudCIsInNldEtlZXBBbGl2ZSIsImJvb2wiLCJfZm5PbkJlZm9yZURlc3Ryb3kiLCJfYlJlcXVlc3RNZXNzYWdlcyIsImlzS2VlcEFsaXZlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwicmVxdWVzdE9iamVjdCIsImlzQSIsInNDbGFzc05hbWUiLCJNb2NrVUk1RWxlbWVudCIsImJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJtb2NrUmV0dXJuVmFsdWUiLCJnZXRCaW5kaW5nSW5mbyIsImRhdGEiLCJnZXRQYXJlbnQiLCJNb2NrQ29udHJvbCIsIk1vY2tFdmVudCIsInBhcmFtcyIsInNvdXJjZSIsImdldFBhcmFtZXRlciIsIm5hbWUiLCJnZXRTb3VyY2UiLCJNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dHMiLCJtb2NrTW9kZWwiLCJzZXRBZ2dyZWdhdGlvbiIsImZpbHRlciIsInNvcnQiLCJnZXRRdWVyeU9wdGlvbnNGcm9tUGFyYW1ldGVycyIsImlzU3VzcGVuZGVkIiwicmVzdW1lIiwicmVmcmVzaCIsInN1c3BlbmQiLCJyZXF1ZXN0Q29udGV4dHMiLCJhTW9ja0NvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm1hcCIsImNvbnRleHQiLCJzZXRNb2RlbCIsIm9Nb2RlbCIsIk1vY2tQcm9wZXJ0eUJpbmRpbmciLCJtb2NrUGF0aCIsImdldFZhbHVlIiwic2V0UGF0aCIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiYUJpbmRpbmdzIiwiZ2V0QmluZGluZ3MiLCJiaW5kaW5nIiwiTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJvTW9ja0NvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJzZXRQYXJhbWV0ZXIiLCJleGVjdXRlIiwibW9ja1Jlc29sdmVkVmFsdWUiLCJnZXRHcm91cElkIiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIk1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJnZXRNZXRhQ29udGV4dCIsInNQYXRoIiwiJHBhdGgiLCJvTWV0YUNvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImdldE1ldGFQYXRoIiwibWV0YW1vZGVsIiwiT0RhdGFNZXRhTW9kZWwiLCJnZXRDb250ZXh0IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwiYmluZExpc3QiLCJiaW5kQ29udGV4dCIsImdldE1ldGFNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwibW9kZWxGcm9tTGlzdEJpbmRpbmciLCJtb2RlbEZyb21Db250ZXh0QmluZGluZyIsInVuZGVmaW5lZCIsInNldE1ldGFNb2RlbCIsIk1vY2tWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFZpZXdEYXRhIiwiZ2V0SWQiLCJNb2NrQ29udHJvbGxlciIsImdldFZpZXciLCJfcm91dGluZyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJfZWRpdEZsb3ciLCJzeW5jVGFzayIsIl9zaWRlRWZmZWN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwibW9ja01WQyIsImV4aXN0aW5nIiwibW9kZWwiLCJ2aWV3IiwiY29udHJvbGxlciJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztNQWVhQSxXO0FBRVoseUJB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Q2QsYUFBTCxDQUFtQnhFLGVBQW5CLENBQW1DdUYsVUFBbkM7QUFDQUQsSUFBQUEsSUFBSSxDQUFDcEcsUUFBTCxDQUFjYyxlQUFkLENBQThCcUYsS0FBOUI7QUFDQUUsSUFBQUEsVUFBVSxDQUFDWCxPQUFYLENBQW1CNUUsZUFBbkIsQ0FBbUNzRixJQUFuQztBQUVBLFdBQU87QUFBRUQsTUFBQUEsS0FBSyxFQUFMQSxLQUFGO0FBQVNDLE1BQUFBLElBQUksRUFBSkEsSUFBVDtBQUFlQyxNQUFBQSxVQUFVLEVBQVZBO0FBQWYsS0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vY2sgY2xhc3MgZm9yIGEgVjQgQ29udGV4dFxuICovXG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHByaXZhdGUgaXNLZXB0QWxpdmUgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlcz86IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyByZXF1ZXN0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vVmFsdWVzW2tleV0pO1xuXHR9KTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcblx0XHR0aGlzLm9WYWx1ZXNba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHBhdGg6IHN0cmluZykgPT4ge1xuXHRcdGxldCByZXN1bHQgPSBwYXRoID8gdGhpcy5vVmFsdWVzW3BhdGhdIDogdGhpcy5vVmFsdWVzO1xuXG5cdFx0aWYgKCFyZXN1bHQgJiYgcGF0aCAmJiBwYXRoLmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRyZXN1bHQgPSBwYXJ0cy5yZWR1Y2UoKHN1bSwgcGFydDogYW55KSA9PiB7XG5cdFx0XHRcdHN1bSA9IHBhcnQgPyBzdW1bcGFydF0gOiBzdW07XG5cdFx0XHRcdHJldHVybiBzdW07XG5cdFx0XHR9LCB0aGlzLm9WYWx1ZXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0UGF0aCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNbXCIkcGF0aFwiXTtcblx0fSk7XG5cblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vQmluZGluZztcblx0fSk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nPy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdH0pO1xuXHRwdWJsaWMgaXNUcmFuc2llbnQgPSBqZXN0LmZuKCk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIHNldEtlZXBBbGl2ZSA9IGplc3QuZm4oKGJvb2w6IGJvb2xlYW4sIF9mbk9uQmVmb3JlRGVzdHJveT86IGFueSwgX2JSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuKSA9PiB7XG5cdFx0dGhpcy5pc0tlcHRBbGl2ZSA9IGJvb2w7XG5cdH0pO1xuXHRwdWJsaWMgaXNLZWVwQWxpdmUgPSBqZXN0LmZuKCgpID0+IHRoaXMuaXNLZXB0QWxpdmUpO1xuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tVSTVFbGVtZW50IGltcGxlbWVudHMgUGFydGlhbDxVSTVFbGVtZW50PiB7XG5cdFtrZXk6IHN0cmluZ106IGFueTtcblx0cHVibGljIGJpbmRpbmdDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KHt9KTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodGhpcy5iaW5kaW5nQ29udGV4dCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGRhdGEgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldFBhcmVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIGV4dGVuZHMgTW9ja1VJNUVsZW1lbnQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRyb2w+IHtcblx0cHVibGljIGdldEJpbmRpbmdDb250ZXh0OiBqZXN0Lk1vY2s8YW55LCBhbnk+ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWw6IGplc3QuTW9jazxhbnksIGFueT4gPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrRXZlbnQgaW1wbGVtZW50cyBQYXJ0aWFsPEV2ZW50PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sIHB1YmxpYyBzb3VyY2U6IE1vY2tVSTVFbGVtZW50ID0gbmV3IE1vY2tVSTVFbGVtZW50KCkpIHt9XG5cblx0cHVibGljIGdldFBhcmFtZXRlciA9IGplc3QuZm4oKG5hbWUpID0+IHRoaXMucGFyYW1zW25hbWVdKTtcblxuXHRwdWJsaWMgZ2V0U291cmNlID0gamVzdC5mbigoKSA9PiB0aGlzLnNvdXJjZSBhcyBhbnkpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IExpc3RCaW5kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2NrTGlzdEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhTGlzdEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBhTW9ja0NvbnRleHRzOiBNb2NrQ29udGV4dFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihhQ29udGV4dHM/OiBhbnlbXSwgcHJpdmF0ZSBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpIHtcblx0XHRhQ29udGV4dHMgPSBhQ29udGV4dHMgfHwgW107XG5cblx0XHR0aGlzLmFNb2NrQ29udGV4dHMgPSBhQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IE1vY2tDb250ZXh0KGNvbnRleHQsIHRoaXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGlzQShzQ2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiO1xuXHR9XG5cblx0cHVibGljIHNldE1vZGVsKG9Nb2RlbDogTW9ja01vZGVsKSB7XG5cdFx0dGhpcy5tb2NrTW9kZWwgPSBvTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdHB1YmxpYyBzZXRBZ2dyZWdhdGlvbiA9IGplc3QuZm4oKTtcblx0cHVibGljIGZpbHRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIHNvcnQgPSBqZXN0LmZuKCk7XG5cblx0cHVibGljIGdldFF1ZXJ5T3B0aW9uc0Zyb21QYXJhbWV0ZXJzID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0UGF0aCA9IGplc3QuZm4oKTtcblx0cHVibGljIGlzU3VzcGVuZGVkID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVzdW1lID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVmcmVzaCA9IGplc3QuZm4oKTtcblx0cHVibGljIHN1c3BlbmQgPSBqZXN0LmZuKCk7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgcmVxdWVzdENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSBhcyBDb250ZXh0W10pO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgZ2V0Q3VycmVudENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiB0aGlzLmFNb2NrQ29udGV4dHMgYXMgYW55IGFzIENvbnRleHRbXTtcblx0fSk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm1vY2tNb2RlbCBhcyBhbnkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG5cdHB1YmxpYyBnZXRVcGRhdGVHcm91cElkID0gamVzdC5mbigoKSA9PiBcImF1dG9cIik7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrUHJvcGVydHlCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YVByb3BlcnR5QmluZGluZz4ge1xuXHRwcml2YXRlIG1vY2tNb2RlbCE6IEpTT05Nb2RlbDtcblx0cHJpdmF0ZSBtb2NrUGF0aCE6IHN0cmluZztcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobW9ja01vZGVsOiBKU09OTW9kZWwsIG1vY2tQYXRoOiBzdHJpbmcpIHtcblx0XHR0aGlzLnNldE1vZGVsKG1vY2tNb2RlbCk7XG5cdFx0dGhpcy5zZXRQYXRoKG1vY2tQYXRoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5cdH1cblxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBKU09OTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrTW9kZWwgYXMgYW55IGFzIE9EYXRhTW9kZWw7XG5cdH0pO1xuXG5cdHB1YmxpYyBzZXRQYXRoKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdHRoaXMubW9ja1BhdGggPSBwYXRoID8gcGF0aCA6IFwiXCI7XG5cdH1cblx0cHVibGljIGdldFBhdGggPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrUGF0aDtcblx0fSk7XG5cblx0cHVibGljIGdldFZhbHVlID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXM/Lm1vY2tNb2RlbD8uZ2V0UHJvcGVydHkoYC8ke3RoaXMubW9ja1BhdGh9YCk7XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbXBvc2l0ZUJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPENvbXBvc2l0ZUJpbmRpbmc+IHtcblx0cHJpdmF0ZSBhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW10pIHtcblx0XHR0aGlzLmFCaW5kaW5ncyA9IGFCaW5kaW5ncztcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIjtcblx0fVxuXG5cdHB1YmxpYyBnZXRCaW5kaW5ncyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLmFCaW5kaW5ncztcblx0fSk7XG5cblx0cHVibGljIGdldFZhbHVlID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMuYUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5nZXRWYWx1ZSgpKTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udGV4dEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBvTW9ja0NvbnRleHQ6IE1vY2tDb250ZXh0O1xuXHRwcml2YXRlIGlzS2VwdEFsaXZlOiBib29sZWFuID0gZmFsc2U7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9Db250ZXh0PzogYW55LCBwcml2YXRlIG1vY2tNb2RlbD86IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cdHB1YmxpYyBzZXRNb2RlbChvTW9kZWw6IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMubW9ja01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0IGFzIGFueSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGF0dGFjaEV2ZW50T25jZSA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMubW9ja01vZGVsIGFzIGFueSBhcyBPRGF0YU1vZGVsO1xuXHR9KTtcblx0cHVibGljIHNldFBhcmFtZXRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIGV4ZWN1dGUgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodHJ1ZSk7XG5cdHB1YmxpYyBnZXRHcm91cElkID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1ldGFNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9ja01ldGFNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNZXRhTW9kZWw+IHtcblx0cHJpdmF0ZSBvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xuXHRyZXF1ZXN0VmFsdWVMaXN0SW5mbyE6IGplc3QuTW9jazxhbnksIGFueT47XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9NZXRhRGF0YT86IGFueSkge1xuXHRcdHRoaXMub01ldGFDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9NZXRhRGF0YSB8fCB7fSk7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldE1ldGFDb250ZXh0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55IGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0T2JqZWN0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcblx0cHVibGljIGNyZWF0ZUJpbmRpbmdDb250ZXh0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55IGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YVBhdGggPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgbWV0YW1vZGVsID0gbmV3IE9EYXRhTWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIHNQYXRoID8gbWV0YW1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKSA6IHNQYXRoO1xuXHR9KTtcblx0cHVibGljIGdldENvbnRleHQgPSBqZXN0LmZuKCk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTW9kZWxcbiAqL1xuXG5leHBvcnQgY2xhc3MgTW9ja01vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1vZGVsPiB7XG5cdHByaXZhdGUgb01ldGFNb2RlbD86IE1vY2tNZXRhTW9kZWw7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBwcml2YXRlIG1vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdGlmIChtb2NrTGlzdEJpbmRpbmcpIHtcblx0XHRcdG1vY2tMaXN0QmluZGluZy5zZXRNb2RlbCh0aGlzKTtcblx0XHR9XG5cdFx0aWYgKG1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdFx0bW9ja0NvbnRleHRCaW5kaW5nLnNldE1vZGVsKHRoaXMpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEZhY3Rvcmllc1xuXHRzdGF0aWMgbW9kZWxGcm9tTGlzdEJpbmRpbmcobW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKG1vY2tMaXN0QmluZGluZyk7XG5cdH1cblx0c3RhdGljIG1vZGVsRnJvbUNvbnRleHRCaW5kaW5nKG1vY2tDb250ZXh0QmluZGluZzogTW9ja0NvbnRleHRCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0XHRyZXR1cm4gbmV3IE1vY2tNb2RlbCh1bmRlZmluZWQsIG1vY2tDb250ZXh0QmluZGluZyk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TWV0YU1vZGVsKG9NZXRhTW9kZWw6IE1vY2tNZXRhTW9kZWwpIHtcblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kTGlzdCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55IGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kQ29udGV4dCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrQ29udGV4dEJpbmRpbmcgYXMgYW55IGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub01ldGFNb2RlbCBhcyBhbnkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRQcm9wZXJ0eSA9IGplc3QuZm4oKTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldEtlZXBBbGl2ZUNvbnRleHQgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrVmlldyBpbXBsZW1lbnRzIFBhcnRpYWw8Vmlldz4ge1xuXHRwdWJsaWMgZ2V0Q29udHJvbGxlciA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZ0NvbnRleHQgPSBqZXN0LmZuKCk7XG5cblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBnZXRWaWV3RGF0YSA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5jb3JlLm12Yy5WaWV3XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SWQgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udHJvbGxlciBpbXBsZW1lbnRzIFBhcnRpYWw8Q29udHJvbGxlcj4ge1xuXHRwdWJsaWMgZ2V0VmlldyA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUobmV3IE1vY2tWaWV3KCkpO1xuXG5cdHB1YmxpYyBfcm91dGluZyA9IHtcblx0XHRuYXZpZ2F0ZVRvVGFyZ2V0OiBqZXN0LmZuKClcblx0fTtcblxuXHRwdWJsaWMgX2VkaXRGbG93ID0ge1xuXHRcdHN5bmNUYXNrOiBqZXN0LmZuKClcblx0fTtcblxuXHRwdWJsaWMgX3NpZGVFZmZlY3RzID0ge1xuXHRcdGhhbmRsZUZpZWxkQ2hhbmdlOiBqZXN0LmZuKClcblx0fTtcblxuXHRpc0EgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNVkNNb2NrIHtcblx0bW9kZWw6IE1vY2tNb2RlbDtcblx0dmlldzogTW9ja1ZpZXc7XG5cdGNvbnRyb2xsZXI6IE1vY2tDb250cm9sbGVyO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIG1vY2tzIHRoYXQgcmVmZXIgdG8gZWFjaCBvdGhlci5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmcgT3B0aW9uYWwgZXhpc3RpbmcgbW9ja2VkIGluc3RhbmNlcyB0aGF0IHNob3VsZCBiZSB1c2VkXG4gKiBAcmV0dXJucyBNb2NrZWQgbW9kZWwsIHZpZXcgYW5kIGNvbnRyb2xsZXIgaW5zdGFuY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrTVZDKGV4aXN0aW5nPzogUGFydGlhbDxNVkNNb2NrPik6IE1WQ01vY2sge1xuXHRjb25zdCBtb2RlbCA9IGV4aXN0aW5nPy5tb2RlbCB8fCBuZXcgTW9ja01vZGVsKCk7XG5cdGNvbnN0IHZpZXcgPSBleGlzdGluZz8udmlldyB8fCBuZXcgTW9ja1ZpZXcoKTtcblx0Y29uc3QgY29udHJvbGxlciA9IGV4aXN0aW5nPy5jb250cm9sbGVyIHx8IG5ldyBNb2NrQ29udHJvbGxlcigpO1xuXG5cdHZpZXcuZ2V0Q29udHJvbGxlci5tb2NrUmV0dXJuVmFsdWUoY29udHJvbGxlcik7XG5cdHZpZXcuZ2V0TW9kZWwubW9ja1JldHVyblZhbHVlKG1vZGVsKTtcblx0Y29udHJvbGxlci5nZXRWaWV3Lm1vY2tSZXR1cm5WYWx1ZSh2aWV3KTtcblxuXHRyZXR1cm4geyBtb2RlbCwgdmlldywgY29udHJvbGxlciB9O1xufVxuIl19
485
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVNb2NrQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsIm9CaW5kaW5nIiwiaXNJbmFjdGl2ZSIsIm1vY2tlZCIsIm1vY2siLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIkNvbnRleHQiLCJjcmVhdGVOZXdDb250ZXh0IiwiX2lzS2VwdEFsaXZlIiwiX2NvbnRleHREYXRhIiwiX29CaW5kaW5nIiwiX2lzSW5hY3RpdmUiLCJpc0EiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJzQ2xhc3NOYW1lIiwiZ2V0UHJvcGVydHkiLCJrZXkiLCJyZXF1ZXN0UHJvcGVydHkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlcXVlc3RPYmplY3QiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJzZXRLZWVwQWxpdmUiLCJib29sIiwiX2ZuT25CZWZvcmVEZXN0cm95IiwiX2JSZXF1ZXN0TWVzc2FnZXMiLCJpc0tlZXBBbGl2ZSIsIk1vY2tDb250ZXh0IiwiY3JlYXRlTW9ja0V2ZW50IiwicGFyYW1zIiwiRXZlbnQiLCJfcGFyYW1zIiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsIk1vY2tFdmVudCIsImNyZWF0ZU1vY2tMaXN0QmluZGluZyIsImFDb250ZXh0RGF0YSIsIm9Nb2NrTW9kZWwiLCJPRGF0YUxpc3RCaW5kaW5nIiwiX2FNb2NrQ29udGV4dHMiLCJtYXAiLCJjb250ZXh0RGF0YSIsIl9tb2NrTW9kZWwiLCJzZXRNb2RlbCIsIm1vZGVsIiwicmVxdWVzdENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm1vY2tSZXR1cm5WYWx1ZSIsIk1vY2tMaXN0QmluZGluZyIsImNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmciLCJPRGF0YVByb3BlcnR5QmluZGluZyIsIl92YWx1ZSIsIl9wYXRoIiwiZ2V0VmFsdWUiLCJNb2NrUHJvcGVydHlCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmciLCJhQmluZGluZ3MiLCJDb21wb3NpdGVCaW5kaW5nIiwiX2FCaW5kaW5ncyIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJPRGF0YUNvbnRleHRCaW5kaW5nIiwibW9ja01vZGVsIiwib01vY2tDb250ZXh0IiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIm9Nb2RlbCIsImdldEJvdW5kQ29udGV4dCIsImV4ZWN1dGUiLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsIk1vY2tDb250ZXh0QmluZGluZyIsImNyZWF0ZU1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJPRGF0YU1ldGFNb2RlbCIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0Iiwic1BhdGgiLCIkcGF0aCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJtZXRhbW9kZWwiLCJNb2NrTWV0YU1vZGVsIiwiY3JlYXRlTW9ja01vZGVsIiwib01vY2tMaXN0QmluZGluZyIsIm9Nb2NrQ29udGV4dEJpbmRpbmciLCJPRGF0YU1vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwic2V0TWV0YU1vZGVsIiwib01ldGFNb2RlbCIsImJpbmRMaXN0IiwiYmluZENvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJNb2NrTW9kZWwiLCJjcmVhdGVNb2NrTW9kZWxGcm9tTGlzdEJpbmRpbmciLCJjcmVhdGVNb2NrTW9kZWxGcm9tQ29udGV4dEJpbmRpbmciLCJ1bmRlZmluZWQiLCJjcmVhdGVNb2NrVmlldyIsIlZpZXciLCJNb2NrVmlldyIsImNyZWF0ZU1vY2tDb250cm9sbGVyIiwiQ29udHJvbGxlciIsIl9yb3V0aW5nIiwiSW50ZXJuYWxSb3V0aW5nIiwiX2VkaXRGbG93IiwiSW50ZXJuYWxFZGl0RmxvdyIsIl9zaWRlRWZmZWN0cyIsIlNpZGVFZmZlY3RzIiwiZWRpdEZsb3ciLCJFZGl0RmxvdyIsImdldFZpZXciLCJNb2NrQ29udHJvbGxlciIsIm1vY2tNVkMiLCJleGlzdGluZyIsInZpZXciLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVUk1TW9ja0hlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFdpdGhNb2NrIH0gZnJvbSBcIkBzYXAtdXgvamVzdC1tb2NrLXVpNS9kaXN0L2dlbmVyaWNcIjtcbmltcG9ydCB7IG1vY2sgfSBmcm9tIFwiQHNhcC11eC9qZXN0LW1vY2stdWk1L2Rpc3QvZ2VuZXJpY1wiO1xuaW1wb3J0IEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9FZGl0Rmxvd1wiO1xuaW1wb3J0IEludGVybmFsRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsRWRpdEZsb3dcIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IFNpZGVFZmZlY3RzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9TaWRlRWZmZWN0c1wiO1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBDb21wb3NpdGVCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQ29tcG9zaXRlQmluZGluZ1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tDb250ZXh0ID0gV2l0aE1vY2s8Q29udGV4dD4gJiB7XG5cdF9pc0tlcHRBbGl2ZTogYm9vbGVhbjtcblx0X2NvbnRleHREYXRhOiBhbnk7XG5cdF9vQmluZGluZzogYW55O1xuXHRfaXNJbmFjdGl2ZTogYm9vbGVhbjtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tDb250ZXh0LlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dERhdGEgQSBtYXAgb2YgdGhlIGRpZmZlcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBjb250ZXh0LiBUaGUgdmFsdWUgZm9yIHRoZSBrZXkgJyRwYXRoJyB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSAnZ2V0UGF0aCcgbWV0aG9kXG4gKiBAcGFyYW0gb0JpbmRpbmcgVGhlIGJpbmRpbmcgb2YgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBpc0luYWN0aXZlIElzIHRoZSBjb250ZXh0IGluaWFjdGl2ZSBvciBub3RcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dChvQ29udGV4dERhdGE/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbik6IE1vY2tDb250ZXh0IHtcblx0Ly8gVWdseSB3b3JrYXJvdW5kIHRvIGdldCBhIHByb3BlciBtb2NrIHBiamVjdCwgYXMgQ29udGV4dCBpc24ndCBwcm9wZXJseSBleHBvcnRlZCBmcm9tIFVJNVxuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9iamVjdC5nZXRQcm90b3R5cGVPZigoQ29udGV4dCBhcyBhbnkpLmNyZWF0ZU5ld0NvbnRleHQobnVsbCwgbnVsbCwgXCIvZVwiKSkpIGFzIE1vY2tDb250ZXh0O1xuXHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gZmFsc2U7XG5cdG1vY2tlZC5fY29udGV4dERhdGEgPSBvQ29udGV4dERhdGEgfHwge307XG5cdG1vY2tlZC5fb0JpbmRpbmcgPSBvQmluZGluZztcblx0bW9ja2VkLl9pc0luYWN0aXZlID0gISFpc0luYWN0aXZlO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFByb3BlcnR5Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9jb250ZXh0RGF0YVtrZXldO1xuXHR9KTtcblx0bW9ja2VkLm1vY2sucmVxdWVzdFByb3BlcnR5Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5XSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5XSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5zZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0bW9ja2VkLl9jb250ZXh0RGF0YVtrZXldID0gdmFsdWU7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigocGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0bGV0IHJlc3VsdCA9IHBhdGggPyBtb2NrZWQuX2NvbnRleHREYXRhW3BhdGhdIDogbW9ja2VkLl9jb250ZXh0RGF0YTtcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgbW9ja2VkLl9jb250ZXh0RGF0YSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0UGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtcIiRwYXRoXCJdKTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9vQmluZGluZyk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX29CaW5kaW5nPy5nZXRNb2RlbCgpKTtcblx0bW9ja2VkLm1vY2suc2V0S2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoYm9vbDogYm9vbGVhbiwgX2ZuT25CZWZvcmVEZXN0cm95PzogYW55LCBfYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pID0+IHtcblx0XHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gYm9vbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzS2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX2lzS2VwdEFsaXZlKTtcblx0bW9ja2VkLm1vY2suaXNJbmFjdGl2ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9pc0luYWN0aXZlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0OiBuZXcgKG9WYWx1ZXM/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbikgPT4gTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuYmFzZS5FdmVudFxuICovXG5leHBvcnQgdHlwZSBNb2NrRXZlbnQgPSBXaXRoTW9jazxFdmVudD4gJiB7XG5cdF9wYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrRXZlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnRcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tFdmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50KHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBNb2NrRXZlbnQge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKEV2ZW50KSBhcyBNb2NrRXZlbnQ7XG5cdG1vY2tlZC5fcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0UGFyYW1ldGVyLm1vY2tJbXBsZW1lbnRhdGlvbigobmFtZSkgPT4gbW9ja2VkLl9wYXJhbXNbbmFtZV0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrRXZlbnQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tFdmVudDogbmV3IChwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBNb2NrRXZlbnQgPSBjcmVhdGVNb2NrRXZlbnQgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0xpc3RCaW5kaW5nID0gV2l0aE1vY2s8T0RhdGFMaXN0QmluZGluZz4gJiB7XG5cdF9hTW9ja0NvbnRleHRzOiBNb2NrQ29udGV4dFtdO1xuXHRfbW9ja01vZGVsPzogTW9ja01vZGVsO1xuXG5cdC8qKlxuXHQgKiBVdGlsaXR5IG1ldGhvZCB0byBzZXQgdGhlIG1vZGVsIG9mIHRoZSBMaXN0QmluZGluZ1xuXHQgKi9cblx0c2V0TW9kZWw6IChtb2RlbDogTW9ja01vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0xpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBhQ29udGV4dERhdGEgQW4gYXJyYXkgb2Ygb2JqZWN0cyBob2xkaW5nIHRoZSBkaWZmZXJlbnQgcHJvcGVydGllcyBvZiB0aGUgY29udGV4dHMgcmVmZXJlbmNlZCBieSB0aGUgTGlzdEJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgTGlzdEJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tMaXN0QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0xpc3RCaW5kaW5nKGFDb250ZXh0RGF0YT86IGFueVtdLCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja0xpc3RCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YUxpc3RCaW5kaW5nKSBhcyBNb2NrTGlzdEJpbmRpbmc7XG5cdGFDb250ZXh0RGF0YSA9IGFDb250ZXh0RGF0YSB8fCBbXTtcblx0bW9ja2VkLl9hTW9ja0NvbnRleHRzID0gYUNvbnRleHREYXRhLm1hcCgoY29udGV4dERhdGEpID0+IHtcblx0XHRyZXR1cm4gY3JlYXRlTW9ja0NvbnRleHQoY29udGV4dERhdGEsIG1vY2tlZCk7XG5cdH0pO1xuXHRtb2NrZWQuX21vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1vZGVsID0gKG1vZGVsOiBNb2NrTW9kZWwpID0+IHtcblx0XHRtb2NrZWQuX21vY2tNb2RlbCA9IG1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9hTW9ja0NvbnRleHRzKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldEN1cnJlbnRDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FNb2NrQ29udGV4dHM7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRBbGxDdXJyZW50Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0TW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRVcGRhdGVHcm91cElkLm1vY2tSZXR1cm5WYWx1ZShcImF1dG9cIik7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tMaXN0QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0xpc3RCaW5kaW5nOiBuZXcgKGFDb250ZXh0cz86IGFueVtdLCBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpID0+IE1vY2tMaXN0QmluZGluZyA9IGNyZWF0ZU1vY2tMaXN0QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja1Byb3BlcnR5QmluZGluZyA9IFdpdGhNb2NrPE9EYXRhUHJvcGVydHlCaW5kaW5nPiAmIHtcblx0X3ZhbHVlPzogYW55O1xuXHRfcGF0aD86IHN0cmluZztcblx0X21vY2tNb2RlbD86IE1vY2tNb2RlbDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tQcm9wZXJ0eUJpbmRpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSByZXR1cm5kIGJ5IHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrUHJvcGVydHlCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrUHJvcGVydHlCaW5kaW5nKHZhbHVlOiBhbnksIHBhdGg/OiBzdHJpbmcsIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrUHJvcGVydHlCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YVByb3BlcnR5QmluZGluZykgYXMgTW9ja1Byb3BlcnR5QmluZGluZztcblx0bW9ja2VkLl9tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXHRtb2NrZWQuX3ZhbHVlID0gdmFsdWU7XG5cdG1vY2tlZC5fcGF0aCA9IHBhdGg7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fbW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0VmFsdWUubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl92YWx1ZTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFBhdGgubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9wYXRoO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja1Byb3BlcnR5QmluZGluZzogbmV3ICh2YWx1ZTogYW55LCBvTW9ja01vZGVsPzogTW9ja01vZGVsKSA9PiBNb2NrUHJvcGVydHlCaW5kaW5nID0gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29tcG9zaXRlQmluZGluZyA9IFdpdGhNb2NrPENvbXBvc2l0ZUJpbmRpbmc+ICYge1xuXHRfYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW107XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29tcG9zaXRlQmluZGluZy5cbiAqXG4gKiBAcGFyYW0gYUJpbmRpbmdzIFRoZSBiaW5kaW5ncyBvZiB0aGUgQ29tcG9zaXRlQmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbXBvc2l0ZUJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nKGFCaW5kaW5nczogTW9ja1Byb3BlcnR5QmluZGluZ1tdKTogTW9ja0NvbXBvc2l0ZUJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbXBvc2l0ZUJpbmRpbmcpIGFzIE1vY2tDb21wb3NpdGVCaW5kaW5nO1xuXHRtb2NrZWQuX2FCaW5kaW5ncyA9IGFCaW5kaW5ncztcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCaW5kaW5ncy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FCaW5kaW5ncztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFZhbHVlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5nZXRWYWx1ZSgpKTtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrQ29tcG9zaXRlQmluZGluZzogbmV3IChhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXSkgPT4gTW9ja0NvbXBvc2l0ZUJpbmRpbmcgPSBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udGV4dEJpbmRpbmcgPSBXaXRoTW9jazxPRGF0YUNvbnRleHRCaW5kaW5nPiAmIHtcblx0b01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblx0aXNLZXB0QWxpdmU6IGJvb2xlYW47XG5cdG1vY2tNb2RlbD86IE1vY2tNb2RlbDtcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbCBNb2NrQ29udGV4dCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdGdldEludGVybmFsTW9ja0NvbnRleHQ6ICgpID0+IE1vY2tDb250ZXh0O1xuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtb2RlbCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdHNldE1vZGVsOiAob01vZGVsOiBNb2NrTW9kZWwpID0+IHZvaWQ7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udGV4dEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHBhcmFtIG9Nb2NrTW9kZWwgVGhlIG1vZGVsIG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbnRleHRCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcob0NvbnRleHQ/OiBhbnksIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhQ29udGV4dEJpbmRpbmcpIGFzIE1vY2tDb250ZXh0QmluZGluZztcblx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cdG1vY2tlZC5vTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgbW9ja2VkKTtcblxuXHQvLyBVdGlsaXR5IEFQSVxuXHRtb2NrZWQuZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fTtcblx0bW9ja2VkLnNldE1vZGVsID0gKG9Nb2RlbDogTW9ja01vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCb3VuZENvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5leGVjdXRlLm1vY2tSZXNvbHZlZFZhbHVlKHRydWUpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0QmluZGluZzogbmV3IChvQ29udGV4dD86IGFueSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCkgPT4gTW9ja0NvbnRleHRCaW5kaW5nID0gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrTWV0YU1vZGVsID0gV2l0aE1vY2s8T0RhdGFNZXRhTW9kZWw+ICYge1xuXHRvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01ldGFNb2RlbC5cbiAqXG4gKiBAcGFyYW0gb01ldGFEYXRhIEEgbWFwIG9mIHRoZSBkaWZmZXJlbnQgbWV0YWRhdGEgcHJvcGVydGllcyBvZiB0aGUgTWV0YU1vZGVsIChwYXRoIC0+IHZhbHVlKS5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNZXRhTW9kZWwob01ldGFEYXRhPzogYW55KTogTW9ja01ldGFNb2RlbCB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFNZXRhTW9kZWwpIGFzIE1vY2tNZXRhTW9kZWw7XG5cdG1vY2tlZC5vTWV0YUNvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0TWV0YUNvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIGNyZWF0ZU1vY2tDb250ZXh0KHsgJHBhdGg6IHNQYXRoIH0pO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQub01ldGFDb250ZXh0LmdldFByb3BlcnR5KHNQYXRoKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmNyZWF0ZUJpbmRpbmdDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBjcmVhdGVNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1ldGFQYXRoLm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IG1ldGFtb2RlbCA9IG5ldyBPRGF0YU1ldGFNb2RlbCgpO1xuXHRcdHJldHVybiBzUGF0aCA/IG1ldGFtb2RlbC5nZXRNZXRhUGF0aChzUGF0aCkgOiBzUGF0aDtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNZXRhTW9kZWwgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tNZXRhTW9kZWw6IG5ldyAob01ldGFEYXRhPzogYW55KSA9PiBNb2NrTWV0YU1vZGVsID0gY3JlYXRlTW9ja01ldGFNb2RlbCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrTW9kZWwgPSBXaXRoTW9jazxPRGF0YU1vZGVsPiAmIHtcblx0b01ldGFNb2RlbD86IE1vY2tNZXRhTW9kZWw7XG5cdG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZztcblx0bW9ja0NvbnRleHRCaW5kaW5nPzogTW9ja0NvbnRleHRCaW5kaW5nO1xuXG5cdC8qKlxuXHQgKiBVdGlsaXR5IG1ldGhvZCB0byBzZXQgdGhlIG1ldGFtb2RlbCBvZiB0aGUgTW9ja01vZGVsXG5cdCAqL1xuXHRzZXRNZXRhTW9kZWw6IChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsLlxuICpcbiAqIEBwYXJhbSBvTW9ja0xpc3RCaW5kaW5nIEEgbGlzdCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZExpc3QuXG4gKiBAcGFyYW0gb01vY2tDb250ZXh0QmluZGluZyBBIGNvbnRleHQgYmluZGluZyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgd2hlbiBjYWxsaW5nIGJpbmRDb250ZXh0LlxuICogQHJldHVybnMgQSBuZXcgTW9ja01vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrTW9kZWwob01vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgb01vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFNb2RlbCkgYXMgTW9ja01vZGVsO1xuXHRtb2NrZWQubW9ja0xpc3RCaW5kaW5nID0gb01vY2tMaXN0QmluZGluZztcblx0bW9ja2VkLm1vY2tDb250ZXh0QmluZGluZyA9IG9Nb2NrQ29udGV4dEJpbmRpbmc7XG5cdGlmIChvTW9ja0xpc3RCaW5kaW5nKSB7XG5cdFx0b01vY2tMaXN0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cdGlmIChvTW9ja0NvbnRleHRCaW5kaW5nKSB7XG5cdFx0b01vY2tDb250ZXh0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1ldGFNb2RlbCA9IChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suYmluZExpc3QubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm1vY2tMaXN0QmluZGluZztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmJpbmRDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNZXRhTW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9NZXRhTW9kZWw7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrTW9kZWwgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tNb2RlbDogbmV3IChvTW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBvTW9ja0NvbnRleHRCaW5kaW5nPzogTW9ja0NvbnRleHRCaW5kaW5nKSA9PiBNb2NrTW9kZWwgPVxuXHRjcmVhdGVNb2NrTW9kZWwgYXMgYW55O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrTW9kZWwgdXNlZCB3aXRoIGEgbGlzdEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Nb2NrTGlzdEJpbmRpbmcgQSBsaXN0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kTGlzdC5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsRnJvbUxpc3RCaW5kaW5nKG9Nb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdHJldHVybiBjcmVhdGVNb2NrTW9kZWwob01vY2tMaXN0QmluZGluZyk7XG59XG4vKipcbiAqICBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrTW9kZWwgdXNlZCB3aXRoIGEgY29udGV4dEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Nb2NrQ29udGV4dEJpbmRpbmcgQSBjb250ZXh0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kQ29udGV4dC5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsRnJvbUNvbnRleHRCaW5kaW5nKG9Nb2NrQ29udGV4dEJpbmRpbmc6IE1vY2tDb250ZXh0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdHJldHVybiBjcmVhdGVNb2NrTW9kZWwodW5kZWZpbmVkLCBvTW9ja0NvbnRleHRCaW5kaW5nKTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5jb3JlLm12Yy5WaWV3XG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tWaWV3ID0gV2l0aE1vY2s8Vmlldz47XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tWaWV3LlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tWaWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrVmlldygpOiBNb2NrVmlldyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soVmlldyk7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkuY29yZS5tdmMuVmlld1wiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1ZpZXcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tWaWV3OiBuZXcgKCkgPT4gTW9ja1ZpZXcgPSBjcmVhdGVNb2NrVmlldyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAuZmUuY29yZS5QYWdlQ29udHJvbGxlclxuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udHJvbGxlciA9IFdpdGhNb2NrPENvbnRyb2xsZXI+ICYge1xuXHRfcm91dGluZzogV2l0aE1vY2s8SW50ZXJuYWxSb3V0aW5nPjtcblx0X2VkaXRGbG93OiBXaXRoTW9jazxJbnRlcm5hbEVkaXRGbG93Pjtcblx0X3NpZGVFZmZlY3RzOiBXaXRoTW9jazxTaWRlRWZmZWN0cz47XG5cdGVkaXRGbG93OiBXaXRoTW9jazxFZGl0Rmxvdz47XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udHJvbGxlci5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrQ29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTogTW9ja0NvbnRyb2xsZXIge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbnRyb2xsZXIpIGFzIE1vY2tDb250cm9sbGVyO1xuXHRtb2NrZWQuX3JvdXRpbmcgPSBtb2NrKEludGVybmFsUm91dGluZyk7XG5cdG1vY2tlZC5fZWRpdEZsb3cgPSBtb2NrKEludGVybmFsRWRpdEZsb3cpO1xuXHRtb2NrZWQuX3NpZGVFZmZlY3RzID0gbW9jayhTaWRlRWZmZWN0cyk7XG5cdG1vY2tlZC5lZGl0RmxvdyA9IG1vY2soRWRpdEZsb3cpO1xuXG5cdC8vIERlZmF1bHQgQmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUoY3JlYXRlTW9ja1ZpZXcoKSk7XG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBtb2NrQ29udHJvbGxlciBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0NvbnRyb2xsZXI6IG5ldyAoKSA9PiBNb2NrQ29udHJvbGxlciA9IGNyZWF0ZU1vY2tDb250cm9sbGVyIGFzIGFueTtcblxuZXhwb3J0IGludGVyZmFjZSBNVkNNb2NrIHtcblx0bW9kZWw6IE1vY2tNb2RlbDtcblx0dmlldzogTW9ja1ZpZXc7XG5cdGNvbnRyb2xsZXI6IE1vY2tDb250cm9sbGVyO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBtb2NrcyB0aGF0IHJlZmVyIHRvIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nIE9wdGlvbmFsIGV4aXN0aW5nIG1vY2tlZCBpbnN0YW5jZXMgdGhhdCBzaG91bGQgYmUgdXNlZFxuICogQHJldHVybnMgTW9ja2VkIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIGluc3RhbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja01WQyhleGlzdGluZz86IFBhcnRpYWw8TVZDTW9jaz4pOiBNVkNNb2NrIHtcblx0Y29uc3QgbW9kZWwgPSBleGlzdGluZz8ubW9kZWwgfHwgY3JlYXRlTW9ja01vZGVsKCk7XG5cdGNvbnN0IHZpZXcgPSBleGlzdGluZz8udmlldyB8fCBjcmVhdGVNb2NrVmlldygpO1xuXHRjb25zdCBjb250cm9sbGVyID0gZXhpc3Rpbmc/LmNvbnRyb2xsZXIgfHwgY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTtcblxuXHR2aWV3Lm1vY2suZ2V0Q29udHJvbGxlci5tb2NrUmV0dXJuVmFsdWUoY29udHJvbGxlcik7XG5cdHZpZXcubW9jay5nZXRNb2RlbC5tb2NrUmV0dXJuVmFsdWUobW9kZWwpO1xuXHRjb250cm9sbGVyLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUodmlldyk7XG5cblx0cmV0dXJuIHsgbW9kZWwsIHZpZXcsIGNvbnRyb2xsZXIgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7OztFQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsaUJBQVQsQ0FBMkJDLFlBQTNCLEVBQStDQyxRQUEvQyxFQUErREMsVUFBL0QsRUFBa0c7SUFDeEc7SUFDQSxJQUFNQyxNQUFNLEdBQUdDLElBQUksQ0FBQ0MsTUFBTSxDQUFDQyxjQUFQLENBQXVCQyxPQUFELENBQWlCQyxnQkFBakIsQ0FBa0MsSUFBbEMsRUFBd0MsSUFBeEMsRUFBOEMsSUFBOUMsQ0FBdEIsQ0FBRCxDQUFuQjtJQUNBTCxNQUFNLENBQUNNLFlBQVAsR0FBc0IsS0FBdEI7SUFDQU4sTUFBTSxDQUFDTyxZQUFQLEdBQXNCVixZQUFZLElBQUksRUFBdEM7SUFDQUcsTUFBTSxDQUFDUSxTQUFQLEdBQW1CVixRQUFuQjtJQUNBRSxNQUFNLENBQUNTLFdBQVAsR0FBcUIsQ0FBQyxDQUFDVixVQUF2QixDQU53RyxDQVF4Rzs7SUFDQUMsTUFBTSxDQUFDQyxJQUFQLENBQVlTLEdBQVosQ0FBZ0JDLGtCQUFoQixDQUFtQyxVQUFDQyxVQUFELEVBQXdCO01BQzFELE9BQU9BLFVBQVUsS0FBSywrQkFBdEI7SUFDQSxDQUZEO0lBR0FaLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZWSxXQUFaLENBQXdCRixrQkFBeEIsQ0FBMkMsVUFBQ0csR0FBRCxFQUFpQjtNQUMzRCxPQUFPZCxNQUFNLENBQUNPLFlBQVAsQ0FBb0JPLEdBQXBCLENBQVA7SUFDQSxDQUZEO0lBR0FkLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZYyxlQUFaLENBQTRCSixrQkFBNUIsQ0FBK0MsVUFBQ0csR0FBRCxFQUFpQjtNQUMvRCxPQUFPRSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JqQixNQUFNLENBQUNPLFlBQVAsQ0FBb0JPLEdBQXBCLENBQWhCLENBQVA7SUFDQSxDQUZEO0lBR0FkLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZaUIsYUFBWixDQUEwQlAsa0JBQTFCLENBQTZDLFVBQUNHLEdBQUQsRUFBaUI7TUFDN0QsT0FBT0UsT0FBTyxDQUFDQyxPQUFSLENBQWdCakIsTUFBTSxDQUFDTyxZQUFQLENBQW9CTyxHQUFwQixDQUFoQixDQUFQO0lBQ0EsQ0FGRDtJQUdBZCxNQUFNLENBQUNDLElBQVAsQ0FBWWtCLFdBQVosQ0FBd0JSLGtCQUF4QixDQUEyQyxVQUFDRyxHQUFELEVBQWNNLEtBQWQsRUFBNkI7TUFDdkVwQixNQUFNLENBQUNPLFlBQVAsQ0FBb0JPLEdBQXBCLElBQTJCTSxLQUEzQjtNQUNBLE9BQU9wQixNQUFNLENBQUNPLFlBQVAsQ0FBb0JPLEdBQXBCLENBQVA7SUFDQSxDQUhEO0lBS0FkLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZb0IsU0FBWixDQUFzQlYsa0JBQXRCLENBQXlDLFVBQUNXLElBQUQsRUFBa0I7TUFDMUQsSUFBSUMsTUFBTSxHQUFHRCxJQUFJLEdBQUd0QixNQUFNLENBQUNPLFlBQVAsQ0FBb0JlLElBQXBCLENBQUgsR0FBK0J0QixNQUFNLENBQUNPLFlBQXZEOztNQUVBLElBQUksQ0FBQ2dCLE1BQUQsSUFBV0QsSUFBWCxJQUFtQkEsSUFBSSxDQUFDRSxPQUFMLENBQWEsR0FBYixJQUFvQixDQUFDLENBQTVDLEVBQStDO1FBQzlDLElBQU1DLEtBQUssR0FBR0gsSUFBSSxDQUFDSSxLQUFMLENBQVcsR0FBWCxDQUFkO1FBQ0FILE1BQU0sR0FBR0UsS0FBSyxDQUFDRSxNQUFOLENBQWEsVUFBQ0MsR0FBRCxFQUFNQyxJQUFOLEVBQW9CO1VBQ3pDRCxHQUFHLEdBQUdDLElBQUksR0FBR0QsR0FBRyxDQUFDQyxJQUFELENBQU4sR0FBZUQsR0FBekI7VUFDQSxPQUFPQSxHQUFQO1FBQ0EsQ0FIUSxFQUdONUIsTUFBTSxDQUFDTyxZQUhELENBQVQ7TUFJQTs7TUFFRCxPQUFPZ0IsTUFBUDtJQUNBLENBWkQ7SUFjQXZCLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZNkIsT0FBWixDQUFvQm5CLGtCQUFwQixDQUF1QztNQUFBLE9BQU1YLE1BQU0sQ0FBQ08sWUFBUCxDQUFvQixPQUFwQixDQUFOO0lBQUEsQ0FBdkM7SUFDQVAsTUFBTSxDQUFDQyxJQUFQLENBQVk4QixVQUFaLENBQXVCcEIsa0JBQXZCLENBQTBDO01BQUEsT0FBTVgsTUFBTSxDQUFDUSxTQUFiO0lBQUEsQ0FBMUM7SUFDQVIsTUFBTSxDQUFDQyxJQUFQLENBQVkrQixRQUFaLENBQXFCckIsa0JBQXJCLENBQXdDO01BQUE7O01BQUEsNEJBQU1YLE1BQU0sQ0FBQ1EsU0FBYixzREFBTSxrQkFBa0J3QixRQUFsQixFQUFOO0lBQUEsQ0FBeEM7SUFDQWhDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZZ0MsWUFBWixDQUF5QnRCLGtCQUF6QixDQUE0QyxVQUFDdUIsSUFBRCxFQUFnQkMsa0JBQWhCLEVBQTBDQyxpQkFBMUMsRUFBMEU7TUFDckhwQyxNQUFNLENBQUNNLFlBQVAsR0FBc0I0QixJQUF0QjtJQUNBLENBRkQ7SUFHQWxDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZb0MsV0FBWixDQUF3QjFCLGtCQUF4QixDQUEyQztNQUFBLE9BQU1YLE1BQU0sQ0FBQ00sWUFBYjtJQUFBLENBQTNDO0lBQ0FOLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZRixVQUFaLENBQXVCWSxrQkFBdkIsQ0FBMEM7TUFBQSxPQUFNWCxNQUFNLENBQUNTLFdBQWI7SUFBQSxDQUExQztJQUVBLE9BQU9ULE1BQVA7RUFDQTtFQUNEO0FBQ0E7QUFDQTs7OztFQUNPLElBQU1zQyxXQUFxRixHQUFHMUMsaUJBQTlGO0VBRVA7QUFDQTtBQUNBOzs7O0VBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBUzJDLGVBQVQsQ0FBeUJDLE1BQXpCLEVBQXFFO0lBQzNFLElBQU14QyxNQUFNLEdBQUdDLElBQUksQ0FBQ3dDLEtBQUQsQ0FBbkI7SUFDQXpDLE1BQU0sQ0FBQzBDLE9BQVAsR0FBaUJGLE1BQU0sSUFBSSxFQUEzQixDQUYyRSxDQUkzRTs7SUFDQXhDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZMEMsWUFBWixDQUF5QmhDLGtCQUF6QixDQUE0QyxVQUFDaUMsSUFBRDtNQUFBLE9BQVU1QyxNQUFNLENBQUMwQyxPQUFQLENBQWVFLElBQWYsQ0FBVjtJQUFBLENBQTVDO0lBRUEsT0FBTzVDLE1BQVA7RUFDQTtFQUNEO0FBQ0E7QUFDQTs7OztFQUNPLElBQU02QyxTQUE2RCxHQUFHTixlQUF0RTtFQUVQO0FBQ0E7QUFDQTs7OztFQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU08scUJBQVQsQ0FBK0JDLFlBQS9CLEVBQXFEQyxVQUFyRCxFQUE4RjtJQUNwRyxJQUFNaEQsTUFBTSxHQUFHQyxJQUFJLENBQUNnRCxnQkFBRCxDQUFuQjtJQUNBRixZQUFZLEdBQUdBLFlBQVksSUFBSSxFQUEvQjtJQUNBL0MsTUFBTSxDQUFDa0QsY0FBUCxHQUF3QkgsWUFBWSxDQUFDSSxHQUFiLENBQWlCLFVBQUNDLFdBQUQsRUFBaUI7TUFDekQsT0FBT3hELGlCQUFpQixDQUFDd0QsV0FBRCxFQUFjcEQsTUFBZCxDQUF4QjtJQUNBLENBRnVCLENBQXhCO0lBR0FBLE1BQU0sQ0FBQ3FELFVBQVAsR0FBb0JMLFVBQXBCLENBTm9HLENBUXBHOztJQUNBaEQsTUFBTSxDQUFDc0QsUUFBUCxHQUFrQixVQUFDQyxLQUFELEVBQXNCO01BQ3ZDdkQsTUFBTSxDQUFDcUQsVUFBUCxHQUFvQkUsS0FBcEI7SUFDQSxDQUZELENBVG9HLENBYXBHOzs7SUFDQXZELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZUyxHQUFaLENBQWdCQyxrQkFBaEIsQ0FBbUMsVUFBQ0MsVUFBRCxFQUF3QjtNQUMxRCxPQUFPQSxVQUFVLEtBQUssd0NBQXRCO0lBQ0EsQ0FGRDtJQUdBWixNQUFNLENBQUNDLElBQVAsQ0FBWXVELGVBQVosQ0FBNEI3QyxrQkFBNUIsQ0FBK0MsWUFBTTtNQUNwRCxPQUFPSyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JqQixNQUFNLENBQUNrRCxjQUF2QixDQUFQO0lBQ0EsQ0FGRDtJQUdBbEQsTUFBTSxDQUFDQyxJQUFQLENBQVl3RCxrQkFBWixDQUErQjlDLGtCQUEvQixDQUFrRCxZQUFNO01BQ3ZELE9BQU9YLE1BQU0sQ0FBQ2tELGNBQWQ7SUFDQSxDQUZEO0lBR0FsRCxNQUFNLENBQUNDLElBQVAsQ0FBWXlELHFCQUFaLENBQWtDL0Msa0JBQWxDLENBQXFELFlBQU07TUFDMUQsT0FBT1gsTUFBTSxDQUFDa0QsY0FBZDtJQUNBLENBRkQ7SUFHQWxELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZK0IsUUFBWixDQUFxQnJCLGtCQUFyQixDQUF3QyxZQUFNO01BQzdDLE9BQU9YLE1BQU0sQ0FBQ3FELFVBQWQ7SUFDQSxDQUZEO0lBR0FyRCxNQUFNLENBQUNDLElBQVAsQ0FBWTBELGdCQUFaLENBQTZCQyxlQUE3QixDQUE2QyxNQUE3QztJQUVBLE9BQU81RCxNQUFQO0VBQ0E7RUFDRDtBQUNBO0FBQ0E7Ozs7RUFDTyxJQUFNNkQsZUFBa0YsR0FBR2YscUJBQTNGO0VBRVA7QUFDQTtBQUNBOzs7O0VBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNnQix5QkFBVCxDQUFtQzFDLEtBQW5DLEVBQStDRSxJQUEvQyxFQUE4RDBCLFVBQTlELEVBQTJHO0lBQ2pILElBQU1oRCxNQUFNLEdBQUdDLElBQUksQ0FBQzhELG9CQUFELENBQW5CO0lBQ0EvRCxNQUFNLENBQUNxRCxVQUFQLEdBQW9CTCxVQUFwQjtJQUNBaEQsTUFBTSxDQUFDZ0UsTUFBUCxHQUFnQjVDLEtBQWhCO0lBQ0FwQixNQUFNLENBQUNpRSxLQUFQLEdBQWUzQyxJQUFmLENBSmlILENBTWpIOztJQUNBdEIsTUFBTSxDQUFDQyxJQUFQLENBQVlTLEdBQVosQ0FBZ0JDLGtCQUFoQixDQUFtQyxVQUFDQyxVQUFELEVBQXdCO01BQzFELE9BQU9BLFVBQVUsS0FBSyw0Q0FBdEI7SUFDQSxDQUZEO0lBR0FaLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZK0IsUUFBWixDQUFxQnJCLGtCQUFyQixDQUF3QyxZQUFNO01BQzdDLE9BQU9YLE1BQU0sQ0FBQ3FELFVBQWQ7SUFDQSxDQUZEO0lBR0FyRCxNQUFNLENBQUNDLElBQVAsQ0FBWWlFLFFBQVosQ0FBcUJ2RCxrQkFBckIsQ0FBd0MsWUFBTTtNQUM3QyxPQUFPWCxNQUFNLENBQUNnRSxNQUFkO0lBQ0EsQ0FGRDtJQUdBaEUsTUFBTSxDQUFDQyxJQUFQLENBQVk2QixPQUFaLENBQW9CbkIsa0JBQXBCLENBQXVDLFlBQU07TUFDNUMsT0FBT1gsTUFBTSxDQUFDaUUsS0FBZDtJQUNBLENBRkQ7SUFJQSxPQUFPakUsTUFBUDtFQUNBO0VBQ0Q7QUFDQTtBQUNBOzs7O0VBQ08sSUFBTW1FLG1CQUFvRixHQUFHTCx5QkFBN0Y7RUFFUDtBQUNBO0FBQ0E7Ozs7RUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTTSwwQkFBVCxDQUFvQ0MsU0FBcEMsRUFBNEY7SUFDbEcsSUFBTXJFLE1BQU0sR0FBR0MsSUFBSSxDQUFDcUUsZ0JBQUQsQ0FBbkI7SUFDQXRFLE1BQU0sQ0FBQ3VFLFVBQVAsR0FBb0JGLFNBQXBCLENBRmtHLENBSWxHOztJQUNBckUsTUFBTSxDQUFDQyxJQUFQLENBQVlTLEdBQVosQ0FBZ0JDLGtCQUFoQixDQUFtQyxVQUFDQyxVQUFELEVBQXdCO01BQzFELE9BQU9BLFVBQVUsS0FBSywrQkFBdEI7SUFDQSxDQUZEO0lBR0FaLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZdUUsV0FBWixDQUF3QjdELGtCQUF4QixDQUEyQyxZQUFNO01BQ2hELE9BQU9YLE1BQU0sQ0FBQ3VFLFVBQWQ7SUFDQSxDQUZEO0lBR0F2RSxNQUFNLENBQUNDLElBQVAsQ0FBWWlFLFFBQVosQ0FBcUJ2RCxrQkFBckIsQ0FBd0MsWUFBTTtNQUM3QyxPQUFPWCxNQUFNLENBQUN1RSxVQUFQLENBQWtCcEIsR0FBbEIsQ0FBc0IsVUFBQ3NCLE9BQUQ7UUFBQSxPQUFhQSxPQUFPLENBQUNQLFFBQVIsRUFBYjtNQUFBLENBQXRCLENBQVA7SUFDQSxDQUZEO0lBSUEsT0FBT2xFLE1BQVA7RUFDQTtFQUNEO0FBQ0E7QUFDQTs7OztFQUNPLElBQU0wRSxvQkFBb0YsR0FBR04sMEJBQTdGO0VBRVA7QUFDQTtBQUNBOzs7O0VBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTTyx3QkFBVCxDQUFrQ0MsUUFBbEMsRUFBa0Q1QixVQUFsRCxFQUE4RjtJQUNwRyxJQUFNaEQsTUFBTSxHQUFHQyxJQUFJLENBQUM0RSxtQkFBRCxDQUFuQjtJQUNBN0UsTUFBTSxDQUFDOEUsU0FBUCxHQUFtQjlCLFVBQW5CO0lBQ0FoRCxNQUFNLENBQUMrRSxZQUFQLEdBQXNCbkYsaUJBQWlCLENBQUNnRixRQUFRLElBQUksRUFBYixFQUFpQjVFLE1BQWpCLENBQXZDLENBSG9HLENBS3BHOztJQUNBQSxNQUFNLENBQUNnRixzQkFBUCxHQUFnQyxZQUFNO01BQ3JDLE9BQU9oRixNQUFNLENBQUMrRSxZQUFkO0lBQ0EsQ0FGRDs7SUFHQS9FLE1BQU0sQ0FBQ3NELFFBQVAsR0FBa0IsVUFBQzJCLE1BQUQsRUFBdUI7TUFDeENqRixNQUFNLENBQUM4RSxTQUFQLEdBQW1CRyxNQUFuQjtJQUNBLENBRkQsQ0FUb0csQ0FhcEc7OztJQUNBakYsTUFBTSxDQUFDQyxJQUFQLENBQVlTLEdBQVosQ0FBZ0JDLGtCQUFoQixDQUFtQyxVQUFDQyxVQUFELEVBQXdCO01BQzFELE9BQU9BLFVBQVUsS0FBSywyQ0FBdEI7SUFDQSxDQUZEO0lBR0FaLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZaUYsZUFBWixDQUE0QnZFLGtCQUE1QixDQUErQyxZQUFNO01BQ3BELE9BQU9YLE1BQU0sQ0FBQytFLFlBQWQ7SUFDQSxDQUZEO0lBR0EvRSxNQUFNLENBQUNDLElBQVAsQ0FBWStCLFFBQVosQ0FBcUJyQixrQkFBckIsQ0FBd0MsWUFBTTtNQUM3QyxPQUFPWCxNQUFNLENBQUM4RSxTQUFkO0lBQ0EsQ0FGRDtJQUdBOUUsTUFBTSxDQUFDQyxJQUFQLENBQVlrRixPQUFaLENBQW9CQyxpQkFBcEIsQ0FBc0MsSUFBdEM7SUFFQSxPQUFPcEYsTUFBUDtFQUNBO0VBQ0Q7QUFDQTtBQUNBOzs7O0VBQ08sSUFBTXFGLGtCQUFzRixHQUFHVix3QkFBL0Y7RUFFUDtBQUNBO0FBQ0E7Ozs7RUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTVyxtQkFBVCxDQUE2QkMsU0FBN0IsRUFBNkQ7SUFDbkUsSUFBTXZGLE1BQU0sR0FBR0MsSUFBSSxDQUFDdUYsY0FBRCxDQUFuQjtJQUNBeEYsTUFBTSxDQUFDeUYsWUFBUCxHQUFzQjdGLGlCQUFpQixDQUFDMkYsU0FBUyxJQUFJLEVBQWQsQ0FBdkMsQ0FGbUUsQ0FJbkU7O0lBQ0F2RixNQUFNLENBQUNDLElBQVAsQ0FBWXlGLGNBQVosQ0FBMkIvRSxrQkFBM0IsQ0FBOEMsVUFBQ2dGLEtBQUQsRUFBbUI7TUFDaEUsT0FBTy9GLGlCQUFpQixDQUFDO1FBQUVnRyxLQUFLLEVBQUVEO01BQVQsQ0FBRCxDQUF4QjtJQUNBLENBRkQ7SUFHQTNGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZb0IsU0FBWixDQUFzQlYsa0JBQXRCLENBQXlDLFVBQUNnRixLQUFELEVBQW1CO01BQzNELE9BQU8zRixNQUFNLENBQUN5RixZQUFQLENBQW9CNUUsV0FBcEIsQ0FBZ0M4RSxLQUFoQyxDQUFQO0lBQ0EsQ0FGRDtJQUdBM0YsTUFBTSxDQUFDQyxJQUFQLENBQVk0RixvQkFBWixDQUFpQ2xGLGtCQUFqQyxDQUFvRCxVQUFDZ0YsS0FBRCxFQUFtQjtNQUN0RSxPQUFPL0YsaUJBQWlCLENBQUM7UUFBRWdHLEtBQUssRUFBRUQ7TUFBVCxDQUFELENBQXhCO0lBQ0EsQ0FGRDtJQUdBM0YsTUFBTSxDQUFDQyxJQUFQLENBQVk2RixXQUFaLENBQXdCbkYsa0JBQXhCLENBQTJDLFVBQUNnRixLQUFELEVBQW1CO01BQzdELElBQU1JLFNBQVMsR0FBRyxJQUFJUCxjQUFKLEVBQWxCO01BQ0EsT0FBT0csS0FBSyxHQUFHSSxTQUFTLENBQUNELFdBQVYsQ0FBc0JILEtBQXRCLENBQUgsR0FBa0NBLEtBQTlDO0lBQ0EsQ0FIRDtJQUtBLE9BQU8zRixNQUFQO0VBQ0E7RUFDRDtBQUNBO0FBQ0E7Ozs7RUFDTyxJQUFNZ0csYUFBcUQsR0FBR1YsbUJBQTlEO0VBRVA7QUFDQTtBQUNBOzs7O0VBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTVyxlQUFULENBQXlCQyxnQkFBekIsRUFBNkRDLG1CQUE3RCxFQUFrSDtJQUN4SCxJQUFNbkcsTUFBTSxHQUFHQyxJQUFJLENBQUNtRyxVQUFELENBQW5CO0lBQ0FwRyxNQUFNLENBQUNxRyxlQUFQLEdBQXlCSCxnQkFBekI7SUFDQWxHLE1BQU0sQ0FBQ3NHLGtCQUFQLEdBQTRCSCxtQkFBNUI7O0lBQ0EsSUFBSUQsZ0JBQUosRUFBc0I7TUFDckJBLGdCQUFnQixDQUFDNUMsUUFBakIsQ0FBMEJ0RCxNQUExQjtJQUNBOztJQUNELElBQUltRyxtQkFBSixFQUF5QjtNQUN4QkEsbUJBQW1CLENBQUM3QyxRQUFwQixDQUE2QnRELE1BQTdCO0lBQ0EsQ0FUdUgsQ0FXeEg7OztJQUNBQSxNQUFNLENBQUN1RyxZQUFQLEdBQXNCLFVBQUNDLFVBQUQsRUFBK0I7TUFDcER4RyxNQUFNLENBQUN3RyxVQUFQLEdBQW9CQSxVQUFwQjtJQUNBLENBRkQsQ0Fad0gsQ0FnQnhIOzs7SUFDQXhHLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZd0csUUFBWixDQUFxQjlGLGtCQUFyQixDQUF3QyxZQUFNO01BQzdDLE9BQU9YLE1BQU0sQ0FBQ3FHLGVBQWQ7SUFDQSxDQUZEO0lBR0FyRyxNQUFNLENBQUNDLElBQVAsQ0FBWXlHLFdBQVosQ0FBd0IvRixrQkFBeEIsQ0FBMkMsWUFBTTtNQUNoRCxPQUFPWCxNQUFNLENBQUNzRyxrQkFBZDtJQUNBLENBRkQ7SUFHQXRHLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZMEcsWUFBWixDQUF5QmhHLGtCQUF6QixDQUE0QyxZQUFNO01BQ2pELE9BQU9YLE1BQU0sQ0FBQ3dHLFVBQWQ7SUFDQSxDQUZEO0lBSUEsT0FBT3hHLE1BQVA7RUFDQTtFQUNEO0FBQ0E7QUFDQTs7OztFQUNPLElBQU00RyxTQUEwRyxHQUN0SFgsZUFETTtFQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztFQUNPLFNBQVNZLDhCQUFULENBQXdDWCxnQkFBeEMsRUFBc0Y7SUFDNUYsT0FBT0QsZUFBZSxDQUFDQyxnQkFBRCxDQUF0QjtFQUNBO0VBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztFQUNPLFNBQVNZLGlDQUFULENBQTJDWCxtQkFBM0MsRUFBK0Y7SUFDckcsT0FBT0YsZUFBZSxDQUFDYyxTQUFELEVBQVlaLG1CQUFaLENBQXRCO0VBQ0E7RUFFRDtBQUNBO0FBQ0E7Ozs7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNhLGNBQVQsR0FBb0M7SUFDMUMsSUFBTWhILE1BQU0sR0FBR0MsSUFBSSxDQUFDZ0gsSUFBRCxDQUFuQixDQUQwQyxDQUcxQzs7SUFDQWpILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZUyxHQUFaLENBQWdCQyxrQkFBaEIsQ0FBbUMsVUFBQ0MsVUFBRCxFQUF3QjtNQUMxRCxPQUFPQSxVQUFVLEtBQUssc0JBQXRCO0lBQ0EsQ0FGRDtJQUlBLE9BQU9aLE1BQVA7RUFDQTtFQUNEO0FBQ0E7QUFDQTs7OztFQUNPLElBQU1rSCxRQUE0QixHQUFHRixjQUFyQztFQUVQO0FBQ0E7QUFDQTs7OztFQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTRyxvQkFBVCxHQUFnRDtJQUN0RCxJQUFNbkgsTUFBTSxHQUFHQyxJQUFJLENBQUNtSCxVQUFELENBQW5CO0lBQ0FwSCxNQUFNLENBQUNxSCxRQUFQLEdBQWtCcEgsSUFBSSxDQUFDcUgsZUFBRCxDQUF0QjtJQUNBdEgsTUFBTSxDQUFDdUgsU0FBUCxHQUFtQnRILElBQUksQ0FBQ3VILGdCQUFELENBQXZCO0lBQ0F4SCxNQUFNLENBQUN5SCxZQUFQLEdBQXNCeEgsSUFBSSxDQUFDeUgsV0FBRCxDQUExQjtJQUNBMUgsTUFBTSxDQUFDMkgsUUFBUCxHQUFrQjFILElBQUksQ0FBQzJILFFBQUQsQ0FBdEIsQ0FMc0QsQ0FPdEQ7O0lBQ0E1SCxNQUFNLENBQUNDLElBQVAsQ0FBWTRILE9BQVosQ0FBb0JqRSxlQUFwQixDQUFvQ29ELGNBQWMsRUFBbEQ7SUFDQWhILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZUyxHQUFaLENBQWdCa0QsZUFBaEIsQ0FBZ0MsS0FBaEM7SUFFQSxPQUFPNUQsTUFBUDtFQUNBO0VBQ0Q7QUFDQTtBQUNBOzs7O0VBQ08sSUFBTThILGNBQXdDLEdBQUdYLG9CQUFqRDs7O0VBT1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU1ksT0FBVCxDQUFpQkMsUUFBakIsRUFBdUQ7SUFDN0QsSUFBTXpFLEtBQUssR0FBRyxDQUFBeUUsUUFBUSxTQUFSLElBQUFBLFFBQVEsV0FBUixZQUFBQSxRQUFRLENBQUV6RSxLQUFWLEtBQW1CMEMsZUFBZSxFQUFoRDtJQUNBLElBQU1nQyxJQUFJLEdBQUcsQ0FBQUQsUUFBUSxTQUFSLElBQUFBLFFBQVEsV0FBUixZQUFBQSxRQUFRLENBQUVDLElBQVYsS0FBa0JqQixjQUFjLEVBQTdDO0lBQ0EsSUFBTWtCLFVBQVUsR0FBRyxDQUFBRixRQUFRLFNBQVIsSUFBQUEsUUFBUSxXQUFSLFlBQUFBLFFBQVEsQ0FBRUUsVUFBVixLQUF3QmYsb0JBQW9CLEVBQS9EO0lBRUFjLElBQUksQ0FBQ2hJLElBQUwsQ0FBVWtJLGFBQVYsQ0FBd0J2RSxlQUF4QixDQUF3Q3NFLFVBQXhDO0lBQ0FELElBQUksQ0FBQ2hJLElBQUwsQ0FBVStCLFFBQVYsQ0FBbUI0QixlQUFuQixDQUFtQ0wsS0FBbkM7SUFDQTJFLFVBQVUsQ0FBQ2pJLElBQVgsQ0FBZ0I0SCxPQUFoQixDQUF3QmpFLGVBQXhCLENBQXdDcUUsSUFBeEM7SUFFQSxPQUFPO01BQUUxRSxLQUFLLEVBQUxBLEtBQUY7TUFBUzBFLElBQUksRUFBSkEsSUFBVDtNQUFlQyxVQUFVLEVBQVZBO0lBQWYsQ0FBUDtFQUNBIn0=