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

404 lines
36 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/resources/VersionCard.vue");import { FormButton as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { LayoutMenu as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_2 } from "/_nuxt/components/preview/Image.vue";
import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/resources/LimitAlert.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createVNode as __createVNode,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode,createBlock as __createBlock } 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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...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 { CommonBadge, keyboardClick } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import __vite__cjsImport7_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport7_dayjs.__esModule ? __vite__cjsImport7_dayjs.default : __vite__cjsImport7_dayjs;
import __vite__cjsImport8_dayjs_plugin_localizedFormat from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs_plugin_localizedFormat.js?v=e4f18c29"; const localizedFormat = __vite__cjsImport8_dayjs_plugin_localizedFormat.__esModule ? __vite__cjsImport8_dayjs_plugin_localizedFormat.default : __vite__cjsImport8_dayjs_plugin_localizedFormat;
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { HorizontalDirection } from "/_nuxt/lib/common/composables/window.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { useCopyModelLink } from "/_nuxt/lib/projects/composables/modelManagement.ts";
import { Ellipsis, Check, Lock } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
import { useDateFormatters } from "/_nuxt/composables/dates.ts";
import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerResourcesVersionCard",
props: {
version: { type: Object, required: true },
clickable: { type: Boolean, required: false, default: true },
isLatestVersion: { type: Boolean, required: true },
isLoadedVersion: { type: Boolean, required: true },
showTimeline: { type: Boolean, required: false, default: true },
last: { type: Boolean, required: true, default: false },
lastLoaded: { type: Boolean, required: true, default: false },
modelId: { type: String, required: false },
totalVersions: { type: Number, required: false }
},
emits: ["changeVersion", "viewChanges", "removeVersion"],
setup(__props, { expose: __expose, emit: __emit }) {
__expose();
dayjs.extend(localizedFormat);
const props = __props;
const emit = __emit;
const mp = useMixpanel();
const {
resources: {
response: { project }
}
} = useInjectedViewerState();
const copyModelLink = useCopyModelLink();
const { formattedRelativeDate, formattedFullDate } = useDateFormatters();
const isLoaded = computed(() => props.isLoadedVersion);
const isLatest = computed(() => props.isLatestVersion);
const isLimited = computed(() => {
return props.version.referencedObject === null;
});
const createdAt = computed(() => {
return {
full: formattedFullDate(props.version.createdAt),
relative: formattedRelativeDate(props.version.createdAt, { capitalize: true })
};
});
const author = computed(() => props.version.authorUser);
const showActionsMenu = ref(false);
const canDeleteVersion = computed(() => {
if (isLoaded.value) return false;
if (props.totalVersions && props.totalVersions <= 1) return false;
return true;
});
const deleteDisabledReason = computed(() => {
if (isLoaded.value) {
return "Cannot delete the currently viewed version";
}
if (props.totalVersions && props.totalVersions <= 1) {
return "Cannot delete the last version";
}
return void 0;
});
const actionsItems = computed(() => [
[
{
title: "View changes",
id: "view-changes",
disabled: isLoaded.value || isLimited.value,
disabledTooltip: isLoaded.value ? "Cannot compare current version with itself" : isLimited.value ? "Version comparison unavailable" : void 0
},
{
title: "Copy link to version",
id: "copy-link-to-version",
disabled: isLimited.value,
disabledTooltip: isLimited.value ? "Outside workspace version limits" : void 0
}
],
[
{
title: "Delete version...",
id: "remove-version",
disabled: !canDeleteVersion.value,
disabledTooltip: deleteDisabledReason.value
}
]
]);
const handleClick = () => {
if (isLimited.value) return;
if (props.clickable) emit("changeVersion", props.version.id);
mp.track("Viewer Action", {
type: "action",
name: "change-version"
});
};
const handleViewChanges = () => {
emit("viewChanges", props.version);
mp.track("Viewer Action", {
type: "action",
name: "diffs",
action: "enable"
});
};
const onActionChosen = (params) => {
const { item } = params;
switch (item.id) {
case "view-changes":
if (!isLoaded.value && !isLimited.value) {
handleViewChanges();
}
break;
case "copy-link-to-version":
if (project.value?.id && props.modelId) {
void copyModelLink({
model: {
projectId: project.value.id,
id: props.modelId
},
versionId: props.version.id
});
}
break;
case "remove-version":
if (canDeleteVersion.value) {
emit("removeVersion", props.version.id);
}
break;
}
};
const __returned__ = { props, emit, mp, project, copyModelLink, formattedRelativeDate, formattedFullDate, isLoaded, isLatest, isLimited, createdAt, author, showActionsMenu, canDeleteVersion, deleteDisabledReason, actionsItems, handleClick, handleViewChanges, onActionChosen, get CommonBadge() {
return CommonBadge;
}, get keyboardClick() {
return keyboardClick;
}, get HorizontalDirection() {
return HorizontalDirection;
}, get Ellipsis() {
return Ellipsis;
}, get Check() {
return Check;
}, get Lock() {
return Lock;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, vShow as _vShow, resolveDirective as _resolveDirective, withDirectives as _withDirectives, createTextVNode as _createTextVNode, withCtx as _withCtx, resolveComponent as _resolveComponent, withModifiers as _withModifiers } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
key: 0,
class: "absolute -top-1.5 -left-2 flex items-center justify-center h-4 w-4 bg-foundation-2 rounded-full",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:17:7"
};
const _hoisted_2 = {
key: 1,
class: "absolute top-0 -left-[2px] h-[3px] w-[3px] bg-foreground rounded-full",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:23:7"
};
const _hoisted_3 = {
class: "flex items-center gap-1",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:29:5"
};
const _hoisted_4 = {
class: "rounded-full px-2 text-body-xs font-medium ml-3",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:30:7"
};
const _hoisted_5 = { "data-v-inspector": "components/viewer/resources/VersionCard.vue:35:9" };
const _hoisted_6 = {
class: "ml-auto mr-2 mt-0.5",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:40:7"
};
const _hoisted_7 = {
class: "flex items-center pl-5 gap-2 mt-1",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:62:5"
};
const _hoisted_8 = {
key: 0,
class: "flex items-center justify-center w-full h-full",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:67:9"
};
const _hoisted_9 = {
class: "flex h-8 w-8 items-center justify-center rounded-md bg-foundation border border-outline-3",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:68:11"
};
const _hoisted_10 = {
class: "flex flex-col space-y-1 overflow-hidden",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:76:7"
};
const _hoisted_11 = {
class: "flex min-w-0 items-center space-x-1",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:77:9"
};
const _hoisted_12 = {
key: 1,
class: "truncate pr-2",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:84:11"
};
const _hoisted_13 = {
key: 0,
class: "text-body-2xs truncate",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:85:13"
};
const _hoisted_14 = {
class: "text-body-3xs text-foreground-2 truncate",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:88:13"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_FormButton = __nuxt_component_0;
const _component_LayoutMenu = __nuxt_component_1;
const _component_PreviewImage = __nuxt_component_2;
const _component_ViewerResourcesLimitAlert = __nuxt_component_3;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createElementBlock(
"div",
{
class: _normalizeClass([
"group relative w-full rounded-md text-left pl-5 pt-1 pb-2",
$props.clickable && !$setup.isLimited ? "hover:bg-highlight-1 cursor-pointer" : "cursor-default"
]),
onClick: $setup.handleClick,
onKeypress: _cache[3] || (_cache[3] = ($event) => $setup.keyboardClick($setup.handleClick)),
"data-v-inspector": "components/viewer/resources/VersionCard.vue:3:3"
},
[
_createCommentVNode(" Timeline left border "),
$props.showTimeline ? (_openBlock(), _createElementBlock(
"div",
{
key: 0,
class: _normalizeClass(["absolute top-4 left-4 z-10 ml-[2px] mt-[2px] w-1 border-l border-outline-3", $props.last ? "h-0" : "h-[99%]"]),
"data-v-inspector": "components/viewer/resources/VersionCard.vue:12:5"
},
[
$setup.isLoaded ? (_openBlock(), _createElementBlock("div", _hoisted_1, [
_createVNode($setup["Check"], {
class: "h-3 w-3 text-foreground",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:21:9"
})
])) : (_openBlock(), _createElementBlock("div", _hoisted_2))
],
2
/* CLASS */
)) : _createCommentVNode("v-if", true),
_createElementVNode("div", _hoisted_3, [
_withDirectives((_openBlock(), _createElementBlock("div", _hoisted_4, [
_createElementVNode(
"span",
_hoisted_5,
_toDisplayString($setup.isLatest ? "Latest" : $setup.createdAt.relative),
1
/* TEXT */
)
])), [
[_vShow, $props.showTimeline],
[_directive_tippy, $setup.createdAt.full]
]),
$setup.isLoaded ? (_openBlock(), _createBlock($setup["CommonBadge"], {
key: 0,
rounded: "",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:39:7"
}, {
default: _withCtx(() => [..._cache[4] || (_cache[4] = [
_createTextVNode(
"Viewing",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
})) : _createCommentVNode("v-if", true),
_createElementVNode("div", _hoisted_6, [
_createVNode(_component_LayoutMenu, {
open: $setup.showActionsMenu,
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = $event),
items: $setup.actionsItems,
"menu-position": $setup.HorizontalDirection.Left,
"mount-menu-on-body": "",
onClick: _cache[2] || (_cache[2] = _withModifiers(() => {
}, ["stop", "prevent"])),
onChosen: $setup.onActionChosen,
"data-v-inspector": "components/viewer/resources/VersionCard.vue:41:9"
}, {
default: _withCtx(() => [
_createVNode(_component_FormButton, {
"hide-text": "",
color: "subtle",
"icon-left": $setup.Ellipsis,
size: "sm",
onClick: _cache[0] || (_cache[0] = _withModifiers(($event) => $setup.showActionsMenu = !$setup.showActionsMenu, ["stop"])),
"data-v-inspector": "components/viewer/resources/VersionCard.vue:49:11"
}, {
default: _withCtx(() => [..._cache[5] || (_cache[5] = [
_createTextVNode(
" Menu ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["icon-left"])
]),
_: 1
/* STABLE */
}, 8, ["open", "items", "menu-position"])
])
]),
_createCommentVNode(" Main stuff "),
_createElementVNode("div", _hoisted_7, [
_createElementVNode(
"div",
{
class: _normalizeClass(["bg-foundation h-12 w-12 flex-shrink-0 rounded-md border border-outline-3", $setup.isLimited ? "diagonal-stripes" : ""]),
"data-v-inspector": "components/viewer/resources/VersionCard.vue:63:7"
},
[
$setup.isLimited ? (_openBlock(), _createElementBlock("div", _hoisted_8, [
_createElementVNode("div", _hoisted_9, [
_createVNode($setup["Lock"], {
class: "h-4 w-4 text-foreground-3",
"data-v-inspector": "components/viewer/resources/VersionCard.vue:71:13"
})
])
])) : (_openBlock(), _createBlock(_component_PreviewImage, {
key: 1,
"preview-url": $props.version.previewUrl,
"data-v-inspector": "components/viewer/resources/VersionCard.vue:74:9"
}, null, 8, ["preview-url"]))
],
2
/* CLASS */
),
_createElementVNode("div", _hoisted_10, [
_createElementVNode("div", _hoisted_11, [
$setup.isLimited ? (_openBlock(), _createBlock(_component_ViewerResourcesLimitAlert, {
key: 0,
"limit-type": "version",
variant: "inline",
project: $setup.project,
"data-v-inspector": "components/viewer/resources/VersionCard.vue:78:11"
}, null, 8, ["project"])) : (_openBlock(), _createElementBlock("div", _hoisted_12, [
$setup.author ? (_openBlock(), _createElementBlock(
"div",
_hoisted_13,
_toDisplayString($setup.author.name),
1
/* TEXT */
)) : _createCommentVNode("v-if", true),
_createElementVNode(
"div",
_hoisted_14,
_toDisplayString($props.version.message || "no message"),
1
/* TEXT */
)
]))
])
])
])
],
34
/* CLASS, NEED_HYDRATION */
);
}
_sfc_main.__hmrId = "ae9e9e77";
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/resources/VersionCard.vue"]]);
//# sourceMappingURL=data:application/json;base64,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UFg7QUFBQSxnQkFDQSxPQUFNO0FBQUEsZ0JBQ0wsYUFBVztBQUFBLGdCQUNaLE1BQUs7QUFBQSxnQkFDSixTQUFLLHFEQUFPLHlCQUFlLENBQUksd0JBQWU7QUFBQSxnQkFBRSxvQkFBaUI7QUFBQTtrQ0FDbkUsTUFFRDtBQUFBO29CQUZDO0FBQUEsb0JBRUQ7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7TUFJTjtBQUFBLE1BQ0Esb0JBZ0NNLE9BaENOLFlBZ0NNO0FBQUEsUUEvQko7QUFBQSxVQVlNO0FBQUE7QUFBQSxZQVhKLE9BQUssaUJBQUMsNEVBQ0UsbUJBQVM7QUFBQSxZQUE0QixvQkFBaUI7QUFBQTs7WUFFbkQsa0NBQVgsb0JBTU0sT0FOTixZQU1NO0FBQUEsY0FMSixvQkFJTSxPQUpOLFlBSU07QUFBQSxnQkFESixhQUErRztBQUFBLGtCQUF6RyxPQUFNO0FBQUEsa0JBQTRCLG9CQUFpQjtBQUFBOztpQ0FHN0QsYUFBNkg7QUFBQTtjQUF2RyxlQUFhLGVBQVE7QUFBQSxjQUFZLG9CQUFpQjtBQUFBOzs7OztRQUUxRSxvQkFpQk0sT0FqQk4sYUFpQk07QUFBQSxVQWhCSixvQkFlTSxPQWZOLGFBZU07QUFBQSxZQWJJLGtDQURSLGFBS0U7QUFBQTtjQUhBLGNBQVc7QUFBQSxjQUNYLFNBQVE7QUFBQSxjQUNQLFNBQVM7QUFBQSxjQUFTLG9CQUFpQjtBQUFBLHVEQUV0QyxvQkFPTSxPQVBOLGFBT007QUFBQSxjQU5PLCtCQUFYO0FBQUEsZ0JBRU07QUFBQSxnQkFGTjtBQUFBLGdCQUVNLGlCQURELGNBQU8sSUFBSTtBQUFBO0FBQUE7QUFBQTtjQUVoQjtBQUFBLGdCQUVNO0FBQUEsZ0JBRk47QUFBQSxnQkFFTSxpQkFERCxlQUFRLFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiVmVyc2lvbkNhcmQudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XHJcbjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImdyb3VwIHJlbGF0aXZlIHctZnVsbCByb3VuZGVkLW1kIHRleHQtbGVmdCBwbC01IHB0LTEgcGItMlwiXHJcbiAgICA6Y2xhc3M9XCJcclxuICAgICAgY2xpY2thYmxlICYmICFpc0xpbWl0ZWQgPyAnaG92ZXI6YmctaGlnaGxpZ2h0LTEgY3Vyc29yLXBvaW50ZXInIDogJ2N1cnNvci1kZWZhdWx0J1xyXG4gICAgXCJcclxuICAgIEBjbGljaz1cImhhbmRsZUNsaWNrXCJcclxuICAgIEBrZXlwcmVzcz1cImtleWJvYXJkQ2xpY2soaGFuZGxlQ2xpY2spXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MzozXCJcclxuICA+XHJcbiAgICA8IS0tIFRpbWVsaW5lIGxlZnQgYm9yZGVyIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwic2hvd1RpbWVsaW5lXCJcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtNCBsZWZ0LTQgei0xMCBtbC1bMnB4XSBtdC1bMnB4XSB3LTEgYm9yZGVyLWwgYm9yZGVyLW91dGxpbmUtM1wiXHJcbiAgICAgIDpjbGFzcz1cImxhc3QgPyAnaC0wJyA6ICdoLVs5OSVdJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjEyOjVcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cImlzTG9hZGVkXCJcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIC10b3AtMS41IC1sZWZ0LTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC00IHctNCBiZy1mb3VuZGF0aW9uLTIgcm91bmRlZC1mdWxsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MTc6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Q2hlY2sgY2xhc3M9XCJoLTMgdy0zIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjIxOjlcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtZWxzZVxyXG4gICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgLWxlZnQtWzJweF0gaC1bM3B4XSB3LVszcHhdIGJnLWZvcmVncm91bmQgcm91bmRlZC1mdWxsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MjM6N1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZToyOTo1XCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LXNob3c9XCJzaG93VGltZWxpbmVcIlxyXG4gICAgICAgIHYtdGlwcHk9XCJjcmVhdGVkQXQuZnVsbFwiXHJcbiAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcHgtMiB0ZXh0LWJvZHkteHMgZm9udC1tZWRpdW0gbWwtM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjMwOjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6MzU6OVwiPlxyXG4gICAgICAgICAge3sgaXNMYXRlc3QgPyAnTGF0ZXN0JyA6IGNyZWF0ZWRBdC5yZWxhdGl2ZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxDb21tb25CYWRnZSB2LWlmPVwiaXNMb2FkZWRcIiByb3VuZGVkIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjM5OjdcIj5WaWV3aW5nPC9Db21tb25CYWRnZT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1sLWF1dG8gbXItMiBtdC0wLjVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo0MDo3XCI+XHJcbiAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dBY3Rpb25zTWVudVwiXHJcbiAgICAgICAgICA6aXRlbXM9XCJhY3Rpb25zSXRlbXNcIlxyXG4gICAgICAgICAgOm1lbnUtcG9zaXRpb249XCJIb3Jpem9udGFsRGlyZWN0aW9uLkxlZnRcIlxyXG4gICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICBAY2xpY2suc3RvcC5wcmV2ZW50XHJcbiAgICAgICAgICBAY2hvc2VuPVwib25BY3Rpb25DaG9zZW5cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo0MTo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRWxsaXBzaXNcIlxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICBAY2xpY2suc3RvcD1cInNob3dBY3Rpb25zTWVudSA9ICFzaG93QWN0aW9uc01lbnVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo0OToxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIE1lbnVcclxuICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8L0xheW91dE1lbnU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIE1haW4gc3R1ZmYgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGwtNSBnYXAtMiBtdC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6NjI6NVwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJiZy1mb3VuZGF0aW9uIGgtMTIgdy0xMiBmbGV4LXNocmluay0wIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTNcIlxyXG4gICAgICAgIDpjbGFzcz1cImlzTGltaXRlZCA/ICdkaWFnb25hbC1zdHJpcGVzJyA6ICcnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6NjM6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJpc0xpbWl0ZWRcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo2Nzo5XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJnLWZvdW5kYXRpb24gYm9yZGVyIGJvcmRlci1vdXRsaW5lLTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo2ODoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxMb2NrIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmQtM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjcxOjEzXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxQcmV2aWV3SW1hZ2Ugdi1lbHNlIDpwcmV2aWV3LXVybD1cInZlcnNpb24ucHJldmlld1VybFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjc0OjlcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgc3BhY2UteS0xIG92ZXJmbG93LWhpZGRlblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjc2OjdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtaW4tdy0wIGl0ZW1zLWNlbnRlciBzcGFjZS14LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZTo3Nzo5XCI+XHJcbiAgICAgICAgICA8Vmlld2VyUmVzb3VyY2VzTGltaXRBbGVydFxyXG4gICAgICAgICAgICB2LWlmPVwiaXNMaW1pdGVkXCJcclxuICAgICAgICAgICAgbGltaXQtdHlwZT1cInZlcnNpb25cIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwiaW5saW5lXCJcclxuICAgICAgICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6Nzg6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwidHJ1bmNhdGUgcHItMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjg0OjExXCI+XHJcbiAgICAgICAgICAgIDxkaXYgdi1pZj1cImF1dGhvclwiIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0cnVuY2F0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9yZXNvdXJjZXMvVmVyc2lvbkNhcmQudnVlOjg1OjEzXCI+XHJcbiAgICAgICAgICAgICAge3sgYXV0aG9yLm5hbWUgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJvZHktM3hzIHRleHQtZm9yZWdyb3VuZC0yIHRydW5jYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3Jlc291cmNlcy9WZXJzaW9uQ2FyZC52dWU6ODg6MTNcIj5cclxuICAgICAgICAgICAgICB7eyB2ZXJzaW9uLm1lc3NhZ2UgfHwgJ25vIG1lc3NhZ2UnIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IENvbW1vbkJhZGdlLCBrZXlib2FyZENsaWNrIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgbG9jYWxpemVkRm9ybWF0IGZyb20gJ2RheWpzL3BsdWdpbi9sb2NhbGl6ZWRGb3JtYXQnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VyU3RhdGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB0eXBlIHsgVmlld2VyTW9kZWxWZXJzaW9uQ2FyZEl0ZW1GcmFnbWVudCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQgdHlwZSB7IExheW91dE1lbnVJdGVtIH0gZnJvbSAnfn4vbGliL2xheW91dC9oZWxwZXJzL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IEhvcml6b250YWxEaXJlY3Rpb24gfSBmcm9tICd+fi9saWIvY29tbW9uL2NvbXBvc2FibGVzL3dpbmRvdydcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgdXNlQ29weU1vZGVsTGluayB9IGZyb20gJ34vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL21vZGVsTWFuYWdlbWVudCdcclxuaW1wb3J0IHsgRWxsaXBzaXMsIENoZWNrLCBMb2NrIH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5cclxuZGF5anMuZXh0ZW5kKGxvY2FsaXplZEZvcm1hdClcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIHZlcnNpb246IFZpZXdlck1vZGVsVmVyc2lvbkNhcmRJdGVtRnJhZ21lbnRcclxuICAgIGNsaWNrYWJsZT86IGJvb2xlYW5cclxuICAgIGlzTGF0ZXN0VmVyc2lvbjogYm9vbGVhblxyXG4gICAgaXNMb2FkZWRWZXJzaW9uOiBib29sZWFuXHJcbiAgICBzaG93VGltZWxpbmU/OiBib29sZWFuXHJcbiAgICBsYXN0OiBib29sZWFuXHJcbiAgICBsYXN0TG9hZGVkOiBib29sZWFuXHJcbiAgICBtb2RlbElkPzogc3RyaW5nXHJcbiAgICB0b3RhbFZlcnNpb25zPzogbnVtYmVyXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBjbGlja2FibGU6IHRydWUsXHJcbiAgICBkZWZhdWx0OiBmYWxzZSxcclxuICAgIHNob3dUaW1lbGluZTogdHJ1ZSxcclxuICAgIGxhc3Q6IGZhbHNlLFxyXG4gICAgbGFzdExvYWRlZDogZmFsc2VcclxuICB9XHJcbilcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICdjaGFuZ2VWZXJzaW9uJywgdmVyc2lvbjogc3RyaW5nKTogdm9pZFxyXG4gIChlOiAndmlld0NoYW5nZXMnLCB2ZXJzaW9uOiBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbUZyYWdtZW50KTogdm9pZFxyXG4gIChlOiAncmVtb3ZlVmVyc2lvbicsIHZlcnNpb25JZDogc3RyaW5nKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3Qge1xyXG4gIHJlc291cmNlczoge1xyXG4gICAgcmVzcG9uc2U6IHsgcHJvamVjdCB9XHJcbiAgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcbmNvbnN0IGNvcHlNb2RlbExpbmsgPSB1c2VDb3B5TW9kZWxMaW5rKClcclxuY29uc3QgeyBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUsIGZvcm1hdHRlZEZ1bGxEYXRlIH0gPSB1c2VEYXRlRm9ybWF0dGVycygpXHJcblxyXG5jb25zdCBpc0xvYWRlZCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmlzTG9hZGVkVmVyc2lvbilcclxuY29uc3QgaXNMYXRlc3QgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5pc0xhdGVzdFZlcnNpb24pXHJcblxyXG4vLyBDaGVjayBpZiB2ZXJzaW9uIGlzIGxpbWl0ZWQgYnkgcGxhbiByZXN0cmljdGlvbnNcclxuY29uc3QgaXNMaW1pdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBwcm9wcy52ZXJzaW9uLnJlZmVyZW5jZWRPYmplY3QgPT09IG51bGxcclxufSlcclxuXHJcbmNvbnN0IGNyZWF0ZWRBdCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgZnVsbDogZm9ybWF0dGVkRnVsbERhdGUocHJvcHMudmVyc2lvbi5jcmVhdGVkQXQpLFxyXG4gICAgcmVsYXRpdmU6IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZShwcm9wcy52ZXJzaW9uLmNyZWF0ZWRBdCwgeyBjYXBpdGFsaXplOiB0cnVlIH0pXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYXV0aG9yID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMudmVyc2lvbi5hdXRob3JVc2VyKVxyXG5cclxuY29uc3Qgc2hvd0FjdGlvbnNNZW51ID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgY2FuRGVsZXRlVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoaXNMb2FkZWQudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gIGlmIChwcm9wcy50b3RhbFZlcnNpb25zICYmIHByb3BzLnRvdGFsVmVyc2lvbnMgPD0gMSkgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIHRydWVcclxufSlcclxuXHJcbmNvbnN0IGRlbGV0ZURpc2FibGVkUmVhc29uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChpc0xvYWRlZC52YWx1ZSkge1xyXG4gICAgcmV0dXJuICdDYW5ub3QgZGVsZXRlIHRoZSBjdXJyZW50bHkgdmlld2VkIHZlcnNpb24nXHJcbiAgfVxyXG4gIGlmIChwcm9wcy50b3RhbFZlcnNpb25zICYmIHByb3BzLnRvdGFsVmVyc2lvbnMgPD0gMSkge1xyXG4gICAgcmV0dXJuICdDYW5ub3QgZGVsZXRlIHRoZSBsYXN0IHZlcnNpb24nXHJcbiAgfVxyXG4gIHJldHVybiB1bmRlZmluZWRcclxufSlcclxuXHJcbmNvbnN0IGFjdGlvbnNJdGVtcyA9IGNvbXB1dGVkPExheW91dE1lbnVJdGVtW11bXT4oKCkgPT4gW1xyXG4gIFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdWaWV3IGNoYW5nZXMnLFxyXG4gICAgICBpZDogJ3ZpZXctY2hhbmdlcycsXHJcbiAgICAgIGRpc2FibGVkOiBpc0xvYWRlZC52YWx1ZSB8fCBpc0xpbWl0ZWQudmFsdWUsXHJcbiAgICAgIGRpc2FibGVkVG9vbHRpcDogaXNMb2FkZWQudmFsdWVcclxuICAgICAgICA/ICdDYW5ub3QgY29tcGFyZSBjdXJyZW50IHZlcnNpb24gd2l0aCBpdHNlbGYnXHJcbiAgICAgICAgOiBpc0xpbWl0ZWQudmFsdWVcclxuICAgICAgICA/ICdWZXJzaW9uIGNvbXBhcmlzb24gdW5hdmFpbGFibGUnXHJcbiAgICAgICAgOiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnQ29weSBsaW5rIHRvIHZlcnNpb24nLFxyXG4gICAgICBpZDogJ2NvcHktbGluay10by12ZXJzaW9uJyxcclxuICAgICAgZGlzYWJsZWQ6IGlzTGltaXRlZC52YWx1ZSxcclxuICAgICAgZGlzYWJsZWRUb29sdGlwOiBpc0xpbWl0ZWQudmFsdWUgPyAnT3V0c2lkZSB3b3Jrc3BhY2UgdmVyc2lvbiBsaW1pdHMnIDogdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgXSxcclxuICBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnRGVsZXRlIHZlcnNpb24uLi4nLFxyXG4gICAgICBpZDogJ3JlbW92ZS12ZXJzaW9uJyxcclxuICAgICAgZGlzYWJsZWQ6ICFjYW5EZWxldGVWZXJzaW9uLnZhbHVlLFxyXG4gICAgICBkaXNhYmxlZFRvb2x0aXA6IGRlbGV0ZURpc2FibGVkUmVhc29uLnZhbHVlXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3QgaGFuZGxlQ2xpY2sgPSAoKSA9PiB7XHJcbiAgaWYgKGlzTGltaXRlZC52YWx1ZSkgcmV0dXJuXHJcbiAgaWYgKHByb3BzLmNsaWNrYWJsZSkgZW1pdCgnY2hhbmdlVmVyc2lvbicsIHByb3BzLnZlcnNpb24uaWQpXHJcbiAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgIG5hbWU6ICdjaGFuZ2UtdmVyc2lvbidcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVWaWV3Q2hhbmdlcyA9ICgpID0+IHtcclxuICBlbWl0KCd2aWV3Q2hhbmdlcycsIHByb3BzLnZlcnNpb24pXHJcbiAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgIG5hbWU6ICdkaWZmcycsXHJcbiAgICBhY3Rpb246ICdlbmFibGUnXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtIH0pID0+IHtcclxuICBjb25zdCB7IGl0ZW0gfSA9IHBhcmFtc1xyXG5cclxuICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgIGNhc2UgJ3ZpZXctY2hhbmdlcyc6XHJcbiAgICAgIGlmICghaXNMb2FkZWQudmFsdWUgJiYgIWlzTGltaXRlZC52YWx1ZSkge1xyXG4gICAgICAgIGhhbmRsZVZpZXdDaGFuZ2VzKClcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnY29weS1saW5rLXRvLXZlcnNpb24nOlxyXG4gICAgICBpZiAocHJvamVjdC52YWx1ZT8uaWQgJiYgcHJvcHMubW9kZWxJZCkge1xyXG4gICAgICAgIHZvaWQgY29weU1vZGVsTGluayh7XHJcbiAgICAgICAgICBtb2RlbDoge1xyXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QudmFsdWUuaWQsXHJcbiAgICAgICAgICAgIGlkOiBwcm9wcy5tb2RlbElkXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmVyc2lvbklkOiBwcm9wcy52ZXJzaW9uLmlkXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAncmVtb3ZlLXZlcnNpb24nOlxyXG4gICAgICBpZiAoY2FuRGVsZXRlVmVyc2lvbi52YWx1ZSkge1xyXG4gICAgICAgIGVtaXQoJ3JlbW92ZVZlcnNpb24nLCBwcm9wcy52ZXJzaW9uLmlkKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvcmVzb3VyY2VzL1ZlcnNpb25DYXJkLnZ1ZSJ9