@office-iss/react-native-win32 0.64.7 → 0.64.11

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/.flowconfig CHANGED
@@ -12,6 +12,7 @@
12
12
  <PROJECT_ROOT>/Libraries/Alert/Alert.js
13
13
  <PROJECT_ROOT>/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js
14
14
  <PROJECT_ROOT>/Libraries/Components/Picker/Picker.js
15
+ <PROJECT_ROOT>/Libraries/Components/Pressable/Pressable.js
15
16
  <PROJECT_ROOT>/Libraries/Components/SafeAreaView/SafeAreaView.js
16
17
  <PROJECT_ROOT>/Libraries/Components/TextInput/TextInput.js
17
18
  <PROJECT_ROOT>/Libraries/Components/TextInput/TextInputState.js
@@ -19,11 +20,15 @@
19
20
  <PROJECT_ROOT>/Libraries/Components/View/ReactNativeViewAttributes.js
20
21
  <PROJECT_ROOT>/Libraries/Components/View/ReactNativeViewViewConfig.js
21
22
  <PROJECT_ROOT>/Libraries/Components/View/View.js
23
+ <PROJECT_ROOT>/Libraries/Components/View/ViewPropTypes.js
22
24
  <PROJECT_ROOT>/Libraries/Image/Image.js
23
25
  <PROJECT_ROOT>/Libraries/Inspector/Inspector.js
24
26
  <PROJECT_ROOT>/Libraries/Inspector/InspectorOverlay.js
25
27
  <PROJECT_ROOT>/Libraries/Network/RCTNetworking.js
28
+ <PROJECT_ROOT>/Libraries/Pressability/Pressability.js
29
+ <PROJECT_ROOT>/Libraries/Pressability/HoverState.js
26
30
  <PROJECT_ROOT>/Libraries/StyleSheet/StyleSheet.js
31
+ <PROJECT_ROOT>/Libraries/Types/CoreEventTypes.js
27
32
  <PROJECT_ROOT>/Libraries/Utilities/DeviceInfo.js
28
33
  <PROJECT_ROOT>/Libraries/Utilities/Dimensions.js
29
34
 
package/CHANGELOG.json CHANGED
@@ -2,7 +2,67 @@
2
2
  "name": "@office-iss/react-native-win32",
