single-scripture-rcl 3.3.1 → 3.3.2-beta

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.
@@ -1,15 +1,12 @@
1
- import "core-js/modules/es.array.concat.js";
2
- import "core-js/modules/es.array.find-index.js";
3
1
  import "core-js/modules/es.array.is-array.js";
4
- import "core-js/modules/es.array.join.js";
5
- import "core-js/modules/es.regexp.exec.js";
6
- import "core-js/modules/es.string.split.js";
7
2
  import "regenerator-runtime/runtime.js";
8
3
 
9
4
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
10
5
 
11
6
  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
7
 
8
+ 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; } } }; }
9
+
13
10
  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; }
14
11
 
15
12
  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; }
@@ -32,15 +29,16 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
32
29
  import * as React from 'react';
33
30
  import { AlignmentHelpers, UsfmFileConversionHelpers, usfmHelpers } from 'word-aligner-rcl';
34
31
  import * as isEqual from 'deep-equal';
35
- import useDeepCompareEffect from 'use-deep-compare-effect';
36
- import { useEdit } from 'gitea-react-toolkit';
37
- import { core } from 'scripture-resources-rcl';
38
- import usfmjs from 'usfm-js';
39
- import { ScriptureConfig, ServerConfig } from '../types';
40
- import { getScriptureResourceSettings, getVerseDataFromScripConfig } from '../utils/ScriptureSettings';
32
+ import { ScriptureConfig, ScriptureReference, ServerConfig } from '../types';
33
+ import { getScriptureResourceSettings } from '../utils/ScriptureSettings';
41
34
  import { ORIGINAL_SOURCE } from '../utils';
42
35
  import useScriptureResources from './useScriptureResources';
43
36
 
37
+ /**
38
+ * determines if alignment is complete based on target USFM and original language verse objects
39
+ * @param {string} targetVerseUSFM
40
+ * @param {object[]} originalVerseObjects
41
+ */
44
42
  function isUsfmAligned(targetVerseUSFM, originalVerseObjects) {
45
43
  var _originalVerseObjects;
46
44
 
@@ -52,6 +50,14 @@ function isUsfmAligned(targetVerseUSFM, originalVerseObjects) {
52
50
 
53
51
  return AlignmentHelpers.areAlgnmentsComplete(wordBank, alignments);
54
52
  }
53
+ /**
54
+ * get the updated USFM for target verse from the updated verse objects and latest text
55
+ * @param {object[]} updatedVerseObjects
56
+ * @param {object[]} initialVerseObjects
57
+ * @param {boolean} verseTextChanged
58
+ * @param {string} newVerseText
59
+ */
60
+
55
61
 
56
62
  function getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText) {
57
63
  var targetVerseUSFM = null;
@@ -67,39 +73,37 @@ function getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseText
67
73
  }
68
74
 
69
75
  return targetVerseUSFM;
70
- }
76
+ } // manage verse edit and alignment states
71
77
 
