@plait/draw 0.52.0 → 0.53.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,9 @@
1
1
  import { generateElbowLineRoute, removeDuplicatePoints, simplifyOrthogonalPoints } from '@plait/common';
2
- import { Point, RectangleClient } from '@plait/core';
2
+ import { Point, RectangleClient, createDebugGenerator } from '@plait/core';
3
3
  import { LINE_ALIGN_TOLERANCE } from '../../constants/line';
4
4
  import { getElbowLineRouteOptions, getLineHandleRefPair } from './line-common';
5
+ const debugKey = 'debug:plait:line-mirror';
6
+ const debugGenerator = createDebugGenerator(debugKey);
5
7
  export const alignPoints = (basePoint, movingPoint) => {
6
8
  const newPoint = [...movingPoint];
7
9
  if (Point.isVertical(newPoint, basePoint, LINE_ALIGN_TOLERANCE)) {
@@ -265,6 +267,7 @@ function findOrthogonalParallelSegments(segment, keyPoints) {
265
267
  return parallelSegments;
266
268
  }
267
269
  function findMirrorSegments(board, segment, parallelSegments, sourceRectangle, targetRectangle) {
270
+ debugGenerator.isDebug() && debugGenerator.clear();
268
271
  const mirrorSegments = [];
269
272
  for (let index = 0; index < parallelSegments.length; index++) {
270
273
  const parallelPath = parallelSegments[index];
@@ -278,14 +281,7 @@ function findMirrorSegments(board, segment, parallelSegments, sourceRectangle, t
278
281
  const isValid = !RectangleClient.isHit(fakeRectangle, sourceRectangle) && !RectangleClient.isHit(fakeRectangle, targetRectangle);
279
282
  if (isValid) {
280
283
  mirrorSegments.push([startPoint, endPoint]);
281
- // const fakeRectangleG = PlaitBoard.getRoughSVG(board).rectangle(
282
- // fakeRectangle.x,
283
- // fakeRectangle.y,
284
- // fakeRectangle.width,
285
- // fakeRectangle.height,
286
- // { stroke: 'blue' }
287
- // );
288
- // PlaitBoard.getElementActiveHost(board).append(fakeRectangleG);
284
+ debugGenerator.isDebug() && debugGenerator.drawPolygon(board, RectangleClient.getCornerPoints(fakeRectangle));
289
285
  }
290
286
  }
291
287
  return mirrorSegments;
@@ -310,4 +306,4 @@ export const hasIllegalElbowPoint = (midDataPoints) => {
310
306
  return !isStraightWithBefore && !isStraightWithAfter;
311
307
  });
312
308
  };
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1yZXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2xpbmUtcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0Msc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFjLEtBQUssRUFBRSxlQUFlLEVBQWMsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWdCLEVBQUUsV0FBa0IsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxnQkFBeUIsRUFBRSxXQUFrQixFQUFFLFdBQWtCLEVBQUUsV0FBbUI7SUFDakksTUFBTSxjQUFjLEdBQW1EO1FBQ25FLFFBQVEsRUFBRSxJQUFJ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YSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDakMsQ0FBQztRQUNELE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxib3dMaW5lUm91dGVPcHRpb25zLCBSZXNpemVTdGF0ZSwgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSwgcmVtb3ZlRHVwbGljYXRlUG9pbnRzLCBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBSZWN0YW5nbGVDbGllbnQsIGRyYXdDaXJjbGUgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBMSU5FX0FMSUdOX1RPTEVSQU5DRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IGdldEVsYm93TGluZVJvdXRlT3B0aW9ucywgZ2V0TGluZUhhbmRsZVJlZlBhaXIgfSBmcm9tICcuL2xpbmUtY29tbW9uJztcbmltcG9ydCB7IFBsYWl0TGluZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgY29uc3QgYWxpZ25Qb2ludHMgPSAoYmFzZVBvaW50OiBQb2ludCwgbW92aW5nUG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgbmV3UG9pbnQ6IFBvaW50ID0gWy4uLm1vdmluZ1BvaW50XTtcbiAgICBpZiAoUG9pbnQuaXNWZXJ0aWNhbChuZXdQb2ludCwgYmFzZVBvaW50LCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkpIHtcbiAgICAgICAgbmV3UG9pbnRbMF0gPSBiYXNlUG9pbnRbMF07XG4gICAgfVxuICAgIGlmIChQb2ludC5pc0hvcml6b250YWwobmV3UG9pbnQsIGJhc2VQb2ludCwgTElORV9BTElHTl9UT0xFUkFOQ0UpKSB7XG4gICAgICAgIG5ld1BvaW50WzFdID0gYmFzZVBvaW50WzFdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50KG5leHRSZW5kZXJQb2ludHM6IFBvaW50W10sIHNvdXJjZVBvaW50OiBQb2ludCwgdGFyZ2V0UG9pbnQ6IFBvaW50LCBoYW5kbGVJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlUG9pbnQ6IHsgcHJldmlvdXM6IFBvaW50IHwgbnVsbDsgbmV4dDogUG9pbnQgfCBudWxsIH0gPSB7XG4gICAgICAgIHByZXZpb3VzOiBudWxsLFxuICAgICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4XTtcbiAgICBjb25zdCBlbmRQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggKyAxXTtcbiAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgIGNvbnN0IGlzVmVydGljYWwgPSBQb2ludC5pc1ZlcnRpY2FsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICBjb25zdCBwcmV2aW91c1BvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCAtIDFdID8/IG5leHRSZW5kZXJQb2ludHNbMF07XG4gICAgY29uc3QgYmVmb3JlUHJldmlvdXNQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggLSAyXSA/PyBzb3VyY2VQb2ludDtcbiAgICBpZiAoXG4gICAgICAgIChpc0hvcml6b250YWwgJiYgUG9pbnQuaXNIb3Jpem9udGFsKGJlZm9yZVByZXZpb3VzUG9pbnQsIHByZXZpb3VzUG9pbnQpKSB8fFxuICAgICAgICAoaXNWZXJ0aWNhbCAmJiBQb2ludC5pc1ZlcnRpY2FsKGJlZm9yZVByZXZpb3VzUG9pbnQsIHByZXZpb3VzUG9pbnQpKVxuICAgICkge1xuICAgICAgICByZWZlcmVuY2VQb2ludC5wcmV2aW91cyA9IHByZXZpb3VzUG9pbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDJdID8/IG5leHRSZW5kZXJQb2ludHNbbmV4dFJlbmRlclBvaW50cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhZnRlck5leHRQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggKyAzXSA/PyB0YXJnZXRQb2ludDtcbiAgICBpZiAoKGlzSG9yaXpvbnRhbCAmJiBQb2ludC5pc0hvcml6b250YWwobmV4dFBvaW50LCBhZnRlck5leHRQb2ludCkpIHx8IChpc1ZlcnRpY2FsICYmIFBvaW50LmlzVmVydGljYWwobmV4dFBvaW50LCBhZnRlck5leHRQb2ludCkpKSB7XG4gICAgICAgIHJlZmVyZW5jZVBvaW50Lm5leHQgPSBuZXh0UG9pbnQ7XG4gICAgfVxuICAgIHJldHVybiByZWZlcmVuY2VQb2ludDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsaWduRWxib3dTZWdtZW50KFxuICAgIHN0YXJ0S2V5UG9pbnQ6IFBvaW50LFxuICAgIGVuZEtleVBvaW50OiBQb2ludCxcbiAgICByZXNpemVTdGF0ZTogUmVzaXplU3RhdGUsXG4gICAgcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50OiB7IHByZXZpb3VzOiBQb2ludCB8IG51bGw7IG5leHQ6IFBvaW50IHwgbnVsbCB9XG4pIHtcbiAgICBsZXQgbmV3U3RhcnRQb2ludCA9IHN0YXJ0S2V5UG9pbnQ7XG4gICAgbGV0IG5ld0VuZFBvaW50ID0gZW5kS2V5UG9pbnQ7XG4gICAgaWYgKFBvaW50LmlzSG9yaXpvbnRhbChzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludCkpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IFBvaW50LmdldE9mZnNldFkocmVzaXplU3RhdGUuc3RhcnRQb2ludCwgcmVzaXplU3RhdGUuZW5kUG9pbnQpO1xuICAgICAgICBsZXQgcG9pbnRZID0gc3RhcnRLZXlQb2ludFsxXSArIG9mZnNldFk7XG4gICAgICAgIGlmIChyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXMgJiYgTWF0aC5hYnMocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzFdIC0gcG9pbnRZKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFkgPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXNbMV07XG4gICAgICAgIH0gZWxzZSBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHQgJiYgTWF0aC5hYnMocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHRbMV0gLSBwb2ludFkpIDwgTElORV9BTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50WSA9IHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzFdO1xuICAgICAgICB9XG4gICAgICAgIG5ld1N0YXJ0UG9pbnQgPSBbc3RhcnRLZXlQb2ludFswXSwgcG9pbnRZXTtcbiAgICAgICAgbmV3RW5kUG9pbnQgPSBbZW5kS2V5UG9pbnRbMF0sIHBvaW50WV07XG4gICAgfVxuICAgIGlmIChQb2ludC5pc1ZlcnRpY2FsKHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50KSkge1xuICAgICAgICBjb25zdCBvZmZzZXRYID0gUG9pbnQuZ2V0T2Zmc2V0WChyZXNpemVTdGF0ZS5zdGFydFBvaW50LCByZXNpemVTdGF0ZS5lbmRQb2ludCk7XG4gICAgICAgIGxldCBwb2ludFggPSBzdGFydEtleVBvaW50WzBdICsgb2Zmc2V0WDtcbiAgICAgICAgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91cyAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXNbMF0gLSBwb2ludFgpIDwgTElORV9BTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50WCA9IHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1swXTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dCAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFswXSAtIHBvaW50WCkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRYID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHRbMF07XG4gICAgICAgIH1cbiAgICAgICAgbmV3U3RhcnRQb2ludCA9IFtwb2ludFgsIHN0YXJ0S2V5UG9pbnRbMV1dO1xuICAgICAgICBuZXdFbmRQb2ludCA9IFtwb2ludFgsIGVuZEtleVBvaW50WzFdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtuZXdTdGFydFBvaW50LCBuZXdFbmRQb2ludF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmRleEFuZERlbGV0ZUNvdW50QnlLZXlQb2ludChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBlbGVtZW50OiBQbGFpdExpbmUsXG4gICAgZGF0YVBvaW50czogUG9pbnRbXSxcbiAgICBuZXh0UmVuZGVyUG9pbnRzOiBQb2ludFtdLFxuICAgIGhhbmRsZUluZGV4OiBudW1iZXJcbikge1xuICAgIGxldCBpbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGRlbGV0ZUNvdW50OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHN0YXJ0S2V5UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4XTtcbiAgICBjb25zdCBlbmRLZXlQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggKyAxXTtcbiAgICBpZiAoIXN0YXJ0S2V5UG9pbnQgfHwgIWVuZEtleVBvaW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGRlbGV0ZUNvdW50XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1pZERhdGFQb2ludHMgPSBkYXRhUG9pbnRzLnNsaWNlKDEsIC0xKTtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gbWlkRGF0YVBvaW50cy5maW5kSW5kZXgoaXRlbSA9PiBQb2ludC5pc0VxdWFscyhpdGVtLCBzdGFydEtleVBvaW50KSk7XG4gICAgY29uc3QgZW5kSW5kZXggPSBtaWREYXRhUG9pbnRzLmZpbmRJbmRleChpdGVtID0+IFBvaW50LmlzRXF1YWxzKGl0ZW0sIGVuZEtleVBvaW50KSk7XG5cbiAgICBpZiAoTWF0aC5tYXgoc3RhcnRJbmRleCwgZW5kSW5kZXgpID4gLTEpIHtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiAtMSAmJiBlbmRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEluZGV4ID4gLTEgJiYgZW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBpc1JlcGxhY2UgPVxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPCBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgICBQb2ludC5pc0FsaWduKFttaWREYXRhUG9pbnRzW3N0YXJ0SW5kZXhdLCBtaWREYXRhUG9pbnRzW3N0YXJ0SW5kZXggKyAxXSwgc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnRdKTtcbiAgICAgICAgICAgIGlmIChpc1JlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbmRleDogc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRJbmRleCA9PT0gLTEgJiYgZW5kSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgY29uc3QgaXNSZXBsYWNlID1cbiAgICAgICAgICAgICAgICBlbmRJbmRleCA+IDAgJiYgUG9pbnQuaXNBbGlnbihbbWlkRGF0YVBvaW50c1tlbmRJbmRleF0sIG1pZERhdGFQb2ludHNbZW5kSW5kZXggLSAxXSwgc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnRdKTtcbiAgICAgICAgICAgIGlmIChpc1JlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogZW5kSW5kZXggLSAxLFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMlxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBlbmRJbmRleCxcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWlkRGF0YVBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQb2ludCA9IG1pZERhdGFQb2ludHNbaV07XG4gICAgICAgICAgICBjb25zdCBuZXh0UG9pbnQgPSBtaWREYXRhUG9pbnRzW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnRdKSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHN0YXJ0S2V5UG9pbnRdKSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5taW4oaSArIDEsIG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW2N1cnJlbnRQb2ludCwgbmV4dFBvaW50LCBlbmRLZXlQb2ludF0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1heChpIC0gMSwgMCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGVDb3VudCA9IDA7XG4gICAgICAgIGlmIChtaWREYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVJlZlBhaXIgPSBnZXRMaW5lSGFuZGxlUmVmUGFpcihib2FyZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMoYm9hcmQsIGVsZW1lbnQsIGhhbmRsZVJlZlBhaXIpO1xuICAgICAgICAgICAgY29uc3Qga2V5UG9pbnRzID0gcmVtb3ZlRHVwbGljYXRlUG9pbnRzKGdlbmVyYXRlRWxib3dMaW5lUm91dGUocGFyYW1zKSk7XG4gICAgICAgICAgICBjb25zdCBuZXh0S2V5UG9pbnRzID0gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKGtleVBvaW50cy5zbGljZSgxLCBrZXlQb2ludHMubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgY29uc3QgbmV4dERhdGFQb2ludHMgPSBbbmV4dFJlbmRlclBvaW50c1swXSwgLi4ubWlkRGF0YVBvaW50cywgbmV4dFJlbmRlclBvaW50c1tuZXh0UmVuZGVyUG9pbnRzLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgIGNvbnN0IG1pcnJvckRhdGFQb2ludHMgPSBnZXRNaXJyb3JEYXRhUG9pbnRzKGJvYXJkLCBuZXh0RGF0YVBvaW50cywgbmV4dEtleVBvaW50cywgcGFyYW1zKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBoYW5kbGVJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IG1pcnJvckRhdGFQb2ludHMuc2xpY2UoMSwgLTEpLmZpbmRJbmRleChpdGVtID0+IFBvaW50LmlzRXF1YWxzKGl0ZW0sIG5leHRSZW5kZXJQb2ludHNbaV0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcHJldmlvdXNJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHJlbmRlclBvaW50cyBpcyBhIHN0cmFpZ2h0IGxpbmUgYW5kIGRhdGFQb2ludHMgYXJlIG5vdCBvbiB0aGUgbGluZSxcbiAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCAnZGVsZXRlQ291bnQnIGlzIHNldCB0byBtaWREYXRhUG9pbnRzLmxlbmd0aC5cbiAgICAgICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihuZXh0UmVuZGVyUG9pbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IG1pZERhdGFQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4LFxuICAgICAgICBkZWxldGVDb3VudFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaXJyb3JEYXRhUG9pbnRzKGJvYXJkOiBQbGFpdEJvYXJkLCBuZXh0RGF0YVBvaW50czogUG9pbnRbXSwgbmV4dEtleVBvaW50czogUG9pbnRbXSwgcGFyYW1zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgbmV4dERhdGFQb2ludHMubGVuZ3RoIC0gMjsgaW5kZXgrKykge1xuICAgICAgICBhZGp1c3RCeUN1c3RvbVBvaW50U3RhcnRJbmRleChib2FyZCwgaW5kZXgsIG5leHREYXRhUG9pbnRzLCBuZXh0S2V5UG9pbnRzLCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dERhdGFQb2ludHM7XG59XG5cbi8qKlxuICogYWRqdXN0IGJhc2VkIHBhcmFsbGVsIHNlZ21lbnRcbiAqL1xuY29uc3QgYWRqdXN0QnlDdXN0b21Qb2ludFN0YXJ0SW5kZXggPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgY3VzdG9tUG9pbnRTdGFydEluZGV4OiBudW1iZXIsXG4gICAgbmV4dERhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dEtleVBvaW50czogUG9pbnRbXSxcbiAgICBwYXJhbXM6IEVsYm93TGluZVJvdXRlT3B0aW9uc1xuKSA9PiB7XG4gICAgY29uc3QgYmVmb3JlUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggLSAxXTtcbiAgICBjb25zdCBzdGFydFBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4XTtcbiAgICBjb25zdCBlbmRQb2ludCA9IG5leHREYXRhUG9pbnRzW2N1c3RvbVBvaW50U3RhcnRJbmRleCArIDFdO1xuICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAyXTtcbiAgICBjb25zdCBiZWZvcmVTZWdtZW50ID0gW2JlZm9yZVBvaW50LCBzdGFydFBvaW50XTtcbiAgICBjb25zdCBhZnRlclNlZ21lbnQgPSBbZW5kUG9pbnQsIGFmdGVyUG9pbnRdO1xuICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQmVmb3JlID0gUG9pbnQuaXNBbGlnbihiZWZvcmVTZWdtZW50KTtcbiAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEFmdGVyID0gUG9pbnQuaXNBbGlnbihhZnRlclNlZ21lbnQpO1xuICAgIGxldCBpc0FkanVzdFN0YXJ0ID0gZmFsc2U7XG4gICAgbGV0IGlzQWRqdXN0RW5kID0gZmFsc2U7XG4gICAgaWYgKCFpc1N0cmFpZ2h0V2l0aEJlZm9yZSB8fCAhaXNTdHJhaWdodFdpdGhBZnRlcikge1xuICAgICAgICBjb25zdCBtaWRLZXlQb2ludHNXaXRoQmVmb3JlID0gZ2V0TWlkS2V5UG9pbnRzKG5leHRLZXlQb2ludHMsIGJlZm9yZVNlZ21lbnRbMF0sIGJlZm9yZVNlZ21lbnRbMV0pO1xuICAgICAgICBjb25zdCBtaWRLZXlQb2ludHNXaXRoQWZ0ZXIgPSBnZXRNaWRLZXlQb2ludHMobmV4dEtleVBvaW50cywgYWZ0ZXJTZWdtZW50WzBdLCBhZnRlclNlZ21lbnRbMV0pO1xuICAgICAgICBjb25zdCBoYXNNaWRLZXlQb2ludHMgPSBtaWRLZXlQb2ludHNXaXRoQmVmb3JlLmxlbmd0aCA+IDAgJiYgbWlkS2V5UG9pbnRzV2l0aEFmdGVyLmxlbmd0aCA+IDA7XG4gICAgICAgIGlzQWRqdXN0U3RhcnQgPSAhaXNTdHJhaWdodFdpdGhCZWZvcmUgJiYgIWhhc01pZEtleVBvaW50cztcbiAgICAgICAgaXNBZGp1c3RFbmQgPSAhaXNTdHJhaWdodFdpdGhBZnRlciAmJiAhaGFzTWlkS2V5UG9pbnRzO1xuICAgIH1cbiAgICBpZiAoaXNBZGp1c3RTdGFydCB8fCBpc0FkanVzdEVuZCkge1xuICAgICAgICBjb25zdCBwYXJhbGxlbFNlZ21lbnQgPSBbc3RhcnRQb2ludCwgZW5kUG9pbnRdIGFzIFtQb2ludCwgUG9pbnRdO1xuICAgICAgICBjb25zdCBwYXJhbGxlbFNlZ21lbnRzID0gZmluZE9ydGhvZ29uYWxQYXJhbGxlbFNlZ21lbnRzKHBhcmFsbGVsU2VnbWVudCwgbmV4dEtleVBvaW50cyk7XG4gICAgICAgIGNvbnN0IG1pcnJvclNlZ21lbnRzID0gZmluZE1pcnJvclNlZ21lbnRzKGJvYXJkLCBwYXJhbGxlbFNlZ21lbnQsIHBhcmFsbGVsU2VnbWVudHMsIHBhcmFtcy5zb3VyY2VSZWN0YW5nbGUsIHBhcmFtcy50YXJnZXRSZWN0YW5nbGUpO1xuICAgICAgICBpZiAobWlycm9yU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBtaXJyb3JTZWdtZW50ID0gbWlycm9yU2VnbWVudHNbMF07XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RTdGFydCkge1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXgsIDEsIG1pcnJvclNlZ21lbnRbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQWRqdXN0RW5kKSB7XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCArIDEsIDEsIG1pcnJvclNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgICAgIGNvbnN0IGFkanVzdEluZGV4ID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RTdGFydCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXJ0UG9pbnQgPSBbc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXV0gYXMgUG9pbnQ7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRQb2ludFthZGp1c3RJbmRleF0gPSBiZWZvcmVQb2ludFthZGp1c3RJbmRleF07XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCwgMSwgbmV3U3RhcnRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RFbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdFbmRQb2ludCA9IFtlbmRQb2ludFswXSwgZW5kUG9pbnRbMV1dIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIG5ld0VuZFBvaW50W2FkanVzdEluZGV4XSA9IGFmdGVyUG9pbnRbYWRqdXN0SW5kZXhdO1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAxLCAxLCBuZXdFbmRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVcGRhdGVkSGFuZGxlSW5kZXgoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRMaW5lLFxuICAgIGRhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dFJlbmRlclBvaW50czogUG9pbnRbXSxcbiAgICBoYW5kbGVJbmRleDogbnVtYmVyXG4pIHtcbiAgICBjb25zdCB7IGRlbGV0ZUNvdW50IH0gPSBnZXRJbmRleEFuZERlbGV0ZUNvdW50QnlLZXlQb2ludChib2FyZCwgZWxlbWVudCwgZGF0YVBvaW50cywgbmV4dFJlbmRlclBvaW50cywgaGFuZGxlSW5kZXgpO1xuICAgIGlmIChkZWxldGVDb3VudCAhPT0gbnVsbCAmJiBkZWxldGVDb3VudCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pZEtleVBvaW50cyhzaW1wbGlmaWVkTmV4dEtleVBvaW50czogUG9pbnRbXSwgc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCkge1xuICAgIGxldCBtaWRFbGJvd1BvaW50czogUG9pbnRbXSA9IFtdO1xuICAgIGxldCBzdGFydFBvaW50SW5kZXggPSAtMTtcbiAgICBsZXQgZW5kUG9pbnRJbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2ltcGxpZmllZE5leHRLZXlQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzW2ldLCBzdGFydFBvaW50XSkpIHtcbiAgICAgICAgICAgIHN0YXJ0UG9pbnRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0UG9pbnRJbmRleCA+IC0xICYmIFBvaW50LmlzQWxpZ24oW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzW2ldLCBlbmRQb2ludF0pKSB7XG4gICAgICAgICAgICBlbmRQb2ludEluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydFBvaW50SW5kZXggPiAtMSAmJiBlbmRQb2ludEluZGV4ID4gLTEpIHtcbiAgICAgICAgbWlkRWxib3dQb2ludHMgPSBzaW1wbGlmaWVkTmV4dEtleVBvaW50cy5zbGljZShzdGFydFBvaW50SW5kZXgsIGVuZFBvaW50SW5kZXggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIG1pZEVsYm93UG9pbnRzO1xufVxuXG5mdW5jdGlvbiBmaW5kT3J0aG9nb25hbFBhcmFsbGVsU2VnbWVudHMoc2VnbWVudDogW1BvaW50LCBQb2ludF0sIGtleVBvaW50czogUG9pbnRbXSk6IFtQb2ludCwgUG9pbnRdW10ge1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbFNlZ21lbnQgPSBQb2ludC5pc0hvcml6b250YWwoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgY29uc3QgcGFyYWxsZWxTZWdtZW50czogW1BvaW50LCBQb2ludF1bXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlQb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBrZXlQb2ludHNbaV07XG4gICAgICAgIGNvbnN0IG5leHQgPSBrZXlQb2ludHNbaSArIDFdO1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoY3VycmVudCwgbmV4dCwgMC4xKTtcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbFNlZ21lbnQgJiYgaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBwYXJhbGxlbFNlZ21lbnRzLnB1c2goW2N1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzSG9yaXpvbnRhbFNlZ21lbnQgJiYgIWlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgcGFyYWxsZWxTZWdtZW50cy5wdXNoKFtjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYWxsZWxTZWdtZW50cztcbn1cblxuZnVuY3Rpb24gZmluZE1pcnJvclNlZ21lbnRzKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIHNlZ21lbnQ6IFtQb2ludCwgUG9pbnRdLFxuICAgIHBhcmFsbGVsU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10sXG4gICAgc291cmNlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsXG4gICAgdGFyZ2V0UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnRcbikge1xuICAgIGNvbnN0IG1pcnJvclNlZ21lbnRzOiBbUG9pbnQsIFBvaW50XVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhcmFsbGVsU2VnbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHBhcmFsbGVsUGF0aCA9IHBhcmFsbGVsU2VnbWVudHNbaW5kZXhdO1xuICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gW3NlZ21lbnRbMF1bMF0sIHNlZ21lbnRbMF1bMV1dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IFtzZWdtZW50WzFdWzBdLCBzZWdtZW50WzFdWzFdXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgY29uc3QgYWRqdXN0RGF0YUluZGV4ID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG4gICAgICAgIHN0YXJ0UG9pbnRbYWRqdXN0RGF0YUluZGV4XSA9IHBhcmFsbGVsUGF0aFswXVthZGp1c3REYXRhSW5kZXhdO1xuICAgICAgICBlbmRQb2ludFthZGp1c3REYXRhSW5kZXhdID0gcGFyYWxsZWxQYXRoWzFdW2FkanVzdERhdGFJbmRleF07XG4gICAgICAgIGNvbnN0IGZha2VSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3N0YXJ0UG9pbnQsIGVuZFBvaW50LCAuLi5wYXJhbGxlbFBhdGhdKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9ICFSZWN0YW5nbGVDbGllbnQuaXNIaXQoZmFrZVJlY3RhbmdsZSwgc291cmNlUmVjdGFuZ2xlKSAmJiAhUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KGZha2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSk7XG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICBtaXJyb3JTZWdtZW50cy5wdXNoKFtzdGFydFBvaW50LCBlbmRQb2ludF0pO1xuICAgICAgICAgICAgLy8gY29uc3QgZmFrZVJlY3RhbmdsZUcgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5yZWN0YW5nbGUoXG4gICAgICAgICAgICAvLyAgICAgZmFrZVJlY3RhbmdsZS54LFxuICAgICAgICAgICAgLy8gICAgIGZha2VSZWN0YW5nbGUueSxcbiAgICAgICAgICAgIC8vICAgICBmYWtlUmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICAgICAgLy8gICAgIGZha2VSZWN0YW5nbGUuaGVpZ2h0LFxuICAgICAgICAgICAgLy8gICAgIHsgc3Ryb2tlOiAnYmx1ZScgfVxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIC8vIFBsYWl0Qm9hcmQuZ2V0RWxlbWVudEFjdGl2ZUhvc3QoYm9hcmQpLmFwcGVuZChmYWtlUmVjdGFuZ2xlRyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1pcnJvclNlZ21lbnRzO1xufVxuXG5leHBvcnQgY29uc3QgaGFzSWxsZWdhbEVsYm93UG9pbnQgPSAobWlkRGF0YVBvaW50czogUG9pbnRbXSk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChtaWREYXRhUG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1pZERhdGFQb2ludHMuc29tZSgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYmVmb3JlUG9pbnQgPSBtaWREYXRhUG9pbnRzW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBtaWREYXRhUG9pbnRzW2luZGV4ICsgMV07XG4gICAgICAgIGNvbnN0IGJlZm9yZVNlZ21lbnQgPSBiZWZvcmVQb2ludCAmJiBbYmVmb3JlUG9pbnQsIGl0ZW1dO1xuICAgICAgICBjb25zdCBhZnRlclNlZ21lbnQgPSBhZnRlclBvaW50ICYmIFtpdGVtLCBhZnRlclBvaW50XTtcbiAgICAgICAgY29uc3QgaXNTdHJhaWdodFdpdGhCZWZvcmUgPSBiZWZvcmVTZWdtZW50ICYmIFBvaW50LmlzQWxpZ24oYmVmb3JlU2VnbWVudCk7XG4gICAgICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQWZ0ZXIgPSBhZnRlclNlZ21lbnQgJiYgUG9pbnQuaXNBbGlnbihhZnRlclNlZ21lbnQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAhaXNTdHJhaWdodFdpdGhBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuICFpc1N0cmFpZ2h0V2l0aEJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzU3RyYWlnaHRXaXRoQmVmb3JlICYmICFpc1N0cmFpZ2h0V2l0aEFmdGVyO1xuICAgIH0pO1xufTtcbiJdfQ==
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1yZXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2xpbmUtcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0Msc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFjLEtBQUssRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDO0FBQzNDLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWdCLEVBQUUsV0FBa0IsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSw4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QixHQUFHLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hFLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLEtBQUssS0FBSyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLG9CQUFvQixJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMsIFJlc2l6ZVN0YXRlLCBnZW5lcmF0ZUVsYm93TGluZVJvdXRlLCByZW1vdmVEdXBsaWNhdGVQb2ludHMsIHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgY3JlYXRlRGVidWdHZW5lcmF0b3IgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBMSU5FX0FMSUdOX1RPTEVSQU5DRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IGdldEVsYm93TGluZVJvdXRlT3B0aW9ucywgZ2V0TGluZUhhbmRsZVJlZlBhaXIgfSBmcm9tICcuL2xpbmUtY29tbW9uJztcbmltcG9ydCB7IFBsYWl0TGluZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5jb25zdCBkZWJ1Z0tleSA9ICdkZWJ1ZzpwbGFpdDpsaW5lLW1pcnJvcic7XG5jb25zdCBkZWJ1Z0dlbmVyYXRvciA9IGNyZWF0ZURlYnVnR2VuZXJhdG9yKGRlYnVnS2V5KTtcblxuZXhwb3J0IGNvbnN0IGFsaWduUG9pbnRzID0gKGJhc2VQb2ludDogUG9pbnQsIG1vdmluZ1BvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IG5ld1BvaW50OiBQb2ludCA9IFsuLi5tb3ZpbmdQb2ludF07XG4gICAgaWYgKFBvaW50LmlzVmVydGljYWwobmV3UG9pbnQsIGJhc2VQb2ludCwgTElORV9BTElHTl9UT0xFUkFOQ0UpKSB7XG4gICAgICAgIG5ld1BvaW50WzBdID0gYmFzZVBvaW50WzBdO1xuICAgIH1cbiAgICBpZiAoUG9pbnQuaXNIb3Jpem9udGFsKG5ld1BvaW50LCBiYXNlUG9pbnQsIExJTkVfQUxJR05fVE9MRVJBTkNFKSkge1xuICAgICAgICBuZXdQb2ludFsxXSA9IGJhc2VQb2ludFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludChuZXh0UmVuZGVyUG9pbnRzOiBQb2ludFtdLCBzb3VyY2VQb2ludDogUG9pbnQsIHRhcmdldFBvaW50OiBQb2ludCwgaGFuZGxlSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlZmVyZW5jZVBvaW50OiB7IHByZXZpb3VzOiBQb2ludCB8IG51bGw7IG5leHQ6IFBvaW50IHwgbnVsbCB9ID0ge1xuICAgICAgICBwcmV2aW91czogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBjb25zdCBzdGFydFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleF07XG4gICAgY29uc3QgZW5kUG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgMV07XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICBjb25zdCBpc1ZlcnRpY2FsID0gUG9pbnQuaXNWZXJ0aWNhbChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgY29uc3QgcHJldmlvdXNQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggLSAxXSA/PyBuZXh0UmVuZGVyUG9pbnRzWzBdO1xuICAgIGNvbnN0IGJlZm9yZVByZXZpb3VzUG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4IC0gMl0gPz8gc291cmNlUG9pbnQ7XG4gICAgaWYgKFxuICAgICAgICAoaXNIb3Jpem9udGFsICYmIFBvaW50LmlzSG9yaXpvbnRhbChiZWZvcmVQcmV2aW91c1BvaW50LCBwcmV2aW91c1BvaW50KSkgfHxcbiAgICAgICAgKGlzVmVydGljYWwgJiYgUG9pbnQuaXNWZXJ0aWNhbChiZWZvcmVQcmV2aW91c1BvaW50LCBwcmV2aW91c1BvaW50KSlcbiAgICApIHtcbiAgICAgICAgcmVmZXJlbmNlUG9pbnQucHJldmlvdXMgPSBwcmV2aW91c1BvaW50O1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggKyAyXSA/PyBuZXh0UmVuZGVyUG9pbnRzW25leHRSZW5kZXJQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWZ0ZXJOZXh0UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgM10gPz8gdGFyZ2V0UG9pbnQ7XG4gICAgaWYgKChpc0hvcml6b250YWwgJiYgUG9pbnQuaXNIb3Jpem9udGFsKG5leHRQb2ludCwgYWZ0ZXJOZXh0UG9pbnQpKSB8fCAoaXNWZXJ0aWNhbCAmJiBQb2ludC5pc1ZlcnRpY2FsKG5leHRQb2ludCwgYWZ0ZXJOZXh0UG9pbnQpKSkge1xuICAgICAgICByZWZlcmVuY2VQb2ludC5uZXh0ID0gbmV4dFBvaW50O1xuICAgIH1cbiAgICByZXR1cm4gcmVmZXJlbmNlUG9pbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGlnbkVsYm93U2VnbWVudChcbiAgICBzdGFydEtleVBvaW50OiBQb2ludCxcbiAgICBlbmRLZXlQb2ludDogUG9pbnQsXG4gICAgcmVzaXplU3RhdGU6IFJlc2l6ZVN0YXRlLFxuICAgIHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludDogeyBwcmV2aW91czogUG9pbnQgfCBudWxsOyBuZXh0OiBQb2ludCB8IG51bGwgfVxuKSB7XG4gICAgbGV0IG5ld1N0YXJ0UG9pbnQgPSBzdGFydEtleVBvaW50O1xuICAgIGxldCBuZXdFbmRQb2ludCA9IGVuZEtleVBvaW50O1xuICAgIGlmIChQb2ludC5pc0hvcml6b250YWwoc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBQb2ludC5nZXRPZmZzZXRZKHJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQsIHJlc2l6ZVN0YXRlLmVuZFBvaW50KTtcbiAgICAgICAgbGV0IHBvaW50WSA9IHN0YXJ0S2V5UG9pbnRbMV0gKyBvZmZzZXRZO1xuICAgICAgICBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1sxXSAtIHBvaW50WSkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRZID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0ICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzFdIC0gcG9pbnRZKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFkgPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFsxXTtcbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFBvaW50ID0gW3N0YXJ0S2V5UG9pbnRbMF0sIHBvaW50WV07XG4gICAgICAgIG5ld0VuZFBvaW50ID0gW2VuZEtleVBvaW50WzBdLCBwb2ludFldO1xuICAgIH1cbiAgICBpZiAoUG9pbnQuaXNWZXJ0aWNhbChzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludCkpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IFBvaW50LmdldE9mZnNldFgocmVzaXplU3RhdGUuc3RhcnRQb2ludCwgcmVzaXplU3RhdGUuZW5kUG9pbnQpO1xuICAgICAgICBsZXQgcG9pbnRYID0gc3RhcnRLZXlQb2ludFswXSArIG9mZnNldFg7XG4gICAgICAgIGlmIChyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXMgJiYgTWF0aC5hYnMocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzBdIC0gcG9pbnRYKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFggPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXNbMF07XG4gICAgICAgIH0gZWxzZSBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHQgJiYgTWF0aC5hYnMocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHRbMF0gLSBwb2ludFgpIDwgTElORV9BTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50WCA9IHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzBdO1xuICAgICAgICB9XG4gICAgICAgIG5ld1N0YXJ0UG9pbnQgPSBbcG9pbnRYLCBzdGFydEtleVBvaW50WzFdXTtcbiAgICAgICAgbmV3RW5kUG9pbnQgPSBbcG9pbnRYLCBlbmRLZXlQb2ludFsxXV07XG4gICAgfVxuICAgIHJldHVybiBbbmV3U3RhcnRQb2ludCwgbmV3RW5kUG9pbnRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhBbmREZWxldGVDb3VudEJ5S2V5UG9pbnQoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRMaW5lLFxuICAgIGRhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dFJlbmRlclBvaW50czogUG9pbnRbXSxcbiAgICBoYW5kbGVJbmRleDogbnVtYmVyXG4pIHtcbiAgICBsZXQgaW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBkZWxldGVDb3VudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBzdGFydEtleVBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleF07XG4gICAgY29uc3QgZW5kS2V5UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgMV07XG4gICAgaWYgKCFzdGFydEtleVBvaW50IHx8ICFlbmRLZXlQb2ludCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBkZWxldGVDb3VudFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtaWREYXRhUG9pbnRzID0gZGF0YVBvaW50cy5zbGljZSgxLCAtMSk7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IG1pZERhdGFQb2ludHMuZmluZEluZGV4KGl0ZW0gPT4gUG9pbnQuaXNFcXVhbHMoaXRlbSwgc3RhcnRLZXlQb2ludCkpO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gbWlkRGF0YVBvaW50cy5maW5kSW5kZXgoaXRlbSA9PiBQb2ludC5pc0VxdWFscyhpdGVtLCBlbmRLZXlQb2ludCkpO1xuXG4gICAgaWYgKE1hdGgubWF4KHN0YXJ0SW5kZXgsIGVuZEluZGV4KSA+IC0xKSB7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID4gLTEgJiYgZW5kSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbmRleDogc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xICYmIGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgaXNSZXBsYWNlID1cbiAgICAgICAgICAgICAgICBzdGFydEluZGV4IDwgbWlkRGF0YVBvaW50cy5sZW5ndGggLSAxICYmXG4gICAgICAgICAgICAgICAgUG9pbnQuaXNBbGlnbihbbWlkRGF0YVBvaW50c1tzdGFydEluZGV4XSwgbWlkRGF0YVBvaW50c1tzdGFydEluZGV4ICsgMV0sIHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50XSk7XG4gICAgICAgICAgICBpZiAoaXNSZXBsYWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IC0xICYmIGVuZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVwbGFjZSA9XG4gICAgICAgICAgICAgICAgZW5kSW5kZXggPiAwICYmIFBvaW50LmlzQWxpZ24oW21pZERhdGFQb2ludHNbZW5kSW5kZXhdLCBtaWREYXRhUG9pbnRzW2VuZEluZGV4IC0gMV0sIHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50XSk7XG4gICAgICAgICAgICBpZiAoaXNSZXBsYWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGVuZEluZGV4IC0gMSxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbmRleDogZW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UG9pbnQgPSBtaWREYXRhUG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgbmV4dFBvaW50ID0gbWlkRGF0YVBvaW50c1tpICsgMV07XG4gICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50XSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW2N1cnJlbnRQb2ludCwgbmV4dFBvaW50LCBzdGFydEtleVBvaW50XSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IE1hdGgubWluKGkgKyAxLCBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgZW5kS2V5UG9pbnRdKSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgoaSAtIDEsIDApO1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlQ291bnQgPSAwO1xuICAgICAgICBpZiAobWlkRGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVSZWZQYWlyID0gZ2V0TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gZ2V0RWxib3dMaW5lUm91dGVPcHRpb25zKGJvYXJkLCBlbGVtZW50LCBoYW5kbGVSZWZQYWlyKTtcbiAgICAgICAgICAgIGNvbnN0IGtleVBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhnZW5lcmF0ZUVsYm93TGluZVJvdXRlKHBhcmFtcykpO1xuICAgICAgICAgICAgY29uc3QgbmV4dEtleVBvaW50cyA9IHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyhrZXlQb2ludHMuc2xpY2UoMSwga2V5UG9pbnRzLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHREYXRhUG9pbnRzID0gW25leHRSZW5kZXJQb2ludHNbMF0sIC4uLm1pZERhdGFQb2ludHMsIG5leHRSZW5kZXJQb2ludHNbbmV4dFJlbmRlclBvaW50cy5sZW5ndGggLSAxXV07XG4gICAgICAgICAgICBjb25zdCBtaXJyb3JEYXRhUG9pbnRzID0gZ2V0TWlycm9yRGF0YVBvaW50cyhib2FyZCwgbmV4dERhdGFQb2ludHMsIG5leHRLZXlQb2ludHMsIHBhcmFtcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gaGFuZGxlSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBtaXJyb3JEYXRhUG9pbnRzLnNsaWNlKDEsIC0xKS5maW5kSW5kZXgoaXRlbSA9PiBQb2ludC5pc0VxdWFscyhpdGVtLCBuZXh0UmVuZGVyUG9pbnRzW2ldKSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHByZXZpb3VzSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiByZW5kZXJQb2ludHMgaXMgYSBzdHJhaWdodCBsaW5lIGFuZCBkYXRhUG9pbnRzIGFyZSBub3Qgb24gdGhlIGxpbmUsXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgJ2RlbGV0ZUNvdW50JyBpcyBzZXQgdG8gbWlkRGF0YVBvaW50cy5sZW5ndGguXG4gICAgICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24obmV4dFJlbmRlclBvaW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBtaWREYXRhUG9pbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleCxcbiAgICAgICAgZGVsZXRlQ291bnRcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlycm9yRGF0YVBvaW50cyhib2FyZDogUGxhaXRCb2FyZCwgbmV4dERhdGFQb2ludHM6IFBvaW50W10sIG5leHRLZXlQb2ludHM6IFBvaW50W10sIHBhcmFtczogRWxib3dMaW5lUm91dGVPcHRpb25zKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IG5leHREYXRhUG9pbnRzLmxlbmd0aCAtIDI7IGluZGV4KyspIHtcbiAgICAgICAgYWRqdXN0QnlDdXN0b21Qb2ludFN0YXJ0SW5kZXgoYm9hcmQsIGluZGV4LCBuZXh0RGF0YVBvaW50cywgbmV4dEtleVBvaW50cywgcGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHREYXRhUG9pbnRzO1xufVxuXG4vKipcbiAqIGFkanVzdCBiYXNlZCBwYXJhbGxlbCBzZWdtZW50XG4gKi9cbmNvbnN0IGFkanVzdEJ5Q3VzdG9tUG9pbnRTdGFydEluZGV4ID0gKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGN1c3RvbVBvaW50U3RhcnRJbmRleDogbnVtYmVyLFxuICAgIG5leHREYXRhUG9pbnRzOiBQb2ludFtdLFxuICAgIG5leHRLZXlQb2ludHM6IFBvaW50W10sXG4gICAgcGFyYW1zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnNcbikgPT4ge1xuICAgIGNvbnN0IGJlZm9yZVBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4IC0gMV07XG4gICAgY29uc3Qgc3RhcnRQb2ludCA9IG5leHREYXRhUG9pbnRzW2N1c3RvbVBvaW50U3RhcnRJbmRleF07XG4gICAgY29uc3QgZW5kUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAxXTtcbiAgICBjb25zdCBhZnRlclBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4ICsgMl07XG4gICAgY29uc3QgYmVmb3JlU2VnbWVudCA9IFtiZWZvcmVQb2ludCwgc3RhcnRQb2ludF07XG4gICAgY29uc3QgYWZ0ZXJTZWdtZW50ID0gW2VuZFBvaW50LCBhZnRlclBvaW50XTtcbiAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEJlZm9yZSA9IFBvaW50LmlzQWxpZ24oYmVmb3JlU2VnbWVudCk7XG4gICAgY29uc3QgaXNTdHJhaWdodFdpdGhBZnRlciA9IFBvaW50LmlzQWxpZ24oYWZ0ZXJTZWdtZW50KTtcbiAgICBsZXQgaXNBZGp1c3RTdGFydCA9IGZhbHNlO1xuICAgIGxldCBpc0FkanVzdEVuZCA9IGZhbHNlO1xuICAgIGlmICghaXNTdHJhaWdodFdpdGhCZWZvcmUgfHwgIWlzU3RyYWlnaHRXaXRoQWZ0ZXIpIHtcbiAgICAgICAgY29uc3QgbWlkS2V5UG9pbnRzV2l0aEJlZm9yZSA9IGdldE1pZEtleVBvaW50cyhuZXh0S2V5UG9pbnRzLCBiZWZvcmVTZWdtZW50WzBdLCBiZWZvcmVTZWdtZW50WzFdKTtcbiAgICAgICAgY29uc3QgbWlkS2V5UG9pbnRzV2l0aEFmdGVyID0gZ2V0TWlkS2V5UG9pbnRzKG5leHRLZXlQb2ludHMsIGFmdGVyU2VnbWVudFswXSwgYWZ0ZXJTZWdtZW50WzFdKTtcbiAgICAgICAgY29uc3QgaGFzTWlkS2V5UG9pbnRzID0gbWlkS2V5UG9pbnRzV2l0aEJlZm9yZS5sZW5ndGggPiAwICYmIG1pZEtleVBvaW50c1dpdGhBZnRlci5sZW5ndGggPiAwO1xuICAgICAgICBpc0FkanVzdFN0YXJ0ID0gIWlzU3RyYWlnaHRXaXRoQmVmb3JlICYmICFoYXNNaWRLZXlQb2ludHM7XG4gICAgICAgIGlzQWRqdXN0RW5kID0gIWlzU3RyYWlnaHRXaXRoQWZ0ZXIgJiYgIWhhc01pZEtleVBvaW50cztcbiAgICB9XG4gICAgaWYgKGlzQWRqdXN0U3RhcnQgfHwgaXNBZGp1c3RFbmQpIHtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxTZWdtZW50ID0gW3N0YXJ0UG9pbnQsIGVuZFBvaW50XSBhcyBbUG9pbnQsIFBvaW50XTtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxTZWdtZW50cyA9IGZpbmRPcnRob2dvbmFsUGFyYWxsZWxTZWdtZW50cyhwYXJhbGxlbFNlZ21lbnQsIG5leHRLZXlQb2ludHMpO1xuICAgICAgICBjb25zdCBtaXJyb3JTZWdtZW50cyA9IGZpbmRNaXJyb3JTZWdtZW50cyhib2FyZCwgcGFyYWxsZWxTZWdtZW50LCBwYXJhbGxlbFNlZ21lbnRzLCBwYXJhbXMuc291cmNlUmVjdGFuZ2xlLCBwYXJhbXMudGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICAgICAgaWYgKG1pcnJvclNlZ21lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgbWlycm9yU2VnbWVudCA9IG1pcnJvclNlZ21lbnRzWzBdO1xuICAgICAgICAgICAgaWYgKGlzQWRqdXN0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICBuZXh0RGF0YVBvaW50cy5zcGxpY2UoY3VzdG9tUG9pbnRTdGFydEluZGV4LCAxLCBtaXJyb3JTZWdtZW50WzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FkanVzdEVuZCkge1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAxLCAxLCBtaXJyb3JTZWdtZW50WzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IFBvaW50LmlzSG9yaXpvbnRhbChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgICAgICAgICBjb25zdCBhZGp1c3RJbmRleCA9IGlzSG9yaXpvbnRhbCA/IDAgOiAxO1xuICAgICAgICAgICAgaWYgKGlzQWRqdXN0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGFydFBvaW50ID0gW3N0YXJ0UG9pbnRbMF0sIHN0YXJ0UG9pbnRbMV1dIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIG5ld1N0YXJ0UG9pbnRbYWRqdXN0SW5kZXhdID0gYmVmb3JlUG9pbnRbYWRqdXN0SW5kZXhdO1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXgsIDEsIG5ld1N0YXJ0UG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQWRqdXN0RW5kKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RW5kUG9pbnQgPSBbZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdXSBhcyBQb2ludDtcbiAgICAgICAgICAgICAgICBuZXdFbmRQb2ludFthZGp1c3RJbmRleF0gPSBhZnRlclBvaW50W2FkanVzdEluZGV4XTtcbiAgICAgICAgICAgICAgICBuZXh0RGF0YVBvaW50cy5zcGxpY2UoY3VzdG9tUG9pbnRTdGFydEluZGV4ICsgMSwgMSwgbmV3RW5kUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXBkYXRlZEhhbmRsZUluZGV4KFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGVsZW1lbnQ6IFBsYWl0TGluZSxcbiAgICBkYXRhUG9pbnRzOiBQb2ludFtdLFxuICAgIG5leHRSZW5kZXJQb2ludHM6IFBvaW50W10sXG4gICAgaGFuZGxlSW5kZXg6IG51bWJlclxuKSB7XG4gICAgY29uc3QgeyBkZWxldGVDb3VudCB9ID0gZ2V0SW5kZXhBbmREZWxldGVDb3VudEJ5S2V5UG9pbnQoYm9hcmQsIGVsZW1lbnQsIGRhdGFQb2ludHMsIG5leHRSZW5kZXJQb2ludHMsIGhhbmRsZUluZGV4KTtcbiAgICBpZiAoZGVsZXRlQ291bnQgIT09IG51bGwgJiYgZGVsZXRlQ291bnQgPiAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWRLZXlQb2ludHMoc2ltcGxpZmllZE5leHRLZXlQb2ludHM6IFBvaW50W10sIHN0YXJ0UG9pbnQ6IFBvaW50LCBlbmRQb2ludDogUG9pbnQpIHtcbiAgICBsZXQgbWlkRWxib3dQb2ludHM6IFBvaW50W10gPSBbXTtcbiAgICBsZXQgc3RhcnRQb2ludEluZGV4ID0gLTE7XG4gICAgbGV0IGVuZFBvaW50SW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpbXBsaWZpZWROZXh0S2V5UG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtzaW1wbGlmaWVkTmV4dEtleVBvaW50c1tpXSwgc3RhcnRQb2ludF0pKSB7XG4gICAgICAgICAgICBzdGFydFBvaW50SW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydFBvaW50SW5kZXggPiAtMSAmJiBQb2ludC5pc0FsaWduKFtzaW1wbGlmaWVkTmV4dEtleVBvaW50c1tpXSwgZW5kUG9pbnRdKSkge1xuICAgICAgICAgICAgZW5kUG9pbnRJbmRleCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnRQb2ludEluZGV4ID4gLTEgJiYgZW5kUG9pbnRJbmRleCA+IC0xKSB7XG4gICAgICAgIG1pZEVsYm93UG9pbnRzID0gc2ltcGxpZmllZE5leHRLZXlQb2ludHMuc2xpY2Uoc3RhcnRQb2ludEluZGV4LCBlbmRQb2ludEluZGV4ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBtaWRFbGJvd1BvaW50cztcbn1cblxuZnVuY3Rpb24gZmluZE9ydGhvZ29uYWxQYXJhbGxlbFNlZ21lbnRzKHNlZ21lbnQ6IFtQb2ludCwgUG9pbnRdLCBrZXlQb2ludHM6IFBvaW50W10pOiBbUG9pbnQsIFBvaW50XVtdIHtcbiAgICBjb25zdCBpc0hvcml6b250YWxTZWdtZW50ID0gUG9pbnQuaXNIb3Jpem9udGFsKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgIGNvbnN0IHBhcmFsbGVsU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5UG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0ga2V5UG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBuZXh0ID0ga2V5UG9pbnRzW2kgKyAxXTtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKGN1cnJlbnQsIG5leHQsIDAuMSk7XG4gICAgICAgIGlmIChpc0hvcml6b250YWxTZWdtZW50ICYmIGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgcGFyYWxsZWxTZWdtZW50cy5wdXNoKFtjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0hvcml6b250YWxTZWdtZW50ICYmICFpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIHBhcmFsbGVsU2VnbWVudHMucHVzaChbY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFsbGVsU2VnbWVudHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRNaXJyb3JTZWdtZW50cyhcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBzZWdtZW50OiBbUG9pbnQsIFBvaW50XSxcbiAgICBwYXJhbGxlbFNlZ21lbnRzOiBbUG9pbnQsIFBvaW50XVtdLFxuICAgIHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LFxuICAgIHRhcmdldFJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50XG4pIHtcbiAgICBkZWJ1Z0dlbmVyYXRvci5pc0RlYnVnKCkgJiYgZGVidWdHZW5lcmF0b3IuY2xlYXIoKTtcblxuICAgIGNvbnN0IG1pcnJvclNlZ21lbnRzOiBbUG9pbnQsIFBvaW50XVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhcmFsbGVsU2VnbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHBhcmFsbGVsUGF0aCA9IHBhcmFsbGVsU2VnbWVudHNbaW5kZXhdO1xuICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gW3NlZ21lbnRbMF1bMF0sIHNlZ21lbnRbMF1bMV1dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IFtzZWdtZW50WzFdWzBdLCBzZWdtZW50WzFdWzFdXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgY29uc3QgYWRqdXN0RGF0YUluZGV4ID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG4gICAgICAgIHN0YXJ0UG9pbnRbYWRqdXN0RGF0YUluZGV4XSA9IHBhcmFsbGVsUGF0aFswXVthZGp1c3REYXRhSW5kZXhdO1xuICAgICAgICBlbmRQb2ludFthZGp1c3REYXRhSW5kZXhdID0gcGFyYWxsZWxQYXRoWzFdW2FkanVzdERhdGFJbmRleF07XG4gICAgICAgIGNvbnN0IGZha2VSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3N0YXJ0UG9pbnQsIGVuZFBvaW50LCAuLi5wYXJhbGxlbFBhdGhdKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9ICFSZWN0YW5nbGVDbGllbnQuaXNIaXQoZmFrZVJlY3RhbmdsZSwgc291cmNlUmVjdGFuZ2xlKSAmJiAhUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KGZha2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSk7XG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICBtaXJyb3JTZWdtZW50cy5wdXNoKFtzdGFydFBvaW50LCBlbmRQb2ludF0pO1xuXG4gICAgICAgICAgICBkZWJ1Z0dlbmVyYXRvci5pc0RlYnVnKCkgJiYgZGVidWdHZW5lcmF0b3IuZHJhd1BvbHlnb24oYm9hcmQsIFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMoZmFrZVJlY3RhbmdsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtaXJyb3JTZWdtZW50cztcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0lsbGVnYWxFbGJvd1BvaW50ID0gKG1pZERhdGFQb2ludHM6IFBvaW50W10pOiBib29sZWFuID0+IHtcbiAgICBpZiAobWlkRGF0YVBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBtaWREYXRhUG9pbnRzLnNvbWUoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVBvaW50ID0gbWlkRGF0YVBvaW50c1tpbmRleCAtIDFdO1xuICAgICAgICBjb25zdCBhZnRlclBvaW50ID0gbWlkRGF0YVBvaW50c1tpbmRleCArIDFdO1xuICAgICAgICBjb25zdCBiZWZvcmVTZWdtZW50ID0gYmVmb3JlUG9pbnQgJiYgW2JlZm9yZVBvaW50LCBpdGVtXTtcbiAgICAgICAgY29uc3QgYWZ0ZXJTZWdtZW50ID0gYWZ0ZXJQb2ludCAmJiBbaXRlbSwgYWZ0ZXJQb2ludF07XG4gICAgICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQmVmb3JlID0gYmVmb3JlU2VnbWVudCAmJiBQb2ludC5pc0FsaWduKGJlZm9yZVNlZ21lbnQpO1xuICAgICAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEFmdGVyID0gYWZ0ZXJTZWdtZW50ICYmIFBvaW50LmlzQWxpZ24oYWZ0ZXJTZWdtZW50KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gIWlzU3RyYWlnaHRXaXRoQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID09PSBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiAhaXNTdHJhaWdodFdpdGhCZWZvcmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFpc1N0cmFpZ2h0V2l0aEJlZm9yZSAmJiAhaXNTdHJhaWdodFdpdGhBZnRlcjtcbiAgICB9KTtcbn07XG4iXX0=
@@ -1,12 +1,14 @@
1
- import { RectangleClient, depthFirstRecursion, getIsRecursionFunc } from '@plait/core';
1
+ import { RectangleClient, depthFirstRecursion, getIsRecursionFunc, rotatePoints, rotateAntiPointsByElement } from '@plait/core';
2
2
  import { PlaitDrawElement } from '../../interfaces';
3
3
  import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs } from '@plait/common';
4
4
  import { getEngine } from '../../engines';
5
5
  import { getShape } from '../shape';
6
- export const getHitRectangleResizeHandleRef = (board, rectangle, point) => {
7
- const resizeHandleRefs = getRectangleResizeHandleRefs(rectangle, RESIZE_HANDLE_DIAMETER);
6
+ export const getHitRectangleResizeHandleRef = (board, rectangle, point, angle = 0) => {
7
+ const centerPoint = RectangleClient.getCenterPoint(rectangle);
8
+ const rotatedPoint = rotatePoints([point], centerPoint, -angle)[0];
9
+ const resizeHandleRefs = getRectangleResizeHandleRefs(rectangle, RESIZE_HANDLE_DIAMETER, angle);
8
10
  const result = resizeHandleRefs.find(resizeHandleRef => {
9
- return RectangleClient.isHit(RectangleClient.getRectangleByPoints([point, point]), resizeHandleRef.rectangle);
11
+ return RectangleClient.isHit(RectangleClient.getRectangleByPoints([rotatedPoint, rotatedPoint]), resizeHandleRef.rectangle);
10
12
  });
11
13
  return result;
12
14
  };
@@ -17,7 +19,7 @@ export const getHitOutlineGeometry = (board, point, offset = 0) => {
17
19
  let client = RectangleClient.getRectangleByPoints(node.points);
18
20
  client = RectangleClient.getOutlineRectangle(client, offset);
19
21
  const shape = getShape(node);
20
- const isHit = getEngine(shape).isInsidePoint(client, point);
22
+ const isHit = getEngine(shape).isInsidePoint(client, rotateAntiPointsByElement(point, node) || point);
21
23
  if (isHit) {
22
24
  geometry = node;
23
25
  }
@@ -25,4 +27,4 @@ export const getHitOutlineGeometry = (board, point, offset = 0) => {
25
27
  }, getIsRecursionFunc(board), true);
26
28
  return geometry;
27
29
  };
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9wb3NpdGlvbi9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQStCLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsS0FBWSxFQUFFLEVBQUU7SUFDMUcsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN6RixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBaUIsRUFBRSxLQUFZLEVBQUUsU0FBaUIsQ0FBQyxFQUF3QixFQUFFO0lBQy9HLElBQUksUUFBUSxHQUFzQyxJQUFJLENBQUM7SUFDdkQsbUJBQW1CLENBQ2YsS0FBSyxFQUNMLElBQUksQ0FBQyxFQUFFO1FBQ0gsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEUsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvRCxNQUFNLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQyxFQUNELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUN6QixJQUFJLENBQ1AsQ0FBQztJQUNGLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuY2VzdG9yLCBQbGFpdEJvYXJkLCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBkZXB0aEZpcnN0UmVjdXJzaW9uLCBnZXRJc1JlY3Vyc2lvbkZ1bmMgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBQbGFpdERyYXdFbGVtZW50LCBQbGFpdEdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSRVNJWkVfSEFORExFX0RJQU1FVEVSLCBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzLCBSZXNpemVIYW5kbGUgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IGdldEVuZ2luZSB9IGZyb20gJy4uLy4uL2VuZ2luZXMnO1xuaW1wb3J0IHsgUGxhaXRJbWFnZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaW1hZ2UnO1xuaW1wb3J0IHsgZ2V0U2hhcGUgfSBmcm9tICcuLi9zaGFwZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWYgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCByZXNpemVIYW5kbGVSZWZzID0gZ2V0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmcyhyZWN0YW5nbGUsIFJFU0laRV9IQU5ETEVfRElBTUVURVIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc2l6ZUhhbmRsZVJlZnMuZmluZChyZXNpemVIYW5kbGVSZWYgPT4ge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbcG9pbnQsIHBvaW50XSksIHJlc2l6ZUhhbmRsZVJlZi5yZWN0YW5nbGUpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0T3V0bGluZUdlb21ldHJ5ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIG9mZnNldDogbnVtYmVyID0gMCk6IFBsYWl0R2VvbWV0cnkgfCBudWxsID0+IHtcbiAgICBsZXQgZ2VvbWV0cnk6IFBsYWl0R2VvbWV0cnkgfCBQbGFpdEltYWdlIHwgbnVsbCA9IG51bGw7XG4gICAgZGVwdGhGaXJzdFJlY3Vyc2lvbjxBbmNlc3Rvcj4oXG4gICAgICAgIGJvYXJkLFxuICAgICAgICBub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzR2VvbWV0cnkobm9kZSkgfHwgUGxhaXREcmF3RWxlbWVudC5pc0ltYWdlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhub2RlLnBvaW50cyk7XG4gICAgICAgICAgICAgICAgY2xpZW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldE91dGxpbmVSZWN0YW5nbGUoY2xpZW50LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGUobm9kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIaXQgPSBnZXRFbmdpbmUoc2hhcGUpLmlzSW5zaWRlUG9pbnQoY2xpZW50LCBwb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldElzUmVjdXJzaW9uRnVuYyhib2FyZCksXG4gICAgICAgIHRydWVcbiAgICApO1xuICAgIHJldHVybiBnZW9tZXRyeTtcbn07XG4iXX0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9wb3NpdGlvbi9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUgsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsWUFBWSxFQUVaLHlCQUF5QixFQUM1QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsU0FBMEIsRUFBRSxLQUFZLEVBQUUsUUFBZ0IsQ0FBQyxFQUFFLEVBQUU7SUFDN0gsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoSSxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBaUIsRUFBRSxLQUFZLEVBQUUsU0FBaUIsQ0FBQyxFQUF3QixFQUFFO0lBQy9HLElBQUksUUFBUSxHQUFzQyxJQUFJLENBQUM7SUFDdkQsbUJBQW1CLENBQ2YsS0FBSyxFQUNMLElBQUksQ0FBQyxFQUFFO1FBQ0gsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEUsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvRCxNQUFNLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDO1lBQ3RHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1IsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUMsRUFDRCxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDekIsSUFBSSxDQUNQLENBQUM7SUFDRixPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFuY2VzdG9yLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGRlcHRoRmlyc3RSZWN1cnNpb24sXG4gICAgZ2V0SXNSZWN1cnNpb25GdW5jLFxuICAgIHJvdGF0ZVBvaW50cyxcbiAgICBoYXNWYWxpZEFuZ2xlLFxuICAgIHJvdGF0ZUFudGlQb2ludHNCeUVsZW1lbnRcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgUGxhaXREcmF3RWxlbWVudCwgUGxhaXRHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiwgZ2V0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmcyB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi4vLi4vZW5naW5lcyc7XG5pbXBvcnQgeyBQbGFpdEltYWdlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9pbWFnZSc7XG5pbXBvcnQgeyBnZXRTaGFwZSB9IGZyb20gJy4uL3NoYXBlJztcblxuZXhwb3J0IGNvbnN0IGdldEhpdFJlY3RhbmdsZVJlc2l6ZUhhbmRsZVJlZiA9IChib2FyZDogUGxhaXRCb2FyZCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHBvaW50OiBQb2ludCwgYW5nbGU6IG51bWJlciA9IDApID0+IHtcbiAgICBjb25zdCBjZW50ZXJQb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChyZWN0YW5nbGUpO1xuICAgIGNvbnN0IHJvdGF0ZWRQb2ludCA9IHJvdGF0ZVBvaW50cyhbcG9pbnRdLCBjZW50ZXJQb2ludCwgLWFuZ2xlKVswXTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVSZWZzID0gZ2V0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmcyhyZWN0YW5nbGUsIFJFU0laRV9IQU5ETEVfRElBTUVURVIsIGFuZ2xlKTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNpemVIYW5kbGVSZWZzLmZpbmQocmVzaXplSGFuZGxlUmVmID0+IHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3JvdGF0ZWRQb2ludCwgcm90YXRlZFBvaW50XSksIHJlc2l6ZUhhbmRsZVJlZi5yZWN0YW5nbGUpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0T3V0bGluZUdlb21ldHJ5ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIG9mZnNldDogbnVtYmVyID0gMCk6IFBsYWl0R2VvbWV0cnkgfCBudWxsID0+IHtcbiAgICBsZXQgZ2VvbWV0cnk6IFBsYWl0R2VvbWV0cnkgfCBQbGFpdEltYWdlIHwgbnVsbCA9IG51bGw7XG4gICAgZGVwdGhGaXJzdFJlY3Vyc2lvbjxBbmNlc3Rvcj4oXG4gICAgICAgIGJvYXJkLFxuICAgICAgICBub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzR2VvbWV0cnkobm9kZSkgfHwgUGxhaXREcmF3RWxlbWVudC5pc0ltYWdlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhub2RlLnBvaW50cyk7XG4gICAgICAgICAgICAgICAgY2xpZW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldE91dGxpbmVSZWN0YW5nbGUoY2xpZW50LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGUobm9kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIaXQgPSBnZXRFbmdpbmUoc2hhcGUpLmlzSW5zaWRlUG9pbnQoY2xpZW50LCByb3RhdGVBbnRpUG9pbnRzQnlFbGVtZW50KHBvaW50LCBub2RlKSB8fCBwb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldElzUmVjdXJzaW9uRnVuYyhib2FyZCksXG4gICAgICAgIHRydWVcbiAgICApO1xuICAgIHJldHVybiBnZW9tZXRyeTtcbn07XG4iXX0=