single-scripture-rcl 3.3.1-beta.2 → 3.3.1

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.
@@ -10,8 +10,6 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try
10
10
 
11
11
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
12
12
 
13
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
14
-
15
13
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
16
14
 
17
15
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -38,16 +36,11 @@ import useDeepCompareEffect from 'use-deep-compare-effect';
38
36
  import { useEdit } from 'gitea-react-toolkit';
39
37
  import { core } from 'scripture-resources-rcl';
40
38
  import usfmjs from 'usfm-js';
41
- import { ScriptureConfig, ScriptureReference, ServerConfig } from '../types';
42
- import { getScriptureResourceSettings } from '../utils/ScriptureSettings';
39
+ import { ScriptureConfig, ServerConfig } from '../types';
40
+ import { getScriptureResourceSettings, getVerseDataFromScripConfig } from '../utils/ScriptureSettings';
43
41
  import { ORIGINAL_SOURCE } from '../utils';
44
42
  import useScriptureResources from './useScriptureResources';
45
43
 
46
- /**
47
- * determines if alignment is complete based on target USFM and original language verse objects
48
- * @param {string} targetVerseUSFM
49
- * @param {object[]} originalVerseObjects
50
- */
51
44
  function isUsfmAligned(targetVerseUSFM, originalVerseObjects) {
52
45
  var _originalVerseObjects;
53
46
 
@@ -59,14 +52,6 @@ function isUsfmAligned(targetVerseUSFM, originalVerseObjects) {
59
52
 
60
53
  return AlignmentHelpers.areAlgnmentsComplete(wordBank, alignments);
61
54
  }
62
- /**
63
- * get the updated USFM for target verse from the updated verse objects and latest text
64
- * @param {object[]} updatedVerseObjects
65
- * @param {object[]} initialVerseObjects
66
- * @param {boolean} verseTextChanged
67
- * @param {string} newVerseText
68
- */
69
-
70
55
 
71
56
  function getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText) {
72
57
  var targetVerseUSFM = null;
@@ -82,16 +67,13 @@ function getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseText
82
67
  }
83
68
 
84
69
  return targetVerseUSFM;
85
- } // manage verse edit and alignment states
86
-
70
+ }
87
71
 
