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

466 lines
45 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/controls/Bottom.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/controls/ButtonToggle.vue";
import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/controls/ButtonGroup.vue";
import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/measurements/Menu.vue";
import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/explode/Menu.vue";
import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/view-modes/Menu.vue";
import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/lightControls/Menu.vue";
import { default as __nuxt_component_7 } from "/_nuxt/components/viewer/layout/Panel.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createVNode as __createVNode,createElementBlock as __createElementBlock,createBlock as __createBlock,createElementVNode as __createElementVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"
function _interopVNode(vnode) {
if (vnode && vnode.props && 'data-v-inspector' in vnode.props) {
const data = vnode.props['data-v-inspector']
delete vnode.props['data-v-inspector']
Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false })
}
return vnode
}
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
/* Injection by vite-plugin-vue-inspector End */
import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import {
useSectionBoxUtilities,
useMeasurementUtilities,
useViewerShortcuts,
useViewModeUtilities
} from "/_nuxt/lib/viewer/composables/ui.ts";
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
import { ViewMode } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js";
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { onKeyStroke, useBreakpoints } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts";
import { TailwindBreakpoints } from "/_nuxt/lib/common/helpers/tailwind.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { Ruler, Scissors, Sun, Layers2, Glasses, Scan } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
import { useOnViewerLoadComplete } from "/_nuxt/lib/viewer/composables/viewer.ts";
import { useSmartTooltipDelay } from "/_nuxt/composables/tooltips.ts";
import { computed, ref, shallowRef, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
var ActivePanel = /* @__PURE__ */ ((ActivePanel2) => {
ActivePanel2["none"] = "none";
ActivePanel2["measurements"] = "measurements";
ActivePanel2["sectionBox"] = "sectionBox";
ActivePanel2["explode"] = "explode";
ActivePanel2["viewModes"] = "viewModes";
ActivePanel2["lightControls"] = "lightControls";
return ActivePanel2;
})(ActivePanel || {});
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerControlsBottom",
emits: ["forceClosePanels"],
setup(__props, { expose: __expose, emit: __emit }) {
const emit = __emit;
const { getShortcutDisplayText, shortcuts, registerShortcuts } = useViewerShortcuts();
const {
toggleSectionBox,
resetSectionBoxCompletely,
closeSectionBox,
isSectionBoxEnabled,
isSectionBoxVisible
} = useSectionBoxUtilities();
const { enableMeasurements, hasMeasurements, measurements } = useMeasurementUtilities();
const { resetExplode } = useFilterUtilities();
const {
viewMode: { mode: currentViewMode },
setViewMode
} = useViewModeUtilities();
const {
ui: { explodeFactor, windowSelection }
} = useInjectedViewerState();
const { getTooltipProps } = useSmartTooltipDelay();
const hasExplode = computed(() => explodeFactor.value > 0);
const hasNonDefaultViewMode = computed(() => currentViewMode.value !== ViewMode.DEFAULT);
const { isEnabled: isEmbedEnabled } = useEmbed();
const breakpoints = useBreakpoints(TailwindBreakpoints);
const isMobile = breakpoints.smaller("sm");
const mixpanel = useMixpanel();
const activePanel = ref("none" /* none */);
const viewerLoaded = ref(false);
const isWindowSelectionEnabled = windowSelection.enabled;
const panels = shallowRef({
["measurements" /* measurements */]: {
id: "measurements" /* measurements */,
name: "Measure",
icon: Ruler,
tooltip: getShortcutDisplayText(shortcuts.ToggleMeasurements, {
format: "separate"
}),
extraClasses: ""
},
["sectionBox" /* sectionBox */]: {
id: "sectionBox" /* sectionBox */,
name: "Section",
icon: Scissors,
tooltip: getShortcutDisplayText(shortcuts.ToggleSectionBox, { format: "separate" }),
extraClasses: ""
},
["explode" /* explode */]: {
id: "explode" /* explode */,
name: "Explode",
icon: Layers2,
tooltip: getShortcutDisplayText(shortcuts.ToggleExplode, { format: "separate" }),
extraClasses: "hidden md:flex"
},
["viewModes" /* viewModes */]: {
id: "viewModes" /* viewModes */,
name: "View modes",
icon: Glasses,
tooltip: getShortcutDisplayText(shortcuts.ToggleViewModes, { format: "separate" }),
extraClasses: ""
},
["lightControls" /* lightControls */]: {
id: "lightControls" /* lightControls */,
name: "Light controls",
icon: Sun,
tooltip: getShortcutDisplayText(shortcuts.ToggleLightControls, {
format: "separate"
}),
extraClasses: "hidden md:flex"
}
});
const showResetButton = computed(() => {
return activePanel.value === "explode" /* explode */ || activePanel.value === "sectionBox" /* sectionBox */;
});
const shouldShowDot = (panelId) => {
switch (panelId) {
case "measurements" /* measurements */:
return hasMeasurements.value;
case "sectionBox" /* sectionBox */:
return isSectionBoxEnabled.value;
case "explode" /* explode */:
return hasExplode.value;
case "viewModes" /* viewModes */:
return hasNonDefaultViewMode.value;
default:
return false;
}
};
const toggleActivePanel = (panel) => {
windowSelection.enabled.value = false;
activePanel.value = activePanel.value === panel ? "none" /* none */ : panel;
if (activePanel.value !== "none" /* none */ && isMobile.value) {
emit("forceClosePanels");
}
if (panel === "sectionBox" /* sectionBox */) {
toggleSectionBox();
}
if (panel === "measurements" /* measurements */) {
enableMeasurements(true);
}
};
const toggleMeasurements = () => {
windowSelection.enabled.value = false;
if (activePanel.value === "sectionBox" /* sectionBox */) {
toggleSectionBox();
}
const isMeasurementsActive = activePanel.value === "measurements" /* measurements */;
enableMeasurements(!isMeasurementsActive);
activePanel.value = isMeasurementsActive ? "none" /* none */ : "measurements" /* measurements */;
};
const toggleExplode = () => {
windowSelection.enabled.value = false;
activePanel.value = activePanel.value === "explode" /* explode */ ? "none" /* none */ : "explode" /* explode */;
};
const toggleSectionBoxPanel = () => {
windowSelection.enabled.value = false;
if (activePanel.value === "measurements" /* measurements */) {
enableMeasurements(false);
}
activePanel.value = activePanel.value === "sectionBox" /* sectionBox */ ? "none" /* none */ : "sectionBox" /* sectionBox */;
toggleSectionBox();
};
const toggleViewModes = () => {
windowSelection.enabled.value = false;
activePanel.value = activePanel.value === "viewModes" /* viewModes */ ? "none" /* none */ : "viewModes" /* viewModes */;
};
const toggleLightControls = () => {
windowSelection.enabled.value = false;
activePanel.value = activePanel.value === "lightControls" /* lightControls */ ? "none" /* none */ : "lightControls" /* lightControls */;
};
const onActivePanelClose = () => {
if (activePanel.value === "sectionBox" /* sectionBox */) {
closeSectionBox();
}
if (activePanel.value === "measurements" /* measurements */) {
enableMeasurements(false);
}
activePanel.value = "none" /* none */;
};
const toggleWindowSelection = () => {
if (activePanel.value === "sectionBox" /* sectionBox */) {
closeSectionBox();
}
if (activePanel.value === "measurements" /* measurements */) {
enableMeasurements(false);
}
activePanel.value = "none" /* none */;
windowSelection.enabled.value = !windowSelection.enabled.value;
if (windowSelection.enabled.value && isMobile.value) {
emit("forceClosePanels");
}
};
const onReset = () => {
if (activePanel.value === "explode" /* explode */) {
resetExplode();
}
if (activePanel.value === "sectionBox" /* sectionBox */) {
resetSectionBoxCompletely();
activePanel.value = "none" /* none */;
}
};
const forceClosePanels = () => {
activePanel.value = "none" /* none */;
};
const handleViewModeChange = (mode) => {
setViewMode(mode);
};
registerShortcuts({
ToggleMeasurements: () => toggleMeasurements(),
ToggleExplode: () => toggleExplode(),
ToggleSectionBox: () => toggleSectionBoxPanel(),
ToggleViewModes: () => toggleViewModes(),
ToggleLightControls: () => toggleLightControls(),
SetViewModeDefault: () => handleViewModeChange(ViewMode.DEFAULT),
SetViewModeSolid: () => handleViewModeChange(ViewMode.SOLID),
SetViewModePen: () => handleViewModeChange(ViewMode.PEN),
SetViewModeArctic: () => handleViewModeChange(ViewMode.ARCTIC),
SetViewModeShaded: () => handleViewModeChange(ViewMode.SHADED)
});
onKeyStroke("Escape", () => {
const hasActiveMeasurements = measurements.value.length > 0;
if (hasActiveMeasurements) return;
if (activePanel.value === "measurements" /* measurements */) {
toggleMeasurements();
} else if (activePanel.value === "sectionBox" /* sectionBox */) {
closeSectionBox();
}
windowSelection.enabled.value = false;
activePanel.value = "none" /* none */;
});
useOnViewerLoadComplete(
() => {
viewerLoaded.value = true;
},
{ initialOnly: true, waitForLoadingOver: true }
);
watch(activePanel, (newVal) => {
mixpanel.track("Viewer Action", {
type: "action",
name: "controls-toggle",
action: newVal
});
});
watch(isSectionBoxEnabled, (val) => {
mixpanel.track("Viewer Action", {
type: "action",
name: "section-box",
status: val
});
});
watch(isSectionBoxVisible, (val) => {
mixpanel.track("Viewer Action", {
type: "action",
name: "section-box-visibility",
status: val
});
});
__expose({
forceClosePanels
});
const __returned__ = { ActivePanel, emit, getShortcutDisplayText, shortcuts, registerShortcuts, toggleSectionBox, resetSectionBoxCompletely, closeSectionBox, isSectionBoxEnabled, isSectionBoxVisible, enableMeasurements, hasMeasurements, measurements, resetExplode, currentViewMode, setViewMode, explodeFactor, windowSelection, getTooltipProps, hasExplode, hasNonDefaultViewMode, isEmbedEnabled, breakpoints, isMobile, mixpanel, activePanel, viewerLoaded, isWindowSelectionEnabled, panels, showResetButton, shouldShowDot, toggleActivePanel, toggleMeasurements, toggleExplode, toggleSectionBoxPanel, toggleViewModes, toggleLightControls, onActivePanelClose, toggleWindowSelection, onReset, forceClosePanels, handleViewModeChange, get Scan() {
return Scan;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, normalizeClass as _normalizeClass, vShow as _vShow, withCtx as _withCtx, resolveDynamicComponent as _resolveDynamicComponent, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createCommentVNode as _createCommentVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = { "data-v-inspector": "components/viewer/controls/Bottom.vue:2:3" };
const _hoisted_2 = {
class: "flex items-center",
"data-v-inspector": "components/viewer/controls/Bottom.vue:33:7"
};
const _hoisted_3 = {
class: "text-body-2xs text-foreground",
"data-v-inspector": "components/viewer/controls/Bottom.vue:35:9"
};
const _hoisted_4 = {
class: "flex items-center gap-1",
"data-v-inspector": "components/viewer/controls/Bottom.vue:39:7"
};
const _hoisted_5 = {
class: "absolute left-1/2 -translate-x-1/2 bottom-11 w-80",
"data-v-inspector": "components/viewer/controls/Bottom.vue:54:7"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_ViewerControlsButtonToggle = __nuxt_component_0;
const _component_ViewerControlsButtonGroup = __nuxt_component_1;
const _component_FormButton = __nuxt_component_2;
const _component_ViewerMeasurementsMenu = __nuxt_component_3;
const _component_ViewerExplodeMenu = __nuxt_component_4;
const _component_ViewerViewModesMenu = __nuxt_component_5;
const _component_ViewerLightControlsMenu = __nuxt_component_6;
const _component_ViewerLayoutPanel = __nuxt_component_7;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createElementBlock("aside", _hoisted_1, [
_withDirectives(_createVNode(_component_ViewerControlsButtonGroup, {
class: _normalizeClass(["absolute left-1/2 -translate-x-1/2 z-40", $setup.isEmbedEnabled ? "bottom-[4rem]" : "bottom-4"]),
"data-v-inspector": "components/viewer/controls/Bottom.vue:3:5"
}, {
default: _withCtx(() => [
_withDirectives(_createVNode(_component_ViewerControlsButtonToggle, {
active: $setup.isWindowSelectionEnabled,
disabled: !$setup.viewerLoaded,
icon: $setup.Scan,
onClick: $setup.toggleWindowSelection,
"data-v-inspector": "components/viewer/controls/Bottom.vue:8:7"
}, null, 8, ["active", "disabled", "icon"]), [
[_directive_tippy, $setup.getTooltipProps("Window selection")]
]),
(_openBlock(true), _createElementBlock(
_Fragment,
null,
_renderList($setup.panels, (panel) => {
return _withDirectives((_openBlock(), _createBlock(_component_ViewerControlsButtonToggle, {
key: panel.id,
active: $setup.activePanel === panel.id,
disabled: !$setup.viewerLoaded,
dot: $setup.shouldShowDot(panel.id),
icon: panel.icon,
class: _normalizeClass(panel.extraClasses),
onClick: ($event) => $setup.toggleActivePanel(panel.id),
"data-v-inspector": "components/viewer/controls/Bottom.vue:15:7"
}, null, 8, ["active", "disabled", "dot", "icon", "class", "onClick"])), [
[_directive_tippy, $setup.getTooltipProps(panel.tooltip)]
]);
}),
128
/* KEYED_FRAGMENT */
))
]),
_: 1
/* STABLE */
}, 8, ["class"]), [
[_vShow, $setup.activePanel === "none"]
]),
$setup.activePanel !== "none" ? (_openBlock(), _createBlock(_component_ViewerLayoutPanel, {
key: 0,
class: _normalizeClass(["absolute left-1/2 -translate-x-1/2 z-40 flex p-2 items-center justify-between w-80", $setup.isEmbedEnabled ? "bottom-[4rem]" : "bottom-4"]),
"data-v-inspector": "components/viewer/controls/Bottom.vue:28:5"
}, {
default: _withCtx(() => [
_createElementVNode("span", _hoisted_2, [
(_openBlock(), _createBlock(_resolveDynamicComponent($setup.panels[$setup.activePanel].icon), {
class: "h-4 w-4 ml-1 mr-1.5",
"data-v-inspector": "components/viewer/controls/Bottom.vue:34:9"
})),
_createElementVNode(
"p",
_hoisted_3,
_toDisplayString($setup.panels[$setup.activePanel].name),
1
/* TEXT */
)
]),
_createElementVNode("div", _hoisted_4, [
$setup.showResetButton ? (_openBlock(), _createBlock(_component_FormButton, {
key: 0,
tabindex: "-1",
size: "sm",
color: "subtle",
onClick: $setup.onReset,
"data-v-inspector": "components/viewer/controls/Bottom.vue:40:9"
}, {
default: _withCtx(() => [..._cache[0] || (_cache[0] = [
_createTextVNode(
" Reset ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
})) : _createCommentVNode("v-if", true),
_createVNode(_component_FormButton, {
tabindex: "-1",
size: "sm",
onClick: $setup.onActivePanelClose,
"data-v-inspector": "components/viewer/controls/Bottom.vue:49:9"
}, {
default: _withCtx(() => [..._cache[1] || (_cache[1] = [
_createTextVNode(
" Done ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
})
]),
_createElementVNode("div", _hoisted_5, [
_withDirectives(_createVNode(
_component_ViewerMeasurementsMenu,
{ "data-v-inspector": "components/viewer/controls/Bottom.vue:55:9" },
null,
512
/* NEED_PATCH */
), [
[_vShow, $setup.activePanel === "measurements"]
]),
_withDirectives(_createVNode(
_component_ViewerExplodeMenu,
{ "data-v-inspector": "components/viewer/controls/Bottom.vue:56:9" },
null,
512
/* NEED_PATCH */
), [
[_vShow, $setup.activePanel === "explode"]
]),
_withDirectives(_createVNode(
_component_ViewerViewModesMenu,
{ "data-v-inspector": "components/viewer/controls/Bottom.vue:57:9" },
null,
512
/* NEED_PATCH */
), [
[_vShow, $setup.activePanel === "viewModes"]
]),
_withDirectives(_createVNode(
_component_ViewerLightControlsMenu,
{ "data-v-inspector": "components/viewer/controls/Bottom.vue:58:9" },
null,
512
/* NEED_PATCH */
), [
[_vShow, $setup.activePanel === "lightControls"]
])
])
]),
_: 1
/* STABLE */
}, 8, ["class"])) : _createCommentVNode("v-if", true)
]);
}
_sfc_main.__hmrId = "84d0746d";
typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
import.meta.hot.on("file-changed", ({ file }) => {
__VUE_HMR_RUNTIME__.CHANGED_FILE = file;
});
import.meta.hot.accept((mod) => {
if (!mod) return;
const { default: updated, _rerender_only } = mod;
if (_rerender_only) {
__VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
} else {
__VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
}
});
import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper";
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/controls/Bottom.vue"]]);
//# sourceMappingURL=data:application/json;base64,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UUFHRixvQkFLTSxPQUxOLFlBS007QUFBQSwwQkFKSjtBQUFBLFlBQWdJO0FBQUEsY0FBaEUsb0JBQWlCLDZDQUE0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQTdGLHVCQUFXO0FBQUE7MEJBQzNDO0FBQUEsWUFBc0g7QUFBQSxjQUFoRSxvQkFBaUIsNkNBQTRDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFBeEYsdUJBQVc7QUFBQTswQkFDdEM7QUFBQSxZQUEwSDtBQUFBLGNBQWhFLG9CQUFpQiw2Q0FBNEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUExRix1QkFBVztBQUFBOzBCQUN4QztBQUFBLFlBQWtJO0FBQUEsY0FBaEUsb0JBQWlCLDZDQUE0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQTlGLHVCQUFXO0FBQUEiLCJuYW1lcyI6WyJBY3RpdmVQYW5lbCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJCb3R0b20udnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8YXNpZGUgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6MjozXCI+XHJcbiAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Hcm91cFxyXG4gICAgICB2LXNob3c9XCJhY3RpdmVQYW5lbCA9PT0gJ25vbmUnXCJcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTEvMiAtdHJhbnNsYXRlLXgtMS8yIHotNDBcIlxyXG4gICAgICA6Y2xhc3M9XCJpc0VtYmVkRW5hYmxlZCA/ICdib3R0b20tWzRyZW1dJyA6ICdib3R0b20tNCdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTozOjVcIlxyXG4gICAgPlxuICAgICAgPFZpZXdlckNvbnRyb2xzQnV0dG9uVG9nZ2xlXG4gICAgICAgIHYtdGlwcHk9XCJnZXRUb29sdGlwUHJvcHMoJ1dpbmRvdyBzZWxlY3Rpb24nKVwiXG4gICAgICAgIDphY3RpdmU9XCJpc1dpbmRvd1NlbGVjdGlvbkVuYWJsZWRcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCIhdmlld2VyTG9hZGVkXCJcbiAgICAgICAgOmljb249XCJTY2FuXCJcbiAgICAgICAgQGNsaWNrPVwidG9nZ2xlV2luZG93U2VsZWN0aW9uXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6ODo3XCJcbiAgICAgIC8+XG4gICAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Ub2dnbGVcbiAgICAgICAgdi1mb3I9XCJwYW5lbCBpbiBwYW5lbHNcIlxuICAgICAgICA6a2V5PVwicGFuZWwuaWRcIlxuICAgICAgICB2LXRpcHB5PVwiZ2V0VG9vbHRpcFByb3BzKHBhbmVsLnRvb2x0aXApXCJcclxuICAgICAgICA6YWN0aXZlPVwiYWN0aXZlUGFuZWwgPT09IHBhbmVsLmlkXCJcclxuICAgICAgICA6ZGlzYWJsZWQ9XCIhdmlld2VyTG9hZGVkXCJcclxuICAgICAgICA6ZG90PVwic2hvdWxkU2hvd0RvdChwYW5lbC5pZClcIlxyXG4gICAgICAgIDppY29uPVwicGFuZWwuaWNvblwiXHJcbiAgICAgICAgOmNsYXNzPVwicGFuZWwuZXh0cmFDbGFzc2VzXCJcclxuICAgICAgICBAY2xpY2s9XCJ0b2dnbGVBY3RpdmVQYW5lbChwYW5lbC5pZClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZToxNTo3XCJcclxuICAgICAgLz5cclxuICAgIDwvVmlld2VyQ29udHJvbHNCdXR0b25Hcm91cD5cclxuXHJcbiAgICA8Vmlld2VyTGF5b3V0UGFuZWxcclxuICAgICAgdi1pZj1cImFjdGl2ZVBhbmVsICE9PSAnbm9uZSdcIlxyXG4gICAgICBjbGFzcz1cImFic29sdXRlIGxlZnQtMS8yIC10cmFuc2xhdGUteC0xLzIgei00MCBmbGV4IHAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHctODBcIlxyXG4gICAgICA6Y2xhc3M9XCJpc0VtYmVkRW5hYmxlZCA/ICdib3R0b20tWzRyZW1dJyA6ICdib3R0b20tNCdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZToyODo1XCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjMzOjdcIj5cclxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInBhbmVsc1thY3RpdmVQYW5lbF0uaWNvblwiIGNsYXNzPVwiaC00IHctNCBtbC0xIG1yLTEuNVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjM0OjlcIiAvPlxyXG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTozNTo5XCI+XHJcbiAgICAgICAgICB7eyBwYW5lbHNbYWN0aXZlUGFuZWxdLm5hbWUgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6Mzk6N1wiPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICB2LWlmPVwic2hvd1Jlc2V0QnV0dG9uXCJcclxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgIEBjbGljaz1cIm9uUmVzZXRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTo0MDo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBSZXNldFxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8Rm9ybUJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgc2l6ZT1cInNtXCIgQGNsaWNrPVwib25BY3RpdmVQYW5lbENsb3NlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6NDk6OVwiPlxyXG4gICAgICAgICAgRG9uZVxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0xLzIgLXRyYW5zbGF0ZS14LTEvMiBib3R0b20tMTEgdy04MFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjU0OjdcIj5cclxuICAgICAgICA8Vmlld2VyTWVhc3VyZW1lbnRzTWVudSB2LXNob3c9XCJhY3RpdmVQYW5lbCA9PT0gJ21lYXN1cmVtZW50cydcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTo1NTo5XCIgLz5cclxuICAgICAgICA8Vmlld2VyRXhwbG9kZU1lbnUgdi1zaG93PVwiYWN0aXZlUGFuZWwgPT09ICdleHBsb2RlJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjU2OjlcIiAvPlxyXG4gICAgICAgIDxWaWV3ZXJWaWV3TW9kZXNNZW51IHYtc2hvdz1cImFjdGl2ZVBhbmVsID09PSAndmlld01vZGVzJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjU3OjlcIiAvPlxyXG4gICAgICAgIDxWaWV3ZXJMaWdodENvbnRyb2xzTWVudSB2LXNob3c9XCJhY3RpdmVQYW5lbCA9PT0gJ2xpZ2h0Q29udHJvbHMnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6NTg6OVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9WaWV3ZXJMYXlvdXRQYW5lbD5cclxuICA8L2FzaWRlPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHtcclxuICB1c2VTZWN0aW9uQm94VXRpbGl0aWVzLFxyXG4gIHVzZU1lYXN1cmVtZW50VXRpbGl0aWVzLFxyXG4gIHVzZVZpZXdlclNob3J0Y3V0cyxcclxuICB1c2VWaWV3TW9kZVV0aWxpdGllc1xyXG59IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvdWknXHJcbmltcG9ydCB7IHVzZUZpbHRlclV0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9maWx0ZXJpbmcvZmlsdGVyaW5nJ1xyXG5pbXBvcnQgeyBWaWV3TW9kZSB9IGZyb20gJ0BzcGVja2xlL3ZpZXdlcidcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB7IG9uS2V5U3Ryb2tlLCB1c2VCcmVha3BvaW50cyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgdXNlRW1iZWQgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZW1iZWQnXHJcbmltcG9ydCB7IFRhaWx3aW5kQnJlYWtwb2ludHMgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvdGFpbHdpbmQnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfn4vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXG5pbXBvcnQgeyBSdWxlciwgU2Npc3NvcnMsIFN1biwgTGF5ZXJzMiwgR2xhc3NlcywgU2NhbiB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcbmltcG9ydCB7IHVzZU9uVmlld2VyTG9hZENvbXBsZXRlIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3ZpZXdlcidcblxyXG5lbnVtIEFjdGl2ZVBhbmVsIHtcclxuICBub25lID0gJ25vbmUnLFxyXG4gIG1lYXN1cmVtZW50cyA9ICdtZWFzdXJlbWVudHMnLFxyXG4gIHNlY3Rpb25Cb3ggPSAnc2VjdGlvbkJveCcsXHJcbiAgZXhwbG9kZSA9ICdleHBsb2RlJyxcclxuICB2aWV3TW9kZXMgPSAndmlld01vZGVzJyxcclxuICBsaWdodENvbnRyb2xzID0gJ2xpZ2h0Q29udHJvbHMnXHJcbn1cclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgZm9yY2VDbG9zZVBhbmVsczogW11cclxufT4oKVxyXG5cclxuY29uc3QgeyBnZXRTaG9ydGN1dERpc3BsYXlUZXh0LCBzaG9ydGN1dHMsIHJlZ2lzdGVyU2hvcnRjdXRzIH0gPSB1c2VWaWV3ZXJTaG9ydGN1dHMoKVxyXG5jb25zdCB7XHJcbiAgdG9nZ2xlU2VjdGlvbkJveCxcclxuICByZXNldFNlY3Rpb25Cb3hDb21wbGV0ZWx5LFxyXG4gIGNsb3NlU2VjdGlvbkJveCxcclxuICBpc1NlY3Rpb25Cb3hFbmFibGVkLFxyXG4gIGlzU2VjdGlvbkJveFZpc2libGVcclxufSA9IHVzZVNlY3Rpb25Cb3hVdGlsaXRpZXMoKVxyXG5jb25zdCB7IGVuYWJsZU1lYXN1cmVtZW50cywgaGFzTWVhc3VyZW1lbnRzLCBtZWFzdXJlbWVudHMgfSA9IHVzZU1lYXN1cmVtZW50VXRpbGl0aWVzKClcclxuY29uc3QgeyByZXNldEV4cGxvZGUgfSA9IHVzZUZpbHRlclV0aWxpdGllcygpXHJcbmNvbnN0IHtcclxuICB2aWV3TW9kZTogeyBtb2RlOiBjdXJyZW50Vmlld01vZGUgfSxcclxuICBzZXRWaWV3TW9kZVxyXG59ID0gdXNlVmlld01vZGVVdGlsaXRpZXMoKVxyXG5jb25zdCB7XG4gIHVpOiB7IGV4cGxvZGVGYWN0b3IsIHdpbmRvd1NlbGVjdGlvbiB9XG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXG5jb25zdCB7IGdldFRvb2x0aXBQcm9wcyB9ID0gdXNlU21hcnRUb29sdGlwRGVsYXkoKVxyXG5cclxuY29uc3QgaGFzRXhwbG9kZSA9IGNvbXB1dGVkKCgpID0+IGV4cGxvZGVGYWN0b3IudmFsdWUgPiAwKVxyXG5jb25zdCBoYXNOb25EZWZhdWx0Vmlld01vZGUgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50Vmlld01vZGUudmFsdWUgIT09IFZpZXdNb2RlLkRFRkFVTFQpXHJcbmNvbnN0IHsgaXNFbmFibGVkOiBpc0VtYmVkRW5hYmxlZCB9ID0gdXNlRW1iZWQoKVxyXG5jb25zdCBicmVha3BvaW50cyA9IHVzZUJyZWFrcG9pbnRzKFRhaWx3aW5kQnJlYWtwb2ludHMpXHJcbmNvbnN0IGlzTW9iaWxlID0gYnJlYWtwb2ludHMuc21hbGxlcignc20nKVxyXG5jb25zdCBtaXhwYW5lbCA9IHVzZU1peHBhbmVsKClcclxuXHJcbmNvbnN0IGFjdGl2ZVBhbmVsID0gcmVmPEFjdGl2ZVBhbmVsPihBY3RpdmVQYW5lbC5ub25lKVxuY29uc3Qgdmlld2VyTG9hZGVkID0gcmVmKGZhbHNlKVxuY29uc3QgaXNXaW5kb3dTZWxlY3Rpb25FbmFibGVkID0gd2luZG93U2VsZWN0aW9uLmVuYWJsZWRcblxyXG5jb25zdCBwYW5lbHMgPSBzaGFsbG93UmVmKHtcclxuICBbQWN0aXZlUGFuZWwubWVhc3VyZW1lbnRzXToge1xyXG4gICAgaWQ6IEFjdGl2ZVBhbmVsLm1lYXN1cmVtZW50cyxcclxuICAgIG5hbWU6ICdNZWFzdXJlJyxcclxuICAgIGljb246IFJ1bGVyLFxyXG4gICAgdG9vbHRpcDogZ2V0U2hvcnRjdXREaXNwbGF5VGV4dChzaG9ydGN1dHMuVG9nZ2xlTWVhc3VyZW1lbnRzLCB7XHJcbiAgICAgIGZvcm1hdDogJ3NlcGFyYXRlJ1xyXG4gICAgfSksXHJcbiAgICBleHRyYUNsYXNzZXM6ICcnXHJcbiAgfSxcclxuICBbQWN0aXZlUGFuZWwuc2VjdGlvbkJveF06IHtcclxuICAgIGlkOiBBY3RpdmVQYW5lbC5zZWN0aW9uQm94LFxyXG4gICAgbmFtZTogJ1NlY3Rpb24nLFxyXG4gICAgaWNvbjogU2Npc3NvcnMsXHJcbiAgICB0b29sdGlwOiBnZXRTaG9ydGN1dERpc3BsYXlUZXh0KHNob3J0Y3V0cy5Ub2dnbGVTZWN0aW9uQm94LCB7IGZvcm1hdDogJ3NlcGFyYXRlJyB9KSxcclxuICAgIGV4dHJhQ2xhc3NlczogJydcclxuICB9LFxyXG4gIFtBY3RpdmVQYW5lbC5leHBsb2RlXToge1xyXG4gICAgaWQ6IEFjdGl2ZVBhbmVsLmV4cGxvZGUsXHJcbiAgICBuYW1lOiAnRXhwbG9kZScsXHJcbiAgICBpY29uOiBMYXllcnMyLFxyXG4gICAgdG9vbHRpcDogZ2V0U2hvcnRjdXREaXNwbGF5VGV4dChzaG9ydGN1dHMuVG9nZ2xlRXhwbG9kZSwgeyBmb3JtYXQ6ICdzZXBhcmF0ZScgfSksXHJcbiAgICBleHRyYUNsYXNzZXM6ICdoaWRkZW4gbWQ6ZmxleCdcclxuICB9LFxyXG4gIFtBY3RpdmVQYW5lbC52aWV3TW9kZXNdOiB7XHJcbiAgICBpZDogQWN0aXZlUGFuZWwudmlld01vZGVzLFxyXG4gICAgbmFtZTogJ1ZpZXcgbW9kZXMnLFxyXG4gICAgaWNvbjogR2xhc3NlcyxcclxuICAgIHRvb2x0aXA6IGdldFNob3J0Y3V0RGlzcGxheVRleHQoc2hvcnRjdXRzLlRvZ2dsZVZpZXdNb2RlcywgeyBmb3JtYXQ6ICdzZXBhcmF0ZScgfSksXHJcbiAgICBleHRyYUNsYXNzZXM6ICcnXHJcbiAgfSxcclxuICBbQWN0aXZlUGFuZWwubGlnaHRDb250cm9sc106IHtcclxuICAgIGlkOiBBY3RpdmVQYW5lbC5saWdodENvbnRyb2xzLFxyXG4gICAgbmFtZTogJ0xpZ2h0IGNvbnRyb2xzJyxcclxuICAgIGljb246IFN1bixcclxuICAgIHRvb2x0aXA6IGdldFNob3J0Y3V0RGlzcGxheVRleHQoc2hvcnRjdXRzLlRvZ2dsZUxpZ2h0Q29udHJvbHMsIHtcclxuICAgICAgZm9ybWF0OiAnc2VwYXJhdGUnXHJcbiAgICB9KSxcclxuICAgIGV4dHJhQ2xhc3NlczogJ2hpZGRlbiBtZDpmbGV4J1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHNob3dSZXNldEJ1dHRvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLmV4cGxvZGUgfHxcclxuICAgIGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5zZWN0aW9uQm94XHJcbiAgKVxyXG59KVxyXG5cclxuY29uc3Qgc2hvdWxkU2hvd0RvdCA9IChwYW5lbElkOiBBY3RpdmVQYW5lbCkgPT4ge1xyXG4gIHN3aXRjaCAocGFuZWxJZCkge1xyXG4gICAgY2FzZSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHM6XHJcbiAgICAgIHJldHVybiBoYXNNZWFzdXJlbWVudHMudmFsdWVcclxuICAgIGNhc2UgQWN0aXZlUGFuZWwuc2VjdGlvbkJveDpcclxuICAgICAgcmV0dXJuIGlzU2VjdGlvbkJveEVuYWJsZWQudmFsdWVcclxuICAgIGNhc2UgQWN0aXZlUGFuZWwuZXhwbG9kZTpcclxuICAgICAgcmV0dXJuIGhhc0V4cGxvZGUudmFsdWVcclxuICAgIGNhc2UgQWN0aXZlUGFuZWwudmlld01vZGVzOlxyXG4gICAgICByZXR1cm4gaGFzTm9uRGVmYXVsdFZpZXdNb2RlLnZhbHVlXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZUFjdGl2ZVBhbmVsID0gKHBhbmVsOiBBY3RpdmVQYW5lbCkgPT4ge1xuICB3aW5kb3dTZWxlY3Rpb24uZW5hYmxlZC52YWx1ZSA9IGZhbHNlXG4gIGFjdGl2ZVBhbmVsLnZhbHVlID0gYWN0aXZlUGFuZWwudmFsdWUgPT09IHBhbmVsID8gQWN0aXZlUGFuZWwubm9uZSA6IHBhbmVsXG5cclxuICBpZiAoYWN0aXZlUGFuZWwudmFsdWUgIT09IEFjdGl2ZVBhbmVsLm5vbmUgJiYgaXNNb2JpbGUudmFsdWUpIHtcclxuICAgIGVtaXQoJ2ZvcmNlQ2xvc2VQYW5lbHMnKVxyXG4gIH1cclxuXHJcbiAgaWYgKHBhbmVsID09PSBBY3RpdmVQYW5lbC5zZWN0aW9uQm94KSB7XHJcbiAgICB0b2dnbGVTZWN0aW9uQm94KClcclxuICB9XHJcblxyXG4gIGlmIChwYW5lbCA9PT0gQWN0aXZlUGFuZWwubWVhc3VyZW1lbnRzKSB7XHJcbiAgICBlbmFibGVNZWFzdXJlbWVudHModHJ1ZSlcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZU1lYXN1cmVtZW50cyA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBpZiAoYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLnNlY3Rpb25Cb3gpIHtcbiAgICB0b2dnbGVTZWN0aW9uQm94KClcclxuICB9XHJcblxyXG4gIGNvbnN0IGlzTWVhc3VyZW1lbnRzQWN0aXZlID0gYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLm1lYXN1cmVtZW50c1xyXG4gIGVuYWJsZU1lYXN1cmVtZW50cyghaXNNZWFzdXJlbWVudHNBY3RpdmUpXHJcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBpc01lYXN1cmVtZW50c0FjdGl2ZSA/IEFjdGl2ZVBhbmVsLm5vbmUgOiBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHNcclxufVxyXG5cclxuY29uc3QgdG9nZ2xlRXhwbG9kZSA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLmV4cGxvZGUgPyBBY3RpdmVQYW5lbC5ub25lIDogQWN0aXZlUGFuZWwuZXhwbG9kZVxyXG59XHJcblxyXG5jb25zdCB0b2dnbGVTZWN0aW9uQm94UGFuZWwgPSAoKSA9PiB7XG4gIHdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlID0gZmFsc2VcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHMpIHtcbiAgICBlbmFibGVNZWFzdXJlbWVudHMoZmFsc2UpXHJcbiAgfVxyXG5cclxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XHJcbiAgICBhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuc2VjdGlvbkJveFxyXG4gICAgICA/IEFjdGl2ZVBhbmVsLm5vbmVcclxuICAgICAgOiBBY3RpdmVQYW5lbC5zZWN0aW9uQm94XHJcbiAgdG9nZ2xlU2VjdGlvbkJveCgpXHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZVZpZXdNb2RlcyA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLnZpZXdNb2Rlc1xyXG4gICAgICA/IEFjdGl2ZVBhbmVsLm5vbmVcclxuICAgICAgOiBBY3RpdmVQYW5lbC52aWV3TW9kZXNcclxufVxyXG5cclxuY29uc3QgdG9nZ2xlTGlnaHRDb250cm9scyA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLmxpZ2h0Q29udHJvbHNcclxuICAgICAgPyBBY3RpdmVQYW5lbC5ub25lXHJcbiAgICAgIDogQWN0aXZlUGFuZWwubGlnaHRDb250cm9sc1xyXG59XHJcblxyXG5jb25zdCBvbkFjdGl2ZVBhbmVsQ2xvc2UgPSAoKSA9PiB7XG4gIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuc2VjdGlvbkJveCkge1xyXG4gICAgY2xvc2VTZWN0aW9uQm94KClcclxuICB9XHJcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHMpIHtcclxuICAgIGVuYWJsZU1lYXN1cmVtZW50cyhmYWxzZSlcclxuICB9XHJcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBBY3RpdmVQYW5lbC5ub25lXHJcbn1cblxuY29uc3QgdG9nZ2xlV2luZG93U2VsZWN0aW9uID0gKCkgPT4ge1xuICBpZiAoYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLnNlY3Rpb25Cb3gpIHtcbiAgICBjbG9zZVNlY3Rpb25Cb3goKVxuICB9XG4gIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwubWVhc3VyZW1lbnRzKSB7XG4gICAgZW5hYmxlTWVhc3VyZW1lbnRzKGZhbHNlKVxuICB9XG5cbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBBY3RpdmVQYW5lbC5ub25lXG4gIHdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlID0gIXdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlXG5cbiAgaWYgKHdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlICYmIGlzTW9iaWxlLnZhbHVlKSB7XG4gICAgZW1pdCgnZm9yY2VDbG9zZVBhbmVscycpXG4gIH1cbn1cblxyXG5jb25zdCBvblJlc2V0ID0gKCkgPT4ge1xyXG4gIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuZXhwbG9kZSkge1xyXG4gICAgcmVzZXRFeHBsb2RlKClcclxuICB9XHJcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5zZWN0aW9uQm94KSB7XHJcbiAgICByZXNldFNlY3Rpb25Cb3hDb21wbGV0ZWx5KClcclxuICAgIGFjdGl2ZVBhbmVsLnZhbHVlID0gQWN0aXZlUGFuZWwubm9uZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgZm9yY2VDbG9zZVBhbmVscyA9ICgpID0+IHtcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBBY3RpdmVQYW5lbC5ub25lXG59XG5cclxuY29uc3QgaGFuZGxlVmlld01vZGVDaGFuZ2UgPSAobW9kZTogVmlld01vZGUpID0+IHtcclxuICBzZXRWaWV3TW9kZShtb2RlKVxyXG59XHJcblxyXG5yZWdpc3RlclNob3J0Y3V0cyh7XHJcbiAgVG9nZ2xlTWVhc3VyZW1lbnRzOiAoKSA9PiB0b2dnbGVNZWFzdXJlbWVudHMoKSxcclxuICBUb2dnbGVFeHBsb2RlOiAoKSA9PiB0b2dnbGVFeHBsb2RlKCksXHJcbiAgVG9nZ2xlU2VjdGlvbkJveDogKCkgPT4gdG9nZ2xlU2VjdGlvbkJveFBhbmVsKCksXHJcbiAgVG9nZ2xlVmlld01vZGVzOiAoKSA9PiB0b2dnbGVWaWV3TW9kZXMoKSxcclxuICBUb2dnbGVMaWdodENvbnRyb2xzOiAoKSA9PiB0b2dnbGVMaWdodENvbnRyb2xzKCksXHJcbiAgU2V0Vmlld01vZGVEZWZhdWx0OiAoKSA9PiBoYW5kbGVWaWV3TW9kZUNoYW5nZShWaWV3TW9kZS5ERUZBVUxUKSxcclxuICBTZXRWaWV3TW9kZVNvbGlkOiAoKSA9PiBoYW5kbGVWaWV3TW9kZUNoYW5nZShWaWV3TW9kZS5TT0xJRCksXHJcbiAgU2V0Vmlld01vZGVQZW46ICgpID0+IGhhbmRsZVZpZXdNb2RlQ2hhbmdlKFZpZXdNb2RlLlBFTiksXHJcbiAgU2V0Vmlld01vZGVBcmN0aWM6ICgpID0+IGhhbmRsZVZpZXdNb2RlQ2hhbmdlKFZpZXdNb2RlLkFSQ1RJQyksXHJcbiAgU2V0Vmlld01vZGVTaGFkZWQ6ICgpID0+IGhhbmRsZVZpZXdNb2RlQ2hhbmdlKFZpZXdNb2RlLlNIQURFRClcclxufSlcclxuXHJcbm9uS2V5U3Ryb2tlKCdFc2NhcGUnLCAoKSA9PiB7XG4gIGNvbnN0IGhhc0FjdGl2ZU1lYXN1cmVtZW50cyA9IG1lYXN1cmVtZW50cy52YWx1ZS5sZW5ndGggPiAwXHJcbiAgaWYgKGhhc0FjdGl2ZU1lYXN1cmVtZW50cykgcmV0dXJuXHJcblxyXG4gIC8vIE9ubHkgY2xvc2UgcGFuZWxzIGlmIHRoZXJlJ3Mgbm8gYWN0aXZlIG1lYXN1cmVtZW50XHJcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHMpIHtcclxuICAgIHRvZ2dsZU1lYXN1cmVtZW50cygpXHJcbiAgfSBlbHNlIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuc2VjdGlvbkJveCkge1xuICAgIGNsb3NlU2VjdGlvbkJveCgpXG4gIH1cbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9IEFjdGl2ZVBhbmVsLm5vbmVcbn0pXG5cclxudXNlT25WaWV3ZXJMb2FkQ29tcGxldGUoXHJcbiAgKCkgPT4ge1xyXG4gICAgdmlld2VyTG9hZGVkLnZhbHVlID0gdHJ1ZVxyXG4gIH0sXHJcbiAgeyBpbml0aWFsT25seTogdHJ1ZSwgd2FpdEZvckxvYWRpbmdPdmVyOiB0cnVlIH1cclxuKVxyXG5cclxud2F0Y2goYWN0aXZlUGFuZWwsIChuZXdWYWwpID0+IHtcclxuICAvLyBVc2luZyAnY29udHJvbHMnIGhlcmUgdG8gc3RpY2sgdG8gdGhlIG9sZCBuYW1pbmcgY29udmVudGlvblxyXG4gIG1peHBhbmVsLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnY29udHJvbHMtdG9nZ2xlJyxcclxuICAgIGFjdGlvbjogbmV3VmFsXHJcbiAgfSlcclxufSlcclxuXHJcbndhdGNoKGlzU2VjdGlvbkJveEVuYWJsZWQsICh2YWwpID0+IHtcclxuICBtaXhwYW5lbC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3NlY3Rpb24tYm94JyxcclxuICAgIHN0YXR1czogdmFsXHJcbiAgfSlcclxufSlcclxuXHJcbndhdGNoKGlzU2VjdGlvbkJveFZpc2libGUsICh2YWwpID0+IHtcclxuICBtaXhwYW5lbC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3NlY3Rpb24tYm94LXZpc2liaWxpdHknLFxyXG4gICAgc3RhdHVzOiB2YWxcclxuICB9KVxyXG59KVxyXG5cclxuZGVmaW5lRXhwb3NlKHtcclxuICBmb3JjZUNsb3NlUGFuZWxzXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZSJ9