@pie-lib/editable-html-tip-tap 1.2.0-next.2 → 1.2.0-next.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +25 -28
  2. package/LICENSE.md +5 -0
  3. package/lib/components/CharacterPicker.js +1 -1
  4. package/lib/components/CharacterPicker.js.map +1 -1
  5. package/lib/components/EditableHtml.js +1 -1
  6. package/lib/components/EditableHtml.js.map +1 -1
  7. package/lib/components/MenuBar.js +1 -1
  8. package/lib/components/MenuBar.js.map +1 -1
  9. package/lib/components/TiptapContainer.js +1 -1
  10. package/lib/components/TiptapContainer.js.map +1 -1
  11. package/lib/components/characters/characterUtils.js +1 -1
  12. package/lib/components/characters/custom-popper.js +1 -1
  13. package/lib/components/common/done-button.js +1 -1
  14. package/lib/components/common/toolbar-buttons.js +1 -1
  15. package/lib/components/icons/CssIcon.js +1 -1
  16. package/lib/components/icons/RespArea.js +1 -1
  17. package/lib/components/icons/TableIcons.js +1 -1
  18. package/lib/components/icons/TextAlign.js +1 -1
  19. package/lib/components/image/AltDialog.js +1 -1
  20. package/lib/components/image/ImageToolbar.js +1 -1
  21. package/lib/components/image/InsertImageHandler.js +1 -1
  22. package/lib/components/media/MediaDialog.js +1 -1
  23. package/lib/components/media/MediaToolbar.js +1 -1
  24. package/lib/components/media/MediaWrapper.js +1 -1
  25. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +1 -1
  26. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -1
  27. package/lib/components/respArea/DragInTheBlank/choice.js +1 -1
  28. package/lib/components/respArea/ExplicitConstructedResponse.js +1 -1
  29. package/lib/components/respArea/InlineDropdown.js +1 -1
  30. package/lib/components/respArea/ToolbarIcon.js +1 -1
  31. package/lib/constants.js +1 -1
  32. package/lib/extensions/css.js +1 -1
  33. package/lib/extensions/custom-toolbar-wrapper.js +1 -1
  34. package/lib/extensions/extended-table.js +1 -1
  35. package/lib/extensions/image-component.js +1 -1
  36. package/lib/extensions/image-component.js.map +1 -1
  37. package/lib/extensions/image.js +1 -1
  38. package/lib/extensions/index.js +1 -1
  39. package/lib/extensions/index.js.map +1 -1
  40. package/lib/extensions/math.js +1 -1
  41. package/lib/extensions/media.js +1 -1
  42. package/lib/extensions/responseArea.js +1 -1
  43. package/lib/index.js +1 -1
  44. package/lib/styles/editorContainerStyles.js +1 -1
  45. package/lib/theme.js +1 -1
  46. package/lib/utils/size.js +1 -1
  47. package/package.json +5 -5
  48. package/src/components/EditableHtml.jsx +4 -2
  49. package/lib/__tests__/EditableHtml.test.js +0 -377
  50. package/lib/__tests__/constants.test.js +0 -21
  51. package/lib/__tests__/extensions.test.js +0 -209
  52. package/lib/__tests__/index.test.js +0 -235
  53. package/lib/__tests__/size-utils.test.js +0 -57
  54. package/lib/__tests__/theme.test.js +0 -17
  55. package/lib/components/__tests__/AltDialog.test.js +0 -201
  56. package/lib/components/__tests__/CharacterPicker.test.js +0 -305
  57. package/lib/components/__tests__/CssIcon.test.js +0 -58
  58. package/lib/components/__tests__/DragInTheBlank.test.js +0 -295
  59. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +0 -253
  60. package/lib/components/__tests__/ImageToolbar.test.js +0 -185
  61. package/lib/components/__tests__/InlineDropdown.test.js +0 -287
  62. package/lib/components/__tests__/InsertImageHandler.test.js +0 -162
  63. package/lib/components/__tests__/MediaDialog.test.js +0 -433
  64. package/lib/components/__tests__/MediaToolbar.test.js +0 -126
  65. package/lib/components/__tests__/MediaWrapper.test.js +0 -96
  66. package/lib/components/__tests__/MenuBar.test.js +0 -459
  67. package/lib/components/__tests__/RespArea.test.js +0 -171
  68. package/lib/components/__tests__/TableIcons.test.js +0 -153
  69. package/lib/components/__tests__/TextAlign.test.js +0 -209
  70. package/lib/components/__tests__/TiptapContainer.test.js +0 -196
  71. package/lib/components/__tests__/characterUtils.test.js +0 -178
  72. package/lib/components/__tests__/choice.test.js +0 -213
  73. package/lib/components/__tests__/custom-popper.test.js +0 -108
  74. package/lib/components/__tests__/done-button.test.js +0 -72
  75. package/lib/components/__tests__/toolbar-buttons.test.js +0 -277
  76. package/lib/extensions/__tests__/component.test.js +0 -314
  77. package/lib/extensions/__tests__/css.test.js +0 -214
  78. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +0 -175
  79. package/lib/extensions/__tests__/extended-table.test.js +0 -92
  80. package/lib/extensions/__tests__/image-component.test.js +0 -305
  81. package/lib/extensions/__tests__/image.test.js +0 -164
  82. package/lib/extensions/__tests__/media.test.js +0 -292
  83. package/lib/extensions/__tests__/responseArea.test.js +0 -330
  84. package/lib/extensions/component.js +0 -305
@@ -1,305 +0,0 @@
1
- "use strict";
2
-
3
- require("core-js/modules/es.symbol.js");
4
- require("core-js/modules/es.array.filter.js");
5
- require("core-js/modules/es.array.for-each.js");
6
- require("core-js/modules/es.array.iterator.js");
7
- require("core-js/modules/es.object.define-properties.js");
8
- require("core-js/modules/es.object.define-property.js");
9
- require("core-js/modules/es.object.get-own-property-descriptor.js");
10
- require("core-js/modules/es.object.get-own-property-descriptors.js");
11
- require("core-js/modules/es.object.keys.js");
12
- require("core-js/modules/es.object.to-string.js");
13
- require("core-js/modules/es.string.iterator.js");
14
- require("core-js/modules/es.weak-map.js");
15
- require("core-js/modules/web.dom-collections.for-each.js");
16
- require("core-js/modules/web.dom-collections.iterator.js");
17
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
18
- var _typeof = require("@babel/runtime/helpers/typeof");
19
- Object.defineProperty(exports, "__esModule", {
20
- value: true
21
- });
22
- exports["default"] = void 0;
23
- require("core-js/modules/es.array.includes.js");
24
- require("core-js/modules/es.number.to-fixed.js");
25
- require("core-js/modules/es.parse-int.js");
26
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
27
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
28
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
29
- var _react = _interopRequireWildcard(require("react"));
30
- var _propTypes = _interopRequireDefault(require("prop-types"));
31
- var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
32
- var _debug = _interopRequireDefault(require("debug"));
33
- var _LinearProgress = _interopRequireDefault(require("@mui/material/LinearProgress"));
34
- var _styles = require("@mui/material/styles");
35
- var _react2 = require("@tiptap/react");
36
- var _InsertImageHandler = _interopRequireDefault(require("../components/image/InsertImageHandler"));
37
- var _ImageToolbar = _interopRequireDefault(require("../components/image/ImageToolbar"));
38
- var _customToolbarWrapper = _interopRequireDefault(require("./custom-toolbar-wrapper"));
39
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
40
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
41
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
42
- var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:image:component');
43
- var StyledProgress = (0, _styles.styled)(_LinearProgress["default"], {
44
- shouldForwardProp: function shouldForwardProp(prop) {
45
- return prop !== 'hideProgress';
46
- }
47
- })(function (_ref) {
48
- var hideProgress = _ref.hideProgress;
49
- return _objectSpread({
50
- position: 'absolute',
51
- left: '0',
52
- width: 'fit-content',
53
- top: '0%',
54
- transition: 'opacity 200ms linear'
55
- }, hideProgress && {
56
- opacity: 0
57
- });
58
- });
59
- var StyledRoot = (0, _styles.styled)('div', {
60
- shouldForwardProp: function shouldForwardProp(prop) {
61
- return !['active', 'loading', 'pendingDelete'].includes(prop);
62
- }
63
- })(function (_ref2) {
64
- var theme = _ref2.theme,
65
- active = _ref2.active,
66
- loading = _ref2.loading,
67
- pendingDelete = _ref2.pendingDelete;
68
- return _objectSpread(_objectSpread({
69
- position: 'relative',
70
- border: active ? "solid 1px ".concat(theme.palette.primary.main) : "solid 1px ".concat(theme.palette.common.white),
71
- display: 'flex',
72
- transition: 'opacity 200ms linear'
73
- }, loading && {
74
- opacity: 0.3
75
- }), pendingDelete && {
76
- opacity: 0.3
77
- });
78
- });
79
- var StyledImageContainer = (0, _styles.styled)('div')(function (_ref3) {
80
- var theme = _ref3.theme;
81
- return {
82
- position: 'relative',
83
- width: 'fit-content',
84
- display: 'flex',
85
- alignItems: 'center',
86
- '&&:hover > .resize': {
87
- display: 'block'
88
- }
89
- };
90
- });
91
- var StyledResize = (0, _styles.styled)('div')(function (_ref4) {
92
- var theme = _ref4.theme;
93
- return {
94
- backgroundColor: theme.palette.primary.main,
95
- cursor: 'col-resize',
96
- height: '35px',
97
- width: '5px',
98
- borderRadius: 8,
99
- marginLeft: '5px',
100
- marginRight: '10px',
101
- display: 'none'
102
- };
103
- });
104
- var sizePx = function sizePx(s) {
105
- return s ? "".concat(s, "px") : 'calc(20px)';
106
- };
107
- function ImageComponent(props) {
108
- var node = props.node,
109
- editor = props.editor,
110
- attributes = props.attributes,
111
- onFocus = props.onFocus,
112
- selected = props.selected,
113
- options = props.options,
114
- _props$maxImageWidth = props.maxImageWidth,
115
- maxImageWidth = _props$maxImageWidth === void 0 ? 700 : _props$maxImageWidth,
116
- _props$maxImageHeight = props.maxImageHeight,
117
- maxImageHeight = _props$maxImageHeight === void 0 ? 900 : _props$maxImageHeight,
118
- latex = props.latex,
119
- handleChange = props.handleChange,
120
- handleDone = props.handleDone;
121
- var alt = node.attrs.alt;
122
- var _useState = (0, _react.useState)(false),
123
- _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
124
- showToolbar = _useState2[0],
125
- setShowToolbar = _useState2[1];
126
- var imgRef = (0, _react.useRef)(null);
127
- var resizeRef = (0, _react.useRef)(null);
128
- var toolbarRef = (0, _react.useRef)(null);
129
- var getPercentFromWidth = (0, _react.useCallback)(function (width) {
130
- var floored = width / imgRef.current.naturalWidth * 4;
131
- return parseInt(floored.toFixed(0) * 25, 10);
132
- }, []);
133
- var applySizeData = (0, _react.useCallback)(function () {
134
- if (!node.attrs.width || !imgRef.current) return;
135
- var update = _objectSpread(_objectSpread({}, node.attrs), {}, {
136
- resizePercent: getPercentFromWidth(node.attrs.width)
137
- });
138
- if (!(0, _isEqual["default"])(update, node.attrs)) {
139
- editor.commands.updateAttributes('imageUploadNode', update);
140
- }
141
- }, [editor, node.attrs, getPercentFromWidth]);
142
- (0, _react.useEffect)(function () {
143
- var selection = editor.state.selection;
144
- var onlyThisNodeSelected = selection.from + node.nodeSize === selection.to;
145
- if (selected) {
146
- if (onlyThisNodeSelected) {
147
- setShowToolbar(selected);
148
- }
149
- } else {
150
- setShowToolbar(selected);
151
- }
152
- }, [editor, node, selected]);
153
- (0, _react.useEffect)(function () {
154
- options.imageHandling.insertImageRequested(node, function (finish) {
155
- return new _InsertImageHandler["default"](editor, node, finish);
156
- });
157
- applySizeData();
158
- var resizeHandle = resizeRef.current;
159
- if (resizeHandle) {
160
- resizeHandle.addEventListener('mousedown', initResize, false);
161
- }
162
- return function () {
163
- if (resizeHandle) resizeHandle.removeEventListener('mousedown', initResize, false);
164
- };
165
- }, []);
166
- (0, _react.useEffect)(function () {
167
- applySizeData();
168
- });
169
- var loadImage = (0, _react.useCallback)(function () {
170
- var box = imgRef.current;
171
- if (!box) return;
172
- if (!box.style.width || box.style.width === 'calc(20px)') {
173
- var w = Math.min(box.naturalWidth, maxImageWidth);
174
- var h = Math.min(box.naturalHeight, maxImageHeight);
175
- box.style.width = "".concat(w, "px");
176
- box.style.height = "".concat(h, "px");
177
- var update = {
178
- width: w,
179
- height: h
180
- };
181
- if (!(0, _isEqual["default"])(update, node.attrs)) {
182
- editor.commands.updateAttributes('imageUploadNode', update);
183
- }
184
- }
185
- }, [editor, node.attrs, maxImageWidth, maxImageHeight]);
186
- var updateAspect = function updateAspect(initial, next) {
187
- var keepAspect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
188
- var resizeType = arguments.length > 3 ? arguments[3] : undefined;
189
- if (keepAspect) {
190
- var ratio = initial.width / initial.height;
191
- if (resizeType === 'height') return {
192
- width: next.height * ratio,
193
- height: next.height
194
- };
195
- return {
196
- width: next.width,
197
- height: next.width / ratio
198
- };
199
- }
200
- return next;
201
- };
202
- var startResize = (0, _react.useCallback)(function (e) {
203
- var box = imgRef.current;
204
- if (!box) return;
205
- var bounds = e.target.getBoundingClientRect();
206
- var initial = {
207
- width: box.naturalWidth,
208
- height: box.naturalHeight
209
- };
210
- var next = updateAspect(initial, {
211
- width: e.clientX - bounds.left,
212
- height: e.clientY - bounds.top
213
- });
214
- if (next.width > 50 && next.height > 50 && next.width <= 700 && next.height <= 900) {
215
- box.style.width = "".concat(next.width, "px");
216
- box.style.height = "".concat(next.height, "px");
217
- var update = {
218
- width: next.width,
219
- height: next.height
220
- };
221
- if (!(0, _isEqual["default"])(update, node.attrs)) {
222
- editor.commands.updateAttributes('imageUploadNode', update);
223
- }
224
- }
225
- }, [editor, node.attrs]);
226
- var onChange = (0, _react.useCallback)(function (newValues) {
227
- editor.commands.updateAttributes('imageUploadNode', newValues);
228
- }, [editor]);
229
- var stopResize = (0, _react.useCallback)(function () {
230
- window.removeEventListener('mousemove', startResize);
231
- window.removeEventListener('mouseup', stopResize);
232
- }, [startResize]);
233
- var initResize = (0, _react.useCallback)(function () {
234
- window.addEventListener('mousemove', startResize);
235
- window.addEventListener('mouseup', stopResize);
236
- }, [startResize, stopResize]);
237
- var style = {
238
- width: sizePx(node.attrs.width),
239
- height: sizePx(node.attrs.height),
240
- objectFit: 'contain'
241
- };
242
- var flexAlign = {
243
- left: 'flex-start',
244
- center: 'center',
245
- right: 'flex-end'
246
- }[node.attrs.alignment] || 'flex-start';
247
- return /*#__PURE__*/_react["default"].createElement(_react2.NodeViewWrapper, null, /*#__PURE__*/_react["default"].createElement(StyledRoot, {
248
- onFocus: onFocus,
249
- active: selected,
250
- loading: !node.attrs.loaded,
251
- pendingDelete: node.attrs.deleteStatus === 'pending',
252
- style: {
253
- justifyContent: flexAlign
254
- }
255
- }, /*#__PURE__*/_react["default"].createElement(StyledProgress, {
256
- mode: "determinate",
257
- value: node.attrs.percent || 0,
258
- hideProgress: node.attrs.loaded
259
- }), /*#__PURE__*/_react["default"].createElement(StyledImageContainer, null, /*#__PURE__*/_react["default"].createElement("img", (0, _extends2["default"])({}, attributes, {
260
- ref: imgRef,
261
- src: node.attrs.src,
262
- style: style,
263
- onLoad: loadImage,
264
- alt: node.attrs.alt
265
- })), /*#__PURE__*/_react["default"].createElement(StyledResize, {
266
- ref: resizeRef,
267
- className: "resize"
268
- }))), showToolbar && /*#__PURE__*/_react["default"].createElement("div", {
269
- ref: toolbarRef,
270
- style: {
271
- position: 'absolute',
272
- top: '100%',
273
- left: 0,
274
- zIndex: 20,
275
- background: 'var(--editable-html-toolbar-bg, #efefef)',
276
- boxShadow: '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)',
277
- width: '100%'
278
- }
279
- }, /*#__PURE__*/_react["default"].createElement(_customToolbarWrapper["default"], (0, _extends2["default"])({
280
- showDone: true
281
- }, options, {
282
- onDone: function onDone() {
283
- var _props$imageHandling;
284
- setShowToolbar(false);
285
- (_props$imageHandling = props.imageHandling) === null || _props$imageHandling === void 0 || _props$imageHandling.onDone();
286
- props.editor.commands.focus('end');
287
- }
288
- }), /*#__PURE__*/_react["default"].createElement(_ImageToolbar["default"], {
289
- disableImageAlignmentButtons: options.disableImageAlignmentButtons,
290
- alt: node.attrs.alt,
291
- imageLoaded: node.attrs.loaded,
292
- alignment: node.attrs.alignment || 'left',
293
- onChange: onChange
294
- }))));
295
- }
296
- ImageComponent.propTypes = {
297
- node: _propTypes["default"].object.isRequired,
298
- editor: _propTypes["default"].object.isRequired,
299
- attributes: _propTypes["default"].object,
300
- onFocus: _propTypes["default"].func,
301
- maxImageWidth: _propTypes["default"].number,
302
- maxImageHeight: _propTypes["default"].number
303
- };
304
- var _default = exports["default"] = ImageComponent;
305
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9pc0VxdWFsIiwiX2RlYnVnIiwiX0xpbmVhclByb2dyZXNzIiwiX3N0eWxlcyIsIl9yZWFjdDIiLCJfSW5zZXJ0SW1hZ2VIYW5kbGVyIiwiX0ltYWdlVG9vbGJhciIsIl9jdXN0b21Ub29sYmFyV3JhcHBlciIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJsb2ciLCJkZWJ1ZyIsIlN0eWxlZFByb2dyZXNzIiwic3R5bGVkIiwiTGluZWFyUHJvZ3Jlc3MiLCJzaG91bGRGb3J3YXJkUHJvcCIsInByb3AiLCJfcmVmIiwiaGlkZVByb2dyZXNzIiwicG9zaXRpb24iLCJsZWZ0Iiwid2lkdGgiLCJ0b3AiLCJ0cmFuc2l0aW9uIiwib3BhY2l0eSIsIlN0eWxlZFJvb3QiLCJpbmNsdWRlcyIsIl9yZWYyIiwidGhlbWUiLCJhY3RpdmUiLCJsb2FkaW5nIiwicGVuZGluZ0RlbGV0ZSIsImJvcmRlciIsImNvbmNhdCIsInBhbGV0dGUiLCJwcmltYXJ5IiwibWFpbiIsImNvbW1vbiIsIndoaXRlIiwiZGlzcGxheSIsIlN0eWxlZEltYWdlQ29udGFpbmVyIiwiX3JlZjMiLCJhbGlnbkl0ZW1zIiwiU3R5bGVkUmVzaXplIiwiX3JlZjQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjdXJzb3IiLCJoZWlnaHQiLCJib3JkZXJSYWRpdXMiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJzaXplUHgiLCJzIiwiSW1hZ2VDb21wb25lbnQiLCJwcm9wcyIsIm5vZGUiLCJlZGl0b3IiLCJhdHRyaWJ1dGVzIiwib25Gb2N1cyIsInNlbGVjdGVkIiwib3B0aW9ucyIsIl9wcm9wcyRtYXhJbWFnZVdpZHRoIiwibWF4SW1hZ2VXaWR0aCIsIl9wcm9wcyRtYXhJbWFnZUhlaWdodCIsIm1heEltYWdlSGVpZ2h0IiwibGF0ZXgiLCJoYW5kbGVDaGFuZ2UiLCJoYW5kbGVEb25lIiwiYWx0IiwiYXR0cnMiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJzaG93VG9vbGJhciIsInNldFNob3dUb29sYmFyIiwiaW1nUmVmIiwidXNlUmVmIiwicmVzaXplUmVmIiwidG9vbGJhclJlZiIsImdldFBlcmNlbnRGcm9tV2lkdGgiLCJ1c2VDYWxsYmFjayIsImZsb29yZWQiLCJjdXJyZW50IiwibmF0dXJhbFdpZHRoIiwicGFyc2VJbnQiLCJ0b0ZpeGVkIiwiYXBwbHlTaXplRGF0YSIsInVwZGF0ZSIsInJlc2l6ZVBlcmNlbnQiLCJpc0VxdWFsIiwiY29tbWFuZHMiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwidXNlRWZmZWN0Iiwic2VsZWN0aW9uIiwic3RhdGUiLCJvbmx5VGhpc05vZGVTZWxlY3RlZCIsImZyb20iLCJub2RlU2l6ZSIsInRvIiwiaW1hZ2VIYW5kbGluZyIsImluc2VydEltYWdlUmVxdWVzdGVkIiwiZmluaXNoIiwiSW5zZXJ0SW1hZ2VIYW5kbGVyIiwicmVzaXplSGFuZGxlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImluaXRSZXNpemUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibG9hZEltYWdlIiwiYm94Iiwic3R5bGUiLCJ3IiwiTWF0aCIsIm1pbiIsImgiLCJuYXR1cmFsSGVpZ2h0IiwidXBkYXRlQXNwZWN0IiwiaW5pdGlhbCIsIm5leHQiLCJrZWVwQXNwZWN0IiwidW5kZWZpbmVkIiwicmVzaXplVHlwZSIsInJhdGlvIiwic3RhcnRSZXNpemUiLCJib3VuZHMiLCJ0YXJnZXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRYIiwiY2xpZW50WSIsIm9uQ2hhbmdlIiwibmV3VmFsdWVzIiwic3RvcFJlc2l6ZSIsIndpbmRvdyIsIm9iamVjdEZpdCIsImZsZXhBbGlnbiIsImNlbnRlciIsInJpZ2h0IiwiYWxpZ25tZW50IiwiY3JlYXRlRWxlbWVudCIsIk5vZGVWaWV3V3JhcHBlciIsImxvYWRlZCIsImRlbGV0ZVN0YXR1cyIsImp1c3RpZnlDb250ZW50IiwibW9kZSIsInZhbHVlIiwicGVyY2VudCIsIl9leHRlbmRzMiIsInJlZiIsInNyYyIsIm9uTG9hZCIsImNsYXNzTmFtZSIsInpJbmRleCIsImJhY2tncm91bmQiLCJib3hTaGFkb3ciLCJzaG93RG9uZSIsIm9uRG9uZSIsIl9wcm9wcyRpbWFnZUhhbmRsaW5nIiwiZm9jdXMiLCJkaXNhYmxlSW1hZ2VBbGlnbm1lbnRCdXR0b25zIiwiaW1hZ2VMb2FkZWQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiZnVuYyIsIm51bWJlciIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRlbnNpb25zL2NvbXBvbmVudC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBMaW5lYXJQcm9ncmVzcyBmcm9tICdAbXVpL21hdGVyaWFsL0xpbmVhclByb2dyZXNzJztcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCB7IE5vZGVWaWV3V3JhcHBlciB9IGZyb20gJ0B0aXB0YXAvcmVhY3QnO1xuaW1wb3J0IEluc2VydEltYWdlSGFuZGxlciBmcm9tICcuLi9jb21wb25lbnRzL2ltYWdlL0luc2VydEltYWdlSGFuZGxlcic7XG5pbXBvcnQgSW1hZ2VUb29sYmFyIGZyb20gJy4uL2NvbXBvbmVudHMvaW1hZ2UvSW1hZ2VUb29sYmFyJztcbmltcG9ydCBDdXN0b21Ub29sYmFyV3JhcHBlciBmcm9tICcuL2N1c3RvbS10b29sYmFyLXdyYXBwZXInO1xuXG5jb25zdCBsb2cgPSBkZWJ1ZygnQHBpZS1saWI6ZWRpdGFibGUtaHRtbDpwbHVnaW5zOmltYWdlOmNvbXBvbmVudCcpO1xuXG5jb25zdCBTdHlsZWRQcm9ncmVzcyA9IHN0eWxlZChMaW5lYXJQcm9ncmVzcywge1xuICBzaG91bGRGb3J3YXJkUHJvcDogKHByb3ApID0+IHByb3AgIT09ICdoaWRlUHJvZ3Jlc3MnLFxufSkoKHsgaGlkZVByb2dyZXNzIH0pID0+ICh7XG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICBsZWZ0OiAnMCcsXG4gIHdpZHRoOiAnZml0LWNvbnRlbnQnLFxuICB0b3A6ICcwJScsXG4gIHRyYW5zaXRpb246ICdvcGFjaXR5IDIwMG1zIGxpbmVhcicsXG4gIC4uLihoaWRlUHJvZ3Jlc3MgJiYge1xuICAgIG9wYWNpdHk6IDAsXG4gIH0pLFxufSkpO1xuXG5jb25zdCBTdHlsZWRSb290ID0gc3R5bGVkKCdkaXYnLCB7XG4gIHNob3VsZEZvcndhcmRQcm9wOiAocHJvcCkgPT4gIVsnYWN0aXZlJywgJ2xvYWRpbmcnLCAncGVuZGluZ0RlbGV0ZSddLmluY2x1ZGVzKHByb3ApLFxufSkoKHsgdGhlbWUsIGFjdGl2ZSwgbG9hZGluZywgcGVuZGluZ0RlbGV0ZSB9KSA9PiAoe1xuICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgYm9yZGVyOiBhY3RpdmUgPyBgc29saWQgMXB4ICR7dGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW59YCA6IGBzb2xpZCAxcHggJHt0aGVtZS5wYWxldHRlLmNvbW1vbi53aGl0ZX1gLFxuICBkaXNwbGF5OiAnZmxleCcsXG4gIHRyYW5zaXRpb246ICdvcGFjaXR5IDIwMG1zIGxpbmVhcicsXG4gIC4uLihsb2FkaW5nICYmIHtcbiAgICBvcGFjaXR5OiAwLjMsXG4gIH0pLFxuICAuLi4ocGVuZGluZ0RlbGV0ZSAmJiB7XG4gICAgb3BhY2l0eTogMC4zLFxuICB9KSxcbn0pKTtcblxuY29uc3QgU3R5bGVkSW1hZ2VDb250YWluZXIgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICB3aWR0aDogJ2ZpdC1jb250ZW50JyxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgJyYmOmhvdmVyID4gLnJlc2l6ZSc6IHtcbiAgICBkaXNwbGF5OiAnYmxvY2snLFxuICB9LFxufSkpO1xuXG5jb25zdCBTdHlsZWRSZXNpemUgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gIGN1cnNvcjogJ2NvbC1yZXNpemUnLFxuICBoZWlnaHQ6ICczNXB4JyxcbiAgd2lkdGg6ICc1cHgnLFxuICBib3JkZXJSYWRpdXM6IDgsXG4gIG1hcmdpbkxlZnQ6ICc1cHgnLFxuICBtYXJnaW5SaWdodDogJzEwcHgnLFxuICBkaXNwbGF5OiAnbm9uZScsXG59KSk7XG5cbmNvbnN0IHNpemVQeCA9IChzKSA9PiAocyA/IGAke3N9cHhgIDogJ2NhbGMoMjBweCknKTtcblxuZnVuY3Rpb24gSW1hZ2VDb21wb25lbnQocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIG5vZGUsXG4gICAgZWRpdG9yLFxuICAgIGF0dHJpYnV0ZXMsXG4gICAgb25Gb2N1cyxcbiAgICBzZWxlY3RlZCxcbiAgICBvcHRpb25zLFxuICAgIG1heEltYWdlV2lkdGggPSA3MDAsXG4gICAgbWF4SW1hZ2VIZWlnaHQgPSA5MDAsXG4gICAgbGF0ZXgsXG4gICAgaGFuZGxlQ2hhbmdlLFxuICAgIGhhbmRsZURvbmUsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyBhbHQgfSA9IG5vZGUuYXR0cnM7XG5cbiAgY29uc3QgW3Nob3dUb29sYmFyLCBzZXRTaG93VG9vbGJhcl0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3QgaW1nUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCByZXNpemVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHRvb2xiYXJSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgZ2V0UGVyY2VudEZyb21XaWR0aCA9IHVzZUNhbGxiYWNrKCh3aWR0aCkgPT4ge1xuICAgIGNvbnN0IGZsb29yZWQgPSAod2lkdGggLyBpbWdSZWYuY3VycmVudC5uYXR1cmFsV2lkdGgpICogNDtcbiAgICByZXR1cm4gcGFyc2VJbnQoZmxvb3JlZC50b0ZpeGVkKDApICogMjUsIDEwKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGFwcGx5U2l6ZURhdGEgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFub2RlLmF0dHJzLndpZHRoIHx8ICFpbWdSZWYuY3VycmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgLi4ubm9kZS5hdHRycyxcbiAgICAgIHJlc2l6ZVBlcmNlbnQ6IGdldFBlcmNlbnRGcm9tV2lkdGgobm9kZS5hdHRycy53aWR0aCksXG4gICAgfTtcblxuICAgIGlmICghaXNFcXVhbCh1cGRhdGUsIG5vZGUuYXR0cnMpKSB7XG4gICAgICBlZGl0b3IuY29tbWFuZHMudXBkYXRlQXR0cmlidXRlcygnaW1hZ2VVcGxvYWROb2RlJywgdXBkYXRlKTtcbiAgICB9XG4gIH0sIFtlZGl0b3IsIG5vZGUuYXR0cnMsIGdldFBlcmNlbnRGcm9tV2lkdGhdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBlZGl0b3Iuc3RhdGU7XG4gICAgY29uc3Qgb25seVRoaXNOb2RlU2VsZWN0ZWQgPSBzZWxlY3Rpb24uZnJvbSArIG5vZGUubm9kZVNpemUgPT09IHNlbGVjdGlvbi50bztcblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgaWYgKG9ubHlUaGlzTm9kZVNlbGVjdGVkKSB7XG4gICAgICAgIHNldFNob3dUb29sYmFyKHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U2hvd1Rvb2xiYXIoc2VsZWN0ZWQpO1xuICAgIH1cbiAgfSwgW2VkaXRvciwgbm9kZSwgc2VsZWN0ZWRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9wdGlvbnMuaW1hZ2VIYW5kbGluZy5pbnNlcnRJbWFnZVJlcXVlc3RlZChub2RlLCAoZmluaXNoKSA9PiBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgbm9kZSwgZmluaXNoKSk7XG4gICAgYXBwbHlTaXplRGF0YSgpO1xuXG4gICAgY29uc3QgcmVzaXplSGFuZGxlID0gcmVzaXplUmVmLmN1cnJlbnQ7XG4gICAgaWYgKHJlc2l6ZUhhbmRsZSkge1xuICAgICAgcmVzaXplSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGluaXRSZXNpemUsIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChyZXNpemVIYW5kbGUpIHJlc2l6ZUhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBpbml0UmVzaXplLCBmYWxzZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXBwbHlTaXplRGF0YSgpO1xuICB9KTtcblxuICBjb25zdCBsb2FkSW1hZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgYm94ID0gaW1nUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFib3gpIHJldHVybjtcblxuICAgIGlmICghYm94LnN0eWxlLndpZHRoIHx8IGJveC5zdHlsZS53aWR0aCA9PT0gJ2NhbGMoMjBweCknKSB7XG4gICAgICBjb25zdCB3ID0gTWF0aC5taW4oYm94Lm5hdHVyYWxXaWR0aCwgbWF4SW1hZ2VXaWR0aCk7XG4gICAgICBjb25zdCBoID0gTWF0aC5taW4oYm94Lm5hdHVyYWxIZWlnaHQsIG1heEltYWdlSGVpZ2h0KTtcblxuICAgICAgYm94LnN0eWxlLndpZHRoID0gYCR7d31weGA7XG4gICAgICBib3guc3R5bGUuaGVpZ2h0ID0gYCR7aH1weGA7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICAgICAgaWYgKCFpc0VxdWFsKHVwZGF0ZSwgbm9kZS5hdHRycykpIHtcbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnVwZGF0ZUF0dHJpYnV0ZXMoJ2ltYWdlVXBsb2FkTm9kZScsIHVwZGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbZWRpdG9yLCBub2RlLmF0dHJzLCBtYXhJbWFnZVdpZHRoLCBtYXhJbWFnZUhlaWdodF0pO1xuXG4gIGNvbnN0IHVwZGF0ZUFzcGVjdCA9IChpbml0aWFsLCBuZXh0LCBrZWVwQXNwZWN0ID0gdHJ1ZSwgcmVzaXplVHlwZSkgPT4ge1xuICAgIGlmIChrZWVwQXNwZWN0KSB7XG4gICAgICBjb25zdCByYXRpbyA9IGluaXRpYWwud2lkdGggLyBpbml0aWFsLmhlaWdodDtcbiAgICAgIGlmIChyZXNpemVUeXBlID09PSAnaGVpZ2h0JykgcmV0dXJuIHsgd2lkdGg6IG5leHQuaGVpZ2h0ICogcmF0aW8sIGhlaWdodDogbmV4dC5oZWlnaHQgfTtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBuZXh0LndpZHRoLCBoZWlnaHQ6IG5leHQud2lkdGggLyByYXRpbyB9O1xuICAgIH1cbiAgICByZXR1cm4gbmV4dDtcbiAgfTtcblxuICBjb25zdCBzdGFydFJlc2l6ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlKSA9PiB7XG4gICAgICBjb25zdCBib3ggPSBpbWdSZWYuY3VycmVudDtcbiAgICAgIGlmICghYm94KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGJvdW5kcyA9IGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgaW5pdGlhbCA9IHsgd2lkdGg6IGJveC5uYXR1cmFsV2lkdGgsIGhlaWdodDogYm94Lm5hdHVyYWxIZWlnaHQgfTtcblxuICAgICAgY29uc3QgbmV4dCA9IHVwZGF0ZUFzcGVjdChpbml0aWFsLCB7XG4gICAgICAgIHdpZHRoOiBlLmNsaWVudFggLSBib3VuZHMubGVmdCxcbiAgICAgICAgaGVpZ2h0OiBlLmNsaWVudFkgLSBib3VuZHMudG9wLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChuZXh0LndpZHRoID4gNTAgJiYgbmV4dC5oZWlnaHQgPiA1MCAmJiBuZXh0LndpZHRoIDw9IDcwMCAmJiBuZXh0LmhlaWdodCA8PSA5MDApIHtcbiAgICAgICAgYm94LnN0eWxlLndpZHRoID0gYCR7bmV4dC53aWR0aH1weGA7XG4gICAgICAgIGJveC5zdHlsZS5oZWlnaHQgPSBgJHtuZXh0LmhlaWdodH1weGA7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlID0geyB3aWR0aDogbmV4dC53aWR0aCwgaGVpZ2h0OiBuZXh0LmhlaWdodCB9O1xuICAgICAgICBpZiAoIWlzRXF1YWwodXBkYXRlLCBub2RlLmF0dHJzKSkge1xuICAgICAgICAgIGVkaXRvci5jb21tYW5kcy51cGRhdGVBdHRyaWJ1dGVzKCdpbWFnZVVwbG9hZE5vZGUnLCB1cGRhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZWRpdG9yLCBub2RlLmF0dHJzXSxcbiAgKTtcblxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZXMpID0+IHtcbiAgICAgIGVkaXRvci5jb21tYW5kcy51cGRhdGVBdHRyaWJ1dGVzKCdpbWFnZVVwbG9hZE5vZGUnLCBuZXdWYWx1ZXMpO1xuICAgIH0sXG4gICAgW2VkaXRvcl0sXG4gICk7XG5cbiAgY29uc3Qgc3RvcFJlc2l6ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgc3RhcnRSZXNpemUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RvcFJlc2l6ZSk7XG4gIH0sIFtzdGFydFJlc2l6ZV0pO1xuXG4gIGNvbnN0IGluaXRSZXNpemUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXJ0UmVzaXplKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHN0b3BSZXNpemUpO1xuICB9LCBbc3RhcnRSZXNpemUsIHN0b3BSZXNpemVdKTtcblxuICBjb25zdCBzdHlsZSA9IHtcbiAgICB3aWR0aDogc2l6ZVB4KG5vZGUuYXR0cnMud2lkdGgpLFxuICAgIGhlaWdodDogc2l6ZVB4KG5vZGUuYXR0cnMuaGVpZ2h0KSxcbiAgICBvYmplY3RGaXQ6ICdjb250YWluJyxcbiAgfTtcblxuICBjb25zdCBmbGV4QWxpZ24gPSB7IGxlZnQ6ICdmbGV4LXN0YXJ0JywgY2VudGVyOiAnY2VudGVyJywgcmlnaHQ6ICdmbGV4LWVuZCcgfVtub2RlLmF0dHJzLmFsaWdubWVudF0gfHwgJ2ZsZXgtc3RhcnQnO1xuXG4gIHJldHVybiAoXG4gICAgPE5vZGVWaWV3V3JhcHBlcj5cbiAgICAgIDxTdHlsZWRSb290XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgIGFjdGl2ZT17c2VsZWN0ZWR9XG4gICAgICAgIGxvYWRpbmc9eyFub2RlLmF0dHJzLmxvYWRlZH1cbiAgICAgICAgcGVuZGluZ0RlbGV0ZT17bm9kZS5hdHRycy5kZWxldGVTdGF0dXMgPT09ICdwZW5kaW5nJ31cbiAgICAgICAgc3R5bGU9e3sganVzdGlmeUNvbnRlbnQ6IGZsZXhBbGlnbiB9fVxuICAgICAgPlxuICAgICAgICA8U3R5bGVkUHJvZ3Jlc3MgbW9kZT1cImRldGVybWluYXRlXCIgdmFsdWU9e25vZGUuYXR0cnMucGVyY2VudCB8fCAwfSBoaWRlUHJvZ3Jlc3M9e25vZGUuYXR0cnMubG9hZGVkfSAvPlxuXG4gICAgICAgIDxTdHlsZWRJbWFnZUNvbnRhaW5lcj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICB7Li4uYXR0cmlidXRlc31cbiAgICAgICAgICAgIHJlZj17aW1nUmVmfVxuICAgICAgICAgICAgc3JjPXtub2RlLmF0dHJzLnNyY31cbiAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgIG9uTG9hZD17bG9hZEltYWdlfVxuICAgICAgICAgICAgYWx0PXtub2RlLmF0dHJzLmFsdH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTdHlsZWRSZXNpemUgcmVmPXtyZXNpemVSZWZ9IGNsYXNzTmFtZT1cInJlc2l6ZVwiIC8+XG4gICAgICAgIDwvU3R5bGVkSW1hZ2VDb250YWluZXI+XG4gICAgICA8L1N0eWxlZFJvb3Q+XG5cbiAgICAgIHtzaG93VG9vbGJhciAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICByZWY9e3Rvb2xiYXJSZWZ9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgdG9wOiAnMTAwJScsXG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgekluZGV4OiAyMCxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1lZGl0YWJsZS1odG1sLXRvb2xiYXItYmcsICNlZmVmZWYpJyxcbiAgICAgICAgICAgIGJveFNoYWRvdzpcbiAgICAgICAgICAgICAgJzBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4xMiknLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPEN1c3RvbVRvb2xiYXJXcmFwcGVyXG4gICAgICAgICAgICBzaG93RG9uZVxuICAgICAgICAgICAgey4uLm9wdGlvbnN9XG4gICAgICAgICAgICBvbkRvbmU9eygpID0+IHtcbiAgICAgICAgICAgICAgc2V0U2hvd1Rvb2xiYXIoZmFsc2UpO1xuICAgICAgICAgICAgICBwcm9wcy5pbWFnZUhhbmRsaW5nPy5vbkRvbmUoKTtcbiAgICAgICAgICAgICAgcHJvcHMuZWRpdG9yLmNvbW1hbmRzLmZvY3VzKCdlbmQnKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEltYWdlVG9vbGJhclxuICAgICAgICAgICAgICBkaXNhYmxlSW1hZ2VBbGlnbm1lbnRCdXR0b25zPXtvcHRpb25zLmRpc2FibGVJbWFnZUFsaWdubWVudEJ1dHRvbnN9XG4gICAgICAgICAgICAgIGFsdD17bm9kZS5hdHRycy5hbHR9XG4gICAgICAgICAgICAgIGltYWdlTG9hZGVkPXtub2RlLmF0dHJzLmxvYWRlZH1cbiAgICAgICAgICAgICAgYWxpZ25tZW50PXtub2RlLmF0dHJzLmFsaWdubWVudCB8fCAnbGVmdCd9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9DdXN0b21Ub29sYmFyV3JhcHBlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvTm9kZVZpZXdXcmFwcGVyPlxuICApO1xufVxuXG5JbWFnZUNvbXBvbmVudC5wcm9wVHlwZXMgPSB7XG4gIG5vZGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgZWRpdG9yOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICBtYXhJbWFnZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBtYXhJbWFnZUhlaWdodDogUHJvcFR5cGVzLm51bWJlcixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEltYWdlQ29tcG9uZW50O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssZUFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsbUJBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLGFBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLHFCQUFBLEdBQUFSLHNCQUFBLENBQUFGLE9BQUE7QUFBNEQsU0FBQUQsd0JBQUFZLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFkLHVCQUFBLFlBQUFBLHdCQUFBWSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsbUJBQUFULENBQUEsaUJBQUFBLENBQUEsZ0JBQUFVLE9BQUEsQ0FBQVYsQ0FBQSwwQkFB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