88
72
  export function useScriptureAlignmentEdit(_ref) {
89
73
  var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _httpConfig, _httpConfig2;
90
74
 
91
75
  var authentication = _ref.authentication,
92
- bookIndex = _ref.bookIndex,
93
76
  currentVerseNum = _ref.currentVerseNum,
94
- currentVerseRef = _ref.currentVerseRef,
95
77
  enableEdit = _ref.enableEdit,
96
78
  enableAlignment = _ref.enableAlignment,
97
79
  httpConfig = _ref.httpConfig,
@@ -102,10 +84,8 @@ export function useScriptureAlignmentEdit(_ref) {
102
84
  originalRepoUrl = _ref.originalRepoUrl,
103
85
  scriptureConfig = _ref.scriptureConfig,
104
86
  scriptureSettings = _ref.scriptureSettings,
105
- sourceLanguage = _ref.sourceLanguage,
106
87
  startEditBranch = _ref.startEditBranch,
107
- targetLanguage = _ref.targetLanguage,
108
- title = _ref.title,
88
+ bookIndex = _ref.bookIndex,
109
89
  workingResourceBranch = _ref.workingResourceBranch;
110
90
 
111
91
  var _React$useState = React.useState({
@@ -119,7 +99,6 @@ export function useScriptureAlignmentEdit(_ref) {
119
99
  verseTextChanged: false,
120
100
  saveContent: null,
121
101
  startSave: false,
122
- saveInitiated: false,
123
102
  sha: null
124
103
  }),
125
104
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -136,7 +115,6 @@ export function useScriptureAlignmentEdit(_ref) {
136
115
  verseTextChanged = state.verseTextChanged,
137
116
  saveContent = state.saveContent,
138
117
  startSave = state.startSave,
139
- saveInitiated = state.saveInitiated,
140
118
  sha = state.sha;
141
119
 
142
120
  function setState(newState) {
@@ -145,7 +123,7 @@ export function useScriptureAlignmentEdit(_ref) {
145
123
  });
146
124
  }
147
125
 
148
- var reference_ = currentVerseRef || (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
126
+ var reference_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
149
127
  useDeepCompareEffect(function () {
150
128
  // check for context changes, reset edit and alignment state
151
129
  console.log("reference changed ".concat(JSON.stringify(reference_)));
@@ -172,7 +150,8 @@ export function useScriptureAlignmentEdit(_ref) {
172
150
 
173
151
  httpConfig = httpConfig || {};
174
152
  var bookId = reference_ === null || reference_ === void 0 ? void 0 : reference_.projectId;
175
- var originalScriptureSettings = getScriptureResourceSettings(bookId, originalScriptureSettings_, isNewTestament, originalRepoUrl);
153
+ var originalScriptureSettings = getScriptureResourceSettings(bookId, originalScriptureSettings_, isNewTestament, originalRepoUrl); // @ts-ignore
154
+
176
155
  var fetchResp_ = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse;
177
156
  var owner = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.owner;
178
157
  var repo = "".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso2 = scriptureConfig.resource) === null || _scriptureConfig$reso2 === void 0 ? void 0 : _scriptureConfig$reso2.languageId, "_").concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso3 = scriptureConfig.resource) === null || _scriptureConfig$reso3 === void 0 ? void 0 : _scriptureConfig$reso3.projectId);
@@ -194,7 +173,7 @@ export function useScriptureAlignmentEdit(_ref) {
194
173
  return "".concat(bookIndex, "-").concat(bookCaps, ".usfm");
195
174
  }
196
175
 
197
- var filepath = getBookName(); // keep track of verse edit state
176
+ var filepath = getBookName(); // TODO: enable save
198
177
 
199
178
  var _useEdit = useEdit({
200
179
  sha: sha,
@@ -215,12 +194,16 @@ export function useScriptureAlignmentEdit(_ref) {
215
194
  filepath: filepath,
216
195
  repo: repo
217
196
  }),
197
+ editResponse = _useEdit.editResponse,
198
+ error = _useEdit.error,
199
+ isEditing = _useEdit.isEditing,
200
+ isError = _useEdit.isError,
218
201
  onSaveEdit = _useEdit.onSaveEdit;
219
202
 
220
203
  if (!enableAlignment) {
221
204
  // if not enabled, then we don't fetch resource
222
205
  originalScriptureSettings.resourceLink = null;
223
- } // get original language for this alignment
206
+ } // get original language for alignment
224
207
 
225
208
 
226
209
  var originalScriptureResource = useScriptureResources({
@@ -234,39 +217,6 @@ export function useScriptureAlignmentEdit(_ref) {
234
217
  currentOwner: originalLanguageOwner,
235
218
  httpConfig: httpConfig
236
219
  });
237
- var originalVerseObjects = React.useMemo(function () {
238
- var _originalScriptureRes;
239
-
240
- // get the original language verseObjects
241
- if ((originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : (_originalScriptureRes = originalScriptureResource.versesForRef) === null || _originalScriptureRes === void 0 ? void 0 : _originalScriptureRes.length) > 1) {
242
- // if multiple verses, then append them together
243
- var verseObjects = [];
244
-
245
- var _iterator = _createForOfIteratorHelper(originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.versesForRef),
246
- _step;
247
-
248
- try {
249
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
250
- var _verseReference$verse;
251
-
252
- var verseReference = _step.value;
253
- var origVerseObjects = verseReference === null || verseReference === void 0 ? void 0 : (_verseReference$verse = verseReference.verseData) === null || _verseReference$verse === void 0 ? void 0 : _verseReference$verse.verseObjects;
254
-
255
- if (origVerseObjects) {
256
- Array.prototype.push.apply(verseObjects, origVerseObjects);
257
- }
258
- }
259
- } catch (err) {
260
- _iterator.e(err);
261
- } finally {
262
- _iterator.f();
263
- }
264
-
265
- return verseObjects;
266
- }
267
-
268
- return originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
269
- }, [originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.versesForRef]);
270
220
  React.useEffect(function () {
271
221
  // update alignment status when aligner is hidden
272
222
  var notEmpty = !!initialVerseObjects;
@@ -276,6 +226,7 @@ export function useScriptureAlignmentEdit(_ref) {
276
226
  // skip if aligner is being shown
277
227
  if (notEmpty) {
278
228
  // skip if empty
229
+ var originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
279
230
  var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
280
231
 
281
232
  if (!enableAlignment) {
@@ -295,11 +246,11 @@ export function useScriptureAlignmentEdit(_ref) {
295
246
  });
296
247
  }
297
248
  }
298
- }, [initialVerseObjects, alignerData, newVerseText, initialVerseText, enableAlignment, originalVerseObjects]);
249
+ }, [initialVerseObjects, alignerData, newVerseText, initialVerseText, enableAlignment, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects]);
299
250
  /**
300
251
  * search chapter or verse chunk to line that starts with findItem
301
252
  * @param {number|string} findItem
302
- * @param {string[]} chunks
253
+ * @param {array[string]} chunks
303
254
  */
304
255
 
305
256
  function findRefInArray(findItem, chunks) {
@@ -324,9 +275,6 @@ export function useScriptureAlignmentEdit(_ref) {
324
275
  function saveChangesToCloud() {
325
276
  console.log("saveChangesToCloud - started");
326
277
  var updatedVerseObjects_;
327
- setState({
328
- saveInitiated: true
329
- });
330
278
 
331
279
  if (newAlignments) {
332
280
  // if unsaved alignment changes, apply them
@@ -335,7 +283,9 @@ export function useScriptureAlignmentEdit(_ref) {
335
283
  var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
336
284
 
337
285
  var _AlignmentHelpers$upd2 = AlignmentHelpers.updateAlignmentsToTargetVerse(currentVerseObjects_, newVerseText),
338
- targetVerseObjects = _AlignmentHelpers$upd2.targetVerseObjects;
286
+ targetVerseText = _AlignmentHelpers$upd2.targetVerseText,
287
+ targetVerseObjects = _AlignmentHelpers$upd2.targetVerseObjects; // console.log(`saveChangesToCloud() - new text:`, targetVerseText.substring(0,100))
288
+
339
289
 
340
290
  updatedVerseObjects_ = targetVerseObjects;
341
291
  } else {
@@ -344,10 +294,10 @@ export function useScriptureAlignmentEdit(_ref) {
344
294
  }
345
295
 
346
296
  if (updatedVerseObjects_) {
347
- var _scriptureConfig$vers;
297
+ var newUsfm; // @ts-ignore
298
+
299
+ var ref = getVerseDataFromScripConfig(scriptureConfig, currentVerseNum); // @ts-ignore
348
300
 
349
- var newUsfm;
350
- var ref = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$vers = scriptureConfig.versesForRef) === null || _scriptureConfig$vers === void 0 ? void 0 : _scriptureConfig$vers[currentVerseNum];
351
301
  var originalUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
352
302
 
353
303
  if (originalUsfm) {
@@ -387,7 +337,6 @@ export function useScriptureAlignmentEdit(_ref) {
387
337
  }
388
338
 
389
339
  React.useEffect(function () {
390
- // when startSave goes true, save edits to user branch and then clear startSave
391
340
  var _saveEdit = /*#__PURE__*/function () {
392
341
  var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
393
342
  var branch;
@@ -422,16 +371,14 @@ export function useScriptureAlignmentEdit(_ref) {
422
371
  alignerData: null,
423
372
  startSave: false,
424
373
  verseTextChanged: false,
425
- initialVerseText: null,
426
- saveInitiated: false
374
+ initialVerseText: null
427
375
  });
428
376
  console.info('saveChangesToCloud() - Reloading resource');
429
377
  scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
430
378
  } else {
431
379
  console.error('saveChangesToCloud() - saving changed scripture failed');
432
380
  setState({
433
- startSave: false,
434
- saveInitiated: false
381
+ startSave: false
435
382
  });
436
383
  }
437
384
  });
@@ -455,18 +402,11 @@ export function useScriptureAlignmentEdit(_ref) {
455
402
  _saveEdit();
456
403
  }
457
404
  }, [startSave]);
458
- /**
459
- * used to save new verse objects to bible
460
- * @param {number} index
461
- * @param {objects[]} newVerseObjects
462
- */
463
-
464
- function updateVerseNum(index) {
465
- var _scriptureConfig$vers2;
466
405
 
406
+ function updateVerseNum(verseNum) {
467
407
  var newVerseObjects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : initialVerseObjects;
468
408
  // @ts-ignore
469
- var ref = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$vers2 = scriptureConfig.versesForRef) === null || _scriptureConfig$vers2 === void 0 ? void 0 : _scriptureConfig$vers2[index];
409
+ var ref = getVerseDataFromScripConfig(scriptureConfig, verseNum);
470
410
  var targetVerseObjects_ = null;
471
411
 
472
412
  if (ref) {
@@ -487,23 +427,14 @@ export function useScriptureAlignmentEdit(_ref) {
487
427
 
488
428
  return null;
489
429
  }
490
- /**
491
- * callback for when user clicked on alignment button - will show if not already shown
492
- */
493
-
494
430
 
495
431
  function handleAlignmentClick() {
496
432
  return _handleAlignmentClick.apply(this, arguments);
497
433
  }
498
- /**
499
- * get updated verse objects after alignments changed
500
- * @param {object} _newAlignments - results of aligner
501
- */
502
-
503
434
 
504
435
  function _handleAlignmentClick() {
505
436
  _handleAlignmentClick = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
506
- var alignerData_, targetVerseUSFM, originalVerseUsfm, _AlignmentHelpers$par, wordBank, alignments;
437
+ var alignerData_, targetVerseUSFM, originalVerseObjects, originalVerseUsfm, _AlignmentHelpers$par, wordBank, alignments;
507
438
 
508
439
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
509
440
  while (1) {
@@ -523,6 +454,7 @@ export function useScriptureAlignmentEdit(_ref) {
523
454
  // if word aligner not shown
524
455
  console.log("handleAlignmentClick - toggle ON alignment");
525
456
  targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
457
+ originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
526
458
  originalVerseUsfm = null;
527
459
 
528
460
  if (originalVerseObjects) {
@@ -556,32 +488,22 @@ export function useScriptureAlignmentEdit(_ref) {
556
488
  }
557
489
 
558
490
  function updateVerseWithNewAlignments() {
559
- var _newAlignments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : newAlignments;
560
-
561
491
  var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
562
492
  var targetVerseText = newVerseText || UsfmFileConversionHelpers.convertVerseDataToUSFM(currentVerseObjects_);
563
- var verseUsfm = AlignmentHelpers.addAlignmentsToVerseUSFM(_newAlignments.targetWords, _newAlignments.verseAlignments, targetVerseText);
493
+ var verseUsfm = AlignmentHelpers.addAlignmentsToVerseUSFM(newAlignments.targetWords, newAlignments.verseAlignments, targetVerseText);
564
494
  var alignedVerseObjects = usfmHelpers.usfmVerseToJson(verseUsfm);
565
495
  return alignedVerseObjects;
566
496
  }
567
- /**
568
- * callback for when user clicked on button to save current alignments in word aligner. Generates new verse content and saves in state. Closes aligner display
569
- * @param {object} _newAlignments - results of aligner
570
- */
571
-
572
497
 
573
498
  function saveAlignment() {
574
- var _newAlignments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : newAlignments;
499
+ console.log("saveAlignment()");
575
500
 
576
- console.log("saveAlignment() - newAlignments", _newAlignments);
577
-
578
- if (_newAlignments) {
579
- var alignedVerseObjects = updateVerseWithNewAlignments(_newAlignments);
580
- console.log("saveAlignment() - alignedVerseObjects", alignedVerseObjects);
501
+ if (newAlignments) {
502
+ var alignedVerseObjects = updateVerseWithNewAlignments();
581
503
  setState({
504
+ alignerData: null,
582
505
  editing: false,
583
506
  newAlignments: null,
584
- alignerData: null,
585
507
  updatedVerseObjects: alignedVerseObjects
586
508
  });
587
509
  } else {
@@ -591,10 +513,6 @@ export function useScriptureAlignmentEdit(_ref) {
591
513
  });
592
514
  }
593
515
  }
594
- /**
595
- * callback for when user clicked on button to cancel work in word aligner. Calculates and displays current alignment valid state. Closes aligner display
596
- */
597
-
598
516
 
599
517
  function cancelAlignment() {
600
518
  console.log("cancelAlignment()");
@@ -604,23 +522,12 @@ export function useScriptureAlignmentEdit(_ref) {
604
522
  alignerData: null,
605
523
  aligned: aligned
606
524
  });
607
- }
608
- /**
609
- * callback for button to set editing state
610
- * @param {boolean} editing_ - if true, editor is shown, otherwise editor is hidden
611
- */
525
+ } // TODO: Change this function to take currentVerseNum to set editing verse
612
526
 
613
527
 
614
528
  function setEditing(_x) {
615
529
  return _setEditing.apply(this, arguments);
616
530
  }
617
- /**
618
- * callback from the edit onChange event to update edit state variables
619
- * @param {boolean} changed - true if the newVerseText is different than the initialVerseText
620
- * @param {string} newVerseText - current changed verse text
621
- * @param {string} initialVerseText - initial verse text
622
- */
623
-
624
531
 
625
532
  function _setEditing() {
626
533
  _setEditing = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(editing_) {
@@ -671,7 +578,7 @@ export function useScriptureAlignmentEdit(_ref) {
671
578
  });
672
579
  }
673
580
 
674
- var currentVerseObjects = React.useMemo(function () {
581
+ var editedVerseObjects = React.useMemo(function () {
675
582
  // if verse has been edited or alignment changed, then generate new verseObjects to display in ScripturePane
676
583
  if (initialVerseObjects) {
677
584
  var targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
@@ -686,11 +593,6 @@ export function useScriptureAlignmentEdit(_ref) {
686
593
  var changed = verseTextChanged || updatedVerseObjects && !isEqual(initialVerseObjects, updatedVerseObjects);
687
594
  return changed;
688
595
  }, [updatedVerseObjects, initialVerseObjects, verseTextChanged]);
689
- /**
690
- * callback for when alignments are being changed
691
- * @param {object} results
692
- * @return {boolean} true if alignment is complete
693
- */
694
596
 
695
597
  function onAlignmentsChange(results) {
696
598
  console.log("onAlignmentsChange() - alignment changed, results", results); // merge alignments into target verse and convert to USFM
@@ -703,13 +605,12 @@ export function useScriptureAlignmentEdit(_ref) {
703
605
  newAlignments: results,
704
606
  aligned: alignmentComplete
705
607
  });
706
- return alignmentComplete;
707
608
  }
708
609
 
709
610
  return {
710
611
  actions: {
711
612
  cancelAlignment: cancelAlignment,
712
- currentVerseObjects: currentVerseObjects,
613
+ editedVerseObjects: editedVerseObjects,
713
614
  handleAlignmentClick: handleAlignmentClick,
714
615
  onAlignmentsChange: onAlignmentsChange,
715
616
  saveAlignment: saveAlignment,
@@ -720,16 +621,10 @@ export function useScriptureAlignmentEdit(_ref) {
720
621
  state: {
721
622
  aligned: aligned,
722
623
  alignerData: alignerData,
723
- currentVerseRef: currentVerseRef,
724
- doingSave: saveInitiated,
725
624
  editing: editing,
726
- sourceLanguage: sourceLanguage,
727
- targetLanguage: targetLanguage,
728
- unsavedChanges: unsavedChanges,
729
625
  verseTextChanged: verseTextChanged,
730
- reference: reference_,
731
- title: title
626
+ unsavedChanges: unsavedChanges
732
627
  }
733
628
  };
734
629
  }
735
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0LnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIkFsaWdubWVudEhlbHBlcnMiLCJVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIiwidXNmbUhlbHBlcnMiLCJpc0VxdWFsIiwidXNlRGVlcENvbXBhcmVFZmZlY3QiLCJ1c2VFZGl0IiwiY29yZSIsInVzZm1qcyIsIlNjcmlwdHVyZUNvbmZpZyIsIlNjcmlwdHVyZVJlZmVyZW5jZSIsIlNlcnZlckNvbmZpZyIsImdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MiLCJPUklHSU5BTF9TT1VSQ0UiLCJ1c2VTY3JpcHR1cmVSZXNvdXJjZXMiLCJpc1VzZm1BbGlnbmVkIiwidGFyZ2V0VmVyc2VVU0ZNIiwib3JpZ2luYWxWZXJzZU9iamVjdHMiLCJsZW5ndGgiLCJleHRyYWN0QWxpZ25tZW50c0Zyb21UYXJnZXRWZXJzZSIsImFsaWdubWVudHMiLCJ3b3JkQmFuayIsImFyZUFsZ25tZW50c0NvbXBsZXRlIiwiZ2V0Q3VycmVudFZlcnNlVXNmbSIsInVwZGF0ZWRWZXJzZU9iamVjdHMiLCJpbml0aWFsVmVyc2VPYmplY3RzIiwidmVyc2VUZXh0Q2hhbmdlZCIsIm5ld1ZlcnNlVGV4dCIsImN1cnJlbnRWZXJzZU9iamVjdHNfIiwidXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UiLCJ0YXJnZXRWZXJzZVRleHQiLCJjb252ZXJ0VmVyc2VEYXRhVG9VU0ZNIiwidXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCIsImF1dGhlbnRpY2F0aW9uIiwiYm9va0luZGV4IiwiY3VycmVudFZlcnNlTnVtIiwiY3VycmVudFZlcnNlUmVmIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsImh0dHBDb25maWciLCJpc05ld1Rlc3RhbWVudCIsImxvZ2dlZEluVXNlciIsIm9yaWdpbmFsTGFuZ3VhZ2VPd25lciIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUNvbmZpZyIsInNjcmlwdHVyZVNldHRpbmdzIiwic291cmNlTGFuZ3VhZ2UiLCJzdGFydEVkaXRCcmFuY2giLCJ0YXJnZXRMYW5ndWFnZSIsInRpdGxlIiwid29ya2luZ1Jlc291cmNlQnJhbmNoIiwidXNlU3RhdGUiLCJhbGlnbmVkIiwiYWxpZ25lckRhdGEiLCJlZGl0aW5nIiwiaW5pdGlhbFZlcnNlVGV4dCIsIm5ld0FsaWdubWVudHMiLCJzYXZlQ29udGVudCIsInN0YXJ0U2F2ZSIsInNhdmVJbml0aWF0ZWQiLCJzaGEiLCJzdGF0ZSIsInNldFN0YXRlXyIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJwcmV2U3RhdGUiLCJyZWZlcmVuY2VfIiwicmVmZXJlbmNlIiwiY29uc29sZSIsImxvZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjbGVhclN0YXRlIiwib3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5nc18iLCJyZXNvdXJjZUlkIiwiYm9va0lkIiwicHJvamVjdElkIiwib3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5ncyIsImZldGNoUmVzcF8iLCJmZXRjaFJlc3BvbnNlIiwib3duZXIiLCJyZXNvdXJjZSIsInJlcG8iLCJsYW5ndWFnZUlkIiwidXNlRWZmZWN0IiwiZGF0YSIsImdldEJvb2tOYW1lIiwiYm9va0NhcHMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVwYXRoIiwiY29udGVudCIsImNvbmZpZyIsImNhY2hlIiwibWF4QWdlIiwidG9rZW4iLCJ0aW1lb3V0Iiwic2VydmVyVGltZU91dCIsImF1dGhvciIsImJyYW5jaCIsIm9uU2F2ZUVkaXQiLCJyZXNvdXJjZUxpbmsiLCJvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlIiwiY2hhcHRlciIsInZlcnNlIiwiY3VycmVudExhbmd1YWdlSWQiLCJjdXJyZW50T3duZXIiLCJ1c2VNZW1vIiwidmVyc2VzRm9yUmVmIiwidmVyc2VPYmplY3RzIiwidmVyc2VSZWZlcmVuY2UiLCJvcmlnVmVyc2VPYmplY3RzIiwidmVyc2VEYXRhIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJwdXNoIiwiYXBwbHkiLCJub3RFbXB0eSIsImFsaWduZWRfIiwicmVzdWx0cyIsImZpbmRSZWZJbkFycmF5IiwiZmluZEl0ZW0iLCJjaHVua3MiLCJyZWZfIiwicmVmTGVuIiwiaW5kZXgiLCJmaW5kSW5kZXgiLCJjaHVuayIsImlkeCIsInN1YnN0cmluZyIsIm5leHRDaGFyIiwic2F2ZUNoYW5nZXNUb0Nsb3VkIiwidXBkYXRlZFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzIiwidGFyZ2V0VmVyc2VPYmplY3RzIiwibmV3VXNmbSIsInJlZiIsIm9yaWdpbmFsVXNmbSIsImdldFJlc3BvbnNlRGF0YSIsImNoYXB0ZXJDaHVua3MiLCJzcGxpdCIsImNoYXB0ZXJJbmRleCIsImN1cnJlbnRDaGFwdGVyIiwidmVyc2VDaHVua3MiLCJ2ZXJzZUluZGV4IiwibmV3VmVyc2VVc2ZtIiwib2xkVmVyc2UiLCJ2ZXJzZU51bUxlbiIsIm5ld0NoYXB0ZXIiLCJqb2luIiwibmV3Qm9va0pzb24iLCJ1cGRhdGVWZXJzZU51bSIsInRvVVNGTSIsImZvcmNlZE5ld0xpbmVzIiwiX3NhdmVFZGl0IiwidW5kZWZpbmVkIiwidGhlbiIsInN1Y2Nlc3MiLCJpbmZvIiwicmVsb2FkUmVzb3VyY2UiLCJlcnJvciIsIm5ld1ZlcnNlT2JqZWN0cyIsInRhcmdldFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVWZXJzZSIsImhhbmRsZUFsaWdubWVudENsaWNrIiwiYWxpZ25lckRhdGFfIiwib3JpZ2luYWxWZXJzZVVzZm0iLCJwYXJzZVVzZm1Ub1dvcmRBbGlnbmVyRGF0YSIsInRhcmdldFdvcmRzIiwidmVyc2VBbGlnbm1lbnRzIiwiX25ld0FsaWdubWVudHMiLCJ2ZXJzZVVzZm0iLCJhZGRBbGlnbm1lbnRzVG9WZXJzZVVTRk0iLCJhbGlnbmVkVmVyc2VPYmplY3RzIiwidXNmbVZlcnNlVG9Kc29uIiwic2F2ZUFsaWdubWVudCIsImNhbmNlbEFsaWdubWVudCIsInNldEVkaXRpbmciLCJlZGl0aW5nXyIsInNldFZlcnNlQ2hhbmdlZCIsImNoYW5nZWQiLCJjdXJyZW50VmVyc2VPYmplY3RzIiwidW5zYXZlZENoYW5nZXMiLCJvbkFsaWdubWVudHNDaGFuZ2UiLCJhbGlnbm1lbnRDb21wbGV0ZSIsImFjdGlvbnMiLCJkb2luZ1NhdmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQSxPQUFPLEtBQUtBLEtBQVosTUFBdUIsT0FBdkI7QUFDQSxTQUNFQyxnQkFERixFQUVFQyx5QkFGRixFQUdFQyxXQUhGLFFBSU8sa0JBSlA7QUFLQSxPQUFPLEtBQUtDLE9BQVosTUFBeUIsWUFBekI7QUFDQSxPQUFPQyxvQkFBUCxNQUFpQyx5QkFBakM7QUFDQSxTQUFTQyxPQUFULFFBQXdCLHFCQUF4QjtBQUNBLFNBQVNDLElBQVQsUUFBcUIseUJBQXJCO0FBQ0EsT0FBT0MsTUFBUCxNQUFtQixTQUFuQjtBQUNBLFNBQVFDLGVBQVIsRUFBeUJDLGtCQUF6QixFQUE2Q0MsWUFBN0MsUUFBZ0UsVUFBaEU7QUFDQSxTQUFTQyw0QkFBVCxRQUE2Qyw0QkFBN0M7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFVBQWhDO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MseUJBQWxDOztBQWdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsYUFBVCxDQUF1QkMsZUFBdkIsRUFBd0NDLG9CQUF4QyxFQUE4RDtBQUFBOztBQUM1REEsRUFBQUEsb0JBQW9CLEdBQUcseUJBQUFBLG9CQUFvQixVQUFwQiw4REFBc0JDLE1BQXRCLEdBQStCRCxvQkFBL0IsR0FBc0QsSUFBN0UsQ0FENEQsQ0FDc0I7O0FBRHRCLDhCQUUzQmhCLGdCQUFnQixDQUFDa0IsZ0NBQWpCLENBQWtESCxlQUFsRCxFQUFtRUMsb0JBQW5FLENBRjJCO0FBQUEsTUFFcERHLFVBRm9ELHlCQUVwREEsVUFGb0Q7QUFBQSxNQUV4Q0MsUUFGd0MseUJBRXhDQSxRQUZ3Qzs7QUFHNUQsU0FBT3BCLGdCQUFnQixDQUFD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QUVELFNBQU87QUFDTEMsSUFBQUEsT0FBTyxFQUFFO0FBQ1BULE1BQUFBLGVBQWUsRUFBZkEsZUFETztBQUVQSyxNQUFBQSxtQkFBbUIsRUFBbkJBLG1CQUZPO0FBR1BqQixNQUFBQSxvQkFBb0IsRUFBcEJBLG9CQUhPO0FBSVBtQixNQUFBQSxrQkFBa0IsRUFBbEJBLGtCQUpPO0FBS1BSLE1BQUFBLGFBQWEsRUFBYkEsYUFMTztBQU1QRSxNQUFBQSxVQUFVLEVBQVZBLFVBTk87QUFPUEUsTUFBQUEsZUFBZSxFQUFmQSxlQVBPO0FBUVBoRCxNQUFBQSxrQkFBa0IsRUFBbEJBO0FBUk8sS0FESjtBQVdMckUsSUFBQUEsS0FBSyxFQUFFO0FBQ0xULE1BQUFBLE9BQU8sRUFBUEEsT0FESztBQUVMQyxNQUFBQSxXQUFXLEVBQVhBLFdBRks7QUFHTGpCLE1BQUFBLGVBQWUsRUFBZkEsZUFISztBQUlMcUosTUFBQUEsU0FBUyxFQUFFOUgsYUFKTjtBQUtMTCxNQUFBQSxPQUFPLEVBQVBBLE9BTEs7QUFNTFIsTUFBQUEsY0FBYyxFQUFkQSxjQU5LO0FBT0xFLE1BQUFBLGNBQWMsRUFBZEEsY0FQSztBQVFMcUksTUFBQUEsY0FBYyxFQUFkQSxjQVJLO0FBU0wzSixNQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQVRLO0FBVUx5QyxNQUFBQSxTQUFTLEVBQUVELFVBVk47QUFXTGpCLE1BQUFBLEtBQUssRUFBTEE7QUFYSztBQVhGLEdBQVA7QUF5QkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIEFsaWdubWVudEhlbHBlcnMsXG4gIFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMsXG4gIHVzZm1IZWxwZXJzLFxufSBmcm9tICd3b3JkLWFsaWduZXItcmNsJ1xuaW1wb3J0ICogYXMgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJ1xuaW1wb3J0IHVzZURlZXBDb21wYXJlRWZmZWN0IGZyb20gJ3VzZS1kZWVwLWNvbXBhcmUtZWZmZWN0J1xuaW1wb3J0IHsgdXNlRWRpdCB9IGZyb20gJ2dpdGVhLXJlYWN0LXRvb2xraXQnXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnc2NyaXB0dXJlLXJlc291cmNlcy1yY2wnXG5pbXBvcnQgdXNmbWpzIGZyb20gJ3VzZm0tanMnXG5pbXBvcnQge1NjcmlwdHVyZUNvbmZpZywgU2NyaXB0dXJlUmVmZXJlbmNlLCBTZXJ2ZXJDb25maWd9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0U2NyaXB0dXJlUmVzb3VyY2VTZXR0aW5ncyB9IGZyb20gJy4uL3V0aWxzL1NjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHsgT1JJR0lOQUxfU09VUkNFIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgdXNlU2NyaXB0dXJlUmVzb3VyY2VzIGZyb20gJy4vdXNlU2NyaXB0dXJlUmVzb3VyY2VzJ1xuXG5pbnRlcmZhY2UgU3RhcnRFZGl0IHtcbiAgKCk6IFByb21pc2U8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgLy8gdXNlciBsb2dpbiBpbmZvXG4gIGF1dGhlbnRpY2F0aW9uOiB7IGNvbmZpZzogb2JqZWN0LCB0b2tlbjogc3RyaW5nIH0sXG4gIC8vIGN1cnJlbnQgdmVyc2Ugc2VsZWN0ZWQgZnJvbSBpbml0aWFsVmVyc2VPYmplY3RzW11cbiAgY3VycmVudFZlcnNlTnVtOiBudW1iZXIsXG4gIC8vIGlmIHRydWUgdGhlbiBlZGl0aW5nIGlzIGFsbG93ZWRcbiAgZW5hYmxlRWRpdDogYm9vbGVhbixcbiAgLy8gaWYgdHJ1ZSB0aGVuIGFsaWdubWVudCBpcyBhbGxvd2VkXG4gIGVuYWJsZUFsaWdubWVudDogYm9vbGVhbixcbiAgLy8gY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIGh0dHAgY29tbXVuaWNhdGlvblxuICBodHRwQ29uZmlnOiBTZXJ2ZXJDb25maWcsXG4gIC8vIGFycmF5IG9mIGVhY2ggdmVyc2UgZm9yIGluIHJlZmVyZW5jZSByYW5nZVxuICBpbml0aWFsVmVyc2VPYmplY3RzOiBbXSxcbiAgaXNOZXdUZXN0YW1lbnQ6IGJvb2xlYW4sXG4gIC8vIHVzZXIgbmFtZSBvZiBsb2dnZWQgaW4gdXNlclxuICBsb2dnZWRJblVzZXI6IHN0cmluZyxcbiAgLy8gb3duZXIgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgb3JpZ2luYWwgbGFuZ3VhZ2UgcmVzb3VyY2VzXG4gIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcjogc3RyaW5nLFxuICAvLyB1cmwgZm9yIHRoZSBvcmlnaW5hbCBsYW5ndWFnZSByZXBvXG4gIG9yaWdpbmFsUmVwb1VybDogc3RyaW5nLFxuICAvLyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHNjcmlwdHVyZSBsb2FkZWRcbiAgc2NyaXB0dXJlQ29uZmlnOiBTY3JpcHR1cmVDb25maWcsXG4gIC8vIHNldHRpbmdzIHRvIGJlIHVzZWQgZm9yIHNjcmlwdHVyZVxuICBzY3JpcHR1cmVTZXR0aW5nczogeyB9LFxuICAvLyBjYWxsYmFjayB0byBzYXZlIGN1cnJlbnQgdmVyc2UgZWRpdCBhbmQgYWxpZ25tZW50IGNoYW5nZXNcbiAgc2V0U2F2ZWRDaGFuZ2VzOiBGdW5jdGlvbixcbiAgLy8gY2FsbGJhY2sgdG8gY3JlYXRlIGEgdXNlciBicmFuY2ggZm9yIHNhdmluZyBlZGl0IGRhdGFcbiAgc3RhcnRFZGl0QnJhbmNoOiBTdGFydEVkaXQsXG4gIC8vIGluZGV4IHRvIHVzZSBmb3IgYm9vayAoZS5nLiBgMDFgIGZvciBgR0VOYClcbiAgYm9va0luZGV4OiBzdHJpbmcsXG4gIC8vIGJyYW5jaCBuYW1lIGN1cnJlbnRseSBiZWluZyB1c2VkIChlLmcuIGBtYXN0ZXJgIG9yIHVzZXIgYnJhbmNoKVxuICB3b3JraW5nUmVzb3VyY2VCcmFuY2g6IHN0cmluZyxcbiAgLy8gY3VycmVudCB0YXJnZXQgbGFuZ3VhZ2VcbiAgdGFyZ2V0TGFuZ3VhZ2U6IG9iamVjdCxcbiAgLy8gc291cmNlIGxhbmd1YWdlXG4gIHNvdXJjZUxhbmd1YWdlOiBzdHJpbmcsXG4gIC8vIHRpdGxlIHRvIHNob3cgaW4gYWxpZ25tZW50XG4gIHRpdGxlOiBzdHJpbmcsXG4gIC8vIHJlZmVyZW5jZSBmb3IgdmVyc2Ugc2VsZWN0ZWQgZm9yIGFsaWdubWVudFxuICBjdXJyZW50VmVyc2VSZWY6IFNjcmlwdHVyZVJlZmVyZW5jZSxcbn1cblxuLyoqXG4gKiBkZXRlcm1pbmVzIGlmIGFsaWdubWVudCBpcyBjb21wbGV0ZSBiYXNlZCBvbiB0YXJnZXQgVVNGTSBhbmQgb3JpZ2luYWwgbGFuZ3VhZ2UgdmVyc2Ugb2JqZWN0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldFZlcnNlVVNGTVxuICogQHBhcmFtIHtvYmplY3RbXX0gb3JpZ2luYWxWZXJzZU9iamVjdHNcbiAqL1xuZnVuY3Rpb24gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKSB7XG4gIG9yaWdpbmFsVmVyc2VPYmplY3RzID0gb3JpZ2luYWxWZXJzZU9iamVjdHM/Lmxlbmd0aCA/IG9yaWdpbmFsVmVyc2VPYmplY3RzIDogbnVsbCAvLyBtYWtlIHN1cmUgbm90IHBhc3NpbmcgZW1wdHkgQXJyYXlcbiAgY29uc3QgeyBhbGlnbm1lbnRzLCB3b3JkQmFuayB9ID0gQWxpZ25tZW50SGVscGVycy5leHRyYWN0QWxpZ25tZW50c0Zyb21UYXJnZXRWZXJzZSh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICByZXR1cm4gQWxpZ25tZW50SGVscGVycy5hcmVBbGdubWVudHNDb21wbGV0ZSh3b3JkQmFuaywgYWxpZ25tZW50cylcbn1cblxuLyoqXG4gKiBnZXQgdGhlIHVwZGF0ZWQgVVNGTSBmb3IgdGFyZ2V0IHZlcnNlIGZyb20gdGhlIHVwZGF0ZWQgdmVyc2Ugb2JqZWN0cyBhbmQgbGF0ZXN0IHRleHRcbiAqIEBwYXJhbSB7b2JqZWN0W119IHVwZGF0ZWRWZXJzZU9iamVjdHNcbiAqIEBwYXJhbSB7b2JqZWN0W119IGluaXRpYWxWZXJzZU9iamVjdHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmVyc2VUZXh0Q2hhbmdlZFxuICogQHBhcmFtIHtzdHJpbmd9IG5ld1ZlcnNlVGV4dFxuICovXG5mdW5jdGlvbiBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQ6IGJvb2xlYW4sIG5ld1ZlcnNlVGV4dCkge1xuICBsZXQgdGFyZ2V0VmVyc2VVU0ZNID0gbnVsbFxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHMgfHwgaW5pdGlhbFZlcnNlT2JqZWN0c1xuXG4gIGlmICh2ZXJzZVRleHRDaGFuZ2VkICYmIG5ld1ZlcnNlVGV4dCkge1xuICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VUZXh0IH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgdGFyZ2V0VmVyc2VVU0ZNID0gdGFyZ2V0VmVyc2VUZXh0XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0VmVyc2VVU0ZNID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICB9XG4gIHJldHVybiB0YXJnZXRWZXJzZVVTRk1cbn1cblxuLy8gbWFuYWdlIHZlcnNlIGVkaXQgYW5kIGFsaWdubWVudCBzdGF0ZXNcbmV4cG9ydCBmdW5jdGlvbiB1c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0KHtcbiAgYXV0aGVudGljYXRpb24sXG4gIGJvb2tJbmRleCxcbiAgY3VycmVudFZlcnNlTnVtLFxuICBjdXJyZW50VmVyc2VSZWYsXG4gIGVuYWJsZUVkaXQsXG4gIGVuYWJsZUFsaWdubWVudCxcbiAgaHR0cENvbmZpZyxcbiAgaW5pdGlhbFZlcnNlT2JqZWN0cyxcbiAgaXNOZXdUZXN0YW1lbnQsXG4gIGxvZ2dlZEluVXNlcixcbiAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICBvcmlnaW5hbFJlcG9VcmwsXG4gIHNjcmlwdHVyZUNvbmZpZyxcbiAgc2NyaXB0dXJlU2V0dGluZ3MsXG4gIHNvdXJjZUxhbmd1YWdlLFxuICBzdGFydEVkaXRCcmFuY2gsXG4gIHRhcmdldExhbmd1YWdlLFxuICB0aXRsZSxcbiAgd29ya2luZ1Jlc291cmNlQnJhbmNoLFxufSA6IFByb3BzKSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVfXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBhbGlnbmVkOiBmYWxzZSxcbiAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICBpbml0aWFsVmVyc2VUZXh0OiBudWxsLFxuICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZDogZmFsc2UsXG4gICAgc2F2ZUNvbnRlbnQ6IG51bGwsXG4gICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICBzYXZlSW5pdGlhdGVkOiBmYWxzZSxcbiAgICBzaGE6IG51bGwsXG4gIH0pXG5cbiAgY29uc3Qge1xuICAgIGFsaWduZWQsXG4gICAgYWxpZ25lckRhdGEsXG4gICAgZWRpdGluZyxcbiAgICBpbml0aWFsVmVyc2VUZXh0LFxuICAgIG5ld0FsaWdubWVudHMsXG4gICAgbmV3VmVyc2VUZXh0LFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHMsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZCxcbiAgICBzYXZlQ29udGVudCxcbiAgICBzdGFydFNhdmUsXG4gICAgc2F2ZUluaXRpYXRlZCxcbiAgICBzaGEsXG4gIH0gPSBzdGF0ZVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgc2V0U3RhdGVfKHByZXZTdGF0ZSA9PiAoeyAuLi5wcmV2U3RhdGUsIC4uLm5ld1N0YXRlIH0pKVxuICB9XG5cbiAgY29uc3QgcmVmZXJlbmNlXyA9IGN1cnJlbnRWZXJzZVJlZiB8fCBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZSB8fCBudWxsXG5cbiAgdXNlRGVlcENvbXBhcmVFZmZlY3QoKCkgPT4geyAvLyBjaGVjayBmb3IgY29udGV4dCBjaGFuZ2VzLCByZXNldCBlZGl0IGFuZCBhbGlnbm1lbnQgc3RhdGVcbiAgICBjb25zb2xlLmxvZyhgcmVmZXJlbmNlIGNoYW5nZWQgJHtKU09OLnN0cmluZ2lmeShyZWZlcmVuY2VfKX1gKVxuICAgIGNvbnN0IGNsZWFyU3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICBuZXdBbGlnbm1lbnRzOiBudWxsLFxuICAgICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogbnVsbCxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgIH1cblxuICAgIGlmICghaXNFcXVhbChzdGF0ZSwgY2xlYXJTdGF0ZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGByZWZlcmVuY2UgY2hhbmdlZCwgcmVzZXQgZWRpdC9hbGlnbm1lbnQgc3RhdGUgdmFyaWFibGVzYClcbiAgICAgIHNldFN0YXRlKGNsZWFyU3RhdGUpXG4gICAgfVxuICB9LCBbcmVmZXJlbmNlX10pXG5cbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5nc18gPSB7XG4gICAgLi4uc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgcmVzb3VyY2VJZDogT1JJR0lOQUxfU09VUkNFLFxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwQ29uZmlnID0gaHR0cENvbmZpZyB8fCB7fVxuICBjb25zdCBib29rSWQgPSByZWZlcmVuY2VfPy5wcm9qZWN0SWRcbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5ncyA9IGdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MoXG4gICAgYm9va0lkLCBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXywgaXNOZXdUZXN0YW1lbnQsIG9yaWdpbmFsUmVwb1VybCxcbiAgKVxuXG4gIGNvbnN0IGZldGNoUmVzcF8gPSBzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2VcbiAgY29uc3Qgb3duZXIgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5vd25lclxuICBjb25zdCByZXBvID0gYCR7c2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZH1fJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5wcm9qZWN0SWR9YFxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIGdldCB0aGUgc2hhIGZyb20gbGFzdCBzY3JpcHR1cmUgZG93bmxvYWRcbiAgICBjb25zdCBzaGEgPSBmZXRjaFJlc3BfPy5kYXRhPy5zaGEgfHwgbnVsbFxuICAgIGNvbnNvbGUubG9nKGBmb3IgJHtKU09OLnN0cmluZ2lmeShyZWZlcmVuY2VfKX0gbmV3IHNoYSBpcyAke3NoYX1gKVxuICAgIHNldFN0YXRlKHsgc2hhIH0pXG4gICAgLy8gQHRzLWlnbm9yZVxuICB9LCBbZmV0Y2hSZXNwX10pXG5cbiAgZnVuY3Rpb24gZ2V0Qm9va05hbWUoKSB7XG4gICAgY29uc3QgYm9va0NhcHMgPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZT8ucHJvamVjdElkID8gc2NyaXB0dXJlQ29uZmlnLnJlZmVyZW5jZS5wcm9qZWN0SWQudG9VcHBlckNhc2UoKSA6ICcnXG4gICAgcmV0dXJuIGAke2Jvb2tJbmRleH0tJHtib29rQ2Fwc30udXNmbWBcbiAgfVxuXG4gIGNvbnN0IGZpbGVwYXRoID0gZ2V0Qm9va05hbWUoKVxuXG4gIC8vIGtlZXAgdHJhY2sgb2YgdmVyc2UgZWRpdCBzdGF0ZVxuICBjb25zdCB7IG9uU2F2ZUVkaXQgfSA9IHVzZUVkaXQoe1xuICAgIHNoYSxcbiAgICBvd25lcixcbiAgICBjb250ZW50OiBzYXZlQ29udGVudCxcbiAgICBjb25maWc6IHtcbiAgICAgIGNhY2hlOiB7IG1heEFnZTogMCB9LFxuICAgICAgLi4uYXV0aGVudGljYXRpb24/LmNvbmZpZyxcbiAgICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aW1lb3V0OiBodHRwQ29uZmlnPy5zZXJ2ZXJUaW1lT3V0IHx8IGh0dHBDb25maWc/LnRpbWVvdXQgfHwgNTAwMCxcbiAgICB9LFxuICAgIGF1dGhvcjogbG9nZ2VkSW5Vc2VyLFxuICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgYnJhbmNoOiB3b3JraW5nUmVzb3VyY2VCcmFuY2gsXG4gICAgZmlsZXBhdGgsXG4gICAgcmVwbyxcbiAgfSlcblxuICBpZiAoIWVuYWJsZUFsaWdubWVudCkgeyAvLyBpZiBub3QgZW5hYmxlZCwgdGhlbiB3ZSBkb24ndCBmZXRjaCByZXNvdXJjZVxuICAgIG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3MucmVzb3VyY2VMaW5rID0gbnVsbFxuICB9XG5cbiAgLy8gZ2V0IG9yaWdpbmFsIGxhbmd1YWdlIGZvciB0aGlzIGFsaWdubWVudFxuICBjb25zdCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlID0gdXNlU2NyaXB0dXJlUmVzb3VyY2VzKHtcbiAgICBib29rSWQsXG4gICAgc2NyaXB0dXJlU2V0dGluZ3M6IG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgY2hhcHRlcjogcmVmZXJlbmNlXz8uY2hhcHRlcixcbiAgICB2ZXJzZTogcmVmZXJlbmNlXz8udmVyc2UsXG4gICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgb3JpZ2luYWxSZXBvVXJsLFxuICAgIGN1cnJlbnRMYW5ndWFnZUlkOiBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzPy5sYW5ndWFnZUlkLFxuICAgIGN1cnJlbnRPd25lcjogb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICAgIGh0dHBDb25maWcsXG4gIH0pXG5cbiAgY29uc3Qgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHsgLy8gZ2V0IHRoZSBvcmlnaW5hbCBsYW5ndWFnZSB2ZXJzZU9iamVjdHNcbiAgICBpZiAob3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VzRm9yUmVmPy5sZW5ndGggPiAxKSB7IC8vIGlmIG11bHRpcGxlIHZlcnNlcywgdGhlbiBhcHBlbmQgdGhlbSB0b2dldGhlclxuICAgICAgY29uc3QgdmVyc2VPYmplY3RzID0gW11cblxuICAgICAgZm9yIChjb25zdCB2ZXJzZVJlZmVyZW5jZSBvZiBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZXNGb3JSZWYpIHtcbiAgICAgICAgY29uc3Qgb3JpZ1ZlcnNlT2JqZWN0cyA9IHZlcnNlUmVmZXJlbmNlPy52ZXJzZURhdGE/LnZlcnNlT2JqZWN0c1xuXG4gICAgICAgIGlmIChvcmlnVmVyc2VPYmplY3RzKSB7XG4gICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodmVyc2VPYmplY3RzLCBvcmlnVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmVyc2VPYmplY3RzXG4gICAgfVxuICAgIHJldHVybiBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNcbiAgfSwgW29yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2U/LnZlcnNlT2JqZWN0cywgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VzRm9yUmVmXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB1cGRhdGUgYWxpZ25tZW50IHN0YXR1cyB3aGVuIGFsaWduZXIgaXMgaGlkZGVuXG4gICAgY29uc3Qgbm90RW1wdHkgPSAhIWluaXRpYWxWZXJzZU9iamVjdHNcbiAgICBsZXQgYWxpZ25lZF8gPSBmYWxzZVxuXG4gICAgaWYgKCFhbGlnbmVyRGF0YSkgeyAvLyBza2lwIGlmIGFsaWduZXIgaXMgYmVpbmcgc2hvd25cbiAgICAgIGlmIChub3RFbXB0eSkgeyAvLyBza2lwIGlmIGVtcHR5XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG5cbiAgICAgICAgaWYgKCFlbmFibGVBbGlnbm1lbnQpIHtcbiAgICAgICAgICBhbGlnbmVkXyA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWZXJzZVRleHQgJiYgKG5ld1ZlcnNlVGV4dCAhPT0gaW5pdGlhbFZlcnNlVGV4dCkpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShjdXJyZW50VmVyc2VPYmplY3RzXywgbmV3VmVyc2VUZXh0KVxuICAgICAgICAgIGFsaWduZWRfID0gaXNVc2ZtQWxpZ25lZChyZXN1bHRzPy50YXJnZXRWZXJzZVRleHQsIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRhcmdldFZlcnNlVVNGTSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgICAgICAgICBhbGlnbmVkXyA9IGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlT2JqZWN0cylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWxpZ25lZCAhPT0gYWxpZ25lZF8pIHtcbiAgICAgICAgc2V0U3RhdGUoeyBhbGlnbmVkOiBhbGlnbmVkXyB9KVxuICAgICAgfVxuICAgIH1cbiAgfSwgW2luaXRpYWxWZXJzZU9iamVjdHMsIGFsaWduZXJEYXRhLCBuZXdWZXJzZVRleHQsIGluaXRpYWxWZXJzZVRleHQsIGVuYWJsZUFsaWdubWVudCwgb3JpZ2luYWxWZXJzZU9iamVjdHNdKVxuXG4gIC8qKlxuICAgKiBzZWFyY2ggY2hhcHRlciBvciB2ZXJzZSBjaHVuayB0byBsaW5lIHRoYXQgc3RhcnRzIHdpdGggZmluZEl0ZW1cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBmaW5kSXRlbVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjaHVua3NcbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRSZWZJbkFycmF5KGZpbmRJdGVtLCBjaHVua3MpIHtcbiAgICBjb25zdCByZWZfID0gZmluZEl0ZW0gKyAnJ1xuICAgIGNvbnN0IHJlZkxlbiA9IHJlZl8ubGVuZ3RoXG4gICAgY29uc3QgaW5kZXggPSBjaHVua3MuZmluZEluZGV4KChjaHVuaywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgICBpZiAoY2h1bmsuc3Vic3RyaW5nKDAsIHJlZkxlbikgPT09IHJlZl8pIHtcbiAgICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNodW5rW3JlZl9dXG5cbiAgICAgICAgICBpZiAoKG5leHRDaGFyID4gJzknKSB8fCAobmV4dENoYXIgPCAnMCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaW5kZXhcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDaGFuZ2VzVG9DbG91ZCgpIHtcbiAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gc3RhcnRlZGApXG4gICAgbGV0IHVwZGF0ZWRWZXJzZU9iamVjdHNfXG4gICAgc2V0U3RhdGUoeyBzYXZlSW5pdGlhdGVkOiB0cnVlIH0pXG5cbiAgICBpZiAobmV3QWxpZ25tZW50cykgeyAvLyBpZiB1bnNhdmVkIGFsaWdubWVudCBjaGFuZ2VzLCBhcHBseSB0aGVtXG4gICAgICB1cGRhdGVkVmVyc2VPYmplY3RzXyA9IHVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMoKVxuICAgIH0gZWxzZSBpZiAodmVyc2VUZXh0Q2hhbmdlZCAmJiBuZXdWZXJzZVRleHQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG4gICAgICBjb25zdCB7IHRhcmdldFZlcnNlT2JqZWN0cyB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShjdXJyZW50VmVyc2VPYmplY3RzXywgbmV3VmVyc2VUZXh0KVxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICB9IGVsc2UgeyAvLyBvbmx5IGFsaWdubWVudCBjaGFuZ2VzIHRvIHVwbG9hZFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0c18pIHtcbiAgICAgIGxldCBuZXdVc2ZtXG4gICAgICBjb25zdCByZWYgPSBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZj8uW2N1cnJlbnRWZXJzZU51bV1cbiAgICAgIGNvbnN0IG9yaWdpbmFsVXNmbSA9IGNvcmUuZ2V0UmVzcG9uc2VEYXRhKHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZSlcblxuICAgICAgaWYgKG9yaWdpbmFsVXNmbSkge1xuICAgICAgICBjb25zdCBjaGFwdGVyQ2h1bmtzID0gb3JpZ2luYWxVc2ZtPy5zcGxpdCgnXFxcXGMgJylcbiAgICAgICAgY29uc3QgY2hhcHRlckluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy5jaGFwdGVyLCBjaGFwdGVyQ2h1bmtzKVxuXG4gICAgICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFwdGVyID0gY2hhcHRlckNodW5rc1tjaGFwdGVySW5kZXhdXG4gICAgICAgICAgY29uc3QgdmVyc2VDaHVua3MgPSBjdXJyZW50Q2hhcHRlci5zcGxpdCgnXFxcXHYgJylcbiAgICAgICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgICAgICBpZiAodmVyc2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWZXJzZVVzZm0gPSBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzLmNvbnZlcnRWZXJzZURhdGFUb1VTRk0odXBkYXRlZFZlcnNlT2JqZWN0c18pXG4gICAgICAgICAgICBjb25zdCBvbGRWZXJzZSA9IHZlcnNlQ2h1bmtzW3ZlcnNlSW5kZXhdXG4gICAgICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICAgICAgdmVyc2VDaHVua3NbdmVyc2VJbmRleF0gPSBvbGRWZXJzZS5zdWJzdHJpbmcoMCwgdmVyc2VOdW1MZW4gKyAxKSArIG5ld1ZlcnNlVXNmbVxuICAgICAgICAgICAgY29uc3QgbmV3Q2hhcHRlciA9IHZlcnNlQ2h1bmtzLmpvaW4oJ1xcXFx2ICcpXG4gICAgICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgICAgICBuZXdVc2ZtID0gY2hhcHRlckNodW5rcy5qb2luKCdcXFxcYyAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW5ld1VzZm0pIHtcbiAgICAgICAgY29uc3QgbmV3Qm9va0pzb24gPSB1cGRhdGVWZXJzZU51bShjdXJyZW50VmVyc2VOdW0sIHVwZGF0ZWRWZXJzZU9iamVjdHNfKVxuICAgICAgICBuZXdVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwgeyBmb3JjZWROZXdMaW5lczogdHJ1ZSB9KVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIG5ldyBVU0ZNOiAke25ld1VzZm0uc3Vic3RyaW5nKDAsIDEwMCl9Li4uYClcbiAgICAgIHNldFN0YXRlKHsgc2F2ZUNvbnRlbnQ6IG5ld1VzZm0sIHN0YXJ0U2F2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHdoZW4gc3RhcnRTYXZlIGdvZXMgdHJ1ZSwgc2F2ZSBlZGl0cyB0byB1c2VyIGJyYW5jaCBhbmQgdGhlbiBjbGVhciBzdGFydFNhdmVcbiAgICBjb25zdCBfc2F2ZUVkaXQgPSBhc3luYyAoKSA9PiB7IC8vIGJlZ2luIHVwbG9hZGluZyBuZXcgVVNGTVxuICAgICAgbGV0IGJyYW5jaCA9ICh3b3JraW5nUmVzb3VyY2VCcmFuY2ggIT09ICdtYXN0ZXInKSA/IHdvcmtpbmdSZXNvdXJjZUJyYW5jaCA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoIWJyYW5jaCkge1xuICAgICAgICBicmFuY2ggPSBhd2FpdCBzdGFydEVkaXRCcmFuY2goKSAvLyBtYWtlIHN1cmUgdXNlciBicmFuY2ggZXhpc3RzIGFuZCBnZXQgbmFtZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBvblNhdmVFZGl0KGJyYW5jaCkudGhlbigoc3VjY2VzcykgPT4geyAvLyBwdXNoIGNoYW5nZWQgdG8gc2VydmVyXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2ZSBzY3JpcHR1cmUgZWRpdHMgc3VjY2Vzc2ApXG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogbnVsbCxcbiAgICAgICAgICAgIGVkaXRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgICAgICAgICAgYWxpZ25lckRhdGE6IG51bGwsXG4gICAgICAgICAgICBzdGFydFNhdmU6IGZhbHNlLFxuICAgICAgICAgICAgdmVyc2VUZXh0Q2hhbmdlZDogZmFsc2UsXG4gICAgICAgICAgICBpbml0aWFsVmVyc2VUZXh0OiBudWxsLFxuICAgICAgICAgICAgc2F2ZUluaXRpYXRlZDogZmFsc2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gUmVsb2FkaW5nIHJlc291cmNlJylcbiAgICAgICAgICBzY3JpcHR1cmVDb25maWc/LnJlbG9hZFJlc291cmNlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmluZyBjaGFuZ2VkIHNjcmlwdHVyZSBmYWlsZWQnKVxuICAgICAgICAgIHNldFN0YXRlKHsgc3RhcnRTYXZlOiBmYWxzZSwgc2F2ZUluaXRpYXRlZDogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRTYXZlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gY2FsbGluZyBfc2F2ZUVkaXQoKWApXG4gICAgICBfc2F2ZUVkaXQoKVxuICAgIH1cbiAgfSwgW3N0YXJ0U2F2ZV0pXG5cbiAgLyoqXG4gICAqIHVzZWQgdG8gc2F2ZSBuZXcgdmVyc2Ugb2JqZWN0cyB0byBiaWJsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtvYmplY3RzW119IG5ld1ZlcnNlT2JqZWN0c1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlVmVyc2VOdW0oaW5kZXgsIG5ld1ZlcnNlT2JqZWN0cyA9IGluaXRpYWxWZXJzZU9iamVjdHMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgcmVmID0gc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWY/LltpbmRleF1cbiAgICBsZXQgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG51bGxcblxuICAgIGlmIChyZWYpIHtcbiAgICAgIGlmIChuZXdWZXJzZVRleHQpIHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRWZXJzZU9iamVjdHMgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UobmV3VmVyc2VPYmplY3RzLCBuZXdWZXJzZVRleHQpXG4gICAgICAgIHRhcmdldFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFZlcnNlT2JqZWN0c18gPSBuZXdWZXJzZU9iamVjdHNcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHRhcmdldFZlcnNlT2JqZWN0c18gJiYgc2NyaXB0dXJlQ29uZmlnPy51cGRhdGVWZXJzZShyZWYuY2hhcHRlciwgcmVmLnZlcnNlLCB7IHZlcnNlT2JqZWN0czogdGFyZ2V0VmVyc2VPYmplY3RzXyB9KVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZvciB3aGVuIHVzZXIgY2xpY2tlZCBvbiBhbGlnbm1lbnQgYnV0dG9uIC0gd2lsbCBzaG93IGlmIG5vdCBhbHJlYWR5IHNob3duXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVBbGlnbm1lbnRDbGljaygpIHtcbiAgICBpZiAoZW5hYmxlQWxpZ25tZW50KSB7XG4gICAgICBsZXQgYWxpZ25lckRhdGFfID0gbnVsbFxuICAgICAgYXdhaXQgc3RhcnRFZGl0QnJhbmNoKClcblxuICAgICAgaWYgKCFhbGlnbmVyRGF0YSkgeyAvLyBpZiB3b3JkIGFsaWduZXIgbm90IHNob3duXG4gICAgICAgIGNvbnNvbGUubG9nKGBoYW5kbGVBbGlnbm1lbnRDbGljayAtIHRvZ2dsZSBPTiBhbGlnbm1lbnRgKVxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzZVVTRk0gPSBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgbGV0IG9yaWdpbmFsVmVyc2VVc2ZtID0gbnVsbFxuXG4gICAgICAgIGlmIChvcmlnaW5hbFZlcnNlT2JqZWN0cykge1xuICAgICAgICAgIG9yaWdpbmFsVmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRhcmdldFdvcmRzOiB3b3JkQmFuayxcbiAgICAgICAgICB2ZXJzZUFsaWdubWVudHM6IGFsaWdubWVudHMsXG4gICAgICAgIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnBhcnNlVXNmbVRvV29yZEFsaWduZXJEYXRhKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZVVzZm0pXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IHsgd29yZEJhbmssIGFsaWdubWVudHMgfVxuICAgICAgfSBlbHNlIHsgLy8gd29yZCBhbGlnbmVyIGN1cnJlbnRseSBzaG93blxuICAgICAgICBjb25zb2xlLmxvZyhgaGFuZGxlQWxpZ25tZW50Q2xpY2sgLSBhbGlnbm1lbnQgYWxyZWFkeSBzaG93bmApXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IGFsaWduZXJEYXRhXG4gICAgICB9XG4gICAgICBzZXRTdGF0ZSh7IGFsaWduZXJEYXRhOiBhbGlnbmVyRGF0YV8gfSlcbiAgICAgIGNvbnNvbGUubG9nKGFsaWduZXJEYXRhXylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHVwZGF0ZWQgdmVyc2Ugb2JqZWN0cyBhZnRlciBhbGlnbm1lbnRzIGNoYW5nZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IF9uZXdBbGlnbm1lbnRzIC0gcmVzdWx0cyBvZiBhbGlnbmVyXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKF9uZXdBbGlnbm1lbnRzID0gbmV3QWxpZ25tZW50cykge1xuICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VUZXh0ID0gbmV3VmVyc2VUZXh0IHx8IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgICBjb25zdCB2ZXJzZVVzZm0gPSBBbGlnbm1lbnRIZWxwZXJzLmFkZEFsaWdubWVudHNUb1ZlcnNlVVNGTShfbmV3QWxpZ25tZW50cy50YXJnZXRXb3JkcywgX25ld0FsaWdubWVudHMudmVyc2VBbGlnbm1lbnRzLCB0YXJnZXRWZXJzZVRleHQpXG4gICAgY29uc3QgYWxpZ25lZFZlcnNlT2JqZWN0cyA9IHVzZm1IZWxwZXJzLnVzZm1WZXJzZVRvSnNvbih2ZXJzZVVzZm0pXG4gICAgcmV0dXJuIGFsaWduZWRWZXJzZU9iamVjdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsYmFjayBmb3Igd2hlbiB1c2VyIGNsaWNrZWQgb24gYnV0dG9uIHRvIHNhdmUgY3VycmVudCBhbGlnbm1lbnRzIGluIHdvcmQgYWxpZ25lci4gIEdlbmVyYXRlcyBuZXcgdmVyc2UgY29udGVudCBhbmQgc2F2ZXMgaW4gc3RhdGUuIENsb3NlcyBhbGlnbmVyIGRpc3BsYXlcbiAgICogQHBhcmFtIHtvYmplY3R9IF9uZXdBbGlnbm1lbnRzIC0gcmVzdWx0cyBvZiBhbGlnbmVyXG4gICAqL1xuICBmdW5jdGlvbiBzYXZlQWxpZ25tZW50KF9uZXdBbGlnbm1lbnRzID0gbmV3QWxpZ25tZW50cykge1xuICAgIGNvbnNvbGUubG9nKGBzYXZlQWxpZ25tZW50KCkgLSBuZXdBbGlnbm1lbnRzYCwgX25ld0FsaWdubWVudHMpXG5cbiAgICBpZiAoX25ld0FsaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IGFsaWduZWRWZXJzZU9iamVjdHMgPSB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKF9uZXdBbGlnbm1lbnRzKVxuICAgICAgY29uc29sZS5sb2coYHNhdmVBbGlnbm1lbnQoKSAtIGFsaWduZWRWZXJzZU9iamVjdHNgLCBhbGlnbmVkVmVyc2VPYmplY3RzKVxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgbmV3QWxpZ25tZW50czogbnVsbCxcbiAgICAgICAgYWxpZ25lckRhdGE6IG51bGwsXG4gICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IGFsaWduZWRWZXJzZU9iamVjdHMsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZvciB3aGVuIHVzZXIgY2xpY2tlZCBvbiBidXR0b24gdG8gY2FuY2VsIHdvcmsgaW4gd29yZCBhbGlnbmVyLiAgQ2FsY3VsYXRlcyBhbmQgZGlzcGxheXMgY3VycmVudCBhbGlnbm1lbnQgdmFsaWQgc3RhdGUuIENsb3NlcyBhbGlnbmVyIGRpc3BsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbEFsaWdubWVudCgpIHtcbiAgICBjb25zb2xlLmxvZyhgY2FuY2VsQWxpZ25tZW50KClgKVxuICAgIGNvbnN0IHRhcmdldFZlcnNlVVNGTSA9IGdldEN1cnJlbnRWZXJzZVVzZm0odXBkYXRlZFZlcnNlT2JqZWN0cywgaW5pdGlhbFZlcnNlT2JqZWN0cywgdmVyc2VUZXh0Q2hhbmdlZCwgbmV3VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWQgPSBpc1VzZm1BbGlnbmVkKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzKVxuICAgIHNldFN0YXRlKHsgYWxpZ25lckRhdGE6IG51bGwsIGFsaWduZWQgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsYmFjayBmb3IgYnV0dG9uIHRvIHNldCBlZGl0aW5nIHN0YXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZWRpdGluZ18gLSBpZiB0cnVlLCBlZGl0b3IgaXMgc2hvd24sIG90aGVyd2lzZSBlZGl0b3IgaXMgaGlkZGVuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBzZXRFZGl0aW5nKGVkaXRpbmdfKSB7XG4gICAgaWYgKGVuYWJsZUVkaXQpIHtcbiAgICAgIGlmIChlZGl0aW5nXyAmJiAhZWRpdGluZykge1xuICAgICAgICBhd2FpdCBzdGFydEVkaXRCcmFuY2goKVxuICAgICAgfVxuXG4gICAgICBpZiAoZWRpdGluZ18gIT09IGVkaXRpbmcpIHtcbiAgICAgICAgc2V0U3RhdGUoeyBlZGl0aW5nOiBlZGl0aW5nXyB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsYmFjayBmcm9tIHRoZSBlZGl0IG9uQ2hhbmdlIGV2ZW50IHRvIHVwZGF0ZSBlZGl0IHN0YXRlIHZhcmlhYmxlc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoYW5nZWQgLSB0cnVlIGlmIHRoZSBuZXdWZXJzZVRleHQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGluaXRpYWxWZXJzZVRleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5ld1ZlcnNlVGV4dCAtIGN1cnJlbnQgY2hhbmdlZCB2ZXJzZSB0ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbml0aWFsVmVyc2VUZXh0IC0gaW5pdGlhbCB2ZXJzZSB0ZXh0XG4gICAqL1xuICBmdW5jdGlvbiBzZXRWZXJzZUNoYW5nZWQoY2hhbmdlZCwgbmV3VmVyc2VUZXh0LCBpbml0aWFsVmVyc2VUZXh0KSB7XG4gICAgY29uc3QgeyB0YXJnZXRWZXJzZVRleHQgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UoaW5pdGlhbFZlcnNlT2JqZWN0cywgbmV3VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWQgPSBpc1VzZm1BbGlnbmVkKHRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzKVxuXG4gICAgc2V0U3RhdGUoe1xuICAgICAgdmVyc2VUZXh0Q2hhbmdlZDogY2hhbmdlZCxcbiAgICAgIGluaXRpYWxWZXJzZVRleHQsXG4gICAgICBuZXdWZXJzZVRleHQsXG4gICAgICBhbGlnbmVkLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzID0gUmVhY3QudXNlTWVtbyggKCkgPT4geyAvLyBpZiB2ZXJzZSBoYXMgYmVlbiBlZGl0ZWQgb3IgYWxpZ25tZW50IGNoYW5nZWQsIHRoZW4gZ2VuZXJhdGUgbmV3IHZlcnNlT2JqZWN0cyB0byBkaXNwbGF5IGluIFNjcmlwdHVyZVBhbmVcbiAgICBpZiAoaW5pdGlhbFZlcnNlT2JqZWN0cykge1xuICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzXyA9IHVzZm1IZWxwZXJzLnVzZm1WZXJzZVRvSnNvbih0YXJnZXRWZXJzZVVTRk0pXG4gICAgICByZXR1cm4gY3VycmVudFZlcnNlT2JqZWN0c19cbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxWZXJzZU9iamVjdHNcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dF0pXG5cbiAgY29uc3QgdW5zYXZlZENoYW5nZXM6Ym9vbGVhbiA9IFJlYWN0LnVzZU1lbW8oICgpID0+IHsgLy8gaWYgdmVyc2UgaGFzIGJlZW4gZWRpdGVkIG9yIGFsaWdubWVudCBjaGFuZ2VkLCB0aGVuIGluZGljYXRlIHdlIGhhdmUgdW5zYXZlZCBjaGFuZ2VzXG4gICAgY29uc3QgY2hhbmdlZCA9IHZlcnNlVGV4dENoYW5nZWQgfHwgKHVwZGF0ZWRWZXJzZU9iamVjdHMgJiYgIWlzRXF1YWwoaW5pdGlhbFZlcnNlT2JqZWN0cywgdXBkYXRlZFZlcnNlT2JqZWN0cykpXG4gICAgcmV0dXJuIGNoYW5nZWRcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWRdKVxuXG4gIC8qKlxuICAgKiBjYWxsYmFjayBmb3Igd2hlbiBhbGlnbm1lbnRzIGFyZSBiZWluZyBjaGFuZ2VkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXN1bHRzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYWxpZ25tZW50IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBvbkFsaWdubWVudHNDaGFuZ2UocmVzdWx0cykge1xuICAgIGNvbnNvbGUubG9nKGBvbkFsaWdubWVudHNDaGFuZ2UoKSAtIGFsaWdubWVudCBjaGFuZ2VkLCByZXN1bHRzYCwgcmVzdWx0cykgLy8gbWVyZ2UgYWxpZ25tZW50cyBpbnRvIHRhcmdldCB2ZXJzZSBhbmQgY29udmVydCB0byBVU0ZNXG4gICAgY29uc3QgeyB0YXJnZXRXb3JkcywgdmVyc2VBbGlnbm1lbnRzIH0gPSByZXN1bHRzXG4gICAgY29uc3QgYWxpZ25tZW50Q29tcGxldGUgPSBBbGlnbm1lbnRIZWxwZXJzLmFyZUFsZ25tZW50c0NvbXBsZXRlKHRhcmdldFdvcmRzLCB2ZXJzZUFsaWdubWVudHMpXG4gICAgY29uc29sZS5sb2coYEFsaWdubWVudHMgYXJlICR7YWxpZ25tZW50Q29tcGxldGUgPyAnQ09NUExFVEUhJyA6ICdpbmNvbXBsZXRlJ31gKVxuICAgIHNldFN0YXRlKHsgbmV3QWxpZ25tZW50czogcmVzdWx0cywgYWxpZ25lZDogYWxpZ25tZW50Q29tcGxldGUgfSlcbiAgICByZXR1cm4gYWxpZ25tZW50Q29tcGxldGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWN0aW9uczoge1xuICAgICAgY2FuY2VsQWxpZ25tZW50LFxuICAgICAgY3VycmVudFZlcnNlT2JqZWN0cyxcbiAgICAgIGhhbmRsZUFsaWdubWVudENsaWNrLFxuICAgICAgb25BbGlnbm1lbnRzQ2hhbmdlLFxuICAgICAgc2F2ZUFsaWdubWVudCxcbiAgICAgIHNldEVkaXRpbmcsXG4gICAgICBzZXRWZXJzZUNoYW5nZWQsXG4gICAgICBzYXZlQ2hhbmdlc1RvQ2xvdWQsXG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgYWxpZ25lZCxcbiAgICAgIGFsaWduZXJEYXRhLFxuICAgICAgY3VycmVudFZlcnNlUmVmLFxuICAgICAgZG9pbmdTYXZlOiBzYXZlSW5pdGlhdGVkLFxuICAgICAgZWRpdGluZyxcbiAgICAgIHNvdXJjZUxhbmd1YWdlLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2UsXG4gICAgICB1bnNhdmVkQ2hhbmdlcyxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZV8sXG4gICAgICB0aXRsZSxcbiAgICB9LFxuICB9XG59XG4iXX0=
630
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0LnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIkFsaWdubWVudEhlbHBlcnMiLCJVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIiwidXNmbUhlbHBlcnMiLCJpc0VxdWFsIiwidXNlRGVlcENvbXBhcmVFZmZlY3QiLCJ1c2VFZGl0IiwiY29yZSIsInVzZm1qcyIsIlNjcmlwdHVyZUNvbmZpZyIsIlNlcnZlckNvbmZpZyIsImdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MiLCJnZXRWZXJzZURhdGFGcm9tU2NyaXBDb25maWciLCJPUklHSU5BTF9TT1VSQ0UiLCJ1c2VTY3JpcHR1cmVSZXNvdXJjZXMiLCJpc1VzZm1BbGlnbmVkIiwidGFyZ2V0VmVyc2VVU0ZNIiwib3JpZ2luYWxWZXJzZU9iamVjdHMiLCJsZW5ndGgiLCJleHRyYWN0QWxpZ25tZW50c0Zyb21UYXJnZXRWZXJzZSIsImFsaWdubWVudHMiLCJ3b3JkQmFuayIsImFyZUFsZ25tZW50c0NvbXBsZXRlIiwiZ2V0Q3VycmVudFZlcnNlVXNmbSIsInVwZGF0ZWRWZXJzZU9iamVjdHMiLCJpbml0aWFsVmVyc2VPYmplY3RzIiwidmVyc2VUZXh0Q2hhbmdlZCIsIm5ld1ZlcnNlVGV4dCIsImN1cnJlbnRWZXJzZU9iamVjdHNfIiwidXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UiLCJ0YXJnZXRWZXJzZVRleHQiLCJjb252ZXJ0VmVyc2VEYXRhVG9VU0ZNIiwidXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCIsImF1dGhlbnRpY2F0aW9uIiwiY3VycmVudFZlcnNlTnVtIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsImh0dHBDb25maWciLCJpc05ld1Rlc3RhbWVudCIsImxvZ2dlZEluVXNlciIsIm9yaWdpbmFsTGFuZ3VhZ2VPd25lciIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUNvbmZpZyIsInNjcmlwdHVyZVNldHRpbmdzIiwic3RhcnRFZGl0QnJhbmNoIiwiYm9va0luZGV4Iiwid29ya2luZ1Jlc291cmNlQnJhbmNoIiwidXNlU3RhdGUiLCJhbGlnbmVkIiwiYWxpZ25lckRhdGEiLCJlZGl0aW5nIiwiaW5pdGlhbFZlcnNlVGV4dCIsIm5ld0FsaWdubWVudHMiLCJzYXZlQ29udGVudCIsInN0YXJ0U2F2ZSIsInNoYSIsInN0YXRlIiwic2V0U3RhdGVfIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInByZXZTdGF0ZSIsInJlZmVyZW5jZV8iLCJyZWZlcmVuY2UiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFyU3RhdGUiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXyIsInJlc291cmNlSWQiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzIiwiZmV0Y2hSZXNwXyIsImZldGNoUmVzcG9uc2UiLCJvd25lciIsInJlc291cmNlIiwicmVwbyIsImxhbmd1YWdlSWQiLCJ1c2VFZmZlY3QiLCJkYXRhIiwiZ2V0Qm9va05hbWUiLCJib29rQ2FwcyIsInRvVXBwZXJDYXNlIiwiZmlsZXBhdGgiLCJjb250ZW50IiwiY29uZmlnIiwiY2FjaGUiLCJtYXhBZ2UiLCJ0b2tlbiIsInRpbWVvdXQiLCJzZXJ2ZXJUaW1lT3V0IiwiYXV0aG9yIiwiYnJhbmNoIiwiZWRpdFJlc3BvbnNlIiwiZXJyb3IiLCJpc0VkaXRpbmciLCJpc0Vycm9yIiwib25TYXZlRWRpdCIsInJlc291cmNlTGluayIsIm9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2UiLCJjaGFwdGVyIiwidmVyc2UiLCJjdXJyZW50TGFuZ3VhZ2VJZCIsImN1cnJlbnRPd25lciIsIm5vdEVtcHR5IiwiYWxpZ25lZF8iLCJ2ZXJzZU9iamVjdHMiLCJyZXN1bHRzIiwiZmluZFJlZkluQXJyYXkiLCJmaW5kSXRlbSIsImNodW5rcyIsInJlZl8iLCJyZWZMZW4iLCJpbmRleCIsImZpbmRJbmRleCIsImNodW5rIiwiaWR4Iiwic3Vic3RyaW5nIiwibmV4dENoYXIiLCJzYXZlQ2hhbmdlc1RvQ2xvdWQiLCJ1cGRhdGVkVmVyc2VPYmplY3RzXyIsInVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMiLCJ0YXJnZXRWZXJzZU9iamVjdHMiLCJuZXdVc2ZtIiwicmVmIiwib3JpZ2luYWxVc2ZtIiwiZ2V0UmVzcG9uc2VEYXRhIiwiY2hhcHRlckNodW5rcyIsInNwbGl0IiwiY2hhcHRlckluZGV4IiwiY3VycmVudENoYXB0ZXIiLCJ2ZXJzZUNodW5rcyIsInZlcnNlSW5kZXgiLCJuZXdWZXJzZVVzZm0iLCJvbGRWZXJzZSIsInZlcnNlTnVtTGVuIiwibmV3Q2hhcHRlciIsImpvaW4iLCJuZXdCb29rSnNvbiIsInVwZGF0ZVZlcnNlTnVtIiwidG9VU0ZNIiwiZm9yY2VkTmV3TGluZXMiLCJfc2F2ZUVkaXQiLCJ1bmRlZmluZWQiLCJ0aGVuIiwic3VjY2VzcyIsImluZm8iLCJyZWxvYWRSZXNvdXJjZSIsInZlcnNlTnVtIiwibmV3VmVyc2VPYmplY3RzIiwidGFyZ2V0VmVyc2VPYmplY3RzXyIsInVwZGF0ZVZlcnNlIiwiaGFuZGxlQWxpZ25tZW50Q2xpY2siLCJhbGlnbmVyRGF0YV8iLCJvcmlnaW5hbFZlcnNlVXNmbSIsInBhcnNlVXNmbVRvV29yZEFsaWduZXJEYXRhIiwidGFyZ2V0V29yZHMiLCJ2ZXJzZUFsaWdubWVudHMiLCJ2ZXJzZVVzZm0iLCJhZGRBbGlnbm1lbnRzVG9WZXJzZVVTRk0iLCJhbGlnbmVkVmVyc2VPYmplY3RzIiwidXNmbVZlcnNlVG9Kc29uIiwic2F2ZUFsaWdubWVudCIsImNhbmNlbEFsaWdubWVudCIsInNldEVkaXRpbmciLCJlZGl0aW5nXyIsInNldFZlcnNlQ2hhbmdlZCIsImNoYW5nZWQiLCJlZGl0ZWRWZXJzZU9iamVjdHMiLCJ1c2VNZW1vIiwidW5zYXZlZENoYW5nZXMiLCJvbkFsaWdubWVudHNDaGFuZ2UiLCJhbGlnbm1lbnRDb21wbGV0ZSIsImFjdGlvbnMiXSwibWFwcGluZ3Mi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QUFBLGNBQWMsRUFBZEE7QUFMSztBQVhGLEdBQVA7QUFtQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIEFsaWdubWVudEhlbHBlcnMsXG4gIFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMsXG4gIHVzZm1IZWxwZXJzLFxufSBmcm9tICd3b3JkLWFsaWduZXItcmNsJ1xuaW1wb3J0ICogYXMgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJ1xuaW1wb3J0IHVzZURlZXBDb21wYXJlRWZmZWN0IGZyb20gJ3VzZS1kZWVwLWNvbXBhcmUtZWZmZWN0J1xuaW1wb3J0IHsgdXNlRWRpdCB9IGZyb20gJ2dpdGVhLXJlYWN0LXRvb2xraXQnXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnc2NyaXB0dXJlLXJlc291cmNlcy1yY2wnXG5pbXBvcnQgdXNmbWpzIGZyb20gJ3VzZm0tanMnXG5pbXBvcnQgeyBTY3JpcHR1cmVDb25maWcsIFNlcnZlckNvbmZpZyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHtcbiAgZ2V0U2NyaXB0dXJlUmVzb3VyY2VTZXR0aW5ncyxcbiAgZ2V0VmVyc2VEYXRhRnJvbVNjcmlwQ29uZmlnXG59IGZyb20gJy4uL3V0aWxzL1NjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHsgT1JJR0lOQUxfU09VUkNFIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgdXNlU2NyaXB0dXJlUmVzb3VyY2VzIGZyb20gJy4vdXNlU2NyaXB0dXJlUmVzb3VyY2VzJ1xuXG5pbnRlcmZhY2UgU3RhcnRFZGl0IHtcbiAgKCk6IFByb21pc2U8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgYXV0aGVudGljYXRpb246IHsgY29uZmlnOiBvYmplY3QsIHRva2VuOiBzdHJpbmcgfSxcbiAgY3VycmVudFZlcnNlTnVtOiBudW1iZXIsXG4gIGVuYWJsZUVkaXQ6IGJvb2xlYW4sXG4gIGVuYWJsZUFsaWdubWVudDogYm9vbGVhbixcbiAgaHR0cENvbmZpZzogU2VydmVyQ29uZmlnLFxuICBpbml0aWFsVmVyc2VPYmplY3RzOiBbXSxcbiAgaXNOZXdUZXN0YW1lbnQ6IGJvb2xlYW4sXG4gIGxvZ2dlZEluVXNlcjogc3RyaW5nLFxuICBvcmlnaW5hbExhbmd1YWdlT3duZXI6IHN0cmluZyxcbiAgb3JpZ2luYWxSZXBvVXJsOiBzdHJpbmcsXG4gIHNjcmlwdHVyZUNvbmZpZzogU2NyaXB0dXJlQ29uZmlnLFxuICBzY3JpcHR1cmVTZXR0aW5nczogeyB9LFxuICBzZXRTYXZlZENoYW5nZXM6IEZ1bmN0aW9uLFxuICBzdGFydEVkaXRCcmFuY2g6IFN0YXJ0RWRpdCxcbiAgYm9va0luZGV4OiBzdHJpbmcsXG4gIHdvcmtpbmdSZXNvdXJjZUJyYW5jaDogc3RyaW5nLFxufVxuXG5mdW5jdGlvbiBpc1VzZm1BbGlnbmVkKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZU9iamVjdHMpIHtcbiAgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBvcmlnaW5hbFZlcnNlT2JqZWN0cz8ubGVuZ3RoID8gb3JpZ2luYWxWZXJzZU9iamVjdHMgOiBudWxsIC8vIG1ha2Ugc3VyZSBub3QgcGFzc2luZyBlbXB0eSBBcnJheVxuICBjb25zdCB7IGFsaWdubWVudHMsIHdvcmRCYW5rIH0gPSBBbGlnbm1lbnRIZWxwZXJzLmV4dHJhY3RBbGlnbm1lbnRzRnJvbVRhcmdldFZlcnNlKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gIHJldHVybiBBbGlnbm1lbnRIZWxwZXJzLmFyZUFsZ25tZW50c0NvbXBsZXRlKHdvcmRCYW5rLCBhbGlnbm1lbnRzKVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQ6IGJvb2xlYW4sIG5ld1ZlcnNlVGV4dCkge1xuICBsZXQgdGFyZ2V0VmVyc2VVU0ZNID0gbnVsbFxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHMgfHwgaW5pdGlhbFZlcnNlT2JqZWN0c1xuXG4gIGlmICh2ZXJzZVRleHRDaGFuZ2VkICYmIG5ld1ZlcnNlVGV4dCkge1xuICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VUZXh0IH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgdGFyZ2V0VmVyc2VVU0ZNID0gdGFyZ2V0VmVyc2VUZXh0XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0VmVyc2VVU0ZNID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICB9XG4gIHJldHVybiB0YXJnZXRWZXJzZVVTRk1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNjcmlwdHVyZUFsaWdubWVudEVkaXQoe1xuICBhdXRoZW50aWNhdGlvbixcbiAgY3VycmVudFZlcnNlTnVtLFxuICBlbmFibGVFZGl0LFxuICBlbmFibGVBbGlnbm1lbnQsXG4gIGh0dHBDb25maWcsXG4gIGluaXRpYWxWZXJzZU9iamVjdHMsXG4gIGlzTmV3VGVzdGFtZW50LFxuICBsb2dnZWRJblVzZXIsXG4gIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgb3JpZ2luYWxSZXBvVXJsLFxuICBzY3JpcHR1cmVDb25maWcsXG4gIHNjcmlwdHVyZVNldHRpbmdzLFxuICBzdGFydEVkaXRCcmFuY2gsXG4gIGJvb2tJbmRleCxcbiAgd29ya2luZ1Jlc291cmNlQnJhbmNoLFxufSA6IFByb3BzKSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVfXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBhbGlnbmVkOiBmYWxzZSxcbiAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICBpbml0aWFsVmVyc2VUZXh0OiBudWxsLFxuICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZDogZmFsc2UsXG4gICAgc2F2ZUNvbnRlbnQ6IG51bGwsXG4gICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICBzaGE6IG51bGwsXG4gIH0pXG5cbiAgY29uc3Qge1xuICAgIGFsaWduZWQsXG4gICAgYWxpZ25lckRhdGEsXG4gICAgZWRpdGluZyxcbiAgICBpbml0aWFsVmVyc2VUZXh0LFxuICAgIG5ld0FsaWdubWVudHMsXG4gICAgbmV3VmVyc2VUZXh0LFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHMsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZCxcbiAgICBzYXZlQ29udGVudCxcbiAgICBzdGFydFNhdmUsXG4gICAgc2hhLFxuICB9ID0gc3RhdGVcblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgIHNldFN0YXRlXyhwcmV2U3RhdGUgPT4gKHsgLi4ucHJldlN0YXRlLCAuLi5uZXdTdGF0ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IHJlZmVyZW5jZV8gPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZSB8fCBudWxsXG5cbiAgdXNlRGVlcENvbXBhcmVFZmZlY3QoKCkgPT4geyAvLyBjaGVjayBmb3IgY29udGV4dCBjaGFuZ2VzLCByZXNldCBlZGl0IGFuZCBhbGlnbm1lbnQgc3RhdGVcbiAgICBjb25zb2xlLmxvZyhgcmVmZXJlbmNlIGNoYW5nZWQgJHtKU09OLnN0cmluZ2lmeShyZWZlcmVuY2VfKX1gKVxuICAgIGNvbnN0IGNsZWFyU3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICBuZXdBbGlnbm1lbnRzOiBudWxsLFxuICAgICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogbnVsbCxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgIH1cblxuICAgIGlmICghaXNFcXVhbChzdGF0ZSwgY2xlYXJTdGF0ZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGByZWZlcmVuY2UgY2hhbmdlZCwgcmVzZXQgZWRpdC9hbGlnbm1lbnQgc3RhdGUgdmFyaWFibGVzYClcbiAgICAgIHNldFN0YXRlKGNsZWFyU3RhdGUpXG4gICAgfVxuICB9LCBbcmVmZXJlbmNlX10pXG5cbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5nc18gPSB7XG4gICAgLi4uc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgcmVzb3VyY2VJZDogT1JJR0lOQUxfU09VUkNFLFxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwQ29uZmlnID0gaHR0cENvbmZpZyB8fCB7fVxuICBjb25zdCBib29rSWQgPSByZWZlcmVuY2VfPy5wcm9qZWN0SWRcbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5ncyA9IGdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MoXG4gICAgYm9va0lkLCBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXywgaXNOZXdUZXN0YW1lbnQsIG9yaWdpbmFsUmVwb1VybCxcbiAgKVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgZmV0Y2hSZXNwXyA9IHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZVxuICBjb25zdCBvd25lciA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/Lm93bmVyXG4gIGNvbnN0IHJlcG8gPSBgJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5sYW5ndWFnZUlkfV8ke3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnByb2plY3RJZH1gXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gZ2V0IHRoZSBzaGEgZnJvbSBsYXN0IHNjcmlwdHVyZSBkb3dubG9hZFxuICAgIGNvbnN0IHNoYSA9IGZldGNoUmVzcF8/LmRhdGE/LnNoYSB8fCBudWxsXG4gICAgY29uc29sZS5sb2coYGZvciAke0pTT04uc3RyaW5naWZ5KHJlZmVyZW5jZV8pfSBuZXcgc2hhIGlzICR7c2hhfWApXG4gICAgc2V0U3RhdGUoeyBzaGEgfSlcbiAgICAvLyBAdHMtaWdub3JlXG4gIH0sIFtmZXRjaFJlc3BfXSlcblxuICBmdW5jdGlvbiBnZXRCb29rTmFtZSgpIHtcbiAgICBjb25zdCBib29rQ2FwcyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlPy5wcm9qZWN0SWQgPyBzY3JpcHR1cmVDb25maWcucmVmZXJlbmNlLnByb2plY3RJZC50b1VwcGVyQ2FzZSgpIDogJydcbiAgICByZXR1cm4gYCR7Ym9va0luZGV4fS0ke2Jvb2tDYXBzfS51c2ZtYFxuICB9XG5cbiAgY29uc3QgZmlsZXBhdGggPSBnZXRCb29rTmFtZSgpXG5cbiAgLy8gVE9ETzogIGVuYWJsZSBzYXZlXG4gIGNvbnN0IHtcbiAgICBlZGl0UmVzcG9uc2UsXG4gICAgZXJyb3IsXG4gICAgaXNFZGl0aW5nLFxuICAgIGlzRXJyb3IsXG4gICAgb25TYXZlRWRpdCxcbiAgfSA9IHVzZUVkaXQoe1xuICAgIHNoYSxcbiAgICBvd25lcixcbiAgICBjb250ZW50OiBzYXZlQ29udGVudCxcbiAgICBjb25maWc6IHtcbiAgICAgIGNhY2hlOiB7IG1heEFnZTogMCB9LFxuICAgICAgLi4uYXV0aGVudGljYXRpb24/LmNvbmZpZyxcbiAgICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aW1lb3V0OiBodHRwQ29uZmlnPy5zZXJ2ZXJUaW1lT3V0IHx8IGh0dHBDb25maWc/LnRpbWVvdXQgfHwgNTAwMCxcbiAgICB9LFxuICAgIGF1dGhvcjogbG9nZ2VkSW5Vc2VyLFxuICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgYnJhbmNoOiB3b3JraW5nUmVzb3VyY2VCcmFuY2gsXG4gICAgZmlsZXBhdGgsXG4gICAgcmVwbyxcbiAgfSlcblxuICBpZiAoIWVuYWJsZUFsaWdubWVudCkgeyAvLyBpZiBub3QgZW5hYmxlZCwgdGhlbiB3ZSBkb24ndCBmZXRjaCByZXNvdXJjZVxuICAgIG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3MucmVzb3VyY2VMaW5rID0gbnVsbFxuICB9XG5cbiAgLy8gZ2V0IG9yaWdpbmFsIGxhbmd1YWdlIGZvciBhbGlnbm1lbnRcbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZSA9IHVzZVNjcmlwdHVyZVJlc291cmNlcyh7XG4gICAgYm9va0lkLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzOiBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzLFxuICAgIGNoYXB0ZXI6IHJlZmVyZW5jZV8/LmNoYXB0ZXIsXG4gICAgdmVyc2U6IHJlZmVyZW5jZV8/LnZlcnNlLFxuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIG9yaWdpbmFsUmVwb1VybCxcbiAgICBjdXJyZW50TGFuZ3VhZ2VJZDogb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5ncz8ubGFuZ3VhZ2VJZCxcbiAgICBjdXJyZW50T3duZXI6IG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICBodHRwQ29uZmlnLFxuICB9KVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHVwZGF0ZSBhbGlnbm1lbnQgc3RhdHVzIHdoZW4gYWxpZ25lciBpcyBoaWRkZW5cbiAgICBjb25zdCBub3RFbXB0eSA9ICEhaW5pdGlhbFZlcnNlT2JqZWN0c1xuICAgIGxldCBhbGlnbmVkXyA9IGZhbHNlXG5cbiAgICBpZiAoIWFsaWduZXJEYXRhKSB7IC8vIHNraXAgaWYgYWxpZ25lciBpcyBiZWluZyBzaG93blxuICAgICAgaWYgKG5vdEVtcHR5KSB7IC8vIHNraXAgaWYgZW1wdHlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNcbiAgICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcblxuICAgICAgICBpZiAoIWVuYWJsZUFsaWdubWVudCkge1xuICAgICAgICAgIGFsaWduZWRfID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZlcnNlVGV4dCAmJiAobmV3VmVyc2VUZXh0ICE9PSBpbml0aWFsVmVyc2VUZXh0KSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgICAgICAgYWxpZ25lZF8gPSBpc1VzZm1BbGlnbmVkKHJlc3VsdHM/LnRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICAgICAgICAgIGFsaWduZWRfID0gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGlnbmVkICE9PSBhbGlnbmVkXykge1xuICAgICAgICBzZXRTdGF0ZSh7IGFsaWduZWQ6IGFsaWduZWRfIH0pXG4gICAgICB9XG4gICAgfVxuICB9LCBbaW5pdGlhbFZlcnNlT2JqZWN0cywgYWxpZ25lckRhdGEsIG5ld1ZlcnNlVGV4dCwgaW5pdGlhbFZlcnNlVGV4dCwgZW5hYmxlQWxpZ25tZW50LCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNdKVxuXG4gIC8qKlxuICAgKiBzZWFyY2ggY2hhcHRlciBvciB2ZXJzZSBjaHVuayB0byBsaW5lIHRoYXQgc3RhcnRzIHdpdGggZmluZEl0ZW1cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBmaW5kSXRlbVxuICAgKiBAcGFyYW0ge2FycmF5W3N0cmluZ119IGNodW5rc1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZFJlZkluQXJyYXkoZmluZEl0ZW0sIGNodW5rcykge1xuICAgIGNvbnN0IHJlZl8gPSBmaW5kSXRlbSArICcnXG4gICAgY29uc3QgcmVmTGVuID0gcmVmXy5sZW5ndGhcbiAgICBjb25zdCBpbmRleCA9IGNodW5rcy5maW5kSW5kZXgoKGNodW5rLCBpZHgpID0+IHtcbiAgICAgIGlmIChpZHggPiAwKSB7XG4gICAgICAgIGlmIChjaHVuay5zdWJzdHJpbmcoMCwgcmVmTGVuKSA9PT0gcmVmXykge1xuICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gY2h1bmtbcmVmX11cblxuICAgICAgICAgIGlmICgobmV4dENoYXIgPiAnOScpIHx8IChuZXh0Q2hhciA8ICcwJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICAgIHJldHVybiBpbmRleFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUNoYW5nZXNUb0Nsb3VkKCkge1xuICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBzdGFydGVkYClcbiAgICBsZXQgdXBkYXRlZFZlcnNlT2JqZWN0c19cblxuICAgIGlmIChuZXdBbGlnbm1lbnRzKSB7IC8vIGlmIHVuc2F2ZWQgYWxpZ25tZW50IGNoYW5nZXMsIGFwcGx5IHRoZW1cbiAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHNfID0gdXBkYXRlVmVyc2VXaXRoTmV3QWxpZ25tZW50cygpXG4gICAgfSBlbHNlIGlmICh2ZXJzZVRleHRDaGFuZ2VkICYmIG5ld1ZlcnNlVGV4dCkge1xuICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VUZXh0LCB0YXJnZXRWZXJzZU9iamVjdHMgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UoY3VycmVudFZlcnNlT2JqZWN0c18sIG5ld1ZlcnNlVGV4dClcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIG5ldyB0ZXh0OmAsIHRhcmdldFZlcnNlVGV4dC5zdWJzdHJpbmcoMCwxMDApKVxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICB9IGVsc2UgeyAvLyBvbmx5IGFsaWdubWVudCBjaGFuZ2VzIHRvIHVwbG9hZFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0c18pIHtcbiAgICAgIGxldCBuZXdVc2ZtXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCByZWYgPSBnZXRWZXJzZURhdGFGcm9tU2NyaXBDb25maWcoc2NyaXB0dXJlQ29uZmlnLCBjdXJyZW50VmVyc2VOdW0pXG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IG9yaWdpbmFsVXNmbSA9IGNvcmUuZ2V0UmVzcG9uc2VEYXRhKHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZSlcblxuICAgICAgaWYgKG9yaWdpbmFsVXNmbSkge1xuICAgICAgICBjb25zdCBjaGFwdGVyQ2h1bmtzID0gb3JpZ2luYWxVc2ZtPy5zcGxpdCgnXFxcXGMgJylcbiAgICAgICAgY29uc3QgY2hhcHRlckluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy5jaGFwdGVyLCBjaGFwdGVyQ2h1bmtzKVxuXG4gICAgICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFwdGVyID0gY2hhcHRlckNodW5rc1tjaGFwdGVySW5kZXhdXG4gICAgICAgICAgY29uc3QgdmVyc2VDaHVua3MgPSBjdXJyZW50Q2hhcHRlci5zcGxpdCgnXFxcXHYgJylcbiAgICAgICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgICAgICBpZiAodmVyc2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWZXJzZVVzZm0gPSBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzLmNvbnZlcnRWZXJzZURhdGFUb1VTRk0odXBkYXRlZFZlcnNlT2JqZWN0c18pXG4gICAgICAgICAgICBjb25zdCBvbGRWZXJzZSA9IHZlcnNlQ2h1bmtzW3ZlcnNlSW5kZXhdXG4gICAgICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICAgICAgdmVyc2VDaHVua3NbdmVyc2VJbmRleF0gPSBvbGRWZXJzZS5zdWJzdHJpbmcoMCwgdmVyc2VOdW1MZW4gKyAxKSArIG5ld1ZlcnNlVXNmbVxuICAgICAgICAgICAgY29uc3QgbmV3Q2hhcHRlciA9IHZlcnNlQ2h1bmtzLmpvaW4oJ1xcXFx2ICcpXG4gICAgICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgICAgICBuZXdVc2ZtID0gY2hhcHRlckNodW5rcy5qb2luKCdcXFxcYyAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW5ld1VzZm0pIHtcbiAgICAgICAgY29uc3QgbmV3Qm9va0pzb24gPSB1cGRhdGVWZXJzZU51bShjdXJyZW50VmVyc2VOdW0sIHVwZGF0ZWRWZXJzZU9iamVjdHNfKVxuICAgICAgICBuZXdVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwgeyBmb3JjZWROZXdMaW5lczogdHJ1ZSB9KVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIG5ldyBVU0ZNOiAke25ld1VzZm0uc3Vic3RyaW5nKDAsIDEwMCl9Li4uYClcbiAgICAgIHNldFN0YXRlKHsgc2F2ZUNvbnRlbnQ6IG5ld1VzZm0sIHN0YXJ0U2F2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgX3NhdmVFZGl0ID0gYXN5bmMgKCkgPT4geyAvLyBiZWdpbiB1cGxvYWRpbmcgbmV3IFVTRk1cbiAgICAgIGxldCBicmFuY2ggPSAod29ya2luZ1Jlc291cmNlQnJhbmNoICE9PSAnbWFzdGVyJykgPyB3b3JraW5nUmVzb3VyY2VCcmFuY2ggOiB1bmRlZmluZWRcblxuICAgICAgaWYgKCFicmFuY2gpIHtcbiAgICAgICAgYnJhbmNoID0gYXdhaXQgc3RhcnRFZGl0QnJhbmNoKCkgLy8gbWFrZSBzdXJlIHVzZXIgYnJhbmNoIGV4aXN0cyBhbmQgZ2V0IG5hbWVcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb25TYXZlRWRpdChicmFuY2gpLnRoZW4oKHN1Y2Nlc3MpID0+IHsgLy8gcHVzaCBjaGFuZ2VkIHRvIHNlcnZlclxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmUgc2NyaXB0dXJlIGVkaXRzIHN1Y2Nlc3NgKVxuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG5ld1ZlcnNlVGV4dDogbnVsbCxcbiAgICAgICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICAgICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICAgICAgICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaW5pdGlhbFZlcnNlVGV4dDogbnVsbCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBSZWxvYWRpbmcgcmVzb3VyY2UnKVxuICAgICAgICAgIHNjcmlwdHVyZUNvbmZpZz8ucmVsb2FkUmVzb3VyY2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIGNoYW5nZWQgc2NyaXB0dXJlIGZhaWxlZCcpXG4gICAgICAgICAgc2V0U3RhdGUoeyBzdGFydFNhdmU6IGZhbHNlIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0U2F2ZSkge1xuICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGNhbGxpbmcgX3NhdmVFZGl0KClgKVxuICAgICAgX3NhdmVFZGl0KClcbiAgICB9XG4gIH0sIFtzdGFydFNhdmVdKVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZlcnNlTnVtKHZlcnNlTnVtLCBuZXdWZXJzZU9iamVjdHMgPSBpbml0aWFsVmVyc2VPYmplY3RzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHJlZiA9IGdldFZlcnNlRGF0YUZyb21TY3JpcENvbmZpZyhzY3JpcHR1cmVDb25maWcsIHZlcnNlTnVtKVxuICAgIGxldCB0YXJnZXRWZXJzZU9iamVjdHNfID0gbnVsbFxuXG4gICAgaWYgKHJlZikge1xuICAgICAgaWYgKG5ld1ZlcnNlVGV4dCkge1xuICAgICAgICBjb25zdCB7IHRhcmdldFZlcnNlT2JqZWN0cyB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShuZXdWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHRhcmdldFZlcnNlT2JqZWN0c1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG5ld1ZlcnNlT2JqZWN0c1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gdGFyZ2V0VmVyc2VPYmplY3RzXyAmJiBzY3JpcHR1cmVDb25maWc/LnVwZGF0ZVZlcnNlKHJlZi5jaGFwdGVyLCByZWYudmVyc2UsIHsgdmVyc2VPYmplY3RzOiB0YXJnZXRWZXJzZU9iamVjdHNfIH0pXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVBbGlnbm1lbnRDbGljaygpIHtcbiAgICBpZiAoZW5hYmxlQWxpZ25tZW50KSB7XG4gICAgICBsZXQgYWxpZ25lckRhdGFfID0gbnVsbFxuICAgICAgYXdhaXQgc3RhcnRFZGl0QnJhbmNoKClcblxuICAgICAgaWYgKCFhbGlnbmVyRGF0YSkgeyAvLyBpZiB3b3JkIGFsaWduZXIgbm90IHNob3duXG4gICAgICAgIGNvbnNvbGUubG9nKGBoYW5kbGVBbGlnbm1lbnRDbGljayAtIHRvZ2dsZSBPTiBhbGlnbm1lbnRgKVxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzZVVTRk0gPSBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNcbiAgICAgICAgbGV0IG9yaWdpbmFsVmVyc2VVc2ZtID0gbnVsbFxuXG4gICAgICAgIGlmIChvcmlnaW5hbFZlcnNlT2JqZWN0cykge1xuICAgICAgICAgIG9yaWdpbmFsVmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRhcmdldFdvcmRzOiB3b3JkQmFuayxcbiAgICAgICAgICB2ZXJzZUFsaWdubWVudHM6IGFsaWdubWVudHMsXG4gICAgICAgIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnBhcnNlVXNmbVRvV29yZEFsaWduZXJEYXRhKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZVVzZm0pXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IHsgd29yZEJhbmssIGFsaWdubWVudHMgfVxuICAgICAgfSBlbHNlIHsgLy8gd29yZCBhbGlnbmVyIGN1cnJlbnRseSBzaG93blxuICAgICAgICBjb25zb2xlLmxvZyhgaGFuZGxlQWxpZ25tZW50Q2xpY2sgLSBhbGlnbm1lbnQgYWxyZWFkeSBzaG93bmApXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IGFsaWduZXJEYXRhXG4gICAgICB9XG4gICAgICBzZXRTdGF0ZSh7IGFsaWduZXJEYXRhOiBhbGlnbmVyRGF0YV8gfSlcbiAgICAgIGNvbnNvbGUubG9nKGFsaWduZXJEYXRhXylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKCkge1xuICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VUZXh0ID0gbmV3VmVyc2VUZXh0IHx8IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgICBjb25zdCB2ZXJzZVVzZm0gPSBBbGlnbm1lbnRIZWxwZXJzLmFkZEFsaWdubWVudHNUb1ZlcnNlVVNGTShuZXdBbGlnbm1lbnRzLnRhcmdldFdvcmRzLCBuZXdBbGlnbm1lbnRzLnZlcnNlQWxpZ25tZW50cywgdGFyZ2V0VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWRWZXJzZU9iamVjdHMgPSB1c2ZtSGVscGVycy51c2ZtVmVyc2VUb0pzb24odmVyc2VVc2ZtKVxuICAgIHJldHVybiBhbGlnbmVkVmVyc2VPYmplY3RzXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBzYXZlQWxpZ25tZW50KClgKVxuXG4gICAgaWYgKG5ld0FsaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IGFsaWduZWRWZXJzZU9iamVjdHMgPSB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKClcblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IGFsaWduZWRWZXJzZU9iamVjdHMsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBjYW5jZWxBbGlnbm1lbnQoKWApXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgY29uc3QgYWxpZ25lZCA9IGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHMpXG4gICAgc2V0U3RhdGUoeyBhbGlnbmVyRGF0YTogbnVsbCwgYWxpZ25lZCB9KVxuICB9XG5cbiAgLy8gVE9ETzogQ2hhbmdlIHRoaXMgZnVuY3Rpb24gdG8gdGFrZSBjdXJyZW50VmVyc2VOdW0gdG8gc2V0IGVkaXRpbmcgdmVyc2VcbiAgYXN5bmMgZnVuY3Rpb24gc2V0RWRpdGluZyhlZGl0aW5nXykge1xuICAgIGlmIChlbmFibGVFZGl0KSB7XG4gICAgICBpZiAoZWRpdGluZ18gJiYgIWVkaXRpbmcpIHtcbiAgICAgICAgYXdhaXQgc3RhcnRFZGl0QnJhbmNoKClcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRpbmdfICE9PSBlZGl0aW5nKSB7XG4gICAgICAgIHNldFN0YXRlKHsgZWRpdGluZzogZWRpdGluZ18gfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRWZXJzZUNoYW5nZWQoY2hhbmdlZCwgbmV3VmVyc2VUZXh0LCBpbml0aWFsVmVyc2VUZXh0KSB7XG4gICAgY29uc3QgeyB0YXJnZXRWZXJzZVRleHQgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UoaW5pdGlhbFZlcnNlT2JqZWN0cywgbmV3VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWQgPSBpc1VzZm1BbGlnbmVkKHRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzKVxuXG4gICAgc2V0U3RhdGUoe1xuICAgICAgdmVyc2VUZXh0Q2hhbmdlZDogY2hhbmdlZCxcbiAgICAgIGluaXRpYWxWZXJzZVRleHQsXG4gICAgICBuZXdWZXJzZVRleHQsXG4gICAgICBhbGlnbmVkLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBlZGl0ZWRWZXJzZU9iamVjdHMgPSBSZWFjdC51c2VNZW1vKCAoKSA9PiB7IC8vIGlmIHZlcnNlIGhhcyBiZWVuIGVkaXRlZCBvciBhbGlnbm1lbnQgY2hhbmdlZCwgdGhlbiBnZW5lcmF0ZSBuZXcgdmVyc2VPYmplY3RzIHRvIGRpc3BsYXkgaW4gU2NyaXB0dXJlUGFuZVxuICAgIGlmIChpbml0aWFsVmVyc2VPYmplY3RzKSB7XG4gICAgICBjb25zdCB0YXJnZXRWZXJzZVVTRk0gPSBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dClcbiAgICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXNmbUhlbHBlcnMudXNmbVZlcnNlVG9Kc29uKHRhcmdldFZlcnNlVVNGTSlcbiAgICAgIHJldHVybiBjdXJyZW50VmVyc2VPYmplY3RzX1xuICAgIH1cbiAgICByZXR1cm4gaW5pdGlhbFZlcnNlT2JqZWN0c1xuICB9LCBbdXBkYXRlZFZlcnNlT2JqZWN0cywgaW5pdGlhbFZlcnNlT2JqZWN0cywgdmVyc2VUZXh0Q2hhbmdlZCwgbmV3VmVyc2VUZXh0XSlcblxuICBjb25zdCB1bnNhdmVkQ2hhbmdlczpib29sZWFuID0gUmVhY3QudXNlTWVtbyggKCkgPT4geyAvLyBpZiB2ZXJzZSBoYXMgYmVlbiBlZGl0ZWQgb3IgYWxpZ25tZW50IGNoYW5nZWQsIHRoZW4gaW5kaWNhdGUgd2UgaGF2ZSB1bnNhdmVkIGNoYW5nZXNcbiAgICBjb25zdCBjaGFuZ2VkID0gdmVyc2VUZXh0Q2hhbmdlZCB8fCAodXBkYXRlZFZlcnNlT2JqZWN0cyAmJiAhaXNFcXVhbChpbml0aWFsVmVyc2VPYmplY3RzLCB1cGRhdGVkVmVyc2VPYmplY3RzKSlcbiAgICByZXR1cm4gY2hhbmdlZFxuICB9LCBbdXBkYXRlZFZlcnNlT2JqZWN0cywgaW5pdGlhbFZlcnNlT2JqZWN0cywgdmVyc2VUZXh0Q2hhbmdlZF0pXG5cbiAgZnVuY3Rpb24gb25BbGlnbm1lbnRzQ2hhbmdlKHJlc3VsdHMpIHtcbiAgICBjb25zb2xlLmxvZyhgb25BbGlnbm1lbnRzQ2hhbmdlKCkgLSBhbGlnbm1lbnQgY2hhbmdlZCwgcmVzdWx0c2AsIHJlc3VsdHMpIC8vIG1lcmdlIGFsaWdubWVudHMgaW50byB0YXJnZXQgdmVyc2UgYW5kIGNvbnZlcnQgdG8gVVNGTVxuICAgIGNvbnN0IHsgdGFyZ2V0V29yZHMsIHZlcnNlQWxpZ25tZW50cyB9ID0gcmVzdWx0c1xuICAgIGNvbnN0IGFsaWdubWVudENvbXBsZXRlID0gQWxpZ25tZW50SGVscGVycy5hcmVBbGdubWVudHNDb21wbGV0ZSh0YXJnZXRXb3JkcywgdmVyc2VBbGlnbm1lbnRzKVxuICAgIGNvbnNvbGUubG9nKGBBbGlnbm1lbnRzIGFyZSAke2FsaWdubWVudENvbXBsZXRlID8gJ0NPTVBMRVRFIScgOiAnaW5jb21wbGV0ZSd9YClcbiAgICBzZXRTdGF0ZSh7IG5ld0FsaWdubWVudHM6IHJlc3VsdHMsIGFsaWduZWQ6IGFsaWdubWVudENvbXBsZXRlIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGlvbnM6IHtcbiAgICAgIGNhbmNlbEFsaWdubWVudCxcbiAgICAgIGVkaXRlZFZlcnNlT2JqZWN0cyxcbiAgICAgIGhhbmRsZUFsaWdubWVudENsaWNrLFxuICAgICAgb25BbGlnbm1lbnRzQ2hhbmdlLFxuICAgICAgc2F2ZUFsaWdubWVudCxcbiAgICAgIHNldEVkaXRpbmcsXG4gICAgICBzZXRWZXJzZUNoYW5nZWQsXG4gICAgICBzYXZlQ2hhbmdlc1RvQ2xvdWQsXG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgYWxpZ25lZCxcbiAgICAgIGFsaWduZXJEYXRhLFxuICAgICAgZWRpdGluZyxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gICAgICB1bnNhdmVkQ2hhbmdlcyxcbiAgICB9LFxuICB9XG59XG4iXX0=