import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/Header.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 { FormTextInput as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_3 } from "/_nuxt/components/form/select/Users.vue"; import { FormSelectSourceApps as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutGridListToggle as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_6 } from "/_nuxt/components/project/models/Add.vue"; import { default as __nuxt_component_7 } from "/_nuxt/components/integrations/acc/dialog/CreateSync.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementVNode as __createElementVNode,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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } 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 { ChevronDownIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29"; import { SourceApps, SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { debounce } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { modelRoute, workspaceIntegrationSettingsRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useCanCreateModel } from "/_nuxt/lib/projects/composables/permissions.ts"; import { HorizontalDirection } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { useAccIntegration } from "/_nuxt/lib/integrations/composables/useAccIntegration.ts"; import { ref, useId, 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 AddNewModelActionTypes = /* @__PURE__ */ ((AddNewModelActionTypes2) => { AddNewModelActionTypes2["NewModel"] = "new-model"; AddNewModelActionTypes2["NewAccSyncItem"] = "new-acc-sync-item"; return AddNewModelActionTypes2; })(AddNewModelActionTypes || {}); const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ProjectPageModelsHeader", props: { projectId: { type: String, required: true }, project: { type: Object, required: false }, selectedMembers: { type: Array, required: true }, selectedApps: { type: Array, required: true }, search: { type: String, required: true }, gridOrList: { type: String, required: true }, disabled: { type: Boolean, required: false } }, emits: ["update:selected-members", "update:selected-apps", "update:grid-or-list", "update:search"], setup(__props, { expose: __expose, emit: __emit }) { __expose(); const emit = __emit; graphql(` fragment ProjectModelsPageHeader_Project on Project { id name sourceApps role models { totalCount } team { id user { ...FormUsersSelectItem } } workspace { id role slug name readOnly plan { name } } permissions { canCreateModel { ...FullPermissionCheckResult } canReadAccIntegrationSettings { ...FullPermissionCheckResult } } ...ProjectModelsAdd_Project } `); const props = __props; const localSearch = ref(""); const sourceAppsLabelId = useId(); const sourceAppsBtnId = useId(); const router = useRouter(); const mp = useMixpanel(); const menuId = useId(); const onViewAllClick = () => { router.push(allModelsRoute.value); mp.track("Viewer Action", { type: "action", name: "federation", action: "view-all", source: "project page" }); }; const showNewDialog = ref(false); const showNewAccSync = ref(false); const showAccIntegration = computed( () => props.project?.permissions.canReadAccIntegrationSettings.authorized ); const canCreateModel = useCanCreateModel({ project: computed(() => props.project) }); const debouncedSearch = computed({ get: () => props.search, set: (newVal) => emit("update:search", newVal) }); const finalSelectedMembers = computed({ get: () => props.selectedMembers, set: (newVal) => emit("update:selected-members", newVal) }); const finalSelectedApps = computed({ get: () => props.selectedApps, set: (newVal) => emit("update:selected-apps", newVal) }); const finalGridOrList = computed({ get: () => props.gridOrList, set: (newVal) => emit("update:grid-or-list", newVal) }); const availableSourceApps = computed( () => props.project ? SourceApps.filter( (a) => props.project.sourceApps.find((pa) => pa.toLowerCase().includes(a.searchKey)) ) : [] ); const allModelsRoute = computed(() => { const resourceIdString = SpeckleViewer.ViewerRoute.resourceBuilder().addAllModels().toString(); return modelRoute(props.projectId, resourceIdString); }); const showMenu = ref(false); const { integration, checkConnection } = useAccIntegration(); const menuItems = computed(() => [ [ { title: "Create new model...", id: "new-model" /* NewModel */, disabled: !canCreateModel.canClickCreate.value, disabledTooltip: canCreateModel.cantClickCreateReason.value }, // TODO ACC: Upload a file { // TODO: Do we show this disabled in all non-enterprise cases? title: "Sync from ACC...", id: "new-acc-sync-item" /* NewAccSyncItem */, // I believe for now sync limits corralate with model limit since new sync creates new model, once we have limits for syncs, this should change disabled: !canCreateModel.canClickCreate.value, disabledTooltip: canCreateModel.cantClickCreateReason.value } ] ]); const onActionChosen = async (params) => { const { item } = params; switch (item.id) { case "new-model" /* NewModel */: handleCreateModelClick(); break; case "new-acc-sync-item" /* NewAccSyncItem */: await checkConnection( props.project?.workspace?.slug, props.project?.workspace?.id ); if (integration.value.status === "connected") { showNewAccSync.value = true; } else { router.push(workspaceIntegrationSettingsRoute(props.project?.workspace?.slug)); } break; } }; const team = computed(() => props.project?.team.map((t) => t.user) || []); const updateDebouncedSearch = debounce(() => { debouncedSearch.value = localSearch.value.trim(); }, 500); const updateSearchImmediately = (val) => { updateDebouncedSearch.cancel(); debouncedSearch.value = (val ?? localSearch.value).trim(); }; const handleCreateModelClick = () => { showNewDialog.value = true; }; watch(debouncedSearch, (newVal) => { if (newVal !== localSearch.value) { localSearch.value = newVal; } }); const __returned__ = { emit, props, localSearch, sourceAppsLabelId, sourceAppsBtnId, router, mp, menuId, onViewAllClick, showNewDialog, showNewAccSync, showAccIntegration, canCreateModel, debouncedSearch, finalSelectedMembers, finalSelectedApps, finalGridOrList, availableSourceApps, allModelsRoute, showMenu, AddNewModelActionTypes, integration, checkConnection, menuItems, onActionChosen, team, updateDebouncedSearch, updateSearchImmediately, handleCreateModelClick, get ChevronDownIcon() { return ChevronDownIcon; }, get HorizontalDirection() { return HorizontalDirection; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, withModifiers as _withModifiers, openBlock as _openBlock, createCommentVNode as _createCommentVNode, 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/project/page/models/Header.vue:2:3" }; const _hoisted_2 = { class: "flex flex-col space-y-2 xl:space-y-0 xl:flex-row xl:justify-between xl:items-center mb-4 mt-3", "data-v-inspector": "components/project/page/models/Header.vue:3:5" }; const _hoisted_3 = { class: "flex justify-between items-center flex-wrap xl:flex-nowrap", "data-v-inspector": "components/project/page/models/Header.vue:6:7" }; const _hoisted_4 = { class: "flex items-center space-x-2 w-full mt-2 sm:w-auto sm:mt-0", "data-v-inspector": "components/project/page/models/Header.vue:8:9" }; const _hoisted_5 = { class: "grow inline-flex sm:grow-0 lg:hidden", "data-v-inspector": "components/project/page/models/Header.vue:18:11" }; const _hoisted_6 = { class: "flex items-center gap-1", "data-v-inspector": "components/project/page/models/Header.vue:32:17" }; const _hoisted_7 = { key: 1, "data-v-inspector": "components/project/page/models/Header.vue:38:13" }; const _hoisted_8 = { class: "flex flex-col space-y-2 xl:space-y-0 xl:flex-row xl:items-center xl:space-x-2", "data-v-inspector": "components/project/page/models/Header.vue:49:7" }; const _hoisted_9 = { class: "flex flex-col space-y-2 sm:flex-row sm:items-center sm:space-x-2 sm:space-y-0", "data-v-inspector": "components/project/page/models/Header.vue:63:9" }; const _hoisted_10 = { class: "flex items-center space-x-2 grow", "data-v-inspector": "components/project/page/models/Header.vue:76:11" }; const _hoisted_11 = { class: "hidden lg:inline-flex shrink-0", "data-v-inspector": "components/project/page/models/Header.vue:99:11" }; const _hoisted_12 = { class: "flex items-center gap-1", "data-v-inspector": "components/project/page/models/Header.vue:110:17" }; const _hoisted_13 = { key: 1, "data-v-inspector": "components/project/page/models/Header.vue:116:13" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_FormButton = __nuxt_component_0; const _component_LayoutMenu = __nuxt_component_1; const _component_FormTextInput = __nuxt_component_2; const _component_FormSelectUsers = __nuxt_component_3; const _component_FormSelectSourceApps = __nuxt_component_4; const _component_LayoutGridListToggle = __nuxt_component_5; const _component_ProjectModelsAdd = __nuxt_component_6; const _component_IntegrationsAccDialogCreateSync = __nuxt_component_7; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock("div", _hoisted_1, [ _createElementVNode("div", _hoisted_2, [ _createElementVNode("div", _hoisted_3, [ _cache[16] || (_cache[16] = _createElementVNode( "h1", { class: "block text-heading-lg", "data-v-inspector": "components/project/page/models/Header.vue:7:9" }, "Models", -1 /* CACHED */ )), _createElementVNode("div", _hoisted_4, [ _createVNode(_component_FormButton, { color: "outline", disabled: $props.project?.models.totalCount === 0, class: "grow inline-flex sm:grow-0 lg:hidden", onClick: $setup.onViewAllClick, "data-v-inspector": "components/project/page/models/Header.vue:9:11" }, { default: _withCtx(() => [..._cache[13] || (_cache[13] = [ _createTextVNode( " View all in 3D ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]), _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_5, [ $setup.showAccIntegration ? (_openBlock(), _createBlock(_component_LayoutMenu, { key: 0, open: $setup.showMenu, "onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showMenu = $event), items: $setup.menuItems, "menu-position": $setup.HorizontalDirection.Left, "menu-id": $setup.menuId, onClick: _cache[2] || (_cache[2] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/project/page/models/Header.vue:22:13" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { color: "primary", onClick: _cache[0] || (_cache[0] = ($event) => $setup.showMenu = !$setup.showMenu), "data-v-inspector": "components/project/page/models/Header.vue:31:15" }, { default: _withCtx(() => [ _createElementVNode("div", _hoisted_6, [ _cache[14] || (_cache[14] = _createTextVNode( " Add model ", -1 /* CACHED */ )), _createVNode($setup["ChevronDownIcon"], { class: "h-3 w-3", "data-v-inspector": "components/project/page/models/Header.vue:34:19" }) ]) ]), _: 1 /* STABLE */ }) ]), _: 1 /* STABLE */ }, 8, ["open", "items", "menu-position", "menu-id"])) : _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_7, [ _createVNode(_component_FormButton, { disabled: !$setup.canCreateModel.canClickCreate.value, onClick: $setup.handleCreateModelClick, "data-v-inspector": "components/project/page/models/Header.vue:39:15" }, { default: _withCtx(() => [..._cache[15] || (_cache[15] = [ _createTextVNode( " New model ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]) ])), [ [_directive_tippy, $setup.canCreateModel.cantClickCreateReason.value] ]) ])), [ [_directive_tippy, $setup.canCreateModel.cantClickCreateReason.value] ]) ]) ]), _createElementVNode("div", _hoisted_8, [ _createVNode(_component_FormTextInput, { modelValue: $setup.localSearch, "onUpdate:modelValue": [ _cache[3] || (_cache[3] = ($event) => $setup.localSearch = $event), $setup.updateDebouncedSearch ], name: "modelsearch", "show-label": false, placeholder: "Search models...", color: "foundation", "wrapper-classes": "grow lg:grow-0 xl:ml-2 xl:w-40 min-w-40 shrink-0", "show-clear": $setup.localSearch !== "", onChange: _cache[4] || (_cache[4] = ($event) => $setup.updateSearchImmediately($event.value)), "data-v-inspector": "components/project/page/models/Header.vue:52:9" }, null, 8, ["modelValue", "show-clear", "onUpdate:modelValue"]), _createElementVNode("div", _hoisted_9, [ _createVNode(_component_FormSelectUsers, { modelValue: $setup.finalSelectedMembers, "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => $setup.finalSelectedMembers = $event), users: $setup.team, multiple: "", "selector-placeholder": "All members", label: "Filter by members", class: "grow shrink sm:w-[120px] md:w-44", clearable: "", "fixed-height": "", "data-v-inspector": "components/project/page/models/Header.vue:66:11" }, null, 8, ["modelValue", "users"]), _createElementVNode("div", _hoisted_10, [ _createVNode(_component_FormSelectSourceApps, { modelValue: $setup.finalSelectedApps, "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => $setup.finalSelectedApps = $event), items: $setup.availableSourceApps, multiple: "", "selector-placeholder": "All sources", label: "Filter by sources", class: "grow shrink sm:w-[120px] md:w-44", clearable: "", "fixed-height": "", "label-id": $setup.sourceAppsLabelId, "button-id": $setup.sourceAppsBtnId, "data-v-inspector": "components/project/page/models/Header.vue:77:13" }, null, 8, ["modelValue", "items", "label-id", "button-id"]), _createVNode(_component_LayoutGridListToggle, { modelValue: $setup.finalGridOrList, "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => $setup.finalGridOrList = $event), class: "shrink-0", "data-v-inspector": "components/project/page/models/Header.vue:89:13" }, null, 8, ["modelValue"]) ]), _createVNode(_component_FormButton, { color: "outline", class: "hidden lg:inline-flex shrink-0", disabled: $props.project?.models.totalCount === 0, onClick: $setup.onViewAllClick, "data-v-inspector": "components/project/page/models/Header.vue:91:11" }, { default: _withCtx(() => [..._cache[17] || (_cache[17] = [ _createTextVNode( " View all in 3D ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]), _createElementVNode("div", _hoisted_11, [ $setup.showAccIntegration ? (_openBlock(), _createBlock(_component_LayoutMenu, { key: 0, open: $setup.showMenu, "onUpdate:open": _cache[9] || (_cache[9] = ($event) => $setup.showMenu = $event), items: $setup.menuItems, "menu-position": $setup.HorizontalDirection.Left, "menu-id": $setup.menuId, onClick: _cache[10] || (_cache[10] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/project/page/models/Header.vue:100:13" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { color: "primary", onClick: _cache[8] || (_cache[8] = ($event) => $setup.showMenu = !$setup.showMenu), "data-v-inspector": "components/project/page/models/Header.vue:109:15" }, { default: _withCtx(() => [ _createElementVNode("div", _hoisted_12, [ _cache[18] || (_cache[18] = _createTextVNode( " Add model ", -1 /* CACHED */ )), _createVNode($setup["ChevronDownIcon"], { class: "h-3 w-3", "data-v-inspector": "components/project/page/models/Header.vue:112:19" }) ]) ]), _: 1 /* STABLE */ }) ]), _: 1 /* STABLE */ }, 8, ["open", "items", "menu-position", "menu-id"])) : _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_13, [ _createVNode(_component_FormButton, { disabled: !$setup.canCreateModel.canClickCreate.value, onClick: $setup.handleCreateModelClick, "data-v-inspector": "components/project/page/models/Header.vue:117:15" }, { default: _withCtx(() => [..._cache[19] || (_cache[19] = [ _createTextVNode( " New model ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]) ])), [ [_directive_tippy, $setup.canCreateModel.cantClickCreateReason.value] ]) ]) ]) ]) ]), _createVNode(_component_ProjectModelsAdd, { open: $setup.showNewDialog, "onUpdate:open": _cache[11] || (_cache[11] = ($event) => $setup.showNewDialog = $event), project: $props.project, "data-v-inspector": "components/project/page/models/Header.vue:128:5" }, null, 8, ["open", "project"]), _createVNode(_component_IntegrationsAccDialogCreateSync, { open: $setup.showNewAccSync, "onUpdate:open": _cache[12] || (_cache[12] = ($event) => $setup.showNewAccSync = $event), "project-id": $props.project?.id, "data-v-inspector": "components/project/page/models/Header.vue:129:5" }, null, 8, ["open", "project-id"]) ]); } _sfc_main.__hmrId = "bd5c8cb4"; 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/Header.vue"]]); //# sourceMappingURL=data:application/json;base64,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QUthO0FBQUEsa0JBTEQsT0FBTTtBQUFBLGtCQUFXLFNBQUssc0NBQUUsa0JBQVEsQ0FBSTtBQUFBLGtCQUFVLG9CQUFpQjtBQUFBO29DQUN6RSxNQUdNO0FBQUEsb0JBSE4sb0JBR00sT0FITixhQUdNO0FBQUE7d0JBSG1HO0FBQUEsd0JBRXZHO0FBQUE7QUFBQTtBQUFBLG1DQUF1RztBQUFBLHdCQUF0RixPQUFNO0FBQUEsd0JBQVUsb0JBQWlCO0FBQUE7Ozs7Ozs7OzttR0FJeEQsb0JBT00sT0FQTixhQU9NO0FBQUEsY0FOSixhQUthO0FBQUEsZ0JBSlYsVUFBUSxDQUFHLHNCQUFlLGVBQWU7QUFBQSxnQkFDekMsU0FBTztBQUFBLGdCQUF3QixvQkFBaUI7QUFBQTtrQ0FDbEQsTUFFRDtBQUFBO29CQUZDO0FBQUEsb0JBRUQ7QUFBQTtBQUFBO0FBQUE7Ozs7O2lDQU5tQixzQkFBZSxzQkFBc0IsS0FBSztBQUFBOzs7OztJQVl2RSxhQUF1STtBQUFBLE1BQTdHLE1BQU07QUFBQSxzRkFBYTtBQUFBLE1BQUcsU0FBUztBQUFBLE1BQVMsb0JBQWlCO0FBQUE7SUFDbkYsYUFHRTtBQUFBLE1BRlEsTUFBTTtBQUFBLHVGQUFjO0FBQUEsTUFDM0IsY0FBWSxnQkFBUztBQUFBLE1BQUksb0JBQWlCO0FBQUEiLCJuYW1lcyI6WyJBZGROZXdNb2RlbEFjdGlvblR5cGVzIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIkhlYWRlci52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxkaXYgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjI6M1wiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgc3BhY2UteS0yIHhsOnNwYWNlLXktMCB4bDpmbGV4LXJvdyB4bDpqdXN0aWZ5LWJldHdlZW4geGw6aXRlbXMtY2VudGVyIG1iLTQgbXQtM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTozOjVcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGZsZXgtd3JhcCB4bDpmbGV4LW5vd3JhcFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTo2OjdcIj5cclxuICAgICAgICA8aDEgY2xhc3M9XCJibG9jayB0ZXh0LWhlYWRpbmctbGdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0hlYWRlci52dWU6Nzo5XCI+TW9kZWxzPC9oMT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHctZnVsbCBtdC0yIHNtOnctYXV0byBzbTptdC0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjg6OVwiPlxyXG4gICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgOmRpc2FibGVkPVwicHJvamVjdD8ubW9kZWxzLnRvdGFsQ291bnQgPT09IDBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImdyb3cgaW5saW5lLWZsZXggc206Z3Jvdy0wIGxnOmhpZGRlblwiXHJcbiAgICAgICAgICAgIEBjbGljaz1cIm9uVmlld0FsbENsaWNrXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjk6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBWaWV3IGFsbCBpbiAzRFxyXG4gICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi10aXBweT1cImNhbkNyZWF0ZU1vZGVsLmNhbnRDbGlja0NyZWF0ZVJlYXNvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdyBpbmxpbmUtZmxleCBzbTpncm93LTAgbGc6aGlkZGVuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjE4OjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgICAgICB2LWlmPVwic2hvd0FjY0ludGVncmF0aW9uXCJcclxuICAgICAgICAgICAgICB2LW1vZGVsOm9wZW49XCJzaG93TWVudVwiXHJcbiAgICAgICAgICAgICAgOml0ZW1zPVwibWVudUl0ZW1zXCJcclxuICAgICAgICAgICAgICA6bWVudS1wb3NpdGlvbj1cIkhvcml6b250YWxEaXJlY3Rpb24uTGVmdFwiXHJcbiAgICAgICAgICAgICAgOm1lbnUtaWQ9XCJtZW51SWRcIlxyXG4gICAgICAgICAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgICAgICAgICBAY2hvc2VuPVwib25BY3Rpb25DaG9zZW5cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0hlYWRlci52dWU6MjI6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPEZvcm1CdXR0b24gY29sb3I9XCJwcmltYXJ5XCIgQGNsaWNrPVwic2hvd01lbnUgPSAhc2hvd01lbnVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0hlYWRlci52dWU6MzE6MTVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTozMjoxN1wiPlxyXG4gICAgICAgICAgICAgICAgICBBZGQgbW9kZWxcclxuICAgICAgICAgICAgICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzcz1cImgtMyB3LTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0hlYWRlci52dWU6MzQ6MTlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgICA8L0xheW91dE1lbnU+XHJcbiAgICAgICAgICAgIDxkaXYgdi1lbHNlIHYtdGlwcHk9XCJjYW5DcmVhdGVNb2RlbC5jYW50Q2xpY2tDcmVhdGVSZWFzb24udmFsdWVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0hlYWRlci52dWU6Mzg6MTNcIj5cclxuICAgICAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiIWNhbkNyZWF0ZU1vZGVsLmNhbkNsaWNrQ3JlYXRlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cImhhbmRsZUNyZWF0ZU1vZGVsQ2xpY2tcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0hlYWRlci52dWU6Mzk6MTVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIE5ldyBtb2RlbFxyXG4gICAgICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgc3BhY2UteS0yIHhsOnNwYWNlLXktMCB4bDpmbGV4LXJvdyB4bDppdGVtcy1jZW50ZXIgeGw6c3BhY2UteC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjQ5OjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEZvcm1UZXh0SW5wdXRcclxuICAgICAgICAgIHYtbW9kZWw9XCJsb2NhbFNlYXJjaFwiXHJcbiAgICAgICAgICBuYW1lPVwibW9kZWxzZWFyY2hcIlxyXG4gICAgICAgICAgOnNob3ctbGFiZWw9XCJmYWxzZVwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBtb2RlbHMuLi5cIlxyXG4gICAgICAgICAgY29sb3I9XCJmb3VuZGF0aW9uXCJcclxuICAgICAgICAgIHdyYXBwZXItY2xhc3Nlcz1cImdyb3cgbGc6Z3Jvdy0wIHhsOm1sLTIgeGw6dy00MCBtaW4tdy00MCBzaHJpbmstMFwiXHJcbiAgICAgICAgICA6c2hvdy1jbGVhcj1cImxvY2FsU2VhcmNoICE9PSAnJ1wiXHJcbiAgICAgICAgICBAY2hhbmdlPVwiKCRldmVudCkgPT4gdXBkYXRlU2VhcmNoSW1tZWRpYXRlbHkoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwidXBkYXRlRGVib3VuY2VkU2VhcmNoXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjUyOjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMiBzbTpmbGV4LXJvdyBzbTppdGVtcy1jZW50ZXIgc206c3BhY2UteC0yIHNtOnNwYWNlLXktMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTo2Mzo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8Rm9ybVNlbGVjdFVzZXJzXHJcbiAgICAgICAgICAgIHYtbW9kZWw9XCJmaW5hbFNlbGVjdGVkTWVtYmVyc1wiXHJcbiAgICAgICAgICAgIDp1c2Vycz1cInRlYW1cIlxyXG4gICAgICAgICAgICBtdWx0aXBsZVxyXG4gICAgICAgICAgICBzZWxlY3Rvci1wbGFjZWhvbGRlcj1cIkFsbCBtZW1iZXJzXCJcclxuICAgICAgICAgICAgbGFiZWw9XCJGaWx0ZXIgYnkgbWVtYmVyc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdyBzaHJpbmsgc206dy1bMTIwcHhdIG1kOnctNDRcIlxyXG4gICAgICAgICAgICBjbGVhcmFibGVcclxuICAgICAgICAgICAgZml4ZWQtaGVpZ2h0IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTo2NjoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiBncm93XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjc2OjExXCI+XHJcbiAgICAgICAgICAgIDxGb3JtU2VsZWN0U291cmNlQXBwc1xyXG4gICAgICAgICAgICAgIHYtbW9kZWw9XCJmaW5hbFNlbGVjdGVkQXBwc1wiXHJcbiAgICAgICAgICAgICAgOml0ZW1zPVwiYXZhaWxhYmxlU291cmNlQXBwc1wiXHJcbiAgICAgICAgICAgICAgbXVsdGlwbGVcclxuICAgICAgICAgICAgICBzZWxlY3Rvci1wbGFjZWhvbGRlcj1cIkFsbCBzb3VyY2VzXCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkZpbHRlciBieSBzb3VyY2VzXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImdyb3cgc2hyaW5rIHNtOnctWzEyMHB4XSBtZDp3LTQ0XCJcclxuICAgICAgICAgICAgICBjbGVhcmFibGVcclxuICAgICAgICAgICAgICBmaXhlZC1oZWlnaHRcclxuICAgICAgICAgICAgICA6bGFiZWwtaWQ9XCJzb3VyY2VBcHBzTGFiZWxJZFwiXHJcbiAgICAgICAgICAgICAgOmJ1dHRvbi1pZD1cInNvdXJjZUFwcHNCdG5JZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTo3NzoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxMYXlvdXRHcmlkTGlzdFRvZ2dsZSB2LW1vZGVsPVwiZmluYWxHcmlkT3JMaXN0XCIgY2xhc3M9XCJzaHJpbmstMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTo4OToxM1wiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgIGNvbG9yPVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuIGxnOmlubGluZS1mbGV4IHNocmluay0wXCJcclxuICAgICAgICAgICAgOmRpc2FibGVkPVwicHJvamVjdD8ubW9kZWxzLnRvdGFsQ291bnQgPT09IDBcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCJvblZpZXdBbGxDbGlja1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZTo5MToxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFZpZXcgYWxsIGluIDNEXHJcbiAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIGxnOmlubGluZS1mbGV4IHNocmluay0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjk5OjExXCI+XHJcbiAgICAgICAgICAgIDxMYXlvdXRNZW51XHJcbiAgICAgICAgICAgICAgdi1pZj1cInNob3dBY2NJbnRlZ3JhdGlvblwiXHJcbiAgICAgICAgICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd01lbnVcIlxyXG4gICAgICAgICAgICAgIDppdGVtcz1cIm1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgOm1lbnUtcG9zaXRpb249XCJIb3Jpem9udGFsRGlyZWN0aW9uLkxlZnRcIlxyXG4gICAgICAgICAgICAgIDptZW51LWlkPVwibWVudUlkXCJcclxuICAgICAgICAgICAgICBAY2xpY2suc3RvcC5wcmV2ZW50XHJcbiAgICAgICAgICAgICAgQGNob3Nlbj1cIm9uQWN0aW9uQ2hvc2VuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjEwMDoxM1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8Rm9ybUJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBAY2xpY2s9XCJzaG93TWVudSA9ICFzaG93TWVudVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZToxMDk6MTVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZToxMTA6MTdcIj5cclxuICAgICAgICAgICAgICAgICAgQWRkIG1vZGVsXHJcbiAgICAgICAgICAgICAgICAgIDxDaGV2cm9uRG93bkljb24gY2xhc3M9XCJoLTMgdy0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjExMjoxOVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvTGF5b3V0TWVudT5cclxuICAgICAgICAgICAgPGRpdiB2LWVsc2Ugdi10aXBweT1cImNhbkNyZWF0ZU1vZGVsLmNhbnRDbGlja0NyZWF0ZVJlYXNvbi52YWx1ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZToxMTY6MTNcIj5cclxuICAgICAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiIWNhbkNyZWF0ZU1vZGVsLmNhbkNsaWNrQ3JlYXRlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cImhhbmRsZUNyZWF0ZU1vZGVsQ2xpY2tcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0hlYWRlci52dWU6MTE3OjE1XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICBOZXcgbW9kZWxcclxuICAgICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8UHJvamVjdE1vZGVsc0FkZCB2LW1vZGVsOm9wZW49XCJzaG93TmV3RGlhbG9nXCIgOnByb2plY3Q9XCJwcm9qZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9IZWFkZXIudnVlOjEyODo1XCIgLz5cclxuICAgIDxJbnRlZ3JhdGlvbnNBY2NEaWFsb2dDcmVhdGVTeW5jXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dOZXdBY2NTeW5jXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0Py5pZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZToxMjk6NVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBDaGV2cm9uRG93bkljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9vdXRsaW5lJ1xyXG5pbXBvcnQgeyBTb3VyY2VBcHBzLCBTcGVja2xlVmlld2VyIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IFNvdXJjZUFwcERlZmluaXRpb24gfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbG9kYXNoLWVzJ1xyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRm9ybVVzZXJzU2VsZWN0SXRlbUZyYWdtZW50LFxyXG4gIFByb2plY3RNb2RlbHNQYWdlSGVhZGVyX1Byb2plY3RGcmFnbWVudFxyXG59IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQge1xyXG4gIG1vZGVsUm91dGUsXHJcbiAgd29ya3NwYWNlSW50ZWdyYXRpb25TZXR0aW5nc1JvdXRlXHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL3JvdXRlJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgR3JpZExpc3RUb2dnbGVWYWx1ZSxcclxuICBMYXlvdXRNZW51SXRlbVxyXG59IGZyb20gJ35+L2xpYi9sYXlvdXQvaGVscGVycy9jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL21wJ1xyXG5pbXBvcnQgeyB1c2VDYW5DcmVhdGVNb2RlbCB9IGZyb20gJ34vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL3Blcm1pc3Npb25zJ1xyXG5pbXBvcnQgeyBIb3Jpem9udGFsRGlyZWN0aW9uIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlQWNjSW50ZWdyYXRpb24gfSBmcm9tICd+L2xpYi9pbnRlZ3JhdGlvbnMvY29tcG9zYWJsZXMvdXNlQWNjSW50ZWdyYXRpb24nXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOnNlbGVjdGVkLW1lbWJlcnMnLCB2YWw6IEZvcm1Vc2Vyc1NlbGVjdEl0ZW1GcmFnbWVudFtdKTogdm9pZFxyXG4gIChlOiAndXBkYXRlOnNlbGVjdGVkLWFwcHMnLCB2YWw6IFNvdXJjZUFwcERlZmluaXRpb25bXSk6IHZvaWRcclxuICAoZTogJ3VwZGF0ZTpncmlkLW9yLWxpc3QnLCB2YWw6IEdyaWRMaXN0VG9nZ2xlVmFsdWUpOiB2b2lkXHJcbiAgKGU6ICd1cGRhdGU6c2VhcmNoJywgdmFsOiBzdHJpbmcpOiB2b2lkXHJcbn0+KClcclxuXHJcbi8qKlxyXG4gKiBUT0RPOiBCdWcsIHRvb2x0aXAgc2hvd3Mgb2xkIHZlcnNpb24gc29tZXRpbWVzXHJcbiAqL1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdE1vZGVsc1BhZ2VIZWFkZXJfUHJvamVjdCBvbiBQcm9qZWN0IHtcclxuICAgIGlkXHJcbiAgICBuYW1lXHJcbiAgICBzb3VyY2VBcHBzXHJcbiAgICByb2xlXHJcbiAgICBtb2RlbHMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgICB0ZWFtIHtcclxuICAgICAgaWRcclxuICAgICAgdXNlciB7XHJcbiAgICAgICAgLi4uRm9ybVVzZXJzU2VsZWN0SXRlbVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB3b3Jrc3BhY2Uge1xyXG4gICAgICBpZFxyXG4gICAgICByb2xlXHJcbiAgICAgIHNsdWdcclxuICAgICAgbmFtZVxyXG4gICAgICByZWFkT25seVxyXG4gICAgICBwbGFuIHtcclxuICAgICAgICBuYW1lXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuQ3JlYXRlTW9kZWwge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgICBjYW5SZWFkQWNjSW50ZWdyYXRpb25TZXR0aW5ncyB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAuLi5Qcm9qZWN0TW9kZWxzQWRkX1Byb2plY3RcclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBwcm9qZWN0SWQ6IHN0cmluZ1xyXG4gIHByb2plY3Q/OiBQcm9qZWN0TW9kZWxzUGFnZUhlYWRlcl9Qcm9qZWN0RnJhZ21lbnRcclxuICBzZWxlY3RlZE1lbWJlcnM6IEZvcm1Vc2Vyc1NlbGVjdEl0ZW1GcmFnbWVudFtdXHJcbiAgc2VsZWN0ZWRBcHBzOiBTb3VyY2VBcHBEZWZpbml0aW9uW11cclxuICBzZWFyY2g6IHN0cmluZ1xyXG4gIGdyaWRPckxpc3Q6IEdyaWRMaXN0VG9nZ2xlVmFsdWVcclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxufT4oKVxyXG5cclxuY29uc3QgbG9jYWxTZWFyY2ggPSByZWYoJycpXHJcbmNvbnN0IHNvdXJjZUFwcHNMYWJlbElkID0gdXNlSWQoKVxyXG5jb25zdCBzb3VyY2VBcHBzQnRuSWQgPSB1c2VJZCgpXHJcbmNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpXHJcbmNvbnN0IG1wID0gdXNlTWl4cGFuZWwoKVxyXG5cclxuY29uc3QgbWVudUlkID0gdXNlSWQoKVxyXG5cclxuY29uc3Qgb25WaWV3QWxsQ2xpY2sgPSAoKSA9PiB7XHJcbiAgcm91dGVyLnB1c2goYWxsTW9kZWxzUm91dGUudmFsdWUpXHJcblxyXG4gIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnZmVkZXJhdGlvbicsXHJcbiAgICBhY3Rpb246ICd2aWV3LWFsbCcsXHJcbiAgICBzb3VyY2U6ICdwcm9qZWN0IHBhZ2UnXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgc2hvd05ld0RpYWxvZyA9IHJlZihmYWxzZSlcclxuY29uc3Qgc2hvd05ld0FjY1N5bmMgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBzaG93QWNjSW50ZWdyYXRpb24gPSBjb21wdXRlZChcclxuICAoKSA9PiBwcm9wcy5wcm9qZWN0Py5wZXJtaXNzaW9ucy5jYW5SZWFkQWNjSW50ZWdyYXRpb25TZXR0aW5ncy5hdXRob3JpemVkXHJcbilcclxuXHJcbmNvbnN0IGNhbkNyZWF0ZU1vZGVsID0gdXNlQ2FuQ3JlYXRlTW9kZWwoe1xyXG4gIHByb2plY3Q6IGNvbXB1dGVkKCgpID0+IHByb3BzLnByb2plY3QpXHJcbn0pXHJcblxyXG5jb25zdCBkZWJvdW5jZWRTZWFyY2ggPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5zZWFyY2gsXHJcbiAgc2V0OiAobmV3VmFsKSA9PiBlbWl0KCd1cGRhdGU6c2VhcmNoJywgbmV3VmFsKVxyXG59KVxyXG5jb25zdCBmaW5hbFNlbGVjdGVkTWVtYmVycyA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IHByb3BzLnNlbGVjdGVkTWVtYmVycyxcclxuICBzZXQ6IChuZXdWYWwpID0+IGVtaXQoJ3VwZGF0ZTpzZWxlY3RlZC1tZW1iZXJzJywgbmV3VmFsKVxyXG59KVxyXG5jb25zdCBmaW5hbFNlbGVjdGVkQXBwcyA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IHByb3BzLnNlbGVjdGVkQXBwcyxcclxuICBzZXQ6IChuZXdWYWwpID0+IGVtaXQoJ3VwZGF0ZTpzZWxlY3RlZC1hcHBzJywgbmV3VmFsKVxyXG59KVxyXG5jb25zdCBmaW5hbEdyaWRPckxpc3QgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5ncmlkT3JMaXN0LFxyXG4gIHNldDogKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOmdyaWQtb3ItbGlzdCcsIG5ld1ZhbClcclxufSlcclxuXHJcbmNvbnN0IGF2YWlsYWJsZVNvdXJjZUFwcHMgPSBjb21wdXRlZCgoKTogU291cmNlQXBwRGVmaW5pdGlvbltdID0+XHJcbiAgcHJvcHMucHJvamVjdFxyXG4gICAgPyBTb3VyY2VBcHBzLmZpbHRlcigoYSkgPT5cclxuICAgICAgICBwcm9wcy5wcm9qZWN0IS5zb3VyY2VBcHBzLmZpbmQoKHBhKSA9PiBwYS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGEuc2VhcmNoS2V5KSlcclxuICAgICAgKVxyXG4gICAgOiBbXVxyXG4pXHJcblxyXG5jb25zdCBhbGxNb2RlbHNSb3V0ZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCByZXNvdXJjZUlkU3RyaW5nID0gU3BlY2tsZVZpZXdlci5WaWV3ZXJSb3V0ZS5yZXNvdXJjZUJ1aWxkZXIoKVxyXG4gICAgLmFkZEFsbE1vZGVscygpXHJcbiAgICAudG9TdHJpbmcoKVxyXG4gIHJldHVybiBtb2RlbFJvdXRlKHByb3BzLnByb2plY3RJZCwgcmVzb3VyY2VJZFN0cmluZylcclxufSlcclxuXHJcbmNvbnN0IHNob3dNZW51ID0gcmVmKGZhbHNlKVxyXG5cclxuZW51bSBBZGROZXdNb2RlbEFjdGlvblR5cGVzIHtcclxuICBOZXdNb2RlbCA9ICduZXctbW9kZWwnLFxyXG4gIE5ld0FjY1N5bmNJdGVtID0gJ25ldy1hY2Mtc3luYy1pdGVtJ1xyXG59XHJcblxyXG5jb25zdCB7IGludGVncmF0aW9uLCBjaGVja0Nvbm5lY3Rpb24gfSA9IHVzZUFjY0ludGVncmF0aW9uKClcclxuXHJcbmNvbnN0IG1lbnVJdGVtcyA9IGNvbXB1dGVkPExheW91dE1lbnVJdGVtW11bXT4oKCkgPT4gW1xyXG4gIFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdDcmVhdGUgbmV3IG1vZGVsLi4uJyxcclxuICAgICAgaWQ6IEFkZE5ld01vZGVsQWN0aW9uVHlwZXMuTmV3TW9kZWwsXHJcbiAgICAgIGRpc2FibGVkOiAhY2FuQ3JlYXRlTW9kZWwuY2FuQ2xpY2tDcmVhdGUudmFsdWUsXHJcbiAgICAgIGRpc2FibGVkVG9vbHRpcDogY2FuQ3JlYXRlTW9kZWwuY2FudENsaWNrQ3JlYXRlUmVhc29uLnZhbHVlXHJcbiAgICB9LFxyXG4gICAgLy8gVE9ETyBBQ0M6IFVwbG9hZCBhIGZpbGVcclxuICAgIHtcclxuICAgICAgLy8gVE9ETzogRG8gd2Ugc2hvdyB0aGlzIGRpc2FibGVkIGluIGFsbCBub24tZW50ZXJwcmlzZSBjYXNlcz9cclxuICAgICAgdGl0bGU6ICdTeW5jIGZyb20gQUNDLi4uJyxcclxuICAgICAgaWQ6IEFkZE5ld01vZGVsQWN0aW9uVHlwZXMuTmV3QWNjU3luY0l0ZW0sXHJcbiAgICAgIC8vIEkgYmVsaWV2ZSBmb3Igbm93IHN5bmMgbGltaXRzIGNvcnJhbGF0ZSB3aXRoIG1vZGVsIGxpbWl0IHNpbmNlIG5ldyBzeW5jIGNyZWF0ZXMgbmV3IG1vZGVsLCBvbmNlIHdlIGhhdmUgbGltaXRzIGZvciBzeW5jcywgdGhpcyBzaG91bGQgY2hhbmdlXHJcbiAgICAgIGRpc2FibGVkOiAhY2FuQ3JlYXRlTW9kZWwuY2FuQ2xpY2tDcmVhdGUudmFsdWUsXHJcbiAgICAgIGRpc2FibGVkVG9vbHRpcDogY2FuQ3JlYXRlTW9kZWwuY2FudENsaWNrQ3JlYXRlUmVhc29uLnZhbHVlXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSBhc3luYyAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtOyBldmVudDogTW91c2VFdmVudCB9KSA9PiB7XHJcbiAgY29uc3QgeyBpdGVtIH0gPSBwYXJhbXNcclxuXHJcbiAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICBjYXNlIEFkZE5ld01vZGVsQWN0aW9uVHlwZXMuTmV3TW9kZWw6XHJcbiAgICAgIGhhbmRsZUNyZWF0ZU1vZGVsQ2xpY2soKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBZGROZXdNb2RlbEFjdGlvblR5cGVzLk5ld0FjY1N5bmNJdGVtOlxyXG4gICAgICAvLyBuZWVkIHRvIGNoZWNrIGNvbm5lY3Rpb24gYmVmb3JlIG1lYW5pbmdmdWwgYWN0aW9uLiBpdCB3aWxsIHJlZnJlc2ggdGhlIGNyZWRpYW50aWFsc1xyXG4gICAgICBhd2FpdCBjaGVja0Nvbm5lY3Rpb24oXHJcbiAgICAgICAgcHJvcHMucHJvamVjdD8ud29ya3NwYWNlPy5zbHVnIGFzIHN0cmluZyxcclxuICAgICAgICBwcm9wcy5wcm9qZWN0Py53b3Jrc3BhY2U/LmlkIGFzIHN0cmluZ1xyXG4gICAgICApXHJcbiAgICAgIGlmIChpbnRlZ3JhdGlvbi52YWx1ZS5zdGF0dXMgPT09ICdjb25uZWN0ZWQnKSB7XHJcbiAgICAgICAgc2hvd05ld0FjY1N5bmMudmFsdWUgPSB0cnVlXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcm91dGVyLnB1c2god29ya3NwYWNlSW50ZWdyYXRpb25TZXR0aW5nc1JvdXRlKHByb3BzLnByb2plY3Q/LndvcmtzcGFjZT8uc2x1ZykpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCB0ZWFtID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMucHJvamVjdD8udGVhbS5tYXAoKHQpID0+IHQudXNlcikgfHwgW10pXHJcblxyXG5jb25zdCB1cGRhdGVEZWJvdW5jZWRTZWFyY2ggPSBkZWJvdW5jZSgoKSA9PiB7XHJcbiAgZGVib3VuY2VkU2VhcmNoLnZhbHVlID0gbG9jYWxTZWFyY2gudmFsdWUudHJpbSgpXHJcbn0sIDUwMClcclxuXHJcbmNvbnN0IHVwZGF0ZVNlYXJjaEltbWVkaWF0ZWx5ID0gKHZhbD86IHN0cmluZykgPT4ge1xyXG4gIHVwZGF0ZURlYm91bmNlZFNlYXJjaC5jYW5jZWwoKVxyXG4gIGRlYm91bmNlZFNlYXJjaC52YWx1ZSA9ICh2YWwgPz8gbG9jYWxTZWFyY2gudmFsdWUpLnRyaW0oKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVDcmVhdGVNb2RlbENsaWNrID0gKCkgPT4ge1xyXG4gIHNob3dOZXdEaWFsb2cudmFsdWUgPSB0cnVlXHJcbn1cclxuXHJcbndhdGNoKGRlYm91bmNlZFNlYXJjaCwgKG5ld1ZhbCkgPT4ge1xyXG4gIGlmIChuZXdWYWwgIT09IGxvY2FsU2VhcmNoLnZhbHVlKSB7XHJcbiAgICBsb2NhbFNlYXJjaC52YWx1ZSA9IG5ld1ZhbFxyXG4gIH1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvSGVhZGVyLnZ1ZSJ9