@cuby-ui/core 0.0.526 → 0.0.528

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,5 +1,5 @@
1
1
  import { COMBINED_TEXT_BLOCK, COMBINED_TEXT_BLOCK_ADDED, COMBINED_TEXT_BLOCK_NAME, COMBINED_TEXT_BLOCK_PART, COMBINED_TEXT_BLOCK_REMOVED, COMBINED_TEXT_BLOCK_UPDATED, DEFAULT_PLACEHOLDER, DEFAULT_READONLY_PLACEHOLDER, SPLIT_MAX_LENGTH } from '../constants';
2
- import { generateId, splitHTML } from '../utils';
2
+ import { generateId, mergeSmallChunks, splitHTML } from '../utils';
3
3
  export class CuiCombinedTextBlockTool {
4
4
  constructor(options) {
5
5
  this.TAG = 'span';
@@ -12,6 +12,7 @@ export class CuiCombinedTextBlockTool {
12
12
  characterData: true
13
13
  };
14
14
  this.changes = new Map();
15
+ this.skipNextUpdateEmit = false;
15
16
  this.getMutationCallback = (wait) => {
16
17
  let timeoutId = null;
17
18
  return () => {
@@ -57,8 +58,12 @@ export class CuiCombinedTextBlockTool {
57
58
  return;
58
59
  }
59
60
  const text = event.detail.data.textContent;
60
- this.data.textBlocks.splice(this.data.textBlocks.length - 1, 1, this.getBlockPartObject(generateId(), text));
61
- this.update(this.data.textBlocks);
61
+ const lastBlockIndex = this.data.textBlocks.length - 1;
62
+ const lastBlock = this.data.textBlocks[lastBlockIndex];
63
+ const blockId = lastBlock?.id || generateId();
64
+ this.data.textBlocks.splice(lastBlockIndex, 1, this.getBlockPartObject(blockId, text));
65
+ this.skipNextUpdateEmit = true;
66
+ this.updateExistingBlock(blockId, text);
62
67
  }
63
68
  render() {
64
69
  this.wrapper = document.createElement('div');
@@ -67,10 +72,11 @@ export class CuiCombinedTextBlockTool {
67
72
  if (!this.readOnly) {
68
73
  this.wrapper.contentEditable = 'true';
69
74
  }
70
- if (!this.data.textBlocks.length) {
75
+ const isEmptyBlock = !this.data.textBlocks.length;
76
+ if (isEmptyBlock) {
71
77
  this.data.textBlocks.push(this.getBlockPartObject(generateId(), ''));
72
78
  }
73
- this.update(this.data.textBlocks);
79
+ this.renderBlocks(this.data.textBlocks);
74
80
  this.checkIsEditorEmpty();
75
81
  if (!this.readOnly) {
76
82
  const callback = this.getMutationCallback(this.DEBOUNCE_TIME);
@@ -102,7 +108,7 @@ export class CuiCombinedTextBlockTool {
102
108
  const blockObject = this.getBlockPartObject(generateId(), part);
103
109
  this.data.textBlocks.push(blockObject);
104
110
  });
105
- this.update(this.data.textBlocks);
111
+ this.renderBlocks(this.data.textBlocks);
106
112
  }
107
113
  save(blockContent) {
108
114
  const textBlocks = [];
@@ -134,9 +140,33 @@ export class CuiCombinedTextBlockTool {
134
140
  this.checkIsEditorEmpty();
135
141
  }
136
142
  handleMutations() {
137
- const mutationsList = [...this.changes.values()];
138
- const { updatedElements, removedElementsIds } = this.getMutationActions(mutationsList);
139
- const splitedParts = [];
143
+ this.observer?.disconnect();
144
+ try {
145
+ const { updatedElements, removedElementsIds } = this.getMutationActions([...this.changes.values()]);
146
+ const splittedParts = this.takeSplittedPartsResult(updatedElements);
147
+ const { splittedPartsResult, updatedElementsResult, removedElementsIdsResult } = this.takeMergedResult(splittedParts, updatedElements, removedElementsIds);
148
+ this.addBlocks(splittedPartsResult, updatedElementsResult);
149
+ this.updateBlocks(updatedElementsResult);
150
+ this.removeBlocks(removedElementsIdsResult);
151
+ this.changes.clear();
152
+ }
153
+ finally {
154
+ if (!this.wrapper) {
155
+ return;
156
+ }
157
+ this.observer?.observe(this.wrapper, this.mutationConfig);
158
+ }
159
+ }
160
+ takeMergedResult(splittedParts, updatedElements, removedElementsIds) {
161
+ const { removedIds: mergeRemovedIds, updatedElements: mergeUpdatedElements } = this.applyMergeSmallChunks();
162
+ const notRemovedByMerge = (el) => !mergeRemovedIds.has(el.dataset['localId'] ?? '');
163
+ const splittedPartsResult = splittedParts.filter(notRemovedByMerge);
164
+ const removedElementsIdsResult = new Set([...removedElementsIds, ...mergeRemovedIds]);
165
+ const updatedElementsResult = new Set([...updatedElements, ...mergeUpdatedElements].filter(notRemovedByMerge));
166
+ return { splittedPartsResult, updatedElementsResult, removedElementsIdsResult };
167
+ }
168
+ takeSplittedPartsResult(updatedElements) {
169
+ const splittedParts = [];
140
170
  updatedElements.forEach((element) => {
141
171
  const elementContent = element.innerHTML;
142
172
  if (elementContent.length < SPLIT_MAX_LENGTH) {
@@ -149,15 +179,35 @@ export class CuiCombinedTextBlockTool {
149
179
  }
150
180
  const blockId = generateId();
151
181
  const textElement = this.createBlock(blockId, part);
152
- splitedParts.push(textElement);
182
+ splittedParts.push(textElement);
153
183
  });
154
184
  element.innerHTML = parts[0];
155
- element.after(...splitedParts);
185
+ element.after(...splittedParts);
156
186
  });
157
- this.addBlocks(splitedParts, updatedElements);
158
- this.updateBlocks(updatedElements);
159
- this.removeBlocks(removedElementsIds);
160
- this.changes.clear();
187
+ return splittedParts;
188
+ }
189
+ applyMergeSmallChunks() {
190
+ const empty = { removedIds: new Set(), updatedElements: new Set() };
191
+ if (!this.wrapper) {
192
+ return empty;
193
+ }
194
+ const chunkElements = Array.from(this.wrapper.querySelectorAll('.' + COMBINED_TEXT_BLOCK_PART));
195
+ const chunkElementsMap = new Map(chunkElements.map((element) => [element.dataset['localId'], element]));
196
+ const { chunks, removedIds } = mergeSmallChunks(chunkElements.map((element) => ({
197
+ id: element.dataset['localId'],
198
+ content: element.innerHTML
199
+ })));
200
+ removedIds.forEach((id) => chunkElementsMap.get(id)?.remove());
201
+ const updatedElements = new Set();
202
+ chunks.forEach((chunk) => {
203
+ const element = chunkElementsMap.get(chunk.id);
204
+ if (!element || element.innerHTML === chunk.content) {
205
+ return;
206
+ }
207
+ element.innerHTML = chunk.content;
208
+ updatedElements.add(element);
209
+ });
210
+ return { removedIds: new Set(removedIds), updatedElements };
161
211
  }
162
212
  // RIP 13.01.2026 - private getNextIndex(): number
163
213
  getBlockPartObject(blockId, text) {
@@ -183,6 +233,7 @@ export class CuiCombinedTextBlockTool {
183
233
  if (this.lastBlockElement) {
184
234
  const lastBlockElement = this.lastBlockElement;
185
235
  lastBlockElement.append(...changedOutsideElements);
236
+ updatedElements.add(lastBlockElement);
186
237
  this.setCaretToBlocksEnd(lastBlockElement);
187
238
  }
188
239
  return {
@@ -254,6 +305,10 @@ export class CuiCombinedTextBlockTool {
254
305
  if (!updatedElements.size) {
255
306
  return;
256
307
  }
308
+ if (this.skipNextUpdateEmit) {
309
+ this.skipNextUpdateEmit = false;
310
+ return;
311
+ }
257
312
  const updatedBlocks = [...updatedElements.values()].map((block) => {
258
313
  return {
259
314
  id: block.dataset['localId'],
@@ -267,6 +322,22 @@ export class CuiCombinedTextBlockTool {
267
322
  });
268
323
  this.api.events.emit(COMBINED_TEXT_BLOCK_UPDATED, updatedBlocks);
269
324
  }
325
+ updateExistingBlock(blockId, text) {
326
+ if (!this.wrapper) {
327
+ return;
328
+ }
329
+ const existingElement = this.wrapper.querySelector(`[data-local-id="${blockId}"]`);
330
+ if (!existingElement) {
331
+ return;
332
+ }
333
+ const block = this.getBlockPartObject(blockId, text);
334
+ existingElement.innerHTML = text;
335
+ setTimeout(() => {
336
+ this.api.events.emit(COMBINED_TEXT_BLOCK_ADDED, {
337
+ blocks: [block]
338
+ });
339
+ });
340
+ }
270
341
  handleRemovedBlocks(mutation, removedElementsIds) {
271
342
  if (mutation.removedNodes.length === 0) {
272
343
  return;
@@ -290,7 +361,7 @@ export class CuiCombinedTextBlockTool {
290
361
  this.data.textBlocks = this.data.textBlocks.filter((block) => !ids.has(block.id || ''));
291
362
  this.api.events.emit(COMBINED_TEXT_BLOCK_REMOVED, removedElementIds);
292
363
  }
293
- update(blocks) {
364
+ renderBlocks(blocks) {
294
365
  if (!blocks.length) {
295
366
  return;
296
367
  }
@@ -360,4 +431,4 @@ export class CuiCombinedTextBlockTool {
360
431
  return config.placeholder ?? DEFAULT_PLACEHOLDER;
361
432
  }
362
433
  }
363
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYmluZWQtdGV4dC1ibG9jay50b29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9lZGl0b3IvdG9vbHMvY29tYmluZWQtdGV4dC1ibG9jay50b29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsMkJBQTJCLEVBQzNCLDJCQUEyQixFQUMzQixtQkFBbUIsRUFDbkIsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNuQixNQUFNLGNBQWMsQ0FBQztBQU90QixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVqRCxNQUFNLE9BQU8sd0JBQXdCO0lBb0JqQyxZQUFZLE9BQWdCO1FBbkJYLFFBQUcsR0FBRyxNQUFNLENBQUM7UUFDYixrQkFBYSxHQUFHLEdBQUcsQ0FBQztRQUNwQiw4QkFBeUIsR0FBRyxDQUFDLENBQUM7UUFDOUIsK0JBQTBCLEdBQUcsbUJBQW1CLENBQUM7UUFFMUQsbUJBQWMsR0FBRztZQUNyQixPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsYUFBYSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQVFNLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBMkpwQix3QkFBbUIsR0FBRyxDQUFDLElBQVksRUFBdUIsRUFBRTtZQUNoRSxJQUFJLFNBQVMsR0FBK0MsSUFBSSxDQUFDO1lBRWpFLE9BQU8sR0FBRyxFQUFFO2dCQUNSLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ1osWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QixDQUFDO2dCQUVELFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9ELENBQUMs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QUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTyxjQUFjLENBQUMsTUFBa0I7UUFDckMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsT0FBTyxNQUFNLENBQUMsbUJBQW1CLElBQUksNEJBQTRCLENBQUM7UUFDdEUsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQztJQUNyRCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEN1aU51bGxhYmxlIH0gZnJvbSAnQGN1YnktdWkvY2RrJztcbmltcG9ydCB0eXBlIHsgQVBJLCBCbG9ja1Rvb2wsIEJsb2NrVG9vbENvbnN0cnVjdG9yT3B0aW9ucywgVG9vbENvbmZpZyB9IGZyb20gJ0BlZGl0b3Jqcy9lZGl0b3Jqcyc7XG5cbmltcG9ydCB7XG4gICAgQ09NQklORURfVEVYVF9CTE9DSyxcbiAgICBDT01CSU5FRF9URVhUX0JMT0NLX0FEREVELFxuICAgIENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRSxcbiAgICBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsXG4gICAgQ09NQklORURfVEVYVF9CTE9DS19SRU1PVkVELFxuICAgIENPTUJJTkVEX1RFWFRfQkxPQ0tfVVBEQVRFRCxcbiAgICBERUZBVUxUX1BMQUNFSE9MREVSLFxuICAgIERFRkFVTFRfUkVBRE9OTFlfUExBQ0VIT0xERVIsXG4gICAgU1BMSVRfTUFYX0xFTkdUSFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEN1aUNvbWJpbmVkQmxvY2tUb29sRGF0YSxcbiAgICBDdWlDb21iaW5lZFBhcnRCbG9jayxcbiAgICBDdWlNdXRhdGlvbkFjdGlvbnMsXG4gICAgQ3VpTXV0YXRpb25DYWxsYmFja1xufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdlbmVyYXRlSWQsIHNwbGl0SFRNTCB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEN1aUNvbWJpbmVkVGV4dEJsb2NrVG9vbCBpbXBsZW1lbnRzIEJsb2NrVG9vbCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSAnc3Bhbic7XG4gICAgcHJpdmF0ZSByZWFkb25seSBERUJPVU5DRV9USU1FID0gMzUwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTUFYX0NISUxEX0NPVU5UX0ZPUl9FTVBUWSA9IDE7XG4gICAgcHJpdmF0ZSByZWFkb25seSBQTEFDRUhPTERFUl9BVFRSSUJVVEVfTkFNRSA9ICdwbGFjZWhvbGRlckFjdGl2ZSc7XG5cbiAgICBwcml2YXRlIG11dGF0aW9uQ29uZmlnID0ge1xuICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICB9O1xuICAgIHByaXZhdGUgYXBpOiBBUEk7XG4gICAgcHJpdmF0ZSBkYXRhOiBDdWlDb21iaW5lZEJsb2NrVG9vbERhdGE7XG4gICAgcHJpdmF0ZSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIHByaXZhdGUgd3JhcHBlcj86IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgb2JzZXJ2ZXI/OiBNdXRhdGlvbk9ic2VydmVyO1xuICAgIHByaXZhdGUgbGFzdEJsb2NrRWxlbWVudD86IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgcmVhZE9ubHk/OiBib29sZWFuO1xuICAgIHByaXZhdGUgY2hhbmdlcyA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgYm9keSA9IG9wdGlvbnMgYXMgQmxvY2tUb29sQ29uc3RydWN0b3JPcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhID0gYm9keS5kYXRhO1xuXG4gICAgICAgIHRoaXMucmVhZE9ubHkgPSBib2R5LnJlYWRPbmx5O1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlcihib2R5LmNvbmZpZyk7XG4gICAgICAgIHRoaXMuYXBpID0gYm9keS5hcGk7XG4gICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkIHx8IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgICAgIHRleHRCbG9ja3M6IGRhdGEudGV4dEJsb2NrcyB8fCBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY29udmVydERlZmF1bHREYXRhVG9DdXN0b20oZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgaXNJbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBpc1JlYWRPbmx5U3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBlbmFibGVMaW5lQnJlYWtzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdG9vbGJveCgpOiB7IGljb246IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGljb246ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGQ9XCJNOCA5VjcuMkM4IDcuMDg5NTQgOC4wODk1NCA3IDguMiA3TDEyIDdNMTYgOVY3LjJDMTYgNy4wODk1NCAxNS45MTA1IDcgMTUuOCA3TDEyIDdNMTIgN0wxMiAxN00xMiAxN0gxME0xMiAxN0gxNFwiPjwvcGF0aD48L3N2Zz4nLFxuICAgICAgICAgICAgdGl0bGU6ICdUZXh0J1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHBhc3RlQ29uZmlnKCk6IG9iamVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWdzOiBbJ1AnXVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBvblBhc3RlKGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSAhPT0gJ3RhZycpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHQgPSBldmVudC5kZXRhaWwuZGF0YS50ZXh0Q29udGVudDtcblxuICAgICAgICB0aGlzLmRhdGEudGV4dEJsb2Nrcy5zcGxpY2UodGhpcy5kYXRhLnRleHRCbG9ja3MubGVuZ3RoIC0gMSwgMSwgdGhpcy5nZXRCbG9ja1BhcnRPYmplY3QoZ2VuZXJhdGVJZCgpLCB0ZXh0KSk7XG4gICAgICAgIHRoaXMudXBkYXRlKHRoaXMuZGF0YS50ZXh0QmxvY2tzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgdGhpcy53cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMud3JhcHBlci5jbGFzc0xpc3QuYWRkKENPTUJJTkVEX1RFWFRfQkxPQ0spO1xuICAgICAgICB0aGlzLndyYXBwZXIuZGF0YXNldFt0aGlzLlBMQUNFSE9MREVSX0FUVFJJQlVURV9OQU1FXSA9IHRoaXMuYXBpLmkxOG4udCh0aGlzLnBsYWNlaG9sZGVyKTtcblxuICAgICAgICBpZiAoIXRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlci5jb250ZW50RWRpdGFibGUgPSAndHJ1ZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZGF0YS50ZXh0QmxvY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnRleHRCbG9ja3MucHVzaCh0aGlzLmdldEJsb2NrUGFydE9iamVjdChnZW5lcmF0ZUlkKCksICcnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmRhdGEudGV4dEJsb2Nrcyk7XG4gICAgICAgIHRoaXMuY2hlY2tJc0VkaXRvckVtcHR5KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuZ2V0TXV0YXRpb25DYWxsYmFjayh0aGlzLkRFQk9VTkNFX1RJTUUpO1xuXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5vbk11dGF0aW9uRXZlbnQuYmluZCh0aGlzLCBjYWxsYmFjaykpO1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMud3JhcHBlciwgdGhpcy5tdXRhdGlvbkNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZShibG9ja3NEYXRhOiBDdWlDb21iaW5lZFBhcnRCbG9ja1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy53cmFwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmxvY2tzVGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgdGhpcy5kYXRhLnRleHRCbG9ja3MgPSBbXTtcblxuICAgICAgICBibG9ja3NEYXRhLmZvckVhY2goKGJsb2NrKSA9PiB7XG4gICAgICAgICAgICBibG9ja3NUZXh0Q29udGVudCArPSBibG9jay5kYXRhLnRleHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cmFwcGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLndyYXBwZXIuY2hpbGROb2Rlcy5pdGVtKGkpO1xuXG4gICAgICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTFNwYW5FbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgYmxvY2tzVGV4dENvbnRlbnQgPSBub2RlLmlubmVySFRNTCArIGJsb2Nrc1RleHRDb250ZW50O1xuICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYmxvY2tzVGV4dENvbnRlbnQubGVuZ3RoIDwgU1BMSVRfTUFYX0xFTkdUSCA/IFtibG9ja3NUZXh0Q29udGVudF0gOiBzcGxpdEhUTUwoYmxvY2tzVGV4dENvbnRlbnQpO1xuXG4gICAgICAgIHBhcnRzLmZvckVhY2goKHBhcnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tPYmplY3QgPSB0aGlzLmdldEJsb2NrUGFydE9iamVjdChnZW5lcmF0ZUlkKCksIHBhcnQpO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGEudGV4dEJsb2Nrcy5wdXNoKGJsb2NrT2JqZWN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5kYXRhLnRleHRCbG9ja3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlKGJsb2NrQ29udGVudDogSFRNTEVsZW1lbnQpOiBDdWlDb21iaW5lZFBhcnRCbG9ja1tdIHtcbiAgICAgICAgY29uc3QgdGV4dEJsb2NrczogQ3VpQ29tYmluZWRQYXJ0QmxvY2tbXSA9IFtdO1xuXG4gICAgICAgIGJsb2NrQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuVEFHKS5mb3JFYWNoKChzcGFuOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGV4dEJsb2Nrcy5wdXNoKHRoaXMuZ2V0QmxvY2tQYXJ0T2JqZWN0KHNwYW4uZGF0YXNldFsnbG9jYWxJZCddISwgc3Bhbi5pbm5lckhUTUwpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRleHRCbG9ja3M7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcblxuICAgICAgICBjb25zdCBibG9ja0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgIHRoaXMuZGF0YS50ZXh0QmxvY2tzLmZvckVhY2goKGJsb2NrOiBDdWlDb21iaW5lZFBhcnRCbG9jaykgPT4ge1xuICAgICAgICAgICAgYmxvY2tJZHMuYWRkKGJsb2NrLmlkIHx8ICcnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVCbG9ja3MoYmxvY2tJZHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25NdXRhdGlvbkV2ZW50KGNhbGxiYWNrOiAobXV0YXRpb25MaXN0OiBNdXRhdGlvblJlY29yZFtdKSA9PiB2b2lkLCBtdXRhdGlvbkxpc3Q6IE11dGF0aW9uUmVjb3JkW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKG11dGF0aW9uTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG11dGF0aW9uTGlzdC5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXMuc2V0KGdlbmVyYXRlSWQoKSwgbXV0YXRpb24pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNoYW5nZXMuc2V0KG11dGF0aW9uLnRhcmdldCwgbXV0YXRpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjayhtdXRhdGlvbkxpc3QpO1xuICAgICAgICB0aGlzLmNoZWNrSXNFZGl0b3JFbXB0eSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TXV0YXRpb25DYWxsYmFjayA9ICh3YWl0OiBudW1iZXIpOiBDdWlNdXRhdGlvbkNhbGxiYWNrID0+IHtcbiAgICAgICAgbGV0IHRpbWVvdXRJZDogQ3VpTnVsbGFibGU8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+ID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGFuZGxlTXV0YXRpb25zKCksIHdhaXQpO1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZU11dGF0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbXV0YXRpb25zTGlzdCA9IFsuLi50aGlzLmNoYW5nZXMudmFsdWVzKCldO1xuICAgICAgICBjb25zdCB7IHVwZGF0ZWRFbGVtZW50cywgcmVtb3ZlZEVsZW1lbnRzSWRzIH0gPSB0aGlzLmdldE11dGF0aW9uQWN0aW9ucyhtdXRhdGlvbnNMaXN0KTtcbiAgICAgICAgY29uc3Qgc3BsaXRlZFBhcnRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgICAgICAgdXBkYXRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50Q29udGVudDogc3RyaW5nID0gZWxlbWVudC5pbm5lckhUTUw7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Q29udGVudC5sZW5ndGggPCBTUExJVF9NQVhfTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHNwbGl0SFRNTChlbGVtZW50Q29udGVudCk7XG5cbiAgICAgICAgICAgIHBhcnRzLmZvckVhY2goKHBhcnQ6IHN0cmluZywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrSWQgPSBnZW5lcmF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLmNyZWF0ZUJsb2NrKGJsb2NrSWQsIHBhcnQpO1xuXG4gICAgICAgICAgICAgICAgc3BsaXRlZFBhcnRzLnB1c2godGV4dEVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gcGFydHNbMF07XG4gICAgICAgICAgICBlbGVtZW50LmFmdGVyKC4uLnNwbGl0ZWRQYXJ0cyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQmxvY2tzKHNwbGl0ZWRQYXJ0cywgdXBkYXRlZEVsZW1lbnRzKTtcbiAgICAgICAgdGhpcy51cGRhdGVCbG9ja3ModXBkYXRlZEVsZW1lbnRzKTtcbiAgICAgICAgdGhpcy5yZW1vdmVCbG9ja3MocmVtb3ZlZEVsZW1lbnRzSWRzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gUklQIDEzLjAxLjIwMjYgLSBwcml2YXRlIGdldE5leHRJbmRleCgpOiBudW1iZXJcblxuICAgIHByaXZhdGUgZ2V0QmxvY2tQYXJ0T2JqZWN0KGJsb2NrSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nKTogQ3VpQ29tYmluZWRQYXJ0QmxvY2sge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGJsb2NrSWQsXG4gICAgICAgICAgICB0eXBlOiBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5kYXRhLmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudFR5cGU6IENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TXV0YXRpb25BY3Rpb25zKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSk6IEN1aU11dGF0aW9uQWN0aW9ucyB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50cyA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50c0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCBjaGFuZ2VkT3V0c2lkZUVsZW1lbnRzOiBOb2RlW10gPSBbXTtcblxuICAgICAgICB0aGlzLmxhc3RCbG9ja0VsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbXV0YXRpb25MaXN0LmZvckVhY2goKG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGVkQmxvY2tzKG11dGF0aW9uLCB1cGRhdGVkRWxlbWVudHMsIGNoYW5nZWRPdXRzaWRlRWxlbWVudHMpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW1vdmVkQmxvY2tzKG11dGF0aW9uLCByZW1vdmVkRWxlbWVudHNJZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0QmxvY2tFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0QmxvY2tFbGVtZW50ID0gdGhpcy5sYXN0QmxvY2tFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBsYXN0QmxvY2tFbGVtZW50LmFwcGVuZCguLi5jaGFuZ2VkT3V0c2lkZUVsZW1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FyZXRUb0Jsb2Nrc0VuZChsYXN0QmxvY2tFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cGRhdGVkRWxlbWVudHMsXG4gICAgICAgICAgICByZW1vdmVkRWxlbWVudHNJZHNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENhcmV0VG9CbG9ja3NFbmQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGJsb2NrLCBibG9jay5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlVXBkYXRlZEJsb2NrcyhcbiAgICAgICAgbXV0YXRpb246IE11dGF0aW9uUmVjb3JkLFxuICAgICAgICB1cGRhdGVkRWxlbWVudHM6IFNldDxIVE1MRWxlbWVudD4sXG4gICAgICAgIG91dHNpZGVDaGFuZ2VzOiBOb2RlW11cbiAgICApOiB2b2lkIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSBtdXRhdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKG11dGF0aW9uLnRhcmdldC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBtdXRhdGlvbi50YXJnZXQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwYW4gPSBlbGVtZW50Py5jbG9zZXN0KCcuJyArIENPTUJJTkVEX1RFWFRfQkxPQ0tfUEFSVCkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHNwYW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZWRFbGVtZW50cy5hZGQoc3Bhbik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlc091dHNpZGVCbG9jayhlbGVtZW50LCBvdXRzaWRlQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2VzT3V0c2lkZUJsb2NrKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvdXRzaWRlQ2hhbmdlczogTm9kZVtdKTogdm9pZCB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCB0aGlzLmxhc3RCbG9ja0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuY2hpbGROb2Rlcy5mb3JFYWNoKChibG9jaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tFbGVtZW50ID0gYmxvY2sgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChibG9ja0VsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucyhDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0QmxvY2tFbGVtZW50ID0gYmxvY2tFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXRzaWRlQ2hhbmdlcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRCbG9ja3Moc3BsaWNlZFBhcnRzOiBIVE1MRWxlbWVudFtdLCB1cGRhdGVkRWxlbWVudHM6IFNldDxIVE1MRWxlbWVudD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzcGxpY2VkUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRlZEJsb2NrczogQ3VpQ29tYmluZWRQYXJ0QmxvY2tbXSA9IHNwbGljZWRQYXJ0cy5tYXAoKGJsb2NrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0lkID0gYmxvY2suZGF0YXNldFsnbG9jYWxJZCddO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiBibG9ja0lkLFxuICAgICAgICAgICAgICAgIHR5cGU6IENPTUJJTkVEX1RFWFRfQkxPQ0tfUEFSVCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGJsb2NrLmlubmVySFRNTCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50VHlwZTogQ09NQklORURfVEVYVF9CTE9DS19OQU1FXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gdXBkYXRlZEVsZW1lbnRzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgaWQgPSBwcmV2aW91c0VsZW1lbnQ/LmRhdGFzZXRbJ2xvY2FsSWQnXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocHJldmlvdXNFbGVtZW50Py5kYXRhc2V0WydpbmRleCddKSArIDE7XG4gICAgICAgIGNvbnN0IGJsb2NrSW5kZXggPSB0aGlzLmRhdGEudGV4dEJsb2Nrcy5maW5kSW5kZXgoKGJsb2NrKSA9PiBibG9jay5pZCA9PT0gaWQpO1xuXG4gICAgICAgIHRoaXMuZGF0YS50ZXh0QmxvY2tzLnNwbGljZShibG9ja0luZGV4LCAwLCAuLi5hZGRlZEJsb2Nrcyk7XG4gICAgICAgIHRoaXMuYXBpLmV2ZW50cy5lbWl0KENPTUJJTkVEX1RFWFRfQkxPQ0tfQURERUQsIHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgYmxvY2tJbmRleCxcbiAgICAgICAgICAgIGJsb2NrczogYWRkZWRCbG9ja3MsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEudGV4dEJsb2Nrc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUJsb2Nrcyh1cGRhdGVkRWxlbWVudHM6IFNldDxIVE1MRWxlbWVudD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF1cGRhdGVkRWxlbWVudHMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZEJsb2NrcyA9IFsuLi51cGRhdGVkRWxlbWVudHMudmFsdWVzKCldLm1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IGJsb2NrLmRhdGFzZXRbJ2xvY2FsSWQnXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBibG9jay5pbm5lckhUTUwsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGU6IENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXBpLmV2ZW50cy5lbWl0KENPTUJJTkVEX1RFWFRfQkxPQ0tfVVBEQVRFRCwgdXBkYXRlZEJsb2Nrcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVSZW1vdmVkQmxvY2tzKG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCwgcmVtb3ZlZEVsZW1lbnRzSWRzOiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgICAgICBpZiAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmZvckVhY2goKG5vZGU6IE5vZGUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJsb2NrSWQgPSAobm9kZSBhcyBIVE1MRWxlbWVudCkuZGF0YXNldFsnbG9jYWxJZCddO1xuXG4gICAgICAgICAgICBpZiAoIWJsb2NrSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbW92ZWRFbGVtZW50c0lkcy5hZGQoYmxvY2tJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlQmxvY2tzKGlkczogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpZHMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVtb3ZlZEVsZW1lbnRJZHMgPSBbLi4uaWRzLnZhbHVlcygpXTtcblxuICAgICAgICB0aGlzLmRhdGEudGV4dEJsb2NrcyA9IHRoaXMuZGF0YS50ZXh0QmxvY2tzLmZpbHRlcigoYmxvY2spID0+ICFpZHMuaGFzKGJsb2NrLmlkIHx8ICcnKSk7XG4gICAgICAgIHRoaXMuYXBpLmV2ZW50cy5lbWl0KENPTUJJTkVEX1RFWFRfQkxPQ0tfUkVNT1ZFRCwgcmVtb3ZlZEVsZW1lbnRJZHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlKGJsb2NrczogQ3VpQ29tYmluZWRQYXJ0QmxvY2tbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWJsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJsb2Nrcy5mb3JFYWNoKChibG9jazogQ3VpQ29tYmluZWRQYXJ0QmxvY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gdGhpcy5jcmVhdGVCbG9jayhibG9jay5pZCB8fCBnZW5lcmF0ZUlkKCksIGJsb2NrLmRhdGEudGV4dCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy53cmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy53cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy4nICsgQ09NQklORURfVEVYVF9CTE9DS19QQVJUKSkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5hcHBlbmQodGV4dEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLndyYXBwZXIucmVwbGFjZUNoaWxkcmVuKHRleHRFbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwaS5ldmVudHMuZW1pdChDT01CSU5FRF9URVhUX0JMT0NLX0FEREVELCB7XG4gICAgICAgICAgICAgICAgYmxvY2tzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCbG9jayhpZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLlRBRyk7XG5cbiAgICAgICAgdGV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQpO1xuICAgICAgICB0ZXh0RWxlbWVudC5pbm5lckhUTUwgPSB0ZXh0O1xuICAgICAgICB0ZXh0RWxlbWVudC5kYXRhc2V0WydpZCddID0gaWQ7XG4gICAgICAgIHRleHRFbGVtZW50LmRhdGFzZXRbJ2xvY2FsSWQnXSA9IGlkO1xuXG4gICAgICAgIHJldHVybiB0ZXh0RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnZlcnREZWZhdWx0RGF0YVRvQ3VzdG9tKGRhdGE6IHsgdGV4dDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS50ZXh0QmxvY2tzID0gZGF0YS5tYXAoKGJsb2NrKSA9PiB7XG4gICAgICAgICAgICAgICAgYmxvY2suaWQgPSBnZW5lcmF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgYmxvY2suZGF0YS5wYXJlbnRJZCA9IHRoaXMuZGF0YS5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhLnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoZGF0YS50ZXh0KTtcbiAgICAgICAgbGV0IGVsZW1lbnRDb250ZW50ID0gJyc7XG5cbiAgICAgICAgZnJhZ21lbnQuY2hpbGROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Q29udGVudCArPSBub2RlLnRleHRDb250ZW50O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50Q29udGVudCArPSAobm9kZSBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IGVsZW1lbnRDb250ZW50Lmxlbmd0aCA8IFNQTElUX01BWF9MRU5HVEggPyBbZWxlbWVudENvbnRlbnRdIDogc3BsaXRIVE1MKGVsZW1lbnRDb250ZW50KTtcblxuICAgICAgICBwYXJ0cy5mb3JFYWNoKChwYXJ0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrT2JqZWN0ID0gdGhpcy5nZXRCbG9ja1BhcnRPYmplY3QoZ2VuZXJhdGVJZCgpLCBwYXJ0KTtcblxuICAgICAgICAgICAgdGhpcy5kYXRhLnRleHRCbG9ja3MucHVzaChibG9ja09iamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tJc0VkaXRvckVtcHR5KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMud3JhcHBlciB8fCB0aGlzLndyYXBwZXIuY2hpbGRyZW4ubGVuZ3RoID4gdGhpcy5NQVhfQ0hJTERfQ09VTlRfRk9SX0VNUFRZKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy53cmFwcGVyLmNoaWxkcmVuLml0ZW0oMCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlzSXRlbUVtcHR5ID0gIWl0ZW0udGV4dENvbnRlbnQ/Lmxlbmd0aDtcblxuICAgICAgICB0aGlzLndyYXBwZXIuZGF0YXNldFsnZW1wdHknXSA9IGAke2lzSXRlbUVtcHR5fWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQbGFjZWhvbGRlcihjb25maWc6IFRvb2xDb25maWcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5yZWFkb25seVBsYWNlaG9sZGVyID8/IERFRkFVTFRfUkVBRE9OTFlfUExBQ0VIT0xERVI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnLnBsYWNlaG9sZGVyID8/IERFRkFVTFRfUExBQ0VIT0xERVI7XG4gICAgfVxufVxuIl19
434
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYmluZWQtdGV4dC1ibG9jay50b29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9lZGl0b3IvdG9vbHMvY29tYmluZWQtdGV4dC1ibG9jay50b29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsMkJBQTJCLEVBQzNCLDJCQUEyQixFQUMzQixtQkFBbUIsRUFDbkIsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNuQixNQUFNLGNBQWMsQ0FBQztBQU90QixPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVuRSxNQUFNLE9BQU8sd0JBQXdCO0lBc0JqQyxZQUFZLE9BQWdCO1FBckJYLFFBQUcsR0FBRyxNQUFNLENBQUM7UUFDYixrQkFBYSxHQUFHLEdBQUcsQ0FBQztRQUNwQiw4QkFBeUIsR0FBRyxDQUFDLENBQUM7UUFDOUIsK0JBQTBCLEdBQUcsbUJBQW1CLENBQUM7UUFFakQsbUJBQWMsR0FBRztZQUM5QixPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsYUFBYSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQVFlLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTdCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQW1LbEIsd0JBQW1CLEdBQUcsQ0FBQyxJQUFZLEVBQXVCLEVBQUU7WUFDekUsSUFBSSxTQUFTLEdBQStDLElBQUksQ0FBQztZQUVqRSxPQUFPLEdBQUcsRUFBRTtnQkFDUixJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNaLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztnQkFFRCxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxl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QUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqRixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWdCLENBQUM7UUFDMUQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUU5QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTyxjQUFjLENBQUMsTUFBa0I7UUFDckMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsT0FBTyxNQUFNLENBQUMsbUJBQW1CLElBQUksNEJBQTRCLENBQUM7UUFDdEUsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQztJQUNyRCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB0eXBlIHsgQ3VpTnVsbGFibGUgfSBmcm9tICdAY3VieS11aS9jZGsnO1xuaW1wb3J0IHR5cGUgeyBBUEksIEJsb2NrVG9vbCwgQmxvY2tUb29sQ29uc3RydWN0b3JPcHRpb25zLCBUb29sQ29uZmlnIH0gZnJvbSAnQGVkaXRvcmpzL2VkaXRvcmpzJztcblxuaW1wb3J0IHtcbiAgICBDT01CSU5FRF9URVhUX0JMT0NLLFxuICAgIENPTUJJTkVEX1RFWFRfQkxPQ0tfQURERUQsXG4gICAgQ09NQklORURfVEVYVF9CTE9DS19OQU1FLFxuICAgIENPTUJJTkVEX1RFWFRfQkxPQ0tfUEFSVCxcbiAgICBDT01CSU5FRF9URVhUX0JMT0NLX1JFTU9WRUQsXG4gICAgQ09NQklORURfVEVYVF9CTE9DS19VUERBVEVELFxuICAgIERFRkFVTFRfUExBQ0VIT0xERVIsXG4gICAgREVGQVVMVF9SRUFET05MWV9QTEFDRUhPTERFUixcbiAgICBTUExJVF9NQVhfTEVOR1RIXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQ3VpQ29tYmluZWRCbG9ja1Rvb2xEYXRhLFxuICAgIEN1aUNvbWJpbmVkUGFydEJsb2NrLFxuICAgIEN1aU11dGF0aW9uQWN0aW9ucyxcbiAgICBDdWlNdXRhdGlvbkNhbGxiYWNrXG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZCwgbWVyZ2VTbWFsbENodW5rcywgc3BsaXRIVE1MIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ3VpQ29tYmluZWRUZXh0QmxvY2tUb29sIGltcGxlbWVudHMgQmxvY2tUb29sIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9ICdzcGFuJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IERFQk9VTkNFX1RJTUUgPSAzNTA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBNQVhfQ0hJTERfQ09VTlRfRk9SX0VNUFRZID0gMTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFBMQUNFSE9MREVSX0FUVFJJQlVURV9OQU1FID0gJ3BsYWNlaG9sZGVyQWN0aXZlJztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbXV0YXRpb25Db25maWcgPSB7XG4gICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgIH07XG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGk6IEFQSTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IEN1aUNvbWJpbmVkQmxvY2tUb29sRGF0YTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB3cmFwcGVyPzogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgcHJpdmF0ZSBsYXN0QmxvY2tFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VzID0gbmV3IE1hcCgpO1xuXG4gICAgcHJpdmF0ZSBza2lwTmV4dFVwZGF0ZUVtaXQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgYm9keSA9IG9wdGlvbnMgYXMgQmxvY2tUb29sQ29uc3RydWN0b3JPcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhID0gYm9keS5kYXRhO1xuXG4gICAgICAgIHRoaXMucmVhZE9ubHkgPSBib2R5LnJlYWRPbmx5O1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlcihib2R5LmNvbmZpZyk7XG4gICAgICAgIHRoaXMuYXBpID0gYm9keS5hcGk7XG4gICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkIHx8IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgICAgIHRleHRCbG9ja3M6IGRhdGEudGV4dEJsb2NrcyB8fCBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY29udmVydERlZmF1bHREYXRhVG9DdXN0b20oZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgaXNJbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBpc1JlYWRPbmx5U3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBlbmFibGVMaW5lQnJlYWtzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdG9vbGJveCgpOiB7IGljb246IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGljb246ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGQ9XCJNOCA5VjcuMkM4IDcuMDg5NTQgOC4wODk1NCA3IDguMiA3TDEyIDdNMTYgOVY3LjJDMTYgNy4wODk1NCAxNS45MTA1IDcgMTUuOCA3TDEyIDdNMTIgN0wxMiAxN00xMiAxN0gxME0xMiAxN0gxNFwiPjwvcGF0aD48L3N2Zz4nLFxuICAgICAgICAgICAgdGl0bGU6ICdUZXh0J1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHBhc3RlQ29uZmlnKCk6IG9iamVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWdzOiBbJ1AnXVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBvblBhc3RlKGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSAhPT0gJ3RhZycpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHQgPSBldmVudC5kZXRhaWwuZGF0YS50ZXh0Q29udGVudDtcbiAgICAgICAgY29uc3QgbGFzdEJsb2NrSW5kZXggPSB0aGlzLmRhdGEudGV4dEJsb2Nrcy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBsYXN0QmxvY2sgPSB0aGlzLmRhdGEudGV4dEJsb2Nrc1tsYXN0QmxvY2tJbmRleF07XG4gICAgICAgIGNvbnN0IGJsb2NrSWQgPSBsYXN0QmxvY2s/LmlkIHx8IGdlbmVyYXRlSWQoKTtcblxuICAgICAgICB0aGlzLmRhdGEudGV4dEJsb2Nrcy5zcGxpY2UobGFzdEJsb2NrSW5kZXgsIDEsIHRoaXMuZ2V0QmxvY2tQYXJ0T2JqZWN0KGJsb2NrSWQsIHRleHQpKTtcblxuICAgICAgICB0aGlzLnNraXBOZXh0VXBkYXRlRW1pdCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy51cGRhdGVFeGlzdGluZ0Jsb2NrKGJsb2NrSWQsIHRleHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICB0aGlzLndyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy53cmFwcGVyLmNsYXNzTGlzdC5hZGQoQ09NQklORURfVEVYVF9CTE9DSyk7XG4gICAgICAgIHRoaXMud3JhcHBlci5kYXRhc2V0W3RoaXMuUExBQ0VIT0xERVJfQVRUUklCVVRFX05BTUVdID0gdGhpcy5hcGkuaTE4bi50KHRoaXMucGxhY2Vob2xkZXIpO1xuXG4gICAgICAgIGlmICghdGhpcy5yZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRW1wdHlCbG9jayA9ICF0aGlzLmRhdGEudGV4dEJsb2Nrcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGlzRW1wdHlCbG9jaykge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnRleHRCbG9ja3MucHVzaCh0aGlzLmdldEJsb2NrUGFydE9iamVjdChnZW5lcmF0ZUlkKCksICcnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlckJsb2Nrcyh0aGlzLmRhdGEudGV4dEJsb2Nrcyk7XG4gICAgICAgIHRoaXMuY2hlY2tJc0VkaXRvckVtcHR5KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuZ2V0TXV0YXRpb25DYWxsYmFjayh0aGlzLkRFQk9VTkNFX1RJTUUpO1xuXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5vbk11dGF0aW9uRXZlbnQuYmluZCh0aGlzLCBjYWxsYmFjaykpO1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMud3JhcHBlciwgdGhpcy5tdXRhdGlvbkNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZShibG9ja3NEYXRhOiBDdWlDb21iaW5lZFBhcnRCbG9ja1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy53cmFwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmxvY2tzVGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgdGhpcy5kYXRhLnRleHRCbG9ja3MgPSBbXTtcblxuICAgICAgICBibG9ja3NEYXRhLmZvckVhY2goKGJsb2NrKSA9PiB7XG4gICAgICAgICAgICBibG9ja3NUZXh0Q29udGVudCArPSBibG9jay5kYXRhLnRleHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cmFwcGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLndyYXBwZXIuY2hpbGROb2Rlcy5pdGVtKGkpO1xuXG4gICAgICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTFNwYW5FbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgYmxvY2tzVGV4dENvbnRlbnQgPSBub2RlLmlubmVySFRNTCArIGJsb2Nrc1RleHRDb250ZW50O1xuICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYmxvY2tzVGV4dENvbnRlbnQubGVuZ3RoIDwgU1BMSVRfTUFYX0xFTkdUSCA/IFtibG9ja3NUZXh0Q29udGVudF0gOiBzcGxpdEhUTUwoYmxvY2tzVGV4dENvbnRlbnQpO1xuXG4gICAgICAgIHBhcnRzLmZvckVhY2goKHBhcnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tPYmplY3QgPSB0aGlzLmdldEJsb2NrUGFydE9iamVjdChnZW5lcmF0ZUlkKCksIHBhcnQpO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGEudGV4dEJsb2Nrcy5wdXNoKGJsb2NrT2JqZWN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJCbG9ja3ModGhpcy5kYXRhLnRleHRCbG9ja3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlKGJsb2NrQ29udGVudDogSFRNTEVsZW1lbnQpOiBDdWlDb21iaW5lZFBhcnRCbG9ja1tdIHtcbiAgICAgICAgY29uc3QgdGV4dEJsb2NrczogQ3VpQ29tYmluZWRQYXJ0QmxvY2tbXSA9IFtdO1xuXG4gICAgICAgIGJsb2NrQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuVEFHKS5mb3JFYWNoKChzcGFuOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGV4dEJsb2Nrcy5wdXNoKHRoaXMuZ2V0QmxvY2tQYXJ0T2JqZWN0KHNwYW4uZGF0YXNldFsnbG9jYWxJZCddISwgc3Bhbi5pbm5lckhUTUwpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRleHRCbG9ja3M7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcblxuICAgICAgICBjb25zdCBibG9ja0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgIHRoaXMuZGF0YS50ZXh0QmxvY2tzLmZvckVhY2goKGJsb2NrOiBDdWlDb21iaW5lZFBhcnRCbG9jaykgPT4ge1xuICAgICAgICAgICAgYmxvY2tJZHMuYWRkKGJsb2NrLmlkIHx8ICcnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVCbG9ja3MoYmxvY2tJZHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25NdXRhdGlvbkV2ZW50KGNhbGxiYWNrOiAobXV0YXRpb25MaXN0OiBNdXRhdGlvblJlY29yZFtdKSA9PiB2b2lkLCBtdXRhdGlvbkxpc3Q6IE11dGF0aW9uUmVjb3JkW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKG11dGF0aW9uTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG11dGF0aW9uTGlzdC5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXMuc2V0KGdlbmVyYXRlSWQoKSwgbXV0YXRpb24pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNoYW5nZXMuc2V0KG11dGF0aW9uLnRhcmdldCwgbXV0YXRpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjayhtdXRhdGlvbkxpc3QpO1xuICAgICAgICB0aGlzLmNoZWNrSXNFZGl0b3JFbXB0eSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2V0TXV0YXRpb25DYWxsYmFjayA9ICh3YWl0OiBudW1iZXIpOiBDdWlNdXRhdGlvbkNhbGxiYWNrID0+IHtcbiAgICAgICAgbGV0IHRpbWVvdXRJZDogQ3VpTnVsbGFibGU8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+ID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGFuZGxlTXV0YXRpb25zKCksIHdhaXQpO1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZU11dGF0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHVwZGF0ZWRFbGVtZW50cywgcmVtb3ZlZEVsZW1lbnRzSWRzIH0gPSB0aGlzLmdldE11dGF0aW9uQWN0aW9ucyhbLi4udGhpcy5jaGFuZ2VzLnZhbHVlcygpXSk7XG4gICAgICAgICAgICBjb25zdCBzcGxpdHRlZFBhcnRzID0gdGhpcy50YWtlU3BsaXR0ZWRQYXJ0c1Jlc3VsdCh1cGRhdGVkRWxlbWVudHMpO1xuICAgICAgICAgICAgY29uc3QgeyBzcGxpdHRlZFBhcnRzUmVzdWx0LCB1cGRhdGVkRWxlbWVudHNSZXN1bHQsIHJlbW92ZWRFbGVtZW50c0lkc1Jlc3VsdCB9ID0gdGhpcy50YWtlTWVyZ2VkUmVzdWx0KFxuICAgICAgICAgICAgICAgIHNwbGl0dGVkUGFydHMsXG4gICAgICAgICAgICAgICAgdXBkYXRlZEVsZW1lbnRzLFxuICAgICAgICAgICAgICAgIHJlbW92ZWRFbGVtZW50c0lkc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5hZGRCbG9ja3Moc3BsaXR0ZWRQYXJ0c1Jlc3VsdCwgdXBkYXRlZEVsZW1lbnRzUmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmxvY2tzKHVwZGF0ZWRFbGVtZW50c1Jlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUJsb2NrcyhyZW1vdmVkRWxlbWVudHNJZHNSZXN1bHQpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud3JhcHBlcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlcj8ub2JzZXJ2ZSh0aGlzLndyYXBwZXIsIHRoaXMubXV0YXRpb25Db25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0YWtlTWVyZ2VkUmVzdWx0KFxuICAgICAgICBzcGxpdHRlZFBhcnRzOiBIVE1MRWxlbWVudFtdLFxuICAgICAgICB1cGRhdGVkRWxlbWVudHM6IFNldDxIVE1MRWxlbWVudD4sXG4gICAgICAgIHJlbW92ZWRFbGVtZW50c0lkczogU2V0PHN0cmluZz5cbiAgICApOiB7XG4gICAgICAgIHNwbGl0dGVkUGFydHNSZXN1bHQ6IEhUTUxFbGVtZW50W107XG4gICAgICAgIHVwZGF0ZWRFbGVtZW50c1Jlc3VsdDogU2V0PEhUTUxFbGVtZW50PjtcbiAgICAgICAgcmVtb3ZlZEVsZW1lbnRzSWRzUmVzdWx0OiBTZXQ8c3RyaW5nPjtcbiAgICB9IHtcbiAgICAgICAgY29uc3QgeyByZW1vdmVkSWRzOiBtZXJnZVJlbW92ZWRJZHMsIHVwZGF0ZWRFbGVtZW50czogbWVyZ2VVcGRhdGVkRWxlbWVudHMgfSA9IHRoaXMuYXBwbHlNZXJnZVNtYWxsQ2h1bmtzKCk7XG5cbiAgICAgICAgY29uc3Qgbm90UmVtb3ZlZEJ5TWVyZ2UgPSAoZWw6IEhUTUxFbGVtZW50KSA9PiAhbWVyZ2VSZW1vdmVkSWRzLmhhcyhlbC5kYXRhc2V0Wydsb2NhbElkJ10gPz8gJycpO1xuXG4gICAgICAgIGNvbnN0IHNwbGl0dGVkUGFydHNSZXN1bHQgPSBzcGxpdHRlZFBhcnRzLmZpbHRlcihub3RSZW1vdmVkQnlNZXJnZSk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50c0lkc1Jlc3VsdCA9IG5ldyBTZXQ8c3RyaW5nPihbLi4ucmVtb3ZlZEVsZW1lbnRzSWRzLCAuLi5tZXJnZVJlbW92ZWRJZHNdKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEVsZW1lbnRzUmVzdWx0ID0gbmV3IFNldDxIVE1MRWxlbWVudD4oXG4gICAgICAgICAgICBbLi4udXBkYXRlZEVsZW1lbnRzLCAuLi5tZXJnZVVwZGF0ZWRFbGVtZW50c10uZmlsdGVyKG5vdFJlbW92ZWRCeU1lcmdlKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7IHNwbGl0dGVkUGFydHNSZXN1bHQsIHVwZGF0ZWRFbGVtZW50c1Jlc3VsdCwgcmVtb3ZlZEVsZW1lbnRzSWRzUmVzdWx0IH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0YWtlU3BsaXR0ZWRQYXJ0c1Jlc3VsdCh1cGRhdGVkRWxlbWVudHM6IFNldDxIVE1MRWxlbWVudD4pOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgICAgY29uc3Qgc3BsaXR0ZWRQYXJ0czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgICAgIHVwZGF0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudENvbnRlbnQ6IHN0cmluZyA9IGVsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudENvbnRlbnQubGVuZ3RoIDwgU1BMSVRfTUFYX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBzcGxpdEhUTUwoZWxlbWVudENvbnRlbnQpO1xuXG4gICAgICAgICAgICBwYXJ0cy5mb3JFYWNoKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tJZCA9IGdlbmVyYXRlSWQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9IHRoaXMuY3JlYXRlQmxvY2soYmxvY2tJZCwgcGFydCk7XG5cbiAgICAgICAgICAgICAgICBzcGxpdHRlZFBhcnRzLnB1c2godGV4dEVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gcGFydHNbMF07XG4gICAgICAgICAgICBlbGVtZW50LmFmdGVyKC4uLnNwbGl0dGVkUGFydHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc3BsaXR0ZWRQYXJ0cztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5TWVyZ2VTbWFsbENodW5rcygpOiB7XG4gICAgICAgIHJlbW92ZWRJZHM6IFNldDxzdHJpbmc+O1xuICAgICAgICB1cGRhdGVkRWxlbWVudHM6IFNldDxIVE1MRWxlbWVudD47XG4gICAgfSB7XG4gICAgICAgIGNvbnN0IGVtcHR5ID0geyByZW1vdmVkSWRzOiBuZXcgU2V0PHN0cmluZz4oKSwgdXBkYXRlZEVsZW1lbnRzOiBuZXcgU2V0PEhUTUxFbGVtZW50PigpIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLndyYXBwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNodW5rRWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLicgKyBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQpKTtcbiAgICAgICAgY29uc3QgY2h1bmtFbGVtZW50c01hcCA9IG5ldyBNYXAoY2h1bmtFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IFtlbGVtZW50LmRhdGFzZXRbJ2xvY2FsSWQnXSEsIGVsZW1lbnRdKSk7XG4gICAgICAgIGNvbnN0IHsgY2h1bmtzLCByZW1vdmVkSWRzIH0gPSBtZXJnZVNtYWxsQ2h1bmtzKFxuICAgICAgICAgICAgY2h1bmtFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuZGF0YXNldFsnbG9jYWxJZCddISxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBlbGVtZW50LmlubmVySFRNTFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVtb3ZlZElkcy5mb3JFYWNoKChpZCkgPT4gY2h1bmtFbGVtZW50c01hcC5nZXQoaWQpPy5yZW1vdmUoKSk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZEVsZW1lbnRzID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICAgICAgICBjaHVua3MuZm9yRWFjaCgoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjaHVua0VsZW1lbnRzTWFwLmdldChjaHVuay5pZCk7XG5cbiAgICAgICAgICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50LmlubmVySFRNTCA9PT0gY2h1bmsuY29udGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjaHVuay5jb250ZW50O1xuICAgICAgICAgICAgdXBkYXRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgcmVtb3ZlZElkczogbmV3IFNldChyZW1vdmVkSWRzKSwgdXBkYXRlZEVsZW1lbnRzIH07XG4gICAgfVxuXG4gICAgLy8gUklQIDEzLjAxLjIwMjYgLSBwcml2YXRlIGdldE5leHRJbmRleCgpOiBudW1iZXJcblxuICAgIHByaXZhdGUgZ2V0QmxvY2tQYXJ0T2JqZWN0KGJsb2NrSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nKTogQ3VpQ29tYmluZWRQYXJ0QmxvY2sge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGJsb2NrSWQsXG4gICAgICAgICAgICB0eXBlOiBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5kYXRhLmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudFR5cGU6IENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TXV0YXRpb25BY3Rpb25zKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSk6IEN1aU11dGF0aW9uQWN0aW9ucyB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50cyA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50c0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCBjaGFuZ2VkT3V0c2lkZUVsZW1lbnRzOiBOb2RlW10gPSBbXTtcblxuICAgICAgICB0aGlzLmxhc3RCbG9ja0VsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbXV0YXRpb25MaXN0LmZvckVhY2goKG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGVkQmxvY2tzKG11dGF0aW9uLCB1cGRhdGVkRWxlbWVudHMsIGNoYW5nZWRPdXRzaWRlRWxlbWVudHMpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW1vdmVkQmxvY2tzKG11dGF0aW9uLCByZW1vdmVkRWxlbWVudHNJZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0QmxvY2tFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0QmxvY2tFbGVtZW50ID0gdGhpcy5sYXN0QmxvY2tFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBsYXN0QmxvY2tFbGVtZW50LmFwcGVuZCguLi5jaGFuZ2VkT3V0c2lkZUVsZW1lbnRzKTtcbiAgICAgICAgICAgIHVwZGF0ZWRFbGVtZW50cy5hZGQobGFzdEJsb2NrRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnNldENhcmV0VG9CbG9ja3NFbmQobGFzdEJsb2NrRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBkYXRlZEVsZW1lbnRzLFxuICAgICAgICAgICAgcmVtb3ZlZEVsZW1lbnRzSWRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDYXJldFRvQmxvY2tzRW5kKGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICByYW5nZS5zZXRTdGFydChibG9jaywgYmxvY2suY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVVwZGF0ZWRCbG9ja3MoXG4gICAgICAgIG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCxcbiAgICAgICAgdXBkYXRlZEVsZW1lbnRzOiBTZXQ8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBvdXRzaWRlQ2hhbmdlczogTm9kZVtdXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGxldCBlbGVtZW50ID0gbXV0YXRpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gbXV0YXRpb24udGFyZ2V0LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGFuID0gZWxlbWVudD8uY2xvc2VzdCgnLicgKyBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgICAgICB1cGRhdGVkRWxlbWVudHMuYWRkKHNwYW4pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZXNPdXRzaWRlQmxvY2soZWxlbWVudCwgb3V0c2lkZUNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2hhbmdlc091dHNpZGVCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgb3V0c2lkZUNoYW5nZXM6IE5vZGVbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgdGhpcy5sYXN0QmxvY2tFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrRWxlbWVudCA9IGJsb2NrIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoYmxvY2tFbGVtZW50LmNsYXNzTGlzdD8uY29udGFpbnMoQ09NQklORURfVEVYVF9CTE9DS19QQVJUKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEJsb2NrRWxlbWVudCA9IGJsb2NrRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3V0c2lkZUNoYW5nZXMucHVzaChibG9jayk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQmxvY2tzKHNwbGljZWRQYXJ0czogSFRNTEVsZW1lbnRbXSwgdXBkYXRlZEVsZW1lbnRzOiBTZXQ8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghc3BsaWNlZFBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkZWRCbG9ja3M6IEN1aUNvbWJpbmVkUGFydEJsb2NrW10gPSBzcGxpY2VkUGFydHMubWFwKChibG9jaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tJZCA9IGJsb2NrLmRhdGFzZXRbJ2xvY2FsSWQnXTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogYmxvY2tJZCxcbiAgICAgICAgICAgICAgICB0eXBlOiBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBibG9jay5pbm5lckhUTUwsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGU6IENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IHVwZGF0ZWRFbGVtZW50cy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGNvbnN0IGlkID0gcHJldmlvdXNFbGVtZW50Py5kYXRhc2V0Wydsb2NhbElkJ107XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHByZXZpb3VzRWxlbWVudD8uZGF0YXNldFsnaW5kZXgnXSkgKyAxO1xuICAgICAgICBjb25zdCBibG9ja0luZGV4ID0gdGhpcy5kYXRhLnRleHRCbG9ja3MuZmluZEluZGV4KChibG9jaykgPT4gYmxvY2suaWQgPT09IGlkKTtcblxuICAgICAgICB0aGlzLmRhdGEudGV4dEJsb2Nrcy5zcGxpY2UoYmxvY2tJbmRleCwgMCwgLi4uYWRkZWRCbG9ja3MpO1xuICAgICAgICB0aGlzLmFwaS5ldmVudHMuZW1pdChDT01CSU5FRF9URVhUX0JMT0NLX0FEREVELCB7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGJsb2NrSW5kZXgsXG4gICAgICAgICAgICBibG9ja3M6IGFkZGVkQmxvY2tzLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLnRleHRCbG9ja3NcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVCbG9ja3ModXBkYXRlZEVsZW1lbnRzOiBTZXQ8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdXBkYXRlZEVsZW1lbnRzLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNraXBOZXh0VXBkYXRlRW1pdCkge1xuICAgICAgICAgICAgdGhpcy5za2lwTmV4dFVwZGF0ZUVtaXQgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZEJsb2NrcyA9IFsuLi51cGRhdGVkRWxlbWVudHMudmFsdWVzKCldLm1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IGJsb2NrLmRhdGFzZXRbJ2xvY2FsSWQnXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBibG9jay5pbm5lckhUTUwsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGU6IENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXBpLmV2ZW50cy5lbWl0KENPTUJJTkVEX1RFWFRfQkxPQ0tfVVBEQVRFRCwgdXBkYXRlZEJsb2Nrcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVFeGlzdGluZ0Jsb2NrKGJsb2NrSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy53cmFwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleGlzdGluZ0VsZW1lbnQgPSB0aGlzLndyYXBwZXIucXVlcnlTZWxlY3RvcihgW2RhdGEtbG9jYWwtaWQ9XCIke2Jsb2NrSWR9XCJdYCk7XG5cbiAgICAgICAgaWYgKCFleGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRCbG9ja1BhcnRPYmplY3QoYmxvY2tJZCwgdGV4dCk7XG5cbiAgICAgICAgZXhpc3RpbmdFbGVtZW50LmlubmVySFRNTCA9IHRleHQ7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcGkuZXZlbnRzLmVtaXQoQ09NQklORURfVEVYVF9CTE9DS19BRERFRCwge1xuICAgICAgICAgICAgICAgIGJsb2NrczogW2Jsb2NrXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlUmVtb3ZlZEJsb2NrcyhtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQsIHJlbW92ZWRFbGVtZW50c0lkczogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG11dGF0aW9uLnJlbW92ZWROb2Rlcy5mb3JFYWNoKChub2RlOiBOb2RlKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBibG9ja0lkID0gKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmRhdGFzZXRbJ2xvY2FsSWQnXTtcblxuICAgICAgICAgICAgaWYgKCFibG9ja0lkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW1vdmVkRWxlbWVudHNJZHMuYWRkKGJsb2NrSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUJsb2NrcyhpZHM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgICAgIGlmICghaWRzLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50SWRzID0gWy4uLmlkcy52YWx1ZXMoKV07XG5cbiAgICAgICAgdGhpcy5kYXRhLnRleHRCbG9ja3MgPSB0aGlzLmRhdGEudGV4dEJsb2Nrcy5maWx0ZXIoKGJsb2NrKSA9PiAhaWRzLmhhcyhibG9jay5pZCB8fCAnJykpO1xuICAgICAgICB0aGlzLmFwaS5ldmVudHMuZW1pdChDT01CSU5FRF9URVhUX0JMT0NLX1JFTU9WRUQsIHJlbW92ZWRFbGVtZW50SWRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckJsb2NrcyhibG9ja3M6IEN1aUNvbWJpbmVkUGFydEJsb2NrW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFibG9ja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBibG9ja3MuZm9yRWFjaCgoYmxvY2s6IEN1aUNvbWJpbmVkUGFydEJsb2NrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9IHRoaXMuY3JlYXRlQmxvY2soYmxvY2suaWQgfHwgZ2VuZXJhdGVJZCgpLCBibG9jay5kYXRhLnRleHQpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMud3JhcHBlcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMud3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuJyArIENPTUJJTkVEX1RFWFRfQkxPQ0tfUEFSVCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIuYXBwZW5kKHRleHRFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy53cmFwcGVyLnJlcGxhY2VDaGlsZHJlbih0ZXh0RWxlbWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcGkuZXZlbnRzLmVtaXQoQ09NQklORURfVEVYVF9CTE9DS19BRERFRCwge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQmxvY2soaWQ6IHN0cmluZywgdGV4dDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5UQUcpO1xuXG4gICAgICAgIHRleHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoQ09NQklORURfVEVYVF9CTE9DS19QQVJUKTtcbiAgICAgICAgdGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgdGV4dEVsZW1lbnQuZGF0YXNldFsnaWQnXSA9IGlkO1xuICAgICAgICB0ZXh0RWxlbWVudC5kYXRhc2V0Wydsb2NhbElkJ10gPSBpZDtcblxuICAgICAgICByZXR1cm4gdGV4dEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb252ZXJ0RGVmYXVsdERhdGFUb0N1c3RvbShkYXRhOiB7IHRleHQ6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEudGV4dEJsb2NrcyA9IGRhdGEubWFwKChibG9jaykgPT4ge1xuICAgICAgICAgICAgICAgIGJsb2NrLmlkID0gZ2VuZXJhdGVJZCgpO1xuICAgICAgICAgICAgICAgIGJsb2NrLmRhdGEucGFyZW50SWQgPSB0aGlzLmRhdGEuaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF0YS50ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGRhdGEudGV4dCk7XG4gICAgICAgIGxldCBlbGVtZW50Q29udGVudCA9ICcnO1xuXG4gICAgICAgIGZyYWdtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudENvbnRlbnQgKz0gbm9kZS50ZXh0Q29udGVudDtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudENvbnRlbnQgKz0gKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSBlbGVtZW50Q29udGVudC5sZW5ndGggPCBTUExJVF9NQVhfTEVOR1RIID8gW2VsZW1lbnRDb250ZW50XSA6IHNwbGl0SFRNTChlbGVtZW50Q29udGVudCk7XG5cbiAgICAgICAgcGFydHMuZm9yRWFjaCgocGFydDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9ja09iamVjdCA9IHRoaXMuZ2V0QmxvY2tQYXJ0T2JqZWN0KGdlbmVyYXRlSWQoKSwgcGFydCk7XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YS50ZXh0QmxvY2tzLnB1c2goYmxvY2tPYmplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrSXNFZGl0b3JFbXB0eSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLndyYXBwZXIgfHwgdGhpcy53cmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA+IHRoaXMuTUFYX0NISUxEX0NPVU5UX0ZPUl9FTVBUWSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMud3JhcHBlci5jaGlsZHJlbi5pdGVtKDApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBpc0l0ZW1FbXB0eSA9ICFpdGVtLnRleHRDb250ZW50Py5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy53cmFwcGVyLmRhdGFzZXRbJ2VtcHR5J10gPSBgJHtpc0l0ZW1FbXB0eX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGxhY2Vob2xkZXIoY29uZmlnOiBUb29sQ29uZmlnKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWcucmVhZG9ubHlQbGFjZWhvbGRlciA/PyBERUZBVUxUX1JFQURPTkxZX1BMQUNFSE9MREVSO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZy5wbGFjZWhvbGRlciA/PyBERUZBVUxUX1BMQUNFSE9MREVSO1xuICAgIH1cbn1cbiJdfQ==
@@ -4,6 +4,7 @@ export * from './create-tools-data';
4
4
  export * from './create-tooltip';
5
5
  export * from './file-uploader';
6
6
  export * from './generate-id';
7
+ export * from './merge-small-chunks';
7
8
  export * from './open-file-in-browser';
8
9
  export * from './recalculate-indexes';
9
10
  export * from './remove-element-tag-wrapper';
@@ -11,4 +12,4 @@ export * from './set-loading';
11
12
  export * from './split-html';
12
13
  export * from './url.validator';
13
14
  export * from './preset-config-token';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2VkaXRvci91dGlscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtbGluay1tb2RhbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY3JlYXRlLXRvb2wtbW9kYWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS10b29scy1kYXRhJztcclxuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtdG9vbHRpcCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWRlcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vZ2VuZXJhdGUtaWQnO1xyXG5leHBvcnQgKiBmcm9tICcuL29wZW4tZmlsZS1pbi1icm93c2VyJztcclxuZXhwb3J0ICogZnJvbSAnLi9yZWNhbGN1bGF0ZS1pbmRleGVzJztcclxuZXhwb3J0ICogZnJvbSAnLi9yZW1vdmUtZWxlbWVudC10YWctd3JhcHBlcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vc2V0LWxvYWRpbmcnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NwbGl0LWh0bWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL3VybC52YWxpZGF0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL3ByZXNldC1jb25maWctdG9rZW4nO1xyXG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2VkaXRvci91dGlscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1saW5rLW1vZGFsJztcclxuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtdG9vbC1tb2RhbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY3JlYXRlLXRvb2xzLWRhdGEnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS10b29sdGlwJztcclxuZXhwb3J0ICogZnJvbSAnLi9maWxlLXVwbG9hZGVyJztcclxuZXhwb3J0ICogZnJvbSAnLi9nZW5lcmF0ZS1pZCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbWVyZ2Utc21hbGwtY2h1bmtzJztcclxuZXhwb3J0ICogZnJvbSAnLi9vcGVuLWZpbGUtaW4tYnJvd3Nlcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vcmVjYWxjdWxhdGUtaW5kZXhlcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vcmVtb3ZlLWVsZW1lbnQtdGFnLXdyYXBwZXInO1xyXG5leHBvcnQgKiBmcm9tICcuL3NldC1sb2FkaW5nJztcclxuZXhwb3J0ICogZnJvbSAnLi9zcGxpdC1odG1sJztcclxuZXhwb3J0ICogZnJvbSAnLi91cmwudmFsaWRhdG9yJztcclxuZXhwb3J0ICogZnJvbSAnLi9wcmVzZXQtY29uZmlnLXRva2VuJztcclxuIl19
@@ -0,0 +1,27 @@
1
+ import { MERGE_MIN_LENGTH, SPLIT_MAX_LENGTH } from '../constants';
2
+ export function mergeSmallChunks(chunks) {
3
+ if (chunks.length <= 1) {
4
+ return { chunks: [...chunks], removedIds: [] };
5
+ }
6
+ const result = [];
7
+ const removedIds = [];
8
+ let current = { id: chunks[0].id, content: chunks[0].content };
9
+ for (let i = 1; i < chunks.length; i++) {
10
+ const next = chunks[i];
11
+ if (checkIsAvailableToMerge(current, next)) {
12
+ current = { id: current.id, content: current.content + next.content };
13
+ removedIds.push(next.id);
14
+ continue;
15
+ }
16
+ result.push(current);
17
+ current = { id: next.id, content: next.content };
18
+ }
19
+ result.push(current);
20
+ return { chunks: result, removedIds };
21
+ }
22
+ function checkIsAvailableToMerge(current, next) {
23
+ const combinedLength = current.content.length + next.content.length;
24
+ return (combinedLength < SPLIT_MAX_LENGTH &&
25
+ (current.content.length < MERGE_MIN_LENGTH || next.content.length < MERGE_MIN_LENGTH));
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2Utc21hbGwtY2h1bmtzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9lZGl0b3IvdXRpbHMvbWVyZ2Utc21hbGwtY2h1bmtzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUdsRSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBeUI7SUFDdEQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQXNCLEVBQUUsQ0FBQztJQUNyQyxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7SUFDaEMsSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRS9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZCLElBQUksdUJBQXVCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTyxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXpCLFNBQVM7UUFDYixDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXJCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLE9BQXdCLEVBQUUsSUFBcUI7SUFDNUUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFFcEUsT0FBTyxDQUNILGNBQWMsR0FBRyxnQkFBZ0I7UUFDakMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxDQUN4RixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1FUkdFX01JTl9MRU5HVEgsIFNQTElUX01BWF9MRU5HVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ2h1bmtEZXNjcmlwdG9yLCBDaHVua0Rlc2NyaXB0b3JzTWVyZ2VSZXN1bHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU21hbGxDaHVua3MoY2h1bmtzOiBDaHVua0Rlc2NyaXB0b3JbXSk6IENodW5rRGVzY3JpcHRvcnNNZXJnZVJlc3VsdCB7XG4gICAgaWYgKGNodW5rcy5sZW5ndGggPD0gMSkge1xuICAgICAgICByZXR1cm4geyBjaHVua3M6IFsuLi5jaHVua3NdLCByZW1vdmVkSWRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogQ2h1bmtEZXNjcmlwdG9yW10gPSBbXTtcbiAgICBjb25zdCByZW1vdmVkSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0geyBpZDogY2h1bmtzWzBdLmlkLCBjb250ZW50OiBjaHVua3NbMF0uY29udGVudCB9O1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IGNodW5rc1tpXTtcblxuICAgICAgICBpZiAoY2hlY2tJc0F2YWlsYWJsZVRvTWVyZ2UoY3VycmVudCwgbmV4dCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSB7IGlkOiBjdXJyZW50LmlkLCBjb250ZW50OiBjdXJyZW50LmNvbnRlbnQgKyBuZXh0LmNvbnRlbnQgfTtcbiAgICAgICAgICAgIHJlbW92ZWRJZHMucHVzaChuZXh0LmlkKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQucHVzaChjdXJyZW50KTtcbiAgICAgICAgY3VycmVudCA9IHsgaWQ6IG5leHQuaWQsIGNvbnRlbnQ6IG5leHQuY29udGVudCB9O1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnQpO1xuXG4gICAgcmV0dXJuIHsgY2h1bmtzOiByZXN1bHQsIHJlbW92ZWRJZHMgfTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJc0F2YWlsYWJsZVRvTWVyZ2UoY3VycmVudDogQ2h1bmtEZXNjcmlwdG9yLCBuZXh0OiBDaHVua0Rlc2NyaXB0b3IpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb21iaW5lZExlbmd0aCA9IGN1cnJlbnQuY29udGVudC5sZW5ndGggKyBuZXh0LmNvbnRlbnQubGVuZ3RoO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgY29tYmluZWRMZW5ndGggPCBTUExJVF9NQVhfTEVOR1RIICYmXG4gICAgICAgIChjdXJyZW50LmNvbnRlbnQubGVuZ3RoIDwgTUVSR0VfTUlOX0xFTkdUSCB8fCBuZXh0LmNvbnRlbnQubGVuZ3RoIDwgTUVSR0VfTUlOX0xFTkdUSClcbiAgICApO1xufVxuIl19