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

328 lines
32 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/workspace/moveProject/SelectWorkspace.vue");import { CommonLoadingIcon as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { CommonBadge 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/workspace/Card.vue";
import { default as __nuxt_component_3 } from "/_nuxt/components/workspace/plan/ProjectModelLimitReachedDialog.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 { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { useQuery } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
import { UserAvatarGroup } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { workspaceMoveProjectManagerUserQuery } from "/_nuxt/lib/workspaces/graphql/queries.ts";
import { formatName } from "/_nuxt/lib/billing/helpers/plan.ts";
import { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import {
WorkspaceLimitsReachedError,
WorkspaceSsoSessionNoAccessError
} from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/authz/index.js";
import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "WorkspaceMoveProjectSelectWorkspace",
props: {
project: { type: null, required: true },
checker: { type: Function, required: true },
subheading: { type: String, required: false }
},
emits: ["workspace-selected"],
setup(__props, { expose: __expose, emit: __emit }) {
__expose();
graphql(`
fragment WorkspaceMoveProjectSelectWorkspace_Workspace on Workspace {
id
name
role
slug
plan {
name
}
permissions {
canMoveProjectToWorkspace(projectId: $projectId) {
...FullPermissionCheckResult
}
canCreateProject {
...FullPermissionCheckResult
}
}
}
`);
graphql(`
fragment WorkspaceMoveProjectSelectWorkspace_User on User {
workspaces {
items {
...WorkspaceMoveProjectManager_Workspace
}
}
projects(cursor: $cursor, filter: $filter, sortBy: $sortBy) {
items {
...WorkspaceMoveProjectManager_Project
}
cursor
totalCount
}
}
`);
const props = __props;
const emit = __emit;
const { result, loading: initialLoading } = useQuery(
workspaceMoveProjectManagerUserQuery,
() => ({
cursor: null,
filter: {},
projectId: props.project?.id
})
);
const workspaces = computed(() => result.value?.activeUser?.workspaces.items ?? []);
const hasWorkspaces = computed(() => workspaces.value.length > 0);
const showLoading = computed(
() => initialLoading.value && workspaces.value.length === 0
);
const showLimitDialog = ref(false);
const limitReachedWorkspace = ref(null);
const isWorkspaceAdmin = computed(
() => (workspace) => {
if (!workspace) return false;
return workspace.role === Roles.Workspace.Admin;
}
);
const isWorkspaceDisabled = (workspace) => {
if (!isWorkspaceAdmin.value(workspace)) {
return true;
}
const permission = props.checker(workspace);
return !permission?.authorized && permission?.code !== WorkspaceLimitsReachedError.code;
};
const getWorkspaceTooltip = (workspace) => {
const permission = props.checker(workspace);
if (permission.authorized) {
return void 0;
}
if (permission.code === WorkspaceLimitsReachedError.code) {
return void 0;
}
return permission?.message;
};
const sortedWorkspaces = computed(() => {
return [...workspaces.value].sort((a, b) => {
const aEnabled = props.checker(a).authorized || props.checker(a).code === WorkspaceLimitsReachedError.code;
const bEnabled = props.checker(b).authorized || props.checker(b).code === WorkspaceLimitsReachedError.code;
if (aEnabled && !bEnabled) return -1;
if (!aEnabled && bEnabled) return 1;
return 0;
});
});
const handleWorkspaceClick = (workspace) => {
const permission = props.checker(workspace);
if (permission?.code === WorkspaceLimitsReachedError.code) {
limitReachedWorkspace.value = workspace;
showLimitDialog.value = true;
return;
}
if (permission?.authorized) {
emit("workspace-selected", workspace);
}
};
const isSsoRequired = (workspace) => {
return props.checker(workspace).code === WorkspaceSsoSessionNoAccessError.code;
};
const __returned__ = { props, emit, result, initialLoading, workspaces, hasWorkspaces, showLoading, showLimitDialog, limitReachedWorkspace, isWorkspaceAdmin, isWorkspaceDisabled, getWorkspaceTooltip, sortedWorkspaces, handleWorkspaceClick, isSsoRequired, get UserAvatarGroup() {
return UserAvatarGroup;
}, get formatName() {
return formatName;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createTextVNode as _createTextVNode, withCtx as _withCtx, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = { "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:2:3" };
const _hoisted_2 = {
key: 0,
class: "py-4 flex items-center justify-center w-full h-32",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:3:5"
};
const _hoisted_3 = {
key: 0,
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:7:7"
};
const _hoisted_4 = {
class: "mb-4",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:8:9"
};
const _hoisted_5 = {
class: "flex flex-col gap-2",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:11:9"
};
const _hoisted_6 = ["disabled", "onClick"];
const _hoisted_7 = {
class: "flex flex-col gap-2 items-start",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:29:19"
};
const _hoisted_8 = { "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:38:21" };
const _hoisted_9 = {
key: 1,
class: "text-body-xs text-foreground",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:59:7"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_CommonLoadingIcon = __nuxt_component_0;
const _component_CommonBadge = __nuxt_component_1;
const _component_WorkspaceCard = __nuxt_component_2;
const _component_WorkspacePlanProjectModelLimitReachedDialog = __nuxt_component_3;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createElementBlock("div", _hoisted_1, [
$setup.showLoading ? (_openBlock(), _createElementBlock("div", _hoisted_2, [
_createVNode(_component_CommonLoadingIcon, {
size: "sm",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:4:7"
})
])) : (_openBlock(), _createElementBlock(
_Fragment,
{ key: 1 },
[
$setup.hasWorkspaces ? (_openBlock(), _createElementBlock("div", _hoisted_3, [
_createElementVNode(
"p",
_hoisted_4,
_toDisplayString($props.subheading || "Select an existing workspace or create a new one."),
1
/* TEXT */
),
_createElementVNode("div", _hoisted_5, [
(_openBlock(true), _createElementBlock(
_Fragment,
null,
_renderList($setup.sortedWorkspaces, (ws) => {
return _withDirectives((_openBlock(), _createElementBlock("div", {
key: `${ws.id}-${ws.permissions?.canMoveProjectToWorkspace?.code}`,
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:12:11"
}, [
_createElementVNode("button", {
class: _normalizeClass(["w-full", !$setup.isWorkspaceDisabled(ws) ? "cursor-not-allowed" : ""]),
disabled: $setup.isWorkspaceDisabled(ws),
onClick: ($event) => $setup.handleWorkspaceClick(ws),
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:17:13"
}, [
_createVNode(_component_WorkspaceCard, {
logo: ws.logo ?? "",
name: ws.name,
clickable: !$setup.isWorkspaceDisabled(ws),
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:23:15"
}, {
text: _withCtx(() => [
_createElementVNode("div", _hoisted_7, [
$setup.isSsoRequired(ws) ? (_openBlock(), _createBlock(_component_CommonBadge, {
key: 0,
color: "secondary",
class: "capitalize",
rounded: "",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:30:21"
}, {
default: _withCtx(() => [..._cache[1] || (_cache[1] = [
_createTextVNode(
" SSO login required ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
})) : _createCommentVNode("v-if", true),
_createElementVNode(
"p",
_hoisted_8,
_toDisplayString(ws.plan?.usage.projectCount) + " projects, " + _toDisplayString(ws.plan?.usage.modelCount) + " models ",
1
/* TEXT */
),
_createVNode($setup["UserAvatarGroup"], {
users: ws.team.items.map((t) => t.user),
"max-count": 6,
size: "sm",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:42:21"
}, null, 8, ["users"])
])
]),
actions: _withCtx(() => [
_createVNode(
_component_CommonBadge,
{
color: "secondary",
rounded: "",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:50:19"
},
{
default: _withCtx(() => [
_createTextVNode(
_toDisplayString($setup.formatName(ws.plan?.name)),
1
/* TEXT */
)
]),
_: 2
/* DYNAMIC */
},
1024
/* DYNAMIC_SLOTS */
)
]),
_: 2
/* DYNAMIC */
}, 1032, ["logo", "name", "clickable"])
], 10, _hoisted_6)
])), [
[_directive_tippy, $setup.getWorkspaceTooltip(ws)]
]);
}),
128
/* KEYED_FRAGMENT */
))
])
])) : (_openBlock(), _createElementBlock("p", _hoisted_9, " Looks like you haven't created any workspaces yet. Workspaces help you easily organise and control your digital projects. Create one to move your project into. "))
],
64
/* STABLE_FRAGMENT */
)),
_createVNode(_component_WorkspacePlanProjectModelLimitReachedDialog, {
open: $setup.showLimitDialog,
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.showLimitDialog = $event),
"workspace-name": $setup.limitReachedWorkspace?.name,
plan: $setup.limitReachedWorkspace?.plan?.name,
"workspace-role": $setup.limitReachedWorkspace?.role,
"workspace-slug": $setup.limitReachedWorkspace?.slug || "",
location: "move_project_dialog",
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:66:5"
}, null, 8, ["open", "workspace-name", "plan", "workspace-role", "workspace-slug"])
]);
}
_sfc_main.__hmrId = "254d4d03";
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/workspace/moveProject/SelectWorkspace.vue"]]);
//# sourceMappingURL=data:application/json;base64,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Q3ZDLE1BQU0sOEJBQXVCLE1BQU07QUFBQSxNQUNuQyxrQkFBZ0IsOEJBQXVCO0FBQUEsTUFDdkMsa0JBQWdCLDhCQUF1QixRQUFJO0FBQUEsTUFDNUMsVUFBUztBQUFBLE1BQXNCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJTZWxlY3RXb3Jrc3BhY2UudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjI6M1wiPlxyXG4gICAgPGRpdiB2LWlmPVwic2hvd0xvYWRpbmdcIiBjbGFzcz1cInB5LTQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtMzJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozOjVcIj5cclxuICAgICAgPENvbW1vbkxvYWRpbmdJY29uIHNpemU9XCJzbVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjQ6N1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgIDxkaXYgdi1pZj1cImhhc1dvcmtzcGFjZXNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo3OjdcIj5cclxuICAgICAgICA8cCBjbGFzcz1cIm1iLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo4OjlcIj5cclxuICAgICAgICAgIHt7IHN1YmhlYWRpbmcgfHwgJ1NlbGVjdCBhbiBleGlzdGluZyB3b3Jrc3BhY2Ugb3IgY3JlYXRlIGEgbmV3IG9uZS4nIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6MTE6OVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWZvcj1cIndzIGluIHNvcnRlZFdvcmtzcGFjZXNcIlxyXG4gICAgICAgICAgICA6a2V5PVwiYCR7d3MuaWR9LSR7d3MucGVybWlzc2lvbnM/LmNhbk1vdmVQcm9qZWN0VG9Xb3Jrc3BhY2U/LmNvZGV9YFwiXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJnZXRXb3Jrc3BhY2VUb29sdGlwKHdzKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjEyOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCIhaXNXb3Jrc3BhY2VEaXNhYmxlZCh3cykgPyAnY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICcnXCJcclxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJpc1dvcmtzcGFjZURpc2FibGVkKHdzKVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiaGFuZGxlV29ya3NwYWNlQ2xpY2sod3MpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6MTc6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFdvcmtzcGFjZUNhcmRcclxuICAgICAgICAgICAgICAgIDpsb2dvPVwid3MubG9nbyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICAgICA6bmFtZT1cIndzLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgOmNsaWNrYWJsZT1cIiFpc1dvcmtzcGFjZURpc2FibGVkKHdzKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjIzOjE1XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI3RleHQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIGl0ZW1zLXN0YXJ0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6Mjk6MTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgICAgICAgICAgICAgIHYtaWY9XCJpc1Nzb1JlcXVpcmVkKHdzKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcGl0YWxpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcm91bmRlZCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozMDoyMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU1NPIGxvZ2luIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozODoyMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgd3MucGxhbj8udXNhZ2UucHJvamVjdENvdW50IH19IHByb2plY3RzLFxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgd3MucGxhbj8udXNhZ2UubW9kZWxDb3VudCB9fSBtb2RlbHNcclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPFVzZXJBdmF0YXJHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgICAgOnVzZXJzPVwid3MudGVhbS5pdGVtcy5tYXAoKHQpID0+IHQudXNlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOm1heC1jb3VudD1cIjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6NDI6MjFcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYWN0aW9ucz5cclxuICAgICAgICAgICAgICAgICAgPENvbW1vbkJhZGdlIGNvbG9yPVwic2Vjb25kYXJ5XCIgcm91bmRlZCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo1MDoxOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdE5hbWUod3MucGxhbj8ubmFtZSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9Xb3Jrc3BhY2VDYXJkPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHAgdi1lbHNlIGNsYXNzPVwidGV4dC1ib2R5LXhzIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjU5OjdcIj5cclxuICAgICAgICBMb29rcyBsaWtlIHlvdSBoYXZlbid0IGNyZWF0ZWQgYW55IHdvcmtzcGFjZXMgeWV0LiBXb3Jrc3BhY2VzIGhlbHAgeW91IGVhc2lseVxyXG4gICAgICAgIG9yZ2FuaXNlIGFuZCBjb250cm9sIHlvdXIgZGlnaXRhbCBwcm9qZWN0cy4gQ3JlYXRlIG9uZSB0byBtb3ZlIHlvdXIgcHJvamVjdFxyXG4gICAgICAgIGludG8uXHJcbiAgICAgIDwvcD5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPFdvcmtzcGFjZVBsYW5Qcm9qZWN0TW9kZWxMaW1pdFJlYWNoZWREaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0xpbWl0RGlhbG9nXCJcclxuICAgICAgOndvcmtzcGFjZS1uYW1lPVwibGltaXRSZWFjaGVkV29ya3NwYWNlPy5uYW1lXCJcclxuICAgICAgOnBsYW49XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnBsYW4/Lm5hbWVcIlxyXG4gICAgICA6d29ya3NwYWNlLXJvbGU9XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnJvbGVcIlxyXG4gICAgICA6d29ya3NwYWNlLXNsdWc9XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnNsdWcgfHwgJydcIlxyXG4gICAgICBsb2NhdGlvbj1cIm1vdmVfcHJvamVjdF9kaWFsb2dcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo2Njo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdEZyYWdtZW50LFxyXG4gIFdvcmtzcGFjZU1vdmVQcm9qZWN0TWFuYWdlcl9Qcm9qZWN0RnJhZ21lbnQsXHJcbiAgV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxufSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgdXNlUXVlcnkgfSBmcm9tICdAdnVlL2Fwb2xsby1jb21wb3NhYmxlJ1xyXG5pbXBvcnQgeyBVc2VyQXZhdGFyR3JvdXAgfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB3b3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJVc2VyUXVlcnkgfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2dyYXBocWwvcXVlcmllcydcclxuaW1wb3J0IHsgZm9ybWF0TmFtZSB9IGZyb20gJ34vbGliL2JpbGxpbmcvaGVscGVycy9wbGFuJ1xyXG5pbXBvcnQgeyBSb2xlcywgdHlwZSBNYXliZU51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHtcclxuICBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IsXHJcbiAgV29ya3NwYWNlU3NvU2Vzc2lvbk5vQWNjZXNzRXJyb3JcclxufSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYXV0aHonXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Xb3Jrc3BhY2Ugb24gV29ya3NwYWNlIHtcclxuICAgIGlkXHJcbiAgICBuYW1lXHJcbiAgICByb2xlXHJcbiAgICBzbHVnXHJcbiAgICBwbGFuIHtcclxuICAgICAgbmFtZVxyXG4gICAgfVxyXG4gICAgcGVybWlzc2lvbnMge1xyXG4gICAgICBjYW5Nb3ZlUHJvamVjdFRvV29ya3NwYWNlKHByb2plY3RJZDogJHByb2plY3RJZCkge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgICBjYW5DcmVhdGVQcm9qZWN0IHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Vc2VyIG9uIFVzZXIge1xyXG4gICAgd29ya3NwYWNlcyB7XHJcbiAgICAgIGl0ZW1zIHtcclxuICAgICAgICAuLi5Xb3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJfV29ya3NwYWNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHByb2plY3RzKGN1cnNvcjogJGN1cnNvciwgZmlsdGVyOiAkZmlsdGVyLCBzb3J0Qnk6ICRzb3J0QnkpIHtcclxuICAgICAgaXRlbXMge1xyXG4gICAgICAgIC4uLldvcmtzcGFjZU1vdmVQcm9qZWN0TWFuYWdlcl9Qcm9qZWN0XHJcbiAgICAgIH1cclxuICAgICAgY3Vyc29yXHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBwcm9qZWN0OiBNYXliZU51bGxPclVuZGVmaW5lZDxXb3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJfUHJvamVjdEZyYWdtZW50PlxyXG4gIGNoZWNrZXI6IChcclxuICAgIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuICApID0+IEZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRGcmFnbWVudFxyXG4gIHN1YmhlYWRpbmc/OiBzdHJpbmdcclxufT4oKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoXHJcbiAgICBlOiAnd29ya3NwYWNlLXNlbGVjdGVkJyxcclxuICAgIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuICApOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHsgcmVzdWx0LCBsb2FkaW5nOiBpbml0aWFsTG9hZGluZyB9ID0gdXNlUXVlcnkoXHJcbiAgd29ya3NwYWNlTW92ZVByb2plY3RNYW5hZ2VyVXNlclF1ZXJ5LFxyXG4gICgpID0+ICh7XHJcbiAgICBjdXJzb3I6IG51bGwsXHJcbiAgICBmaWx0ZXI6IHt9LFxyXG4gICAgcHJvamVjdElkOiBwcm9wcy5wcm9qZWN0Py5pZFxyXG4gIH0pXHJcbilcclxuXHJcbmNvbnN0IHdvcmtzcGFjZXMgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LmFjdGl2ZVVzZXI/LndvcmtzcGFjZXMuaXRlbXMgPz8gW10pXHJcbmNvbnN0IGhhc1dvcmtzcGFjZXMgPSBjb21wdXRlZCgoKSA9PiB3b3Jrc3BhY2VzLnZhbHVlLmxlbmd0aCA+IDApXHJcbmNvbnN0IHNob3dMb2FkaW5nID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gaW5pdGlhbExvYWRpbmcudmFsdWUgJiYgd29ya3NwYWNlcy52YWx1ZS5sZW5ndGggPT09IDBcclxuKVxyXG5cclxuY29uc3Qgc2hvd0xpbWl0RGlhbG9nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBsaW1pdFJlYWNoZWRXb3Jrc3BhY2UgPVxyXG4gIHJlZjxXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Xb3Jrc3BhY2VGcmFnbWVudCB8IG51bGw+KG51bGwpXHJcblxyXG5jb25zdCBpc1dvcmtzcGFjZUFkbWluID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gKHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnQgfCBudWxsKSA9PiB7XHJcbiAgICBpZiAoIXdvcmtzcGFjZSkgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gd29ya3NwYWNlLnJvbGUgPT09IFJvbGVzLldvcmtzcGFjZS5BZG1pblxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgaXNXb3Jrc3BhY2VEaXNhYmxlZCA9IChcclxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZU1vdmVQcm9qZWN0U2VsZWN0V29ya3NwYWNlX1dvcmtzcGFjZUZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGlmICghaXNXb3Jrc3BhY2VBZG1pbi52YWx1ZSh3b3Jrc3BhY2UpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcGVybWlzc2lvbiA9IHByb3BzLmNoZWNrZXIod29ya3NwYWNlKVxyXG4gIHJldHVybiAoXHJcbiAgICAhcGVybWlzc2lvbj8uYXV0aG9yaXplZCAmJiBwZXJtaXNzaW9uPy5jb2RlICE9PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG4gIClcclxufVxyXG5cclxuY29uc3QgZ2V0V29ya3NwYWNlVG9vbHRpcCA9IChcclxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZU1vdmVQcm9qZWN0U2VsZWN0V29ya3NwYWNlX1dvcmtzcGFjZUZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGNvbnN0IHBlcm1pc3Npb24gPSBwcm9wcy5jaGVja2VyKHdvcmtzcGFjZSlcclxuICBpZiAocGVybWlzc2lvbi5hdXRob3JpemVkKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG4gIGlmIChwZXJtaXNzaW9uLmNvZGUgPT09IFdvcmtzcGFjZUxpbWl0c1JlYWNoZWRFcnJvci5jb2RlKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGVybWlzc2lvbj8ubWVzc2FnZVxyXG59XHJcblxyXG5jb25zdCBzb3J0ZWRXb3Jrc3BhY2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBbLi4ud29ya3NwYWNlcy52YWx1ZV0uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgY29uc3QgYUVuYWJsZWQgPVxyXG4gICAgICBwcm9wcy5jaGVja2VyKGEpLmF1dGhvcml6ZWQgfHxcclxuICAgICAgcHJvcHMuY2hlY2tlcihhKS5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG4gICAgY29uc3QgYkVuYWJsZWQgPVxyXG4gICAgICBwcm9wcy5jaGVja2VyKGIpLmF1dGhvcml6ZWQgfHxcclxuICAgICAgcHJvcHMuY2hlY2tlcihiKS5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG5cclxuICAgIGlmIChhRW5hYmxlZCAmJiAhYkVuYWJsZWQpIHJldHVybiAtMVxyXG4gICAgaWYgKCFhRW5hYmxlZCAmJiBiRW5hYmxlZCkgcmV0dXJuIDFcclxuICAgIHJldHVybiAwXHJcbiAgfSlcclxufSlcclxuXHJcbmNvbnN0IGhhbmRsZVdvcmtzcGFjZUNsaWNrID0gKFxyXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgY29uc3QgcGVybWlzc2lvbiA9IHByb3BzLmNoZWNrZXIod29ya3NwYWNlKVxyXG4gIGlmIChwZXJtaXNzaW9uPy5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZSkge1xyXG4gICAgbGltaXRSZWFjaGVkV29ya3NwYWNlLnZhbHVlID0gd29ya3NwYWNlXHJcbiAgICBzaG93TGltaXREaWFsb2cudmFsdWUgPSB0cnVlXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGlmIChwZXJtaXNzaW9uPy5hdXRob3JpemVkKSB7XHJcbiAgICBlbWl0KCd3b3Jrc3BhY2Utc2VsZWN0ZWQnLCB3b3Jrc3BhY2UpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpc1Nzb1JlcXVpcmVkID0gKFxyXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgcmV0dXJuIHByb3BzLmNoZWNrZXIod29ya3NwYWNlKS5jb2RlID09PSBXb3Jrc3BhY2VTc29TZXNzaW9uTm9BY2Nlc3NFcnJvci5jb2RlXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlIn0=