js-angusj-clipper
Version:
Polygon and line clipping and offsetting library for Javascript / Typescript - a port of Angus Johnson's clipper to WebAssembly / Asm.JS
71 lines • 14.7 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.offsetToPolyTree = exports.offsetToPaths = void 0;
var ClipperError_1 = require("./ClipperError");
var ClipperOffset_1 = require("./ClipperOffset");
var addPathOrPaths = function (offset, inputDatas) {
if (inputDatas === undefined) {
return;
}
// add each input
for (var i = 0, maxi = inputDatas.length; i < maxi; i++) {
var inputData = inputDatas[i];
// add the path/paths
var pathOrPaths = inputData.data;
if (!pathOrPaths || pathOrPaths.length <= 0) {
continue;
}
// is it a path or paths?
if (Array.isArray(pathOrPaths[0])) {
// paths
offset.addPaths(pathOrPaths, inputData.joinType, inputData.endType);
}
else {
// path
offset.addPath(pathOrPaths, inputData.joinType, inputData.endType);
}
}
};
function offsetToPathsOrPolyTree(polyTreeMode, nativeClipperLib, params) {
var filledData = __assign({ arcTolerance: 0.25, miterLimit: 2 }, params);
var offset = new ClipperOffset_1.ClipperOffset(nativeClipperLib, filledData.miterLimit, filledData.arcTolerance);
//noinspection UnusedCatchParameterJS
try {
addPathOrPaths(offset, params.offsetInputs);
if (!polyTreeMode) {
return offset.executeToPaths(params.delta, params.cleanDistance);
}
else {
if (params.cleanDistance !== undefined) {
throw new ClipperError_1.ClipperError("cleaning is not available for poly tree results");
}
return offset.executeToPolyTree(params.delta);
}
}
catch (err) {
return undefined;
}
finally {
offset.dispose();
}
}
function offsetToPaths(nativeClipperLib, params) {
return offsetToPathsOrPolyTree(false, nativeClipperLib, params);
}
exports.offsetToPaths = offsetToPaths;
function offsetToPolyTree(nativeClipperLib, params) {
return offsetToPathsOrPolyTree(true, nativeClipperLib, params);
}
exports.offsetToPolyTree = offsetToPolyTree;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2Zmc2V0RnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29mZnNldEZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE4QztBQUM5QyxpREFBZ0Q7QUEwRmhELElBQU0sY0FBYyxHQUFHLFVBQUMsTUFBcUIsRUFBRSxVQUFxQztJQUNsRixJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7UUFDNUIsT0FBTztLQUNSO0lBRUQsaUJBQWlCO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkQsSUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhDLHFCQUFxQjtRQUNyQixJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDM0MsU0FBUztTQUNWO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNqQyxRQUFRO1lBQ1IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUE0QixFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3RGO2FBQU07WUFDTCxPQUFPO1lBQ1AsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUEyQixFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BGO0tBQ0Y7QUFDSCxDQUFDLENBQUM7QUFFRixTQUFTLHVCQUF1QixDQUM5QixZQUFxQixFQUNyQixnQkFBMEMsRUFDMUMsTUFBb0I7SUFFcEIsSUFBTSxVQUFVLGNBQ2QsWUFBWSxFQUFFLElBQUksRUFDbEIsVUFBVSxFQUFFLENBQUMsSUFDVixNQUFNLENBQ1YsQ0FBQztJQUVGLElBQU0sTUFBTSxHQUFHLElBQUksNkJBQWEsQ0FDOUIsZ0JBQWdCLEVBQ2hCLFVBQVUsQ0FBQyxVQUFVLEVBQ3JCLFVBQVUsQ0FBQyxZQUFZLENBQ3hCLENBQUM7SUFFRixxQ0FBcUM7SUFDckMsSUFBSTtRQUNGLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2xFO2FBQU07WUFDTCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO2dCQUN0QyxNQUFNLElBQUksMkJBQVksQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO2FBQzNFO1lBQ0QsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9DO0tBQ0Y7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO1lBQVM7UUFDUixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUMzQixnQkFBMEMsRUFDMUMsTUFBb0I7SUFFcEIsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUFzQixDQUFDO0FBQ3ZGLENBQUM7QUFMRCxzQ0FLQztBQUVELFNBQWdCLGdCQUFnQixDQUM5QixnQkFBMEMsRUFDMUMsTUFBb0I7SUFFcEIsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUF5QixDQUFDO0FBQ3pGLENBQUM7QUFMRCw0Q0FLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaXBwZXJFcnJvciB9IGZyb20gXCIuL0NsaXBwZXJFcnJvclwiO1xyXG5pbXBvcnQgeyBDbGlwcGVyT2Zmc2V0IH0gZnJvbSBcIi4vQ2xpcHBlck9mZnNldFwiO1xyXG5pbXBvcnQgeyBFbmRUeXBlLCBKb2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XHJcbmltcG9ydCB7IE5hdGl2ZUNsaXBwZXJMaWJJbnN0YW5jZSB9IGZyb20gXCIuL25hdGl2ZS9OYXRpdmVDbGlwcGVyTGliSW5zdGFuY2VcIjtcclxuaW1wb3J0IHsgUGF0aCwgUmVhZG9ubHlQYXRoIH0gZnJvbSBcIi4vUGF0aFwiO1xyXG5pbXBvcnQgeyBQYXRocywgUmVhZG9ubHlQYXRocyB9IGZyb20gXCIuL1BhdGhzXCI7XHJcbmltcG9ydCB7IFBvbHlUcmVlIH0gZnJvbSBcIi4vUG9seVRyZWVcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHNpbmdsZSBpbnB1dCAob2YgbXVsdGlwbGUgcG9zc2libGUgaW5wdXRzKSBmb3IgdGhlIG9mZnNldFRvUGF0aHMgLyBvZmZzZXRUb1BvbHlUcmVlIG9wZXJhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgT2Zmc2V0SW5wdXQge1xyXG4gIC8qKlxyXG4gICAqIEpvaW4gdHlwZS5cclxuICAgKi9cclxuICBqb2luVHlwZTogSm9pblR5cGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuZCB0eXBlLlxyXG4gICAqL1xyXG4gIGVuZFR5cGU6IEVuZFR5cGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgb2Ygb25lIG9mIHRoZSBQYXRoIG9yIFBhdGhzIHRvIGJlIHVzZWQgaW4gcHJlcGFyYXRpb24gZm9yIG9mZnNldHRpbmcuXHJcbiAgICpcclxuICAgKiBBbGwgJ291dGVyJyBQYXRocyBtdXN0IGhhdmUgdGhlIHNhbWUgb3JpZW50YXRpb24sIGFuZCBhbnkgJ2hvbGUnIHBhdGhzIG11c3QgaGF2ZSByZXZlcnNlIG9yaWVudGF0aW9uLiBDbG9zZWQgcGF0aHMgbXVzdCBoYXZlIGF0IGxlYXN0IDMgdmVydGljZXMuXHJcbiAgICogT3BlbiBwYXRocyBtYXkgaGF2ZSBhcyBmZXcgYXMgb25lIHZlcnRleC4gT3BlbiBwYXRocyBjYW4gb25seSBiZSBvZmZzZXQgd2l0aCBwb3NpdGl2ZSBkZWx0YXMuXHJcbiAgICovXHJcbiAgZGF0YTogUmVhZG9ubHlQYXRoIHwgUmVhZG9ubHlQYXRocztcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcmFtcyBmb3IgdGhlIHBvbHlnb24gb2Zmc2V0IG9wZXJhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgT2Zmc2V0UGFyYW1zIHtcclxuICAvKipcclxuICAgKiBGaXJzdGx5LCB0aGlzIGZpZWxkL3Byb3BlcnR5IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBKb2luVHlwZSA9IFJvdW5kIGFuZC9vciBFbmRUeXBlID0gUm91bmQuXHJcbiAgICpcclxuICAgKiBTaW5jZSBmbGF0dGVuZWQgcGF0aHMgY2FuIG5ldmVyIHBlcmZlY3RseSByZXByZXNlbnQgYXJjcywgdGhpcyBmaWVsZC9wcm9wZXJ0eSBzcGVjaWZpZXMgYSBtYXhpbXVtIGFjY2VwdGFibGUgaW1wcmVjaXNpb24gKCd0b2xlcmFuY2UnKSB3aGVuIGFyY3MgYXJlXHJcbiAgICogYXBwcm94aW1hdGVkIGluIGFuIG9mZnNldHRpbmcgb3BlcmF0aW9uLiBTbWFsbGVyIHZhbHVlcyB3aWxsIGluY3JlYXNlICdzbW9vdGhuZXNzJyB1cCB0byBhIHBvaW50IHRob3VnaCBhdCBhIGNvc3Qgb2YgcGVyZm9ybWFuY2UgYW5kIGluIGNyZWF0aW5nIG1vcmVcclxuICAgKiB2ZXJ0aWNlcyB0byBjb25zdHJ1Y3QgdGhlIGFyYy5cclxuICAgKlxyXG4gICAqIFRoZSBkZWZhdWx0IEFyY1RvbGVyYW5jZSBpcyAwLjI1IHVuaXRzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1heGltdW0gZGlzdGFuY2UgdGhlIGZsYXR0ZW5lZCBwYXRoIHdpbGwgZGV2aWF0ZSBmcm9tIHRoZSAndHJ1ZScgYXJjIHdpbGwgYmUgbm8gbW9yZVxyXG4gICAqIHRoYW4gMC4yNSB1bml0cyAoYmVmb3JlIHJvdW5kaW5nKS5cclxuICAgKlxyXG4gICAqIFJlZHVjaW5nIHRvbGVyYW5jZXMgYmVsb3cgMC4yNSB3aWxsIG5vdCBpbXByb3ZlIHNtb290aG5lc3Mgc2luY2UgdmVydGV4IGNvb3JkaW5hdGVzIHdpbGwgc3RpbGwgYmUgcm91bmRlZCB0byBpbnRlZ2VyIHZhbHVlcy4gVGhlIG9ubHkgd2F5IHRvIGFjaGlldmVcclxuICAgKiBzdWItaW50ZWdlciBwcmVjaXNpb24gaXMgdGhyb3VnaCBjb29yZGluYXRlIHNjYWxpbmcgYmVmb3JlIGFuZCBhZnRlciBvZmZzZXR0aW5nIChzZWUgZXhhbXBsZSBiZWxvdykuXHJcbiAgICpcclxuICAgKiBJdCdzIGltcG9ydGFudCB0byBtYWtlIEFyY1RvbGVyYW5jZSBhIHNlbnNpYmxlIGZyYWN0aW9uIG9mIHRoZSBvZmZzZXQgZGVsdGEgKGFyYyByYWRpdXMpLiBMYXJnZSB0b2xlcmFuY2VzIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXQgZGVsdGEgd2lsbCBwcm9kdWNlXHJcbiAgICogcG9vciBhcmMgYXBwcm94aW1hdGlvbnMgYnV0LCBqdXN0IGFzIGltcG9ydGFudGx5LCB2ZXJ5IHNtYWxsIHRvbGVyYW5jZXMgd2lsbCBzdWJzdGFudGlhbGx5IHNsb3cgb2Zmc2V0dGluZyBwZXJmb3JtYW5jZSB3aGlsZSBwcm92aWRpbmcgdW5uZWNlc3NhcnlcclxuICAgKiBkZWdyZWVzIG9mIHByZWNpc2lvbi4gVGhpcyBpcyBtb3N0IGxpa2VseSB0byBiZSBhbiBpc3N1ZSB3aGVuIG9mZnNldHRpbmcgcG9seWdvbnMgd2hvc2UgY29vcmRpbmF0ZXMgaGF2ZSBiZWVuIHNjYWxlZCB0byBwcmVzZXJ2ZSBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24uXHJcbiAgICpcclxuICAgKiBFeGFtcGxlOiBJbWFnaW5lIGEgc2V0IG9mIHBvbHlnb25zIChkZWZpbmVkIGluIGZsb2F0aW5nIHBvaW50IGNvb3JkaW5hdGVzKSB0aGF0IGlzIHRvIGJlIG9mZnNldCBieSAxMCB1bml0cyB1c2luZyByb3VuZCBqb2lucywgYW5kIHRoZSBzb2x1dGlvbiBpcyB0b1xyXG4gICAqIHJldGFpbiBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gdXAgdG8gYXQgbGVhc3QgNiBkZWNpbWFsIHBsYWNlcy5cclxuICAgKiBUbyBwcmVzZXJ2ZSB0aGlzIGRlZ3JlZSBvZiBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24sIGFuZCBnaXZlbiB0aGF0IENsaXBwZXIgYW5kIENsaXBwZXJPZmZzZXQgYm90aCBvcGVyYXRlIG9uIGludGVnZXIgY29vcmRpbmF0ZXMsIHRoZSBwb2x5Z29uXHJcbiAgICogY29vcmRpbmF0ZXMgd2lsbCBiZSBzY2FsZWQgdXAgYnkgMTA4IChhbmQgcm91bmRlZCB0byBpbnRlZ2VycykgcHJpb3IgdG8gb2Zmc2V0dGluZy4gQm90aCBvZmZzZXQgZGVsdGEgYW5kIEFyY1RvbGVyYW5jZSB3aWxsIGFsc28gbmVlZCB0byBiZSBzY2FsZWRcclxuICAgKiBieSB0aGlzIHNhbWUgZmFjdG9yLiBJZiBBcmNUb2xlcmFuY2Ugd2FzIGxlZnQgdW5zY2FsZWQgYXQgdGhlIGRlZmF1bHQgMC4yNSB1bml0cywgZXZlcnkgYXJjIGluIHRoZSBzb2x1dGlvbiB3b3VsZCBjb250YWluIGEgZnJhY3Rpb24gb2YgNDQgVEhPVVNBTkRcclxuICAgKiB2ZXJ0aWNlcyB3aGlsZSB0aGUgZmluYWwgYXJjIGltcHJlY2lzaW9uIHdvdWxkIGJlIDAuMjUgw5cgMTAtOCB1bml0cyAoaWUgb25jZSBzY2FsaW5nIHdhcyByZXZlcnNlZCkuIEhvd2V2ZXIsIGlmIDAuMSB1bml0cyB3YXMgYW4gYWNjZXB0YWJsZSBpbXByZWNpc2lvblxyXG4gICAqIGluIHRoZSBmaW5hbCB1bnNjYWxlZCBzb2x1dGlvbiwgdGhlbiBBcmNUb2xlcmFuY2Ugc2hvdWxkIGJlIHNldCB0byAwLjEgw5cgc2NhbGluZ19mYWN0b3IgKDAuMSDDlyAxMDggKS4gTm93IGlmIHNjYWxpbmcgaXMgYXBwbGllZCBlcXVhbGx5IHRvIGJvdGhcclxuICAgKiBBcmNUb2xlcmFuY2UgYW5kIHRvIERlbHRhIE9mZnNldCwgdGhlbiBpbiB0aGlzIGV4YW1wbGUgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyAoc3RlcHMpIGRlZmluaW5nIGVhY2ggYXJjIHdvdWxkIGJlIGEgZnJhY3Rpb24gb2YgMjMuXHJcbiAgICpcclxuICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG51bWJlciBvZiBzdGVwcyBpbiBhIGZ1bGwgY2lyY3VsYXIgYXJjIGlzIC4uLiBQaSAvIGFjb3MoMSAtIGFyY190b2xlcmFuY2UgLyBhYnMoZGVsdGEpKVxyXG4gICAqL1xyXG4gIGFyY1RvbGVyYW5jZT86IG51bWJlcjsgLy8gZGVmYXVsdHMgdG8gMC4yNVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIHByb3BlcnR5IHNldHMgdGhlIG1heGltdW0gZGlzdGFuY2UgaW4gbXVsdGlwbGVzIG9mIGRlbHRhIHRoYXQgdmVydGljZXMgY2FuIGJlIG9mZnNldCBmcm9tIHRoZWlyIG9yaWdpbmFsIHBvc2l0aW9ucyBiZWZvcmUgc3F1YXJpbmcgaXMgYXBwbGllZC5cclxuICAgKiAoU3F1YXJpbmcgdHJ1bmNhdGVzIGEgbWl0ZXIgYnkgJ2N1dHRpbmcgaXQgb2ZmJyBhdCAxIMOXIGRlbHRhIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbmFsIHZlcnRleC4pXHJcbiAgICpcclxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgTWl0ZXJMaW1pdCBpcyAyIChpZSB0d2ljZSBkZWx0YSkuIFRoaXMgaXMgYWxzbyB0aGUgc21hbGxlc3QgTWl0ZXJMaW1pdCB0aGF0J3MgYWxsb3dlZC4gSWYgbWl0ZXJpbmcgd2FzIHVucmVzdHJpY3RlZCAoaWUgd2l0aG91dFxyXG4gICAqIGFueSBzcXVhcmluZyksIHRoZW4gb2Zmc2V0cyBhdCB2ZXJ5IGFjdXRlIGFuZ2xlcyB3b3VsZCBnZW5lcmF0ZSB1bmFjY2VwdGFibHkgbG9uZyAnc3Bpa2VzJy5cclxuICAgKi9cclxuICBtaXRlckxpbWl0PzogbnVtYmVyOyAvLyBkZWZhdWx0cyB0byAyICh0d2ljZSBkZWx0YSlcclxuXHJcbiAgLyoqXHJcbiAgICogTmVnYXRpdmUgZGVsdGEgdmFsdWVzIHNocmluayBwb2x5Z29ucyBhbmQgcG9zaXRpdmUgZGVsdGEgZXhwYW5kIHRoZW0uXHJcbiAgICovXHJcbiAgZGVsdGE6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogT25lIG9yIG1vcmUgaW5wdXRzIHRvIHVzZSBmb3IgdGhlIG9mZnNldCBvcGVyYXRpb24uXHJcbiAgICovXHJcbiAgb2Zmc2V0SW5wdXRzOiBPZmZzZXRJbnB1dFtdO1xyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGlzIGlzIG5vdCB1bmRlZmluZWQgdGhlbiBjbGVhbmluZyBvZiB0aGUgcmVzdWx0IHBvbHlnb24gd2lsbCBiZSBwZXJmb3JtZWQuXHJcbiAgICogVGhpcyBvcGVyYXRpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBub3QgYSBwb2x5IHRyZWUuXHJcbiAgICovXHJcbiAgY2xlYW5EaXN0YW5jZT86IG51bWJlcjtcclxufVxyXG5cclxuY29uc3QgYWRkUGF0aE9yUGF0aHMgPSAob2Zmc2V0OiBDbGlwcGVyT2Zmc2V0LCBpbnB1dERhdGFzOiBPZmZzZXRJbnB1dFtdIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgaWYgKGlucHV0RGF0YXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gYWRkIGVhY2ggaW5wdXRcclxuICBmb3IgKGxldCBpID0gMCwgbWF4aSA9IGlucHV0RGF0YXMubGVuZ3RoOyBpIDwgbWF4aTsgaSsrKSB7XHJcbiAgICBjb25zdCBpbnB1dERhdGEgPSBpbnB1dERhdGFzW2ldO1xyXG5cclxuICAgIC8vIGFkZCB0aGUgcGF0aC9wYXRoc1xyXG4gICAgY29uc3QgcGF0aE9yUGF0aHMgPSBpbnB1dERhdGEuZGF0YTtcclxuICAgIGlmICghcGF0aE9yUGF0aHMgfHwgcGF0aE9yUGF0aHMubGVuZ3RoIDw9IDApIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaXMgaXQgYSBwYXRoIG9yIHBhdGhzP1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aE9yUGF0aHNbMF0pKSB7XHJcbiAgICAgIC8vIHBhdGhzXHJcbiAgICAgIG9mZnNldC5hZGRQYXRocyhwYXRoT3JQYXRocyBhcyBSZWFkb25seVBhdGhzLCBpbnB1dERhdGEuam9pblR5cGUsIGlucHV0RGF0YS5lbmRUeXBlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHBhdGhcclxuICAgICAgb2Zmc2V0LmFkZFBhdGgocGF0aE9yUGF0aHMgYXMgUmVhZG9ubHlQYXRoLCBpbnB1dERhdGEuam9pblR5cGUsIGlucHV0RGF0YS5lbmRUeXBlKTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5mdW5jdGlvbiBvZmZzZXRUb1BhdGhzT3JQb2x5VHJlZShcclxuICBwb2x5VHJlZU1vZGU6IGJvb2xlYW4sXHJcbiAgbmF0aXZlQ2xpcHBlckxpYjogTmF0aXZlQ2xpcHBlckxpYkluc3RhbmNlLFxyXG4gIHBhcmFtczogT2Zmc2V0UGFyYW1zXHJcbik6IFBhdGhzIHwgUG9seVRyZWUgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IGZpbGxlZERhdGEgPSB7XHJcbiAgICBhcmNUb2xlcmFuY2U6IDAuMjUsXHJcbiAgICBtaXRlckxpbWl0OiAyLFxyXG4gICAgLi4ucGFyYW1zXHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb2Zmc2V0ID0gbmV3IENsaXBwZXJPZmZzZXQoXHJcbiAgICBuYXRpdmVDbGlwcGVyTGliLFxyXG4gICAgZmlsbGVkRGF0YS5taXRlckxpbWl0LFxyXG4gICAgZmlsbGVkRGF0YS5hcmNUb2xlcmFuY2VcclxuICApO1xyXG5cclxuICAvL25vaW5zcGVjdGlvbiBVbnVzZWRDYXRjaFBhcmFtZXRlckpTXHJcbiAgdHJ5IHtcclxuICAgIGFkZFBhdGhPclBhdGhzKG9mZnNldCwgcGFyYW1zLm9mZnNldElucHV0cyk7XHJcbiAgICBpZiAoIXBvbHlUcmVlTW9kZSkge1xyXG4gICAgICByZXR1cm4gb2Zmc2V0LmV4ZWN1dGVUb1BhdGhzKHBhcmFtcy5kZWx0YSwgcGFyYW1zLmNsZWFuRGlzdGFuY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBhcmFtcy5jbGVhbkRpc3RhbmNlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgQ2xpcHBlckVycm9yKFwiY2xlYW5pbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgcG9seSB0cmVlIHJlc3VsdHNcIik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9mZnNldC5leGVjdXRlVG9Qb2x5VHJlZShwYXJhbXMuZGVsdGEpO1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9IGZpbmFsbHkge1xyXG4gICAgb2Zmc2V0LmRpc3Bvc2UoKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvZmZzZXRUb1BhdGhzKFxyXG4gIG5hdGl2ZUNsaXBwZXJMaWI6IE5hdGl2ZUNsaXBwZXJMaWJJbnN0YW5jZSxcclxuICBwYXJhbXM6IE9mZnNldFBhcmFtc1xyXG4pOiBQYXRocyB8IHVuZGVmaW5lZCB7XHJcbiAgcmV0dXJuIG9mZnNldFRvUGF0aHNPclBvbHlUcmVlKGZhbHNlLCBuYXRpdmVDbGlwcGVyTGliLCBwYXJhbXMpIGFzIFBhdGhzIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb2Zmc2V0VG9Qb2x5VHJlZShcclxuICBuYXRpdmVDbGlwcGVyTGliOiBOYXRpdmVDbGlwcGVyTGliSW5zdGFuY2UsXHJcbiAgcGFyYW1zOiBPZmZzZXRQYXJhbXNcclxuKTogUG9seVRyZWUgfCB1bmRlZmluZWQge1xyXG4gIHJldHVybiBvZmZzZXRUb1BhdGhzT3JQb2x5VHJlZSh0cnVlLCBuYXRpdmVDbGlwcGVyTGliLCBwYXJhbXMpIGFzIFBvbHlUcmVlIHwgdW5kZWZpbmVkO1xyXG59XHJcbiJdfQ==