72
- export function useScriptureAlignmentEdit(_ref) {
73
- var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _httpConfig, _httpConfig2;
74
78
 
75
- var authentication = _ref.authentication,
76
- currentVerseNum = _ref.currentVerseNum,
79
+ export function useScriptureAlignmentEdit(_ref) {
80
+ var currentIndex = _ref.currentIndex,
77
81
  enableEdit = _ref.enableEdit,
78
82
  enableAlignment = _ref.enableAlignment,
79
83
  httpConfig = _ref.httpConfig,
80
84
  initialVerseObjects = _ref.initialVerseObjects,
85
+ initialVerseText = _ref.initialVerseText,
81
86
  isNewTestament = _ref.isNewTestament,
82
- loggedInUser = _ref.loggedInUser,
83
87
  originalLanguageOwner = _ref.originalLanguageOwner,
84
88
  originalRepoUrl = _ref.originalRepoUrl,
89
+ reference = _ref.reference,
85
90
  scriptureConfig = _ref.scriptureConfig,
86
91
  scriptureSettings = _ref.scriptureSettings,
92
+ setSavedChanges = _ref.setSavedChanges,
93
+ sourceLanguage = _ref.sourceLanguage,
87
94
  startEditBranch = _ref.startEditBranch,
88
- bookIndex = _ref.bookIndex,
95
+ targetLanguage = _ref.targetLanguage,
96
+ title = _ref.title,
89
97
  workingResourceBranch = _ref.workingResourceBranch;
90
98
 
91
99
  var _React$useState = React.useState({
92
100
  aligned: false,
93
101
  alignerData: null,
94
102
  editing: false,
95
- initialVerseText: null,
96
103
  newAlignments: null,
97
104
  newVerseText: null,
98
105
  updatedVerseObjects: null,
99
- verseTextChanged: false,
100
- saveContent: null,
101
- startSave: false,
102
- sha: null
106
+ verseTextChanged: false
103
107
  }),
104
108
  _React$useState2 = _slicedToArray(_React$useState, 2),
105
109
  state = _React$useState2[0],
@@ -108,14 +112,10 @@ export function useScriptureAlignmentEdit(_ref) {
108
112
  var aligned = state.aligned,
109
113
  alignerData = state.alignerData,
110
114
  editing = state.editing,
111
- initialVerseText = state.initialVerseText,
112
115
  newAlignments = state.newAlignments,
113
116
  newVerseText = state.newVerseText,
114
117
  updatedVerseObjects = state.updatedVerseObjects,
115
- verseTextChanged = state.verseTextChanged,
116
- saveContent = state.saveContent,
117
- startSave = state.startSave,
118
- sha = state.sha;
118
+ verseTextChanged = state.verseTextChanged;
119
119
 
120
120
  function setState(newState) {
121
121
  setState_(function (prevState) {
@@ -123,10 +123,8 @@ export function useScriptureAlignmentEdit(_ref) {
123
123
  });
124
124
  }
125
125
 
126
- var reference_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
127
- useDeepCompareEffect(function () {
128
- // check for context changes, reset edit and alignment state
129
- console.log("reference changed ".concat(JSON.stringify(reference_)));
126
+ function clearChanges() {
127
+ console.log("clearChanges() - ".concat(JSON.stringify(reference)));
130
128
 
131
129
  var clearState = _objectSpread(_objectSpread({}, state), {}, {
132
130
  alignerData: null,
@@ -141,7 +139,7 @@ export function useScriptureAlignmentEdit(_ref) {
141
139
  console.log("reference changed, reset edit/alignment state variables");
142
140
  setState(clearState);
143
141
  }
144
- }, [reference_]);
142
+ }
145
143
 
146
144
  var originalScriptureSettings_ = _objectSpread(_objectSpread({}, scriptureSettings), {}, {
147
145
  resourceId: ORIGINAL_SOURCE
@@ -149,74 +147,59 @@ export function useScriptureAlignmentEdit(_ref) {
149
147
 
150
148
 
151
149
  httpConfig = httpConfig || {};
152
- var bookId = reference_ === null || reference_ === void 0 ? void 0 : reference_.projectId;
153
- var originalScriptureSettings = getScriptureResourceSettings(bookId, originalScriptureSettings_, isNewTestament, originalRepoUrl); // @ts-ignore
154
-
155
- var fetchResp_ = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse;
156
- var owner = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.owner;
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);
158
- React.useEffect(function () {
159
- var _fetchResp_$data;
160
-
161
- // get the sha from last scripture download
162
- var sha = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data = fetchResp_.data) === null || _fetchResp_$data === void 0 ? void 0 : _fetchResp_$data.sha) || null;
163
- console.log("for ".concat(JSON.stringify(reference_), " new sha is ").concat(sha));
164
- setState({
165
- sha: sha
166
- }); // @ts-ignore
167
- }, [fetchResp_]);
168
-
169
- function getBookName() {
170
- var _scriptureConfig$refe;
171
-
172
- var bookCaps = scriptureConfig !== null && scriptureConfig !== void 0 && (_scriptureConfig$refe = scriptureConfig.reference) !== null && _scriptureConfig$refe !== void 0 && _scriptureConfig$refe.projectId ? scriptureConfig.reference.projectId.toUpperCase() : '';
173
- return "".concat(bookIndex, "-").concat(bookCaps, ".usfm");
174
- }
175
-
176
- var filepath = getBookName(); // TODO: enable save
177
-
178
- var _useEdit = useEdit({
179
- sha: sha,
180
- owner: owner,
181
- content: saveContent,
182
- config: _objectSpread(_objectSpread({
183
- cache: {
184
- maxAge: 0
185
- }
186
- }, authentication === null || authentication === void 0 ? void 0 : authentication.config), {}, {
187
- token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
188
- // @ts-ignore
189
- timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 5000
190
- }),
191
- author: loggedInUser,
192
- token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
193
- branch: workingResourceBranch,
194
- filepath: filepath,
195
- repo: repo
196
- }),
197
- editResponse = _useEdit.editResponse,
198
- error = _useEdit.error,
199
- isEditing = _useEdit.isEditing,
200
- isError = _useEdit.isError,
201
- onSaveEdit = _useEdit.onSaveEdit;
150
+ var bookId = reference === null || reference === void 0 ? void 0 : reference.projectId;
151
+ var originalScriptureSettings = getScriptureResourceSettings(bookId, originalScriptureSettings_, isNewTestament, originalRepoUrl);
202
152
 
203
153
  if (!enableAlignment) {
204
154
  // if not enabled, then we don't fetch resource
205
155
  originalScriptureSettings.resourceLink = null;
206
- } // get original language for alignment
156
+ } // get original language for this alignment
207
157
 
208
158
 
209
159
  var originalScriptureResource = useScriptureResources({
210
160
  bookId: bookId,
211
161
  scriptureSettings: originalScriptureSettings,
212
- chapter: reference_ === null || reference_ === void 0 ? void 0 : reference_.chapter,
213
- verse: reference_ === null || reference_ === void 0 ? void 0 : reference_.verse,
162
+ chapter: reference === null || reference === void 0 ? void 0 : reference.chapter,
163
+ verse: reference === null || reference === void 0 ? void 0 : reference.verse,
214
164
  isNewTestament: isNewTestament,
215
165
  originalRepoUrl: originalRepoUrl,
216
166
  currentLanguageId: originalScriptureSettings === null || originalScriptureSettings === void 0 ? void 0 : originalScriptureSettings.languageId,
217
167
  currentOwner: originalLanguageOwner,
218
168
  httpConfig: httpConfig
219
169
  });
170
+ var originalVerseObjects = React.useMemo(function () {
171
+ var _originalScriptureRes;
172
+
173
+ // get the original language verseObjects
174
+ if ((originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : (_originalScriptureRes = originalScriptureResource.versesForRef) === null || _originalScriptureRes === void 0 ? void 0 : _originalScriptureRes.length) > 1) {
175
+ // if multiple verses, then append them together
176
+ var verseObjects = [];
177
+
178
+ var _iterator = _createForOfIteratorHelper(originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.versesForRef),
179
+ _step;
180
+
181
+ try {
182
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
183
+ var _verseReference$verse;
184
+
185
+ var verseReference = _step.value;
186
+ var origVerseObjects = verseReference === null || verseReference === void 0 ? void 0 : (_verseReference$verse = verseReference.verseData) === null || _verseReference$verse === void 0 ? void 0 : _verseReference$verse.verseObjects;
187
+
188
+ if (origVerseObjects) {
189
+ Array.prototype.push.apply(verseObjects, origVerseObjects);
190
+ }
191
+ }
192
+ } catch (err) {
193
+ _iterator.e(err);
194
+ } finally {
195
+ _iterator.f();
196
+ }
197
+
198
+ return verseObjects;
199
+ }
200
+
201
+ return originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
202
+ }, [originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.versesForRef]);
220
203
  React.useEffect(function () {
221
204
  // update alignment status when aligner is hidden
222
205
  var notEmpty = !!initialVerseObjects;
@@ -226,7 +209,6 @@ export function useScriptureAlignmentEdit(_ref) {
226
209
  // skip if aligner is being shown
227
210
  if (notEmpty) {
228
211
  // skip if empty
229
- var originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
230
212
  var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
231
213
 
232
214
  if (!enableAlignment) {
@@ -246,34 +228,10 @@ export function useScriptureAlignmentEdit(_ref) {
246
228
  });
247
229
  }
248
230
  }
249
- }, [initialVerseObjects, alignerData, newVerseText, initialVerseText, enableAlignment, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects]);
250
- /**
251
- * search chapter or verse chunk to line that starts with findItem
252
- * @param {number|string} findItem
253
- * @param {array[string]} chunks
254
- */
255
-
256
- function findRefInArray(findItem, chunks) {
257
- var ref_ = findItem + '';
258
- var refLen = ref_.length;
259
- var index = chunks.findIndex(function (chunk, idx) {
260
- if (idx > 0) {
261
- if (chunk.substring(0, refLen) === ref_) {
262
- var nextChar = chunk[ref_];
263
-
264
- if (nextChar > '9' || nextChar < '0') {
265
- return true;
266
- }
267
- }
268
- }
269
-
270
- return false;
271
- });
272
- return index;
273
- }
231
+ }, [initialVerseObjects, alignerData, newVerseText, initialVerseText, enableAlignment, originalVerseObjects]);
274
232
 
275
- function saveChangesToCloud() {
276
- console.log("saveChangesToCloud - started");
233
+ function getChanges() {
234
+ console.log("getChanges - started %{currentIndex}");
277
235
  var updatedVerseObjects_;
278
236
 
279
237
  if (newAlignments) {
@@ -283,9 +241,7 @@ export function useScriptureAlignmentEdit(_ref) {
283
241
  var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
284
242
 
285
243
  var _AlignmentHelpers$upd2 = AlignmentHelpers.updateAlignmentsToTargetVerse(currentVerseObjects_, newVerseText),
286
- targetVerseText = _AlignmentHelpers$upd2.targetVerseText,
287
- targetVerseObjects = _AlignmentHelpers$upd2.targetVerseObjects; // console.log(`saveChangesToCloud() - new text:`, targetVerseText.substring(0,100))
288
-
244
+ targetVerseObjects = _AlignmentHelpers$upd2.targetVerseObjects;
289
245
 
290
246
  updatedVerseObjects_ = targetVerseObjects;
291
247
  } else {
@@ -294,159 +250,47 @@ export function useScriptureAlignmentEdit(_ref) {
294
250
  }
295
251
 
296
252
  if (updatedVerseObjects_) {
297
- var newUsfm; // @ts-ignore
298
-
299
- var ref = getVerseDataFromScripConfig(scriptureConfig, currentVerseNum); // @ts-ignore
300
-
301
- var originalUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
302
-
303
- if (originalUsfm) {
304
- var chapterChunks = originalUsfm === null || originalUsfm === void 0 ? void 0 : originalUsfm.split('\\c ');
305
- var chapterIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.chapter, chapterChunks);
306
-
307
- if (chapterIndex >= 0) {
308
- var currentChapter = chapterChunks[chapterIndex];
309
- var verseChunks = currentChapter.split('\\v ');
310
- var verseIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.verse, verseChunks);
253
+ var _scriptureConfig$vers;
311
254
 
312
- if (verseIndex >= 0) {
313
- var newVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(updatedVerseObjects_);
314
- var oldVerse = verseChunks[verseIndex];
315
- var verseNumLen = ((ref === null || ref === void 0 ? void 0 : ref.verse) + '').length;
316
- verseChunks[verseIndex] = oldVerse.substring(0, verseNumLen + 1) + newVerseUsfm;
317
- var newChapter = verseChunks.join('\\v ');
318
- chapterChunks[chapterIndex] = newChapter;
319
- newUsfm = chapterChunks.join('\\c ');
320
- }
321
- }
322
- }
323
-
324
- if (!newUsfm) {
325
- var newBookJson = updateVerseNum(currentVerseNum, updatedVerseObjects_);
326
- newUsfm = usfmjs.toUSFM(newBookJson, {
327
- forcedNewLines: true
328
- });
329
- }
330
-
331
- console.log("saveChangesToCloud() - saving new USFM: ".concat(newUsfm.substring(0, 100), "..."));
332
- setState({
333
- saveContent: newUsfm,
334
- startSave: true
335
- });
336
- }
337
- }
338
-
339
- React.useEffect(function () {
340
- var _saveEdit = /*#__PURE__*/function () {
341
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
342
- var branch;
343
- return regeneratorRuntime.wrap(function _callee$(_context) {
344
- while (1) {
345
- switch (_context.prev = _context.next) {
346
- case 0:
347
- // begin uploading new USFM
348
- branch = workingResourceBranch !== 'master' ? workingResourceBranch : undefined;
349
-
350
- if (branch) {
351
- _context.next = 5;
352
- break;
353
- }
354
-
355
- _context.next = 4;
356
- return startEditBranch();
357
-
358
- case 4:
359
- branch = _context.sent;
360
-
361
- case 5:
362
- _context.next = 7;
363
- return onSaveEdit(branch).then(function (success) {
364
- // push changed to server
365
- if (success) {
366
- console.log("saveChangesToCloud() - save scripture edits success");
367
- setState({
368
- updatedVerseObjects: null,
369
- editing: false,
370
- newVerseText: null,
371
- alignerData: null,
372
- startSave: false,
373
- verseTextChanged: false,
374
- initialVerseText: null
375
- });
376
- console.info('saveChangesToCloud() - Reloading resource');
377
- scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
378
- } else {
379
- console.error('saveChangesToCloud() - saving changed scripture failed');
380
- setState({
381
- startSave: false
382
- });
383
- }
384
- });
385
-
386
- case 7:
387
- case "end":
388
- return _context.stop();
389
- }
390
- }
391
- }, _callee);
392
- }));
393
-
394
- return function _saveEdit() {
395
- return _ref2.apply(this, arguments);
255
+ var ref = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$vers = scriptureConfig.versesForRef) === null || _scriptureConfig$vers === void 0 ? void 0 : _scriptureConfig$vers[currentIndex];
256
+ return {
257
+ newVerseText: newVerseText,
258
+ ref: ref,
259
+ updatedVerseObjects: updatedVerseObjects_
396
260
  };
397
- }();
398
-
399
- if (startSave) {
400
- console.log("saveChangesToCloud - calling _saveEdit()");
401
-
402
- _saveEdit();
403
- }
404
- }, [startSave]);
405
-
406
- function updateVerseNum(verseNum) {
407
- var newVerseObjects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : initialVerseObjects;
408
- // @ts-ignore
409
- var ref = getVerseDataFromScripConfig(scriptureConfig, verseNum);
410
- var targetVerseObjects_ = null;
411
-
412
- if (ref) {
413
- if (newVerseText) {
414
- var _AlignmentHelpers$upd3 = AlignmentHelpers.updateAlignmentsToTargetVerse(newVerseObjects, newVerseText),
415
- targetVerseObjects = _AlignmentHelpers$upd3.targetVerseObjects;
416
-
417
- targetVerseObjects_ = targetVerseObjects;
418
- } else {
419
- targetVerseObjects_ = newVerseObjects;
420
- } // @ts-ignore
421
-
422
-
423
- return targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(ref.chapter, ref.verse, {
424
- verseObjects: targetVerseObjects_
425
- }));
426
261
  }
427
262
 
428
- return null;
263
+ return {};
429
264
  }
265
+ /**
266
+ * callback for when user clicked on alignment button - will show if not already shown
267
+ */
268
+
430
269
 
431
270
  function handleAlignmentClick() {
432
271
  return _handleAlignmentClick.apply(this, arguments);
433
272
  }
273
+ /**
274
+ * get updated verse objects after alignments changed
275
+ * @param {object} _newAlignments - results of aligner
276
+ */
277
+
434
278
 
435
279
  function _handleAlignmentClick() {
436
- _handleAlignmentClick = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
437
- var alignerData_, targetVerseUSFM, originalVerseObjects, originalVerseUsfm, _AlignmentHelpers$par, wordBank, alignments;
280
+ _handleAlignmentClick = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
281
+ var _alignerData, targetVerseUSFM, originalVerseUsfm, _AlignmentHelpers$par, wordBank, alignments;
438
282
 
439
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
283
+ return regeneratorRuntime.wrap(function _callee$(_context) {
440
284
  while (1) {
441
- switch (_context2.prev = _context2.next) {
285
+ switch (_context.prev = _context.next) {
442
286
  case 0:
443
287
  if (!enableAlignment) {
444
- _context2.next = 7;
288
+ _context.next = 7;
445
289
  break;
446
290
  }
447
291
 
448
- alignerData_ = null;
449
- _context2.next = 4;
292
+ _alignerData = null;
293
+ _context.next = 4;
450
294
  return startEditBranch();
451
295
 
452
296
  case 4:
@@ -454,7 +298,6 @@ export function useScriptureAlignmentEdit(_ref) {
454
298
  // if word aligner not shown
455
299
  console.log("handleAlignmentClick - toggle ON alignment");
456
300
  targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
457
- originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
458
301
  originalVerseUsfm = null;
459
302
 
460
303
  if (originalVerseObjects) {
@@ -462,44 +305,54 @@ export function useScriptureAlignmentEdit(_ref) {
462
305
  }
463
306
 
464
307
  _AlignmentHelpers$par = AlignmentHelpers.parseUsfmToWordAlignerData(targetVerseUSFM, originalVerseUsfm), wordBank = _AlignmentHelpers$par.targetWords, alignments = _AlignmentHelpers$par.verseAlignments;
465
- alignerData_ = {
308
+ _alignerData = {
466
309
  wordBank: wordBank,
467
310
  alignments: alignments
468
311
  };
469
312
  } else {
470
313
  // word aligner currently shown
471
314
  console.log("handleAlignmentClick - alignment already shown");
472
- alignerData_ = alignerData;
315
+ _alignerData = alignerData;
473
316
  }
474
317
 
475
318
  setState({
476
- alignerData: alignerData_
319
+ alignerData: _alignerData
477
320
  });
478
- console.log(alignerData_);
321
+ console.log(_alignerData);
479
322
 
480
323
  case 7:
481
324
  case "end":
482
- return _context2.stop();
325
+ return _context.stop();
483
326
  }
484
327
  }
485
- }, _callee2);
328
+ }, _callee);
486
329
  }));
487
330
  return _handleAlignmentClick.apply(this, arguments);
488
331
  }
489
332
 
490
333
  function updateVerseWithNewAlignments() {
334
+ var _newAlignments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : newAlignments;
335
+
491
336
  var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
492
337
  var targetVerseText = newVerseText || UsfmFileConversionHelpers.convertVerseDataToUSFM(currentVerseObjects_);
493
- var verseUsfm = AlignmentHelpers.addAlignmentsToVerseUSFM(newAlignments.targetWords, newAlignments.verseAlignments, targetVerseText);
338
+ var verseUsfm = AlignmentHelpers.addAlignmentsToVerseUSFM(_newAlignments.targetWords, _newAlignments.verseAlignments, targetVerseText);
494
339
  var alignedVerseObjects = usfmHelpers.usfmVerseToJson(verseUsfm);
495
340
  return alignedVerseObjects;
496
341
  }
342
+ /**
343
+ * 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
344
+ * @param {object} _newAlignments - results of aligner
345
+ */
346
+
497
347
 
498
348
  function saveAlignment() {
499
- console.log("saveAlignment()");
349
+ var _newAlignments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : newAlignments;
500
350
 
501
- if (newAlignments) {
502
- var alignedVerseObjects = updateVerseWithNewAlignments();
351
+ console.log("saveAlignment() - newAlignments", _newAlignments);
352
+
353
+ if (_newAlignments) {
354
+ var alignedVerseObjects = updateVerseWithNewAlignments(_newAlignments);
355
+ console.log("saveAlignment() - alignedVerseObjects", alignedVerseObjects);
503
356
  setState({
504
357
  alignerData: null,
505
358
  editing: false,
@@ -513,6 +366,10 @@ export function useScriptureAlignmentEdit(_ref) {
513
366
  });
514
367
  }
515
368
  }
369
+ /**
370
+ * callback for when user clicked on button to cancel work in word aligner. Calculates and displays current alignment valid state. Closes aligner display
371
+ */
372
+
516
373
 
517
374
  function cancelAlignment() {
518
375
  console.log("cancelAlignment()");
@@ -522,30 +379,41 @@ export function useScriptureAlignmentEdit(_ref) {
522
379
  alignerData: null,
523
380
  aligned: aligned
524
381
  });
525
- } // TODO: Change this function to take currentVerseNum to set editing verse
382
+ }
383
+ /**
384
+ * callback for button to set editing state
385
+ * @param {boolean} editing_ - if true, editor is shown, otherwise editor is hidden
386
+ */
526
387
 
527
388
 
528
389
  function setEditing(_x) {
529
390
  return _setEditing.apply(this, arguments);
530
391
  }
392
+ /**
393
+ * callback from the edit onChange event to update edit state variables
394
+ * @param {boolean} changed - true if the newVerseText is different than the initialVerseText
395
+ * @param {string} newVerseText - current changed verse text
396
+ * @param {string} _initialVerseText - initial verse text
397
+ */
398
+
531
399
 
532
400
  function _setEditing() {
533
- _setEditing = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(editing_) {
534
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
401
+ _setEditing = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(editing_) {
402
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
535
403
  while (1) {
536
- switch (_context3.prev = _context3.next) {
404
+ switch (_context2.prev = _context2.next) {
537
405
  case 0:
538
406
  if (!enableEdit) {
539
- _context3.next = 5;
407
+ _context2.next = 5;
540
408
  break;
541
409
  }
542
410
 
543
411
  if (!(editing_ && !editing)) {
544
- _context3.next = 4;
412
+ _context2.next = 4;
545
413
  break;
546
414
  }
547
415
 
548
- _context3.next = 4;
416
+ _context2.next = 4;
549
417
  return startEditBranch();
550
418
 
551
419
  case 4:
@@ -557,28 +425,30 @@ export function useScriptureAlignmentEdit(_ref) {
557
425
 
558
426
  case 5:
559
427
  case "end":
560
- return _context3.stop();
428
+ return _context2.stop();
561
429
  }
562
430
  }
563
- }, _callee3);
431
+ }, _callee2);
564
432
  }));
565
433
  return _setEditing.apply(this, arguments);
566
434
  }
567
435
 
