326 lines
30 KiB
Plaintext
326 lines
30 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/invite/dialog/Server.vue");import { FormTextInput 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/form/select/ServerRoles.vue";
|
|
import { default as __nuxt_component_2 } from "/_nuxt/components/form/select/Projects.vue";
|
|
import { CommonTextLink as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { FormButton as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { LayoutDialog as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createElementBlock as __createElementBlock,createVNode as __createVNode,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 _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
/* Injection by vite-plugin-vue-inspector End */
|
|
import { useModel as _useModel, defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { useMutationLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
|
|
import { useForm, useFieldArray } from "/_nuxt/node_modules/.cache/vite/client/deps/vee-validate.js?v=e4f18c29";
|
|
import { useActiveUser } from "/_nuxt/lib/auth/composables/activeUser.ts";
|
|
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
|
|
import { useServerInfo } from "/_nuxt/lib/core/composables/server.ts";
|
|
import { useInviteUserToProject } from "/_nuxt/lib/projects/composables/projectManagement.ts";
|
|
import { useInviteUserToServer } from "/_nuxt/lib/server/composables/invites.ts";
|
|
import { PlusIcon, TrashIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29";
|
|
import { emptyInviteServerItem } from "/_nuxt/lib/invites/helpers/constants.ts";
|
|
import { isEmail } from "/_nuxt/lib/common/helpers/validation.ts";
|
|
import { useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts";
|
|
|
|
import { computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { ToastNotificationType } from "/_nuxt/utils/globals.ts";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "InviteDialogServer",
|
|
props: {
|
|
"open": { type: Boolean, ...{ required: true } },
|
|
"openModifiers": {}
|
|
},
|
|
emits: ["update:open"],
|
|
setup(__props, { expose: __expose }) {
|
|
__expose();
|
|
const isOpen = _useModel(__props, "open");
|
|
const { handleSubmit } = useForm({
|
|
initialValues: {
|
|
fields: [
|
|
{
|
|
...emptyInviteServerItem
|
|
}
|
|
]
|
|
}
|
|
});
|
|
const {
|
|
fields,
|
|
replace: replaceFields,
|
|
push: pushInvite,
|
|
remove: removeInvite
|
|
} = useFieldArray("fields");
|
|
const { mutate: inviteUserToServer } = useInviteUserToServer();
|
|
const inviteUserToProject = useInviteUserToProject();
|
|
const anyMutationsLoading = useMutationLoading();
|
|
const { isAdmin } = useActiveUser();
|
|
const { isGuestMode } = useServerInfo();
|
|
const mixpanel = useMixpanel();
|
|
const { triggerNotification } = useGlobalToast();
|
|
const allowServerRoleSelect = computed(() => isAdmin.value || isGuestMode.value);
|
|
const dialogButtons = computed(() => [
|
|
{
|
|
text: "Cancel",
|
|
props: { color: "outline" },
|
|
onClick: () => {
|
|
isOpen.value = false;
|
|
}
|
|
},
|
|
{
|
|
text: "Invite",
|
|
props: {
|
|
submit: true,
|
|
disabled: anyMutationsLoading.value
|
|
},
|
|
onClick: onSubmit
|
|
}
|
|
]);
|
|
const addInviteItem = () => {
|
|
pushInvite({ ...emptyInviteServerItem });
|
|
};
|
|
const removeInviteItem = (index) => {
|
|
removeInvite(index);
|
|
};
|
|
const onSubmit = handleSubmit(async () => {
|
|
const invites = fields.value.filter((invite) => invite.value.email);
|
|
try {
|
|
await Promise.all(
|
|
invites.map(
|
|
(invite) => invite.value.project ? inviteUserToProject(
|
|
invite.value.project.id,
|
|
[{ email: invite.value.email, serverRole: invite.value.serverRole }],
|
|
{ hideToasts: true }
|
|
) : inviteUserToServer(
|
|
[{ email: invite.value.email, serverRole: invite.value.serverRole }],
|
|
{ hideToasts: true }
|
|
)
|
|
)
|
|
);
|
|
triggerNotification({
|
|
type: ToastNotificationType.Success,
|
|
title: invites.length > 1 ? "Invites successfully send" : `Invite successfully sent to ${invites[0].value.email}`
|
|
});
|
|
mixpanel.track("Invite Action", {
|
|
type: "server invite",
|
|
name: "send",
|
|
multiple: fields.value.length !== 1,
|
|
count: fields.value.length,
|
|
hasProject: !!fields.value.some((invite) => invite.value.project),
|
|
to: "email"
|
|
});
|
|
isOpen.value = false;
|
|
} catch {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: invites.length > 1 ? "One or more invites failed to send" : `Failed to send invite to ${invites[0].value.email}`
|
|
});
|
|
}
|
|
});
|
|
watch(isOpen, (newVal, oldVal) => {
|
|
if (newVal && !oldVal) {
|
|
replaceFields([
|
|
{
|
|
...emptyInviteServerItem
|
|
}
|
|
]);
|
|
}
|
|
});
|
|
const __returned__ = { isOpen, handleSubmit, fields, replaceFields, pushInvite, removeInvite, inviteUserToServer, inviteUserToProject, anyMutationsLoading, isAdmin, isGuestMode, mixpanel, triggerNotification, allowServerRoleSelect, dialogButtons, addInviteItem, removeInviteItem, onSubmit, get PlusIcon() {
|
|
return PlusIcon;
|
|
}, get TrashIcon() {
|
|
return TrashIcon;
|
|
}, get isEmail() {
|
|
return isEmail;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, withCtx as _withCtx } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
class: "flex flex-col gap-y-5 text-foreground",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:5:7"
|
|
};
|
|
const _hoisted_2 = {
|
|
class: "flex flex-col gap-y-3 flex-1",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:7:11"
|
|
};
|
|
const _hoisted_3 = {
|
|
key: 0,
|
|
class: "border-outline-3",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:8:13"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "flex flex-row gap-x-3 items-center",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:9:13"
|
|
};
|
|
const _hoisted_5 = {
|
|
class: "flex-1",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:10:15"
|
|
};
|
|
const _hoisted_6 = {
|
|
class: "relative w-4",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:48:11"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_FormTextInput = __nuxt_component_0;
|
|
const _component_FormSelectServerRoles = __nuxt_component_1;
|
|
const _component_FormSelectProjects = __nuxt_component_2;
|
|
const _component_CommonTextLink = __nuxt_component_3;
|
|
const _component_FormButton = __nuxt_component_4;
|
|
const _component_LayoutDialog = __nuxt_component_5;
|
|
return _openBlock(), _createBlock(_component_LayoutDialog, {
|
|
open: $setup.isOpen,
|
|
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.isOpen = $event),
|
|
"max-width": "md",
|
|
buttons: $setup.dialogButtons,
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:2:3"
|
|
}, {
|
|
header: _withCtx(() => [..._cache[2] || (_cache[2] = [
|
|
_createTextVNode(
|
|
"Invite to Speckle",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
default: _withCtx(() => [
|
|
_createElementVNode(
|
|
"form",
|
|
{
|
|
onSubmit: _cache[0] || (_cache[0] = (...args) => $setup.onSubmit && $setup.onSubmit(...args)),
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:4:5"
|
|
},
|
|
[
|
|
_createElementVNode("div", _hoisted_1, [
|
|
(_openBlock(true), _createElementBlock(
|
|
_Fragment,
|
|
null,
|
|
_renderList($setup.fields, (item, index) => {
|
|
return _openBlock(), _createElementBlock("div", {
|
|
key: item.key,
|
|
class: "flex gap-x-3",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:6:9"
|
|
}, [
|
|
_createElementVNode("div", _hoisted_2, [
|
|
index !== 0 ? (_openBlock(), _createElementBlock("hr", _hoisted_3)) : _createCommentVNode("v-if", true),
|
|
_createElementVNode("div", _hoisted_4, [
|
|
_createElementVNode("div", _hoisted_5, [
|
|
_createVNode(_component_FormTextInput, {
|
|
modelValue: item.value.email,
|
|
"onUpdate:modelValue": ($event) => item.value.email = $event,
|
|
name: `email-${item.key}`,
|
|
color: "foundation",
|
|
placeholder: "Email address",
|
|
"show-clear": "",
|
|
"full-width": "",
|
|
"use-label-in-errors": "",
|
|
"show-label": "",
|
|
label: "Email",
|
|
rules: [$setup.isEmail],
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:11:17"
|
|
}, null, 8, ["modelValue", "onUpdate:modelValue", "name", "rules"])
|
|
]),
|
|
$setup.allowServerRoleSelect ? (_openBlock(), _createBlock(_component_FormSelectServerRoles, {
|
|
key: 0,
|
|
modelValue: item.value.serverRole,
|
|
"onUpdate:modelValue": ($event) => item.value.serverRole = $event,
|
|
label: "Select role",
|
|
name: `role-${item.key}`,
|
|
class: "sm:w-48",
|
|
"show-label": "",
|
|
disabled: $setup.anyMutationsLoading,
|
|
"allow-guest": $setup.isGuestMode,
|
|
"allow-admin": $setup.isAdmin,
|
|
"mount-menu-on-body": "",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:24:15"
|
|
}, null, 8, ["modelValue", "onUpdate:modelValue", "name", "disabled", "allow-guest", "allow-admin"])) : _createCommentVNode("v-if", true)
|
|
]),
|
|
_createVNode(_component_FormSelectProjects, {
|
|
modelValue: item.value.project,
|
|
"onUpdate:modelValue": ($event) => item.value.project = $event,
|
|
label: "Select project",
|
|
class: "w-full",
|
|
"owned-only": "",
|
|
"show-optional": "",
|
|
"mount-menu-on-body": "",
|
|
"show-label": "",
|
|
name: `project-${index}`,
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:37:13"
|
|
}, null, 8, ["modelValue", "onUpdate:modelValue", "name"])
|
|
]),
|
|
_createElementVNode("div", _hoisted_6, [
|
|
$setup.fields.length > 1 ? (_openBlock(), _createBlock(_component_CommonTextLink, {
|
|
key: 0,
|
|
class: _normalizeClass(["top-10 absolute right-0", { "top-7": index === 0 }]),
|
|
onClick: ($event) => $setup.removeInviteItem(index),
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:49:13"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode($setup["TrashIcon"], {
|
|
class: "h-4 w-4 text-foreground-2",
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:55:15"
|
|
})
|
|
]),
|
|
_: 2
|
|
/* DYNAMIC */
|
|
}, 1032, ["class", "onClick"])) : _createCommentVNode("v-if", true)
|
|
])
|
|
]);
|
|
}),
|
|
128
|
|
/* KEYED_FRAGMENT */
|
|
)),
|
|
_createVNode(_component_FormButton, {
|
|
color: "subtle",
|
|
"icon-left": $setup.PlusIcon,
|
|
disabled: $setup.anyMutationsLoading,
|
|
onClick: $setup.addInviteItem,
|
|
"data-v-inspector": "components/invite/dialog/Server.vue:59:9"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[3] || (_cache[3] = [
|
|
_createTextVNode(
|
|
" Invite another user ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["icon-left", "disabled"])
|
|
])
|
|
],
|
|
32
|
|
/* NEED_HYDRATION */
|
|
)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["open", "buttons"]);
|
|
}
|
|
_sfc_main.__hmrId = "669bb4ae";
|
|
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/invite/dialog/Server.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QUE7O2tCQUdoRCxvQkFTTSxPQVROLFlBU007QUFBQSxvQkFQSSxjQUFPLFNBQU0sbUJBRHJCLGFBT2lCO0FBQUE7c0JBTGYsT0FBSyxpQkFBQywyQkFBeUIsV0FDWixVQUFLO0FBQUEsc0JBQ3ZCLFNBQUssWUFBRSx3QkFBaUIsS0FBSztBQUFBLHNCQUFHLG9CQUFpQjtBQUFBO3dDQUVsRCxNQUE0RztBQUFBLHdCQUE1RyxhQUE0RztBQUFBLDBCQUFqRyxPQUFNO0FBQUEsMEJBQTRCLG9CQUFpQjtBQUFBOzs7Ozs7Ozs7OztZQUlwRSxhQU9hO0FBQUEsY0FOWCxPQUFNO0FBQUEsY0FDTCxhQUFXO0FBQUEsY0FDWCxVQUFVO0FBQUEsY0FDVixTQUFPO0FBQUEsY0FBZSxvQkFBaUI7QUFBQTtnQ0FDekMsTUFFRDtBQUFBO2tCQUZDO0FBQUEsa0JBRUQ7QUFBQTtBQUFBO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlNlcnZlci52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxMYXlvdXREaWFsb2cgdi1tb2RlbDpvcGVuPVwiaXNPcGVuXCIgbWF4LXdpZHRoPVwibWRcIiA6YnV0dG9ucz1cImRpYWxvZ0J1dHRvbnNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6MjozXCI+XHJcbiAgICA8dGVtcGxhdGUgI2hlYWRlcj5JbnZpdGUgdG8gU3BlY2tsZTwvdGVtcGxhdGU+XHJcbiAgICA8Zm9ybSBAc3VibWl0PVwib25TdWJtaXRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NDo1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC15LTUgdGV4dC1mb3JlZ3JvdW5kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjU6N1wiPlxyXG4gICAgICAgIDxkaXYgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGZpZWxkc1wiIDprZXk9XCJpdGVtLmtleVwiIGNsYXNzPVwiZmxleCBnYXAteC0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjY6OVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLXktMyBmbGV4LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NzoxMVwiPlxyXG4gICAgICAgICAgICA8aHIgdi1pZj1cImluZGV4ICE9PSAwXCIgY2xhc3M9XCJib3JkZXItb3V0bGluZS0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjg6MTNcIiAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAteC0zIGl0ZW1zLWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvU2VydmVyLnZ1ZTo5OjEzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvU2VydmVyLnZ1ZToxMDoxNVwiPlxyXG4gICAgICAgICAgICAgICAgPEZvcm1UZXh0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cIml0ZW0udmFsdWUuZW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICA6bmFtZT1cImBlbWFpbC0ke2l0ZW0ua2V5fWBcIlxyXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cImZvdW5kYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVtYWlsIGFkZHJlc3NcIlxyXG4gICAgICAgICAgICAgICAgICBzaG93LWNsZWFyXHJcbiAgICAgICAgICAgICAgICAgIGZ1bGwtd2lkdGhcclxuICAgICAgICAgICAgICAgICAgdXNlLWxhYmVsLWluLWVycm9yc1xyXG4gICAgICAgICAgICAgICAgICBzaG93LWxhYmVsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICA6cnVsZXM9XCJbaXNFbWFpbF1cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6MTE6MTdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8Rm9ybVNlbGVjdFNlcnZlclJvbGVzXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiYWxsb3dTZXJ2ZXJSb2xlU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJpdGVtLnZhbHVlLnNlcnZlclJvbGVcIlxyXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJTZWxlY3Qgcm9sZVwiXHJcbiAgICAgICAgICAgICAgICA6bmFtZT1cImByb2xlLSR7aXRlbS5rZXl9YFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtOnctNDhcIlxyXG4gICAgICAgICAgICAgICAgc2hvdy1sYWJlbFxyXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiYW55TXV0YXRpb25zTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICA6YWxsb3ctZ3Vlc3Q9XCJpc0d1ZXN0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICA6YWxsb3ctYWRtaW49XCJpc0FkbWluXCJcclxuICAgICAgICAgICAgICAgIG1vdW50LW1lbnUtb24tYm9keSBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6MjQ6MTVcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8Rm9ybVNlbGVjdFByb2plY3RzXHJcbiAgICAgICAgICAgICAgdi1tb2RlbD1cIml0ZW0udmFsdWUucHJvamVjdFwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJTZWxlY3QgcHJvamVjdFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgIG93bmVkLW9ubHlcclxuICAgICAgICAgICAgICBzaG93LW9wdGlvbmFsXHJcbiAgICAgICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICAgICAgc2hvdy1sYWJlbFxyXG4gICAgICAgICAgICAgIDpuYW1lPVwiYHByb2plY3QtJHtpbmRleH1gXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjM3OjEzXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvU2VydmVyLnZ1ZTo0ODoxMVwiPlxyXG4gICAgICAgICAgICA8Q29tbW9uVGV4dExpbmtcclxuICAgICAgICAgICAgICB2LWlmPVwiZmllbGRzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidG9wLTEwIGFic29sdXRlIHJpZ2h0LTBcIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgJ3RvcC03JzogaW5kZXggPT09IDAgfVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwicmVtb3ZlSW52aXRlSXRlbShpbmRleClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NDk6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFRyYXNoSWNvbiBjbGFzcz1cImgtNCB3LTQgdGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NTU6MTVcIiAvPlxyXG4gICAgICAgICAgICA8L0NvbW1vblRleHRMaW5rPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgIDppY29uLWxlZnQ9XCJQbHVzSWNvblwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJhbnlNdXRhdGlvbnNMb2FkaW5nXCJcclxuICAgICAgICAgIEBjbGljaz1cImFkZEludml0ZUl0ZW1cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NTk6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgSW52aXRlIGFub3RoZXIgdXNlclxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9MYXlvdXREaWFsb2c+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0RGlhbG9nQnV0dG9uIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlTXV0YXRpb25Mb2FkaW5nIH0gZnJvbSAnQHZ1ZS9hcG9sbG8tY29tcG9zYWJsZSdcclxuaW1wb3J0IHsgdXNlRm9ybSwgdXNlRmllbGRBcnJheSB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHsgdXNlQWN0aXZlVXNlciB9IGZyb20gJ35+L2xpYi9hdXRoL2NvbXBvc2FibGVzL2FjdGl2ZVVzZXInXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfn4vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXHJcbmltcG9ydCB7IHVzZVNlcnZlckluZm8gfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9zZXJ2ZXInXHJcbmltcG9ydCB7IHVzZUludml0ZVVzZXJUb1Byb2plY3QgfSBmcm9tICd+fi9saWIvcHJvamVjdHMvY29tcG9zYWJsZXMvcHJvamVjdE1hbmFnZW1lbnQnXHJcbmltcG9ydCB7IHVzZUludml0ZVVzZXJUb1NlcnZlciB9IGZyb20gJ35+L2xpYi9zZXJ2ZXIvY29tcG9zYWJsZXMvaW52aXRlcydcclxuaW1wb3J0IHsgUGx1c0ljb24sIFRyYXNoSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L291dGxpbmUnXHJcbmltcG9ydCB0eXBlIHsgSW52aXRlU2VydmVyRm9ybSwgSW52aXRlU2VydmVySXRlbSB9IGZyb20gJ35+L2xpYi9pbnZpdGVzL2hlbHBlcnMvdHlwZXMnXHJcbmltcG9ydCB7IGVtcHR5SW52aXRlU2VydmVySXRlbSB9IGZyb20gJ35+L2xpYi9pbnZpdGVzL2hlbHBlcnMvY29uc3RhbnRzJ1xyXG5pbXBvcnQgeyBpc0VtYWlsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL3ZhbGlkYXRpb24nXHJcbmltcG9ydCB7IHVzZUdsb2JhbFRvYXN0IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9jb21wb3NhYmxlcy90b2FzdCdcclxuXHJcbmNvbnN0IGlzT3BlbiA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdvcGVuJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5cclxuY29uc3QgeyBoYW5kbGVTdWJtaXQgfSA9IHVzZUZvcm08SW52aXRlU2VydmVyRm9ybT4oe1xyXG4gIGluaXRpYWxWYWx1ZXM6IHtcclxuICAgIGZpZWxkczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgLi4uZW1wdHlJbnZpdGVTZXJ2ZXJJdGVtXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9XHJcbn0pXHJcbmNvbnN0IHtcclxuICBmaWVsZHMsXHJcbiAgcmVwbGFjZTogcmVwbGFjZUZpZWxkcyxcclxuICBwdXNoOiBwdXNoSW52aXRlLFxyXG4gIHJlbW92ZTogcmVtb3ZlSW52aXRlXHJcbn0gPSB1c2VGaWVsZEFycmF5PEludml0ZVNlcnZlckl0ZW0+KCdmaWVsZHMnKVxyXG5jb25zdCB7IG11dGF0ZTogaW52aXRlVXNlclRvU2VydmVyIH0gPSB1c2VJbnZpdGVVc2VyVG9TZXJ2ZXIoKVxyXG5jb25zdCBpbnZpdGVVc2VyVG9Qcm9qZWN0ID0gdXNlSW52aXRlVXNlclRvUHJvamVjdCgpXHJcbmNvbnN0IGFueU11dGF0aW9uc0xvYWRpbmcgPSB1c2VNdXRhdGlvbkxvYWRpbmcoKVxyXG5jb25zdCB7IGlzQWRtaW4gfSA9IHVzZUFjdGl2ZVVzZXIoKVxyXG5jb25zdCB7IGlzR3Vlc3RNb2RlIH0gPSB1c2VTZXJ2ZXJJbmZvKClcclxuY29uc3QgbWl4cGFuZWwgPSB1c2VNaXhwYW5lbCgpXHJcbmNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG5cclxuY29uc3QgYWxsb3dTZXJ2ZXJSb2xlU2VsZWN0ID0gY29tcHV0ZWQoKCkgPT4gaXNBZG1pbi52YWx1ZSB8fCBpc0d1ZXN0TW9kZS52YWx1ZSlcclxuY29uc3QgZGlhbG9nQnV0dG9ucyA9IGNvbXB1dGVkKCgpOiBMYXlvdXREaWFsb2dCdXR0b25bXSA9PiBbXHJcbiAge1xyXG4gICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICBwcm9wczogeyBjb2xvcjogJ291dGxpbmUnIH0sXHJcbiAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgIGlzT3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICB7XHJcbiAgICB0ZXh0OiAnSW52aXRlJyxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIHN1Ym1pdDogdHJ1ZSxcclxuICAgICAgZGlzYWJsZWQ6IGFueU11dGF0aW9uc0xvYWRpbmcudmFsdWVcclxuICAgIH0sXHJcbiAgICBvbkNsaWNrOiBvblN1Ym1pdFxyXG4gIH1cclxuXSlcclxuXHJcbmNvbnN0IGFkZEludml0ZUl0ZW0gPSAoKSA9PiB7XHJcbiAgcHVzaEludml0ZSh7IC4uLmVtcHR5SW52aXRlU2VydmVySXRlbSB9KVxyXG59XHJcblxyXG5jb25zdCByZW1vdmVJbnZpdGVJdGVtID0gKGluZGV4OiBudW1iZXIpID0+IHtcclxuICByZW1vdmVJbnZpdGUoaW5kZXgpXHJcbn1cclxuXHJcbmNvbnN0IG9uU3VibWl0ID0gaGFuZGxlU3VibWl0KGFzeW5jICgpID0+IHtcclxuICBjb25zdCBpbnZpdGVzID0gZmllbGRzLnZhbHVlLmZpbHRlcigoaW52aXRlKSA9PiBpbnZpdGUudmFsdWUuZW1haWwpXHJcblxyXG4gIHRyeSB7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgaW52aXRlcy5tYXAoKGludml0ZSkgPT5cclxuICAgICAgICBpbnZpdGUudmFsdWUucHJvamVjdFxyXG4gICAgICAgICAgPyBpbnZpdGVVc2VyVG9Qcm9qZWN0KFxyXG4gICAgICAgICAgICAgIGludml0ZS52YWx1ZS5wcm9qZWN0LmlkLFxyXG4gICAgICAgICAgICAgIFt7IGVtYWlsOiBpbnZpdGUudmFsdWUuZW1haWwsIHNlcnZlclJvbGU6IGludml0ZS52YWx1ZS5zZXJ2ZXJSb2xlIH1dLFxyXG4gICAgICAgICAgICAgIHsgaGlkZVRvYXN0czogdHJ1ZSB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIDogaW52aXRlVXNlclRvU2VydmVyKFxyXG4gICAgICAgICAgICAgIFt7IGVtYWlsOiBpbnZpdGUudmFsdWUuZW1haWwsIHNlcnZlclJvbGU6IGludml0ZS52YWx1ZS5zZXJ2ZXJSb2xlIH1dLFxyXG4gICAgICAgICAgICAgIHsgaGlkZVRvYXN0czogdHJ1ZSB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG5cclxuICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuU3VjY2VzcyxcclxuICAgICAgdGl0bGU6XHJcbiAgICAgICAgaW52aXRlcy5sZW5ndGggPiAxXHJcbiAgICAgICAgICA/ICdJbnZpdGVzIHN1Y2Nlc3NmdWxseSBzZW5kJ1xyXG4gICAgICAgICAgOiBgSW52aXRlIHN1Y2Nlc3NmdWxseSBzZW50IHRvICR7aW52aXRlc1swXS52YWx1ZS5lbWFpbH1gXHJcbiAgICB9KVxyXG5cclxuICAgIG1peHBhbmVsLnRyYWNrKCdJbnZpdGUgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnc2VydmVyIGludml0ZScsXHJcbiAgICAgIG5hbWU6ICdzZW5kJyxcclxuICAgICAgbXVsdGlwbGU6IGZpZWxkcy52YWx1ZS5sZW5ndGggIT09IDEsXHJcbiAgICAgIGNvdW50OiBmaWVsZHMudmFsdWUubGVuZ3RoLFxyXG4gICAgICBoYXNQcm9qZWN0OiAhIWZpZWxkcy52YWx1ZS5zb21lKChpbnZpdGUpID0+IGludml0ZS52YWx1ZS5wcm9qZWN0KSxcclxuICAgICAgdG86ICdlbWFpbCdcclxuICAgIH0pXHJcblxyXG4gICAgaXNPcGVuLnZhbHVlID0gZmFsc2VcclxuICB9IGNhdGNoIHtcclxuICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICB0aXRsZTpcclxuICAgICAgICBpbnZpdGVzLmxlbmd0aCA+IDFcclxuICAgICAgICAgID8gJ09uZSBvciBtb3JlIGludml0ZXMgZmFpbGVkIHRvIHNlbmQnXHJcbiAgICAgICAgICA6IGBGYWlsZWQgdG8gc2VuZCBpbnZpdGUgdG8gJHtpbnZpdGVzWzBdLnZhbHVlLmVtYWlsfWBcclxuICAgIH0pXHJcbiAgfVxyXG59KVxyXG5cclxud2F0Y2goaXNPcGVuLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAobmV3VmFsICYmICFvbGRWYWwpIHtcclxuICAgIHJlcGxhY2VGaWVsZHMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgLi4uZW1wdHlJbnZpdGVTZXJ2ZXJJdGVtXHJcbiAgICAgIH1cclxuICAgIF0pXHJcbiAgfVxyXG59KVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlIn0= |