import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/Actions.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/project/page/models/card/EditDialog.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/project/page/models/card/DeleteDialog.vue"; import { default as __nuxt_component_4 } from "/_nuxt/components/project/model-page/dialog/embed/Embed.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/project/page/models/UploadsDialog.vue"; import { default as __nuxt_component_6 } from "/_nuxt/components/project/page/models/card/RemoveSyncDialog.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createBlock as __createBlock,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 _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...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 { useCopyModelLink } from "/_nuxt/lib/projects/composables/modelManagement.ts"; import { EllipsisHorizontalIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_solid.js?v=e4f18c29"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { HorizontalDirection } from "/_nuxt/lib/common/composables/window.ts"; import { useActiveUser } from "/_nuxt/lib/auth/composables/activeUser.ts"; import { modelVersionsRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { useWorkspacePlan } from "/_nuxt/lib/workspaces/composables/plan.ts"; import { useUpdateAccSyncItem } from "/_nuxt/lib/acc/composables/useUpdateAccSyncItem.ts"; import { useClipboard } from "/_nuxt/composables/browser.ts"; import { useId, ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29"; var ActionTypes = /* @__PURE__ */ ((ActionTypes2) => { ActionTypes2["Rename"] = "rename"; ActionTypes2["Delete"] = "delete"; ActionTypes2["Share"] = "share"; ActionTypes2["ViewVersions"] = "view-versions"; ActionTypes2["UploadVersion"] = "upload-version"; ActionTypes2["ToggleSyncPause"] = "toggle-sync-pause"; ActionTypes2["DeleteSync"] = "delete-sync"; ActionTypes2["CopyId"] = "copy-id"; ActionTypes2["Embed"] = "embed"; ActionTypes2["ViewUploads"] = "view-uploads"; return ActionTypes2; })(ActionTypes || {}); const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ProjectPageModelsActions", props: { open: { type: Boolean, required: false }, model: { type: Object, required: true }, project: { type: Object, required: true }, menuPosition: { type: Number, required: false }, mountMenuOnBody: { type: Boolean, required: false } }, emits: ["update:open", "model-updated", "upload-version", "embed"], setup(__props, { expose: __expose, emit: __emit }) { graphql(` fragment ProjectPageModelsActions on Model { id name permissions { canUpdate { ...FullPermissionCheckResult } canDelete { ...FullPermissionCheckResult } canCreateVersion { ...FullPermissionCheckResult } } accSyncItem { id ...ProjectPageModelsActions_AccSyncItem } ...UseCopyModelLink_Model } `); graphql(` fragment ProjectPageModelsActions_Project on Project { id workspace { id slug } permissions { canReadAccIntegrationSettings { ...FullPermissionCheckResult } } ...ProjectsModelPageEmbed_Project } `); graphql(` fragment ProjectPageModelsActions_AccSyncItem on AccSyncItem { id accFileName status } `); const emit = __emit; const props = __props; const copyModelLink = useCopyModelLink(); const { copy } = useClipboard(); const menuId = useId(); const { isLoggedIn } = useActiveUser(); const router = useRouter(); const mp = useMixpanel(); const { statusIsCanceled } = useWorkspacePlan(props.project.workspace?.slug || ""); const showActionsMenu = ref(false); const openDialog = ref(null); const accSyncItem = computed(() => props.model.accSyncItem); const updateAccSyncItem = useUpdateAccSyncItem(); const canEdit = computed(() => props.model.permissions.canUpdate); const canDelete = computed(() => props.model.permissions.canDelete); const canCreateVersion = computed(() => props.model.permissions.canCreateVersion); const canEditAccSync = computed( () => props.project.permissions.canReadAccIntegrationSettings ); const uploadVersionDisabled = computed(() => { if (canCreateVersion.value.code === "WORKSPACES_NOT_AUTHORIZED_ERROR") { return { disabled: true, tooltip: `Your project role doesn't allow creating new model versions` }; } if (statusIsCanceled.value) { return { disabled: true, tooltip: "The workspace's subscription is cancelled, so no new model versions can be created" }; } if (!canCreateVersion.value.authorized) { return { disabled: true, tooltip: canCreateVersion.value.message || "Insufficient permissions" }; } return { disabled: false, tooltip: "" }; }); const actionsItems = computed(() => [ ...isLoggedIn.value ? [ [ { title: "Edit model...", id: "rename" /* Rename */, disabled: !canEdit.value.authorized, disabledTooltip: canEdit.value.message || "Insufficient permissions" } ] ] : [], accSyncItem.value ? [ { title: accSyncItem.value?.status === "paused" ? "Resume sync..." : "Pause sync...", id: "toggle-sync-pause" /* ToggleSyncPause */, disabled: !canEditAccSync.value.authorized, disabledTooltip: canEditAccSync.value.message }, { title: "Remove sync...", id: "delete-sync" /* DeleteSync */, disabled: !canEditAccSync.value.authorized, disabledTooltip: canEditAccSync.value.message } ] : [ { title: "View versions", id: "view-versions" /* ViewVersions */ }, { title: "View uploads", id: "view-uploads" /* ViewUploads */ }, ...isLoggedIn.value ? [ { title: "Upload new version...", id: "upload-version" /* UploadVersion */, disabled: uploadVersionDisabled.value.disabled, disabledTooltip: uploadVersionDisabled.value.tooltip } ] : [] ], [ { title: "Copy link", id: "share" /* Share */ }, { title: "Copy ID", id: "copy-id" /* CopyId */ }, { title: "Embed model...", id: "embed" /* Embed */ } ], ...isLoggedIn.value ? [ [ { title: "Delete...", id: "delete" /* Delete */, // TODO: disabled: !canDelete.value.authorized, disabledTooltip: canDelete.value.message || "Insufficient permissions" } ] ] : [] ]); const isRenameDialogOpen = computed({ get: () => openDialog.value === "rename" /* Rename */, set: (isOpen) => openDialog.value = isOpen ? "rename" /* Rename */ : null }); const isDeleteDialogOpen = computed({ get: () => openDialog.value === "delete" /* Delete */, set: (isOpen) => openDialog.value = isOpen ? "delete" /* Delete */ : null }); const isEmbedDialogOpen = computed({ get: () => openDialog.value === "embed" /* Embed */, set: (isOpen) => openDialog.value = isOpen ? "embed" /* Embed */ : null }); const isUploadsDialogOpen = computed({ get: () => openDialog.value === "view-uploads" /* ViewUploads */, set: (isOpen) => openDialog.value = isOpen ? "view-uploads" /* ViewUploads */ : null }); const isRemoveSyncDialogOpen = computed({ get: () => openDialog.value === "delete-sync" /* DeleteSync */, set: (isOpen) => openDialog.value = isOpen ? "delete-sync" /* DeleteSync */ : null }); const onActionChosen = (params) => { const { item } = params; switch (item.id) { case "rename" /* Rename */: case "delete" /* Delete */: case "embed" /* Embed */: case "view-uploads" /* ViewUploads */: case "delete-sync" /* DeleteSync */: openDialog.value = item.id; break; case "toggle-sync-pause" /* ToggleSyncPause */: if (!accSyncItem.value) return; updateAccSyncItem( props.project.id, accSyncItem.value?.id, accSyncItem.value.status === "paused" ? "pending" : "paused" ); break; case "share" /* Share */: mp.track("Branch Action", { type: "action", name: "share" }); void copyModelLink({ model: props.model }); break; case "view-versions" /* ViewVersions */: router.push(modelVersionsRoute(props.project.id, props.model.id)); break; case "upload-version" /* UploadVersion */: emit("upload-version"); break; case "copy-id" /* CopyId */: copy(props.model.id, { successMessage: "Copied model ID to clipboard" }); break; } }; const onButtonClick = () => { showActionsMenu.value = !showActionsMenu.value; }; const showUploads = () => { openDialog.value = "view-uploads" /* ViewUploads */; }; watch(showActionsMenu, (newVal) => emit("update:open", newVal)); watch( () => props.open || false, (newVal) => showActionsMenu.value = newVal ); __expose({ showUploads }); const __returned__ = { ActionTypes, emit, props, copyModelLink, copy, menuId, isLoggedIn, router, mp, statusIsCanceled, showActionsMenu, openDialog, accSyncItem, updateAccSyncItem, canEdit, canDelete, canCreateVersion, canEditAccSync, uploadVersionDisabled, actionsItems, isRenameDialogOpen, isDeleteDialogOpen, isEmbedDialogOpen, isUploadsDialogOpen, isRemoveSyncDialogOpen, onActionChosen, onButtonClick, showUploads, get EllipsisHorizontalIcon() { return EllipsisHorizontalIcon; }, get HorizontalDirection() { return HorizontalDirection; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, withCtx as _withCtx, openBlock as _openBlock, createCommentVNode as _createCommentVNode, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "relative", "data-v-inspector": "components/project/page/models/Actions.vue:3:3" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_FormButton = __nuxt_component_0; const _component_LayoutMenu = __nuxt_component_1; const _component_ProjectPageModelsCardEditDialog = __nuxt_component_2; const _component_ProjectPageModelsCardDeleteDialog = __nuxt_component_3; const _component_ProjectModelPageDialogEmbed = __nuxt_component_4; const _component_ProjectPageModelsUploadsDialog = __nuxt_component_5; const _component_ProjectPageModelsCardRemoveSyncDialog = __nuxt_component_6; return _openBlock(), _createElementBlock("div", _hoisted_1, [ _createVNode(_component_LayoutMenu, { open: $setup.showActionsMenu, "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.showActionsMenu = $event), "menu-id": $setup.menuId, items: $setup.actionsItems, "menu-position": $props.menuPosition ? $props.menuPosition : $setup.HorizontalDirection.Left, "mount-menu-on-body": $props.mountMenuOnBody, onClick: _cache[1] || (_cache[1] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/project/page/models/Actions.vue:4:5" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { color: "subtle", "hide-text": "", "icon-right": $setup.EllipsisHorizontalIcon, class: "!text-foreground-2", onClick: $setup.onButtonClick, "data-v-inspector": "components/project/page/models/Actions.vue:13:7" }, null, 8, ["icon-right"]) ]), _: 1 /* STABLE */ }, 8, ["open", "menu-id", "items", "menu-position", "mount-menu-on-body"]), _createVNode(_component_ProjectPageModelsCardEditDialog, { open: $setup.isRenameDialogOpen, "onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.isRenameDialogOpen = $event), model: $props.model, "project-id": $props.project.id, onUpdated: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("model-updated")), "data-v-inspector": "components/project/page/models/Actions.vue:21:5" }, null, 8, ["open", "model", "project-id"]), _createVNode(_component_ProjectPageModelsCardDeleteDialog, { open: $setup.isDeleteDialogOpen, "onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.isDeleteDialogOpen = $event), model: $props.model, "project-id": $props.project.id, onDeleted: _cache[5] || (_cache[5] = ($event) => _ctx.$emit("model-updated")), "data-v-inspector": "components/project/page/models/Actions.vue:27:5" }, null, 8, ["open", "model", "project-id"]), _createVNode(_component_ProjectModelPageDialogEmbed, { open: $setup.isEmbedDialogOpen, "onUpdate:open": _cache[6] || (_cache[6] = ($event) => $setup.isEmbedDialogOpen = $event), project: $props.project, "model-id": $props.model.id, "data-v-inspector": "components/project/page/models/Actions.vue:33:5" }, null, 8, ["open", "project", "model-id"]), _createVNode(_component_ProjectPageModelsUploadsDialog, { open: $setup.isUploadsDialogOpen, "onUpdate:open": _cache[7] || (_cache[7] = ($event) => $setup.isUploadsDialogOpen = $event), "project-id": $props.project.id, "model-id": $props.model.id, "data-v-inspector": "components/project/page/models/Actions.vue:38:5" }, null, 8, ["open", "project-id", "model-id"]), $setup.accSyncItem ? (_openBlock(), _createBlock(_component_ProjectPageModelsCardRemoveSyncDialog, { key: 0, open: $setup.isRemoveSyncDialogOpen, "onUpdate:open": _cache[8] || (_cache[8] = ($event) => $setup.isRemoveSyncDialogOpen = $event), "project-id": $props.project.id, "sync-item": $setup.accSyncItem, "data-v-inspector": "components/project/page/models/Actions.vue:43:5" }, null, 8, ["open", "project-id", "sync-item"])) : _createCommentVNode("v-if", true) ]); } _sfc_main.__hmrId = "d323f1f2"; 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/project/page/models/Actions.vue"]]); //# sourceMappingURL=data:application/json;base64,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QixVQUFRO0FBQUEsTUFBZ0Isb0JBQWlCO0FBQUE7d0JBRTFDLE1BTWM7QUFBQSxRQU5kLGFBTWM7QUFBQSxVQUxaLE9BQU07QUFBQSxVQUNOO0FBQUEsVUFDQyxjQUFZO0FBQUEsVUFDYixPQUFNO0FBQUEsVUFDTCxTQUFPO0FBQUEsVUFBZSxvQkFBaUI7QUFBQTs7Ozs7SUFHNUMsYUFLRTtBQUFBLE1BSlEsTUFBTTtBQUFBLHlGQUFrQjtBQUFBLE1BQy9CLE9BQU87QUFBQSxNQUNQLGNBQVksZUFBUTtBQUFBLE1BQ3BCLFdBQU8sc0NBQUUsV0FBSztBQUFBLE1BQW1CLG9CQUFpQjtBQUFBO0lBRXJELGFBS0U7QUFBQSxNQUpRLE1BQU07QUFBQSx5RkFBa0I7QUFBQSxNQUMvQixPQUFPO0FBQUEsTUFDUCxjQUFZLGVBQVE7QUFBQSxNQUNwQixXQUFPLHNDQUFFLFdBQUs7QUFBQSxNQUFtQixvQkFBaUI7QUFBQTtJQUVyRCxhQUlFO0FBQUEsTUFIUSxNQUFNO0FBQUEsd0ZBQWlCO0FBQUEsTUFDOUIsU0FBUztBQUFBLE1BQ1QsWUFBVSxhQUFNO0FBQUEsTUFBSSxvQkFBaUI7QUFBQTtJQUV4QyxhQUlFO0FBQUEsTUFIUSxNQUFNO0FBQUEsMEZBQW1CO0FBQUEsTUFDaEMsY0FBWSxlQUFRO0FBQUEsTUFDcEIsWUFBVSxhQUFNO0FBQUEsTUFBSSxvQkFBaUI7QUFBQTtJQUdoQyxvQ0FEUixhQUtFO0FBQUE7TUFIUSxNQUFNO0FBQUEsNkZBQXNCO0FBQUEsTUFDbkMsY0FBWSxlQUFRO0FBQUEsTUFDcEIsYUFBVztBQUFBLE1BQWEsb0JBQWlCO0FBQUEiLCJuYW1lcyI6WyJBY3Rpb25UeXBlcyJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJBY3Rpb25zLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQWN0aW9ucy52dWU6MzozXCI+XHJcbiAgICA8TGF5b3V0TWVudVxyXG4gICAgICB2LW1vZGVsOm9wZW49XCJzaG93QWN0aW9uc01lbnVcIlxyXG4gICAgICA6bWVudS1pZD1cIm1lbnVJZFwiXHJcbiAgICAgIDppdGVtcz1cImFjdGlvbnNJdGVtc1wiXHJcbiAgICAgIDptZW51LXBvc2l0aW9uPVwibWVudVBvc2l0aW9uID8gbWVudVBvc2l0aW9uIDogSG9yaXpvbnRhbERpcmVjdGlvbi5MZWZ0XCJcclxuICAgICAgOm1vdW50LW1lbnUtb24tYm9keT1cIm1vdW50TWVudU9uQm9keVwiXHJcbiAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgQGNob3Nlbj1cIm9uQWN0aW9uQ2hvc2VuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZTo0OjVcIlxyXG4gICAgPlxyXG4gICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICA6aWNvbi1yaWdodD1cIkVsbGlwc2lzSG9yaXpvbnRhbEljb25cIlxyXG4gICAgICAgIGNsYXNzPVwiIXRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICBAY2xpY2s9XCJvbkJ1dHRvbkNsaWNrXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZToxMzo3XCJcclxuICAgICAgPjwvRm9ybUJ1dHRvbj5cclxuICAgIDwvTGF5b3V0TWVudT5cclxuICAgIDxQcm9qZWN0UGFnZU1vZGVsc0NhcmRFZGl0RGlhbG9nXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cImlzUmVuYW1lRGlhbG9nT3BlblwiXHJcbiAgICAgIDptb2RlbD1cIm1vZGVsXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgQHVwZGF0ZWQ9XCIkZW1pdCgnbW9kZWwtdXBkYXRlZCcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZToyMTo1XCJcclxuICAgIC8+XHJcbiAgICA8UHJvamVjdFBhZ2VNb2RlbHNDYXJkRGVsZXRlRGlhbG9nXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cImlzRGVsZXRlRGlhbG9nT3BlblwiXHJcbiAgICAgIDptb2RlbD1cIm1vZGVsXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgQGRlbGV0ZWQ9XCIkZW1pdCgnbW9kZWwtdXBkYXRlZCcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZToyNzo1XCJcclxuICAgIC8+XHJcbiAgICA8UHJvamVjdE1vZGVsUGFnZURpYWxvZ0VtYmVkXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cImlzRW1iZWREaWFsb2dPcGVuXCJcclxuICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCJcclxuICAgICAgOm1vZGVsLWlkPVwibW9kZWwuaWRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0FjdGlvbnMudnVlOjMzOjVcIlxyXG4gICAgLz5cclxuICAgIDxQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwiaXNVcGxvYWRzRGlhbG9nT3BlblwiXHJcbiAgICAgIDpwcm9qZWN0LWlkPVwicHJvamVjdC5pZFwiXHJcbiAgICAgIDptb2RlbC1pZD1cIm1vZGVsLmlkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZTozODo1XCJcclxuICAgIC8+XHJcbiAgICA8UHJvamVjdFBhZ2VNb2RlbHNDYXJkUmVtb3ZlU3luY0RpYWxvZ1xyXG4gICAgICB2LWlmPVwiYWNjU3luY0l0ZW1cIlxyXG4gICAgICB2LW1vZGVsOm9wZW49XCJpc1JlbW92ZVN5bmNEaWFsb2dPcGVuXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgOnN5bmMtaXRlbT1cImFjY1N5bmNJdGVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZTo0Mzo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB0eXBlIHtcclxuICBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNGcmFnbWVudCxcclxuICBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNfUHJvamVjdEZyYWdtZW50XHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0TWVudUl0ZW0gfSBmcm9tICd+fi9saWIvbGF5b3V0L2hlbHBlcnMvY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlQ29weU1vZGVsTGluayB9IGZyb20gJ35+L2xpYi9wcm9qZWN0cy9jb21wb3NhYmxlcy9tb2RlbE1hbmFnZW1lbnQnXHJcbmltcG9ydCB7IEVsbGlwc2lzSG9yaXpvbnRhbEljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9zb2xpZCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgSG9yaXpvbnRhbERpcmVjdGlvbiB9IGZyb20gJ35+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvd2luZG93J1xyXG5pbXBvcnQgeyB1c2VBY3RpdmVVc2VyIH0gZnJvbSAnfn4vbGliL2F1dGgvY29tcG9zYWJsZXMvYWN0aXZlVXNlcidcclxuaW1wb3J0IHsgbW9kZWxWZXJzaW9uc1JvdXRlIH0gZnJvbSAnfi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUnXHJcbmltcG9ydCB7IHVzZVdvcmtzcGFjZVBsYW4gfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2NvbXBvc2FibGVzL3BsYW4nXHJcbmltcG9ydCB7IHVzZVVwZGF0ZUFjY1N5bmNJdGVtIH0gZnJvbSAnfi9saWIvYWNjL2NvbXBvc2FibGVzL3VzZVVwZGF0ZUFjY1N5bmNJdGVtJ1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdFBhZ2VNb2RlbHNBY3Rpb25zIG9uIE1vZGVsIHtcclxuICAgIGlkXHJcbiAgICBuYW1lXHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhblVwZGF0ZSB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICAgIGNhbkRlbGV0ZSB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICAgIGNhbkNyZWF0ZVZlcnNpb24ge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWNjU3luY0l0ZW0ge1xyXG4gICAgICBpZFxyXG4gICAgICAuLi5Qcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNfQWNjU3luY0l0ZW1cclxuICAgIH1cclxuICAgIC4uLlVzZUNvcHlNb2RlbExpbmtfTW9kZWxcclxuICB9XHJcbmApXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNfUHJvamVjdCBvbiBQcm9qZWN0IHtcclxuICAgIGlkXHJcbiAgICB3b3Jrc3BhY2Uge1xyXG4gICAgICBpZFxyXG4gICAgICBzbHVnXHJcbiAgICB9XHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhblJlYWRBY2NJbnRlZ3JhdGlvblNldHRpbmdzIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC4uLlByb2plY3RzTW9kZWxQYWdlRW1iZWRfUHJvamVjdFxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFByb2plY3RQYWdlTW9kZWxzQWN0aW9uc19BY2NTeW5jSXRlbSBvbiBBY2NTeW5jSXRlbSB7XHJcbiAgICBpZFxyXG4gICAgYWNjRmlsZU5hbWVcclxuICAgIHN0YXR1c1xyXG4gIH1cclxuYClcclxuXHJcbmVudW0gQWN0aW9uVHlwZXMge1xyXG4gIFJlbmFtZSA9ICdyZW5hbWUnLFxyXG4gIERlbGV0ZSA9ICdkZWxldGUnLFxyXG4gIFNoYXJlID0gJ3NoYXJlJyxcclxuICBWaWV3VmVyc2lvbnMgPSAndmlldy12ZXJzaW9ucycsXHJcbiAgVXBsb2FkVmVyc2lvbiA9ICd1cGxvYWQtdmVyc2lvbicsXHJcbiAgVG9nZ2xlU3luY1BhdXNlID0gJ3RvZ2dsZS1zeW5jLXBhdXNlJyxcclxuICBEZWxldGVTeW5jID0gJ2RlbGV0ZS1zeW5jJyxcclxuICBDb3B5SWQgPSAnY29weS1pZCcsXHJcbiAgRW1iZWQgPSAnZW1iZWQnLFxyXG4gIFZpZXdVcGxvYWRzID0gJ3ZpZXctdXBsb2FkcydcclxufVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTpvcGVuJywgdjogYm9vbGVhbik6IHZvaWRcclxuICAoZTogJ21vZGVsLXVwZGF0ZWQnKTogdm9pZFxyXG4gIChlOiAndXBsb2FkLXZlcnNpb24nKTogdm9pZFxyXG4gIChlOiAnZW1iZWQnKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBvcGVuPzogYm9vbGVhblxyXG4gIG1vZGVsOiBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNGcmFnbWVudFxyXG4gIHByb2plY3Q6IFByb2plY3RQYWdlTW9kZWxzQWN0aW9uc19Qcm9qZWN0RnJhZ21lbnRcclxuICBtZW51UG9zaXRpb24/OiBIb3Jpem9udGFsRGlyZWN0aW9uXHJcbiAgbW91bnRNZW51T25Cb2R5PzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCBjb3B5TW9kZWxMaW5rID0gdXNlQ29weU1vZGVsTGluaygpXHJcbmNvbnN0IHsgY29weSB9ID0gdXNlQ2xpcGJvYXJkKClcclxuY29uc3QgbWVudUlkID0gdXNlSWQoKVxyXG5jb25zdCB7IGlzTG9nZ2VkSW4gfSA9IHVzZUFjdGl2ZVVzZXIoKVxyXG5jb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKVxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3QgeyBzdGF0dXNJc0NhbmNlbGVkIH0gPSB1c2VXb3Jrc3BhY2VQbGFuKHByb3BzLnByb2plY3Qud29ya3NwYWNlPy5zbHVnIHx8ICcnKVxyXG5cclxuY29uc3Qgc2hvd0FjdGlvbnNNZW51ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBvcGVuRGlhbG9nID0gcmVmKG51bGwgYXMgTnVsbGFibGU8QWN0aW9uVHlwZXM+KVxyXG5cclxuY29uc3QgYWNjU3luY0l0ZW0gPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5tb2RlbC5hY2NTeW5jSXRlbSlcclxuY29uc3QgdXBkYXRlQWNjU3luY0l0ZW0gPSB1c2VVcGRhdGVBY2NTeW5jSXRlbSgpXHJcblxyXG5jb25zdCBjYW5FZGl0ID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMubW9kZWwucGVybWlzc2lvbnMuY2FuVXBkYXRlKVxyXG5jb25zdCBjYW5EZWxldGUgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5tb2RlbC5wZXJtaXNzaW9ucy5jYW5EZWxldGUpXHJcbmNvbnN0IGNhbkNyZWF0ZVZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5tb2RlbC5wZXJtaXNzaW9ucy5jYW5DcmVhdGVWZXJzaW9uKVxyXG5jb25zdCBjYW5FZGl0QWNjU3luYyA9IGNvbXB1dGVkKFxyXG4gICgpID0+IHByb3BzLnByb2plY3QucGVybWlzc2lvbnMuY2FuUmVhZEFjY0ludGVncmF0aW9uU2V0dGluZ3NcclxuKVxyXG5cclxuY29uc3QgdXBsb2FkVmVyc2lvbkRpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChjYW5DcmVhdGVWZXJzaW9uLnZhbHVlLmNvZGUgPT09ICdXT1JLU1BBQ0VTX05PVF9BVVRIT1JJWkVEX0VSUk9SJykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHRvb2x0aXA6IGBZb3VyIHByb2plY3Qgcm9sZSBkb2Vzbid0IGFsbG93IGNyZWF0aW5nIG5ldyBtb2RlbCB2ZXJzaW9uc2BcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKHN0YXR1c0lzQ2FuY2VsZWQudmFsdWUpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxyXG4gICAgICB0b29sdGlwOlxyXG4gICAgICAgIFwiVGhlIHdvcmtzcGFjZSdzIHN1YnNjcmlwdGlvbiBpcyBjYW5jZWxsZWQsIHNvIG5vIG5ldyBtb2RlbCB2ZXJzaW9ucyBjYW4gYmUgY3JlYXRlZFwiXHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICghY2FuQ3JlYXRlVmVyc2lvbi52YWx1ZS5hdXRob3JpemVkKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgdG9vbHRpcDogY2FuQ3JlYXRlVmVyc2lvbi52YWx1ZS5tZXNzYWdlIHx8ICdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgdG9vbHRpcDogJydcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBhY3Rpb25zSXRlbXMgPSBjb21wdXRlZDxMYXlvdXRNZW51SXRlbVtdW10+KCgpID0+IFtcclxuICAuLi4oaXNMb2dnZWRJbi52YWx1ZVxyXG4gICAgPyBbXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogJ0VkaXQgbW9kZWwuLi4nLFxyXG4gICAgICAgICAgICBpZDogQWN0aW9uVHlwZXMuUmVuYW1lLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogIWNhbkVkaXQudmFsdWUuYXV0aG9yaXplZCxcclxuICAgICAgICAgICAgZGlzYWJsZWRUb29sdGlwOiBjYW5FZGl0LnZhbHVlLm1lc3NhZ2UgfHwgJ0luc3VmZmljaWVudCBwZXJtaXNzaW9ucydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIF1cclxuICAgIDogW10pLFxyXG4gIGFjY1N5bmNJdGVtLnZhbHVlXHJcbiAgICA/IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTpcclxuICAgICAgICAgICAgYWNjU3luY0l0ZW0udmFsdWU/LnN0YXR1cyA9PT0gJ3BhdXNlZCcgPyAnUmVzdW1lIHN5bmMuLi4nIDogJ1BhdXNlIHN5bmMuLi4nLFxyXG4gICAgICAgICAgaWQ6IEFjdGlvblR5cGVzLlRvZ2dsZVN5bmNQYXVzZSxcclxuICAgICAgICAgIGRpc2FibGVkOiAhY2FuRWRpdEFjY1N5bmMudmFsdWUuYXV0aG9yaXplZCxcclxuICAgICAgICAgIGRpc2FibGVkVG9vbHRpcDogY2FuRWRpdEFjY1N5bmMudmFsdWUubWVzc2FnZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdSZW1vdmUgc3luYy4uLicsXHJcbiAgICAgICAgICBpZDogQWN0aW9uVHlwZXMuRGVsZXRlU3luYyxcclxuICAgICAgICAgIGRpc2FibGVkOiAhY2FuRWRpdEFjY1N5bmMudmFsdWUuYXV0aG9yaXplZCxcclxuICAgICAgICAgIGRpc2FibGVkVG9vbHRpcDogY2FuRWRpdEFjY1N5bmMudmFsdWUubWVzc2FnZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdWaWV3IHZlcnNpb25zJyxcclxuICAgICAgICAgIGlkOiBBY3Rpb25UeXBlcy5WaWV3VmVyc2lvbnNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnVmlldyB1cGxvYWRzJyxcclxuICAgICAgICAgIGlkOiBBY3Rpb25UeXBlcy5WaWV3VXBsb2Fkc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uKGlzTG9nZ2VkSW4udmFsdWVcclxuICAgICAgICAgID8gW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnVXBsb2FkIG5ldyB2ZXJzaW9uLi4uJyxcclxuICAgICAgICAgICAgICAgIGlkOiBBY3Rpb25UeXBlcy5VcGxvYWRWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHVwbG9hZFZlcnNpb25EaXNhYmxlZC52YWx1ZS5kaXNhYmxlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkVG9vbHRpcDogdXBsb2FkVmVyc2lvbkRpc2FibGVkLnZhbHVlLnRvb2x0aXBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIDogW10pXHJcbiAgICAgIF0sXHJcbiAgW1xyXG4gICAgeyB0aXRsZTogJ0NvcHkgbGluaycsIGlkOiBBY3Rpb25UeXBlcy5TaGFyZSB9LFxyXG4gICAgeyB0aXRsZTogJ0NvcHkgSUQnLCBpZDogQWN0aW9uVHlwZXMuQ29weUlkIH0sXHJcbiAgICB7IHRpdGxlOiAnRW1iZWQgbW9kZWwuLi4nLCBpZDogQWN0aW9uVHlwZXMuRW1iZWQgfVxyXG4gIF0sXHJcbiAgLi4uKGlzTG9nZ2VkSW4udmFsdWVcclxuICAgID8gW1xyXG4gICAgICAgIFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUuLi4nLFxyXG4gICAgICAgICAgICBpZDogQWN0aW9uVHlwZXMuRGVsZXRlLFxyXG4gICAgICAgICAgICAvLyBUT0RPOlxyXG4gICAgICAgICAgICBkaXNhYmxlZDogIWNhbkRlbGV0ZS52YWx1ZS5hdXRob3JpemVkLFxyXG4gICAgICAgICAgICBkaXNhYmxlZFRvb2x0aXA6IGNhbkRlbGV0ZS52YWx1ZS5tZXNzYWdlIHx8ICdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICBdXHJcbiAgICA6IFtdKVxyXG5dKVxyXG5cclxuY29uc3QgaXNSZW5hbWVEaWFsb2dPcGVuID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gb3BlbkRpYWxvZy52YWx1ZSA9PT0gQWN0aW9uVHlwZXMuUmVuYW1lLFxyXG4gIHNldDogKGlzT3BlbikgPT4gKG9wZW5EaWFsb2cudmFsdWUgPSBpc09wZW4gPyBBY3Rpb25UeXBlcy5SZW5hbWUgOiBudWxsKVxyXG59KVxyXG5jb25zdCBpc0RlbGV0ZURpYWxvZ09wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBvcGVuRGlhbG9nLnZhbHVlID09PSBBY3Rpb25UeXBlcy5EZWxldGUsXHJcbiAgc2V0OiAoaXNPcGVuKSA9PiAob3BlbkRpYWxvZy52YWx1ZSA9IGlzT3BlbiA/IEFjdGlvblR5cGVzLkRlbGV0ZSA6IG51bGwpXHJcbn0pXHJcbmNvbnN0IGlzRW1iZWREaWFsb2dPcGVuID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gb3BlbkRpYWxvZy52YWx1ZSA9PT0gQWN0aW9uVHlwZXMuRW1iZWQsXHJcbiAgc2V0OiAoaXNPcGVuKSA9PiAob3BlbkRpYWxvZy52YWx1ZSA9IGlzT3BlbiA/IEFjdGlvblR5cGVzLkVtYmVkIDogbnVsbClcclxufSlcclxuY29uc3QgaXNVcGxvYWRzRGlhbG9nT3BlbiA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IG9wZW5EaWFsb2cudmFsdWUgPT09IEFjdGlvblR5cGVzLlZpZXdVcGxvYWRzLFxyXG4gIHNldDogKGlzT3BlbikgPT4gKG9wZW5EaWFsb2cudmFsdWUgPSBpc09wZW4gPyBBY3Rpb25UeXBlcy5WaWV3VXBsb2FkcyA6IG51bGwpXHJcbn0pXHJcbmNvbnN0IGlzUmVtb3ZlU3luY0RpYWxvZ09wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBvcGVuRGlhbG9nLnZhbHVlID09PSBBY3Rpb25UeXBlcy5EZWxldGVTeW5jLFxyXG4gIHNldDogKGlzT3BlbikgPT4gKG9wZW5EaWFsb2cudmFsdWUgPSBpc09wZW4gPyBBY3Rpb25UeXBlcy5EZWxldGVTeW5jIDogbnVsbClcclxufSlcclxuXHJcbmNvbnN0IG9uQWN0aW9uQ2hvc2VuID0gKHBhcmFtczogeyBpdGVtOiBMYXlvdXRNZW51SXRlbTsgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4ge1xyXG4gIGNvbnN0IHsgaXRlbSB9ID0gcGFyYW1zXHJcblxyXG4gIHN3aXRjaCAoaXRlbS5pZCkge1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5SZW5hbWU6XHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLkRlbGV0ZTpcclxuICAgIGNhc2UgQWN0aW9uVHlwZXMuRW1iZWQ6XHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLlZpZXdVcGxvYWRzOlxyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5EZWxldGVTeW5jOlxyXG4gICAgICBvcGVuRGlhbG9nLnZhbHVlID0gaXRlbS5pZFxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5Ub2dnbGVTeW5jUGF1c2U6XHJcbiAgICAgIGlmICghYWNjU3luY0l0ZW0udmFsdWUpIHJldHVyblxyXG4gICAgICB1cGRhdGVBY2NTeW5jSXRlbShcclxuICAgICAgICBwcm9wcy5wcm9qZWN0LmlkLFxyXG4gICAgICAgIGFjY1N5bmNJdGVtLnZhbHVlPy5pZCxcclxuICAgICAgICBhY2NTeW5jSXRlbS52YWx1ZS5zdGF0dXMgPT09ICdwYXVzZWQnID8gJ3BlbmRpbmcnIDogJ3BhdXNlZCdcclxuICAgICAgKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5TaGFyZTpcclxuICAgICAgbXAudHJhY2soJ0JyYW5jaCBBY3Rpb24nLCB7IHR5cGU6ICdhY3Rpb24nLCBuYW1lOiAnc2hhcmUnIH0pXHJcbiAgICAgIHZvaWQgY29weU1vZGVsTGluayh7IG1vZGVsOiBwcm9wcy5tb2RlbCB9KVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5WaWV3VmVyc2lvbnM6XHJcbiAgICAgIHJvdXRlci5wdXNoKG1vZGVsVmVyc2lvbnNSb3V0ZShwcm9wcy5wcm9qZWN0LmlkLCBwcm9wcy5tb2RlbC5pZCkpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLlVwbG9hZFZlcnNpb246XHJcbiAgICAgIGVtaXQoJ3VwbG9hZC12ZXJzaW9uJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgQWN0aW9uVHlwZXMuQ29weUlkOlxyXG4gICAgICBjb3B5KHByb3BzLm1vZGVsLmlkLCB7IHN1Y2Nlc3NNZXNzYWdlOiAnQ29waWVkIG1vZGVsIElEIHRvIGNsaXBib2FyZCcgfSlcclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uQnV0dG9uQ2xpY2sgPSAoKSA9PiB7XHJcbiAgc2hvd0FjdGlvbnNNZW51LnZhbHVlID0gIXNob3dBY3Rpb25zTWVudS52YWx1ZVxyXG59XHJcblxyXG5jb25zdCBzaG93VXBsb2FkcyA9ICgpID0+IHtcclxuICBvcGVuRGlhbG9nLnZhbHVlID0gQWN0aW9uVHlwZXMuVmlld1VwbG9hZHNcclxufVxyXG5cclxuLy8gZG9pbmcgaXQgdGhpcyB3YXkgd2l0aCAyIHdhdGNoZXJzIHNvIHRoYXQgdXNpbmcgdGhlICdvcGVuJyBwcm9wIGlzIG9wdGlvbmFsXHJcbndhdGNoKHNob3dBY3Rpb25zTWVudSwgKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm9wZW4nLCBuZXdWYWwpKVxyXG53YXRjaChcclxuICAoKSA9PiBwcm9wcy5vcGVuIHx8IGZhbHNlLFxyXG4gIChuZXdWYWwpID0+IChzaG93QWN0aW9uc01lbnUudmFsdWUgPSBuZXdWYWwpXHJcbilcclxuXHJcbmRlZmluZUV4cG9zZSh7XHJcbiAgc2hvd1VwbG9hZHNcclxufSlcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQWN0aW9ucy52dWUifQ==