@plait/draw 0.53.0 → 0.54.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.
- package/constants/geometry.d.ts +3 -1
- package/esm2022/constants/geometry.mjs +4 -2
- package/esm2022/generators/line-auto-complete.generator.mjs +1 -1
- package/esm2022/interfaces/index.mjs +2 -2
- package/esm2022/plugins/with-draw-fragment.mjs +1 -1
- package/esm2022/plugins/with-draw-resize.mjs +56 -9
- package/esm2022/plugins/with-draw.mjs +4 -4
- package/esm2022/plugins/with-geometry-resize.mjs +7 -14
- package/esm2022/plugins/with-line-auto-complete-reaction.mjs +2 -2
- package/esm2022/plugins/with-line-auto-complete.mjs +15 -14
- package/esm2022/plugins/with-line-bound-reaction.mjs +19 -21
- package/esm2022/plugins/with-line-create.mjs +4 -4
- package/esm2022/plugins/with-line-resize.mjs +11 -12
- package/esm2022/transforms/line.mjs +4 -4
- package/esm2022/utils/geometry.mjs +31 -22
- package/esm2022/utils/hit.mjs +26 -26
- package/esm2022/utils/line/elbow.mjs +11 -6
- package/esm2022/utils/line/line-basic.mjs +21 -29
- package/esm2022/utils/line/line-common.mjs +3 -3
- package/esm2022/utils/line/line-resize.mjs +2 -2
- package/esm2022/utils/position/geometry.mjs +51 -21
- package/esm2022/utils/resize-snap.mjs +361 -0
- package/esm2022/utils/shape.mjs +2 -2
- package/fesm2022/plait-draw.mjs +432 -344
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-auto-complete.generator.d.ts +3 -3
- package/interfaces/index.d.ts +2 -2
- package/package.json +1 -1
- package/plugins/with-draw-fragment.d.ts +2 -2
- package/plugins/with-draw-resize.d.ts +6 -0
- package/utils/geometry.d.ts +7 -4
- package/utils/hit.d.ts +3 -1
- package/utils/line/elbow.d.ts +3 -0
- package/utils/line/line-basic.d.ts +4 -4
- package/utils/position/geometry.d.ts +10 -2
- package/utils/resize-snap.d.ts +49 -0
- package/utils/shape.d.ts +2 -2
- package/esm2022/utils/resize-align-reaction.mjs +0 -316
- package/esm2022/utils/resize-align.mjs +0 -37
- package/utils/resize-align-reaction.d.ts +0 -42
- package/utils/resize-align.d.ts +0 -8
|
@@ -140,7 +140,7 @@ export function getIndexAndDeleteCountByKeyPoint(board, element, dataPoints, nex
|
|
|
140
140
|
if (midDataPoints.length > 0) {
|
|
141
141
|
const handleRefPair = getLineHandleRefPair(board, element);
|
|
142
142
|
const params = getElbowLineRouteOptions(board, element, handleRefPair);
|
|
143
|
-
const keyPoints = removeDuplicatePoints(generateElbowLineRoute(params));
|
|
143
|
+
const keyPoints = removeDuplicatePoints(generateElbowLineRoute(params, board));
|
|
144
144
|
const nextKeyPoints = simplifyOrthogonalPoints(keyPoints.slice(1, keyPoints.length - 1));
|
|
145
145
|
const nextDataPoints = [nextRenderPoints[0], ...midDataPoints, nextRenderPoints[nextRenderPoints.length - 1]];
|
|
146
146
|
const mirrorDataPoints = getMirrorDataPoints(board, nextDataPoints, nextKeyPoints, params);
|
|
@@ -306,4 +306,4 @@ export const hasIllegalElbowPoint = (midDataPoints) => {
|
|
|
306
306
|
return !isStraightWithBefore && !isStraightWithAfter;
|
|
307
307
|
});
|
|
308
308
|
};
|
|
309
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1yZXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2xpbmUtcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0Msc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFjLEtBQUssRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDO0FBQzNDLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWdCLEVBQUUsV0FBa0IsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxnQkFBeUIsRUFBRSxXQUFrQixFQUFFLFdBQWtCLEVBQUUsV0FBbUI7SUFDakksTUFBTSxjQUFjLEdBQW1EO1FBQ25FLFFBQVEsRUFBRSxJQUFJO1FBQ2QsSUFBSSxFQUFFLElBQUk7S0FDYixDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakQsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRSxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUM7SUFDN0UsSUFDSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFDdEUsQ0FBQztRQUNDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUM7SUFDeEUsSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqSSxjQUFjLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsYUFBb0IsRUFDcEIsV0FBa0IsRUFDbEIsV0FBd0IsRUFDeEIsMkJBQTJFO0lBRTNFLElBQUksYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDOUIsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0UsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN4QyxJQUFJLDJCQUEyQixDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVILE1BQU0sR0FBRywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQzthQUFNLElBQUksMkJBQTJCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUM7WUFDM0gsTUFBTSxHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsYUFBYSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQy9DLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0UsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN4QyxJQUFJLDJCQUEyQixDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVILE1BQU0sR0FBRywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQzthQUFNLElBQUksMkJBQTJCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUM7WUFDM0gsTUFBTSxHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLFdBQVcsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUM1QyxLQUFpQixFQUNqQixPQUFrQixFQUNsQixVQUFtQixFQUNuQixnQkFBeUIsRUFDekIsV0FBbUI7SUFFbkIsSUFBSSxLQUFLLEdBQWtCLElBQUksQ0FBQztJQUNoQyxJQUFJLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0lBRXRDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsT0FBTztZQUNILEtBQUs7WUFDTCxXQUFXO1NBQ2QsQ0FBQztJQUNOLENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBRXBGLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNILEtBQUssRUFBRSxVQUFVO2dCQUNqQixXQUFXLEVBQUUsQ0FBQzthQUNqQixDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sU0FBUyxHQUNYLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ3JDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUMxRyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNaLE9BQU87b0JBQ0gsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDO1lBQ04sQ0FBQztZQUNELE9BQU87Z0JBQ0gsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFdBQVcsRUFBRSxDQUFDO2FBQ2pCLENBQUM7UUFDTixDQUFDO1FBQ0QsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxTQUFTLEdBQ1gsUUFBUSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdEgsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDWixPQUFPO29CQUNILEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQztvQkFDbkIsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUM7WUFDTixDQUFDO1lBQ0QsT0FBTztnQkFDSCxLQUFLLEVBQUUsUUFBUTtnQkFDZixXQUFXLEVBQUUsQ0FBQzthQUNqQixDQUFDO1FBQ04sQ0FBQztJQUNMLENBQUM7U0FBTSxDQUFDO1FBQ0osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLFdBQVcsR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLE1BQU07WUFDVixDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsTUFBTTtZQUNWLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0IsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2pCLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzRCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLE1BQU0sY0FBYyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUcsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMzRixLQUFLLElBQUksQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqSCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNyQixLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztvQkFDMUIsTUFBTTtnQkFDVixDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNqQixLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLDJFQUEyRTtnQkFDM0UsNERBQTREO2dCQUM1RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO29CQUNsQyxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztnQkFDdkMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU87UUFDSCxLQUFLO1FBQ0wsV0FBVztLQUNkLENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWlCLEVBQUUsY0FBdUIsRUFBRSxhQUFzQixFQUFFLE1BQTZCO0lBQ2pJLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzdELDZCQUE2QixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSw2QkFBNkIsR0FBRyxDQUNsQyxLQUFpQixFQUNqQixxQkFBNkIsRUFDN0IsY0FBdUIsRUFDdkIsYUFBc0IsRUFDdEIsTUFBNkIsRUFDL0IsRUFBRTtJQUNBLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdELE1BQU0sYUFBYSxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxRCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzFCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2hELE1BQU0sc0JBQXNCLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEcsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixNQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDOUYsYUFBYSxHQUFHLENBQUMsb0JBQW9CLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDMUQsV0FBVyxHQUFHLENBQUMsbUJBQW1CLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksYUFBYSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sZUFBZSxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBbUIsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLDhCQUE4QixDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN4RixNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BJLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsQ0FBQztZQUNELElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2QsY0FBYyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzlELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7Z0JBQzlELGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RELGNBQWMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFDRCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNkLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBVSxDQUFDO2dCQUN4RCxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRCxjQUFjLENBQUMsTUFBTSxDQUFDLHFCQUFxQixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxLQUFpQixFQUNqQixPQUFrQixFQUNsQixVQUFtQixFQUNuQixnQkFBeUIsRUFDekIsV0FBbUI7SUFFbkIsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLGdDQUFnQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BILElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLHVCQUFnQyxFQUFFLFVBQWlCLEVBQUUsUUFBZTtJQUNoRyxJQUFJLGNBQWMsR0FBWSxFQUFFLENBQUM7SUFDakMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hGLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFDbEIsTUFBTTtRQUNWLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsY0FBYyxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyw4QkFBOEIsQ0FBQyxPQUF1QixFQUFFLFNBQWtCO0lBQy9FLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO0lBRTlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1RCxJQUFJLG1CQUFtQixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3RDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQ3ZCLEtBQWlCLEVBQ2pCLE9BQXVCLEVBQ3ZCLGdCQUFrQyxFQUNsQyxlQUFnQyxFQUNoQyxlQUFnQztJQUVoQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRW5ELE1BQU0sY0FBYyxHQUFxQixFQUFFLENBQUM7SUFDNUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBVSxDQUFDO1FBQzNELE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBVSxDQUFDO1FBQ3pELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlELE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsVUFBVSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLE1BQU0sT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNqSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRTVDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDbEgsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxhQUFzQixFQUFXLEVBQUU7SUFDcEUsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sYUFBYSxHQUFHLFdBQVcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxVQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdEQsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzRSxNQUFNLG1CQUFtQixHQUFHLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hFLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLEtBQUssS0FBSyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLG9CQUFvQixJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMsIFJlc2l6ZVN0YXRlLCBnZW5lcmF0ZUVsYm93TGluZVJvdXRlLCByZW1vdmVEdXBsaWNhdGVQb2ludHMsIHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgY3JlYXRlRGVidWdHZW5lcmF0b3IgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBMSU5FX0FMSUdOX1RPTEVSQU5DRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IGdldEVsYm93TGluZVJvdXRlT3B0aW9ucywgZ2V0TGluZUhhbmRsZVJlZlBhaXIgfSBmcm9tICcuL2xpbmUtY29tbW9uJztcbmltcG9ydCB7IFBsYWl0TGluZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5jb25zdCBkZWJ1Z0tleSA9ICdkZWJ1ZzpwbGFpdDpsaW5lLW1pcnJvcic7XG5jb25zdCBkZWJ1Z0dlbmVyYXRvciA9IGNyZWF0ZURlYnVnR2VuZXJhdG9yKGRlYnVnS2V5KTtcblxuZXhwb3J0IGNvbnN0IGFsaWduUG9pbnRzID0gKGJhc2VQb2ludDogUG9pbnQsIG1vdmluZ1BvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IG5ld1BvaW50OiBQb2ludCA9IFsuLi5tb3ZpbmdQb2ludF07XG4gICAgaWYgKFBvaW50LmlzVmVydGljYWwobmV3UG9pbnQsIGJhc2VQb2ludCwgTElORV9BTElHTl9UT0xFUkFOQ0UpKSB7XG4gICAgICAgIG5ld1BvaW50WzBdID0gYmFzZVBvaW50WzBdO1xuICAgIH1cbiAgICBpZiAoUG9pbnQuaXNIb3Jpem9udGFsKG5ld1BvaW50LCBiYXNlUG9pbnQsIExJTkVfQUxJR05fVE9MRVJBTkNFKSkge1xuICAgICAgICBuZXdQb2ludFsxXSA9IGJhc2VQb2ludFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludChuZXh0UmVuZGVyUG9pbnRzOiBQb2ludFtdLCBzb3VyY2VQb2ludDogUG9pbnQsIHRhcmdldFBvaW50OiBQb2ludCwgaGFuZGxlSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlZmVyZW5jZVBvaW50OiB7IHByZXZpb3VzOiBQb2ludCB8IG51bGw7IG5leHQ6IFBvaW50IHwgbnVsbCB9ID0ge1xuICAgICAgICBwcmV2aW91czogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBjb25zdCBzdGFydFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleF07XG4gICAgY29uc3QgZW5kUG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgMV07XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICBjb25zdCBpc1ZlcnRpY2FsID0gUG9pbnQuaXNWZXJ0aWNhbChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgY29uc3QgcHJldmlvdXNQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggLSAxXSA/PyBuZXh0UmVuZGVyUG9pbnRzWzBdO1xuICAgIGNvbnN0IGJlZm9yZVByZXZpb3VzUG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4IC0gMl0gPz8gc291cmNlUG9pbnQ7XG4gICAgaWYgKFxuICAgICAgICAoaXNIb3Jpem9udGFsICYmIFBvaW50LmlzSG9yaXpvbnRhbChiZWZvcmVQcmV2aW91c1BvaW50LCBwcmV2aW91c1BvaW50KSkgfHxcbiAgICAgICAgKGlzVmVydGljYWwgJiYgUG9pbnQuaXNWZXJ0aWNhbChiZWZvcmVQcmV2aW91c1BvaW50LCBwcmV2aW91c1BvaW50KSlcbiAgICApIHtcbiAgICAgICAgcmVmZXJlbmNlUG9pbnQucHJldmlvdXMgPSBwcmV2aW91c1BvaW50O1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXggKyAyXSA/PyBuZXh0UmVuZGVyUG9pbnRzW25leHRSZW5kZXJQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWZ0ZXJOZXh0UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgM10gPz8gdGFyZ2V0UG9pbnQ7XG4gICAgaWYgKChpc0hvcml6b250YWwgJiYgUG9pbnQuaXNIb3Jpem9udGFsKG5leHRQb2ludCwgYWZ0ZXJOZXh0UG9pbnQpKSB8fCAoaXNWZXJ0aWNhbCAmJiBQb2ludC5pc1ZlcnRpY2FsKG5leHRQb2ludCwgYWZ0ZXJOZXh0UG9pbnQpKSkge1xuICAgICAgICByZWZlcmVuY2VQb2ludC5uZXh0ID0gbmV4dFBvaW50O1xuICAgIH1cbiAgICByZXR1cm4gcmVmZXJlbmNlUG9pbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGlnbkVsYm93U2VnbWVudChcbiAgICBzdGFydEtleVBvaW50OiBQb2ludCxcbiAgICBlbmRLZXlQb2ludDogUG9pbnQsXG4gICAgcmVzaXplU3RhdGU6IFJlc2l6ZVN0YXRlLFxuICAgIHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludDogeyBwcmV2aW91czogUG9pbnQgfCBudWxsOyBuZXh0OiBQb2ludCB8IG51bGwgfVxuKSB7XG4gICAgbGV0IG5ld1N0YXJ0UG9pbnQgPSBzdGFydEtleVBvaW50O1xuICAgIGxldCBuZXdFbmRQb2ludCA9IGVuZEtleVBvaW50O1xuICAgIGlmIChQb2ludC5pc0hvcml6b250YWwoc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBQb2ludC5nZXRPZmZzZXRZKHJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQsIHJlc2l6ZVN0YXRlLmVuZFBvaW50KTtcbiAgICAgICAgbGV0IHBvaW50WSA9IHN0YXJ0S2V5UG9pbnRbMV0gKyBvZmZzZXRZO1xuICAgICAgICBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1sxXSAtIHBvaW50WSkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRZID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0ICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzFdIC0gcG9pbnRZKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFkgPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFsxXTtcbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFBvaW50ID0gW3N0YXJ0S2V5UG9pbnRbMF0sIHBvaW50WV07XG4gICAgICAgIG5ld0VuZFBvaW50ID0gW2VuZEtleVBvaW50WzBdLCBwb2ludFldO1xuICAgIH1cbiAgICBpZiAoUG9pbnQuaXNWZXJ0aWNhbChzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludCkpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IFBvaW50LmdldE9mZnNldFgocmVzaXplU3RhdGUuc3RhcnRQb2ludCwgcmVzaXplU3RhdGUuZW5kUG9pbnQpO1xuICAgICAgICBsZXQgcG9pbnRYID0gc3RhcnRLZXlQb2ludFswXSArIG9mZnNldFg7XG4gICAgICAgIGlmIChyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXMgJiYgTWF0aC5hYnMocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzBdIC0gcG9pbnRYKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFggPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXNbMF07XG4gICAgICAgIH0gZWxzZSBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHQgJiYgTWF0aC5hYnMocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHRbMF0gLSBwb2ludFgpIDwgTElORV9BTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50WCA9IHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzBdO1xuICAgICAgICB9XG4gICAgICAgIG5ld1N0YXJ0UG9pbnQgPSBbcG9pbnRYLCBzdGFydEtleVBvaW50WzFdXTtcbiAgICAgICAgbmV3RW5kUG9pbnQgPSBbcG9pbnRYLCBlbmRLZXlQb2ludFsxXV07XG4gICAgfVxuICAgIHJldHVybiBbbmV3U3RhcnRQb2ludCwgbmV3RW5kUG9pbnRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhBbmREZWxldGVDb3VudEJ5S2V5UG9pbnQoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRMaW5lLFxuICAgIGRhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dFJlbmRlclBvaW50czogUG9pbnRbXSxcbiAgICBoYW5kbGVJbmRleDogbnVtYmVyXG4pIHtcbiAgICBsZXQgaW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBkZWxldGVDb3VudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBzdGFydEtleVBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleF07XG4gICAgY29uc3QgZW5kS2V5UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgMV07XG4gICAgaWYgKCFzdGFydEtleVBvaW50IHx8ICFlbmRLZXlQb2ludCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBkZWxldGVDb3VudFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtaWREYXRhUG9pbnRzID0gZGF0YVBvaW50cy5zbGljZSgxLCAtMSk7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IG1pZERhdGFQb2ludHMuZmluZEluZGV4KGl0ZW0gPT4gUG9pbnQuaXNFcXVhbHMoaXRlbSwgc3RhcnRLZXlQb2ludCkpO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gbWlkRGF0YVBvaW50cy5maW5kSW5kZXgoaXRlbSA9PiBQb2ludC5pc0VxdWFscyhpdGVtLCBlbmRLZXlQb2ludCkpO1xuXG4gICAgaWYgKE1hdGgubWF4KHN0YXJ0SW5kZXgsIGVuZEluZGV4KSA+IC0xKSB7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID4gLTEgJiYgZW5kSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbmRleDogc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xICYmIGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgaXNSZXBsYWNlID1cbiAgICAgICAgICAgICAgICBzdGFydEluZGV4IDwgbWlkRGF0YVBvaW50cy5sZW5ndGggLSAxICYmXG4gICAgICAgICAgICAgICAgUG9pbnQuaXNBbGlnbihbbWlkRGF0YVBvaW50c1tzdGFydEluZGV4XSwgbWlkRGF0YVBvaW50c1tzdGFydEluZGV4ICsgMV0sIHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50XSk7XG4gICAgICAgICAgICBpZiAoaXNSZXBsYWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IC0xICYmIGVuZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVwbGFjZSA9XG4gICAgICAgICAgICAgICAgZW5kSW5kZXggPiAwICYmIFBvaW50LmlzQWxpZ24oW21pZERhdGFQb2ludHNbZW5kSW5kZXhdLCBtaWREYXRhUG9pbnRzW2VuZEluZGV4IC0gMV0sIHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50XSk7XG4gICAgICAgICAgICBpZiAoaXNSZXBsYWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGVuZEluZGV4IC0gMSxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbmRleDogZW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UG9pbnQgPSBtaWREYXRhUG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgbmV4dFBvaW50ID0gbWlkRGF0YVBvaW50c1tpICsgMV07XG4gICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50XSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW2N1cnJlbnRQb2ludCwgbmV4dFBvaW50LCBzdGFydEtleVBvaW50XSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IE1hdGgubWluKGkgKyAxLCBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgZW5kS2V5UG9pbnRdKSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgoaSAtIDEsIDApO1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlQ291bnQgPSAwO1xuICAgICAgICBpZiAobWlkRGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVSZWZQYWlyID0gZ2V0TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gZ2V0RWxib3dMaW5lUm91dGVPcHRpb25zKGJvYXJkLCBlbGVtZW50LCBoYW5kbGVSZWZQYWlyKTtcbiAgICAgICAgICAgIGNvbnN0IGtleVBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhnZW5lcmF0ZUVsYm93TGluZVJvdXRlKHBhcmFtcykpO1xuICAgICAgICAgICAgY29uc3QgbmV4dEtleVBvaW50cyA9IHNpbXBsaWZ5T3J0aG9nb25hbFBvaW50cyhrZXlQb2ludHMuc2xpY2UoMSwga2V5UG9pbnRzLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHREYXRhUG9pbnRzID0gW25leHRSZW5kZXJQb2ludHNbMF0sIC4uLm1pZERhdGFQb2ludHMsIG5leHRSZW5kZXJQb2ludHNbbmV4dFJlbmRlclBvaW50cy5sZW5ndGggLSAxXV07XG4gICAgICAgICAgICBjb25zdCBtaXJyb3JEYXRhUG9pbnRzID0gZ2V0TWlycm9yRGF0YVBvaW50cyhib2FyZCwgbmV4dERhdGFQb2ludHMsIG5leHRLZXlQb2ludHMsIHBhcmFtcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gaGFuZGxlSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBtaXJyb3JEYXRhUG9pbnRzLnNsaWNlKDEsIC0xKS5maW5kSW5kZXgoaXRlbSA9PiBQb2ludC5pc0VxdWFscyhpdGVtLCBuZXh0UmVuZGVyUG9pbnRzW2ldKSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHByZXZpb3VzSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiByZW5kZXJQb2ludHMgaXMgYSBzdHJhaWdodCBsaW5lIGFuZCBkYXRhUG9pbnRzIGFyZSBub3Qgb24gdGhlIGxpbmUsXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgJ2RlbGV0ZUNvdW50JyBpcyBzZXQgdG8gbWlkRGF0YVBvaW50cy5sZW5ndGguXG4gICAgICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24obmV4dFJlbmRlclBvaW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBtaWREYXRhUG9pbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleCxcbiAgICAgICAgZGVsZXRlQ291bnRcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlycm9yRGF0YVBvaW50cyhib2FyZDogUGxhaXRCb2FyZCwgbmV4dERhdGFQb2ludHM6IFBvaW50W10sIG5leHRLZXlQb2ludHM6IFBvaW50W10sIHBhcmFtczogRWxib3dMaW5lUm91dGVPcHRpb25zKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IG5leHREYXRhUG9pbnRzLmxlbmd0aCAtIDI7IGluZGV4KyspIHtcbiAgICAgICAgYWRqdXN0QnlDdXN0b21Qb2ludFN0YXJ0SW5kZXgoYm9hcmQsIGluZGV4LCBuZXh0RGF0YVBvaW50cywgbmV4dEtleVBvaW50cywgcGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHREYXRhUG9pbnRzO1xufVxuXG4vKipcbiAqIGFkanVzdCBiYXNlZCBwYXJhbGxlbCBzZWdtZW50XG4gKi9cbmNvbnN0IGFkanVzdEJ5Q3VzdG9tUG9pbnRTdGFydEluZGV4ID0gKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGN1c3RvbVBvaW50U3RhcnRJbmRleDogbnVtYmVyLFxuICAgIG5leHREYXRhUG9pbnRzOiBQb2ludFtdLFxuICAgIG5leHRLZXlQb2ludHM6IFBvaW50W10sXG4gICAgcGFyYW1zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnNcbikgPT4ge1xuICAgIGNvbnN0IGJlZm9yZVBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4IC0gMV07XG4gICAgY29uc3Qgc3RhcnRQb2ludCA9IG5leHREYXRhUG9pbnRzW2N1c3RvbVBvaW50U3RhcnRJbmRleF07XG4gICAgY29uc3QgZW5kUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAxXTtcbiAgICBjb25zdCBhZnRlclBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4ICsgMl07XG4gICAgY29uc3QgYmVmb3JlU2VnbWVudCA9IFtiZWZvcmVQb2ludCwgc3RhcnRQb2ludF07XG4gICAgY29uc3QgYWZ0ZXJTZWdtZW50ID0gW2VuZFBvaW50LCBhZnRlclBvaW50XTtcbiAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEJlZm9yZSA9IFBvaW50LmlzQWxpZ24oYmVmb3JlU2VnbWVudCk7XG4gICAgY29uc3QgaXNTdHJhaWdodFdpdGhBZnRlciA9IFBvaW50LmlzQWxpZ24oYWZ0ZXJTZWdtZW50KTtcbiAgICBsZXQgaXNBZGp1c3RTdGFydCA9IGZhbHNlO1xuICAgIGxldCBpc0FkanVzdEVuZCA9IGZhbHNlO1xuICAgIGlmICghaXNTdHJhaWdodFdpdGhCZWZvcmUgfHwgIWlzU3RyYWlnaHRXaXRoQWZ0ZXIpIHtcbiAgICAgICAgY29uc3QgbWlkS2V5UG9pbnRzV2l0aEJlZm9yZSA9IGdldE1pZEtleVBvaW50cyhuZXh0S2V5UG9pbnRzLCBiZWZvcmVTZWdtZW50WzBdLCBiZWZvcmVTZWdtZW50WzFdKTtcbiAgICAgICAgY29uc3QgbWlkS2V5UG9pbnRzV2l0aEFmdGVyID0gZ2V0TWlkS2V5UG9pbnRzKG5leHRLZXlQb2ludHMsIGFmdGVyU2VnbWVudFswXSwgYWZ0ZXJTZWdtZW50WzFdKTtcbiAgICAgICAgY29uc3QgaGFzTWlkS2V5UG9pbnRzID0gbWlkS2V5UG9pbnRzV2l0aEJlZm9yZS5sZW5ndGggPiAwICYmIG1pZEtleVBvaW50c1dpdGhBZnRlci5sZW5ndGggPiAwO1xuICAgICAgICBpc0FkanVzdFN0YXJ0ID0gIWlzU3RyYWlnaHRXaXRoQmVmb3JlICYmICFoYXNNaWRLZXlQb2ludHM7XG4gICAgICAgIGlzQWRqdXN0RW5kID0gIWlzU3RyYWlnaHRXaXRoQWZ0ZXIgJiYgIWhhc01pZEtleVBvaW50cztcbiAgICB9XG4gICAgaWYgKGlzQWRqdXN0U3RhcnQgfHwgaXNBZGp1c3RFbmQpIHtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxTZWdtZW50ID0gW3N0YXJ0UG9pbnQsIGVuZFBvaW50XSBhcyBbUG9pbnQsIFBvaW50XTtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxTZWdtZW50cyA9IGZpbmRPcnRob2dvbmFsUGFyYWxsZWxTZWdtZW50cyhwYXJhbGxlbFNlZ21lbnQsIG5leHRLZXlQb2ludHMpO1xuICAgICAgICBjb25zdCBtaXJyb3JTZWdtZW50cyA9IGZpbmRNaXJyb3JTZWdtZW50cyhib2FyZCwgcGFyYWxsZWxTZWdtZW50LCBwYXJhbGxlbFNlZ21lbnRzLCBwYXJhbXMuc291cmNlUmVjdGFuZ2xlLCBwYXJhbXMudGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICAgICAgaWYgKG1pcnJvclNlZ21lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgbWlycm9yU2VnbWVudCA9IG1pcnJvclNlZ21lbnRzWzBdO1xuICAgICAgICAgICAgaWYgKGlzQWRqdXN0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICBuZXh0RGF0YVBvaW50cy5zcGxpY2UoY3VzdG9tUG9pbnRTdGFydEluZGV4LCAxLCBtaXJyb3JTZWdtZW50WzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FkanVzdEVuZCkge1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAxLCAxLCBtaXJyb3JTZWdtZW50WzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IFBvaW50LmlzSG9yaXpvbnRhbChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgICAgICAgICBjb25zdCBhZGp1c3RJbmRleCA9IGlzSG9yaXpvbnRhbCA/IDAgOiAxO1xuICAgICAgICAgICAgaWYgKGlzQWRqdXN0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGFydFBvaW50ID0gW3N0YXJ0UG9pbnRbMF0sIHN0YXJ0UG9pbnRbMV1dIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIG5ld1N0YXJ0UG9pbnRbYWRqdXN0SW5kZXhdID0gYmVmb3JlUG9pbnRbYWRqdXN0SW5kZXhdO1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXgsIDEsIG5ld1N0YXJ0UG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQWRqdXN0RW5kKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RW5kUG9pbnQgPSBbZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdXSBhcyBQb2ludDtcbiAgICAgICAgICAgICAgICBuZXdFbmRQb2ludFthZGp1c3RJbmRleF0gPSBhZnRlclBvaW50W2FkanVzdEluZGV4XTtcbiAgICAgICAgICAgICAgICBuZXh0RGF0YVBvaW50cy5zcGxpY2UoY3VzdG9tUG9pbnRTdGFydEluZGV4ICsgMSwgMSwgbmV3RW5kUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXBkYXRlZEhhbmRsZUluZGV4KFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGVsZW1lbnQ6IFBsYWl0TGluZSxcbiAgICBkYXRhUG9pbnRzOiBQb2ludFtdLFxuICAgIG5leHRSZW5kZXJQb2ludHM6IFBvaW50W10sXG4gICAgaGFuZGxlSW5kZXg6IG51bWJlclxuKSB7XG4gICAgY29uc3QgeyBkZWxldGVDb3VudCB9ID0gZ2V0SW5kZXhBbmREZWxldGVDb3VudEJ5S2V5UG9pbnQoYm9hcmQsIGVsZW1lbnQsIGRhdGFQb2ludHMsIG5leHRSZW5kZXJQb2ludHMsIGhhbmRsZUluZGV4KTtcbiAgICBpZiAoZGVsZXRlQ291bnQgIT09IG51bGwgJiYgZGVsZXRlQ291bnQgPiAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWRLZXlQb2ludHMoc2ltcGxpZmllZE5leHRLZXlQb2ludHM6IFBvaW50W10sIHN0YXJ0UG9pbnQ6IFBvaW50LCBlbmRQb2ludDogUG9pbnQpIHtcbiAgICBsZXQgbWlkRWxib3dQb2ludHM6IFBvaW50W10gPSBbXTtcbiAgICBsZXQgc3RhcnRQb2ludEluZGV4ID0gLTE7XG4gICAgbGV0IGVuZFBvaW50SW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpbXBsaWZpZWROZXh0S2V5UG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtzaW1wbGlmaWVkTmV4dEtleVBvaW50c1tpXSwgc3RhcnRQb2ludF0pKSB7XG4gICAgICAgICAgICBzdGFydFBvaW50SW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydFBvaW50SW5kZXggPiAtMSAmJiBQb2ludC5pc0FsaWduKFtzaW1wbGlmaWVkTmV4dEtleVBvaW50c1tpXSwgZW5kUG9pbnRdKSkge1xuICAgICAgICAgICAgZW5kUG9pbnRJbmRleCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnRQb2ludEluZGV4ID4gLTEgJiYgZW5kUG9pbnRJbmRleCA+IC0xKSB7XG4gICAgICAgIG1pZEVsYm93UG9pbnRzID0gc2ltcGxpZmllZE5leHRLZXlQb2ludHMuc2xpY2Uoc3RhcnRQb2ludEluZGV4LCBlbmRQb2ludEluZGV4ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBtaWRFbGJvd1BvaW50cztcbn1cblxuZnVuY3Rpb24gZmluZE9ydGhvZ29uYWxQYXJhbGxlbFNlZ21lbnRzKHNlZ21lbnQ6IFtQb2ludCwgUG9pbnRdLCBrZXlQb2ludHM6IFBvaW50W10pOiBbUG9pbnQsIFBvaW50XVtdIHtcbiAgICBjb25zdCBpc0hvcml6b250YWxTZWdtZW50ID0gUG9pbnQuaXNIb3Jpem9udGFsKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgIGNvbnN0IHBhcmFsbGVsU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5UG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0ga2V5UG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBuZXh0ID0ga2V5UG9pbnRzW2kgKyAxXTtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKGN1cnJlbnQsIG5leHQsIDAuMSk7XG4gICAgICAgIGlmIChpc0hvcml6b250YWxTZWdtZW50ICYmIGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgcGFyYWxsZWxTZWdtZW50cy5wdXNoKFtjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0hvcml6b250YWxTZWdtZW50ICYmICFpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIHBhcmFsbGVsU2VnbWVudHMucHVzaChbY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFsbGVsU2VnbWVudHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRNaXJyb3JTZWdtZW50cyhcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBzZWdtZW50OiBbUG9pbnQsIFBvaW50XSxcbiAgICBwYXJhbGxlbFNlZ21lbnRzOiBbUG9pbnQsIFBvaW50XVtdLFxuICAgIHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LFxuICAgIHRhcmdldFJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50XG4pIHtcbiAgICBkZWJ1Z0dlbmVyYXRvci5pc0RlYnVnKCkgJiYgZGVidWdHZW5lcmF0b3IuY2xlYXIoKTtcblxuICAgIGNvbnN0IG1pcnJvclNlZ21lbnRzOiBbUG9pbnQsIFBvaW50XVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhcmFsbGVsU2VnbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHBhcmFsbGVsUGF0aCA9IHBhcmFsbGVsU2VnbWVudHNbaW5kZXhdO1xuICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gW3NlZ21lbnRbMF1bMF0sIHNlZ21lbnRbMF1bMV1dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IFtzZWdtZW50WzFdWzBdLCBzZWdtZW50WzFdWzFdXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgY29uc3QgYWRqdXN0RGF0YUluZGV4ID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG4gICAgICAgIHN0YXJ0UG9pbnRbYWRqdXN0RGF0YUluZGV4XSA9IHBhcmFsbGVsUGF0aFswXVthZGp1c3REYXRhSW5kZXhdO1xuICAgICAgICBlbmRQb2ludFthZGp1c3REYXRhSW5kZXhdID0gcGFyYWxsZWxQYXRoWzFdW2FkanVzdERhdGFJbmRleF07XG4gICAgICAgIGNvbnN0IGZha2VSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3N0YXJ0UG9pbnQsIGVuZFBvaW50LCAuLi5wYXJhbGxlbFBhdGhdKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9ICFSZWN0YW5nbGVDbGllbnQuaXNIaXQoZmFrZVJlY3RhbmdsZSwgc291cmNlUmVjdGFuZ2xlKSAmJiAhUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KGZha2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSk7XG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICBtaXJyb3JTZWdtZW50cy5wdXNoKFtzdGFydFBvaW50LCBlbmRQb2ludF0pO1xuXG4gICAgICAgICAgICBkZWJ1Z0dlbmVyYXRvci5pc0RlYnVnKCkgJiYgZGVidWdHZW5lcmF0b3IuZHJhd1BvbHlnb24oYm9hcmQsIFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMoZmFrZVJlY3RhbmdsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtaXJyb3JTZWdtZW50cztcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0lsbGVnYWxFbGJvd1BvaW50ID0gKG1pZERhdGFQb2ludHM6IFBvaW50W10pOiBib29sZWFuID0+IHtcbiAgICBpZiAobWlkRGF0YVBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBtaWREYXRhUG9pbnRzLnNvbWUoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVBvaW50ID0gbWlkRGF0YVBvaW50c1tpbmRleCAtIDFdO1xuICAgICAgICBjb25zdCBhZnRlclBvaW50ID0gbWlkRGF0YVBvaW50c1tpbmRleCArIDFdO1xuICAgICAgICBjb25zdCBiZWZvcmVTZWdtZW50ID0gYmVmb3JlUG9pbnQgJiYgW2JlZm9yZVBvaW50LCBpdGVtXTtcbiAgICAgICAgY29uc3QgYWZ0ZXJTZWdtZW50ID0gYWZ0ZXJQb2ludCAmJiBbaXRlbSwgYWZ0ZXJQb2ludF07XG4gICAgICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQmVmb3JlID0gYmVmb3JlU2VnbWVudCAmJiBQb2ludC5pc0FsaWduKGJlZm9yZVNlZ21lbnQpO1xuICAgICAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEFmdGVyID0gYWZ0ZXJTZWdtZW50ICYmIFBvaW50LmlzQWxpZ24oYWZ0ZXJTZWdtZW50KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gIWlzU3RyYWlnaHRXaXRoQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID09PSBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiAhaXNTdHJhaWdodFdpdGhCZWZvcmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFpc1N0cmFpZ2h0V2l0aEJlZm9yZSAmJiAhaXNTdHJhaWdodFdpdGhBZnRlcjtcbiAgICB9KTtcbn07XG4iXX0=
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1yZXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2xpbmUtcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0Msc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFjLEtBQUssRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDO0FBQzNDLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWdCLEVBQUUsV0FBa0IsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSw4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TUFBTSxtQkFBbUIsR0FBRyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDakMsQ0FBQztRQUNELE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxib3dMaW5lUm91dGVPcHRpb25zLCBSZXNpemVTdGF0ZSwgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSwgcmVtb3ZlRHVwbGljYXRlUG9pbnRzLCBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBSZWN0YW5nbGVDbGllbnQsIGNyZWF0ZURlYnVnR2VuZXJhdG9yIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTElORV9BTElHTl9UT0xFUkFOQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbGluZSc7XG5pbXBvcnQgeyBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMsIGdldExpbmVIYW5kbGVSZWZQYWlyIH0gZnJvbSAnLi9saW5lLWNvbW1vbic7XG5pbXBvcnQgeyBQbGFpdExpbmUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcblxuY29uc3QgZGVidWdLZXkgPSAnZGVidWc6cGxhaXQ6bGluZS1taXJyb3InO1xuY29uc3QgZGVidWdHZW5lcmF0b3IgPSBjcmVhdGVEZWJ1Z0dlbmVyYXRvcihkZWJ1Z0tleSk7XG5cbmV4cG9ydCBjb25zdCBhbGlnblBvaW50cyA9IChiYXNlUG9pbnQ6IFBvaW50LCBtb3ZpbmdQb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBuZXdQb2ludDogUG9pbnQgPSBbLi4ubW92aW5nUG9pbnRdO1xuICAgIGlmIChQb2ludC5pc1ZlcnRpY2FsKG5ld1BvaW50LCBiYXNlUG9pbnQsIExJTkVfQUxJR05fVE9MRVJBTkNFKSkge1xuICAgICAgICBuZXdQb2ludFswXSA9IGJhc2VQb2ludFswXTtcbiAgICB9XG4gICAgaWYgKFBvaW50LmlzSG9yaXpvbnRhbChuZXdQb2ludCwgYmFzZVBvaW50LCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkpIHtcbiAgICAgICAgbmV3UG9pbnRbMV0gPSBiYXNlUG9pbnRbMV07XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQobmV4dFJlbmRlclBvaW50czogUG9pbnRbXSwgc291cmNlUG9pbnQ6IFBvaW50LCB0YXJnZXRQb2ludDogUG9pbnQsIGhhbmRsZUluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZWZlcmVuY2VQb2ludDogeyBwcmV2aW91czogUG9pbnQgfCBudWxsOyBuZXh0OiBQb2ludCB8IG51bGwgfSA9IHtcbiAgICAgICAgcHJldmlvdXM6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhcnRQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXhdO1xuICAgIGNvbnN0IGVuZFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDFdO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IFBvaW50LmlzSG9yaXpvbnRhbChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgY29uc3QgaXNWZXJ0aWNhbCA9IFBvaW50LmlzVmVydGljYWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgIGNvbnN0IHByZXZpb3VzUG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4IC0gMV0gPz8gbmV4dFJlbmRlclBvaW50c1swXTtcbiAgICBjb25zdCBiZWZvcmVQcmV2aW91c1BvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCAtIDJdID8/IHNvdXJjZVBvaW50O1xuICAgIGlmIChcbiAgICAgICAgKGlzSG9yaXpvbnRhbCAmJiBQb2ludC5pc0hvcml6b250YWwoYmVmb3JlUHJldmlvdXNQb2ludCwgcHJldmlvdXNQb2ludCkpIHx8XG4gICAgICAgIChpc1ZlcnRpY2FsICYmIFBvaW50LmlzVmVydGljYWwoYmVmb3JlUHJldmlvdXNQb2ludCwgcHJldmlvdXNQb2ludCkpXG4gICAgKSB7XG4gICAgICAgIHJlZmVyZW5jZVBvaW50LnByZXZpb3VzID0gcHJldmlvdXNQb2ludDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgMl0gPz8gbmV4dFJlbmRlclBvaW50c1tuZXh0UmVuZGVyUG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFmdGVyTmV4dFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDNdID8/IHRhcmdldFBvaW50O1xuICAgIGlmICgoaXNIb3Jpem9udGFsICYmIFBvaW50LmlzSG9yaXpvbnRhbChuZXh0UG9pbnQsIGFmdGVyTmV4dFBvaW50KSkgfHwgKGlzVmVydGljYWwgJiYgUG9pbnQuaXNWZXJ0aWNhbChuZXh0UG9pbnQsIGFmdGVyTmV4dFBvaW50KSkpIHtcbiAgICAgICAgcmVmZXJlbmNlUG9pbnQubmV4dCA9IG5leHRQb2ludDtcbiAgICB9XG4gICAgcmV0dXJuIHJlZmVyZW5jZVBvaW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ25FbGJvd1NlZ21lbnQoXG4gICAgc3RhcnRLZXlQb2ludDogUG9pbnQsXG4gICAgZW5kS2V5UG9pbnQ6IFBvaW50LFxuICAgIHJlc2l6ZVN0YXRlOiBSZXNpemVTdGF0ZSxcbiAgICByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQ6IHsgcHJldmlvdXM6IFBvaW50IHwgbnVsbDsgbmV4dDogUG9pbnQgfCBudWxsIH1cbikge1xuICAgIGxldCBuZXdTdGFydFBvaW50ID0gc3RhcnRLZXlQb2ludDtcbiAgICBsZXQgbmV3RW5kUG9pbnQgPSBlbmRLZXlQb2ludDtcbiAgICBpZiAoUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50KSkge1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gUG9pbnQuZ2V0T2Zmc2V0WShyZXNpemVTdGF0ZS5zdGFydFBvaW50LCByZXNpemVTdGF0ZS5lbmRQb2ludCk7XG4gICAgICAgIGxldCBwb2ludFkgPSBzdGFydEtleVBvaW50WzFdICsgb2Zmc2V0WTtcbiAgICAgICAgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91cyAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXNbMV0gLSBwb2ludFkpIDwgTElORV9BTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50WSA9IHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dCAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFsxXSAtIHBvaW50WSkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRZID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHRbMV07XG4gICAgICAgIH1cbiAgICAgICAgbmV3U3RhcnRQb2ludCA9IFtzdGFydEtleVBvaW50WzBdLCBwb2ludFldO1xuICAgICAgICBuZXdFbmRQb2ludCA9IFtlbmRLZXlQb2ludFswXSwgcG9pbnRZXTtcbiAgICB9XG4gICAgaWYgKFBvaW50LmlzVmVydGljYWwoc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBQb2ludC5nZXRPZmZzZXRYKHJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQsIHJlc2l6ZVN0YXRlLmVuZFBvaW50KTtcbiAgICAgICAgbGV0IHBvaW50WCA9IHN0YXJ0S2V5UG9pbnRbMF0gKyBvZmZzZXRYO1xuICAgICAgICBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1swXSAtIHBvaW50WCkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRYID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0ICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzBdIC0gcG9pbnRYKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFggPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFswXTtcbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFBvaW50ID0gW3BvaW50WCwgc3RhcnRLZXlQb2ludFsxXV07XG4gICAgICAgIG5ld0VuZFBvaW50ID0gW3BvaW50WCwgZW5kS2V5UG9pbnRbMV1dO1xuICAgIH1cbiAgICByZXR1cm4gW25ld1N0YXJ0UG9pbnQsIG5ld0VuZFBvaW50XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4QW5kRGVsZXRlQ291bnRCeUtleVBvaW50KFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGVsZW1lbnQ6IFBsYWl0TGluZSxcbiAgICBkYXRhUG9pbnRzOiBQb2ludFtdLFxuICAgIG5leHRSZW5kZXJQb2ludHM6IFBvaW50W10sXG4gICAgaGFuZGxlSW5kZXg6IG51bWJlclxuKSB7XG4gICAgbGV0IGluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZGVsZXRlQ291bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcnRLZXlQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXhdO1xuICAgIGNvbnN0IGVuZEtleVBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDFdO1xuICAgIGlmICghc3RhcnRLZXlQb2ludCB8fCAhZW5kS2V5UG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgZGVsZXRlQ291bnRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbWlkRGF0YVBvaW50cyA9IGRhdGFQb2ludHMuc2xpY2UoMSwgLTEpO1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBtaWREYXRhUG9pbnRzLmZpbmRJbmRleChpdGVtID0+IFBvaW50LmlzRXF1YWxzKGl0ZW0sIHN0YXJ0S2V5UG9pbnQpKTtcbiAgICBjb25zdCBlbmRJbmRleCA9IG1pZERhdGFQb2ludHMuZmluZEluZGV4KGl0ZW0gPT4gUG9pbnQuaXNFcXVhbHMoaXRlbSwgZW5kS2V5UG9pbnQpKTtcblxuICAgIGlmIChNYXRoLm1heChzdGFydEluZGV4LCBlbmRJbmRleCkgPiAtMSkge1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xICYmIGVuZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiAtMSAmJiBlbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVwbGFjZSA9XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA8IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgIFBvaW50LmlzQWxpZ24oW21pZERhdGFQb2ludHNbc3RhcnRJbmRleF0sIG1pZERhdGFQb2ludHNbc3RhcnRJbmRleCArIDFdLCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pO1xuICAgICAgICAgICAgaWYgKGlzUmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMlxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSAmJiBlbmRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBpc1JlcGxhY2UgPVxuICAgICAgICAgICAgICAgIGVuZEluZGV4ID4gMCAmJiBQb2ludC5pc0FsaWduKFttaWREYXRhUG9pbnRzW2VuZEluZGV4XSwgbWlkRGF0YVBvaW50c1tlbmRJbmRleCAtIDFdLCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pO1xuICAgICAgICAgICAgaWYgKGlzUmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBlbmRJbmRleCAtIDEsXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVuZEluZGV4LFxuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBvaW50ID0gbWlkRGF0YVBvaW50c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRQb2ludCA9IG1pZERhdGFQb2ludHNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW2N1cnJlbnRQb2ludCwgbmV4dFBvaW50LCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgc3RhcnRLZXlQb2ludF0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1pbihpICsgMSwgbWlkRGF0YVBvaW50cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIGVuZEtleVBvaW50XSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IE1hdGgubWF4KGkgLSAxLCAwKTtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgICAgaWYgKG1pZERhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldExpbmVIYW5kbGVSZWZQYWlyKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGdldEVsYm93TGluZVJvdXRlT3B0aW9ucyhib2FyZCwgZWxlbWVudCwgaGFuZGxlUmVmUGFpcik7XG4gICAgICAgICAgICBjb25zdCBrZXlQb2ludHMgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMoZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZShwYXJhbXMsIGJvYXJkKSk7XG4gICAgICAgICAgICBjb25zdCBuZXh0S2V5UG9pbnRzID0gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKGtleVBvaW50cy5zbGljZSgxLCBrZXlQb2ludHMubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgY29uc3QgbmV4dERhdGFQb2ludHMgPSBbbmV4dFJlbmRlclBvaW50c1swXSwgLi4ubWlkRGF0YVBvaW50cywgbmV4dFJlbmRlclBvaW50c1tuZXh0UmVuZGVyUG9pbnRzLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgIGNvbnN0IG1pcnJvckRhdGFQb2ludHMgPSBnZXRNaXJyb3JEYXRhUG9pbnRzKGJvYXJkLCBuZXh0RGF0YVBvaW50cywgbmV4dEtleVBvaW50cywgcGFyYW1zKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBoYW5kbGVJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IG1pcnJvckRhdGFQb2ludHMuc2xpY2UoMSwgLTEpLmZpbmRJbmRleChpdGVtID0+IFBvaW50LmlzRXF1YWxzKGl0ZW0sIG5leHRSZW5kZXJQb2ludHNbaV0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcHJldmlvdXNJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHJlbmRlclBvaW50cyBpcyBhIHN0cmFpZ2h0IGxpbmUgYW5kIGRhdGFQb2ludHMgYXJlIG5vdCBvbiB0aGUgbGluZSxcbiAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCAnZGVsZXRlQ291bnQnIGlzIHNldCB0byBtaWREYXRhUG9pbnRzLmxlbmd0aC5cbiAgICAgICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihuZXh0UmVuZGVyUG9pbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IG1pZERhdGFQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4LFxuICAgICAgICBkZWxldGVDb3VudFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaXJyb3JEYXRhUG9pbnRzKGJvYXJkOiBQbGFpdEJvYXJkLCBuZXh0RGF0YVBvaW50czogUG9pbnRbXSwgbmV4dEtleVBvaW50czogUG9pbnRbXSwgcGFyYW1zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgbmV4dERhdGFQb2ludHMubGVuZ3RoIC0gMjsgaW5kZXgrKykge1xuICAgICAgICBhZGp1c3RCeUN1c3RvbVBvaW50U3RhcnRJbmRleChib2FyZCwgaW5kZXgsIG5leHREYXRhUG9pbnRzLCBuZXh0S2V5UG9pbnRzLCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dERhdGFQb2ludHM7XG59XG5cbi8qKlxuICogYWRqdXN0IGJhc2VkIHBhcmFsbGVsIHNlZ21lbnRcbiAqL1xuY29uc3QgYWRqdXN0QnlDdXN0b21Qb2ludFN0YXJ0SW5kZXggPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgY3VzdG9tUG9pbnRTdGFydEluZGV4OiBudW1iZXIsXG4gICAgbmV4dERhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dEtleVBvaW50czogUG9pbnRbXSxcbiAgICBwYXJhbXM6IEVsYm93TGluZVJvdXRlT3B0aW9uc1xuKSA9PiB7XG4gICAgY29uc3QgYmVmb3JlUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggLSAxXTtcbiAgICBjb25zdCBzdGFydFBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4XTtcbiAgICBjb25zdCBlbmRQb2ludCA9IG5leHREYXRhUG9pbnRzW2N1c3RvbVBvaW50U3RhcnRJbmRleCArIDFdO1xuICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAyXTtcbiAgICBjb25zdCBiZWZvcmVTZWdtZW50ID0gW2JlZm9yZVBvaW50LCBzdGFydFBvaW50XTtcbiAgICBjb25zdCBhZnRlclNlZ21lbnQgPSBbZW5kUG9pbnQsIGFmdGVyUG9pbnRdO1xuICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQmVmb3JlID0gUG9pbnQuaXNBbGlnbihiZWZvcmVTZWdtZW50KTtcbiAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEFmdGVyID0gUG9pbnQuaXNBbGlnbihhZnRlclNlZ21lbnQpO1xuICAgIGxldCBpc0FkanVzdFN0YXJ0ID0gZmFsc2U7XG4gICAgbGV0IGlzQWRqdXN0RW5kID0gZmFsc2U7XG4gICAgaWYgKCFpc1N0cmFpZ2h0V2l0aEJlZm9yZSB8fCAhaXNTdHJhaWdodFdpdGhBZnRlcikge1xuICAgICAgICBjb25zdCBtaWRLZXlQb2ludHNXaXRoQmVmb3JlID0gZ2V0TWlkS2V5UG9pbnRzKG5leHRLZXlQb2ludHMsIGJlZm9yZVNlZ21lbnRbMF0sIGJlZm9yZVNlZ21lbnRbMV0pO1xuICAgICAgICBjb25zdCBtaWRLZXlQb2ludHNXaXRoQWZ0ZXIgPSBnZXRNaWRLZXlQb2ludHMobmV4dEtleVBvaW50cywgYWZ0ZXJTZWdtZW50WzBdLCBhZnRlclNlZ21lbnRbMV0pO1xuICAgICAgICBjb25zdCBoYXNNaWRLZXlQb2ludHMgPSBtaWRLZXlQb2ludHNXaXRoQmVmb3JlLmxlbmd0aCA+IDAgJiYgbWlkS2V5UG9pbnRzV2l0aEFmdGVyLmxlbmd0aCA+IDA7XG4gICAgICAgIGlzQWRqdXN0U3RhcnQgPSAhaXNTdHJhaWdodFdpdGhCZWZvcmUgJiYgIWhhc01pZEtleVBvaW50cztcbiAgICAgICAgaXNBZGp1c3RFbmQgPSAhaXNTdHJhaWdodFdpdGhBZnRlciAmJiAhaGFzTWlkS2V5UG9pbnRzO1xuICAgIH1cbiAgICBpZiAoaXNBZGp1c3RTdGFydCB8fCBpc0FkanVzdEVuZCkge1xuICAgICAgICBjb25zdCBwYXJhbGxlbFNlZ21lbnQgPSBbc3RhcnRQb2ludCwgZW5kUG9pbnRdIGFzIFtQb2ludCwgUG9pbnRdO1xuICAgICAgICBjb25zdCBwYXJhbGxlbFNlZ21lbnRzID0gZmluZE9ydGhvZ29uYWxQYXJhbGxlbFNlZ21lbnRzKHBhcmFsbGVsU2VnbWVudCwgbmV4dEtleVBvaW50cyk7XG4gICAgICAgIGNvbnN0IG1pcnJvclNlZ21lbnRzID0gZmluZE1pcnJvclNlZ21lbnRzKGJvYXJkLCBwYXJhbGxlbFNlZ21lbnQsIHBhcmFsbGVsU2VnbWVudHMsIHBhcmFtcy5zb3VyY2VSZWN0YW5nbGUsIHBhcmFtcy50YXJnZXRSZWN0YW5nbGUpO1xuICAgICAgICBpZiAobWlycm9yU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBtaXJyb3JTZWdtZW50ID0gbWlycm9yU2VnbWVudHNbMF07XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RTdGFydCkge1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXgsIDEsIG1pcnJvclNlZ21lbnRbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQWRqdXN0RW5kKSB7XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCArIDEsIDEsIG1pcnJvclNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgICAgIGNvbnN0IGFkanVzdEluZGV4ID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RTdGFydCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXJ0UG9pbnQgPSBbc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXV0gYXMgUG9pbnQ7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRQb2ludFthZGp1c3RJbmRleF0gPSBiZWZvcmVQb2ludFthZGp1c3RJbmRleF07XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCwgMSwgbmV3U3RhcnRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RFbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdFbmRQb2ludCA9IFtlbmRQb2ludFswXSwgZW5kUG9pbnRbMV1dIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIG5ld0VuZFBvaW50W2FkanVzdEluZGV4XSA9IGFmdGVyUG9pbnRbYWRqdXN0SW5kZXhdO1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAxLCAxLCBuZXdFbmRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVcGRhdGVkSGFuZGxlSW5kZXgoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRMaW5lLFxuICAgIGRhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dFJlbmRlclBvaW50czogUG9pbnRbXSxcbiAgICBoYW5kbGVJbmRleDogbnVtYmVyXG4pIHtcbiAgICBjb25zdCB7IGRlbGV0ZUNvdW50IH0gPSBnZXRJbmRleEFuZERlbGV0ZUNvdW50QnlLZXlQb2ludChib2FyZCwgZWxlbWVudCwgZGF0YVBvaW50cywgbmV4dFJlbmRlclBvaW50cywgaGFuZGxlSW5kZXgpO1xuICAgIGlmIChkZWxldGVDb3VudCAhPT0gbnVsbCAmJiBkZWxldGVDb3VudCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pZEtleVBvaW50cyhzaW1wbGlmaWVkTmV4dEtleVBvaW50czogUG9pbnRbXSwgc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCkge1xuICAgIGxldCBtaWRFbGJvd1BvaW50czogUG9pbnRbXSA9IFtdO1xuICAgIGxldCBzdGFydFBvaW50SW5kZXggPSAtMTtcbiAgICBsZXQgZW5kUG9pbnRJbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2ltcGxpZmllZE5leHRLZXlQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzW2ldLCBzdGFydFBvaW50XSkpIHtcbiAgICAgICAgICAgIHN0YXJ0UG9pbnRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0UG9pbnRJbmRleCA+IC0xICYmIFBvaW50LmlzQWxpZ24oW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzW2ldLCBlbmRQb2ludF0pKSB7XG4gICAgICAgICAgICBlbmRQb2ludEluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydFBvaW50SW5kZXggPiAtMSAmJiBlbmRQb2ludEluZGV4ID4gLTEpIHtcbiAgICAgICAgbWlkRWxib3dQb2ludHMgPSBzaW1wbGlmaWVkTmV4dEtleVBvaW50cy5zbGljZShzdGFydFBvaW50SW5kZXgsIGVuZFBvaW50SW5kZXggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIG1pZEVsYm93UG9pbnRzO1xufVxuXG5mdW5jdGlvbiBmaW5kT3J0aG9nb25hbFBhcmFsbGVsU2VnbWVudHMoc2VnbWVudDogW1BvaW50LCBQb2ludF0sIGtleVBvaW50czogUG9pbnRbXSk6IFtQb2ludCwgUG9pbnRdW10ge1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbFNlZ21lbnQgPSBQb2ludC5pc0hvcml6b250YWwoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgY29uc3QgcGFyYWxsZWxTZWdtZW50czogW1BvaW50LCBQb2ludF1bXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlQb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBrZXlQb2ludHNbaV07XG4gICAgICAgIGNvbnN0IG5leHQgPSBrZXlQb2ludHNbaSArIDFdO1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoY3VycmVudCwgbmV4dCwgMC4xKTtcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbFNlZ21lbnQgJiYgaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBwYXJhbGxlbFNlZ21lbnRzLnB1c2goW2N1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzSG9yaXpvbnRhbFNlZ21lbnQgJiYgIWlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgcGFyYWxsZWxTZWdtZW50cy5wdXNoKFtjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYWxsZWxTZWdtZW50cztcbn1cblxuZnVuY3Rpb24gZmluZE1pcnJvclNlZ21lbnRzKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIHNlZ21lbnQ6IFtQb2ludCwgUG9pbnRdLFxuICAgIHBhcmFsbGVsU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10sXG4gICAgc291cmNlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsXG4gICAgdGFyZ2V0UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnRcbikge1xuICAgIGRlYnVnR2VuZXJhdG9yLmlzRGVidWcoKSAmJiBkZWJ1Z0dlbmVyYXRvci5jbGVhcigpO1xuXG4gICAgY29uc3QgbWlycm9yU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFyYWxsZWxTZWdtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxQYXRoID0gcGFyYWxsZWxTZWdtZW50c1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBbc2VnbWVudFswXVswXSwgc2VnbWVudFswXVsxXV0gYXMgUG9pbnQ7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gW3NlZ21lbnRbMV1bMF0sIHNlZ21lbnRbMV1bMV1dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgICAgICBjb25zdCBhZGp1c3REYXRhSW5kZXggPSBpc0hvcml6b250YWwgPyAwIDogMTtcbiAgICAgICAgc3RhcnRQb2ludFthZGp1c3REYXRhSW5kZXhdID0gcGFyYWxsZWxQYXRoWzBdW2FkanVzdERhdGFJbmRleF07XG4gICAgICAgIGVuZFBvaW50W2FkanVzdERhdGFJbmRleF0gPSBwYXJhbGxlbFBhdGhbMV1bYWRqdXN0RGF0YUluZGV4XTtcbiAgICAgICAgY29uc3QgZmFrZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbc3RhcnRQb2ludCwgZW5kUG9pbnQsIC4uLnBhcmFsbGVsUGF0aF0pO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gIVJlY3RhbmdsZUNsaWVudC5pc0hpdChmYWtlUmVjdGFuZ2xlLCBzb3VyY2VSZWN0YW5nbGUpICYmICFSZWN0YW5nbGVDbGllbnQuaXNIaXQoZmFrZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgIG1pcnJvclNlZ21lbnRzLnB1c2goW3N0YXJ0UG9pbnQsIGVuZFBvaW50XSk7XG5cbiAgICAgICAgICAgIGRlYnVnR2VuZXJhdG9yLmlzRGVidWcoKSAmJiBkZWJ1Z0dlbmVyYXRvci5kcmF3UG9seWdvbihib2FyZCwgUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyhmYWtlUmVjdGFuZ2xlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1pcnJvclNlZ21lbnRzO1xufVxuXG5leHBvcnQgY29uc3QgaGFzSWxsZWdhbEVsYm93UG9pbnQgPSAobWlkRGF0YVBvaW50czogUG9pbnRbXSk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChtaWREYXRhUG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1pZERhdGFQb2ludHMuc29tZSgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYmVmb3JlUG9pbnQgPSBtaWREYXRhUG9pbnRzW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBtaWREYXRhUG9pbnRzW2luZGV4ICsgMV07XG4gICAgICAgIGNvbnN0IGJlZm9yZVNlZ21lbnQgPSBiZWZvcmVQb2ludCAmJiBbYmVmb3JlUG9pbnQsIGl0ZW1dO1xuICAgICAgICBjb25zdCBhZnRlclNlZ21lbnQgPSBhZnRlclBvaW50ICYmIFtpdGVtLCBhZnRlclBvaW50XTtcbiAgICAgICAgY29uc3QgaXNTdHJhaWdodFdpdGhCZWZvcmUgPSBiZWZvcmVTZWdtZW50ICYmIFBvaW50LmlzQWxpZ24oYmVmb3JlU2VnbWVudCk7XG4gICAgICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQWZ0ZXIgPSBhZnRlclNlZ21lbnQgJiYgUG9pbnQuaXNBbGlnbihhZnRlclNlZ21lbnQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAhaXNTdHJhaWdodFdpdGhBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuICFpc1N0cmFpZ2h0V2l0aEJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzU3RyYWlnaHRXaXRoQmVmb3JlICYmICFpc1N0cmFpZ2h0V2l0aEFmdGVyO1xuICAgIH0pO1xufTtcbiJdfQ==
|
|
@@ -1,30 +1,60 @@
|
|
|
1
|
-
import { RectangleClient, depthFirstRecursion, getIsRecursionFunc, rotatePoints, rotateAntiPointsByElement } from '@plait/core';
|
|
1
|
+
import { PlaitBoard, RectangleClient, depthFirstRecursion, getIsRecursionFunc, rotatePoints, rotateAntiPointsByElement } from '@plait/core';
|
|
2
|
+
import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, getRotatedResizeCursorClassByAngle } from '@plait/common';
|
|
2
3
|
import { PlaitDrawElement } from '../../interfaces';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { isHitEdgeOfShape, isInsideOfShape } from '../hit';
|
|
5
|
+
import { LINE_HIT_GEOMETRY_BUFFER, LINE_SNAPPING_BUFFER } from '../../constants/geometry';
|
|
6
|
+
import { getNearestPoint } from '../geometry';
|
|
7
|
+
import { getHitConnectorPoint } from '../line/line-basic';
|
|
6
8
|
export const getHitRectangleResizeHandleRef = (board, rectangle, point, angle = 0) => {
|
|
7
9
|
const centerPoint = RectangleClient.getCenterPoint(rectangle);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const resizeHandleRefs = getRectangleResizeHandleRefs(rectangle, RESIZE_HANDLE_DIAMETER);
|
|
11
|
+
if (angle) {
|
|
12
|
+
const rotatedPoint = rotatePoints([point], centerPoint, -angle)[0];
|
|
13
|
+
let result = resizeHandleRefs.find(resizeHandleRef => {
|
|
14
|
+
return RectangleClient.isHit(RectangleClient.getRectangleByPoints([rotatedPoint, rotatedPoint]), resizeHandleRef.rectangle);
|
|
15
|
+
});
|
|
16
|
+
if (result) {
|
|
17
|
+
result.cursorClass = getRotatedResizeCursorClassByAngle(result.cursorClass, angle);
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return resizeHandleRefs.find(resizeHandleRef => {
|
|
23
|
+
return RectangleClient.isHit(RectangleClient.getRectangleByPoints([point, point]), resizeHandleRef.rectangle);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export const getSnappingGeometry = (board, point) => {
|
|
28
|
+
let hitElement = getHitGeometry(board, point);
|
|
29
|
+
if (hitElement) {
|
|
30
|
+
const ref = getSnappingRef(board, hitElement, point);
|
|
31
|
+
if (ref.isHitConnector || ref.isHitEdge) {
|
|
32
|
+
return hitElement;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
export const getSnappingRef = (board, hitElement, point) => {
|
|
38
|
+
const rotatedPoint = rotateAntiPointsByElement(point, hitElement) || point;
|
|
39
|
+
const connectorPoint = getHitConnectorPoint(rotatedPoint, hitElement);
|
|
40
|
+
const edgePoint = getNearestPoint(hitElement, rotatedPoint);
|
|
41
|
+
const isHitEdge = isHitEdgeOfShape(board, hitElement, rotatedPoint, LINE_SNAPPING_BUFFER);
|
|
42
|
+
return { isHitEdge, isHitConnector: !!connectorPoint, connectorPoint, edgePoint };
|
|
43
|
+
};
|
|
44
|
+
export const getHitGeometry = (board, point, offset = LINE_HIT_GEOMETRY_BUFFER) => {
|
|
45
|
+
let hitShape = null;
|
|
46
|
+
traverseDrawShapes(board, (element) => {
|
|
47
|
+
if (hitShape === null && isInsideOfShape(board, element, rotateAntiPointsByElement(point, element) || point, offset * 2)) {
|
|
48
|
+
hitShape = element;
|
|
49
|
+
}
|
|
12
50
|
});
|
|
13
|
-
return
|
|
51
|
+
return hitShape;
|
|
14
52
|
};
|
|
15
|
-
export const
|
|
16
|
-
let geometry = null;
|
|
53
|
+
export const traverseDrawShapes = (board, callback) => {
|
|
17
54
|
depthFirstRecursion(board, node => {
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
client = RectangleClient.getOutlineRectangle(client, offset);
|
|
21
|
-
const shape = getShape(node);
|
|
22
|
-
const isHit = getEngine(shape).isInsidePoint(client, rotateAntiPointsByElement(point, node) || point);
|
|
23
|
-
if (isHit) {
|
|
24
|
-
geometry = node;
|
|
25
|
-
}
|
|
55
|
+
if (!PlaitBoard.isBoard(node) && PlaitDrawElement.isShapeElement(node)) {
|
|
56
|
+
callback(node);
|
|
26
57
|
}
|
|
27
58
|
}, getIsRecursionFunc(board), true);
|
|
28
|
-
return geometry;
|
|
29
59
|
};
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9wb3NpdGlvbi9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsVUFBVSxFQUVWLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWix5QkFBeUIsRUFDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLGtDQUFrQyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxnQkFBZ0IsRUFBb0MsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzNELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsS0FBWSxFQUFFLFFBQWdCLENBQUMsRUFBRSxFQUFFO0lBQzdILE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN6RixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1IsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFN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SSxDQUFDLEVBQUU7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQztJQUNMLENBQUMsRUFDRCxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDekIsSUFBSSxDQUNQLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFuY2VzdG9yLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGRlcHRoRmlyc3RSZWN1cnNpb24sXG4gICAgZ2V0SXNSZWN1cnNpb25GdW5jLFxuICAgIHJvdGF0ZVBvaW50cyxcbiAgICByb3RhdGVBbnRpUG9pbnRzQnlFbGVtZW50XG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFJFU0laRV9IQU5ETEVfRElBTUVURVIsIGdldFJlY3RhbmdsZVJlc2l6ZUhhbmRsZVJlZnMsIGdldFJvdGF0ZWRSZXNpemVDdXJzb3JDbGFzc0J5QW5nbGUgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IFBsYWl0RHJhd0VsZW1lbnQsIFBsYWl0R2VvbWV0cnksIFBsYWl0U2hhcGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0hpdEVkZ2VPZlNoYXBlLCBpc0luc2lkZU9mU2hhcGUgfSBmcm9tICcuLi9oaXQnO1xuaW1wb3J0IHsgTElORV9ISVRfR0VPTUVUUllfQlVGRkVSLCBMSU5FX1NOQVBQSU5HX0JVRkZFUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9nZW9tZXRyeSc7XG5pbXBvcnQgeyBnZXROZWFyZXN0UG9pbnQgfSBmcm9tICcuLi9nZW9tZXRyeSc7XG5pbXBvcnQgeyBnZXRIaXRDb25uZWN0b3JQb2ludCB9IGZyb20gJy4uL2xpbmUvbGluZS1iYXNpYyc7XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWYgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQsIGFuZ2xlOiBudW1iZXIgPSAwKSA9PiB7XG4gICAgY29uc3QgY2VudGVyUG9pbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQocmVjdGFuZ2xlKTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVSZWZzID0gZ2V0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmcyhyZWN0YW5nbGUsIFJFU0laRV9IQU5ETEVfRElBTUVURVIpO1xuICAgIGlmIChhbmdsZSkge1xuICAgICAgICBjb25zdCByb3RhdGVkUG9pbnQgPSByb3RhdGVQb2ludHMoW3BvaW50XSwgY2VudGVyUG9pbnQsIC1hbmdsZSlbMF07XG4gICAgICAgIGxldCByZXN1bHQgPSByZXNpemVIYW5kbGVSZWZzLmZpbmQocmVzaXplSGFuZGxlUmVmID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQoUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtyb3RhdGVkUG9pbnQsIHJvdGF0ZWRQb2ludF0pLCByZXNpemVIYW5kbGVSZWYucmVjdGFuZ2xlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jdXJzb3JDbGFzcyA9IGdldFJvdGF0ZWRSZXNpemVDdXJzb3JDbGFzc0J5QW5nbGUocmVzdWx0LmN1cnNvckNsYXNzLCBhbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzaXplSGFuZGxlUmVmcy5maW5kKHJlc2l6ZUhhbmRsZVJlZiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbcG9pbnQsIHBvaW50XSksIHJlc2l6ZUhhbmRsZVJlZi5yZWN0YW5nbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U25hcHBpbmdHZW9tZXRyeSA9IChib2FyZDogUGxhaXRCb2FyZCwgcG9pbnQ6IFBvaW50KTogUGxhaXRHZW9tZXRyeSB8IG51bGwgPT4ge1xuICAgIGxldCBoaXRFbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCB8IG51bGwgPSBnZXRIaXRHZW9tZXRyeShib2FyZCwgcG9pbnQpO1xuICAgIGlmIChoaXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IGdldFNuYXBwaW5nUmVmKGJvYXJkLCBoaXRFbGVtZW50LCBwb2ludCk7XG4gICAgICAgIGlmIChyZWYuaXNIaXRDb25uZWN0b3IgfHwgcmVmLmlzSGl0RWRnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGhpdEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U25hcHBpbmdSZWYgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGhpdEVsZW1lbnQ6IFBsYWl0U2hhcGVFbGVtZW50LCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCByb3RhdGVkUG9pbnQgPSByb3RhdGVBbnRpUG9pbnRzQnlFbGVtZW50KHBvaW50LCBoaXRFbGVtZW50KSB8fCBwb2ludDtcbiAgICBjb25zdCBjb25uZWN0b3JQb2ludCA9IGdldEhpdENvbm5lY3RvclBvaW50KHJvdGF0ZWRQb2ludCwgaGl0RWxlbWVudCk7XG4gICAgY29uc3QgZWRnZVBvaW50ID0gZ2V0TmVhcmVzdFBvaW50KGhpdEVsZW1lbnQsIHJvdGF0ZWRQb2ludCk7XG4gICAgY29uc3QgaXNIaXRFZGdlID0gaXNIaXRFZGdlT2ZTaGFwZShib2FyZCwgaGl0RWxlbWVudCwgcm90YXRlZFBvaW50LCBMSU5FX1NOQVBQSU5HX0JVRkZFUik7XG4gICAgcmV0dXJuIHsgaXNIaXRFZGdlLCBpc0hpdENvbm5lY3RvcjogISFjb25uZWN0b3JQb2ludCwgY29ubmVjdG9yUG9pbnQsIGVkZ2VQb2ludCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdEdlb21ldHJ5ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIG9mZnNldCA9IExJTkVfSElUX0dFT01FVFJZX0JVRkZFUik6IFBsYWl0R2VvbWV0cnkgfCBudWxsID0+IHtcbiAgICBsZXQgaGl0U2hhcGU6IFBsYWl0U2hhcGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgdHJhdmVyc2VEcmF3U2hhcGVzKGJvYXJkLCAoZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGhpdFNoYXBlID09PSBudWxsICYmIGlzSW5zaWRlT2ZTaGFwZShib2FyZCwgZWxlbWVudCwgcm90YXRlQW50aVBvaW50c0J5RWxlbWVudChwb2ludCwgZWxlbWVudCkgfHwgcG9pbnQsIG9mZnNldCAqIDIpKSB7XG4gICAgICAgICAgICBoaXRTaGFwZSA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGl0U2hhcGU7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhdmVyc2VEcmF3U2hhcGVzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBjYWxsYmFjazogKGVsZW1lbnQ6IFBsYWl0U2hhcGVFbGVtZW50KSA9PiB2b2lkKSA9PiB7XG4gICAgZGVwdGhGaXJzdFJlY3Vyc2lvbjxBbmNlc3Rvcj4oXG4gICAgICAgIGJvYXJkLFxuICAgICAgICBub2RlID0+IHtcbiAgICAgICAgICAgIGlmICghUGxhaXRCb2FyZC5pc0JvYXJkKG5vZGUpICYmIFBsYWl0RHJhd0VsZW1lbnQuaXNTaGFwZUVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SXNSZWN1cnNpb25GdW5jKGJvYXJkKSxcbiAgICAgICAgdHJ1ZVxuICAgICk7XG59O1xuIl19
|