568
- function setVerseChanged(changed, newVerseText, initialVerseText) {
569
- var _AlignmentHelpers$upd4 = AlignmentHelpers.updateAlignmentsToTargetVerse(initialVerseObjects, newVerseText),
570
- targetVerseText = _AlignmentHelpers$upd4.targetVerseText;
436
+ function setVerseChanged(changed, newVerseText, _initialVerseText) {
437
+ var _AlignmentHelpers$upd3 = AlignmentHelpers.updateAlignmentsToTargetVerse(initialVerseObjects, newVerseText),
438
+ targetVerseText = _AlignmentHelpers$upd3.targetVerseText;
571
439
 
572
440
  var aligned = isUsfmAligned(targetVerseText, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects);
441
+
442
+ var _changed = newVerseText !== initialVerseText;
443
+
573
444
  setState({
574
- verseTextChanged: changed,
575
- initialVerseText: initialVerseText,
445
+ verseTextChanged: _changed,
576
446
  newVerseText: newVerseText,
577
447
  aligned: aligned
578
448
  });
579
449
  }
580
450
 
581
- var editedVerseObjects = React.useMemo(function () {
451
+ var currentVerseObjects = React.useMemo(function () {
582
452
  // if verse has been edited or alignment changed, then generate new verseObjects to display in ScripturePane
583
453
  if (initialVerseObjects) {
584
454
  var targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
@@ -593,6 +463,16 @@ export function useScriptureAlignmentEdit(_ref) {
593
463
  var changed = verseTextChanged || updatedVerseObjects && !isEqual(initialVerseObjects, updatedVerseObjects);
594
464
  return changed;
595
465
  }, [updatedVerseObjects, initialVerseObjects, verseTextChanged]);
466
+ React.useEffect(function () {
467
+ // set saved changes whenever user edits verse text or alignments or if alignments are open
468
+ var unsavedChanges_ = unsavedChanges || alignerData;
469
+ setSavedChanges && setSavedChanges(currentIndex, !unsavedChanges_, getChanges, clearChanges);
470
+ }, [unsavedChanges, alignerData]);
471
+ /**
472
+ * callback for when alignments are being changed
473
+ * @param {object} results
474
+ * @return {boolean} true if alignment is complete
475
+ */
596
476
 
597
477
  function onAlignmentsChange(results) {
598
478
  console.log("onAlignmentsChange() - alignment changed, results", results); // merge alignments into target verse and convert to USFM
@@ -605,26 +485,34 @@ export function useScriptureAlignmentEdit(_ref) {
605
485
  newAlignments: results,
606
486
  aligned: alignmentComplete
607
487
  });
488
+ return alignmentComplete;
608
489
  }
609
490
 
610
491
  return {
611
492
  actions: {
612
493
  cancelAlignment: cancelAlignment,
613
- editedVerseObjects: editedVerseObjects,
494
+ getChanges: getChanges,
614
495
  handleAlignmentClick: handleAlignmentClick,
615
496
  onAlignmentsChange: onAlignmentsChange,
616
497
  saveAlignment: saveAlignment,
617
498
  setEditing: setEditing,
618
- setVerseChanged: setVerseChanged,
619
- saveChangesToCloud: saveChangesToCloud
499
+ setVerseChanged: setVerseChanged
620
500
  },
621
501
  state: {
622
502
  aligned: aligned,
623
503
  alignerData: alignerData,
504
+ currentVerseObjects: currentVerseObjects,
624
505
  editing: editing,
506
+ initialVerseText: initialVerseText,
507
+ initialVerseObjects: initialVerseObjects,
508
+ newVerseText: newVerseText,
509
+ sourceLanguage: sourceLanguage,
510
+ targetLanguage: targetLanguage,
511
+ unsavedChanges: unsavedChanges,
625
512
  verseTextChanged: verseTextChanged,
626
- unsavedChanges: unsavedChanges
513
+ reference: reference,
514
+ title: title
627
515
  }
628
516
  };
629
517
  }
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=
518
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0LnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIkFsaWdubWVudEhlbHBlcnMiLCJVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIiwidXNmbUhlbHBlcnMiLCJpc0VxdWFsIiwiU2NyaXB0dXJlQ29uZmlnIiwiU2NyaXB0dXJlUmVmZXJlbmNlIiwiU2VydmVyQ29uZmlnIiwiZ2V0U2NyaXB0dXJlUmVzb3VyY2VTZXR0aW5ncyIsIk9SSUdJTkFMX1NPVVJDRSIsInVzZVNjcmlwdHVyZVJlc291cmNlcyIsImlzVXNmbUFsaWduZWQiLCJ0YXJnZXRWZXJzZVVTRk0iLCJvcmlnaW5hbFZlcnNlT2JqZWN0cyIsImxlbmd0aCIsImV4dHJhY3RBbGlnbm1lbnRzRnJvbVRhcmdldFZlcnNlIiwiYWxpZ25tZW50cyIsIndvcmRCYW5rIiwiYXJlQWxnbm1lbnRzQ29tcGxldGUiLCJnZXRDdXJyZW50VmVyc2VVc2ZtIiwidXBkYXRlZFZlcnNlT2JqZWN0cyIsImluaXRpYWxWZXJzZU9iamVjdHMiLCJ2ZXJzZVRleHRDaGFuZ2VkIiwibmV3VmVyc2VUZXh0IiwiY3VycmVudFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZSIsInRhcmdldFZlcnNlVGV4dCIsImNvbnZlcnRWZXJzZURhdGFUb1VTRk0iLCJ1c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0IiwiY3VycmVudEluZGV4IiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsImh0dHBDb25maWciLCJpbml0aWFsVmVyc2VUZXh0IiwiaXNOZXdUZXN0YW1lbnQiLCJvcmlnaW5hbExhbmd1YWdlT3duZXIiLCJvcmlnaW5hbFJlcG9VcmwiLCJyZWZlcmVuY2UiLCJzY3JpcHR1cmVDb25maWciLCJzY3JpcHR1cmVTZXR0aW5ncyIsInNldFNhdmVkQ2hhbmdlcyIsInNvdXJjZUxhbmd1YWdlIiwic3RhcnRFZGl0QnJhbmNoIiwidGFyZ2V0TGFuZ3VhZ2UiLCJ0aXRsZSIsIndvcmtpbmdSZXNvdXJjZUJyYW5jaCIsInVzZVN0YXRlIiwiYWxpZ25lZCIsImFsaWduZXJEYXRhIiwiZWRpdGluZyIsIm5ld0FsaWdubWVudHMiLCJzdGF0ZSIsInNldFN0YXRlXyIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJwcmV2U3RhdGUiLCJjbGVhckNoYW5nZXMiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFyU3RhdGUiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXyIsInJlc291cmNlSWQiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzIiwicmVzb3VyY2VMaW5rIiwib3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZSIsImNoYXB0ZXIiLCJ2ZXJzZSIsImN1cnJlbnRMYW5ndWFnZUlkIiwibGFuZ3VhZ2VJZCIsImN1cnJlbnRPd25lciIsInVzZU1lbW8iLCJ2ZXJzZXNGb3JSZWYiLCJ2ZXJzZU9iamVjdHMiLCJ2ZXJzZVJlZmVyZW5jZSIsIm9yaWdWZXJzZU9iamVjdHMiLCJ2ZXJzZURhdGEiLCJBcnJheSIsInByb3RvdHlwZSIsInB1c2giLCJhcHBseSIsInVzZUVmZmVjdCIsIm5vdEVtcHR5IiwiYWxpZ25lZF8iLCJyZXN1bHRzIiwiZ2V0Q2hhbmdlcyIsInVwZGF0ZWRWZXJzZU9iamVjdHNfIiwidXBkYXRlVmVyc2VXaXRoTmV3QWxpZ25tZW50cyIsInRhcmdldFZlcnNlT2JqZWN0cyIsInJlZiIsImhhbmRsZUFsaWdubWVudENsaWNrIiwiX2FsaWduZXJEYXRhIiwib3JpZ2luYWxWZXJzZVVzZm0iLCJwYXJzZVVzZm1Ub1dvcmRBbGlnbmVyRGF0YSIsInRhcmdldFdvcmRzIiwidmVyc2VBbGlnbm1lbnRzIiwiX25ld0FsaWdubWVudHMiLCJ2ZXJzZVVzZm0iLCJhZGRBbGlnbm1lbnRzVG9WZXJzZVVTRk0iLCJhbGlnbmVkVmVyc2VPYmplY3RzIiwidXNmbVZlcnNlVG9Kc29uIiwic2F2ZUFsaWdubWVudCIsImNhbmNlbEFsaWdubWVudCIsInNldEVkaXRpbmciLCJlZGl0aW5nXyIsInNldFZlcnNlQ2hhbmdlZCIsImNoYW5nZWQiLCJfaW5pdGlhbFZlcnNlVGV4dCIsIl9jaGFuZ2VkIiwiY3VycmVudFZlcnNlT2JqZWN0cyIsInVuc2F2ZWRDaGFuZ2VzIiwidW5zYXZlZENoYW5nZXNfIiwib25BbGlnbm1lbnRzQ2hhbmdlIiwiYWxpZ25tZW50Q29tcGxldGUiLCJhY3Rpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBLE9BQU8sS0FBS0EsS0FBWixNQUF1QixPQUF2QjtBQUNBLFNBQ0VDLGdCQURGLEVBRUVDLHlCQUZGLEVBR0VDLFdBSEYsUUFJTyxrQkFKUDtBQUtBLE9BQU8sS0FBS0MsT0FBWixNQUF5QixZQUF6QjtBQUNBLFNBQ0VDLGVBREYsRUFFRUMsa0JBRkYsRUFHRUMsWUFIRixRQUlPLFVBSlA7QUFLQSxTQUFTQyw0QkFBVCxRQUE2Qyw0QkFBN0M7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFVBQWhDO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MseUJBQWxDOztBQW1EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsYUFBVCxDQUF1QkMsZUFBdkIsRUFBd0NDLG9CQUF4QyxFQUE4RDtBQUFBOztBQUM1REEsRUFBQUEsb0JBQW9CLEdBQUcseUJBQUFBLG9CQUFvQixVQUFwQiw4REFBc0JDLE1BQXRCLEdBQStCRCxvQkFBL0IsR0FBc0QsSUFBN0UsQ0FENEQsQ0FDc0I7O0FBRHRCLDhCQUUzQlosZ0JBQWdCLENBQUNjLGdDQUFqQixDQUFrREgsZUFBbEQsRUFBbUVDLG9CQUFuRSxDQUYyQjtBQUFBLE1BRXBERyxVQUZvRCx5QkFFcERBLFVBRm9EO0FBQUEsTUFFeENDLFFBRndDLHlCQUV4Q0EsUUFGd0M7O0FBRzVELFNBQU9oQixnQkFBZ0IsQ0FBQ2lCLG9CQUFqQixDQUFzQ0QsUUFBdEMsRUFBZ0RELFVBQWhE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QUEsa0JBQWtCLEVBQWxCQSxrQkFKTztBQUtQWCxNQUFBQSxhQUFhLEVBQWJBLGFBTE87QUFNUEUsTUFBQUEsVUFBVSxFQUFWQSxVQU5PO0FBT1BFLE1BQUFBLGVBQWUsRUFBZkE7QUFQTyxLQURKO0FBVUx6RCxJQUFBQSxLQUFLLEVBQUU7QUFDTEosTUFBQUEsT0FBTyxFQUFQQSxPQURLO0FBRUxDLE1BQUFBLFdBQVcsRUFBWEEsV0FGSztBQUdMZ0UsTUFBQUEsbUJBQW1CLEVBQW5CQSxtQkFISztBQUlML0QsTUFBQUEsT0FBTyxFQUFQQSxPQUpLO0FBS0xoQixNQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUxLO0FBTUxaLE1BQUFBLG1CQUFtQixFQUFuQkEsbUJBTks7QUFPTEUsTUFBQUEsWUFBWSxFQUFaQSxZQVBLO0FBUUxrQixNQUFBQSxjQUFjLEVBQWRBLGNBUks7QUFTTEUsTUFBQUEsY0FBYyxFQUFkQSxjQVRLO0FBVUxzRSxNQUFBQSxjQUFjLEVBQWRBLGNBVks7QUFXTDNGLE1BQUFBLGdCQUFnQixFQUFoQkEsZ0JBWEs7QUFZTGUsTUFBQUEsU0FBUyxFQUFUQSxTQVpLO0FBYUxPLE1BQUFBLEtBQUssRUFBTEE7QUFiSztBQVZGLEdBQVA7QUEwQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIEFsaWdubWVudEhlbHBlcnMsXG4gIFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMsXG4gIHVzZm1IZWxwZXJzLFxufSBmcm9tICd3b3JkLWFsaWduZXItcmNsJ1xuaW1wb3J0ICogYXMgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJ1xuaW1wb3J0IHtcbiAgU2NyaXB0dXJlQ29uZmlnLFxuICBTY3JpcHR1cmVSZWZlcmVuY2UsXG4gIFNlcnZlckNvbmZpZyxcbn0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBnZXRTY3JpcHR1cmVSZXNvdXJjZVNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvU2NyaXB0dXJlU2V0dGluZ3MnXG5pbXBvcnQgeyBPUklHSU5BTF9TT1VSQ0UgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB1c2VTY3JpcHR1cmVSZXNvdXJjZXMgZnJvbSAnLi91c2VTY3JpcHR1cmVSZXNvdXJjZXMnXG5cbmludGVyZmFjZSBTdGFydEVkaXQge1xuICAoKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdHVyZUFMaWdubWVudEVkaXRQcm9wcyB7XG4gIC8vIGN1cnJlbnQgdmVyc2Ugc2VsZWN0ZWQgZnJvbSBpbml0aWFsVmVyc2VPYmplY3RzW11cbiAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gIC8vIHJlZmVyZW5jZSBmb3IgdmVyc2Ugc2VsZWN0ZWQgZm9yIGFsaWdubWVudFxuICBjdXJyZW50VmVyc2VSZWY6IFNjcmlwdHVyZVJlZmVyZW5jZSxcbiAgLy8gaWYgdHJ1ZSB0aGVuIGVkaXRpbmcgaXMgYWxsb3dlZFxuICBlbmFibGVFZGl0OiBib29sZWFuLFxuICAvLyBpZiB0cnVlIHRoZW4gYWxpZ25tZW50IGlzIGFsbG93ZWRcbiAgZW5hYmxlQWxpZ25tZW50OiBib29sZWFuLFxuICAvLyBjb25maWd1cmF0aW9uIHRvIHVzZSBmb3IgaHR0cCBjb21tdW5pY2F0aW9uXG4gIGh0dHBDb25maWc6IFNlcnZlckNvbmZpZyxcbiAgLy8gYXJyYXkgb2YgZWFjaCB2ZXJzZSBmb3IgaW4gcmVmZXJlbmNlIHJhbmdlXG4gIGluaXRpYWxWZXJzZU9iamVjdHM6IFtdLFxuICAvLyBpbml0aWFsIHRleHQgZm9yIHZlcnNlXG4gIGluaXRpYWxWZXJzZVRleHQ6IHN0cmluZyxcbiAgLy8gZmxhZyB0aGF0IHdlIGFyZSB3b3JraW5nIG9uIE5UIGJvb2tcbiAgaXNOZXdUZXN0YW1lbnQ6IGJvb2xlYW4sXG4gIC8vIHVzZXIgbmFtZSBvZiBsb2dnZWQgaW4gdXNlclxuICBsb2dnZWRJblVzZXI6IHN0cmluZyxcbiAgLy8gb3duZXIgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgb3JpZ2luYWwgbGFuZ3VhZ2UgcmVzb3VyY2VzXG4gIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcjogc3RyaW5nLFxuICAvLyB1cmwgZm9yIHRoZSBvcmlnaW5hbCBsYW5ndWFnZSByZXBvXG4gIG9yaWdpbmFsUmVwb1VybDogc3RyaW5nLFxuICAvKiogY3VycmVudCByZWZlcmVuY2UgKiovXG4gIHJlZmVyZW5jZTogU2NyaXB0dXJlUmVmZXJlbmNlO1xuICAvLyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHNjcmlwdHVyZSBsb2FkZWRcbiAgc2NyaXB0dXJlQ29uZmlnOiBTY3JpcHR1cmVDb25maWcsXG4gIC8vIHNldHRpbmdzIHRvIGJlIHVzZWQgZm9yIHNjcmlwdHVyZVxuICBzY3JpcHR1cmVTZXR0aW5nczogeyB9LFxuICAvLyBjYWxsYmFjayB0byBzYXZlIGN1cnJlbnQgdmVyc2UgZWRpdCBhbmQgYWxpZ25tZW50IGNoYW5nZXNcbiAgc2V0U2F2ZWRDaGFuZ2VzOiBGdW5jdGlvbixcbiAgLy8gY2FsbGJhY2sgdG8gY3JlYXRlIGEgdXNlciBicmFuY2ggZm9yIHNhdmluZyBlZGl0IGRhdGFcbiAgc3RhcnRFZGl0QnJhbmNoOiBTdGFydEVkaXQsXG4gIC8vIGluZGV4IHRvIHVzZSBmb3IgYm9vayAoZS5nLiBgMDFgIGZvciBgR0VOYClcbiAgYm9va0luZGV4OiBzdHJpbmcsXG4gIC8vIGJyYW5jaCBuYW1lIGN1cnJlbnRseSBiZWluZyB1c2VkIChlLmcuIGBtYXN0ZXJgIG9yIHVzZXIgYnJhbmNoKVxuICB3b3JraW5nUmVzb3VyY2VCcmFuY2g6IHN0cmluZyxcbiAgLy8gY3VycmVudCB0YXJnZXQgbGFuZ3VhZ2VcbiAgdGFyZ2V0TGFuZ3VhZ2U6IG9iamVjdCxcbiAgLy8gc291cmNlIGxhbmd1YWdlXG4gIHNvdXJjZUxhbmd1YWdlOiBzdHJpbmcsXG4gIC8vIHRpdGxlIHRvIHNob3cgaW4gYWxpZ25tZW50XG4gIHRpdGxlOiBzdHJpbmcsXG59XG5cbi8qKlxuICogZGV0ZXJtaW5lcyBpZiBhbGlnbm1lbnQgaXMgY29tcGxldGUgYmFzZWQgb24gdGFyZ2V0IFVTRk0gYW5kIG9yaWdpbmFsIGxhbmd1YWdlIHZlcnNlIG9iamVjdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRWZXJzZVVTRk1cbiAqIEBwYXJhbSB7b2JqZWN0W119IG9yaWdpbmFsVmVyc2VPYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlT2JqZWN0cykge1xuICBvcmlnaW5hbFZlcnNlT2JqZWN0cyA9IG9yaWdpbmFsVmVyc2VPYmplY3RzPy5sZW5ndGggPyBvcmlnaW5hbFZlcnNlT2JqZWN0cyA6IG51bGwgLy8gbWFrZSBzdXJlIG5vdCBwYXNzaW5nIGVtcHR5IEFycmF5XG4gIGNvbnN0IHsgYWxpZ25tZW50cywgd29yZEJhbmsgfSA9IEFsaWdubWVudEhlbHBlcnMuZXh0cmFjdEFsaWdubWVudHNGcm9tVGFyZ2V0VmVyc2UodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlT2JqZWN0cylcbiAgcmV0dXJuIEFsaWdubWVudEhlbHBlcnMuYXJlQWxnbm1lbnRzQ29tcGxldGUod29yZEJhbmssIGFsaWdubWVudHMpXG59XG5cbi8qKlxuICogZ2V0IHRoZSB1cGRhdGVkIFVTRk0gZm9yIHRhcmdldCB2ZXJzZSBmcm9tIHRoZSB1cGRhdGVkIHZlcnNlIG9iamVjdHMgYW5kIGxhdGVzdCB0ZXh0XG4gKiBAcGFyYW0ge29iamVjdFtdfSB1cGRhdGVkVmVyc2VPYmplY3RzXG4gKiBAcGFyYW0ge29iamVjdFtdfSBpbml0aWFsVmVyc2VPYmplY3RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZlcnNlVGV4dENoYW5nZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZXdWZXJzZVRleHRcbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkOiBib29sZWFuLCBuZXdWZXJzZVRleHQpIHtcbiAgbGV0IHRhcmdldFZlcnNlVVNGTSA9IG51bGxcbiAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcblxuICBpZiAodmVyc2VUZXh0Q2hhbmdlZCAmJiBuZXdWZXJzZVRleHQpIHtcbiAgICBjb25zdCB7IHRhcmdldFZlcnNlVGV4dCB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShjdXJyZW50VmVyc2VPYmplY3RzXywgbmV3VmVyc2VUZXh0KVxuICAgIHRhcmdldFZlcnNlVVNGTSA9IHRhcmdldFZlcnNlVGV4dFxuICB9IGVsc2Uge1xuICAgIHRhcmdldFZlcnNlVVNGTSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgfVxuICByZXR1cm4gdGFyZ2V0VmVyc2VVU0ZNXG59XG5cbi8vIG1hbmFnZSB2ZXJzZSBlZGl0IGFuZCBhbGlnbm1lbnQgc3RhdGVzXG5leHBvcnQgZnVuY3Rpb24gdXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCh7XG4gIGN1cnJlbnRJbmRleCxcbiAgZW5hYmxlRWRpdCxcbiAgZW5hYmxlQWxpZ25tZW50LFxuICBodHRwQ29uZmlnLFxuICBpbml0aWFsVmVyc2VPYmplY3RzLFxuICBpbml0aWFsVmVyc2VUZXh0LFxuICBpc05ld1Rlc3RhbWVudCxcbiAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICBvcmlnaW5hbFJlcG9VcmwsXG4gIHJlZmVyZW5jZSxcbiAgc2NyaXB0dXJlQ29uZmlnLFxuICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgc2V0U2F2ZWRDaGFuZ2VzLFxuICBzb3VyY2VMYW5ndWFnZSxcbiAgc3RhcnRFZGl0QnJhbmNoLFxuICB0YXJnZXRMYW5ndWFnZSxcbiAgdGl0bGUsXG4gIHdvcmtpbmdSZXNvdXJjZUJyYW5jaCxcbn0gOiBTY3JpcHR1cmVBTGlnbm1lbnRFZGl0UHJvcHMpIHtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV9dID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGFsaWduZWQ6IGZhbHNlLFxuICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgIGVkaXRpbmc6IGZhbHNlLFxuICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZDogZmFsc2UsXG4gIH0pXG5cbiAgY29uc3Qge1xuICAgIGFsaWduZWQsXG4gICAgYWxpZ25lckRhdGEsXG4gICAgZWRpdGluZyxcbiAgICBuZXdBbGlnbm1lbnRzLFxuICAgIG5ld1ZlcnNlVGV4dCxcbiAgICB1cGRhdGVkVmVyc2VPYmplY3RzLFxuICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gIH0gPSBzdGF0ZVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgc2V0U3RhdGVfKHByZXZTdGF0ZSA9PiAoeyAuLi5wcmV2U3RhdGUsIC4uLm5ld1N0YXRlIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJDaGFuZ2VzKCkge1xuICAgIGNvbnNvbGUubG9nKGBjbGVhckNoYW5nZXMoKSAtICR7SlNPTi5zdHJpbmdpZnkocmVmZXJlbmNlKX1gKVxuICAgIGNvbnN0IGNsZWFyU3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICBuZXdBbGlnbm1lbnRzOiBudWxsLFxuICAgICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogbnVsbCxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgIH1cblxuICAgIGlmICghaXNFcXVhbChzdGF0ZSwgY2xlYXJTdGF0ZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGByZWZlcmVuY2UgY2hhbmdlZCwgcmVzZXQgZWRpdC9hbGlnbm1lbnQgc3RhdGUgdmFyaWFibGVzYClcbiAgICAgIHNldFN0YXRlKGNsZWFyU3RhdGUpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5nc18gPSB7XG4gICAgLi4uc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgcmVzb3VyY2VJZDogT1JJR0lOQUxfU09VUkNFLFxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwQ29uZmlnID0gaHR0cENvbmZpZyB8fCB7fVxuICBjb25zdCBib29rSWQgPSByZWZlcmVuY2U/LnByb2plY3RJZFxuICBjb25zdCBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzID0gZ2V0U2NyaXB0dXJlUmVzb3VyY2VTZXR0aW5ncyhcbiAgICBib29rSWQsIG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3NfLCBpc05ld1Rlc3RhbWVudCwgb3JpZ2luYWxSZXBvVXJsLFxuICApXG5cbiAgaWYgKCFlbmFibGVBbGlnbm1lbnQpIHsgLy8gaWYgbm90IGVuYWJsZWQsIHRoZW4gd2UgZG9uJ3QgZmV0Y2ggcmVzb3VyY2VcbiAgICBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzLnJlc291cmNlTGluayA9IG51bGxcbiAgfVxuXG4gIC8vIGdldCBvcmlnaW5hbCBsYW5ndWFnZSBmb3IgdGhpcyBhbGlnbm1lbnRcbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZSA9IHVzZVNjcmlwdHVyZVJlc291cmNlcyh7XG4gICAgYm9va0lkLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzOiBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzLFxuICAgIGNoYXB0ZXI6IHJlZmVyZW5jZT8uY2hhcHRlcixcbiAgICB2ZXJzZTogcmVmZXJlbmNlPy52ZXJzZSxcbiAgICBpc05ld1Rlc3RhbWVudCxcbiAgICBvcmlnaW5hbFJlcG9VcmwsXG4gICAgY3VycmVudExhbmd1YWdlSWQ6IG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3M/Lmxhbmd1YWdlSWQsXG4gICAgY3VycmVudE93bmVyOiBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgaHR0cENvbmZpZyxcbiAgfSlcblxuICBjb25zdCBvcmlnaW5hbFZlcnNlT2JqZWN0cyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4geyAvLyBnZXQgdGhlIG9yaWdpbmFsIGxhbmd1YWdlIHZlcnNlT2JqZWN0c1xuICAgIGlmIChvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZXNGb3JSZWY/Lmxlbmd0aCA+IDEpIHsgLy8gaWYgbXVsdGlwbGUgdmVyc2VzLCB0aGVuIGFwcGVuZCB0aGVtIHRvZ2V0aGVyXG4gICAgICBjb25zdCB2ZXJzZU9iamVjdHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IHZlcnNlUmVmZXJlbmNlIG9mIG9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2U/LnZlcnNlc0ZvclJlZikge1xuICAgICAgICBjb25zdCBvcmlnVmVyc2VPYmplY3RzID0gdmVyc2VSZWZlcmVuY2U/LnZlcnNlRGF0YT8udmVyc2VPYmplY3RzXG5cbiAgICAgICAgaWYgKG9yaWdWZXJzZU9iamVjdHMpIHtcbiAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh2ZXJzZU9iamVjdHMsIG9yaWdWZXJzZU9iamVjdHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZXJzZU9iamVjdHNcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2U/LnZlcnNlT2JqZWN0c1xuICB9LCBbb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzLCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZXNGb3JSZWZdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHVwZGF0ZSBhbGlnbm1lbnQgc3RhdHVzIHdoZW4gYWxpZ25lciBpcyBoaWRkZW5cbiAgICBjb25zdCBub3RFbXB0eSA9ICEhaW5pdGlhbFZlcnNlT2JqZWN0c1xuICAgIGxldCBhbGlnbmVkXyA9IGZhbHNlXG5cbiAgICBpZiAoIWFsaWduZXJEYXRhKSB7IC8vIHNraXAgaWYgYWxpZ25lciBpcyBiZWluZyBzaG93blxuICAgICAgaWYgKG5vdEVtcHR5KSB7IC8vIHNraXAgaWYgZW1wdHlcbiAgICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcblxuICAgICAgICBpZiAoIWVuYWJsZUFsaWdubWVudCkge1xuICAgICAgICAgIGFsaWduZWRfID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZlcnNlVGV4dCAmJiAobmV3VmVyc2VUZXh0ICE9PSBpbml0aWFsVmVyc2VUZXh0KSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgICAgICAgYWxpZ25lZF8gPSBpc1VzZm1BbGlnbmVkKHJlc3VsdHM/LnRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICAgICAgICAgIGFsaWduZWRfID0gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGlnbmVkICE9PSBhbGlnbmVkXykge1xuICAgICAgICBzZXRTdGF0ZSh7IGFsaWduZWQ6IGFsaWduZWRfIH0pXG4gICAgICB9XG4gICAgfVxuICB9LCBbaW5pdGlhbFZlcnNlT2JqZWN0cywgYWxpZ25lckRhdGEsIG5ld1ZlcnNlVGV4dCwgaW5pdGlhbFZlcnNlVGV4dCwgZW5hYmxlQWxpZ25tZW50LCBvcmlnaW5hbFZlcnNlT2JqZWN0c10pXG5cbiAgZnVuY3Rpb24gZ2V0Q2hhbmdlcygpIHtcbiAgICBjb25zb2xlLmxvZyhgZ2V0Q2hhbmdlcyAtIHN0YXJ0ZWQgJXtjdXJyZW50SW5kZXh9YClcbiAgICBsZXQgdXBkYXRlZFZlcnNlT2JqZWN0c19cblxuICAgIGlmIChuZXdBbGlnbm1lbnRzKSB7IC8vIGlmIHVuc2F2ZWQgYWxpZ25tZW50IGNoYW5nZXMsIGFwcGx5IHRoZW1cbiAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHNfID0gdXBkYXRlVmVyc2VXaXRoTmV3QWxpZ25tZW50cygpXG4gICAgfSBlbHNlIGlmICh2ZXJzZVRleHRDaGFuZ2VkICYmIG5ld1ZlcnNlVGV4dCkge1xuICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VPYmplY3RzIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgICB1cGRhdGVkVmVyc2VPYmplY3RzXyA9IHRhcmdldFZlcnNlT2JqZWN0c1xuICAgIH0gZWxzZSB7IC8vIG9ubHkgYWxpZ25tZW50IGNoYW5nZXMgdG8gdXBsb2FkXG4gICAgICB1cGRhdGVkVmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHMgfHwgaW5pdGlhbFZlcnNlT2JqZWN0c1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzXykge1xuICAgICAgY29uc3QgcmVmID0gc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWY/LltjdXJyZW50SW5kZXhdXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXdWZXJzZVRleHQsXG4gICAgICAgIHJlZixcbiAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogdXBkYXRlZFZlcnNlT2JqZWN0c18sXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogY2FsbGJhY2sgZm9yIHdoZW4gdXNlciBjbGlja2VkIG9uIGFsaWdubWVudCBidXR0b24gLSB3aWxsIHNob3cgaWYgbm90IGFscmVhZHkgc2hvd25cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUFsaWdubWVudENsaWNrKCkge1xuICAgIGlmIChlbmFibGVBbGlnbm1lbnQpIHtcbiAgICAgIGxldCBfYWxpZ25lckRhdGEgPSBudWxsXG4gICAgICBhd2FpdCBzdGFydEVkaXRCcmFuY2goKVxuXG4gICAgICBpZiAoIWFsaWduZXJEYXRhKSB7IC8vIGlmIHdvcmQgYWxpZ25lciBub3Qgc2hvd25cbiAgICAgICAgY29uc29sZS5sb2coYGhhbmRsZUFsaWdubWVudENsaWNrIC0gdG9nZ2xlIE9OIGFsaWdubWVudGApXG4gICAgICAgIGNvbnN0IHRhcmdldFZlcnNlVVNGTSA9IGdldEN1cnJlbnRWZXJzZVVzZm0odXBkYXRlZFZlcnNlT2JqZWN0cywgaW5pdGlhbFZlcnNlT2JqZWN0cywgdmVyc2VUZXh0Q2hhbmdlZCwgbmV3VmVyc2VUZXh0KVxuICAgICAgICBsZXQgb3JpZ2luYWxWZXJzZVVzZm0gPSBudWxsXG5cbiAgICAgICAgaWYgKG9yaWdpbmFsVmVyc2VPYmplY3RzKSB7XG4gICAgICAgICAgb3JpZ2luYWxWZXJzZVVzZm0gPSBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzLmNvbnZlcnRWZXJzZURhdGFUb1VTRk0ob3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdGFyZ2V0V29yZHM6IHdvcmRCYW5rLFxuICAgICAgICAgIHZlcnNlQWxpZ25tZW50czogYWxpZ25tZW50cyxcbiAgICAgICAgfSA9IEFsaWdubWVudEhlbHBlcnMucGFyc2VVc2ZtVG9Xb3JkQWxpZ25lckRhdGEodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlVXNmbSlcbiAgICAgICAgX2FsaWduZXJEYXRhID0geyB3b3JkQmFuaywgYWxpZ25tZW50cyB9XG4gICAgICB9IGVsc2UgeyAvLyB3b3JkIGFsaWduZXIgY3VycmVudGx5IHNob3duXG4gICAgICAgIGNvbnNvbGUubG9nKGBoYW5kbGVBbGlnbm1lbnRDbGljayAtIGFsaWdubWVudCBhbHJlYWR5IHNob3duYClcbiAgICAgICAgX2FsaWduZXJEYXRhID0gYWxpZ25lckRhdGFcbiAgICAgIH1cbiAgICAgIHNldFN0YXRlKHsgYWxpZ25lckRhdGE6IF9hbGlnbmVyRGF0YSB9KVxuICAgICAgY29uc29sZS5sb2coX2FsaWduZXJEYXRhKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdXBkYXRlZCB2ZXJzZSBvYmplY3RzIGFmdGVyIGFsaWdubWVudHMgY2hhbmdlZFxuICAgKiBAcGFyYW0ge29iamVjdH0gX25ld0FsaWdubWVudHMgLSByZXN1bHRzIG9mIGFsaWduZXJcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMoX25ld0FsaWdubWVudHMgPSBuZXdBbGlnbm1lbnRzKSB7XG4gICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICBjb25zdCB0YXJnZXRWZXJzZVRleHQgPSBuZXdWZXJzZVRleHQgfHwgVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICAgIGNvbnN0IHZlcnNlVXNmbSA9IEFsaWdubWVudEhlbHBlcnMuYWRkQWxpZ25tZW50c1RvVmVyc2VVU0ZNKF9uZXdBbGlnbm1lbnRzLnRhcmdldFdvcmRzLCBfbmV3QWxpZ25tZW50cy52ZXJzZUFsaWdubWVudHMsIHRhcmdldFZlcnNlVGV4dClcbiAgICBjb25zdCBhbGlnbmVkVmVyc2VPYmplY3RzID0gdXNmbUhlbHBlcnMudXNmbVZlcnNlVG9Kc29uKHZlcnNlVXNmbSlcbiAgICByZXR1cm4gYWxpZ25lZFZlcnNlT2JqZWN0c1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZvciB3aGVuIHVzZXIgY2xpY2tlZCBvbiBidXR0b24gdG8gc2F2ZSBjdXJyZW50IGFsaWdubWVudHMgaW4gd29yZCBhbGlnbmVyLiAgR2VuZXJhdGVzIG5ldyB2ZXJzZSBjb250ZW50IGFuZCBzYXZlcyBpbiBzdGF0ZS4gQ2xvc2VzIGFsaWduZXIgZGlzcGxheVxuICAgKiBAcGFyYW0ge29iamVjdH0gX25ld0FsaWdubWVudHMgLSByZXN1bHRzIG9mIGFsaWduZXJcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVBbGlnbm1lbnQoX25ld0FsaWdubWVudHMgPSBuZXdBbGlnbm1lbnRzKSB7XG4gICAgY29uc29sZS5sb2coYHNhdmVBbGlnbm1lbnQoKSAtIG5ld0FsaWdubWVudHNgLCBfbmV3QWxpZ25tZW50cylcblxuICAgIGlmIChfbmV3QWxpZ25tZW50cykge1xuICAgICAgY29uc3QgYWxpZ25lZFZlcnNlT2JqZWN0cyA9IHVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMoX25ld0FsaWdubWVudHMpXG4gICAgICBjb25zb2xlLmxvZyhgc2F2ZUFsaWdubWVudCgpIC0gYWxpZ25lZFZlcnNlT2JqZWN0c2AsIGFsaWduZWRWZXJzZU9iamVjdHMpXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgbmV3QWxpZ25tZW50czogbnVsbCxcbiAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogYWxpZ25lZFZlcnNlT2JqZWN0cyxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgYWxpZ25lckRhdGE6IG51bGwsXG4gICAgICAgIGVkaXRpbmc6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FsbGJhY2sgZm9yIHdoZW4gdXNlciBjbGlja2VkIG9uIGJ1dHRvbiB0byBjYW5jZWwgd29yayBpbiB3b3JkIGFsaWduZXIuICBDYWxjdWxhdGVzIGFuZCBkaXNwbGF5cyBjdXJyZW50IGFsaWdubWVudCB2YWxpZCBzdGF0ZS4gQ2xvc2VzIGFsaWduZXIgZGlzcGxheVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBjYW5jZWxBbGlnbm1lbnQoKWApXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgY29uc3QgYWxpZ25lZCA9IGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHMpXG4gICAgc2V0U3RhdGUoeyBhbGlnbmVyRGF0YTogbnVsbCwgYWxpZ25lZCB9KVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZvciBidXR0b24gdG8gc2V0IGVkaXRpbmcgc3RhdGVcbiAgICogQHBhcmFtIHtib29sZWFufSBlZGl0aW5nXyAtIGlmIHRydWUsIGVkaXRvciBpcyBzaG93biwgb3RoZXJ3aXNlIGVkaXRvciBpcyBoaWRkZW5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHNldEVkaXRpbmcoZWRpdGluZ18pIHtcbiAgICBpZiAoZW5hYmxlRWRpdCkge1xuICAgICAgaWYgKGVkaXRpbmdfICYmICFlZGl0aW5nKSB7XG4gICAgICAgIGF3YWl0IHN0YXJ0RWRpdEJyYW5jaCgpXG4gICAgICB9XG5cbiAgICAgIGlmIChlZGl0aW5nXyAhPT0gZWRpdGluZykge1xuICAgICAgICBzZXRTdGF0ZSh7IGVkaXRpbmc6IGVkaXRpbmdfIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZyb20gdGhlIGVkaXQgb25DaGFuZ2UgZXZlbnQgdG8gdXBkYXRlIGVkaXQgc3RhdGUgdmFyaWFibGVzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hhbmdlZCAtIHRydWUgaWYgdGhlIG5ld1ZlcnNlVGV4dCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgaW5pdGlhbFZlcnNlVGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VmVyc2VUZXh0IC0gY3VycmVudCBjaGFuZ2VkIHZlcnNlIHRleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9pbml0aWFsVmVyc2VUZXh0IC0gaW5pdGlhbCB2ZXJzZSB0ZXh0XG4gICAqL1xuICBmdW5jdGlvbiBzZXRWZXJzZUNoYW5nZWQoY2hhbmdlZCwgbmV3VmVyc2VUZXh0LCBfaW5pdGlhbFZlcnNlVGV4dCkge1xuICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VUZXh0IH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGluaXRpYWxWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICBjb25zdCBhbGlnbmVkID0gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVRleHQsIG9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2U/LnZlcnNlT2JqZWN0cylcbiAgICBjb25zdCBfY2hhbmdlZCA9IG5ld1ZlcnNlVGV4dCAhPT0gaW5pdGlhbFZlcnNlVGV4dFxuXG4gICAgc2V0U3RhdGUoe1xuICAgICAgdmVyc2VUZXh0Q2hhbmdlZDogX2NoYW5nZWQsXG4gICAgICBuZXdWZXJzZVRleHQsXG4gICAgICBhbGlnbmVkLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzID0gUmVhY3QudXNlTWVtbyggKCkgPT4geyAvLyBpZiB2ZXJzZSBoYXMgYmVlbiBlZGl0ZWQgb3IgYWxpZ25tZW50IGNoYW5nZWQsIHRoZW4gZ2VuZXJhdGUgbmV3IHZlcnNlT2JqZWN0cyB0byBkaXNwbGF5IGluIFNjcmlwdHVyZVBhbmVcbiAgICBpZiAoaW5pdGlhbFZlcnNlT2JqZWN0cykge1xuICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzXyA9IHVzZm1IZWxwZXJzLnVzZm1WZXJzZVRvSnNvbih0YXJnZXRWZXJzZVVTRk0pXG4gICAgICByZXR1cm4gY3VycmVudFZlcnNlT2JqZWN0c19cbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxWZXJzZU9iamVjdHNcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dF0pXG5cbiAgY29uc3QgdW5zYXZlZENoYW5nZXM6Ym9vbGVhbiA9IFJlYWN0LnVzZU1lbW8oICgpID0+IHsgLy8gaWYgdmVyc2UgaGFzIGJlZW4gZWRpdGVkIG9yIGFsaWdubWVudCBjaGFuZ2VkLCB0aGVuIGluZGljYXRlIHdlIGhhdmUgdW5zYXZlZCBjaGFuZ2VzXG4gICAgY29uc3QgY2hhbmdlZCA9IHZlcnNlVGV4dENoYW5nZWQgfHwgKHVwZGF0ZWRWZXJzZU9iamVjdHMgJiYgIWlzRXF1YWwoaW5pdGlhbFZlcnNlT2JqZWN0cywgdXBkYXRlZFZlcnNlT2JqZWN0cykpXG4gICAgcmV0dXJuIGNoYW5nZWRcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWRdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHNldCBzYXZlZCBjaGFuZ2VzIHdoZW5ldmVyIHVzZXIgZWRpdHMgdmVyc2UgdGV4dCBvciBhbGlnbm1lbnRzIG9yIGlmIGFsaWdubWVudHMgYXJlIG9wZW5cbiAgICBjb25zdCB1bnNhdmVkQ2hhbmdlc18gPSB1bnNhdmVkQ2hhbmdlcyB8fCBhbGlnbmVyRGF0YVxuICAgIHNldFNhdmVkQ2hhbmdlcyAmJiBzZXRTYXZlZENoYW5nZXMoY3VycmVudEluZGV4LCAhdW5zYXZlZENoYW5nZXNfLCBnZXRDaGFuZ2VzLCBjbGVhckNoYW5nZXMpXG4gIH0sIFt1bnNhdmVkQ2hhbmdlcywgYWxpZ25lckRhdGFdKVxuXG4gIC8qKlxuICAgKiBjYWxsYmFjayBmb3Igd2hlbiBhbGlnbm1lbnRzIGFyZSBiZWluZyBjaGFuZ2VkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXN1bHRzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYWxpZ25tZW50IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBvbkFsaWdubWVudHNDaGFuZ2UocmVzdWx0cykge1xuICAgIGNvbnNvbGUubG9nKGBvbkFsaWdubWVudHNDaGFuZ2UoKSAtIGFsaWdubWVudCBjaGFuZ2VkLCByZXN1bHRzYCwgcmVzdWx0cykgLy8gbWVyZ2UgYWxpZ25tZW50cyBpbnRvIHRhcmdldCB2ZXJzZSBhbmQgY29udmVydCB0byBVU0ZNXG4gICAgY29uc3QgeyB0YXJnZXRXb3JkcywgdmVyc2VBbGlnbm1lbnRzIH0gPSByZXN1bHRzXG4gICAgY29uc3QgYWxpZ25tZW50Q29tcGxldGUgPSBBbGlnbm1lbnRIZWxwZXJzLmFyZUFsZ25tZW50c0NvbXBsZXRlKHRhcmdldFdvcmRzLCB2ZXJzZUFsaWdubWVudHMpXG4gICAgY29uc29sZS5sb2coYEFsaWdubWVudHMgYXJlICR7YWxpZ25tZW50Q29tcGxldGUgPyAnQ09NUExFVEUhJyA6ICdpbmNvbXBsZXRlJ31gKVxuICAgIHNldFN0YXRlKHsgbmV3QWxpZ25tZW50czogcmVzdWx0cywgYWxpZ25lZDogYWxpZ25tZW50Q29tcGxldGUgfSlcbiAgICByZXR1cm4gYWxpZ25tZW50Q29tcGxldGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWN0aW9uczoge1xuICAgICAgY2FuY2VsQWxpZ25tZW50LFxuICAgICAgZ2V0Q2hhbmdlcyxcbiAgICAgIGhhbmRsZUFsaWdubWVudENsaWNrLFxuICAgICAgb25BbGlnbm1lbnRzQ2hhbmdlLFxuICAgICAgc2F2ZUFsaWdubWVudCxcbiAgICAgIHNldEVkaXRpbmcsXG4gICAgICBzZXRWZXJzZUNoYW5nZWQsXG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgYWxpZ25lZCxcbiAgICAgIGFsaWduZXJEYXRhLFxuICAgICAgY3VycmVudFZlcnNlT2JqZWN0cyxcbiAgICAgIGVkaXRpbmcsXG4gICAgICBpbml0aWFsVmVyc2VUZXh0LFxuICAgICAgaW5pdGlhbFZlcnNlT2JqZWN0cyxcbiAgICAgIG5ld1ZlcnNlVGV4dCxcbiAgICAgIHNvdXJjZUxhbmd1YWdlLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2UsXG4gICAgICB1bnNhdmVkQ2hhbmdlcyxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gICAgICByZWZlcmVuY2UsXG4gICAgICB0aXRsZSxcbiAgICB9LFxuICB9XG59XG4iXX0=