easy-gestures 2.0.25 → 2.0.27
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.
- package/lib/constants.js +8 -8
- package/lib/customEventTypes.js +16 -16
- package/lib/example/preamble.js +2 -2
- package/lib/example/view.js +62 -212
- package/lib/example.js +6 -6
- package/lib/index.js +2 -2
- package/lib/mixins/touch.js +160 -162
- package/lib/position/relative.js +33 -78
- package/lib/position.js +34 -82
- package/lib/preamble.js +2 -2
- package/lib/selectors.js +4 -4
- package/lib/utilities/positions.js +29 -55
- package/package.json +5 -1
- package/.swcrc +0 -11
- package/bin/main.js +0 -15
- package/example.js +0 -34485
- package/index.html +0 -52
package/lib/mixins/touch.js
CHANGED
|
@@ -8,25 +8,25 @@ Object.defineProperty(exports, "default", {
|
|
|
8
8
|
return _default;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
const _easy = require("easy");
|
|
12
|
+
const _necessary = require("necessary");
|
|
13
|
+
const _relative = /*#__PURE__*/ _interop_require_default(require("../position/relative"));
|
|
14
|
+
const _constants = require("../constants");
|
|
15
|
+
const _positions = require("../utilities/positions");
|
|
16
|
+
const _customEventTypes = require("../customEventTypes");
|
|
17
17
|
function _interop_require_default(obj) {
|
|
18
18
|
return obj && obj.__esModule ? obj : {
|
|
19
19
|
default: obj
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
const { push, first, second } = _necessary.arrayUtilities;
|
|
23
23
|
function enableTouch() {
|
|
24
|
-
|
|
24
|
+
const tapInterval = null, startMagnitude = null, startPositions = [], movingPositions = [];
|
|
25
25
|
this.updateState({
|
|
26
|
-
tapInterval
|
|
27
|
-
startMagnitude
|
|
28
|
-
startPositions
|
|
29
|
-
movingPositions
|
|
26
|
+
tapInterval,
|
|
27
|
+
startMagnitude,
|
|
28
|
+
startPositions,
|
|
29
|
+
movingPositions
|
|
30
30
|
});
|
|
31
31
|
this.onMouseDown(this.mouseDownHandler);
|
|
32
32
|
this.onMouseMove(this.mouseMoveHandler);
|
|
@@ -44,218 +44,217 @@ function disableTouch() {
|
|
|
44
44
|
this.offTouchEnd(this.touchEndHandler);
|
|
45
45
|
}
|
|
46
46
|
function onCustomPress(pressCustomHandler, element) {
|
|
47
|
-
|
|
47
|
+
const customEventType = _customEventTypes.PRESS_CUSTOM_EVENT_TYPE, customHandler = pressCustomHandler; ///
|
|
48
48
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
49
49
|
}
|
|
50
50
|
function offCustomPress(pressCustomHandler, element) {
|
|
51
|
-
|
|
51
|
+
const customEventType = _customEventTypes.PRESS_CUSTOM_EVENT_TYPE, customHandler = pressCustomHandler; ///
|
|
52
52
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
53
53
|
}
|
|
54
54
|
function onCustomDragUp(dragUpCustomHandler, element) {
|
|
55
|
-
|
|
55
|
+
const customEventType = _customEventTypes.DRAG_UP_CUSTOM_EVENT_TYPE, customHandler = dragUpCustomHandler; ///
|
|
56
56
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
57
57
|
}
|
|
58
58
|
function offCustomDragUp(dragUpCustomHandler, element) {
|
|
59
|
-
|
|
59
|
+
const customEventType = _customEventTypes.DRAG_UP_CUSTOM_EVENT_TYPE, customHandler = dragUpCustomHandler; ///
|
|
60
60
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
61
61
|
}
|
|
62
62
|
function onCustomDragDown(dragDownCustomHandler, element) {
|
|
63
|
-
|
|
63
|
+
const customEventType = _customEventTypes.DRAG_DOWN_CUSTOM_EVENT_TYPE, customHandler = dragDownCustomHandler; ///
|
|
64
64
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
65
65
|
}
|
|
66
66
|
function offCustomDragDown(dragDownCustomHandler, element) {
|
|
67
|
-
|
|
67
|
+
const customEventType = _customEventTypes.DRAG_DOWN_CUSTOM_EVENT_TYPE, customHandler = dragDownCustomHandler; ///
|
|
68
68
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
69
69
|
}
|
|
70
70
|
function onCustomDragLeft(dragLeftCustomHandler, element) {
|
|
71
|
-
|
|
71
|
+
const customEventType = _customEventTypes.DRAG_LEFT_CUSTOM_EVENT_TYPE, customHandler = dragLeftCustomHandler; ///
|
|
72
72
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
73
73
|
}
|
|
74
74
|
function offCustomDragLeft(dragLeftCustomHandler, element) {
|
|
75
|
-
|
|
75
|
+
const customEventType = _customEventTypes.DRAG_LEFT_CUSTOM_EVENT_TYPE, customHandler = dragLeftCustomHandler; ///
|
|
76
76
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
77
77
|
}
|
|
78
78
|
function onCustomDragRight(dragRightCustomHandler, element) {
|
|
79
|
-
|
|
79
|
+
const customEventType = _customEventTypes.DRAG_RIGHT_CUSTOM_EVENT_TYPE, customHandler = dragRightCustomHandler; ///
|
|
80
80
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
81
81
|
}
|
|
82
82
|
function offCustomDragRight(dragRightCustomHandler, element) {
|
|
83
|
-
|
|
83
|
+
const customEventType = _customEventTypes.DRAG_RIGHT_CUSTOM_EVENT_TYPE, customHandler = dragRightCustomHandler; ///
|
|
84
84
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
85
85
|
}
|
|
86
86
|
function onCustomDragStart(dragStartCustomHandler, element) {
|
|
87
|
-
|
|
87
|
+
const customEventType = _customEventTypes.DRAG_START_CUSTOM_EVENT_TYPE, customHandler = dragStartCustomHandler; ///
|
|
88
88
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
89
89
|
}
|
|
90
90
|
function offCustomDragStart(dragStartCustomHandler, element) {
|
|
91
|
-
|
|
91
|
+
const customEventType = _customEventTypes.DRAG_START_CUSTOM_EVENT_TYPE, customHandler = dragStartCustomHandler; ///
|
|
92
92
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
93
93
|
}
|
|
94
94
|
function onCustomSwipeUp(swipeUpCustomHandler, element) {
|
|
95
|
-
|
|
95
|
+
const customEventType = _customEventTypes.SWIPE_UP_CUSTOM_EVENT_TYPE, customHandler = swipeUpCustomHandler; ///
|
|
96
96
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
97
97
|
}
|
|
98
98
|
function offCustomSwipeUp(swipeUpCustomHandler, element) {
|
|
99
|
-
|
|
99
|
+
const customEventType = _customEventTypes.SWIPE_UP_CUSTOM_EVENT_TYPE, customHandler = swipeUpCustomHandler; ///
|
|
100
100
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
101
101
|
}
|
|
102
102
|
function onCustomSwipeDown(swipeDownCustomHandler, element) {
|
|
103
|
-
|
|
103
|
+
const customEventType = _customEventTypes.SWIPE_DOWN_CUSTOM_EVENT_TYPE, customHandler = swipeDownCustomHandler; ///
|
|
104
104
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
105
105
|
}
|
|
106
106
|
function offCustomSwipeDown(swipeDownCustomHandler, element) {
|
|
107
|
-
|
|
107
|
+
const customEventType = _customEventTypes.SWIPE_DOWN_CUSTOM_EVENT_TYPE, customHandler = swipeDownCustomHandler; ///
|
|
108
108
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
109
109
|
}
|
|
110
110
|
function onCustomSwipeLeft(swipeLeftCustomHandler, element) {
|
|
111
|
-
|
|
111
|
+
const customEventType = _customEventTypes.SWIPE_LEFT_CUSTOM_EVENT_TYPE, customHandler = swipeLeftCustomHandler; ///
|
|
112
112
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
113
113
|
}
|
|
114
114
|
function offCustomSwipeLeft(swipeLeftCustomHandler, element) {
|
|
115
|
-
|
|
115
|
+
const customEventType = _customEventTypes.SWIPE_LEFT_CUSTOM_EVENT_TYPE, customHandler = swipeLeftCustomHandler; ///
|
|
116
116
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
117
117
|
}
|
|
118
118
|
function onCustomSwipeRight(swipeRightCustomHandler, element) {
|
|
119
|
-
|
|
119
|
+
const customEventType = _customEventTypes.SWIPE_RIGHT_CUSTOM_EVENT_TYPE, customHandler = swipeRightCustomHandler; ///
|
|
120
120
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
121
121
|
}
|
|
122
122
|
function offCustomSwipeRight(swipeRightCustomHandler, element) {
|
|
123
|
-
|
|
123
|
+
const customEventType = _customEventTypes.SWIPE_RIGHT_CUSTOM_EVENT_TYPE, customHandler = swipeRightCustomHandler; ///
|
|
124
124
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
125
125
|
}
|
|
126
126
|
function onCustomPinchMove(pinchMoveCustomHandler, element) {
|
|
127
|
-
|
|
127
|
+
const customEventType = _customEventTypes.PINCH_MOVE_CUSTOM_EVENT_TYPE, customHandler = pinchMoveCustomHandler; ///
|
|
128
128
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
129
129
|
}
|
|
130
130
|
function offCustomPinchMove(pinchMoveCustomHandler, element) {
|
|
131
|
-
|
|
131
|
+
const customEventType = _customEventTypes.PINCH_MOVE_CUSTOM_EVENT_TYPE, customHandler = pinchMoveCustomHandler; ///
|
|
132
132
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
133
133
|
}
|
|
134
134
|
function onCustomPinchStart(pinchStartCustomHandler, element) {
|
|
135
|
-
|
|
135
|
+
const customEventType = _customEventTypes.PINCH_START_CUSTOM_EVENT_TYPE, customHandler = pinchStartCustomHandler; ///
|
|
136
136
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
137
137
|
}
|
|
138
138
|
function offCustomPinchStart(pinchStartCustomHandler, element) {
|
|
139
|
-
|
|
139
|
+
const customEventType = _customEventTypes.PINCH_START_CUSTOM_EVENT_TYPE, customHandler = pinchStartCustomHandler; ///
|
|
140
140
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
141
141
|
}
|
|
142
142
|
function onCustomPinchStop(pinchStopCustomHandler, element) {
|
|
143
|
-
|
|
143
|
+
const customEventType = _customEventTypes.PINCH_STOP_CUSTOM_EVENT_TYPE, customHandler = pinchStopCustomHandler; ///
|
|
144
144
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
145
145
|
}
|
|
146
146
|
function offCustomPinchStop(pinchStopCustomHandler, element) {
|
|
147
|
-
|
|
147
|
+
const customEventType = _customEventTypes.PINCH_STOP_CUSTOM_EVENT_TYPE, customHandler = pinchStopCustomHandler; ///
|
|
148
148
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
149
149
|
}
|
|
150
150
|
function onCustomSingleTap(singleTapCustomHandler, element) {
|
|
151
|
-
|
|
151
|
+
const customEventType = _customEventTypes.SINGLE_TAP_CUSTOM_EVENT_TYPE, customHandler = singleTapCustomHandler; ///
|
|
152
152
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
153
153
|
}
|
|
154
154
|
function offCustomSingleTap(singleTapCustomHandler, element) {
|
|
155
|
-
|
|
155
|
+
const customEventType = _customEventTypes.SINGLE_TAP_CUSTOM_EVENT_TYPE, customHandler = singleTapCustomHandler; ///
|
|
156
156
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
157
157
|
}
|
|
158
158
|
function onCustomDoubleTap(doubleTapCustomHandler, element) {
|
|
159
|
-
|
|
159
|
+
const customEventType = _customEventTypes.DOUBLE_TAP_CUSTOM_EVENT_TYPE, customHandler = doubleTapCustomHandler; ///
|
|
160
160
|
this.onCustomEvent(customEventType, customHandler, element);
|
|
161
161
|
}
|
|
162
162
|
function offCustomDoubleTap(doubleTapCustomHandler, element) {
|
|
163
|
-
|
|
163
|
+
const customEventType = _customEventTypes.DOUBLE_TAP_CUSTOM_EVENT_TYPE, customHandler = doubleTapCustomHandler; ///
|
|
164
164
|
this.offCustomEvent(customEventType, customHandler, element);
|
|
165
165
|
}
|
|
166
166
|
function getTapInterval() {
|
|
167
|
-
|
|
167
|
+
const { tapInterval } = this.getState();
|
|
168
168
|
return tapInterval;
|
|
169
169
|
}
|
|
170
170
|
function getPressSInterval() {
|
|
171
|
-
|
|
171
|
+
const { pressInterval } = this.getState();
|
|
172
172
|
return pressInterval;
|
|
173
173
|
}
|
|
174
174
|
function getStartMagnitude() {
|
|
175
|
-
|
|
175
|
+
const { startMagnitude } = this.getState();
|
|
176
176
|
return startMagnitude;
|
|
177
177
|
}
|
|
178
178
|
function getStartPositions() {
|
|
179
|
-
|
|
179
|
+
const { startPositions } = this.getState();
|
|
180
180
|
return startPositions;
|
|
181
181
|
}
|
|
182
182
|
function getMovingPositions() {
|
|
183
|
-
|
|
183
|
+
const { movingPositions } = this.getState();
|
|
184
184
|
return movingPositions;
|
|
185
185
|
}
|
|
186
186
|
function setTapInterval(tapInterval) {
|
|
187
187
|
this.updateState({
|
|
188
|
-
tapInterval
|
|
188
|
+
tapInterval
|
|
189
189
|
});
|
|
190
190
|
}
|
|
191
191
|
function setPressSInterval(pressInterval) {
|
|
192
192
|
this.updateState({
|
|
193
|
-
pressInterval
|
|
193
|
+
pressInterval
|
|
194
194
|
});
|
|
195
195
|
}
|
|
196
196
|
function setStartMagnitude(startMagnitude) {
|
|
197
197
|
this.updateState({
|
|
198
|
-
startMagnitude
|
|
198
|
+
startMagnitude
|
|
199
199
|
});
|
|
200
200
|
}
|
|
201
201
|
function setStartPositions(startPositions) {
|
|
202
202
|
this.updateState({
|
|
203
|
-
startPositions
|
|
203
|
+
startPositions
|
|
204
204
|
});
|
|
205
205
|
}
|
|
206
206
|
function setMovingPositions(movingPositions) {
|
|
207
207
|
this.updateState({
|
|
208
|
-
movingPositions
|
|
208
|
+
movingPositions
|
|
209
209
|
});
|
|
210
210
|
}
|
|
211
211
|
function touchStartHandler(event, element) {
|
|
212
|
-
this.startHandler(event, element,
|
|
213
|
-
|
|
212
|
+
this.startHandler(event, element, (event)=>{
|
|
213
|
+
const touchEvent = event, changed = false, positions = (0, _positions.positionsFromTouchEvent)(touchEvent, changed);
|
|
214
214
|
return positions;
|
|
215
215
|
});
|
|
216
216
|
}
|
|
217
217
|
function mouseDownHandler(event, element) {
|
|
218
|
-
this.startHandler(event, element,
|
|
219
|
-
|
|
218
|
+
this.startHandler(event, element, (event)=>{
|
|
219
|
+
const mouseEvent = event, positions = (0, _positions.positionsFromMouseEvent)(mouseEvent);
|
|
220
220
|
return positions;
|
|
221
221
|
});
|
|
222
222
|
}
|
|
223
223
|
function touchMoveHandler(event, element) {
|
|
224
|
-
this.moveHandler(event, element,
|
|
225
|
-
|
|
224
|
+
this.moveHandler(event, element, (event)=>{
|
|
225
|
+
const touchEvent = event, changed = false, positions = (0, _positions.positionsFromTouchEvent)(touchEvent, changed);
|
|
226
226
|
return positions;
|
|
227
227
|
});
|
|
228
228
|
}
|
|
229
229
|
function mouseMoveHandler(event, element) {
|
|
230
|
-
this.moveHandler(event, element,
|
|
231
|
-
|
|
230
|
+
this.moveHandler(event, element, (event)=>{
|
|
231
|
+
const mouseEvent = event, positions = (0, _positions.positionsFromMouseEvent)(mouseEvent);
|
|
232
232
|
return positions;
|
|
233
233
|
});
|
|
234
234
|
}
|
|
235
235
|
function touchEndHandler(event, element) {
|
|
236
|
-
this.endHandler(event, element,
|
|
237
|
-
|
|
236
|
+
this.endHandler(event, element, (event)=>{
|
|
237
|
+
const touchEvent = event, changed = true, positions = (0, _positions.positionsFromTouchEvent)(touchEvent, changed);
|
|
238
238
|
return positions;
|
|
239
239
|
});
|
|
240
240
|
}
|
|
241
241
|
function mouseUpHandler(event, element) {
|
|
242
|
-
this.endHandler(event, element,
|
|
243
|
-
|
|
242
|
+
this.endHandler(event, element, (event)=>{
|
|
243
|
+
const mouseEvent = event, positions = (0, _positions.positionsFromMouseEvent)(mouseEvent);
|
|
244
244
|
return positions;
|
|
245
245
|
});
|
|
246
246
|
}
|
|
247
247
|
function startHandler(event, element, positionsFromEvent) {
|
|
248
|
-
|
|
249
|
-
var positions = positionsFromEvent(event), startPositions = this.getStartPositions();
|
|
248
|
+
const positions = positionsFromEvent(event), startPositions = this.getStartPositions();
|
|
250
249
|
(0, _positions.filterPositions)(startPositions, positions);
|
|
251
250
|
push(startPositions, positions);
|
|
252
|
-
|
|
251
|
+
const startingPositionsLength = startPositions.length;
|
|
253
252
|
if (startingPositionsLength === 1) {
|
|
254
253
|
this.dragStart(event, element);
|
|
255
|
-
|
|
254
|
+
let pressInterval = setTimeout(()=>{
|
|
256
255
|
pressInterval = null;
|
|
257
|
-
|
|
258
|
-
|
|
256
|
+
this.setPressSInterval(pressInterval);
|
|
257
|
+
this.press(event, element);
|
|
259
258
|
}, _constants.PRESS_DELAY);
|
|
260
259
|
this.setPressSInterval(pressInterval);
|
|
261
260
|
}
|
|
@@ -264,13 +263,13 @@ function startHandler(event, element, positionsFromEvent) {
|
|
|
264
263
|
}
|
|
265
264
|
}
|
|
266
265
|
function moveHandler(event, element, positionsFromEvent) {
|
|
267
|
-
|
|
266
|
+
const positions = positionsFromEvent(event), startPositions = this.getStartPositions(), movingPositions = this.getMovingPositions();
|
|
268
267
|
(0, _positions.filterPositions)(movingPositions, positions);
|
|
269
268
|
push(movingPositions, positions);
|
|
270
|
-
|
|
269
|
+
const positionsMatch = (0, _positions.matchPositions)(startPositions, movingPositions);
|
|
271
270
|
if (positionsMatch) {
|
|
272
271
|
(0, _positions.sortPositions)(movingPositions, startPositions);
|
|
273
|
-
|
|
272
|
+
const movingPositionsLength = movingPositions.length;
|
|
274
273
|
if (movingPositionsLength === 1) {
|
|
275
274
|
this.drag(event, element);
|
|
276
275
|
}
|
|
@@ -278,7 +277,7 @@ function moveHandler(event, element, positionsFromEvent) {
|
|
|
278
277
|
this.pinch(event, element);
|
|
279
278
|
}
|
|
280
279
|
}
|
|
281
|
-
|
|
280
|
+
let pressInterval = this.getPressSInterval();
|
|
282
281
|
if (pressInterval !== null) {
|
|
283
282
|
clearTimeout(pressInterval);
|
|
284
283
|
pressInterval = null;
|
|
@@ -286,9 +285,9 @@ function moveHandler(event, element, positionsFromEvent) {
|
|
|
286
285
|
}
|
|
287
286
|
}
|
|
288
287
|
function endHandler(event, element, positionsFromEvent) {
|
|
289
|
-
|
|
288
|
+
const positions = positionsFromEvent(event), startPositions = this.getStartPositions(), movingPositions = this.getMovingPositions(), positionsMatch = (0, _positions.matchPositions)(startPositions, movingPositions);
|
|
290
289
|
if (positionsMatch) {
|
|
291
|
-
|
|
290
|
+
const startPositionsLength = startPositions.length;
|
|
292
291
|
if (startPositionsLength === 2) {
|
|
293
292
|
this.pinchStop(event, element);
|
|
294
293
|
}
|
|
@@ -299,7 +298,7 @@ function endHandler(event, element, positionsFromEvent) {
|
|
|
299
298
|
}
|
|
300
299
|
(0, _positions.filterPositions)(startPositions, positions);
|
|
301
300
|
(0, _positions.filterPositions)(movingPositions, positions);
|
|
302
|
-
|
|
301
|
+
let pressInterval = this.getPressSInterval();
|
|
303
302
|
if (pressInterval !== null) {
|
|
304
303
|
clearTimeout(pressInterval);
|
|
305
304
|
pressInterval = null;
|
|
@@ -307,21 +306,20 @@ function endHandler(event, element, positionsFromEvent) {
|
|
|
307
306
|
}
|
|
308
307
|
}
|
|
309
308
|
function possibleTap(event, element) {
|
|
310
|
-
|
|
309
|
+
const startPositions = this.getStartPositions(), movingPositions = this.getMovingPositions(), firstStartPosition = first(startPositions), firstMovingPosition = first(movingPositions), firstPosition = firstStartPosition, secondPosition = firstMovingPosition, relativePosition = _relative.default.fromFirstPositionAndSecondPosition(firstPosition, secondPosition), time = relativePosition.getTime(), speed = relativePosition.getSpeed();
|
|
311
310
|
if (speed === 0 && time < _constants.MAXIMUM_TAP_TIME) {
|
|
312
311
|
this.tap(event, element);
|
|
313
312
|
}
|
|
314
313
|
}
|
|
315
314
|
function possibleSwipe(event, element) {
|
|
316
|
-
|
|
315
|
+
const startPositions = this.getStartPositions(), movingPositions = this.getMovingPositions(), firstStartPosition = first(startPositions), firstMovingPosition = first(movingPositions), firstPosition = firstStartPosition, secondPosition = firstMovingPosition, relativePosition = _relative.default.fromFirstPositionAndSecondPosition(firstPosition, secondPosition), direction = relativePosition.getDirection(), speed = relativePosition.getSpeed();
|
|
317
316
|
if (speed > _constants.MINIMUM_SWIPE_SPEED) {
|
|
318
317
|
this.swipe(event, element, speed, direction);
|
|
319
318
|
}
|
|
320
319
|
}
|
|
321
320
|
function tap(event, element) {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
var tapInterval = this.getTapInterval();
|
|
321
|
+
const startPositions = this.getStartPositions(), firstStartPosition = first(startPositions), startPosition = firstStartPosition, top = startPosition.getTop(), left = startPosition.getLeft();
|
|
322
|
+
let tapInterval = this.getTapInterval();
|
|
325
323
|
if (tapInterval !== null) {
|
|
326
324
|
clearTimeout(tapInterval);
|
|
327
325
|
tapInterval = null;
|
|
@@ -329,16 +327,16 @@ function tap(event, element) {
|
|
|
329
327
|
this.doubleTap(event, element, top, left);
|
|
330
328
|
return;
|
|
331
329
|
}
|
|
332
|
-
tapInterval = setTimeout(
|
|
330
|
+
tapInterval = setTimeout(()=>{
|
|
333
331
|
tapInterval = null;
|
|
334
|
-
|
|
335
|
-
|
|
332
|
+
this.setTapInterval(tapInterval);
|
|
333
|
+
this.singleTap(event, element, top, left);
|
|
336
334
|
}, _constants.TAP_DELAY);
|
|
337
335
|
this.setTapInterval(tapInterval);
|
|
338
336
|
}
|
|
339
337
|
function drag(event, element) {
|
|
340
|
-
|
|
341
|
-
|
|
338
|
+
const startPositions = this.getStartPositions(), movingPositions = this.getMovingPositions(), firstStartPosition = first(startPositions), firstMovingPosition = first(movingPositions), firstPosition = firstStartPosition, secondPosition = firstMovingPosition, relativePosition = _relative.default.fromFirstPositionAndSecondPosition(firstPosition, secondPosition), top = relativePosition.getTop(), left = relativePosition.getLeft(), direction = relativePosition.getDirection();
|
|
339
|
+
let customEventType = null;
|
|
342
340
|
if (Math.abs(direction) < _constants.MAXIMUM_SPREAD) {
|
|
343
341
|
customEventType = _customEventTypes.DRAG_RIGHT_CUSTOM_EVENT_TYPE;
|
|
344
342
|
}
|
|
@@ -356,15 +354,15 @@ function drag(event, element) {
|
|
|
356
354
|
}
|
|
357
355
|
}
|
|
358
356
|
function pinch(event, element) {
|
|
359
|
-
|
|
357
|
+
const movingPositions = this.getMovingPositions(), firstMovingPosition = first(movingPositions), secondMovingPosition = second(movingPositions), relativeMovingPosition = _relative.default.fromFirstPositionAndSecondPosition(firstMovingPosition, secondMovingPosition), customEventType = _customEventTypes.PINCH_MOVE_CUSTOM_EVENT_TYPE, startMagnitude = this.getStartMagnitude(), magnitude = relativeMovingPosition.getMagnitude(), ratio = magnitude / startMagnitude;
|
|
360
358
|
this.callCustomHandlers(customEventType, event, element, ratio);
|
|
361
359
|
}
|
|
362
360
|
function press(event, element) {
|
|
363
|
-
|
|
361
|
+
const customEventType = _customEventTypes.PRESS_CUSTOM_EVENT_TYPE;
|
|
364
362
|
this.callCustomHandlers(customEventType, event, element);
|
|
365
363
|
}
|
|
366
364
|
function swipe(event, element, speed, direction) {
|
|
367
|
-
|
|
365
|
+
let customEventType = null;
|
|
368
366
|
if (Math.abs(direction) < _constants.MAXIMUM_SPREAD) {
|
|
369
367
|
customEventType = _customEventTypes.SWIPE_RIGHT_CUSTOM_EVENT_TYPE;
|
|
370
368
|
speed = speed * Math.abs(Math.cos(direction));
|
|
@@ -382,96 +380,96 @@ function swipe(event, element, speed, direction) {
|
|
|
382
380
|
speed = speed * Math.abs(Math.cos(direction));
|
|
383
381
|
}
|
|
384
382
|
if (customEventType !== null) {
|
|
385
|
-
|
|
383
|
+
const startPositions = this.getStartPositions(), firstStartPosition = first(startPositions), startPosition = firstStartPosition, top = startPosition.getTop(), left = startPosition.getLeft();
|
|
386
384
|
this.callCustomHandlers(customEventType, event, element, top, left, speed);
|
|
387
385
|
}
|
|
388
386
|
}
|
|
389
387
|
function singleTap(event, element, top, left) {
|
|
390
|
-
|
|
388
|
+
const customEventType = _customEventTypes.SINGLE_TAP_CUSTOM_EVENT_TYPE;
|
|
391
389
|
this.callCustomHandlers(customEventType, event, element, top, left); ///
|
|
392
390
|
}
|
|
393
391
|
function doubleTap(event, element, top, left) {
|
|
394
|
-
|
|
392
|
+
const customEventType = _customEventTypes.DOUBLE_TAP_CUSTOM_EVENT_TYPE;
|
|
395
393
|
this.callCustomHandlers(customEventType, event, element, top, left);
|
|
396
394
|
}
|
|
397
395
|
function dragStart(event, element) {
|
|
398
|
-
|
|
396
|
+
const customEventType = _customEventTypes.DRAG_START_CUSTOM_EVENT_TYPE, startPositions = this.getStartPositions(), firstStartPosition = first(startPositions), startPosition = firstStartPosition, top = startPosition.getTop(), left = startPosition.getLeft();
|
|
399
397
|
this.callCustomHandlers(customEventType, event, element, top, left);
|
|
400
398
|
}
|
|
401
399
|
function pinchStart(event, element) {
|
|
402
|
-
|
|
400
|
+
const customEventType = _customEventTypes.PINCH_START_CUSTOM_EVENT_TYPE, startPositions = this.getStartPositions(), firstStartPosition = first(startPositions), secondStartPosition = second(startPositions), relativeStartPosition = _relative.default.fromFirstPositionAndSecondPosition(firstStartPosition, secondStartPosition), magnitude = relativeStartPosition.getMagnitude(), startMagnitude = magnitude; ///
|
|
403
401
|
this.setStartMagnitude(startMagnitude);
|
|
404
402
|
this.callCustomHandlers(customEventType, event, element);
|
|
405
403
|
}
|
|
406
404
|
function pinchStop(event, element) {
|
|
407
|
-
|
|
405
|
+
const customEventType = _customEventTypes.PINCH_STOP_CUSTOM_EVENT_TYPE;
|
|
408
406
|
this.callCustomHandlers(customEventType, event, element);
|
|
409
407
|
}
|
|
410
|
-
|
|
411
|
-
enableTouch
|
|
412
|
-
disableTouch
|
|
413
|
-
onCustomPress
|
|
414
|
-
offCustomPress
|
|
415
|
-
onCustomDragUp
|
|
416
|
-
offCustomDragUp
|
|
417
|
-
onCustomDragDown
|
|
418
|
-
offCustomDragDown
|
|
419
|
-
onCustomDragLeft
|
|
420
|
-
offCustomDragLeft
|
|
421
|
-
onCustomDragRight
|
|
422
|
-
offCustomDragRight
|
|
423
|
-
onCustomDragStart
|
|
424
|
-
offCustomDragStart
|
|
425
|
-
onCustomSwipeUp
|
|
426
|
-
offCustomSwipeUp
|
|
427
|
-
onCustomSwipeDown
|
|
428
|
-
offCustomSwipeDown
|
|
429
|
-
onCustomSwipeLeft
|
|
430
|
-
offCustomSwipeLeft
|
|
431
|
-
onCustomSwipeRight
|
|
432
|
-
offCustomSwipeRight
|
|
433
|
-
onCustomPinchMove
|
|
434
|
-
offCustomPinchMove
|
|
435
|
-
onCustomPinchStart
|
|
436
|
-
offCustomPinchStart
|
|
437
|
-
onCustomPinchStop
|
|
438
|
-
offCustomPinchStop
|
|
439
|
-
onCustomSingleTap
|
|
440
|
-
offCustomSingleTap
|
|
441
|
-
onCustomDoubleTap
|
|
442
|
-
offCustomDoubleTap
|
|
443
|
-
getTapInterval
|
|
444
|
-
getPressSInterval
|
|
445
|
-
getStartMagnitude
|
|
446
|
-
getStartPositions
|
|
447
|
-
getMovingPositions
|
|
448
|
-
setTapInterval
|
|
449
|
-
setPressSInterval
|
|
450
|
-
setStartMagnitude
|
|
451
|
-
setStartPositions
|
|
452
|
-
setMovingPositions
|
|
453
|
-
touchStartHandler
|
|
454
|
-
mouseDownHandler
|
|
455
|
-
touchMoveHandler
|
|
456
|
-
mouseMoveHandler
|
|
457
|
-
touchEndHandler
|
|
458
|
-
mouseUpHandler
|
|
459
|
-
startHandler
|
|
460
|
-
moveHandler
|
|
461
|
-
endHandler
|
|
462
|
-
possibleTap
|
|
463
|
-
possibleSwipe
|
|
464
|
-
tap
|
|
465
|
-
drag
|
|
466
|
-
pinch
|
|
467
|
-
press
|
|
468
|
-
swipe
|
|
469
|
-
singleTap
|
|
470
|
-
doubleTap
|
|
471
|
-
dragStart
|
|
472
|
-
pinchStart
|
|
473
|
-
pinchStop
|
|
408
|
+
const touchMixins = {
|
|
409
|
+
enableTouch,
|
|
410
|
+
disableTouch,
|
|
411
|
+
onCustomPress,
|
|
412
|
+
offCustomPress,
|
|
413
|
+
onCustomDragUp,
|
|
414
|
+
offCustomDragUp,
|
|
415
|
+
onCustomDragDown,
|
|
416
|
+
offCustomDragDown,
|
|
417
|
+
onCustomDragLeft,
|
|
418
|
+
offCustomDragLeft,
|
|
419
|
+
onCustomDragRight,
|
|
420
|
+
offCustomDragRight,
|
|
421
|
+
onCustomDragStart,
|
|
422
|
+
offCustomDragStart,
|
|
423
|
+
onCustomSwipeUp,
|
|
424
|
+
offCustomSwipeUp,
|
|
425
|
+
onCustomSwipeDown,
|
|
426
|
+
offCustomSwipeDown,
|
|
427
|
+
onCustomSwipeLeft,
|
|
428
|
+
offCustomSwipeLeft,
|
|
429
|
+
onCustomSwipeRight,
|
|
430
|
+
offCustomSwipeRight,
|
|
431
|
+
onCustomPinchMove,
|
|
432
|
+
offCustomPinchMove,
|
|
433
|
+
onCustomPinchStart,
|
|
434
|
+
offCustomPinchStart,
|
|
435
|
+
onCustomPinchStop,
|
|
436
|
+
offCustomPinchStop,
|
|
437
|
+
onCustomSingleTap,
|
|
438
|
+
offCustomSingleTap,
|
|
439
|
+
onCustomDoubleTap,
|
|
440
|
+
offCustomDoubleTap,
|
|
441
|
+
getTapInterval,
|
|
442
|
+
getPressSInterval,
|
|
443
|
+
getStartMagnitude,
|
|
444
|
+
getStartPositions,
|
|
445
|
+
getMovingPositions,
|
|
446
|
+
setTapInterval,
|
|
447
|
+
setPressSInterval,
|
|
448
|
+
setStartMagnitude,
|
|
449
|
+
setStartPositions,
|
|
450
|
+
setMovingPositions,
|
|
451
|
+
touchStartHandler,
|
|
452
|
+
mouseDownHandler,
|
|
453
|
+
touchMoveHandler,
|
|
454
|
+
mouseMoveHandler,
|
|
455
|
+
touchEndHandler,
|
|
456
|
+
mouseUpHandler,
|
|
457
|
+
startHandler,
|
|
458
|
+
moveHandler,
|
|
459
|
+
endHandler,
|
|
460
|
+
possibleTap,
|
|
461
|
+
possibleSwipe,
|
|
462
|
+
tap,
|
|
463
|
+
drag,
|
|
464
|
+
pinch,
|
|
465
|
+
press,
|
|
466
|
+
swipe,
|
|
467
|
+
singleTap,
|
|
468
|
+
doubleTap,
|
|
469
|
+
dragStart,
|
|
470
|
+
pinchStart,
|
|
471
|
+
pinchStop
|
|
474
472
|
};
|
|
475
|
-
|
|
473
|
+
const _default = touchMixins;
|
|
476
474
|
|
|
477
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taXhpbnMvdG91Y2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IHdpbmRvdyB9IGZyb20gXCJlYXN5XCI7XG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IFJlbGF0aXZlUG9zaXRpb24gZnJvbSBcIi4uL3Bvc2l0aW9uL3JlbGF0aXZlXCI7XG5cbmltcG9ydCB7IFBJLCBUQVBfREVMQVksIFBSRVNTX0RFTEFZLCBQSV9PVkVSX1RXTywgTUFYSU1VTV9UQVBfVElNRSwgTUlOSU1VTV9TV0lQRV9TUEVFRCwgTUFYSU1VTV9TUFJFQUQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzb3J0UG9zaXRpb25zLCBtYXRjaFBvc2l0aW9ucywgZmlsdGVyUG9zaXRpb25zLCBwb3NpdGlvbnNGcm9tTW91c2VFdmVudCwgcG9zaXRpb25zRnJvbVRvdWNoRXZlbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3Bvc2l0aW9uc1wiO1xuaW1wb3J0IHsgUFJFU1NfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBEUkFHX1VQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgRFJBR19ET1dOX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgRFJBR19MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgRFJBR19SSUdIVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgIERSQUdfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBTV0lQRV9VUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgIFNXSVBFX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBTV0lQRV9MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBQSU5DSF9NT1ZFX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgUElOQ0hfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBQSU5DSF9TVE9QX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgU0lOR0xFX1RBUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgIERPVUJMRV9UQVBfQ1VTVE9NX0VWRU5UX1RZUEUgfSBmcm9tIFwiLi4vY3VzdG9tRXZlbnRUeXBlc1wiO1xuXG5jb25zdCB7IHB1c2gsIGZpcnN0LCBzZWNvbmQgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5mdW5jdGlvbiBlbmFibGVUb3VjaCgpIHtcbiAgY29uc3QgdGFwSW50ZXJ2YWwgPSBudWxsLFxuICAgICAgICBzdGFydE1hZ25pdHVkZSA9IG51bGwsXG4gICAgICAgIHN0YXJ0UG9zaXRpb25zID0gW10sXG4gICAgICAgIG1vdmluZ1Bvc2l0aW9ucyA9IFtdO1xuXG4gIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgIHRhcEludGVydmFsLFxuICAgIHN0YXJ0TWFnbml0dWRlLFxuICAgIHN0YXJ0UG9zaXRpb25zLFxuICAgIG1vdmluZ1Bvc2l0aW9uc1xuICB9KTtcblxuICB0aGlzLm9uTW91c2VEb3duKHRoaXMubW91c2VEb3duSGFuZGxlcik7XG4gIHRoaXMub25Nb3VzZU1vdmUodGhpcy5tb3VzZU1vdmVIYW5kbGVyKTtcblxuICB3aW5kb3cub25Nb3VzZVVwKHRoaXMubW91c2VVcEhhbmRsZXIsIHRoaXMpO1xuXG4gIHRoaXMub25Ub3VjaFN0YXJ0KHRoaXMudG91Y2hTdGFydEhhbmRsZXIpO1xuICB0aGlzLm9uVG91Y2hNb3ZlKHRoaXMudG91Y2hNb3ZlSGFuZGxlcik7XG4gIHRoaXMub25Ub3VjaEVuZCh0aGlzLnRvdWNoRW5kSGFuZGxlcik7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVUb3VjaCgpIHtcbiAgdGhpcy5vZmZNb3VzZURvd24odGhpcy5tb3VzZURvd25IYW5kbGVyKTtcbiAgdGhpcy5vZmZNb3VzZU1vdmUodGhpcy5tb3VzZU1vdmVIYW5kbGVyKTtcblxuICB3aW5kb3cub2ZmTW91c2VVcCh0aGlzLm1vdXNlVXBIYW5kbGVyLCB0aGlzKTtcblxuICB0aGlzLm9mZlRvdWNoU3RhcnQodGhpcy50b3VjaFN0YXJ0SGFuZGxlcik7XG4gIHRoaXMub2ZmVG91Y2hNb3ZlKHRoaXMudG91Y2hNb3ZlSGFuZGxlcik7XG4gIHRoaXMub2ZmVG91Y2hFbmQodGhpcy50b3VjaEVuZEhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbVByZXNzKHByZXNzQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQUkVTU19DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHByZXNzQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVByZXNzKHByZXNzQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQUkVTU19DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHByZXNzQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURyYWdVcChkcmFnVXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfVVBfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkcmFnVXBDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRHJhZ1VwKGRyYWdVcEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19VUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdVcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21EcmFnRG93bihkcmFnRG93bkN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19ET1dOX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gZHJhZ0Rvd25DdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRHJhZ0Rvd24oZHJhZ0Rvd25DdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfRE9XTl9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdEb3duQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURyYWdMZWZ0KGRyYWdMZWZ0Q3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBEUkFHX0xFRlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkcmFnTGVmdEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21EcmFnTGVmdChkcmFnTGVmdEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gZHJhZ0xlZnRDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9mZkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uQ3VzdG9tRHJhZ1JpZ2h0KGRyYWdSaWdodEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19SSUdIVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdSaWdodEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21EcmFnUmlnaHQoZHJhZ1JpZ2h0Q3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBEUkFHX1JJR0hUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gZHJhZ1JpZ2h0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURyYWdTdGFydChkcmFnU3RhcnRDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkcmFnU3RhcnRDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRHJhZ1N0YXJ0KGRyYWdTdGFydEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19TVEFSVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdTdGFydEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21Td2lwZVVwKHN3aXBlVXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX1VQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVVcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21Td2lwZVVwKHN3aXBlVXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX1VQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVVcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21Td2lwZURvd24oc3dpcGVEb3duQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBTV0lQRV9ET1dOX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVEb3duQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVN3aXBlRG93bihzd2lwZURvd25DdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBzd2lwZURvd25DdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9mZkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uQ3VzdG9tU3dpcGVMZWZ0KHN3aXBlTGVmdEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU1dJUEVfTEVGVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHN3aXBlTGVmdEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21Td2lwZUxlZnQoc3dpcGVMZWZ0Q3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBTV0lQRV9MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVMZWZ0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbVN3aXBlUmlnaHQoc3dpcGVSaWdodEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBzd2lwZVJpZ2h0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVN3aXBlUmlnaHQoc3dpcGVSaWdodEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBzd2lwZVJpZ2h0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbVBpbmNoTW92ZShwaW5jaE1vdmVDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX01PVkVfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBwaW5jaE1vdmVDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tUGluY2hNb3ZlKHBpbmNoTW92ZUN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gUElOQ0hfTU9WRV9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHBpbmNoTW92ZUN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21QaW5jaFN0YXJ0KHBpbmNoU3RhcnRDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUQVJUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gcGluY2hTdGFydEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21QaW5jaFN0YXJ0KHBpbmNoU3RhcnRDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUQVJUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gcGluY2hTdGFydEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21QaW5jaFN0b3AocGluY2hTdG9wQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQSU5DSF9TVE9QX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gcGluY2hTdG9wQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVBpbmNoU3RvcChwaW5jaFN0b3BDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUT1BfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBwaW5jaFN0b3BDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9mZkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uQ3VzdG9tU2luZ2xlVGFwKHNpbmdsZVRhcEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU0lOR0xFX1RBUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHNpbmdsZVRhcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21TaW5nbGVUYXAoc2luZ2xlVGFwQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBTSU5HTEVfVEFQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc2luZ2xlVGFwQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURvdWJsZVRhcChkb3VibGVUYXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERPVUJMRV9UQVBfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkb3VibGVUYXBDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRG91YmxlVGFwKGRvdWJsZVRhcEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRE9VQkxFX1RBUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRvdWJsZVRhcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFwSW50ZXJ2YWwoKSB7XG4gIGNvbnN0IHsgdGFwSW50ZXJ2YWwgfSA9IHRoaXMuZ2V0U3RhdGUoKTtcblxuICByZXR1cm4gdGFwSW50ZXJ2YWw7XG59XG5cbmZ1bmN0aW9uIGdldFByZXNzU0ludGVydmFsKCkge1xuICBjb25zdCB7IHByZXNzSW50ZXJ2YWwgfSA9IHRoaXMuZ2V0U3RhdGUoKTtcblxuICByZXR1cm4gcHJlc3NJbnRlcnZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhcnRNYWduaXR1ZGUoKSB7XG4gIGNvbnN0IHsgc3RhcnRNYWduaXR1ZGUgfSA9IHRoaXMuZ2V0U3RhdGUoKTtcblxuICByZXR1cm4gc3RhcnRNYWduaXR1ZGU7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXJ0UG9zaXRpb25zKCkge1xuICBjb25zdCB7IHN0YXJ0UG9zaXRpb25zIH0gPSB0aGlzLmdldFN0YXRlKCk7XG5cbiAgcmV0dXJuIHN0YXJ0UG9zaXRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRNb3ZpbmdQb3NpdGlvbnMoKSB7XG4gIGNvbnN0IHsgbW92aW5nUG9zaXRpb25zIH0gPSB0aGlzLmdldFN0YXRlKCk7XG5cbiAgcmV0dXJuIG1vdmluZ1Bvc2l0aW9ucztcbn1cblxuZnVuY3Rpb24gc2V0VGFwSW50ZXJ2YWwodGFwSW50ZXJ2YWwpIHtcbiAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgdGFwSW50ZXJ2YWxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFByZXNzU0ludGVydmFsKHByZXNzSW50ZXJ2YWwpIHtcbiAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgcHJlc3NJbnRlcnZhbFxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0U3RhcnRNYWduaXR1ZGUoc3RhcnRNYWduaXR1ZGUpIHtcbiAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgc3RhcnRNYWduaXR1ZGVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFN0YXJ0UG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zKSB7XG4gIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgIHN0YXJ0UG9zaXRpb25zXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRNb3ZpbmdQb3NpdGlvbnMobW92aW5nUG9zaXRpb25zKSB7XG4gIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgIG1vdmluZ1Bvc2l0aW9uc1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG91Y2hTdGFydEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpIHtcbiAgdGhpcy5zdGFydEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgY2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgIHBvc2l0aW9ucyA9IHBvc2l0aW9uc0Zyb21Ub3VjaEV2ZW50KHRvdWNoRXZlbnQsIGNoYW5nZWQpO1xuXG4gICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1vdXNlRG93bkhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpIHtcbiAgdGhpcy5zdGFydEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbU1vdXNlRXZlbnQobW91c2VFdmVudCk7XG5cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG91Y2hNb3ZlSGFuZGxlcihldmVudCwgZWxlbWVudCkge1xuICB0aGlzLm1vdmVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB0b3VjaEV2ZW50ID0gZXZlbnQsIC8vL1xuICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZSxcbiAgICAgICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbnNGcm9tVG91Y2hFdmVudCh0b3VjaEV2ZW50LCBjaGFuZ2VkKTtcblxuICAgIHJldHVybiBwb3NpdGlvbnM7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtb3VzZU1vdmVIYW5kbGVyKGV2ZW50LCBlbGVtZW50KSB7XG4gIHRoaXMubW92ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbU1vdXNlRXZlbnQobW91c2VFdmVudCk7XG5cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG91Y2hFbmRIYW5kbGVyKGV2ZW50LCBlbGVtZW50KSB7XG4gIHRoaXMuZW5kSGFuZGxlcihldmVudCwgZWxlbWVudCwgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdG91Y2hFdmVudCA9IGV2ZW50LCAvLy9cbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZSxcbiAgICAgICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbnNGcm9tVG91Y2hFdmVudCh0b3VjaEV2ZW50LCBjaGFuZ2VkKTtcblxuICAgIHJldHVybiBwb3NpdGlvbnM7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtb3VzZVVwSGFuZGxlcihldmVudCwgZWxlbWVudCkge1xuICB0aGlzLmVuZEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbU1vdXNlRXZlbnQobW91c2VFdmVudCk7XG5cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc3RhcnRIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBwb3NpdGlvbnNGcm9tRXZlbnQpIHtcbiAgY29uc3QgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbUV2ZW50KGV2ZW50KSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCk7XG5cbiAgZmlsdGVyUG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zLCBwb3NpdGlvbnMpO1xuXG4gIHB1c2goc3RhcnRQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgY29uc3Qgc3RhcnRpbmdQb3NpdGlvbnNMZW5ndGggPSBzdGFydFBvc2l0aW9ucy5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0aW5nUG9zaXRpb25zTGVuZ3RoID09PSAxKSB7XG4gICAgdGhpcy5kcmFnU3RhcnQoZXZlbnQsIGVsZW1lbnQpO1xuXG4gICAgbGV0IHByZXNzSW50ZXJ2YWwgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHByZXNzSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgICB0aGlzLnNldFByZXNzU0ludGVydmFsKHByZXNzSW50ZXJ2YWwpO1xuXG4gICAgICB0aGlzLnByZXNzKGV2ZW50LCBlbGVtZW50KTtcbiAgICB9LCBQUkVTU19ERUxBWSk7XG5cbiAgICB0aGlzLnNldFByZXNzU0ludGVydmFsKHByZXNzSW50ZXJ2YWwpO1xuICB9XG5cbiAgaWYgKHN0YXJ0aW5nUG9zaXRpb25zTGVuZ3RoID09PSAyKSB7XG4gICAgdGhpcy5waW5jaFN0YXJ0KGV2ZW50LCBlbGVtZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlSGFuZGxlcihldmVudCwgZWxlbWVudCwgcG9zaXRpb25zRnJvbUV2ZW50KSB7XG4gIGNvbnN0IHBvc2l0aW9ucyA9IHBvc2l0aW9uc0Zyb21FdmVudChldmVudCksXG4gICAgICAgIHN0YXJ0UG9zaXRpb25zID0gdGhpcy5nZXRTdGFydFBvc2l0aW9ucygpLFxuICAgICAgICBtb3ZpbmdQb3NpdGlvbnMgPSB0aGlzLmdldE1vdmluZ1Bvc2l0aW9ucygpO1xuXG4gIGZpbHRlclBvc2l0aW9ucyhtb3ZpbmdQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgcHVzaChtb3ZpbmdQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgY29uc3QgcG9zaXRpb25zTWF0Y2ggPSBtYXRjaFBvc2l0aW9ucyhzdGFydFBvc2l0aW9ucywgbW92aW5nUG9zaXRpb25zKTtcblxuICBpZiAocG9zaXRpb25zTWF0Y2gpIHtcbiAgICBzb3J0UG9zaXRpb25zKG1vdmluZ1Bvc2l0aW9ucywgc3RhcnRQb3NpdGlvbnMpO1xuXG4gICAgY29uc3QgbW92aW5nUG9zaXRpb25zTGVuZ3RoID0gbW92aW5nUG9zaXRpb25zLmxlbmd0aDtcblxuICAgIGlmIChtb3ZpbmdQb3NpdGlvbnNMZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuZHJhZyhldmVudCwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKG1vdmluZ1Bvc2l0aW9uc0xlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5waW5jaChldmVudCwgZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHByZXNzSW50ZXJ2YWwgPSB0aGlzLmdldFByZXNzU0ludGVydmFsKCk7XG5cbiAgaWYgKHByZXNzSW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICBjbGVhclRpbWVvdXQocHJlc3NJbnRlcnZhbCk7XG5cbiAgICBwcmVzc0ludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0UHJlc3NTSW50ZXJ2YWwocHJlc3NJbnRlcnZhbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kSGFuZGxlcihldmVudCwgZWxlbWVudCwgcG9zaXRpb25zRnJvbUV2ZW50KSB7XG4gIGNvbnN0IHBvc2l0aW9ucyA9IHBvc2l0aW9uc0Zyb21FdmVudChldmVudCksXG4gICAgICAgIHN0YXJ0UG9zaXRpb25zID0gdGhpcy5nZXRTdGFydFBvc2l0aW9ucygpLFxuICAgICAgICBtb3ZpbmdQb3NpdGlvbnMgPSB0aGlzLmdldE1vdmluZ1Bvc2l0aW9ucygpLFxuICAgICAgICBwb3NpdGlvbnNNYXRjaCA9IG1hdGNoUG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zLCBtb3ZpbmdQb3NpdGlvbnMpO1xuXG4gIGlmIChwb3NpdGlvbnNNYXRjaCkge1xuICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25zTGVuZ3RoID0gc3RhcnRQb3NpdGlvbnMubGVuZ3RoO1xuXG4gICAgaWYgKHN0YXJ0UG9zaXRpb25zTGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnBpbmNoU3RvcChldmVudCwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0UG9zaXRpb25zTGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLnBvc3NpYmxlVGFwKGV2ZW50LCBlbGVtZW50KTtcblxuICAgICAgdGhpcy5wb3NzaWJsZVN3aXBlKGV2ZW50LCBlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJQb3NpdGlvbnMoc3RhcnRQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgZmlsdGVyUG9zaXRpb25zKG1vdmluZ1Bvc2l0aW9ucywgcG9zaXRpb25zKTtcblxuICBsZXQgcHJlc3NJbnRlcnZhbCA9IHRoaXMuZ2V0UHJlc3NTSW50ZXJ2YWwoKTtcblxuICBpZiAocHJlc3NJbnRlcnZhbCAhPT0gbnVsbCkge1xuICAgIGNsZWFyVGltZW91dChwcmVzc0ludGVydmFsKTtcblxuICAgIHByZXNzSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgdGhpcy5zZXRQcmVzc1NJbnRlcnZhbChwcmVzc0ludGVydmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3NzaWJsZVRhcChldmVudCwgZWxlbWVudCkge1xuICBjb25zdCBzdGFydFBvc2l0aW9ucyA9IHRoaXMuZ2V0U3RhcnRQb3NpdGlvbnMoKSxcbiAgICAgICAgbW92aW5nUG9zaXRpb25zID0gdGhpcy5nZXRNb3ZpbmdQb3NpdGlvbnMoKSxcbiAgICAgICAgZmlyc3RTdGFydFBvc2l0aW9uID0gZmlyc3Qoc3RhcnRQb3NpdGlvbnMpLFxuICAgICAgICBmaXJzdE1vdmluZ1Bvc2l0aW9uID0gZmlyc3QobW92aW5nUG9zaXRpb25zKSxcbiAgICAgICAgZmlyc3RQb3NpdGlvbiA9IGZpcnN0U3RhcnRQb3NpdGlvbiwgLy8vXG4gICAgICAgIHNlY29uZFBvc2l0aW9uID0gZmlyc3RNb3ZpbmdQb3NpdGlvbiwgLy8vXG4gICAgICAgIHJlbGF0aXZlUG9zaXRpb24gPSBSZWxhdGl2ZVBvc2l0aW9uLmZyb21GaXJzdFBvc2l0aW9uQW5kU2Vjb25kUG9zaXRpb24oZmlyc3RQb3NpdGlvbiwgc2Vjb25kUG9zaXRpb24pLFxuICAgICAgICB0aW1lID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRUaW1lKCksXG4gICAgICAgIHNwZWVkID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRTcGVlZCgpO1xuXG4gIGlmICgoc3BlZWQgPT09IDApICYmICh0aW1lIDwgTUFYSU1VTV9UQVBfVElNRSkpe1xuICAgIHRoaXMudGFwKGV2ZW50LCBlbGVtZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3NzaWJsZVN3aXBlKGV2ZW50LCBlbGVtZW50KSB7XG4gIGNvbnN0IHN0YXJ0UG9zaXRpb25zID0gdGhpcy5nZXRTdGFydFBvc2l0aW9ucygpLFxuICAgICAgICBtb3ZpbmdQb3NpdGlvbnMgPSB0aGlzLmdldE1vdmluZ1Bvc2l0aW9ucygpLFxuICAgICAgICBmaXJzdFN0YXJ0UG9zaXRpb24gPSBmaXJzdChzdGFydFBvc2l0aW9ucyksXG4gICAgICAgIGZpcnN0TW92aW5nUG9zaXRpb24gPSBmaXJzdChtb3ZpbmdQb3NpdGlvbnMpLFxuICAgICAgICBmaXJzdFBvc2l0aW9uID0gZmlyc3RTdGFydFBvc2l0aW9uLCAvLy9cbiAgICAgICAgc2Vjb25kUG9zaXRpb24gPSBmaXJzdE1vdmluZ1Bvc2l0aW9uLCAvLy9cbiAgICAgICAgcmVsYXRpdmVQb3NpdGlvbiA9IFJlbGF0aXZlUG9zaXRpb24uZnJvbUZpcnN0UG9zaXRpb25BbmRTZWNvbmRQb3NpdGlvbihmaXJzdFBvc2l0aW9uLCBzZWNvbmRQb3NpdGlvbiksXG4gICAgICAgIGRpcmVjdGlvbiA9IHJlbGF0aXZlUG9zaXRpb24uZ2V0RGlyZWN0aW9uKCksXG4gICAgICAgIHNwZWVkID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRTcGVlZCgpO1xuXG4gIGlmIChzcGVlZCA+IE1JTklNVU1fU1dJUEVfU1BFRUQpIHtcbiAgICB0aGlzLnN3aXBlKGV2ZW50LCBlbGVtZW50LCBzcGVlZCwgZGlyZWN0aW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0YXAoZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3Qgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgIGZpcnN0U3RhcnRQb3NpdGlvbiA9IGZpcnN0KHN0YXJ0UG9zaXRpb25zKSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGZpcnN0U3RhcnRQb3NpdGlvbiwgLy8vXG4gICAgICAgIHRvcCA9IHN0YXJ0UG9zaXRpb24uZ2V0VG9wKCksXG4gICAgICAgIGxlZnQgPSBzdGFydFBvc2l0aW9uLmdldExlZnQoKTtcblxuICBsZXQgdGFwSW50ZXJ2YWwgPSB0aGlzLmdldFRhcEludGVydmFsKCk7XG5cbiAgaWYgKHRhcEludGVydmFsICE9PSBudWxsKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRhcEludGVydmFsKTtcblxuICAgIHRhcEludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0VGFwSW50ZXJ2YWwodGFwSW50ZXJ2YWwpO1xuXG4gICAgdGhpcy5kb3VibGVUYXAoZXZlbnQsIGVsZW1lbnQsIHRvcCwgbGVmdCk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB0YXBJbnRlcnZhbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRhcEludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0VGFwSW50ZXJ2YWwodGFwSW50ZXJ2YWwpO1xuXG4gICAgdGhpcy5zaW5nbGVUYXAoZXZlbnQsIGVsZW1lbnQsIHRvcCwgbGVmdCk7XG4gIH0sIFRBUF9ERUxBWSk7XG5cbiAgdGhpcy5zZXRUYXBJbnRlcnZhbCh0YXBJbnRlcnZhbCk7XG59XG5cbmZ1bmN0aW9uIGRyYWcoZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3Qgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgIG1vdmluZ1Bvc2l0aW9ucyA9IHRoaXMuZ2V0TW92aW5nUG9zaXRpb25zKCksXG4gICAgICAgIGZpcnN0U3RhcnRQb3NpdGlvbiA9IGZpcnN0KHN0YXJ0UG9zaXRpb25zKSxcbiAgICAgICAgZmlyc3RNb3ZpbmdQb3NpdGlvbiA9IGZpcnN0KG1vdmluZ1Bvc2l0aW9ucyksXG4gICAgICAgIGZpcnN0UG9zaXRpb24gPSBmaXJzdFN0YXJ0UG9zaXRpb24sIC8vL1xuICAgICAgICBzZWNvbmRQb3NpdGlvbiA9IGZpcnN0TW92aW5nUG9zaXRpb24sIC8vL1xuICAgICAgICByZWxhdGl2ZVBvc2l0aW9uID0gUmVsYXRpdmVQb3NpdGlvbi5mcm9tRmlyc3RQb3NpdGlvbkFuZFNlY29uZFBvc2l0aW9uKGZpcnN0UG9zaXRpb24sIHNlY29uZFBvc2l0aW9uKSxcbiAgICAgICAgdG9wID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRUb3AoKSxcbiAgICAgICAgbGVmdCA9IHJlbGF0aXZlUG9zaXRpb24uZ2V0TGVmdCgpLFxuICAgICAgICBkaXJlY3Rpb24gPSByZWxhdGl2ZVBvc2l0aW9uLmdldERpcmVjdGlvbigpO1xuXG4gIGxldCBjdXN0b21FdmVudFR5cGUgPSBudWxsO1xuXG4gIGlmICgoTWF0aC5hYnMoZGlyZWN0aW9uKSkgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEU7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoUElfT1ZFUl9UV08gLSBkaXJlY3Rpb24pIDwgTUFYSU1VTV9TUFJFQUQpIHtcbiAgICBjdXN0b21FdmVudFR5cGUgPSBEUkFHX1VQX0NVU1RPTV9FVkVOVF9UWVBFO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKC1QSV9PVkVSX1RXTyAtIGRpcmVjdGlvbikgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfRE9XTl9DVVNUT01fRVZFTlRfVFlQRTtcbiAgfVxuXG4gIGlmICgoUEkgLSBNYXRoLmFicyhkaXJlY3Rpb24pKSA8IE1BWElNVU1fU1BSRUFEKSB7XG4gICAgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19MRUZUX0NVU1RPTV9FVkVOVF9UWVBFO1xuICB9XG5cbiAgaWYgKGN1c3RvbUV2ZW50VHlwZSAhPT0gbnVsbCkge1xuICAgIHRoaXMuY2FsbEN1c3RvbUhhbmRsZXJzKGN1c3RvbUV2ZW50VHlwZSwgZXZlbnQsIGVsZW1lbnQsIHRvcCwgbGVmdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGluY2goZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3QgbW92aW5nUG9zaXRpb25zID0gdGhpcy5nZXRNb3ZpbmdQb3NpdGlvbnMoKSxcbiAgICAgICAgZmlyc3RNb3ZpbmdQb3NpdGlvbiA9IGZpcnN0KG1vdmluZ1Bvc2l0aW9ucyksXG4gICAgICAgIHNlY29uZE1vdmluZ1Bvc2l0aW9uID0gc2Vjb25kKG1vdmluZ1Bvc2l0aW9ucyksXG4gICAgICAgIHJlbGF0aXZlTW92aW5nUG9zaXRpb24gPSBSZWxhdGl2ZVBvc2l0aW9uLmZyb21GaXJzdFBvc2l0aW9uQW5kU2Vjb25kUG9zaXRpb24oZmlyc3RNb3ZpbmdQb3NpdGlvbiwgc2Vjb25kTW92aW5nUG9zaXRpb24pLFxuICAgICAgICBjdXN0b21FdmVudFR5cGUgPSBQSU5DSF9NT1ZFX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBzdGFydE1hZ25pdHVkZSA9IHRoaXMuZ2V0U3RhcnRNYWduaXR1ZGUoKSxcbiAgICAgICAgbWFnbml0dWRlID0gcmVsYXRpdmVNb3ZpbmdQb3NpdGlvbi5nZXRNYWduaXR1ZGUoKSxcbiAgICAgICAgcmF0aW8gPSBtYWduaXR1ZGUgLyBzdGFydE1hZ25pdHVkZTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50LCByYXRpbyk7XG59XG5cbmZ1bmN0aW9uIHByZXNzKGV2ZW50LCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBSRVNTX0NVU1RPTV9FVkVOVF9UWVBFO1xuXG4gIHRoaXMuY2FsbEN1c3RvbUhhbmRsZXJzKGN1c3RvbUV2ZW50VHlwZSwgZXZlbnQsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBzd2lwZShldmVudCwgZWxlbWVudCwgc3BlZWQsIGRpcmVjdGlvbikge1xuICBsZXQgY3VzdG9tRXZlbnRUeXBlID0gbnVsbDtcblxuICBpZiAoKE1hdGguYWJzKGRpcmVjdGlvbikpIDwgTUFYSU1VTV9TUFJFQUQpIHtcbiAgICBjdXN0b21FdmVudFR5cGUgPSBTV0lQRV9SSUdIVF9DVVNUT01fRVZFTlRfVFlQRTtcblxuICAgIHNwZWVkID0gc3BlZWQgKiBNYXRoLmFicyhNYXRoLmNvcyhkaXJlY3Rpb24pKTtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhQSV9PVkVSX1RXTyAtIGRpcmVjdGlvbikgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX1VQX0NVU1RPTV9FVkVOVF9UWVBFO1xuXG4gICAgc3BlZWQgPSBzcGVlZCAqIE1hdGguYWJzKE1hdGguc2luKGRpcmVjdGlvbikpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKC1QSV9PVkVSX1RXTyAtIGRpcmVjdGlvbikgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEU7XG5cbiAgICBzcGVlZCA9IHNwZWVkICogTWF0aC5hYnMoTWF0aC5zaW4oZGlyZWN0aW9uKSk7XG4gIH1cblxuICBpZiAoKFBJIC0gTWF0aC5hYnMoZGlyZWN0aW9uKSkgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX0xFRlRfQ1VTVE9NX0VWRU5UX1RZUEU7XG5cbiAgICBzcGVlZCA9IHNwZWVkICogTWF0aC5hYnMoTWF0aC5jb3MoZGlyZWN0aW9uKSk7XG4gIH1cblxuICBpZiAoY3VzdG9tRXZlbnRUeXBlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgICAgZmlyc3RTdGFydFBvc2l0aW9uID0gZmlyc3Qoc3RhcnRQb3NpdGlvbnMpLFxuICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBmaXJzdFN0YXJ0UG9zaXRpb24sIC8vL1xuICAgICAgICAgIHRvcCA9IHN0YXJ0UG9zaXRpb24uZ2V0VG9wKCksXG4gICAgICAgICAgbGVmdCA9IHN0YXJ0UG9zaXRpb24uZ2V0TGVmdCgpO1xuXG4gICAgdGhpcy5jYWxsQ3VzdG9tSGFuZGxlcnMoY3VzdG9tRXZlbnRUeXBlLCBldmVudCwgZWxlbWVudCwgdG9wLCBsZWZ0LCBzcGVlZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2luZ2xlVGFwKGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU0lOR0xFX1RBUF9DVVNUT01fRVZFTlRfVFlQRTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpOyAvLy9cbn1cblxuZnVuY3Rpb24gZG91YmxlVGFwKGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRE9VQkxFX1RBUF9DVVNUT01fRVZFTlRfVFlQRTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpO1xufVxuXG5mdW5jdGlvbiBkcmFnU3RhcnQoZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19TVEFSVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgIGZpcnN0U3RhcnRQb3NpdGlvbiA9IGZpcnN0KHN0YXJ0UG9zaXRpb25zKSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGZpcnN0U3RhcnRQb3NpdGlvbiwgIC8vL1xuICAgICAgICB0b3AgPSBzdGFydFBvc2l0aW9uLmdldFRvcCgpLFxuICAgICAgICBsZWZ0ID0gc3RhcnRQb3NpdGlvbi5nZXRMZWZ0KCk7XG5cbiAgdGhpcy5jYWxsQ3VzdG9tSGFuZGxlcnMoY3VzdG9tRXZlbnRUeXBlLCBldmVudCwgZWxlbWVudCwgdG9wLCBsZWZ0KTtcbn1cblxuZnVuY3Rpb24gcGluY2hTdGFydChldmVudCwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQSU5DSF9TVEFSVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICBzdGFydFBvc2l0aW9ucyA9IHRoaXMuZ2V0U3RhcnRQb3NpdGlvbnMoKSxcbiAgICBmaXJzdFN0YXJ0UG9zaXRpb24gPSBmaXJzdChzdGFydFBvc2l0aW9ucyksXG4gICAgc2Vjb25kU3RhcnRQb3NpdGlvbiA9IHNlY29uZChzdGFydFBvc2l0aW9ucyksXG4gICAgcmVsYXRpdmVTdGFydFBvc2l0aW9uID0gUmVsYXRpdmVQb3NpdGlvbi5mcm9tRmlyc3RQb3NpdGlvbkFuZFNlY29uZFBvc2l0aW9uKGZpcnN0U3RhcnRQb3NpdGlvbiwgc2Vjb25kU3RhcnRQb3NpdGlvbiksXG4gICAgbWFnbml0dWRlID0gcmVsYXRpdmVTdGFydFBvc2l0aW9uLmdldE1hZ25pdHVkZSgpLFxuICAgIHN0YXJ0TWFnbml0dWRlID0gbWFnbml0dWRlOyAvLy9cblxuICB0aGlzLnNldFN0YXJ0TWFnbml0dWRlKHN0YXJ0TWFnbml0dWRlKTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gcGluY2hTdG9wKGV2ZW50LCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUT1BfQ1VTVE9NX0VWRU5UX1RZUEU7XG5cbiAgdGhpcy5jYWxsQ3VzdG9tSGFuZGxlcnMoY3VzdG9tRXZlbnRUeXBlLCBldmVudCwgZWxlbWVudCk7XG59XG5cbmNvbnN0IHRvdWNoTWl4aW5zID0ge1xuICBlbmFibGVUb3VjaCxcbiAgZGlzYWJsZVRvdWNoLFxuICBvbkN1c3RvbVByZXNzLFxuICBvZmZDdXN0b21QcmVzcyxcbiAgb25DdXN0b21EcmFnVXAsXG4gIG9mZkN1c3RvbURyYWdVcCxcbiAgb25DdXN0b21EcmFnRG93bixcbiAgb2ZmQ3VzdG9tRHJhZ0Rvd24sXG4gIG9uQ3VzdG9tRHJhZ0xlZnQsXG4gIG9mZkN1c3RvbURyYWdMZWZ0LFxuICBvbkN1c3RvbURyYWdSaWdodCxcbiAgb2ZmQ3VzdG9tRHJhZ1JpZ2h0LFxuICBvbkN1c3RvbURyYWdTdGFydCxcbiAgb2ZmQ3VzdG9tRHJhZ1N0YXJ0LFxuICBvbkN1c3RvbVN3aXBlVXAsXG4gIG9mZkN1c3RvbVN3aXBlVXAsXG4gIG9uQ3VzdG9tU3dpcGVEb3duLFxuICBvZmZDdXN0b21Td2lwZURvd24sXG4gIG9uQ3VzdG9tU3dpcGVMZWZ0LFxuICBvZmZDdXN0b21Td2lwZUxlZnQsXG4gIG9uQ3VzdG9tU3dpcGVSaWdodCxcbiAgb2ZmQ3VzdG9tU3dpcGVSaWdodCxcbiAgb25DdXN0b21QaW5jaE1vdmUsXG4gIG9mZkN1c3RvbVBpbmNoTW92ZSxcbiAgb25DdXN0b21QaW5jaFN0YXJ0LFxuICBvZmZDdXN0b21QaW5jaFN0YXJ0LFxuICBvbkN1c3RvbVBpbmNoU3RvcCxcbiAgb2ZmQ3VzdG9tUGluY2hTdG9wLFxuICBvbkN1c3RvbVNpbmdsZVRhcCxcbiAgb2ZmQ3VzdG9tU2luZ2xlVGFwLFxuICBvbkN1c3RvbURvdWJsZVRhcCxcbiAgb2ZmQ3VzdG9tRG91YmxlVGFwLFxuICBnZXRUYXBJbnRlcnZhbCxcbiAgZ2V0UHJlc3NTSW50ZXJ2YWwsXG4gIGdldFN0YXJ0TWFnbml0dWRlLFxuICBnZXRTdGFydFBvc2l0aW9ucyxcbiAgZ2V0TW92aW5nUG9zaXRpb25zLFxuICBzZXRUYXBJbnRlcnZhbCxcbiAgc2V0UHJlc3NTSW50ZXJ2YWwsXG4gIHNldFN0YXJ0TWFnbml0dWRlLFxuICBzZXRTdGFydFBvc2l0aW9ucyxcbiAgc2V0TW92aW5nUG9zaXRpb25zLFxuICB0b3VjaFN0YXJ0SGFuZGxlcixcbiAgbW91c2VEb3duSGFuZGxlcixcbiAgdG91Y2hNb3ZlSGFuZGxlcixcbiAgbW91c2VNb3ZlSGFuZGxlcixcbiAgdG91Y2hFbmRIYW5kbGVyLFxuICBtb3VzZVVwSGFuZGxlcixcbiAgc3RhcnRIYW5kbGVyLFxuICBtb3ZlSGFuZGxlcixcbiAgZW5kSGFuZGxlcixcbiAgcG9zc2libGVUYXAsXG4gIHBvc3NpYmxlU3dpcGUsXG4gIHRhcCxcbiAgZHJhZyxcbiAgcGluY2gsXG4gIHByZXNzLFxuICBzd2lwZSxcbiAgc2luZ2xlVGFwLFxuICBkb3VibGVUYXAsXG4gIGRyYWdTdGFydCxcbiAgcGluY2hTdGFydCxcbiAgcGluY2hTdG9wXG59O1xuXG5leHBvcnQgZGVmYXVsdCB0b3VjaE1peGlucztcbiJdLCJuYW1lcyI6WyJwdXNoIiwiYXJyYXlVdGlsaXRpZXMiLCJmaXJzdCIsInNlY29uZCIsImVuYWJsZVRvdWNoIiwidGFwSW50ZXJ2YWwiLCJzdGFydE1hZ25pdHVkZSIsInN0YXJ0UG9zaXRpb25zIiwibW92aW5nUG9zaXRpb25zIiwidXBkYXRlU3RhdGUiLCJvbk1vdXNlRG93biIsIm1vdXNlRG93bkhhbmRsZXIiLCJvbk1vdXNlTW92ZSIsIm1vdXNlTW92ZUhhbmRsZXIiLCJ3aW5kb3ciLCJvbk1vdXNlVXAiLCJtb3VzZVVwSGFuZGxlciIsIm9uVG91Y2hTdGFydCIsInRvdWNoU3RhcnRIYW5kbGVyIiwib25Ub3VjaE1vdmUiLCJ0b3VjaE1vdmVIYW5kbGVyIiwib25Ub3VjaEVuZCIsInRvdWNoRW5kSGFuZGxlciIsImRpc2FibGVUb3VjaCIsIm9mZk1vdXNlRG93biIsIm9mZk1vdXNlTW92ZSIsIm9mZk1vdXNlVXAiLCJvZmZUb3VjaFN0YXJ0Iiwib2ZmVG91Y2hNb3ZlIiwib2ZmVG91Y2hFbmQiLCJvbkN1c3RvbVByZXNzIiwicHJlc3NDdXN0b21IYW5kbGVyIiwiZWxlbWVudCIsImN1c3RvbUV2ZW50VHlwZSIsIlBSRVNTX0NVU1RPTV9FVkVOVF9UWVBFIiwiY3VzdG9tSGFuZGxlciIsIm9uQ3VzdG9tRXZlbnQiLCJvZmZDdXN0b21QcmVzcyIsIm9mZkN1c3RvbUV2ZW50Iiwib25DdXN0b21EcmFnVXAiLCJkcmFnVXBDdXN0b21IYW5kbGVyIiwiRFJBR19VUF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbURyYWdVcCIsIm9uQ3VzdG9tRHJhZ0Rvd24iLCJkcmFnRG93bkN1c3RvbUhhbmRsZXIiLCJEUkFHX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21EcmFnRG93biIsIm9uQ3VzdG9tRHJhZ0xlZnQiLCJkcmFnTGVmdEN1c3RvbUhhbmRsZXIiLCJEUkFHX0xFRlRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21EcmFnTGVmdCIsIm9uQ3VzdG9tRHJhZ1JpZ2h0IiwiZHJhZ1JpZ2h0Q3VzdG9tSGFuZGxlciIsIkRSQUdfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21EcmFnUmlnaHQiLCJvbkN1c3RvbURyYWdTdGFydCIsImRyYWdTdGFydEN1c3RvbUhhbmRsZXIiLCJEUkFHX1NUQVJUX0NVU1RPTV9FVkVOVF9UWVBFIiwib2ZmQ3VzdG9tRHJhZ1N0YXJ0Iiwib25DdXN0b21Td2lwZVVwIiwic3dpcGVVcEN1c3RvbUhhbmRsZXIiLCJTV0lQRV9VUF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVN3aXBlVXAiLCJvbkN1c3RvbVN3aXBlRG93biIsInN3aXBlRG93bkN1c3RvbUhhbmRsZXIiLCJTV0lQRV9ET1dOX0NVU1RPTV9FVkVOVF9UWVBFIiwib2ZmQ3VzdG9tU3dpcGVEb3duIiwib25DdXN0b21Td2lwZUxlZnQiLCJzd2lwZUxlZnRDdXN0b21IYW5kbGVyIiwiU1dJUEVfTEVGVF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVN3aXBlTGVmdCIsIm9uQ3VzdG9tU3dpcGVSaWdodCIsInN3aXBlUmlnaHRDdXN0b21IYW5kbGVyIiwiU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21Td2lwZVJpZ2h0Iiwib25DdXN0b21QaW5jaE1vdmUiLCJwaW5jaE1vdmVDdXN0b21IYW5kbGVyIiwiUElOQ0hfTU9WRV9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVBpbmNoTW92ZSIsIm9uQ3VzdG9tUGluY2hTdGFydCIsInBpbmNoU3RhcnRDdXN0b21IYW5kbGVyIiwiUElOQ0hfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21QaW5jaFN0YXJ0Iiwib25DdXN0b21QaW5jaFN0b3AiLCJwaW5jaFN0b3BDdXN0b21IYW5kbGVyIiwiUElOQ0hfU1RPUF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVBpbmNoU3RvcCIsIm9uQ3VzdG9tU2luZ2xlVGFwIiwic2luZ2xlVGFwQ3VzdG9tSGFuZGxlciIsIlNJTkdMRV9UQVBfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21TaW5nbGVUYXAiLCJvbkN1c3RvbURvdWJsZVRhcCIsImRvdWJsZVRhcEN1c3RvbUhhbmRsZXIiLCJET1VCTEVfVEFQX0NVU1RPTV9FVkVOVF9UWVBFIiwib2ZmQ3VzdG9tRG91YmxlVGFwIiwiZ2V0VGFwSW50ZXJ2YWwiLCJnZXRTdGF0ZSIsImdldFByZXNzU0ludGVydmFsIiwicHJlc3NJbnRlcnZhbCIsImdldFN0YXJ0TWFnbml0dWRlIiwiZ2V0U3RhcnRQb3NpdGlvbnMiLCJnZXRNb3ZpbmdQb3NpdGlvbnMiLCJzZXRUYXBJbnRlcnZhbCIsInNldFByZXNzU0ludGVydmFsIiwic2V0U3RhcnRNYWduaXR1ZGUiLCJzZXRTdGFydFBvc2l0aW9ucyIsInNldE1vdmluZ1Bvc2l0aW9ucyIsImV2ZW50Iiwic3RhcnRIYW5kbGVyIiwidG91Y2hFdmVudCIsImNoYW5nZWQiLCJwb3NpdGlvbnMiLCJwb3NpdGlvbnNGcm9tVG91Y2hFdmVudCIsIm1vdXNlRXZlbnQiLCJwb3NpdGlvbnNGcm9tTW91c2VFdmVudCIsIm1vdmVIYW5kbGVyIiwiZW5kSGFuZGxlciIsInBvc2l0aW9uc0Zyb21FdmVudCIsImZpbHRlclBvc2l0aW9ucyIsInN0YXJ0aW5nUG9zaXRpb25zTGVuZ3RoIiwibGVuZ3RoIiwiZHJhZ1N0YXJ0Iiwic2V0VGltZW91dCIsInByZXNzIiwiUFJFU1NfREVMQVkiLCJwaW5jaFN0YXJ0IiwicG9zaXRpb25zTWF0Y2giLCJtYXRjaFBvc2l0aW9ucyIsInNvcnRQb3NpdGlvbnMiLCJtb3ZpbmdQb3NpdGlvbnNMZW5ndGgiLCJkcmFnIiwicGluY2giLCJjbGVhclRpbWVvdXQiLCJzdGFydFBvc2l0aW9uc0xlbmd0aCIsInBpbmNoU3RvcCIsInBvc3NpYmxlVGFwIiwicG9zc2libGVTd2lwZSIsImZpcnN0U3RhcnRQb3NpdGlvbiIsImZpcnN0TW92aW5nUG9zaXRpb24iLCJmaXJzdFBvc2l0aW9uIiwic2Vjb25kUG9zaXRpb24iLCJyZWxhdGl2ZVBvc2l0aW9uIiwiUmVsYXRpdmVQb3NpdGlvbiIsImZyb21GaXJzdFBvc2l0aW9uQW5kU2Vjb25kUG9zaXRpb24iLCJ0aW1lIiwiZ2V0VGltZSIsInNwZWVkIiwiZ2V0U3BlZWQiLCJNQVhJTVVNX1RBUF9USU1FIiwidGFwIiwiZGlyZWN0aW9uIiwiZ2V0RGlyZWN0aW9uIiwiTUlOSU1VTV9TV0lQRV9TUEVFRCIsInN3aXBlIiwic3RhcnRQb3NpdGlvbiIsInRvcCIsImdldFRvcCIsImxlZnQiLCJnZXRMZWZ0IiwiZG91YmxlVGFwIiwic2luZ2xlVGFwIiwiVEFQX0RFTEFZIiwiTWF0aCIsImFicyIsIk1BWElNVU1fU1BSRUFEIiwiUElfT1ZFUl9UV08iLCJQSSIsImNhbGxDdXN0b21IYW5kbGVycyIsInNlY29uZE1vdmluZ1Bvc2l0aW9uIiwicmVsYXRpdmVNb3ZpbmdQb3NpdGlvbiIsIm1hZ25pdHVkZSIsImdldE1hZ25pdHVkZSIsInJhdGlvIiwiY29zIiwic2luIiwic2Vjb25kU3RhcnRQb3NpdGlvbiIsInJlbGF0aXZlU3RhcnRQb3NpdGlvbiIsInRvdWNoTWl4aW5zIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFpdkJBOzs7ZUFBQTs7O29CQS91QnVCO3lCQUNROytEQUVGO3lCQUVrRjt5QkFDRTtnQ0FlcEU7Ozs7OztBQUU3QyxJQUFRQSxPQUF3QkMseUJBQWMsQ0FBdENELE1BQU1FLFFBQWtCRCx5QkFBYyxDQUFoQ0MsT0FBT0MsU0FBV0YseUJBQWMsQ0FBekJFO0FBRXJCLFNBQVNDO0lBQ1AsSUFBTUMsY0FBYyxNQUNkQyxpQkFBaUIsTUFDakJDLGlCQUFpQixFQUFFLEVBQ25CQyxrQkFBa0IsRUFBRTtJQUUxQixJQUFJLENBQUNDLFdBQVcsQ0FBQztRQUNmSixhQUFBQTtRQUNBQyxnQkFBQUE7UUFDQUMsZ0JBQUFBO1FBQ0FDLGlCQUFBQTtJQUNGO0lBRUEsSUFBSSxDQUFDRSxXQUFXLENBQUMsSUFBSSxDQUFDQyxnQkFBZ0I7SUFDdEMsSUFBSSxDQUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDQyxnQkFBZ0I7SUFFdENDLFlBQU0sQ0FBQ0MsU0FBUyxDQUFDLElBQUksQ0FBQ0MsY0FBYyxFQUFFLElBQUk7SUFFMUMsSUFBSSxDQUFDQyxZQUFZLENBQUMsSUFBSSxDQUFDQyxpQkFBaUI7SUFDeEMsSUFBSSxDQUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDQyxnQkFBZ0I7SUFDdEMsSUFBSSxDQUFDQyxVQUFVLENBQUMsSUFBSSxD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
|
|
475
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taXhpbnMvdG91Y2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IHdpbmRvdyB9IGZyb20gXCJlYXN5XCI7XG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IFJlbGF0aXZlUG9zaXRpb24gZnJvbSBcIi4uL3Bvc2l0aW9uL3JlbGF0aXZlXCI7XG5cbmltcG9ydCB7IFBJLCBUQVBfREVMQVksIFBSRVNTX0RFTEFZLCBQSV9PVkVSX1RXTywgTUFYSU1VTV9UQVBfVElNRSwgTUlOSU1VTV9TV0lQRV9TUEVFRCwgTUFYSU1VTV9TUFJFQUQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzb3J0UG9zaXRpb25zLCBtYXRjaFBvc2l0aW9ucywgZmlsdGVyUG9zaXRpb25zLCBwb3NpdGlvbnNGcm9tTW91c2VFdmVudCwgcG9zaXRpb25zRnJvbVRvdWNoRXZlbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3Bvc2l0aW9uc1wiO1xuaW1wb3J0IHsgUFJFU1NfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBEUkFHX1VQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgRFJBR19ET1dOX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgRFJBR19MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgRFJBR19SSUdIVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgIERSQUdfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBTV0lQRV9VUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgIFNXSVBFX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBTV0lQRV9MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBQSU5DSF9NT1ZFX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgUElOQ0hfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgICBQSU5DSF9TVE9QX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICAgU0lOR0xFX1RBUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgIERPVUJMRV9UQVBfQ1VTVE9NX0VWRU5UX1RZUEUgfSBmcm9tIFwiLi4vY3VzdG9tRXZlbnRUeXBlc1wiO1xuXG5jb25zdCB7IHB1c2gsIGZpcnN0LCBzZWNvbmQgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5mdW5jdGlvbiBlbmFibGVUb3VjaCgpIHtcbiAgY29uc3QgdGFwSW50ZXJ2YWwgPSBudWxsLFxuICAgICAgICBzdGFydE1hZ25pdHVkZSA9IG51bGwsXG4gICAgICAgIHN0YXJ0UG9zaXRpb25zID0gW10sXG4gICAgICAgIG1vdmluZ1Bvc2l0aW9ucyA9IFtdO1xuXG4gIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgIHRhcEludGVydmFsLFxuICAgIHN0YXJ0TWFnbml0dWRlLFxuICAgIHN0YXJ0UG9zaXRpb25zLFxuICAgIG1vdmluZ1Bvc2l0aW9uc1xuICB9KTtcblxuICB0aGlzLm9uTW91c2VEb3duKHRoaXMubW91c2VEb3duSGFuZGxlcik7XG4gIHRoaXMub25Nb3VzZU1vdmUodGhpcy5tb3VzZU1vdmVIYW5kbGVyKTtcblxuICB3aW5kb3cub25Nb3VzZVVwKHRoaXMubW91c2VVcEhhbmRsZXIsIHRoaXMpO1xuXG4gIHRoaXMub25Ub3VjaFN0YXJ0KHRoaXMudG91Y2hTdGFydEhhbmRsZXIpO1xuICB0aGlzLm9uVG91Y2hNb3ZlKHRoaXMudG91Y2hNb3ZlSGFuZGxlcik7XG4gIHRoaXMub25Ub3VjaEVuZCh0aGlzLnRvdWNoRW5kSGFuZGxlcik7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVUb3VjaCgpIHtcbiAgdGhpcy5vZmZNb3VzZURvd24odGhpcy5tb3VzZURvd25IYW5kbGVyKTtcbiAgdGhpcy5vZmZNb3VzZU1vdmUodGhpcy5tb3VzZU1vdmVIYW5kbGVyKTtcblxuICB3aW5kb3cub2ZmTW91c2VVcCh0aGlzLm1vdXNlVXBIYW5kbGVyLCB0aGlzKTtcblxuICB0aGlzLm9mZlRvdWNoU3RhcnQodGhpcy50b3VjaFN0YXJ0SGFuZGxlcik7XG4gIHRoaXMub2ZmVG91Y2hNb3ZlKHRoaXMudG91Y2hNb3ZlSGFuZGxlcik7XG4gIHRoaXMub2ZmVG91Y2hFbmQodGhpcy50b3VjaEVuZEhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbVByZXNzKHByZXNzQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQUkVTU19DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHByZXNzQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVByZXNzKHByZXNzQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQUkVTU19DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHByZXNzQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURyYWdVcChkcmFnVXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfVVBfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkcmFnVXBDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRHJhZ1VwKGRyYWdVcEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19VUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdVcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21EcmFnRG93bihkcmFnRG93bkN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19ET1dOX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gZHJhZ0Rvd25DdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRHJhZ0Rvd24oZHJhZ0Rvd25DdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfRE9XTl9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdEb3duQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURyYWdMZWZ0KGRyYWdMZWZ0Q3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBEUkFHX0xFRlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkcmFnTGVmdEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21EcmFnTGVmdChkcmFnTGVmdEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gZHJhZ0xlZnRDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9mZkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uQ3VzdG9tRHJhZ1JpZ2h0KGRyYWdSaWdodEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19SSUdIVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdSaWdodEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21EcmFnUmlnaHQoZHJhZ1JpZ2h0Q3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBEUkFHX1JJR0hUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gZHJhZ1JpZ2h0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURyYWdTdGFydChkcmFnU3RhcnRDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkcmFnU3RhcnRDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRHJhZ1N0YXJ0KGRyYWdTdGFydEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19TVEFSVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRyYWdTdGFydEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21Td2lwZVVwKHN3aXBlVXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX1VQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVVcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21Td2lwZVVwKHN3aXBlVXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX1VQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVVcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21Td2lwZURvd24oc3dpcGVEb3duQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBTV0lQRV9ET1dOX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVEb3duQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVN3aXBlRG93bihzd2lwZURvd25DdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBzd2lwZURvd25DdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9mZkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uQ3VzdG9tU3dpcGVMZWZ0KHN3aXBlTGVmdEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU1dJUEVfTEVGVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHN3aXBlTGVmdEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21Td2lwZUxlZnQoc3dpcGVMZWZ0Q3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBTV0lQRV9MRUZUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc3dpcGVMZWZ0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbVN3aXBlUmlnaHQoc3dpcGVSaWdodEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBzd2lwZVJpZ2h0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVN3aXBlUmlnaHQoc3dpcGVSaWdodEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBzd2lwZVJpZ2h0Q3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbVBpbmNoTW92ZShwaW5jaE1vdmVDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX01PVkVfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBwaW5jaE1vdmVDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tUGluY2hNb3ZlKHBpbmNoTW92ZUN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gUElOQ0hfTU9WRV9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHBpbmNoTW92ZUN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21QaW5jaFN0YXJ0KHBpbmNoU3RhcnRDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUQVJUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gcGluY2hTdGFydEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21QaW5jaFN0YXJ0KHBpbmNoU3RhcnRDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUQVJUX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gcGluY2hTdGFydEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb25DdXN0b21QaW5jaFN0b3AocGluY2hTdG9wQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQSU5DSF9TVE9QX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gcGluY2hTdG9wQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vbkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZkN1c3RvbVBpbmNoU3RvcChwaW5jaFN0b3BDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUT1BfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBwaW5jaFN0b3BDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9mZkN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uQ3VzdG9tU2luZ2xlVGFwKHNpbmdsZVRhcEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU0lOR0xFX1RBUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IHNpbmdsZVRhcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZDdXN0b21TaW5nbGVUYXAoc2luZ2xlVGFwQ3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBTSU5HTEVfVEFQX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBjdXN0b21IYW5kbGVyID0gc2luZ2xlVGFwQ3VzdG9tSGFuZGxlcjsgLy8vXG5cbiAgdGhpcy5vZmZDdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvbkN1c3RvbURvdWJsZVRhcChkb3VibGVUYXBDdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IERPVUJMRV9UQVBfQ1VTVE9NX0VWRU5UX1RZUEUsXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSBkb3VibGVUYXBDdXN0b21IYW5kbGVyOyAvLy9cblxuICB0aGlzLm9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRG91YmxlVGFwKGRvdWJsZVRhcEN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRE9VQkxFX1RBUF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgY3VzdG9tSGFuZGxlciA9IGRvdWJsZVRhcEN1c3RvbUhhbmRsZXI7IC8vL1xuXG4gIHRoaXMub2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFwSW50ZXJ2YWwoKSB7XG4gIGNvbnN0IHsgdGFwSW50ZXJ2YWwgfSA9IHRoaXMuZ2V0U3RhdGUoKTtcblxuICByZXR1cm4gdGFwSW50ZXJ2YWw7XG59XG5cbmZ1bmN0aW9uIGdldFByZXNzU0ludGVydmFsKCkge1xuICBjb25zdCB7IHByZXNzSW50ZXJ2YWwgfSA9IHRoaXMuZ2V0U3RhdGUoKTtcblxuICByZXR1cm4gcHJlc3NJbnRlcnZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhcnRNYWduaXR1ZGUoKSB7XG4gIGNvbnN0IHsgc3RhcnRNYWduaXR1ZGUgfSA9IHRoaXMuZ2V0U3RhdGUoKTtcblxuICByZXR1cm4gc3RhcnRNYWduaXR1ZGU7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXJ0UG9zaXRpb25zKCkge1xuICBjb25zdCB7IHN0YXJ0UG9zaXRpb25zIH0gPSB0aGlzLmdldFN0YXRlKCk7XG5cbiAgcmV0dXJuIHN0YXJ0UG9zaXRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRNb3ZpbmdQb3NpdGlvbnMoKSB7XG4gIGNvbnN0IHsgbW92aW5nUG9zaXRpb25zIH0gPSB0aGlzLmdldFN0YXRlKCk7XG5cbiAgcmV0dXJuIG1vdmluZ1Bvc2l0aW9ucztcbn1cblxuZnVuY3Rpb24gc2V0VGFwSW50ZXJ2YWwodGFwSW50ZXJ2YWwpIHtcbiAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgdGFwSW50ZXJ2YWxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFByZXNzU0ludGVydmFsKHByZXNzSW50ZXJ2YWwpIHtcbiAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgcHJlc3NJbnRlcnZhbFxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0U3RhcnRNYWduaXR1ZGUoc3RhcnRNYWduaXR1ZGUpIHtcbiAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgc3RhcnRNYWduaXR1ZGVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFN0YXJ0UG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zKSB7XG4gIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgIHN0YXJ0UG9zaXRpb25zXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRNb3ZpbmdQb3NpdGlvbnMobW92aW5nUG9zaXRpb25zKSB7XG4gIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgIG1vdmluZ1Bvc2l0aW9uc1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG91Y2hTdGFydEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpIHtcbiAgdGhpcy5zdGFydEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgY2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgIHBvc2l0aW9ucyA9IHBvc2l0aW9uc0Zyb21Ub3VjaEV2ZW50KHRvdWNoRXZlbnQsIGNoYW5nZWQpO1xuXG4gICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1vdXNlRG93bkhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpIHtcbiAgdGhpcy5zdGFydEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbU1vdXNlRXZlbnQobW91c2VFdmVudCk7XG5cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG91Y2hNb3ZlSGFuZGxlcihldmVudCwgZWxlbWVudCkge1xuICB0aGlzLm1vdmVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB0b3VjaEV2ZW50ID0gZXZlbnQsIC8vL1xuICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZSxcbiAgICAgICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbnNGcm9tVG91Y2hFdmVudCh0b3VjaEV2ZW50LCBjaGFuZ2VkKTtcblxuICAgIHJldHVybiBwb3NpdGlvbnM7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtb3VzZU1vdmVIYW5kbGVyKGV2ZW50LCBlbGVtZW50KSB7XG4gIHRoaXMubW92ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbU1vdXNlRXZlbnQobW91c2VFdmVudCk7XG5cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG91Y2hFbmRIYW5kbGVyKGV2ZW50LCBlbGVtZW50KSB7XG4gIHRoaXMuZW5kSGFuZGxlcihldmVudCwgZWxlbWVudCwgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdG91Y2hFdmVudCA9IGV2ZW50LCAvLy9cbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZSxcbiAgICAgICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbnNGcm9tVG91Y2hFdmVudCh0b3VjaEV2ZW50LCBjaGFuZ2VkKTtcblxuICAgIHJldHVybiBwb3NpdGlvbnM7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtb3VzZVVwSGFuZGxlcihldmVudCwgZWxlbWVudCkge1xuICB0aGlzLmVuZEhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBldmVudCwgLy8vXG4gICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbU1vdXNlRXZlbnQobW91c2VFdmVudCk7XG5cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc3RhcnRIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBwb3NpdGlvbnNGcm9tRXZlbnQpIHtcbiAgY29uc3QgcG9zaXRpb25zID0gcG9zaXRpb25zRnJvbUV2ZW50KGV2ZW50KSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCk7XG5cbiAgZmlsdGVyUG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zLCBwb3NpdGlvbnMpO1xuXG4gIHB1c2goc3RhcnRQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgY29uc3Qgc3RhcnRpbmdQb3NpdGlvbnNMZW5ndGggPSBzdGFydFBvc2l0aW9ucy5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0aW5nUG9zaXRpb25zTGVuZ3RoID09PSAxKSB7XG4gICAgdGhpcy5kcmFnU3RhcnQoZXZlbnQsIGVsZW1lbnQpO1xuXG4gICAgbGV0IHByZXNzSW50ZXJ2YWwgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHByZXNzSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgICB0aGlzLnNldFByZXNzU0ludGVydmFsKHByZXNzSW50ZXJ2YWwpO1xuXG4gICAgICB0aGlzLnByZXNzKGV2ZW50LCBlbGVtZW50KTtcbiAgICB9LCBQUkVTU19ERUxBWSk7XG5cbiAgICB0aGlzLnNldFByZXNzU0ludGVydmFsKHByZXNzSW50ZXJ2YWwpO1xuICB9XG5cbiAgaWYgKHN0YXJ0aW5nUG9zaXRpb25zTGVuZ3RoID09PSAyKSB7XG4gICAgdGhpcy5waW5jaFN0YXJ0KGV2ZW50LCBlbGVtZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlSGFuZGxlcihldmVudCwgZWxlbWVudCwgcG9zaXRpb25zRnJvbUV2ZW50KSB7XG4gIGNvbnN0IHBvc2l0aW9ucyA9IHBvc2l0aW9uc0Zyb21FdmVudChldmVudCksXG4gICAgICAgIHN0YXJ0UG9zaXRpb25zID0gdGhpcy5nZXRTdGFydFBvc2l0aW9ucygpLFxuICAgICAgICBtb3ZpbmdQb3NpdGlvbnMgPSB0aGlzLmdldE1vdmluZ1Bvc2l0aW9ucygpO1xuXG4gIGZpbHRlclBvc2l0aW9ucyhtb3ZpbmdQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgcHVzaChtb3ZpbmdQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgY29uc3QgcG9zaXRpb25zTWF0Y2ggPSBtYXRjaFBvc2l0aW9ucyhzdGFydFBvc2l0aW9ucywgbW92aW5nUG9zaXRpb25zKTtcblxuICBpZiAocG9zaXRpb25zTWF0Y2gpIHtcbiAgICBzb3J0UG9zaXRpb25zKG1vdmluZ1Bvc2l0aW9ucywgc3RhcnRQb3NpdGlvbnMpO1xuXG4gICAgY29uc3QgbW92aW5nUG9zaXRpb25zTGVuZ3RoID0gbW92aW5nUG9zaXRpb25zLmxlbmd0aDtcblxuICAgIGlmIChtb3ZpbmdQb3NpdGlvbnNMZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuZHJhZyhldmVudCwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKG1vdmluZ1Bvc2l0aW9uc0xlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5waW5jaChldmVudCwgZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHByZXNzSW50ZXJ2YWwgPSB0aGlzLmdldFByZXNzU0ludGVydmFsKCk7XG5cbiAgaWYgKHByZXNzSW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICBjbGVhclRpbWVvdXQocHJlc3NJbnRlcnZhbCk7XG5cbiAgICBwcmVzc0ludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0UHJlc3NTSW50ZXJ2YWwocHJlc3NJbnRlcnZhbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kSGFuZGxlcihldmVudCwgZWxlbWVudCwgcG9zaXRpb25zRnJvbUV2ZW50KSB7XG4gIGNvbnN0IHBvc2l0aW9ucyA9IHBvc2l0aW9uc0Zyb21FdmVudChldmVudCksXG4gICAgICAgIHN0YXJ0UG9zaXRpb25zID0gdGhpcy5nZXRTdGFydFBvc2l0aW9ucygpLFxuICAgICAgICBtb3ZpbmdQb3NpdGlvbnMgPSB0aGlzLmdldE1vdmluZ1Bvc2l0aW9ucygpLFxuICAgICAgICBwb3NpdGlvbnNNYXRjaCA9IG1hdGNoUG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zLCBtb3ZpbmdQb3NpdGlvbnMpO1xuXG4gIGlmIChwb3NpdGlvbnNNYXRjaCkge1xuICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25zTGVuZ3RoID0gc3RhcnRQb3NpdGlvbnMubGVuZ3RoO1xuXG4gICAgaWYgKHN0YXJ0UG9zaXRpb25zTGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnBpbmNoU3RvcChldmVudCwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0UG9zaXRpb25zTGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLnBvc3NpYmxlVGFwKGV2ZW50LCBlbGVtZW50KTtcblxuICAgICAgdGhpcy5wb3NzaWJsZVN3aXBlKGV2ZW50LCBlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJQb3NpdGlvbnMoc3RhcnRQb3NpdGlvbnMsIHBvc2l0aW9ucyk7XG5cbiAgZmlsdGVyUG9zaXRpb25zKG1vdmluZ1Bvc2l0aW9ucywgcG9zaXRpb25zKTtcblxuICBsZXQgcHJlc3NJbnRlcnZhbCA9IHRoaXMuZ2V0UHJlc3NTSW50ZXJ2YWwoKTtcblxuICBpZiAocHJlc3NJbnRlcnZhbCAhPT0gbnVsbCkge1xuICAgIGNsZWFyVGltZW91dChwcmVzc0ludGVydmFsKTtcblxuICAgIHByZXNzSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgdGhpcy5zZXRQcmVzc1NJbnRlcnZhbChwcmVzc0ludGVydmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3NzaWJsZVRhcChldmVudCwgZWxlbWVudCkge1xuICBjb25zdCBzdGFydFBvc2l0aW9ucyA9IHRoaXMuZ2V0U3RhcnRQb3NpdGlvbnMoKSxcbiAgICAgICAgbW92aW5nUG9zaXRpb25zID0gdGhpcy5nZXRNb3ZpbmdQb3NpdGlvbnMoKSxcbiAgICAgICAgZmlyc3RTdGFydFBvc2l0aW9uID0gZmlyc3Qoc3RhcnRQb3NpdGlvbnMpLFxuICAgICAgICBmaXJzdE1vdmluZ1Bvc2l0aW9uID0gZmlyc3QobW92aW5nUG9zaXRpb25zKSxcbiAgICAgICAgZmlyc3RQb3NpdGlvbiA9IGZpcnN0U3RhcnRQb3NpdGlvbiwgLy8vXG4gICAgICAgIHNlY29uZFBvc2l0aW9uID0gZmlyc3RNb3ZpbmdQb3NpdGlvbiwgLy8vXG4gICAgICAgIHJlbGF0aXZlUG9zaXRpb24gPSBSZWxhdGl2ZVBvc2l0aW9uLmZyb21GaXJzdFBvc2l0aW9uQW5kU2Vjb25kUG9zaXRpb24oZmlyc3RQb3NpdGlvbiwgc2Vjb25kUG9zaXRpb24pLFxuICAgICAgICB0aW1lID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRUaW1lKCksXG4gICAgICAgIHNwZWVkID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRTcGVlZCgpO1xuXG4gIGlmICgoc3BlZWQgPT09IDApICYmICh0aW1lIDwgTUFYSU1VTV9UQVBfVElNRSkpe1xuICAgIHRoaXMudGFwKGV2ZW50LCBlbGVtZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3NzaWJsZVN3aXBlKGV2ZW50LCBlbGVtZW50KSB7XG4gIGNvbnN0IHN0YXJ0UG9zaXRpb25zID0gdGhpcy5nZXRTdGFydFBvc2l0aW9ucygpLFxuICAgICAgICBtb3ZpbmdQb3NpdGlvbnMgPSB0aGlzLmdldE1vdmluZ1Bvc2l0aW9ucygpLFxuICAgICAgICBmaXJzdFN0YXJ0UG9zaXRpb24gPSBmaXJzdChzdGFydFBvc2l0aW9ucyksXG4gICAgICAgIGZpcnN0TW92aW5nUG9zaXRpb24gPSBmaXJzdChtb3ZpbmdQb3NpdGlvbnMpLFxuICAgICAgICBmaXJzdFBvc2l0aW9uID0gZmlyc3RTdGFydFBvc2l0aW9uLCAvLy9cbiAgICAgICAgc2Vjb25kUG9zaXRpb24gPSBmaXJzdE1vdmluZ1Bvc2l0aW9uLCAvLy9cbiAgICAgICAgcmVsYXRpdmVQb3NpdGlvbiA9IFJlbGF0aXZlUG9zaXRpb24uZnJvbUZpcnN0UG9zaXRpb25BbmRTZWNvbmRQb3NpdGlvbihmaXJzdFBvc2l0aW9uLCBzZWNvbmRQb3NpdGlvbiksXG4gICAgICAgIGRpcmVjdGlvbiA9IHJlbGF0aXZlUG9zaXRpb24uZ2V0RGlyZWN0aW9uKCksXG4gICAgICAgIHNwZWVkID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRTcGVlZCgpO1xuXG4gIGlmIChzcGVlZCA+IE1JTklNVU1fU1dJUEVfU1BFRUQpIHtcbiAgICB0aGlzLnN3aXBlKGV2ZW50LCBlbGVtZW50LCBzcGVlZCwgZGlyZWN0aW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0YXAoZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3Qgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgIGZpcnN0U3RhcnRQb3NpdGlvbiA9IGZpcnN0KHN0YXJ0UG9zaXRpb25zKSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGZpcnN0U3RhcnRQb3NpdGlvbiwgLy8vXG4gICAgICAgIHRvcCA9IHN0YXJ0UG9zaXRpb24uZ2V0VG9wKCksXG4gICAgICAgIGxlZnQgPSBzdGFydFBvc2l0aW9uLmdldExlZnQoKTtcblxuICBsZXQgdGFwSW50ZXJ2YWwgPSB0aGlzLmdldFRhcEludGVydmFsKCk7XG5cbiAgaWYgKHRhcEludGVydmFsICE9PSBudWxsKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRhcEludGVydmFsKTtcblxuICAgIHRhcEludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0VGFwSW50ZXJ2YWwodGFwSW50ZXJ2YWwpO1xuXG4gICAgdGhpcy5kb3VibGVUYXAoZXZlbnQsIGVsZW1lbnQsIHRvcCwgbGVmdCk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB0YXBJbnRlcnZhbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRhcEludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0VGFwSW50ZXJ2YWwodGFwSW50ZXJ2YWwpO1xuXG4gICAgdGhpcy5zaW5nbGVUYXAoZXZlbnQsIGVsZW1lbnQsIHRvcCwgbGVmdCk7XG4gIH0sIFRBUF9ERUxBWSk7XG5cbiAgdGhpcy5zZXRUYXBJbnRlcnZhbCh0YXBJbnRlcnZhbCk7XG59XG5cbmZ1bmN0aW9uIGRyYWcoZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3Qgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgIG1vdmluZ1Bvc2l0aW9ucyA9IHRoaXMuZ2V0TW92aW5nUG9zaXRpb25zKCksXG4gICAgICAgIGZpcnN0U3RhcnRQb3NpdGlvbiA9IGZpcnN0KHN0YXJ0UG9zaXRpb25zKSxcbiAgICAgICAgZmlyc3RNb3ZpbmdQb3NpdGlvbiA9IGZpcnN0KG1vdmluZ1Bvc2l0aW9ucyksXG4gICAgICAgIGZpcnN0UG9zaXRpb24gPSBmaXJzdFN0YXJ0UG9zaXRpb24sIC8vL1xuICAgICAgICBzZWNvbmRQb3NpdGlvbiA9IGZpcnN0TW92aW5nUG9zaXRpb24sIC8vL1xuICAgICAgICByZWxhdGl2ZVBvc2l0aW9uID0gUmVsYXRpdmVQb3NpdGlvbi5mcm9tRmlyc3RQb3NpdGlvbkFuZFNlY29uZFBvc2l0aW9uKGZpcnN0UG9zaXRpb24sIHNlY29uZFBvc2l0aW9uKSxcbiAgICAgICAgdG9wID0gcmVsYXRpdmVQb3NpdGlvbi5nZXRUb3AoKSxcbiAgICAgICAgbGVmdCA9IHJlbGF0aXZlUG9zaXRpb24uZ2V0TGVmdCgpLFxuICAgICAgICBkaXJlY3Rpb24gPSByZWxhdGl2ZVBvc2l0aW9uLmdldERpcmVjdGlvbigpO1xuXG4gIGxldCBjdXN0b21FdmVudFR5cGUgPSBudWxsO1xuXG4gIGlmICgoTWF0aC5hYnMoZGlyZWN0aW9uKSkgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEU7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoUElfT1ZFUl9UV08gLSBkaXJlY3Rpb24pIDwgTUFYSU1VTV9TUFJFQUQpIHtcbiAgICBjdXN0b21FdmVudFR5cGUgPSBEUkFHX1VQX0NVU1RPTV9FVkVOVF9UWVBFO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKC1QSV9PVkVSX1RXTyAtIGRpcmVjdGlvbikgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IERSQUdfRE9XTl9DVVNUT01fRVZFTlRfVFlQRTtcbiAgfVxuXG4gIGlmICgoUEkgLSBNYXRoLmFicyhkaXJlY3Rpb24pKSA8IE1BWElNVU1fU1BSRUFEKSB7XG4gICAgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19MRUZUX0NVU1RPTV9FVkVOVF9UWVBFO1xuICB9XG5cbiAgaWYgKGN1c3RvbUV2ZW50VHlwZSAhPT0gbnVsbCkge1xuICAgIHRoaXMuY2FsbEN1c3RvbUhhbmRsZXJzKGN1c3RvbUV2ZW50VHlwZSwgZXZlbnQsIGVsZW1lbnQsIHRvcCwgbGVmdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGluY2goZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3QgbW92aW5nUG9zaXRpb25zID0gdGhpcy5nZXRNb3ZpbmdQb3NpdGlvbnMoKSxcbiAgICAgICAgZmlyc3RNb3ZpbmdQb3NpdGlvbiA9IGZpcnN0KG1vdmluZ1Bvc2l0aW9ucyksXG4gICAgICAgIHNlY29uZE1vdmluZ1Bvc2l0aW9uID0gc2Vjb25kKG1vdmluZ1Bvc2l0aW9ucyksXG4gICAgICAgIHJlbGF0aXZlTW92aW5nUG9zaXRpb24gPSBSZWxhdGl2ZVBvc2l0aW9uLmZyb21GaXJzdFBvc2l0aW9uQW5kU2Vjb25kUG9zaXRpb24oZmlyc3RNb3ZpbmdQb3NpdGlvbiwgc2Vjb25kTW92aW5nUG9zaXRpb24pLFxuICAgICAgICBjdXN0b21FdmVudFR5cGUgPSBQSU5DSF9NT1ZFX0NVU1RPTV9FVkVOVF9UWVBFLFxuICAgICAgICBzdGFydE1hZ25pdHVkZSA9IHRoaXMuZ2V0U3RhcnRNYWduaXR1ZGUoKSxcbiAgICAgICAgbWFnbml0dWRlID0gcmVsYXRpdmVNb3ZpbmdQb3NpdGlvbi5nZXRNYWduaXR1ZGUoKSxcbiAgICAgICAgcmF0aW8gPSBtYWduaXR1ZGUgLyBzdGFydE1hZ25pdHVkZTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50LCByYXRpbyk7XG59XG5cbmZ1bmN0aW9uIHByZXNzKGV2ZW50LCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBSRVNTX0NVU1RPTV9FVkVOVF9UWVBFO1xuXG4gIHRoaXMuY2FsbEN1c3RvbUhhbmRsZXJzKGN1c3RvbUV2ZW50VHlwZSwgZXZlbnQsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBzd2lwZShldmVudCwgZWxlbWVudCwgc3BlZWQsIGRpcmVjdGlvbikge1xuICBsZXQgY3VzdG9tRXZlbnRUeXBlID0gbnVsbDtcblxuICBpZiAoKE1hdGguYWJzKGRpcmVjdGlvbikpIDwgTUFYSU1VTV9TUFJFQUQpIHtcbiAgICBjdXN0b21FdmVudFR5cGUgPSBTV0lQRV9SSUdIVF9DVVNUT01fRVZFTlRfVFlQRTtcblxuICAgIHNwZWVkID0gc3BlZWQgKiBNYXRoLmFicyhNYXRoLmNvcyhkaXJlY3Rpb24pKTtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhQSV9PVkVSX1RXTyAtIGRpcmVjdGlvbikgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX1VQX0NVU1RPTV9FVkVOVF9UWVBFO1xuXG4gICAgc3BlZWQgPSBzcGVlZCAqIE1hdGguYWJzKE1hdGguc2luKGRpcmVjdGlvbikpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKC1QSV9PVkVSX1RXTyAtIGRpcmVjdGlvbikgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEU7XG5cbiAgICBzcGVlZCA9IHNwZWVkICogTWF0aC5hYnMoTWF0aC5zaW4oZGlyZWN0aW9uKSk7XG4gIH1cblxuICBpZiAoKFBJIC0gTWF0aC5hYnMoZGlyZWN0aW9uKSkgPCBNQVhJTVVNX1NQUkVBRCkge1xuICAgIGN1c3RvbUV2ZW50VHlwZSA9IFNXSVBFX0xFRlRfQ1VTVE9NX0VWRU5UX1RZUEU7XG5cbiAgICBzcGVlZCA9IHNwZWVkICogTWF0aC5hYnMoTWF0aC5jb3MoZGlyZWN0aW9uKSk7XG4gIH1cblxuICBpZiAoY3VzdG9tRXZlbnRUeXBlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgICAgZmlyc3RTdGFydFBvc2l0aW9uID0gZmlyc3Qoc3RhcnRQb3NpdGlvbnMpLFxuICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBmaXJzdFN0YXJ0UG9zaXRpb24sIC8vL1xuICAgICAgICAgIHRvcCA9IHN0YXJ0UG9zaXRpb24uZ2V0VG9wKCksXG4gICAgICAgICAgbGVmdCA9IHN0YXJ0UG9zaXRpb24uZ2V0TGVmdCgpO1xuXG4gICAgdGhpcy5jYWxsQ3VzdG9tSGFuZGxlcnMoY3VzdG9tRXZlbnRUeXBlLCBldmVudCwgZWxlbWVudCwgdG9wLCBsZWZ0LCBzcGVlZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2luZ2xlVGFwKGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gU0lOR0xFX1RBUF9DVVNUT01fRVZFTlRfVFlQRTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpOyAvLy9cbn1cblxuZnVuY3Rpb24gZG91YmxlVGFwKGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRE9VQkxFX1RBUF9DVVNUT01fRVZFTlRfVFlQRTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50LCB0b3AsIGxlZnQpO1xufVxuXG5mdW5jdGlvbiBkcmFnU3RhcnQoZXZlbnQsIGVsZW1lbnQpIHtcbiAgY29uc3QgY3VzdG9tRXZlbnRUeXBlID0gRFJBR19TVEFSVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbnMgPSB0aGlzLmdldFN0YXJ0UG9zaXRpb25zKCksXG4gICAgICAgIGZpcnN0U3RhcnRQb3NpdGlvbiA9IGZpcnN0KHN0YXJ0UG9zaXRpb25zKSxcbiAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGZpcnN0U3RhcnRQb3NpdGlvbiwgIC8vL1xuICAgICAgICB0b3AgPSBzdGFydFBvc2l0aW9uLmdldFRvcCgpLFxuICAgICAgICBsZWZ0ID0gc3RhcnRQb3NpdGlvbi5nZXRMZWZ0KCk7XG5cbiAgdGhpcy5jYWxsQ3VzdG9tSGFuZGxlcnMoY3VzdG9tRXZlbnRUeXBlLCBldmVudCwgZWxlbWVudCwgdG9wLCBsZWZ0KTtcbn1cblxuZnVuY3Rpb24gcGluY2hTdGFydChldmVudCwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBQSU5DSF9TVEFSVF9DVVNUT01fRVZFTlRfVFlQRSxcbiAgICBzdGFydFBvc2l0aW9ucyA9IHRoaXMuZ2V0U3RhcnRQb3NpdGlvbnMoKSxcbiAgICBmaXJzdFN0YXJ0UG9zaXRpb24gPSBmaXJzdChzdGFydFBvc2l0aW9ucyksXG4gICAgc2Vjb25kU3RhcnRQb3NpdGlvbiA9IHNlY29uZChzdGFydFBvc2l0aW9ucyksXG4gICAgcmVsYXRpdmVTdGFydFBvc2l0aW9uID0gUmVsYXRpdmVQb3NpdGlvbi5mcm9tRmlyc3RQb3NpdGlvbkFuZFNlY29uZFBvc2l0aW9uKGZpcnN0U3RhcnRQb3NpdGlvbiwgc2Vjb25kU3RhcnRQb3NpdGlvbiksXG4gICAgbWFnbml0dWRlID0gcmVsYXRpdmVTdGFydFBvc2l0aW9uLmdldE1hZ25pdHVkZSgpLFxuICAgIHN0YXJ0TWFnbml0dWRlID0gbWFnbml0dWRlOyAvLy9cblxuICB0aGlzLnNldFN0YXJ0TWFnbml0dWRlKHN0YXJ0TWFnbml0dWRlKTtcblxuICB0aGlzLmNhbGxDdXN0b21IYW5kbGVycyhjdXN0b21FdmVudFR5cGUsIGV2ZW50LCBlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gcGluY2hTdG9wKGV2ZW50LCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50VHlwZSA9IFBJTkNIX1NUT1BfQ1VTVE9NX0VWRU5UX1RZUEU7XG5cbiAgdGhpcy5jYWxsQ3VzdG9tSGFuZGxlcnMoY3VzdG9tRXZlbnRUeXBlLCBldmVudCwgZWxlbWVudCk7XG59XG5cbmNvbnN0IHRvdWNoTWl4aW5zID0ge1xuICBlbmFibGVUb3VjaCxcbiAgZGlzYWJsZVRvdWNoLFxuICBvbkN1c3RvbVByZXNzLFxuICBvZmZDdXN0b21QcmVzcyxcbiAgb25DdXN0b21EcmFnVXAsXG4gIG9mZkN1c3RvbURyYWdVcCxcbiAgb25DdXN0b21EcmFnRG93bixcbiAgb2ZmQ3VzdG9tRHJhZ0Rvd24sXG4gIG9uQ3VzdG9tRHJhZ0xlZnQsXG4gIG9mZkN1c3RvbURyYWdMZWZ0LFxuICBvbkN1c3RvbURyYWdSaWdodCxcbiAgb2ZmQ3VzdG9tRHJhZ1JpZ2h0LFxuICBvbkN1c3RvbURyYWdTdGFydCxcbiAgb2ZmQ3VzdG9tRHJhZ1N0YXJ0LFxuICBvbkN1c3RvbVN3aXBlVXAsXG4gIG9mZkN1c3RvbVN3aXBlVXAsXG4gIG9uQ3VzdG9tU3dpcGVEb3duLFxuICBvZmZDdXN0b21Td2lwZURvd24sXG4gIG9uQ3VzdG9tU3dpcGVMZWZ0LFxuICBvZmZDdXN0b21Td2lwZUxlZnQsXG4gIG9uQ3VzdG9tU3dpcGVSaWdodCxcbiAgb2ZmQ3VzdG9tU3dpcGVSaWdodCxcbiAgb25DdXN0b21QaW5jaE1vdmUsXG4gIG9mZkN1c3RvbVBpbmNoTW92ZSxcbiAgb25DdXN0b21QaW5jaFN0YXJ0LFxuICBvZmZDdXN0b21QaW5jaFN0YXJ0LFxuICBvbkN1c3RvbVBpbmNoU3RvcCxcbiAgb2ZmQ3VzdG9tUGluY2hTdG9wLFxuICBvbkN1c3RvbVNpbmdsZVRhcCxcbiAgb2ZmQ3VzdG9tU2luZ2xlVGFwLFxuICBvbkN1c3RvbURvdWJsZVRhcCxcbiAgb2ZmQ3VzdG9tRG91YmxlVGFwLFxuICBnZXRUYXBJbnRlcnZhbCxcbiAgZ2V0UHJlc3NTSW50ZXJ2YWwsXG4gIGdldFN0YXJ0TWFnbml0dWRlLFxuICBnZXRTdGFydFBvc2l0aW9ucyxcbiAgZ2V0TW92aW5nUG9zaXRpb25zLFxuICBzZXRUYXBJbnRlcnZhbCxcbiAgc2V0UHJlc3NTSW50ZXJ2YWwsXG4gIHNldFN0YXJ0TWFnbml0dWRlLFxuICBzZXRTdGFydFBvc2l0aW9ucyxcbiAgc2V0TW92aW5nUG9zaXRpb25zLFxuICB0b3VjaFN0YXJ0SGFuZGxlcixcbiAgbW91c2VEb3duSGFuZGxlcixcbiAgdG91Y2hNb3ZlSGFuZGxlcixcbiAgbW91c2VNb3ZlSGFuZGxlcixcbiAgdG91Y2hFbmRIYW5kbGVyLFxuICBtb3VzZVVwSGFuZGxlcixcbiAgc3RhcnRIYW5kbGVyLFxuICBtb3ZlSGFuZGxlcixcbiAgZW5kSGFuZGxlcixcbiAgcG9zc2libGVUYXAsXG4gIHBvc3NpYmxlU3dpcGUsXG4gIHRhcCxcbiAgZHJhZyxcbiAgcGluY2gsXG4gIHByZXNzLFxuICBzd2lwZSxcbiAgc2luZ2xlVGFwLFxuICBkb3VibGVUYXAsXG4gIGRyYWdTdGFydCxcbiAgcGluY2hTdGFydCxcbiAgcGluY2hTdG9wXG59O1xuXG5leHBvcnQgZGVmYXVsdCB0b3VjaE1peGlucztcbiJdLCJuYW1lcyI6WyJwdXNoIiwiZmlyc3QiLCJzZWNvbmQiLCJhcnJheVV0aWxpdGllcyIsImVuYWJsZVRvdWNoIiwidGFwSW50ZXJ2YWwiLCJzdGFydE1hZ25pdHVkZSIsInN0YXJ0UG9zaXRpb25zIiwibW92aW5nUG9zaXRpb25zIiwidXBkYXRlU3RhdGUiLCJvbk1vdXNlRG93biIsIm1vdXNlRG93bkhhbmRsZXIiLCJvbk1vdXNlTW92ZSIsIm1vdXNlTW92ZUhhbmRsZXIiLCJ3aW5kb3ciLCJvbk1vdXNlVXAiLCJtb3VzZVVwSGFuZGxlciIsIm9uVG91Y2hTdGFydCIsInRvdWNoU3RhcnRIYW5kbGVyIiwib25Ub3VjaE1vdmUiLCJ0b3VjaE1vdmVIYW5kbGVyIiwib25Ub3VjaEVuZCIsInRvdWNoRW5kSGFuZGxlciIsImRpc2FibGVUb3VjaCIsIm9mZk1vdXNlRG93biIsIm9mZk1vdXNlTW92ZSIsIm9mZk1vdXNlVXAiLCJvZmZUb3VjaFN0YXJ0Iiwib2ZmVG91Y2hNb3ZlIiwib2ZmVG91Y2hFbmQiLCJvbkN1c3RvbVByZXNzIiwicHJlc3NDdXN0b21IYW5kbGVyIiwiZWxlbWVudCIsImN1c3RvbUV2ZW50VHlwZSIsIlBSRVNTX0NVU1RPTV9FVkVOVF9UWVBFIiwiY3VzdG9tSGFuZGxlciIsIm9uQ3VzdG9tRXZlbnQiLCJvZmZDdXN0b21QcmVzcyIsIm9mZkN1c3RvbUV2ZW50Iiwib25DdXN0b21EcmFnVXAiLCJkcmFnVXBDdXN0b21IYW5kbGVyIiwiRFJBR19VUF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbURyYWdVcCIsIm9uQ3VzdG9tRHJhZ0Rvd24iLCJkcmFnRG93bkN1c3RvbUhhbmRsZXIiLCJEUkFHX0RPV05fQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21EcmFnRG93biIsIm9uQ3VzdG9tRHJhZ0xlZnQiLCJkcmFnTGVmdEN1c3RvbUhhbmRsZXIiLCJEUkFHX0xFRlRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21EcmFnTGVmdCIsIm9uQ3VzdG9tRHJhZ1JpZ2h0IiwiZHJhZ1JpZ2h0Q3VzdG9tSGFuZGxlciIsIkRSQUdfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21EcmFnUmlnaHQiLCJvbkN1c3RvbURyYWdTdGFydCIsImRyYWdTdGFydEN1c3RvbUhhbmRsZXIiLCJEUkFHX1NUQVJUX0NVU1RPTV9FVkVOVF9UWVBFIiwib2ZmQ3VzdG9tRHJhZ1N0YXJ0Iiwib25DdXN0b21Td2lwZVVwIiwic3dpcGVVcEN1c3RvbUhhbmRsZXIiLCJTV0lQRV9VUF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVN3aXBlVXAiLCJvbkN1c3RvbVN3aXBlRG93biIsInN3aXBlRG93bkN1c3RvbUhhbmRsZXIiLCJTV0lQRV9ET1dOX0NVU1RPTV9FVkVOVF9UWVBFIiwib2ZmQ3VzdG9tU3dpcGVEb3duIiwib25DdXN0b21Td2lwZUxlZnQiLCJzd2lwZUxlZnRDdXN0b21IYW5kbGVyIiwiU1dJUEVfTEVGVF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVN3aXBlTGVmdCIsIm9uQ3VzdG9tU3dpcGVSaWdodCIsInN3aXBlUmlnaHRDdXN0b21IYW5kbGVyIiwiU1dJUEVfUklHSFRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21Td2lwZVJpZ2h0Iiwib25DdXN0b21QaW5jaE1vdmUiLCJwaW5jaE1vdmVDdXN0b21IYW5kbGVyIiwiUElOQ0hfTU9WRV9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVBpbmNoTW92ZSIsIm9uQ3VzdG9tUGluY2hTdGFydCIsInBpbmNoU3RhcnRDdXN0b21IYW5kbGVyIiwiUElOQ0hfU1RBUlRfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21QaW5jaFN0YXJ0Iiwib25DdXN0b21QaW5jaFN0b3AiLCJwaW5jaFN0b3BDdXN0b21IYW5kbGVyIiwiUElOQ0hfU1RPUF9DVVNUT01fRVZFTlRfVFlQRSIsIm9mZkN1c3RvbVBpbmNoU3RvcCIsIm9uQ3VzdG9tU2luZ2xlVGFwIiwic2luZ2xlVGFwQ3VzdG9tSGFuZGxlciIsIlNJTkdMRV9UQVBfQ1VTVE9NX0VWRU5UX1RZUEUiLCJvZmZDdXN0b21TaW5nbGVUYXAiLCJvbkN1c3RvbURvdWJsZVRhcCIsImRvdWJsZVRhcEN1c3RvbUhhbmRsZXIiLCJET1VCTEVfVEFQX0NVU1RPTV9FVkVOVF9UWVBFIiwib2ZmQ3VzdG9tRG91YmxlVGFwIiwiZ2V0VGFwSW50ZXJ2YWwiLCJnZXRTdGF0ZSIsImdldFByZXNzU0ludGVydmFsIiwicHJlc3NJbnRlcnZhbCIsImdldFN0YXJ0TWFnbml0dWRlIiwiZ2V0U3RhcnRQb3NpdGlvbnMiLCJnZXRNb3ZpbmdQb3NpdGlvbnMiLCJzZXRUYXBJbnRlcnZhbCIsInNldFByZXNzU0ludGVydmFsIiwic2V0U3RhcnRNYWduaXR1ZGUiLCJzZXRTdGFydFBvc2l0aW9ucyIsInNldE1vdmluZ1Bvc2l0aW9ucyIsImV2ZW50Iiwic3RhcnRIYW5kbGVyIiwidG91Y2hFdmVudCIsImNoYW5nZWQiLCJwb3NpdGlvbnMiLCJwb3NpdGlvbnNGcm9tVG91Y2hFdmVudCIsIm1vdXNlRXZlbnQiLCJwb3NpdGlvbnNGcm9tTW91c2VFdmVudCIsIm1vdmVIYW5kbGVyIiwiZW5kSGFuZGxlciIsInBvc2l0aW9uc0Zyb21FdmVudCIsImZpbHRlclBvc2l0aW9ucyIsInN0YXJ0aW5nUG9zaXRpb25zTGVuZ3RoIiwibGVuZ3RoIiwiZHJhZ1N0YXJ0Iiwic2V0VGltZW91dCIsInByZXNzIiwiUFJFU1NfREVMQVkiLCJwaW5jaFN0YXJ0IiwicG9zaXRpb25zTWF0Y2giLCJtYXRjaFBvc2l0aW9ucyIsInNvcnRQb3NpdGlvbnMiLCJtb3ZpbmdQb3NpdGlvbnNMZW5ndGgiLCJkcmFnIiwicGluY2giLCJjbGVhclRpbWVvdXQiLCJzdGFydFBvc2l0aW9uc0xlbmd0aCIsInBpbmNoU3RvcCIsInBvc3NpYmxlVGFwIiwicG9zc2libGVTd2lwZSIsImZpcnN0U3RhcnRQb3NpdGlvbiIsImZpcnN0TW92aW5nUG9zaXRpb24iLCJmaXJzdFBvc2l0aW9uIiwic2Vjb25kUG9zaXRpb24iLCJyZWxhdGl2ZVBvc2l0aW9uIiwiUmVsYXRpdmVQb3NpdGlvbiIsImZyb21GaXJzdFBvc2l0aW9uQW5kU2Vjb25kUG9zaXRpb24iLCJ0aW1lIiwiZ2V0VGltZSIsInNwZWVkIiwiZ2V0U3BlZWQiLCJNQVhJTVVNX1RBUF9USU1FIiwidGFwIiwiZGlyZWN0aW9uIiwiZ2V0RGlyZWN0aW9uIiwiTUlOSU1VTV9TV0lQRV9TUEVFRCIsInN3aXBlIiwic3RhcnRQb3NpdGlvbiIsInRvcCIsImdldFRvcCIsImxlZnQiLCJnZXRMZWZ0IiwiZG91YmxlVGFwIiwic2luZ2xlVGFwIiwiVEFQX0RFTEFZIiwiTWF0aCIsImFicyIsIk1BWElNVU1fU1BSRUFEIiwiUElfT1ZFUl9UV08iLCJQSSIsImNhbGxDdXN0b21IYW5kbGVycyIsInNlY29uZE1vdmluZ1Bvc2l0aW9uIiwicmVsYXRpdmVNb3ZpbmdQb3NpdGlvbiIsIm1hZ25pdHVkZSIsImdldE1hZ25pdHVkZSIsInJhdGlvIiwiY29zIiwic2luIiwic2Vjb25kU3RhcnRQb3NpdGlvbiIsInJlbGF0aXZlU3RhcnRQb3NpdGlvbiIsInRvdWNoTWl4aW5zIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFpdkJBOzs7ZUFBQTs7O3NCQS91QnVCOzJCQUNRO2lFQUVGOzJCQUVrRjsyQkFDRTtrQ0FlcEU7Ozs7OztBQUU3QyxNQUFNLEVBQUVBLElBQUksRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUUsR0FBR0MseUJBQWM7QUFFOUMsU0FBU0M7SUFDUCxNQUFNQyxjQUFjLE1BQ2RDLGlCQUFpQixNQUNqQkMsaUJBQWlCLEVBQUUsRUFDbkJDLGtCQUFrQixFQUFFO0lBRTFCLElBQUksQ0FBQ0MsV0FBVyxDQUFDO1FBQ2ZKO1FBQ0FDO1FBQ0FDO1FBQ0FDO0lBQ0Y7SUFFQSxJQUFJLENBQUNFLFdBQVcsQ0FBQyxJQUFJLENBQUNDLGdCQUFnQjtJQUN0QyxJQUFJLENBQUNDLFdBQVcsQ0FBQyxJQUFJLENBQUNDLGdCQUFnQjtJQUV0Q0MsWUFBTSxDQUFDQyxTQUFTLENBQUMsSUFBSSxDQUFDQyxjQUFjLEVBQUUsSUFBSTtJQUUxQyxJQUFJLENBQUNDLFlBQVksQ0FBQyxJQUFJLENBQUNDLGlCQUFpQjtJQUN4QyxJQUFJLENBQUNDLFdBQVcsQ0FBQyxJQUFJLENBQUNDLGdCQUFnQjtJQUN0QyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxJQUFJLENBQUNDLGVBQWU7QUFDdEM7QUFFQSxTQUFTQztJQUNQLElBQUksQ0FBQ0MsWUFBWSxD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
|