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

737 lines
76 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/anchored-point/Thread.vue");import { UserAvatarGroup as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_1 } from "/_nuxt/components/global/icon/CircleCheck.vue";
import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { LayoutMenu as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/anchored-point/thread/Comment.vue";
import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/anchored-point/thread/NewReply.vue";
import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/comments/PortalOrDiv.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createBlock as __createBlock,createVNode as __createVNode,createElementVNode as __createElementVNode,createElementBlock as __createElementBlock } 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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...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 {
MoveLeft,
MoveRight,
CircleCheck,
X,
ChevronLeft,
ChevronRight,
Ellipsis
} from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
import { ensureError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { onKeyDown, useClipboard, useDraggable, onClickOutside } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
import { scrollToBottom } from "/_nuxt/lib/common/helpers/dom.ts";
import { useViewerThreadTypingTracking } from "/_nuxt/lib/viewer/composables/activity.ts";
import { useAnimatingEllipsis } from "/_nuxt/lib/viewer/composables/commentBubbles.ts";
import {
useArchiveComment,
useCheckViewerCommentingAccess,
useMarkThreadViewed,
useCommentContext
} from "/_nuxt/lib/viewer/composables/commentManagement.ts";
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { useActiveUser } from "/_nuxt/lib/auth/composables/activeUser.ts";
import { ToastNotificationType, useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts";
import { getLinkToThread } from "/_nuxt/lib/viewer/helpers/comments.ts";
import { useDisableGlobalTextSelection } from "/_nuxt/lib/common/composables/window.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { useThreadUtilities } from "/_nuxt/lib/viewer/composables/ui.ts";
import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { computed, useId, ref, watch, onMounted } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { useSafeRouter } from "/_nuxt/composables/routing.ts";
var ActionTypes = /* @__PURE__ */ ((ActionTypes2) => {
ActionTypes2["CopyLink"] = "copy-link";
ActionTypes2["PopIn"] = "pop-in";
return ActionTypes2;
})(ActionTypes || {});
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerAnchoredPointThread",
props: {
modelValue: { type: Object, required: true },
hasPrevious: { type: Boolean, required: false },
hasNext: { type: Boolean, required: false }
},
emits: ["update:modelValue", "update:expanded", "next", "prev", "login"],
setup(__props, { expose: __expose, emit: __emit }) {
__expose();
graphql(`
fragment ViewerCommentThreadData on Comment {
id
permissions {
canArchive {
...FullPermissionCheckResult
}
}
}
`);
const emit = __emit;
const props = __props;
const { isEmbedEnabled } = useEmbed();
const threadId = computed(() => props.modelValue.id);
const { copy } = useClipboard();
const { isLoggedIn } = useActiveUser();
const archiveComment = useArchiveComment();
const { triggerNotification } = useGlobalToast();
const { projectId } = useInjectedViewerState();
const canReply = useCheckViewerCommentingAccess();
const { disableTextSelection } = useDisableGlobalTextSelection();
const markThreadViewed = useMarkThreadViewed();
const { usersTyping } = useViewerThreadTypingTracking(threadId);
const { ellipsis, controls } = useAnimatingEllipsis();
const { threadResourceStatus, hasClickedFullContext, goBack, handleContextClick } = useCommentContext();
const { isOpenThread, open, closeAllThreads } = useThreadUtilities();
const router = useSafeRouter();
const menuId = useId();
const showMenu = ref(false);
const commentsContainer = ref(null);
const threadContainer = ref(null);
const threadActivator = ref(null);
onClickOutside(threadContainer, (event) => {
const viewerElement = document.getElementById("viewer");
if (isExpanded.value && viewerElement && (event.target === viewerElement || viewerElement.contains(event.target)) && !(threadActivator.value && threadActivator.value.contains(event.target))) {
changeExpanded(false);
}
});
const handle = ref(null);
const justCreatedReply = ref(false);
const comments = computed(() => [
props.modelValue,
...props.modelValue.replies.items.slice().reverse()
]);
const showNewReplyComponent = computed(() => {
return !props.modelValue.archived && canReply.value && !isEmbedEnabled.value;
});
const isExpanded = computed(() => isOpenThread(props.modelValue.id));
const isTypingMessage = computed(() => {
if (!usersTyping.value.length) return null;
return usersTyping.value.length > 1 ? `${usersTyping.value.map((u) => u.userName).join(", ")} are typing${ellipsis.value}` : `${usersTyping.value[0].userName} is typing${ellipsis.value}`;
});
const isViewed = computed(() => !!props.modelValue.viewedAt);
const initialDragPosition = computed(() => {
return {
x: props.modelValue.style.x,
y: props.modelValue.style.y
};
});
const mp = useMixpanel();
const isDragged = ref(false);
const { x, y, isDragging, position } = useDraggable(threadContainer, {
stopPropagation: true,
handle,
initialValue: initialDragPosition,
onStart(_pos, event) {
const target = event.target;
const isWithinHandle = target === handle.value || handle.value?.contains(target);
if (!isWithinHandle) return false;
const isInteractiveElement = target.closest("button") || target.closest("a") || target.closest('[role="button"]');
if (isInteractiveElement) return false;
if (!isDragged.value) position.value = { x: 0, y: 0 };
isDragged.value = true;
mp.track("Comment Action", { type: "action", name: "drag" });
}
});
const threadStyle = computed(() => {
if (!threadActivator.value) return props.modelValue.style;
const activatorRect = threadActivator.value?.getBoundingClientRect();
const areDraggableCoordsInitialized = x.value && y.value;
const xOffset = isDragged.value && areDraggableCoordsInitialized ? x.value : props.modelValue.style.x + activatorRect.width + 20;
const threadHeight = threadContainer.value?.getBoundingClientRect().height || 0;
const threadWidth = threadContainer.value?.getBoundingClientRect().width || 0;
const yOffset = isDragged.value && areDraggableCoordsInitialized ? y.value : props.modelValue.style.y - threadHeight / 2;
const padding = isEmbedEnabled.value ? 5 : 10;
const viewportWidth = window.innerWidth;
const viewportHeight = window.innerHeight;
const topPadding = isEmbedEnabled.value ? padding : 58;
const bottomPadding = isEmbedEnabled.value ? 62 : padding;
const constrainedX = Math.min(
Math.max(padding, xOffset),
viewportWidth - threadWidth - padding
);
const constrainedY = Math.min(
Math.max(topPadding, yOffset),
viewportHeight - threadHeight - bottomPadding
);
const transition = isDragged.value ? "none" : props.modelValue.style.transition;
return {
...props.modelValue.style,
opacity: 1,
transition,
transform: `translate(${constrainedX}px,${constrainedY}px)`
};
});
const threadAuthors = computed(() => {
const authors = [props.modelValue.author];
for (const author of props.modelValue.replyAuthors.items) {
if (!authors.find((u) => u.id === author.id)) authors.push(author);
}
return authors;
});
const actionsItems = computed(() => [
[
{
title: "Copy link",
id: "copy-link" /* CopyLink */
},
{
title: "Pop in",
id: "pop-in" /* PopIn */,
disabled: !isDragged.value
}
]
]);
const canArchiveOrUnarchive = computed(
() => props.modelValue.permissions.canArchive.authorized
);
const onActionChosen = (params) => {
const { item } = params;
switch (item.id) {
case "copy-link" /* CopyLink */:
showMenu.value = false;
onCopyLink();
break;
case "pop-in" /* PopIn */:
showMenu.value = false;
isDragged.value = false;
break;
}
};
const changeExpanded = async (newVal) => {
if (newVal) {
await open(props.modelValue.id);
} else {
await closeAllThreads();
}
emit("update:expanded", newVal);
mp.track("Comment Action", {
type: "action",
name: "toggle",
status: newVal,
source: "bubble"
});
};
const toggleCommentResolvedStatus = async () => {
if (!props.modelValue.archived) {
await router.replace(() => {
const query = { ...router.currentRoute.value.query };
delete query.thread;
return { query };
});
}
await archiveComment({
commentId: props.modelValue.id,
projectId: projectId.value,
archived: !props.modelValue.archived
});
mp.track("Comment Action", {
type: "action",
name: "archive",
status: props.modelValue.archived
});
triggerNotification({
title: `Thread ${props.modelValue.archived ? "reopened." : "resolved."}`,
type: ToastNotificationType.Info
});
};
const onNewReply = () => {
justCreatedReply.value = true;
mp.track("Comment Action", { type: "action", name: "reply" });
};
const onCommentMounted = () => {
if (!justCreatedReply.value) return;
const el = commentsContainer.value;
if (!el) return;
scrollToBottom(el);
justCreatedReply.value = false;
};
const onThreadClick = () => {
changeExpanded(!isExpanded.value);
};
const onCopyLink = async () => {
if (false) return;
const url = getLinkToThread(projectId.value, props.modelValue);
if (!url) return;
try {
await copy(new URL(url, window.location.origin).toString());
} catch (e) {
triggerNotification({
type: ToastNotificationType.Danger,
title: "Thread link copy failed",
description: ensureError(e).message
});
throw e;
}
mp.track("Comment Action", { type: "action", name: "share" });
triggerNotification({
type: ToastNotificationType.Info,
title: "Link copied"
});
};
onKeyDown("Escape", () => {
if (isExpanded.value) {
changeExpanded(false);
}
});
watch(
() => [isExpanded.value, isViewed.value],
(newVals, oldVals) => {
const [newIsExpanded, newIsViewed] = newVals;
const [oldIsExpanded] = oldVals || [false];
if (newIsExpanded && newIsExpanded !== oldIsExpanded && !newIsViewed) {
markThreadViewed(projectId.value, props.modelValue.id);
}
if (!newIsExpanded) {
isDragged.value = false;
}
},
{ immediate: true }
// for triggering also when a comment is opened because of a thread link
);
watch(
() => usersTyping.value.length > 1,
(areUsersTyping) => {
if (areUsersTyping) {
controls.resume();
} else {
controls.pause();
}
}
);
watch(isDragging, (newVal, oldVal) => {
if (!!newVal === !!oldVal) return;
disableTextSelection.value = newVal;
});
onMounted(() => {
if (isExpanded.value) {
emit("update:expanded", true);
}
});
const showBanner = computed(
() => threadResourceStatus.value.isDifferentVersion || threadResourceStatus.value.isFederatedModel || hasClickedFullContext.value
);
const bannerText = computed(() => {
if (hasClickedFullContext.value) return "Viewing full context";
if (threadResourceStatus.value.isDifferentVersion && threadResourceStatus.value.isFederatedModel)
return "References multiple models with different versions";
if (threadResourceStatus.value.isDifferentVersion)
return "Conversation started in a different version";
if (threadResourceStatus.value.isFederatedModel)
return "References models not currently loaded";
return "";
});
const bannerButton = computed(() => {
if (hasClickedFullContext.value) {
return {
text: "Back",
icon: MoveLeft,
action: goBack
};
}
return {
text: "Full context",
icon: MoveRight,
action: handleContextClick
};
});
const __returned__ = { ActionTypes, emit, props, isEmbedEnabled, threadId, copy, isLoggedIn, archiveComment, triggerNotification, projectId, canReply, disableTextSelection, markThreadViewed, usersTyping, ellipsis, controls, threadResourceStatus, hasClickedFullContext, goBack, handleContextClick, isOpenThread, open, closeAllThreads, router, menuId, showMenu, commentsContainer, threadContainer, threadActivator, handle, justCreatedReply, comments, showNewReplyComponent, isExpanded, isTypingMessage, isViewed, initialDragPosition, mp, isDragged, x, y, isDragging, position, threadStyle, threadAuthors, actionsItems, canArchiveOrUnarchive, onActionChosen, changeExpanded, toggleCommentResolvedStatus, onNewReply, onCommentMounted, onThreadClick, onCopyLink, showBanner, bannerText, bannerButton, get CircleCheck() {
return CircleCheck;
}, get X() {
return X;
}, get ChevronLeft() {
return ChevronLeft;
}, get ChevronRight() {
return ChevronRight;
}, get Ellipsis() {
return Ellipsis;
}, get getLinkToThread() {
return getLinkToThread;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, withModifiers as _withModifiers, withCtx as _withCtx, resolveDirective as _resolveDirective, withDirectives as _withDirectives, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "relative",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:2:3"
};
const _hoisted_2 = {
ref: "threadActivator",
class: "relative",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:10:7"
};
const _hoisted_3 = {
key: 1,
class: "w-7 h-7 flex items-center justify-center",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:23:11"
};
const _hoisted_4 = {
class: "w-6 h-6 flex items-center justify-center bg-foundation dark:bg-foundation-2 rounded-full",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:27:13"
};
const _hoisted_5 = {
ref: "handle",
class: "relative w-full flex justify-between items-center border-b border-outline-2 p-2 pb-1.5 cursor-move",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:47:11"
};
const _hoisted_6 = {
class: "flex-grow flex items-center gap-x-1",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:51:13"
};
const _hoisted_7 = {
class: "flex items-center gap-x-0.5",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:52:15"
};
const _hoisted_8 = {
class: "flex gap-x-0.5",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:71:13"
};
const _hoisted_9 = {
class: "cursor-pointer",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:72:15"
};
const _hoisted_10 = {
key: 0,
class: "flex items-center justify-between gap-4 border-b border-outline-2 py-2 px-2 w-full",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:109:11"
};
const _hoisted_11 = {
class: "text-body-2xs text-foreground-2 font-medium",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:113:13"
};
const _hoisted_12 = {
class: "relative w-full sm:w-80 flex flex-col flex-1 justify-between",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:125:11"
};
const _hoisted_13 = {
ref: "commentsContainer",
class: "max-h-[200px] sm:max-h-[300px] 2xl:max-h-[500px] overflow-y-auto simple-scrollbar flex flex-col px-2 py-1",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:126:13"
};
const _hoisted_14 = {
key: 0,
class: "w-full px-3 md:px-4 pb-3 caption mt-1 text-body-2xs",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:138:13"
};
const _hoisted_15 = {
key: 2,
class: "flex justify-between w-full p-2 border-t border-outline-2",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:150:11"
};
const _hoisted_16 = {
key: 3,
class: "flex justify-between w-full p-2 border-t border-outline-2",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:165:11"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_UserAvatarGroup = __nuxt_component_0;
const _component_IconCircleCheck = __nuxt_component_1;
const _component_FormButton = __nuxt_component_2;
const _component_LayoutMenu = __nuxt_component_3;
const _component_ViewerAnchoredPointThreadComment = __nuxt_component_4;
const _component_ViewerAnchoredPointThreadNewReply = __nuxt_component_5;
const _component_ViewerCommentsPortalOrDiv = __nuxt_component_6;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createElementBlock("div", _hoisted_1, [
_createElementVNode(
"div",
{
class: "absolute pointer-events-auto",
style: _normalizeStyle({
...$props.modelValue.style,
opacity: 1
}),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:3:5"
},
[
_createElementVNode(
"div",
_hoisted_2,
[
_createElementVNode(
"button",
{
class: _normalizeClass(`
${$props.modelValue.isOccluded && !$setup.isExpanded ? "opacity-60 hover:opacity-100" : ""}
${$setup.isExpanded ? "outline outline-2 outline-primary" : ""}
transition bg-foundation shadow hover:shadow-xl flex -space-x-2 items-center p-[2px] rounded-tr-full rounded-tl-full rounded-br-full`),
onClick: $setup.onThreadClick,
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:11:9"
},
[
!$props.modelValue.archived ? (_openBlock(), _createBlock(_component_UserAvatarGroup, {
key: 0,
"hide-tooltips": "",
users: $setup.threadAuthors,
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:18:11"
}, null, 8, ["users"])) : _createCommentVNode("v-if", true),
$props.modelValue.archived ? (_openBlock(), _createElementBlock("div", _hoisted_3, [
_createElementVNode("div", _hoisted_4, [
_createVNode(_component_IconCircleCheck, {
class: "size-5 text-primary",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:30:15"
})
])
])) : _createCommentVNode("v-if", true)
],
2
/* CLASS */
)
],
512
/* NEED_PATCH */
)
],
4
/* STYLE */
),
$setup.isExpanded ? (_openBlock(), _createElementBlock(
"div",
{
key: 0,
ref: "threadContainer",
class: "thread-container fixed mb-16 bottom-0 right-0 sm:bottom-auto sm:right-auto w-screen sm:w-80 z-50 pointer-events-auto",
style: _normalizeStyle($setup.threadStyle),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:36:5"
},
[
_createVNode(_component_ViewerCommentsPortalOrDiv, {
to: "mobileComments",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:42:7"
}, {
default: _withCtx(() => [
_createElementVNode(
"div",
{
class: _normalizeClass(["relative bg-foundation border border-outline-2 flex flex-col overflow-hidden sm:shadow-md cursor-auto sm:rounded-lg h-full transition-all duration-200", { "is-dragging border-outline-5": $setup.isDragging }]),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:43:9"
},
[
_createElementVNode(
"div",
_hoisted_5,
[
_createElementVNode("div", _hoisted_6, [
_createElementVNode("div", _hoisted_7, [
_createVNode(_component_FormButton, {
"icon-left": $setup.ChevronLeft,
color: "outline",
"hide-text": "",
size: "sm",
disabled: !$props.hasPrevious,
onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("prev", $props.modelValue)),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:53:17"
}, null, 8, ["icon-left", "disabled"]),
_createVNode(_component_FormButton, {
"icon-left": $setup.ChevronRight,
color: "outline",
"hide-text": "",
size: "sm",
disabled: !$props.hasNext,
onClick: _cache[1] || (_cache[1] = ($event) => $setup.emit("next", $props.modelValue)),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:61:17"
}, null, 8, ["icon-left", "disabled"])
])
]),
_createElementVNode("div", _hoisted_8, [
_createElementVNode("div", _hoisted_9, [
_createVNode(_component_LayoutMenu, {
open: $setup.showMenu,
"onUpdate:open": _cache[3] || (_cache[3] = ($event) => $setup.showMenu = $event),
"menu-id": $setup.menuId,
items: $setup.actionsItems,
"mount-menu-on-body": "",
onClick: _cache[4] || (_cache[4] = _withModifiers(() => {
}, ["stop", "prevent"])),
onChosen: $setup.onActionChosen,
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:73:17"
}, {
default: _withCtx(() => [
_createVNode(_component_FormButton, {
"hide-text": "",
size: "sm",
color: "subtle",
class: _normalizeClass($setup.showMenu ? "!bg-highlight-3" : ""),
"icon-left": $setup.Ellipsis,
onClick: _cache[2] || (_cache[2] = ($event) => $setup.showMenu = !$setup.showMenu),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:81:19"
}, null, 8, ["class", "icon-left"])
]),
_: 1
/* STABLE */
}, 8, ["open", "menu-id", "items"])
]),
_withDirectives(_createVNode(_component_FormButton, {
"icon-left": $setup.CircleCheck,
"hide-text": "",
disabled: !$setup.canArchiveOrUnarchive,
color: "subtle",
size: "sm",
onClick: _cache[5] || (_cache[5] = ($event) => $setup.toggleCommentResolvedStatus()),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:91:15"
}, null, 8, ["icon-left", "disabled"]), [
[_directive_tippy, $props.modelValue.archived ? "Unresolve" : "Resolve"]
]),
_createVNode(_component_FormButton, {
"icon-left": $setup.X,
"hide-text": "",
color: "subtle",
size: "sm",
onClick: _cache[6] || (_cache[6] = ($event) => $setup.changeExpanded(false)),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:100:15"
}, null, 8, ["icon-left"])
])
],
512
/* NEED_PATCH */
),
$setup.showBanner ? (_openBlock(), _createElementBlock("div", _hoisted_10, [
_createElementVNode(
"div",
_hoisted_11,
_toDisplayString($setup.bannerText),
1
/* TEXT */
),
_createVNode(_component_FormButton, {
"icon-right": $setup.bannerButton.icon,
size: "sm",
color: "outline",
onClick: $setup.bannerButton.action,
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:116:13"
}, {
default: _withCtx(() => [
_createTextVNode(
_toDisplayString($setup.bannerButton.text),
1
/* TEXT */
)
]),
_: 1
/* STABLE */
}, 8, ["icon-right", "onClick"])
])) : _createCommentVNode("v-if", true),
_createElementVNode("div", _hoisted_12, [
_createElementVNode(
"div",
_hoisted_13,
[
(_openBlock(true), _createElementBlock(
_Fragment,
null,
_renderList($setup.comments, (comment) => {
return _openBlock(), _createBlock(_component_ViewerAnchoredPointThreadComment, {
key: comment.id,
comment,
"project-id": $setup.projectId,
onMounted: $setup.onCommentMounted,
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:130:15"
}, null, 8, ["comment", "project-id"]);
}),
128
/* KEYED_FRAGMENT */
))
],
512
/* NEED_PATCH */
),
$setup.isTypingMessage ? (_openBlock(), _createElementBlock(
"div",
_hoisted_14,
_toDisplayString($setup.isTypingMessage),
1
/* TEXT */
)) : _createCommentVNode("v-if", true)
]),
$setup.showNewReplyComponent ? (_openBlock(), _createBlock(_component_ViewerAnchoredPointThreadNewReply, {
key: 1,
"model-value": $props.modelValue,
onSubmit: $setup.onNewReply,
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:145:11"
}, null, 8, ["model-value"])) : _createCommentVNode("v-if", true),
$setup.isEmbedEnabled ? (_openBlock(), _createElementBlock("div", _hoisted_15, [
_createVNode(_component_FormButton, {
"full-width": "",
to: $setup.getLinkToThread($setup.projectId, $setup.props.modelValue),
external: "",
target: "_blank",
size: "sm",
color: "outline",
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:154:13"
}, {
default: _withCtx(() => [..._cache[8] || (_cache[8] = [
_createTextVNode(
" Reply in Speckle ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["to"])
])) : _createCommentVNode("v-if", true),
!$setup.canReply && !$setup.isEmbedEnabled && !$setup.isLoggedIn ? (_openBlock(), _createElementBlock("div", _hoisted_16, [
_createVNode(_component_FormButton, {
"full-width": "",
color: "outline",
size: "sm",
onClick: _cache[7] || (_cache[7] = ($event) => _ctx.$emit("login")),
"data-v-inspector": "components/viewer/anchored-point/Thread.vue:169:13"
}, {
default: _withCtx(() => [..._cache[9] || (_cache[9] = [
_createTextVNode(
" Reply ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
})
])) : _createCommentVNode("v-if", true)
],
2
/* CLASS */
)
]),
_: 1
/* STABLE */
})
],
4
/* STYLE */
)) : _createCommentVNode("v-if", true)
]);
}
import "/_nuxt/components/viewer/anchored-point/Thread.vue?vue&type=style&index=0&scoped=a8417d9a&lang.css";
_sfc_main.__hmrId = "a8417d9a";
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], ["__scopeId", "data-v-a8417d9a"], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/anchored-point/Thread.vue"]]);
//# sourceMappingURL=data:application/json;base64,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LFFBQVE7QUFBQSw0QkFDYjtBQUFBLDRCQUNBLGNBQVk7QUFBQSw0QkFDWixXQUFTO0FBQUEsNEJBQWtCLG9CQUFpQjtBQUFBOzs7Ozs7Ozs7a0JBSXpDLHdDQURSO0FBQUEsb0JBS007QUFBQSxvQkFMTjtBQUFBLG9CQUtNLGlCQURELHNCQUFlO0FBQUE7QUFBQTtBQUFBOztnQkFJZCw4Q0FEUixhQUlFO0FBQUE7a0JBRkMsZUFBYTtBQUFBLGtCQUNiLFVBQVE7QUFBQSxrQkFBWSxvQkFBaUI7QUFBQTtnQkFHaEMsdUNBRFIsb0JBY00sT0FkTixhQWNNO0FBQUEsa0JBVkosYUFTYTtBQUFBLG9CQVJYO0FBQUEsb0JBQ0MsSUFBSSx1QkFBZ0Isa0JBQVcsYUFBTSxVQUFVO0FBQUEsb0JBQ2hEO0FBQUEsb0JBQ0EsUUFBTztBQUFBLG9CQUNQLE1BQUs7QUFBQSxvQkFDTCxPQUFNO0FBQUEsb0JBQVUsb0JBQWlCO0FBQUE7c0NBQ2xDLE1BRUQ7QUFBQTt3QkFGQztBQUFBLHdCQUVEO0FBQUE7QUFBQTtBQUFBOzs7OztpQkFHTyxtQkFBUSxDQUFLLHlCQUFjLENBQUssbUNBRHpDLG9CQU9NLE9BUE4sYUFPTTtBQUFBLGtCQUhKLGFBRWE7QUFBQSxvQkFGRDtBQUFBLG9CQUFXLE9BQU07QUFBQSxvQkFBVSxNQUFLO0FBQUEsb0JBQU0sU0FBSyxzQ0FBRSxXQUFLO0FBQUEsb0JBQVcsb0JBQWlCO0FBQUE7c0NBQXFELE1BRS9JO0FBQUE7d0JBRitJO0FBQUEsd0JBRS9JO0FBQUE7QUFBQTtBQUFBIiwibmFtZXMiOlsiQWN0aW9uVHlwZXMiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiVGhyZWFkLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6MjozXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcG9pbnRlci1ldmVudHMtYXV0b1wiXHJcbiAgICAgIDpzdHlsZT1cIntcclxuICAgICAgICAuLi5tb2RlbFZhbHVlLnN0eWxlLFxyXG4gICAgICAgIG9wYWNpdHk6IDFcclxuICAgICAgfVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjM6NVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgcmVmPVwidGhyZWFkQWN0aXZhdG9yXCIgY2xhc3M9XCJyZWxhdGl2ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEwOjdcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICA6Y2xhc3M9XCJgXHJcbiAgICAgICAgJHttb2RlbFZhbHVlLmlzT2NjbHVkZWQgJiYgIWlzRXhwYW5kZWQgPyAnb3BhY2l0eS02MCBob3ZlcjpvcGFjaXR5LTEwMCcgOiAnJ31cclxuICAgICAgICAke2lzRXhwYW5kZWQgPyAnb3V0bGluZSBvdXRsaW5lLTIgb3V0bGluZS1wcmltYXJ5JyA6ICcnfVxyXG4gICAgICAgIHRyYW5zaXRpb24gYmctZm91bmRhdGlvbiBzaGFkb3cgaG92ZXI6c2hhZG93LXhsIGZsZXggLXNwYWNlLXgtMiBpdGVtcy1jZW50ZXIgcC1bMnB4XSByb3VuZGVkLXRyLWZ1bGwgcm91bmRlZC10bC1mdWxsIHJvdW5kZWQtYnItZnVsbGBcIlxyXG4gICAgICAgICAgQGNsaWNrPVwib25UaHJlYWRDbGlja1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjExOjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxVc2VyQXZhdGFyR3JvdXBcclxuICAgICAgICAgICAgdi1pZj1cIiFtb2RlbFZhbHVlLmFyY2hpdmVkXCJcclxuICAgICAgICAgICAgaGlkZS10b29sdGlwc1xyXG4gICAgICAgICAgICA6dXNlcnM9XCJ0aHJlYWRBdXRob3JzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6MTg6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cIm1vZGVsVmFsdWUuYXJjaGl2ZWRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInctNyBoLTcgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToyMzoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInctNiBoLTYgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctZm91bmRhdGlvbiBkYXJrOmJnLWZvdW5kYXRpb24tMiByb3VuZGVkLWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToyNzoxM1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8SWNvbkNpcmNsZUNoZWNrIGNsYXNzPVwic2l6ZS01IHRleHQtcHJpbWFyeVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjMwOjE1XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgdi1pZj1cImlzRXhwYW5kZWRcIlxyXG4gICAgICByZWY9XCJ0aHJlYWRDb250YWluZXJcIlxyXG4gICAgICBjbGFzcz1cInRocmVhZC1jb250YWluZXIgZml4ZWQgbWItMTYgYm90dG9tLTAgcmlnaHQtMCBzbTpib3R0b20tYXV0byBzbTpyaWdodC1hdXRvIHctc2NyZWVuIHNtOnctODAgei01MCBwb2ludGVyLWV2ZW50cy1hdXRvXCJcclxuICAgICAgOnN0eWxlPVwidGhyZWFkU3R5bGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTozNjo1XCJcclxuICAgID5cclxuICAgICAgPFZpZXdlckNvbW1lbnRzUG9ydGFsT3JEaXYgdG89XCJtb2JpbGVDb21tZW50c1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjQyOjdcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGJnLWZvdW5kYXRpb24gYm9yZGVyIGJvcmRlci1vdXRsaW5lLTIgZmxleCBmbGV4LWNvbCBvdmVyZmxvdy1oaWRkZW4gc206c2hhZG93LW1kIGN1cnNvci1hdXRvIHNtOnJvdW5kZWQtbGcgaC1mdWxsIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMFwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdpcy1kcmFnZ2luZyBib3JkZXItb3V0bGluZS01JzogaXNEcmFnZ2luZyB9XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NDM6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICByZWY9XCJoYW5kbGVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHctZnVsbCBmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWIgYm9yZGVyLW91dGxpbmUtMiBwLTIgcGItMS41IGN1cnNvci1tb3ZlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NDc6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93IGZsZXggaXRlbXMtY2VudGVyIGdhcC14LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTo1MToxM1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0wLjVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTo1MjoxNVwiPlxyXG4gICAgICAgICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgICAgICAgOmljb24tbGVmdD1cIkNoZXZyb25MZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFoYXNQcmV2aW91c1wiXHJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz1cImVtaXQoJ3ByZXYnLCBtb2RlbFZhbHVlKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjUzOjE3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICA6aWNvbi1sZWZ0PVwiQ2hldnJvblJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFoYXNOZXh0XCJcclxuICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiZW1pdCgnbmV4dCcsIG1vZGVsVmFsdWUpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NjE6MTdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC14LTAuNVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjcxOjEzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NzI6MTVcIj5cclxuICAgICAgICAgICAgICAgIDxMYXlvdXRNZW51XHJcbiAgICAgICAgICAgICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dNZW51XCJcclxuICAgICAgICAgICAgICAgICAgOm1lbnUtaWQ9XCJtZW51SWRcIlxyXG4gICAgICAgICAgICAgICAgICA6aXRlbXM9XCJhY3Rpb25zSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICBtb3VudC1tZW51LW9uLWJvZHlcclxuICAgICAgICAgICAgICAgICAgQGNsaWNrLnN0b3AucHJldmVudFxyXG4gICAgICAgICAgICAgICAgICBAY2hvc2VuPVwib25BY3Rpb25DaG9zZW5cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTo3MzoxN1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwic2hvd01lbnUgPyAnIWJnLWhpZ2hsaWdodC0zJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRWxsaXBzaXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz1cInNob3dNZW51ID0gIXNob3dNZW51XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6ODE6MTlcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9MYXlvdXRNZW51PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICB2LXRpcHB5PVwibW9kZWxWYWx1ZS5hcmNoaXZlZCA/ICdVbnJlc29sdmUnIDogJ1Jlc29sdmUnXCJcclxuICAgICAgICAgICAgICAgIDppY29uLWxlZnQ9XCJDaXJjbGVDaGVja1wiXHJcbiAgICAgICAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFjYW5BcmNoaXZlT3JVbmFyY2hpdmVcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cInRvZ2dsZUNvbW1lbnRSZXNvbHZlZFN0YXR1cygpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6OTE6MTVcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgICAgIDppY29uLWxlZnQ9XCJYXCJcclxuICAgICAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cImNoYW5nZUV4cGFuZGVkKGZhbHNlKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEwMDoxNVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cInNob3dCYW5uZXJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNCBib3JkZXItYiBib3JkZXItb3V0bGluZS0yIHB5LTIgcHgtMiB3LWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxMDk6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmQtMiBmb250LW1lZGl1bVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjExMzoxM1wiPlxyXG4gICAgICAgICAgICAgIHt7IGJhbm5lclRleHQgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgOmljb24tcmlnaHQ9XCJiYW5uZXJCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgIEBjbGljaz1cImJhbm5lckJ1dHRvbi5hY3Rpb25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxMTY6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgYmFubmVyQnV0dG9uLnRleHQgfX1cclxuICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsIHNtOnctODAgZmxleCBmbGV4LWNvbCBmbGV4LTEganVzdGlmeS1iZXR3ZWVuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6MTI1OjExXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICByZWY9XCJjb21tZW50c0NvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC1bMjAwcHhdIHNtOm1heC1oLVszMDBweF0gMnhsOm1heC1oLVs1MDBweF0gb3ZlcmZsb3cteS1hdXRvIHNpbXBsZS1zY3JvbGxiYXIgZmxleCBmbGV4LWNvbCBweC0yIHB5LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxMjY6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFZpZXdlckFuY2hvcmVkUG9pbnRUaHJlYWRDb21tZW50XHJcbiAgICAgICAgICAgICAgICB2LWZvcj1cImNvbW1lbnQgaW4gY29tbWVudHNcIlxyXG4gICAgICAgICAgICAgICAgOmtleT1cImNvbW1lbnQuaWRcIlxyXG4gICAgICAgICAgICAgICAgOmNvbW1lbnQ9XCJjb21tZW50XCJcclxuICAgICAgICAgICAgICAgIDpwcm9qZWN0LWlkPVwicHJvamVjdElkXCJcclxuICAgICAgICAgICAgICAgIEBtb3VudGVkPVwib25Db21tZW50TW91bnRlZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEzMDoxNVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICB2LWlmPVwiaXNUeXBpbmdNZXNzYWdlXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBweC0zIG1kOnB4LTQgcGItMyBjYXB0aW9uIG10LTEgdGV4dC1ib2R5LTJ4c1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEzODoxM1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBpc1R5cGluZ01lc3NhZ2UgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxWaWV3ZXJBbmNob3JlZFBvaW50VGhyZWFkTmV3UmVwbHlcclxuICAgICAgICAgICAgdi1pZj1cInNob3dOZXdSZXBseUNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cIm1vZGVsVmFsdWVcIlxyXG4gICAgICAgICAgICBAc3VibWl0PVwib25OZXdSZXBseVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjE0NToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWlmPVwiaXNFbWJlZEVuYWJsZWRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBwLTIgYm9yZGVyLXQgYm9yZGVyLW91dGxpbmUtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjE1MDoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgZnVsbC13aWR0aFxyXG4gICAgICAgICAgICAgIDp0bz1cImdldExpbmtUb1RocmVhZChwcm9qZWN0SWQsIHByb3BzLm1vZGVsVmFsdWUpXCJcclxuICAgICAgICAgICAgICBleHRlcm5hbFxyXG4gICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxNTQ6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgUmVwbHkgaW4gU3BlY2tsZVxyXG4gICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cIiFjYW5SZXBseSAmJiAhaXNFbWJlZEVuYWJsZWQgJiYgIWlzTG9nZ2VkSW5cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBwLTIgYm9yZGVyLXQgYm9yZGVyLW91dGxpbmUtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjE2NToxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uIGZ1bGwtd2lkdGggY29sb3I9XCJvdXRsaW5lXCIgc2l6ZT1cInNtXCIgQGNsaWNrPVwiJGVtaXQoJ2xvZ2luJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxNjk6MTNcIj5cclxuICAgICAgICAgICAgICBSZXBseVxyXG4gICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9WaWV3ZXJDb21tZW50c1BvcnRhbE9yRGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7XHJcbiAgTW92ZUxlZnQsXHJcbiAgTW92ZVJpZ2h0LFxyXG4gIENpcmNsZUNoZWNrLFxyXG4gIFgsXHJcbiAgQ2hldnJvbkxlZnQsXHJcbiAgQ2hldnJvblJpZ2h0LFxyXG4gIEVsbGlwc2lzXHJcbn0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5pbXBvcnQgeyBlbnN1cmVFcnJvciB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgb25LZXlEb3duLCB1c2VDbGlwYm9hcmQsIHVzZURyYWdnYWJsZSwgb25DbGlja091dHNpZGUgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IHNjcm9sbFRvQm90dG9tIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL2RvbSdcclxuaW1wb3J0IHsgdXNlVmlld2VyVGhyZWFkVHlwaW5nVHJhY2tpbmcgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL2FjdGl2aXR5J1xyXG5pbXBvcnQgeyB1c2VBbmltYXRpbmdFbGxpcHNpcyB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvY29tbWVudEJ1YmJsZXMnXHJcbmltcG9ydCB0eXBlIHsgQ29tbWVudEJ1YmJsZU1vZGVsIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9jb21tZW50QnViYmxlcydcclxuaW1wb3J0IHtcclxuICB1c2VBcmNoaXZlQ29tbWVudCxcclxuICB1c2VDaGVja1ZpZXdlckNvbW1lbnRpbmdBY2Nlc3MsXHJcbiAgdXNlTWFya1RocmVhZFZpZXdlZCxcclxuICB1c2VDb21tZW50Q29udGV4dFxyXG59IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvY29tbWVudE1hbmFnZW1lbnQnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VyU3RhdGUgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgeyB1c2VBY3RpdmVVc2VyIH0gZnJvbSAnfn4vbGliL2F1dGgvY29tcG9zYWJsZXMvYWN0aXZlVXNlcidcclxuaW1wb3J0IHsgVG9hc3ROb3RpZmljYXRpb25UeXBlLCB1c2VHbG9iYWxUb2FzdCB9IGZyb20gJ35+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvdG9hc3QnXHJcbmltcG9ydCB7IGdldExpbmtUb1RocmVhZCB9IGZyb20gJ35+L2xpYi92aWV3ZXIvaGVscGVycy9jb21tZW50cydcclxuaW1wb3J0IHsgdXNlRGlzYWJsZUdsb2JhbFRleHRTZWxlY3Rpb24gfSBmcm9tICd+fi9saWIvY29tbW9uL2NvbXBvc2FibGVzL3dpbmRvdydcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgdXNlVGhyZWFkVXRpbGl0aWVzIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aSdcclxuaW1wb3J0IHsgdXNlRW1iZWQgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZW1iZWQnXHJcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXRNZW51SXRlbSB9IGZyb20gJ35+L2xpYi9sYXlvdXQvaGVscGVycy9jb21wb25lbnRzJ1xyXG5cclxuZW51bSBBY3Rpb25UeXBlcyB7XHJcbiAgQ29weUxpbmsgPSAnY29weS1saW5rJyxcclxuICBQb3BJbiA9ICdwb3AtaW4nXHJcbn1cclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFZpZXdlckNvbW1lbnRUaHJlYWREYXRhIG9uIENvbW1lbnQge1xyXG4gICAgaWRcclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuQXJjaGl2ZSB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogQ29tbWVudEJ1YmJsZU1vZGVsKTogdm9pZFxyXG4gIChlOiAndXBkYXRlOmV4cGFuZGVkJywgdjogYm9vbGVhbik6IHZvaWRcclxuICAoZTogJ25leHQnLCB2OiBDb21tZW50QnViYmxlTW9kZWwpOiB2b2lkXHJcbiAgKGU6ICdwcmV2JywgdjogQ29tbWVudEJ1YmJsZU1vZGVsKTogdm9pZFxyXG4gIChlOiAnbG9naW4nKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtb2RlbFZhbHVlOiBDb21tZW50QnViYmxlTW9kZWxcclxuICBoYXNQcmV2aW91cz86IGJvb2xlYW5cclxuICBoYXNOZXh0PzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCB7IGlzRW1iZWRFbmFibGVkIH0gPSB1c2VFbWJlZCgpXHJcblxyXG5jb25zdCB0aHJlYWRJZCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLm1vZGVsVmFsdWUuaWQpXHJcbmNvbnN0IHsgY29weSB9ID0gdXNlQ2xpcGJvYXJkKClcclxuY29uc3QgeyBpc0xvZ2dlZEluIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuY29uc3QgYXJjaGl2ZUNvbW1lbnQgPSB1c2VBcmNoaXZlQ29tbWVudCgpXHJcbmNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG5jb25zdCB7IHByb2plY3RJZCB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcbmNvbnN0IGNhblJlcGx5ID0gdXNlQ2hlY2tWaWV3ZXJDb21tZW50aW5nQWNjZXNzKClcclxuY29uc3QgeyBkaXNhYmxlVGV4dFNlbGVjdGlvbiB9ID0gdXNlRGlzYWJsZUdsb2JhbFRleHRTZWxlY3Rpb24oKVxyXG5jb25zdCBtYXJrVGhyZWFkVmlld2VkID0gdXNlTWFya1RocmVhZFZpZXdlZCgpXHJcbmNvbnN0IHsgdXNlcnNUeXBpbmcgfSA9IHVzZVZpZXdlclRocmVhZFR5cGluZ1RyYWNraW5nKHRocmVhZElkKVxyXG5jb25zdCB7IGVsbGlwc2lzLCBjb250cm9scyB9ID0gdXNlQW5pbWF0aW5nRWxsaXBzaXMoKVxyXG5jb25zdCB7IHRocmVhZFJlc291cmNlU3RhdHVzLCBoYXNDbGlja2VkRnVsbENvbnRleHQsIGdvQmFjaywgaGFuZGxlQ29udGV4dENsaWNrIH0gPVxyXG4gIHVzZUNvbW1lbnRDb250ZXh0KClcclxuY29uc3QgeyBpc09wZW5UaHJlYWQsIG9wZW4sIGNsb3NlQWxsVGhyZWFkcyB9ID0gdXNlVGhyZWFkVXRpbGl0aWVzKClcclxuY29uc3Qgcm91dGVyID0gdXNlU2FmZVJvdXRlcigpXHJcbmNvbnN0IG1lbnVJZCA9IHVzZUlkKClcclxuXHJcbmNvbnN0IHNob3dNZW51ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBjb21tZW50c0NvbnRhaW5lciA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxFbGVtZW50PilcclxuY29uc3QgdGhyZWFkQ29udGFpbmVyID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTEVsZW1lbnQ+KVxyXG5jb25zdCB0aHJlYWRBY3RpdmF0b3IgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcblxyXG5vbkNsaWNrT3V0c2lkZSh0aHJlYWRDb250YWluZXIsIChldmVudCkgPT4ge1xyXG4gIGNvbnN0IHZpZXdlckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlld2VyJylcclxuXHJcbiAgaWYgKFxyXG4gICAgaXNFeHBhbmRlZC52YWx1ZSAmJlxyXG4gICAgdmlld2VyRWxlbWVudCAmJlxyXG4gICAgKGV2ZW50LnRhcmdldCA9PT0gdmlld2VyRWxlbWVudCB8fCB2aWV3ZXJFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkgJiZcclxuICAgICEodGhyZWFkQWN0aXZhdG9yLnZhbHVlICYmIHRocmVhZEFjdGl2YXRvci52YWx1ZS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpXHJcbiAgKSB7XHJcbiAgICBjaGFuZ2VFeHBhbmRlZChmYWxzZSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBoYW5kbGUgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcbmNvbnN0IGp1c3RDcmVhdGVkUmVwbHkgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBjb21tZW50cyA9IGNvbXB1dGVkKCgpID0+IFtcclxuICBwcm9wcy5tb2RlbFZhbHVlLFxyXG4gIC4uLnByb3BzLm1vZGVsVmFsdWUucmVwbGllcy5pdGVtcy5zbGljZSgpLnJldmVyc2UoKVxyXG5dKVxyXG5cclxuY29uc3Qgc2hvd05ld1JlcGx5Q29tcG9uZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiAhcHJvcHMubW9kZWxWYWx1ZS5hcmNoaXZlZCAmJiBjYW5SZXBseS52YWx1ZSAmJiAhaXNFbWJlZEVuYWJsZWQudmFsdWVcclxufSlcclxuXHJcbmNvbnN0IGlzRXhwYW5kZWQgPSBjb21wdXRlZCgoKSA9PiBpc09wZW5UaHJlYWQocHJvcHMubW9kZWxWYWx1ZS5pZCkpXHJcblxyXG5jb25zdCBpc1R5cGluZ01lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCF1c2Vyc1R5cGluZy52YWx1ZS5sZW5ndGgpIHJldHVybiBudWxsXHJcbiAgcmV0dXJuIHVzZXJzVHlwaW5nLnZhbHVlLmxlbmd0aCA+IDFcclxuICAgID8gYCR7dXNlcnNUeXBpbmcudmFsdWUubWFwKCh1KSA9PiB1LnVzZXJOYW1lKS5qb2luKCcsICcpfSBhcmUgdHlwaW5nJHtcclxuICAgICAgICBlbGxpcHNpcy52YWx1ZVxyXG4gICAgICB9YFxyXG4gICAgOiBgJHt1c2Vyc1R5cGluZy52YWx1ZVswXS51c2VyTmFtZX0gaXMgdHlwaW5nJHtlbGxpcHNpcy52YWx1ZX1gXHJcbn0pXHJcblxyXG5jb25zdCBpc1ZpZXdlZCA9IGNvbXB1dGVkKCgpID0+ICEhcHJvcHMubW9kZWxWYWx1ZS52aWV3ZWRBdClcclxuXHJcbmNvbnN0IGluaXRpYWxEcmFnUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHg6IHByb3BzLm1vZGVsVmFsdWUuc3R5bGUueCBhcyBudW1iZXIsXHJcbiAgICB5OiBwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnkgYXMgbnVtYmVyXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgbXAgPSB1c2VNaXhwYW5lbCgpXHJcblxyXG5jb25zdCBpc0RyYWdnZWQgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHsgeCwgeSwgaXNEcmFnZ2luZywgcG9zaXRpb24gfSA9IHVzZURyYWdnYWJsZSh0aHJlYWRDb250YWluZXIsIHtcclxuICBzdG9wUHJvcGFnYXRpb246IHRydWUsXHJcbiAgaGFuZGxlLFxyXG4gIGluaXRpYWxWYWx1ZTogaW5pdGlhbERyYWdQb3NpdGlvbixcclxuICBvblN0YXJ0KF9wb3MsIGV2ZW50KSB7XHJcbiAgICAvLyBPbmx5IGFsbG93IGRyYWdnaW5nIGZyb20gaGVhZGVyLCBidXQgbm90IGZyb20gaW50ZXJhY3RpdmUgZWxlbWVudHNcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyB0aGUgaGFuZGxlIG9yIGNvbnRhaW5lZCB3aXRoaW4gaXRcclxuICAgIGNvbnN0IGlzV2l0aGluSGFuZGxlID0gdGFyZ2V0ID09PSBoYW5kbGUudmFsdWUgfHwgaGFuZGxlLnZhbHVlPy5jb250YWlucyh0YXJnZXQpXHJcbiAgICBpZiAoIWlzV2l0aGluSGFuZGxlKSByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAvLyBQcmV2ZW50IGRyYWdnaW5nIHdoZW4gY2xpY2tpbmcgb24gYnV0dG9ucyBvciBvdGhlciBpbnRlcmFjdGl2ZSBlbGVtZW50c1xyXG4gICAgY29uc3QgaXNJbnRlcmFjdGl2ZUVsZW1lbnQgPVxyXG4gICAgICB0YXJnZXQuY2xvc2VzdCgnYnV0dG9uJykgfHxcclxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoJ2EnKSB8fFxyXG4gICAgICB0YXJnZXQuY2xvc2VzdCgnW3JvbGU9XCJidXR0b25cIl0nKVxyXG4gICAgaWYgKGlzSW50ZXJhY3RpdmVFbGVtZW50KSByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAvLyBSZXNldCBwb3MsIGlmIHN0YXJ0aW5nIGRyYWdnaW5nIGZyb20gc2NyYXRjaFxyXG4gICAgaWYgKCFpc0RyYWdnZWQudmFsdWUpIHBvc2l0aW9uLnZhbHVlID0geyB4OiAwLCB5OiAwIH1cclxuXHJcbiAgICBpc0RyYWdnZWQudmFsdWUgPSB0cnVlXHJcbiAgICBtcC50cmFjaygnQ29tbWVudCBBY3Rpb24nLCB7IHR5cGU6ICdhY3Rpb24nLCBuYW1lOiAnZHJhZycgfSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB0aHJlYWRTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIXRocmVhZEFjdGl2YXRvci52YWx1ZSkgcmV0dXJuIHByb3BzLm1vZGVsVmFsdWUuc3R5bGVcclxuXHJcbiAgY29uc3QgYWN0aXZhdG9yUmVjdCA9IHRocmVhZEFjdGl2YXRvci52YWx1ZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuICBjb25zdCBhcmVEcmFnZ2FibGVDb29yZHNJbml0aWFsaXplZCA9IHgudmFsdWUgJiYgeS52YWx1ZVxyXG4gIGNvbnN0IHhPZmZzZXQgPVxyXG4gICAgaXNEcmFnZ2VkLnZhbHVlICYmIGFyZURyYWdnYWJsZUNvb3Jkc0luaXRpYWxpemVkXHJcbiAgICAgID8geC52YWx1ZVxyXG4gICAgICA6IChwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnggYXMgbnVtYmVyKSArIGFjdGl2YXRvclJlY3Qud2lkdGggKyAyMFxyXG4gIGNvbnN0IHRocmVhZEhlaWdodCA9IHRocmVhZENvbnRhaW5lci52YWx1ZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IHx8IDBcclxuICBjb25zdCB0aHJlYWRXaWR0aCA9IHRocmVhZENvbnRhaW5lci52YWx1ZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggfHwgMFxyXG4gIGNvbnN0IHlPZmZzZXQgPVxyXG4gICAgaXNEcmFnZ2VkLnZhbHVlICYmIGFyZURyYWdnYWJsZUNvb3Jkc0luaXRpYWxpemVkXHJcbiAgICAgID8geS52YWx1ZVxyXG4gICAgICA6IChwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnkgYXMgbnVtYmVyKSAtIHRocmVhZEhlaWdodCAvIDJcclxuXHJcbiAgLy8gQ29uc3RyYWluIHRvIHZpZXdwb3J0IGJvdW5kYXJpZXMgd2l0aCAxMHB4IHBhZGRpbmdcclxuICBjb25zdCBwYWRkaW5nID0gaXNFbWJlZEVuYWJsZWQudmFsdWUgPyA1IDogMTBcclxuICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGhcclxuICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxyXG5cclxuICAvLyBVc2UgNThweCB0b3AgcGFkZGluZyB3aGVuIG5vdCBpbiBlbWJlZCBtb2RlICh0byBhY2NvdW50IGZvciB0aGUgdG9wIGJhcilcclxuICBjb25zdCB0b3BQYWRkaW5nID0gaXNFbWJlZEVuYWJsZWQudmFsdWUgPyBwYWRkaW5nIDogNThcclxuXHJcbiAgLy8gVXNlIDYycHggYm90dG9tIHBhZGRpbmcgd2hlbiBpbiBlbWJlZCBtb2RlICh0byBhY2NvdW50IGZvciB0aGUgYm90dG9tIGNvbnRyb2xzKVxyXG4gIGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBpc0VtYmVkRW5hYmxlZC52YWx1ZSA/IDYyIDogcGFkZGluZ1xyXG5cclxuICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgc3RheXMgd2l0aGluIHRoZSB2aWV3cG9ydFxyXG4gIGNvbnN0IGNvbnN0cmFpbmVkWCA9IE1hdGgubWluKFxyXG4gICAgTWF0aC5tYXgocGFkZGluZywgeE9mZnNldCksXHJcbiAgICB2aWV3cG9ydFdpZHRoIC0gdGhyZWFkV2lkdGggLSBwYWRkaW5nXHJcbiAgKVxyXG4gIGNvbnN0IGNvbnN0cmFpbmVkWSA9IE1hdGgubWluKFxyXG4gICAgTWF0aC5tYXgodG9wUGFkZGluZywgeU9mZnNldCksXHJcbiAgICB2aWV3cG9ydEhlaWdodCAtIHRocmVhZEhlaWdodCAtIGJvdHRvbVBhZGRpbmdcclxuICApXHJcblxyXG4gIGNvbnN0IHRyYW5zaXRpb24gPSBpc0RyYWdnZWQudmFsdWUgPyAnbm9uZScgOiBwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnRyYW5zaXRpb25cclxuICByZXR1cm4ge1xyXG4gICAgLi4ucHJvcHMubW9kZWxWYWx1ZS5zdHlsZSxcclxuICAgIG9wYWNpdHk6IDEsXHJcbiAgICB0cmFuc2l0aW9uLFxyXG4gICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7Y29uc3RyYWluZWRYfXB4LCR7Y29uc3RyYWluZWRZfXB4KWBcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB0aHJlYWRBdXRob3JzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGF1dGhvcnMgPSBbcHJvcHMubW9kZWxWYWx1ZS5hdXRob3JdXHJcbiAgZm9yIChjb25zdCBhdXRob3Igb2YgcHJvcHMubW9kZWxWYWx1ZS5yZXBseUF1dGhvcnMuaXRlbXMpIHtcclxuICAgIGlmICghYXV0aG9ycy5maW5kKCh1KSA9PiB1LmlkID09PSBhdXRob3IuaWQpKSBhdXRob3JzLnB1c2goYXV0aG9yKVxyXG4gIH1cclxuICByZXR1cm4gYXV0aG9yc1xyXG59KVxyXG5cclxuY29uc3QgYWN0aW9uc0l0ZW1zID0gY29tcHV0ZWQ8TGF5b3V0TWVudUl0ZW1bXVtdPigoKSA9PiBbXHJcbiAgW1xyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ0NvcHkgbGluaycsXHJcbiAgICAgIGlkOiBBY3Rpb25UeXBlcy5Db3B5TGlua1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdQb3AgaW4nLFxyXG4gICAgICBpZDogQWN0aW9uVHlwZXMuUG9wSW4sXHJcbiAgICAgIGRpc2FibGVkOiAhaXNEcmFnZ2VkLnZhbHVlXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3QgY2FuQXJjaGl2ZU9yVW5hcmNoaXZlID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMubW9kZWxWYWx1ZS5wZXJtaXNzaW9ucy5jYW5BcmNoaXZlLmF1dGhvcml6ZWRcclxuKVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtOyBldmVudDogTW91c2VFdmVudCB9KSA9PiB7XHJcbiAgY29uc3QgeyBpdGVtIH0gPSBwYXJhbXNcclxuXHJcbiAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLkNvcHlMaW5rOlxyXG4gICAgICBzaG93TWVudS52YWx1ZSA9IGZhbHNlXHJcbiAgICAgIG9uQ29weUxpbmsoKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5Qb3BJbjpcclxuICAgICAgc2hvd01lbnUudmFsdWUgPSBmYWxzZVxyXG4gICAgICBpc0RyYWdnZWQudmFsdWUgPSBmYWxzZVxyXG4gICAgICBicmVha1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY2hhbmdlRXhwYW5kZWQgPSBhc3luYyAobmV3VmFsOiBib29sZWFuKSA9PiB7XHJcbiAgaWYgKG5ld1ZhbCkge1xyXG4gICAgYXdhaXQgb3Blbihwcm9wcy5tb2RlbFZhbHVlLmlkKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBhd2FpdCBjbG9zZUFsbFRocmVhZHMoKVxyXG4gIH1cclxuXHJcbiAgZW1pdCgndXBkYXRlOmV4cGFuZGVkJywgbmV3VmFsKVxyXG4gIG1wLnRyYWNrKCdDb21tZW50IEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3RvZ2dsZScsXHJcbiAgICBzdGF0dXM6IG5ld1ZhbCxcclxuICAgIHNvdXJjZTogJ2J1YmJsZSdcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCB0b2dnbGVDb21tZW50UmVzb2x2ZWRTdGF0dXMgPSBhc3luYyAoKSA9PiB7XHJcbiAgLy8gUmVtb3ZlIHRocmVhZCBJRCBmcm9tIFVSTCB3aGVuIHJlc29sdmluZ1xyXG4gIGlmICghcHJvcHMubW9kZWxWYWx1ZS5hcmNoaXZlZCkge1xyXG4gICAgYXdhaXQgcm91dGVyLnJlcGxhY2UoKCkgPT4ge1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHsgLi4ucm91dGVyLmN1cnJlbnRSb3V0ZS52YWx1ZS5xdWVyeSB9XHJcbiAgICAgIGRlbGV0ZSBxdWVyeS50aHJlYWRcclxuICAgICAgcmV0dXJuIHsgcXVlcnkgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGF3YWl0IGFyY2hpdmVDb21tZW50KHtcclxuICAgIGNvbW1lbnRJZDogcHJvcHMubW9kZWxWYWx1ZS5pZCxcclxuICAgIHByb2plY3RJZDogcHJvamVjdElkLnZhbHVlLFxyXG4gICAgYXJjaGl2ZWQ6ICFwcm9wcy5tb2RlbFZhbHVlLmFyY2hpdmVkXHJcbiAgfSlcclxuXHJcbiAgbXAudHJhY2soJ0NvbW1lbnQgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnYXJjaGl2ZScsXHJcbiAgICBzdGF0dXM6IHByb3BzLm1vZGVsVmFsdWUuYXJjaGl2ZWRcclxuICB9KVxyXG4gIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgdGl0bGU6IGBUaHJlYWQgJHtwcm9wcy5tb2RlbFZhbHVlLmFyY2hpdmVkID8gJ3Jlb3BlbmVkLicgOiAncmVzb2x2ZWQuJ31gLFxyXG4gICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkluZm9cclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBvbk5ld1JlcGx5ID0gKCkgPT4ge1xyXG4gIGp1c3RDcmVhdGVkUmVwbHkudmFsdWUgPSB0cnVlXHJcbiAgbXAudHJhY2soJ0NvbW1lbnQgQWN0aW9uJywgeyB0eXBlOiAnYWN0aW9uJywgbmFtZTogJ3JlcGx5JyB9KVxyXG59XHJcblxyXG5jb25zdCBvbkNvbW1lbnRNb3VudGVkID0gKCkgPT4ge1xyXG4gIGlmICghanVzdENyZWF0ZWRSZXBseS52YWx1ZSkgcmV0dXJuXHJcblxyXG4gIGNvbnN0IGVsID0gY29tbWVudHNDb250YWluZXIudmFsdWVcclxuICBpZiAoIWVsKSByZXR1cm5cclxuXHJcbiAgc2Nyb2xsVG9Cb3R0b20oZWwpXHJcbiAganVzdENyZWF0ZWRSZXBseS52YWx1ZSA9IGZhbHNlXHJcbn1cclxuXHJcbmNvbnN0IG9uVGhyZWFkQ2xpY2sgPSAoKSA9PiB7XHJcbiAgY2hhbmdlRXhwYW5kZWQoIWlzRXhwYW5kZWQudmFsdWUpXHJcbn1cclxuXHJcbmNvbnN0IG9uQ29weUxpbmsgPSBhc3luYyAoKSA9PiB7XHJcbiAgaWYgKGltcG9ydC5tZXRhLnNlcnZlcikgcmV0dXJuXHJcbiAgY29uc3QgdXJsID0gZ2V0TGlua1RvVGhyZWFkKHByb2plY3RJZC52YWx1ZSwgcHJvcHMubW9kZWxWYWx1ZSlcclxuICBpZiAoIXVybCkgcmV0dXJuXHJcblxyXG4gIHRyeSB7XHJcbiAgICBhd2FpdCBjb3B5KG5ldyBVUkwodXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKS50b1N0cmluZygpKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICB0aXRsZTogJ1RocmVhZCBsaW5rIGNvcHkgZmFpbGVkJyxcclxuICAgICAgZGVzY3JpcHRpb246IGVuc3VyZUVycm9yKGUpLm1lc3NhZ2VcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlXHJcbiAgfVxyXG5cclxuICBtcC50cmFjaygnQ29tbWVudCBBY3Rpb24nLCB7IHR5cGU6ICdhY3Rpb24nLCBuYW1lOiAnc2hhcmUnIH0pXHJcblxyXG4gIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkluZm8sXHJcbiAgICB0aXRsZTogJ0xpbmsgY29waWVkJ1xyXG4gIH0pXHJcbn1cclxuXHJcbm9uS2V5RG93bignRXNjYXBlJywgKCkgPT4ge1xyXG4gIGlmIChpc0V4cGFuZGVkLnZhbHVlKSB7XHJcbiAgICBjaGFuZ2VFeHBhbmRlZChmYWxzZSlcclxuICB9XHJcbn0pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiBbaXNFeHBhbmRlZC52YWx1ZSwgaXNWaWV3ZWQudmFsdWVdIGFzIGNvbnN0LFxyXG4gIChuZXdWYWxzLCBvbGRWYWxzKSA9PiB7XHJcbiAgICBjb25zdCBbbmV3SXNFeHBhbmRlZCwgbmV3SXNWaWV3ZWRdID0gbmV3VmFsc1xyXG4gICAgY29uc3QgW29sZElzRXhwYW5kZWRdID0gb2xkVmFscyB8fCBbZmFsc2VdXHJcblxyXG4gICAgaWYgKG5ld0lzRXhwYW5kZWQgJiYgbmV3SXNFeHBhbmRlZCAhPT0gb2xkSXNFeHBhbmRlZCAmJiAhbmV3SXNWaWV3ZWQpIHtcclxuICAgICAgbWFya1RocmVhZFZpZXdlZChwcm9qZWN0SWQudmFsdWUsIHByb3BzLm1vZGVsVmFsdWUuaWQpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFuZXdJc0V4cGFuZGVkKSB7XHJcbiAgICAgIGlzRHJhZ2dlZC52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9IC8vIGZvciB0cmlnZ2VyaW5nIGFsc28gd2hlbiBhIGNvbW1lbnQgaXMgb3BlbmVkIGJlY2F1c2Ugb2YgYSB0aHJlYWQgbGlua1xyXG4pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiB1c2Vyc1R5cGluZy52YWx1ZS5sZW5ndGggPiAxLFxyXG4gIChhcmVVc2Vyc1R5cGluZykgPT4ge1xyXG4gICAgaWYgKGFyZVVzZXJzVHlwaW5nKSB7XHJcbiAgICAgIGNvbnRyb2xzLnJlc3VtZSgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb250cm9scy5wYXVzZSgpXHJcbiAgICB9XHJcbiAgfVxyXG4pXHJcblxyXG53YXRjaChpc0RyYWdnaW5nLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAoISFuZXdWYWwgPT09ICEhb2xkVmFsKSByZXR1cm5cclxuXHJcbiAgLy8gRGlzYWJsZSB0ZXh0IHNlbGVjdGlvbiB3aGlsZSBkcmFnZ2luZyBhcm91bmRcclxuICBkaXNhYmxlVGV4dFNlbGVjdGlvbi52YWx1ZSA9IG5ld1ZhbFxyXG59KVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaXNFeHBhbmRlZC52YWx1ZSkge1xyXG4gICAgLy8gdXBkYXRlIHdvbid0IGVtaXQgaWYgdGhyZWFkIHdhcyBtb3VudGVkIGFscmVhZHkgZXhwYW5kZWQsIHNvIHdlIGVtaXQgdGhpcyB0byBjbG9zZSBhbnkgb3BlbiB0aHJlYWQgZWRpdG9yc1xyXG4gICAgZW1pdCgndXBkYXRlOmV4cGFuZGVkJywgdHJ1ZSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBzaG93QmFubmVyID0gY29tcHV0ZWQoXHJcbiAgKCkgPT5cclxuICAgIHRocmVhZFJlc291cmNlU3RhdHVzLnZhbHVlLmlzRGlmZmVyZW50VmVyc2lvbiB8fFxyXG4gICAgdGhyZWFkUmVzb3VyY2VTdGF0dXMudmFsdWUuaXNGZWRlcmF0ZWRNb2RlbCB8fFxyXG4gICAgaGFzQ2xpY2tlZEZ1bGxDb250ZXh0LnZhbHVlXHJcbilcclxuXHJcbmNvbnN0IGJhbm5lclRleHQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKGhhc0NsaWNrZWRGdWxsQ29udGV4dC52YWx1ZSkgcmV0dXJuICdWaWV3aW5nIGZ1bGwgY29udGV4dCdcclxuICBpZiAoXHJcbiAgICB0aHJlYWRSZXNvdXJjZVN0YXR1cy52YWx1ZS5pc0RpZmZlcmVudFZlcnNpb24gJiZcclxuICAgIHRocmVhZFJlc291cmNlU3RhdHVzLnZhbHVlLmlzRmVkZXJhdGVkTW9kZWxcclxuICApXHJcbiAgICByZXR1cm4gJ1JlZmVyZW5jZXMgbXVsdGlwbGUgbW9kZWxzIHdpdGggZGlmZmVyZW50IHZlcnNpb25zJ1xyXG4gIGlmICh0aHJlYWRSZXNvdXJjZVN0YXR1cy52YWx1ZS5pc0RpZmZlcmVudFZlcnNpb24pXHJcbiAgICByZXR1cm4gJ0NvbnZlcnNhdGlvbiBzdGFydGVkIGluIGEgZGlmZmVyZW50IHZlcnNpb24nXHJcbiAgaWYgKHRocmVhZFJlc291cmNlU3RhdHVzLnZhbHVlLmlzRmVkZXJhdGVkTW9kZWwpXHJcbiAgICByZXR1cm4gJ1JlZmVyZW5jZXMgbW9kZWxzIG5vdCBjdXJyZW50bHkgbG9hZGVkJ1xyXG4gIHJldHVybiAnJ1xyXG59KVxyXG5cclxuY29uc3QgYmFubmVyQnV0dG9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChoYXNDbGlja2VkRnVsbENvbnRleHQudmFsdWUpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRleHQ6ICdCYWNrJyxcclxuICAgICAgaWNvbjogTW92ZUxlZnQsXHJcbiAgICAgIGFjdGlvbjogZ29CYWNrXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICB0ZXh0OiAnRnVsbCBjb250ZXh0JyxcclxuICAgIGljb246IE1vdmVSaWdodCxcclxuICAgIGFjdGlvbjogaGFuZGxlQ29udGV4dENsaWNrXHJcbiAgfVxyXG59KVxyXG48L3NjcmlwdD5cclxuPHN0eWxlIHNjb3BlZD5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7XHJcbiAgLnRocmVhZC1jb250YWluZXIge1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlIn0=