3
3
  "entries": [
4
4
  {
5
- "date": "Mon, 20 Sep 2021 15:06:30 GMT",
5
+ "date": "Mon, 31 Jan 2022 22:58:05 GMT",
6
+ "tag": "@office-iss/react-native-win32_v0.64.11",
7
+ "version": "0.64.11",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "comment": "[Win32] Move acceptsKeyboardFocus back to just a warning",
12
+ "author": "30809111+acoates-ms@users.noreply.github.com",
13
+ "commit": "eb8b9b2da9123b8538886365df012b3d3da38367",
14
+ "package": "@office-iss/react-native-win32"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Mon, 17 Jan 2022 16:10:13 GMT",
21
+ "tag": "@office-iss/react-native-win32_v0.64.10",
22
+ "version": "0.64.10",
23
+ "comments": {
24
+ "patch": [
25
+ {
26
+ "comment": "Port windows pressable with extra desktop support to win32",
27
+ "author": "saadnajmi2@gmail.com",
28
+ "commit": "acfb47a7924f4d4e34e020838423bbbab026d670",
29
+ "package": "@office-iss/react-native-win32"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "date": "Mon, 15 Nov 2021 16:09:20 GMT",
36
+ "tag": "@office-iss/react-native-win32_v0.64.9",
37
+ "version": "0.64.9",
38
+ "comments": {
39
+ "patch": [
40
+ {
41
+ "comment": "Add enableFocusRing prop for View and test",
42
+ "author": "ruaraki@microsoft.com",
43
+ "commit": "ecbd53d9cd10b88691fc79eeaaf3be1b035f162f",
44
+ "package": "@office-iss/react-native-win32"
45
+ }
46
+ ]
47
+ }
48
+ },
49
+ {
50
+ "date": "Mon, 25 Oct 2021 15:07:12 GMT",
51
+ "tag": "@office-iss/react-native-win32_v0.64.8",
52
+ "version": "0.64.8",
53
+ "comments": {
54
+ "patch": [
55
+ {
56
+ "comment": "Revert back to a warning for acceptsKeyboardFocus deprecation",
57
+ "author": "30809111+acoates-ms@users.noreply.github.com",
58
+ "commit": "e615b1c46b7396fe617dc3019091cc367bd145a8",
59
+ "package": "@office-iss/react-native-win32"
60
+ }
61
+ ]
62
+ }
63
+ },
64
+ {
65
+ "date": "Mon, 20 Sep 2021 15:06:37 GMT",
6
66
  "tag": "@office-iss/react-native-win32_v0.64.7",
7
67
  "version": "0.64.7",
8
68
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,17 +1,49 @@
1
1
  # Change Log - @office-iss/react-native-win32
2
2
 
3
- This log was last generated on Mon, 20 Sep 2021 15:06:30 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 31 Jan 2022 22:58:05 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## 0.64.7
7
+ ## 0.64.11
8
8
 
9
- Mon, 20 Sep 2021 15:06:30 GMT
9
+ Mon, 31 Jan 2022 22:58:05 GMT
10
10
 
11
11
  ### Patches
12
12
 
13
- - Adding accessibilityItemType to ViewWin32 (safreibe@microsoft.com)
13
+ - [Win32] Move acceptsKeyboardFocus back to just a warning (30809111+acoates-ms@users.noreply.github.com)
14
14
 
15
+ ## 0.64.10
16
+
17
+ Mon, 17 Jan 2022 16:10:13 GMT
18
+
19
+ ### Patches
20
+
21
+ - Port windows pressable with extra desktop support to win32 (saadnajmi2@gmail.com)
22
+
23
+ ## 0.64.9
24
+
25
+ Mon, 15 Nov 2021 16:09:20 GMT
26
+
27
+ ### Patches
28
+
29
+ - Add enableFocusRing prop for View and test (ruaraki@microsoft.com)
30
+
31
+ ## 0.64.8
32
+
33
+ Mon, 25 Oct 2021 15:07:12 GMT
34
+
35
+ ### Patches
36
+
37
+ - Revert back to a warning for acceptsKeyboardFocus deprecation (30809111+acoates-ms@users.noreply.github.com)
38
+
39
+ ## 0.64.7
40
+
41
+ Mon, 20 Sep 2021 15:06:37 GMT
42
+
43
+ ### Patches
44
+
45
+ - Adding accessibilityItemType to ViewWin32 (safreibe@microsoft.com)
46
+
15
47
  ## 0.64.6
16
48
 
17
49
  Mon, 13 Sep 2021 15:06:21 GMT
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict-local
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import * as React from 'react';
14
+ import {useMemo, useState, useRef, useImperativeHandle} from 'react';
15
+ import useAndroidRippleForView, {
16
+ type RippleConfig,
17
+ } from './useAndroidRippleForView';
18
+ import type {
19
+ AccessibilityActionEvent,
20
+ AccessibilityActionInfo,
21
+ AccessibilityRole,
22
+ AccessibilityState,
23
+ AccessibilityValue,
24
+ } from '../View/ViewAccessibility';
25
+ import {PressabilityDebugView} from '../../Pressability/PressabilityDebug';
26
+ import usePressability from '../../Pressability/usePressability';
27
+ import {normalizeRect, type RectOrSize} from '../../StyleSheet/Rect';
28
+ import type {
29
+ LayoutEvent,
30
+ PressEvent,
31
+ // [Windows
32
+ MouseEvent,
33
+ BlurEvent,
34
+ FocusEvent, // Windows]
35
+ } from '../../Types/CoreEventTypes';
36
+ import View from '../View/View';
37
+ import TextInputState from '../TextInput/TextInputState';
38
+
39
+ type ViewStyleProp = $ElementType<React.ElementConfig<typeof View>, 'style'>;
40
+
41
+ export type StateCallbackType = $ReadOnly<{|
42
+ pressed: boolean,
43
+ |}>;
44
+
45
+ type Props = $ReadOnly<{|
46
+ /**
47
+ * Accessibility.
48
+ */
49
+ accessibilityActions?: ?$ReadOnlyArray<AccessibilityActionInfo>,
50
+ accessibilityElementsHidden?: ?boolean,
51
+ accessibilityHint?: ?Stringish,
52
+ accessibilityIgnoresInvertColors?: ?boolean,
53
+ accessibilityLabel?: ?Stringish,
54
+ accessibilityLiveRegion?: ?('none' | 'polite' | 'assertive'),
55
+ accessibilityRole?: ?AccessibilityRole,
56
+ accessibilityState?: ?AccessibilityState,
57
+ accessibilityValue?: ?AccessibilityValue,
58
+ accessibilityViewIsModal?: ?boolean,
59
+ accessible?: ?boolean,
60
+ focusable?: ?boolean,
61
+ importantForAccessibility?: ?('auto' | 'yes' | 'no' | 'no-hide-descendants'),
62
+ onAccessibilityAction?: ?(event: AccessibilityActionEvent) => mixed,
63
+
64
+ /**
65
+ * Either children or a render prop that receives a boolean reflecting whether
66
+ * the component is currently pressed.
67
+ */
68
+ children: React.Node | ((state: StateCallbackType) => React.Node),
69
+
70
+ /**
71
+ * Duration to wait after hover in before calling `onHoverIn`.
72
+ */
73
+ delayHoverIn?: ?number,
74
+
75
+ /**
76
+ * Duration to wait after hover out before calling `onHoverOut`.
77
+ */
78
+ delayHoverOut?: ?number,
79
+
80
+ /**
81
+ * Duration (in milliseconds) from `onPressIn` before `onLongPress` is called.
82
+ */
83
+ delayLongPress?: ?number,
84
+
85
+ /**
86
+ * Whether the press behavior is disabled.
87
+ */
88
+ disabled?: ?boolean,
89
+
90
+ /**
91
+ * Additional distance outside of this view in which a press is detected.
92
+ */
93
+ hitSlop?: ?RectOrSize,
94
+
95
+ /**
96
+ * Additional distance outside of this view in which a touch is considered a
97
+ * press before `onPressOut` is triggered.
98
+ */
99
+ pressRetentionOffset?: ?RectOrSize,
100
+
101
+ /**
102
+ * Called when this view's layout changes.
103
+ */
104
+ onLayout?: ?(event: LayoutEvent) => void,
105
+
106
+ /**
107
+ * Called when the hover is activated to provide visual feedback.
108
+ */
109
+ onHoverIn?: ?(event: MouseEvent) => mixed,
110
+
111
+ /**
112
+ * Called when the hover is deactivated to undo visual feedback.
113
+ */
114
+ onHoverOut?: ?(event: MouseEvent) => mixed,
115
+
116
+ /**
117
+ * Called when a long-tap gesture is detected.
118
+ */
119
+ onLongPress?: ?(event: PressEvent) => void,
120
+
121
+ /**
122
+ * Called when a single tap gesture is detected.
123
+ */
124
+ onPress?: ?(event: PressEvent) => void,
125
+
126
+ /**
127
+ * Called when a touch is engaged before `onPress`.
128
+ */
129
+ onPressIn?: ?(event: PressEvent) => void,
130
+
131
+ /**
132
+ * Called when a touch is released before `onPress`.
133
+ */
134
+ onPressOut?: ?(event: PressEvent) => void,
135
+
136
+ /**
137
+ * Called after the element loses focus.
138
+ */
139
+ onBlur?: ?(event: BlurEvent) => mixed,
140
+
141
+ /**
142
+ * Called after the element is focused.
143
+ */
144
+ onFocus?: ?(event: FocusEvent) => mixed,
145
+
146
+ /**
147
+ * Either view styles or a function that receives a boolean reflecting whether
148
+ * the component is currently pressed and returns view styles.
149
+ */
150
+ style?: ViewStyleProp | ((state: StateCallbackType) => ViewStyleProp),
151
+
152
+ /**
153
+ * Identifier used to find this view in tests.
154
+ */
155
+ testID?: ?string,
156
+
157
+ /**
158
+ * If true, doesn't play system sound on touch.
159
+ */
160
+ android_disableSound?: ?boolean,
161
+
162
+ /**
163
+ * Enables the Android ripple effect and configures its color.
164
+ */
165
+ android_ripple?: ?RippleConfig,
166
+
167
+ /**
168
+ * Used only for documentation or testing (e.g. snapshot testing).
169
+ */
170
+ testOnly_pressed?: ?boolean,
171
+
172
+ /**
173
+ * Duration to wait after press down before calling `onPressIn`.
174
+ */
175
+ unstable_pressDelay?: ?number,
176
+ |}>;
177
+
178
+ /**
179
+ * Component used to build display components that should respond to whether the
180
+ * component is currently pressed or not.
181
+ */
182
+ function Pressable(props: Props, forwardedRef): React.Node {
183
+ const {
184
+ accessible,
185
+ android_disableSound,
186
+ android_ripple,
187
+ children,
188
+ delayHoverIn,
189
+ delayHoverOut,
190
+ delayLongPress,
191
+ disabled,
192
+ focusable,
193
+ onHoverIn,
194
+ onHoverOut,
195
+ onLongPress,
196
+ onPress,
197
+ onPressIn,
198
+ onPressOut,
199
+ // [Windows
200
+ onBlur,
201
+ onFocus,
202
+ // Windows]
203
+ pressRetentionOffset,
204
+ style,
205
+ testOnly_pressed,
206
+ unstable_pressDelay,
207
+ ...restProps
208
+ } = props;
209
+
210
+ const viewRef = useRef<React.ElementRef<typeof View> | null>(null);
211
+ useImperativeHandle(forwardedRef, () => viewRef.current);
212
+
213
+ // [Windows
214
+ const _onBlur = (event: BlurEvent) => {
215
+ TextInputState.blurInput(viewRef.current);
216
+ if (props.onBlur) {
217
+ props.onBlur(event);
218
+ }
219
+ };
220
+
221
+ const _onFocus = (event: FocusEvent) => {
222
+ TextInputState.focusInput(viewRef.current);
223
+ if (props.onFocus) {
224
+ props.onFocus(event);
225
+ }
226
+ };
227
+ // Windows]
228
+
229
+ const android_rippleConfig = useAndroidRippleForView(android_ripple, viewRef);
230
+
231
+ const [pressed, setPressed] = usePressState(testOnly_pressed === true);
232
+
233
+ const hitSlop = normalizeRect(props.hitSlop);
234
+
235
+ const restPropsWithDefaults: React.ElementConfig<typeof View> = {
236
+ ...restProps,
237
+ ...android_rippleConfig?.viewProps,
238
+ accessible: accessible !== false,
239
+ focusable: focusable !== false,
240
+ hitSlop,
241
+ };
242
+
243
+ const config = useMemo(
244
+ () => ({
245
+ disabled,
246
+ hitSlop,
247
+ pressRectOffset: pressRetentionOffset,
248
+ android_disableSound,
249
+ delayHoverIn,
250
+ delayHoverOut,
251
+ delayLongPress,
252
+ delayPressIn: unstable_pressDelay,
253
+ onHoverIn,
254
+ onHoverOut,
255
+ onLongPress,
256
+ onPress,
257
+ onPressIn(event: PressEvent): void {
258
+ if (android_rippleConfig != null) {
259
+ android_rippleConfig.onPressIn(event);
260
+ }
261
+ setPressed(true);
262
+ if (onPressIn != null) {
263
+ onPressIn(event);
264
+ }
265
+ },
266
+ onPressMove: android_rippleConfig?.onPressMove,
267
+ onPressOut(event: PressEvent): void {
268
+ if (android_rippleConfig != null) {
269
+ android_rippleConfig.onPressOut(event);
270
+ }
271
+ setPressed(false);
272
+ if (onPressOut != null) {
273
+ onPressOut(event);
274
+ }
275
+ },
276
+ // [Windows
277
+ onBlur,
278
+ onFocus,
279
+ // Windows]
280
+ }),
281
+ [
282
+ android_disableSound,
283
+ android_rippleConfig,
284
+ delayHoverIn,
285
+ delayHoverOut,
286
+ delayLongPress,
287
+ disabled,
288
+ hitSlop,
289
+ onHoverIn,
290
+ onHoverOut,
291
+ onLongPress,
292
+ onPress,
293
+ onPressIn,
294
+ onPressOut,
295
+ // [Windows
296
+ onBlur,
297
+ onFocus,
298
+ // Windows]
299
+ pressRetentionOffset,
300
+ setPressed,
301
+ unstable_pressDelay,
302
+ ],
303
+ );
304
+ const eventHandlers = usePressability(config);
305
+
306
+ return (
307
+ <View
308
+ {...restPropsWithDefaults}
309
+ {...eventHandlers}
310
+ // [Windows
311
+ onBlur={_onBlur}
312
+ onFocus={_onFocus}
313
+ // Windows]
314
+ ref={viewRef}
315
+ style={typeof style === 'function' ? style({pressed}) : style}>
316
+ {typeof children === 'function' ? children({pressed}) : children}
317
+ {__DEV__ ? <PressabilityDebugView color="red" hitSlop={hitSlop} /> : null}
318
+ </View>
319
+ );
320
+ }
321
+
322
+ function usePressState(forcePressed: boolean): [boolean, (boolean) => void] {
323
+ const [pressed, setPressed] = useState(false);
324
+ return [pressed || forcePressed, setPressed];
325
+ }
326
+
327
+ const MemoedPressable = React.memo(React.forwardRef(Pressable));
328
+ MemoedPressable.displayName = 'Pressable';
329
+
330
+ export default (MemoedPressable: React.AbstractComponent<
331
+ Props,
332
+ React.ElementRef<typeof View>,
333
+ >);
@@ -380,6 +380,7 @@ const ReactNativeViewConfig = {
380
380
  accessibilityDescription: true,
381
381
  accessibilityControls: true,
382
382
  accessibilityItemType: true,
383
+ enableFocusRing: true,
383
384
  // Windows]
384
385
  },
385
386
  };
@@ -72,7 +72,7 @@ var FocusMoverTestComponent = /** @class */ (function (_super) {
72
72
  React.createElement(ViewWin32_1.ViewWin32, { style: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-around', marginVertical: 5 } },
73
73
  React.createElement(react_native_1.TouchableHighlight, { onPress: this._onPress },
74
74
  React.createElement(ViewWin32_1.ViewWin32, { accessibilityLabeledBy: this._labeledBy, style: styles.blackbox })),
75
- React.createElement(ViewWin32_1.ViewWin32, { ref: this._setRef, focusable: true, style: this.state.hasFocus ? { backgroundColor: '#aee8fcff' } : { backgroundColor: '#00000000' }, onFocus: this._onFocus, onBlur: this._onBlur },
75
+ React.createElement(ViewWin32_1.ViewWin32, { ref: this._setRef, focusable: true, style: this.state.hasFocus ? { backgroundColor: '#aee8fcff' } : { backgroundColor: '#00000000' }, onFocus: this._onFocus, onBlur: this._onBlur, enableFocusRing: false },
76
76
  React.createElement(react_native_1.Text, null, this.state.hasFocus ? 'Focus: Yes' : 'Focus: No')))));
77
77
  };
78
78
  return FocusMoverTestComponent;
@@ -113,7 +113,7 @@ var KeyboardTestComponent = /** @class */ (function (_super) {
113
113
  }
114
114
  KeyboardTestComponent.prototype.render = function () {
115
115
  return (React.createElement(ViewWin32_1.ViewWin32, { keyDownEvents: handledNativeKeyboardEvents, keyUpEvents: handledNativeKeyboardEvents },
116
- React.createElement(ViewWin32_1.ViewWin32, { style: this.state.hasFocus ? [styles.keyComponentRoot, styles.border] : styles.keyComponentRoot, focusable: true, onKeyUp: this._onKeyUp, onKeyDown: this._onKeyDown, onFocus: this._onFocus, onBlur: this._onBlur },
116
+ React.createElement(ViewWin32_1.ViewWin32, { style: this.state.hasFocus ? [styles.keyComponentRoot, styles.border] : styles.keyComponentRoot, focusable: true, onKeyUp: this._onKeyUp, onKeyDown: this._onKeyDown, onFocus: this._onFocus, onBlur: this._onBlur, enableFocusRing: false },
117
117
  React.createElement(ViewWin32_1.ViewWin32, { style: styles.keyEnterVisualizer },
118
118
  React.createElement(react_native_1.Text, null, "OnKeyDown"),
119
119
  React.createElement(react_native_1.Text, null, "----"),
@@ -189,6 +189,44 @@ var CursorExample = function () {
189
189
  React.createElement(CursorTestComponent, { cursor: 'text' }),
190
190
  React.createElement(CursorTestComponent, { cursor: 'we-resize' })));
191
191
  };
192
+ var EnableFocusRingExample = /** @class */ (function (_super) {
193
+ __extends(EnableFocusRingExample, _super);
194
+ function EnableFocusRingExample(props) {
195
+ var _this = _super.call(this, props) || this;
196
+ _this._onFocus = function () {
197
+ _this.setState({
198
+ hasFocus: true,
199
+ });
200
+ };
201
+ _this._onBlur = function () {
202
+ _this.setState({
203
+ hasFocus: false,
204
+ });
205
+ };
206
+ _this.state = {
207
+ hasFocus: false,
208
+ };
209
+ return _this;
210
+ }
211
+ EnableFocusRingExample.prototype.render = function () {
212
+ return (React.createElement(ViewWin32_1.ViewWin32, { style: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-around', marginVertical: 5 } },
213
+ React.createElement(ViewWin32_1.ViewWin32, { style: {
214
+ backgroundColor: 'pink',
215
+ height: 100,
216
+ width: 100,
217
+ }, enableFocusRing: true, focusable: true },
218
+ React.createElement(react_native_1.Text, null, "enableFocusRing set to true")),
219
+ React.createElement(ViewWin32_1.ViewWin32, { style: {
220
+ backgroundColor: 'pink',
221
+ height: 100,
222
+ width: 100,
223
+ }, enableFocusRing: false, focusable: true, onFocus: this._onFocus, onBlur: this._onBlur },
224
+ React.createElement(React.Fragment, null,
225
+ React.createElement(react_native_1.Text, null, "enableFocusRing set to false"),
226
+ React.createElement(react_native_1.Text, null, this.state.hasFocus ? 'Focus: Yes' : 'Focus: No')))));
227
+ };
228
+ return EnableFocusRingExample;
229
+ }(React.Component));
192
230
  exports.title = 'ViewWin32';
193
231
  exports.displayName = 'ViewWin32 Example';
194
232
  exports.description = 'All the stock View props plus Win32 specific ones';
@@ -231,5 +269,12 @@ exports.examples = [
231
269
  return React.createElement(CursorExample, null);
232
270
  },
233
271
  },
272
+ {
273
+ title: 'EnableFocusRing example',
274
+ description: 'Displays focus visuals that are driven by native',
275
+ render: function () {
276
+ return React.createElement(EnableFocusRingExample, null);
277
+ },
278
+ },
234
279
  ];
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlld1dpbjMyVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9MaWJyYXJpZXMvQ29tcG9uZW50cy9WaWV3L1Rlc3RzL1ZpZXdXaW4zMlRlc3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQUNiLDZCQUErQjtBQUMvQiw2Q0FBb0U7QUFDcEUsMENBQXlDO0FBR3pDLElBQU0sTUFBTSxHQUFHLHlCQUFVLENBQUMsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSxRQUFRO1FBQ3JCLFdBQVcsRUFBRSxPQUFPO0tBQ3JCO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsV0FBVyxFQUFFLENBQUM7UUFDZCxhQUFhLEVBQUUsS0FBSztRQUNwQixjQUFjLEVBQUUsQ0FBQztRQUNqQixlQUFlLEVBQUUsWUFBWTtRQUM3QixjQUFjLEVBQUUsY0FBYztLQUMvQjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLE1BQU0sRUFBRSxDQUFDO1FBQ1QsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFLEdBQUc7UUFDYixTQUFTLEVBQUUsRUFBRTtLQUNkO0lBQ0QsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtDQUMxRSxDQUFDLENBQUM7QUFNSDtJQUFzQywyQ0FBNkM7SUFJakYsaUNBQW1CLEtBQUs7UUFBeEIsWUFDRSxrQkFBTSxLQUFLLENBQUMsU0FLYjtRQVRPLGtCQUFZLEdBQWMsSUFBSSxDQUFDO1FBZ0N0QixhQUFPLEdBQUcsVUFBQyxHQUFjO1lBQ3hDLEtBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQUVlLGNBQVEsR0FBRztZQUMxQixJQUFJLEtBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO2dCQUNuQyxLQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxDQUFDO1FBRWUsY0FBUSxHQUFHO1lBQzFCLEtBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFZSxhQUFPLEdBQUc7WUFDekIsS0FBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixRQUFRLEVBQUUsS0FBSzthQUNoQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUEvQ0EsS0FBSSxDQUFDLEtBQUssR0FBRztZQUNYLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFDRixLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQWEsQ0FBQzs7SUFDakQsQ0FBQztJQUNNLHdDQUFNLEdBQWI7UUFDRSxPQUFPLENBQ0wsb0JBQUMscUJBQVM7WUFDUixvQkFBQyxxQkFBUyxJQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFDLHlCQUF5QixFQUFDLHFCQUFxQixFQUFDLFNBQVMsR0FBRztZQUNsSCxvQkFBQyxxQkFBUyxJQUFDLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pILG9CQUFDLGlDQUFrQixJQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDeEMsb0JBQUMscUJBQVMsSUFBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxHQUFJLENBQzNEO2dCQUNyQixvQkFBQyxxQkFBUyxJQUNSLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUNqQixTQUFTLFFBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLEVBQ2hHLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBRXBCLG9CQUFDLG1CQUFJLFFBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFRLENBQ3JELENBQ0YsQ0FDQSxDQUNiLENBQUM7SUFDSixDQUFDO0lBdUJILDhCQUFDO0FBQUQsQ0FBQyxBQXRERCxDQUFzQyxLQUFLLENBQUMsU0FBUyxHQXNEcEQ7QUFPRCxJQUFNLDJCQUEyQixHQUE0QjtJQUMzRCxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUU7SUFDcEIsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO0lBQ2xCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRTtJQUNwQixFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUU7SUFDckIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO0NBQ2YsQ0FBQztBQUVGO0lBQW9DLHlDQUEyRTtJQUM3RywrQkFBbUIsS0FBSztRQUF4QixZQUNFLGtCQUFNLEtBQUssQ0FBQyxTQU1iO1FBNEJnQixjQUFRLEdBQUc7WUFDMUIsS0FBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVlLGFBQU8sR0FBRztZQUN6QixLQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVlLGNBQVEsR0FBRyxVQUFDLEVBQWtCO1lBQzdDLEtBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDO1FBRWUsZ0JBQVUsR0FBRyxVQUFDLEVBQWtCO1lBQy9DLEtBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDO1FBbkRBLEtBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUM7O0lBQ0osQ0FBQztJQUVNLHNDQUFNLEdBQWI7UUFDRSxPQUFPLENBQ0wsb0JBQUMscUJBQVMsSUFBQyxhQUFhLEVBQUUsMkJBQTJCLEVBQUUsV0FBVyxFQUFFLDJCQUEyQjtZQUM3RixvQkFBQyxxQkFBUyxJQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQy9GLFNBQVMsUUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFDdEIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBRXBCLG9CQUFDLHFCQUFTLElBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0I7b0JBQ3pDLG9CQUFDLG1CQUFJLG9CQUFpQjtvQkFDdEIsb0JBQUMsbUJBQUksZUFBWTtvQkFDakIsb0JBQUMsbUJBQUksUUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQVEsQ0FDbkU7Z0JBQ1osb0JBQUMscUJBQVMsSUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtvQkFDekMsb0JBQUMsbUJBQUksa0JBQWU7b0JBQ3BCLG9CQUFDLG1CQUFJLGVBQVk7b0JBQ2pCLG9CQUFDLG1CQUFJLFFBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFRLENBQy9ELENBQ0YsQ0FDRixDQUNiLENBQUM7SUFDSixDQUFDO0lBcUJILDRCQUFDO0FBQUQsQ0FBQyxBQXZERCxDQUFvQyxLQUFLLENBQUMsU0FBUyxHQXVEbEQ7QUFLRDtJQUFpQyxzQ0FBK0Q7SUFDOUYsNEJBQW1CLEtBQUs7UUFBeEIsWUFDRSxrQkFBTSxLQUFLLENBQUMsU0FJYjtRQVdnQixtQkFBYSxHQUFHO1lBQy9CLEtBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFDZSxtQkFBYSxHQUFHO1lBQy9CLEtBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUM7UUFuQkEsS0FBSSxDQUFDLEtBQUssR0FBRztZQUNYLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7O0lBQ0osQ0FBQztJQUVNLG1DQUFNLEdBQWI7UUFDRSxPQUFPLENBQ0wsb0JBQUMscUJBQVMsSUFDUixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFDaEMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FDdkcsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQU9ILHlCQUFDO0FBQUQsQ0FBQyxBQXZCRCxDQUFpQyxLQUFLLENBQUMsU0FBUyxHQXVCL0M7QUFFRDtJQUEyQixnQ0FBZTtJQUExQzs7SUFjQSxDQUFDO0lBYlEsNkJBQU0sR0FBYjtRQUNFLE9BQU8sQ0FDTCxvQkFBQyxxQkFBUyxJQUFDLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUU7WUFDOUYsb0JBQUMsa0JBQWtCLElBQUMsS0FBSyxFQUFDLEtBQUssR0FBRztZQUNsQyxvQkFBQyxrQkFBa0IsSUFBQyxLQUFLLEVBQUMsUUFBUSxHQUFHO1lBQ3JDLG9CQUFDLGtCQUFrQixJQUFDLEtBQUssRUFBQyxRQUFRLEdBQUc7WUFDckMsb0JBQUMsa0JBQWtCLElBQUMsS0FBSyxFQUFDLE9BQU8sR0FBRztZQUNwQyxvQkFBQyxrQkFBa0IsSUFBQyxLQUFLLEVBQUMsTUFBTSxHQUFHO1lBQ25DLG9CQUFDLGtCQUFrQixJQUFDLEtBQUssRUFBQyxRQUFRLEdBQUc7WUFDckMsb0JBQUMsa0JBQWtCLElBQUMsS0FBSyxFQUFDLFFBQVEsR0FBRyxDQUMzQixDQUNiLENBQUM7SUFDSixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBZEQsQ0FBMkIsS0FBSyxDQUFDLFNBQVMsR0FjekM7QUFFRCxJQUFNLGNBQWMsR0FBZ0M7SUFDbEQsT0FBTyxDQUNMLG9CQUFDLHFCQUFTLElBQ1IsS0FBSyxFQUFFO1lBQ0wsZUFBZSxFQUFFLEtBQUs7WUFDdEIsTUFBTSxFQUFFLEdBQUc7WUFDWCxLQUFLLEVBQUUsR0FBRztTQUNYLEVBQ0QsT0FBTyxFQUFDLGlCQUFpQixFQUN6QixNQUFNLEVBQUMsU0FBUyxHQUNoQixDQUNILENBQUM7QUFDSixDQUFDLENBQUM7QUFNRixJQUFNLG1CQUFtQixHQUF1RCxVQUFDLEtBQUs7SUFDcEYsT0FBTyxDQUNMLG9CQUFDLHFCQUFTLElBQUMsS0FBSyxFQUFFLEVBQUMsYUFBYSxFQUFFLFFBQVEsRUFBQztRQUN6QyxvQkFBQyxtQkFBSSxRQUFFLEtBQUssQ0FBQyxNQUFNLENBQVE7UUFDM0Isb0JBQUMscUJBQVMsSUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsR0FBSSxDQUNqRCxDQUNiLENBQUE7QUFDSCxDQUFDLENBQUE7QUFFRCxJQUFNLGFBQWEsR0FBNEI7SUFDN0MsT0FBTyxDQUNMLG9CQUFDLHFCQUFTLElBQUMsS0FBSyxFQUFFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFO1FBQ3hFLG9CQUFDLG1CQUFtQixJQUFDLE1BQU0sRUFBQyxNQUFNLEdBQUc7UUFDckMsb0JBQUMsbUJBQW1CLElBQUMsTUFBTSxFQUFDLFNBQVMsR0FBRztRQUN4QyxvQkFBQyxtQkFBbUIsSUFBQyxNQUFNLEVBQUMsTUFBTSxHQUFHO1FBQ3JDLG9CQUFDLG1CQUFtQixJQUFDLE1BQU0sRUFBQyxhQUFhLEdBQUc7UUFDNUMsb0JBQUMsbUJBQW1CLElBQUMsTUFBTSxFQUFDLGFBQWEsR0FBRztRQUM1QyxvQkFBQyxtQkFBbUIsSUFBQyxNQUFNLEVBQUMsV0FBVyxHQUFHO1FBQzFDLG9CQUFDLG1CQUFtQixJQUFDLE1BQU0sRUFBQyxhQUFhLEdBQUc7UUFDNUMsb0JBQUMsbUJBQW1CLElBQUMsTUFBTSxFQUFDLFNBQVMsR0FBRztRQUN4QyxvQkFBQyxtQkFBbUIsSUFBQyxNQUFNLEVBQUMsTUFBTSxHQUFHO1FBQ3JDLG9CQUFDLG1CQUFtQixJQUFDLE1BQU0sRUFBQyxNQUFNLEdBQUc7UUFDckMsb0JBQUMsbUJBQW1CLElBQUMsTUFBTSxFQUFDLE1BQU0sR0FBRztRQUNyQyxvQkFBQyxtQkFBbUIsSUFBQyxNQUFNLEVBQUMsV0FBVyxHQUFHLENBQ2hDLENBQ2IsQ0FBQztBQUNKLENBQUMsQ0FBQTtBQUVZLFFBQUEsS0FBSyxHQUFHLFdBQVcsQ0FBQztBQUNwQixRQUFBLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztBQUNsQyxRQUFBLFdBQVcsR0FBRyxtREFBbUQsQ0FBQztBQUNsRSxRQUFBLFFBQVEsR0FBRztJQUN0QjtRQUNFLEtBQUssRUFBRSx3QkFBd0I7UUFDL0IsV0FBVyxFQUFFLHFFQUFxRTtRQUNsRixNQUFNLEVBQU47WUFDRSxPQUFPLENBQ0wsb0JBQUMscUJBQVM7Z0JBQ1Isb0JBQUMsdUJBQXVCLE9BQUc7Z0JBQzNCLG9CQUFDLHVCQUF1QixPQUFHO2dCQUMzQixvQkFBQyx1QkFBdUIsT0FBRyxDQUNqQixDQUNiLENBQUM7UUFDSixDQUFDO0tBQ0Y7SUFDRDtRQUNFLEtBQUssRUFBRSx3QkFBd0I7UUFDL0IsV0FBVyxFQUFFLHVDQUF1QztRQUNwRCxNQUFNLEVBQU47WUFDRSxPQUFPLG9CQUFDLHFCQUFxQixPQUFHLENBQUM7UUFDbkMsQ0FBQztLQUNGO0lBQ0Q7UUFDRSxLQUFLLEVBQUUsZUFBZTtRQUN0QixXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLE1BQU0sRUFBTjtZQUNFLE9BQU8sb0JBQUMsWUFBWSxPQUFHLENBQUM7UUFDMUIsQ0FBQztLQUNGO0lBQ0Q7UUFDRSxLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFdBQVcsRUFBRSw2QkFBNkI7UUFDMUMsTUFBTSxFQUFOO1lBQ0UsT0FBTyxvQkFBQyxjQUFjLE9BQUcsQ0FBQztRQUM1QixDQUFDO0tBQ0Y7SUFDRDtRQUNFLEtBQUssRUFBRSxnQkFBZ0I7UUFDdkIsV0FBVyxFQUFFLHVEQUF1RDtRQUNwRSxNQUFNLEVBQU47WUFDRSxPQUFPLG9CQUFDLGFBQWEsT0FBRyxDQUFDO1FBQzNCLENBQUM7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBTdHlsZVNoZWV0LCBUZXh0LCBUb3VjaGFibGVIaWdobGlnaHQgfSBmcm9tICdyZWFjdC1uYXRpdmUnO1xuaW1wb3J0IHsgVmlld1dpbjMyIH0gZnJvbSAnLi4vVmlld1dpbjMyJztcbmltcG9ydCB7IEN1cnNvciwgSUtleWJvYXJkRXZlbnQsIElIYW5kbGVkS2V5Ym9hcmRFdmVudCB9IGZyb20gJy4uL1ZpZXdXaW4zMi5Qcm9wcyc7XG5cbmNvbnN0IHN0eWxlcyA9IFN0eWxlU2hlZXQuY3JlYXRlKHtcbiAgYm9yZGVyOiB7XG4gICAgYm9yZGVyU3R5bGU6ICdkb3R0ZWQnLFxuICAgIGJvcmRlckNvbG9yOiAnYmxhY2snLFxuICB9LFxuICBrZXlDb21wb25lbnRSb290OiB7XG4gICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgbWFyZ2luVmVydGljYWw6IDUsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnd2hpdGVzbW9rZScsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1hcm91bmQnLFxuICB9LFxuICBrZXlFbnRlclZpc3VhbGl6ZXI6IHtcbiAgICBtYXJnaW46IDUsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgbWluV2lkdGg6IDEwMCxcbiAgICBtaW5IZWlnaHQ6IDMwLFxuICB9LFxuICBibGFja2JveDogeyBoZWlnaHQ6IDMwLCB3aWR0aDogMzAsIGJvcmRlckNvbG9yOiAnYmxhY2snLCBib3JkZXJXaWR0aDogMyB9LFxufSk7XG5cbmludGVyZmFjZSBJRm9jdXNhYmxlQ29tcG9uZW50U3RhdGUge1xuICBoYXNGb2N1czogYm9vbGVhbjtcbn1cblxuY2xhc3MgRm9jdXNNb3ZlclRlc3RDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e30sIElGb2N1c2FibGVDb21wb25lbnRTdGF0ZT4ge1xuICBwcml2YXRlIF9mb2N1c1RhcmdldDogVmlld1dpbjMyID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfbGFiZWxlZEJ5OiBSZWFjdC5SZWZPYmplY3Q8Vmlld1dpbjMyPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGhhc0ZvY3VzOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMuX2xhYmVsZWRCeSA9IFJlYWN0LmNyZWF0ZVJlZjxWaWV3V2luMzI+KCk7XG4gIH1cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXdXaW4zMj5cbiAgICAgICAgPFZpZXdXaW4zMiByZWY9e3RoaXMuX2xhYmVsZWRCeX0gYWNjZXNzaWJpbGl0eUxhYmVsPVwic2VwYXJhdGUgbGFiZWwgZm9yIHRlc3RcIiBhY2Nlc3NpYmlsaXR5SXRlbVR5cGU9XCJDb21tZW50XCIgLz5cbiAgICAgIDxWaWV3V2luMzIgc3R5bGU9e3sgZmxleERpcmVjdGlvbjogJ3JvdycsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcsIG1hcmdpblZlcnRpY2FsOiA1IH19PlxuICAgICAgICA8VG91Y2hhYmxlSGlnaGxpZ2h0IG9uUHJlc3M9e3RoaXMuX29uUHJlc3N9PlxuICAgICAgICAgIDxWaWV3V2luMzIgYWNjZXNzaWJpbGl0eUxhYmVsZWRCeT17dGhpcy5fbGFiZWxlZEJ5fSBzdHlsZT17c3R5bGVzLmJsYWNrYm94fSAvPlxuICAgICAgICA8L1RvdWNoYWJsZUhpZ2hsaWdodD5cbiAgICAgICAgPFZpZXdXaW4zMlxuICAgICAgICAgIHJlZj17dGhpcy5fc2V0UmVmfVxuICAgICAgICAgIGZvY3VzYWJsZVxuICAgICAgICAgIHN0eWxlPXt0aGlzLnN0YXRlLmhhc0ZvY3VzID8geyBiYWNrZ3JvdW5kQ29sb3I6ICcjYWVlOGZjZmYnIH0gOiB7IGJhY2tncm91bmRDb2xvcjogJyMwMDAwMDAwMCcgfX1cbiAgICAgICAgICBvbkZvY3VzPXt0aGlzLl9vbkZvY3VzfVxuICAgICAgICAgIG9uQmx1cj17dGhpcy5fb25CbHVyfVxuICAgICAgICA+XG4gICAgICAgICAgPFRleHQ+e3RoaXMuc3RhdGUuaGFzRm9jdXMgPyAnRm9jdXM6IFllcycgOiAnRm9jdXM6IE5vJ308L1RleHQ+XG4gICAgICAgIDwvVmlld1dpbjMyPlxuICAgICAgPC9WaWV3V2luMzI+XG4gICAgICA8L1ZpZXdXaW4zMj5cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2V0UmVmID0gKHJlZjogVmlld1dpbjMyKSA9PiB7XG4gICAgdGhpcy5fZm9jdXNUYXJnZXQgPSByZWY7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25QcmVzcyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5fZm9jdXNUYXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZm9jdXNUYXJnZXQuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Gb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhhc0ZvY3VzOiB0cnVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQmx1ciA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhhc0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIElLZXlib2FyZGFibGVDb21wb25lbnRTdGF0ZSB7XG4gIGxhc3RLZXlEb3duOiBzdHJpbmc7XG4gIGxhc3RLZXlVcDogc3RyaW5nO1xufVxuXG5jb25zdCBoYW5kbGVkTmF0aXZlS2V5Ym9hcmRFdmVudHM6IElIYW5kbGVkS2V5Ym9hcmRFdmVudFtdID0gW1xuICB7IGtleTogJ0Fycm93RG93bicgfSxcbiAgeyBrZXk6ICdBcnJvd1VwJyB9LFxuICB7IGtleTogJ0Fycm93TGVmdCcgfSxcbiAgeyBrZXk6ICdBcnJvd1JpZ2h0JyB9LFxuICB7IGtleTogJ1RhYicgfSxcbl07XG5cbmNsYXNzIEtleWJvYXJkVGVzdENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7fSwgSUZvY3VzYWJsZUNvbXBvbmVudFN0YXRlICYgSUtleWJvYXJkYWJsZUNvbXBvbmVudFN0YXRlPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaGFzRm9jdXM6IGZhbHNlLFxuICAgICAgbGFzdEtleURvd246IG51bGwsXG4gICAgICBsYXN0S2V5VXA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3V2luMzIga2V5RG93bkV2ZW50cz17aGFuZGxlZE5hdGl2ZUtleWJvYXJkRXZlbnRzfSBrZXlVcEV2ZW50cz17aGFuZGxlZE5hdGl2ZUtleWJvYXJkRXZlbnRzfT5cbiAgICAgICAgPFZpZXdXaW4zMlxuICAgICAgICAgIHN0eWxlPXt0aGlzLnN0YXRlLmhhc0ZvY3VzID8gW3N0eWxlcy5rZXlDb21wb25lbnRSb290LCBzdHlsZXMuYm9yZGVyXSA6IHN0eWxlcy5rZXlDb21wb25lbnRSb290fVxuICAgICAgICAgIGZvY3VzYWJsZVxuICAgICAgICAgIG9uS2V5VXA9e3RoaXMuX29uS2V5VXB9XG4gICAgICAgICAgb25LZXlEb3duPXt0aGlzLl9vbktleURvd259XG4gICAgICAgICAgb25Gb2N1cz17dGhpcy5fb25Gb2N1c31cbiAgICAgICAgICBvbkJsdXI9e3RoaXMuX29uQmx1cn1cbiAgICAgICAgPlxuICAgICAgICAgIDxWaWV3V2luMzIgc3R5bGU9e3N0eWxlcy5rZXlFbnRlclZpc3VhbGl6ZXJ9PlxuICAgICAgICAgICAgPFRleHQ+T25LZXlEb3duPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQ+LS0tLTwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0Pnt0aGlzLnN0YXRlLmxhc3RLZXlEb3duICE9PSBudWxsID8gdGhpcy5zdGF0ZS5sYXN0S2V5RG93biA6ICcgJ308L1RleHQ+XG4gICAgICAgICAgPC9WaWV3V2luMzI+XG4gICAgICAgICAgPFZpZXdXaW4zMiBzdHlsZT17c3R5bGVzLmtleUVudGVyVmlzdWFsaXplcn0+XG4gICAgICAgICAgICA8VGV4dD5PbktleVVwPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQ+LS0tLTwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0Pnt0aGlzLnN0YXRlLmxhc3RLZXlVcCAhPT0gbnVsbCA/IHRoaXMuc3RhdGUubGFzdEtleVVwIDogJyAnfTwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXdXaW4zMj5cbiAgICAgICAgPC9WaWV3V2luMzI+XG4gICAgICA8L1ZpZXdXaW4zMj5cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Gb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhhc0ZvY3VzOiB0cnVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQmx1ciA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhhc0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbktleVVwID0gKGV2OiBJS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBsYXN0S2V5VXA6IGV2Lm5hdGl2ZUV2ZW50LmtleSwgbGFzdEtleURvd246IG51bGwgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25LZXlEb3duID0gKGV2OiBJS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBsYXN0S2V5RG93bjogZXYubmF0aXZlRXZlbnQua2V5LCBsYXN0S2V5VXA6IG51bGwgfSk7XG4gIH07XG59XG5cbmludGVyZmFjZSBJSG92ZXJDb21wb25lbnRQcm9wcyB7XG4gIGNvbG9yOiBzdHJpbmc7XG59XG5jbGFzcyBIb3ZlclRlc3RDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SUhvdmVyQ29tcG9uZW50UHJvcHMsIElGb2N1c2FibGVDb21wb25lbnRTdGF0ZT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGhhc0ZvY3VzOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXdXaW4zMlxuICAgICAgICBvbk1vdXNlRW50ZXI9e3RoaXMuX29uTW91c2VFbnRlcn1cbiAgICAgICAgb25Nb3VzZUxlYXZlPXt0aGlzLl9vbk1vdXNlTGVhdmV9XG4gICAgICAgIHN0eWxlPXt0aGlzLnN0YXRlLmhhc0ZvY3VzID8gW3N0eWxlcy5ibGFja2JveCwgeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMucHJvcHMuY29sb3IgfV0gOiBzdHlsZXMuYmxhY2tib3h9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Nb3VzZUxlYXZlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBoYXNGb2N1czogZmFsc2UgfSk7XG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uTW91c2VFbnRlciA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgaGFzRm9jdXM6IHRydWUgfSk7XG4gIH07XG59XG5cbmNsYXNzIEhvdmVyRXhhbXBsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3V2luMzIgc3R5bGU9e3sgZmxleERpcmVjdGlvbjogJ3JvdycsIG1hcmdpbkhvcml6b250YWw6IDc1LCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcgfX0+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJyZWRcIiAvPlxuICAgICAgICA8SG92ZXJUZXN0Q29tcG9uZW50IGNvbG9yPVwib3JhbmdlXCIgLz5cbiAgICAgICAgPEhvdmVyVGVzdENvbXBvbmVudCBjb2xvcj1cInllbGxvd1wiIC8+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJncmVlblwiIC8+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJibHVlXCIgLz5cbiAgICAgICAgPEhvdmVyVGVzdENvbXBvbmVudCBjb2xvcj1cImluZGlnb1wiIC8+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJ2aW9sZXRcIiAvPlxuICAgICAgPC9WaWV3V2luMzI+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBUb29sVGlwRXhhbXBsZTogUmVhY3QuRnVuY3Rpb25Db21wb25lbnQ8e30+ID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxWaWV3V2luMzJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JlZCcsXG4gICAgICAgIGhlaWdodDogMTAwLFxuICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgfX1cbiAgICAgIHRvb2x0aXA9XCJFeGFtcGxlIHRvb2x0aXBcIlxuICAgICAgY3Vyc29yPVwicG9pbnRlclwiXG4gICAgLz5cbiAgKTtcbn07XG5cbmludGVyZmFjZSBJQ3Vyc29yVGVzdENvbXBvbmVudFByb3BzIHtcbiAgY3Vyc29yOiBDdXJzb3Jcbn1cblxuY29uc3QgQ3Vyc29yVGVzdENvbXBvbmVudDogUmVhY3QuRnVuY3Rpb25Db21wb25lbnQ8SUN1cnNvclRlc3RDb21wb25lbnRQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8Vmlld1dpbjMyIHN0eWxlPXt7ZmxleERpcmVjdGlvbjogJ2NvbHVtbid9fT5cbiAgICAgIDxUZXh0Pntwcm9wcy5jdXJzb3J9PC9UZXh0PlxuICAgICAgPFZpZXdXaW4zMiBjdXJzb3I9e3Byb3BzLmN1cnNvcn0gc3R5bGU9e3N0eWxlcy5ibGFja2JveH0gLz5cbiAgICA8L1ZpZXdXaW4zMj5cbiAgKVxufVxuXG5jb25zdCBDdXJzb3JFeGFtcGxlOiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudCA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8Vmlld1dpbjMyIHN0eWxlPXt7IGZsZXhEaXJlY3Rpb246ICdyb3cnLCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcgfX0+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J2F1dG8nIC8+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J2RlZmF1bHQnIC8+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J2hlbHAnIC8+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J25lc3ctcmVzaXplJyAvPlxuICAgICAgPEN1cnNvclRlc3RDb21wb25lbnQgY3Vyc29yPSdub3QtYWxsb3dlZCcgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nbnMtcmVzaXplJyAvPlxuICAgICAgPEN1cnNvclRlc3RDb21wb25lbnQgY3Vyc29yPSdud3NlLXJlc2l6ZScgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0ncG9pbnRlcicgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nd2FpdCcgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nbW92ZScgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0ndGV4dCcgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nd2UtcmVzaXplJyAvPlxuICAgIDwvVmlld1dpbjMyPlxuICApO1xufVxuXG5leHBvcnQgY29uc3QgdGl0bGUgPSAnVmlld1dpbjMyJztcbmV4cG9ydCBjb25zdCBkaXNwbGF5TmFtZSA9ICdWaWV3V2luMzIgRXhhbXBsZSc7XG5leHBvcnQgY29uc3QgZGVzY3JpcHRpb24gPSAnQWxsIHRoZSBzdG9jayBWaWV3IHByb3BzIHBsdXMgV2luMzIgc3BlY2lmaWMgb25lcyc7XG5leHBvcnQgY29uc3QgZXhhbXBsZXMgPSBbXG4gIHtcbiAgICB0aXRsZTogJ2ZvY3VzKCkgbWV0aG9kIGV4YW1wbGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnRWFjaCBvZiB0aGVzZSBibGFjayBib3hlcyBtb3ZlcyBmb2N1cyB0byB0aGUgVmlld1dpbjMyIG9uIHRoZSByaWdodCcsXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxWaWV3V2luMzI+XG4gICAgICAgICAgPEZvY3VzTW92ZXJUZXN0Q29tcG9uZW50IC8+XG4gICAgICAgICAgPEZvY3VzTW92ZXJUZXN0Q29tcG9uZW50IC8+XG4gICAgICAgICAgPEZvY3VzTW92ZXJUZXN0Q29tcG9uZW50IC8+XG4gICAgICAgIDwvVmlld1dpbjMyPlxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGl0bGU6ICdLZXlib2FyZEV2ZW50cyBleGFtcGxlJyxcbiAgICBkZXNjcmlwdGlvbjogJ05hdGl2ZSBrZXlib2FyZGluZyBoYXMgYmVlbiBwcmV2ZW50ZWQnLFxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICByZXR1cm4gPEtleWJvYXJkVGVzdENvbXBvbmVudCAvPjtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGl0bGU6ICdIb3ZlciBleGFtcGxlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdmVyIGEgcmFpbmJvdycsXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgIHJldHVybiA8SG92ZXJFeGFtcGxlIC8+O1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICB0aXRsZTogJ1Rvb2x0aXAgZXhhbXBsZScsXG4gICAgZGVzY3JpcHRpb246ICdEaXNwbGF5cyBhIHRvb2x0aXAgb24gaG92ZXInLFxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICByZXR1cm4gPFRvb2xUaXBFeGFtcGxlIC8+O1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICB0aXRsZTogJ0N1cnNvciBleGFtcGxlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0VhY2ggb2YgdGhlc2UgYm94ZXMgc2hvdWxkIGRpc3BsYXkgYSBkaWZmZXJlbnQgY3Vyc29yJyxcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgcmV0dXJuIDxDdXJzb3JFeGFtcGxlIC8+O1xuICAgIH0sXG4gIH0sXG5dO1xuIl19
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlld1dpbjMyVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9MaWJyYXJpZXMvQ29tcG9uZW50cy9WaWV3L1Rlc3RzL1ZpZXdXaW4zMlRlc3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQUNiLDZCQUErQjtBQUMvQiw2Q0FBb0U7QUFDcEUsMENBQXlDO0FBR3pDLElBQU0sTUFBTSxHQUFHLHlCQUFVLENBQUMsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSxRQUFRO1FBQ3JCLFdBQVcsRUFBRSxPQUFPO0tBQ3JCO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsV0FBVyxFQUFFLENBQUM7UUFDZCxhQUFhLEVBQUUsS0FBSztRQUNwQixjQUFjLEVBQUUsQ0FBQztRQUNqQixlQUFlLEVBQUUsWUFBWTtRQUM3QixjQUFjLEVBQUUsY0FBYztLQUMvQjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLE1BQU0sRUFBRSxDQUFDO1FBQ1QsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFLEdBQUc7UUFDYixTQUFTLEVBQUUsRUFBRTtLQUNkO0lBQ0QsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtDQUMxRSxDQUFDLENBQUM7QUFNSDtJQUFzQywyQ0FBNkM7SUFJakYsaUNBQW1CLEtBQUs7UUFBeEIsWUFDRSxrQkFBTSxLQUFLLENBQUMsU0FLYjtRQVRPLGtCQUFZLEdBQWMsSUFBSSxDQUFDO1FBaUN0QixhQUFPLEdBQUcsVUFBQyxHQUFjO1lBQ3hDLEtBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQUVlLGNBQVEsR0FBRztZQUMxQixJQUFJLEtBQUksQ0FBQyxZQUFZLEtBQUssU0FB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LGtEQUFrRDtRQUMvRCxNQUFNLEVBQU47WUFDRSxPQUFPLG9CQUFDLHNCQUFzQixPQUFHLENBQUM7UUFDcEMsQ0FBQztLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFN0eWxlU2hlZXQsIFRleHQsIFRvdWNoYWJsZUhpZ2hsaWdodCB9IGZyb20gJ3JlYWN0LW5hdGl2ZSc7XG5pbXBvcnQgeyBWaWV3V2luMzIgfSBmcm9tICcuLi9WaWV3V2luMzInO1xuaW1wb3J0IHsgQ3Vyc29yLCBJS2V5Ym9hcmRFdmVudCwgSUhhbmRsZWRLZXlib2FyZEV2ZW50IH0gZnJvbSAnLi4vVmlld1dpbjMyLlByb3BzJztcblxuY29uc3Qgc3R5bGVzID0gU3R5bGVTaGVldC5jcmVhdGUoe1xuICBib3JkZXI6IHtcbiAgICBib3JkZXJTdHlsZTogJ2RvdHRlZCcsXG4gICAgYm9yZGVyQ29sb3I6ICdibGFjaycsXG4gIH0sXG4gIGtleUNvbXBvbmVudFJvb3Q6IHtcbiAgICBib3JkZXJXaWR0aDogMixcbiAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICBtYXJnaW5WZXJ0aWNhbDogNSxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZXNtb2tlJyxcbiAgICBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcsXG4gIH0sXG4gIGtleUVudGVyVmlzdWFsaXplcjoge1xuICAgIG1hcmdpbjogNSxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBtaW5XaWR0aDogMTAwLFxuICAgIG1pbkhlaWdodDogMzAsXG4gIH0sXG4gIGJsYWNrYm94OiB7IGhlaWdodDogMzAsIHdpZHRoOiAzMCwgYm9yZGVyQ29sb3I6ICdibGFjaycsIGJvcmRlcldpZHRoOiAzIH0sXG59KTtcblxuaW50ZXJmYWNlIElGb2N1c2FibGVDb21wb25lbnRTdGF0ZSB7XG4gIGhhc0ZvY3VzOiBib29sZWFuO1xufVxuXG5jbGFzcyBGb2N1c01vdmVyVGVzdENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7fSwgSUZvY3VzYWJsZUNvbXBvbmVudFN0YXRlPiB7XG4gIHByaXZhdGUgX2ZvY3VzVGFyZ2V0OiBWaWV3V2luMzIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9sYWJlbGVkQnk6IFJlYWN0LlJlZk9iamVjdDxWaWV3V2luMzI+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaGFzRm9jdXM6IGZhbHNlLFxuICAgIH07XG4gICAgdGhpcy5fbGFiZWxlZEJ5ID0gUmVhY3QuY3JlYXRlUmVmPFZpZXdXaW4zMj4oKTtcbiAgfVxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Vmlld1dpbjMyPlxuICAgICAgICA8Vmlld1dpbjMyIHJlZj17dGhpcy5fbGFiZWxlZEJ5fSBhY2Nlc3NpYmlsaXR5TGFiZWw9XCJzZXBhcmF0ZSBsYWJlbCBmb3IgdGVzdFwiIGFjY2Vzc2liaWxpdHlJdGVtVHlwZT1cIkNvbW1lbnRcIiAvPlxuICAgICAgPFZpZXdXaW4zMiBzdHlsZT17eyBmbGV4RGlyZWN0aW9uOiAncm93JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJywgbWFyZ2luVmVydGljYWw6IDUgfX0+XG4gICAgICAgIDxUb3VjaGFibGVIaWdobGlnaHQgb25QcmVzcz17dGhpcy5fb25QcmVzc30+XG4gICAgICAgICAgPFZpZXdXaW4zMiBhY2Nlc3NpYmlsaXR5TGFiZWxlZEJ5PXt0aGlzLl9sYWJlbGVkQnl9IHN0eWxlPXtzdHlsZXMuYmxhY2tib3h9IC8+XG4gICAgICAgIDwvVG91Y2hhYmxlSGlnaGxpZ2h0PlxuICAgICAgICA8Vmlld1dpbjMyXG4gICAgICAgICAgcmVmPXt0aGlzLl9zZXRSZWZ9XG4gICAgICAgICAgZm9jdXNhYmxlXG4gICAgICAgICAgc3R5bGU9e3RoaXMuc3RhdGUuaGFzRm9jdXMgPyB7IGJhY2tncm91bmRDb2xvcjogJyNhZWU4ZmNmZicgfSA6IHsgYmFja2dyb3VuZENvbG9yOiAnIzAwMDAwMDAwJyB9fVxuICAgICAgICAgIG9uRm9jdXM9e3RoaXMuX29uRm9jdXN9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLl9vbkJsdXJ9XG4gICAgICAgICAgZW5hYmxlRm9jdXNSaW5nPXtmYWxzZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxUZXh0Pnt0aGlzLnN0YXRlLmhhc0ZvY3VzID8gJ0ZvY3VzOiBZZXMnIDogJ0ZvY3VzOiBObyd9PC9UZXh0PlxuICAgICAgICA8L1ZpZXdXaW4zMj5cbiAgICAgIDwvVmlld1dpbjMyPlxuICAgICAgPC9WaWV3V2luMzI+XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NldFJlZiA9IChyZWY6IFZpZXdXaW4zMikgPT4ge1xuICAgIHRoaXMuX2ZvY3VzVGFyZ2V0ID0gcmVmO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUHJlc3MgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuX2ZvY3VzVGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2ZvY3VzVGFyZ2V0LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRm9jdXMgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBoYXNGb2N1czogdHJ1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkJsdXIgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBoYXNGb2N1czogZmFsc2UsXG4gICAgfSk7XG4gIH07XG59XG5cbmludGVyZmFjZSBJS2V5Ym9hcmRhYmxlQ29tcG9uZW50U3RhdGUge1xuICBsYXN0S2V5RG93bjogc3RyaW5nO1xuICBsYXN0S2V5VXA6IHN0cmluZztcbn1cblxuY29uc3QgaGFuZGxlZE5hdGl2ZUtleWJvYXJkRXZlbnRzOiBJSGFuZGxlZEtleWJvYXJkRXZlbnRbXSA9IFtcbiAgeyBrZXk6ICdBcnJvd0Rvd24nIH0sXG4gIHsga2V5OiAnQXJyb3dVcCcgfSxcbiAgeyBrZXk6ICdBcnJvd0xlZnQnIH0sXG4gIHsga2V5OiAnQXJyb3dSaWdodCcgfSxcbiAgeyBrZXk6ICdUYWInIH0sXG5dO1xuXG5jbGFzcyBLZXlib2FyZFRlc3RDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e30sIElGb2N1c2FibGVDb21wb25lbnRTdGF0ZSAmIElLZXlib2FyZGFibGVDb21wb25lbnRTdGF0ZT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGhhc0ZvY3VzOiBmYWxzZSxcbiAgICAgIGxhc3RLZXlEb3duOiBudWxsLFxuICAgICAgbGFzdEtleVVwOiBudWxsLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Vmlld1dpbjMyIGtleURvd25FdmVudHM9e2hhbmRsZWROYXRpdmVLZXlib2FyZEV2ZW50c30ga2V5VXBFdmVudHM9e2hhbmRsZWROYXRpdmVLZXlib2FyZEV2ZW50c30+XG4gICAgICAgIDxWaWV3V2luMzJcbiAgICAgICAgICBzdHlsZT17dGhpcy5zdGF0ZS5oYXNGb2N1cyA/IFtzdHlsZXMua2V5Q29tcG9uZW50Um9vdCwgc3R5bGVzLmJvcmRlcl0gOiBzdHlsZXMua2V5Q29tcG9uZW50Um9vdH1cbiAgICAgICAgICBmb2N1c2FibGVcbiAgICAgICAgICBvbktleVVwPXt0aGlzLl9vbktleVVwfVxuICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5fb25LZXlEb3dufVxuICAgICAgICAgIG9uRm9jdXM9e3RoaXMuX29uRm9jdXN9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLl9vbkJsdXJ9XG4gICAgICAgICAgZW5hYmxlRm9jdXNSaW5nPXtmYWxzZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxWaWV3V2luMzIgc3R5bGU9e3N0eWxlcy5rZXlFbnRlclZpc3VhbGl6ZXJ9PlxuICAgICAgICAgICAgPFRleHQ+T25LZXlEb3duPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQ+LS0tLTwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0Pnt0aGlzLnN0YXRlLmxhc3RLZXlEb3duICE9PSBudWxsID8gdGhpcy5zdGF0ZS5sYXN0S2V5RG93biA6ICcgJ308L1RleHQ+XG4gICAgICAgICAgPC9WaWV3V2luMzI+XG4gICAgICAgICAgPFZpZXdXaW4zMiBzdHlsZT17c3R5bGVzLmtleUVudGVyVmlzdWFsaXplcn0+XG4gICAgICAgICAgICA8VGV4dD5PbktleVVwPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQ+LS0tLTwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0Pnt0aGlzLnN0YXRlLmxhc3RLZXlVcCAhPT0gbnVsbCA/IHRoaXMuc3RhdGUubGFzdEtleVVwIDogJyAnfTwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXdXaW4zMj5cbiAgICAgICAgPC9WaWV3V2luMzI+XG4gICAgICA8L1ZpZXdXaW4zMj5cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Gb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhhc0ZvY3VzOiB0cnVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQmx1ciA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhhc0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbktleVVwID0gKGV2OiBJS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBsYXN0S2V5VXA6IGV2Lm5hdGl2ZUV2ZW50LmtleSwgbGFzdEtleURvd246IG51bGwgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25LZXlEb3duID0gKGV2OiBJS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBsYXN0S2V5RG93bjogZXYubmF0aXZlRXZlbnQua2V5LCBsYXN0S2V5VXA6IG51bGwgfSk7XG4gIH07XG59XG5cbmludGVyZmFjZSBJSG92ZXJDb21wb25lbnRQcm9wcyB7XG4gIGNvbG9yOiBzdHJpbmc7XG59XG5jbGFzcyBIb3ZlclRlc3RDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SUhvdmVyQ29tcG9uZW50UHJvcHMsIElGb2N1c2FibGVDb21wb25lbnRTdGF0ZT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGhhc0ZvY3VzOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXdXaW4zMlxuICAgICAgICBvbk1vdXNlRW50ZXI9e3RoaXMuX29uTW91c2VFbnRlcn1cbiAgICAgICAgb25Nb3VzZUxlYXZlPXt0aGlzLl9vbk1vdXNlTGVhdmV9XG4gICAgICAgIHN0eWxlPXt0aGlzLnN0YXRlLmhhc0ZvY3VzID8gW3N0eWxlcy5ibGFja2JveCwgeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMucHJvcHMuY29sb3IgfV0gOiBzdHlsZXMuYmxhY2tib3h9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Nb3VzZUxlYXZlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBoYXNGb2N1czogZmFsc2UgfSk7XG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uTW91c2VFbnRlciA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgaGFzRm9jdXM6IHRydWUgfSk7XG4gIH07XG59XG5cbmNsYXNzIEhvdmVyRXhhbXBsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3V2luMzIgc3R5bGU9e3sgZmxleERpcmVjdGlvbjogJ3JvdycsIG1hcmdpbkhvcml6b250YWw6IDc1LCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcgfX0+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJyZWRcIiAvPlxuICAgICAgICA8SG92ZXJUZXN0Q29tcG9uZW50IGNvbG9yPVwib3JhbmdlXCIgLz5cbiAgICAgICAgPEhvdmVyVGVzdENvbXBvbmVudCBjb2xvcj1cInllbGxvd1wiIC8+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJncmVlblwiIC8+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJibHVlXCIgLz5cbiAgICAgICAgPEhvdmVyVGVzdENvbXBvbmVudCBjb2xvcj1cImluZGlnb1wiIC8+XG4gICAgICAgIDxIb3ZlclRlc3RDb21wb25lbnQgY29sb3I9XCJ2aW9sZXRcIiAvPlxuICAgICAgPC9WaWV3V2luMzI+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBUb29sVGlwRXhhbXBsZTogUmVhY3QuRnVuY3Rpb25Db21wb25lbnQ8e30+ID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxWaWV3V2luMzJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JlZCcsXG4gICAgICAgIGhlaWdodDogMTAwLFxuICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgfX1cbiAgICAgIHRvb2x0aXA9XCJFeGFtcGxlIHRvb2x0aXBcIlxuICAgICAgY3Vyc29yPVwicG9pbnRlclwiXG4gICAgLz5cbiAgKTtcbn07XG5cbmludGVyZmFjZSBJQ3Vyc29yVGVzdENvbXBvbmVudFByb3BzIHtcbiAgY3Vyc29yOiBDdXJzb3Jcbn1cblxuY29uc3QgQ3Vyc29yVGVzdENvbXBvbmVudDogUmVhY3QuRnVuY3Rpb25Db21wb25lbnQ8SUN1cnNvclRlc3RDb21wb25lbnRQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8Vmlld1dpbjMyIHN0eWxlPXt7ZmxleERpcmVjdGlvbjogJ2NvbHVtbid9fT5cbiAgICAgIDxUZXh0Pntwcm9wcy5jdXJzb3J9PC9UZXh0PlxuICAgICAgPFZpZXdXaW4zMiBjdXJzb3I9e3Byb3BzLmN1cnNvcn0gc3R5bGU9e3N0eWxlcy5ibGFja2JveH0gLz5cbiAgICA8L1ZpZXdXaW4zMj5cbiAgKVxufVxuXG5jb25zdCBDdXJzb3JFeGFtcGxlOiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudCA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8Vmlld1dpbjMyIHN0eWxlPXt7IGZsZXhEaXJlY3Rpb246ICdyb3cnLCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcgfX0+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J2F1dG8nIC8+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J2RlZmF1bHQnIC8+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J2hlbHAnIC8+XG4gICAgICA8Q3Vyc29yVGVzdENvbXBvbmVudCBjdXJzb3I9J25lc3ctcmVzaXplJyAvPlxuICAgICAgPEN1cnNvclRlc3RDb21wb25lbnQgY3Vyc29yPSdub3QtYWxsb3dlZCcgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nbnMtcmVzaXplJyAvPlxuICAgICAgPEN1cnNvclRlc3RDb21wb25lbnQgY3Vyc29yPSdud3NlLXJlc2l6ZScgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0ncG9pbnRlcicgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nd2FpdCcgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nbW92ZScgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0ndGV4dCcgLz5cbiAgICAgIDxDdXJzb3JUZXN0Q29tcG9uZW50IGN1cnNvcj0nd2UtcmVzaXplJyAvPlxuICAgIDwvVmlld1dpbjMyPlxuICApO1xufVxuY2xhc3MgRW5hYmxlRm9jdXNSaW5nRXhhbXBsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7fSwgSUZvY3VzYWJsZUNvbXBvbmVudFN0YXRlPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaGFzRm9jdXM6IGZhbHNlLFxuICAgIH07XG4gIH1cbiAgXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3V2luMzIgc3R5bGU9e3sgZmxleERpcmVjdGlvbjogJ3JvdycsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcsIG1hcmdpblZlcnRpY2FsOiA1IH19PlxuICAgICAgICA8Vmlld1dpbjMyXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3BpbmsnLFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDAsXG4gICAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIH19XG4gICAgICAgICAgZW5hYmxlRm9jdXNSaW5nPXt0cnVlfVxuICAgICAgICAgIGZvY3VzYWJsZVxuICAgICAgICA+XG4gICAgICAgICAgPFRleHQ+ZW5hYmxlRm9jdXNSaW5nIHNldCB0byB0cnVlPC9UZXh0PlxuICAgICAgICA8L1ZpZXdXaW4zMj5cbiAgICAgICAgPFZpZXdXaW4zMlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdwaW5rJyxcbiAgICAgICAgICAgIGhlaWdodDogMTAwLFxuICAgICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIGVuYWJsZUZvY3VzUmluZz17ZmFsc2V9XG4gICAgICAgICAgZm9jdXNhYmxlXG4gICAgICAgICAgb25Gb2N1cz17dGhpcy5fb25Gb2N1c31cbiAgICAgICAgICBvbkJsdXI9e3RoaXMuX29uQmx1cn1cbiAgICAgICAgPlxuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8VGV4dD5lbmFibGVGb2N1c1Jpbmcgc2V0IHRvIGZhbHNlPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQ+e3RoaXMuc3RhdGUuaGFzRm9jdXMgPyAnRm9jdXM6IFllcycgOiAnRm9jdXM6IE5vJ308L1RleHQ+XG4gICAgICAgICAgPC8+XG4gICAgICAgIDwvVmlld1dpbjMyPlxuICAgICAgPC9WaWV3V2luMzI+XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRm9jdXMgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBoYXNGb2N1czogdHJ1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkJsdXIgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBoYXNGb2N1czogZmFsc2UsXG4gICAgfSk7XG4gIH07XG59XG5cblxuZXhwb3J0IGNvbnN0IHRpdGxlID0gJ1ZpZXdXaW4zMic7XG5leHBvcnQgY29uc3QgZGlzcGxheU5hbWUgPSAnVmlld1dpbjMyIEV4YW1wbGUnO1xuZXhwb3J0IGNvbnN0IGRlc2NyaXB0aW9uID0gJ0FsbCB0aGUgc3RvY2sgVmlldyBwcm9wcyBwbHVzIFdpbjMyIHNwZWNpZmljIG9uZXMnO1xuZXhwb3J0IGNvbnN0IGV4YW1wbGVzID0gW1xuICB7XG4gICAgdGl0bGU6ICdmb2N1cygpIG1ldGhvZCBleGFtcGxlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0VhY2ggb2YgdGhlc2UgYmxhY2sgYm94ZXMgbW92ZXMgZm9jdXMgdG8gdGhlIFZpZXdXaW4zMiBvbiB0aGUgcmlnaHQnLFxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Vmlld1dpbjMyPlxuICAgICAgICAgIDxGb2N1c01vdmVyVGVzdENvbXBvbmVudCAvPlxuICAgICAgICAgIDxGb2N1c01vdmVyVGVzdENvbXBvbmVudCAvPlxuICAgICAgICAgIDxGb2N1c01vdmVyVGVzdENvbXBvbmVudCAvPlxuICAgICAgICA8L1ZpZXdXaW4zMj5cbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHRpdGxlOiAnS2V5Ym9hcmRFdmVudHMgZXhhbXBsZScsXG4gICAgZGVzY3JpcHRpb246ICdOYXRpdmUga2V5Ym9hcmRpbmcgaGFzIGJlZW4gcHJldmVudGVkJyxcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgcmV0dXJuIDxLZXlib2FyZFRlc3RDb21wb25lbnQgLz47XG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHRpdGxlOiAnSG92ZXIgZXhhbXBsZScsXG4gICAgZGVzY3JpcHRpb246ICdIb3ZlciBhIHJhaW5ib3cnLFxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICByZXR1cm4gPEhvdmVyRXhhbXBsZSAvPjtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGl0bGU6ICdUb29sdGlwIGV4YW1wbGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGlzcGxheXMgYSB0b29sdGlwIG9uIGhvdmVyJyxcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgcmV0dXJuIDxUb29sVGlwRXhhbXBsZSAvPjtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGl0bGU6ICdDdXJzb3IgZXhhbXBsZScsXG4gICAgZGVzY3JpcHRpb246ICdFYWNoIG9mIHRoZXNlIGJveGVzIHNob3VsZCBkaXNwbGF5IGEgZGlmZmVyZW50IGN1cnNvcicsXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgIHJldHVybiA8Q3Vyc29yRXhhbXBsZSAvPjtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgdGl0bGU6ICdFbmFibGVGb2N1c1JpbmcgZXhhbXBsZScsXG4gICAgZGVzY3JpcHRpb246ICdEaXNwbGF5cyBmb2N1cyB2aXN1YWxzIHRoYXQgYXJlIGRyaXZlbiBieSBuYXRpdmUnLFxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICByZXR1cm4gPEVuYWJsZUZvY3VzUmluZ0V4YW1wbGUgLz47XG4gICAgfSxcbiAgfSxcbl07XG4iXX0=