@plait/common 0.47.0 → 0.48.0

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.
@@ -26,8 +26,8 @@ export class AStar {
26
26
  current.node.adjacentNodes.forEach(next => {
27
27
  let newCost = costSoFar.get(current.node) + this.heuristic(next.data, current.node.data);
28
28
  const previousNode = this.cameFrom.get(current.node);
29
- // 拐点权重,出现拐点则 cost + 1 以避免拐点路径
30
- // 以三点一线确定是否出现拐点
29
+ // Inflection point weight, if an inflection point occurs, cost + 1 to avoid the inflection point path
30
+ // Three points on a line to determine whether there is an inflection point
31
31
  const previousPoint = previousNode ? previousNode.data : previousStart;
32
32
  const x = previousPoint[0] === current?.node.data[0] && previousPoint[0] === next.data[0];
33
33
  const y = previousPoint[1] === current?.node.data[1] && previousPoint[1] === next.data[1];
@@ -55,4 +55,4 @@ export class AStar {
55
55
  return result;
56
56
  }
57
57
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYS1zdGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9hbGdvcml0aG1zL2Etc3Rhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFakUsTUFBTSxPQUFPLEtBQUs7SUFHZCxZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFDcEQsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFRLEVBQUUsQ0FBUTtRQUN4QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBWSxFQUFFLEdBQVUsRUFBRSxhQUFvQjtRQUNqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7UUFDL0MsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsT0FBTyxRQUFRLENBQUMsSUFBSSxD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S0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFLLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLEdBQUcsT0FBUSxDQUFDLElBQUksQ0FBQztTQUN4QjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgUG9pbnRHcmFwaCwgUG9pbnROb2RlIH0gZnJvbSAnLi9kYXRhLXN0cnVjdHVyZXMvZ3JhcGgnO1xuaW1wb3J0IHsgUHJpb3JpdHlRdWV1ZSB9IGZyb20gJy4vZGF0YS1zdHJ1Y3R1cmVzL3ByaW9yaXR5LXF1ZXVlJztcblxuZXhwb3J0IGNsYXNzIEFTdGFyIHtcbiAgICBjYW1lRnJvbTogTWFwPFBvaW50Tm9kZSwgUG9pbnROb2RlPjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JhcGg6IFBvaW50R3JhcGgpIHtcbiAgICAgICAgdGhpcy5jYW1lRnJvbSA9IG5ldyBNYXA8UG9pbnROb2RlLCBQb2ludE5vZGU+KCk7XG4gICAgfVxuXG4gICAgaGV1cmlzdGljKGE6IFBvaW50LCBiOiBQb2ludCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoYVswXSAtIGJbMF0pICsgTWF0aC5hYnMoYVsxXSAtIGJbMV0pO1xuICAgIH1cblxuICAgIHNlYXJjaChzdGFydDogUG9pbnQsIGVuZDogUG9pbnQsIHByZXZpb3VzU3RhcnQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGZyb250aWVyID0gbmV3IFByaW9yaXR5UXVldWUoKTtcbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0gdGhpcy5ncmFwaC5nZXQoc3RhcnQpO1xuICAgICAgICB0aGlzLmNhbWVGcm9tID0gbmV3IE1hcDxQb2ludE5vZGUsIFBvaW50Tm9kZT4oKTtcbiAgICAgICAgY29uc3QgY29zdFNvRmFyID0gbmV3IE1hcDxQb2ludE5vZGUsIG51bWJlcj4oKTtcbiAgICAgICAgY29zdFNvRmFyLnNldChzdGFydE5vZGUhLCAwKTtcbiAgICAgICAgZnJvbnRpZXIuZW5xdWV1ZSh7IG5vZGU6IHN0YXJ0Tm9kZSEsIHByaW9yaXR5OiAwIH0pO1xuICAgICAgICB3aGlsZSAoZnJvbnRpZXIubGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudCA9IGZyb250aWVyLmRlcXVldWUoKTtcblxuICAgICAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBmaW5kIGN1cnJlbnRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQb2ludCA9IGN1cnJlbnQhLm5vZGUuZGF0YTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9pbnRbMF0gPT09IGVuZFswXSAmJiBjdXJyZW50UG9pbnRbMV0gPT09IGVuZFsxXSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudC5ub2RlLmFkamFjZW50Tm9kZXMuZm9yRWFjaChuZXh0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29zdCA9IGNvc3RTb0Zhci5nZXQoY3VycmVudCEubm9kZSkhICsgdGhpcy5oZXVyaXN0aWMobmV4dC5kYXRhLCBjdXJyZW50IS5ub2RlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTm9kZSA9IHRoaXMuY2FtZUZyb20uZ2V0KGN1cnJlbnQhLm5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIOaLkOeCueadg+mHje+8jOWHuueOsOaLkOeCueWImSBjb3N0ICsgMSDku6Xpgb/lhY3mi5Dngrnot6/lvoRcbiAgICAgICAgICAgICAgICAvLyDku6XkuInngrnkuIDnur/noa7lrprmmK/lkKblh7rnjrDmi5DngrlcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1BvaW50ID0gcHJldmlvdXNOb2RlID8gcHJldmlvdXNOb2RlLmRhdGEgOiBwcmV2aW91c1N0YXJ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBwcmV2aW91c1BvaW50WzBdID09PSBjdXJyZW50Py5ub2RlLmRhdGFbMF0gJiYgcHJldmlvdXNQb2ludFswXSA9PT0gbmV4dC5kYXRhWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBwcmV2aW91c1BvaW50WzFdID09PSBjdXJyZW50Py5ub2RlLmRhdGFbMV0gJiYgcHJldmlvdXNQb2ludFsxXSA9PT0gbmV4dC5kYXRhWzFdO1xuICAgICAgICAgICAgICAgIGlmICgheCAmJiAheSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb3N0ID0gbmV3Q29zdCArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29zdFNvRmFyLmhhcyhuZXh0KSB8fCAoY29zdFNvRmFyLmdldChuZXh0KSAmJiBuZXdDb3N0IDwgY29zdFNvRmFyLmdldChuZXh0KSEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvc3RTb0Zhci5zZXQobmV4dCwgbmV3Q29zdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByaW9yaXR5ID0gbmV3Q29zdCArIHRoaXMuaGV1cmlzdGljKG5leHQuZGF0YSwgZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbnRpZXIuZW5xdWV1ZSh7IG5vZGU6IG5leHQsIHByaW9yaXR5IH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbWVGcm9tLnNldChuZXh0LCBjdXJyZW50IS5ub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJvdXRlKHN0YXJ0OiBQb2ludCwgZW5kOiBQb2ludCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IHRlbXAgPSBlbmQ7XG4gICAgICAgIHdoaWxlICh0ZW1wWzBdICE9PSBzdGFydFswXSB8fCB0ZW1wWzFdICE9PSBzdGFydFsxXSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KHRlbXApO1xuICAgICAgICAgICAgY29uc3QgcHJlTm9kZSA9IHRoaXMuY2FtZUZyb20uZ2V0KG5vZGUhKTtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KHByZU5vZGUhLmRhdGEpO1xuICAgICAgICAgICAgdGVtcCA9IHByZU5vZGUhLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iXX0=
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYS1zdGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9hbGdvcml0aG1zL2Etc3Rhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFakUsTUFBTSxPQUFPLEtBQUs7SUFHZCxZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFDcEQsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFRLEVBQUUsQ0FBUTtRQUN4QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBWSxFQUFFLEdBQVUsRUFBRSxhQUFvQjtRQUNqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7UUFDL0MsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsT0FBTyxRQUFRLENBQUMsSUFBSSxD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S0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFLLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLEdBQUcsT0FBUSxDQUFDLElBQUksQ0FBQztTQUN4QjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgUG9pbnRHcmFwaCwgUG9pbnROb2RlIH0gZnJvbSAnLi9kYXRhLXN0cnVjdHVyZXMvZ3JhcGgnO1xuaW1wb3J0IHsgUHJpb3JpdHlRdWV1ZSB9IGZyb20gJy4vZGF0YS1zdHJ1Y3R1cmVzL3ByaW9yaXR5LXF1ZXVlJztcblxuZXhwb3J0IGNsYXNzIEFTdGFyIHtcbiAgICBjYW1lRnJvbTogTWFwPFBvaW50Tm9kZSwgUG9pbnROb2RlPjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JhcGg6IFBvaW50R3JhcGgpIHtcbiAgICAgICAgdGhpcy5jYW1lRnJvbSA9IG5ldyBNYXA8UG9pbnROb2RlLCBQb2ludE5vZGU+KCk7XG4gICAgfVxuXG4gICAgaGV1cmlzdGljKGE6IFBvaW50LCBiOiBQb2ludCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoYVswXSAtIGJbMF0pICsgTWF0aC5hYnMoYVsxXSAtIGJbMV0pO1xuICAgIH1cblxuICAgIHNlYXJjaChzdGFydDogUG9pbnQsIGVuZDogUG9pbnQsIHByZXZpb3VzU3RhcnQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGZyb250aWVyID0gbmV3IFByaW9yaXR5UXVldWUoKTtcbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0gdGhpcy5ncmFwaC5nZXQoc3RhcnQpO1xuICAgICAgICB0aGlzLmNhbWVGcm9tID0gbmV3IE1hcDxQb2ludE5vZGUsIFBvaW50Tm9kZT4oKTtcbiAgICAgICAgY29uc3QgY29zdFNvRmFyID0gbmV3IE1hcDxQb2ludE5vZGUsIG51bWJlcj4oKTtcbiAgICAgICAgY29zdFNvRmFyLnNldChzdGFydE5vZGUhLCAwKTtcbiAgICAgICAgZnJvbnRpZXIuZW5xdWV1ZSh7IG5vZGU6IHN0YXJ0Tm9kZSEsIHByaW9yaXR5OiAwIH0pO1xuICAgICAgICB3aGlsZSAoZnJvbnRpZXIubGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudCA9IGZyb250aWVyLmRlcXVldWUoKTtcblxuICAgICAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBmaW5kIGN1cnJlbnRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQb2ludCA9IGN1cnJlbnQhLm5vZGUuZGF0YTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9pbnRbMF0gPT09IGVuZFswXSAmJiBjdXJyZW50UG9pbnRbMV0gPT09IGVuZFsxXSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudC5ub2RlLmFkamFjZW50Tm9kZXMuZm9yRWFjaChuZXh0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29zdCA9IGNvc3RTb0Zhci5nZXQoY3VycmVudCEubm9kZSkhICsgdGhpcy5oZXVyaXN0aWMobmV4dC5kYXRhLCBjdXJyZW50IS5ub2RlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTm9kZSA9IHRoaXMuY2FtZUZyb20uZ2V0KGN1cnJlbnQhLm5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIEluZmxlY3Rpb24gcG9pbnQgd2VpZ2h0LCBpZiBhbiBpbmZsZWN0aW9uIHBvaW50IG9jY3VycywgY29zdCArIDEgdG8gYXZvaWQgdGhlIGluZmxlY3Rpb24gcG9pbnQgcGF0aFxuICAgICAgICAgICAgICAgIC8vIFRocmVlIHBvaW50cyBvbiBhIGxpbmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYW4gaW5mbGVjdGlvbiBwb2ludFxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUG9pbnQgPSBwcmV2aW91c05vZGUgPyBwcmV2aW91c05vZGUuZGF0YSA6IHByZXZpb3VzU3RhcnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHByZXZpb3VzUG9pbnRbMF0gPT09IGN1cnJlbnQ/Lm5vZGUuZGF0YVswXSAmJiBwcmV2aW91c1BvaW50WzBdID09PSBuZXh0LmRhdGFbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHByZXZpb3VzUG9pbnRbMV0gPT09IGN1cnJlbnQ/Lm5vZGUuZGF0YVsxXSAmJiBwcmV2aW91c1BvaW50WzFdID09PSBuZXh0LmRhdGFbMV07XG4gICAgICAgICAgICAgICAgaWYgKCF4ICYmICF5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0Nvc3QgPSBuZXdDb3N0ICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb3N0U29GYXIuaGFzKG5leHQpIHx8IChjb3N0U29GYXIuZ2V0KG5leHQpICYmIG5ld0Nvc3QgPCBjb3N0U29GYXIuZ2V0KG5leHQpISkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29zdFNvRmFyLnNldChuZXh0LCBuZXdDb3N0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpb3JpdHkgPSBuZXdDb3N0ICsgdGhpcy5oZXVyaXN0aWMobmV4dC5kYXRhLCBlbmQpO1xuICAgICAgICAgICAgICAgICAgICBmcm9udGllci5lbnF1ZXVlKHsgbm9kZTogbmV4dCwgcHJpb3JpdHkgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FtZUZyb20uc2V0KG5leHQsIGN1cnJlbnQhLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Um91dGUoc3RhcnQ6IFBvaW50LCBlbmQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgdGVtcCA9IGVuZDtcbiAgICAgICAgd2hpbGUgKHRlbXBbMF0gIT09IHN0YXJ0WzBdIHx8IHRlbXBbMV0gIT09IHN0YXJ0WzFdKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5ncmFwaC5nZXQodGVtcCk7XG4gICAgICAgICAgICBjb25zdCBwcmVOb2RlID0gdGhpcy5jYW1lRnJvbS5nZXQobm9kZSEpO1xuICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQocHJlTm9kZSEuZGF0YSk7XG4gICAgICAgICAgICB0ZW1wID0gcHJlTm9kZSEuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,68 @@
1
+ import { MERGING, PlaitBoard, Transforms, getRectangleByElements, getSelectedElements } from '@plait/core';
2
+ export const alignTop = (board) => {
3
+ function getOffset(outerRectangle, rectangle) {
4
+ return [0, outerRectangle.y - rectangle.y];
5
+ }
6
+ setOffset(board, getOffset);
7
+ };
8
+ export const alignHorizontalCenter = (board) => {
9
+ function getOffset(outerRectangle, rectangle) {
10
+ const outerCenter = outerRectangle.y + outerRectangle.height / 2;
11
+ const elementCenter = rectangle.y + rectangle.height / 2;
12
+ return [0, outerCenter - elementCenter];
13
+ }
14
+ setOffset(board, getOffset);
15
+ };
16
+ export const alignBottom = (board) => {
17
+ function getOffset(outerRectangle, rectangle) {
18
+ return [0, outerRectangle.y + outerRectangle.height - (rectangle.y + rectangle.height)];
19
+ }
20
+ setOffset(board, getOffset);
21
+ };
22
+ export const alignLeft = (board) => {
23
+ function getOffset(outerRectangle, rectangle) {
24
+ return [outerRectangle.x - rectangle.x, 0];
25
+ }
26
+ setOffset(board, getOffset);
27
+ };
28
+ export const alignVerticalCenter = (board) => {
29
+ function getOffset(outerRectangle, rectangle) {
30
+ const outerCenter = outerRectangle.x + outerRectangle.width / 2;
31
+ const elementCenter = rectangle.x + rectangle.width / 2;
32
+ return [outerCenter - elementCenter, 0];
33
+ }
34
+ setOffset(board, getOffset);
35
+ };
36
+ export const alignRight = (board) => {
37
+ function getOffset(outerRectangle, rectangle) {
38
+ return [outerRectangle.x + outerRectangle.width - (rectangle.x + rectangle.width), 0];
39
+ }
40
+ setOffset(board, getOffset);
41
+ };
42
+ function setOffset(board, getOffset) {
43
+ let elements = getSelectedElements(board);
44
+ elements = elements.filter(element => board.children.includes(element));
45
+ const outerRectangle = getRectangleByElements(board, elements, false);
46
+ elements.forEach(element => {
47
+ if (!element.points)
48
+ return;
49
+ const path = PlaitBoard.findPath(board, element);
50
+ const rectangle = board.getRectangle(element);
51
+ const offset = getOffset(outerRectangle, rectangle);
52
+ const newPoints = element.points.map(p => [p[0] + offset[0], p[1] + offset[1]]);
53
+ Transforms.setNode(board, {
54
+ points: newPoints
55
+ }, path);
56
+ MERGING.set(board, true);
57
+ });
58
+ MERGING.set(board, false);
59
+ }
60
+ export const AlignTransform = {
61
+ alignTop,
62
+ alignHorizontalCenter,
63
+ alignBottom,
64
+ alignLeft,
65
+ alignVerticalCenter,
66
+ alignRight
67
+ };
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3RyYW5zZm9ybXMvYWxpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQTBCLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuSSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDMUMsU0FBUyxTQUFTLENBQUMsY0FBK0IsRUFBRSxTQUEwQjtRQUMxRSxPQUFPLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBVSxDQUFDO0lBQ3hELENBQUM7SUFDRCxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQ3ZELFNBQVMsU0FBUyxDQUFDLGNBQStCLEVBQUUsU0FBMEI7UUFDMUUsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNqRSxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLGFBQWEsQ0FBVSxDQUFDO0lBQ3JELENBQUM7SUFDRCxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUM3QyxTQUFTLFNBQVMsQ0FBQyxjQUErQixFQUFFLFNBQTBCO1FBQzFFLE9BQU8s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QUNELElBQUksQ0FDUCxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBV0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFtQjtJQUMxQyxRQUFRO0lBQ1IscUJBQXFCO0lBQ3JCLFdBQVc7SUFDWCxTQUFTO0lBQ1QsbUJBQW1CO0lBQ25CLFVBQVU7Q0FDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTUVSR0lORywgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgVHJhbnNmb3JtcywgZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cywgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gJ0BwbGFpdC9jb3JlJztcblxuZXhwb3J0IGNvbnN0IGFsaWduVG9wID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgZnVuY3Rpb24gZ2V0T2Zmc2V0KG91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBbMCwgb3V0ZXJSZWN0YW5nbGUueSAtIHJlY3RhbmdsZS55XSBhcyBQb2ludDtcbiAgICB9XG4gICAgc2V0T2Zmc2V0KGJvYXJkLCBnZXRPZmZzZXQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFsaWduSG9yaXpvbnRhbENlbnRlciA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGZ1bmN0aW9uIGdldE9mZnNldChvdXRlclJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICBjb25zdCBvdXRlckNlbnRlciA9IG91dGVyUmVjdGFuZ2xlLnkgKyBvdXRlclJlY3RhbmdsZS5oZWlnaHQgLyAyO1xuICAgICAgICBjb25zdCBlbGVtZW50Q2VudGVyID0gcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMjtcbiAgICAgICAgcmV0dXJuIFswLCBvdXRlckNlbnRlciAtIGVsZW1lbnRDZW50ZXJdIGFzIFBvaW50O1xuICAgIH1cbiAgICBzZXRPZmZzZXQoYm9hcmQsIGdldE9mZnNldCk7XG59O1xuXG5leHBvcnQgY29uc3QgYWxpZ25Cb3R0b20gPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBmdW5jdGlvbiBnZXRPZmZzZXQob3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICAgICAgcmV0dXJuIFswLCBvdXRlclJlY3RhbmdsZS55ICsgb3V0ZXJSZWN0YW5nbGUuaGVpZ2h0IC0gKHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCldIGFzIFBvaW50O1xuICAgIH1cbiAgICBzZXRPZmZzZXQoYm9hcmQsIGdldE9mZnNldCk7XG59O1xuXG5leHBvcnQgY29uc3QgYWxpZ25MZWZ0ID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgZnVuY3Rpb24gZ2V0T2Zmc2V0KG91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBbb3V0ZXJSZWN0YW5nbGUueCAtIHJlY3RhbmdsZS54LCAwXSBhcyBQb2ludDtcbiAgICB9XG4gICAgc2V0T2Zmc2V0KGJvYXJkLCBnZXRPZmZzZXQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFsaWduVmVydGljYWxDZW50ZXIgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBmdW5jdGlvbiBnZXRPZmZzZXQob3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICAgICAgY29uc3Qgb3V0ZXJDZW50ZXIgPSBvdXRlclJlY3RhbmdsZS54ICsgb3V0ZXJSZWN0YW5nbGUud2lkdGggLyAyO1xuICAgICAgICBjb25zdCBlbGVtZW50Q2VudGVyID0gcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLyAyO1xuICAgICAgICByZXR1cm4gW291dGVyQ2VudGVyIC0gZWxlbWVudENlbnRlciwgMF0gYXMgUG9pbnQ7XG4gICAgfVxuICAgIHNldE9mZnNldChib2FyZCwgZ2V0T2Zmc2V0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhbGlnblJpZ2h0ID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgZnVuY3Rpb24gZ2V0T2Zmc2V0KG91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBbb3V0ZXJSZWN0YW5nbGUueCArIG91dGVyUmVjdGFuZ2xlLndpZHRoIC0gKHJlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoKSwgMF0gYXMgUG9pbnQ7XG4gICAgfVxuICAgIHNldE9mZnNldChib2FyZCwgZ2V0T2Zmc2V0KTtcbn07XG5cbmZ1bmN0aW9uIHNldE9mZnNldChib2FyZDogUGxhaXRCb2FyZCwgZ2V0T2Zmc2V0OiAob3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpID0+IFBvaW50KSB7XG4gICAgbGV0IGVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCk7XG4gICAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoZWxlbWVudCA9PiBib2FyZC5jaGlsZHJlbi5pbmNsdWRlcyhlbGVtZW50KSk7XG4gICAgY29uc3Qgb3V0ZXJSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBlbGVtZW50cywgZmFsc2UpO1xuICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGlmICghZWxlbWVudC5wb2ludHMpIHJldHVybjtcbiAgICAgICAgY29uc3QgcGF0aCA9IFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGUgPSBib2FyZC5nZXRSZWN0YW5nbGUoZWxlbWVudCkhO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXQob3V0ZXJSZWN0YW5nbGUsIHJlY3RhbmdsZSk7XG4gICAgICAgIGNvbnN0IG5ld1BvaW50cyA9IGVsZW1lbnQucG9pbnRzLm1hcChwID0+IFtwWzBdICsgb2Zmc2V0WzBdLCBwWzFdICsgb2Zmc2V0WzFdXSkgYXMgUG9pbnRbXTtcbiAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKFxuICAgICAgICAgICAgYm9hcmQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcG9pbnRzOiBuZXdQb2ludHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoXG4gICAgICAgICk7XG4gICAgICAgIE1FUkdJTkcuc2V0KGJvYXJkLCB0cnVlKTtcbiAgICB9KTtcbiAgICBNRVJHSU5HLnNldChib2FyZCwgZmFsc2UpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFsaWduVHJhbnNmb3JtIHtcbiAgICBhbGlnblRvcDogKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB2b2lkO1xuICAgIGFsaWduSG9yaXpvbnRhbENlbnRlcjogKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB2b2lkO1xuICAgIGFsaWduQm90dG9tOiAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHZvaWQ7XG4gICAgYWxpZ25MZWZ0OiAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHZvaWQ7XG4gICAgYWxpZ25WZXJ0aWNhbENlbnRlcjogKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB2b2lkO1xuICAgIGFsaWduUmlnaHQ6IChib2FyZDogUGxhaXRCb2FyZCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IEFsaWduVHJhbnNmb3JtOiBBbGlnblRyYW5zZm9ybSA9IHtcbiAgICBhbGlnblRvcCxcbiAgICBhbGlnbkhvcml6b250YWxDZW50ZXIsXG4gICAgYWxpZ25Cb3R0b20sXG4gICAgYWxpZ25MZWZ0LFxuICAgIGFsaWduVmVydGljYWxDZW50ZXIsXG4gICAgYWxpZ25SaWdodFxufTtcbiJdfQ==
@@ -1,2 +1,3 @@
1
1
  export * from './property';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3RyYW5zZm9ybXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3Byb3BlcnR5JztcbiJdfQ==
2
+ export * from './align';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3RyYW5zZm9ybXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3Byb3BlcnR5JztcbmV4cG9ydCAqIGZyb20gJy4vYWxpZ24nO1xuIl19
@@ -10,12 +10,12 @@ export const generateElbowLineRoute = (options) => {
10
10
  aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);
11
11
  let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);
12
12
  route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];
13
- // 中线纠正: 基于水平中线/垂直中线纠正最短路径 route
14
- // 1. 找水平中线(xAxis)/垂直中线(yAxis
15
- // 2. route 中找到和 xAxis/yAxis 相交的点、在 route 中找和 xAxis/yAxis 平行的线段
16
- // 3. 基于步骤上一步找到的相交点和平行线构建矩形
17
- // 4. 判断矩形是否和元素相交,不相交则可以基于上步构建的矩形进行中线的映射
18
- // 5. 判断映射中线后的路径是否符合约束条件(拐点数据不能增加)
13
+ // Centerline correction: Correct the shortest path route based on the horizontal centerline/vertical centerline
14
+ // 1. Find the horizontal center line (xAxis)/vertical center line (yAxis)
15
+ // 2. Find the point that intersects xAxis/yAxis in route, and find the line segment parallel to xAxis/yAxis in route
16
+ // 3. Construct a rectangle based on the intersection points and parallel lines found in the previous step.
17
+ // 4. Determine whether the rectangle intersects with the element. If it does not intersect, the center line can be mapped based on the rectangle constructed in the previous step.
18
+ // 5. Determine whether the path after mapping the center line meets the constraints (inflection point cannot be increased)
19
19
  const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);
