import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/models/Card.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/ExpansionTriangle.vue"; import { default as __nuxt_component_1 } from "/_nuxt/node_modules/@nuxt/image/dist/runtime/components/NuxtImg.vue"; import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutMenu as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/VisibilityButton.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/IsolateButton.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createBlock as __createBlock,createElementVNode as __createElementVNode,createElementBlock as __createElementBlock } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29" function _interopVNode(vnode) { if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { const data = vnode.props['data-v-inspector'] delete vnode.props['data-v-inspector'] Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) } return vnode } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...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 __vite__cjsImport8_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport8_dayjs.__esModule ? __vite__cjsImport8_dayjs.default : __vite__cjsImport8_dayjs; import { useHighlightedObjectsUtilities, useCameraUtilities, useSelectionUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts"; import { useInjectedViewerState, useInjectedViewerRequestedResources, useInjectedViewerLoadedResources } from "/_nuxt/lib/viewer/composables/setup.ts"; import { containsAll } from "/_nuxt/lib/common/helpers/utils.ts"; import { getTargetObjectIds } from "/_nuxt/lib/object-sidebar/helpers.ts"; import { useLoadLatestVersion } from "/_nuxt/lib/viewer/composables/resources.ts"; import { SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useCopyModelLink } from "/_nuxt/lib/projects/composables/modelManagement.ts"; import { Ellipsis } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { useDateFormatters } from "/_nuxt/composables/dates.ts"; import { useRoute } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29"; import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerModelsCard", props: { model: { type: null, required: true }, versionId: { type: String, required: true }, isExpanded: { type: Boolean, required: false } }, emits: ["show-versions", "show-diff", "toggle-expansion"], setup(__props, { expose: __expose, emit: __emit }) { __expose(); const emit = __emit; const props = __props; const { highlightObjects, unhighlightObjects } = useHighlightedObjectsUtilities(); const { hideObjects, showObjects, isolateObjects, unIsolateObjects } = useFilterUtilities(); const { zoom } = useCameraUtilities(); const { items } = useInjectedViewerRequestedResources(); const { resourceItems } = useInjectedViewerLoadedResources(); const { addToSelectionFromObjectIds } = useSelectionUtilities(); const { viewer: { metadata: { filteringState } }, ui: { filters } } = useInjectedViewerState(); const mp = useMixpanel(); const copyModelLink = useCopyModelLink(); const { formattedRelativeDate, formattedFullDate } = useDateFormatters(); const route = useRoute(); const resourceIdString = computed(() => { const resourceParam = route.params.modelId; return Array.isArray(resourceParam) ? resourceParam.join("/") : resourceParam; }); const { resources: { response: { project } } } = useInjectedViewerState(); const { load: loadLatestVersion } = useLoadLatestVersion({ project: computed(() => project.value), resourceIdString: computed(() => resourceIdString.value || "") }); const showActionsMenu = ref(false); const removeEnabled = computed(() => items.value.length > 1); const actionsItems = computed(() => [ [ { title: "Copy link to model", id: "copy-link-to-model" }, { title: "Show version history", id: "show-version-history" }, { title: "Load latest version", id: "load-latest-version", disabled: isLatest.value, disabledTooltip: "Already on the latest version" }, { title: "Show version changes", id: "show-version-changes", disabled: isLatest.value, disabledTooltip: "No changes to show for the latest version" } ], [ { title: "Remove model", id: "remove-model", disabled: !removeEnabled.value, disabledTooltip: "You cannot remove the last model" } ] ]); const versions = computed(() => [ ...props.model.loadedVersion.items, ...props.model.versions.items ]); const loadedVersion = computed( () => versions.value.find((v) => v.id === props.versionId) ); const createdAt = computed(() => loadedVersion.value?.createdAt); const createdAtFormatted = computed(() => { return { full: formattedFullDate(createdAt.value), relative: formattedRelativeDate(createdAt.value, { capitalize: true }) }; }); const latestVersion = computed(() => { return versions.value.slice().sort((a, b) => dayjs(a.createdAt).isBefore(dayjs(b.createdAt)) ? 1 : -1)[0]; }); const isLatest = computed(() => loadedVersion.value?.id === latestVersion.value.id); const modelName = computed(() => { const parts = props.model.name.split("/"); if (parts.length > 1) { const name = parts[parts.length - 1]; parts.pop(); return { subheader: parts.join("/"), header: name }; } else { return { subheader: null, header: props.model.name }; } }); const modelObjectIds = computed(() => { const refObject = props.model.loadedVersion.items[0]?.referencedObject; return refObject ? getTargetObjectIds({ id: refObject }) : []; }); const hiddenObjects = computed(() => filteringState.value?.hiddenObjects); const { isolatedObjectsSet } = filters; const isHidden = computed(() => { if (!hiddenObjects.value || modelObjectIds.value.length === 0) return false; return containsAll(modelObjectIds.value, hiddenObjects.value); }); const isIsolated = computed(() => { if (!isolatedObjectsSet.value || modelObjectIds.value.length === 0) return false; const isolatedObjectsArray = Array.from(isolatedObjectsSet.value); return containsAll(modelObjectIds.value, isolatedObjectsArray); }); const stateHasIsolatedObjectsInGeneral = computed(() => { if (!isolatedObjectsSet.value) return false; return isolatedObjectsSet.value.size > 0; }); const modelContainsIsolatedObjects = computed(() => { if (!isolatedObjectsSet.value || isolatedObjectsSet.value.size === 0) return false; return modelObjectIds.value.some((modelId) => isolatedObjectsSet.value.has(modelId)); }); const shouldShowDimmed = computed(() => { return stateHasIsolatedObjectsInGeneral.value && !modelContainsIsolatedObjects.value; }); const hideOrShowObject = (e) => { e.stopPropagation(); if (modelObjectIds.value.length === 0) return; if (!isHidden.value) { hideObjects(modelObjectIds.value); } else { showObjects(modelObjectIds.value); } }; const isolateOrUnisolateObject = (e) => { e.stopPropagation(); if (modelObjectIds.value.length === 0) return; if (!isIsolated.value) { isolateObjects(modelObjectIds.value); } else { unIsolateObjects(modelObjectIds.value); } }; const highlightObject = () => { const refObject = props.model.loadedVersion.items[0]?.referencedObject; if (refObject && typeof refObject === "string") highlightObjects([refObject]); }; const unhighlightObject = () => { const refObject = props.model.loadedVersion.items[0]?.referencedObject; if (refObject && typeof refObject === "string") unhighlightObjects([refObject]); }; const handleClick = () => { if (!props.isExpanded) { emit("toggle-expansion"); } else { addToSelectionFromObjectIds(modelObjectIds.value); } }; const zoomToModel = () => { if (modelObjectIds.value.length > 0) { zoom(modelObjectIds.value); } }; const removeModel = async (modelId) => { const builder = SpeckleViewer.ViewerRoute.resourceBuilder(); for (const loadedResource of resourceItems.value) { if (loadedResource.modelId) { if (loadedResource.modelId !== modelId) { builder.addModel(loadedResource.modelId, loadedResource.versionId || void 0); } } else { if (loadedResource.objectId !== modelId) builder.addObject(loadedResource.objectId); } } mp.track("Viewer Action", { type: "action", name: "federation", action: "remove" }); await items.update(builder.toResources()); }; const onActionChosen = async (params) => { const { item } = params; switch (item.id) { case "copy-link-to-model": if (project.value) { copyModelLink({ model: { projectId: project.value.id, id: props.model.id } }); } break; case "load-latest-version": if (!isLatest.value) { loadLatestVersion(); } break; case "show-version-history": emit("show-versions", props.model.id); break; case "show-version-changes": if (loadedVersion.value && latestVersion.value && loadedVersion.value.id !== latestVersion.value.id) { emit( "show-diff", props.model.id, loadedVersion.value.id, latestVersion.value.id ); } break; case "remove-model": if (removeEnabled.value) { await removeModel(props.model.id); } break; } }; const __returned__ = { emit, props, highlightObjects, unhighlightObjects, hideObjects, showObjects, isolateObjects, unIsolateObjects, zoom, items, resourceItems, addToSelectionFromObjectIds, filteringState, filters, mp, copyModelLink, formattedRelativeDate, formattedFullDate, route, resourceIdString, project, loadLatestVersion, showActionsMenu, removeEnabled, actionsItems, versions, loadedVersion, createdAt, createdAtFormatted, latestVersion, isLatest, modelName, modelObjectIds, hiddenObjects, isolatedObjectsSet, isHidden, isIsolated, stateHasIsolatedObjectsInGeneral, modelContainsIsolatedObjects, shouldShowDimmed, hideOrShowObject, isolateOrUnisolateObject, highlightObject, unhighlightObject, handleClick, zoomToModel, removeModel, onActionChosen, get Ellipsis() { return Ellipsis; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives, withModifiers as _withModifiers, withCtx as _withCtx, withKeys as _withKeys } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "bg-foundation relative", "data-v-inspector": "components/viewer/models/Card.vue:3:3" }; const _hoisted_2 = { "data-v-inspector": "components/viewer/models/Card.vue:4:5" }; const _hoisted_3 = { class: "flex flex-col min-w-0", "data-v-inspector": "components/viewer/models/Card.vue:32:9" }; const _hoisted_4 = { class: "text-body-2xs font-medium truncate", "data-v-inspector": "components/viewer/models/Card.vue:33:11" }; const _hoisted_5 = { key: 0, class: "text-body-3xs text-foreground", "data-v-inspector": "components/viewer/models/Card.vue:39:11" }; const _hoisted_6 = { key: 1, class: "text-body-3xs text-primary truncate", "data-v-inspector": "components/viewer/models/Card.vue:42:11" }; const _hoisted_7 = { class: "flex items-center gap-1 text-body-3xs text-foreground-2 min-w-0", "data-v-inspector": "components/viewer/models/Card.vue:45:11" }; const _hoisted_8 = { key: 0, class: "shrink-0 flex items-center gap-1", "data-v-inspector": "components/viewer/models/Card.vue:46:13" }; const _hoisted_9 = { "data-v-inspector": "components/viewer/models/Card.vue:50:15" }; const _hoisted_10 = { class: "truncate", "data-v-inspector": "components/viewer/models/Card.vue:55:13" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ViewerExpansionTriangle = __nuxt_component_0; const _component_NuxtImg = __nuxt_component_1; const _component_FormButton = __nuxt_component_2; const _component_LayoutMenu = __nuxt_component_3; const _component_ViewerVisibilityButton = __nuxt_component_4; const _component_ViewerIsolateButton = __nuxt_component_5; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock("div", _hoisted_1, [ _createElementVNode("div", _hoisted_2, [ _createCommentVNode(" Model Header "), _createElementVNode( "div", { class: _normalizeClass(["group flex items-center h-16 select-none cursor-pointer hover:bg-highlight-1 border-b border-outline-3", $setup.isHidden ? "opacity-50" : ""]), onMouseenter: $setup.highlightObject, onMouseleave: $setup.unhighlightObject, onFocusin: $setup.highlightObject, onFocusout: $setup.unhighlightObject, onClick: $setup.handleClick, onDblclick: $setup.zoomToModel, onKeydown: _withKeys($setup.handleClick, ["enter"]), "data-v-inspector": "components/viewer/models/Card.vue:6:7" }, [ _createVNode(_component_ViewerExpansionTriangle, { class: "h-8", "is-expanded": $props.isExpanded, onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("toggle-expansion")), "data-v-inspector": "components/viewer/models/Card.vue:17:9" }, null, 8, ["is-expanded"]), _createElementVNode( "div", { class: _normalizeClass(["h-12 w-12 rounded-md overflow-hidden border border-outline-3 mr-3 shrink-0", { grayscale: $setup.shouldShowDimmed }]), "data-v-inspector": "components/viewer/models/Card.vue:22:9" }, [ $setup.loadedVersion?.previewUrl ? (_openBlock(), _createBlock(_component_NuxtImg, { key: 0, src: $setup.loadedVersion.previewUrl, class: "w-full h-full object-cover", "data-v-inspector": "components/viewer/models/Card.vue:26:11" }, null, 8, ["src"])) : _createCommentVNode("v-if", true) ], 2 /* CLASS */ ), _createElementVNode("div", _hoisted_3, [ _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_4, [ _createTextVNode( _toDisplayString($setup.modelName.header), 1 /* TEXT */ ) ])), [ [_directive_tippy, $setup.modelName.subheader ? $props.model.name : null] ]), $setup.isLatest ? (_openBlock(), _createElementBlock("div", _hoisted_5, " Latest version ")) : (_openBlock(), _createElementBlock("div", _hoisted_6, " Viewing old version ")), _createElementVNode("div", _hoisted_7, [ $setup.loadedVersion?.sourceApplication ? (_openBlock(), _createElementBlock("div", _hoisted_8, [ _createElementVNode( "span", _hoisted_9, _toDisplayString($setup.loadedVersion.sourceApplication), 1 /* TEXT */ ), _cache[4] || (_cache[4] = _createElementVNode( "span", { class: "shrink-0", "data-v-inspector": "components/viewer/models/Card.vue:53:15" }, "ยท", -1 /* CACHED */ )) ])) : _createCommentVNode("v-if", true), _createElementVNode( "span", _hoisted_10, _toDisplayString($setup.createdAtFormatted.relative), 1 /* TEXT */ ) ]) ]), _createElementVNode( "div", { class: _normalizeClass([ "flex items-center ml-auto mr-2 w-0 group-hover:w-auto opacity-0 group-hover:opacity-100 transition", $setup.showActionsMenu || $setup.isIsolated || $setup.isHidden ? "!w-auto !opacity-100" : "" ]), "data-v-inspector": "components/viewer/models/Card.vue:60:9" }, [ _createVNode(_component_LayoutMenu, { open: $setup.showActionsMenu, "onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.showActionsMenu = $event), items: $setup.actionsItems, "mount-menu-on-body": "", onClick: _cache[3] || (_cache[3] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/viewer/models/Card.vue:66:11" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { "hide-text": "", class: _normalizeClass({ "!bg-highlight-3": $setup.showActionsMenu }), color: "subtle", "icon-left": $setup.Ellipsis, size: "sm", onClick: _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = !$setup.showActionsMenu), "data-v-inspector": "components/viewer/models/Card.vue:73:13" }, null, 8, ["class", "icon-left"]) ]), _: 1 /* STABLE */ }, 8, ["open", "items"]), _createVNode(_component_ViewerVisibilityButton, { "is-hidden": $setup.isHidden, "force-visible": $setup.showActionsMenu, onClick: $setup.hideOrShowObject, "data-v-inspector": "components/viewer/models/Card.vue:84:11" }, null, 8, ["is-hidden", "force-visible"]), _createVNode(_component_ViewerIsolateButton, { "is-isolated": $setup.isIsolated, "force-visible": $setup.showActionsMenu, onClick: $setup.isolateOrUnisolateObject, "data-v-inspector": "components/viewer/models/Card.vue:89:11" }, null, 8, ["is-isolated", "force-visible"]) ], 2 /* CLASS */ ) ], 34 /* CLASS, NEED_HYDRATION */ ) ]) ]); } _sfc_main.__hmrId = "6027bc65"; 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/viewer/models/Card.vue"]]); //# sourceMappingURL=data:application/json;base64,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QjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJDYXJkLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImJnLWZvdW5kYXRpb24gcmVsYXRpdmVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjM6M1wiPlxyXG4gICAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjQ6NVwiPlxyXG4gICAgICA8IS0tIE1vZGVsIEhlYWRlciAtLT5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZ3JvdXAgZmxleCBpdGVtcy1jZW50ZXIgaC0xNiBzZWxlY3Qtbm9uZSBjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy1oaWdobGlnaHQtMSBib3JkZXItYiBib3JkZXItb3V0bGluZS0zXCJcclxuICAgICAgICA6Y2xhc3M9XCJpc0hpZGRlbiA/ICdvcGFjaXR5LTUwJyA6ICcnXCJcclxuICAgICAgICBAbW91c2VlbnRlcj1cImhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgICAgQG1vdXNlbGVhdmU9XCJ1bmhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgICAgQGZvY3VzaW49XCJoaWdobGlnaHRPYmplY3RcIlxyXG4gICAgICAgIEBmb2N1c291dD1cInVuaGlnaGxpZ2h0T2JqZWN0XCJcclxuICAgICAgICBAY2xpY2s9XCJoYW5kbGVDbGlja1wiXHJcbiAgICAgICAgQGRibGNsaWNrPVwiem9vbVRvTW9kZWxcIlxyXG4gICAgICAgIEBrZXlkb3duLmVudGVyPVwiaGFuZGxlQ2xpY2tcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjY6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Vmlld2VyRXhwYW5zaW9uVHJpYW5nbGVcclxuICAgICAgICAgIGNsYXNzPVwiaC04XCJcclxuICAgICAgICAgIDppcy1leHBhbmRlZD1cImlzRXhwYW5kZWRcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiZW1pdCgndG9nZ2xlLWV4cGFuc2lvbicpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZToxNzo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiaC0xMiB3LTEyIHJvdW5kZWQtbWQgb3ZlcmZsb3ctaGlkZGVuIGJvcmRlciBib3JkZXItb3V0bGluZS0zIG1yLTMgc2hyaW5rLTBcIlxyXG4gICAgICAgICAgOmNsYXNzPVwieyBncmF5c2NhbGU6IHNob3VsZFNob3dEaW1tZWQgfVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6MjI6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPE51eHRJbWdcclxuICAgICAgICAgICAgdi1pZj1cImxvYWRlZFZlcnNpb24/LnByZXZpZXdVcmxcIlxyXG4gICAgICAgICAgICA6c3JjPVwibG9hZGVkVmVyc2lvbi5wcmV2aWV3VXJsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6MjY6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBtaW4tdy0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTozMjo5XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJtb2RlbE5hbWUuc3ViaGVhZGVyID8gbW9kZWwubmFtZSA6IG51bGxcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0yeHMgZm9udC1tZWRpdW0gdHJ1bmNhdGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjMzOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgbW9kZWxOYW1lLmhlYWRlciB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IHYtaWY9XCJpc0xhdGVzdFwiIGNsYXNzPVwidGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjM5OjExXCI+XHJcbiAgICAgICAgICAgIExhdGVzdCB2ZXJzaW9uXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwidGV4dC1ib2R5LTN4cyB0ZXh0LXByaW1hcnkgdHJ1bmNhdGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjQyOjExXCI+XHJcbiAgICAgICAgICAgIFZpZXdpbmcgb2xkIHZlcnNpb25cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHRleHQtYm9keS0zeHMgdGV4dC1mb3JlZ3JvdW5kLTIgbWluLXctMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NDU6MTFcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIHYtaWY9XCJsb2FkZWRWZXJzaW9uPy5zb3VyY2VBcHBsaWNhdGlvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NDY6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo1MDoxNVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbG9hZGVkVmVyc2lvbi5zb3VyY2VBcHBsaWNhdGlvbiB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNocmluay0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo1MzoxNVwiPsK3PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NTU6MTNcIj5cclxuICAgICAgICAgICAgICB7eyBjcmVhdGVkQXRGb3JtYXR0ZWQucmVsYXRpdmUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBtbC1hdXRvIG1yLTIgdy0wIGdyb3VwLWhvdmVyOnctYXV0byBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvblwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJcclxuICAgICAgICAgICAgc2hvd0FjdGlvbnNNZW51IHx8IGlzSXNvbGF0ZWQgfHwgaXNIaWRkZW4gPyAnIXctYXV0byAhb3BhY2l0eS0xMDAnIDogJydcclxuICAgICAgICAgIFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NjA6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0FjdGlvbnNNZW51XCJcclxuICAgICAgICAgICAgOml0ZW1zPVwiYWN0aW9uc0l0ZW1zXCJcclxuICAgICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgICAgICAgQGNob3Nlbj1cIm9uQWN0aW9uQ2hvc2VuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo2NjoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgOmNsYXNzPVwie1xyXG4gICAgICAgICAgICAgICAgJyFiZy1oaWdobGlnaHQtMyc6IHNob3dBY3Rpb25zTWVudVxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRWxsaXBzaXNcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2hvd0FjdGlvbnNNZW51ID0gIXNob3dBY3Rpb25zTWVudVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NzM6MTNcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9MYXlvdXRNZW51PlxyXG4gICAgICAgICAgPFZpZXdlclZpc2liaWxpdHlCdXR0b25cclxuICAgICAgICAgICAgOmlzLWhpZGRlbj1cImlzSGlkZGVuXCJcclxuICAgICAgICAgICAgOmZvcmNlLXZpc2libGU9XCJzaG93QWN0aW9uc01lbnVcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCJoaWRlT3JTaG93T2JqZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo4NDoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPFZpZXdlcklzb2xhdGVCdXR0b25cclxuICAgICAgICAgICAgOmlzLWlzb2xhdGVkPVwiaXNJc29sYXRlZFwiXHJcbiAgICAgICAgICAgIDpmb3JjZS12aXNpYmxlPVwic2hvd0FjdGlvbnNNZW51XCJcclxuICAgICAgICAgICAgQGNsaWNrPVwiaXNvbGF0ZU9yVW5pc29sYXRlT2JqZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo4OToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgdHlwZSB7IFZpZXdlckxvYWRlZFJlc291cmNlc1F1ZXJ5IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgR2V0IH0gZnJvbSAndHlwZS1mZXN0J1xyXG5pbXBvcnQgdHlwZSB7IExheW91dE1lbnVJdGVtIH0gZnJvbSAnfn4vbGliL2xheW91dC9oZWxwZXJzL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7XHJcbiAgdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzLFxyXG4gIHVzZUNhbWVyYVV0aWxpdGllcyxcclxuICB1c2VTZWxlY3Rpb25VdGlsaXRpZXNcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJVdGlsaXRpZXMgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2ZpbHRlcmluZydcclxuaW1wb3J0IHtcclxuICB1c2VJbmplY3RlZFZpZXdlclN0YXRlLFxyXG4gIHVzZUluamVjdGVkVmlld2VyUmVxdWVzdGVkUmVzb3VyY2VzLFxyXG4gIHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHsgY29udGFpbnNBbGwgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvdXRpbHMnXHJcbmltcG9ydCB7IGdldFRhcmdldE9iamVjdElkcyB9IGZyb20gJ35+L2xpYi9vYmplY3Qtc2lkZWJhci9oZWxwZXJzJ1xyXG5pbXBvcnQgeyB1c2VMb2FkTGF0ZXN0VmVyc2lvbiB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvcmVzb3VyY2VzJ1xyXG5pbXBvcnQgeyBTcGVja2xlVmlld2VyIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL21wJ1xyXG5pbXBvcnQgeyB1c2VDb3B5TW9kZWxMaW5rIH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL21vZGVsTWFuYWdlbWVudCdcclxuaW1wb3J0IHsgRWxsaXBzaXMgfSBmcm9tICdsdWNpZGUtdnVlLW5leHQnXHJcblxyXG50eXBlIE1vZGVsSXRlbSA9IE5vbk51bGxhYmxlPEdldDxWaWV3ZXJMb2FkZWRSZXNvdXJjZXNRdWVyeSwgJ3Byb2plY3QubW9kZWxzLml0ZW1zWzBdJz4+XHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAnc2hvdy12ZXJzaW9ucycsIG1vZGVsSWQ6IHN0cmluZyk6IHZvaWRcclxuICAoZTogJ3Nob3ctZGlmZicsIG1vZGVsSWQ6IHN0cmluZywgdmVyc2lvbkE6IHN0cmluZywgdmVyc2lvbkI6IHN0cmluZyk6IHZvaWRcclxuICAoZTogJ3RvZ2dsZS1leHBhbnNpb24nKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtb2RlbDogTW9kZWxJdGVtXHJcbiAgdmVyc2lvbklkOiBzdHJpbmdcclxuICBpc0V4cGFuZGVkPzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCB7IGhpZ2hsaWdodE9iamVjdHMsIHVuaGlnaGxpZ2h0T2JqZWN0cyB9ID0gdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzKClcclxuY29uc3QgeyBoaWRlT2JqZWN0cywgc2hvd09iamVjdHMsIGlzb2xhdGVPYmplY3RzLCB1bklzb2xhdGVPYmplY3RzIH0gPVxyXG4gIHVzZUZpbHRlclV0aWxpdGllcygpXHJcbmNvbnN0IHsgem9vbSB9ID0gdXNlQ2FtZXJhVXRpbGl0aWVzKClcclxuY29uc3QgeyBpdGVtcyB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJSZXF1ZXN0ZWRSZXNvdXJjZXMoKVxyXG5jb25zdCB7IHJlc291cmNlSXRlbXMgfSA9IHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzKClcclxuY29uc3QgeyBhZGRUb1NlbGVjdGlvbkZyb21PYmplY3RJZHMgfSA9IHVzZVNlbGVjdGlvblV0aWxpdGllcygpXHJcblxyXG5jb25zdCB7XHJcbiAgdmlld2VyOiB7XHJcbiAgICBtZXRhZGF0YTogeyBmaWx0ZXJpbmdTdGF0ZSB9XHJcbiAgfSxcclxuICB1aTogeyBmaWx0ZXJzIH1cclxufSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3QgY29weU1vZGVsTGluayA9IHVzZUNvcHlNb2RlbExpbmsoKVxyXG5jb25zdCB7IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZSwgZm9ybWF0dGVkRnVsbERhdGUgfSA9IHVzZURhdGVGb3JtYXR0ZXJzKClcclxuXHJcbmNvbnN0IHJvdXRlID0gdXNlUm91dGUoKVxyXG5jb25zdCByZXNvdXJjZUlkU3RyaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IHJlc291cmNlUGFyYW0gPSByb3V0ZS5wYXJhbXMubW9kZWxJZFxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc291cmNlUGFyYW0pID8gcmVzb3VyY2VQYXJhbS5qb2luKCcvJykgOiByZXNvdXJjZVBhcmFtXHJcbn0pXHJcblxyXG5jb25zdCB7XHJcbiAgcmVzb3VyY2VzOiB7XHJcbiAgICByZXNwb25zZTogeyBwcm9qZWN0IH1cclxuICB9XHJcbn0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbmNvbnN0IHsgbG9hZDogbG9hZExhdGVzdFZlcnNpb24gfSA9IHVzZUxvYWRMYXRlc3RWZXJzaW9uKHtcclxuICBwcm9qZWN0OiBjb21wdXRlZCgoKSA9PiBwcm9qZWN0LnZhbHVlKSxcclxuICByZXNvdXJjZUlkU3RyaW5nOiBjb21wdXRlZCgoKSA9PiByZXNvdXJjZUlkU3RyaW5nLnZhbHVlIHx8ICcnKVxyXG59KVxyXG5cclxuY29uc3Qgc2hvd0FjdGlvbnNNZW51ID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgcmVtb3ZlRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IGl0ZW1zLnZhbHVlLmxlbmd0aCA+IDEpXHJcbmNvbnN0IGFjdGlvbnNJdGVtcyA9IGNvbXB1dGVkPExheW91dE1lbnVJdGVtW11bXT4oKCkgPT4gW1xyXG4gIFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdDb3B5IGxpbmsgdG8gbW9kZWwnLFxyXG4gICAgICBpZDogJ2NvcHktbGluay10by1tb2RlbCdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnU2hvdyB2ZXJzaW9uIGhpc3RvcnknLFxyXG4gICAgICBpZDogJ3Nob3ctdmVyc2lvbi1oaXN0b3J5J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdMb2FkIGxhdGVzdCB2ZXJzaW9uJyxcclxuICAgICAgaWQ6ICdsb2FkLWxhdGVzdC12ZXJzaW9uJyxcclxuICAgICAgZGlzYWJsZWQ6IGlzTGF0ZXN0LnZhbHVlLFxyXG4gICAgICBkaXNhYmxlZFRvb2x0aXA6ICdBbHJlYWR5IG9uIHRoZSBsYXRlc3QgdmVyc2lvbidcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnU2hvdyB2ZXJzaW9uIGNoYW5nZXMnLFxyXG4gICAgICBpZDogJ3Nob3ctdmVyc2lvbi1jaGFuZ2VzJyxcclxuICAgICAgZGlzYWJsZWQ6IGlzTGF0ZXN0LnZhbHVlLFxyXG4gICAgICBkaXNhYmxlZFRvb2x0aXA6ICdObyBjaGFuZ2VzIHRvIHNob3cgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbidcclxuICAgIH1cclxuICBdLFxyXG4gIFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdSZW1vdmUgbW9kZWwnLFxyXG4gICAgICBpZDogJ3JlbW92ZS1tb2RlbCcsXHJcbiAgICAgIGRpc2FibGVkOiAhcmVtb3ZlRW5hYmxlZC52YWx1ZSxcclxuICAgICAgZGlzYWJsZWRUb29sdGlwOiAnWW91IGNhbm5vdCByZW1vdmUgdGhlIGxhc3QgbW9kZWwnXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3QgdmVyc2lvbnMgPSBjb21wdXRlZCgoKSA9PiBbXHJcbiAgLi4ucHJvcHMubW9kZWwubG9hZGVkVmVyc2lvbi5pdGVtcyxcclxuICAuLi5wcm9wcy5tb2RlbC52ZXJzaW9ucy5pdGVtc1xyXG5dKVxyXG5cclxuY29uc3QgbG9hZGVkVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+XHJcbiAgdmVyc2lvbnMudmFsdWUuZmluZCgodikgPT4gdi5pZCA9PT0gcHJvcHMudmVyc2lvbklkKVxyXG4pXHJcblxyXG5jb25zdCBjcmVhdGVkQXQgPSBjb21wdXRlZCgoKSA9PiBsb2FkZWRWZXJzaW9uLnZhbHVlPy5jcmVhdGVkQXQpXHJcbmNvbnN0IGNyZWF0ZWRBdEZvcm1hdHRlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgZnVsbDogZm9ybWF0dGVkRnVsbERhdGUoY3JlYXRlZEF0LnZhbHVlKSxcclxuICAgIHJlbGF0aXZlOiBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUoY3JlYXRlZEF0LnZhbHVlLCB7IGNhcGl0YWxpemU6IHRydWUgfSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBsYXRlc3RWZXJzaW9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiB2ZXJzaW9ucy52YWx1ZVxyXG4gICAgLnNsaWNlKClcclxuICAgIC5zb3J0KChhLCBiKSA9PiAoZGF5anMoYS5jcmVhdGVkQXQpLmlzQmVmb3JlKGRheWpzKGIuY3JlYXRlZEF0KSkgPyAxIDogLTEpKVswXVxyXG59KVxyXG5cclxuY29uc3QgaXNMYXRlc3QgPSBjb21wdXRlZCgoKSA9PiBsb2FkZWRWZXJzaW9uLnZhbHVlPy5pZCA9PT0gbGF0ZXN0VmVyc2lvbi52YWx1ZS5pZClcclxuXHJcbmNvbnN0IG1vZGVsTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBwYXJ0cyA9IHByb3BzLm1vZGVsLm5hbWUuc3BsaXQoJy8nKVxyXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XHJcbiAgICBjb25zdCBuYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cclxuICAgIHBhcnRzLnBvcCgpXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdWJoZWFkZXI6IHBhcnRzLmpvaW4oJy8nKSxcclxuICAgICAgaGVhZGVyOiBuYW1lXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1YmhlYWRlcjogbnVsbCxcclxuICAgICAgaGVhZGVyOiBwcm9wcy5tb2RlbC5uYW1lXHJcbiAgICB9XHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgbW9kZWxPYmplY3RJZHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcmVmT2JqZWN0ID0gcHJvcHMubW9kZWwubG9hZGVkVmVyc2lvbi5pdGVtc1swXT8ucmVmZXJlbmNlZE9iamVjdFxyXG4gIHJldHVybiByZWZPYmplY3QgPyBnZXRUYXJnZXRPYmplY3RJZHMoeyBpZDogcmVmT2JqZWN0IH0pIDogW11cclxufSlcclxuXHJcbmNvbnN0IGhpZGRlbk9iamVjdHMgPSBjb21wdXRlZCgoKSA9PiBmaWx0ZXJpbmdTdGF0ZS52YWx1ZT8uaGlkZGVuT2JqZWN0cylcclxuLy8gVXNlIHNpbmdsZXRvbiBpc29sYXRlZE9iamVjdHNTZXQgZnJvbSB2aWV3ZXIgc3RhdGVcclxuY29uc3QgeyBpc29sYXRlZE9iamVjdHNTZXQgfSA9IGZpbHRlcnNcclxuXHJcbmNvbnN0IGlzSGlkZGVuID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmICghaGlkZGVuT2JqZWN0cy52YWx1ZSB8fCBtb2RlbE9iamVjdElkcy52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZVxyXG4gIHJldHVybiBjb250YWluc0FsbChtb2RlbE9iamVjdElkcy52YWx1ZSwgaGlkZGVuT2JqZWN0cy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGlzSXNvbGF0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFpc29sYXRlZE9iamVjdHNTZXQudmFsdWUgfHwgbW9kZWxPYmplY3RJZHMudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcclxuICBjb25zdCBpc29sYXRlZE9iamVjdHNBcnJheSA9IEFycmF5LmZyb20oaXNvbGF0ZWRPYmplY3RzU2V0LnZhbHVlKVxyXG4gIHJldHVybiBjb250YWluc0FsbChtb2RlbE9iamVjdElkcy52YWx1ZSwgaXNvbGF0ZWRPYmplY3RzQXJyYXkpXHJcbn0pXHJcblxyXG5jb25zdCBzdGF0ZUhhc0lzb2xhdGVkT2JqZWN0c0luR2VuZXJhbCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZSkgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIGlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZS5zaXplID4gMFxyXG59KVxyXG5cclxuY29uc3QgbW9kZWxDb250YWluc0lzb2xhdGVkT2JqZWN0cyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZSB8fCBpc29sYXRlZE9iamVjdHNTZXQudmFsdWUuc2l6ZSA9PT0gMCkgcmV0dXJuIGZhbHNlXHJcblxyXG4gIHJldHVybiBtb2RlbE9iamVjdElkcy52YWx1ZS5zb21lKChtb2RlbElkKSA9PiBpc29sYXRlZE9iamVjdHNTZXQudmFsdWUhLmhhcyhtb2RlbElkKSlcclxufSlcclxuXHJcbmNvbnN0IHNob3VsZFNob3dEaW1tZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHN0YXRlSGFzSXNvbGF0ZWRPYmplY3RzSW5HZW5lcmFsLnZhbHVlICYmICFtb2RlbENvbnRhaW5zSXNvbGF0ZWRPYmplY3RzLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBoaWRlT3JTaG93T2JqZWN0ID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gIGlmIChtb2RlbE9iamVjdElkcy52YWx1ZS5sZW5ndGggPT09IDApIHJldHVyblxyXG5cclxuICBpZiAoIWlzSGlkZGVuLnZhbHVlKSB7XHJcbiAgICBoaWRlT2JqZWN0cyhtb2RlbE9iamVjdElkcy52YWx1ZSlcclxuICB9IGVsc2Uge1xyXG4gICAgc2hvd09iamVjdHMobW9kZWxPYmplY3RJZHMudmFsdWUpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpc29sYXRlT3JVbmlzb2xhdGVPYmplY3QgPSAoZTogRXZlbnQpID0+IHtcclxuICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgaWYgKG1vZGVsT2JqZWN0SWRzLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuXHJcblxyXG4gIGlmICghaXNJc29sYXRlZC52YWx1ZSkge1xyXG4gICAgaXNvbGF0ZU9iamVjdHMobW9kZWxPYmplY3RJZHMudmFsdWUpXHJcbiAgfSBlbHNlIHtcclxuICAgIHVuSXNvbGF0ZU9iamVjdHMobW9kZWxPYmplY3RJZHMudmFsdWUpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoaWdobGlnaHRPYmplY3QgPSAoKSA9PiB7XHJcbiAgY29uc3QgcmVmT2JqZWN0ID0gcHJvcHMubW9kZWwubG9hZGVkVmVyc2lvbi5pdGVtc1swXT8ucmVmZXJlbmNlZE9iamVjdFxyXG4gIGlmIChyZWZPYmplY3QgJiYgdHlwZW9mIHJlZk9iamVjdCA9PT0gJ3N0cmluZycpIGhpZ2hsaWdodE9iamVjdHMoW3JlZk9iamVjdF0pXHJcbn1cclxuXHJcbmNvbnN0IHVuaGlnaGxpZ2h0T2JqZWN0ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHJlZk9iamVjdCA9IHByb3BzLm1vZGVsLmxvYWRlZFZlcnNpb24uaXRlbXNbMF0/LnJlZmVyZW5jZWRPYmplY3RcclxuICBpZiAocmVmT2JqZWN0ICYmIHR5cGVvZiByZWZPYmplY3QgPT09ICdzdHJpbmcnKSB1bmhpZ2hsaWdodE9iamVjdHMoW3JlZk9iamVjdF0pXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xyXG4gIGlmICghcHJvcHMuaXNFeHBhbmRlZCkge1xyXG4gICAgZW1pdCgndG9nZ2xlLWV4cGFuc2lvbicpXHJcbiAgfSBlbHNlIHtcclxuICAgIGFkZFRvU2VsZWN0aW9uRnJvbU9iamVjdElkcyhtb2RlbE9iamVjdElkcy52YWx1ZSlcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHpvb21Ub01vZGVsID0gKCkgPT4ge1xyXG4gIGlmIChtb2RlbE9iamVjdElkcy52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICB6b29tKG1vZGVsT2JqZWN0SWRzLnZhbHVlKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcmVtb3ZlTW9kZWwgPSBhc3luYyAobW9kZWxJZDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgYnVpbGRlciA9IFNwZWNrbGVWaWV3ZXIuVmlld2VyUm91dGUucmVzb3VyY2VCdWlsZGVyKClcclxuICBmb3IgKGNvbnN0IGxvYWRlZFJlc291cmNlIG9mIHJlc291cmNlSXRlbXMudmFsdWUpIHtcclxuICAgIGlmIChsb2FkZWRSZXNvdXJjZS5tb2RlbElkKSB7XHJcbiAgICAgIGlmIChsb2FkZWRSZXNvdXJjZS5tb2RlbElkICE9PSBtb2RlbElkKSB7XHJcbiAgICAgICAgYnVpbGRlci5hZGRNb2RlbChsb2FkZWRSZXNvdXJjZS5tb2RlbElkLCBsb2FkZWRSZXNvdXJjZS52ZXJzaW9uSWQgfHwgdW5kZWZpbmVkKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAobG9hZGVkUmVzb3VyY2Uub2JqZWN0SWQgIT09IG1vZGVsSWQpXHJcbiAgICAgICAgYnVpbGRlci5hZGRPYmplY3QobG9hZGVkUmVzb3VyY2Uub2JqZWN0SWQpXHJcbiAgICB9XHJcbiAgfVxyXG4gIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywgeyB0eXBlOiAnYWN0aW9uJywgbmFtZTogJ2ZlZGVyYXRpb24nLCBhY3Rpb246ICdyZW1vdmUnIH0pXHJcbiAgYXdhaXQgaXRlbXMudXBkYXRlKGJ1aWxkZXIudG9SZXNvdXJjZXMoKSlcclxufVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSBhc3luYyAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtIH0pID0+IHtcclxuICBjb25zdCB7IGl0ZW0gfSA9IHBhcmFtc1xyXG5cclxuICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgIGNhc2UgJ2NvcHktbGluay10by1tb2RlbCc6XHJcbiAgICAgIGlmIChwcm9qZWN0LnZhbHVlKSB7XHJcbiAgICAgICAgY29weU1vZGVsTGluayh7IG1vZGVsOiB7IHByb2plY3RJZDogcHJvamVjdC52YWx1ZS5pZCwgaWQ6IHByb3BzLm1vZGVsLmlkIH0gfSlcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnbG9hZC1sYXRlc3QtdmVyc2lvbic6XHJcbiAgICAgIGlmICghaXNMYXRlc3QudmFsdWUpIHtcclxuICAgICAgICBsb2FkTGF0ZXN0VmVyc2lvbigpXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3Nob3ctdmVyc2lvbi1oaXN0b3J5JzpcclxuICAgICAgZW1pdCgnc2hvdy12ZXJzaW9ucycsIHByb3BzLm1vZGVsLmlkKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc2hvdy12ZXJzaW9uLWNoYW5nZXMnOlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgbG9hZGVkVmVyc2lvbi52YWx1ZSAmJlxyXG4gICAgICAgIGxhdGVzdFZlcnNpb24udmFsdWUgJiZcclxuICAgICAgICBsb2FkZWRWZXJzaW9uLnZhbHVlLmlkICE9PSBsYXRlc3RWZXJzaW9uLnZhbHVlLmlkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGVtaXQoXHJcbiAgICAgICAgICAnc2hvdy1kaWZmJyxcclxuICAgICAgICAgIHByb3BzLm1vZGVsLmlkLFxyXG4gICAgICAgICAgbG9hZGVkVmVyc2lvbi52YWx1ZS5pZCxcclxuICAgICAgICAgIGxhdGVzdFZlcnNpb24udmFsdWUuaWRcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3JlbW92ZS1tb2RlbCc6XHJcbiAgICAgIGlmIChyZW1vdmVFbmFibGVkLnZhbHVlKSB7XHJcbiAgICAgICAgYXdhaXQgcmVtb3ZlTW9kZWwocHJvcHMubW9kZWwuaWQpXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWUifQ==