@pie-lib/editable-html 12.1.0-next.0 → 12.1.0-next.2

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 (121) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/package.json +7 -7
  3. package/lib/__tests__/editor-utils.test.js +0 -164
  4. package/lib/__tests__/serialization.test.js +0 -242
  5. package/lib/__tests__/utils.js +0 -79
  6. package/lib/block-tags.js +0 -24
  7. package/lib/block-tags.js.map +0 -1
  8. package/lib/constants.js +0 -11
  9. package/lib/constants.js.map +0 -1
  10. package/lib/editor.js +0 -1224
  11. package/lib/editor.js.map +0 -1
  12. package/lib/index.js +0 -208
  13. package/lib/index.js.map +0 -1
  14. package/lib/parse-html.js +0 -16
  15. package/lib/parse-html.js.map +0 -1
  16. package/lib/plugins/characters/custom-popper.js +0 -57
  17. package/lib/plugins/characters/custom-popper.js.map +0 -1
  18. package/lib/plugins/characters/index.js +0 -265
  19. package/lib/plugins/characters/index.js.map +0 -1
  20. package/lib/plugins/characters/utils.js +0 -378
  21. package/lib/plugins/characters/utils.js.map +0 -1
  22. package/lib/plugins/css/icons/index.js +0 -25
  23. package/lib/plugins/css/icons/index.js.map +0 -1
  24. package/lib/plugins/css/index.js +0 -338
  25. package/lib/plugins/css/index.js.map +0 -1
  26. package/lib/plugins/customPlugin/index.js +0 -98
  27. package/lib/plugins/customPlugin/index.js.map +0 -1
  28. package/lib/plugins/html/icons/index.js +0 -30
  29. package/lib/plugins/html/icons/index.js.map +0 -1
  30. package/lib/plugins/html/index.js +0 -71
  31. package/lib/plugins/html/index.js.map +0 -1
  32. package/lib/plugins/image/__tests__/component.test.js +0 -96
  33. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -131
  34. package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -22
  35. package/lib/plugins/image/__tests__/index.test.js +0 -90
  36. package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -112
  37. package/lib/plugins/image/__tests__/mock-change.js +0 -22
  38. package/lib/plugins/image/alt-dialog.js +0 -100
  39. package/lib/plugins/image/alt-dialog.js.map +0 -1
  40. package/lib/plugins/image/component.js +0 -343
  41. package/lib/plugins/image/component.js.map +0 -1
  42. package/lib/plugins/image/image-toolbar.js +0 -137
  43. package/lib/plugins/image/image-toolbar.js.map +0 -1
  44. package/lib/plugins/image/index.js +0 -223
  45. package/lib/plugins/image/index.js.map +0 -1
  46. package/lib/plugins/image/insert-image-handler.js +0 -140
  47. package/lib/plugins/image/insert-image-handler.js.map +0 -1
  48. package/lib/plugins/index.js +0 -342
  49. package/lib/plugins/index.js.map +0 -1
  50. package/lib/plugins/list/__tests__/index.test.js +0 -64
  51. package/lib/plugins/list/index.js +0 -288
  52. package/lib/plugins/list/index.js.map +0 -1
  53. package/lib/plugins/math/__tests__/index.test.js +0 -284
  54. package/lib/plugins/math/index.js +0 -402
  55. package/lib/plugins/math/index.js.map +0 -1
  56. package/lib/plugins/media/__tests__/index.test.js +0 -69
  57. package/lib/plugins/media/index.js +0 -330
  58. package/lib/plugins/media/index.js.map +0 -1
  59. package/lib/plugins/media/media-dialog.js +0 -594
  60. package/lib/plugins/media/media-dialog.js.map +0 -1
  61. package/lib/plugins/media/media-toolbar.js +0 -76
  62. package/lib/plugins/media/media-toolbar.js.map +0 -1
  63. package/lib/plugins/media/media-wrapper.js +0 -64
  64. package/lib/plugins/media/media-wrapper.js.map +0 -1
  65. package/lib/plugins/rendering/index.js +0 -36
  66. package/lib/plugins/rendering/index.js.map +0 -1
  67. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -271
  68. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +0 -1
  69. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -55
  70. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +0 -1
  71. package/lib/plugins/respArea/drag-in-the-blank/utils.js +0 -38
  72. package/lib/plugins/respArea/drag-in-the-blank/utils.js.map +0 -1
  73. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -50
  74. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +0 -1
  75. package/lib/plugins/respArea/icons/index.js +0 -72
  76. package/lib/plugins/respArea/icons/index.js.map +0 -1
  77. package/lib/plugins/respArea/index.js +0 -287
  78. package/lib/plugins/respArea/index.js.map +0 -1
  79. package/lib/plugins/respArea/inline-dropdown/index.js +0 -67
  80. package/lib/plugins/respArea/inline-dropdown/index.js.map +0 -1
  81. package/lib/plugins/respArea/math-templated/index.js +0 -112
  82. package/lib/plugins/respArea/math-templated/index.js.map +0 -1
  83. package/lib/plugins/respArea/utils.js +0 -95
  84. package/lib/plugins/respArea/utils.js.map +0 -1
  85. package/lib/plugins/table/CustomTablePlugin.js +0 -116
  86. package/lib/plugins/table/CustomTablePlugin.js.map +0 -1
  87. package/lib/plugins/table/__tests__/index.test.js +0 -416
  88. package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -81
  89. package/lib/plugins/table/icons/index.js +0 -55
  90. package/lib/plugins/table/icons/index.js.map +0 -1
  91. package/lib/plugins/table/index.js +0 -413
  92. package/lib/plugins/table/index.js.map +0 -1
  93. package/lib/plugins/table/table-toolbar.js +0 -138
  94. package/lib/plugins/table/table-toolbar.js.map +0 -1
  95. package/lib/plugins/textAlign/icons/index.js +0 -187
  96. package/lib/plugins/textAlign/icons/index.js.map +0 -1
  97. package/lib/plugins/textAlign/index.js +0 -26
  98. package/lib/plugins/textAlign/index.js.map +0 -1
  99. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -154
  100. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -47
  101. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -112
  102. package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -118
  103. package/lib/plugins/toolbar/default-toolbar.js +0 -180
  104. package/lib/plugins/toolbar/default-toolbar.js.map +0 -1
  105. package/lib/plugins/toolbar/done-button.js +0 -35
  106. package/lib/plugins/toolbar/done-button.js.map +0 -1
  107. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -258
  108. package/lib/plugins/toolbar/editor-and-toolbar.js.map +0 -1
  109. package/lib/plugins/toolbar/index.js +0 -29
  110. package/lib/plugins/toolbar/index.js.map +0 -1
  111. package/lib/plugins/toolbar/toolbar-buttons.js +0 -145
  112. package/lib/plugins/toolbar/toolbar-buttons.js.map +0 -1
  113. package/lib/plugins/toolbar/toolbar.js +0 -307
  114. package/lib/plugins/toolbar/toolbar.js.map +0 -1
  115. package/lib/plugins/utils.js +0 -42
  116. package/lib/plugins/utils.js.map +0 -1
  117. package/lib/serialization.js +0 -571
  118. package/lib/serialization.js.map +0 -1
  119. package/lib/shared/alert-dialog.js +0 -68
  120. package/lib/theme.js +0 -8
  121. package/lib/theme.js.map +0 -1
