412 lines
31 KiB
Plaintext
412 lines
31 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/workspace/invite/Block.vue");import { UserAvatar as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { FormButton as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createElementVNode as __createElementVNode,createElementBlock as __createElementBlock,createVNode as __createVNode,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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...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 { RelativeURL } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { useAuthManager } from "/_nuxt/lib/auth/composables/auth.ts";
|
|
import { usePostAuthRedirect } from "/_nuxt/lib/auth/composables/postAuthRedirect.ts";
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import {
|
|
useNavigateToLogin,
|
|
useNavigateToRegistration
|
|
} from "/_nuxt/lib/common/helpers/route.ts";
|
|
import { useWorkspaceInviteManager } from "/_nuxt/lib/workspaces/composables/management.ts";
|
|
import { useWorkspacePublicSsoCheck } from "/_nuxt/lib/workspaces/composables/sso.ts";
|
|
|
|
import { useActiveUser } from "/_nuxt/composables/globals.ts";
|
|
import { useRoute, useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
|
|
import { useLogger } from "/_nuxt/composables/logging.ts";
|
|
import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "WorkspaceInviteBlock",
|
|
props: {
|
|
invite: { type: Object, required: true }
|
|
},
|
|
setup(__props, { expose: __expose }) {
|
|
__expose();
|
|
graphql(`
|
|
fragment WorkspaceInviteBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {
|
|
id
|
|
workspace {
|
|
id
|
|
name
|
|
logo
|
|
}
|
|
token
|
|
user {
|
|
id
|
|
name
|
|
...LimitedUserAvatar
|
|
}
|
|
title
|
|
email
|
|
...UseWorkspaceInviteManager_PendingWorkspaceCollaborator
|
|
}
|
|
`);
|
|
const props = __props;
|
|
const { activeUser } = useActiveUser();
|
|
const route = useRoute();
|
|
const router = useRouter();
|
|
const logger = useLogger();
|
|
const postAuthRedirect = usePostAuthRedirect();
|
|
const { logout } = useAuthManager();
|
|
const goToLogin = useNavigateToLogin();
|
|
const goToRegister = useNavigateToRegistration();
|
|
const { loading, accept, decline, token, isCurrentUserTarget, targetUser } = useWorkspaceInviteManager({
|
|
invite: computed(() => props.invite)
|
|
});
|
|
const workspaceSlug = computed(() => props.invite.workspace.slug ?? "");
|
|
const { hasSsoEnabled } = useWorkspacePublicSsoCheck(workspaceSlug);
|
|
const buildPostAuthRedirectUrl = (params) => {
|
|
const currentRoute = new RelativeURL(route.fullPath);
|
|
if (params.addNewEmail) {
|
|
currentRoute.searchParams.set("addNewEmail", "true");
|
|
}
|
|
if (params.autoAccept) {
|
|
currentRoute.searchParams.set("accept", "true");
|
|
}
|
|
if (token.value) {
|
|
currentRoute.searchParams.set("token", token.value);
|
|
}
|
|
return currentRoute.toString();
|
|
};
|
|
const signOutGoToLogin = async (params) => {
|
|
const postAuthRedirectUrl = buildPostAuthRedirectUrl({
|
|
addNewEmail: params?.addNewEmail || false,
|
|
autoAccept: true
|
|
});
|
|
await logout({ skipRedirect: true });
|
|
postAuthRedirect.set(postAuthRedirectUrl, true);
|
|
await goToLogin({
|
|
query: {
|
|
token: token.value
|
|
}
|
|
});
|
|
};
|
|
const signOutGoToRegister = async () => {
|
|
try {
|
|
if (!props.invite.workspace.slug) {
|
|
logger.warn(
|
|
"No workspace slug found in invite, falling back to regular registration"
|
|
);
|
|
goToRegister({ query: { token: token.value } });
|
|
return;
|
|
}
|
|
const postAuthRedirectUrl = buildPostAuthRedirectUrl({
|
|
addNewEmail: true,
|
|
autoAccept: true
|
|
});
|
|
await logout({ skipRedirect: true });
|
|
postAuthRedirect.set(postAuthRedirectUrl, true);
|
|
if (hasSsoEnabled.value) {
|
|
router.push({
|
|
path: `/workspaces/${props.invite.workspace.slug}/sso/register`,
|
|
query: {
|
|
token: token.value,
|
|
register: "true"
|
|
}
|
|
});
|
|
} else {
|
|
goToRegister({ query: { token: token.value } });
|
|
}
|
|
} catch (error) {
|
|
logger.error("Error during SSO check:", error);
|
|
goToRegister({ query: { token: token.value } });
|
|
}
|
|
};
|
|
const acceptAndAddEmail = () => accept({ addNewEmail: true });
|
|
const __returned__ = { props, activeUser, route, router, logger, postAuthRedirect, logout, goToLogin, goToRegister, loading, accept, decline, token, isCurrentUserTarget, targetUser, workspaceSlug, hasSsoEnabled, buildPostAuthRedirectUrl, signOutGoToLogin, signOutGoToRegister, acceptAndAddEmail };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, Fragment as _Fragment, openBlock as _openBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
class: "space-y-8 max-w-96",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:2:3"
|
|
};
|
|
const _hoisted_2 = {
|
|
class: "p-4 border border-outline-2 rounded text-body-xs",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:4:5"
|
|
};
|
|
const _hoisted_3 = {
|
|
class: "font-medium",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:6:7"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "inline-flex items-center font-medium",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:13:13"
|
|
};
|
|
const _hoisted_5 = {
|
|
class: "font-medium",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:22:11"
|
|
};
|
|
const _hoisted_6 = {
|
|
class: "flex flex-col space-y-4",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:27:5"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_UserAvatar = __nuxt_component_0;
|
|
const _component_FormButton = __nuxt_component_1;
|
|
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
_cache[13] || (_cache[13] = _createElementVNode(
|
|
"h1",
|
|
{
|
|
class: "text-heading-xl text-center",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:3:5"
|
|
},
|
|
"Join workspace",
|
|
-1
|
|
/* CACHED */
|
|
)),
|
|
_createElementVNode("div", _hoisted_2, [
|
|
_cache[8] || (_cache[8] = _createTextVNode(
|
|
" You're accepting an invitation to join ",
|
|
-1
|
|
/* CACHED */
|
|
)),
|
|
_createElementVNode(
|
|
"span",
|
|
_hoisted_3,
|
|
_toDisplayString($props.invite.workspace.name),
|
|
1
|
|
/* TEXT */
|
|
),
|
|
$setup.isCurrentUserTarget ? (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 0 },
|
|
[
|
|
_createTextVNode(".")
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
)) : (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 1 },
|
|
[
|
|
$setup.targetUser ? (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 0 },
|
|
[
|
|
_createCommentVNode(" prettier-ignore "),
|
|
$setup.activeUser ? (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 0 },
|
|
[
|
|
_cache[4] || (_cache[4] = _createTextVNode(
|
|
" however the invitation was sent to ",
|
|
-1
|
|
/* CACHED */
|
|
)),
|
|
_createElementVNode("span", _hoisted_4, [
|
|
_createVNode(_component_UserAvatar, {
|
|
user: $setup.targetUser,
|
|
size: "sm",
|
|
class: "mr-1",
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:14:15"
|
|
}, null, 8, ["user"]),
|
|
_createTextVNode(
|
|
" " + _toDisplayString($setup.targetUser.name),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
]),
|
|
_cache[5] || (_cache[5] = _createTextVNode(
|
|
". You have to sign out from the current account to proceed. ",
|
|
-1
|
|
/* CACHED */
|
|
))
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
)) : (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 1 },
|
|
[
|
|
_createTextVNode(". Please sign in to proceed.")
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
))
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
)) : (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 1 },
|
|
[
|
|
_cache[6] || (_cache[6] = _createTextVNode(
|
|
" using the ",
|
|
-1
|
|
/* CACHED */
|
|
)),
|
|
_createElementVNode(
|
|
"span",
|
|
_hoisted_5,
|
|
_toDisplayString($props.invite.email),
|
|
1
|
|
/* TEXT */
|
|
),
|
|
_cache[7] || (_cache[7] = _createTextVNode(
|
|
" email address. ",
|
|
-1
|
|
/* CACHED */
|
|
))
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
))
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
))
|
|
]),
|
|
_createElementVNode("div", _hoisted_6, [
|
|
$setup.isCurrentUserTarget ? (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 0 },
|
|
[
|
|
_createVNode(_component_FormButton, {
|
|
color: "primary",
|
|
size: "lg",
|
|
"full-width": "",
|
|
disabled: $setup.loading,
|
|
onClick: _cache[0] || (_cache[0] = () => $setup.accept()),
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:29:9"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[9] || (_cache[9] = [
|
|
_createTextVNode(
|
|
" Accept ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["disabled"]),
|
|
_createVNode(_component_FormButton, {
|
|
color: "outline",
|
|
size: "lg",
|
|
"full-width": "",
|
|
disabled: $setup.loading,
|
|
onClick: _cache[1] || (_cache[1] = () => $setup.decline()),
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:38:9"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[10] || (_cache[10] = [
|
|
_createTextVNode(
|
|
" Decline ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["disabled"])
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
)) : (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 1 },
|
|
[
|
|
$setup.targetUser ? (_openBlock(), _createBlock(_component_FormButton, {
|
|
key: 0,
|
|
color: "primary",
|
|
size: "lg",
|
|
"full-width": "",
|
|
disabled: $setup.loading,
|
|
onClick: _cache[2] || (_cache[2] = () => $setup.signOutGoToLogin()),
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:50:11"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createTextVNode(
|
|
_toDisplayString($setup.activeUser ? "Sign out to continue" : "Sign in to continue"),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["disabled"])) : (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 1 },
|
|
[
|
|
_createVNode(_component_FormButton, {
|
|
color: "outline",
|
|
size: "lg",
|
|
"full-width": "",
|
|
disabled: $setup.loading,
|
|
onClick: $setup.signOutGoToRegister,
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:61:11"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[11] || (_cache[11] = [
|
|
_createTextVNode(
|
|
" Create new account ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["disabled"]),
|
|
_createVNode(_component_FormButton, {
|
|
color: "primary",
|
|
size: "lg",
|
|
"full-width": "",
|
|
disabled: $setup.loading,
|
|
onClick: _cache[3] || (_cache[3] = () => $setup.activeUser ? $setup.acceptAndAddEmail() : $setup.signOutGoToLogin({ addNewEmail: true })),
|
|
"data-v-inspector": "components/workspace/invite/Block.vue:70:11"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[12] || (_cache[12] = [
|
|
_createTextVNode(
|
|
" Add new email to existing account ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["disabled"])
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
))
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
))
|
|
])
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "d28416b4";
|
|
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/invite/Block.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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WUFBSSxvQkFBaUI7QUFBQTs4QkFFbkQsTUFBaUU7QUFBQTtpQ0FBOUQsb0JBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O2dEQUdqQjtBQUFBLFlBd0JXO0FBQUE7QUFBQTtBQUFBLGNBdkJULGFBUWE7QUFBQSxnQkFQWCxPQUFNO0FBQUEsZ0JBQ04sTUFBSztBQUFBLGdCQUNMO0FBQUEsZ0JBQ0MsVUFBVTtBQUFBLGdCQUNWLFNBQU87QUFBQSxnQkFBcUIsb0JBQWlCO0FBQUE7a0NBQy9DLE1BRUQ7QUFBQTtvQkFGQztBQUFBLG9CQUVEO0FBQUE7QUFBQTtBQUFBOzs7O2NBQ0EsYUFhYTtBQUFBLGdCQVpYLE9BQU07QUFBQSxnQkFDTixNQUFLO0FBQUEsZ0JBQ0w7QUFBQSxnQkFDQyxVQUFVO0FBQUEsZ0JBQ1YsU0FBSyxnQ0FBeUMsb0JBQWdDLHlCQUFpQixJQUF3Qix3QkFBZ0I7QUFBQSxnQkFLdEksb0JBQWlCO0FBQUE7a0NBQ3BCLE1BRUQ7QUFBQTtvQkFGQztBQUFBLG9CQUVEO0FBQUE7QUFBQTtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJCbG9jay52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJzcGFjZS15LTggbWF4LXctOTZcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZToyOjNcIj5cclxuICAgIDxoMSBjbGFzcz1cInRleHQtaGVhZGluZy14bCB0ZXh0LWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjM6NVwiPkpvaW4gd29ya3NwYWNlPC9oMT5cclxuICAgIDxkaXYgY2xhc3M9XCJwLTQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTIgcm91bmRlZCB0ZXh0LWJvZHkteHNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZTo0OjVcIj5cclxuICAgICAgWW91J3JlIGFjY2VwdGluZyBhbiBpbnZpdGF0aW9uIHRvIGpvaW5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJmb250LW1lZGl1bVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjY6N1wiPnt7IGludml0ZS53b3Jrc3BhY2UubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpc0N1cnJlbnRVc2VyVGFyZ2V0XCI+LjwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJ0YXJnZXRVc2VyXCI+XHJcbiAgICAgICAgICA8IS0tIHByZXR0aWVyLWlnbm9yZSAtLT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiYWN0aXZlVXNlclwiPlxyXG4gICAgICAgICAgICBob3dldmVyIHRoZSBpbnZpdGF0aW9uIHdhcyBzZW50IHRvXHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGZvbnQtbWVkaXVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWU6MTM6MTNcIj5cclxuICAgICAgICAgICAgICA8VXNlckF2YXRhciA6dXNlcj1cInRhcmdldFVzZXJcIiBzaXplPVwic21cIiBjbGFzcz1cIm1yLTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZToxNDoxNVwiIC8+XHJcbiAgICAgICAgICAgICAge3sgdGFyZ2V0VXNlci5uYW1lIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj4uIFlvdSBoYXZlIHRvIHNpZ24gb3V0IGZyb20gdGhlIGN1cnJlbnQgYWNjb3VudCB0byBwcm9jZWVkLlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+LiBQbGVhc2Ugc2lnbiBpbiB0byBwcm9jZWVkLjwvdGVtcGxhdGU+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgdXNpbmcgdGhlXHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbWVkaXVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWU6MjI6MTFcIj57eyBpbnZpdGUuZW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICBlbWFpbCBhZGRyZXNzLlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNwYWNlLXktNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjI3OjVcIj5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpc0N1cnJlbnRVc2VyVGFyZ2V0XCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgZnVsbC13aWR0aFxyXG4gICAgICAgICAgOmRpc2FibGVkPVwibG9hZGluZ1wiXHJcbiAgICAgICAgICBAY2xpY2s9XCIoKSA9PiBhY2NlcHQoKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjI5OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIEFjY2VwdFxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgIHNpemU9XCJsZ1wiXHJcbiAgICAgICAgICBmdWxsLXdpZHRoXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJsb2FkaW5nXCJcclxuICAgICAgICAgIEBjbGljaz1cIigpID0+IGRlY2xpbmUoKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjM4OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIERlY2xpbmVcclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJ0YXJnZXRVc2VyXCI+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgICBmdWxsLXdpZHRoXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImxvYWRpbmdcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCIoKSA9PiBzaWduT3V0R29Ub0xvZ2luKClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZTo1MDoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGFjdGl2ZVVzZXIgPyAnU2lnbiBvdXQgdG8gY29udGludWUnIDogJ1NpZ24gaW4gdG8gY29udGludWUnIH19XHJcbiAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgc2l6ZT1cImxnXCJcclxuICAgICAgICAgICAgZnVsbC13aWR0aFxyXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCJsb2FkaW5nXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwic2lnbk91dEdvVG9SZWdpc3RlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjYxOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgQ3JlYXRlIG5ldyBhY2NvdW50XHJcbiAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgICBmdWxsLXdpZHRoXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImxvYWRpbmdcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCJcclxuICAgICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgICAgYWN0aXZlVXNlclxyXG4gICAgICAgICAgICAgICAgICA/IGFjY2VwdEFuZEFkZEVtYWlsKClcclxuICAgICAgICAgICAgICAgICAgOiBzaWduT3V0R29Ub0xvZ2luKHsgYWRkTmV3RW1haWw6IHRydWUgfSlcclxuICAgICAgICAgICAgXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWU6NzA6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBBZGQgbmV3IGVtYWlsIHRvIGV4aXN0aW5nIGFjY291bnRcclxuICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IFJlbGF0aXZlVVJMIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VBdXRoTWFuYWdlciB9IGZyb20gJ34vbGliL2F1dGgvY29tcG9zYWJsZXMvYXV0aCdcclxuaW1wb3J0IHsgdXNlUG9zdEF1dGhSZWRpcmVjdCB9IGZyb20gJ34vbGliL2F1dGgvY29tcG9zYWJsZXMvcG9zdEF1dGhSZWRpcmVjdCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUludml0ZUJsb2NrX1BlbmRpbmdXb3Jrc3BhY2VDb2xsYWJvcmF0b3JGcmFnbWVudCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB7XHJcbiAgdXNlTmF2aWdhdGVUb0xvZ2luLFxyXG4gIHVzZU5hdmlnYXRlVG9SZWdpc3RyYXRpb25cclxufSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHsgdXNlV29ya3NwYWNlSW52aXRlTWFuYWdlciB9IGZyb20gJ34vbGliL3dvcmtzcGFjZXMvY29tcG9zYWJsZXMvbWFuYWdlbWVudCdcclxuaW1wb3J0IHsgdXNlV29ya3NwYWNlUHVibGljU3NvQ2hlY2sgfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2NvbXBvc2FibGVzL3NzbydcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFdvcmtzcGFjZUludml0ZUJsb2NrX1BlbmRpbmdXb3Jrc3BhY2VDb2xsYWJvcmF0b3Igb24gUGVuZGluZ1dvcmtzcGFjZUNvbGxhYm9yYXRvciB7XHJcbiAgICBpZFxyXG4gICAgd29ya3NwYWNlIHtcclxuICAgICAgaWRcclxuICAgICAgbmFtZVxyXG4gICAgICBsb2dvXHJcbiAgICB9XHJcbiAgICB0b2tlblxyXG4gICAgdXNlciB7XHJcbiAgICAgIGlkXHJcbiAgICAgIG5hbWVcclxuICAgICAgLi4uTGltaXRlZFVzZXJBdmF0YXJcclxuICAgIH1cclxuICAgIHRpdGxlXHJcbiAgICBlbWFpbFxyXG4gICAgLi4uVXNlV29ya3NwYWNlSW52aXRlTWFuYWdlcl9QZW5kaW5nV29ya3NwYWNlQ29sbGFib3JhdG9yXHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgaW52aXRlOiBXb3Jrc3BhY2VJbnZpdGVCbG9ja19QZW5kaW5nV29ya3NwYWNlQ29sbGFib3JhdG9yRnJhZ21lbnRcclxufT4oKVxyXG5cclxuY29uc3QgeyBhY3RpdmVVc2VyIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuY29uc3Qgcm91dGUgPSB1c2VSb3V0ZSgpXHJcbmNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpXHJcbmNvbnN0IGxvZ2dlciA9IHVzZUxvZ2dlcigpXHJcbmNvbnN0IHBvc3RBdXRoUmVkaXJlY3QgPSB1c2VQb3N0QXV0aFJlZGlyZWN0KClcclxuY29uc3QgeyBsb2dvdXQgfSA9IHVzZUF1dGhNYW5hZ2VyKClcclxuY29uc3QgZ29Ub0xvZ2luID0gdXNlTmF2aWdhdGVUb0xvZ2luKClcclxuY29uc3QgZ29Ub1JlZ2lzdGVyID0gdXNlTmF2aWdhdGVUb1JlZ2lzdHJhdGlvbigpXHJcbmNvbnN0IHsgbG9hZGluZywgYWNjZXB0LCBkZWNsaW5lLCB0b2tlbiwgaXNDdXJyZW50VXNlclRhcmdldCwgdGFyZ2V0VXNlciB9ID1cclxuICB1c2VXb3Jrc3BhY2VJbnZpdGVNYW5hZ2VyKHtcclxuICAgIGludml0ZTogY29tcHV0ZWQoKCkgPT4gcHJvcHMuaW52aXRlKVxyXG4gIH0pXHJcblxyXG5jb25zdCB3b3Jrc3BhY2VTbHVnID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMuaW52aXRlLndvcmtzcGFjZS5zbHVnID8/ICcnKVxyXG5jb25zdCB7IGhhc1Nzb0VuYWJsZWQgfSA9IHVzZVdvcmtzcGFjZVB1YmxpY1Nzb0NoZWNrKHdvcmtzcGFjZVNsdWcpXHJcblxyXG5jb25zdCBidWlsZFBvc3RBdXRoUmVkaXJlY3RVcmwgPSAocGFyYW1zOiB7XHJcbiAgYXV0b0FjY2VwdD86IGJvb2xlYW5cclxuICBhZGROZXdFbWFpbD86IGJvb2xlYW5cclxufSkgPT4ge1xyXG4gIGNvbnN0IGN1cnJlbnRSb3V0ZSA9IG5ldyBSZWxhdGl2ZVVSTChyb3V0ZS5mdWxsUGF0aClcclxuICBpZiAocGFyYW1zLmFkZE5ld0VtYWlsKSB7XHJcbiAgICBjdXJyZW50Um91dGUuc2VhcmNoUGFyYW1zLnNldCgnYWRkTmV3RW1haWwnLCAndHJ1ZScpXHJcbiAgfVxyXG4gIGlmIChwYXJhbXMuYXV0b0FjY2VwdCkge1xyXG4gICAgY3VycmVudFJvdXRlLnNlYXJjaFBhcmFtcy5zZXQoJ2FjY2VwdCcsICd0cnVlJylcclxuICB9XHJcbiAgaWYgKHRva2VuLnZhbHVlKSB7XHJcbiAgICBjdXJyZW50Um91dGUuc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCB0b2tlbi52YWx1ZSlcclxuICB9XHJcblxyXG4gIHJldHVybiBjdXJyZW50Um91dGUudG9TdHJpbmcoKVxyXG59XHJcblxyXG5jb25zdCBzaWduT3V0R29Ub0xvZ2luID0gYXN5bmMgKHBhcmFtcz86IHsgYWRkTmV3RW1haWw/OiBib29sZWFuIH0pID0+IHtcclxuICBjb25zdCBwb3N0QXV0aFJlZGlyZWN0VXJsID0gYnVpbGRQb3N0QXV0aFJlZGlyZWN0VXJsKHtcclxuICAgIGFkZE5ld0VtYWlsOiBwYXJhbXM/LmFkZE5ld0VtYWlsIHx8IGZhbHNlLFxyXG4gICAgYXV0b0FjY2VwdDogdHJ1ZVxyXG4gIH0pXHJcblxyXG4gIGF3YWl0IGxvZ291dCh7IHNraXBSZWRpcmVjdDogdHJ1ZSB9KVxyXG4gIHBvc3RBdXRoUmVkaXJlY3Quc2V0KHBvc3RBdXRoUmVkaXJlY3RVcmwsIHRydWUpXHJcbiAgYXdhaXQgZ29Ub0xvZ2luKHtcclxuICAgIHF1ZXJ5OiB7XHJcbiAgICAgIHRva2VuOiB0b2tlbi52YWx1ZVxyXG4gICAgfVxyXG4gIH0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHbyB0byByZWdpc3RlciBhbmQgc2V0IHBvc3QtYXV0aCByZWRpcmVjdCB0byBhY2NlcHRpbmcgdGhlIGludml0ZVxyXG4gKiBhbmQgYWRkaW5nIHRoZSB0YXJnZXQgZW1haWwgdG8gdGhlIGFjY291bnRcclxuICovXHJcbmNvbnN0IHNpZ25PdXRHb1RvUmVnaXN0ZXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGlmICghcHJvcHMuaW52aXRlLndvcmtzcGFjZS5zbHVnKSB7XHJcbiAgICAgIGxvZ2dlci53YXJuKFxyXG4gICAgICAgICdObyB3b3Jrc3BhY2Ugc2x1ZyBmb3VuZCBpbiBpbnZpdGUsIGZhbGxpbmcgYmFjayB0byByZWd1bGFyIHJlZ2lzdHJhdGlvbidcclxuICAgICAgKVxyXG4gICAgICBnb1RvUmVnaXN0ZXIoeyBxdWVyeTogeyB0b2tlbjogdG9rZW4udmFsdWUgfSB9KVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwb3N0QXV0aFJlZGlyZWN0VXJsID0gYnVpbGRQb3N0QXV0aFJlZGlyZWN0VXJsKHtcclxuICAgICAgYWRkTmV3RW1haWw6IHRydWUsXHJcbiAgICAgIGF1dG9BY2NlcHQ6IHRydWVcclxuICAgIH0pXHJcblxyXG4gICAgYXdhaXQgbG9nb3V0KHsgc2tpcFJlZGlyZWN0OiB0cnVlIH0pXHJcbiAgICBwb3N0QXV0aFJlZGlyZWN0LnNldChwb3N0QXV0aFJlZGlyZWN0VXJsLCB0cnVlKVxyXG5cclxuICAgIGlmIChoYXNTc29FbmFibGVkLnZhbHVlKSB7XHJcbiAgICAgIHJvdXRlci5wdXNoKHtcclxuICAgICAgICBwYXRoOiBgL3dvcmtzcGFjZXMvJHtwcm9wcy5pbnZpdGUud29ya3NwYWNlLnNsdWd9L3Nzby9yZWdpc3RlcmAsXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgIHRva2VuOiB0b2tlbi52YWx1ZSxcclxuICAgICAgICAgIHJlZ2lzdGVyOiAndHJ1ZSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnb1RvUmVnaXN0ZXIoeyBxdWVyeTogeyB0b2tlbjogdG9rZW4udmFsdWUgfSB9KVxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBTU08gY2hlY2s6JywgZXJyb3IpXHJcbiAgICBnb1RvUmVnaXN0ZXIoeyBxdWVyeTogeyB0b2tlbjogdG9rZW4udmFsdWUgfSB9KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgYWNjZXB0QW5kQWRkRW1haWwgPSAoKSA9PiBhY2NlcHQoeyBhZGROZXdFbWFpbDogdHJ1ZSB9KVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWUifQ== |