Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_00010c
T

125 lines
17 KiB
Plaintext

import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { isArray, round } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
import {
useViewerCameraTracker,
useOnViewerLoadComplete
} from "/_nuxt/lib/viewer/composables/viewer.ts";
import { useWindowResizeHandler } from "/_nuxt/lib/common/composables/window.ts";
import { watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
export function useViewerAnchoredPointCalculator(params) {
const { parentEl } = params;
const {
viewer: { instance: viewer }
} = useInjectedViewerState();
const calculate = (target) => {
let targetLoc = null;
let inFrustum = false;
if (parentEl.value) {
const targetProjectionResult = viewer.query({
point: target,
operation: "Project"
});
inFrustum ||= targetProjectionResult.inFrustum;
if (inFrustum)
targetLoc = viewer.Utils.NDCToScreen(
targetProjectionResult.x,
targetProjectionResult.y,
parentEl.value.clientWidth,
parentEl.value.clientHeight
);
if (targetLoc) {
targetLoc.x = round(targetLoc.x);
targetLoc.y = round(targetLoc.y);
}
}
let isOccluded = true;
if (inFrustum) {
const targetOcclusionRes = viewer.query({
point: target,
tolerance: 1e-3,
operation: "Occlusion"
});
isOccluded = !!targetOcclusionRes.objects?.length;
}
return {
screenLocation: targetLoc?.x && targetLoc?.y ? targetLoc : null,
isOccluded,
style: {
...targetLoc?.x && targetLoc?.y ? {
transform: `translate(${targetLoc.x}px,${targetLoc.y}px)`,
// transform: `translate(-50%, -50%) translate(${targetLoc.x}px,${targetLoc.y}px)`,
transformOrigin: "center",
x: targetLoc.x,
y: targetLoc.y,
display: "block"
} : {
display: "none"
}
}
};
};
return {
calculate
};
}
export function useViewerAnchoredPoints(params) {
const { parentEl, points, pointLocationGetter, updatePositionCallback } = params;
const { calculate } = useViewerAnchoredPointCalculator({ parentEl });
const updatePositions = (options) => {
const pointsArray = isArray(points.value) ? points.value : [points.value];
for (const point of pointsArray) {
const location = pointLocationGetter(point);
if (!location) continue;
const result = calculate(location);
updatePositionCallback(point, result, options);
}
};
useViewerCameraTracker(() => updatePositions(), { throttleWait: 0 });
useWindowResizeHandler(() => updatePositions(), { wait: 0 });
useOnViewerLoadComplete(
() => {
updatePositions();
},
{ initialOnly: true, waitForLoadingOver: true }
);
watch(
points,
() => {
updatePositions();
},
{ immediate: true }
);
return {
updatePositions,
calculate
};
}
export function useGetScreenCenterObjectId() {
const {
viewer: {
instance,
metadata: { filteringState }
}
} = useInjectedViewerState();
return () => {
const res = instance.query({
point: { x: 0, y: 0 },
operation: "Pick"
});
const obj = (res?.objects || []).find((o) => {
const oid = o.object?.id;
if (!oid) return false;
const hasHiddenObjects = (filteringState.value?.hiddenObjects || []).length !== 0;
const hasIsolatedObjects = !!filteringState.value?.isolatedObjects && filteringState.value?.isolatedObjects.length !== 0;
if (hasHiddenObjects && filteringState.value?.hiddenObjects?.includes(oid))
return false;
if (hasIsolatedObjects && !filteringState.value?.isolatedObjects?.includes(oid))
return false;
return true;
});
return obj ? obj.object?.id : null;
};
}
//# sourceMappingURL=data:application/json;base64,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RUFDRjtBQUNGO0FBRU8sZ0JBQVMsNkJBQTZCO0FBQzNDLFFBQU07QUFBQSxJQUNKLFFBQVE7QUFBQSxNQUNOO0FBQUEsTUFDQSxVQUFVLEVBQUUsZUFBZTtBQUFBLElBQzdCO0FBQUEsRUFDRixJQUFJLHVCQUF1QjtBQUUzQixTQUFPLE1BQU07QUFDWCxVQUFNLE1BQU0sU0FBUyxNQUF5QjtBQUFBLE1BQzVDLE9BQU8sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQUEsTUFDcEIsV0FBVztBQUFBLElBQ2IsQ0FBQztBQUNELFVBQU0sT0FBTyxLQUFLLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNO0FBQzNDLFlBQU0sTUFBTSxFQUFFLFFBQVE7QUFDdEIsVUFBSSxDQUFDLElBQUssUUFBTztBQUVqQixZQUFNLG9CQUFvQixlQUFlLE9BQU8saUJBQWlCLENBQUMsR0FBRyxXQUFXO0FBQ2hGLFlBQU0scUJBQ0osQ0FBQyxDQUFDLGVBQWUsT0FBTyxtQkFDeEIsZUFBZSxPQUFPLGdCQUFnQixXQUFXO0FBRW5ELFVBQUksb0JBQW9CLGVBQWUsT0FBTyxlQUFlLFNBQVMsR0FBRztBQUN2RSxlQUFPO0FBQ1QsVUFBSSxzQkFBc0IsQ0FBQyxlQUFlLE9BQU8saUJBQWlCLFNBQVMsR0FBRztBQUM1RSxlQUFPO0FBRVQsYUFBTztBQUFBLElBQ1QsQ0FBQztBQUVELFdBQU8sTUFBTyxJQUFJLFFBQVEsS0FBZ0I7QUFBQSxFQUM1QztBQUNGIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJhbmNob3JQb2ludHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzLCBSZWYgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTWF5YmVOdWxsT3JVbmRlZmluZWQsIE51bGxhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBWZWN0b3IzIH0gZnJvbSAndGhyZWUnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VyU3RhdGUgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgdHlwZSB7IEludGVyc2VjdGlvblF1ZXJ5LCBQb2ludFF1ZXJ5IH0gZnJvbSAnQHNwZWNrbGUvdmlld2VyJ1xyXG5pbXBvcnQgeyBpc0FycmF5LCByb3VuZCB9IGZyb20gJ2xvZGFzaC1lcydcclxuaW1wb3J0IHtcclxuICB1c2VWaWV3ZXJDYW1lcmFUcmFja2VyLFxyXG4gIHVzZU9uVmlld2VyTG9hZENvbXBsZXRlXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy92aWV3ZXInXHJcbmltcG9ydCB7IHVzZVdpbmRvd1Jlc2l6ZUhhbmRsZXIgfSBmcm9tICd+fi9saWIvY29tbW9uL2NvbXBvc2FibGVzL3dpbmRvdydcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3ZXJBbmNob3JlZFBvaW50Q2FsY3VsYXRvcihwYXJhbXM6IHtcclxuICAvKipcclxuICAgKiBWaWV3ZXIgYW5jaG9yIHBvaW50IHBhcmVudCBlbGVtZW50IHRoYXQgaGFzIHRvIGhhdmUgdGhlIHNhbWUgZXhhY3QgZGltZW5zaW9ucyBhcyB0aGUgZnVsbFxyXG4gICAqIHZpZXdlciB2aWV3cG9ydFxyXG4gICAqL1xyXG4gIHBhcmVudEVsOiBSZWY8TnVsbGFibGU8SFRNTEVsZW1lbnQ+PlxyXG59KSB7XHJcbiAgY29uc3QgeyBwYXJlbnRFbCB9ID0gcGFyYW1zXHJcbiAgY29uc3Qge1xyXG4gICAgdmlld2VyOiB7IGluc3RhbmNlOiB2aWV3ZXIgfVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlIGN1cnJlbnQgc2NyZWVuIGNvb3JkaW5hdGVzIG9mIGEgbG9jYXRpb24gaW4gdGhlIDNEIHNwYWNlIG9mIHRoZSB2aWV3ZXIsXHJcbiAgICogd2hldGhlciBvciBub3QgdGhhdCBwb2ludCBpcyBvY2NsdWRlZCBieSBzb21ldGhpbmcgYW5kIENTUyBzdHlsZXMgZm9yIHRoZSBET00gZWxlbWVudFxyXG4gICAqIHRvIHBvc2l0aW9uIGl0IGNvcnJlY3RseSB3aXRoaW4gdGhlIHBhcmVudCBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogTm90ZTogU2NyZWVuIGNvb3JkaW5hdGUgbG9jYXRpb24gd2lsbCBiZSBudWxsIGlmIGBwYXJlbnRFbGAgaXMgbnVsbC5cclxuICAgKi9cclxuICBjb25zdCBjYWxjdWxhdGUgPSAodGFyZ2V0OiBWZWN0b3IzKSA9PiB7XHJcbiAgICBsZXQgdGFyZ2V0TG9jOiBOdWxsYWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+ID0gbnVsbFxyXG4gICAgbGV0IGluRnJ1c3R1bTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlXHJcbiAgICBpZiAocGFyZW50RWwudmFsdWUpIHtcclxuICAgICAgY29uc3QgdGFyZ2V0UHJvamVjdGlvblJlc3VsdCA9IHZpZXdlci5xdWVyeTxQb2ludFF1ZXJ5Pih7XHJcbiAgICAgICAgcG9pbnQ6IHRhcmdldCxcclxuICAgICAgICBvcGVyYXRpb246ICdQcm9qZWN0J1xyXG4gICAgICB9KVxyXG4gICAgICBpbkZydXN0dW0gfHw9IHRhcmdldFByb2plY3Rpb25SZXN1bHQuaW5GcnVzdHVtXHJcbiAgICAgIC8qKiBJZiBub3QgaW4gY2FtZXJhJ3MgZnJ1c3R1bSwgZG9uJ3QgYm90aGVyIHByb2plY3RpbmcgKi9cclxuICAgICAgaWYgKGluRnJ1c3R1bSlcclxuICAgICAgICB0YXJnZXRMb2MgPSB2aWV3ZXIuVXRpbHMuTkRDVG9TY3JlZW4oXHJcbiAgICAgICAgICB0YXJnZXRQcm9qZWN0aW9uUmVzdWx0LngsXHJcbiAgICAgICAgICB0YXJnZXRQcm9qZWN0aW9uUmVzdWx0LnksXHJcbiAgICAgICAgICBwYXJlbnRFbC52YWx1ZS5jbGllbnRXaWR0aCxcclxuICAgICAgICAgIHBhcmVudEVsLnZhbHVlLmNsaWVudEhlaWdodFxyXG4gICAgICAgIClcclxuXHJcbiAgICAgIC8vIHJvdW5kIGl0IG91dFxyXG4gICAgICBpZiAodGFyZ2V0TG9jKSB7XHJcbiAgICAgICAgdGFyZ2V0TG9jLnggPSByb3VuZCh0YXJnZXRMb2MueClcclxuICAgICAgICB0YXJnZXRMb2MueSA9IHJvdW5kKHRhcmdldExvYy55KVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGxvZ2dlci5kZWJ1Zyh0YXJnZXRMb2MsIHRhcmdldFByb2plY3Rpb25SZXN1bHQsIHRhcmdldCwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBpc09jY2x1ZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZVxyXG4gICAgLyoqIElmIG5vdCBpbiBjYW1lcmEncyBmcnVzdHVtIGRvbid0IGJvdGhlciBpbnRlcnNlY3RpbmcgKi9cclxuICAgIGlmIChpbkZydXN0dW0pIHtcclxuICAgICAgY29uc3QgdGFyZ2V0T2NjbHVzaW9uUmVzID0gdmlld2VyLnF1ZXJ5PEludGVyc2VjdGlvblF1ZXJ5Pih7XHJcbiAgICAgICAgcG9pbnQ6IHRhcmdldCxcclxuICAgICAgICB0b2xlcmFuY2U6IDAuMDAxLFxyXG4gICAgICAgIG9wZXJhdGlvbjogJ09jY2x1c2lvbidcclxuICAgICAgfSlcclxuICAgICAgaXNPY2NsdWRlZCA9ICEhdGFyZ2V0T2NjbHVzaW9uUmVzLm9iamVjdHM/Lmxlbmd0aFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNjcmVlbkxvY2F0aW9uOiB0YXJnZXRMb2M/LnggJiYgdGFyZ2V0TG9jPy55ID8gdGFyZ2V0TG9jIDogbnVsbCxcclxuICAgICAgaXNPY2NsdWRlZCxcclxuICAgICAgc3R5bGU6IDxQYXJ0aWFsPENTU1Byb3BlcnRpZXM+PntcclxuICAgICAgICAuLi4odGFyZ2V0TG9jPy54ICYmIHRhcmdldExvYz8ueVxyXG4gICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7dGFyZ2V0TG9jLnh9cHgsJHt0YXJnZXRMb2MueX1weClgLFxyXG4gICAgICAgICAgICAgIC8vIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSB0cmFuc2xhdGUoJHt0YXJnZXRMb2MueH1weCwke3RhcmdldExvYy55fXB4KWAsXHJcbiAgICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICB4OiB0YXJnZXRMb2MueCxcclxuICAgICAgICAgICAgICB5OiB0YXJnZXRMb2MueSxcclxuICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgY2FsY3VsYXRlXHJcbiAgfVxyXG59XHJcblxyXG50eXBlIEFuY2hvcmVkUG9pbnRDYWxjdWxhdGVSZXN1bHQgPSBSZXR1cm5UeXBlPFxyXG4gIFJldHVyblR5cGU8dHlwZW9mIHVzZVZpZXdlckFuY2hvcmVkUG9pbnRDYWxjdWxhdG9yPlsnY2FsY3VsYXRlJ11cclxuPlxyXG5cclxuLyoqXHJcbiAqIEF1dG9tYXRpY2FsbHkgcmVjYWxjdWxhdGVzIHNjcmVlbiBwb3NpdGlvbnMgJiBvY2NsdXNpb24gb2YgdGhlIHByb3ZpZGVkIGFycmF5IG9mIHBvaW50cywgYW5kXHJcbiAqIGFkZGl0aW9uYWxseSBleHBvc2VzIGZ1bmN0aW9ucyBmb3IgbWFudWFsIChyZS0pY2FsY3VsYXRpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3ZXJBbmNob3JlZFBvaW50czxcclxuICBPIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgQSBleHRlbmRzIE9wdGlvbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxyXG4+KHBhcmFtczoge1xyXG4gIC8qKlxyXG4gICAqIFZpZXdlciBhbmNob3IgcG9pbnQgcGFyZW50IGVsZW1lbnQgdGhhdCBoYXMgdG8gaGF2ZSB0aGUgc2FtZSBleGFjdCBkaW1lbnNpb25zIGFzIHRoZSBmdWxsXHJcbiAgICogdmlld2VyIHZpZXdwb3J0XHJcbiAgICovXHJcbiAgcGFyZW50RWw6IFJlZjxOdWxsYWJsZTxIVE1MRWxlbWVudD4+XHJcbiAgLyoqXHJcbiAgICogT2JqZWN0cyB0aGF0IGNvbnRhaW4gcG9pbnRzIGluIHZpZXdlcidzIDNEIHNwYWNlIHRoYXQgbmVlZCB0byBiZSBhbmNob3JlZCBhY2NvcmRpbmdseSBvbiB0aGUgc2NyZWVuLlxyXG4gICAqIENhbiBiZSBhbiBhcnJheSBvciBhIHNpbmdsZSBwb2ludC5cclxuICAgKi9cclxuICBwb2ludHM6IFJlZjxPW10gfCBPPlxyXG4gIC8qKlxyXG4gICAqIFVzZSB0aGlzIHRvIHB1bGwgb3V0IHRoZSBhY3R1YWwgaW5pdGlhbCBsb2NhdGlvbiBWZWN0b3IzIG91dCBmcm9tIGEgc3BlY2lmaWMgcG9pbnQgb2JqZWN0LiBJdFxyXG4gICAqIGNhbiBhbHNvIHJldHVybiBudWxsIG9yIHVuZGVmaW5lZCBpbiB3aGljaCBjYXNlIGNhbGN1bGF0aW9uIHdpbGwgYmUgc2tpcHBlZC5cclxuICAgKi9cclxuICBwb2ludExvY2F0aW9uR2V0dGVyOiAob2JqOiBPKSA9PiBNYXliZU51bGxPclVuZGVmaW5lZDxWZWN0b3IzPlxyXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIGZvciBlYWNoIHBvc2l0aW9uIHVwZGF0ZSBvcGVyYXRpb24gZm9yIG9wdGlvbmFsbHkgZG9pbmcgZXh0cmEgc3R1ZmYgd2l0aCB0aGUgcG9pbnQgb2JqZWN0XHJcbiAgICovXHJcbiAgdXBkYXRlUG9zaXRpb25DYWxsYmFjazogKFxyXG4gICAgb2JqOiBPLFxyXG4gICAgcmVzdWx0OiBBbmNob3JlZFBvaW50Q2FsY3VsYXRlUmVzdWx0LFxyXG4gICAgb3B0aW9ucz86IEFcclxuICApID0+IHZvaWRcclxufSkge1xyXG4gIGNvbnN0IHsgcGFyZW50RWwsIHBvaW50cywgcG9pbnRMb2NhdGlvbkdldHRlciwgdXBkYXRlUG9zaXRpb25DYWxsYmFjayB9ID0gcGFyYW1zXHJcbiAgY29uc3QgeyBjYWxjdWxhdGUgfSA9IHVzZVZpZXdlckFuY2hvcmVkUG9pbnRDYWxjdWxhdG9yKHsgcGFyZW50RWwgfSlcclxuXHJcbiAgLyoqXHJcbiAgICogUmUtY2FsY3VsYXRlIHBvc2l0aW9ucyBmb3IgYWxsIHBvaW50cy4gT3B0aW9uYWxseSBwYXNzIGluIGFyYml0cmFyeSBvcHRpb25zXHJcbiAgICogdGhhdCB5b3Ugd2lsbCBhbHNvIHJlY2VpdmUgaW4gYHVwZGF0ZVBvc2l0aW9uQ2FsbGJhY2tgIGZvciBtYWtpbmcgY2hhbmdlcyBhY2NvcmRpbmdseSxcclxuICAgKiBlLmcuIGBzbW9vdGhUcmFuc2xhdGlvbnNgIHRvIGVuYWJsZSBzbW9vdGhlZCB0cmFuc2xhdGlvbiBiZXR3ZWVuIHBvc2l0aW9ucy5cclxuICAgKi9cclxuICBjb25zdCB1cGRhdGVQb3NpdGlvbnMgPSAob3B0aW9ucz86IEEpID0+IHtcclxuICAgIGNvbnN0IHBvaW50c0FycmF5ID0gaXNBcnJheShwb2ludHMudmFsdWUpID8gcG9pbnRzLnZhbHVlIDogW3BvaW50cy52YWx1ZV1cclxuICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcG9pbnRzQXJyYXkpIHtcclxuICAgICAgY29uc3QgbG9jYXRpb24gPSBwb2ludExvY2F0aW9uR2V0dGVyKHBvaW50KVxyXG4gICAgICBpZiAoIWxvY2F0aW9uKSBjb250aW51ZVxyXG5cclxuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlKGxvY2F0aW9uKVxyXG4gICAgICB1cGRhdGVQb3NpdGlvbkNhbGxiYWNrKHBvaW50LCByZXN1bHQsIG9wdGlvbnMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiBkaXNhYmxpbmcgdGhyb3R0bGUgY2F1c2Ugb2Ygaml0dGVyaW5lc3MgY2F1c2VkIGJ5ICg/KSB2aWV3ZXIgcXVlcmllcywgdGhpcyBuZWVkcyB0byBiZSBsb29rZWQgYXRcclxuICB1c2VWaWV3ZXJDYW1lcmFUcmFja2VyKCgpID0+IHVwZGF0ZVBvc2l0aW9ucygpLCB7IHRocm90dGxlV2FpdDogMCB9KVxyXG4gIHVzZVdpbmRvd1Jlc2l6ZUhhbmRsZXIoKCkgPT4gdXBkYXRlUG9zaXRpb25zKCksIHsgd2FpdDogMCB9KVxyXG5cclxuICB1c2VPblZpZXdlckxvYWRDb21wbGV0ZShcclxuICAgICgpID0+IHtcclxuICAgICAgdXBkYXRlUG9zaXRpb25zKClcclxuICAgIH0sXHJcbiAgICB7IGluaXRpYWxPbmx5OiB0cnVlLCB3YWl0Rm9yTG9hZGluZ092ZXI6IHRydWUgfVxyXG4gIClcclxuXHJcbiAgd2F0Y2goXHJcbiAgICBwb2ludHMsXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIHVwZGF0ZVBvc2l0aW9ucygpXHJcbiAgICB9LFxyXG4gICAgeyBpbW1lZGlhdGU6IHRydWUgfVxyXG4gIClcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHVwZGF0ZVBvc2l0aW9ucyxcclxuICAgIGNhbGN1bGF0ZVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZUdldFNjcmVlbkNlbnRlck9iamVjdElkKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHZpZXdlcjoge1xyXG4gICAgICBpbnN0YW5jZSxcclxuICAgICAgbWV0YWRhdGE6IHsgZmlsdGVyaW5nU3RhdGUgfVxyXG4gICAgfVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIGNvbnN0IHJlcyA9IGluc3RhbmNlLnF1ZXJ5PEludGVyc2VjdGlvblF1ZXJ5Pih7XHJcbiAgICAgIHBvaW50OiB7IHg6IDAsIHk6IDAgfSxcclxuICAgICAgb3BlcmF0aW9uOiAnUGljaydcclxuICAgIH0pXHJcbiAgICBjb25zdCBvYmogPSAocmVzPy5vYmplY3RzIHx8IFtdKS5maW5kKChvKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9pZCA9IG8ub2JqZWN0Py5pZCBhcyBPcHRpb25hbDxzdHJpbmc+XHJcbiAgICAgIGlmICghb2lkKSByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAgIGNvbnN0IGhhc0hpZGRlbk9iamVjdHMgPSAoZmlsdGVyaW5nU3RhdGUudmFsdWU/LmhpZGRlbk9iamVjdHMgfHwgW10pLmxlbmd0aCAhPT0gMFxyXG4gICAgICBjb25zdCBoYXNJc29sYXRlZE9iamVjdHMgPVxyXG4gICAgICAgICEhZmlsdGVyaW5nU3RhdGUudmFsdWU/Lmlzb2xhdGVkT2JqZWN0cyAmJlxyXG4gICAgICAgIGZpbHRlcmluZ1N0YXRlLnZhbHVlPy5pc29sYXRlZE9iamVjdHMubGVuZ3RoICE9PSAwXHJcblxyXG4gICAgICBpZiAoaGFzSGlkZGVuT2JqZWN0cyAmJiBmaWx0ZXJpbmdTdGF0ZS52YWx1ZT8uaGlkZGVuT2JqZWN0cz8uaW5jbHVkZXMob2lkKSlcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgaWYgKGhhc0lzb2xhdGVkT2JqZWN0cyAmJiAhZmlsdGVyaW5nU3RhdGUudmFsdWU/Lmlzb2xhdGVkT2JqZWN0cz8uaW5jbHVkZXMob2lkKSlcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBvYmogPyAob2JqLm9iamVjdD8uaWQgYXMgc3RyaW5nKSA6IG51bGxcclxuICB9XHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvYW5jaG9yUG9pbnRzLnRzIn0=