20
20
  const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);
21
21
  const xAxis = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);
@@ -47,7 +47,7 @@ const adjust = (route, options) => {
47
47
  const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;
48
48
  let result = null;
49
49
  parallelPaths.forEach(parallelPath => {
50
- // 构建矩形
50
+ // Construct a rectangle
51
51
  const tempRect = RectangleClient.toRectangleClient([pointOfHit, parallelPath[0], parallelPath[1]]);
52
52
  if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {
53
53
  const getCornerCount = (path) => {
@@ -240,4 +240,4 @@ export const getNextPoint = (point, outerRectangle, direction) => {
240
240
  }
241
241
  }
242
242
  };
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxib3ctbGluZS1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvZWxib3ctbGluZS1yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTJCbEQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEVBQUU7SUFDckUsTUFBTSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BFLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELEtBQUssR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5RSxnQ0FBZ0M7SUFDaEMsOEJBQThCO0lBQzlCLGlFQUFpRTtJQUNqRSwyQkFBMkI7SUFDM0Isd0NBQXdDO0lBQ3hDLGtD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QUFJLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUU7UUFDcEQsTUFBTSxNQUFNLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUMvQixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7S0FDNUI7SUFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQVksRUFBRSxjQUErQixFQUFFLFNBQW9CLEVBQVMsRUFBRTtJQUN2RyxRQUFRLFNBQVMsRUFBRTtRQUNmLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsS0FBSyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvRDtRQUNELEtBQUssU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxPQUFPLENBQUMsQ0FBQztZQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO0tBQ0o7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb24sIFBvaW50LCBSZWN0YW5nbGVDbGllbnQsIGRvd25TY2FsZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IERFRkFVTFRfUk9VVEVfTUFSR0lOIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEFTdGFyLCBQb2ludEdyYXBoIH0gZnJvbSAnLi4vYWxnb3JpdGhtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxib3dMaW5lUm91dGVPcHRpb25zIHtcbiAgICBzb3VyY2VQb2ludDogUG9pbnQ7XG4gICAgbmV4dFNvdXJjZVBvaW50OiBQb2ludDtcbiAgICBzb3VyY2VSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbiAgICBzb3VyY2VPdXRlclJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50O1xuICAgIHRhcmdldFBvaW50OiBQb2ludDtcbiAgICBuZXh0VGFyZ2V0UG9pbnQ6IFBvaW50O1xuICAgIHRhcmdldE91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG4gICAgdGFyZ2V0UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVBZGp1c3RPcHRpb25zIHtcbiAgICB4QXhpcz86IG51bWJlcjtcbiAgICB5QXhpcz86IG51bWJlcjtcbiAgICBzb3VyY2VSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbiAgICB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGp1c3RPcHRpb25zIHtcbiAgICBwYXJhbGxlbFBhdGhzOiBbUG9pbnQsIFBvaW50XVtdO1xuICAgIHBvaW50T2ZIaXQ6IFBvaW50O1xuICAgIHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50O1xuICAgIHRhcmdldFJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50O1xufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSA9IChvcHRpb25zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IG5leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldEdyYXBoUG9pbnRzKG9wdGlvbnMpO1xuICAgIGNvbnN0IGdyYXBoID0gY3JlYXRlR3JhcGgocG9pbnRzKTtcbiAgICBjb25zdCBhU3RhciA9IG5ldyBBU3RhcihncmFwaCk7XG4gICAgYVN0YXIuc2VhcmNoKG5leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50LCBvcHRpb25zLnNvdXJjZVBvaW50KTtcbiAgICBsZXQgcm91dGUgPSBhU3Rhci5nZXRSb3V0ZShuZXh0U291cmNlUG9pbnQsIG5leHRUYXJnZXRQb2ludCk7XG4gICAgcm91dGUgPSBbb3B0aW9ucy5zb3VyY2VQb2ludCwgLi4ucm91dGUsIG5leHRUYXJnZXRQb2ludCwgb3B0aW9ucy50YXJnZXRQb2ludF07XG4gICAgLy8g5Lit57q/57qg5q2jOiDln7rkuo7msLTlubPkuK3nur8v5Z6C55u05Lit57q/57qg5q2j5pyA55+t6Lev5b6EIHJvdXRlXG4gICAgLy8gMS4g5om+5rC05bmz5Lit57q/77yIeEF4aXPvvIkv5Z6C55u05Lit57q/77yIeUF4aXPvvIlcbiAgICAvLyAyLiDlnKggcm91dGUg5Lit5om+5Yiw5ZKMIHhBeGlzL3lBeGlzIOebuOS6pOeahOeCueOAgeWcqCByb3V0ZSDkuK3mib7lkowgeEF4aXMveUF4aXMg5bmz6KGM55qE57q/5q61XG4gICAgLy8gMy4g5Z+65LqO5q2l6aqk5LiK5LiA5q2l5om+5Yiw55qE55u45Lqk54K55ZKM5bmz6KGM57q/5p6E5bu655+p5b2iXG4gICAgLy8gNC4g5Yik5pat55+p5b2i5piv5ZCm5ZKM5YWD57Sg55u45Lqk77yM5LiN55u45Lqk5YiZ5Y+v5Lul5Z+65LqO5LiK5q2l5p6E5bu655qE55+p5b2i6L+b6KGM5Lit57q/55qE5pig5bCEXG4gICAgLy8gNS4g5Yik5pat5pig5bCE5Lit57q/5ZCO55qE6Lev5b6E5piv5ZCm56ym5ZCI57qm5p2f5p2h5Lu277yI5ouQ54K55pWw5o2u5LiN6IO95aKe5Yqg77yJXG4gICAgY29uc3QgaXNIaXRYID0gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0WChvcHRpb25zLnNvdXJjZU91dGVyUmVjdGFuZ2xlLCBvcHRpb25zLnRhcmdldE91dGVyUmVjdGFuZ2xlKTtcbiAgICBjb25zdCBpc0hpdFkgPSBSZWN0YW5nbGVDbGllbnQuaXNIaXRZKG9wdGlvbnMuc291cmNlT3V0ZXJSZWN0YW5nbGUsIG9wdGlvbnMudGFyZ2V0T3V0ZXJSZWN0YW5nbGUpO1xuICAgIGNvbnN0IHhBeGlzID0gaXNIaXRYID8gdW5kZWZpbmVkIDogUmVjdGFuZ2xlQ2xpZW50LmdldEdhcENlbnRlcihvcHRpb25zLnNvdXJjZU91dGVyUmVjdGFuZ2xlLCBvcHRpb25zLnRhcmdldE91dGVyUmVjdGFuZ2xlLCB0cnVlKTtcbiAgICBjb25zdCB5QXhpcyA9IGlzSGl0WSA/IHVuZGVmaW5lZCA6IFJlY3RhbmdsZUNsaWVudC5nZXRHYXBDZW50ZXIob3B0aW9ucy5zb3VyY2VPdXRlclJlY3RhbmdsZSwgb3B0aW9ucy50YXJnZXRPdXRlclJlY3RhbmdsZSwgZmFsc2UpO1xuICAgIHJvdXRlID0gcm91dGVBZGp1c3Qocm91dGUsIHsgeEF4aXMsIHlBeGlzLCBzb3VyY2VSZWN0YW5nbGU6IG9wdGlvbnMuc291cmNlUmVjdGFuZ2xlLCB0YXJnZXRSZWN0YW5nbGU6IG9wdGlvbnMudGFyZ2V0UmVjdGFuZ2xlIH0pO1xuICAgIHJldHVybiByb3V0ZTtcbn07XG5cbmV4cG9ydCBjb25zdCByb3V0ZUFkanVzdCA9IChwYXRoOiBQb2ludFtdLCBvcHRpb25zOiBSb3V0ZUFkanVzdE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlLCB4QXhpcywgeUF4aXMgfSA9IG9wdGlvbnM7XG4gICAgaWYgKHhBeGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1ggPSBnZXRBZGp1c3RPcHRpb25zKHBhdGgsIHhBeGlzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0WCA9XG4gICAgICAgICAgICBvcHRpb25zWC5wb2ludE9mSGl0ICYmXG4gICAgICAgICAgICBhZGp1c3QocGF0aCwgeyBwYXJhbGxlbFBhdGhzOiBvcHRpb25zWC5wYXJhbGxlbFBhdGhzLCBwb2ludE9mSGl0OiBvcHRpb25zWC5wb2ludE9mSGl0LCBzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSB9KTtcbiAgICAgICAgaWYgKHJlc3VsdFgpIHtcbiAgICAgICAgICAgIHBhdGggPSByZXN1bHRYO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh5QXhpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNZID0gZ2V0QWRqdXN0T3B0aW9ucyhwYXRoLCB5QXhpcywgZmFsc2UpO1xuICAgICAgICBjb25zdCByZXN1bHRZID1cbiAgICAgICAgICAgIG9wdGlvbnNZLnBvaW50T2ZIaXQgJiZcbiAgICAgICAgICAgIGFkanVzdChwYXRoLCB7IHBhcmFsbGVsUGF0aHM6IG9wdGlvbnNZLnBhcmFsbGVsUGF0aHMsIHBvaW50T2ZIaXQ6IG9wdGlvbnNZLnBvaW50T2ZIaXQsIHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlIH0pO1xuICAgICAgICBpZiAocmVzdWx0WSkge1xuICAgICAgICAgICAgcGF0aCA9IHJlc3VsdFk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59O1xuXG5jb25zdCBhZGp1c3QgPSAocm91dGU6IFBvaW50W10sIG9wdGlvbnM6IEFkanVzdE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IHBhcmFsbGVsUGF0aHMsIHBvaW50T2ZIaXQsIHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlIH0gPSBvcHRpb25zO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIHBhcmFsbGVsUGF0aHMuZm9yRWFjaChwYXJhbGxlbFBhdGggPT4ge1xuICAgICAgICAvLyDmnoTlu7rnn6nlvaJcbiAgICAgICAgY29uc3QgdGVtcFJlY3QgPSBSZWN0YW5nbGVDbGllbnQudG9SZWN0YW5nbGVDbGllbnQoW3BvaW50T2ZIaXQsIHBhcmFsbGVsUGF0aFswXSwgcGFyYWxsZWxQYXRoWzFdXSk7XG4gICAgICAgIGlmICghUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHRlbXBSZWN0LCBzb3VyY2VSZWN0YW5nbGUpICYmICFSZWN0YW5nbGVDbGllbnQuaXNIaXQodGVtcFJlY3QsIHRhcmdldFJlY3RhbmdsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdldENvcm5lckNvdW50ID0gKHBhdGg6IFBvaW50W10pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY29ybmVyQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBwYXRoLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlID0gcGF0aFtpbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gcGF0aFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBwYXRoW2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG93blNjYWxlKGN1cnJlbnRbMF0pID09PSBkb3duU2NhbGUocHJlWzBdKSAmJiBkb3duU2NhbGUoY3VycmVudFswXSkgPT09IGRvd25TY2FsZShuZXh0WzBdKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG93blNjYWxlKGN1cnJlbnRbMV0pID09PSBkb3duU2NhbGUocHJlWzFdKSAmJiBkb3duU2NhbGUoY3VycmVudFsxXSkgPT09IGRvd25TY2FsZShuZXh0WzFdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXJDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3JuZXJDb3VudDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0ZW1wQ29ybmVycyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHModGVtcFJlY3QpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhSYW5nZUluUGF0aDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4UmFuZ2VJbkNvcm5lcjogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIHJvdXRlLmZvckVhY2goKHBvaW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvcm5lclJlc3VsdCA9IHRlbXBDb3JuZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgY29ybmVyID0+IE1hdGguZmxvb3IoY29ybmVyWzBdKSA9PT0gTWF0aC5mbG9vcihwb2ludFswXSkgJiYgTWF0aC5mbG9vcihjb3JuZXJbMV0pID09PSBNYXRoLmZsb29yKHBvaW50WzFdKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGNvcm5lclJlc3VsdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZUluUGF0aC5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZUluQ29ybmVyLnB1c2goY29ybmVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucm91dGVdO1xuICAgICAgICAgICAgY29uc3QgbWlzc0Nvcm5lciA9IHRlbXBDb3JuZXJzLmZpbmQoKGMsIGluZGV4KSA9PiAhaW5kZXhSYW5nZUluQ29ybmVyLmluY2x1ZGVzKGluZGV4KSkgYXMgUG9pbnQ7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVMZW5ndGggPSBNYXRoLmFicyhpbmRleFJhbmdlSW5QYXRoWzBdIC0gaW5kZXhSYW5nZUluUGF0aFtpbmRleFJhbmdlSW5QYXRoLmxlbmd0aCAtIDFdKSArIDE7XG4gICAgICAgICAgICBuZXdQYXRoLnNwbGljZShpbmRleFJhbmdlSW5QYXRoWzBdICsgMSwgcmVtb3ZlTGVuZ3RoIC0gMiwgbWlzc0Nvcm5lcik7XG4gICAgICAgICAgICBjb25zdCBjb3JuZXJDb3VudCA9IGdldENvcm5lckNvdW50KFsuLi5yb3V0ZV0pO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29ybmVyQ291bnQgPSBnZXRDb3JuZXJDb3VudChbLi4ubmV3UGF0aF0pO1xuICAgICAgICAgICAgaWYgKG5ld0Nvcm5lckNvdW50IDw9IGNvcm5lckNvdW50KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0T3B0aW9ucyA9IChwYXRoOiBQb2ludFtdLCBtaWRkbGU6IG51bWJlciwgaXNIb3Jpem9udGFsOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgcGFyYWxsZWxQYXRoczogW1BvaW50LCBQb2ludF1bXSA9IFtdO1xuICAgIGxldCBzdGFydDogbnVsbCB8IFBvaW50ID0gbnVsbDtcbiAgICBsZXQgcG9pbnRPZkhpdDogbnVsbCB8IFBvaW50ID0gbnVsbDtcbiAgICBjb25zdCBheGlzID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGF0aC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXRoW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwYXRoW2luZGV4XTtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsICYmIHByZXZpb3VzICYmIHByZXZpb3VzW2F4aXNdID09PSBjdXJyZW50W2F4aXNdKSB7XG4gICAgICAgICAgICBzdGFydCA9IHByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzW2F4aXNdICE9PSBjdXJyZW50W2F4aXNdKSB7XG4gICAgICAgICAgICAgICAgcGFyYWxsZWxQYXRocy5wdXNoKFtzdGFydCwgcHJldmlvdXNdKTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRbYXhpc10gPT09IG1pZGRsZSkge1xuICAgICAgICAgICAgcG9pbnRPZkhpdCA9IGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHBhcmFsbGVsUGF0aHMucHVzaChbc3RhcnQsIHBhdGhbcGF0aC5sZW5ndGggLSAxXV0pO1xuICAgIH1cbiAgICByZXR1cm4geyBwb2ludE9mSGl0LCBwYXJhbGxlbFBhdGhzIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JhcGhQb2ludHMgPSAob3B0aW9uczogRWxib3dMaW5lUm91dGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBuZXh0U291cmNlUG9pbnQsIG5leHRUYXJnZXRQb2ludCwgc291cmNlT3V0ZXJSZWN0YW5nbGUsIHRhcmdldE91dGVyUmVjdGFuZ2xlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHg6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgeTogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgcmVzdWx0OiBQb2ludFtdID0gW107XG5cbiAgICBbc291cmNlT3V0ZXJSZWN0YW5nbGUsIHRhcmdldE91dGVyUmVjdGFuZ2xlXS5mb3JFYWNoKHJlY3RhbmdsZSA9PiB7XG4gICAgICAgIHgucHVzaChyZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLyAyLCByZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCk7XG4gICAgICAgIHkucHVzaChyZWN0YW5nbGUueSwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB9KTtcbiAgICBjb25zdCByZWN0YW5nbGVzWCA9IFtcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUueCxcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUueCArIHNvdXJjZU91dGVyUmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS54LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS54ICsgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUud2lkdGhcbiAgICBdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICB4LnB1c2goKHJlY3RhbmdsZXNYWzFdICsgcmVjdGFuZ2xlc1hbMl0pIC8gMiwgbmV4dFNvdXJjZVBvaW50WzBdLCBuZXh0VGFyZ2V0UG9pbnRbMF0pO1xuICAgIGNvbnN0IHJlY3RhbmdsZXNZID0gW1xuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZS55LFxuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZS55ICsgc291cmNlT3V0ZXJSZWN0YW5nbGUuaGVpZ2h0LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS55LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS55ICsgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUuaGVpZ2h0XG4gICAgXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgeS5wdXNoKChyZWN0YW5nbGVzWVsxXSArIHJlY3RhbmdsZXNZWzJdKSAvIDIsIG5leHRTb3VyY2VQb2ludFsxXSwgbmV4dFRhcmdldFBvaW50WzFdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBbeFtpXSwgeVtqXV07XG4gICAgICAgICAgICBjb25zdCBpc0luU291cmNlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNJblRhcmdldCA9IFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUodGFyZ2V0T3V0ZXJSZWN0YW5nbGUsIHBvaW50KTtcbiAgICAgICAgICAgIGlmICghaXNJblNvdXJjZSAmJiAhaXNJblRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMocmVzdWx0KS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICBjb25zdCBpc0luU291cmNlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICBjb25zdCBpc0luVGFyZ2V0ID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0YXJnZXRPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICByZXR1cm4gIWlzSW5Tb3VyY2UgJiYgIWlzSW5UYXJnZXQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHcmFwaCA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBQb2ludEdyYXBoKCk7XG4gICAgY29uc3QgWHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgWXM6IG51bWJlcltdID0gW107XG4gICAgcG9pbnRzLmZvckVhY2gocCA9PiB7XG4gICAgICAgIGNvbnN0IHggPSBwWzBdLFxuICAgICAgICAgICAgeSA9IHBbMV07XG4gICAgICAgIGlmIChYcy5pbmRleE9mKHgpIDwgMCkgWHMucHVzaCh4KTtcbiAgICAgICAgaWYgKFlzLmluZGV4T2YoeSkgPCAwKSBZcy5wdXNoKHkpO1xuICAgICAgICBncmFwaC5hZGQocCk7XG4gICAgfSk7XG4gICAgWHMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIFlzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBjb25zdCBpbkhvdEluZGV4ID0gKHA6IFBvaW50KTogYm9vbGVhbiA9PiBncmFwaC5oYXMocCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBYcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IFlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBbWHNbaV0sIFlzW2pdXTtcbiAgICAgICAgICAgIGlmICghaW5Ib3RJbmRleChwb2ludCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogUG9pbnQgPSBbWHNbaSAtIDFdLCBZc1tqXV07XG4gICAgICAgICAgICAgICAgaWYgKGluSG90SW5kZXgob3RoZXJQb2ludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGguY29ubmVjdChvdGhlclBvaW50LCBwb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmNvbm5lY3QocG9pbnQsIG90aGVyUG9pbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IFBvaW50ID0gW1hzW2ldLCBZc1tqIC0gMV1dO1xuICAgICAgICAgICAgICAgIGlmIChpbkhvdEluZGV4KG90aGVyUG9pbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmNvbm5lY3Qob3RoZXJQb2ludCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBncmFwaC5jb25uZWN0KHBvaW50LCBvdGhlclBvaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdyYXBoO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZHVjZVJvdXRlTWFyZ2luID0gKHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRPZmZzZXQgPSBERUZBVUxUX1JPVVRFX01BUkdJTjtcbiAgICBsZXQgc291cmNlT2Zmc2V0OiBudW1iZXJbXSA9IG5ldyBBcnJheSg0KS5maWxsKGRlZmF1bHRPZmZzZXQpO1xuICAgIGxldCB0YXJnZXRPZmZzZXQ6IG51bWJlcltdID0gbmV3IEFycmF5KDQpLmZpbGwoZGVmYXVsdE9mZnNldCk7XG4gICAgY29uc3QgbGVmdFRvUmlnaHQgPSBzb3VyY2VSZWN0YW5nbGUueCAtICh0YXJnZXRSZWN0YW5nbGUueCArIHRhcmdldFJlY3RhbmdsZS53aWR0aCk7XG4gICAgY29uc3QgcmlnaHRUb0xlZnQgPSB0YXJnZXRSZWN0YW5nbGUueCAtIChzb3VyY2VSZWN0YW5nbGUueCArIHNvdXJjZVJlY3RhbmdsZS53aWR0aCk7XG4gICAgaWYgKGxlZnRUb1JpZ2h0ID4gMCAmJiBsZWZ0VG9SaWdodCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGxlZnRUb1JpZ2h0IC8gMjtcbiAgICAgICAgc291cmNlT2Zmc2V0WzNdID0gb2Zmc2V0O1xuICAgICAgICB0YXJnZXRPZmZzZXRbMV0gPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0VG9MZWZ0ID4gMCAmJiByaWdodFRvTGVmdCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHJpZ2h0VG9MZWZ0IC8gMjtcbiAgICAgICAgdGFyZ2V0T2Zmc2V0WzNdID0gb2Zmc2V0O1xuICAgICAgICBzb3VyY2VPZmZzZXRbMV0gPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgdG9wVG9Cb3R0b20gPSBzb3VyY2VSZWN0YW5nbGUueSAtICh0YXJnZXRSZWN0YW5nbGUueSArIHRhcmdldFJlY3RhbmdsZS5oZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbVRvVG9wID0gdGFyZ2V0UmVjdGFuZ2xlLnkgLSAoc291cmNlUmVjdGFuZ2xlLnkgKyBzb3VyY2VSZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICBpZiAodG9wVG9Cb3R0b20gPiAwICYmIHRvcFRvQm90dG9tIDwgZGVmYXVsdE9mZnNldCAqIDIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9wVG9Cb3R0b20gLyAyO1xuICAgICAgICBzb3VyY2VPZmZzZXRbMF0gPSBvZmZzZXQ7XG4gICAgICAgIHRhcmdldE9mZnNldFsyXSA9IG9mZnNldDtcbiAgICB9XG4gICAgaWYgKGJvdHRvbVRvVG9wID4gMCAmJiBib3R0b21Ub1RvcCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJvdHRvbVRvVG9wIC8gMjtcbiAgICAgICAgc291cmNlT2Zmc2V0WzJdID0gb2Zmc2V0O1xuICAgICAgICB0YXJnZXRPZmZzZXRbMF0gPSBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiB7IHNvdXJjZU9mZnNldCwgdGFyZ2V0T2Zmc2V0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmV4dFBvaW50ID0gKHBvaW50OiBQb2ludCwgb3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb24pOiBQb2ludCA9PiB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24udG9wOiB7XG4gICAgICAgICAgICByZXR1cm4gW3BvaW50WzBdLCBvdXRlclJlY3RhbmdsZS55XTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIERpcmVjdGlvbi5ib3R0b206IHtcbiAgICAgICAgICAgIHJldHVybiBbcG9pbnRbMF0sIG91dGVyUmVjdGFuZ2xlLnkgKyBvdXRlclJlY3RhbmdsZS5oZWlnaHRdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRGlyZWN0aW9uLnJpZ2h0OiB7XG4gICAgICAgICAgICByZXR1cm4gW291dGVyUmVjdGFuZ2xlLnggKyBvdXRlclJlY3RhbmdsZS53aWR0aCwgcG9pbnRbMV1dO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBbb3V0ZXJSZWN0YW5nbGUueCwgcG9pbnRbMV1dO1xuICAgICAgICB9XG4gICAgfVxufTtcbiJdfQ==
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxib3ctbGluZS1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvZWxib3ctbGluZS1yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTJCbEQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEVBQUU7SUFDckUsTUFBTSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BFLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELEtBQUssR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5RSxnSEFBZ0g7SUFDL0csMEVBQTBFO0lBQzFFLHFIQUFxSDtJQUNySCwyR0FBMkc7SUFDM0csbUxBQW1MO0lBQ25MLDJI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RCxJQUFJLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUU7UUFDcEQsTUFBTSxNQUFNLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUMvQixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7S0FDNUI7SUFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQVksRUFBRSxjQUErQixFQUFFLFNBQW9CLEVBQVMsRUFBRTtJQUN2RyxRQUFRLFNBQVMsRUFBRTtRQUNmLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsS0FBSyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvRDtRQUNELEtBQUssU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxPQUFPLENBQUMsQ0FBQztZQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO0tBQ0o7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb24sIFBvaW50LCBSZWN0YW5nbGVDbGllbnQsIGRvd25TY2FsZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IERFRkFVTFRfUk9VVEVfTUFSR0lOIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEFTdGFyLCBQb2ludEdyYXBoIH0gZnJvbSAnLi4vYWxnb3JpdGhtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxib3dMaW5lUm91dGVPcHRpb25zIHtcbiAgICBzb3VyY2VQb2ludDogUG9pbnQ7XG4gICAgbmV4dFNvdXJjZVBvaW50OiBQb2ludDtcbiAgICBzb3VyY2VSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbiAgICBzb3VyY2VPdXRlclJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50O1xuICAgIHRhcmdldFBvaW50OiBQb2ludDtcbiAgICBuZXh0VGFyZ2V0UG9pbnQ6IFBvaW50O1xuICAgIHRhcmdldE91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG4gICAgdGFyZ2V0UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVBZGp1c3RPcHRpb25zIHtcbiAgICB4QXhpcz86IG51bWJlcjtcbiAgICB5QXhpcz86IG51bWJlcjtcbiAgICBzb3VyY2VSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbiAgICB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGp1c3RPcHRpb25zIHtcbiAgICBwYXJhbGxlbFBhdGhzOiBbUG9pbnQsIFBvaW50XVtdO1xuICAgIHBvaW50T2ZIaXQ6IFBvaW50O1xuICAgIHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50O1xuICAgIHRhcmdldFJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50O1xufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSA9IChvcHRpb25zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IG5leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldEdyYXBoUG9pbnRzKG9wdGlvbnMpO1xuICAgIGNvbnN0IGdyYXBoID0gY3JlYXRlR3JhcGgocG9pbnRzKTtcbiAgICBjb25zdCBhU3RhciA9IG5ldyBBU3RhcihncmFwaCk7XG4gICAgYVN0YXIuc2VhcmNoKG5leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50LCBvcHRpb25zLnNvdXJjZVBvaW50KTtcbiAgICBsZXQgcm91dGUgPSBhU3Rhci5nZXRSb3V0ZShuZXh0U291cmNlUG9pbnQsIG5leHRUYXJnZXRQb2ludCk7XG4gICAgcm91dGUgPSBbb3B0aW9ucy5zb3VyY2VQb2ludCwgLi4ucm91dGUsIG5leHRUYXJnZXRQb2ludCwgb3B0aW9ucy50YXJnZXRQb2ludF07XG4gICAgLy8gQ2VudGVybGluZSBjb3JyZWN0aW9uOiBDb3JyZWN0IHRoZSBzaG9ydGVzdCBwYXRoIHJvdXRlIGJhc2VkIG9uIHRoZSBob3Jpem9udGFsIGNlbnRlcmxpbmUvdmVydGljYWwgY2VudGVybGluZVxuICAgICAvLyAxLiBGaW5kIHRoZSBob3Jpem9udGFsIGNlbnRlciBsaW5lICh4QXhpcykvdmVydGljYWwgY2VudGVyIGxpbmUgKHlBeGlzKVxuICAgICAvLyAyLiBGaW5kIHRoZSBwb2ludCB0aGF0IGludGVyc2VjdHMgeEF4aXMveUF4aXMgaW4gcm91dGUsIGFuZCBmaW5kIHRoZSBsaW5lIHNlZ21lbnQgcGFyYWxsZWwgdG8geEF4aXMveUF4aXMgaW4gcm91dGVcbiAgICAgLy8gMy4gQ29uc3RydWN0IGEgcmVjdGFuZ2xlIGJhc2VkIG9uIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFuZCBwYXJhbGxlbCBsaW5lcyBmb3VuZCBpbiB0aGUgcHJldmlvdXMgc3RlcC5cbiAgICAgLy8gNC4gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHdpdGggdGhlIGVsZW1lbnQuIElmIGl0IGRvZXMgbm90IGludGVyc2VjdCwgdGhlIGNlbnRlciBsaW5lIGNhbiBiZSBtYXBwZWQgYmFzZWQgb24gdGhlIHJlY3RhbmdsZSBjb25zdHJ1Y3RlZCBpbiB0aGUgcHJldmlvdXMgc3RlcC5cbiAgICAgLy8gNS4gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhdGggYWZ0ZXIgbWFwcGluZyB0aGUgY2VudGVyIGxpbmUgbWVldHMgdGhlIGNvbnN0cmFpbnRzIChpbmZsZWN0aW9uIHBvaW50IGNhbm5vdCBiZSBpbmNyZWFzZWQpXG4gICAgY29uc3QgaXNIaXRYID0gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0WChvcHRpb25zLnNvdXJjZU91dGVyUmVjdGFuZ2xlLCBvcHRpb25zLnRhcmdldE91dGVyUmVjdGFuZ2xlKTtcbiAgICBjb25zdCBpc0hpdFkgPSBSZWN0YW5nbGVDbGllbnQuaXNIaXRZKG9wdGlvbnMuc291cmNlT3V0ZXJSZWN0YW5nbGUsIG9wdGlvbnMudGFyZ2V0T3V0ZXJSZWN0YW5nbGUpO1xuICAgIGNvbnN0IHhBeGlzID0gaXNIaXRYID8gdW5kZWZpbmVkIDogUmVjdGFuZ2xlQ2xpZW50LmdldEdhcENlbnRlcihvcHRpb25zLnNvdXJjZU91dGVyUmVjdGFuZ2xlLCBvcHRpb25zLnRhcmdldE91dGVyUmVjdGFuZ2xlLCB0cnVlKTtcbiAgICBjb25zdCB5QXhpcyA9IGlzSGl0WSA/IHVuZGVmaW5lZCA6IFJlY3RhbmdsZUNsaWVudC5nZXRHYXBDZW50ZXIob3B0aW9ucy5zb3VyY2VPdXRlclJlY3RhbmdsZSwgb3B0aW9ucy50YXJnZXRPdXRlclJlY3RhbmdsZSwgZmFsc2UpO1xuICAgIHJvdXRlID0gcm91dGVBZGp1c3Qocm91dGUsIHsgeEF4aXMsIHlBeGlzLCBzb3VyY2VSZWN0YW5nbGU6IG9wdGlvbnMuc291cmNlUmVjdGFuZ2xlLCB0YXJnZXRSZWN0YW5nbGU6IG9wdGlvbnMudGFyZ2V0UmVjdGFuZ2xlIH0pO1xuICAgIHJldHVybiByb3V0ZTtcbn07XG5cbmV4cG9ydCBjb25zdCByb3V0ZUFkanVzdCA9IChwYXRoOiBQb2ludFtdLCBvcHRpb25zOiBSb3V0ZUFkanVzdE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlLCB4QXhpcywgeUF4aXMgfSA9IG9wdGlvbnM7XG4gICAgaWYgKHhBeGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1ggPSBnZXRBZGp1c3RPcHRpb25zKHBhdGgsIHhBeGlzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0WCA9XG4gICAgICAgICAgICBvcHRpb25zWC5wb2ludE9mSGl0ICYmXG4gICAgICAgICAgICBhZGp1c3QocGF0aCwgeyBwYXJhbGxlbFBhdGhzOiBvcHRpb25zWC5wYXJhbGxlbFBhdGhzLCBwb2ludE9mSGl0OiBvcHRpb25zWC5wb2ludE9mSGl0LCBzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSB9KTtcbiAgICAgICAgaWYgKHJlc3VsdFgpIHtcbiAgICAgICAgICAgIHBhdGggPSByZXN1bHRYO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh5QXhpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNZID0gZ2V0QWRqdXN0T3B0aW9ucyhwYXRoLCB5QXhpcywgZmFsc2UpO1xuICAgICAgICBjb25zdCByZXN1bHRZID1cbiAgICAgICAgICAgIG9wdGlvbnNZLnBvaW50T2ZIaXQgJiZcbiAgICAgICAgICAgIGFkanVzdChwYXRoLCB7IHBhcmFsbGVsUGF0aHM6IG9wdGlvbnNZLnBhcmFsbGVsUGF0aHMsIHBvaW50T2ZIaXQ6IG9wdGlvbnNZLnBvaW50T2ZIaXQsIHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlIH0pO1xuICAgICAgICBpZiAocmVzdWx0WSkge1xuICAgICAgICAgICAgcGF0aCA9IHJlc3VsdFk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59O1xuXG5jb25zdCBhZGp1c3QgPSAocm91dGU6IFBvaW50W10sIG9wdGlvbnM6IEFkanVzdE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IHBhcmFsbGVsUGF0aHMsIHBvaW50T2ZIaXQsIHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlIH0gPSBvcHRpb25zO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIHBhcmFsbGVsUGF0aHMuZm9yRWFjaChwYXJhbGxlbFBhdGggPT4ge1xuICAgICAgICAvLyBDb25zdHJ1Y3QgYSByZWN0YW5nbGVcbiAgICAgICAgY29uc3QgdGVtcFJlY3QgPSBSZWN0YW5nbGVDbGllbnQudG9SZWN0YW5nbGVDbGllbnQoW3BvaW50T2ZIaXQsIHBhcmFsbGVsUGF0aFswXSwgcGFyYWxsZWxQYXRoWzFdXSk7XG4gICAgICAgIGlmICghUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHRlbXBSZWN0LCBzb3VyY2VSZWN0YW5nbGUpICYmICFSZWN0YW5nbGVDbGllbnQuaXNIaXQodGVtcFJlY3QsIHRhcmdldFJlY3RhbmdsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdldENvcm5lckNvdW50ID0gKHBhdGg6IFBvaW50W10pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY29ybmVyQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBwYXRoLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlID0gcGF0aFtpbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gcGF0aFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBwYXRoW2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG93blNjYWxlKGN1cnJlbnRbMF0pID09PSBkb3duU2NhbGUocHJlWzBdKSAmJiBkb3duU2NhbGUoY3VycmVudFswXSkgPT09IGRvd25TY2FsZShuZXh0WzBdKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG93blNjYWxlKGN1cnJlbnRbMV0pID09PSBkb3duU2NhbGUocHJlWzFdKSAmJiBkb3duU2NhbGUoY3VycmVudFsxXSkgPT09IGRvd25TY2FsZShuZXh0WzFdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXJDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3JuZXJDb3VudDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0ZW1wQ29ybmVycyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHModGVtcFJlY3QpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhSYW5nZUluUGF0aDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4UmFuZ2VJbkNvcm5lcjogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIHJvdXRlLmZvckVhY2goKHBvaW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvcm5lclJlc3VsdCA9IHRlbXBDb3JuZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgY29ybmVyID0+IE1hdGguZmxvb3IoY29ybmVyWzBdKSA9PT0gTWF0aC5mbG9vcihwb2ludFswXSkgJiYgTWF0aC5mbG9vcihjb3JuZXJbMV0pID09PSBNYXRoLmZsb29yKHBvaW50WzFdKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGNvcm5lclJlc3VsdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZUluUGF0aC5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZUluQ29ybmVyLnB1c2goY29ybmVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucm91dGVdO1xuICAgICAgICAgICAgY29uc3QgbWlzc0Nvcm5lciA9IHRlbXBDb3JuZXJzLmZpbmQoKGMsIGluZGV4KSA9PiAhaW5kZXhSYW5nZUluQ29ybmVyLmluY2x1ZGVzKGluZGV4KSkgYXMgUG9pbnQ7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVMZW5ndGggPSBNYXRoLmFicyhpbmRleFJhbmdlSW5QYXRoWzBdIC0gaW5kZXhSYW5nZUluUGF0aFtpbmRleFJhbmdlSW5QYXRoLmxlbmd0aCAtIDFdKSArIDE7XG4gICAgICAgICAgICBuZXdQYXRoLnNwbGljZShpbmRleFJhbmdlSW5QYXRoWzBdICsgMSwgcmVtb3ZlTGVuZ3RoIC0gMiwgbWlzc0Nvcm5lcik7XG4gICAgICAgICAgICBjb25zdCBjb3JuZXJDb3VudCA9IGdldENvcm5lckNvdW50KFsuLi5yb3V0ZV0pO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29ybmVyQ291bnQgPSBnZXRDb3JuZXJDb3VudChbLi4ubmV3UGF0aF0pO1xuICAgICAgICAgICAgaWYgKG5ld0Nvcm5lckNvdW50IDw9IGNvcm5lckNvdW50KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0T3B0aW9ucyA9IChwYXRoOiBQb2ludFtdLCBtaWRkbGU6IG51bWJlciwgaXNIb3Jpem9udGFsOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgcGFyYWxsZWxQYXRoczogW1BvaW50LCBQb2ludF1bXSA9IFtdO1xuICAgIGxldCBzdGFydDogbnVsbCB8IFBvaW50ID0gbnVsbDtcbiAgICBsZXQgcG9pbnRPZkhpdDogbnVsbCB8IFBvaW50ID0gbnVsbDtcbiAgICBjb25zdCBheGlzID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGF0aC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXRoW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwYXRoW2luZGV4XTtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsICYmIHByZXZpb3VzICYmIHByZXZpb3VzW2F4aXNdID09PSBjdXJyZW50W2F4aXNdKSB7XG4gICAgICAgICAgICBzdGFydCA9IHByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzW2F4aXNdICE9PSBjdXJyZW50W2F4aXNdKSB7XG4gICAgICAgICAgICAgICAgcGFyYWxsZWxQYXRocy5wdXNoKFtzdGFydCwgcHJldmlvdXNdKTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRbYXhpc10gPT09IG1pZGRsZSkge1xuICAgICAgICAgICAgcG9pbnRPZkhpdCA9IGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHBhcmFsbGVsUGF0aHMucHVzaChbc3RhcnQsIHBhdGhbcGF0aC5sZW5ndGggLSAxXV0pO1xuICAgIH1cbiAgICByZXR1cm4geyBwb2ludE9mSGl0LCBwYXJhbGxlbFBhdGhzIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JhcGhQb2ludHMgPSAob3B0aW9uczogRWxib3dMaW5lUm91dGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBuZXh0U291cmNlUG9pbnQsIG5leHRUYXJnZXRQb2ludCwgc291cmNlT3V0ZXJSZWN0YW5nbGUsIHRhcmdldE91dGVyUmVjdGFuZ2xlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHg6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgeTogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgcmVzdWx0OiBQb2ludFtdID0gW107XG5cbiAgICBbc291cmNlT3V0ZXJSZWN0YW5nbGUsIHRhcmdldE91dGVyUmVjdGFuZ2xlXS5mb3JFYWNoKHJlY3RhbmdsZSA9PiB7XG4gICAgICAgIHgucHVzaChyZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLyAyLCByZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCk7XG4gICAgICAgIHkucHVzaChyZWN0YW5nbGUueSwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB9KTtcbiAgICBjb25zdCByZWN0YW5nbGVzWCA9IFtcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUueCxcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUueCArIHNvdXJjZU91dGVyUmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS54LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS54ICsgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUud2lkdGhcbiAgICBdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICB4LnB1c2goKHJlY3RhbmdsZXNYWzFdICsgcmVjdGFuZ2xlc1hbMl0pIC8gMiwgbmV4dFNvdXJjZVBvaW50WzBdLCBuZXh0VGFyZ2V0UG9pbnRbMF0pO1xuICAgIGNvbnN0IHJlY3RhbmdsZXNZID0gW1xuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZS55LFxuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZS55ICsgc291cmNlT3V0ZXJSZWN0YW5nbGUuaGVpZ2h0LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS55LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS55ICsgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUuaGVpZ2h0XG4gICAgXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgeS5wdXNoKChyZWN0YW5nbGVzWVsxXSArIHJlY3RhbmdsZXNZWzJdKSAvIDIsIG5leHRTb3VyY2VQb2ludFsxXSwgbmV4dFRhcmdldFBvaW50WzFdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBbeFtpXSwgeVtqXV07XG4gICAgICAgICAgICBjb25zdCBpc0luU291cmNlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNJblRhcmdldCA9IFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUodGFyZ2V0T3V0ZXJSZWN0YW5nbGUsIHBvaW50KTtcbiAgICAgICAgICAgIGlmICghaXNJblNvdXJjZSAmJiAhaXNJblRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMocmVzdWx0KS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICBjb25zdCBpc0luU291cmNlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICBjb25zdCBpc0luVGFyZ2V0ID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0YXJnZXRPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICByZXR1cm4gIWlzSW5Tb3VyY2UgJiYgIWlzSW5UYXJnZXQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHcmFwaCA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBQb2ludEdyYXBoKCk7XG4gICAgY29uc3QgWHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgWXM6IG51bWJlcltdID0gW107XG4gICAgcG9pbnRzLmZvckVhY2gocCA9PiB7XG4gICAgICAgIGNvbnN0IHggPSBwWzBdLFxuICAgICAgICAgICAgeSA9IHBbMV07XG4gICAgICAgIGlmIChYcy5pbmRleE9mKHgpIDwgMCkgWHMucHVzaCh4KTtcbiAgICAgICAgaWYgKFlzLmluZGV4T2YoeSkgPCAwKSBZcy5wdXNoKHkpO1xuICAgICAgICBncmFwaC5hZGQocCk7XG4gICAgfSk7XG4gICAgWHMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIFlzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBjb25zdCBpbkhvdEluZGV4ID0gKHA6IFBvaW50KTogYm9vbGVhbiA9PiBncmFwaC5oYXMocCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBYcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IFlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBbWHNbaV0sIFlzW2pdXTtcbiAgICAgICAgICAgIGlmICghaW5Ib3RJbmRleChwb2ludCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogUG9pbnQgPSBbWHNbaSAtIDFdLCBZc1tqXV07XG4gICAgICAgICAgICAgICAgaWYgKGluSG90SW5kZXgob3RoZXJQb2ludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGguY29ubmVjdChvdGhlclBvaW50LCBwb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmNvbm5lY3QocG9pbnQsIG90aGVyUG9pbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IFBvaW50ID0gW1hzW2ldLCBZc1tqIC0gMV1dO1xuICAgICAgICAgICAgICAgIGlmIChpbkhvdEluZGV4KG90aGVyUG9pbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmNvbm5lY3Qob3RoZXJQb2ludCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBncmFwaC5jb25uZWN0KHBvaW50LCBvdGhlclBvaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdyYXBoO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZHVjZVJvdXRlTWFyZ2luID0gKHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRPZmZzZXQgPSBERUZBVUxUX1JPVVRFX01BUkdJTjtcbiAgICBsZXQgc291cmNlT2Zmc2V0OiBudW1iZXJbXSA9IG5ldyBBcnJheSg0KS5maWxsKGRlZmF1bHRPZmZzZXQpO1xuICAgIGxldCB0YXJnZXRPZmZzZXQ6IG51bWJlcltdID0gbmV3IEFycmF5KDQpLmZpbGwoZGVmYXVsdE9mZnNldCk7XG4gICAgY29uc3QgbGVmdFRvUmlnaHQgPSBzb3VyY2VSZWN0YW5nbGUueCAtICh0YXJnZXRSZWN0YW5nbGUueCArIHRhcmdldFJlY3RhbmdsZS53aWR0aCk7XG4gICAgY29uc3QgcmlnaHRUb0xlZnQgPSB0YXJnZXRSZWN0YW5nbGUueCAtIChzb3VyY2VSZWN0YW5nbGUueCArIHNvdXJjZVJlY3RhbmdsZS53aWR0aCk7XG4gICAgaWYgKGxlZnRUb1JpZ2h0ID4gMCAmJiBsZWZ0VG9SaWdodCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGxlZnRUb1JpZ2h0IC8gMjtcbiAgICAgICAgc291cmNlT2Zmc2V0WzNdID0gb2Zmc2V0O1xuICAgICAgICB0YXJnZXRPZmZzZXRbMV0gPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0VG9MZWZ0ID4gMCAmJiByaWdodFRvTGVmdCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHJpZ2h0VG9MZWZ0IC8gMjtcbiAgICAgICAgdGFyZ2V0T2Zmc2V0WzNdID0gb2Zmc2V0O1xuICAgICAgICBzb3VyY2VPZmZzZXRbMV0gPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgdG9wVG9Cb3R0b20gPSBzb3VyY2VSZWN0YW5nbGUueSAtICh0YXJnZXRSZWN0YW5nbGUueSArIHRhcmdldFJlY3RhbmdsZS5oZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbVRvVG9wID0gdGFyZ2V0UmVjdGFuZ2xlLnkgLSAoc291cmNlUmVjdGFuZ2xlLnkgKyBzb3VyY2VSZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICBpZiAodG9wVG9Cb3R0b20gPiAwICYmIHRvcFRvQm90dG9tIDwgZGVmYXVsdE9mZnNldCAqIDIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9wVG9Cb3R0b20gLyAyO1xuICAgICAgICBzb3VyY2VPZmZzZXRbMF0gPSBvZmZzZXQ7XG4gICAgICAgIHRhcmdldE9mZnNldFsyXSA9IG9mZnNldDtcbiAgICB9XG4gICAgaWYgKGJvdHRvbVRvVG9wID4gMCAmJiBib3R0b21Ub1RvcCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJvdHRvbVRvVG9wIC8gMjtcbiAgICAgICAgc291cmNlT2Zmc2V0WzJdID0gb2Zmc2V0O1xuICAgICAgICB0YXJnZXRPZmZzZXRbMF0gPSBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiB7IHNvdXJjZU9mZnNldCwgdGFyZ2V0T2Zmc2V0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmV4dFBvaW50ID0gKHBvaW50OiBQb2ludCwgb3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb24pOiBQb2ludCA9PiB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24udG9wOiB7XG4gICAgICAgICAgICByZXR1cm4gW3BvaW50WzBdLCBvdXRlclJlY3RhbmdsZS55XTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIERpcmVjdGlvbi5ib3R0b206IHtcbiAgICAgICAgICAgIHJldHVybiBbcG9pbnRbMF0sIG91dGVyUmVjdGFuZ2xlLnkgKyBvdXRlclJlY3RhbmdsZS5oZWlnaHRdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRGlyZWN0aW9uLnJpZ2h0OiB7XG4gICAgICAgICAgICByZXR1cm4gW291dGVyUmVjdGFuZ2xlLnggKyBvdXRlclJlY3RhbmdsZS53aWR0aCwgcG9pbnRbMV1dO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBbb3V0ZXJSZWN0YW5nbGUueCwgcG9pbnRbMV1dO1xuICAgICAgICB9XG4gICAgfVxufTtcbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { createG, RectangleClient, drawRectangle, drawCircle, PlaitBoard, createForeignObject, updateForeignObject, ResizeCursorClass, setDragging, Direction, distanceBetweenPointAndPoint, Point, hotkeys, PlaitElement, PlaitContextService, downScale, getSelectedElements, Transforms, PlaitPointerType, isMainPointer, transformPoint, toPoint, preventTouchMove, PRESS_AND_MOVE_BUFFER, MERGING, throttleRAF, handleTouchTarget, PlaitPluginElementComponent, isSelectionMoving, ACTIVE_STROKE_WIDTH } from '@plait/core';
1
+ import { createG, RectangleClient, drawRectangle, drawCircle, PlaitBoard, createForeignObject, updateForeignObject, ResizeCursorClass, setDragging, Direction, distanceBetweenPointAndPoint, Point, hotkeys, PlaitElement, PlaitContextService, downScale, getSelectedElements, Transforms, getRectangleByElements, MERGING, PlaitPointerType, isMainPointer, transformPoint, toPoint, preventTouchMove, PRESS_AND_MOVE_BUFFER, throttleRAF, handleTouchTarget, PlaitPluginElementComponent, isSelectionMoving, ACTIVE_STROKE_WIDTH } from '@plait/core';
2
2
  import { isKeyHotkey } from 'is-hotkey';
3
3
  import { PlaitMarkEditor } from '@plait/text';
4
4
  import * as i0 from '@angular/core';
@@ -716,8 +716,8 @@ class AStar {
716
716
  current.node.adjacentNodes.forEach(next => {
717
717
  let newCost = costSoFar.get(current.node) + this.heuristic(next.data, current.node.data);
718
718
  const previousNode = this.cameFrom.get(current.node);
719
- // 拐点权重,出现拐点则 cost + 1 以避免拐点路径
720
- // 以三点一线确定是否出现拐点
719
+ // Inflection point weight, if an inflection point occurs, cost + 1 to avoid the inflection point path
720
+ // Three points on a line to determine whether there is an inflection point
721
721
  const previousPoint = previousNode ? previousNode.data : previousStart;
722
722
  const x = previousPoint[0] === current?.node.data[0] && previousPoint[0] === next.data[0];
723
723
  const y = previousPoint[1] === current?.node.data[1] && previousPoint[1] === next.data[1];
@@ -801,12 +801,12 @@ const generateElbowLineRoute = (options) => {
801
801
  aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);
802
802
  let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);
803
803
  route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];
804
- // 中线纠正: 基于水平中线/垂直中线纠正最短路径 route
805
- // 1. 找水平中线(xAxis)/垂直中线(yAxis
806
- // 2. route 中找到和 xAxis/yAxis 相交的点、在 route 中找和 xAxis/yAxis 平行的线段
807
- // 3. 基于步骤上一步找到的相交点和平行线构建矩形
808
- // 4. 判断矩形是否和元素相交,不相交则可以基于上步构建的矩形进行中线的映射
809
- // 5. 判断映射中线后的路径是否符合约束条件(拐点数据不能增加)
804
+ // Centerline correction: Correct the shortest path route based on the horizontal centerline/vertical centerline
805
+ // 1. Find the horizontal center line (xAxis)/vertical center line (yAxis)
806
+ // 2. Find the point that intersects xAxis/yAxis in route, and find the line segment parallel to xAxis/yAxis in route
807
+ // 3. Construct a rectangle based on the intersection points and parallel lines found in the previous step.
808
+ // 4. Determine whether the rectangle intersects with the element. If it does not intersect, the center line can be mapped based on the rectangle constructed in the previous step.
809
+ // 5. Determine whether the path after mapping the center line meets the constraints (inflection point cannot be increased)
810
810
  const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);
811
811
  const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);
812
812
  const xAxis = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);
@@ -838,7 +838,7 @@ const adjust = (route, options) => {
838
838
  const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;
839
839
  let result = null;
840
840
  parallelPaths.forEach(parallelPath => {
841
- // 构建矩形
841
+ // Construct a rectangle
842
842
  const tempRect = RectangleClient.toRectangleClient([pointOfHit, parallelPath[0], parallelPath[1]]);
843
843
  if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {
844
844
  const getCornerCount = (path) => {
@@ -1080,6 +1080,73 @@ const PropertyTransforms = {
1080
1080
  setStrokeColor
1081
1081
  };
1082
1082
 
1083
+ const alignTop = (board) => {
1084
+ function getOffset(outerRectangle, rectangle) {
1085
+ return [0, outerRectangle.y - rectangle.y];
1086
+ }
1087
+ setOffset(board, getOffset);
1088
+ };
1089
+ const alignHorizontalCenter = (board) => {
1090
+ function getOffset(outerRectangle, rectangle) {
1091
+ const outerCenter = outerRectangle.y + outerRectangle.height / 2;
1092
+ const elementCenter = rectangle.y + rectangle.height / 2;
1093
+ return [0, outerCenter - elementCenter];
1094
+ }
1095
+ setOffset(board, getOffset);
1096
+ };
1097
+ const alignBottom = (board) => {
1098
+ function getOffset(outerRectangle, rectangle) {
1099
+ return [0, outerRectangle.y + outerRectangle.height - (rectangle.y + rectangle.height)];
1100
+ }
1101
+ setOffset(board, getOffset);
1102
+ };
1103
+ const alignLeft = (board) => {
1104
+ function getOffset(outerRectangle, rectangle) {
1105
+ return [outerRectangle.x - rectangle.x, 0];
1106
+ }
1107
+ setOffset(board, getOffset);
1108
+ };
1109
+ const alignVerticalCenter = (board) => {
1110
+ function getOffset(outerRectangle, rectangle) {
1111
+ const outerCenter = outerRectangle.x + outerRectangle.width / 2;
1112
+ const elementCenter = rectangle.x + rectangle.width / 2;
1113
+ return [outerCenter - elementCenter, 0];
1114
+ }
1115
+ setOffset(board, getOffset);
1116
+ };
1117
+ const alignRight = (board) => {
1118
+ function getOffset(outerRectangle, rectangle) {
1119
+ return [outerRectangle.x + outerRectangle.width - (rectangle.x + rectangle.width), 0];
1120
+ }
1121
+ setOffset(board, getOffset);
1122
+ };
1123
+ function setOffset(board, getOffset) {
1124
+ let elements = getSelectedElements(board);
1125
+ elements = elements.filter(element => board.children.includes(element));
1126
+ const outerRectangle = getRectangleByElements(board, elements, false);
1127
+ elements.forEach(element => {
1128
+ if (!element.points)
1129
+ return;
1130
+ const path = PlaitBoard.findPath(board, element);
1131
+ const rectangle = board.getRectangle(element);
1132
+ const offset = getOffset(outerRectangle, rectangle);
1133
+ const newPoints = element.points.map(p => [p[0] + offset[0], p[1] + offset[1]]);
1134
+ Transforms.setNode(board, {
1135
+ points: newPoints
1136
+ }, path);
1137
+ MERGING.set(board, true);
1138
+ });
1139
+ MERGING.set(board, false);
1140
+ }
1141
+ const AlignTransform = {
1142
+ alignTop,
1143
+ alignHorizontalCenter,
1144
+ alignBottom,
1145
+ alignLeft,
1146
+ alignVerticalCenter,
1147
+ alignRight
1148
+ };
1149
+
1083
1150
  const normalizeShapePoints = (points, shift = false) => {
1084
1151
  let start = points[0];
1085
1152
  let end = points[1];
@@ -1316,5 +1383,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1316
1383
  * Generated bundle index. Do not edit.
1317
1384
  */
1318
1385
 
1319
- export { AStar, ActiveGenerator, BASE, BoardCreationMode, CommonPluginElement, DEFAULT_ROUTE_MARGIN, Generator, IS_RESIZING, ImageBaseComponent, ImageGenerator, MediaKeys, PICTURE_ACCEPTED_UPLOAD_SIZE, PRIMARY_COLOR, PointGraph, PointNode, PriorityQueue, PropertyTransforms, RESIZE_HANDLE_DIAMETER, ResizeHandle, TRANSPARENT, WithCommonPluginKey, WithTextPluginKey, acceptImageTypes, addElementOfFocusedImage, addResizing, buildImage, calculatePolylineLength, createGraph, generateElbowLineRoute, getCreationMode, getDirection, getDirectionBetweenPointAndPoint, getDirectionByPointOfRectangle, getDirectionByVector, getDirectionFactor, getEdgeCenter, getElementOfFocusedImage, getExtendPoint, getFactorByPoints, getFirstTextEditor, getFirstTextManage, getGraphPoints, getMemorizedLatest, getNextPoint, getOppositeDirection, getPointByVector, getPointOnPolyline, getPoints, getRatioByPoint, getRectangleByPoints, getRectangleResizeHandleRefs, getTextEditors, getTextManages, getTextMarksByElement, hasAfterDraw, isDelete, isDndMode, isDrawingMode, isEnterHotkey, isExpandHotkey, isPointOnLineSegment, isResizing, isResizingByCondition, isSpaceHotkey, isTabHotkey, isVirtualKey, memorizeLatest, normalizeShapePoints, reduceRouteMargin, removeDuplicatePoints, removeElementOfFocusedImage, removeResizing, rotateVectorAnti90, routeAdjust, selectImage, setCreationMode, setProperty, withResize };
1386
+ export { AStar, ActiveGenerator, AlignTransform, BASE, BoardCreationMode, CommonPluginElement, DEFAULT_ROUTE_MARGIN, Generator, IS_RESIZING, ImageBaseComponent, ImageGenerator, MediaKeys, PICTURE_ACCEPTED_UPLOAD_SIZE, PRIMARY_COLOR, PointGraph, PointNode, PriorityQueue, PropertyTransforms, RESIZE_HANDLE_DIAMETER, ResizeHandle, TRANSPARENT, WithCommonPluginKey, WithTextPluginKey, acceptImageTypes, addElementOfFocusedImage, addResizing, alignBottom, alignHorizontalCenter, alignLeft, alignRight, alignTop, alignVerticalCenter, buildImage, calculatePolylineLength, createGraph, generateElbowLineRoute, getCreationMode, getDirection, getDirectionBetweenPointAndPoint, getDirectionByPointOfRectangle, getDirectionByVector, getDirectionFactor, getEdgeCenter, getElementOfFocusedImage, getExtendPoint, getFactorByPoints, getFirstTextEditor, getFirstTextManage, getGraphPoints, getMemorizedLatest, getNextPoint, getOppositeDirection, getPointByVector, getPointOnPolyline, getPoints, getRatioByPoint, getRectangleByPoints, getRectangleResizeHandleRefs, getTextEditors, getTextManages, getTextMarksByElement, hasAfterDraw, isDelete, isDndMode, isDrawingMode, isEnterHotkey, isExpandHotkey, isPointOnLineSegment, isResizing, isResizingByCondition, isSpaceHotkey, isTabHotkey, isVirtualKey, memorizeLatest, normalizeShapePoints, reduceRouteMargin, removeDuplicatePoints, removeElementOfFocusedImage, removeResizing, rotateVectorAnti90, routeAdjust, selectImage, setCreationMode, setProperty, withResize };
1320
1387
  //# sourceMappingURL=plait-common.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"plait-common.mjs","sources":["../../../packages/common/src/constants/default.ts","../../../packages/common/src/constants/media.ts","../../../packages/common/src/constants/resize.ts","../../../packages/common/src/generators/generator.ts","../../../packages/common/src/generators/active.generator.ts","../../../packages/common/src/generators/image.generator.ts","../../../packages/common/src/utils/resize.ts","../../../packages/common/src/utils/direction.ts","../../../packages/common/src/utils/line-path.ts","../../../packages/common/src/utils/hot-key.ts","../../../packages/common/src/utils/rectangle.ts","../../../packages/common/src/utils/creation-mode.ts","../../../packages/common/src/utils/text.ts","../../../packages/common/src/utils/image.ts","../../../packages/common/src/algorithms/data-structures/priority-queue.ts","../../../packages/common/src/algorithms/a-star.ts","../../../packages/common/src/algorithms/data-structures/graph.ts","../../../packages/common/src/utils/elbow-line-route.ts","../../../packages/common/src/utils/memorize.ts","../../../packages/common/src/transforms/property.ts","../../../packages/common/src/shapes/common.ts","../../../packages/common/src/plugins/with-resize.ts","../../../packages/common/src/core/plugin-element.ts","../../../packages/common/src/core/image-base.component.ts","../../../packages/common/src/public-api.ts","../../../packages/common/src/plait-common.ts"],"sourcesContent":["export const BASE = 4;\nexport const PRIMARY_COLOR = '#6698FF';\nexport const RESIZE_HANDLE_DIAMETER = 8;\nexport const WithTextPluginKey = 'plait-text-plugin-key';\nexport const DEFAULT_ROUTE_MARGIN = 30;\nexport const TRANSPARENT = 'transparent';\n","export enum MediaKeys {\n image = 'image'\n}\n\nexport const PICTURE_ACCEPTED_UPLOAD_SIZE = 20;\n\nexport const acceptImageTypes = ['png', 'jpeg', 'gif', 'bmp'];\n\nexport const WithCommonPluginKey = 'plait-common-plugin-key';\n","export enum ResizeHandle {\n ne = 'ne',\n n = 'n',\n nw = 'nw',\n e = 'e',\n se = 'se',\n s = 's',\n sw = 'sw',\n w = 'w'\n}\n","import { PlaitBoard, PlaitElement } from '@plait/core';\n\nexport interface GeneratorExtraData {}\n\nexport interface GeneratorOptions { prepend?: boolean }\n\nexport abstract class Generator<\n T extends PlaitElement = PlaitElement,\n K extends GeneratorExtraData = GeneratorExtraData,\n V extends GeneratorOptions = GeneratorOptions\n> {\n g?: SVGGElement;\n\n protected options?: V;\n\n constructor(protected board: PlaitBoard, options?: V) {\n this.options = options;\n }\n\n processDrawing(element: T, parentG: SVGGElement, data?: K) {\n if (this.canDraw && this.canDraw(element, data)) {\n const g = this.draw(element, data);\n if (g) {\n if (this.g && parentG.contains(this.g)) {\n this.g.replaceWith(g);\n } else {\n if (this.options?.prepend) {\n parentG.prepend(g);\n } else {\n parentG.appendChild(g);\n }\n }\n this.g = g;\n } else {\n this.destroy();\n }\n if (hasAfterDraw(this)) {\n this.afterDraw(element);\n }\n } else {\n this.destroy();\n }\n }\n\n /**\n * abstract function\n */\n protected abstract canDraw(element: T, data?: K): boolean;\n\n /**\n * abstract function\n */\n protected abstract draw(element: T, data?: K): SVGGElement | undefined;\n\n destroy() {\n if (this.g) {\n this.g.remove();\n this.g = undefined;\n }\n }\n}\n\nexport interface AfterDraw<T extends PlaitElement = PlaitElement> {\n afterDraw(element: T): void;\n}\n\nexport function hasAfterDraw(value: any): value is AfterDraw {\n if (value.afterDraw) {\n return true;\n }\n return false;\n}\n","import { PlaitBoard, PlaitElement, RectangleClient, createG, drawCircle, drawRectangle } from '@plait/core';\nimport { Generator, GeneratorOptions } from './generator';\nimport { PRIMARY_COLOR, RESIZE_HANDLE_DIAMETER } from '../constants/default';\nimport { Options } from 'roughjs/bin/core';\n\nexport interface ActiveGeneratorExtraData {\n selected: boolean;\n}\n\nexport interface ActiveGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getStrokeWidth: () => number;\n getStrokeOpacity: () => number;\n hasResizeHandle: () => boolean;\n}\n\nexport class ActiveGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n ActiveGeneratorExtraData,\n ActiveGeneratorOptions<T> & GeneratorOptions\n> {\n hasResizeHandle = false;\n\n constructor(public board: PlaitBoard, public options: ActiveGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T, data: ActiveGeneratorExtraData): boolean {\n if (data.selected) {\n return true;\n } else {\n return false;\n }\n }\n\n draw(element: T, data: ActiveGeneratorExtraData): SVGGElement {\n const activeG = createG();\n const rectangle = this.options.getRectangle(element);\n\n const delta = this.options.getStrokeWidth();\n const activeRectangle = RectangleClient.inflate(rectangle, delta);\n\n const strokeG = drawRectangle(this.board, activeRectangle, {\n stroke: PRIMARY_COLOR,\n strokeWidth: delta\n });\n\n activeG.append(strokeG);\n strokeG.style.opacity = `${this.options.getStrokeOpacity()}`;\n if (this.options.hasResizeHandle()) {\n this.hasResizeHandle = true;\n // resize handle\n const options: Options = { stroke: '#999999', strokeWidth: 1, fill: '#FFF', fillStyle: 'solid' };\n const leftTopHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x, activeRectangle.y],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n const rightTopHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x + activeRectangle.width, activeRectangle.y],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n const rightBottomHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x + activeRectangle.width, activeRectangle.y + activeRectangle.height],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n const leftBottomHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x, activeRectangle.y + activeRectangle.height],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n activeG.append(...[leftTopHandleG, rightTopHandleG, rightBottomHandleG, leftBottomHandleG]);\n } else {\n this.hasResizeHandle = false;\n }\n return activeG;\n }\n}\n","import {\n PlaitBoard,\n PlaitElement,\n PlaitOptionsBoard,\n RectangleClient,\n createForeignObject,\n createG,\n updateForeignObject\n} from '@plait/core';\nimport { Generator, GeneratorOptions } from './generator';\nimport { ComponentRef, ViewContainerRef } from '@angular/core';\nimport { ImageBaseComponent } from '../core/image-base.component';\nimport { CommonImageItem, WithCommonPluginOptions } from '../utils';\nimport { WithCommonPluginKey } from '../constants';\nexport interface ShapeData {\n viewContainerRef: ViewContainerRef;\n}\n\nexport interface ImageGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getImageItem: (element: T) => CommonImageItem;\n}\n\nexport class ImageGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n ViewContainerRef,\n ImageGeneratorOptions<T> & GeneratorOptions\n> {\n foreignObject!: SVGForeignObjectElement;\n\n componentRef!: ComponentRef<ImageBaseComponent>;\n\n constructor(public board: PlaitBoard, public options: ImageGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T, data: ViewContainerRef): boolean {\n return !!this.options.getImageItem(element);\n }\n\n draw(element: T, viewContainerRef: ViewContainerRef): SVGGElement {\n const g = createG();\n const foreignRectangle = this.options.getRectangle(element);\n this.foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);\n g.append(this.foreignObject);\n const componentType = (this.board as PlaitOptionsBoard).getPluginOptions<WithCommonPluginOptions>(WithCommonPluginKey)\n .imageComponentType;\n if (!componentType) {\n throw new Error('Not implement ImageBaseComponent error.');\n }\n this.componentRef = viewContainerRef.createComponent(componentType);\n this.componentRef.instance.board = this.board;\n\n this.componentRef.instance.imageItem = this.options.getImageItem(element);\n this.componentRef.instance.element = element;\n this.componentRef.instance.getRectangle = () => {\n return this.options.getRectangle(element);\n };\n this.componentRef.instance.cdr.markForCheck();\n this.foreignObject.append(this.componentRef!.instance.nativeElement);\n return g;\n }\n\n updateImage(nodeG: SVGGElement, previous: T, current: T) {\n if (previous !== current && this.componentRef) {\n this.componentRef.instance.imageItem = this.options.getImageItem(current);\n this.componentRef!.instance.getRectangle = () => {\n return this.options.getRectangle(current);\n };\n }\n const currentForeignObject = this.options.getRectangle(current);\n updateForeignObject(\n this.g!,\n currentForeignObject.width,\n currentForeignObject.height,\n currentForeignObject.x,\n currentForeignObject.y\n );\n // solve image lose on move node\n if (this.foreignObject.children.length === 0) {\n this.foreignObject.append(this.componentRef!.instance.nativeElement);\n }\n this.componentRef?.instance.cdr.markForCheck();\n }\n\n destroy(): void {\n super.destroy();\n this.componentRef?.destroy();\n }\n}\n","import { Path, PlaitBoard, PlaitElement, Point, RectangleClient, ResizeCursorClass, setDragging } from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\n\nexport interface ResizeRef<T extends PlaitElement = PlaitElement, K = ResizeHandle> {\n element: T;\n path: Path;\n handle: K;\n}\n\nconst getResizeHandleByIndex = (index: number) => {\n switch (index) {\n case 0:\n return ResizeHandle.nw;\n case 1:\n return ResizeHandle.ne;\n case 2:\n return ResizeHandle.se;\n case 3:\n return ResizeHandle.sw;\n case 4:\n return ResizeHandle.n;\n case 5:\n return ResizeHandle.e;\n case 6:\n return ResizeHandle.s;\n case 7:\n return ResizeHandle.w;\n default:\n return null;\n }\n};\n\nconst getResizeCursorClassByIndex = (index: number) => {\n switch (index) {\n case 0:\n case 2:\n return ResizeCursorClass.nwse;\n case 1:\n case 3:\n return ResizeCursorClass.nesw;\n case 4:\n case 6:\n return ResizeCursorClass.ns;\n case 5:\n case 7:\n return ResizeCursorClass.ew;\n default:\n return null;\n }\n};\n\nexport const getRectangleResizeHandleRefs = (rectangle: RectangleClient, diameter: number) => {\n const corners = RectangleClient.getCornerPoints(rectangle);\n const refs = corners.map((corner, index: number) => {\n return {\n rectangle: {\n x: corner[0] - diameter / 2,\n y: corner[1] - diameter / 2,\n width: diameter,\n height: diameter\n },\n handle: getResizeHandleByIndex(index) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index) as ResizeCursorClass\n };\n });\n const rectangles = getResizeSideRectangles(corners, diameter / 2);\n refs.push(\n ...rectangles.map((rectangle, index) => {\n return {\n rectangle,\n handle: getResizeHandleByIndex(index + 4) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index + 4) as ResizeCursorClass\n };\n })\n );\n return refs;\n};\n\nconst getResizeSideRectangles = (cornerPoints: Point[], offset: number): RectangleClient[] => {\n const result = [];\n for (let i = 0; i < cornerPoints.length; i++) {\n let rectangle = RectangleClient.toRectangleClient([cornerPoints[i], cornerPoints[(i + 1) % 4]]);\n const arr = new Array(2).fill(0);\n arr[(i + 1) % 2] = offset / 2;\n rectangle = RectangleClient.expand(rectangle, arr[0], arr[1]);\n result.push(rectangle);\n }\n return result;\n};\n\nexport const IS_RESIZING = new WeakMap<PlaitBoard, ResizeRef<any, any>>();\n\nexport const isResizing = (board: PlaitBoard) => {\n return !!IS_RESIZING.get(board);\n};\n\nexport const isResizingByCondition = <T extends PlaitElement, K>(board: PlaitBoard, match: (resizeRef: ResizeRef<T, K>) => boolean) => {\n return isResizing(board) && match(IS_RESIZING.get(board)!);\n};\n\nexport const addResizing = <T extends PlaitElement, K>(board: PlaitBoard, resizeRef: ResizeRef<T, K>, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.add(`${key}-resizing`);\n IS_RESIZING.set(board, resizeRef);\n setDragging(board, true);\n};\n\nexport const removeResizing = (board: PlaitBoard, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.remove(`${key}-resizing`);\n IS_RESIZING.delete(board);\n setDragging(board, false);\n};\n","import { Direction, Point, PointOfRectangle, Vector, distanceBetweenPointAndPoint } from '@plait/core';\n\nconst handleDirectionFactors = {\n [Direction.left]: { x: -1, y: 0 },\n [Direction.right]: { x: 1, y: 0 },\n [Direction.top]: { x: 0, y: -1 },\n [Direction.bottom]: { x: 0, y: 1 }\n};\n\nexport function getDirectionByPointOfRectangle(point: PointOfRectangle): Direction | undefined {\n if (point[0] === 0) {\n return Direction.left;\n }\n if (point[0] === 1) {\n return Direction.right;\n }\n if (point[1] === 0) {\n return Direction.top;\n }\n if (point[1] === 1) {\n return Direction.bottom;\n }\n return undefined;\n}\n\n/**\n * this function accepts vector parameter, the vector parameter vector is based on the screen coordinate system\n * vector[0] and vector[1] are the x and y components of the vector respectively.\n * if the vector has only one direction, the function returns a string in that direction, such as 'right', 'top', 'bottom' or 'left'.\n * if the vector has two directions, the function will return the string in which direction it is closer.\n */\nexport function getDirectionByVector(vector: Vector): Direction | null {\n const x = vector[0];\n const y = vector[1];\n if (x === 0 && y === 0) {\n return null;\n }\n if (x === 0) {\n return y > 0 ? Direction.bottom : Direction.top;\n }\n if (y === 0) {\n return x > 0 ? Direction.right : Direction.left;\n }\n const angle = Math.atan2(y, x);\n if (angle > -Math.PI / 4 && angle <= Math.PI / 4) {\n return Direction.right;\n } else if (angle > Math.PI / 4 && angle <= (3 * Math.PI) / 4) {\n return Direction.bottom;\n } else if (angle > (-3 * Math.PI) / 4 && angle <= -Math.PI / 4) {\n return Direction.top;\n } else {\n return Direction.left;\n }\n}\n\nexport function getPointByVector(point: Point, vector: Vector, offset: number): Point {\n const distance = Math.hypot(vector[0], vector[1]);\n return [point[0] + (vector[0] / distance) * offset, point[1] + (vector[1] / distance) * offset];\n}\n\nexport function rotateVectorAnti90(vector: Vector): Vector {\n const x = vector[0];\n const y = vector[1];\n const rotatedX = y;\n const rotatedY = -x;\n return [rotatedX, rotatedY];\n}\n\nexport function getDirectionBetweenPointAndPoint(source: Point, target: Point) {\n if (source[0] === target[0]) {\n if (source[1] >= target[1]) {\n return Direction.top;\n } else {\n return Direction.bottom;\n }\n }\n if (source[1] === target[1]) {\n if (source[0] >= target[0]) {\n return Direction.left;\n } else {\n return Direction.right;\n }\n }\n throw new Error('can not match direction');\n}\n\nexport function getDirectionFactor(direction: Direction) {\n return handleDirectionFactors[direction];\n}\n\nexport function getFactorByPoints(source: Point, target: Point) {\n const distance = distanceBetweenPointAndPoint(...source, ...target);\n if (Point.isEquals(source, target)) {\n return {\n x: 1,\n y: 1\n };\n }\n return {\n x: (target[0] - source[0]) / distance,\n y: (target[1] - source[1]) / distance\n };\n}\n","import { Direction, Point, distanceBetweenPointAndPoint } from '@plait/core';\nimport { getDirectionFactor } from './direction';\n\nexport function getOppositeDirection(direction: Direction) {\n switch (direction) {\n case Direction.left:\n return Direction.right;\n case Direction.right:\n return Direction.left;\n case Direction.top:\n return Direction.bottom;\n case Direction.bottom:\n return Direction.top;\n }\n}\n\nexport const getPoints = (source: Point, sourcePosition: Direction, target: Point, targetPosition: Direction, offset: number) => {\n const sourceDir = getDirectionFactor(sourcePosition);\n const targetDir = getDirectionFactor(targetPosition);\n const sourceGapped: Point = [source[0] + sourceDir.x * offset, source[1] + sourceDir.y * offset];\n const targetGapped: Point = [target[0] + targetDir.x * offset, target[1] + targetDir.y * offset];\n const dir = getDirection(sourceGapped, sourcePosition, targetGapped);\n const dirAccessor = dir.x !== 0 ? 'x' : 'y';\n const currDir = dir[dirAccessor];\n\n let points: Point[] = [];\n let centerX, centerY;\n const [defaultCenterX, defaultCenterY] = getEdgeCenter({\n sourceX: source[0],\n sourceY: source[1],\n targetX: target[0],\n targetY: target[1]\n });\n // opposite handle positions, default case\n if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) {\n centerX = defaultCenterX;\n centerY = defaultCenterY;\n // --->\n // |\n // >---\n const verticalSplit: Point[] = [\n [centerX, sourceGapped[1]],\n [centerX, targetGapped[1]]\n ];\n // |\n // ---\n // |\n const horizontalSplit: Point[] = [\n [sourceGapped[0], centerY],\n [targetGapped[0], centerY]\n ];\n if (sourceDir[dirAccessor] === currDir) {\n points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;\n } else {\n points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;\n }\n } else {\n // sourceTarget means we take x from source and y from target, targetSource is the opposite\n const sourceTarget: Point[] = [[sourceGapped[0], targetGapped[1]]];\n const targetSource: Point[] = [[targetGapped[0], sourceGapped[1]]];\n // this handles edges with same handle positions\n if (dirAccessor === 'x') {\n points = sourceDir.x === currDir ? targetSource : sourceTarget;\n } else {\n points = sourceDir.y === currDir ? sourceTarget : targetSource;\n }\n\n // these are conditions for handling mixed handle positions like right -> bottom for example\n let flipSourceTarget;\n if (sourcePosition !== targetPosition) {\n const dirAccessorOpposite = dirAccessor === 'x' ? 1 : 0;\n const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessor === 'x' ? 'y' : 'x'];\n const sourceGtTargetOppo = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];\n const sourceLtTargetOppo = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];\n flipSourceTarget =\n (sourceDir[dirAccessor] === 1 && ((!isSameDir && sourceGtTargetOppo) || (isSameDir && sourceLtTargetOppo))) ||\n (sourceDir[dirAccessor] !== 1 && ((!isSameDir && sourceLtTargetOppo) || (isSameDir && sourceGtTargetOppo)));\n\n if (flipSourceTarget) {\n points = dirAccessor === 'x' ? sourceTarget : targetSource;\n }\n }\n }\n return [source, sourceGapped, ...points, targetGapped, target];\n};\n\nexport const getDirection = (source: Point, sourcePosition = Direction.bottom, target: Point) => {\n if (sourcePosition === Direction.left || sourcePosition === Direction.right) {\n return source[0] < target[0] ? { x: 1, y: 0 } : { x: -1, y: 0 };\n }\n return source[1] < target[1] ? { x: 0, y: 1 } : { x: 0, y: -1 };\n};\n\nexport function getEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY\n}: {\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n}): [number, number, number, number] {\n const xOffset = Math.abs(targetX - sourceX) / 2;\n const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;\n\n const yOffset = Math.abs(targetY - sourceY) / 2;\n const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;\n\n return [centerX, centerY, xOffset, yOffset];\n}\n\nexport function getPointOnPolyline(points: Point[], ratio: number) {\n const totalLength = calculatePolylineLength(points);\n const targetDistance = totalLength * ratio;\n\n let accumulatedDistance = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n const segmentLength = distanceBetweenPointAndPoint(x1, y1, x2, y2);\n\n if (accumulatedDistance + segmentLength >= targetDistance) {\n const remainingDistance = targetDistance - accumulatedDistance;\n const ratioInSegment = remainingDistance / segmentLength;\n\n const targetX = x1 + (x2 - x1) * ratioInSegment;\n const targetY = y1 + (y2 - y1) * ratioInSegment;\n return [targetX, targetY];\n }\n\n accumulatedDistance += segmentLength;\n }\n\n return points[points.length - 1];\n}\n\nexport function calculatePolylineLength(points: Point[]) {\n let length = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n length += distanceBetweenPointAndPoint(x1, y1, x2, y2);\n }\n return length;\n}\n\nexport function getRatioByPoint(points: Point[], point: Point) {\n const totalLength = calculatePolylineLength(points);\n\n let distance = 0;\n\n for (let i = 0; i < points.length - 1; i++) {\n const isOverlap = isPointOnLineSegment(point, points[i], points[i + 1]);\n\n if (isOverlap) {\n distance += distanceBetweenPointAndPoint(point[0], point[1], points[i][0], points[i][1]);\n return distance / totalLength;\n } else {\n distance += distanceBetweenPointAndPoint(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1]);\n }\n }\n throw new Error('Cannot get ratio by point');\n}\n\nexport function isPointOnLineSegment(point: Point, startPoint: Point, endPoint: Point) {\n const distanceToStart = distanceBetweenPointAndPoint(point[0], point[1], startPoint[0], startPoint[1]);\n const distanceToEnd = distanceBetweenPointAndPoint(point[0], point[1], endPoint[0], endPoint[1]);\n\n const segmentLength = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n\n return Math.abs(distanceToStart + distanceToEnd - segmentLength) < 0.1;\n}\n\nexport const removeDuplicatePoints = (points: Point[]) => {\n const newArray: Point[] = [];\n points.forEach(point => {\n const index = newArray.findIndex(otherPoint => {\n return Point.isEquals(point, otherPoint);\n });\n if (index === -1) newArray.push(point);\n });\n return newArray;\n};\n\nexport const getExtendPoint = (source: Point, target: Point, extendDistance: number): Point => {\n const distance = distanceBetweenPointAndPoint(...source, ...target);\n const isEqual = Point.isEquals(source, target);\n const sin = isEqual ? 1 : (target[1] - source[1]) / distance;\n const cos = isEqual ? 1 : (target[0] - source[0]) / distance;\n return [source[0] + extendDistance * cos, source[1] + extendDistance * sin];\n};\n","import { hotkeys } from '@plait/core';\nimport { isKeyHotkey } from 'is-hotkey';\n\nexport function isVirtualKey(e: KeyboardEvent) {\n const isMod = e.ctrlKey || e.metaKey;\n const isAlt = isKeyHotkey('alt', e);\n const isShift = isKeyHotkey('shift', e);\n const isCapsLock = e.key.includes('CapsLock');\n const isTab = e.key.includes('Tab');\n const isEsc = e.key.includes('Escape');\n const isF = e.key.startsWith('F');\n const isArrow = e.key.includes('Arrow') ? true : false;\n return isCapsLock || isMod || isAlt || isArrow || isShift || isTab || isEsc || isF;\n}\n\nexport const isExpandHotkey = (event: KeyboardEvent) => {\n return isKeyHotkey('mod+/', event);\n};\n\nexport const isTabHotkey = (event: KeyboardEvent) => {\n return event.key === 'Tab';\n};\n\nexport const isEnterHotkey = (event: KeyboardEvent) => {\n return event.key === 'Enter';\n};\n\nexport const isSpaceHotkey = (event: KeyboardEvent) => {\n return event.code === 'Space';\n};\n\nexport const isDelete = (event: KeyboardEvent) => {\n return hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event);\n};\n","import { Point } from '@plait/core';\n\nexport const getRectangleByPoints = (points: Point[]) => {\n let minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity;\n points.forEach(point => {\n minX = Math.min(point[0], minX);\n maxX = Math.max(point[0], maxX);\n minY = Math.min(point[1], minY);\n maxY = Math.max(point[1], maxY);\n });\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n};\n","import { PlaitBoard } from '@plait/core';\n\nexport enum BoardCreationMode {\n 'dnd' = 'dnd',\n 'drawing' = 'drawing'\n}\n\nconst BOARD_TO_CREATION_MODE: WeakMap<PlaitBoard, BoardCreationMode> = new WeakMap();\n\nexport const getCreationMode = (board: PlaitBoard) => {\n return BOARD_TO_CREATION_MODE.get(board);\n};\n\nexport const setCreationMode = (board: PlaitBoard, mode: BoardCreationMode) => {\n BOARD_TO_CREATION_MODE.set(board, mode);\n};\n\nexport const isDndMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.dnd;\n};\n\nexport const isDrawingMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.drawing;\n};\n","import { PlaitElement } from '@plait/core';\nimport { CommonPluginElement } from '../core/plugin-element';\nimport { CustomText, PlaitMarkEditor } from '@plait/text';\n\nexport const getTextManages = (element: PlaitElement) => {\n const component = PlaitElement.getComponent(element) as CommonPluginElement;\n return component.getTextManages();\n};\n\nexport const getFirstTextManage = (element: PlaitElement) => {\n const textManage = getTextManages(element)[0];\n if (!textManage) {\n throw new Error('can not find textManage');\n }\n return textManage;\n};\n\nexport const getTextEditors = (element: PlaitElement) => {\n return getTextManages(element).map(manage => {\n return manage.componentRef.instance.editor;\n });\n};\n\nexport const getFirstTextEditor = (element: PlaitElement) => {\n const textEditor = getTextEditors(element)[0];\n if (!textEditor) {\n throw new Error('can not find textEditor');\n }\n return textEditor;\n};\n\nexport const getTextMarksByElement = (element: PlaitElement) => {\n const editors = getTextEditors(element);\n const editor = editors[0];\n if (!editor) {\n return {};\n }\n if (editor.children.length === 0) {\n const textManage = getTextManages(element)[0];\n const currentMarks: Omit<CustomText, 'text'> = PlaitMarkEditor.getMarksByElement(textManage.componentRef.instance.children[0]);\n return currentMarks;\n }\n const currentMarks: Omit<CustomText, 'text'> = PlaitMarkEditor.getMarks(editor);\n return currentMarks;\n};\n","import { ComponentType, PlaitBoard, PlaitContextService, PlaitElement } from '@plait/core';\nimport { ImageBaseComponent } from '../core/image-base.component';\n\nexport interface CommonImageItem {\n url: string;\n width: number;\n height: number;\n}\n\nexport interface WithCommonPluginOptions {\n imageComponentType?: ComponentType<ImageBaseComponent>;\n}\n\nexport const selectImage = (\n board: PlaitBoard,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void,\n acceptImageTypes: string[] = ['png', 'jpeg', 'gif', 'bmp']\n) => {\n const inputFile = document.createElement('input');\n inputFile.setAttribute('type', 'file');\n const acceptImageTypesString = '.' + acceptImageTypes.join(',.');\n inputFile.setAttribute('accept', acceptImageTypesString);\n inputFile.onchange = (event: Event) => {\n buildImage(board, (event.target as any).files[0], defaultImageWidth, handle);\n };\n inputFile.click();\n};\n\nexport const buildImage = async (\n board: PlaitBoard,\n imageFile: File,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void\n) => {\n let width = 0,\n height = 0;\n await getImageSize(imageFile, defaultImageWidth).then((value: { width: number; height: number }) => {\n width = value.width;\n height = value.height;\n });\n\n let imageItem = null;\n const url = URL.createObjectURL(imageFile);\n const context = PlaitBoard.getComponent(board).viewContainerRef.injector.get(PlaitContextService);\n context.setUploadingFile({ url, file: imageFile });\n\n imageItem = {\n url,\n width,\n height\n };\n handle(imageItem);\n};\n\nfunction getImageSize(file: File, defaultImageWidth: number): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.src = URL.createObjectURL(file);\n\n image.onload = function() {\n const width = defaultImageWidth;\n const height = (defaultImageWidth * image.naturalHeight) / image.naturalWidth;\n resolve(\n image.naturalWidth > defaultImageWidth ? { width, height } : { width: image.naturalWidth, height: image.naturalHeight }\n );\n };\n });\n}\n\nconst BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE = new WeakMap<PlaitBoard, PlaitElement>();\n\nexport const getElementOfFocusedImage = (board: PlaitBoard) => {\n return BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.get(board);\n};\n\nexport const addElementOfFocusedImage = (board: PlaitBoard, element: PlaitElement) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.set(board, element);\n};\n\nexport const removeElementOfFocusedImage = (board: PlaitBoard) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.delete(board);\n};","import { PointNode } from './graph';\n\nexport class PriorityQueue {\n list: { node: PointNode; priority: number }[];\n\n constructor() {\n this.list = [];\n }\n\n enqueue(item: { node: PointNode; priority: number }) {\n this.list.push(item);\n this.list = this.list.sort((item1, item2) => item1.priority - item2.priority);\n }\n\n dequeue() {\n return this.list.shift();\n }\n}\n","import { Point } from '@plait/core';\nimport { PointGraph, PointNode } from './data-structures/graph';\nimport { PriorityQueue } from './data-structures/priority-queue';\n\nexport class AStar {\n cameFrom: Map<PointNode, PointNode>;\n\n constructor(private graph: PointGraph) {\n this.cameFrom = new Map<PointNode, PointNode>();\n }\n\n heuristic(a: Point, b: Point) {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n }\n\n search(start: Point, end: Point, previousStart: Point) {\n const frontier = new PriorityQueue();\n const startNode = this.graph.get(start);\n this.cameFrom = new Map<PointNode, PointNode>();\n const costSoFar = new Map<PointNode, number>();\n costSoFar.set(startNode!, 0);\n frontier.enqueue({ node: startNode!, priority: 0 });\n while (frontier.list.length > 0) {\n var current = frontier.dequeue();\n\n if (!current) {\n throw new Error(`can't find current`);\n }\n const currentPoint = current!.node.data;\n if (currentPoint[0] === end[0] && currentPoint[1] === end[1]) {\n break;\n }\n current.node.adjacentNodes.forEach(next => {\n let newCost = costSoFar.get(current!.node)! + this.heuristic(next.data, current!.node.data);\n const previousNode = this.cameFrom.get(current!.node);\n // 拐点权重,出现拐点则 cost + 1 以避免拐点路径\n // 以三点一线确定是否出现拐点\n const previousPoint = previousNode ? previousNode.data : previousStart;\n const x = previousPoint[0] === current?.node.data[0] && previousPoint[0] === next.data[0];\n const y = previousPoint[1] === current?.node.data[1] && previousPoint[1] === next.data[1];\n if (!x && !y) {\n newCost = newCost + 1;\n }\n if (!costSoFar.has(next) || (costSoFar.get(next) && newCost < costSoFar.get(next)!)) {\n costSoFar.set(next, newCost);\n const priority = newCost + this.heuristic(next.data, end);\n frontier.enqueue({ node: next, priority });\n this.cameFrom.set(next, current!.node);\n }\n });\n }\n }\n\n getRoute(start: Point, end: Point) {\n const result = [];\n let temp = end;\n while (temp[0] !== start[0] || temp[1] !== start[1]) {\n const node = this.graph.get(temp);\n const preNode = this.cameFrom.get(node!);\n result.unshift(preNode!.data);\n temp = preNode!.data;\n }\n return result;\n }\n}\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\n\nexport class PointNode {\n public distance = Number.MAX_SAFE_INTEGER;\n public adjacentNodes: PointNode[] = [];\n constructor(public data: Point) {}\n}\n\nexport class PointGraph {\n private index: { [x: string]: { [y: string]: PointNode } } = {};\n\n add(p: Point) {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (!(xs in this.index)) {\n this.index[xs] = {};\n }\n if (!(ys in this.index[xs])) {\n this.index[xs][ys] = new PointNode(p);\n }\n }\n connect(a: Point, b: Point) {\n const nodeA = this.get(a);\n const nodeB = this.get(b);\n\n if (!nodeA || !nodeB) {\n throw new Error(`A point was not found`);\n }\n\n nodeA.adjacentNodes.push(nodeB);\n }\n\n has(p: Point): boolean {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n return xs in this.index && ys in this.index[xs];\n }\n\n get(p: Point): PointNode | null {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (xs in this.index && ys in this.index[xs]) {\n return this.index[xs][ys];\n }\n\n return null;\n }\n}\n","import { Direction, Point, RectangleClient, downScale } from '@plait/core';\nimport { removeDuplicatePoints } from '../utils';\nimport { DEFAULT_ROUTE_MARGIN } from '../constants';\nimport { AStar, PointGraph } from '../algorithms';\n\nexport interface ElbowLineRouteOptions {\n sourcePoint: Point;\n nextSourcePoint: Point;\n sourceRectangle: RectangleClient;\n sourceOuterRectangle: RectangleClient;\n targetPoint: Point;\n nextTargetPoint: Point;\n targetOuterRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface RouteAdjustOptions {\n xAxis?: number;\n yAxis?: number;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface AdjustOptions {\n parallelPaths: [Point, Point][];\n pointOfHit: Point;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport const generateElbowLineRoute = (options: ElbowLineRouteOptions) => {\n const { nextSourcePoint, nextTargetPoint } = options;\n const points = getGraphPoints(options);\n const graph = createGraph(points);\n const aStar = new AStar(graph);\n aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);\n let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);\n route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];\n // 中线纠正: 基于水平中线/垂直中线纠正最短路径 route\n // 1. 找水平中线(xAxis)/垂直中线(yAxis)\n // 2. 在 route 中找到和 xAxis/yAxis 相交的点、在 route 中找和 xAxis/yAxis 平行的线段\n // 3. 基于步骤上一步找到的相交点和平行线构建矩形\n // 4. 判断矩形是否和元素相交,不相交则可以基于上步构建的矩形进行中线的映射\n // 5. 判断映射中线后的路径是否符合约束条件(拐点数据不能增加)\n const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);\n const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);\n const xAxis = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);\n const yAxis = isHitY ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, false);\n route = routeAdjust(route, { xAxis, yAxis, sourceRectangle: options.sourceRectangle, targetRectangle: options.targetRectangle });\n return route;\n};\n\nexport const routeAdjust = (path: Point[], options: RouteAdjustOptions) => {\n const { sourceRectangle, targetRectangle, xAxis, yAxis } = options;\n if (xAxis !== undefined) {\n const optionsX = getAdjustOptions(path, xAxis, true);\n const resultX =\n optionsX.pointOfHit &&\n adjust(path, { parallelPaths: optionsX.parallelPaths, pointOfHit: optionsX.pointOfHit, sourceRectangle, targetRectangle });\n if (resultX) {\n path = resultX;\n }\n }\n if (yAxis !== undefined) {\n const optionsY = getAdjustOptions(path, yAxis, false);\n const resultY =\n optionsY.pointOfHit &&\n adjust(path, { parallelPaths: optionsY.parallelPaths, pointOfHit: optionsY.pointOfHit, sourceRectangle, targetRectangle });\n if (resultY) {\n path = resultY;\n }\n }\n return path;\n};\n\nconst adjust = (route: Point[], options: AdjustOptions) => {\n const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;\n let result = null;\n parallelPaths.forEach(parallelPath => {\n // 构建矩形\n const tempRect = RectangleClient.toRectangleClient([pointOfHit, parallelPath[0], parallelPath[1]]);\n if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {\n const getCornerCount = (path: Point[]) => {\n let cornerCount = 0;\n for (let index = 1; index < path.length - 1; index++) {\n const pre = path[index - 1];\n const current = path[index];\n const next = path[index + 1];\n if (\n pre &&\n current &&\n next &&\n !(\n (downScale(current[0]) === downScale(pre[0]) && downScale(current[0]) === downScale(next[0])) ||\n (downScale(current[1]) === downScale(pre[1]) && downScale(current[1]) === downScale(next[1]))\n )\n ) {\n cornerCount++;\n }\n }\n return cornerCount;\n };\n const tempCorners = RectangleClient.getCornerPoints(tempRect);\n const indexRangeInPath: number[] = [];\n const indexRangeInCorner: number[] = [];\n route.forEach((point, index) => {\n const cornerResult = tempCorners.findIndex(\n corner => Math.floor(corner[0]) === Math.floor(point[0]) && Math.floor(corner[1]) === Math.floor(point[1])\n );\n if (cornerResult !== -1) {\n indexRangeInPath.push(index);\n indexRangeInCorner.push(cornerResult);\n }\n });\n const newPath = [...route];\n const missCorner = tempCorners.find((c, index) => !indexRangeInCorner.includes(index)) as Point;\n const removeLength = Math.abs(indexRangeInPath[0] - indexRangeInPath[indexRangeInPath.length - 1]) + 1;\n newPath.splice(indexRangeInPath[0] + 1, removeLength - 2, missCorner);\n const cornerCount = getCornerCount([...route]);\n const newCornerCount = getCornerCount([...newPath]);\n if (newCornerCount <= cornerCount) {\n result = newPath;\n }\n }\n return null;\n });\n return result;\n};\n\nconst getAdjustOptions = (path: Point[], middle: number, isHorizontal: boolean) => {\n const parallelPaths: [Point, Point][] = [];\n let start: null | Point = null;\n let pointOfHit: null | Point = null;\n const axis = isHorizontal ? 0 : 1;\n\n for (let index = 0; index < path.length; index++) {\n const previous = path[index - 1];\n const current = path[index];\n if (start === null && previous && previous[axis] === current[axis]) {\n start = previous;\n }\n if (start !== null) {\n if (previous[axis] !== current[axis]) {\n parallelPaths.push([start, previous]);\n start = null;\n }\n }\n if (current[axis] === middle) {\n pointOfHit = current;\n }\n }\n if (start) {\n parallelPaths.push([start, path[path.length - 1]]);\n }\n return { pointOfHit, parallelPaths };\n};\n\nexport const getGraphPoints = (options: ElbowLineRouteOptions) => {\n const { nextSourcePoint, nextTargetPoint, sourceOuterRectangle, targetOuterRectangle } = options;\n const x: number[] = [];\n const y: number[] = [];\n let result: Point[] = [];\n\n [sourceOuterRectangle, targetOuterRectangle].forEach(rectangle => {\n x.push(rectangle.x, rectangle.x + rectangle.width / 2, rectangle.x + rectangle.width);\n y.push(rectangle.y, rectangle.y + rectangle.height / 2, rectangle.y + rectangle.height);\n });\n const rectanglesX = [\n sourceOuterRectangle.x,\n sourceOuterRectangle.x + sourceOuterRectangle.width,\n targetOuterRectangle.x,\n targetOuterRectangle.x + targetOuterRectangle.width\n ].sort((a, b) => a - b);\n x.push((rectanglesX[1] + rectanglesX[2]) / 2, nextSourcePoint[0], nextTargetPoint[0]);\n const rectanglesY = [\n sourceOuterRectangle.y,\n sourceOuterRectangle.y + sourceOuterRectangle.height,\n targetOuterRectangle.y,\n targetOuterRectangle.y + targetOuterRectangle.height\n ].sort((a, b) => a - b);\n y.push((rectanglesY[1] + rectanglesY[2]) / 2, nextSourcePoint[1], nextTargetPoint[1]);\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n const point: Point = [x[i], y[j]];\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n if (!isInSource && !isInTarget) {\n result.push(point);\n }\n }\n }\n result = removeDuplicatePoints(result).filter(point => {\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n return !isInSource && !isInTarget;\n });\n return result;\n};\n\nexport const createGraph = (points: Point[]) => {\n const graph = new PointGraph();\n const Xs: number[] = [];\n const Ys: number[] = [];\n points.forEach(p => {\n const x = p[0],\n y = p[1];\n if (Xs.indexOf(x) < 0) Xs.push(x);\n if (Ys.indexOf(y) < 0) Ys.push(y);\n graph.add(p);\n });\n Xs.sort((a, b) => a - b);\n Ys.sort((a, b) => a - b);\n const inHotIndex = (p: Point): boolean => graph.has(p);\n for (let i = 0; i < Xs.length; i++) {\n for (let j = 0; j < Ys.length; j++) {\n const point: Point = [Xs[i], Ys[j]];\n if (!inHotIndex(point)) continue;\n if (i > 0) {\n const otherPoint: Point = [Xs[i - 1], Ys[j]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n if (j > 0) {\n const otherPoint: Point = [Xs[i], Ys[j - 1]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n }\n }\n return graph;\n};\n\nexport const reduceRouteMargin = (sourceRectangle: RectangleClient, targetRectangle: RectangleClient) => {\n const defaultOffset = DEFAULT_ROUTE_MARGIN;\n let sourceOffset: number[] = new Array(4).fill(defaultOffset);\n let targetOffset: number[] = new Array(4).fill(defaultOffset);\n const leftToRight = sourceRectangle.x - (targetRectangle.x + targetRectangle.width);\n const rightToLeft = targetRectangle.x - (sourceRectangle.x + sourceRectangle.width);\n if (leftToRight > 0 && leftToRight < defaultOffset * 2) {\n const offset = leftToRight / 2;\n sourceOffset[3] = offset;\n targetOffset[1] = offset;\n }\n\n if (rightToLeft > 0 && rightToLeft < defaultOffset * 2) {\n const offset = rightToLeft / 2;\n targetOffset[3] = offset;\n sourceOffset[1] = offset;\n }\n\n const topToBottom = sourceRectangle.y - (targetRectangle.y + targetRectangle.height);\n const bottomToTop = targetRectangle.y - (sourceRectangle.y + sourceRectangle.height);\n if (topToBottom > 0 && topToBottom < defaultOffset * 2) {\n const offset = topToBottom / 2;\n sourceOffset[0] = offset;\n targetOffset[2] = offset;\n }\n if (bottomToTop > 0 && bottomToTop < defaultOffset * 2) {\n const offset = bottomToTop / 2;\n sourceOffset[2] = offset;\n targetOffset[0] = offset;\n }\n return { sourceOffset, targetOffset };\n};\n\nexport const getNextPoint = (point: Point, outerRectangle: RectangleClient, direction: Direction): Point => {\n switch (direction) {\n case Direction.top: {\n return [point[0], outerRectangle.y];\n }\n case Direction.bottom: {\n return [point[0], outerRectangle.y + outerRectangle.height];\n }\n case Direction.right: {\n return [outerRectangle.x + outerRectangle.width, point[1]];\n }\n default: {\n return [outerRectangle.x, point[1]];\n }\n }\n};\n","import { PlaitElement } from '@plait/core';\n\nconst map = new Map<string, any>();\n\nexport const memorizeLatest = <T extends PlaitElement = PlaitElement>(\n memorizedKey: string,\n propertyKey: keyof T,\n propertyValue: T[keyof T]\n) => {\n let obj = map.has(memorizedKey) ? map.get(memorizedKey) : {};\n obj[propertyKey] = propertyValue;\n map.set(memorizedKey, obj);\n};\n\nexport const getMemorizedLatest = <T extends PlaitElement = PlaitElement>(memorizedKey: string): T => {\n return map.get(memorizedKey);\n};\n","import { Path, PlaitBoard, PlaitElement, Transforms, getSelectedElements } from '@plait/core';\nimport { memorizeLatest } from '../utils';\n\nexport interface SetOptions<T extends PlaitElement = PlaitElement> {\n callback?: (element: T, path: Path) => void;\n getMemorizeKey?: (element: T) => string;\n match?: (element: T) => boolean;\n}\n\nexport const setProperty = <T extends PlaitElement = PlaitElement>(board: PlaitBoard, properties: Partial<T>, options?: SetOptions<T>) => {\n const selectedElements = getSelectedElements(board) as T[];\n selectedElements.forEach(element => {\n if (options?.match && !options?.match(element)) return;\n const path = PlaitBoard.findPath(board, element);\n const memorizeKey = options?.getMemorizeKey ? options?.getMemorizeKey(element) : '';\n for (let key in properties) {\n memorizeKey && memorizeLatest(memorizeKey, key, properties[key]);\n }\n if (options?.callback) {\n options.callback(element, path);\n } else {\n Transforms.setNode(board, properties, path);\n }\n });\n};\n\nconst setStrokeStyle = (board: PlaitBoard, strokeStyle: string, options: SetOptions) => {\n setProperty(board, { strokeStyle }, options);\n};\n\nconst setFillColor = (board: PlaitBoard, fill: string, options: SetOptions) => {\n setProperty(board, { fill }, options);\n};\n\nconst setStrokeColor = (board: PlaitBoard, strokeColor: string, options: SetOptions) => {\n setProperty(board, { strokeColor }, options);\n};\n\nconst setStrokeWidth = (board: PlaitBoard, strokeWidth: number, options: SetOptions) => {\n setProperty(board, { strokeWidth }, options);\n};\n\nexport const PropertyTransforms = {\n setFillColor,\n setStrokeStyle,\n setProperty,\n setStrokeWidth,\n setStrokeColor\n};\n","import { Point } from '@plait/core';\n\nexport const normalizeShapePoints = (points: [Point, Point], shift: boolean = false): [Point, Point] => {\n let start = points[0];\n let end = points[1];\n if (shift) {\n const width = Math.abs(start[0] - end[0]);\n const height = Math.abs(start[1] - end[1]);\n const edge = Math.max(height, width);\n end = [start[0] + (end[0] > start[0] ? edge : -edge), start[1] + (end[1] > start[1] ? edge : -edge)];\n }\n\n const leftTopPoint: Point = [Math.min(start[0], end[0]), Math.min(start[1], end[1])];\n let rightBottomPoint: Point = [Math.max(start[0], end[0]), Math.max(start[1], end[1])];\n\n return [leftTopPoint, rightBottomPoint];\n};\n","import {\n MERGING,\n PRESS_AND_MOVE_BUFFER,\n PlaitBoard,\n PlaitElement,\n PlaitPointerType,\n Point,\n distanceBetweenPointAndPoint,\n isMainPointer,\n preventTouchMove,\n handleTouchTarget,\n throttleRAF,\n toPoint,\n transformPoint,\n ResizeCursorClass\n} from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\nimport { ResizeRef, addResizing, isResizing, removeResizing } from '../utils/resize';\n\nexport interface WithResizeOptions<T extends PlaitElement = PlaitElement, K = ResizeHandle> {\n key: string;\n canResize: () => boolean;\n detect: (point: Point) => ResizeDetectResult<T, K> | null;\n onResize: (resizeRef: ResizeRef<T, K>, resizeState: ResizeState) => void;\n afterResize?: (resizeRef: ResizeRef<T, K>) => void;\n beforeResize?: (resizeRef: ResizeRef<T, K>) => void;\n}\n\nexport interface ResizeDetectResult<T extends PlaitElement = PlaitElement, K = ResizeHandle> {\n element: T;\n handle: K;\n cursorClass?: ResizeCursorClass;\n}\n\nexport interface ResizeState {\n offsetX: number;\n offsetY: number;\n endTransformPoint: Point;\n}\n\nconst generalCanResize = (board: PlaitBoard, event: PointerEvent) => {\n return (\n !PlaitBoard.isReadonly(board) && !PlaitBoard.hasBeenTextEditing(board) && PlaitBoard.isPointer(board, PlaitPointerType.selection)\n );\n};\n\nexport const withResize = <T extends PlaitElement = PlaitElement, K = ResizeHandle>(\n board: PlaitBoard,\n options: WithResizeOptions<T, K>\n) => {\n const { pointerDown, pointerMove, globalPointerUp } = board;\n let resizeDetectResult: ResizeDetectResult<T, K> | null = null;\n let resizeRef: ResizeRef<T, K> | null = null;\n let startPoint: Point | null = null;\n let hoveDetectResult: ResizeDetectResult<T, K> | null = null;\n\n board.pointerDown = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event) || !isMainPointer(event)) {\n pointerDown(event);\n return;\n }\n const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));\n resizeDetectResult = options.detect(point);\n if (resizeDetectResult) {\n if (resizeDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${resizeDetectResult.cursorClass}`);\n }\n startPoint = [event.x, event.y];\n resizeRef = {\n path: PlaitBoard.findPath(board, resizeDetectResult.element),\n element: resizeDetectResult.element,\n handle: resizeDetectResult.handle\n };\n preventTouchMove(board, event, true);\n // prevent text from being selected when user pressed shift and pointer down\n event.preventDefault();\n return;\n }\n pointerDown(event);\n };\n\n board.pointerMove = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event)) {\n pointerMove(event);\n return;\n }\n if (startPoint && resizeDetectResult && !isResizing(board)) {\n // prevent text from being selected\n event.preventDefault();\n const endPoint = [event.x, event.y];;\n const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n if (distance > PRESS_AND_MOVE_BUFFER) {\n addResizing(board, resizeRef!, options.key);\n MERGING.set(board, true);\n options.beforeResize && options.beforeResize(resizeRef!);\n }\n }\n\n if (isResizing(board) && startPoint) {\n // prevent text from being selected\n event.preventDefault();\n const endTransformPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));\n throttleRAF(() => {\n const endPoint = [event.x, event.y];\n if (startPoint && resizeRef) {\n handleTouchTarget(board);\n const offsetX = endPoint[0] - startPoint[0];\n const offsetY = endPoint[1] - startPoint[1];\n options.onResize(resizeRef, { offsetX, offsetY, endTransformPoint });\n }\n });\n return;\n } else {\n const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));\n const resizeDetectResult = options.detect(point);\n if (resizeDetectResult) {\n if (hoveDetectResult && resizeDetectResult.cursorClass !== hoveDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoveDetectResult.cursorClass}`);\n }\n hoveDetectResult = resizeDetectResult;\n if (hoveDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${hoveDetectResult.cursorClass}`);\n }\n } else {\n if (hoveDetectResult) {\n if (hoveDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoveDetectResult.cursorClass}`);\n }\n hoveDetectResult = null;\n }\n }\n }\n pointerMove(event);\n };\n\n board.globalPointerUp = (event: PointerEvent) => {\n globalPointerUp(event);\n if (isResizing(board) || resizeDetectResult) {\n options.beforeResize && options.beforeResize(resizeRef!);\n removeResizing(board, options.key);\n startPoint = null;\n resizeDetectResult = null;\n resizeRef = null;\n MERGING.set(board, false);\n preventTouchMove(board, event, false);\n }\n };\n\n return board;\n};\n","import { PlaitBoard, PlaitElement, PlaitPluginElementComponent } from '@plait/core';\nimport { TextManage } from '@plait/text';\n\nexport abstract class CommonPluginElement<\n T extends PlaitElement = PlaitElement,\n K extends PlaitBoard = PlaitBoard\n> extends PlaitPluginElementComponent<T, K> {\n private textManages: TextManage[] = [];\n\n initializeTextManages(textManages: TextManage[]) {\n this.textManages = textManages;\n }\n\n addTextManage(textManage: TextManage) {\n this.textManages.push(textManage);\n }\n\n destroyTextManages() {\n this.getTextManages().forEach(manage => {\n manage.destroy();\n });\n this.textManages = [];\n }\n\n getTextManages() {\n return this.textManages;\n }\n}\n","import { ChangeDetectorRef, Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ACTIVE_STROKE_WIDTH, PlaitBoard, PlaitElement, RectangleClient, getSelectedElements, isSelectionMoving } from '@plait/core';\nimport { ActiveGenerator } from '../generators';\nimport { CommonImageItem } from '../utils';\n\n@Directive({\n host: {\n class: 'plait-image-container'\n }\n})\nexport abstract class ImageBaseComponent implements OnInit, OnDestroy {\n _imageItem!: CommonImageItem;\n\n _isFocus!: boolean;\n\n initialized = false;\n\n activeGenerator!: ActiveGenerator;\n\n @Input()\n element!: PlaitElement;\n\n @Input()\n set imageItem(value: CommonImageItem) {\n this.afterImageItemChange(this._imageItem, value);\n this._imageItem = value;\n this.drawFocus();\n }\n\n get imageItem() {\n return this._imageItem;\n }\n\n @Input()\n board!: PlaitBoard;\n\n @Input()\n set isFocus(value: boolean) {\n this._isFocus = value;\n this.drawFocus();\n }\n\n get isFocus() {\n return this._isFocus;\n }\n\n get nativeElement() {\n return this.elementRef.nativeElement;\n }\n\n abstract afterImageItemChange(previous: CommonImageItem, current: CommonImageItem): void;\n\n @Input() getRectangle!: () => RectangleClient;\n\n @Input() hasResizeHandle!: () => boolean;\n\n constructor(protected elementRef: ElementRef<HTMLElement>, public cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.activeGenerator = new ActiveGenerator(this.board, {\n getStrokeWidth: () => {\n const selectedElements = getSelectedElements(this.board);\n if (!(selectedElements.length === 1 && !isSelectionMoving(this.board))) {\n return ACTIVE_STROKE_WIDTH;\n } else {\n return ACTIVE_STROKE_WIDTH;\n }\n },\n getStrokeOpacity: () => {\n const selectedElements = getSelectedElements(this.board);\n if ((selectedElements.length === 1 && !isSelectionMoving(this.board)) || !selectedElements.length) {\n return 1;\n } else {\n return 0.5;\n }\n },\n getRectangle: () => {\n return this.getRectangle();\n },\n hasResizeHandle: () => {\n const selectedElements = getSelectedElements(this.board);\n return (selectedElements.length === 1 && !isSelectionMoving(this.board)) || !selectedElements.length;\n }\n });\n this.initialized = true;\n }\n\n drawFocus() {\n if (this.initialized) {\n const activeG = PlaitBoard.getElementActiveHost(this.board);\n this.activeGenerator.processDrawing({} as PlaitElement, activeG, { selected: this._isFocus });\n }\n }\n\n ngOnDestroy(): void {\n if (this.activeGenerator) {\n this.activeGenerator.destroy();\n }\n }\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './constants';\nexport * from './generators';\nexport * from './transforms';\nexport * from './shapes';\nexport * from './plugins';\nexport * from './utils';\nexport * from './core/plugin-element';\nexport * from './core/image-base.component';\nexport * from './algorithms'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plait-common.mjs","sources":["../../../packages/common/src/constants/default.ts","../../../packages/common/src/constants/media.ts","../../../packages/common/src/constants/resize.ts","../../../packages/common/src/generators/generator.ts","../../../packages/common/src/generators/active.generator.ts","../../../packages/common/src/generators/image.generator.ts","../../../packages/common/src/utils/resize.ts","../../../packages/common/src/utils/direction.ts","../../../packages/common/src/utils/line-path.ts","../../../packages/common/src/utils/hot-key.ts","../../../packages/common/src/utils/rectangle.ts","../../../packages/common/src/utils/creation-mode.ts","../../../packages/common/src/utils/text.ts","../../../packages/common/src/utils/image.ts","../../../packages/common/src/algorithms/data-structures/priority-queue.ts","../../../packages/common/src/algorithms/a-star.ts","../../../packages/common/src/algorithms/data-structures/graph.ts","../../../packages/common/src/utils/elbow-line-route.ts","../../../packages/common/src/utils/memorize.ts","../../../packages/common/src/transforms/property.ts","../../../packages/common/src/transforms/align.ts","../../../packages/common/src/shapes/common.ts","../../../packages/common/src/plugins/with-resize.ts","../../../packages/common/src/core/plugin-element.ts","../../../packages/common/src/core/image-base.component.ts","../../../packages/common/src/public-api.ts","../../../packages/common/src/plait-common.ts"],"sourcesContent":["export const BASE = 4;\nexport const PRIMARY_COLOR = '#6698FF';\nexport const RESIZE_HANDLE_DIAMETER = 8;\nexport const WithTextPluginKey = 'plait-text-plugin-key';\nexport const DEFAULT_ROUTE_MARGIN = 30;\nexport const TRANSPARENT = 'transparent';\n","export enum MediaKeys {\n image = 'image'\n}\n\nexport const PICTURE_ACCEPTED_UPLOAD_SIZE = 20;\n\nexport const acceptImageTypes = ['png', 'jpeg', 'gif', 'bmp'];\n\nexport const WithCommonPluginKey = 'plait-common-plugin-key';\n","export enum ResizeHandle {\n ne = 'ne',\n n = 'n',\n nw = 'nw',\n e = 'e',\n se = 'se',\n s = 's',\n sw = 'sw',\n w = 'w'\n}\n","import { PlaitBoard, PlaitElement } from '@plait/core';\n\nexport interface GeneratorExtraData {}\n\nexport interface GeneratorOptions { prepend?: boolean }\n\nexport abstract class Generator<\n T extends PlaitElement = PlaitElement,\n K extends GeneratorExtraData = GeneratorExtraData,\n V extends GeneratorOptions = GeneratorOptions\n> {\n g?: SVGGElement;\n\n protected options?: V;\n\n constructor(protected board: PlaitBoard, options?: V) {\n this.options = options;\n }\n\n processDrawing(element: T, parentG: SVGGElement, data?: K) {\n if (this.canDraw && this.canDraw(element, data)) {\n const g = this.draw(element, data);\n if (g) {\n if (this.g && parentG.contains(this.g)) {\n this.g.replaceWith(g);\n } else {\n if (this.options?.prepend) {\n parentG.prepend(g);\n } else {\n parentG.appendChild(g);\n }\n }\n this.g = g;\n } else {\n this.destroy();\n }\n if (hasAfterDraw(this)) {\n this.afterDraw(element);\n }\n } else {\n this.destroy();\n }\n }\n\n /**\n * abstract function\n */\n protected abstract canDraw(element: T, data?: K): boolean;\n\n /**\n * abstract function\n */\n protected abstract draw(element: T, data?: K): SVGGElement | undefined;\n\n destroy() {\n if (this.g) {\n this.g.remove();\n this.g = undefined;\n }\n }\n}\n\nexport interface AfterDraw<T extends PlaitElement = PlaitElement> {\n afterDraw(element: T): void;\n}\n\nexport function hasAfterDraw(value: any): value is AfterDraw {\n if (value.afterDraw) {\n return true;\n }\n return false;\n}\n","import { PlaitBoard, PlaitElement, RectangleClient, createG, drawCircle, drawRectangle } from '@plait/core';\nimport { Generator, GeneratorOptions } from './generator';\nimport { PRIMARY_COLOR, RESIZE_HANDLE_DIAMETER } from '../constants/default';\nimport { Options } from 'roughjs/bin/core';\n\nexport interface ActiveGeneratorExtraData {\n selected: boolean;\n}\n\nexport interface ActiveGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getStrokeWidth: () => number;\n getStrokeOpacity: () => number;\n hasResizeHandle: () => boolean;\n}\n\nexport class ActiveGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n ActiveGeneratorExtraData,\n ActiveGeneratorOptions<T> & GeneratorOptions\n> {\n hasResizeHandle = false;\n\n constructor(public board: PlaitBoard, public options: ActiveGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T, data: ActiveGeneratorExtraData): boolean {\n if (data.selected) {\n return true;\n } else {\n return false;\n }\n }\n\n draw(element: T, data: ActiveGeneratorExtraData): SVGGElement {\n const activeG = createG();\n const rectangle = this.options.getRectangle(element);\n\n const delta = this.options.getStrokeWidth();\n const activeRectangle = RectangleClient.inflate(rectangle, delta);\n\n const strokeG = drawRectangle(this.board, activeRectangle, {\n stroke: PRIMARY_COLOR,\n strokeWidth: delta\n });\n\n activeG.append(strokeG);\n strokeG.style.opacity = `${this.options.getStrokeOpacity()}`;\n if (this.options.hasResizeHandle()) {\n this.hasResizeHandle = true;\n // resize handle\n const options: Options = { stroke: '#999999', strokeWidth: 1, fill: '#FFF', fillStyle: 'solid' };\n const leftTopHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x, activeRectangle.y],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n const rightTopHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x + activeRectangle.width, activeRectangle.y],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n const rightBottomHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x + activeRectangle.width, activeRectangle.y + activeRectangle.height],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n const leftBottomHandleG = drawCircle(\n PlaitBoard.getRoughSVG(this.board),\n [activeRectangle.x, activeRectangle.y + activeRectangle.height],\n RESIZE_HANDLE_DIAMETER,\n options\n );\n activeG.append(...[leftTopHandleG, rightTopHandleG, rightBottomHandleG, leftBottomHandleG]);\n } else {\n this.hasResizeHandle = false;\n }\n return activeG;\n }\n}\n","import {\n PlaitBoard,\n PlaitElement,\n PlaitOptionsBoard,\n RectangleClient,\n createForeignObject,\n createG,\n updateForeignObject\n} from '@plait/core';\nimport { Generator, GeneratorOptions } from './generator';\nimport { ComponentRef, ViewContainerRef } from '@angular/core';\nimport { ImageBaseComponent } from '../core/image-base.component';\nimport { CommonImageItem, WithCommonPluginOptions } from '../utils';\nimport { WithCommonPluginKey } from '../constants';\nexport interface ShapeData {\n viewContainerRef: ViewContainerRef;\n}\n\nexport interface ImageGeneratorOptions<T> {\n getRectangle: (element: T) => RectangleClient;\n getImageItem: (element: T) => CommonImageItem;\n}\n\nexport class ImageGenerator<T extends PlaitElement = PlaitElement> extends Generator<\n T,\n ViewContainerRef,\n ImageGeneratorOptions<T> & GeneratorOptions\n> {\n foreignObject!: SVGForeignObjectElement;\n\n componentRef!: ComponentRef<ImageBaseComponent>;\n\n constructor(public board: PlaitBoard, public options: ImageGeneratorOptions<T>) {\n super(board, options);\n }\n\n canDraw(element: T, data: ViewContainerRef): boolean {\n return !!this.options.getImageItem(element);\n }\n\n draw(element: T, viewContainerRef: ViewContainerRef): SVGGElement {\n const g = createG();\n const foreignRectangle = this.options.getRectangle(element);\n this.foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);\n g.append(this.foreignObject);\n const componentType = (this.board as PlaitOptionsBoard).getPluginOptions<WithCommonPluginOptions>(WithCommonPluginKey)\n .imageComponentType;\n if (!componentType) {\n throw new Error('Not implement ImageBaseComponent error.');\n }\n this.componentRef = viewContainerRef.createComponent(componentType);\n this.componentRef.instance.board = this.board;\n\n this.componentRef.instance.imageItem = this.options.getImageItem(element);\n this.componentRef.instance.element = element;\n this.componentRef.instance.getRectangle = () => {\n return this.options.getRectangle(element);\n };\n this.componentRef.instance.cdr.markForCheck();\n this.foreignObject.append(this.componentRef!.instance.nativeElement);\n return g;\n }\n\n updateImage(nodeG: SVGGElement, previous: T, current: T) {\n if (previous !== current && this.componentRef) {\n this.componentRef.instance.imageItem = this.options.getImageItem(current);\n this.componentRef!.instance.getRectangle = () => {\n return this.options.getRectangle(current);\n };\n }\n const currentForeignObject = this.options.getRectangle(current);\n updateForeignObject(\n this.g!,\n currentForeignObject.width,\n currentForeignObject.height,\n currentForeignObject.x,\n currentForeignObject.y\n );\n // solve image lose on move node\n if (this.foreignObject.children.length === 0) {\n this.foreignObject.append(this.componentRef!.instance.nativeElement);\n }\n this.componentRef?.instance.cdr.markForCheck();\n }\n\n destroy(): void {\n super.destroy();\n this.componentRef?.destroy();\n }\n}\n","import { Path, PlaitBoard, PlaitElement, Point, RectangleClient, ResizeCursorClass, setDragging } from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\n\nexport interface ResizeRef<T extends PlaitElement = PlaitElement, K = ResizeHandle> {\n element: T;\n path: Path;\n handle: K;\n}\n\nconst getResizeHandleByIndex = (index: number) => {\n switch (index) {\n case 0:\n return ResizeHandle.nw;\n case 1:\n return ResizeHandle.ne;\n case 2:\n return ResizeHandle.se;\n case 3:\n return ResizeHandle.sw;\n case 4:\n return ResizeHandle.n;\n case 5:\n return ResizeHandle.e;\n case 6:\n return ResizeHandle.s;\n case 7:\n return ResizeHandle.w;\n default:\n return null;\n }\n};\n\nconst getResizeCursorClassByIndex = (index: number) => {\n switch (index) {\n case 0:\n case 2:\n return ResizeCursorClass.nwse;\n case 1:\n case 3:\n return ResizeCursorClass.nesw;\n case 4:\n case 6:\n return ResizeCursorClass.ns;\n case 5:\n case 7:\n return ResizeCursorClass.ew;\n default:\n return null;\n }\n};\n\nexport const getRectangleResizeHandleRefs = (rectangle: RectangleClient, diameter: number) => {\n const corners = RectangleClient.getCornerPoints(rectangle);\n const refs = corners.map((corner, index: number) => {\n return {\n rectangle: {\n x: corner[0] - diameter / 2,\n y: corner[1] - diameter / 2,\n width: diameter,\n height: diameter\n },\n handle: getResizeHandleByIndex(index) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index) as ResizeCursorClass\n };\n });\n const rectangles = getResizeSideRectangles(corners, diameter / 2);\n refs.push(\n ...rectangles.map((rectangle, index) => {\n return {\n rectangle,\n handle: getResizeHandleByIndex(index + 4) as ResizeHandle,\n cursorClass: getResizeCursorClassByIndex(index + 4) as ResizeCursorClass\n };\n })\n );\n return refs;\n};\n\nconst getResizeSideRectangles = (cornerPoints: Point[], offset: number): RectangleClient[] => {\n const result = [];\n for (let i = 0; i < cornerPoints.length; i++) {\n let rectangle = RectangleClient.toRectangleClient([cornerPoints[i], cornerPoints[(i + 1) % 4]]);\n const arr = new Array(2).fill(0);\n arr[(i + 1) % 2] = offset / 2;\n rectangle = RectangleClient.expand(rectangle, arr[0], arr[1]);\n result.push(rectangle);\n }\n return result;\n};\n\nexport const IS_RESIZING = new WeakMap<PlaitBoard, ResizeRef<any, any>>();\n\nexport const isResizing = (board: PlaitBoard) => {\n return !!IS_RESIZING.get(board);\n};\n\nexport const isResizingByCondition = <T extends PlaitElement, K>(board: PlaitBoard, match: (resizeRef: ResizeRef<T, K>) => boolean) => {\n return isResizing(board) && match(IS_RESIZING.get(board)!);\n};\n\nexport const addResizing = <T extends PlaitElement, K>(board: PlaitBoard, resizeRef: ResizeRef<T, K>, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.add(`${key}-resizing`);\n IS_RESIZING.set(board, resizeRef);\n setDragging(board, true);\n};\n\nexport const removeResizing = (board: PlaitBoard, key: string) => {\n PlaitBoard.getBoardContainer(board).classList.remove(`${key}-resizing`);\n IS_RESIZING.delete(board);\n setDragging(board, false);\n};\n","import { Direction, Point, PointOfRectangle, Vector, distanceBetweenPointAndPoint } from '@plait/core';\n\nconst handleDirectionFactors = {\n [Direction.left]: { x: -1, y: 0 },\n [Direction.right]: { x: 1, y: 0 },\n [Direction.top]: { x: 0, y: -1 },\n [Direction.bottom]: { x: 0, y: 1 }\n};\n\nexport function getDirectionByPointOfRectangle(point: PointOfRectangle): Direction | undefined {\n if (point[0] === 0) {\n return Direction.left;\n }\n if (point[0] === 1) {\n return Direction.right;\n }\n if (point[1] === 0) {\n return Direction.top;\n }\n if (point[1] === 1) {\n return Direction.bottom;\n }\n return undefined;\n}\n\n/**\n * this function accepts vector parameter, the vector parameter vector is based on the screen coordinate system\n * vector[0] and vector[1] are the x and y components of the vector respectively.\n * if the vector has only one direction, the function returns a string in that direction, such as 'right', 'top', 'bottom' or 'left'.\n * if the vector has two directions, the function will return the string in which direction it is closer.\n */\nexport function getDirectionByVector(vector: Vector): Direction | null {\n const x = vector[0];\n const y = vector[1];\n if (x === 0 && y === 0) {\n return null;\n }\n if (x === 0) {\n return y > 0 ? Direction.bottom : Direction.top;\n }\n if (y === 0) {\n return x > 0 ? Direction.right : Direction.left;\n }\n const angle = Math.atan2(y, x);\n if (angle > -Math.PI / 4 && angle <= Math.PI / 4) {\n return Direction.right;\n } else if (angle > Math.PI / 4 && angle <= (3 * Math.PI) / 4) {\n return Direction.bottom;\n } else if (angle > (-3 * Math.PI) / 4 && angle <= -Math.PI / 4) {\n return Direction.top;\n } else {\n return Direction.left;\n }\n}\n\nexport function getPointByVector(point: Point, vector: Vector, offset: number): Point {\n const distance = Math.hypot(vector[0], vector[1]);\n return [point[0] + (vector[0] / distance) * offset, point[1] + (vector[1] / distance) * offset];\n}\n\nexport function rotateVectorAnti90(vector: Vector): Vector {\n const x = vector[0];\n const y = vector[1];\n const rotatedX = y;\n const rotatedY = -x;\n return [rotatedX, rotatedY];\n}\n\nexport function getDirectionBetweenPointAndPoint(source: Point, target: Point) {\n if (source[0] === target[0]) {\n if (source[1] >= target[1]) {\n return Direction.top;\n } else {\n return Direction.bottom;\n }\n }\n if (source[1] === target[1]) {\n if (source[0] >= target[0]) {\n return Direction.left;\n } else {\n return Direction.right;\n }\n }\n throw new Error('can not match direction');\n}\n\nexport function getDirectionFactor(direction: Direction) {\n return handleDirectionFactors[direction];\n}\n\nexport function getFactorByPoints(source: Point, target: Point) {\n const distance = distanceBetweenPointAndPoint(...source, ...target);\n if (Point.isEquals(source, target)) {\n return {\n x: 1,\n y: 1\n };\n }\n return {\n x: (target[0] - source[0]) / distance,\n y: (target[1] - source[1]) / distance\n };\n}\n","import { Direction, Point, distanceBetweenPointAndPoint } from '@plait/core';\nimport { getDirectionFactor } from './direction';\n\nexport function getOppositeDirection(direction: Direction) {\n switch (direction) {\n case Direction.left:\n return Direction.right;\n case Direction.right:\n return Direction.left;\n case Direction.top:\n return Direction.bottom;\n case Direction.bottom:\n return Direction.top;\n }\n}\n\nexport const getPoints = (source: Point, sourcePosition: Direction, target: Point, targetPosition: Direction, offset: number) => {\n const sourceDir = getDirectionFactor(sourcePosition);\n const targetDir = getDirectionFactor(targetPosition);\n const sourceGapped: Point = [source[0] + sourceDir.x * offset, source[1] + sourceDir.y * offset];\n const targetGapped: Point = [target[0] + targetDir.x * offset, target[1] + targetDir.y * offset];\n const dir = getDirection(sourceGapped, sourcePosition, targetGapped);\n const dirAccessor = dir.x !== 0 ? 'x' : 'y';\n const currDir = dir[dirAccessor];\n\n let points: Point[] = [];\n let centerX, centerY;\n const [defaultCenterX, defaultCenterY] = getEdgeCenter({\n sourceX: source[0],\n sourceY: source[1],\n targetX: target[0],\n targetY: target[1]\n });\n // opposite handle positions, default case\n if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) {\n centerX = defaultCenterX;\n centerY = defaultCenterY;\n // --->\n // |\n // >---\n const verticalSplit: Point[] = [\n [centerX, sourceGapped[1]],\n [centerX, targetGapped[1]]\n ];\n // |\n // ---\n // |\n const horizontalSplit: Point[] = [\n [sourceGapped[0], centerY],\n [targetGapped[0], centerY]\n ];\n if (sourceDir[dirAccessor] === currDir) {\n points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;\n } else {\n points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;\n }\n } else {\n // sourceTarget means we take x from source and y from target, targetSource is the opposite\n const sourceTarget: Point[] = [[sourceGapped[0], targetGapped[1]]];\n const targetSource: Point[] = [[targetGapped[0], sourceGapped[1]]];\n // this handles edges with same handle positions\n if (dirAccessor === 'x') {\n points = sourceDir.x === currDir ? targetSource : sourceTarget;\n } else {\n points = sourceDir.y === currDir ? sourceTarget : targetSource;\n }\n\n // these are conditions for handling mixed handle positions like right -> bottom for example\n let flipSourceTarget;\n if (sourcePosition !== targetPosition) {\n const dirAccessorOpposite = dirAccessor === 'x' ? 1 : 0;\n const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessor === 'x' ? 'y' : 'x'];\n const sourceGtTargetOppo = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];\n const sourceLtTargetOppo = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];\n flipSourceTarget =\n (sourceDir[dirAccessor] === 1 && ((!isSameDir && sourceGtTargetOppo) || (isSameDir && sourceLtTargetOppo))) ||\n (sourceDir[dirAccessor] !== 1 && ((!isSameDir && sourceLtTargetOppo) || (isSameDir && sourceGtTargetOppo)));\n\n if (flipSourceTarget) {\n points = dirAccessor === 'x' ? sourceTarget : targetSource;\n }\n }\n }\n return [source, sourceGapped, ...points, targetGapped, target];\n};\n\nexport const getDirection = (source: Point, sourcePosition = Direction.bottom, target: Point) => {\n if (sourcePosition === Direction.left || sourcePosition === Direction.right) {\n return source[0] < target[0] ? { x: 1, y: 0 } : { x: -1, y: 0 };\n }\n return source[1] < target[1] ? { x: 0, y: 1 } : { x: 0, y: -1 };\n};\n\nexport function getEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY\n}: {\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n}): [number, number, number, number] {\n const xOffset = Math.abs(targetX - sourceX) / 2;\n const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;\n\n const yOffset = Math.abs(targetY - sourceY) / 2;\n const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;\n\n return [centerX, centerY, xOffset, yOffset];\n}\n\nexport function getPointOnPolyline(points: Point[], ratio: number) {\n const totalLength = calculatePolylineLength(points);\n const targetDistance = totalLength * ratio;\n\n let accumulatedDistance = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n const segmentLength = distanceBetweenPointAndPoint(x1, y1, x2, y2);\n\n if (accumulatedDistance + segmentLength >= targetDistance) {\n const remainingDistance = targetDistance - accumulatedDistance;\n const ratioInSegment = remainingDistance / segmentLength;\n\n const targetX = x1 + (x2 - x1) * ratioInSegment;\n const targetY = y1 + (y2 - y1) * ratioInSegment;\n return [targetX, targetY];\n }\n\n accumulatedDistance += segmentLength;\n }\n\n return points[points.length - 1];\n}\n\nexport function calculatePolylineLength(points: Point[]) {\n let length = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n length += distanceBetweenPointAndPoint(x1, y1, x2, y2);\n }\n return length;\n}\n\nexport function getRatioByPoint(points: Point[], point: Point) {\n const totalLength = calculatePolylineLength(points);\n\n let distance = 0;\n\n for (let i = 0; i < points.length - 1; i++) {\n const isOverlap = isPointOnLineSegment(point, points[i], points[i + 1]);\n\n if (isOverlap) {\n distance += distanceBetweenPointAndPoint(point[0], point[1], points[i][0], points[i][1]);\n return distance / totalLength;\n } else {\n distance += distanceBetweenPointAndPoint(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1]);\n }\n }\n throw new Error('Cannot get ratio by point');\n}\n\nexport function isPointOnLineSegment(point: Point, startPoint: Point, endPoint: Point) {\n const distanceToStart = distanceBetweenPointAndPoint(point[0], point[1], startPoint[0], startPoint[1]);\n const distanceToEnd = distanceBetweenPointAndPoint(point[0], point[1], endPoint[0], endPoint[1]);\n\n const segmentLength = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n\n return Math.abs(distanceToStart + distanceToEnd - segmentLength) < 0.1;\n}\n\nexport const removeDuplicatePoints = (points: Point[]) => {\n const newArray: Point[] = [];\n points.forEach(point => {\n const index = newArray.findIndex(otherPoint => {\n return Point.isEquals(point, otherPoint);\n });\n if (index === -1) newArray.push(point);\n });\n return newArray;\n};\n\nexport const getExtendPoint = (source: Point, target: Point, extendDistance: number): Point => {\n const distance = distanceBetweenPointAndPoint(...source, ...target);\n const isEqual = Point.isEquals(source, target);\n const sin = isEqual ? 1 : (target[1] - source[1]) / distance;\n const cos = isEqual ? 1 : (target[0] - source[0]) / distance;\n return [source[0] + extendDistance * cos, source[1] + extendDistance * sin];\n};\n","import { hotkeys } from '@plait/core';\nimport { isKeyHotkey } from 'is-hotkey';\n\nexport function isVirtualKey(e: KeyboardEvent) {\n const isMod = e.ctrlKey || e.metaKey;\n const isAlt = isKeyHotkey('alt', e);\n const isShift = isKeyHotkey('shift', e);\n const isCapsLock = e.key.includes('CapsLock');\n const isTab = e.key.includes('Tab');\n const isEsc = e.key.includes('Escape');\n const isF = e.key.startsWith('F');\n const isArrow = e.key.includes('Arrow') ? true : false;\n return isCapsLock || isMod || isAlt || isArrow || isShift || isTab || isEsc || isF;\n}\n\nexport const isExpandHotkey = (event: KeyboardEvent) => {\n return isKeyHotkey('mod+/', event);\n};\n\nexport const isTabHotkey = (event: KeyboardEvent) => {\n return event.key === 'Tab';\n};\n\nexport const isEnterHotkey = (event: KeyboardEvent) => {\n return event.key === 'Enter';\n};\n\nexport const isSpaceHotkey = (event: KeyboardEvent) => {\n return event.code === 'Space';\n};\n\nexport const isDelete = (event: KeyboardEvent) => {\n return hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event);\n};\n","import { Point } from '@plait/core';\n\nexport const getRectangleByPoints = (points: Point[]) => {\n let minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity;\n points.forEach(point => {\n minX = Math.min(point[0], minX);\n maxX = Math.max(point[0], maxX);\n minY = Math.min(point[1], minY);\n maxY = Math.max(point[1], maxY);\n });\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n};\n","import { PlaitBoard } from '@plait/core';\n\nexport enum BoardCreationMode {\n 'dnd' = 'dnd',\n 'drawing' = 'drawing'\n}\n\nconst BOARD_TO_CREATION_MODE: WeakMap<PlaitBoard, BoardCreationMode> = new WeakMap();\n\nexport const getCreationMode = (board: PlaitBoard) => {\n return BOARD_TO_CREATION_MODE.get(board);\n};\n\nexport const setCreationMode = (board: PlaitBoard, mode: BoardCreationMode) => {\n BOARD_TO_CREATION_MODE.set(board, mode);\n};\n\nexport const isDndMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.dnd;\n};\n\nexport const isDrawingMode = (board: PlaitBoard) => {\n return getCreationMode(board) === BoardCreationMode.drawing;\n};\n","import { PlaitElement } from '@plait/core';\nimport { CommonPluginElement } from '../core/plugin-element';\nimport { CustomText, PlaitMarkEditor } from '@plait/text';\n\nexport const getTextManages = (element: PlaitElement) => {\n const component = PlaitElement.getComponent(element) as CommonPluginElement;\n return component.getTextManages();\n};\n\nexport const getFirstTextManage = (element: PlaitElement) => {\n const textManage = getTextManages(element)[0];\n if (!textManage) {\n throw new Error('can not find textManage');\n }\n return textManage;\n};\n\nexport const getTextEditors = (element: PlaitElement) => {\n return getTextManages(element).map(manage => {\n return manage.componentRef.instance.editor;\n });\n};\n\nexport const getFirstTextEditor = (element: PlaitElement) => {\n const textEditor = getTextEditors(element)[0];\n if (!textEditor) {\n throw new Error('can not find textEditor');\n }\n return textEditor;\n};\n\nexport const getTextMarksByElement = (element: PlaitElement) => {\n const editors = getTextEditors(element);\n const editor = editors[0];\n if (!editor) {\n return {};\n }\n if (editor.children.length === 0) {\n const textManage = getTextManages(element)[0];\n const currentMarks: Omit<CustomText, 'text'> = PlaitMarkEditor.getMarksByElement(textManage.componentRef.instance.children[0]);\n return currentMarks;\n }\n const currentMarks: Omit<CustomText, 'text'> = PlaitMarkEditor.getMarks(editor);\n return currentMarks;\n};\n","import { ComponentType, PlaitBoard, PlaitContextService, PlaitElement } from '@plait/core';\nimport { ImageBaseComponent } from '../core/image-base.component';\n\nexport interface CommonImageItem {\n url: string;\n width: number;\n height: number;\n}\n\nexport interface WithCommonPluginOptions {\n imageComponentType?: ComponentType<ImageBaseComponent>;\n}\n\nexport const selectImage = (\n board: PlaitBoard,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void,\n acceptImageTypes: string[] = ['png', 'jpeg', 'gif', 'bmp']\n) => {\n const inputFile = document.createElement('input');\n inputFile.setAttribute('type', 'file');\n const acceptImageTypesString = '.' + acceptImageTypes.join(',.');\n inputFile.setAttribute('accept', acceptImageTypesString);\n inputFile.onchange = (event: Event) => {\n buildImage(board, (event.target as any).files[0], defaultImageWidth, handle);\n };\n inputFile.click();\n};\n\nexport const buildImage = async (\n board: PlaitBoard,\n imageFile: File,\n defaultImageWidth: number,\n handle: (commonImage: CommonImageItem) => void\n) => {\n let width = 0,\n height = 0;\n await getImageSize(imageFile, defaultImageWidth).then((value: { width: number; height: number }) => {\n width = value.width;\n height = value.height;\n });\n\n let imageItem = null;\n const url = URL.createObjectURL(imageFile);\n const context = PlaitBoard.getComponent(board).viewContainerRef.injector.get(PlaitContextService);\n context.setUploadingFile({ url, file: imageFile });\n\n imageItem = {\n url,\n width,\n height\n };\n handle(imageItem);\n};\n\nfunction getImageSize(file: File, defaultImageWidth: number): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.src = URL.createObjectURL(file);\n\n image.onload = function() {\n const width = defaultImageWidth;\n const height = (defaultImageWidth * image.naturalHeight) / image.naturalWidth;\n resolve(\n image.naturalWidth > defaultImageWidth ? { width, height } : { width: image.naturalWidth, height: image.naturalHeight }\n );\n };\n });\n}\n\nconst BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE = new WeakMap<PlaitBoard, PlaitElement>();\n\nexport const getElementOfFocusedImage = (board: PlaitBoard) => {\n return BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.get(board);\n};\n\nexport const addElementOfFocusedImage = (board: PlaitBoard, element: PlaitElement) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.set(board, element);\n};\n\nexport const removeElementOfFocusedImage = (board: PlaitBoard) => {\n BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.delete(board);\n};","import { PointNode } from './graph';\n\nexport class PriorityQueue {\n list: { node: PointNode; priority: number }[];\n\n constructor() {\n this.list = [];\n }\n\n enqueue(item: { node: PointNode; priority: number }) {\n this.list.push(item);\n this.list = this.list.sort((item1, item2) => item1.priority - item2.priority);\n }\n\n dequeue() {\n return this.list.shift();\n }\n}\n","import { Point } from '@plait/core';\nimport { PointGraph, PointNode } from './data-structures/graph';\nimport { PriorityQueue } from './data-structures/priority-queue';\n\nexport class AStar {\n cameFrom: Map<PointNode, PointNode>;\n\n constructor(private graph: PointGraph) {\n this.cameFrom = new Map<PointNode, PointNode>();\n }\n\n heuristic(a: Point, b: Point) {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n }\n\n search(start: Point, end: Point, previousStart: Point) {\n const frontier = new PriorityQueue();\n const startNode = this.graph.get(start);\n this.cameFrom = new Map<PointNode, PointNode>();\n const costSoFar = new Map<PointNode, number>();\n costSoFar.set(startNode!, 0);\n frontier.enqueue({ node: startNode!, priority: 0 });\n while (frontier.list.length > 0) {\n var current = frontier.dequeue();\n\n if (!current) {\n throw new Error(`can't find current`);\n }\n const currentPoint = current!.node.data;\n if (currentPoint[0] === end[0] && currentPoint[1] === end[1]) {\n break;\n }\n current.node.adjacentNodes.forEach(next => {\n let newCost = costSoFar.get(current!.node)! + this.heuristic(next.data, current!.node.data);\n const previousNode = this.cameFrom.get(current!.node);\n // Inflection point weight, if an inflection point occurs, cost + 1 to avoid the inflection point path\n // Three points on a line to determine whether there is an inflection point\n const previousPoint = previousNode ? previousNode.data : previousStart;\n const x = previousPoint[0] === current?.node.data[0] && previousPoint[0] === next.data[0];\n const y = previousPoint[1] === current?.node.data[1] && previousPoint[1] === next.data[1];\n if (!x && !y) {\n newCost = newCost + 1;\n }\n if (!costSoFar.has(next) || (costSoFar.get(next) && newCost < costSoFar.get(next)!)) {\n costSoFar.set(next, newCost);\n const priority = newCost + this.heuristic(next.data, end);\n frontier.enqueue({ node: next, priority });\n this.cameFrom.set(next, current!.node);\n }\n });\n }\n }\n\n getRoute(start: Point, end: Point) {\n const result = [];\n let temp = end;\n while (temp[0] !== start[0] || temp[1] !== start[1]) {\n const node = this.graph.get(temp);\n const preNode = this.cameFrom.get(node!);\n result.unshift(preNode!.data);\n temp = preNode!.data;\n }\n return result;\n }\n}\n","import { Point, distanceBetweenPointAndPoint } from '@plait/core';\n\nexport class PointNode {\n public distance = Number.MAX_SAFE_INTEGER;\n public adjacentNodes: PointNode[] = [];\n constructor(public data: Point) {}\n}\n\nexport class PointGraph {\n private index: { [x: string]: { [y: string]: PointNode } } = {};\n\n add(p: Point) {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (!(xs in this.index)) {\n this.index[xs] = {};\n }\n if (!(ys in this.index[xs])) {\n this.index[xs][ys] = new PointNode(p);\n }\n }\n connect(a: Point, b: Point) {\n const nodeA = this.get(a);\n const nodeB = this.get(b);\n\n if (!nodeA || !nodeB) {\n throw new Error(`A point was not found`);\n }\n\n nodeA.adjacentNodes.push(nodeB);\n }\n\n has(p: Point): boolean {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n return xs in this.index && ys in this.index[xs];\n }\n\n get(p: Point): PointNode | null {\n const x = p[0];\n const y = p[1];\n const xs = x.toString(),\n ys = y.toString();\n\n if (xs in this.index && ys in this.index[xs]) {\n return this.index[xs][ys];\n }\n\n return null;\n }\n}\n","import { Direction, Point, RectangleClient, downScale } from '@plait/core';\nimport { removeDuplicatePoints } from '../utils';\nimport { DEFAULT_ROUTE_MARGIN } from '../constants';\nimport { AStar, PointGraph } from '../algorithms';\n\nexport interface ElbowLineRouteOptions {\n sourcePoint: Point;\n nextSourcePoint: Point;\n sourceRectangle: RectangleClient;\n sourceOuterRectangle: RectangleClient;\n targetPoint: Point;\n nextTargetPoint: Point;\n targetOuterRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface RouteAdjustOptions {\n xAxis?: number;\n yAxis?: number;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport interface AdjustOptions {\n parallelPaths: [Point, Point][];\n pointOfHit: Point;\n sourceRectangle: RectangleClient;\n targetRectangle: RectangleClient;\n}\n\nexport const generateElbowLineRoute = (options: ElbowLineRouteOptions) => {\n const { nextSourcePoint, nextTargetPoint } = options;\n const points = getGraphPoints(options);\n const graph = createGraph(points);\n const aStar = new AStar(graph);\n aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);\n let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);\n route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];\n // Centerline correction: Correct the shortest path route based on the horizontal centerline/vertical centerline\n // 1. Find the horizontal center line (xAxis)/vertical center line (yAxis)\n // 2. Find the point that intersects xAxis/yAxis in route, and find the line segment parallel to xAxis/yAxis in route\n // 3. Construct a rectangle based on the intersection points and parallel lines found in the previous step.\n // 4. Determine whether the rectangle intersects with the element. If it does not intersect, the center line can be mapped based on the rectangle constructed in the previous step.\n // 5. Determine whether the path after mapping the center line meets the constraints (inflection point cannot be increased)\n const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);\n const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);\n const xAxis = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);\n const yAxis = isHitY ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, false);\n route = routeAdjust(route, { xAxis, yAxis, sourceRectangle: options.sourceRectangle, targetRectangle: options.targetRectangle });\n return route;\n};\n\nexport const routeAdjust = (path: Point[], options: RouteAdjustOptions) => {\n const { sourceRectangle, targetRectangle, xAxis, yAxis } = options;\n if (xAxis !== undefined) {\n const optionsX = getAdjustOptions(path, xAxis, true);\n const resultX =\n optionsX.pointOfHit &&\n adjust(path, { parallelPaths: optionsX.parallelPaths, pointOfHit: optionsX.pointOfHit, sourceRectangle, targetRectangle });\n if (resultX) {\n path = resultX;\n }\n }\n if (yAxis !== undefined) {\n const optionsY = getAdjustOptions(path, yAxis, false);\n const resultY =\n optionsY.pointOfHit &&\n adjust(path, { parallelPaths: optionsY.parallelPaths, pointOfHit: optionsY.pointOfHit, sourceRectangle, targetRectangle });\n if (resultY) {\n path = resultY;\n }\n }\n return path;\n};\n\nconst adjust = (route: Point[], options: AdjustOptions) => {\n const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;\n let result = null;\n parallelPaths.forEach(parallelPath => {\n // Construct a rectangle\n const tempRect = RectangleClient.toRectangleClient([pointOfHit, parallelPath[0], parallelPath[1]]);\n if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {\n const getCornerCount = (path: Point[]) => {\n let cornerCount = 0;\n for (let index = 1; index < path.length - 1; index++) {\n const pre = path[index - 1];\n const current = path[index];\n const next = path[index + 1];\n if (\n pre &&\n current &&\n next &&\n !(\n (downScale(current[0]) === downScale(pre[0]) && downScale(current[0]) === downScale(next[0])) ||\n (downScale(current[1]) === downScale(pre[1]) && downScale(current[1]) === downScale(next[1]))\n )\n ) {\n cornerCount++;\n }\n }\n return cornerCount;\n };\n const tempCorners = RectangleClient.getCornerPoints(tempRect);\n const indexRangeInPath: number[] = [];\n const indexRangeInCorner: number[] = [];\n route.forEach((point, index) => {\n const cornerResult = tempCorners.findIndex(\n corner => Math.floor(corner[0]) === Math.floor(point[0]) && Math.floor(corner[1]) === Math.floor(point[1])\n );\n if (cornerResult !== -1) {\n indexRangeInPath.push(index);\n indexRangeInCorner.push(cornerResult);\n }\n });\n const newPath = [...route];\n const missCorner = tempCorners.find((c, index) => !indexRangeInCorner.includes(index)) as Point;\n const removeLength = Math.abs(indexRangeInPath[0] - indexRangeInPath[indexRangeInPath.length - 1]) + 1;\n newPath.splice(indexRangeInPath[0] + 1, removeLength - 2, missCorner);\n const cornerCount = getCornerCount([...route]);\n const newCornerCount = getCornerCount([...newPath]);\n if (newCornerCount <= cornerCount) {\n result = newPath;\n }\n }\n return null;\n });\n return result;\n};\n\nconst getAdjustOptions = (path: Point[], middle: number, isHorizontal: boolean) => {\n const parallelPaths: [Point, Point][] = [];\n let start: null | Point = null;\n let pointOfHit: null | Point = null;\n const axis = isHorizontal ? 0 : 1;\n\n for (let index = 0; index < path.length; index++) {\n const previous = path[index - 1];\n const current = path[index];\n if (start === null && previous && previous[axis] === current[axis]) {\n start = previous;\n }\n if (start !== null) {\n if (previous[axis] !== current[axis]) {\n parallelPaths.push([start, previous]);\n start = null;\n }\n }\n if (current[axis] === middle) {\n pointOfHit = current;\n }\n }\n if (start) {\n parallelPaths.push([start, path[path.length - 1]]);\n }\n return { pointOfHit, parallelPaths };\n};\n\nexport const getGraphPoints = (options: ElbowLineRouteOptions) => {\n const { nextSourcePoint, nextTargetPoint, sourceOuterRectangle, targetOuterRectangle } = options;\n const x: number[] = [];\n const y: number[] = [];\n let result: Point[] = [];\n\n [sourceOuterRectangle, targetOuterRectangle].forEach(rectangle => {\n x.push(rectangle.x, rectangle.x + rectangle.width / 2, rectangle.x + rectangle.width);\n y.push(rectangle.y, rectangle.y + rectangle.height / 2, rectangle.y + rectangle.height);\n });\n const rectanglesX = [\n sourceOuterRectangle.x,\n sourceOuterRectangle.x + sourceOuterRectangle.width,\n targetOuterRectangle.x,\n targetOuterRectangle.x + targetOuterRectangle.width\n ].sort((a, b) => a - b);\n x.push((rectanglesX[1] + rectanglesX[2]) / 2, nextSourcePoint[0], nextTargetPoint[0]);\n const rectanglesY = [\n sourceOuterRectangle.y,\n sourceOuterRectangle.y + sourceOuterRectangle.height,\n targetOuterRectangle.y,\n targetOuterRectangle.y + targetOuterRectangle.height\n ].sort((a, b) => a - b);\n y.push((rectanglesY[1] + rectanglesY[2]) / 2, nextSourcePoint[1], nextTargetPoint[1]);\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n const point: Point = [x[i], y[j]];\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n if (!isInSource && !isInTarget) {\n result.push(point);\n }\n }\n }\n result = removeDuplicatePoints(result).filter(point => {\n const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);\n const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);\n return !isInSource && !isInTarget;\n });\n return result;\n};\n\nexport const createGraph = (points: Point[]) => {\n const graph = new PointGraph();\n const Xs: number[] = [];\n const Ys: number[] = [];\n points.forEach(p => {\n const x = p[0],\n y = p[1];\n if (Xs.indexOf(x) < 0) Xs.push(x);\n if (Ys.indexOf(y) < 0) Ys.push(y);\n graph.add(p);\n });\n Xs.sort((a, b) => a - b);\n Ys.sort((a, b) => a - b);\n const inHotIndex = (p: Point): boolean => graph.has(p);\n for (let i = 0; i < Xs.length; i++) {\n for (let j = 0; j < Ys.length; j++) {\n const point: Point = [Xs[i], Ys[j]];\n if (!inHotIndex(point)) continue;\n if (i > 0) {\n const otherPoint: Point = [Xs[i - 1], Ys[j]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n if (j > 0) {\n const otherPoint: Point = [Xs[i], Ys[j - 1]];\n if (inHotIndex(otherPoint)) {\n graph.connect(otherPoint, point);\n graph.connect(point, otherPoint);\n }\n }\n }\n }\n return graph;\n};\n\nexport const reduceRouteMargin = (sourceRectangle: RectangleClient, targetRectangle: RectangleClient) => {\n const defaultOffset = DEFAULT_ROUTE_MARGIN;\n let sourceOffset: number[] = new Array(4).fill(defaultOffset);\n let targetOffset: number[] = new Array(4).fill(defaultOffset);\n const leftToRight = sourceRectangle.x - (targetRectangle.x + targetRectangle.width);\n const rightToLeft = targetRectangle.x - (sourceRectangle.x + sourceRectangle.width);\n if (leftToRight > 0 && leftToRight < defaultOffset * 2) {\n const offset = leftToRight / 2;\n sourceOffset[3] = offset;\n targetOffset[1] = offset;\n }\n\n if (rightToLeft > 0 && rightToLeft < defaultOffset * 2) {\n const offset = rightToLeft / 2;\n targetOffset[3] = offset;\n sourceOffset[1] = offset;\n }\n\n const topToBottom = sourceRectangle.y - (targetRectangle.y + targetRectangle.height);\n const bottomToTop = targetRectangle.y - (sourceRectangle.y + sourceRectangle.height);\n if (topToBottom > 0 && topToBottom < defaultOffset * 2) {\n const offset = topToBottom / 2;\n sourceOffset[0] = offset;\n targetOffset[2] = offset;\n }\n if (bottomToTop > 0 && bottomToTop < defaultOffset * 2) {\n const offset = bottomToTop / 2;\n sourceOffset[2] = offset;\n targetOffset[0] = offset;\n }\n return { sourceOffset, targetOffset };\n};\n\nexport const getNextPoint = (point: Point, outerRectangle: RectangleClient, direction: Direction): Point => {\n switch (direction) {\n case Direction.top: {\n return [point[0], outerRectangle.y];\n }\n case Direction.bottom: {\n return [point[0], outerRectangle.y + outerRectangle.height];\n }\n case Direction.right: {\n return [outerRectangle.x + outerRectangle.width, point[1]];\n }\n default: {\n return [outerRectangle.x, point[1]];\n }\n }\n};\n","import { PlaitElement } from '@plait/core';\n\nconst map = new Map<string, any>();\n\nexport const memorizeLatest = <T extends PlaitElement = PlaitElement>(\n memorizedKey: string,\n propertyKey: keyof T,\n propertyValue: T[keyof T]\n) => {\n let obj = map.has(memorizedKey) ? map.get(memorizedKey) : {};\n obj[propertyKey] = propertyValue;\n map.set(memorizedKey, obj);\n};\n\nexport const getMemorizedLatest = <T extends PlaitElement = PlaitElement>(memorizedKey: string): T => {\n return map.get(memorizedKey);\n};\n","import { Path, PlaitBoard, PlaitElement, Transforms, getSelectedElements } from '@plait/core';\nimport { memorizeLatest } from '../utils';\n\nexport interface SetOptions<T extends PlaitElement = PlaitElement> {\n callback?: (element: T, path: Path) => void;\n getMemorizeKey?: (element: T) => string;\n match?: (element: T) => boolean;\n}\n\nexport const setProperty = <T extends PlaitElement = PlaitElement>(board: PlaitBoard, properties: Partial<T>, options?: SetOptions<T>) => {\n const selectedElements = getSelectedElements(board) as T[];\n selectedElements.forEach(element => {\n if (options?.match && !options?.match(element)) return;\n const path = PlaitBoard.findPath(board, element);\n const memorizeKey = options?.getMemorizeKey ? options?.getMemorizeKey(element) : '';\n for (let key in properties) {\n memorizeKey && memorizeLatest(memorizeKey, key, properties[key]);\n }\n if (options?.callback) {\n options.callback(element, path);\n } else {\n Transforms.setNode(board, properties, path);\n }\n });\n};\n\nconst setStrokeStyle = (board: PlaitBoard, strokeStyle: string, options: SetOptions) => {\n setProperty(board, { strokeStyle }, options);\n};\n\nconst setFillColor = (board: PlaitBoard, fill: string, options: SetOptions) => {\n setProperty(board, { fill }, options);\n};\n\nconst setStrokeColor = (board: PlaitBoard, strokeColor: string, options: SetOptions) => {\n setProperty(board, { strokeColor }, options);\n};\n\nconst setStrokeWidth = (board: PlaitBoard, strokeWidth: number, options: SetOptions) => {\n setProperty(board, { strokeWidth }, options);\n};\n\nexport const PropertyTransforms = {\n setFillColor,\n setStrokeStyle,\n setProperty,\n setStrokeWidth,\n setStrokeColor\n};\n","import { MERGING, PlaitBoard, Point, RectangleClient, Transforms, getRectangleByElements, getSelectedElements } from '@plait/core';\n\nexport const alignTop = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [0, outerRectangle.y - rectangle.y] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignHorizontalCenter = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n const outerCenter = outerRectangle.y + outerRectangle.height / 2;\n const elementCenter = rectangle.y + rectangle.height / 2;\n return [0, outerCenter - elementCenter] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignBottom = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [0, outerRectangle.y + outerRectangle.height - (rectangle.y + rectangle.height)] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignLeft = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [outerRectangle.x - rectangle.x, 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignVerticalCenter = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n const outerCenter = outerRectangle.x + outerRectangle.width / 2;\n const elementCenter = rectangle.x + rectangle.width / 2;\n return [outerCenter - elementCenter, 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nexport const alignRight = (board: PlaitBoard) => {\n function getOffset(outerRectangle: RectangleClient, rectangle: RectangleClient) {\n return [outerRectangle.x + outerRectangle.width - (rectangle.x + rectangle.width), 0] as Point;\n }\n setOffset(board, getOffset);\n};\n\nfunction setOffset(board: PlaitBoard, getOffset: (outerRectangle: RectangleClient, rectangle: RectangleClient) => Point) {\n let elements = getSelectedElements(board);\n elements = elements.filter(element => board.children.includes(element));\n const outerRectangle = getRectangleByElements(board, elements, false);\n elements.forEach(element => {\n if (!element.points) return;\n const path = PlaitBoard.findPath(board, element);\n const rectangle = board.getRectangle(element)!;\n const offset = getOffset(outerRectangle, rectangle);\n const newPoints = element.points.map(p => [p[0] + offset[0], p[1] + offset[1]]) as Point[];\n Transforms.setNode(\n board,\n {\n points: newPoints\n },\n path\n );\n MERGING.set(board, true);\n });\n MERGING.set(board, false);\n}\n\nexport interface AlignTransform {\n alignTop: (board: PlaitBoard) => void;\n alignHorizontalCenter: (board: PlaitBoard) => void;\n alignBottom: (board: PlaitBoard) => void;\n alignLeft: (board: PlaitBoard) => void;\n alignVerticalCenter: (board: PlaitBoard) => void;\n alignRight: (board: PlaitBoard) => void;\n}\n\nexport const AlignTransform: AlignTransform = {\n alignTop,\n alignHorizontalCenter,\n alignBottom,\n alignLeft,\n alignVerticalCenter,\n alignRight\n};\n","import { Point } from '@plait/core';\n\nexport const normalizeShapePoints = (points: [Point, Point], shift: boolean = false): [Point, Point] => {\n let start = points[0];\n let end = points[1];\n if (shift) {\n const width = Math.abs(start[0] - end[0]);\n const height = Math.abs(start[1] - end[1]);\n const edge = Math.max(height, width);\n end = [start[0] + (end[0] > start[0] ? edge : -edge), start[1] + (end[1] > start[1] ? edge : -edge)];\n }\n\n const leftTopPoint: Point = [Math.min(start[0], end[0]), Math.min(start[1], end[1])];\n let rightBottomPoint: Point = [Math.max(start[0], end[0]), Math.max(start[1], end[1])];\n\n return [leftTopPoint, rightBottomPoint];\n};\n","import {\n MERGING,\n PRESS_AND_MOVE_BUFFER,\n PlaitBoard,\n PlaitElement,\n PlaitPointerType,\n Point,\n distanceBetweenPointAndPoint,\n isMainPointer,\n preventTouchMove,\n handleTouchTarget,\n throttleRAF,\n toPoint,\n transformPoint,\n ResizeCursorClass\n} from '@plait/core';\nimport { ResizeHandle } from '../constants/resize';\nimport { ResizeRef, addResizing, isResizing, removeResizing } from '../utils/resize';\n\nexport interface WithResizeOptions<T extends PlaitElement = PlaitElement, K = ResizeHandle> {\n key: string;\n canResize: () => boolean;\n detect: (point: Point) => ResizeDetectResult<T, K> | null;\n onResize: (resizeRef: ResizeRef<T, K>, resizeState: ResizeState) => void;\n afterResize?: (resizeRef: ResizeRef<T, K>) => void;\n beforeResize?: (resizeRef: ResizeRef<T, K>) => void;\n}\n\nexport interface ResizeDetectResult<T extends PlaitElement = PlaitElement, K = ResizeHandle> {\n element: T;\n handle: K;\n cursorClass?: ResizeCursorClass;\n}\n\nexport interface ResizeState {\n offsetX: number;\n offsetY: number;\n endTransformPoint: Point;\n}\n\nconst generalCanResize = (board: PlaitBoard, event: PointerEvent) => {\n return (\n !PlaitBoard.isReadonly(board) && !PlaitBoard.hasBeenTextEditing(board) && PlaitBoard.isPointer(board, PlaitPointerType.selection)\n );\n};\n\nexport const withResize = <T extends PlaitElement = PlaitElement, K = ResizeHandle>(\n board: PlaitBoard,\n options: WithResizeOptions<T, K>\n) => {\n const { pointerDown, pointerMove, globalPointerUp } = board;\n let resizeDetectResult: ResizeDetectResult<T, K> | null = null;\n let resizeRef: ResizeRef<T, K> | null = null;\n let startPoint: Point | null = null;\n let hoveDetectResult: ResizeDetectResult<T, K> | null = null;\n\n board.pointerDown = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event) || !isMainPointer(event)) {\n pointerDown(event);\n return;\n }\n const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));\n resizeDetectResult = options.detect(point);\n if (resizeDetectResult) {\n if (resizeDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${resizeDetectResult.cursorClass}`);\n }\n startPoint = [event.x, event.y];\n resizeRef = {\n path: PlaitBoard.findPath(board, resizeDetectResult.element),\n element: resizeDetectResult.element,\n handle: resizeDetectResult.handle\n };\n preventTouchMove(board, event, true);\n // prevent text from being selected when user pressed shift and pointer down\n event.preventDefault();\n return;\n }\n pointerDown(event);\n };\n\n board.pointerMove = (event: PointerEvent) => {\n if (!options.canResize() || !generalCanResize(board, event)) {\n pointerMove(event);\n return;\n }\n if (startPoint && resizeDetectResult && !isResizing(board)) {\n // prevent text from being selected\n event.preventDefault();\n const endPoint = [event.x, event.y];;\n const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n if (distance > PRESS_AND_MOVE_BUFFER) {\n addResizing(board, resizeRef!, options.key);\n MERGING.set(board, true);\n options.beforeResize && options.beforeResize(resizeRef!);\n }\n }\n\n if (isResizing(board) && startPoint) {\n // prevent text from being selected\n event.preventDefault();\n const endTransformPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));\n throttleRAF(() => {\n const endPoint = [event.x, event.y];\n if (startPoint && resizeRef) {\n handleTouchTarget(board);\n const offsetX = endPoint[0] - startPoint[0];\n const offsetY = endPoint[1] - startPoint[1];\n options.onResize(resizeRef, { offsetX, offsetY, endTransformPoint });\n }\n });\n return;\n } else {\n const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));\n const resizeDetectResult = options.detect(point);\n if (resizeDetectResult) {\n if (hoveDetectResult && resizeDetectResult.cursorClass !== hoveDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoveDetectResult.cursorClass}`);\n }\n hoveDetectResult = resizeDetectResult;\n if (hoveDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.add(`${hoveDetectResult.cursorClass}`);\n }\n } else {\n if (hoveDetectResult) {\n if (hoveDetectResult.cursorClass) {\n PlaitBoard.getBoardContainer(board).classList.remove(`${hoveDetectResult.cursorClass}`);\n }\n hoveDetectResult = null;\n }\n }\n }\n pointerMove(event);\n };\n\n board.globalPointerUp = (event: PointerEvent) => {\n globalPointerUp(event);\n if (isResizing(board) || resizeDetectResult) {\n options.beforeResize && options.beforeResize(resizeRef!);\n removeResizing(board, options.key);\n startPoint = null;\n resizeDetectResult = null;\n resizeRef = null;\n MERGING.set(board, false);\n preventTouchMove(board, event, false);\n }\n };\n\n return board;\n};\n","import { PlaitBoard, PlaitElement, PlaitPluginElementComponent } from '@plait/core';\nimport { TextManage } from '@plait/text';\n\nexport abstract class CommonPluginElement<\n T extends PlaitElement = PlaitElement,\n K extends PlaitBoard = PlaitBoard\n> extends PlaitPluginElementComponent<T, K> {\n private textManages: TextManage[] = [];\n\n initializeTextManages(textManages: TextManage[]) {\n this.textManages = textManages;\n }\n\n addTextManage(textManage: TextManage) {\n this.textManages.push(textManage);\n }\n\n destroyTextManages() {\n this.getTextManages().forEach(manage => {\n manage.destroy();\n });\n this.textManages = [];\n }\n\n getTextManages() {\n return this.textManages;\n }\n}\n","import { ChangeDetectorRef, Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ACTIVE_STROKE_WIDTH, PlaitBoard, PlaitElement, RectangleClient, getSelectedElements, isSelectionMoving } from '@plait/core';\nimport { ActiveGenerator } from '../generators';\nimport { CommonImageItem } from '../utils';\n\n@Directive({\n host: {\n class: 'plait-image-container'\n }\n})\nexport abstract class ImageBaseComponent implements OnInit, OnDestroy {\n _imageItem!: CommonImageItem;\n\n _isFocus!: boolean;\n\n initialized = false;\n\n activeGenerator!: ActiveGenerator;\n\n @Input()\n element!: PlaitElement;\n\n @Input()\n set imageItem(value: CommonImageItem) {\n this.afterImageItemChange(this._imageItem, value);\n this._imageItem = value;\n this.drawFocus();\n }\n\n get imageItem() {\n return this._imageItem;\n }\n\n @Input()\n board!: PlaitBoard;\n\n @Input()\n set isFocus(value: boolean) {\n this._isFocus = value;\n this.drawFocus();\n }\n\n get isFocus() {\n return this._isFocus;\n }\n\n get nativeElement() {\n return this.elementRef.nativeElement;\n }\n\n abstract afterImageItemChange(previous: CommonImageItem, current: CommonImageItem): void;\n\n @Input() getRectangle!: () => RectangleClient;\n\n @Input() hasResizeHandle!: () => boolean;\n\n constructor(protected elementRef: ElementRef<HTMLElement>, public cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.activeGenerator = new ActiveGenerator(this.board, {\n getStrokeWidth: () => {\n const selectedElements = getSelectedElements(this.board);\n if (!(selectedElements.length === 1 && !isSelectionMoving(this.board))) {\n return ACTIVE_STROKE_WIDTH;\n } else {\n return ACTIVE_STROKE_WIDTH;\n }\n },\n getStrokeOpacity: () => {\n const selectedElements = getSelectedElements(this.board);\n if ((selectedElements.length === 1 && !isSelectionMoving(this.board)) || !selectedElements.length) {\n return 1;\n } else {\n return 0.5;\n }\n },\n getRectangle: () => {\n return this.getRectangle();\n },\n hasResizeHandle: () => {\n const selectedElements = getSelectedElements(this.board);\n return (selectedElements.length === 1 && !isSelectionMoving(this.board)) || !selectedElements.length;\n }\n });\n this.initialized = true;\n }\n\n drawFocus() {\n if (this.initialized) {\n const activeG = PlaitBoard.getElementActiveHost(this.board);\n this.activeGenerator.processDrawing({} as PlaitElement, activeG, { selected: this._isFocus });\n }\n }\n\n ngOnDestroy(): void {\n if (this.activeGenerator) {\n this.activeGenerator.destroy();\n }\n }\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './constants';\nexport * from './generators';\nexport * from './transforms';\nexport * from './shapes';\nexport * from './plugins';\nexport * from './utils';\nexport * from './core/plugin-element';\nexport * from './core/image-base.component';\nexport * from './algorithms'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/common",
3
- "version": "0.47.0",
3
+ "version": "0.48.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^15.2.0",
6
6
  "@angular/core": "^15.2.0",
@@ -0,0 +1,16 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ export declare const alignTop: (board: PlaitBoard) => void;
3
+ export declare const alignHorizontalCenter: (board: PlaitBoard) => void;
4
+ export declare const alignBottom: (board: PlaitBoard) => void;
5
+ export declare const alignLeft: (board: PlaitBoard) => void;
6
+ export declare const alignVerticalCenter: (board: PlaitBoard) => void;
7
+ export declare const alignRight: (board: PlaitBoard) => void;
8
+ export interface AlignTransform {
9
+ alignTop: (board: PlaitBoard) => void;
10
+ alignHorizontalCenter: (board: PlaitBoard) => void;
11
+ alignBottom: (board: PlaitBoard) => void;
12
+ alignLeft: (board: PlaitBoard) => void;
13
+ alignVerticalCenter: (board: PlaitBoard) => void;
14
+ alignRight: (board: PlaitBoard) => void;
15
+ }
16
+ export declare const AlignTransform: AlignTransform;
@@ -1 +1,2 @@
1
1
  export * from './property';
2
+ export * from './align';