@@ -1,594 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports["default"] = exports.MediaDialog = void 0;
8
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
13
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
- var _react = _interopRequireDefault(require("react"));
17
- var _propTypes = _interopRequireDefault(require("prop-types"));
18
- var _debug = _interopRequireDefault(require("debug"));
19
- var _styles = require("@mui/material/styles");
20
- var _Button = _interopRequireDefault(require("@mui/material/Button"));
21
- var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
22
- var _Tabs = _interopRequireDefault(require("@mui/material/Tabs"));
23
- var _Tab = _interopRequireDefault(require("@mui/material/Tab"));
24
- var _DialogTitle = _interopRequireDefault(require("@mui/material/DialogTitle"));
25
- var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent"));
26
- var _DialogContentText = _interopRequireDefault(require("@mui/material/DialogContentText"));
27
- var _DialogActions = _interopRequireDefault(require("@mui/material/DialogActions"));
28
- var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
29
- var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
30
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
31
- var _Delete = _interopRequireDefault(require("@mui/icons-material/Delete"));
32
- 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; }
33
- 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; }
34
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
35
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
36
- var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:media:dialog');
37
- var matchYoutubeUrl = function matchYoutubeUrl(url) {
38
- if (!url) {
39
- return false;
40
- }
41
- var p = /^(?:https?:\/\/)?(?:m\.|www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
42
- if (url.match(p)) {
43
- return url.match(p)[1];
44
- }
45
- return false;
46
- };
47
- var matchVimeoUrl = function matchVimeoUrl(url) {
48
- return url && /(http|https)?:\/\/(www\.)?(player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|)(video\/)?(\d+)(?:|\/\?)/.test(url);
49
- };
50
- var matchDriveUrl = function matchDriveUrl(url) {
51
- return url && /^https:\/\/drive\.google\.com\/(?:file\/d\/|drive\/(?:u\/\d+\/)?folders\/|uc\?id=)([a-zA-Z0-9_-]+)/.test(url);
52
- };
53
- var matchSoundCloudUrl = function matchSoundCloudUrl(url) {
54
- if (!url) {
55
- return false;
56
- }
57
- var regexp = /^https?:\/\/(soundcloud\.com|snd\.sc)\/(.*)$/;
58
- return url.match(regexp) && url.match(regexp)[2];
59
- };
60
- var makeApiRequest = function makeApiRequest(url) {
61
- return new Promise(function (resolve) {
62
- try {
63
- fetch("https://soundcloud.com/oembed?format=json&url=".concat(url)).then(function (response) {
64
- return response.json();
65
- }).then(function (json) {
66
- var d = document.createElement('div');
67
- d.innerHTML = json.html;
68
- var iframe = d.querySelector('iframe');
69
- resolve(iframe.src);
70
- })["catch"](function (err) {
71
- resolve('');
72
- log(err);
73
- });
74
- } catch (err) {
75
- resolve('');
76
- }
77
- });
78
- };
79
- var typeMap = {
80
- video: 'Video',
81
- audio: 'Audio'
82
- };
83
- var tabsTypeMap = {
84
- uploadFile: 'upload-file',
85
- insertUrl: 'insert-url'
86
- };
87
- var StyledDialog = (0, _styles.styled)(_Dialog["default"])(function () {
88
- return {
89
- '& .MuiPaper-root': {
90
- minWidth: '500px'
91
- }
92
- };
93
- });
94
- var StyledDialogContent = (0, _styles.styled)(_DialogContent["default"])(function () {
95
- return {
96
- '&.properties': {
97
- padding: 0
98
- }
99
- };
100
- });
101
- var StyledRow = (0, _styles.styled)('div')(function () {
102
- return {
103
- display: 'flex',
104
- flexDirection: 'space-between'
105
- };
106
- });
107
- var StyledUploadInput = (0, _styles.styled)('div')(function (_ref) {
108
- var theme = _ref.theme;
109
- return {
110
- marginTop: theme.spacing(1.5)
111
- };
112
- });
113
- var StyledError = (0, _styles.styled)(_Typography["default"])(function (_ref2) {
114
- var theme = _ref2.theme;
115
- return {
116
- marginTop: theme.spacing(1.5),
117
- color: theme.palette.error.main
118
- };
119
- });
120
- var StyledDeleteIcon = (0, _styles.styled)(_IconButton["default"])(function (_ref3) {
121
- var theme = _ref3.theme;
122
- return {
123
- marginLeft: theme.spacing(1.5)
124
- };
125
- });
126
- var MediaDialog = exports.MediaDialog = /*#__PURE__*/function (_React$Component) {
127
- function MediaDialog(props) {
128
- var _this;
129
- (0, _classCallCheck2["default"])(this, MediaDialog);
130
- _this = _callSuper(this, MediaDialog, [props]);
131
- (0, _defineProperty2["default"])(_this, "formatUrl", function () {
132
- var _this$state = _this.state,
133
- url = _this$state.url,
134
- urlToUse = _this$state.urlToUse,
135
- starts = _this$state.starts,
136
- ends = _this$state.ends;
137
- var isYoutube = matchYoutubeUrl(url);
138
- var isVimeo = matchVimeoUrl(url);
139
- var formattedUrl = urlToUse;
140
- if ((isYoutube || isVimeo) && urlToUse) {
141
- var params = [];
142
- var paramName;
143
- var paramStart;
144
- switch (true) {
145
- case isVimeo:
146
- paramName = 't';
147
- paramStart = '#';
148
- break;
149
- case isYoutube:
150
- paramName = 'start';
151
- paramStart = '?';
152
- break;
153
- default:
154
- paramName = 'start';
155
- paramStart = '?';
156
- }
157
- if (starts) {
158
- params.push("".concat(paramName, "=").concat(starts));
159
- }
160
- if (ends) {
161
- params.push("end=".concat(ends));
162
- }
163
- formattedUrl = "".concat(urlToUse).concat(params.length ? paramStart : '').concat(params.join('&'));
164
- }
165
- var callback = function callback() {
166
- return _this.setState({
167
- formattedUrl: formattedUrl,
168
- updating: false
169
- });
170
- };
171
- _this.setState({
172
- formattedUrl: null,
173
- updating: true
174
- }, callback);
175
- });
176
- (0, _defineProperty2["default"])(_this, "handleStateChange", function (newState) {
177
- return _this.setState(newState, _this.formatUrl);
178
- });
179
- (0, _defineProperty2["default"])(_this, "checkAudio", function (value) {
180
- if (matchSoundCloudUrl(value)) {
181
- makeApiRequest(value).then(function (urlToUse) {
182
- _this.handleStateChange({
183
- urlToUse: urlToUse,
184
- invalid: !urlToUse,
185
- url: value
186
- });
187
- })["catch"](log);
188
- }
189
- });
190
- (0, _defineProperty2["default"])(_this, "checkVideo", function (value) {
191
- if (matchYoutubeUrl(value)) {
192
- var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
193
- var match = value.match(regExp);
194
- var id = match[2];
195
- var urlToUse = "https://youtube.com/embed/".concat(id);
196
- log('is youtube');
197
- _this.handleStateChange({
198
- urlToUse: urlToUse,
199
- url: value,
200
- invalid: false
201
- });
202
- }
203
- if (matchVimeoUrl(value)) {
204
- var _id = value.replace(/.*vimeo.com\/(.*)/g, '$1');
205
- var _urlToUse2 = "https://player.vimeo.com/video/".concat(_id);
206
- log('is vimeo');
207
- _this.handleStateChange({
208
- urlToUse: _urlToUse2,
209
- url: value,
210
- ends: null,
211
- invalid: false
212
- });
213
- }
214
- if (matchDriveUrl(value)) {
215
- // https://drive.google.com/file/d/11QkK_gUO068amNvZBm9cxZpKX74WYb8q/view
216
- var _id2 = value.replace(/^https:\/\/drive\.google\.com\/(?:file\/d\/|drive\/(?:u\/\d+\/)?folders\/|uc\?id=)([a-zA-Z0-9_-]+)\/.*/, '$1');
217
- var _urlToUse3 = "https://drive.google.com/file/d/".concat(_id2, "/preview");
218
- log('is google drive');
219
- _this.handleStateChange({
220
- urlToUse: _urlToUse3,
221
- url: value,
222
- ends: null,
223
- invalid: false
224
- });
225
- }
226
- });
227
- (0, _defineProperty2["default"])(_this, "urlChange", function (e) {
228
- var _ref4 = e.target || {},
229
- value = _ref4.value;
230
- var type = _this.props.type;
231
- if (type && type === 'audio') {
232
- _this.checkAudio();
233
- return;
234
- } else if (type && type === 'video') {
235
- _this.checkVideo(value);
236
- return;
237
- }
238
- _this.handleStateChange({
239
- urlToUse: null,
240
- url: null,
241
- invalid: true
242
- });
243
- });
244
- (0, _defineProperty2["default"])(_this, "changeHandler", function (type) {
245
- return function (e) {
246
- return _this.handleStateChange((0, _defineProperty2["default"])({}, type, e.target.value));
247
- };
248
- });
249
- (0, _defineProperty2["default"])(_this, "handleDone", function (val) {
250
- var handleClose = _this.props.handleClose;
251
- var _this$state2 = _this.state,
252
- tabValue = _this$state2.tabValue,
253
- fileUpload = _this$state2.fileUpload;
254
- var isInsertURL = tabValue === tabsTypeMap.insertUrl;
255
- if (!val) {
256
- if (fileUpload.url) {
257
- _this.handleRemoveFile();
258
- }
259
- handleClose(val);
260
- return;
261
- }
262
- if (isInsertURL) {
263
- var _this$state3 = _this.state,
264
- ends = _this$state3.ends,
265
- height = _this$state3.height,
266
- url = _this$state3.url,
267
- urlToUse = _this$state3.urlToUse,
268
- formattedUrl = _this$state3.formattedUrl,
269
- starts = _this$state3.starts,
270
- width = _this$state3.width;
271
- handleClose(val, {
272
- tag: 'iframe',
273
- ends: ends,
274
- height: height,
275
- starts: starts,
276
- width: width,
277
- url: url,
278
- urlToUse: urlToUse,
279
- src: formattedUrl
280
- });
281
- return;
282
- }
283
- if (!fileUpload.loading) {
284
- handleClose(val, {
285
- tag: 'audio',
286
- src: fileUpload.url
287
- });
288
- return;
289
- }
290
- _this.setState({
291
- fileUpload: _objectSpread(_objectSpread({}, fileUpload), {}, {
292
- scheduled: true
293
- })
294
- });
295
- });
296
- (0, _defineProperty2["default"])(_this, "handleUploadFile", /*#__PURE__*/function () {
297
- var _ref5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(e) {
298
- var fileChosen, reader;
299
- return _regenerator["default"].wrap(function (_context) {
300
- while (1) switch (_context.prev = _context.next) {
301
- case 0:
302
- e.preventDefault();
303
- _this.setState({
304
- fileUpload: _objectSpread(_objectSpread({}, _this.state.fileUpload), {}, {
305
- error: null,
306
- loading: true
307
- })
308
- });
309
- fileChosen = e.target.files[0];
310
- reader = new FileReader();
311
- reader.onload = function () {
312
- var dataURL = reader.result;
313
- _this.setState({
314
- fileUpload: _objectSpread(_objectSpread({}, _this.state.fileUpload), {}, {
315
- url: dataURL,
316
- mimeType: fileChosen.type
317
- })
318
- });
319
- };
320
- reader.readAsDataURL(fileChosen);
321
- _this.props.uploadSoundSupport.add({
322
- fileChosen: fileChosen,
323
- done: function done(err, src) {
324
- log('done: err:', err);
325
- if (err) {
326
- //eslint-disable-next-line
327
- console.log(err);
328
- _this.setState({
329
- fileUpload: _objectSpread(_objectSpread({}, _this.state.fileUpload), {}, {
330
- scheduled: false,
331
- loading: false,
332
- error: err
333
- })
334
- });
335
- return;
336
- }
337
- var fileUpload = _this.state.fileUpload;
338
- var callback = fileUpload && fileUpload.scheduled ? _this.handleDone.bind(_this, true) : undefined;
339
- _this.setState({
340
- fileUpload: _objectSpread(_objectSpread({}, fileUpload), {}, {
341
- scheduled: false,
342
- loading: false,
343
- url: src
344
- })
345
- }, callback);
346
- }
347
- });
348
- case 1:
349
- case "end":
350
- return _context.stop();
351
- }
352
- }, _callee);
353
- }));
354
- return function (_x) {
355
- return _ref5.apply(this, arguments);
356
- };
357
- }());
358
- (0, _defineProperty2["default"])(_this, "handleRemoveFile", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
359
- return _regenerator["default"].wrap(function (_context2) {
360
- while (1) switch (_context2.prev = _context2.next) {
361
- case 0:
362
- _this.props.uploadSoundSupport["delete"](_this.state.fileUpload.url, function (err) {
363
- if (err) {
364
- //eslint-disable-next-line
365
- console.log(err);
366
- _this.setState({
367
- fileUpload: _objectSpread(_objectSpread({}, _this.state.fileUpload), {}, {
368
- error: err
369
- })
370
- });
371
- }
372
- });
373
-
374
- // we should put it inside uploadSoundSupport.delete but we can leave it here for testing purposes
375
- _this.setState({
376
- fileUpload: _objectSpread(_objectSpread({}, _this.state.fileUpload), {}, {
377
- loading: false,
378
- url: '',
379
- mimeType: ''
380
- })
381
- });
382
- case 1:
383
- case "end":
384
- return _context2.stop();
385
- }
386
- }, _callee2);
387
- })));
388
- var _ends = props.ends,
389
- _height = props.height,
390
- _src = props.src,
391
- _starts = props.starts,
392
- _type = props.type,
393
- uploadSoundSupport = props.uploadSoundSupport,
394
- _url = props.url,
395
- _urlToUse = props.urlToUse,
396
- _width = props.width;
397
- var showUploadFile = (uploadSoundSupport === null || uploadSoundSupport === void 0 ? void 0 : uploadSoundSupport.add) && (uploadSoundSupport === null || uploadSoundSupport === void 0 ? void 0 : uploadSoundSupport["delete"]) && _type !== 'video';
398
- _this.state = {
399
- ends: _ends || 0,
400
- url: _url,
401
- urlToUse: _urlToUse,
402
- formattedUrl: _src,
403
- height: _height || 315,
404
- invalid: false,
405
- starts: _starts || 0,
406
- width: _width || 560,
407
- // default selected tab should be upload file if available
408
- tabValue: showUploadFile ? tabsTypeMap.uploadFile : tabsTypeMap.insertUrl,
409
- fileUpload: {
410
- error: null,
411
- loading: false,
412
- scheduled: false,
413
- url: '',
414
- mimeType: ''
415
- }
416
- };
417
- return _this;
418
- }
419
- (0, _inherits2["default"])(MediaDialog, _React$Component);
420
- return (0, _createClass2["default"])(MediaDialog, [{
421
- key: "componentDidMount",
422
- value: function componentDidMount() {
423
- if (this.props.url) {
424
- this.urlChange({
425
- target: {
426
- value: this.props.url
427
- }
428
- });
429
- }
430
- }
431
- }, {
432
- key: "render",
433
- value: function render() {
434
- var _this2 = this;
435
- var _this$props = this.props,
436
- open = _this$props.open,
437
- disablePortal = _this$props.disablePortal,
438
- type = _this$props.type,
439
- edit = _this$props.edit,
440
- uploadSoundSupport = _this$props.uploadSoundSupport;
441
- var _this$state4 = this.state,
442
- ends = _this$state4.ends,
443
- height = _this$state4.height,
444
- invalid = _this$state4.invalid,
445
- starts = _this$state4.starts,
446
- width = _this$state4.width,
447
- url = _this$state4.url,
448
- mimeType = _this$state4.mimeType,
449
- formattedUrl = _this$state4.formattedUrl,
450
- updating = _this$state4.updating,
451
- tabValue = _this$state4.tabValue,
452
- fileUpload = _this$state4.fileUpload;
453
- var isYoutube = matchYoutubeUrl(url);
454
- var isInsertURL = tabValue === tabsTypeMap.insertUrl;
455
- var isUploadMedia = tabValue === tabsTypeMap.uploadFile;
456
- var submitIsDisabled = isInsertURL ? invalid || url === null || url === undefined : !fileUpload.url || fileUpload.scheduled;
457
- var showUploadFile = (uploadSoundSupport === null || uploadSoundSupport === void 0 ? void 0 : uploadSoundSupport.add) && (uploadSoundSupport === null || uploadSoundSupport === void 0 ? void 0 : uploadSoundSupport["delete"]) && type !== 'video';
458
- return /*#__PURE__*/_react["default"].createElement(StyledDialog, {
459
- disablePortal: disablePortal,
460
- open: open,
461
- onClose: function onClose() {
462
- return _this2.handleDone(false);
463
- },
464
- "aria-labelledby": "form-dialog-title"
465
- }, /*#__PURE__*/_react["default"].createElement(_DialogTitle["default"], {
466
- id: "form-dialog-title"
467
- }, "Insert ", typeMap[type]), /*#__PURE__*/_react["default"].createElement(_DialogContent["default"], null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(StyledRow, null, /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
468
- indicatorColor: "primary",
469
- value: tabValue,
470
- onChange: function onChange(event, value) {
471
- _this2.setState({
472
- tabValue: value
473
- });
474
- }
475
- }, showUploadFile ? /*#__PURE__*/_react["default"].createElement(_Tab["default"], {
476
- value: tabsTypeMap.uploadFile,
477
- label: "Upload file"
478
- }) : null, /*#__PURE__*/_react["default"].createElement(_Tab["default"], {
479
- value: tabsTypeMap.insertUrl,
480
- label: type === 'video' ? 'Insert YouTube, Vimeo, or Google Drive URL' : 'Insert SoundCloud URL'
481
- }))), isInsertURL && /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
482
- autoFocus: true,
483
- error: invalid,
484
- helperText: invalid ? 'Invalid URL' : '',
485
- margin: "dense",
486
- id: "name",
487
- label: "URL",
488
- placeholder: "Paste URL of ".concat(type, "..."),
489
- type: "text",
490
- onChange: this.urlChange,
491
- value: url,
492
- fullWidth: true
493
- }), type === 'video' && /*#__PURE__*/_react["default"].createElement(StyledDialogContent, {
494
- className: "properties"
495
- }, /*#__PURE__*/_react["default"].createElement(_DialogContentText["default"], null, "Video Properties"), /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
496
- autoFocus: true,
497
- margin: "dense",
498
- id: "width",
499
- label: "Width",
500
- type: "number",
501
- placeholder: "Width",
502
- value: width,
503
- onChange: this.changeHandler('width')
504
- }), /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
505
- autoFocus: true,
506
- margin: "dense",
507
- id: "height",
508
- label: "Height",
509
- type: "number",
510
- placeholder: "Height",
511
- value: height,
512
- onChange: this.changeHandler('height')
513
- })), formattedUrl && /*#__PURE__*/_react["default"].createElement("iframe", {
514
- width: width,
515
- height: height,
516
- src: formattedUrl,
517
- frameBorder: "0",
518
- allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
519
- allowFullScreen: true
520
- }), type === 'video' && (formattedUrl || updating) && !invalid && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledDialogContent, {
521
- className: "properties"
522
- }, /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
523
- autoFocus: true,
524
- margin: "dense",
525
- id: "starts",
526
- label: "Starts",
527
- type: "number",
528
- placeholder: "Starts",
529
- value: starts,
530
- onChange: this.changeHandler('starts')
531
- }), isYoutube && /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
532
- autoFocus: true,
533
- margin: "dense",
534
- id: "ends",
535
- label: "Ends",
536
- type: "number",
537
- placeholder: "Ends",
538
- value: ends,
539
- onChange: this.changeHandler('ends')
540
- })))), isUploadMedia && /*#__PURE__*/_react["default"].createElement(StyledUploadInput, null, /*#__PURE__*/_react["default"].createElement("div", null, fileUpload.url ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledRow, null, /*#__PURE__*/_react["default"].createElement("audio", {
541
- controls: "controls",
542
- controlsList: "nodownload"
543
- }, /*#__PURE__*/_react["default"].createElement("source", {
544
- type: mimeType,
545
- src: fileUpload.url
546
- })), /*#__PURE__*/_react["default"].createElement(StyledDeleteIcon, {
547
- "aria-label": "delete",
548
- onClick: this.handleRemoveFile,
549
- size: "large"
550
- }, /*#__PURE__*/_react["default"].createElement(_Delete["default"], null))), !fileUpload.scheduled && fileUpload.loading ? /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
551
- variant: "subheading"
552
- }, "Loading...") : null, fileUpload.scheduled ? /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
553
- variant: "subheading"
554
- }, "Waiting for Upload to finish, then inserting item...") : null) : !fileUpload.loading ? /*#__PURE__*/_react["default"].createElement("input", {
555
- accept: "audio/*",
556
- onChange: this.handleUploadFile,
557
- type: "file"
558
- }) : null, !!fileUpload.error && /*#__PURE__*/_react["default"].createElement(StyledError, {
559
- variant: "caption"
560
- }, fileUpload.error))))), /*#__PURE__*/_react["default"].createElement(_DialogActions["default"], null, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
561
- onClick: function onClick() {
562
- return _this2.handleDone(false);
563
- },
564
- color: "primary"
565
- }, "Cancel"), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
566
- disabled: submitIsDisabled,
567
- onClick: function onClick() {
568
- return _this2.handleDone(true);
569
- },
570
- color: "primary"
571
- }, edit ? 'Update' : 'Insert')));
572
- }
573
- }]);
574
- }(_react["default"].Component);
575
- (0, _defineProperty2["default"])(MediaDialog, "propTypes", {
576
- open: _propTypes["default"].bool,
577
- edit: _propTypes["default"].bool,
578
- disablePortal: _propTypes["default"].bool,
579
- handleClose: _propTypes["default"].func,
580
- uploadSoundSupport: _propTypes["default"].shape({
581
- add: _propTypes["default"].func,
582
- "delete": _propTypes["default"].func
583
- }),
584
- type: _propTypes["default"].string,
585
- src: _propTypes["default"].string,
586
- url: _propTypes["default"].string,
587
- urlToUse: _propTypes["default"].string,
588
- starts: _propTypes["default"].number,
589
- ends: _propTypes["default"].number,
590
- height: _propTypes["default"].number,
591
- width: _propTypes["default"].number
592
- });
593
- var _default = exports["default"] = MediaDialog;
594
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfZGVidWciLCJfc3R5bGVzIiwiX0J1dHRvbiIsIl9EaWFsb2ciLCJfVGFicyIsIl9UYWIiLCJfRGlhbG9nVGl0bGUiLCJfRGlhbG9nQ29udGVudCIsIl9EaWFsb2dDb250ZW50VGV4dCIsIl9EaWFsb2dBY3Rpb25zIiwiX1RleHRGaWVsZCIsIl9UeXBvZ3JhcGh5IiwiX0ljb25CdXR0b24iLCJfRGVsZXRlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJsb2ciLCJkZWJ1ZyIsIm1hdGNoWW91dHViZVVybCIsInVybCIsInAiLCJtYXRjaCIsIm1hdGNoVmltZW9VcmwiLCJ0ZXN0IiwibWF0Y2hEcml2ZVVybCIsIm1hdGNoU291bmRDbG91ZFVybCIsInJlZ2V4cCIsIm1ha2VBcGlSZXF1ZXN0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJmZXRjaCIsImNvbmNhdCIsInRoZW4iLCJyZXNwb25zZSIsImpzb24iLCJkIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwiaHRtbCIsImlmcmFtZSIsInF1ZXJ5U2VsZWN0b3IiLCJzcmMiLCJlcnIiLCJ0eXBlTWFwIiwidmlkZW8iLCJhdWRpbyIsInRhYnNUeXBlTWFwIiwidXBsb2FkRmlsZSIsImluc2VydFVybCIsIlN0eWxlZERpYWxvZyIsInN0eWxlZCIsIkRpYWxvZyIsIm1pbldpZHRoIiwiU3R5bGVkRGlhbG9nQ29udGVudCIsIkRpYWxvZ0NvbnRlbnQiLCJwYWRkaW5nIiwiU3R5bGVkUm93IiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJTdHlsZWRVcGxvYWRJbnB1dCIsIl9yZWYiLCJ0aGVtZSIsIm1hcmdpblRvcCIsInNwYWNpbmciLCJTdHlsZWRFcnJvciIsIlR5cG9ncmFwaHkiLCJfcmVmMiIsImNvbG9yIiwicGFsZXR0ZSIsImVycm9yIiwibWFpbiIsIlN0eWxlZERlbGV0ZUljb24iLCJJY29uQnV0dG9uIiwiX3JlZjMiLCJtYXJnaW5MZWZ0IiwiTWVkaWFEaWFsb2ciLCJleHBvcnRzIiwiX1JlYWN0JENvbXBvbmVudCIsInByb3BzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX3RoaXMkc3RhdGUiLCJzdGF0ZSIsInVybFRvVXNlIiwic3RhcnRzIiwiZW5kcyIsImlzWW91dHViZSIsImlzVmltZW8iLCJmb3JtYXR0ZWRVcmwiLCJwYXJhbXMiLCJwYXJhbU5hbWUiLCJwYXJhbVN0YXJ0Iiwiam9pbiIsImNhbGxiYWNrIiwic2V0U3RhdGUiLCJ1cGRhdGluZyIsIm5ld1N0YXRlIiwiZm9ybWF0VXJsIiwidmFsdWUiLCJoYW5kbGVTdGF0ZUNoYW5nZSIsImludmFsaWQiLCJyZWdFeHAiLCJpZCIsInJlcGxhY2UiLCJfcmVmNCIsInRhcmdldCIsInR5cGUiLCJjaGVja0F1ZGlvIiwiY2hlY2tWaWRlbyIsInZhbCIsImhhbmRsZUNsb3NlIiwiX3RoaXMkc3RhdGUyIiwidGFiVmFsdWUiLCJmaWxlVXBsb2FkIiwiaXNJbnNlcnRVUkwiLCJoYW5kbGVSZW1vdmVGaWxlIiwiX3RoaXMkc3RhdGUzIiwiaGVpZ2h0Iiwid2lkdGgiLCJ0YWciLCJsb2FkaW5nIiwic2NoZWR1bGVkIiwiX3JlZjUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImZpbGVDaG9zZW4iLCJyZWFkZXIiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInByZXZlbnREZWZhdWx0IiwiZmlsZXMiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwiZGF0YVVSTCIsInJlc3VsdCIsIm1pbWVUeXBlIiwicmVhZEFzRGF0YVVSTCIsInVwbG9hZFNvdW5kU3VwcG9ydCIsImFkZCIsImRvbmUiLCJjb25zb2xlIiwiaGFuZGxlRG9uZSIsImJpbmQiLCJ1bmRlZmluZWQiLCJzdG9wIiwiX3giLCJfY2FsbGVlMiIsIl9jb250ZXh0MiIsInNob3dVcGxvYWRGaWxlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJjb21wb25lbnREaWRNb3VudCIsInVybENoYW5nZSIsInJlbmRlciIsIl90aGlzMiIsIl90aGlzJHByb3BzIiwib3BlbiIsImRpc2FibGVQb3J0YWwiLCJlZGl0IiwiX3RoaXMkc3RhdGU0IiwiaXNVcGxvYWRNZWRpYSIsInN1Ym1pdElzRGlzYWJsZWQiLCJvbkNsb3NlIiwiaW5kaWNhdG9yQ29sb3IiLCJvbkNoYW5nZSIsImV2ZW50IiwibGFiZWwiLCJhdXRvRm9jdXMiLCJoZWxwZXJUZXh0IiwibWFyZ2luIiwicGxhY2Vob2xkZXIiLCJmdWxsV2lkdGgiLCJjbGFzc05hbWUiLCJjaGFuZ2VIYW5kbGVyIiwiZnJhbWVCb3JkZXIiLCJhbGxvdyIsImFsbG93RnVsbFNjcmVlbiIsIkZyYWdtZW50IiwiY29udHJvbHMiLCJjb250cm9sc0xpc3QiLCJvbkNsaWNrIiwic2l6ZSIsInZhcmlhbnQiLCJhY2NlcHQiLCJoYW5kbGVVcGxvYWRGaWxlIiwiZGlzYWJsZWQiLCJSZWFjdCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImJvb2wiLCJmdW5jIiwic2hhcGUiLCJzdHJpbmciLCJudW1iZXIiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL21lZGlhL21lZGlhLWRpYWxvZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BtdWkvbWF0ZXJpYWwvQnV0dG9uJztcbmltcG9ydCBEaWFsb2cgZnJvbSAnQG11aS9tYXRlcmlhbC9EaWFsb2cnO1xuaW1wb3J0IE11aVRhYnMgZnJvbSAnQG11aS9tYXRlcmlhbC9UYWJzJztcbmltcG9ydCBNdWlUYWIgZnJvbSAnQG11aS9tYXRlcmlhbC9UYWInO1xuaW1wb3J0IERpYWxvZ1RpdGxlIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRGlhbG9nVGl0bGUnO1xuaW1wb3J0IERpYWxvZ0NvbnRlbnQgZnJvbSAnQG11aS9tYXRlcmlhbC9EaWFsb2dDb250ZW50JztcbmltcG9ydCBEaWFsb2dDb250ZW50VGV4dCBmcm9tICdAbXVpL21hdGVyaWFsL0RpYWxvZ0NvbnRlbnRUZXh0JztcbmltcG9ydCBEaWFsb2dBY3Rpb25zIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRGlhbG9nQWN0aW9ucyc7XG5pbXBvcnQgVGV4dEZpZWxkIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGV4dEZpZWxkJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJ0BtdWkvbWF0ZXJpYWwvVHlwb2dyYXBoeSc7XG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tICdAbXVpL21hdGVyaWFsL0ljb25CdXR0b24nO1xuaW1wb3J0IEFjdGlvbkRlbGV0ZSBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0RlbGV0ZSc7XG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdAcGllLWxpYjplZGl0YWJsZS1odG1sOnBsdWdpbnM6bWVkaWE6ZGlhbG9nJyk7XG5cbmNvbnN0IG1hdGNoWW91dHViZVVybCA9ICh1cmwpID0+IHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwID0gL14oPzpodHRwcz86XFwvXFwvKT8oPzptXFwufHd3d1xcLik/KD86eW91dHVcXC5iZVxcL3x5b3V0dWJlXFwuY29tXFwvKD86ZW1iZWRcXC98dlxcL3x3YXRjaFxcP3Y9fHdhdGNoXFw/Lismdj0pKSgoXFx3fC0pezExfSkoPzpcXFMrKT8kLztcbiAgaWYgKHVybC5tYXRjaChwKSkge1xuICAgIHJldHVybiB1cmwubWF0Y2gocClbMV07XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgbWF0Y2hWaW1lb1VybCA9ICh1cmwpID0+XG4gIHVybCAmJlxuICAvKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwuKT8ocGxheWVyXFwuKT92aW1lby5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfCkodmlkZW9cXC8pPyhcXGQrKSg/OnxcXC9cXD8pLy50ZXN0KFxuICAgIHVybCxcbiAgKTtcblxuY29uc3QgbWF0Y2hEcml2ZVVybCA9ICh1cmwpID0+XG4gIHVybCAmJiAvXmh0dHBzOlxcL1xcL2RyaXZlXFwuZ29vZ2xlXFwuY29tXFwvKD86ZmlsZVxcL2RcXC98ZHJpdmVcXC8oPzp1XFwvXFxkK1xcLyk/Zm9sZGVyc1xcL3x1Y1xcP2lkPSkoW2EtekEtWjAtOV8tXSspLy50ZXN0KHVybCk7XG5cbmNvbnN0IG1hdGNoU291bmRDbG91ZFVybCA9ICh1cmwpID0+IHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCByZWdleHAgPSAvXmh0dHBzPzpcXC9cXC8oc291bmRjbG91ZFxcLmNvbXxzbmRcXC5zYylcXC8oLiopJC87XG4gIHJldHVybiB1cmwubWF0Y2gocmVnZXhwKSAmJiB1cmwubWF0Y2gocmVnZXhwKVsyXTtcbn07XG5cbmNvbnN0IG1ha2VBcGlSZXF1ZXN0ID0gKHVybCkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICB0cnkge1xuICAgICAgZmV0Y2goYGh0dHBzOi8vc291bmRjbG91ZC5jb20vb2VtYmVkP2Zvcm1hdD1qc29uJnVybD0ke3VybH1gKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICBkLmlubmVySFRNTCA9IGpzb24uaHRtbDtcblxuICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGQucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG5cbiAgICAgICAgICByZXNvbHZlKGlmcmFtZS5zcmMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgIGxvZyhlcnIpO1xuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc29sdmUoJycpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCB0eXBlTWFwID0ge1xuICB2aWRlbzogJ1ZpZGVvJyxcbiAgYXVkaW86ICdBdWRpbycsXG59O1xuXG5jb25zdCB0YWJzVHlwZU1hcCA9IHtcbiAgdXBsb2FkRmlsZTogJ3VwbG9hZC1maWxlJyxcbiAgaW5zZXJ0VXJsOiAnaW5zZXJ0LXVybCcsXG59O1xuXG5jb25zdCBTdHlsZWREaWFsb2cgPSBzdHlsZWQoRGlhbG9nKSgoKSA9PiAoe1xuICAnJiAuTXVpUGFwZXItcm9vdCc6IHtcbiAgICBtaW5XaWR0aDogJzUwMHB4JyxcbiAgfSxcbn0pKTtcblxuY29uc3QgU3R5bGVkRGlhbG9nQ29udGVudCA9IHN0eWxlZChEaWFsb2dDb250ZW50KSgoKSA9PiAoe1xuICAnJi5wcm9wZXJ0aWVzJzoge1xuICAgIHBhZGRpbmc6IDAsXG4gIH0sXG59KSk7XG5cbmNvbnN0IFN0eWxlZFJvdyA9IHN0eWxlZCgnZGl2JykoKCkgPT4gKHtcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBmbGV4RGlyZWN0aW9uOiAnc3BhY2UtYmV0d2VlbicsXG59KSk7XG5cbmNvbnN0IFN0eWxlZFVwbG9hZElucHV0ID0gc3R5bGVkKCdkaXYnKSgoeyB0aGVtZSB9KSA9PiAoe1xuICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcoMS41KSxcbn0pKTtcblxuY29uc3QgU3R5bGVkRXJyb3IgPSBzdHlsZWQoVHlwb2dyYXBoeSkoKHsgdGhlbWUgfSkgPT4gKHtcbiAgbWFyZ2luVG9wOiB0aGVtZS5zcGFjaW5nKDEuNSksXG4gIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG59KSk7XG5cbmNvbnN0IFN0eWxlZERlbGV0ZUljb24gPSBzdHlsZWQoSWNvbkJ1dHRvbikoKHsgdGhlbWUgfSkgPT4gKHtcbiAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygxLjUpLFxufSkpO1xuXG5leHBvcnQgY2xhc3MgTWVkaWFEaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIG9wZW46IFByb3BUeXBlcy5ib29sLFxuICAgIGVkaXQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGRpc2FibGVQb3J0YWw6IFByb3BUeXBlcy5ib29sLFxuICAgIGhhbmRsZUNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICB1cGxvYWRTb3VuZFN1cHBvcnQ6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBhZGQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgZGVsZXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICB9KSxcbiAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNyYzogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB1cmw6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdXJsVG9Vc2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgc3RhcnRzOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGVuZHM6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgY29uc3QgeyBlbmRzLCBoZWlnaHQsIHNyYywgc3RhcnRzLCB0eXBlLCB1cGxvYWRTb3VuZFN1cHBvcnQsIHVybCwgdXJsVG9Vc2UsIHdpZHRoIH0gPSBwcm9wcztcbiAgICBjb25zdCBzaG93VXBsb2FkRmlsZSA9IHVwbG9hZFNvdW5kU3VwcG9ydD8uYWRkICYmIHVwbG9hZFNvdW5kU3VwcG9ydD8uZGVsZXRlICYmIHR5cGUgIT09ICd2aWRlbyc7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZW5kczogZW5kcyB8fCAwLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICB1cmxUb1VzZTogdXJsVG9Vc2UsXG4gICAgICBmb3JtYXR0ZWRVcmw6IHNyYyxcbiAgICAgIGhlaWdodDogaGVpZ2h0IHx8IDMxNSxcbiAgICAgIGludmFsaWQ6IGZhbHNlLFxuICAgICAgc3RhcnRzOiBzdGFydHMgfHwgMCxcbiAgICAgIHdpZHRoOiB3aWR0aCB8fCA1NjAsXG4gICAgICAvLyBkZWZhdWx0IHNlbGVjdGVkIHRhYiBzaG91bGQgYmUgdXBsb2FkIGZpbGUgaWYgYXZhaWxhYmxlXG4gICAgICB0YWJWYWx1ZTogc2hvd1VwbG9hZEZpbGUgPyB0YWJzVHlwZU1hcC51cGxvYWRGaWxlIDogdGFic1R5cGVNYXAuaW5zZXJ0VXJsLFxuICAgICAgZmlsZVVwbG9hZDoge1xuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgIHNjaGVkdWxlZDogZmFsc2UsXG4gICAgICAgIHVybDogJycsXG4gICAgICAgIG1pbWVUeXBlOiAnJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLnVybCkge1xuICAgICAgdGhpcy51cmxDaGFuZ2Uoe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5wcm9wcy51cmwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRVcmwgPSAoKSA9PiB7XG4gICAgY29uc3QgeyB1cmwsIHVybFRvVXNlLCBzdGFydHMsIGVuZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXNZb3V0dWJlID0gbWF0Y2hZb3V0dWJlVXJsKHVybCk7XG4gICAgY29uc3QgaXNWaW1lbyA9IG1hdGNoVmltZW9VcmwodXJsKTtcbiAgICBsZXQgZm9ybWF0dGVkVXJsID0gdXJsVG9Vc2U7XG5cbiAgICBpZiAoKGlzWW91dHViZSB8fCBpc1ZpbWVvKSAmJiB1cmxUb1VzZSkge1xuICAgICAgY29uc3QgcGFyYW1zID0gW107XG5cbiAgICAgIGxldCBwYXJhbU5hbWU7XG4gICAgICBsZXQgcGFyYW1TdGFydDtcblxuICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgIGNhc2UgaXNWaW1lbzpcbiAgICAgICAgICBwYXJhbU5hbWUgPSAndCc7XG4gICAgICAgICAgcGFyYW1TdGFydCA9ICcjJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBpc1lvdXR1YmU6XG4gICAgICAgICAgcGFyYW1OYW1lID0gJ3N0YXJ0JztcbiAgICAgICAgICBwYXJhbVN0YXJ0ID0gJz8nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHBhcmFtTmFtZSA9ICdzdGFydCc7XG4gICAgICAgICAgcGFyYW1TdGFydCA9ICc/JztcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0cykge1xuICAgICAgICBwYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9PSR7c3RhcnRzfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5kcykge1xuICAgICAgICBwYXJhbXMucHVzaChgZW5kPSR7ZW5kc31gKTtcbiAgICAgIH1cblxuICAgICAgZm9ybWF0dGVkVXJsID0gYCR7dXJsVG9Vc2V9JHtwYXJhbXMubGVuZ3RoID8gcGFyYW1TdGFydCA6ICcnfSR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGZvcm1hdHRlZFVybCwgdXBkYXRpbmc6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZvcm1hdHRlZFVybDogbnVsbCwgdXBkYXRpbmc6IHRydWUgfSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIGhhbmRsZVN0YXRlQ2hhbmdlID0gKG5ld1N0YXRlKSA9PiB0aGlzLnNldFN0YXRlKG5ld1N0YXRlLCB0aGlzLmZvcm1hdFVybCk7XG5cbiAgY2hlY2tBdWRpbyA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmIChtYXRjaFNvdW5kQ2xvdWRVcmwodmFsdWUpKSB7XG4gICAgICBtYWtlQXBpUmVxdWVzdCh2YWx1ZSlcbiAgICAgICAgLnRoZW4oKHVybFRvVXNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgICB1cmxUb1VzZSxcbiAgICAgICAgICAgIGludmFsaWQ6ICF1cmxUb1VzZSxcbiAgICAgICAgICAgIHVybDogdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChsb2cpO1xuICAgIH1cbiAgfTtcblxuICBjaGVja1ZpZGVvID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKG1hdGNoWW91dHViZVVybCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHJlZ0V4cCA9IC9eLiooeW91dHVcXC5iZVxcL3x2XFwvfHVcXC9cXHdcXC98ZW1iZWRcXC98d2F0Y2hcXD92PXwmdj0pKFteIyY/XSopLiovO1xuICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaChyZWdFeHApO1xuICAgICAgY29uc3QgaWQgPSBtYXRjaFsyXTtcbiAgICAgIGNvbnN0IHVybFRvVXNlID0gYGh0dHBzOi8veW91dHViZS5jb20vZW1iZWQvJHtpZH1gO1xuXG4gICAgICBsb2coJ2lzIHlvdXR1YmUnKTtcblxuICAgICAgdGhpcy5oYW5kbGVTdGF0ZUNoYW5nZSh7XG4gICAgICAgIHVybFRvVXNlLFxuICAgICAgICB1cmw6IHZhbHVlLFxuICAgICAgICBpbnZhbGlkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtYXRjaFZpbWVvVXJsKHZhbHVlKSkge1xuICAgICAgY29uc3QgaWQgPSB2YWx1ZS5yZXBsYWNlKC8uKnZpbWVvLmNvbVxcLyguKikvZywgJyQxJyk7XG4gICAgICBjb25zdCB1cmxUb1VzZSA9IGBodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vJHtpZH1gO1xuXG4gICAgICBsb2coJ2lzIHZpbWVvJyk7XG5cbiAgICAgIHRoaXMuaGFuZGxlU3RhdGVDaGFuZ2Uoe1xuICAgICAgICB1cmxUb1VzZSxcbiAgICAgICAgdXJsOiB2YWx1ZSxcbiAgICAgICAgZW5kczogbnVsbCxcbiAgICAgICAgaW52YWxpZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hEcml2ZVVybCh2YWx1ZSkpIHtcbiAgICAgIC8vIGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9maWxlL2QvMTFRa0tfZ1VPMDY4YW1OdlpCbTljeFpwS1g3NFdZYjhxL3ZpZXdcbiAgICAgIGNvbnN0IGlkID0gdmFsdWUucmVwbGFjZShcbiAgICAgICAgL15odHRwczpcXC9cXC9kcml2ZVxcLmdvb2dsZVxcLmNvbVxcLyg/OmZpbGVcXC9kXFwvfGRyaXZlXFwvKD86dVxcL1xcZCtcXC8pP2ZvbGRlcnNcXC98dWNcXD9pZD0pKFthLXpBLVowLTlfLV0rKVxcLy4qLyxcbiAgICAgICAgJyQxJyxcbiAgICAgICk7XG4gICAgICBjb25zdCB1cmxUb1VzZSA9IGBodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLyR7aWR9L3ByZXZpZXdgO1xuXG4gICAgICBsb2coJ2lzIGdvb2dsZSBkcml2ZScpO1xuXG4gICAgICB0aGlzLmhhbmRsZVN0YXRlQ2hhbmdlKHtcbiAgICAgICAgdXJsVG9Vc2UsXG4gICAgICAgIHVybDogdmFsdWUsXG4gICAgICAgIGVuZHM6IG51bGwsXG4gICAgICAgIGludmFsaWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHVybENoYW5nZSA9IChlKSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gZS50YXJnZXQgfHwge307XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHR5cGUgJiYgdHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgdGhpcy5jaGVja0F1ZGlvKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0eXBlICYmIHR5cGUgPT09ICd2aWRlbycpIHtcbiAgICAgIHRoaXMuY2hlY2tWaWRlbyh2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVTdGF0ZUNoYW5nZSh7XG4gICAgICB1cmxUb1VzZTogbnVsbCxcbiAgICAgIHVybDogbnVsbCxcbiAgICAgIGludmFsaWQ6IHRydWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY2hhbmdlSGFuZGxlciA9ICh0eXBlKSA9PiAoZSkgPT4gdGhpcy5oYW5kbGVTdGF0ZUNoYW5nZSh7IFt0eXBlXTogZS50YXJnZXQudmFsdWUgfSk7XG5cbiAgaGFuZGxlRG9uZSA9ICh2YWwpID0+IHtcbiAgICBjb25zdCB7IGhhbmRsZUNsb3NlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgdGFiVmFsdWUsIGZpbGVVcGxvYWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXNJbnNlcnRVUkwgPSB0YWJWYWx1ZSA9PT0gdGFic1R5cGVNYXAuaW5zZXJ0VXJsO1xuXG4gICAgaWYgKCF2YWwpIHtcbiAgICAgIGlmIChmaWxlVXBsb2FkLnVybCkge1xuICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZUZpbGUoKTtcbiAgICAgIH1cblxuICAgICAgaGFuZGxlQ2xvc2UodmFsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNJbnNlcnRVUkwpIHtcbiAgICAgIGNvbnN0IHsgZW5kcywgaGVpZ2h0LCB1cmwsIHVybFRvVXNlLCBmb3JtYXR0ZWRVcmwsIHN0YXJ0cywgd2lkdGggfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGhhbmRsZUNsb3NlKHZhbCwge1xuICAgICAgICB0YWc6ICdpZnJhbWUnLFxuICAgICAgICBlbmRzLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHN0YXJ0cyxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIHVybCxcbiAgICAgICAgdXJsVG9Vc2UsXG4gICAgICAgIHNyYzogZm9ybWF0dGVkVXJsLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlVXBsb2FkLmxvYWRpbmcpIHtcbiAgICAgIGhhbmRsZUNsb3NlKHZhbCwge1xuICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgIHNyYzogZmlsZVVwbG9hZC51cmwsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGZpbGVVcGxvYWQ6IHtcbiAgICAgICAgLi4uZmlsZVVwbG9hZCxcbiAgICAgICAgc2NoZWR1bGVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBoYW5kbGVVcGxvYWRGaWxlID0gYXN5bmMgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGZpbGVVcGxvYWQ6IHtcbiAgICAgICAgLi4udGhpcy5zdGF0ZS5maWxlVXBsb2FkLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBmaWxlQ2hvc2VuID0gZS50YXJnZXQuZmlsZXNbMF07XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFVUkwgPSByZWFkZXIucmVzdWx0O1xuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZmlsZVVwbG9hZDoge1xuICAgICAgICAgIC4uLnRoaXMuc3RhdGUuZmlsZVVwbG9hZCxcbiAgICAgICAgICB1cmw6IGRhdGFVUkwsXG4gICAgICAgICAgbWltZVR5cGU6IGZpbGVDaG9zZW4udHlwZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUNob3Nlbik7XG5cbiAgICB0aGlzLnByb3BzLnVwbG9hZFNvdW5kU3VwcG9ydC5hZGQoe1xuICAgICAgZmlsZUNob3NlbixcbiAgICAgIGRvbmU6IChlcnIsIHNyYykgPT4ge1xuICAgICAgICBsb2coJ2RvbmU6IGVycjonLCBlcnIpO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZmlsZVVwbG9hZDoge1xuICAgICAgICAgICAgICAuLi50aGlzLnN0YXRlLmZpbGVVcGxvYWQsXG4gICAgICAgICAgICAgIHNjaGVkdWxlZDogZmFsc2UsXG4gICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGZpbGVVcGxvYWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gZmlsZVVwbG9hZCAmJiBmaWxlVXBsb2FkLnNjaGVkdWxlZCA/IHRoaXMuaGFuZGxlRG9uZS5iaW5kKHRoaXMsIHRydWUpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZVVwbG9hZDoge1xuICAgICAgICAgICAgICAuLi5maWxlVXBsb2FkLFxuICAgICAgICAgICAgICBzY2hlZHVsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgdXJsOiBzcmMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIGhhbmRsZVJlbW92ZUZpbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgdGhpcy5wcm9wcy51cGxvYWRTb3VuZFN1cHBvcnQuZGVsZXRlKHRoaXMuc3RhdGUuZmlsZVVwbG9hZC51cmwsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZmlsZVVwbG9hZDoge1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZS5maWxlVXBsb2FkLFxuICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHdlIHNob3VsZCBwdXQgaXQgaW5zaWRlIHVwbG9hZFNvdW5kU3VwcG9ydC5kZWxldGUgYnV0IHdlIGNhbiBsZWF2ZSBpdCBoZXJlIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBmaWxlVXBsb2FkOiB7XG4gICAgICAgIC4uLnRoaXMuc3RhdGUuZmlsZVVwbG9hZCxcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgIHVybDogJycsXG4gICAgICAgIG1pbWVUeXBlOiAnJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgb3BlbiwgZGlzYWJsZVBvcnRhbCwgdHlwZSwgZWRpdCwgdXBsb2FkU291bmRTdXBwb3J0IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIGVuZHMsXG4gICAgICBoZWlnaHQsXG4gICAgICBpbnZhbGlkLFxuICAgICAgc3RhcnRzLFxuICAgICAgd2lkdGgsXG4gICAgICB1cmwsXG4gICAgICBtaW1lVHlwZSxcbiAgICAgIGZvcm1hdHRlZFVybCxcbiAgICAgIHVwZGF0aW5nLFxuICAgICAgdGFiVmFsdWUsXG4gICAgICBmaWxlVXBsb2FkLFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGlzWW91dHViZSA9IG1hdGNoWW91dHViZVVybCh1cmwpO1xuICAgIGNvbnN0IGlzSW5zZXJ0VVJMID0gdGFiVmFsdWUgPT09IHRhYnNUeXBlTWFwLmluc2VydFVybDtcbiAgICBjb25zdCBpc1VwbG9hZE1lZGlhID0gdGFiVmFsdWUgPT09IHRhYnNUeXBlTWFwLnVwbG9hZEZpbGU7XG4gICAgY29uc3Qgc3VibWl0SXNEaXNhYmxlZCA9IGlzSW5zZXJ0VVJMXG4gICAgICA/IGludmFsaWQgfHwgdXJsID09PSBudWxsIHx8IHVybCA9PT0gdW5kZWZpbmVkXG4gICAgICA6ICFmaWxlVXBsb2FkLnVybCB8fCBmaWxlVXBsb2FkLnNjaGVkdWxlZDtcbiAgICBjb25zdCBzaG93VXBsb2FkRmlsZSA9IHVwbG9hZFNvdW5kU3VwcG9ydD8uYWRkICYmIHVwbG9hZFNvdW5kU3VwcG9ydD8uZGVsZXRlICYmIHR5cGUgIT09ICd2aWRlbyc7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZERpYWxvZ1xuICAgICAgICBkaXNhYmxlUG9ydGFsPXtkaXNhYmxlUG9ydGFsfVxuICAgICAgICBvcGVuPXtvcGVufVxuICAgICAgICBvbkNsb3NlPXsoKSA9PiB0aGlzLmhhbmRsZURvbmUoZmFsc2UpfVxuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJmb3JtLWRpYWxvZy10aXRsZVwiXG4gICAgICA+XG4gICAgICAgIDxEaWFsb2dUaXRsZSBpZD1cImZvcm0tZGlhbG9nLXRpdGxlXCI+SW5zZXJ0IHt0eXBlTWFwW3R5cGVdfTwvRGlhbG9nVGl0bGU+XG4gICAgICAgIDxEaWFsb2dDb250ZW50PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8U3R5bGVkUm93PlxuICAgICAgICAgICAgICA8TXVpVGFic1xuICAgICAgICAgICAgICAgIGluZGljYXRvckNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e3RhYlZhbHVlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdGFiVmFsdWU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7c2hvd1VwbG9hZEZpbGUgPyA8TXVpVGFiIHZhbHVlPXt0YWJzVHlwZU1hcC51cGxvYWRGaWxlfSBsYWJlbD1cIlVwbG9hZCBmaWxlXCIgLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgIDxNdWlUYWJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXt0YWJzVHlwZU1hcC5pbnNlcnRVcmx9XG4gICAgICAgICAgICAgICAgICBsYWJlbD17dHlwZSA9PT0gJ3ZpZGVvJyA/ICdJbnNlcnQgWW91VHViZSwgVmltZW8sIG9yIEdvb2dsZSBEcml2ZSBVUkwnIDogJ0luc2VydCBTb3VuZENsb3VkIFVSTCd9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9NdWlUYWJzPlxuICAgICAgICAgICAgPC9TdHlsZWRSb3c+XG4gICAgICAgICAgICB7aXNJbnNlcnRVUkwgJiYgKFxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgICAgZXJyb3I9e2ludmFsaWR9XG4gICAgICAgICAgICAgICAgICBoZWxwZXJUZXh0PXtpbnZhbGlkID8gJ0ludmFsaWQgVVJMJyA6ICcnfVxuICAgICAgICAgICAgICAgICAgbWFyZ2luPVwiZGVuc2VcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiVVJMXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtgUGFzdGUgVVJMIG9mICR7dHlwZX0uLi5gfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMudXJsQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e3VybH1cbiAgICAgICAgICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAge3R5cGUgPT09ICd2aWRlbycgJiYgKFxuICAgICAgICAgICAgICAgICAgPFN0eWxlZERpYWxvZ0NvbnRlbnQgY2xhc3NOYW1lPVwicHJvcGVydGllc1wiPlxuICAgICAgICAgICAgICAgICAgICA8RGlhbG9nQ29udGVudFRleHQ+VmlkZW8gUHJvcGVydGllczwvRGlhbG9nQ29udGVudFRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICBtYXJnaW49XCJkZW5zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ3aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3dpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmNoYW5nZUhhbmRsZXIoJ3dpZHRoJyl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICBtYXJnaW49XCJkZW5zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJoZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2hlaWdodH1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5jaGFuZ2VIYW5kbGVyKCdoZWlnaHQnKX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRGlhbG9nQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHtmb3JtYXR0ZWRVcmwgJiYgKFxuICAgICAgICAgICAgICAgICAgPGlmcmFtZVxuICAgICAgICAgICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD17aGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgICBzcmM9e2Zvcm1hdHRlZFVybH1cbiAgICAgICAgICAgICAgICAgICAgZnJhbWVCb3JkZXI9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgYWxsb3c9XCJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dGdWxsU2NyZWVuXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge3R5cGUgPT09ICd2aWRlbycgJiYgKGZvcm1hdHRlZFVybCB8fCB1cGRhdGluZykgJiYgIWludmFsaWQgJiYgKFxuICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkRGlhbG9nQ29udGVudCBjbGFzc05hbWU9XCJwcm9wZXJ0aWVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW49XCJkZW5zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInN0YXJ0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlN0YXJ0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU3RhcnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzdGFydHN9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5jaGFuZ2VIYW5kbGVyKCdzdGFydHMnKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIHtpc1lvdXR1YmUgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luPVwiZGVuc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVuZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkVuZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2VuZHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmNoYW5nZUhhbmRsZXIoJ2VuZHMnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWREaWFsb2dDb250ZW50PlxuICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7aXNVcGxvYWRNZWRpYSAmJiAoXG4gICAgICAgICAgICAgIDxTdHlsZWRVcGxvYWRJbnB1dD5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAge2ZpbGVVcGxvYWQudXJsID8gKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXVkaW8gY29udHJvbHM9XCJjb250cm9sc1wiIGNvbnRyb2xzTGlzdD1cIm5vZG93bmxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSB0eXBlPXttaW1lVHlwZX0gc3JjPXtmaWxlVXBsb2FkLnVybH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYXVkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkRGVsZXRlSWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVSZW1vdmVGaWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwibGFyZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEFjdGlvbkRlbGV0ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWREZWxldGVJY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkUm93PlxuICAgICAgICAgICAgICAgICAgICAgIHshZmlsZVVwbG9hZC5zY2hlZHVsZWQgJiYgZmlsZVVwbG9hZC5sb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cInN1YmhlYWRpbmdcIj5Mb2FkaW5nLi4uPC9UeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgIHtmaWxlVXBsb2FkLnNjaGVkdWxlZCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5IHZhcmlhbnQ9XCJzdWJoZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFdhaXRpbmcgZm9yIFVwbG9hZCB0byBmaW5pc2gsIHRoZW4gaW5zZXJ0aW5nIGl0ZW0uLi5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICApIDogIWZpbGVVcGxvYWQubG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGFjY2VwdD1cImF1ZGlvLypcIiBvbkNoYW5nZT17dGhpcy5oYW5kbGVVcGxvYWRGaWxlfSB0eXBlPVwiZmlsZVwiIC8+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgIHshIWZpbGVVcGxvYWQuZXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkRXJyb3IgdmFyaWFudD1cImNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7ZmlsZVVwbG9hZC5lcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRFcnJvcj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvU3R5bGVkVXBsb2FkSW5wdXQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0RpYWxvZ0NvbnRlbnQ+XG4gICAgICAgIDxEaWFsb2dBY3Rpb25zPlxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17KCkgPT4gdGhpcy5oYW5kbGVEb25lKGZhbHNlKX0gY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8QnV0dG9uIGRpc2FibGVkPXtzdWJtaXRJc0Rpc2FibGVkfSBvbkNsaWNrPXsoKSA9PiB0aGlzLmhhbmRsZURvbmUodHJ1ZSl9IGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAge2VkaXQgPyAnVXBkYXRlJyA6ICdJbnNlcnQnfVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L0RpYWxvZ0FjdGlvbnM+XG4gICAgICA8L1N0eWxlZERpYWxvZz5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lZGlhRGlhbG9nO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFGLHNC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