@mintplayer/ng-bootstrap 20.5.0 → 20.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-dock.mjs","sources":["../tmp-esm2022/dock/src/lib/components/dock-pane.component.js","../tmp-esm2022/dock/src/lib/web-components/mint-dock-manager.element.js","../tmp-esm2022/dock/src/lib/components/dock-manager.component.js","../tmp-esm2022/dock/src/lib/dock.module.js","../tmp-esm2022/dock/mintplayer-ng-bootstrap-dock.js"],"sourcesContent":["import { Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class BsDockPaneComponent {\n ngAfterContentInit() {\n if (!this.name) {\n throw new Error('bs-dock-pane requires a unique \"name\" input.');\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockPaneComponent, isStandalone: false, selector: \"bs-dock-pane\", inputs: { name: \"name\", title: \"title\" }, viewQueries: [{ propertyName: \"template\", first: true, predicate: TemplateRef, descendants: true, static: true }], ngImport: i0, template: `<ng-template><ng-content></ng-content></ng-template>`, isInline: true }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'bs-dock-pane',\n template: `<ng-template><ng-content></ng-content></ng-template>`,\n standalone: false,\n }]\n }], propDecorators: { name: [{\n type: Input\n }], title: [{\n type: Input\n }], template: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1wYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0YsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQzs4R0FWVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiw2SkFJbkIsV0FBVyw4REFQWixzREFBc0Q7OzJGQUdyRCxtQkFBbUI7a0JBTC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxzREFBc0Q7b0JBQ2hFLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjs4QkFFVSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVvQyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stcGFuZScsXG4gIHRlbXBsYXRlOiBgPG5nLXRlbXBsYXRlPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPmAsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tQYW5lQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpIG5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JzLWRvY2stcGFuZSByZXF1aXJlcyBhIHVuaXF1ZSBcIm5hbWVcIiBpbnB1dC4nKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","const templateHtml = `\n <style>\n :host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n contain: layout paint size style;\n box-sizing: border-box;\n font-family: inherit;\n color: inherit;\n }\n\n .dock-root,\n .dock-docked,\n .dock-split,\n .dock-split__child,\n .dock-stack,\n .dock-stack__content,\n .dock-stack__pane {\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n }\n\n .dock-root {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .dock-docked {\n position: absolute;\n inset: 0;\n display: flex;\n z-index: 0;\n }\n\n .dock-floating-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 5;\n }\n\n .dock-floating {\n position: absolute;\n display: flex;\n flex-direction: column;\n pointer-events: auto;\n border: 1px solid rgba(0, 0, 0, 0.3);\n border-radius: 0.5rem;\n background: rgba(255, 255, 255, 0.92);\n box-shadow: 0 16px 32px rgba(15, 23, 42, 0.25);\n overflow: hidden;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__chrome {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.35rem 0.75rem;\n cursor: move;\n background: linear-gradient(\n to bottom,\n rgba(148, 163, 184, 0.6),\n rgba(148, 163, 184, 0.25)\n );\n border-bottom: 1px solid rgba(148, 163, 184, 0.5);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .dock-floating__title {\n flex: 1 1 auto;\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(30, 41, 59, 0.95);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dock-floating > .dock-stack {\n flex: 1 1 auto;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__resizer {\n position: absolute;\n pointer-events: auto;\n z-index: 2;\n background: rgba(148, 163, 184, 0.25);\n transition: background 120ms ease;\n }\n\n .dock-floating__resizer:hover {\n background: rgba(148, 163, 184, 0.4);\n }\n\n .dock-floating__resizer--top,\n .dock-floating__resizer--bottom {\n left: 0.75rem;\n right: 0.75rem;\n height: 0.5rem;\n }\n\n .dock-floating__resizer--top {\n top: 0;\n cursor: n-resize;\n }\n\n .dock-floating__resizer--bottom {\n bottom: 0;\n cursor: s-resize;\n }\n\n .dock-floating__resizer--left,\n .dock-floating__resizer--right {\n top: 1.75rem;\n bottom: 0.75rem;\n width: 0.5rem;\n }\n\n .dock-floating__resizer--left {\n left: 0;\n cursor: w-resize;\n }\n\n .dock-floating__resizer--right {\n right: 0;\n cursor: e-resize;\n }\n\n .dock-floating__resizer--top-left,\n .dock-floating__resizer--top-right,\n .dock-floating__resizer--bottom-left,\n .dock-floating__resizer--bottom-right {\n width: 0.75rem;\n height: 0.75rem;\n }\n\n .dock-floating__resizer--top-left {\n top: 0;\n left: 0;\n cursor: nw-resize;\n }\n\n .dock-floating__resizer--top-right {\n top: 0;\n right: 0;\n cursor: ne-resize;\n }\n\n .dock-floating__resizer--bottom-left {\n bottom: 0;\n left: 0;\n cursor: sw-resize;\n }\n\n .dock-floating__resizer--bottom-right {\n right: 0;\n bottom: 0;\n cursor: se-resize;\n }\n\n .dock-split {\n display: flex;\n flex: 1 1 0;\n gap: 0.25rem;\n position: relative;\n }\n\n .dock-split[data-direction=\"vertical\"] {\n flex-direction: column;\n }\n\n .dock-split[data-direction=\"horizontal\"] {\n flex-direction: row;\n }\n\n .dock-split__child {\n display: flex;\n flex: 1 1 0;\n position: relative;\n }\n\n .dock-split__divider {\n position: relative;\n flex: 0 0 auto;\n background: rgba(0, 0, 0, 0.08);\n transition: background 120ms ease;\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider {\n width: 0.5rem;\n cursor: col-resize;\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider {\n height: 0.5rem;\n cursor: row-resize;\n }\n\n .dock-split__divider::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border-radius: 999px;\n background: rgba(0, 0, 0, 0.25);\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider::after {\n width: 0.125rem;\n height: 60%;\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider::after {\n width: 60%;\n height: 0.125rem;\n }\n\n .dock-split__divider:hover,\n .dock-split__divider:focus-visible,\n .dock-split__divider[data-resizing='true'] {\n background: rgba(59, 130, 246, 0.35);\n }\n\n .dock-stack {\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.25rem;\n background: rgba(255, 255, 255, 0.75);\n backdrop-filter: blur(4px);\n }\n\n .dock-stack__header {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.25rem;\n background: rgba(0, 0, 0, 0.05);\n border-bottom: 1px solid rgba(0, 0, 0, 0.15);\n }\n\n .dock-tab {\n appearance: none;\n border: none;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: grab;\n transition: background 160ms ease;\n }\n\n .dock-tab:active {\n cursor: grabbing;\n }\n\n .dock-tab:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .dock-tab:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.8);\n outline-offset: 1px;\n }\n\n .dock-tab--active {\n background: rgba(59, 130, 246, 0.15);\n }\n\n .dock-stack__content {\n position: relative;\n flex: 1 1 auto;\n display: flex;\n overflow: hidden;\n }\n\n .dock-stack__pane {\n position: relative;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dock-stack__pane[hidden] {\n display: none !important;\n }\n\n .dock-drop-indicator {\n position: absolute;\n pointer-events: none;\n border: 2px solid rgba(59, 130, 246, 0.9);\n background: rgba(59, 130, 246, 0.2);\n border-radius: 0.25rem;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 100;\n }\n\n .dock-drop-indicator[data-visible='true'] {\n opacity: 1;\n }\n\n .dock-drop-joystick {\n position: absolute;\n display: grid;\n grid-template-columns: repeat(3, min-content);\n grid-template-rows: repeat(3, min-content);\n gap: 0.125rem;\n padding: 0.125rem;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.15);\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);\n pointer-events: none;\n transform: translate(-50%, -50%);\n z-index: 110;\n }\n\n .dock-drop-joystick__spacer {\n width: 1.75rem;\n height: 1.75rem;\n pointer-events: none;\n }\n\n .dock-drop-joystick__button {\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.375rem;\n border: 1px solid rgba(59, 130, 246, 0.4);\n background: rgba(255, 255, 255, 0.9);\n color: rgba(30, 64, 175, 0.9);\n font-size: 0.75rem;\n line-height: 1;\n font-weight: 600;\n pointer-events: auto;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease, border-color 120ms ease;\n }\n\n .dock-drop-joystick__button[data-active='true'],\n .dock-drop-joystick__button:hover,\n .dock-drop-joystick__button:focus-visible {\n background: rgba(59, 130, 246, 0.25);\n border-color: rgba(59, 130, 246, 0.8);\n color: rgba(30, 64, 175, 1);\n }\n\n .dock-drop-joystick__button:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.9);\n outline-offset: 1px;\n }\n\n .dock-drop-joystick__button[data-zone='center'] {\n border-radius: 0.5rem;\n }\n\n ::slotted(*) {\n flex: 1 1 auto;\n display: block;\n min-width: 0;\n min-height: 0;\n }\n </style>\n <div class=\"dock-root\">\n <div class=\"dock-docked\"></div>\n <div class=\"dock-floating-layer\"></div>\n </div>\n <div class=\"dock-drop-indicator\"></div>\n <div class=\"dock-drop-joystick\" data-visible=\"false\">\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"top\"\n aria-label=\"Dock to top\"\n >\n ↑\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"left\"\n aria-label=\"Dock to left\"\n >\n ←\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"center\"\n aria-label=\"Dock to center\"\n >\n •\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"right\"\n aria-label=\"Dock to right\"\n >\n →\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"bottom\"\n aria-label=\"Dock to bottom\"\n >\n ↓\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n </div>\n`;\nlet cachedTemplate = null;\nlet cachedTemplateDocument = null;\nfunction ensureTemplate(documentRef) {\n if (!cachedTemplate || cachedTemplateDocument !== documentRef) {\n cachedTemplate = documentRef.createElement('template');\n cachedTemplate.innerHTML = templateHtml;\n cachedTemplateDocument = documentRef;\n }\n return cachedTemplate;\n}\nexport class MintDockManagerElement extends HTMLElement {\n static { this.documentRef = typeof document !== 'undefined' ? document : null; }\n static configureDocument(documentRef) {\n if (documentRef) {\n MintDockManagerElement.documentRef = documentRef;\n }\n }\n static get observedAttributes() {\n return ['layout'];\n }\n static { this.instanceCounter = 0; }\n constructor() {\n super();\n this.dropJoystickTarget = null;\n this.rootLayout = null;\n this.floatingLayouts = [];\n this.titles = {};\n this.pendingTabDragMetrics = null;\n this.resizeState = null;\n this.dragState = null;\n this.floatingDragState = null;\n this.floatingResizeState = null;\n this.pointerTrackingActive = false;\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n this.pendingDragEndTimeout = null;\n const documentRef = this.resolveDocument();\n this.documentRef = documentRef;\n this.windowRef = this.resolveWindow(documentRef);\n const shadowRoot = this.attachShadow({ mode: 'open' });\n const template = ensureTemplate(documentRef);\n shadowRoot.appendChild(template.content.cloneNode(true));\n const root = shadowRoot.querySelector('.dock-root');\n if (!root) {\n throw new Error('mint-dock-manager template is missing the root element.');\n }\n const docked = shadowRoot.querySelector('.dock-docked');\n if (!docked) {\n throw new Error('mint-dock-manager template is missing the docked surface element.');\n }\n const floatingLayer = shadowRoot.querySelector('.dock-floating-layer');\n if (!floatingLayer) {\n throw new Error('mint-dock-manager template is missing the floating layer element.');\n }\n const indicator = shadowRoot.querySelector('.dock-drop-indicator');\n if (!indicator) {\n throw new Error('mint-dock-manager template is missing the drop indicator element.');\n }\n const joystick = shadowRoot.querySelector('.dock-drop-joystick');\n if (!joystick) {\n throw new Error('mint-dock-manager template is missing the drop joystick element.');\n }\n const joystickButtons = Array.from(joystick.querySelectorAll('.dock-drop-joystick__button[data-zone]'));\n if (joystickButtons.length === 0) {\n throw new Error('mint-dock-manager template is missing drop joystick buttons.');\n }\n this.rootEl = root;\n this.dockedEl = docked;\n this.floatingLayerEl = floatingLayer;\n this.dropIndicator = indicator;\n this.dropJoystick = joystick;\n this.dropJoystickButtons = joystickButtons;\n this.instanceId = `mint-dock-${++MintDockManagerElement.instanceCounter}`;\n this.onPointerMove = this.onPointerMove.bind(this);\n this.onPointerUp = this.onPointerUp.bind(this);\n this.onDragOver = this.onDragOver.bind(this);\n this.onGlobalDragOver = this.onGlobalDragOver.bind(this);\n this.onGlobalDragEnd = this.onGlobalDragEnd.bind(this);\n this.onDrop = this.onDrop.bind(this);\n this.onDragLeave = this.onDragLeave.bind(this);\n this.onDrag = this.onDrag.bind(this);\n this.onDragMouseMove = this.onDragMouseMove.bind(this);\n this.onDragTouchMove = this.onDragTouchMove.bind(this);\n this.onDragMouseUp = this.onDragMouseUp.bind(this);\n this.onDragTouchEnd = this.onDragTouchEnd.bind(this);\n }\n connectedCallback() {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'application');\n }\n // Tag the docked surface with a root path so it can act as\n // a drop target when the main layout is empty.\n this.dockedEl.dataset['path'] = this.formatPath({ type: 'docked', segments: [] });\n this.render();\n this.rootEl.addEventListener('dragover', this.onDragOver);\n this.rootEl.addEventListener('drop', this.onDrop);\n this.rootEl.addEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.addEventListener('dragover', this.onDragOver);\n this.dropJoystick.addEventListener('drop', this.onDrop);\n this.dropJoystick.addEventListener('dragleave', this.onDragLeave);\n // Strengthen zone tracking by reacting to dragenter/dragover directly on the buttons.\n // This avoids relying solely on hit-testing each frame which can be jittery during HTML5 drag.\n this.dropJoystickButtons.forEach((btn) => {\n const handler = (e) => {\n if (!this.dragState)\n return;\n const z = btn.dataset['zone'];\n if (this.isDropZone(z)) {\n this.updateDropJoystickActiveZone(z);\n e.preventDefault();\n }\n };\n btn.addEventListener('dragenter', handler);\n btn.addEventListener('dragover', handler);\n });\n const win = this.windowRef;\n win?.addEventListener('dragover', this.onGlobalDragOver);\n win?.addEventListener('drag', this.onDrag);\n win?.addEventListener('dragend', this.onGlobalDragEnd, true);\n }\n disconnectedCallback() {\n this.rootEl.removeEventListener('dragover', this.onDragOver);\n this.rootEl.removeEventListener('drop', this.onDrop);\n this.rootEl.removeEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.removeEventListener('dragover', this.onDragOver);\n this.dropJoystick.removeEventListener('drop', this.onDrop);\n this.dropJoystick.removeEventListener('dragleave', this.onDragLeave);\n const win = this.windowRef;\n win?.removeEventListener('dragover', this.onGlobalDragOver);\n win?.removeEventListener('drag', this.onDrag);\n win?.removeEventListener('dragend', this.onGlobalDragEnd, true);\n this.stopDragPointerTracking();\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n }\n attributeChangedCallback(name, _oldValue, newValue) {\n if (name === 'layout') {\n this.layout = newValue ? this.parseLayout(newValue) : null;\n }\n }\n get layout() {\n return {\n root: this.cloneLayoutNode(this.rootLayout),\n floating: this.cloneFloatingArray(this.floatingLayouts),\n titles: { ...this.titles },\n };\n }\n set layout(value) {\n const snapshot = this.ensureSnapshot(value);\n this.rootLayout = this.cloneLayoutNode(snapshot.root);\n this.floatingLayouts = this.cloneFloatingArray(snapshot.floating);\n this.titles = snapshot.titles ? { ...snapshot.titles } : {};\n this.render();\n }\n get snapshot() {\n return this.layout;\n }\n toJSON() {\n return this.snapshot;\n }\n resolveDocument() {\n const staticDocument = MintDockManagerElement.documentRef;\n const ownerDocument = this.ownerDocument ?? null;\n const globalDocument = typeof document !== 'undefined' ? document : null;\n const resolvedDocument = staticDocument ?? ownerDocument ?? globalDocument;\n if (!resolvedDocument) {\n throw new Error('mint-dock-manager requires a Document to initialize.');\n }\n if (!MintDockManagerElement.documentRef) {\n MintDockManagerElement.documentRef = resolvedDocument;\n }\n return resolvedDocument;\n }\n resolveWindow(documentRef) {\n if (typeof window !== 'undefined') {\n return window;\n }\n return documentRef.defaultView ?? null;\n }\n parseLayout(value) {\n try {\n const parsed = JSON.parse(value);\n return this.ensureSnapshot(parsed);\n }\n catch (err) {\n console.warn('mint-dock-manager: failed to parse layout attribute', err);\n return null;\n }\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if (value.kind) {\n return { root: value, floating: [], titles: {} };\n }\n const layout = value;\n return {\n root: layout.root ?? null,\n floating: Array.isArray(layout.floating)\n ? layout.floating.map((floating) => this.normalizeFloatingLayout(floating))\n : [],\n titles: layout.titles ? { ...layout.titles } : {},\n };\n }\n render() {\n this.dockedEl.innerHTML = '';\n this.floatingLayerEl.innerHTML = '';\n this.hideDropIndicator();\n if (this.rootLayout) {\n const fragment = this.renderNode(this.rootLayout, []);\n this.dockedEl.appendChild(fragment);\n }\n this.renderFloatingPanes();\n }\n renderNode(node, path, floatingIndex) {\n if (node.kind === 'split') {\n return this.renderSplit(node, path, floatingIndex);\n }\n return this.renderStack(node, path, floatingIndex);\n }\n renderFloatingPanes() {\n this.floatingLayerEl.innerHTML = '';\n this.floatingLayouts.forEach((floating, index) => {\n const wrapper = this.documentRef.createElement('div');\n wrapper.classList.add('dock-floating');\n wrapper.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const { left, top, width, height } = floating.bounds;\n wrapper.style.left = `${left}px`;\n wrapper.style.top = `${top}px`;\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n const zIndex = this.getFloatingPaneZIndex(index);\n wrapper.style.zIndex = String(zIndex);\n const chrome = this.documentRef.createElement('div');\n chrome.classList.add('dock-floating__chrome');\n chrome.addEventListener('pointerdown', (event) => this.beginFloatingDrag(event, index, wrapper, chrome));\n const title = this.documentRef.createElement('div');\n title.classList.add('dock-floating__title');\n title.textContent = this.getFloatingWindowTitle(floating);\n chrome.appendChild(title);\n wrapper.appendChild(chrome);\n if (floating.root) {\n const content = this.renderNode(floating.root, [], index);\n content.classList.add('dock-floating__stack');\n wrapper.appendChild(content);\n }\n else {\n const placeholder = this.documentRef.createElement('div');\n placeholder.classList.add('dock-stack');\n placeholder.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n placeholder.appendChild(empty);\n wrapper.appendChild(placeholder);\n }\n const resizerConfigs = [\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-left'],\n edges: { horizontal: 'left', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top'],\n edges: { horizontal: 'none', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-right'],\n edges: { horizontal: 'right', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--right'],\n edges: { horizontal: 'right', vertical: 'none' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-right'],\n edges: { horizontal: 'right', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom'],\n edges: { horizontal: 'none', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-left'],\n edges: { horizontal: 'left', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--left'],\n edges: { horizontal: 'left', vertical: 'none' },\n },\n ];\n resizerConfigs.forEach(({ classes, edges }) => {\n const resizer = this.documentRef.createElement('div');\n resizer.classList.add(...classes);\n resizer.addEventListener('pointerdown', (event) => this.beginFloatingResize(event, index, wrapper, resizer, edges));\n wrapper.appendChild(resizer);\n });\n this.floatingLayerEl.appendChild(wrapper);\n });\n }\n beginFloatingDrag(event, index, wrapper, handle) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const { left, top } = floating.bounds;\n try {\n handle.setPointerCapture(event.pointerId);\n }\n catch (err) {\n /* no-op: pointer capture may not be supported in all environments */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingDragState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startLeft: left,\n startTop: top,\n wrapper,\n handle,\n };\n this.startPointerTracking();\n }\n beginFloatingResize(event, index, wrapper, handle, edges) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n try {\n handle.setPointerCapture(event.pointerId);\n }\n catch (err) {\n /* pointer capture may not be supported */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingResizeState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startWidth: floating.bounds.width,\n startHeight: floating.bounds.height,\n startLeft: floating.bounds.left,\n startTop: floating.bounds.top,\n wrapper,\n handle,\n edges,\n };\n this.startPointerTracking();\n }\n handleFloatingDragMove(event) {\n const state = this.floatingDragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const newLeft = state.startLeft + deltaX;\n const newTop = state.startTop + deltaY;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n this.updateFloatingDragDropTarget(event);\n }\n endFloatingDrag(pointerId) {\n const state = this.floatingDragState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch (err) {\n /* no-op */\n }\n const dropHandled = state.dropTarget\n ? this.handleFloatingStackDrop(state.index, state.dropTarget.path, state.dropTarget.zone)\n : false;\n this.floatingDragState = null;\n this.hideDropIndicator();\n if (!dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n updateFloatingDragDropTarget(event) {\n const state = this.floatingDragState;\n if (!state) {\n return;\n }\n const stack = this.findStackAtPoint(event.clientX, event.clientY);\n if (!stack) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n if (!path || (path.type === 'floating' && path.index === state.index)) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n // Reset sticky zone when moving to another stack while dragging the\n // floating window so the side doesn't carry over.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const zone = this.computeDropZone(stack, event, this.extractDropZoneFromEvent(event));\n if (zone) {\n state.dropTarget = { path, zone };\n }\n else if (state.dropTarget) {\n delete state.dropTarget;\n }\n this.showDropIndicator(stack, zone);\n }\n handleFloatingResizeMove(event) {\n const state = this.floatingResizeState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const minWidth = 192;\n const minHeight = 128;\n let newWidth = state.startWidth;\n let newHeight = state.startHeight;\n let newLeft = state.startLeft;\n let newTop = state.startTop;\n if (state.edges.horizontal === 'right') {\n newWidth = Math.max(minWidth, state.startWidth + deltaX);\n }\n else if (state.edges.horizontal === 'left') {\n newWidth = Math.max(minWidth, state.startWidth - deltaX);\n newLeft = state.startLeft + (state.startWidth - newWidth);\n }\n if (state.edges.vertical === 'bottom') {\n newHeight = Math.max(minHeight, state.startHeight + deltaY);\n }\n else if (state.edges.vertical === 'top') {\n newHeight = Math.max(minHeight, state.startHeight - deltaY);\n newTop = state.startTop + (state.startHeight - newHeight);\n }\n state.wrapper.style.width = `${newWidth}px`;\n state.wrapper.style.height = `${newHeight}px`;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.width = newWidth;\n floating.bounds.height = newHeight;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n }\n endFloatingResize(pointerId) {\n const state = this.floatingResizeState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch (err) {\n /* no-op */\n }\n this.floatingResizeState = null;\n this.dispatchLayoutChanged();\n }\n getFloatingPaneZIndex(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return 10 + index;\n }\n const base = typeof floating.zIndex === 'number' && Number.isFinite(floating.zIndex)\n ? floating.zIndex\n : 10 + index;\n return base;\n }\n promoteFloatingPane(index, wrapper) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const maxExisting = this.floatingLayouts.reduce((max, layout, idx) => {\n if (!layout) {\n return max;\n }\n const z = idx === index ? Number.NEGATIVE_INFINITY : this.getFloatingPaneZIndex(idx);\n return Math.max(max, z);\n }, 0);\n const nextZ = Math.max(maxExisting + 2, 12);\n floating.zIndex = nextZ;\n wrapper.style.zIndex = String(nextZ);\n }\n getFloatingWrapper(index) {\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n return this.floatingLayerEl.querySelector(selector);\n }\n startPointerTracking() {\n if (this.pointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.addEventListener('pointermove', this.onPointerMove);\n win?.addEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = true;\n }\n stopPointerTrackingIfIdle() {\n if (this.pointerTrackingActive &&\n !this.resizeState &&\n !this.floatingDragState &&\n !this.floatingResizeState) {\n const win = this.windowRef;\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n }\n }\n getFloatingWindowTitle(floating) {\n const fallback = 'Floating Pane';\n if (!floating || !floating.root) {\n return fallback;\n }\n const preferred = floating.activePane ?? this.findFirstPaneName(floating.root);\n if (!preferred) {\n return fallback;\n }\n return this.titles[preferred] ?? preferred ?? fallback;\n }\n updateFloatingWindowTitle(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n const wrapper = this.floatingLayerEl.querySelector(selector);\n if (!wrapper) {\n return;\n }\n const titleEl = wrapper.querySelector('.dock-floating__title');\n if (!titleEl) {\n return;\n }\n titleEl.textContent = this.getFloatingWindowTitle(floating);\n }\n renderSplit(node, path, floatingIndex) {\n const container = this.documentRef.createElement('div');\n container.classList.add('dock-split');\n container.dataset['direction'] = node.direction;\n container.dataset['path'] = path.join('/');\n const sizes = Array.isArray(node.sizes) ? node.sizes : [];\n node.children.forEach((child, index) => {\n const childWrapper = this.documentRef.createElement('div');\n childWrapper.classList.add('dock-split__child');\n childWrapper.dataset['index'] = String(index);\n const size = sizes[index];\n if (typeof size === 'number' && Number.isFinite(size)) {\n childWrapper.style.flex = `${Math.max(size, 0)} 1 0`;\n }\n else {\n childWrapper.style.flex = '1 1 0';\n }\n childWrapper.appendChild(this.renderNode(child, [...path, index], floatingIndex));\n container.appendChild(childWrapper);\n if (index < node.children.length - 1) {\n const divider = this.documentRef.createElement('div');\n divider.classList.add('dock-split__divider');\n divider.setAttribute('role', 'separator');\n divider.tabIndex = 0;\n divider.addEventListener('pointerdown', (event) => this.beginResize(event, container, floatingIndex !== undefined\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] }, index));\n container.appendChild(divider);\n }\n });\n return container;\n }\n renderStack(node, path, floatingIndex) {\n const stack = this.documentRef.createElement('div');\n stack.classList.add('dock-stack');\n const location = typeof floatingIndex === 'number'\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] };\n stack.dataset['path'] = this.formatPath(location);\n const header = this.documentRef.createElement('div');\n header.classList.add('dock-stack__header');\n header.setAttribute('role', 'tablist');\n const content = this.documentRef.createElement('div');\n content.classList.add('dock-stack__content');\n const panes = Array.from(new Set(node.panes));\n if (panes.length === 0) {\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n content.appendChild(empty);\n stack.append(header, content);\n return stack;\n }\n const activePane = panes.includes(node.activePane ?? '')\n ? node.activePane\n : panes[0];\n const baseSlug = path.length ? path.join('-') : 'root';\n const pathSlug = typeof floatingIndex === 'number' ? `f${floatingIndex}-${baseSlug}` : baseSlug;\n panes.forEach((paneName) => {\n const paneSlugRaw = paneName.replace(/[^a-zA-Z0-9_-]/g, '-');\n const paneSlug = paneSlugRaw.length > 0 ? paneSlugRaw : 'pane';\n const tabId = `${this.instanceId}-tab-${pathSlug}-${paneSlug}`;\n const panelId = `${this.instanceId}-panel-${pathSlug}-${paneSlug}`;\n const button = this.documentRef.createElement('button');\n button.type = 'button';\n button.classList.add('dock-tab');\n button.dataset['pane'] = paneName;\n button.id = tabId;\n button.textContent = this.titles[paneName] ?? paneName;\n button.setAttribute('role', 'tab');\n button.setAttribute('aria-controls', panelId);\n if (paneName === activePane) {\n button.classList.add('dock-tab--active');\n }\n button.setAttribute('aria-selected', String(paneName === activePane));\n button.draggable = true;\n button.addEventListener('pointerdown', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.captureTabDragMetrics(event, stackEl ?? null);\n event.stopPropagation();\n });\n button.addEventListener('pointerup', () => this.clearPendingTabDragMetrics());\n button.addEventListener('pointercancel', () => this.clearPendingTabDragMetrics());\n button.addEventListener('dragstart', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.beginPaneDrag(event, this.clonePath(location), paneName, stackEl ?? null);\n });\n button.addEventListener('dragend', () => {\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n });\n button.addEventListener('click', () => {\n this.activatePane(stack, paneName, this.clonePath(location));\n this.dispatchEvent(new CustomEvent('dock-pane-activated', {\n detail: { pane: paneName },\n bubbles: true,\n composed: true,\n }));\n });\n header.appendChild(button);\n const paneHost = this.documentRef.createElement('div');\n paneHost.classList.add('dock-stack__pane');\n paneHost.dataset['pane'] = paneName;\n paneHost.id = panelId;\n paneHost.setAttribute('role', 'tabpanel');\n paneHost.setAttribute('aria-labelledby', tabId);\n if (paneName !== activePane) {\n paneHost.setAttribute('hidden', '');\n }\n const slotEl = this.documentRef.createElement('slot');\n slotEl.name = paneName;\n paneHost.appendChild(slotEl);\n content.appendChild(paneHost);\n });\n stack.dataset['activePane'] = activePane;\n stack.append(header, content);\n return stack;\n }\n beginResize(event, container, path, index) {\n event.preventDefault();\n const divider = event.currentTarget;\n if (!divider) {\n return;\n }\n const orientation = container.dataset['direction'] ?? 'horizontal';\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n const initialSizes = children.map((child) => {\n const rect = child.getBoundingClientRect();\n return orientation === 'horizontal' ? rect.width : rect.height;\n });\n const beforeSize = initialSizes[index];\n const afterSize = initialSizes[index + 1];\n const startPos = orientation === 'horizontal' ? event.clientX : event.clientY;\n divider.setPointerCapture(event.pointerId);\n divider.dataset['resizing'] = 'true';\n this.resizeState = {\n path: this.clonePath(path),\n index,\n pointerId: event.pointerId,\n orientation,\n container,\n divider,\n startPos,\n initialSizes,\n beforeSize,\n afterSize,\n };\n this.startPointerTracking();\n }\n onPointerMove(event) {\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const state = this.resizeState;\n const splitNode = this.resolveSplitNode(state.path);\n if (!splitNode) {\n return;\n }\n const currentPos = state.orientation === 'horizontal' ? event.clientX : event.clientY;\n const delta = currentPos - state.startPos;\n const minSize = 48;\n const pairTotal = state.beforeSize + state.afterSize;\n let newBefore = Math.min(Math.max(state.beforeSize + delta, minSize), pairTotal - minSize);\n let newAfter = pairTotal - newBefore;\n if (!Number.isFinite(newBefore) || !Number.isFinite(newAfter)) {\n return;\n }\n if (newAfter < minSize) {\n newAfter = minSize;\n newBefore = pairTotal - minSize;\n }\n const newSizesPixels = [...state.initialSizes];\n newSizesPixels[state.index] = newBefore;\n newSizesPixels[state.index + 1] = newAfter;\n const total = newSizesPixels.reduce((acc, size) => acc + size, 0);\n const normalized = total > 0 ? newSizesPixels.map((size) => size / total) : [];\n splitNode.sizes = normalized;\n const children = Array.from(state.container.querySelectorAll(':scope > .dock-split__child'));\n normalized.forEach((size, idx) => {\n if (children[idx]) {\n children[idx].style.flex = `${Math.max(size, 0)} 1 0`;\n }\n });\n this.dispatchLayoutChanged();\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.handleFloatingResizeMove(event);\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n console.warn('state', this.floatingDragState);\n this.handleFloatingDragMove(event);\n }\n }\n onPointerUp(event) {\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const divider = this.resizeState.divider;\n divider.dataset['resizing'] = 'false';\n divider.releasePointerCapture(this.resizeState.pointerId);\n this.resizeState = null;\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n this.endFloatingDrag(event.pointerId);\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.endFloatingResize(event.pointerId);\n }\n this.stopPointerTrackingIfIdle();\n }\n captureTabDragMetrics(event, stackEl) {\n if (!stackEl) {\n this.pendingTabDragMetrics = null;\n return;\n }\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) {\n this.pendingTabDragMetrics = null;\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl.getBoundingClientRect();\n const pointerOffsetX = event.clientX - stackRect.left;\n const pointerOffsetY = event.clientY - stackRect.top;\n const left = stackRect.left - hostRect.left;\n const top = stackRect.top - hostRect.top;\n const width = Number.isFinite(stackRect.width) ? stackRect.width : 0;\n const height = Number.isFinite(stackRect.height) ? stackRect.height : 0;\n this.pendingTabDragMetrics = {\n pointerOffsetX,\n pointerOffsetY,\n left,\n top,\n width,\n height,\n };\n }\n clearPendingTabDragMetrics() {\n this.pendingTabDragMetrics = null;\n }\n beginPaneDrag(event, path, pane, stackEl) {\n if (!event.dataTransfer) {\n return;\n }\n // Create a ghost element for the drag image. This prevents the browser from cancelling\n // the drag operation when the original element is removed from the DOM during re-render.\n const ghost = event.currentTarget.cloneNode(true);\n ghost.style.position = 'absolute';\n ghost.style.left = '-9999px';\n ghost.style.top = '-9999px';\n ghost.style.width = `${event.currentTarget.offsetWidth}px`;\n ghost.style.height = `${event.currentTarget.offsetHeight}px`;\n this.shadowRoot?.appendChild(ghost);\n // Use the ghost element as the drag image.\n // The offset is set to where the user's cursor is on the original element.\n event.dataTransfer.setDragImage(ghost, event.offsetX, event.offsetY);\n // The ghost element is no longer needed after the drag image is set.\n // We defer its removal to ensure the browser has captured it.\n setTimeout(() => ghost.remove(), 0);\n const { path: sourcePath, floatingIndex, pointerOffsetX, pointerOffsetY, } = this.preparePaneDragSource(path, pane, stackEl, event);\n // Capture header bounds for detecting when to convert to floating\n const headerEl = stackEl?.querySelector('.dock-stack__header') ?? null;\n const headerRect = headerEl ? headerEl.getBoundingClientRect() : null;\n const headerBounds = headerRect\n ? { left: headerRect.left, top: headerRect.top, right: headerRect.right, bottom: headerRect.bottom }\n : null;\n this.dragState = {\n pane,\n sourcePath: this.clonePath(sourcePath),\n floatingIndex,\n pointerOffsetX,\n pointerOffsetY,\n dropHandled: false,\n sourceStackEl: stackEl,\n sourceHeaderBounds: headerBounds,\n startClientX: Number.isFinite(event.clientX) ? event.clientX : undefined,\n startClientY: Number.isFinite(event.clientY) ? event.clientY : undefined,\n };\n // Prefer the pointer offset relative to the dragged tab to avoid jumps on conversion\n if (Number.isFinite(event.offsetX)) {\n this.dragState.pointerOffsetX = event.offsetX;\n }\n if (Number.isFinite(event.offsetY)) {\n this.dragState.pointerOffsetY = event.offsetY;\n }\n this.updateDraggedFloatingPosition(event);\n this.startDragPointerTracking();\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', pane);\n }\n preparePaneDragSource(path, pane, stackEl, event) {\n const location = this.resolveStackLocation(path);\n if (!location || !location.node.panes.includes(pane)) {\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n const metrics = this.pendingTabDragMetrics;\n const domHasSibling = !!stackEl &&\n Array.from(stackEl.querySelectorAll('.dock-tab')).some((button) => button.dataset['pane'] && button.dataset['pane'] !== pane);\n const hasSiblingInStack = location.node.panes.some((existing) => existing !== pane);\n const floating = location.context === 'floating' ? this.floatingLayouts[location.index] : null;\n const floatingPaneCount = floating && floating.root ? this.countPanesInTree(floating.root) : hasSiblingInStack ? 2 : 1;\n const shouldReuseExistingWindow = location.context === 'floating' &&\n !!floating &&\n !hasSiblingInStack &&\n !domHasSibling &&\n floatingPaneCount <= 1;\n if (shouldReuseExistingWindow) {\n if (floating) {\n floating.activePane = pane;\n this.updateFloatingWindowTitle(location.index);\n const wrapper = this.getFloatingWrapper(location.index);\n if (wrapper) {\n this.promoteFloatingPane(location.index, wrapper);\n }\n const hostRect = this.getBoundingClientRect();\n const pointerOffsetX = metrics &&\n Number.isFinite(metrics.pointerOffsetX) &&\n Number.isFinite(metrics.left) &&\n Number.isFinite(floating.bounds.left)\n ? metrics.pointerOffsetX + (metrics.left - floating.bounds.left)\n : Number.isFinite(event.clientX) && Number.isFinite(floating.bounds.left)\n ? event.clientX - hostRect.left - floating.bounds.left\n : floating.bounds.width / 2;\n const pointerOffsetY = metrics &&\n Number.isFinite(metrics.pointerOffsetY) &&\n Number.isFinite(metrics.top) &&\n Number.isFinite(floating.bounds.top)\n ? metrics.pointerOffsetY + (metrics.top - floating.bounds.top)\n : Number.isFinite(event.clientY) && Number.isFinite(floating.bounds.top)\n ? event.clientY - hostRect.top - floating.bounds.top\n : floating.bounds.height / 2;\n return {\n path,\n floatingIndex: location.index,\n pointerOffsetX,\n pointerOffsetY,\n };\n }\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n // Do not convert to floating yet; allow in-header reordering first.\n // We return placeholder values and will convert once the pointer leaves the tab header.\n const pointerOffsetXVal = metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : 0;\n const pointerOffsetYVal = metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : 0;\n return {\n path,\n floatingIndex: -1,\n pointerOffsetX: pointerOffsetXVal,\n pointerOffsetY: pointerOffsetYVal,\n };\n }\n endPaneDrag() {\n this.clearPendingDragEndTimeout();\n const state = this.dragState;\n this.dragState = null;\n this.hideDropIndicator();\n this.stopDragPointerTracking();\n this.lastDragPointerPosition = null;\n if (state && state.floatingIndex !== null && !state.dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n onDragOver(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n // Keep internal pointer tracking up-to-date.\n this.updateDraggedFloatingPosition(event);\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n // Some browsers intermittently report (0,0) for dragover coordinates.\n // Mirror the robust logic used in onDrop: prefer actual event coordinates\n // when valid, otherwise fall back to the last tracked pointer position.\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? { clientX: this.lastDragPointerPosition.x, clientY: this.lastDragPointerPosition.y }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n if (!stack) {\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n // If the hovered stack changed, clear any sticky zone from the previous\n // target before computing the new zone.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint);\n this.showDropIndicator(stack, zone);\n }\n updateDraggedFloatingPosition(event) {\n if (!this.dragState) {\n return;\n }\n const { clientX, clientY, screenX, screenY } = event;\n const hasValidCoordinates = Number.isFinite(clientX) &&\n Number.isFinite(clientY) &&\n !(clientX === 0 && clientY === 0 && screenX === 0 && screenY === 0);\n if (hasValidCoordinates) {\n this.lastDragPointerPosition = { x: clientX, y: clientY };\n this.updateDraggedFloatingPositionFromPoint(clientX, clientY);\n return;\n }\n if (this.lastDragPointerPosition) {\n const { x, y } = this.lastDragPointerPosition;\n this.updateDraggedFloatingPositionFromPoint(x, y);\n }\n }\n onGlobalDragOver(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onDrag(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onGlobalDragEnd() {\n this.hideDropIndicator();\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n }\n updateDraggedFloatingPositionFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n if (!Number.isFinite(clientX) || !Number.isFinite(clientY)) {\n return;\n }\n // If we are still dragging a tab inside its header, only convert to floating once we leave the header bounds.\n if (this.dragState.floatingIndex !== null && this.dragState.floatingIndex < 0) {\n const b = this.dragState.sourceHeaderBounds;\n const sx = this.dragState.startClientX ?? clientX;\n const sy = this.dragState.startClientY ?? clientY;\n const dist = Math.hypot(clientX - sx, clientY - sy);\n const threshold = 4; // pixels to move before converting\n let insideHeader = false;\n if (b) {\n insideHeader = clientX >= b.left && clientX <= b.right && clientY >= b.top && clientY <= b.bottom;\n }\n if (!insideHeader && dist > threshold) {\n // Convert to floating now using current pointer position\n this.convertPendingTabDragToFloating(clientX, clientY);\n }\n }\n this.updatePaneDragDropTargetFromPoint(clientX, clientY);\n const { floatingIndex, pointerOffsetX, pointerOffsetY } = this.dragState;\n if (floatingIndex === null || floatingIndex < 0) {\n return;\n }\n const floating = this.floatingLayouts[floatingIndex];\n if (!floating) {\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const newLeft = clientX - hostRect.left - pointerOffsetX;\n const newTop = clientY - hostRect.top - pointerOffsetY;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n const wrapper = this.getFloatingWrapper(floatingIndex);\n if (wrapper) {\n wrapper.style.left = `${newLeft}px`;\n wrapper.style.top = `${newTop}px`;\n }\n }\n updatePaneDragDropTargetFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const stack = this.findStackAtPoint(clientX, clientY);\n const path = stack ? this.parsePath(stack.dataset['path']) : null;\n if (!stack || !path) {\n // While actively dragging, avoid hiding the indicator if it is visible.\n // Transient misses from hit-testing are common near the joystick.\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n return;\n }\n // If we moved to a different target stack, reset any sticky zone so\n // the new drop area doesn't inherit the previous side selection.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const zoneHint = this.findDropZoneByPoint(clientX, clientY);\n const zone = this.computeDropZone(stack, { clientX, clientY }, zoneHint);\n this.showDropIndicator(stack, zone);\n }\n startDragPointerTracking() {\n if (this.dragPointerTrackingActive) {\n return;\n }\n this.lastDragPointerPosition = null;\n const win = this.windowRef;\n win?.addEventListener('mousemove', this.onDragMouseMove, true);\n win?.addEventListener('touchmove', this.onDragTouchMove, { passive: false });\n win?.addEventListener('mouseup', this.onDragMouseUp, true);\n win?.addEventListener('touchend', this.onDragTouchEnd, true);\n win?.addEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = true;\n }\n stopDragPointerTracking() {\n if (!this.dragPointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.removeEventListener('mousemove', this.onDragMouseMove, true);\n win?.removeEventListener('touchmove', this.onDragTouchMove);\n win?.removeEventListener('mouseup', this.onDragMouseUp, true);\n win?.removeEventListener('touchend', this.onDragTouchEnd, true);\n win?.removeEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n this.clearPendingDragEndTimeout();\n }\n onDragMouseMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n if (event.buttons === 0) {\n this.scheduleDeferredDragEnd();\n return;\n }\n this.lastDragPointerPosition = { x: event.clientX, y: event.clientY };\n this.updateDraggedFloatingPositionFromPoint(event.clientX, event.clientY);\n }\n onDragTouchMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n const touch = event.touches[0];\n if (!touch) {\n this.scheduleDeferredDragEnd();\n return;\n }\n event.preventDefault();\n this.lastDragPointerPosition = { x: touch.clientX, y: touch.clientY };\n this.updateDraggedFloatingPositionFromPoint(touch.clientX, touch.clientY);\n }\n onDragMouseUp() {\n this.handleDragPointerUpCommon();\n }\n // Convert a currently in-header tab drag into a floating window\n convertPendingTabDragToFloating(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const state = this.dragState;\n if (state.floatingIndex !== null && state.floatingIndex >= 0) {\n return; // already floating\n }\n const location = this.resolveStackLocation(state.sourcePath);\n if (!location) {\n return;\n }\n const pane = state.pane;\n const stackEl = state.sourceStackEl ?? null;\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl?.getBoundingClientRect() ?? null;\n const metrics = this.pendingTabDragMetrics;\n const fallbackWidth = 320;\n const fallbackHeight = 240;\n const width = metrics && Number.isFinite(metrics.width) && metrics.width > 0\n ? metrics.width\n : stackRect && Number.isFinite(stackRect.width)\n ? stackRect.width\n : fallbackWidth;\n const height = metrics && Number.isFinite(metrics.height) && metrics.height > 0\n ? metrics.height\n : stackRect && Number.isFinite(stackRect.height)\n ? stackRect.height\n : fallbackHeight;\n const pointerOffsetX = Number.isFinite(this.dragState?.pointerOffsetX)\n ? this.dragState.pointerOffsetX\n : metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : width / 2;\n const pointerOffsetY = Number.isFinite(this.dragState?.pointerOffsetY)\n ? this.dragState.pointerOffsetY\n : metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : height / 2;\n const pointerLeft = Number.isFinite(clientX)\n ? clientX - hostRect.left - pointerOffsetX\n : 0;\n const pointerTop = Number.isFinite(clientY)\n ? clientY - hostRect.top - pointerOffsetY\n : 0;\n // Remove pane from its current stack and create a new floating entry\n this.removePaneFromLocation(location, pane);\n const floatingStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n const floatingLayout = {\n bounds: {\n left: pointerLeft,\n top: pointerTop,\n width,\n height,\n },\n root: floatingStack,\n activePane: pane,\n };\n this.floatingLayouts.push(floatingLayout);\n const newIndex = this.floatingLayouts.length - 1;\n this.render();\n const wrapper = this.getFloatingWrapper(newIndex);\n if (wrapper) {\n this.promoteFloatingPane(newIndex, wrapper);\n }\n // Update drag state so subsequent moves reposition the floating window\n state.sourcePath = { type: 'floating', index: newIndex, segments: [] };\n state.floatingIndex = newIndex;\n state.pointerOffsetX = pointerOffsetX;\n state.pointerOffsetY = pointerOffsetY;\n this.dispatchLayoutChanged();\n }\n // Compute the intended tab insert index within a header based on pointer X\n computeHeaderInsertIndex(header, clientX) {\n const tabs = Array.from(header.querySelectorAll('.dock-tab'));\n if (tabs.length === 0) {\n return 0;\n }\n for (let i = 0; i < tabs.length; i += 1) {\n const rect = tabs[i].getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n if (clientX < mid) {\n return i;\n }\n }\n return tabs.length; // insert at end\n }\n reorderPaneInLocationAtIndex(location, pane, targetIndex) {\n const panes = location.node.panes;\n const currentIndex = panes.indexOf(pane);\n if (currentIndex === -1) {\n return;\n }\n const clampedTarget = Math.max(0, Math.min(targetIndex, panes.length - 1));\n if (clampedTarget === currentIndex) {\n return;\n }\n panes.splice(currentIndex, 1);\n panes.splice(clampedTarget, 0, pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n onDragTouchEnd() {\n this.handleDragPointerUpCommon();\n }\n clearPendingDragEndTimeout() {\n if (this.pendingDragEndTimeout !== null) {\n const win = this.windowRef;\n if (win && typeof this.pendingDragEndTimeout === 'number') {\n win.clearTimeout(this.pendingDragEndTimeout);\n }\n else {\n globalThis.clearTimeout(this.pendingDragEndTimeout);\n }\n this.pendingDragEndTimeout = null;\n }\n }\n scheduleDeferredDragEnd() {\n if (this.pendingDragEndTimeout !== null) {\n return;\n }\n const completeDrag = () => {\n this.pendingDragEndTimeout = null;\n this.hideDropIndicator();\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n };\n const win = this.windowRef;\n this.pendingDragEndTimeout = win\n ? win.setTimeout(completeDrag, 0)\n : setTimeout(completeDrag, 0);\n }\n onDrop(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? {\n clientX: this.lastDragPointerPosition.x,\n clientY: this.lastDragPointerPosition.y,\n }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n if (!stack) {\n this.hideDropIndicator();\n this.endPaneDrag();\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n // Allow reordering within the same stack header without selecting a zone\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath)) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const x = (point ? point.clientX : event.clientX);\n if (Number.isFinite(x)) {\n const location = this.resolveStackLocation(path);\n if (location) {\n const idx = this.computeHeaderInsertIndex(header, x);\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n this.dragState.dropHandled = true;\n this.endPaneDrag();\n return;\n }\n }\n }\n }\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint);\n if (!zone) {\n this.hideDropIndicator();\n this.endPaneDrag();\n return;\n }\n this.handleDrop(path, zone);\n this.endPaneDrag();\n }\n onDragLeave(event) {\n const related = event.relatedTarget;\n // During active drags, browsers can emit spurious dragleave with null\n // relatedTarget while the pointer is still over the joystick/buttons.\n // Be conservative: if we can resolve a stack/joystick at the last known\n // pointer position, don’t hide (prevents flicker of active state).\n if (this.dragState) {\n const pos = (Number.isFinite(event.clientX) && Number.isFinite(event.clientY))\n ? { x: event.clientX, y: event.clientY }\n : this.lastDragPointerPosition;\n if (pos) {\n const stackAtPoint = this.findStackAtPoint(pos.x, pos.y);\n if (stackAtPoint) {\n return; // still inside our drop area; ignore this dragleave\n }\n }\n }\n if (!related) {\n this.hideDropIndicator();\n return;\n }\n const rootContains = this.rootEl.contains(related);\n const joystickContains = this.dropJoystick.contains(related);\n if (!rootContains && !joystickContains) {\n this.hideDropIndicator();\n }\n }\n handleDrop(targetPath, zone) {\n if (!this.dragState || !targetPath) {\n return;\n }\n const { pane, sourcePath } = this.dragState;\n const source = this.resolveStackLocation(sourcePath);\n const target = this.resolveStackLocation(targetPath);\n // Special case: allow dropping onto an empty main dock area (no root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n if (!source) {\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n const newRoot = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n this.rootLayout = newRoot;\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n if (!source || !target) {\n return;\n }\n if (zone === 'center' && this.pathsEqual(sourcePath, targetPath)) {\n if (!source.node.panes.includes(pane)) {\n return;\n }\n this.reorderPaneInLocation(source, pane);\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n if (zone === 'center') {\n this.addPaneToLocation(target, pane);\n this.setActivePaneForLocation(target, pane);\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const newStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n if (target.context === 'docked') {\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, newStack, zone);\n }\n else {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n return;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, newStack, zone);\n floating.activePane = pane;\n }\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n }\n handleFloatingStackDrop(sourceIndex, targetPath, zone) {\n const source = this.floatingLayouts[sourceIndex];\n if (!source || !source.root) {\n return false;\n }\n const target = this.resolveStackLocation(targetPath);\n // Allow dropping an entire floating stack onto an empty main dock area\n // (no existing root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n this.rootLayout = this.cloneLayoutNode(source.root);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (!target) {\n return false;\n }\n if (target.context === 'floating' && target.index === sourceIndex) {\n return false;\n }\n if (zone === 'center') {\n const panes = this.collectPaneNames(source.root);\n if (panes.length === 0) {\n return false;\n }\n panes.forEach((pane) => {\n this.addPaneToLocation(target, pane);\n });\n const activePane = source.activePane && panes.includes(source.activePane)\n ? source.activePane\n : this.findFirstPaneName(source.root) ?? panes[0];\n if (activePane) {\n this.setActivePaneForLocation(target, activePane);\n }\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (target.context === 'floating') {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n return false;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, source.root, zone);\n floating.activePane = source.activePane ?? this.findFirstPaneName(source.root) ?? undefined;\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, source.root, zone);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n insertWeight(sizes, index, totalChildren) {\n const existingCount = totalChildren - 1;\n const normalized = this.normalizeSizesArray(sizes, existingCount);\n const newWeight = 1 / totalChildren;\n const remaining = 1 - newWeight;\n const result = [];\n for (let i = 0; i < totalChildren; i += 1) {\n if (i === index) {\n result.push(newWeight);\n }\n else {\n const sourceIndex = i < index ? i : i - 1;\n result.push(normalized[sourceIndex] * remaining);\n }\n }\n return result;\n }\n removePaneFromStack(stack, pane, skipCleanup = false) {\n stack.panes = stack.panes.filter((p) => p !== pane);\n if (!stack.panes.includes(stack.activePane ?? '')) {\n if (stack.panes.length > 0) {\n stack.activePane = stack.panes[0];\n }\n else {\n delete stack.activePane;\n }\n }\n if (stack.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, stack);\n return true;\n }\n findParentSplit(node, child) {\n if (!node || node === child) {\n return null;\n }\n if (node.kind !== 'split') {\n return null;\n }\n const index = node.children.indexOf(child);\n if (index !== -1) {\n return { parent: node, index };\n }\n for (let i = 0; i < node.children.length; i += 1) {\n const result = this.findParentSplit(node.children[i], child);\n if (result) {\n return result;\n }\n }\n return null;\n }\n computeDropZone(stack, point, zoneHint) {\n // Do not force a zone: even when the main area is empty we only\n // activate a zone when the pointer is actually over a joystick button.\n const hintedZone = this.isDropZone(zoneHint) ? zoneHint : null;\n if (hintedZone) {\n this.updateDropJoystickActiveZone(hintedZone);\n return hintedZone;\n }\n const pointZone = point &&\n Number.isFinite(point.clientX) &&\n Number.isFinite(point.clientY)\n ? this.findDropZoneByPoint(point.clientX, point.clientY)\n : null;\n if (pointZone) {\n this.updateDropJoystickActiveZone(pointZone);\n return pointZone;\n }\n if (this.dropJoystickTarget === stack) {\n // Be sticky while hovering the joystick: if we recently had a zone\n // selected, prefer keeping it instead of briefly clearing to null\n // when the browser reports transient coordinates/targets during drag.\n const sticky = this.dropJoystick.dataset['zone'];\n if (this.isDropZone(sticky)) {\n this.updateDropJoystickActiveZone(sticky);\n return sticky;\n }\n this.updateDropJoystickActiveZone(null);\n }\n return null;\n }\n extractDropZoneFromEvent(event) {\n if (!event) {\n return null;\n }\n if (typeof event.composedPath === 'function') {\n const path = event.composedPath();\n const zone = this.findDropZoneInTargets(path);\n if (zone) {\n return zone;\n }\n }\n if ('clientX' in event && 'clientY' in event) {\n const pointEvent = event;\n const zoneFromPoint = this.findDropZoneByPoint(pointEvent.clientX, pointEvent.clientY);\n if (zoneFromPoint) {\n return zoneFromPoint;\n }\n }\n return null;\n }\n handleDragPointerUpCommon() {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n this.scheduleDeferredDragEnd();\n }\n findDropZoneInTargets(targets) {\n for (const target of targets) {\n if (target instanceof HTMLElement &&\n target.classList.contains('dock-drop-joystick__button')) {\n const zone = target.dataset?.['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n findDropZoneByPoint(clientX, clientY) {\n if (!this.dropJoystickButtons ||\n this.dropJoystick.dataset['visible'] !== 'true' ||\n !this.dropJoystickTarget) {\n return null;\n }\n for (const button of this.dropJoystickButtons) {\n // Skip hidden/inactive buttons (used in center-only mode)\n if ((button.dataset['hidden'] === 'true') || button.style.visibility === 'hidden' || button.style.display === 'none') {\n continue;\n }\n const rect = button.getBoundingClientRect();\n if (clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom) {\n const zone = button.dataset['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n updateDropJoystickActiveZone(zone) {\n // If no zone is computed but the joystick is visible, keep the last\n // known active zone to avoid visual jitter while dragging across\n // small gaps where hit‑testing momentarily fails.\n const visible = this.dropJoystick.dataset['visible'] === 'true';\n const sticky = visible ? this.dropJoystick.dataset['zone'] : undefined;\n const effectiveZone = zone ?? (this.isDropZone(sticky) ? sticky : null);\n this.dropJoystickButtons.forEach((button) => {\n const isActive = effectiveZone !== null && button.dataset['zone'] === effectiveZone;\n if (isActive) {\n button.dataset['active'] = 'true';\n }\n else {\n delete button.dataset['active'];\n }\n });\n if (effectiveZone) {\n this.dropJoystick.dataset['zone'] = effectiveZone;\n }\n else {\n delete this.dropJoystick.dataset['zone'];\n }\n }\n isDropZone(value) {\n return value === 'left' || value === 'right' || value === 'top' || value === 'bottom' || value === 'center';\n }\n showDropIndicator(stack, zone) {\n const targetPath = this.parsePath(stack.dataset['path']);\n const sourcePath = this.dragState?.sourcePath ?? null;\n if (targetPath && sourcePath && this.isOrIsAncestorOf(targetPath, sourcePath)) {\n // Don't show any drop indicators on the pane being dragged.\n return;\n }\n const rect = stack.getBoundingClientRect();\n const hostRect = this.getBoundingClientRect();\n const indicator = this.dropIndicator;\n const joystick = this.dropJoystick;\n joystick.hidden = false;\n const path = this.parsePath(stack.dataset['path']);\n let overlayZ = 100;\n if (path && path.type === 'floating') {\n overlayZ = this.getFloatingPaneZIndex(path.index) + 100;\n }\n indicator.style.zIndex = String(overlayZ);\n joystick.style.zIndex = String(overlayZ + 1);\n let left = rect.left - hostRect.left;\n let top = rect.top - hostRect.top;\n let width = rect.width;\n let height = rect.height;\n const portion = 0.5;\n if (zone) {\n switch (zone) {\n case 'left':\n width = rect.width * portion;\n break;\n case 'right':\n width = rect.width * portion;\n left += rect.width * (1 - portion);\n break;\n case 'top':\n height = rect.height * portion;\n break;\n case 'bottom':\n height = rect.height * portion;\n top += rect.height * (1 - portion);\n break;\n default:\n break;\n }\n indicator.style.left = `${left}px`;\n indicator.style.top = `${top}px`;\n indicator.style.width = `${width}px`;\n indicator.style.height = `${height}px`;\n indicator.dataset['visible'] = 'true';\n }\n else {\n indicator.dataset['visible'] = 'false';\n }\n joystick.style.left = `${rect.left - hostRect.left + rect.width / 2}px`;\n joystick.style.top = `${rect.top - hostRect.top + rect.height / 2}px`;\n joystick.dataset['visible'] = 'true';\n this.dropJoystick.style.display = 'grid';\n joystick.dataset['path'] = stack.dataset['path'] ?? '';\n const changedTarget = this.dropJoystickTarget && this.dropJoystickTarget !== stack;\n this.dropJoystickTarget = stack;\n if (changedTarget) {\n // New target stack: forget any previously sticky zone.\n delete this.dropJoystick.dataset['zone'];\n }\n // If main dock area is empty, show only the center button and collapse the grid\n const isEmptyMainArea = !this.rootLayout && (stack === this.dockedEl || (targetPath && targetPath.type === 'docked' && targetPath.segments.length === 0));\n const spacers = Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer'));\n if (isEmptyMainArea) {\n // Keep spacers visible so the joystick keeps its circular footprint.\n spacers.forEach((s) => {\n s.style.display = '';\n });\n this.dropJoystickButtons.forEach((btn) => {\n const isCenter = btn.dataset['zone'] === 'center';\n if (isCenter) {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n }\n else {\n // Hide visually but keep layout space; also prevent interaction.\n btn.style.visibility = 'hidden';\n btn.style.pointerEvents = 'none';\n btn.dataset['hidden'] = 'true';\n btn.style.display = '';\n }\n });\n // Keep default 3x3 grid so the circular background size stays the same.\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n // Do not set an active zone automatically; users must hover the button.\n }\n else {\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n });\n spacers.forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n this.updateDropJoystickActiveZone(zone);\n }\n hideDropIndicator() {\n this.dropIndicator.dataset['visible'] = 'false';\n this.dropJoystick.dataset['visible'] = 'false';\n this.dropJoystick.style.display = 'none';\n delete this.dropJoystick.dataset['path'];\n this.dropJoystickTarget = null;\n this.updateDropJoystickActiveZone(null);\n // Restore joystick structure to default.\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.display = '';\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n });\n Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer')).forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n findStackAtPoint(clientX, clientY) {\n const shadow = this.shadowRoot;\n if (!shadow) {\n return null;\n }\n const elements = shadow.elementsFromPoint(clientX, clientY);\n const stack = this.findStackInTargets(elements);\n if (stack) {\n return stack;\n }\n // If there are no docked stacks (all panes are floating), allow the\n // docked surface itself to serve as a drop target for the main zone.\n if (!this.rootLayout) {\n const dockRect = this.dockedEl.getBoundingClientRect();\n if (clientX >= dockRect.left &&\n clientX <= dockRect.right &&\n clientY >= dockRect.top &&\n clientY <= dockRect.bottom) {\n return this.dockedEl;\n }\n }\n return null;\n }\n findStackElement(event) {\n const path = event.composedPath();\n const stack = this.findStackInTargets(path);\n if (stack) {\n return stack;\n }\n // If the root dock area is empty, treat the docked surface as a valid\n // target when it appears in the composed path.\n if (!this.rootLayout) {\n for (const target of path) {\n if (target instanceof HTMLElement &&\n (target === this.dockedEl || target.classList.contains('dock-docked'))) {\n return this.dockedEl;\n }\n }\n }\n return null;\n }\n findStackInTargets(targets) {\n for (const element of targets) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element.classList.contains('dock-stack')) {\n return element;\n }\n if (this.dropJoystickTarget &&\n (element.classList.contains('dock-drop-joystick') ||\n element.classList.contains('dock-drop-joystick__button') ||\n element.classList.contains('dock-drop-joystick__spacer'))) {\n return this.dropJoystickTarget;\n }\n }\n return null;\n }\n activatePane(stack, paneName, path) {\n stack.dataset['activePane'] = paneName;\n const headerButtons = stack.querySelectorAll('.dock-tab');\n headerButtons.forEach((button) => {\n const isSelected = button.dataset['pane'] === paneName;\n button.classList.toggle('dock-tab--active', isSelected);\n button.setAttribute('aria-selected', String(isSelected));\n });\n const panes = stack.querySelectorAll('.dock-stack__pane');\n panes.forEach((pane) => {\n if (pane.dataset['pane'] === paneName) {\n pane.removeAttribute('hidden');\n }\n else {\n pane.setAttribute('hidden', '');\n }\n });\n const location = this.resolveStackLocation(path);\n if (!location) {\n return;\n }\n location.node.activePane = paneName;\n if (path.type === 'floating') {\n const floating = this.floatingLayouts[path.index];\n if (floating) {\n floating.activePane = paneName;\n }\n this.updateFloatingWindowTitle(path.index);\n }\n this.dispatchLayoutChanged();\n }\n getNodeAtPath(root, path) {\n if (!root) {\n return null;\n }\n let current = root;\n if (path.length === 0) {\n return current;\n }\n for (const segment of path) {\n if (!current || current.kind !== 'split') {\n return null;\n }\n current = current.children[segment] ?? null;\n }\n return current;\n }\n resolveSplitNode(path) {\n if (path.type === 'docked') {\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n const floating = this.floatingLayouts[path.index];\n if (!floating || !floating.root) {\n return null;\n }\n const node = this.getNodeAtPath(floating.root, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n replaceNodeInTree(root, target, replacement) {\n if (!root) {\n return replacement;\n }\n if (root === target) {\n return replacement;\n }\n const parentInfo = this.findParentSplit(root, target);\n if (!parentInfo) {\n return root;\n }\n parentInfo.parent.children[parentInfo.index] = replacement;\n this.normalizeSplitNode(parentInfo.parent);\n return root;\n }\n cleanupEmptyStackInTree(root, stack) {\n if (!root || stack.panes.length > 0) {\n return root;\n }\n const parentInfo = this.findParentSplit(root, stack);\n if (!parentInfo) {\n return root === stack ? null : root;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(stack);\n if (index === -1) {\n return root;\n }\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n cleanupSplitIfNecessary(root, split) {\n if (split.children.length === 1) {\n return this.replaceNodeInTree(root, split, split.children[0]);\n }\n if (split.children.length === 0) {\n const parentInfo = this.findParentSplit(root, split);\n if (!parentInfo) {\n return null;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(split);\n if (index !== -1) {\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n }\n return root;\n }\n dockNodeBeside(root, targetNode, newNode, zone) {\n const orientation = zone === 'left' || zone === 'right' ? 'horizontal' : 'vertical';\n const placeBefore = zone === 'left' || zone === 'top';\n const parentInfo = this.findParentSplit(root, targetNode);\n if (parentInfo && parentInfo.parent.direction === orientation) {\n const insertIndex = placeBefore ? parentInfo.index : parentInfo.index + 1;\n parentInfo.parent.children.splice(insertIndex, 0, newNode);\n parentInfo.parent.sizes = this.insertWeight(parentInfo.parent.sizes, insertIndex, parentInfo.parent.children.length);\n return root ?? newNode;\n }\n const split = {\n kind: 'split',\n direction: orientation,\n children: placeBefore ? [newNode, targetNode] : [targetNode, newNode],\n sizes: [0.5, 0.5],\n };\n return this.replaceNodeInTree(root, targetNode, split);\n }\n forEachStack(node, visitor, path = []) {\n if (!node) {\n return;\n }\n if (node.kind === 'stack') {\n visitor(node, path);\n return;\n }\n node.children.forEach((child, index) => this.forEachStack(child, visitor, [...path, index]));\n }\n findStackContainingPane(node, pane) {\n let result = null;\n this.forEachStack(node, (stack) => {\n if (!result && stack.panes.includes(pane)) {\n result = stack;\n }\n });\n return result;\n }\n findFirstPaneName(node) {\n let found = null;\n this.forEachStack(node, (stack) => {\n if (found || stack.panes.length === 0) {\n return;\n }\n if (stack.activePane && stack.panes.includes(stack.activePane)) {\n found = stack.activePane;\n }\n else {\n found = stack.panes[0];\n }\n });\n return found;\n }\n collectFloatingPaneMetadata(node) {\n // Deprecated method retained temporarily for signature compatibility.\n // Use collectPaneNames instead.\n const panes = this.collectPaneNames(node);\n const titles = {};\n panes.forEach((p) => {\n const t = this.titles[p];\n if (t) {\n titles[p] = t;\n }\n });\n return { panes, titles };\n }\n collectPaneNames(node) {\n const panes = [];\n this.forEachStack(node, (stack) => {\n stack.panes.forEach((pane) => panes.push(pane));\n });\n return panes;\n }\n normalizeFloatingLayout(layout) {\n const bounds = layout.bounds ?? { left: 0, top: 0, width: 320, height: 200 };\n const normalizedBounds = {\n left: Number.isFinite(bounds.left) ? bounds.left : 0,\n top: Number.isFinite(bounds.top) ? bounds.top : 0,\n width: Number.isFinite(bounds.width) ? Math.max(bounds.width, 160) : 320,\n height: Number.isFinite(bounds.height) ? Math.max(bounds.height, 120) : 200,\n };\n const root = layout.root ? this.cloneLayoutNode(layout.root) : null;\n return {\n id: layout.id,\n bounds: normalizedBounds,\n zIndex: layout.zIndex,\n root,\n activePane: layout.activePane,\n };\n }\n formatPath(path) {\n if (path.type === 'floating') {\n const suffix = path.segments.length > 0\n ? `/${path.segments.map((segment) => segment.toString()).join('/')}`\n : '';\n return `f:${path.index}${suffix}`;\n }\n const suffix = path.segments.join('/');\n return suffix.length > 0 ? `d:${suffix}` : 'd:';\n }\n clonePath(path) {\n if (path.type === 'floating') {\n return { type: 'floating', index: path.index, segments: [...path.segments] };\n }\n return { type: 'docked', segments: [...path.segments] };\n }\n parsePath(path) {\n if (!path) {\n return null;\n }\n if (path.startsWith('f:')) {\n const remainder = path.slice(2);\n const [indexPart, ...segmentParts] = remainder.split('/');\n const index = Number.parseInt(indexPart, 10);\n if (!Number.isFinite(index)) {\n return null;\n }\n const segments = segmentParts\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'floating', index, segments };\n }\n const normalized = path.startsWith('d:') ? path.slice(2) : path;\n if (normalized.length === 0) {\n return { type: 'docked', segments: [] };\n }\n const segments = normalized\n .split('/')\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'docked', segments };\n }\n pathsEqual(a, b) {\n if (a.type !== b.type) {\n return false;\n }\n if (a.type === 'floating') {\n const other = b;\n if (a.index !== other.index) {\n return false;\n }\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n const other = b;\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n isOrIsAncestorOf(ancestor, descendant) {\n if (ancestor.type !== descendant.type) {\n return false;\n }\n if (ancestor.type === 'floating') {\n if (descendant.index !== ancestor.index) {\n return false;\n }\n }\n if (ancestor.segments.length > descendant.segments.length) {\n return false;\n }\n return ancestor.segments.every((segment, i) => segment === descendant.segments[i]);\n }\n countPanesInTree(node) {\n if (!node) {\n return 0;\n }\n if (node.kind === 'stack') {\n return node.panes.length;\n }\n return node.children.reduce((total, child) => total + this.countPanesInTree(child), 0);\n }\n resolveStackLocation(path) {\n if (path.type === 'floating') {\n const layout = this.floatingLayouts[path.index];\n if (!layout || !layout.root) {\n return null;\n }\n const node = this.getNodeAtPath(layout.root, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'floating', index: path.index, path: [...path.segments], node };\n }\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'docked', path: [...path.segments], node };\n }\n removePaneFromLocation(location, pane, skipCleanup = false) {\n if (location.context === 'docked') {\n return this.removePaneFromStack(location.node, pane, skipCleanup);\n }\n return this.removePaneFromFloating(location.index, location.path, pane, skipCleanup);\n }\n addPaneToLocation(location, pane) {\n const panes = location.node.panes;\n const existingIndex = panes.indexOf(pane);\n if (existingIndex !== -1) {\n panes.splice(existingIndex, 1);\n }\n panes.push(pane);\n }\n setActivePaneForLocation(location, pane) {\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n cleanupLocation(location) {\n if (location.context === 'docked') {\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, location.node);\n }\n else {\n const floating = this.floatingLayouts[location.index];\n if (!floating) {\n return;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, location.node);\n if (!floating.root) {\n this.removeFloatingAt(location.index);\n }\n }\n }\n reorderPaneInLocation(location, pane) {\n const panes = location.node.panes;\n const index = panes.indexOf(pane);\n if (index === -1) {\n return;\n }\n panes.splice(index, 1);\n panes.push(pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n removeFloatingAt(index) {\n if (index < 0 || index >= this.floatingLayouts.length) {\n return;\n }\n this.floatingLayouts.splice(index, 1);\n }\n removePaneFromFloating(index, path, pane, skipCleanup = false) {\n const floating = this.floatingLayouts[index];\n if (!floating || !floating.root) {\n return false;\n }\n const node = this.getNodeAtPath(floating.root, path);\n if (!node || node.kind !== 'stack') {\n return false;\n }\n node.panes = node.panes.filter((p) => p !== pane);\n if (!node.panes.includes(node.activePane ?? '')) {\n if (node.panes.length > 0) {\n node.activePane = node.panes[0];\n }\n else {\n delete node.activePane;\n }\n }\n if (floating.activePane === pane) {\n const fallback = this.findFirstPaneName(floating.root);\n if (fallback) {\n floating.activePane = fallback;\n }\n else {\n delete floating.activePane;\n }\n }\n if (node.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, node);\n if (!floating.root) {\n this.removeFloatingAt(index);\n }\n return true;\n }\n normalizeSizesArray(sizes, count) {\n if (count <= 0) {\n return [];\n }\n if (!Array.isArray(sizes) || sizes.length !== count) {\n return Array.from({ length: count }, () => 1 / count);\n }\n const normalized = sizes.map((value) => (Number.isFinite(value) ? Math.max(value, 0) : 0));\n const total = normalized.reduce((acc, value) => acc + value, 0);\n if (total <= 0) {\n return Array.from({ length: count }, () => 1 / count);\n }\n return normalized.map((value) => value / total);\n }\n normalizeSplitNode(split) {\n split.sizes = this.normalizeSizesArray(split.sizes, split.children.length);\n }\n dispatchLayoutChanged() {\n this.dispatchEvent(new CustomEvent('dock-layout-changed', {\n detail: this.snapshot,\n bubbles: true,\n composed: true,\n }));\n }\n cloneLayoutNode(layout) {\n if (!layout) {\n return null;\n }\n return JSON.parse(JSON.stringify(layout));\n }\n cloneFloatingArray(layouts) {\n return JSON.parse(JSON.stringify(layouts));\n }\n}\nconst tagName = 'mint-dock-manager';\nif (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, MintDockManagerElement);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludC1kb2NrLW1hbmFnZXIuZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL3dlYi1jb21wb25lbnRzL21pbnQtZG9jay1tYW5hZ2VyLmVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2YXBCLENBQUM7QUFFRixJQUFJLGNBQWMsR0FBK0IsSUFBSSxDQUFDO0FBQ3RELElBQUksc0JBQXNCLEdBQW9CLElBQUksQ0FBQztBQUVuRCxTQUFTLGNBQWMsQ0FBQyxXQUFxQjtJQUMzQyxJQUFJLENBQUMsY0FBYyxJQUFJLHNCQUFzQixLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzlELGNBQWMsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELGNBQWMsQ0FBQyxTQUFTLEdBQUcsWUFB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RWxDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUE4QixDQUFDO0lBQzFFLENBQUM7O0FBR0gsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUM7QUFFcEMsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDMUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge1xuICBEb2NrRmxvYXRpbmdTdGFja0xheW91dCxcbiAgRG9ja0xheW91dCxcbiAgRG9ja0xheW91dE5vZGUsXG4gIERvY2tMYXlvdXRTbmFwc2hvdCxcbiAgRG9ja1NwbGl0Tm9kZSxcbiAgRG9ja1N0YWNrTm9kZSxcbn0gZnJvbSAnLi4vdHlwZXMvZG9jay1sYXlvdXQnO1xuXG50eXBlIERvY2tQYXRoID1cbiAgfCB7IHR5cGU6ICdkb2NrZWQnOyBzZWdtZW50czogbnVtYmVyW10gfVxuICB8IHsgdHlwZTogJ2Zsb2F0aW5nJzsgaW5kZXg6IG51bWJlcjsgc2VnbWVudHM6IG51bWJlcltdIH07XG5cbnR5cGUgRG9ja2VkTG9jYXRpb24gPSB7IGNvbnRleHQ6ICdkb2NrZWQnOyBwYXRoOiBudW1iZXJbXTsgbm9kZTogRG9ja1N0YWNrTm9kZSB9O1xudHlwZSBGbG9hdGluZ0xvY2F0aW9uID0ge1xuICBjb250ZXh0OiAnZmxvYXRpbmcnO1xuICBpbmRleDogbnVtYmVyO1xuICBwYXRoOiBudW1iZXJbXTtcbiAgbm9kZTogRG9ja1N0YWNrTm9kZTtcbn07XG5cbnR5cGUgUmVzb2x2ZWRMb2NhdGlvbiA9IERvY2tlZExvY2F0aW9uIHwgRmxvYXRpbmdMb2NhdGlvbjtcblxudHlwZSBEcm9wWm9uZSA9ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbSc7XG5cbnR5cGUgRmxvYXRpbmdSZXNpemVFZGdlcyA9IHtcbiAgaG9yaXpvbnRhbDogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdub25lJztcbiAgdmVydGljYWw6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbm9uZSc7XG59O1xuXG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSBgXG4gIDxzdHlsZT5cbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgY29udGFpbjogbGF5b3V0IHBhaW50IHNpemUgc3R5bGU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG5cbiAgICAuZG9jay1yb290LFxuICAgIC5kb2NrLWRvY2tlZCxcbiAgICAuZG9jay1zcGxpdCxcbiAgICAuZG9jay1zcGxpdF9fY2hpbGQsXG4gICAgLmRvY2stc3RhY2ssXG4gICAgLmRvY2stc3RhY2tfX2NvbnRlbnQsXG4gICAgLmRvY2stc3RhY2tfX3BhbmUge1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgfVxuXG4gICAgLmRvY2stcm9vdCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG5cbiAgICAuZG9jay1kb2NrZWQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgei1pbmRleDogMDtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZy1sYXllciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBpbnNldDogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgei1pbmRleDogNTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZyB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAzMnB4IHJnYmEoMTUsIDIzLCA0MiwgMC4yNSk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgbWluLXdpZHRoOiAxMnJlbTtcbiAgICAgIG1pbi1oZWlnaHQ6IDhyZW07XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX2Nocm9tZSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMC41cmVtO1xuICAgICAgcGFkZGluZzogMC4zNXJlbSAwLjc1cmVtO1xuICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgICB0byBib3R0b20sXG4gICAgICAgIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC42KSxcbiAgICAgICAgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjI1KVxuICAgICAgKTtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDE0OCwgMTYzLCAxODQsIDAuNSk7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3RpdGxlIHtcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogcmdiYSgzMCwgNDEsIDU5LCAwLjk1KTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmcgPiAuZG9jay1zdGFjayB7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIG1pbi13aWR0aDogMTJyZW07XG4gICAgICBtaW4taGVpZ2h0OiA4cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgei1pbmRleDogMjtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4yNSk7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXI6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNDgsIDE2MywgMTg0LCAwLjQpO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbSB7XG4gICAgICBsZWZ0OiAwLjc1cmVtO1xuICAgICAgcmlnaHQ6IDAuNzVyZW07XG4gICAgICBoZWlnaHQ6IDAuNXJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wIHtcbiAgICAgIHRvcDogMDtcbiAgICAgIGN1cnNvcjogbi1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbSB7XG4gICAgICBib3R0b206IDA7XG4gICAgICBjdXJzb3I6IHMtcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1sZWZ0LFxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1yaWdodCB7XG4gICAgICB0b3A6IDEuNzVyZW07XG4gICAgICBib3R0b206IDAuNzVyZW07XG4gICAgICB3aWR0aDogMC41cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1sZWZ0IHtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICBjdXJzb3I6IHctcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1yaWdodCB7XG4gICAgICByaWdodDogMDtcbiAgICAgIGN1cnNvcjogZS1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1sZWZ0LFxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AtcmlnaHQsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1sZWZ0LFxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20tcmlnaHQge1xuICAgICAgd2lkdGg6IDAuNzVyZW07XG4gICAgICBoZWlnaHQ6IDAuNzVyZW07XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1sZWZ0IHtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICBjdXJzb3I6IG53LXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLXJpZ2h0IHtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgY3Vyc29yOiBuZS1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1sZWZ0IHtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICBjdXJzb3I6IHN3LXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLXJpZ2h0IHtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgY3Vyc29yOiBzZS1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXg6IDEgMSAwO1xuICAgICAgZ2FwOiAwLjI1cmVtO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0W2RhdGEtZGlyZWN0aW9uPVwidmVydGljYWxcIl0ge1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cImhvcml6b250YWxcIl0ge1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdF9fY2hpbGQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXg6IDEgMSAwO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0X19kaXZpZGVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTIwbXMgZWFzZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cImhvcml6b250YWxcIl0gPiAuZG9jay1zcGxpdF9fZGl2aWRlciB7XG4gICAgICB3aWR0aDogMC41cmVtO1xuICAgICAgY3Vyc29yOiBjb2wtcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0W2RhdGEtZGlyZWN0aW9uPVwidmVydGljYWxcIl0gPiAuZG9jay1zcGxpdF9fZGl2aWRlciB7XG4gICAgICBoZWlnaHQ6IDAuNXJlbTtcbiAgICAgIGN1cnNvcjogcm93LXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdF9fZGl2aWRlcjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDUwJTtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0W2RhdGEtZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiXSA+IC5kb2NrLXNwbGl0X19kaXZpZGVyOjphZnRlciB7XG4gICAgICB3aWR0aDogMC4xMjVyZW07XG4gICAgICBoZWlnaHQ6IDYwJTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cInZlcnRpY2FsXCJdID4gLmRvY2stc3BsaXRfX2RpdmlkZXI6OmFmdGVyIHtcbiAgICAgIHdpZHRoOiA2MCU7XG4gICAgICBoZWlnaHQ6IDAuMTI1cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0X19kaXZpZGVyOmhvdmVyLFxuICAgIC5kb2NrLXNwbGl0X19kaXZpZGVyOmZvY3VzLXZpc2libGUsXG4gICAgLmRvY2stc3BsaXRfX2RpdmlkZXJbZGF0YS1yZXNpemluZz0ndHJ1ZSddIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjM1KTtcbiAgICB9XG5cbiAgICAuZG9jay1zdGFjayB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGZsZXg6IDEgMSAwO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7XG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICB9XG5cbiAgICAuZG9jay1zdGFja19faGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBnYXA6IDAuMjVyZW07XG4gICAgICBwYWRkaW5nOiAwLjI1cmVtO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgIH1cblxuICAgIC5kb2NrLXRhYiB7XG4gICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgcGFkZGluZzogMC4yNXJlbSAwLjVyZW07XG4gICAgICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgICBjdXJzb3I6IGdyYWI7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDE2MG1zIGVhc2U7XG4gICAgfVxuXG4gICAgLmRvY2stdGFiOmFjdGl2ZSB7XG4gICAgICBjdXJzb3I6IGdyYWJiaW5nO1xuICAgIH1cblxuICAgIC5kb2NrLXRhYjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAgIH1cblxuICAgIC5kb2NrLXRhYjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC44KTtcbiAgICAgIG91dGxpbmUtb2Zmc2V0OiAxcHg7XG4gICAgfVxuXG4gICAgLmRvY2stdGFiLS1hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMTUpO1xuICAgIH1cblxuICAgIC5kb2NrLXN0YWNrX19jb250ZW50IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmRvY2stc3RhY2tfX3BhbmUge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZmxleDogMSAxIDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmRvY2stc3RhY2tfX3BhbmVbaGlkZGVuXSB7XG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1pbmRpY2F0b3Ige1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC45KTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XG4gICAgICB6LWluZGV4OiAxMDA7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1pbmRpY2F0b3JbZGF0YS12aXNpYmxlPSd0cnVlJ10ge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWpveXN0aWNrIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCBtaW4tY29udGVudCk7XG4gICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCBtaW4tY29udGVudCk7XG4gICAgICBnYXA6IDAuMTI1cmVtO1xuICAgICAgcGFkZGluZzogMC4xMjVyZW07XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDIzLCA0MiwgMC4xNSk7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMTUsIDIzLCA0MiwgMC4yNSk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgei1pbmRleDogMTEwO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlciB7XG4gICAgICB3aWR0aDogMS43NXJlbTtcbiAgICAgIGhlaWdodDogMS43NXJlbTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbiB7XG4gICAgICB3aWR0aDogMS43NXJlbTtcbiAgICAgIGhlaWdodDogMS43NXJlbTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC40KTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcbiAgICAgIGNvbG9yOiByZ2JhKDMwLCA2NCwgMTc1LCAwLjkpO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsIGNvbG9yIDEyMG1zIGVhc2UsIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbltkYXRhLWFjdGl2ZT0ndHJ1ZSddLFxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbjpob3ZlcixcbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b246Zm9jdXMtdmlzaWJsZSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4yNSk7XG4gICAgICBib3JkZXItY29sb3I6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjgpO1xuICAgICAgY29sb3I6IHJnYmEoMzAsIDY0LCAxNzUsIDEpO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC45KTtcbiAgICAgIG91dGxpbmUtb2Zmc2V0OiAxcHg7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uW2RhdGEtem9uZT0nY2VudGVyJ10ge1xuICAgICAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xuICAgIH1cblxuICAgIDo6c2xvdHRlZCgqKSB7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxkaXYgY2xhc3M9XCJkb2NrLXJvb3RcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kb2NrZWRcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1mbG9hdGluZy1sYXllclwiPjwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRvY2stZHJvcC1pbmRpY2F0b3JcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja1wiIGRhdGEtdmlzaWJsZT1cImZhbHNlXCI+XG4gICAgPGRpdiBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyXCI+PC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvblwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtem9uZT1cInRvcFwiXG4gICAgICBhcmlhLWxhYmVsPVwiRG9jayB0byB0b3BcIlxuICAgID5cbiAgICAgIOKGkVxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlclwiPjwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBkYXRhLXpvbmU9XCJsZWZ0XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIGxlZnRcIlxuICAgID5cbiAgICAgIOKGkFxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBkYXRhLXpvbmU9XCJjZW50ZXJcIlxuICAgICAgYXJpYS1sYWJlbD1cIkRvY2sgdG8gY2VudGVyXCJcbiAgICA+XG4gICAgICDigKJcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwicmlnaHRcIlxuICAgICAgYXJpYS1sYWJlbD1cIkRvY2sgdG8gcmlnaHRcIlxuICAgID5cbiAgICAgIOKGklxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlclwiPjwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBkYXRhLXpvbmU9XCJib3R0b21cIlxuICAgICAgYXJpYS1sYWJlbD1cIkRvY2sgdG8gYm90dG9tXCJcbiAgICA+XG4gICAgICDihpNcbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXJcIj48L2Rpdj5cbiAgPC9kaXY+XG5gO1xuXG5sZXQgY2FjaGVkVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbmxldCBjYWNoZWRUZW1wbGF0ZURvY3VtZW50OiBEb2N1bWVudCB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBlbnN1cmVUZW1wbGF0ZShkb2N1bWVudFJlZjogRG9jdW1lbnQpOiBIVE1MVGVtcGxhdGVFbGVtZW50IHtcbiAgaWYgKCFjYWNoZWRUZW1wbGF0ZSB8fCBjYWNoZWRUZW1wbGF0ZURvY3VtZW50ICE9PSBkb2N1bWVudFJlZikge1xuICAgIGNhY2hlZFRlbXBsYXRlID0gZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICBjYWNoZWRUZW1wbGF0ZS5pbm5lckhUTUwgPSB0ZW1wbGF0ZUh0bWw7XG4gICAgY2FjaGVkVGVtcGxhdGVEb2N1bWVudCA9IGRvY3VtZW50UmVmO1xuICB9XG5cbiAgcmV0dXJuIGNhY2hlZFRlbXBsYXRlO1xufVxuXG5leHBvcnQgY2xhc3MgTWludERvY2tNYW5hZ2VyRWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdGF0aWMgZG9jdW1lbnRSZWY6IERvY3VtZW50IHwgbnVsbCA9XG4gICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogbnVsbDtcblxuICBzdGF0aWMgY29uZmlndXJlRG9jdW1lbnQoZG9jdW1lbnRSZWY6IERvY3VtZW50IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChkb2N1bWVudFJlZikge1xuICAgICAgTWludERvY2tNYW5hZ2VyRWxlbWVudC5kb2N1bWVudFJlZiA9IGRvY3VtZW50UmVmO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydsYXlvdXQnXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlQ291bnRlciA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFJlZjogRG9jdW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVmOiAoV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMpIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290RWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY2tlZEVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG9hdGluZ0xheWVyRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGRyb3BJbmRpY2F0b3I6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGRyb3BKb3lzdGljazogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcEpveXN0aWNrQnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgZHJvcEpveXN0aWNrVGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJvb3RMYXlvdXQ6IERvY2tMYXlvdXROb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmxvYXRpbmdMYXlvdXRzOiBEb2NrRmxvYXRpbmdTdGFja0xheW91dFtdID0gW107XG4gIHByaXZhdGUgdGl0bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgcGVuZGluZ1RhYkRyYWdNZXRyaWNzOlxuICAgIHwge1xuICAgICAgICBwb2ludGVyT2Zmc2V0WDogbnVtYmVyO1xuICAgICAgICBwb2ludGVyT2Zmc2V0WTogbnVtYmVyO1xuICAgICAgICBsZWZ0OiBudW1iZXI7XG4gICAgICAgIHRvcDogbnVtYmVyO1xuICAgICAgICB3aWR0aDogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc2l6ZVN0YXRlOlxuICAgIHwge1xuICAgICAgICBwYXRoOiBEb2NrUGF0aDtcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgcG9pbnRlcklkOiBudW1iZXI7XG4gICAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICBkaXZpZGVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgc3RhcnRQb3M6IG51bWJlcjtcbiAgICAgICAgaW5pdGlhbFNpemVzOiBudW1iZXJbXTtcbiAgICAgICAgYmVmb3JlU2l6ZTogbnVtYmVyO1xuICAgICAgICBhZnRlclNpemU6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdTdGF0ZToge1xuICAgIHBhbmU6IHN0cmluZztcbiAgICBzb3VyY2VQYXRoOiBEb2NrUGF0aDtcbiAgICBmbG9hdGluZ0luZGV4OiBudW1iZXIgfCBudWxsO1xuICAgIHBvaW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gICAgcG9pbnRlck9mZnNldFk6IG51bWJlcjtcbiAgICBkcm9wSGFuZGxlZDogYm9vbGVhbjtcbiAgICAvLyBGb3IgdGFiIHJlb3JkZXJpbmcgYmVmb3JlIGNvbnZlcnRpbmcgdG8gZmxvYXRpbmdcbiAgICBzb3VyY2VTdGFja0VsPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHNvdXJjZUhlYWRlckJvdW5kcz86IHsgbGVmdDogbnVtYmVyOyB0b3A6IG51bWJlcjsgcmlnaHQ6IG51bWJlcjsgYm90dG9tOiBudW1iZXIgfSB8IG51bGw7XG4gICAgc3RhcnRDbGllbnRYPzogbnVtYmVyO1xuICAgIHN0YXJ0Q2xpZW50WT86IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZsb2F0aW5nRHJhZ1N0YXRlOlxuICAgIHwge1xuICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgICBwb2ludGVySWQ6IG51bWJlcjtcbiAgICAgICAgc3RhcnRYOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0WTogbnVtYmVyO1xuICAgICAgICBzdGFydExlZnQ6IG51bWJlcjtcbiAgICAgICAgc3RhcnRUb3A6IG51bWJlcjtcbiAgICAgICAgd3JhcHBlcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIGhhbmRsZTogSFRNTEVsZW1lbnQ7XG4gICAgICAgIGRyb3BUYXJnZXQ/OiB7IHBhdGg6IERvY2tQYXRoOyB6b25lOiBEcm9wWm9uZSB9O1xuICAgICAgfVxuICAgIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmxvYXRpbmdSZXNpemVTdGF0ZTpcbiAgICB8IHtcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgcG9pbnRlcklkOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0WDogbnVtYmVyO1xuICAgICAgICBzdGFydFk6IG51bWJlcjtcbiAgICAgICAgc3RhcnRXaWR0aDogbnVtYmVyO1xuICAgICAgICBzdGFydEhlaWdodDogbnVtYmVyO1xuICAgICAgICBzdGFydExlZnQ6IG51bWJlcjtcbiAgICAgICAgc3RhcnRUb3A6IG51bWJlcjtcbiAgICAgICAgd3JhcHBlcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIGhhbmRsZTogSFRNTEVsZW1lbnQ7XG4gICAgICAgIGVkZ2VzOiBGbG9hdGluZ1Jlc2l6ZUVkZ2VzO1xuICAgICAgfVxuICAgIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9pbnRlclRyYWNraW5nQWN0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgZHJhZ1BvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3REcmFnUG9pbnRlclBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nRHJhZ0VuZFRpbWVvdXQ6IG51bWJlciB8IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCBkb2N1bWVudFJlZiA9IHRoaXMucmVzb2x2ZURvY3VtZW50KCk7XG4gICAgdGhpcy5kb2N1bWVudFJlZiA9IGRvY3VtZW50UmVmO1xuICAgIHRoaXMud2luZG93UmVmID0gdGhpcy5yZXNvbHZlV2luZG93KGRvY3VtZW50UmVmKTtcbiAgICBjb25zdCBzaGFkb3dSb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBlbnN1cmVUZW1wbGF0ZShkb2N1bWVudFJlZik7XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gICAgY29uc3Qgcm9vdCA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLXJvb3QnKTtcbiAgICBpZiAoIXJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyB0aGUgcm9vdCBlbGVtZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY2tlZCA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLWRvY2tlZCcpO1xuICAgIGlmICghZG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHRlbXBsYXRlIGlzIG1pc3NpbmcgdGhlIGRvY2tlZCBzdXJmYWNlIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvYXRpbmdMYXllciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgICAnLmRvY2stZmxvYXRpbmctbGF5ZXInLFxuICAgICk7XG4gICAgaWYgKCFmbG9hdGluZ0xheWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHRlbXBsYXRlIGlzIG1pc3NpbmcgdGhlIGZsb2F0aW5nIGxheWVyIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kaWNhdG9yID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stZHJvcC1pbmRpY2F0b3InKTtcbiAgICBpZiAoIWluZGljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIHRoZSBkcm9wIGluZGljYXRvciBlbGVtZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGpveXN0aWNrID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stZHJvcC1qb3lzdGljaycpO1xuICAgIGlmICgham95c3RpY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyB0aGUgZHJvcCBqb3lzdGljayBlbGVtZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGpveXN0aWNrQnV0dG9ucyA9IEFycmF5LmZyb20oXG4gICAgICBqb3lzdGljay5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uW2RhdGEtem9uZV0nKSxcbiAgICApO1xuICAgIGlmIChqb3lzdGlja0J1dHRvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHRlbXBsYXRlIGlzIG1pc3NpbmcgZHJvcCBqb3lzdGljayBidXR0b25zLicpO1xuICAgIH1cblxuICAgIHRoaXMucm9vdEVsID0gcm9vdDtcbiAgICB0aGlzLmRvY2tlZEVsID0gZG9ja2VkO1xuICAgIHRoaXMuZmxvYXRpbmdMYXllckVsID0gZmxvYXRpbmdMYXllcjtcbiAgICB0aGlzLmRyb3BJbmRpY2F0b3IgPSBpbmRpY2F0b3I7XG4gICAgdGhpcy5kcm9wSm95c3RpY2sgPSBqb3lzdGljaztcbiAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMgPSBqb3lzdGlja0J1dHRvbnM7XG4gICAgdGhpcy5pbnN0YW5jZUlkID0gYG1pbnQtZG9jay0keysrTWludERvY2tNYW5hZ2VyRWxlbWVudC5pbnN0YW5jZUNvdW50ZXJ9YDtcbiAgICB0aGlzLm9uUG9pbnRlck1vdmUgPSB0aGlzLm9uUG9pbnRlck1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uUG9pbnRlclVwID0gdGhpcy5vblBvaW50ZXJVcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnT3ZlciA9IHRoaXMub25EcmFnT3Zlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25HbG9iYWxEcmFnT3ZlciA9IHRoaXMub25HbG9iYWxEcmFnT3Zlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25HbG9iYWxEcmFnRW5kID0gdGhpcy5vbkdsb2JhbERyYWdFbmQuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJvcCA9IHRoaXMub25Ecm9wLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdMZWF2ZSA9IHRoaXMub25EcmFnTGVhdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZyA9IHRoaXMub25EcmFnLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdNb3VzZU1vdmUgPSB0aGlzLm9uRHJhZ01vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnVG91Y2hNb3ZlID0gdGhpcy5vbkRyYWdUb3VjaE1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ01vdXNlVXAgPSB0aGlzLm9uRHJhZ01vdXNlVXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ1RvdWNoRW5kID0gdGhpcy5vbkRyYWdUb3VjaEVuZC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgncm9sZScpKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdhcHBsaWNhdGlvbicpO1xuICAgIH1cbiAgICAvLyBUYWcgdGhlIGRvY2tlZCBzdXJmYWNlIHdpdGggYSByb290IHBhdGggc28gaXQgY2FuIGFjdCBhc1xuICAgIC8vIGEgZHJvcCB0YXJnZXQgd2hlbiB0aGUgbWFpbiBsYXlvdXQgaXMgZW1wdHkuXG4gICAgdGhpcy5kb2NrZWRFbC5kYXRhc2V0WydwYXRoJ10gPSB0aGlzLmZvcm1hdFBhdGgoeyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFtdIH0pO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5yb290RWwuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uRHJhZ092ZXIpO1xuICAgIHRoaXMucm9vdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLm9uRHJvcCk7XG4gICAgdGhpcy5yb290RWwuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5vbkRyYWdMZWF2ZSk7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uRHJhZ092ZXIpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLm9uRHJvcCk7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5vbkRyYWdMZWF2ZSk7XG4gICAgLy8gU3RyZW5ndGhlbiB6b25lIHRyYWNraW5nIGJ5IHJlYWN0aW5nIHRvIGRyYWdlbnRlci9kcmFnb3ZlciBkaXJlY3RseSBvbiB0aGUgYnV0dG9ucy5cbiAgICAvLyBUaGlzIGF2b2lkcyByZWx5aW5nIHNvbGVseSBvbiBoaXQtdGVzdGluZyBlYWNoIGZyYW1lIHdoaWNoIGNhbiBiZSBqaXR0ZXJ5IGR1cmluZyBIVE1MNSBkcmFnLlxuICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHJldHVybjtcbiAgICAgICAgY29uc3QgeiA9IGJ0bi5kYXRhc2V0Wyd6b25lJ107XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcFpvbmUoeikpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUoeik7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIGhhbmRsZXIpO1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgaGFuZGxlcik7XG4gICAgfSk7XG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25HbG9iYWxEcmFnT3Zlcik7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5vbkRyYWcpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMub25HbG9iYWxEcmFnRW5kLCB0cnVlKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMucm9vdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLnJvb3RFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMucm9vdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uR2xvYmFsRHJhZ092ZXIpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMub25EcmFnKTtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLm9uR2xvYmFsRHJhZ0VuZCwgdHJ1ZSk7XG4gICAgdGhpcy5zdG9wRHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5wb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lOiBzdHJpbmcsIF9vbGRWYWx1ZTogc3RyaW5nIHwgbnVsbCwgbmV3VmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAobmFtZSA9PT0gJ2xheW91dCcpIHtcbiAgICAgIHRoaXMubGF5b3V0ID0gbmV3VmFsdWUgPyB0aGlzLnBhcnNlTGF5b3V0KG5ld1ZhbHVlKSA6IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxheW91dCgpOiBEb2NrTGF5b3V0U25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICByb290OiB0aGlzLmNsb25lTGF5b3V0Tm9kZSh0aGlzLnJvb3RMYXlvdXQpLFxuICAgICAgZmxvYXRpbmc6IHRoaXMuY2xvbmVGbG9hdGluZ0FycmF5KHRoaXMuZmxvYXRpbmdMYXlvdXRzKSxcbiAgICAgIHRpdGxlczogeyAuLi50aGlzLnRpdGxlcyB9LFxuICAgIH07XG4gIH1cblxuICBzZXQgbGF5b3V0KHZhbHVlOiBEb2NrTGF5b3V0U25hcHNob3QgfCBEb2NrTGF5b3V0IHwgRG9ja0xheW91dE5vZGUgfCBudWxsKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmVuc3VyZVNuYXBzaG90KHZhbHVlKTtcbiAgICB0aGlzLnJvb3RMYXlvdXQgPSB0aGlzLmNsb25lTGF5b3V0Tm9kZShzbmFwc2hvdC5yb290KTtcbiAgICB0aGlzLmZsb2F0aW5nTGF5b3V0cyA9IHRoaXMuY2xvbmVGbG9hdGluZ0FycmF5KHNuYXBzaG90LmZsb2F0aW5nKTtcbiAgICB0aGlzLnRpdGxlcyA9IHNuYXBzaG90LnRpdGxlcyA/IHsgLi4uc25hcHNob3QudGl0bGVzIH0gOiB7fTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgZ2V0IHNuYXBzaG90KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0O1xuICB9XG5cbiAgdG9KU09OKCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHRoaXMuc25hcHNob3Q7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVEb2N1bWVudCgpOiBEb2N1bWVudCB7XG4gICAgY29uc3Qgc3RhdGljRG9jdW1lbnQgPSBNaW50RG9ja01hbmFnZXJFbGVtZW50LmRvY3VtZW50UmVmO1xuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQgPz8gbnVsbDtcbiAgICBjb25zdCBnbG9iYWxEb2N1bWVudCA9XG4gICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiBudWxsO1xuICAgIGNvbnN0IHJlc29sdmVkRG9jdW1lbnQgPSBzdGF0aWNEb2N1bWVudCA/PyBvd25lckRvY3VtZW50ID8/IGdsb2JhbERvY3VtZW50O1xuXG4gICAgaWYgKCFyZXNvbHZlZERvY3VtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHJlcXVpcmVzIGEgRG9jdW1lbnQgdG8gaW5pdGlhbGl6ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIU1pbnREb2NrTWFuYWdlckVsZW1lbnQuZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuZG9jdW1lbnRSZWYgPSByZXNvbHZlZERvY3VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZERvY3VtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlV2luZG93KFxuICAgIGRvY3VtZW50UmVmOiBEb2N1bWVudCxcbiAgKTogKFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzKSB8IG51bGwge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG5cbiAgICByZXR1cm4gKGRvY3VtZW50UmVmLmRlZmF1bHRWaWV3IGFzIChXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcykgfCBudWxsKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxheW91dCh2YWx1ZTogc3RyaW5nKTogRG9ja0xheW91dFNuYXBzaG90IHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsdWUpIGFzXG4gICAgICAgIHwgRG9ja0xheW91dFNuYXBzaG90XG4gICAgICAgIHwgRG9ja0xheW91dFxuICAgICAgICB8IERvY2tMYXlvdXROb2RlXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLmVuc3VyZVNuYXBzaG90KHBhcnNlZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ21pbnQtZG9jay1tYW5hZ2VyOiBmYWlsZWQgdG8gcGFyc2UgbGF5b3V0IGF0dHJpYnV0ZScsIGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVNuYXBzaG90KFxuICAgIHZhbHVlOiBEb2NrTGF5b3V0U25hcHNob3QgfCBEb2NrTGF5b3V0IHwgRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICApOiBEb2NrTGF5b3V0U25hcHNob3Qge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB7IHJvb3Q6IG51bGwsIGZsb2F0aW5nOiBbXSwgdGl0bGVzOiB7fSB9O1xuICAgIH1cblxuICAgIGlmICgodmFsdWUgYXMgRG9ja0xheW91dE5vZGUpLmtpbmQpIHtcbiAgICAgIHJldHVybiB7IHJvb3Q6IHZhbHVlIGFzIERvY2tMYXlvdXROb2RlLCBmbG9hdGluZzogW10sIHRpdGxlczoge30gfTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXlvdXQgPSB2YWx1ZSBhcyBEb2NrTGF5b3V0IHwgRG9ja0xheW91dFNuYXBzaG90O1xuICAgIHJldHVybiB7XG4gICAgICByb290OiBsYXlvdXQucm9vdCA/PyBudWxsLFxuICAgICAgZmxvYXRpbmc6IEFycmF5LmlzQXJyYXkobGF5b3V0LmZsb2F0aW5nKVxuICAgICAgICA/IGxheW91dC5mbG9hdGluZy5tYXAoKGZsb2F0aW5nKSA9PiB0aGlzLm5vcm1hbGl6ZUZsb2F0aW5nTGF5b3V0KGZsb2F0aW5nKSlcbiAgICAgICAgOiBbXSxcbiAgICAgIHRpdGxlczogbGF5b3V0LnRpdGxlcyA/IHsgLi4ubGF5b3V0LnRpdGxlcyB9IDoge30sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuZG9ja2VkRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5mbG9hdGluZ0xheWVyRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuXG4gICAgaWYgKHRoaXMucm9vdExheW91dCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLnJlbmRlck5vZGUodGhpcy5yb290TGF5b3V0LCBbXSk7XG4gICAgICB0aGlzLmRvY2tlZEVsLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlckZsb2F0aW5nUGFuZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTm9kZShcbiAgICBub2RlOiBEb2NrTGF5b3V0Tm9kZSxcbiAgICBwYXRoOiBudW1iZXJbXSxcbiAgICBmbG9hdGluZ0luZGV4PzogbnVtYmVyLFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gJ3NwbGl0Jykge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyU3BsaXQobm9kZSwgcGF0aCwgZmxvYXRpbmdJbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyU3RhY2sobm9kZSwgcGF0aCwgZmxvYXRpbmdJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckZsb2F0aW5nUGFuZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mbG9hdGluZ0xheWVyRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5mbG9hdGluZ0xheW91dHMuZm9yRWFjaCgoZmxvYXRpbmcsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnZG9jay1mbG9hdGluZycpO1xuICAgICAgd3JhcHBlci5kYXRhc2V0WydwYXRoJ10gPSB0aGlzLmZvcm1hdFBhdGgoe1xuICAgICAgICB0eXBlOiAnZmxvYXRpbmcnLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgc2VnbWVudHM6IFtdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBmbG9hdGluZy5ib3VuZHM7XG4gICAgICB3cmFwcGVyLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICAgIHdyYXBwZXIuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgIHdyYXBwZXIuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG5cbiAgICAgIGNvbnN0IHpJbmRleCA9IHRoaXMuZ2V0RmxvYXRpbmdQYW5lWkluZGV4KGluZGV4KTtcbiAgICAgIHdyYXBwZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHpJbmRleCk7XG5cbiAgICAgIGNvbnN0IGNocm9tZSA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjaHJvbWUuY2xhc3NMaXN0LmFkZCgnZG9jay1mbG9hdGluZ19fY2hyb21lJyk7XG4gICAgICBjaHJvbWUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXZlbnQpID0+XG4gICAgICAgIHRoaXMuYmVnaW5GbG9hdGluZ0RyYWcoZXZlbnQsIGluZGV4LCB3cmFwcGVyLCBjaHJvbWUpLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGl0bGUuY2xhc3NMaXN0LmFkZCgnZG9jay1mbG9hdGluZ19fdGl0bGUnKTtcbiAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gdGhpcy5nZXRGbG9hdGluZ1dpbmRvd1RpdGxlKGZsb2F0aW5nKTtcbiAgICAgIGNocm9tZS5hcHBlbmRDaGlsZCh0aXRsZSk7XG5cbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoY2hyb21lKTtcblxuICAgICAgaWYgKGZsb2F0aW5nLnJvb3QpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMucmVuZGVyTm9kZShmbG9hdGluZy5yb290LCBbXSwgaW5kZXgpO1xuICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2RvY2stZmxvYXRpbmdfX3N0YWNrJyk7XG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBsYWNlaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2snKTtcbiAgICAgICAgcGxhY2Vob2xkZXIuZGF0YXNldFsncGF0aCddID0gdGhpcy5mb3JtYXRQYXRoKHtcbiAgICAgICAgICB0eXBlOiAnZmxvYXRpbmcnLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHNlZ21lbnRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVtcHR5ID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZW1wdHkuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFja19fcGFuZScpO1xuICAgICAgICBlbXB0eS50ZXh0Q29udGVudCA9ICdObyBwYW5lcyBjb25maWd1cmVkJztcbiAgICAgICAgcGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQoZW1wdHkpO1xuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzaXplckNvbmZpZ3M6IHsgY2xhc3Nlczogc3RyaW5nW107IGVkZ2VzOiBGbG9hdGluZ1Jlc2l6ZUVkZ2VzIH1bXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AtbGVmdCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdsZWZ0JywgdmVydGljYWw6ICd0b3AnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wJ10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ25vbmUnLCB2ZXJ0aWNhbDogJ3RvcCcgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AtcmlnaHQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ3RvcCcgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS1yaWdodCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnbm9uZScgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20tcmlnaHQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ2JvdHRvbScgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20nXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbm9uZScsIHZlcnRpY2FsOiAnYm90dG9tJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1sZWZ0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ2JvdHRvbScgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS1sZWZ0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ25vbmUnIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXNpemVyQ29uZmlncy5mb3JFYWNoKCh7IGNsYXNzZXMsIGVkZ2VzIH0pID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplciA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlc2l6ZXIuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcbiAgICAgICAgcmVzaXplci5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldmVudCkgPT5cbiAgICAgICAgICB0aGlzLmJlZ2luRmxvYXRpbmdSZXNpemUoZXZlbnQsIGluZGV4LCB3cmFwcGVyLCByZXNpemVyLCBlZGdlcyksXG4gICAgICAgICk7XG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQocmVzaXplcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmxvYXRpbmdMYXllckVsLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWdpbkZsb2F0aW5nRHJhZyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgd3JhcHBlcjogSFRNTEVsZW1lbnQsXG4gICAgaGFuZGxlOiBIVE1MRWxlbWVudCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZmxvYXRpbmcuYm91bmRzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogbm8tb3A6IHBvaW50ZXIgY2FwdHVyZSBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiBhbGwgZW52aXJvbm1lbnRzICovXG4gICAgfVxuXG4gICAgdGhpcy5wcm9tb3RlRmxvYXRpbmdQYW5lKGluZGV4LCB3cmFwcGVyKTtcblxuICAgIHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgPSB7XG4gICAgICBpbmRleCxcbiAgICAgIHBvaW50ZXJJZDogZXZlbnQucG9pbnRlcklkLFxuICAgICAgc3RhcnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgc3RhcnRMZWZ0OiBsZWZ0LFxuICAgICAgc3RhcnRUb3A6IHRvcCxcbiAgICAgIHdyYXBwZXIsXG4gICAgICBoYW5kbGUsXG4gICAgfTtcblxuICAgIHRoaXMuc3RhcnRQb2ludGVyVHJhY2tpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5GbG9hdGluZ1Jlc2l6ZShcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgd3JhcHBlcjogSFRNTEVsZW1lbnQsXG4gICAgaGFuZGxlOiBIVE1MRWxlbWVudCxcbiAgICBlZGdlczogRmxvYXRpbmdSZXNpemVFZGdlcyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0cnkge1xuICAgICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKiBwb2ludGVyIGNhcHR1cmUgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgKi9cbiAgICB9XG5cbiAgICB0aGlzLnByb21vdGVGbG9hdGluZ1BhbmUoaW5kZXgsIHdyYXBwZXIpO1xuXG4gICAgdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlID0ge1xuICAgICAgaW5kZXgsXG4gICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCxcbiAgICAgIHN0YXJ0WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHN0YXJ0WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHN0YXJ0V2lkdGg6IGZsb2F0aW5nLmJvdW5kcy53aWR0aCxcbiAgICAgIHN0YXJ0SGVpZ2h0OiBmbG9hdGluZy5ib3VuZHMuaGVpZ2h0LFxuICAgICAgc3RhcnRMZWZ0OiBmbG9hdGluZy5ib3VuZHMubGVmdCxcbiAgICAgIHN0YXJ0VG9wOiBmbG9hdGluZy5ib3VuZHMudG9wLFxuICAgICAgd3JhcHBlcixcbiAgICAgIGhhbmRsZSxcbiAgICAgIGVkZ2VzLFxuICAgIH07XG5cbiAgICB0aGlzLnN0YXJ0UG9pbnRlclRyYWNraW5nKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZsb2F0aW5nRHJhZ01vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZTtcbiAgICBpZiAoIXN0YXRlIHx8IGV2ZW50LnBvaW50ZXJJZCAhPT0gc3RhdGUucG9pbnRlcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gc3RhdGUuc3RhcnRZO1xuICAgIGNvbnN0IG5ld0xlZnQgPSBzdGF0ZS5zdGFydExlZnQgKyBkZWx0YVg7XG4gICAgY29uc3QgbmV3VG9wID0gc3RhdGUuc3RhcnRUb3AgKyBkZWx0YVk7XG5cbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLmxlZnQgPSBgJHtuZXdMZWZ0fXB4YDtcbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLnRvcCA9IGAke25ld1RvcH1weGA7XG5cbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3N0YXRlLmluZGV4XTtcbiAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy5sZWZ0ID0gbmV3TGVmdDtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy50b3AgPSBuZXdUb3A7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVGbG9hdGluZ0RyYWdEcm9wVGFyZ2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kRmxvYXRpbmdEcmFnKHBvaW50ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlO1xuICAgIGlmICghc3RhdGUgfHwgcG9pbnRlcklkICE9PSBzdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgc3RhdGUuaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShzdGF0ZS5wb2ludGVySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogbm8tb3AgKi9cbiAgICB9XG5cbiAgICBjb25zdCBkcm9wSGFuZGxlZCA9IHN0YXRlLmRyb3BUYXJnZXRcbiAgICAgID8gdGhpcy5oYW5kbGVGbG9hdGluZ1N0YWNrRHJvcChzdGF0ZS5pbmRleCwgc3RhdGUuZHJvcFRhcmdldC5wYXRoLCBzdGF0ZS5kcm9wVGFyZ2V0LnpvbmUpXG4gICAgICA6IGZhbHNlO1xuXG4gICAgdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgIGlmICghZHJvcEhhbmRsZWQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGbG9hdGluZ0RyYWdEcm9wVGFyZ2V0KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxvYXRpbmdEcmFnU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5maW5kU3RhY2tBdFBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIGlmICghc3RhY2spIHtcbiAgICAgIGlmIChzdGF0ZS5kcm9wVGFyZ2V0KSB7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5kcm9wVGFyZ2V0O1xuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgaWYgKCFwYXRoIHx8IChwYXRoLnR5cGUgPT09ICdmbG9hdGluZycgJiYgcGF0aC5pbmRleCA9PT0gc3RhdGUuaW5kZXgpKSB7XG4gICAgICBpZiAoc3RhdGUuZHJvcFRhcmdldCkge1xuICAgICAgICBkZWxldGUgc3RhdGUuZHJvcFRhcmdldDtcbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHN0aWNreSB6b25lIHdoZW4gbW92aW5nIHRvIGFub3RoZXIgc3RhY2sgd2hpbGUgZHJhZ2dpbmcgdGhlXG4gICAgLy8gZmxvYXRpbmcgd2luZG93IHNvIHRoZSBzaWRlIGRvZXNuJ3QgY2Fycnkgb3Zlci5cbiAgICBpZiAodGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgJiYgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgIT09IHN0YWNrKSB7XG4gICAgICBkZWxldGUgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddO1xuICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmNvbXB1dGVEcm9wWm9uZShzdGFjaywgZXZlbnQsIHRoaXMuZXh0cmFjdERyb3Bab25lRnJvbUV2ZW50KGV2ZW50KSk7XG5cbiAgICBpZiAoem9uZSkge1xuICAgICAgc3RhdGUuZHJvcFRhcmdldCA9IHsgcGF0aCwgem9uZSB9O1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZHJvcFRhcmdldCkge1xuICAgICAgZGVsZXRlIHN0YXRlLmRyb3BUYXJnZXQ7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93RHJvcEluZGljYXRvcihzdGFjaywgem9uZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZsb2F0aW5nUmVzaXplTW92ZShldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSB8fCBldmVudC5wb2ludGVySWQgIT09IHN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSBzdGF0ZS5zdGFydFg7XG4gICAgY29uc3QgZGVsdGFZID0gZXZlbnQuY2xpZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDE5MjtcbiAgICBjb25zdCBtaW5IZWlnaHQgPSAxMjg7XG4gICAgbGV0IG5ld1dpZHRoID0gc3RhdGUuc3RhcnRXaWR0aDtcbiAgICBsZXQgbmV3SGVpZ2h0ID0gc3RhdGUuc3RhcnRIZWlnaHQ7XG4gICAgbGV0IG5ld0xlZnQgPSBzdGF0ZS5zdGFydExlZnQ7XG4gICAgbGV0IG5ld1RvcCA9IHN0YXRlLnN0YXJ0VG9wO1xuXG4gICAgaWYgKHN0YXRlLmVkZ2VzLmhvcml6b250YWwgPT09ICdyaWdodCcpIHtcbiAgICAgIG5ld1dpZHRoID0gTWF0aC5tYXgobWluV2lkdGgsIHN0YXRlLnN0YXJ0V2lkdGggKyBkZWx0YVgpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZWRnZXMuaG9yaXpvbnRhbCA9PT0gJ2xlZnQnKSB7XG4gICAgICBuZXdXaWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBzdGF0ZS5zdGFydFdpZHRoIC0gZGVsdGFYKTtcbiAgICAgIG5ld0xlZnQgPSBzdGF0ZS5zdGFydExlZnQgKyAoc3RhdGUuc3RhcnRXaWR0aCAtIG5ld1dpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZWRnZXMudmVydGljYWwgPT09ICdib3R0b20nKSB7XG4gICAgICBuZXdIZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIHN0YXRlLnN0YXJ0SGVpZ2h0ICsgZGVsdGFZKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVkZ2VzLnZlcnRpY2FsID09PSAndG9wJykge1xuICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBzdGF0ZS5zdGFydEhlaWdodCAtIGRlbHRhWSk7XG4gICAgICBuZXdUb3AgPSBzdGF0ZS5zdGFydFRvcCArIChzdGF0ZS5zdGFydEhlaWdodCAtIG5ld0hlaWdodCk7XG4gICAgfVxuXG4gICAgc3RhdGUud3JhcHBlci5zdHlsZS53aWR0aCA9IGAke25ld1dpZHRofXB4YDtcbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLmhlaWdodCA9IGAke25ld0hlaWdodH1weGA7XG4gICAgc3RhdGUud3JhcHBlci5zdHlsZS5sZWZ0ID0gYCR7bmV3TGVmdH1weGA7XG4gICAgc3RhdGUud3JhcHBlci5zdHlsZS50b3AgPSBgJHtuZXdUb3B9cHhgO1xuXG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tzdGF0ZS5pbmRleF07XG4gICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICBmbG9hdGluZy5ib3VuZHMud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICBmbG9hdGluZy5ib3VuZHMubGVmdCA9IG5ld0xlZnQ7XG4gICAgICBmbG9hdGluZy5ib3VuZHMudG9wID0gbmV3VG9wO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5kRmxvYXRpbmdSZXNpemUocG9pbnRlcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlIHx8IHBvaW50ZXJJZCAhPT0gc3RhdGUucG9pbnRlcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHN0YXRlLmhhbmRsZS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoc3RhdGUucG9pbnRlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIG5vLW9wICovXG4gICAgfVxuXG4gICAgdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlID0gbnVsbDtcbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbG9hdGluZ1BhbmVaSW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuIDEwICsgaW5kZXg7XG4gICAgfVxuICAgIGNvbnN0IGJhc2UgPVxuICAgICAgdHlwZW9mIGZsb2F0aW5nLnpJbmRleCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGZsb2F0aW5nLnpJbmRleClcbiAgICAgICAgPyBmbG9hdGluZy56SW5kZXhcbiAgICAgICAgOiAxMCArIGluZGV4O1xuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9tb3RlRmxvYXRpbmdQYW5lKGluZGV4OiBudW1iZXIsIHdyYXBwZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heEV4aXN0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHMucmVkdWNlKChtYXgsIGxheW91dCwgaWR4KSA9PiB7XG4gICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICByZXR1cm4gbWF4O1xuICAgICAgfVxuICAgICAgY29uc3QgeiA9IGlkeCA9PT0gaW5kZXggPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiB0aGlzLmdldEZsb2F0aW5nUGFuZVpJbmRleChpZHgpO1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgeik7XG4gICAgfSwgMCk7XG5cbiAgICBjb25zdCBuZXh0WiA9IE1hdGgubWF4KG1heEV4aXN0aW5nICsgMiwgMTIpO1xuICAgIGZsb2F0aW5nLnpJbmRleCA9IG5leHRaO1xuICAgIHdyYXBwZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKG5leHRaKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmxvYXRpbmdXcmFwcGVyKGluZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYC5kb2NrLWZsb2F0aW5nW2RhdGEtcGF0aD1cIiR7dGhpcy5mb3JtYXRQYXRoKHtcbiAgICAgIHR5cGU6ICdmbG9hdGluZycsXG4gICAgICBpbmRleCxcbiAgICAgIHNlZ21lbnRzOiBbXSxcbiAgICB9KX1cIl1gO1xuICAgIHJldHVybiB0aGlzLmZsb2F0aW5nTGF5ZXJFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihzZWxlY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UG9pbnRlclRyYWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvaW50ZXJUcmFja2luZ0FjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgIHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFBvaW50ZXJUcmFja2luZ0lmSWRsZSgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBvaW50ZXJUcmFja2luZ0FjdGl2ZSAmJlxuICAgICAgIXRoaXMucmVzaXplU3RhdGUgJiZcbiAgICAgICF0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlICYmXG4gICAgICAhdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlXG4gICAgKSB7XG4gICAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICAgIHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbG9hdGluZ1dpbmRvd1RpdGxlKGZsb2F0aW5nOiBEb2NrRmxvYXRpbmdTdGFja0xheW91dCk6IHN0cmluZyB7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAnRmxvYXRpbmcgUGFuZSc7XG4gICAgaWYgKCFmbG9hdGluZyB8fCAhZmxvYXRpbmcucm9vdCkge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZlcnJlZCA9IGZsb2F0aW5nLmFjdGl2ZVBhbmUgPz8gdGhpcy5maW5kRmlyc3RQYW5lTmFtZShmbG9hdGluZy5yb290KTtcbiAgICBpZiAoIXByZWZlcnJlZCkge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRpdGxlc1twcmVmZXJyZWRdID8/IHByZWZlcnJlZCA/PyBmYWxsYmFjaztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmxvYXRpbmdXaW5kb3dUaXRsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yID0gYC5kb2NrLWZsb2F0aW5nW2RhdGEtcGF0aD1cIiR7dGhpcy5mb3JtYXRQYXRoKHtcbiAgICAgIHR5cGU6ICdmbG9hdGluZycsXG4gICAgICBpbmRleCxcbiAgICAgIHNlZ21lbnRzOiBbXSxcbiAgICB9KX1cIl1gO1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmZsb2F0aW5nTGF5ZXJFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihzZWxlY3Rvcik7XG4gICAgaWYgKCF3cmFwcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGVFbCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLWZsb2F0aW5nX190aXRsZScpO1xuICAgIGlmICghdGl0bGVFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0aGlzLmdldEZsb2F0aW5nV2luZG93VGl0bGUoZmxvYXRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTcGxpdChcbiAgICBub2RlOiBEb2NrU3BsaXROb2RlLFxuICAgIHBhdGg6IG51bWJlcltdLFxuICAgIGZsb2F0aW5nSW5kZXg/OiBudW1iZXIsXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkb2NrLXNwbGl0Jyk7XG4gICAgY29udGFpbmVyLmRhdGFzZXRbJ2RpcmVjdGlvbiddID0gbm9kZS5kaXJlY3Rpb247XG4gICAgY29udGFpbmVyLmRhdGFzZXRbJ3BhdGgnXSA9IHBhdGguam9pbignLycpO1xuXG4gICAgY29uc3Qgc2l6ZXMgPSBBcnJheS5pc0FycmF5KG5vZGUuc2l6ZXMpID8gbm9kZS5zaXplcyA6IFtdO1xuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZFdyYXBwZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY2hpbGRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3BsaXRfX2NoaWxkJyk7XG4gICAgICBjaGlsZFdyYXBwZXIuZGF0YXNldFsnaW5kZXgnXSA9IFN0cmluZyhpbmRleCk7XG5cbiAgICAgIGNvbnN0IHNpemUgPSBzaXplc1tpbmRleF07XG4gICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShzaXplKSkge1xuICAgICAgICBjaGlsZFdyYXBwZXIuc3R5bGUuZmxleCA9IGAke01hdGgubWF4KHNpemUsIDApfSAxIDBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRXcmFwcGVyLnN0eWxlLmZsZXggPSAnMSAxIDAnO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFdyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJOb2RlKGNoaWxkLCBbLi4ucGF0aCwgaW5kZXhdLCBmbG9hdGluZ0luZGV4KSk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hpbGRXcmFwcGVyKTtcblxuICAgICAgaWYgKGluZGV4IDwgbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGRpdmlkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3BsaXRfX2RpdmlkZXInKTtcbiAgICAgICAgZGl2aWRlci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc2VwYXJhdG9yJyk7XG4gICAgICAgIGRpdmlkZXIudGFiSW5kZXggPSAwO1xuICAgICAgICBkaXZpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PlxuICAgICAgICAgIHRoaXMuYmVnaW5SZXNpemUoXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGZsb2F0aW5nSW5kZXggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXg6IGZsb2F0aW5nSW5kZXgsIHNlZ21lbnRzOiBbLi4ucGF0aF0gfVxuICAgICAgICAgICAgICA6IHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzOiBbLi4ucGF0aF0gfSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXZpZGVyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclN0YWNrKFxuICAgIG5vZGU6IERvY2tTdGFja05vZGUsXG4gICAgcGF0aDogbnVtYmVyW10sXG4gICAgZmxvYXRpbmdJbmRleD86IG51bWJlcixcbiAgKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzdGFjay5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrJyk7XG4gICAgY29uc3QgbG9jYXRpb246IERvY2tQYXRoID1cbiAgICAgIHR5cGVvZiBmbG9hdGluZ0luZGV4ID09PSAnbnVtYmVyJ1xuICAgICAgICA/IHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXg6IGZsb2F0aW5nSW5kZXgsIHNlZ21lbnRzOiBbLi4ucGF0aF0gfVxuICAgICAgICA6IHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzOiBbLi4ucGF0aF0gfTtcbiAgICBzdGFjay5kYXRhc2V0WydwYXRoJ10gPSB0aGlzLmZvcm1hdFBhdGgobG9jYXRpb24pO1xuXG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBoZWFkZXIuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFja19faGVhZGVyJyk7XG4gICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWJsaXN0Jyk7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGVudC5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19jb250ZW50Jyk7XG5cbiAgICBjb25zdCBwYW5lcyA9IEFycmF5LmZyb20obmV3IFNldChub2RlLnBhbmVzKSk7XG4gICAgaWYgKHBhbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZW1wdHkgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZW1wdHkuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFja19fcGFuZScpO1xuICAgICAgZW1wdHkudGV4dENvbnRlbnQgPSAnTm8gcGFuZXMgY29uZmlndXJlZCc7XG4gICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVtcHR5KTtcbiAgICAgIHN0YWNrLmFwcGVuZChoZWFkZXIsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZVBhbmUgPSBwYW5lcy5pbmNsdWRlcyhub2RlLmFjdGl2ZVBhbmUgPz8gJycpXG4gICAgICA/IG5vZGUuYWN0aXZlUGFuZSFcbiAgICAgIDogcGFuZXNbMF07XG5cbiAgICBjb25zdCBiYXNlU2x1ZyA9IHBhdGgubGVuZ3RoID8gcGF0aC5qb2luKCctJykgOiAncm9vdCc7XG4gICAgY29uc3QgcGF0aFNsdWcgPVxuICAgICAgdHlwZW9mIGZsb2F0aW5nSW5kZXggPT09ICdudW1iZXInID8gYGYke2Zsb2F0aW5nSW5kZXh9LSR7YmFzZVNsdWd9YCA6IGJhc2VTbHVnO1xuICAgIHBhbmVzLmZvckVhY2goKHBhbmVOYW1lKSA9PiB7XG4gICAgICBjb25zdCBwYW5lU2x1Z1JhdyA9IHBhbmVOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICctJyk7XG4gICAgICBjb25zdCBwYW5lU2x1ZyA9IHBhbmVTbHVnUmF3Lmxlbmd0aCA+IDAgPyBwYW5lU2x1Z1JhdyA6ICdwYW5lJztcbiAgICAgIGNvbnN0IHRhYklkID0gYCR7dGhpcy5pbnN0YW5jZUlkfS10YWItJHtwYXRoU2x1Z30tJHtwYW5lU2x1Z31gO1xuICAgICAgY29uc3QgcGFuZWxJZCA9IGAke3RoaXMuaW5zdGFuY2VJZH0tcGFuZWwtJHtwYXRoU2x1Z30tJHtwYW5lU2x1Z31gO1xuXG4gICAgICBjb25zdCBidXR0b24gPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgYnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdkb2NrLXRhYicpO1xuICAgICAgYnV0dG9uLmRhdGFzZXRbJ3BhbmUnXSA9IHBhbmVOYW1lO1xuICAgICAgYnV0dG9uLmlkID0gdGFiSWQ7XG4gICAgICBidXR0b24udGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlc1twYW5lTmFtZV0gPz8gcGFuZU5hbWU7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RhYicpO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsIHBhbmVsSWQpO1xuICAgICAgaWYgKHBhbmVOYW1lID09PSBhY3RpdmVQYW5lKSB7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdkb2NrLXRhYi0tYWN0aXZlJyk7XG4gICAgICB9XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgU3RyaW5nKHBhbmVOYW1lID09PSBhY3RpdmVQYW5lKSk7XG4gICAgICBidXR0b24uZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFja0VsID0gYnV0dG9uLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFjaycpO1xuICAgICAgICB0aGlzLmNhcHR1cmVUYWJEcmFnTWV0cmljcyhldmVudCwgc3RhY2tFbCA/PyBudWxsKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCAoKSA9PiB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCkpO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCAoKSA9PiB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCkpO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFja0VsID0gYnV0dG9uLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFjaycpO1xuICAgICAgICB0aGlzLmJlZ2luUGFuZURyYWcoZXZlbnQsIHRoaXMuY2xvbmVQYXRoKGxvY2F0aW9uKSwgcGFuZU5hbWUsIHN0YWNrRWwgPz8gbnVsbCk7XG4gICAgICB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmVuZFBhbmVEcmFnKCk7XG4gICAgICAgIHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKTtcbiAgICAgIH0pO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmFjdGl2YXRlUGFuZShzdGFjaywgcGFuZU5hbWUsIHRoaXMuY2xvbmVQYXRoKGxvY2F0aW9uKSk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ2RvY2stcGFuZS1hY3RpdmF0ZWQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgcGFuZTogcGFuZU5hbWUgfSxcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGJ1dHRvbik7XG5cbiAgICAgIGNvbnN0IHBhbmVIb3N0ID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBhbmVIb3N0LmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2tfX3BhbmUnKTtcbiAgICAgIHBhbmVIb3N0LmRhdGFzZXRbJ3BhbmUnXSA9IHBhbmVOYW1lO1xuICAgICAgcGFuZUhvc3QuaWQgPSBwYW5lbElkO1xuICAgICAgcGFuZUhvc3Quc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RhYnBhbmVsJyk7XG4gICAgICBwYW5lSG9zdC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIHRhYklkKTtcbiAgICAgIGlmIChwYW5lTmFtZSAhPT0gYWN0aXZlUGFuZSkge1xuICAgICAgICBwYW5lSG9zdC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICcnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2xvdEVsID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdzbG90Jyk7XG4gICAgICBzbG90RWwubmFtZSA9IHBhbmVOYW1lO1xuICAgICAgcGFuZUhvc3QuYXBwZW5kQ2hpbGQoc2xvdEVsKTtcbiAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQocGFuZUhvc3QpO1xuICAgIH0pO1xuXG4gICAgc3RhY2suZGF0YXNldFsnYWN0aXZlUGFuZSddID0gYWN0aXZlUGFuZTtcbiAgICBzdGFjay5hcHBlbmQoaGVhZGVyLCBjb250ZW50KTtcbiAgICByZXR1cm4gc3RhY2s7XG4gIH1cblxuICBwcml2YXRlIGJlZ2luUmVzaXplKFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICBwYXRoOiBEb2NrUGF0aCxcbiAgICBpbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGRpdmlkZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWRpdmlkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IChjb250YWluZXIuZGF0YXNldFsnZGlyZWN0aW9uJ10gYXMgJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJykgPz8gJ2hvcml6b250YWwnO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShjb250YWluZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJzpzY29wZSA+IC5kb2NrLXNwbGl0X19jaGlsZCcpKTtcbiAgICBjb25zdCBpbml0aWFsU2l6ZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IHJlY3Qud2lkdGggOiByZWN0LmhlaWdodDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGJlZm9yZVNpemUgPSBpbml0aWFsU2l6ZXNbaW5kZXhdO1xuICAgIGNvbnN0IGFmdGVyU2l6ZSA9IGluaXRpYWxTaXplc1tpbmRleCArIDFdO1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuXG4gICAgZGl2aWRlci5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIGRpdmlkZXIuZGF0YXNldFsncmVzaXppbmcnXSA9ICd0cnVlJztcbiAgICB0aGlzLnJlc2l6ZVN0YXRlID0ge1xuICAgICAgcGF0aDogdGhpcy5jbG9uZVBhdGgocGF0aCksXG4gICAgICBpbmRleCxcbiAgICAgIHBvaW50ZXJJZDogZXZlbnQucG9pbnRlcklkLFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBjb250YWluZXIsXG4gICAgICBkaXZpZGVyLFxuICAgICAgc3RhcnRQb3MsXG4gICAgICBpbml0aWFsU2l6ZXMsXG4gICAgICBiZWZvcmVTaXplLFxuICAgICAgYWZ0ZXJTaXplLFxuICAgIH07XG5cbiAgICB0aGlzLnN0YXJ0UG9pbnRlclRyYWNraW5nKCk7XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2l6ZVN0YXRlICYmIGV2ZW50LnBvaW50ZXJJZCA9PT0gdGhpcy5yZXNpemVTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5yZXNpemVTdGF0ZTtcbiAgICAgIGNvbnN0IHNwbGl0Tm9kZSA9IHRoaXMucmVzb2x2ZVNwbGl0Tm9kZShzdGF0ZS5wYXRoKTtcbiAgICAgIGlmICghc3BsaXROb2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFBvcyA9IHN0YXRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBldmVudC5jbGllbnRYIDogZXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnN0IGRlbHRhID0gY3VycmVudFBvcyAtIHN0YXRlLnN0YXJ0UG9zO1xuICAgICAgY29uc3QgbWluU2l6ZSA9IDQ4O1xuICAgICAgY29uc3QgcGFpclRvdGFsID0gc3RhdGUuYmVmb3JlU2l6ZSArIHN0YXRlLmFmdGVyU2l6ZTtcblxuICAgICAgbGV0IG5ld0JlZm9yZSA9IE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heChzdGF0ZS5iZWZvcmVTaXplICsgZGVsdGEsIG1pblNpemUpLFxuICAgICAgICBwYWlyVG90YWwgLSBtaW5TaXplLFxuICAgICAgKTtcbiAgICAgIGxldCBuZXdBZnRlciA9IHBhaXJUb3RhbCAtIG5ld0JlZm9yZTtcblxuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobmV3QmVmb3JlKSB8fCAhTnVtYmVyLmlzRmluaXRlKG5ld0FmdGVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdBZnRlciA8IG1pblNpemUpIHtcbiAgICAgICAgbmV3QWZ0ZXIgPSBtaW5TaXplO1xuICAgICAgICBuZXdCZWZvcmUgPSBwYWlyVG90YWwgLSBtaW5TaXplO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdTaXplc1BpeGVscyA9IFsuLi5zdGF0ZS5pbml0aWFsU2l6ZXNdO1xuICAgICAgbmV3U2l6ZXNQaXhlbHNbc3RhdGUuaW5kZXhdID0gbmV3QmVmb3JlO1xuICAgICAgbmV3U2l6ZXNQaXhlbHNbc3RhdGUuaW5kZXggKyAxXSA9IG5ld0FmdGVyO1xuXG4gICAgICBjb25zdCB0b3RhbCA9IG5ld1NpemVzUGl4ZWxzLnJlZHVjZSgoYWNjLCBzaXplKSA9PiBhY2MgKyBzaXplLCAwKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0b3RhbCA+IDAgPyBuZXdTaXplc1BpeGVscy5tYXAoKHNpemUpID0+IHNpemUgLyB0b3RhbCkgOiBbXTtcblxuICAgICAgc3BsaXROb2RlLnNpemVzID0gbm9ybWFsaXplZDtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShzdGF0ZS5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJzpzY29wZSA+IC5kb2NrLXNwbGl0X19jaGlsZCcpKTtcbiAgICAgIG5vcm1hbGl6ZWQuZm9yRWFjaCgoc2l6ZSwgaWR4KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZHJlbltpZHhdKSB7XG4gICAgICAgICAgY2hpbGRyZW5baWR4XS5zdHlsZS5mbGV4ID0gYCR7TWF0aC5tYXgoc2l6ZSwgMCl9IDEgMGA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlICYmIGV2ZW50LnBvaW50ZXJJZCA9PT0gdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgdGhpcy5oYW5kbGVGbG9hdGluZ1Jlc2l6ZU1vdmUoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlICYmIGV2ZW50LnBvaW50ZXJJZCA9PT0gdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc3RhdGUnLCB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlKTtcbiAgICAgIHRoaXMuaGFuZGxlRmxvYXRpbmdEcmFnTW92ZShldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblBvaW50ZXJVcChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzaXplU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLnJlc2l6ZVN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgY29uc3QgZGl2aWRlciA9IHRoaXMucmVzaXplU3RhdGUuZGl2aWRlcjtcbiAgICAgIGRpdmlkZXIuZGF0YXNldFsncmVzaXppbmcnXSA9ICdmYWxzZSc7XG4gICAgICBkaXZpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZSh0aGlzLnJlc2l6ZVN0YXRlLnBvaW50ZXJJZCk7XG4gICAgICB0aGlzLnJlc2l6ZVN0YXRlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mbG9hdGluZ0RyYWdTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICB0aGlzLmVuZEZsb2F0aW5nRHJhZyhldmVudC5wb2ludGVySWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICB0aGlzLmVuZEZsb2F0aW5nUmVzaXplKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdG9wUG9pbnRlclRyYWNraW5nSWZJZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGNhcHR1cmVUYWJEcmFnTWV0cmljcyhldmVudDogUG9pbnRlckV2ZW50LCBzdGFja0VsOiBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXN0YWNrRWwpIHtcbiAgICAgIHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRYKSB8fCAhTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdUYWJEcmFnTWV0cmljcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaG9zdFJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHN0YWNrUmVjdCA9IHN0YWNrRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBwb2ludGVyT2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSBzdGFja1JlY3QubGVmdDtcbiAgICBjb25zdCBwb2ludGVyT2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSBzdGFja1JlY3QudG9wO1xuICAgIGNvbnN0IGxlZnQgPSBzdGFja1JlY3QubGVmdCAtIGhvc3RSZWN0LmxlZnQ7XG4gICAgY29uc3QgdG9wID0gc3RhY2tSZWN0LnRvcCAtIGhvc3RSZWN0LnRvcDtcbiAgICBjb25zdCB3aWR0aCA9IE51bWJlci5pc0Zpbml0ZShzdGFja1JlY3Qud2lkdGgpID8gc3RhY2tSZWN0LndpZHRoIDogMDtcbiAgICBjb25zdCBoZWlnaHQgPSBOdW1iZXIuaXNGaW5pdGUoc3RhY2tSZWN0LmhlaWdodCkgPyBzdGFja1JlY3QuaGVpZ2h0IDogMDtcblxuICAgIHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzID0ge1xuICAgICAgcG9pbnRlck9mZnNldFgsXG4gICAgICBwb2ludGVyT2Zmc2V0WSxcbiAgICAgIGxlZnQsXG4gICAgICB0b3AsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdUYWJEcmFnTWV0cmljcyA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGJlZ2luUGFuZURyYWcoXG4gICAgZXZlbnQ6IERyYWdFdmVudCxcbiAgICBwYXRoOiBEb2NrUGF0aCxcbiAgICBwYW5lOiBzdHJpbmcsXG4gICAgc3RhY2tFbDogSFRNTEVsZW1lbnQgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGdob3N0IGVsZW1lbnQgZm9yIHRoZSBkcmFnIGltYWdlLiBUaGlzIHByZXZlbnRzIHRoZSBicm93c2VyIGZyb20gY2FuY2VsbGluZ1xuICAgIC8vIHRoZSBkcmFnIG9wZXJhdGlvbiB3aGVuIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGR1cmluZyByZS1yZW5kZXIuXG4gICAgY29uc3QgZ2hvc3QgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuICAgIGdob3N0LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBnaG9zdC5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgIGdob3N0LnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICBnaG9zdC5zdHlsZS53aWR0aCA9IGAkeyhldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aH1weGA7XG4gICAgZ2hvc3Quc3R5bGUuaGVpZ2h0ID0gYCR7KGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldEhlaWdodH1weGA7XG4gICAgdGhpcy5zaGFkb3dSb290Py5hcHBlbmRDaGlsZChnaG9zdCk7XG5cbiAgICAvLyBVc2UgdGhlIGdob3N0IGVsZW1lbnQgYXMgdGhlIGRyYWcgaW1hZ2UuXG4gICAgLy8gVGhlIG9mZnNldCBpcyBzZXQgdG8gd2hlcmUgdGhlIHVzZXIncyBjdXJzb3IgaXMgb24gdGhlIG9yaWdpbmFsIGVsZW1lbnQuXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShnaG9zdCwgZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG5cbiAgICAvLyBUaGUgZ2hvc3QgZWxlbWVudCBpcyBubyBsb25nZXIgbmVlZGVkIGFmdGVyIHRoZSBkcmFnIGltYWdlIGlzIHNldC5cbiAgICAvLyBXZSBkZWZlciBpdHMgcmVtb3ZhbCB0byBlbnN1cmUgdGhlIGJyb3dzZXIgaGFzIGNhcHR1cmVkIGl0LlxuICAgIHNldFRpbWVvdXQoKCkgPT4gZ2hvc3QucmVtb3ZlKCksIDApO1xuXG4gICAgY29uc3Qge1xuICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgIGZsb2F0aW5nSW5kZXgsXG4gICAgICBwb2ludGVyT2Zmc2V0WCxcbiAgICAgIHBvaW50ZXJPZmZzZXRZLFxuICAgIH0gPSB0aGlzLnByZXBhcmVQYW5lRHJhZ1NvdXJjZShwYXRoLCBwYW5lLCBzdGFja0VsLCBldmVudCk7XG5cbiAgICAvLyBDYXB0dXJlIGhlYWRlciBib3VuZHMgZm9yIGRldGVjdGluZyB3aGVuIHRvIGNvbnZlcnQgdG8gZmxvYXRpbmdcbiAgICBjb25zdCBoZWFkZXJFbCA9IHN0YWNrRWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFja19faGVhZGVyJykgPz8gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJSZWN0ID0gaGVhZGVyRWwgPyBoZWFkZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgY29uc3QgaGVhZGVyQm91bmRzID0gaGVhZGVyUmVjdFxuICAgICAgPyB7IGxlZnQ6IGhlYWRlclJlY3QubGVmdCwgdG9wOiBoZWFkZXJSZWN0LnRvcCwgcmlnaHQ6IGhlYWRlclJlY3QucmlnaHQsIGJvdHRvbTogaGVhZGVyUmVjdC5ib3R0b20gfVxuICAgICAgOiBudWxsO1xuXG4gICAgdGhpcy5kcmFnU3RhdGUgPSB7XG4gICAgICBwYW5lLFxuICAgICAgc291cmNlUGF0aDogdGhpcy5jbG9uZVBhdGgoc291cmNlUGF0aCksXG4gICAgICBmbG9hdGluZ0luZGV4LFxuICAgICAgcG9pbnRlck9mZnNldFgsXG4gICAgICBwb2ludGVyT2Zmc2V0WSxcbiAgICAgIGRyb3BIYW5kbGVkOiBmYWxzZSxcbiAgICAgIHNvdXJjZVN0YWNrRWw6IHN0YWNrRWwsXG4gICAgICBzb3VyY2VIZWFkZXJCb3VuZHM6IGhlYWRlckJvdW5kcyxcbiAgICAgIHN0YXJ0Q2xpZW50WDogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpID8gZXZlbnQuY2xpZW50WCA6IHVuZGVmaW5lZCxcbiAgICAgIHN0YXJ0Q2xpZW50WTogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpID8gZXZlbnQuY2xpZW50WSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIC8vIFByZWZlciB0aGUgcG9pbnRlciBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGRyYWdnZWQgdGFiIHRvIGF2b2lkIGp1bXBzIG9uIGNvbnZlcnNpb25cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFgpKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wb2ludGVyT2Zmc2V0WCA9IChldmVudCBhcyBhbnkpLm9mZnNldFggYXMgbnVtYmVyO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFkpKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wb2ludGVyT2Zmc2V0WSA9IChldmVudCBhcyBhbnkpLm9mZnNldFkgYXMgbnVtYmVyO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnN0YXJ0RHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJywgcGFuZSk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVQYW5lRHJhZ1NvdXJjZShcbiAgICBwYXRoOiBEb2NrUGF0aCxcbiAgICBwYW5lOiBzdHJpbmcsXG4gICAgc3RhY2tFbDogSFRNTEVsZW1lbnQgfCBudWxsLFxuICAgIGV2ZW50OiBEcmFnRXZlbnQsXG4gICk6IHsgcGF0aDogRG9ja1BhdGg7IGZsb2F0aW5nSW5kZXg6IG51bWJlciB8IG51bGw7IHBvaW50ZXJPZmZzZXRYOiBudW1iZXI7IHBvaW50ZXJPZmZzZXRZOiBudW1iZXIgfSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHBhdGgpO1xuICAgIGlmICghbG9jYXRpb24gfHwgIWxvY2F0aW9uLm5vZGUucGFuZXMuaW5jbHVkZXMocGFuZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZsb2F0aW5nSW5kZXg6IG51bGwsXG4gICAgICAgIHBvaW50ZXJPZmZzZXRYOiAwLFxuICAgICAgICBwb2ludGVyT2Zmc2V0WTogMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLnBlbmRpbmdUYWJEcmFnTWV0cmljcztcblxuICAgIGNvbnN0IGRvbUhhc1NpYmxpbmcgPVxuICAgICAgISFzdGFja0VsICYmXG4gICAgICBBcnJheS5mcm9tKHN0YWNrRWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXRhYicpKS5zb21lKFxuICAgICAgICAoYnV0dG9uKSA9PiBidXR0b24uZGF0YXNldFsncGFuZSddICYmIGJ1dHRvbi5kYXRhc2V0WydwYW5lJ10gIT09IHBhbmUsXG4gICAgICApO1xuXG4gICAgY29uc3QgaGFzU2libGluZ0luU3RhY2sgPSBsb2NhdGlvbi5ub2RlLnBhbmVzLnNvbWUoKGV4aXN0aW5nKSA9PiBleGlzdGluZyAhPT0gcGFuZSk7XG4gICAgY29uc3QgZmxvYXRpbmcgPSBsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnID8gdGhpcy5mbG9hdGluZ0xheW91dHNbbG9jYXRpb24uaW5kZXhdIDogbnVsbDtcbiAgICBjb25zdCBmbG9hdGluZ1BhbmVDb3VudCA9XG4gICAgICBmbG9hdGluZyAmJiBmbG9hdGluZy5yb290ID8gdGhpcy5jb3VudFBhbmVzSW5UcmVlKGZsb2F0aW5nLnJvb3QpIDogaGFzU2libGluZ0luU3RhY2sgPyAyIDogMTtcbiAgICBjb25zdCBzaG91bGRSZXVzZUV4aXN0aW5nV2luZG93ID1cbiAgICAgIGxvY2F0aW9uLmNvbnRleHQgPT09ICdmbG9hdGluZycgJiZcbiAgICAgICEhZmxvYXRpbmcgJiZcbiAgICAgICFoYXNTaWJsaW5nSW5TdGFjayAmJlxuICAgICAgIWRvbUhhc1NpYmxpbmcgJiZcbiAgICAgIGZsb2F0aW5nUGFuZUNvdW50IDw9IDE7XG5cbiAgICBpZiAoc2hvdWxkUmV1c2VFeGlzdGluZ1dpbmRvdykge1xuICAgICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgICAgICB0aGlzLnVwZGF0ZUZsb2F0aW5nV2luZG93VGl0bGUobG9jYXRpb24uaW5kZXgpO1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRGbG9hdGluZ1dyYXBwZXIobG9jYXRpb24uaW5kZXgpO1xuICAgICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICAgIHRoaXMucHJvbW90ZUZsb2F0aW5nUGFuZShsb2NhdGlvbi5pbmRleCwgd3JhcHBlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG9zdFJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBwb2ludGVyT2Zmc2V0WCA9XG4gICAgICAgICAgbWV0cmljcyAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRYKSAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLmxlZnQpICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKGZsb2F0aW5nLmJvdW5kcy5sZWZ0KVxuICAgICAgICAgICAgPyBtZXRyaWNzLnBvaW50ZXJPZmZzZXRYICsgKG1ldHJpY3MubGVmdCAtIGZsb2F0aW5nLmJvdW5kcy5sZWZ0KVxuICAgICAgICAgICAgOiBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgJiYgTnVtYmVyLmlzRmluaXRlKGZsb2F0aW5nLmJvdW5kcy5sZWZ0KVxuICAgICAgICAgICAgPyBldmVudC5jbGllbnRYIC0gaG9zdFJlY3QubGVmdCAtIGZsb2F0aW5nLmJvdW5kcy5sZWZ0XG4gICAgICAgICAgICA6IGZsb2F0aW5nLmJvdW5kcy53aWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZID1cbiAgICAgICAgICBtZXRyaWNzICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MucG9pbnRlck9mZnNldFkpICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MudG9wKSAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShmbG9hdGluZy5ib3VuZHMudG9wKVxuICAgICAgICAgICAgPyBtZXRyaWNzLnBvaW50ZXJPZmZzZXRZICsgKG1ldHJpY3MudG9wIC0gZmxvYXRpbmcuYm91bmRzLnRvcClcbiAgICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpICYmIE51bWJlci5pc0Zpbml0ZShmbG9hdGluZy5ib3VuZHMudG9wKVxuICAgICAgICAgICAgPyBldmVudC5jbGllbnRZIC0gaG9zdFJlY3QudG9wIC0gZmxvYXRpbmcuYm91bmRzLnRvcFxuICAgICAgICAgICAgOiBmbG9hdGluZy5ib3VuZHMuaGVpZ2h0IC8gMjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGZsb2F0aW5nSW5kZXg6IGxvY2F0aW9uLmluZGV4LFxuICAgICAgICAgIHBvaW50ZXJPZmZzZXRYLFxuICAgICAgICAgIHBvaW50ZXJPZmZzZXRZLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZmxvYXRpbmdJbmRleDogbnVsbCxcbiAgICAgICAgcG9pbnRlck9mZnNldFg6IDAsXG4gICAgICAgIHBvaW50ZXJPZmZzZXRZOiAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gRG8gbm90IGNvbnZlcnQgdG8gZmxvYXRpbmcgeWV0OyBhbGxvdyBpbi1oZWFkZXIgcmVvcmRlcmluZyBmaXJzdC5cbiAgICAvLyBXZSByZXR1cm4gcGxhY2Vob2xkZXIgdmFsdWVzIGFuZCB3aWxsIGNvbnZlcnQgb25jZSB0aGUgcG9pbnRlciBsZWF2ZXMgdGhlIHRhYiBoZWFkZXIuXG4gICAgY29uc3QgcG9pbnRlck9mZnNldFhWYWwgPVxuICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WClcbiAgICAgICAgPyBtZXRyaWNzLnBvaW50ZXJPZmZzZXRYXG4gICAgICAgIDogMDtcbiAgICBjb25zdCBwb2ludGVyT2Zmc2V0WVZhbCA9XG4gICAgICBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRZKVxuICAgICAgICA/IG1ldHJpY3MucG9pbnRlck9mZnNldFlcbiAgICAgICAgOiAwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBmbG9hdGluZ0luZGV4OiAtMSxcbiAgICAgIHBvaW50ZXJPZmZzZXRYOiBwb2ludGVyT2Zmc2V0WFZhbCxcbiAgICAgIHBvaW50ZXJPZmZzZXRZOiBwb2ludGVyT2Zmc2V0WVZhbCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRQYW5lRHJhZygpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUGVuZGluZ0RyYWdFbmRUaW1lb3V0KCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICB0aGlzLmRyYWdTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uID0gbnVsbDtcbiAgICBpZiAoc3RhdGUgJiYgc3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJiAhc3RhdGUuZHJvcEhhbmRsZWQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gS2VlcCBpbnRlcm5hbCBwb2ludGVyIHRyYWNraW5nIHVwLXRvLWRhdGUuXG4gICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbihldmVudCk7XG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgfVxuXG4gICAgLy8gU29tZSBicm93c2VycyBpbnRlcm1pdHRlbnRseSByZXBvcnQgKDAsMCkgZm9yIGRyYWdvdmVyIGNvb3JkaW5hdGVzLlxuICAgIC8vIE1pcnJvciB0aGUgcm9idXN0IGxvZ2ljIHVzZWQgaW4gb25Ecm9wOiBwcmVmZXIgYWN0dWFsIGV2ZW50IGNvb3JkaW5hdGVzXG4gICAgLy8gd2hlbiB2YWxpZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbGFzdCB0cmFja2VkIHBvaW50ZXIgcG9zaXRpb24uXG4gICAgY29uc3QgcG9pbnRGcm9tRXZlbnQgPVxuICAgICAgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpICYmIE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKVxuICAgICAgICA/IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHBvaW50ID1cbiAgICAgIHBvaW50RnJvbUV2ZW50ID8/XG4gICAgICAodGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvblxuICAgICAgICA/IHsgY2xpZW50WDogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi54LCBjbGllbnRZOiB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uLnkgfVxuICAgICAgICA6IG51bGwpO1xuXG4gICAgY29uc3Qgc3RhY2sgPVxuICAgICAgdGhpcy5maW5kU3RhY2tFbGVtZW50KGV2ZW50KSA/P1xuICAgICAgKHBvaW50ID8gdGhpcy5maW5kU3RhY2tBdFBvaW50KHBvaW50LmNsaWVudFgsIHBvaW50LmNsaWVudFkpIDogbnVsbCk7XG4gICAgaWYgKCFzdGFjaykge1xuICAgICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSAhPT0gJ3RydWUnKSB7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKTtcbiAgICAvLyBJZiB0aGUgaG92ZXJlZCBzdGFjayBjaGFuZ2VkLCBjbGVhciBhbnkgc3RpY2t5IHpvbmUgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyB0YXJnZXQgYmVmb3JlIGNvbXB1dGluZyB0aGUgbmV3IHpvbmUuXG4gICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICE9PSBzdGFjaykge1xuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudFpvbmVIaW50ID0gdGhpcy5leHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IHBvaW50Wm9uZUhpbnQgPSBwb2ludCA/IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKSA6IG51bGw7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuY29tcHV0ZURyb3Bab25lKHN0YWNrLCBwb2ludCA/PyBldmVudCwgcG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KTtcbiAgICB0aGlzLnNob3dEcm9wSW5kaWNhdG9yKHN0YWNrLCB6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb24oZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFksIHNjcmVlblgsIHNjcmVlblkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IGhhc1ZhbGlkQ29vcmRpbmF0ZXMgPVxuICAgICAgTnVtYmVyLmlzRmluaXRlKGNsaWVudFgpICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUoY2xpZW50WSkgJiZcbiAgICAgICEoY2xpZW50WCA9PT0gMCAmJiBjbGllbnRZID09PSAwICYmIHNjcmVlblggPT09IDAgJiYgc2NyZWVuWSA9PT0gMCk7XG5cbiAgICBpZiAoaGFzVmFsaWRDb29yZGluYXRlcykge1xuICAgICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHsgeDogY2xpZW50WCwgeTogY2xpZW50WSB9O1xuICAgICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbkZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbikge1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uO1xuICAgICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uR2xvYmFsRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZyhldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25HbG9iYWxEcmFnRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KFxuICAgIGNsaWVudFg6IG51bWJlcixcbiAgICBjbGllbnRZOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjbGllbnRYKSB8fCAhTnVtYmVyLmlzRmluaXRlKGNsaWVudFkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgYXJlIHN0aWxsIGRyYWdnaW5nIGEgdGFiIGluc2lkZSBpdHMgaGVhZGVyLCBvbmx5IGNvbnZlcnQgdG8gZmxvYXRpbmcgb25jZSB3ZSBsZWF2ZSB0aGUgaGVhZGVyIGJvdW5kcy5cbiAgICBpZiAodGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJiB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4IDwgMCkge1xuICAgICAgY29uc3QgYiA9IHRoaXMuZHJhZ1N0YXRlLnNvdXJjZUhlYWRlckJvdW5kcztcbiAgICAgIGNvbnN0IHN4ID0gdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRYID8/IGNsaWVudFg7XG4gICAgICBjb25zdCBzeSA9IHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WSA/PyBjbGllbnRZO1xuICAgICAgY29uc3QgZGlzdCA9IE1hdGguaHlwb3QoY2xpZW50WCAtIHN4LCBjbGllbnRZIC0gc3kpO1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gNDsgLy8gcGl4ZWxzIHRvIG1vdmUgYmVmb3JlIGNvbnZlcnRpbmdcbiAgICAgIGxldCBpbnNpZGVIZWFkZXIgPSBmYWxzZTtcbiAgICAgIGlmIChiKSB7XG4gICAgICAgIGluc2lkZUhlYWRlciA9IGNsaWVudFggPj0gYi5sZWZ0ICYmIGNsaWVudFggPD0gYi5yaWdodCAmJiBjbGllbnRZID49IGIudG9wICYmIGNsaWVudFkgPD0gYi5ib3R0b207XG4gICAgICB9XG4gICAgICBpZiAoIWluc2lkZUhlYWRlciAmJiBkaXN0ID4gdGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdG8gZmxvYXRpbmcgbm93IHVzaW5nIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvblxuICAgICAgICB0aGlzLmNvbnZlcnRQZW5kaW5nVGFiRHJhZ1RvRmxvYXRpbmcoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQYW5lRHJhZ0Ryb3BUYXJnZXRGcm9tUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG5cbiAgICBjb25zdCB7IGZsb2F0aW5nSW5kZXgsIHBvaW50ZXJPZmZzZXRYLCBwb2ludGVyT2Zmc2V0WSB9ID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgaWYgKGZsb2F0aW5nSW5kZXggPT09IG51bGwgfHwgZmxvYXRpbmdJbmRleCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2Zsb2F0aW5nSW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbmV3TGVmdCA9IGNsaWVudFggLSBob3N0UmVjdC5sZWZ0IC0gcG9pbnRlck9mZnNldFg7XG4gICAgY29uc3QgbmV3VG9wID0gY2xpZW50WSAtIGhvc3RSZWN0LnRvcCAtIHBvaW50ZXJPZmZzZXRZO1xuXG4gICAgZmxvYXRpbmcuYm91bmRzLmxlZnQgPSBuZXdMZWZ0O1xuICAgIGZsb2F0aW5nLmJvdW5kcy50b3AgPSBuZXdUb3A7XG5cbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRGbG9hdGluZ1dyYXBwZXIoZmxvYXRpbmdJbmRleCk7XG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIHdyYXBwZXIuc3R5bGUubGVmdCA9IGAke25ld0xlZnR9cHhgO1xuICAgICAgd3JhcHBlci5zdHlsZS50b3AgPSBgJHtuZXdUb3B9cHhgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFuZURyYWdEcm9wVGFyZ2V0RnJvbVBvaW50KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5maW5kU3RhY2tBdFBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGNvbnN0IHBhdGggPSBzdGFjayA/IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGlmICghc3RhY2sgfHwgIXBhdGgpIHtcbiAgICAgIC8vIFdoaWxlIGFjdGl2ZWx5IGRyYWdnaW5nLCBhdm9pZCBoaWRpbmcgdGhlIGluZGljYXRvciBpZiBpdCBpcyB2aXNpYmxlLlxuICAgICAgLy8gVHJhbnNpZW50IG1pc3NlcyBmcm9tIGhpdC10ZXN0aW5nIGFyZSBjb21tb24gbmVhciB0aGUgam95c3RpY2suXG4gICAgICBpZiAodGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddICE9PSAndHJ1ZScpIHtcbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHRhcmdldCBzdGFjaywgcmVzZXQgYW55IHN0aWNreSB6b25lIHNvXG4gICAgLy8gdGhlIG5ldyBkcm9wIGFyZWEgZG9lc24ndCBpbmhlcml0IHRoZSBwcmV2aW91cyBzaWRlIHNlbGVjdGlvbi5cbiAgICBpZiAodGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgJiYgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgIT09IHN0YWNrKSB7XG4gICAgICBkZWxldGUgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddO1xuICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHpvbmVIaW50ID0gdGhpcy5maW5kRHJvcFpvbmVCeVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmNvbXB1dGVEcm9wWm9uZShzdGFjaywgeyBjbGllbnRYLCBjbGllbnRZIH0sIHpvbmVIaW50KTtcbiAgICB0aGlzLnNob3dEcm9wSW5kaWNhdG9yKHN0YWNrLCB6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREcmFnUG9pbnRlclRyYWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IG51bGw7XG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZ01vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uRHJhZ1RvdWNoTW92ZSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uRHJhZ01vdXNlVXAsIHRydWUpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uRHJhZ1RvdWNoRW5kLCB0cnVlKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5vbkRyYWdUb3VjaEVuZCwgdHJ1ZSk7XG4gICAgdGhpcy5kcmFnUG9pbnRlclRyYWNraW5nQWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZ01vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uRHJhZ1RvdWNoTW92ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkRyYWdNb3VzZVVwLCB0cnVlKTtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdUb3VjaEVuZCwgdHJ1ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMub25EcmFnVG91Y2hFbmQsIHRydWUpO1xuICAgIHRoaXMuZHJhZ1BvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSBudWxsO1xuICAgIHRoaXMuY2xlYXJQZW5kaW5nRHJhZ0VuZFRpbWVvdXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25EcmFnTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5zdG9wRHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5idXR0b25zID09PSAwKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlRGVmZXJyZWREcmFnRW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb25Gcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ1RvdWNoTW92ZShldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbMF07XG4gICAgaWYgKCF0b3VjaCkge1xuICAgICAgdGhpcy5zY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHsgeDogdG91Y2guY2xpZW50WCwgeTogdG91Y2guY2xpZW50WSB9O1xuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb25Gcm9tUG9pbnQodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ01vdXNlVXAoKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVEcmFnUG9pbnRlclVwQ29tbW9uKCk7XG4gIH1cblxuICAvLyBDb252ZXJ0IGEgY3VycmVudGx5IGluLWhlYWRlciB0YWIgZHJhZyBpbnRvIGEgZmxvYXRpbmcgd2luZG93XG4gIHByaXZhdGUgY29udmVydFBlbmRpbmdUYWJEcmFnVG9GbG9hdGluZyhjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBpZiAoc3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJiBzdGF0ZS5mbG9hdGluZ0luZGV4ID49IDApIHtcbiAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBmbG9hdGluZ1xuICAgIH1cbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24oc3RhdGUuc291cmNlUGF0aCk7XG4gICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhbmUgPSBzdGF0ZS5wYW5lO1xuICAgIGNvbnN0IHN0YWNrRWwgPSBzdGF0ZS5zb3VyY2VTdGFja0VsID8/IG51bGw7XG4gICAgY29uc3QgaG9zdFJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHN0YWNrUmVjdCA9IHN0YWNrRWw/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGw7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzO1xuXG4gICAgY29uc3QgZmFsbGJhY2tXaWR0aCA9IDMyMDtcbiAgICBjb25zdCBmYWxsYmFja0hlaWdodCA9IDI0MDtcbiAgICBjb25zdCB3aWR0aCA9XG4gICAgICBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLndpZHRoKSAmJiBtZXRyaWNzLndpZHRoID4gMFxuICAgICAgICA/IG1ldHJpY3Mud2lkdGhcbiAgICAgICAgOiBzdGFja1JlY3QgJiYgTnVtYmVyLmlzRmluaXRlKHN0YWNrUmVjdC53aWR0aClcbiAgICAgICAgPyBzdGFja1JlY3Qud2lkdGhcbiAgICAgICAgOiBmYWxsYmFja1dpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9XG4gICAgICBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLmhlaWdodCkgJiYgbWV0cmljcy5oZWlnaHQgPiAwXG4gICAgICAgID8gbWV0cmljcy5oZWlnaHRcbiAgICAgICAgOiBzdGFja1JlY3QgJiYgTnVtYmVyLmlzRmluaXRlKHN0YWNrUmVjdC5oZWlnaHQpXG4gICAgICAgID8gc3RhY2tSZWN0LmhlaWdodFxuICAgICAgICA6IGZhbGxiYWNrSGVpZ2h0O1xuXG4gICAgY29uc3QgcG9pbnRlck9mZnNldFggPSBOdW1iZXIuaXNGaW5pdGUodGhpcy5kcmFnU3RhdGU/LnBvaW50ZXJPZmZzZXRYIGFzIG51bWJlcilcbiAgICAgID8gKHRoaXMuZHJhZ1N0YXRlIS5wb2ludGVyT2Zmc2V0WCBhcyBudW1iZXIpXG4gICAgICA6IG1ldHJpY3MgJiYgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MucG9pbnRlck9mZnNldFgpXG4gICAgICA/IChtZXRyaWNzLnBvaW50ZXJPZmZzZXRYIGFzIG51bWJlcilcbiAgICAgIDogd2lkdGggLyAyO1xuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZID0gTnVtYmVyLmlzRmluaXRlKHRoaXMuZHJhZ1N0YXRlPy5wb2ludGVyT2Zmc2V0WSBhcyBudW1iZXIpXG4gICAgICA/ICh0aGlzLmRyYWdTdGF0ZSEucG9pbnRlck9mZnNldFkgYXMgbnVtYmVyKVxuICAgICAgOiBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRZKVxuICAgICAgPyAobWV0cmljcy5wb2ludGVyT2Zmc2V0WSBhcyBudW1iZXIpXG4gICAgICA6IGhlaWdodCAvIDI7XG5cbiAgICBjb25zdCBwb2ludGVyTGVmdCA9IE51bWJlci5pc0Zpbml0ZShjbGllbnRYKVxuICAgICAgPyBjbGllbnRYIC0gaG9zdFJlY3QubGVmdCAtIHBvaW50ZXJPZmZzZXRYXG4gICAgICA6IDA7XG4gICAgY29uc3QgcG9pbnRlclRvcCA9IE51bWJlci5pc0Zpbml0ZShjbGllbnRZKVxuICAgICAgPyBjbGllbnRZIC0gaG9zdFJlY3QudG9wIC0gcG9pbnRlck9mZnNldFlcbiAgICAgIDogMDtcblxuICAgIC8vIFJlbW92ZSBwYW5lIGZyb20gaXRzIGN1cnJlbnQgc3RhY2sgYW5kIGNyZWF0ZSBhIG5ldyBmbG9hdGluZyBlbnRyeVxuICAgIHRoaXMucmVtb3ZlUGFuZUZyb21Mb2NhdGlvbihsb2NhdGlvbiwgcGFuZSk7XG4gICAgY29uc3QgZmxvYXRpbmdTdGFjazogRG9ja1N0YWNrTm9kZSA9IHtcbiAgICAgIGtpbmQ6ICdzdGFjaycsXG4gICAgICBwYW5lczogW3BhbmVdLFxuICAgICAgYWN0aXZlUGFuZTogcGFuZSxcbiAgICB9O1xuXG4gICAgY29uc3QgZmxvYXRpbmdMYXlvdXQ6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0ID0ge1xuICAgICAgYm91bmRzOiB7XG4gICAgICAgIGxlZnQ6IHBvaW50ZXJMZWZ0LFxuICAgICAgICB0b3A6IHBvaW50ZXJUb3AsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICB9LFxuICAgICAgcm9vdDogZmxvYXRpbmdTdGFjayxcbiAgICAgIGFjdGl2ZVBhbmU6IHBhbmUsXG4gICAgfTtcblxuICAgIHRoaXMuZmxvYXRpbmdMYXlvdXRzLnB1c2goZmxvYXRpbmdMYXlvdXQpO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5mbG9hdGluZ0xheW91dHMubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldEZsb2F0aW5nV3JhcHBlcihuZXdJbmRleCk7XG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIHRoaXMucHJvbW90ZUZsb2F0aW5nUGFuZShuZXdJbmRleCwgd3JhcHBlcik7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSBkcmFnIHN0YXRlIHNvIHN1YnNlcXVlbnQgbW92ZXMgcmVwb3NpdGlvbiB0aGUgZmxvYXRpbmcgd2luZG93XG4gICAgc3RhdGUuc291cmNlUGF0aCA9IHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXg6IG5ld0luZGV4LCBzZWdtZW50czogW10gfTtcbiAgICBzdGF0ZS5mbG9hdGluZ0luZGV4ID0gbmV3SW5kZXg7XG4gICAgc3RhdGUucG9pbnRlck9mZnNldFggPSBwb2ludGVyT2Zmc2V0WDtcbiAgICBzdGF0ZS5wb2ludGVyT2Zmc2V0WSA9IHBvaW50ZXJPZmZzZXRZO1xuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBpbnRlbmRlZCB0YWIgaW5zZXJ0IGluZGV4IHdpdGhpbiBhIGhlYWRlciBiYXNlZCBvbiBwb2ludGVyIFhcbiAgcHJpdmF0ZSBjb21wdXRlSGVhZGVySW5zZXJ0SW5kZXgoaGVhZGVyOiBIVE1MRWxlbWVudCwgY2xpZW50WDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0YWJzID0gQXJyYXkuZnJvbShoZWFkZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXRhYicpKTtcbiAgICBpZiAodGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSB0YWJzW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgbWlkID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgICBpZiAoY2xpZW50WCA8IG1pZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhYnMubGVuZ3RoOyAvLyBpbnNlcnQgYXQgZW5kXG4gIH1cblxuICBwcml2YXRlIHJlb3JkZXJQYW5lSW5Mb2NhdGlvbkF0SW5kZXgobG9jYXRpb246IFJlc29sdmVkTG9jYXRpb24sIHBhbmU6IHN0cmluZywgdGFyZ2V0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhbmVzID0gbG9jYXRpb24ubm9kZS5wYW5lcztcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBwYW5lcy5pbmRleE9mKHBhbmUpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNsYW1wZWRUYXJnZXQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0YXJnZXRJbmRleCwgcGFuZXMubGVuZ3RoIC0gMSkpO1xuICAgIGlmIChjbGFtcGVkVGFyZ2V0ID09PSBjdXJyZW50SW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFuZXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgcGFuZXMuc3BsaWNlKGNsYW1wZWRUYXJnZXQsIDAsIHBhbmUpO1xuICAgIGxvY2F0aW9uLm5vZGUuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgaWYgKGxvY2F0aW9uLmNvbnRleHQgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbbG9jYXRpb24uaW5kZXhdO1xuICAgICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25EcmFnVG91Y2hFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVEcmFnUG9pbnRlclVwQ29tbW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGVuZGluZ0RyYWdFbmRUaW1lb3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgICBpZiAod2luICYmIHR5cGVvZiB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgd2luLmNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnbG9iYWxUaGlzLmNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZURyYWcgPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpO1xuICAgIH07XG5cbiAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IHdpblxuICAgICAgPyB3aW4uc2V0VGltZW91dChjb21wbGV0ZURyYWcsIDApXG4gICAgICA6IHNldFRpbWVvdXQoY29tcGxldGVEcmFnLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBwb2ludEZyb21FdmVudCA9XG4gICAgICBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpXG4gICAgICAgID8geyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgcG9pbnQgPVxuICAgICAgcG9pbnRGcm9tRXZlbnQgPz9cbiAgICAgICh0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgY2xpZW50WDogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi54LFxuICAgICAgICAgICAgY2xpZW50WTogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi55LFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsKTtcblxuICAgIGNvbnN0IHN0YWNrID1cbiAgICAgIHRoaXMuZmluZFN0YWNrRWxlbWVudChldmVudCkgPz9cbiAgICAgIChwb2ludCA/IHRoaXMuZmluZFN0YWNrQXRQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKSA6IG51bGwpO1xuXG4gICAgaWYgKCFzdGFjaykge1xuICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pO1xuXG4gICAgLy8gQWxsb3cgcmVvcmRlcmluZyB3aXRoaW4gdGhlIHNhbWUgc3RhY2sgaGVhZGVyIHdpdGhvdXQgc2VsZWN0aW5nIGEgem9uZVxuICAgIGlmIChcbiAgICAgIHRoaXMuZHJhZ1N0YXRlICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4IDwgMCAmJlxuICAgICAgcGF0aCAmJlxuICAgICAgdGhpcy5wYXRoc0VxdWFsKHBhdGgsIHRoaXMuZHJhZ1N0YXRlLnNvdXJjZVBhdGgpXG4gICAgKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBzdGFjay5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stc3RhY2tfX2hlYWRlcicpO1xuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBjb25zdCB4ID0gKHBvaW50ID8gcG9pbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFgpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZSh4KSkge1xuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoKTtcbiAgICAgICAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuY29tcHV0ZUhlYWRlckluc2VydEluZGV4KGhlYWRlciwgeCk7XG4gICAgICAgICAgICB0aGlzLnJlb3JkZXJQYW5lSW5Mb2NhdGlvbkF0SW5kZXgobG9jYXRpb24sIHRoaXMuZHJhZ1N0YXRlLnBhbmUsIGlkeCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBldmVudFpvbmVIaW50ID0gdGhpcy5leHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IHBvaW50Wm9uZUhpbnQgPSBwb2ludCA/IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKSA6IG51bGw7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuY29tcHV0ZURyb3Bab25lKHN0YWNrLCBwb2ludCA/PyBldmVudCwgcG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KTtcbiAgICBpZiAoIXpvbmUpIHtcbiAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVEcm9wKHBhdGgsIHpvbmUpO1xuICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUgfCBudWxsO1xuXG4gICAgLy8gRHVyaW5nIGFjdGl2ZSBkcmFncywgYnJvd3NlcnMgY2FuIGVtaXQgc3B1cmlvdXMgZHJhZ2xlYXZlIHdpdGggbnVsbFxuICAgIC8vIHJlbGF0ZWRUYXJnZXQgd2hpbGUgdGhlIHBvaW50ZXIgaXMgc3RpbGwgb3ZlciB0aGUgam95c3RpY2svYnV0dG9ucy5cbiAgICAvLyBCZSBjb25zZXJ2YXRpdmU6IGlmIHdlIGNhbiByZXNvbHZlIGEgc3RhY2svam95c3RpY2sgYXQgdGhlIGxhc3Qga25vd25cbiAgICAvLyBwb2ludGVyIHBvc2l0aW9uLCBkb27igJl0IGhpZGUgKHByZXZlbnRzIGZsaWNrZXIgb2YgYWN0aXZlIHN0YXRlKS5cbiAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIGNvbnN0IHBvcyA9XG4gICAgICAgIChOdW1iZXIuaXNGaW5pdGUoKGV2ZW50IGFzIERyYWdFdmVudCkuY2xpZW50WCkgJiYgTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBEcmFnRXZlbnQpLmNsaWVudFkpKVxuICAgICAgICAgID8geyB4OiAoZXZlbnQgYXMgRHJhZ0V2ZW50KS5jbGllbnRYLCB5OiAoZXZlbnQgYXMgRHJhZ0V2ZW50KS5jbGllbnRZIH1cbiAgICAgICAgICA6IHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb247XG4gICAgICBpZiAocG9zKSB7XG4gICAgICAgIGNvbnN0IHN0YWNrQXRQb2ludCA9IHRoaXMuZmluZFN0YWNrQXRQb2ludChwb3MueCwgcG9zLnkpO1xuICAgICAgICBpZiAoc3RhY2tBdFBvaW50KSB7XG4gICAgICAgICAgcmV0dXJuOyAvLyBzdGlsbCBpbnNpZGUgb3VyIGRyb3AgYXJlYTsgaWdub3JlIHRoaXMgZHJhZ2xlYXZlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJlbGF0ZWQpIHtcbiAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb290Q29udGFpbnMgPSB0aGlzLnJvb3RFbC5jb250YWlucyhyZWxhdGVkKTtcbiAgICBjb25zdCBqb3lzdGlja0NvbnRhaW5zID0gdGhpcy5kcm9wSm95c3RpY2suY29udGFpbnMocmVsYXRlZCk7XG4gICAgaWYgKCFyb290Q29udGFpbnMgJiYgIWpveXN0aWNrQ29udGFpbnMpIHtcbiAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyb3AodGFyZ2V0UGF0aDogRG9ja1BhdGggfCBudWxsLCB6b25lOiBEcm9wWm9uZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUgfHwgIXRhcmdldFBhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhbmUsIHNvdXJjZVBhdGggfSA9IHRoaXMuZHJhZ1N0YXRlO1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24oc291cmNlUGF0aCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbih0YXJnZXRQYXRoKTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZTogYWxsb3cgZHJvcHBpbmcgb250byBhbiBlbXB0eSBtYWluIGRvY2sgYXJlYSAobm8gcm9vdCkuXG4gICAgaWYgKCF0YXJnZXQgJiYgdGFyZ2V0UGF0aC50eXBlID09PSAnZG9ja2VkJyAmJiAhdGhpcy5yb290TGF5b3V0KSB7XG4gICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGFja0VtcHRpZWQgPSB0aGlzLnJlbW92ZVBhbmVGcm9tTG9jYXRpb24oc291cmNlLCBwYW5lLCB0cnVlKTtcbiAgICAgIGNvbnN0IG5ld1Jvb3Q6IERvY2tTdGFja05vZGUgPSB7XG4gICAgICAgIGtpbmQ6ICdzdGFjaycsXG4gICAgICAgIHBhbmVzOiBbcGFuZV0sXG4gICAgICAgIGFjdGl2ZVBhbmU6IHBhbmUsXG4gICAgICB9O1xuICAgICAgdGhpcy5yb290TGF5b3V0ID0gbmV3Um9vdDtcbiAgICAgIGlmIChzdGFja0VtcHRpZWQpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwTG9jYXRpb24oc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHpvbmUgPT09ICdjZW50ZXInICYmIHRoaXMucGF0aHNFcXVhbChzb3VyY2VQYXRoLCB0YXJnZXRQYXRoKSkge1xuICAgICAgaWYgKCFzb3VyY2Uubm9kZS5wYW5lcy5pbmNsdWRlcyhwYW5lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJlb3JkZXJQYW5lSW5Mb2NhdGlvbihzb3VyY2UsIHBhbmUpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrRW1wdGllZCA9IHRoaXMucmVtb3ZlUGFuZUZyb21Mb2NhdGlvbihzb3VyY2UsIHBhbmUsIHRydWUpO1xuXG4gICAgaWYgKHpvbmUgPT09ICdjZW50ZXInKSB7XG4gICAgICB0aGlzLmFkZFBhbmVUb0xvY2F0aW9uKHRhcmdldCwgcGFuZSk7XG4gICAgICB0aGlzLnNldEFjdGl2ZVBhbmVGb3JMb2NhdGlvbih0YXJnZXQsIHBhbmUpO1xuICAgICAgaWYgKHN0YWNrRW1wdGllZCkge1xuICAgICAgICB0aGlzLmNsZWFudXBMb2NhdGlvbihzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0YWNrOiBEb2NrU3RhY2tOb2RlID0ge1xuICAgICAga2luZDogJ3N0YWNrJyxcbiAgICAgIHBhbmVzOiBbcGFuZV0sXG4gICAgICBhY3RpdmVQYW5lOiBwYW5lLFxuICAgIH07XG5cbiAgICBpZiAodGFyZ2V0LmNvbnRleHQgPT09ICdkb2NrZWQnKSB7XG4gICAgICB0aGlzLnJvb3RMYXlvdXQgPSB0aGlzLmRvY2tOb2RlQmVzaWRlKHRoaXMucm9vdExheW91dCwgdGFyZ2V0Lm5vZGUsIG5ld1N0YWNrLCB6b25lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1t0YXJnZXQuaW5kZXhdO1xuICAgICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgICBpZiAoc3RhY2tFbXB0aWVkKSB7XG4gICAgICAgICAgdGhpcy5jbGVhbnVwTG9jYXRpb24oc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZsb2F0aW5nLnJvb3QgPSB0aGlzLmRvY2tOb2RlQmVzaWRlKGZsb2F0aW5nLnJvb3QsIHRhcmdldC5ub2RlLCBuZXdTdGFjaywgem9uZSk7XG4gICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhY2tFbXB0aWVkKSB7XG4gICAgICB0aGlzLmNsZWFudXBMb2NhdGlvbihzb3VyY2UpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZsb2F0aW5nU3RhY2tEcm9wKHNvdXJjZUluZGV4OiBudW1iZXIsIHRhcmdldFBhdGg6IERvY2tQYXRoLCB6b25lOiBEcm9wWm9uZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3NvdXJjZUluZGV4XTtcbiAgICBpZiAoIXNvdXJjZSB8fCAhc291cmNlLnJvb3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHRhcmdldFBhdGgpO1xuICAgIC8vIEFsbG93IGRyb3BwaW5nIGFuIGVudGlyZSBmbG9hdGluZyBzdGFjayBvbnRvIGFuIGVtcHR5IG1haW4gZG9jayBhcmVhXG4gICAgLy8gKG5vIGV4aXN0aW5nIHJvb3QpLlxuICAgIGlmICghdGFyZ2V0ICYmIHRhcmdldFBhdGgudHlwZSA9PT0gJ2RvY2tlZCcgJiYgIXRoaXMucm9vdExheW91dCkge1xuICAgICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5jbG9uZUxheW91dE5vZGUoc291cmNlLnJvb3QpO1xuICAgICAgdGhpcy5yZW1vdmVGbG9hdGluZ0F0KHNvdXJjZUluZGV4KTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC5jb250ZXh0ID09PSAnZmxvYXRpbmcnICYmIHRhcmdldC5pbmRleCA9PT0gc291cmNlSW5kZXgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoem9uZSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIGNvbnN0IHBhbmVzID0gdGhpcy5jb2xsZWN0UGFuZU5hbWVzKHNvdXJjZS5yb290KTtcbiAgICAgIGlmIChwYW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBwYW5lcy5mb3JFYWNoKChwYW5lKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkUGFuZVRvTG9jYXRpb24odGFyZ2V0LCBwYW5lKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhY3RpdmVQYW5lID1cbiAgICAgICAgc291cmNlLmFjdGl2ZVBhbmUgJiYgcGFuZXMuaW5jbHVkZXMoc291cmNlLmFjdGl2ZVBhbmUpXG4gICAgICAgICAgPyBzb3VyY2UuYWN0aXZlUGFuZVxuICAgICAgICAgIDogdGhpcy5maW5kRmlyc3RQYW5lTmFtZShzb3VyY2Uucm9vdCkgPz8gcGFuZXNbMF07XG5cbiAgICAgIGlmIChhY3RpdmVQYW5lKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUGFuZUZvckxvY2F0aW9uKHRhcmdldCwgYWN0aXZlUGFuZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChzb3VyY2VJbmRleCk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXQuY29udGV4dCA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1t0YXJnZXQuaW5kZXhdO1xuICAgICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZsb2F0aW5nLnJvb3QgPSB0aGlzLmRvY2tOb2RlQmVzaWRlKGZsb2F0aW5nLnJvb3QsIHRhcmdldC5ub2RlLCBzb3VyY2Uucm9vdCwgem9uZSk7XG4gICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gc291cmNlLmFjdGl2ZVBhbmUgPz8gdGhpcy5maW5kRmlyc3RQYW5lTmFtZShzb3VyY2Uucm9vdCkgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5yZW1vdmVGbG9hdGluZ0F0KHNvdXJjZUluZGV4KTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5kb2NrTm9kZUJlc2lkZSh0aGlzLnJvb3RMYXlvdXQsIHRhcmdldC5ub2RlLCBzb3VyY2Uucm9vdCwgem9uZSk7XG4gICAgdGhpcy5yZW1vdmVGbG9hdGluZ0F0KHNvdXJjZUluZGV4KTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFdlaWdodChzaXplczogbnVtYmVyW10gfCB1bmRlZmluZWQsIGluZGV4OiBudW1iZXIsIHRvdGFsQ2hpbGRyZW46IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBjb25zdCBleGlzdGluZ0NvdW50ID0gdG90YWxDaGlsZHJlbiAtIDE7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplU2l6ZXNBcnJheShzaXplcywgZXhpc3RpbmdDb3VudCk7XG4gICAgY29uc3QgbmV3V2VpZ2h0ID0gMSAvIHRvdGFsQ2hpbGRyZW47XG4gICAgY29uc3QgcmVtYWluaW5nID0gMSAtIG5ld1dlaWdodDtcbiAgICBjb25zdCByZXN1bHQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbENoaWxkcmVuOyBpICs9IDEpIHtcbiAgICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgICByZXN1bHQucHVzaChuZXdXZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc291cmNlSW5kZXggPSBpIDwgaW5kZXggPyBpIDogaSAtIDE7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5vcm1hbGl6ZWRbc291cmNlSW5kZXhdICogcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGFuZUZyb21TdGFjayhzdGFjazogRG9ja1N0YWNrTm9kZSwgcGFuZTogc3RyaW5nLCBza2lwQ2xlYW51cCA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgc3RhY2sucGFuZXMgPSBzdGFjay5wYW5lcy5maWx0ZXIoKHApID0+IHAgIT09IHBhbmUpO1xuICAgIGlmICghc3RhY2sucGFuZXMuaW5jbHVkZXMoc3RhY2suYWN0aXZlUGFuZSA/PyAnJykpIHtcbiAgICAgIGlmIChzdGFjay5wYW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YWNrLmFjdGl2ZVBhbmUgPSBzdGFjay5wYW5lc1swXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBzdGFjay5hY3RpdmVQYW5lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFjay5wYW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNraXBDbGVhbnVwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3RMYXlvdXQgPSB0aGlzLmNsZWFudXBFbXB0eVN0YWNrSW5UcmVlKHRoaXMucm9vdExheW91dCwgc3RhY2spO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyZW50U3BsaXQoXG4gICAgbm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIGNoaWxkOiBEb2NrTGF5b3V0Tm9kZSxcbiAgKTogeyBwYXJlbnQ6IERvY2tTcGxpdE5vZGU7IGluZGV4OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGlmICghbm9kZSB8fCBub2RlID09PSBjaGlsZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUua2luZCAhPT0gJ3NwbGl0Jykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSBub2RlLmNoaWxkcmVuLmluZGV4T2YoY2hpbGQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB7IHBhcmVudDogbm9kZSwgaW5kZXggfTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZFBhcmVudFNwbGl0KG5vZGUuY2hpbGRyZW5baV0sIGNoaWxkKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZURyb3Bab25lKFxuICAgIHN0YWNrOiBIVE1MRWxlbWVudCxcbiAgICBwb2ludDogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHwgbnVsbCxcbiAgICB6b25lSGludD86IERyb3Bab25lIHwgbnVsbCxcbiAgKTogRHJvcFpvbmUgfCBudWxsIHtcbiAgICAvLyBEbyBub3QgZm9yY2UgYSB6b25lOiBldmVuIHdoZW4gdGhlIG1haW4gYXJlYSBpcyBlbXB0eSB3ZSBvbmx5XG4gICAgLy8gYWN0aXZhdGUgYSB6b25lIHdoZW4gdGhlIHBvaW50ZXIgaXMgYWN0dWFsbHkgb3ZlciBhIGpveXN0aWNrIGJ1dHRvbi5cbiAgICBjb25zdCBoaW50ZWRab25lID0gdGhpcy5pc0Ryb3Bab25lKHpvbmVIaW50KSA/IHpvbmVIaW50IDogbnVsbDtcbiAgICBpZiAoaGludGVkWm9uZSkge1xuICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKGhpbnRlZFpvbmUpO1xuICAgICAgcmV0dXJuIGhpbnRlZFpvbmU7XG4gICAgfVxuXG4gICAgY29uc3QgcG9pbnRab25lID1cbiAgICAgIHBvaW50ICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUocG9pbnQuY2xpZW50WCkgJiZcbiAgICAgIE51bWJlci5pc0Zpbml0ZShwb2ludC5jbGllbnRZKVxuICAgICAgICA/IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAocG9pbnRab25lKSB7XG4gICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUocG9pbnRab25lKTtcbiAgICAgIHJldHVybiBwb2ludFpvbmU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ID09PSBzdGFjaykge1xuICAgICAgLy8gQmUgc3RpY2t5IHdoaWxlIGhvdmVyaW5nIHRoZSBqb3lzdGljazogaWYgd2UgcmVjZW50bHkgaGFkIGEgem9uZVxuICAgICAgLy8gc2VsZWN0ZWQsIHByZWZlciBrZWVwaW5nIGl0IGluc3RlYWQgb2YgYnJpZWZseSBjbGVhcmluZyB0byBudWxsXG4gICAgICAvLyB3aGVuIHRoZSBicm93c2VyIHJlcG9ydHMgdHJhbnNpZW50IGNvb3JkaW5hdGVzL3RhcmdldHMgZHVyaW5nIGRyYWcuXG4gICAgICBjb25zdCBzdGlja3kgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgICBpZiAodGhpcy5pc0Ryb3Bab25lKHN0aWNreSkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKHN0aWNreSk7XG4gICAgICAgIHJldHVybiBzdGlja3k7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUobnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3REcm9wWm9uZUZyb21FdmVudChldmVudDogRXZlbnQpOiBEcm9wWm9uZSB8IG51bGwge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKGV2ZW50IGFzIERyYWdFdmVudCkuY29tcG9zZWRQYXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBwYXRoID0gKGV2ZW50IGFzIERyYWdFdmVudCkuY29tcG9zZWRQYXRoKCk7XG4gICAgICBjb25zdCB6b25lID0gdGhpcy5maW5kRHJvcFpvbmVJblRhcmdldHMocGF0aCk7XG4gICAgICBpZiAoem9uZSkge1xuICAgICAgICByZXR1cm4gem9uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ2NsaWVudFgnIGluIGV2ZW50ICYmICdjbGllbnRZJyBpbiBldmVudCkge1xuICAgICAgY29uc3QgcG9pbnRFdmVudCA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG4gICAgICBjb25zdCB6b25lRnJvbVBvaW50ID0gdGhpcy5maW5kRHJvcFpvbmVCeVBvaW50KHBvaW50RXZlbnQuY2xpZW50WCwgcG9pbnRFdmVudC5jbGllbnRZKTtcbiAgICAgIGlmICh6b25lRnJvbVBvaW50KSB7XG4gICAgICAgIHJldHVybiB6b25lRnJvbVBvaW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEcmFnUG9pbnRlclVwQ29tbW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRHJvcFpvbmVJblRhcmdldHModGFyZ2V0czogSXRlcmFibGU8RXZlbnRUYXJnZXQ+KTogRHJvcFpvbmUgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAgIHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uJylcbiAgICAgICkge1xuICAgICAgICBjb25zdCB6b25lID0gdGFyZ2V0LmRhdGFzZXQ/Llsnem9uZSddO1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bab25lKHpvbmUpKSB7XG4gICAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wWm9uZUJ5UG9pbnQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBEcm9wWm9uZSB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMgfHxcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSAhPT0gJ3RydWUnIHx8XG4gICAgICAhdGhpcy5kcm9wSm95c3RpY2tUYXJnZXRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucykge1xuICAgICAgLy8gU2tpcCBoaWRkZW4vaW5hY3RpdmUgYnV0dG9ucyAodXNlZCBpbiBjZW50ZXItb25seSBtb2RlKVxuICAgICAgaWYgKChidXR0b24uZGF0YXNldFsnaGlkZGVuJ10gPT09ICd0cnVlJykgfHwgYnV0dG9uLnN0eWxlLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nIHx8IGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZWN0ID0gYnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKFxuICAgICAgICBjbGllbnRYID49IHJlY3QubGVmdCAmJlxuICAgICAgICBjbGllbnRYIDw9IHJlY3QucmlnaHQgJiZcbiAgICAgICAgY2xpZW50WSA+PSByZWN0LnRvcCAmJlxuICAgICAgICBjbGllbnRZIDw9IHJlY3QuYm90dG9tXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgem9uZSA9IGJ1dHRvbi5kYXRhc2V0Wyd6b25lJ107XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcFpvbmUoem9uZSkpIHtcbiAgICAgICAgICByZXR1cm4gem9uZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKHpvbmU6IERyb3Bab25lIHwgbnVsbCk6IHZvaWQge1xuICAgIC8vIElmIG5vIHpvbmUgaXMgY29tcHV0ZWQgYnV0IHRoZSBqb3lzdGljayBpcyB2aXNpYmxlLCBrZWVwIHRoZSBsYXN0XG4gICAgLy8ga25vd24gYWN0aXZlIHpvbmUgdG8gYXZvaWQgdmlzdWFsIGppdHRlciB3aGlsZSBkcmFnZ2luZyBhY3Jvc3NcbiAgICAvLyBzbWFsbCBnYXBzIHdoZXJlIGhpdOKAkXRlc3RpbmcgbW9tZW50YXJpbHkgZmFpbHMuXG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9PT0gJ3RydWUnO1xuICAgIGNvbnN0IHN0aWNreSA9IHZpc2libGUgPyB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZWZmZWN0aXZlWm9uZTogRHJvcFpvbmUgfCBudWxsID0gem9uZSA/PyAodGhpcy5pc0Ryb3Bab25lKHN0aWNreSkgPyBzdGlja3kgOiBudWxsKTtcblxuICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gZWZmZWN0aXZlWm9uZSAhPT0gbnVsbCAmJiBidXR0b24uZGF0YXNldFsnem9uZSddID09PSBlZmZlY3RpdmVab25lO1xuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIGJ1dHRvbi5kYXRhc2V0WydhY3RpdmUnXSA9ICd0cnVlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBidXR0b24uZGF0YXNldFsnYWN0aXZlJ107XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGVmZmVjdGl2ZVpvbmUpIHtcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXSA9IGVmZmVjdGl2ZVpvbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0Ryb3Bab25lKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogdmFsdWUgaXMgRHJvcFpvbmUge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ2xlZnQnIHx8IHZhbHVlID09PSAncmlnaHQnIHx8IHZhbHVlID09PSAndG9wJyB8fCB2YWx1ZSA9PT0gJ2JvdHRvbScgfHwgdmFsdWUgPT09ICdjZW50ZXInO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RHJvcEluZGljYXRvcihzdGFjazogSFRNTEVsZW1lbnQsIHpvbmU6IERyb3Bab25lIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pO1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSB0aGlzLmRyYWdTdGF0ZT8uc291cmNlUGF0aCA/PyBudWxsO1xuICAgIGlmICh0YXJnZXRQYXRoICYmIHNvdXJjZVBhdGggJiYgdGhpcy5pc09ySXNBbmNlc3Rvck9mKHRhcmdldFBhdGgsIHNvdXJjZVBhdGgpKSB7XG4gICAgICAvLyBEb24ndCBzaG93IGFueSBkcm9wIGluZGljYXRvcnMgb24gdGhlIHBhbmUgYmVpbmcgZHJhZ2dlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gc3RhY2suZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaG9zdFJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGluZGljYXRvciA9IHRoaXMuZHJvcEluZGljYXRvcjtcbiAgICBjb25zdCBqb3lzdGljayA9IHRoaXMuZHJvcEpveXN0aWNrO1xuXG4gICAgam95c3RpY2suaGlkZGVuID0gZmFsc2U7XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKTtcbiAgICBsZXQgb3ZlcmxheVogPSAxMDA7XG4gICAgaWYgKHBhdGggJiYgcGF0aC50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBvdmVybGF5WiA9IHRoaXMuZ2V0RmxvYXRpbmdQYW5lWkluZGV4KHBhdGguaW5kZXgpICsgMTAwO1xuICAgIH1cbiAgICBpbmRpY2F0b3Iuc3R5bGUuekluZGV4ID0gU3RyaW5nKG92ZXJsYXlaKTtcbiAgICBqb3lzdGljay5zdHlsZS56SW5kZXggPSBTdHJpbmcob3ZlcmxheVogKyAxKTtcblxuICAgIGxldCBsZWZ0ID0gcmVjdC5sZWZ0IC0gaG9zdFJlY3QubGVmdDtcbiAgICBsZXQgdG9wID0gcmVjdC50b3AgLSBob3N0UmVjdC50b3A7XG4gICAgbGV0IHdpZHRoID0gcmVjdC53aWR0aDtcbiAgICBsZXQgaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG5cbiAgICBjb25zdCBwb3J0aW9uID0gMC41O1xuXG4gICAgaWYgKHpvbmUpIHtcbiAgICAgIHN3aXRjaCAoem9uZSkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICB3aWR0aCA9IHJlY3Qud2lkdGggKiBwb3J0aW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgd2lkdGggPSByZWN0LndpZHRoICogcG9ydGlvbjtcbiAgICAgICAgICBsZWZ0ICs9IHJlY3Qud2lkdGggKiAoMSAtIHBvcnRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0ICogcG9ydGlvbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICBoZWlnaHQgPSByZWN0LmhlaWdodCAqIHBvcnRpb247XG4gICAgICAgICAgdG9wICs9IHJlY3QuaGVpZ2h0ICogKDEgLSBwb3J0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaW5kaWNhdG9yLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICAgIGluZGljYXRvci5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgaW5kaWNhdG9yLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgaW5kaWNhdG9yLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICBpbmRpY2F0b3IuZGF0YXNldFsndmlzaWJsZSddID0gJ3RydWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRpY2F0b3IuZGF0YXNldFsndmlzaWJsZSddID0gJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBqb3lzdGljay5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0IC0gaG9zdFJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyfXB4YDtcbiAgICBqb3lzdGljay5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcCAtIGhvc3RSZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMn1weGA7XG4gICAgam95c3RpY2suZGF0YXNldFsndmlzaWJsZSddID0gJ3RydWUnO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XG4gICAgam95c3RpY2suZGF0YXNldFsncGF0aCddID0gc3RhY2suZGF0YXNldFsncGF0aCddID8/ICcnO1xuICAgIGNvbnN0IGNoYW5nZWRUYXJnZXQgPSB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAmJiB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAhPT0gc3RhY2s7XG4gICAgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgPSBzdGFjaztcbiAgICBpZiAoY2hhbmdlZFRhcmdldCkge1xuICAgICAgLy8gTmV3IHRhcmdldCBzdGFjazogZm9yZ2V0IGFueSBwcmV2aW91c2x5IHN0aWNreSB6b25lLlxuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICB9XG5cbiAgICAvLyBJZiBtYWluIGRvY2sgYXJlYSBpcyBlbXB0eSwgc2hvdyBvbmx5IHRoZSBjZW50ZXIgYnV0dG9uIGFuZCBjb2xsYXBzZSB0aGUgZ3JpZFxuICAgIGNvbnN0IGlzRW1wdHlNYWluQXJlYSA9ICF0aGlzLnJvb3RMYXlvdXQgJiYgKHN0YWNrID09PSB0aGlzLmRvY2tlZEVsIHx8ICh0YXJnZXRQYXRoICYmIHRhcmdldFBhdGgudHlwZSA9PT0gJ2RvY2tlZCcgJiYgdGFyZ2V0UGF0aC5zZWdtZW50cy5sZW5ndGggPT09IDApKTtcbiAgICBjb25zdCBzcGFjZXJzID0gQXJyYXkuZnJvbSh0aGlzLmRyb3BKb3lzdGljay5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyJykpO1xuICAgIGlmIChpc0VtcHR5TWFpbkFyZWEpIHtcbiAgICAgIC8vIEtlZXAgc3BhY2VycyB2aXNpYmxlIHNvIHRoZSBqb3lzdGljayBrZWVwcyBpdHMgY2lyY3VsYXIgZm9vdHByaW50LlxuICAgICAgc3BhY2Vycy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIHMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ2VudGVyID0gYnRuLmRhdGFzZXRbJ3pvbmUnXSA9PT0gJ2NlbnRlcic7XG4gICAgICAgIGlmIChpc0NlbnRlcikge1xuICAgICAgICAgIGJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgICBkZWxldGUgYnRuLmRhdGFzZXRbJ2hpZGRlbiddO1xuICAgICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSGlkZSB2aXN1YWxseSBidXQga2VlcCBsYXlvdXQgc3BhY2U7IGFsc28gcHJldmVudCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgIGJ0bi5kYXRhc2V0WydoaWRkZW4nXSA9ICd0cnVlJztcbiAgICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEtlZXAgZGVmYXVsdCAzeDMgZ3JpZCBzbyB0aGUgY2lyY3VsYXIgYmFja2dyb3VuZCBzaXplIHN0YXlzIHRoZSBzYW1lLlxuICAgICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9ICcnO1xuICAgICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZ3JpZFRlbXBsYXRlUm93cyA9ICcnO1xuICAgICAgLy8gRG8gbm90IHNldCBhbiBhY3RpdmUgem9uZSBhdXRvbWF0aWNhbGx5OyB1c2VycyBtdXN0IGhvdmVyIHRoZSBidXR0b24uXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgYnRuLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgZGVsZXRlIGJ0bi5kYXRhc2V0WydoaWRkZW4nXTtcbiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH0pO1xuICAgICAgc3BhY2Vycy5mb3JFYWNoKChzKSA9PiAocy5zdHlsZS5kaXNwbGF5ID0gJycpKTtcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSAnJztcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZVJvd3MgPSAnJztcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKHpvbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlRHJvcEluZGljYXRvcigpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3BJbmRpY2F0b3IuZGF0YXNldFsndmlzaWJsZSddID0gJ2ZhbHNlJztcbiAgICB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPSAnZmFsc2UnO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXTtcbiAgICB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKG51bGwpO1xuICAgIC8vIFJlc3RvcmUgam95c3RpY2sgc3RydWN0dXJlIHRvIGRlZmF1bHQuXG4gICAgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgZGVsZXRlIGJ0bi5kYXRhc2V0WydoaWRkZW4nXTtcbiAgICB9KTtcbiAgICBBcnJheS5mcm9tKHRoaXMuZHJvcEpveXN0aWNrLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXInKSkuZm9yRWFjaCgocykgPT4gKHMuc3R5bGUuZGlzcGxheSA9ICcnKSk7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9ICcnO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZVJvd3MgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgZmluZFN0YWNrQXRQb2ludChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3Qgc2hhZG93ID0gdGhpcy5zaGFkb3dSb290O1xuICAgIGlmICghc2hhZG93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IHNoYWRvdy5lbGVtZW50c0Zyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICBjb25zdCBzdGFjayA9IHRoaXMuZmluZFN0YWNrSW5UYXJnZXRzKGVsZW1lbnRzKTtcbiAgICBpZiAoc3RhY2spIHtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGRvY2tlZCBzdGFja3MgKGFsbCBwYW5lcyBhcmUgZmxvYXRpbmcpLCBhbGxvdyB0aGVcbiAgICAvLyBkb2NrZWQgc3VyZmFjZSBpdHNlbGYgdG8gc2VydmUgYXMgYSBkcm9wIHRhcmdldCBmb3IgdGhlIG1haW4gem9uZS5cbiAgICBpZiAoIXRoaXMucm9vdExheW91dCkge1xuICAgICAgY29uc3QgZG9ja1JlY3QgPSB0aGlzLmRvY2tlZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKFxuICAgICAgICBjbGllbnRYID49IGRvY2tSZWN0LmxlZnQgJiZcbiAgICAgICAgY2xpZW50WCA8PSBkb2NrUmVjdC5yaWdodCAmJlxuICAgICAgICBjbGllbnRZID49IGRvY2tSZWN0LnRvcCAmJlxuICAgICAgICBjbGllbnRZIDw9IGRvY2tSZWN0LmJvdHRvbVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY2tlZEVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU3RhY2tFbGVtZW50KGV2ZW50OiBEcmFnRXZlbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcbiAgICBjb25zdCBzdGFjayA9IHRoaXMuZmluZFN0YWNrSW5UYXJnZXRzKHBhdGgpO1xuICAgIGlmIChzdGFjaykge1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSByb290IGRvY2sgYXJlYSBpcyBlbXB0eSwgdHJlYXQgdGhlIGRvY2tlZCBzdXJmYWNlIGFzIGEgdmFsaWRcbiAgICAvLyB0YXJnZXQgd2hlbiBpdCBhcHBlYXJzIGluIHRoZSBjb21wb3NlZCBwYXRoLlxuICAgIGlmICghdGhpcy5yb290TGF5b3V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICAgICh0YXJnZXQgPT09IHRoaXMuZG9ja2VkRWwgfHwgdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1kb2NrZWQnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZG9ja2VkRWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpbmRTdGFja0luVGFyZ2V0cyh0YXJnZXRzOiBJdGVyYWJsZTxFdmVudFRhcmdldD4pOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0YXJnZXRzKSB7XG4gICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb2NrLXN0YWNrJykpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmXG4gICAgICAgIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1kcm9wLWpveXN0aWNrJykgfHxcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1kcm9wLWpveXN0aWNrX19idXR0b24nKSB8fFxuICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlcicpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyb3BKb3lzdGlja1RhcmdldDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2YXRlUGFuZShzdGFjazogSFRNTEVsZW1lbnQsIHBhbmVOYW1lOiBzdHJpbmcsIHBhdGg6IERvY2tQYXRoKTogdm9pZCB7XG4gICAgc3RhY2suZGF0YXNldFsnYWN0aXZlUGFuZSddID0gcGFuZU5hbWU7XG5cbiAgICBjb25zdCBoZWFkZXJCdXR0b25zID0gc3RhY2sucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJy5kb2NrLXRhYicpO1xuICAgIGhlYWRlckJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnV0dG9uLmRhdGFzZXRbJ3BhbmUnXSA9PT0gcGFuZU5hbWU7XG4gICAgICBidXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnZG9jay10YWItLWFjdGl2ZScsIGlzU2VsZWN0ZWQpO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIFN0cmluZyhpc1NlbGVjdGVkKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwYW5lcyA9IHN0YWNrLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFja19fcGFuZScpO1xuICAgIHBhbmVzLmZvckVhY2goKHBhbmUpID0+IHtcbiAgICAgIGlmIChwYW5lLmRhdGFzZXRbJ3BhbmUnXSA9PT0gcGFuZU5hbWUpIHtcbiAgICAgICAgcGFuZS5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFuZS5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoKTtcbiAgICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9jYXRpb24ubm9kZS5hY3RpdmVQYW5lID0gcGFuZU5hbWU7XG4gICAgaWYgKHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1twYXRoLmluZGV4XTtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZU5hbWU7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUZsb2F0aW5nV2luZG93VGl0bGUocGF0aC5pbmRleCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldE5vZGVBdFBhdGgocm9vdDogRG9ja0xheW91dE5vZGUgfCBudWxsLCBwYXRoOiBudW1iZXJbXSk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKCFyb290KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudDogRG9ja0xheW91dE5vZGUgfCBudWxsID0gcm9vdDtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwYXRoKSB7XG4gICAgICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC5raW5kICE9PSAnc3BsaXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRyZW5bc2VnbWVudF0gPz8gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVNwbGl0Tm9kZShwYXRoOiBEb2NrUGF0aCk6IERvY2tTcGxpdE5vZGUgfCBudWxsIHtcbiAgICBpZiAocGF0aC50eXBlID09PSAnZG9ja2VkJykge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUF0UGF0aCh0aGlzLnJvb3RMYXlvdXQsIHBhdGguc2VnbWVudHMpO1xuICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5raW5kID09PSAnc3BsaXQnID8gbm9kZSA6IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1twYXRoLmluZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nIHx8ICFmbG9hdGluZy5yb290KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQXRQYXRoKGZsb2F0aW5nLnJvb3QsIHBhdGguc2VnbWVudHMpO1xuICAgIHJldHVybiBub2RlICYmIG5vZGUua2luZCA9PT0gJ3NwbGl0JyA/IG5vZGUgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTm9kZUluVHJlZShcbiAgICByb290OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgdGFyZ2V0OiBEb2NrTGF5b3V0Tm9kZSxcbiAgICByZXBsYWNlbWVudDogRG9ja0xheW91dE5vZGUsXG4gICk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKCFyb290KSB7XG4gICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKHJvb3QgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEluZm8gPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChyb290LCB0YXJnZXQpO1xuICAgIGlmICghcGFyZW50SW5mbykge1xuICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxuXG4gICAgcGFyZW50SW5mby5wYXJlbnQuY2hpbGRyZW5bcGFyZW50SW5mby5pbmRleF0gPSByZXBsYWNlbWVudDtcbiAgICB0aGlzLm5vcm1hbGl6ZVNwbGl0Tm9kZShwYXJlbnRJbmZvLnBhcmVudCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBFbXB0eVN0YWNrSW5UcmVlKFxuICAgIHJvb3Q6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICBzdGFjazogRG9ja1N0YWNrTm9kZSxcbiAgKTogRG9ja0xheW91dE5vZGUgfCBudWxsIHtcbiAgICBpZiAoIXJvb3QgfHwgc3RhY2sucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50SW5mbyA9IHRoaXMuZmluZFBhcmVudFNwbGl0KHJvb3QsIHN0YWNrKTtcbiAgICBpZiAoIXBhcmVudEluZm8pIHtcbiAgICAgIHJldHVybiByb290ID09PSBzdGFjayA/IG51bGwgOiByb290O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudEluZm8ucGFyZW50O1xuICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yoc3RhY2spO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmVudC5zaXplcykpIHtcbiAgICAgIHBhcmVudC5zaXplcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLm5vcm1hbGl6ZVNwbGl0Tm9kZShwYXJlbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2xlYW51cFNwbGl0SWZOZWNlc3Nhcnkocm9vdCwgcGFyZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cFNwbGl0SWZOZWNlc3NhcnkoXG4gICAgcm9vdDogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHNwbGl0OiBEb2NrU3BsaXROb2RlLFxuICApOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGlmIChzcGxpdC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VOb2RlSW5UcmVlKHJvb3QsIHNwbGl0LCBzcGxpdC5jaGlsZHJlblswXSk7XG4gICAgfVxuXG4gICAgaWYgKHNwbGl0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcGFyZW50SW5mbyA9IHRoaXMuZmluZFBhcmVudFNwbGl0KHJvb3QsIHNwbGl0KTtcbiAgICAgIGlmICghcGFyZW50SW5mbykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50ID0gcGFyZW50SW5mby5wYXJlbnQ7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNwbGl0KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmVudC5zaXplcykpIHtcbiAgICAgICAgICBwYXJlbnQuc2l6ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vcm1hbGl6ZVNwbGl0Tm9kZShwYXJlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwU3BsaXRJZk5lY2Vzc2FyeShyb290LCBwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgcHJpdmF0ZSBkb2NrTm9kZUJlc2lkZShcbiAgICByb290OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgdGFyZ2V0Tm9kZTogRG9ja1N0YWNrTm9kZSxcbiAgICBuZXdOb2RlOiBEb2NrTGF5b3V0Tm9kZSxcbiAgICB6b25lOiBEcm9wWm9uZSxcbiAgKTogRG9ja0xheW91dE5vZGUgfCBudWxsIHtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHpvbmUgPT09ICdsZWZ0JyB8fCB6b25lID09PSAncmlnaHQnID8gJ2hvcml6b250YWwnIDogJ3ZlcnRpY2FsJztcbiAgICBjb25zdCBwbGFjZUJlZm9yZSA9IHpvbmUgPT09ICdsZWZ0JyB8fCB6b25lID09PSAndG9wJztcbiAgICBjb25zdCBwYXJlbnRJbmZvID0gdGhpcy5maW5kUGFyZW50U3BsaXQocm9vdCwgdGFyZ2V0Tm9kZSk7XG5cbiAgICBpZiAocGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnBhcmVudC5kaXJlY3Rpb24gPT09IG9yaWVudGF0aW9uKSB7XG4gICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHBsYWNlQmVmb3JlID8gcGFyZW50SW5mby5pbmRleCA6IHBhcmVudEluZm8uaW5kZXggKyAxO1xuICAgICAgcGFyZW50SW5mby5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluc2VydEluZGV4LCAwLCBuZXdOb2RlKTtcbiAgICAgIHBhcmVudEluZm8ucGFyZW50LnNpemVzID0gdGhpcy5pbnNlcnRXZWlnaHQoXG4gICAgICAgIHBhcmVudEluZm8ucGFyZW50LnNpemVzLFxuICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgcGFyZW50SW5mby5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHJldHVybiByb290ID8/IG5ld05vZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXQ6IERvY2tTcGxpdE5vZGUgPSB7XG4gICAgICBraW5kOiAnc3BsaXQnLFxuICAgICAgZGlyZWN0aW9uOiBvcmllbnRhdGlvbixcbiAgICAgIGNoaWxkcmVuOiBwbGFjZUJlZm9yZSA/IFtuZXdOb2RlLCB0YXJnZXROb2RlXSA6IFt0YXJnZXROb2RlLCBuZXdOb2RlXSxcbiAgICAgIHNpemVzOiBbMC41LCAwLjVdLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlTm9kZUluVHJlZShyb290LCB0YXJnZXROb2RlLCBzcGxpdCk7XG4gIH1cblxuICBwcml2YXRlIGZvckVhY2hTdGFjayhcbiAgICBub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgdmlzaXRvcjogKHN0YWNrOiBEb2NrU3RhY2tOb2RlLCBwYXRoOiBudW1iZXJbXSkgPT4gdm9pZCxcbiAgICBwYXRoOiBudW1iZXJbXSA9IFtdLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5raW5kID09PSAnc3RhY2snKSB7XG4gICAgICB2aXNpdG9yKG5vZGUsIHBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PlxuICAgICAgdGhpcy5mb3JFYWNoU3RhY2soY2hpbGQsIHZpc2l0b3IsIFsuLi5wYXRoLCBpbmRleF0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRTdGFja0NvbnRhaW5pbmdQYW5lKFxuICAgIG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICBwYW5lOiBzdHJpbmcsXG4gICk6IERvY2tTdGFja05vZGUgfCBudWxsIHtcbiAgICBsZXQgcmVzdWx0OiBEb2NrU3RhY2tOb2RlIHwgbnVsbCA9IG51bGw7XG4gICAgdGhpcy5mb3JFYWNoU3RhY2sobm9kZSwgKHN0YWNrKSA9PiB7XG4gICAgICBpZiAoIXJlc3VsdCAmJiBzdGFjay5wYW5lcy5pbmNsdWRlcyhwYW5lKSkge1xuICAgICAgICByZXN1bHQgPSBzdGFjaztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRmlyc3RQYW5lTmFtZShub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBsZXQgZm91bmQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRoaXMuZm9yRWFjaFN0YWNrKG5vZGUsIChzdGFjaykgPT4ge1xuICAgICAgaWYgKGZvdW5kIHx8IHN0YWNrLnBhbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc3RhY2suYWN0aXZlUGFuZSAmJiBzdGFjay5wYW5lcy5pbmNsdWRlcyhzdGFjay5hY3RpdmVQYW5lKSkge1xuICAgICAgICBmb3VuZCA9IHN0YWNrLmFjdGl2ZVBhbmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZCA9IHN0YWNrLnBhbmVzWzBdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdEZsb2F0aW5nUGFuZU1ldGFkYXRhKFxuICAgIG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgKTogeyBwYW5lczogc3RyaW5nW107IHRpdGxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgICAvLyBEZXByZWNhdGVkIG1ldGhvZCByZXRhaW5lZCB0ZW1wb3JhcmlseSBmb3Igc2lnbmF0dXJlIGNvbXBhdGliaWxpdHkuXG4gICAgLy8gVXNlIGNvbGxlY3RQYW5lTmFtZXMgaW5zdGVhZC5cbiAgICBjb25zdCBwYW5lcyA9IHRoaXMuY29sbGVjdFBhbmVOYW1lcyhub2RlKTtcbiAgICBjb25zdCB0aXRsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYW5lcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICBjb25zdCB0ID0gdGhpcy50aXRsZXNbcF07XG4gICAgICBpZiAodCkge1xuICAgICAgICB0aXRsZXNbcF0gPSB0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IHBhbmVzLCB0aXRsZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdFBhbmVOYW1lcyhub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFuZXM6IHN0cmluZ1tdID0gW107XG4gICAgdGhpcy5mb3JFYWNoU3RhY2sobm9kZSwgKHN0YWNrKSA9PiB7XG4gICAgICBzdGFjay5wYW5lcy5mb3JFYWNoKChwYW5lKSA9PiBwYW5lcy5wdXNoKHBhbmUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFuZXM7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUZsb2F0aW5nTGF5b3V0KFxuICAgIGxheW91dDogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXQsXG4gICk6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0IHtcbiAgICBjb25zdCBib3VuZHMgPSBsYXlvdXQuYm91bmRzID8/IHsgbGVmdDogMCwgdG9wOiAwLCB3aWR0aDogMzIwLCBoZWlnaHQ6IDIwMCB9O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRCb3VuZHMgPSB7XG4gICAgICBsZWZ0OiBOdW1iZXIuaXNGaW5pdGUoYm91bmRzLmxlZnQpID8gYm91bmRzLmxlZnQgOiAwLFxuICAgICAgdG9wOiBOdW1iZXIuaXNGaW5pdGUoYm91bmRzLnRvcCkgPyBib3VuZHMudG9wIDogMCxcbiAgICAgIHdpZHRoOiBOdW1iZXIuaXNGaW5pdGUoYm91bmRzLndpZHRoKSA/IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgMTYwKSA6IDMyMCxcbiAgICAgIGhlaWdodDogTnVtYmVyLmlzRmluaXRlKGJvdW5kcy5oZWlnaHQpID8gTWF0aC5tYXgoYm91bmRzLmhlaWdodCwgMTIwKSA6IDIwMCxcbiAgICB9O1xuXG4gICAgY29uc3Qgcm9vdCA9IGxheW91dC5yb290ID8gdGhpcy5jbG9uZUxheW91dE5vZGUobGF5b3V0LnJvb3QpIDogbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogbGF5b3V0LmlkLFxuICAgICAgYm91bmRzOiBub3JtYWxpemVkQm91bmRzLFxuICAgICAgekluZGV4OiBsYXlvdXQuekluZGV4LFxuICAgICAgcm9vdCxcbiAgICAgIGFjdGl2ZVBhbmU6IGxheW91dC5hY3RpdmVQYW5lLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFBhdGgocGF0aDogRG9ja1BhdGgpOiBzdHJpbmcge1xuICAgIGlmIChwYXRoLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9XG4gICAgICAgIHBhdGguc2VnbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYC8ke3BhdGguc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRvU3RyaW5nKCkpLmpvaW4oJy8nKX1gXG4gICAgICAgICAgOiAnJztcbiAgICAgIHJldHVybiBgZjoke3BhdGguaW5kZXh9JHtzdWZmaXh9YDtcbiAgICB9XG4gICAgY29uc3Qgc3VmZml4ID0gcGF0aC5zZWdtZW50cy5qb2luKCcvJyk7XG4gICAgcmV0dXJuIHN1ZmZpeC5sZW5ndGggPiAwID8gYGQ6JHtzdWZmaXh9YCA6ICdkOic7XG4gIH1cblxuICBwcml2YXRlIGNsb25lUGF0aChwYXRoOiBEb2NrUGF0aCk6IERvY2tQYXRoIHtcbiAgICBpZiAocGF0aC50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmxvYXRpbmcnLCBpbmRleDogcGF0aC5pbmRleCwgc2VnbWVudHM6IFsuLi5wYXRoLnNlZ21lbnRzXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFsuLi5wYXRoLnNlZ21lbnRzXSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVBhdGgocGF0aDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERvY2tQYXRoIHwgbnVsbCB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdmOicpKSB7XG4gICAgICBjb25zdCByZW1haW5kZXIgPSBwYXRoLnNsaWNlKDIpO1xuICAgICAgY29uc3QgW2luZGV4UGFydCwgLi4uc2VnbWVudFBhcnRzXSA9IHJlbWFpbmRlci5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIucGFyc2VJbnQoaW5kZXhQYXJ0LCAxMCk7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHNlZ21lbnRQYXJ0c1xuICAgICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG4gICAgICAgIC5tYXAoKHNlZ21lbnQpID0+IE51bWJlci5wYXJzZUludChzZWdtZW50LCAxMCkpXG4gICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmbG9hdGluZycsIGluZGV4LCBzZWdtZW50cyB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLnN0YXJ0c1dpdGgoJ2Q6JykgPyBwYXRoLnNsaWNlKDIpIDogcGF0aDtcbiAgICBpZiAobm9ybWFsaXplZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50czogW10gfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWRcbiAgICAgIC5zcGxpdCgnLycpXG4gICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG4gICAgICAubWFwKChzZWdtZW50KSA9PiBOdW1iZXIucGFyc2VJbnQoc2VnbWVudCwgMTApKVxuICAgICAgLmZpbHRlcigodmFsdWUpID0+IE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzIH07XG4gIH1cblxuICBwcml2YXRlIHBhdGhzRXF1YWwoYTogRG9ja1BhdGgsIGI6IERvY2tQYXRoKTogYm9vbGVhbiB7XG4gICAgaWYgKGEudHlwZSAhPT0gYi50eXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGEudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3Qgb3RoZXIgPSBiIGFzIEV4dHJhY3Q8RG9ja1BhdGgsIHsgdHlwZTogJ2Zsb2F0aW5nJyB9PjtcbiAgICAgIGlmIChhLmluZGV4ICE9PSBvdGhlci5pbmRleCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoYS5zZWdtZW50cy5sZW5ndGggIT09IG90aGVyLnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gYS5zZWdtZW50cy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gb3RoZXIuc2VnbWVudHNbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdGhlciA9IGIgYXMgRXh0cmFjdDxEb2NrUGF0aCwgeyB0eXBlOiAnZG9ja2VkJyB9PjtcbiAgICBpZiAoYS5zZWdtZW50cy5sZW5ndGggIT09IG90aGVyLnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhLnNlZ21lbnRzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBvdGhlci5zZWdtZW50c1tpbmRleF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09ySXNBbmNlc3Rvck9mKGFuY2VzdG9yOiBEb2NrUGF0aCwgZGVzY2VuZGFudDogRG9ja1BhdGgpOiBib29sZWFuIHtcbiAgICBpZiAoYW5jZXN0b3IudHlwZSAhPT0gZGVzY2VuZGFudC50eXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGFuY2VzdG9yLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGlmICgoZGVzY2VuZGFudCBhcyBhbnkpLmluZGV4ICE9PSBhbmNlc3Rvci5pbmRleCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFuY2VzdG9yLnNlZ21lbnRzLmxlbmd0aCA+IGRlc2NlbmRhbnQuc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9yLnNlZ21lbnRzLmV2ZXJ5KChzZWdtZW50LCBpKSA9PiBzZWdtZW50ID09PSBkZXNjZW5kYW50LnNlZ21lbnRzW2ldKTtcbiAgfVxuXG4gIHByaXZhdGUgY291bnRQYW5lc0luVHJlZShub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwpOiBudW1iZXIge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChub2RlLmtpbmQgPT09ICdzdGFjaycpIHtcbiAgICAgIHJldHVybiBub2RlLnBhbmVzLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ucmVkdWNlKCh0b3RhbCwgY2hpbGQpID0+IHRvdGFsICsgdGhpcy5jb3VudFBhbmVzSW5UcmVlKGNoaWxkKSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTdGFja0xvY2F0aW9uKHBhdGg6IERvY2tQYXRoKTogUmVzb2x2ZWRMb2NhdGlvbiB8IG51bGwge1xuICAgIGlmIChwYXRoLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3BhdGguaW5kZXhdO1xuICAgICAgaWYgKCFsYXlvdXQgfHwgIWxheW91dC5yb290KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUF0UGF0aChsYXlvdXQucm9vdCwgcGF0aC5zZWdtZW50cyk7XG4gICAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnc3RhY2snKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29udGV4dDogJ2Zsb2F0aW5nJywgaW5kZXg6IHBhdGguaW5kZXgsIHBhdGg6IFsuLi5wYXRoLnNlZ21lbnRzXSwgbm9kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVBdFBhdGgodGhpcy5yb290TGF5b3V0LCBwYXRoLnNlZ21lbnRzKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnc3RhY2snKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb250ZXh0OiAnZG9ja2VkJywgcGF0aDogWy4uLnBhdGguc2VnbWVudHNdLCBub2RlIH07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBhbmVGcm9tTG9jYXRpb24oXG4gICAgbG9jYXRpb246IFJlc29sdmVkTG9jYXRpb24sXG4gICAgcGFuZTogc3RyaW5nLFxuICAgIHNraXBDbGVhbnVwID0gZmFsc2UsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZG9ja2VkJykge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlUGFuZUZyb21TdGFjayhsb2NhdGlvbi5ub2RlLCBwYW5lLCBza2lwQ2xlYW51cCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlUGFuZUZyb21GbG9hdGluZyhsb2NhdGlvbi5pbmRleCwgbG9jYXRpb24ucGF0aCwgcGFuZSwgc2tpcENsZWFudXApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQYW5lVG9Mb2NhdGlvbihsb2NhdGlvbjogUmVzb2x2ZWRMb2NhdGlvbiwgcGFuZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGFuZXMgPSBsb2NhdGlvbi5ub2RlLnBhbmVzO1xuICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBwYW5lcy5pbmRleE9mKHBhbmUpO1xuICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgcGFuZXMuc3BsaWNlKGV4aXN0aW5nSW5kZXgsIDEpO1xuICAgIH1cbiAgICBwYW5lcy5wdXNoKHBhbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVQYW5lRm9yTG9jYXRpb24obG9jYXRpb246IFJlc29sdmVkTG9jYXRpb24sIHBhbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvY2F0aW9uLm5vZGUuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgaWYgKGxvY2F0aW9uLmNvbnRleHQgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbbG9jYXRpb24uaW5kZXhdO1xuICAgICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cExvY2F0aW9uKGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKGxvY2F0aW9uLmNvbnRleHQgPT09ICdkb2NrZWQnKSB7XG4gICAgICB0aGlzLnJvb3RMYXlvdXQgPSB0aGlzLmNsZWFudXBFbXB0eVN0YWNrSW5UcmVlKHRoaXMucm9vdExheW91dCwgbG9jYXRpb24ubm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbbG9jYXRpb24uaW5kZXhdO1xuICAgICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZsb2F0aW5nLnJvb3QgPSB0aGlzLmNsZWFudXBFbXB0eVN0YWNrSW5UcmVlKGZsb2F0aW5nLnJvb3QsIGxvY2F0aW9uLm5vZGUpO1xuICAgICAgaWYgKCFmbG9hdGluZy5yb290KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChsb2NhdGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW9yZGVyUGFuZUluTG9jYXRpb24obG9jYXRpb246IFJlc29sdmVkTG9jYXRpb24sIHBhbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhbmVzID0gbG9jYXRpb24ubm9kZS5wYW5lcztcbiAgICBjb25zdCBpbmRleCA9IHBhbmVzLmluZGV4T2YocGFuZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYW5lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHBhbmVzLnB1c2gocGFuZSk7XG4gICAgbG9jYXRpb24ubm9kZS5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICBpZiAobG9jYXRpb24uY29udGV4dCA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tsb2NhdGlvbi5pbmRleF07XG4gICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGbG9hdGluZ0F0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxvYXRpbmdMYXlvdXRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZsb2F0aW5nTGF5b3V0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQYW5lRnJvbUZsb2F0aW5nKFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGF0aDogbnVtYmVyW10sXG4gICAgcGFuZTogc3RyaW5nLFxuICAgIHNraXBDbGVhbnVwID0gZmFsc2UsXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbaW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcgfHwgIWZsb2F0aW5nLnJvb3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQXRQYXRoKGZsb2F0aW5nLnJvb3QsIHBhdGgpO1xuICAgIGlmICghbm9kZSB8fCBub2RlLmtpbmQgIT09ICdzdGFjaycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBub2RlLnBhbmVzID0gbm9kZS5wYW5lcy5maWx0ZXIoKHApID0+IHAgIT09IHBhbmUpO1xuICAgIGlmICghbm9kZS5wYW5lcy5pbmNsdWRlcyhub2RlLmFjdGl2ZVBhbmUgPz8gJycpKSB7XG4gICAgICBpZiAobm9kZS5wYW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGUuYWN0aXZlUGFuZSA9IG5vZGUucGFuZXNbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbm9kZS5hY3RpdmVQYW5lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmbG9hdGluZy5hY3RpdmVQYW5lID09PSBwYW5lKSB7XG4gICAgICBjb25zdCBmYWxsYmFjayA9IHRoaXMuZmluZEZpcnN0UGFuZU5hbWUoZmxvYXRpbmcucm9vdCk7XG4gICAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IGZhbGxiYWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGZsb2F0aW5nLmFjdGl2ZVBhbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChza2lwQ2xlYW51cCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZmxvYXRpbmcucm9vdCA9IHRoaXMuY2xlYW51cEVtcHR5U3RhY2tJblRyZWUoZmxvYXRpbmcucm9vdCwgbm9kZSk7XG4gICAgaWYgKCFmbG9hdGluZy5yb290KSB7XG4gICAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTaXplc0FycmF5KHNpemVzOiBudW1iZXJbXSB8IHVuZGVmaW5lZCwgY291bnQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzaXplcykgfHwgc2l6ZXMubGVuZ3RoICE9PSBjb3VudCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IDEgLyBjb3VudCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHNpemVzLm1hcCgodmFsdWUpID0+IChOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gTWF0aC5tYXgodmFsdWUsIDApIDogMCkpO1xuICAgIGNvbnN0IHRvdGFsID0gbm9ybWFsaXplZC5yZWR1Y2UoKGFjYywgdmFsdWUpID0+IGFjYyArIHZhbHVlLCAwKTtcbiAgICBpZiAodG90YWwgPD0gMCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IDEgLyBjb3VudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQubWFwKCh2YWx1ZSkgPT4gdmFsdWUgLyB0b3RhbCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVNwbGl0Tm9kZShzcGxpdDogRG9ja1NwbGl0Tm9kZSk6IHZvaWQge1xuICAgIHNwbGl0LnNpemVzID0gdGhpcy5ub3JtYWxpemVTaXplc0FycmF5KHNwbGl0LnNpemVzLCBzcGxpdC5jaGlsZHJlbi5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaExheW91dENoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdkb2NrLWxheW91dC1jaGFuZ2VkJywge1xuICAgICAgICBkZXRhaWw6IHRoaXMuc25hcHNob3QsXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVMYXlvdXROb2RlKGxheW91dDogRG9ja0xheW91dE5vZGUpOiBEb2NrTGF5b3V0Tm9kZTtcbiAgcHJpdmF0ZSBjbG9uZUxheW91dE5vZGUobGF5b3V0OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwpOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGw7XG4gIHByaXZhdGUgY2xvbmVMYXlvdXROb2RlKGxheW91dDogRG9ja0xheW91dE5vZGUgfCBudWxsKTogRG9ja0xheW91dE5vZGUgfCBudWxsIHtcbiAgICBpZiAoIWxheW91dCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGF5b3V0KSkgYXMgRG9ja0xheW91dE5vZGU7XG4gIH1cblxuICBwcml2YXRlIGNsb25lRmxvYXRpbmdBcnJheShcbiAgICBsYXlvdXRzOiBEb2NrRmxvYXRpbmdTdGFja0xheW91dFtdLFxuICApOiBEb2NrRmxvYXRpbmdTdGFja0xheW91dFtdIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsYXlvdXRzKSkgYXMgRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXRbXTtcbiAgfVxufVxuXG5jb25zdCB0YWdOYW1lID0gJ21pbnQtZG9jay1tYW5hZ2VyJztcblxuaWYgKHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWN1c3RvbUVsZW1lbnRzLmdldCh0YWdOYW1lKSkge1xuICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgTWludERvY2tNYW5hZ2VyRWxlbWVudCk7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ21pbnQtZG9jay1tYW5hZ2VyJzogTWludERvY2tNYW5hZ2VyRWxlbWVudDtcbiAgfVxufVxuIl19","import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, Input, Output, QueryList, ViewChild, } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { BsDockPaneComponent } from './dock-pane.component';\nimport { MintDockManagerElement } from '../web-components/mint-dock-manager.element';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nexport class BsDockManagerComponent {\n set layout(value) {\n const snapshot = this.cloneLayout(this.ensureSnapshot(value));\n this._layout = snapshot;\n this.layoutString = this.stringifyLayout(snapshot);\n this.applyLayout();\n }\n get layout() {\n if (!this._layout.root && this._layout.floating.length === 0) {\n return null;\n }\n return this.cloneLayout(this._layout);\n }\n constructor(changeDetector, documentRef) {\n this.changeDetector = changeDetector;\n this.layoutChange = new EventEmitter();\n this.layoutSnapshotChange = new EventEmitter();\n this.layoutString = null;\n this.panes = new QueryList();\n this.trackByPane = (_, pane) => pane.name;\n this._layout = { root: null, floating: [] };\n if (documentRef) {\n MintDockManagerElement.configureDocument(documentRef);\n }\n }\n ngAfterViewInit() {\n this.applyLayout();\n }\n captureLayout() {\n const element = this.managerRef?.nativeElement;\n return element?.snapshot ?? { root: null, floating: [] };\n }\n onLayoutChanged(event) {\n const snapshot = event.detail ?? {\n root: null,\n floating: [],\n };\n this._layout = this.cloneLayout(snapshot);\n this.layoutString = this.stringifyLayout(this._layout);\n this.layoutChange.emit(this.layout);\n this.layoutSnapshotChange.emit(this.cloneLayout(snapshot));\n this.changeDetector.markForCheck();\n }\n applyLayout() {\n if (!this.managerRef) {\n return;\n }\n const element = this.managerRef.nativeElement;\n const layout = this.layout;\n element.layout = layout ?? null;\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if ('kind' in value) {\n return { root: value, floating: [], titles: {} };\n }\n return {\n root: value.root ?? null,\n floating: Array.isArray(value.floating) ? [...value.floating] : [],\n titles: value.titles ? { ...value.titles } : {},\n };\n }\n stringifyLayout(layout) {\n if (!layout.root && layout.floating.length === 0) {\n return null;\n }\n return JSON.stringify(layout);\n }\n cloneLayout(layout) {\n return JSON.parse(JSON.stringify(layout));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockManagerComponent, isStandalone: false, selector: \"bs-dock-manager\", inputs: { layout: \"layout\" }, outputs: { layoutChange: \"layoutChange\", layoutSnapshotChange: \"layoutSnapshotChange\" }, queries: [{ propertyName: \"panes\", predicate: BsDockPaneComponent }], viewQueries: [{ propertyName: \"managerRef\", first: true, predicate: [\"manager\"], descendants: true, static: true }], ngImport: i0, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i1.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, decorators: [{\n type: Component,\n args: [{ selector: 'bs-dock-manager', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Document, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }], propDecorators: { layout: [{\n type: Input\n }], layoutChange: [{\n type: Output\n }], layoutSnapshotChange: [{\n type: Output\n }], panes: [{\n type: ContentChildren,\n args: [BsDockPaneComponent]\n }], managerRef: [{\n type: ViewChild,\n args: ['manager', { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQVNyRixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLElBQ0ksTUFBTSxDQUFDLEtBQXlDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJ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dGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRG9ja0xheW91dCxcbiAgRG9ja0xheW91dE5vZGUsXG4gIERvY2tMYXlvdXRTbmFwc2hvdCxcbn0gZnJvbSAnLi4vdHlwZXMvZG9jay1sYXlvdXQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vZG9jay1wYW5lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNaW50RG9ja01hbmFnZXJFbGVtZW50IH0gZnJvbSAnLi4vd2ViLWNvbXBvbmVudHMvbWludC1kb2NrLW1hbmFnZXIuZWxlbWVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stbWFuYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpXG4gIHNldCBsYXlvdXQodmFsdWU6IERvY2tMYXlvdXROb2RlIHwgRG9ja0xheW91dCB8IG51bGwpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuY2xvbmVMYXlvdXQodGhpcy5lbnN1cmVTbmFwc2hvdCh2YWx1ZSkpO1xuICAgIHRoaXMuX2xheW91dCA9IHNuYXBzaG90O1xuICAgIHRoaXMubGF5b3V0U3RyaW5nID0gdGhpcy5zdHJpbmdpZnlMYXlvdXQoc25hcHNob3QpO1xuICAgIHRoaXMuYXBwbHlMYXlvdXQoKTtcbiAgfVxuICBnZXQgbGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5fbGF5b3V0LnJvb3QgJiYgdGhpcy5fbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lTGF5b3V0KHRoaXMuX2xheW91dCk7XG4gIH1cblxuICBAT3V0cHV0KCkgbGF5b3V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEb2NrTGF5b3V0U25hcHNob3QgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgbGF5b3V0U25hcHNob3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERvY2tMYXlvdXRTbmFwc2hvdD4oKTtcblxuICBsYXlvdXRTdHJpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQnNEb2NrUGFuZUNvbXBvbmVudCkgcGFuZXM6IFF1ZXJ5TGlzdDxCc0RvY2tQYW5lQ29tcG9uZW50PiA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgQFZpZXdDaGlsZCgnbWFuYWdlcicsIHsgc3RhdGljOiB0cnVlIH0pIG1hbmFnZXJSZWYhOiBFbGVtZW50UmVmPE1pbnREb2NrTWFuYWdlckVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5UGFuZSA9IChfOiBudW1iZXIsIHBhbmU6IEJzRG9ja1BhbmVDb21wb25lbnQpID0+IHBhbmUubmFtZTtcblxuICBwcml2YXRlIF9sYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCA9IHsgcm9vdDogbnVsbCwgZmxvYXRpbmc6IFtdIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnRSZWY6IERvY3VtZW50LFxuICApIHtcbiAgICBpZiAoZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuY29uZmlndXJlRG9jdW1lbnQoZG9jdW1lbnRSZWYpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5TGF5b3V0KCk7XG4gIH1cblxuICBjYXB0dXJlTGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMubWFuYWdlclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWxlbWVudD8uc25hcHNob3QgPz8geyByb290OiBudWxsLCBmbG9hdGluZzogW10gfTtcbiAgfVxuXG4gIG9uTGF5b3V0Q2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9XG4gICAgICAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8RG9ja0xheW91dFNuYXBzaG90PikuZGV0YWlsID8/IHtcbiAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgZmxvYXRpbmc6IFtdLFxuICAgICAgfTtcbiAgICB0aGlzLl9sYXlvdXQgPSB0aGlzLmNsb25lTGF5b3V0KHNuYXBzaG90KTtcbiAgICB0aGlzLmxheW91dFN0cmluZyA9IHRoaXMuc3RyaW5naWZ5TGF5b3V0KHRoaXMuX2xheW91dCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2UuZW1pdCh0aGlzLmxheW91dCk7XG4gICAgdGhpcy5sYXlvdXRTbmFwc2hvdENoYW5nZS5lbWl0KHRoaXMuY2xvbmVMYXlvdXQoc25hcHNob3QpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUxheW91dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFuYWdlclJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm1hbmFnZXJSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheW91dDtcbiAgICBlbGVtZW50LmxheW91dCA9IGxheW91dCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTbmFwc2hvdChcbiAgICB2YWx1ZTogRG9ja0xheW91dE5vZGUgfCBEb2NrTGF5b3V0IHwgbnVsbCxcbiAgKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiBudWxsLCBmbG9hdGluZzogW10sIHRpdGxlczoge30gfTtcbiAgICB9XG5cbiAgICBpZiAoJ2tpbmQnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiB2YWx1ZSwgZmxvYXRpbmc6IFtdLCB0aXRsZXM6IHt9IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IHZhbHVlLnJvb3QgPz8gbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBBcnJheS5pc0FycmF5KHZhbHVlLmZsb2F0aW5nKSA/IFsuLi52YWx1ZS5mbG9hdGluZ10gOiBbXSxcbiAgICAgIHRpdGxlczogdmFsdWUudGl0bGVzID8geyAuLi52YWx1ZS50aXRsZXMgfSA6IHt9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ2lmeUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghbGF5b3V0LnJvb3QgJiYgbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShsYXlvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGF5b3V0KSkgYXMgRG9ja0xheW91dFNuYXBzaG90O1xuICB9XG59XG4iLCI8bWludC1kb2NrLW1hbmFnZXJcbiAgI21hbmFnZXJcbiAgY2xhc3M9XCJicy1kb2NrLW1hbmFnZXJcIlxuICBbYXR0ci5sYXlvdXRdPVwibGF5b3V0U3RyaW5nXCJcbiAgKGRvY2stbGF5b3V0LWNoYW5nZWQpPVwib25MYXlvdXRDaGFuZ2VkKCRldmVudClcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lIG9mIHBhbmVzOyB0cmFja0J5OiB0cmFja0J5UGFuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJicy1kb2NrLXBhbmVcIiBbYXR0ci5zbG90XT1cInBhbmUubmFtZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhbmUudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L21pbnQtZG9jay1tYW5hZ2VyPlxuIl19","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BsDockManagerComponent } from './components/dock-manager.component';\nimport { BsDockPaneComponent } from './components/dock-pane.component';\nimport * as i0 from \"@angular/core\";\nexport class BsDockModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, declarations: [BsDockManagerComponent, BsDockPaneComponent], imports: [CommonModule], exports: [BsDockManagerComponent, BsDockPaneComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, imports: [CommonModule] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [BsDockManagerComponent, BsDockPaneComponent],\n imports: [CommonModule],\n exports: [BsDockManagerComponent, BsDockPaneComponent],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL2RvY2svc3JjL2xpYi9kb2NrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFRdkUsTUFBTSxPQUFPLFlBQVk7OEdBQVosWUFBWTsrR0FBWixZQUFZLGlCQUxSLHNCQUFzQixFQUFFLG1CQUFtQixhQUNoRCxZQUFZLGFBQ1osc0JBQXNCLEVBQUUsbUJBQW1COytHQUcxQyxZQUFZLFlBSmIsWUFBWTs7MkZBSVgsWUFBWTtrQkFOeEIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDM0QsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDdEQsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2RvY2stbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kb2NrLXBhbmUuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgQnNEb2NrTW9kdWxlIHt9XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludHBsYXllci1uZy1ib290c3RyYXAtZG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9taW50cGxheWVyLW5nLWJvb3RzdHJhcC1kb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":";;;;;AAEO,MAAM,mBAAmB,CAAC;AACjC,IAAI,kBAAkB,GAAG;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACxB,YAAY,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;AAC3E;AACA;AACA,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AACrL,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,oDAAoD,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACra;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AAC7H,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,QAAQ,EAAE,cAAc;AAC5C,oBAAoB,QAAQ,EAAE,CAAC,oDAAoD,CAAC;AACpF,oBAAoB,UAAU,EAAE,KAAK;AACrC,iBAAiB;AACjB,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;AACrC,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;AACxB,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC3B,gBAAgB,IAAI,EAAE,SAAS;AAC/B,gBAAgB,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;AACpD,aAAa,CAAC,EAAE,EAAE,CAAC;;ACzBnB,MAAM,YAAY,GAAG;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,IAAI,cAAc,GAAG,IAAI;AACzB,IAAI,sBAAsB,GAAG,IAAI;AACjC,SAAS,cAAc,CAAC,WAAW,EAAE;AACrC,IAAI,IAAI,CAAC,cAAc,IAAI,sBAAsB,KAAK,WAAW,EAAE;AACnE,QAAQ,cAAc,GAAG,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC;AAC9D,QAAQ,cAAc,CAAC,SAAS,GAAG,YAAY;AAC/C,QAAQ,sBAAsB,GAAG,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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-dock.mjs","sources":["../tmp-esm2022/dock/src/lib/components/dock-pane.component.js","../tmp-esm2022/dock/src/lib/web-components/mint-dock-manager.element.js","../tmp-esm2022/dock/src/lib/components/dock-manager.component.js","../tmp-esm2022/dock/src/lib/dock.module.js","../tmp-esm2022/dock/mintplayer-ng-bootstrap-dock.js"],"sourcesContent":["import { Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class BsDockPaneComponent {\n ngAfterContentInit() {\n if (!this.name) {\n throw new Error('bs-dock-pane requires a unique \"name\" input.');\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockPaneComponent, isStandalone: false, selector: \"bs-dock-pane\", inputs: { name: \"name\", title: \"title\" }, viewQueries: [{ propertyName: \"template\", first: true, predicate: TemplateRef, descendants: true, static: true }], ngImport: i0, template: `<ng-template><ng-content></ng-content></ng-template>`, isInline: true }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'bs-dock-pane',\n template: `<ng-template><ng-content></ng-content></ng-template>`,\n standalone: false,\n }]\n }], propDecorators: { name: [{\n type: Input\n }], title: [{\n type: Input\n }], template: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1wYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0YsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQzs4R0FWVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiw2SkFJbkIsV0FBVyw4REFQWixzREFBc0Q7OzJGQUdyRCxtQkFBbUI7a0JBTC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxzREFBc0Q7b0JBQ2hFLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjs4QkFFVSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVvQyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stcGFuZScsXG4gIHRlbXBsYXRlOiBgPG5nLXRlbXBsYXRlPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPmAsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tQYW5lQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpIG5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JzLWRvY2stcGFuZSByZXF1aXJlcyBhIHVuaXF1ZSBcIm5hbWVcIiBpbnB1dC4nKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","const templateHtml = `\n <style>\n :host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n contain: layout paint size style;\n box-sizing: border-box;\n font-family: inherit;\n color: inherit;\n }\n\n .dock-root,\n .dock-docked,\n .dock-split,\n .dock-split__child,\n .dock-stack,\n .dock-stack__content,\n .dock-stack__pane {\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n }\n\n .dock-root {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .dock-docked {\n position: absolute;\n inset: 0;\n display: flex;\n z-index: 0;\n }\n\n .dock-floating-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 5;\n }\n\n .dock-floating {\n position: absolute;\n display: flex;\n flex-direction: column;\n pointer-events: auto;\n border: 1px solid rgba(0, 0, 0, 0.3);\n border-radius: 0.5rem;\n background: rgba(255, 255, 255, 0.92);\n box-shadow: 0 16px 32px rgba(15, 23, 42, 0.25);\n overflow: hidden;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__chrome {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.35rem 0.75rem;\n cursor: move;\n background: linear-gradient(\n to bottom,\n rgba(148, 163, 184, 0.6),\n rgba(148, 163, 184, 0.25)\n );\n border-bottom: 1px solid rgba(148, 163, 184, 0.5);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .dock-floating__title {\n flex: 1 1 auto;\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(30, 41, 59, 0.95);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dock-floating > .dock-stack {\n flex: 1 1 auto;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__resizer {\n position: absolute;\n pointer-events: auto;\n z-index: 2;\n background: rgba(148, 163, 184, 0.25);\n transition: background 120ms ease;\n }\n\n .dock-floating__resizer:hover {\n background: rgba(148, 163, 184, 0.4);\n }\n\n .dock-floating__resizer--top,\n .dock-floating__resizer--bottom {\n left: 0.75rem;\n right: 0.75rem;\n height: 0.5rem;\n }\n\n .dock-floating__resizer--top {\n top: 0;\n cursor: n-resize;\n }\n\n .dock-floating__resizer--bottom {\n bottom: 0;\n cursor: s-resize;\n }\n\n .dock-floating__resizer--left,\n .dock-floating__resizer--right {\n top: 1.75rem;\n bottom: 0.75rem;\n width: 0.5rem;\n }\n\n .dock-floating__resizer--left {\n left: 0;\n cursor: w-resize;\n }\n\n .dock-floating__resizer--right {\n right: 0;\n cursor: e-resize;\n }\n\n .dock-floating__resizer--top-left,\n .dock-floating__resizer--top-right,\n .dock-floating__resizer--bottom-left,\n .dock-floating__resizer--bottom-right {\n width: 0.75rem;\n height: 0.75rem;\n }\n\n .dock-floating__resizer--top-left {\n top: 0;\n left: 0;\n cursor: nw-resize;\n }\n\n .dock-floating__resizer--top-right {\n top: 0;\n right: 0;\n cursor: ne-resize;\n }\n\n .dock-floating__resizer--bottom-left {\n bottom: 0;\n left: 0;\n cursor: sw-resize;\n }\n\n .dock-floating__resizer--bottom-right {\n right: 0;\n bottom: 0;\n cursor: se-resize;\n }\n\n .dock-split {\n display: flex;\n flex: 1 1 0;\n gap: 0.25rem;\n position: relative;\n }\n\n .dock-split[data-direction=\"vertical\"] {\n flex-direction: column;\n }\n\n .dock-split[data-direction=\"horizontal\"] {\n flex-direction: row;\n }\n\n .dock-split__child {\n display: flex;\n flex: 1 1 0;\n position: relative;\n }\n\n .dock-split__divider {\n position: relative;\n flex: 0 0 auto;\n background: rgba(0, 0, 0, 0.08);\n transition: background 120ms ease;\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider {\n width: 0.5rem;\n cursor: col-resize;\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider {\n height: 0.5rem;\n cursor: row-resize;\n }\n\n .dock-split__divider::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border-radius: 999px;\n background: rgba(0, 0, 0, 0.25);\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider::after {\n width: 0.125rem;\n height: 60%;\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider::after {\n width: 60%;\n height: 0.125rem;\n }\n\n .dock-split__divider:hover,\n .dock-split__divider:focus-visible,\n .dock-split__divider[data-resizing='true'] {\n background: rgba(59, 130, 246, 0.35);\n }\n\n .dock-stack {\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.25rem;\n background: rgba(255, 255, 255, 0.75);\n backdrop-filter: blur(4px);\n }\n\n .dock-stack__header {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.25rem;\n background: rgba(0, 0, 0, 0.05);\n border-bottom: 1px solid rgba(0, 0, 0, 0.15);\n }\n\n .dock-tab {\n appearance: none;\n border: none;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: grab;\n transition: background 160ms ease;\n }\n\n .dock-tab:active {\n cursor: grabbing;\n }\n\n .dock-tab:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .dock-tab:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.8);\n outline-offset: 1px;\n }\n\n .dock-tab--active {\n background: rgba(59, 130, 246, 0.15);\n }\n\n .dock-stack__content {\n position: relative;\n flex: 1 1 auto;\n display: flex;\n overflow: hidden;\n }\n\n .dock-stack__pane {\n position: relative;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dock-stack__pane[hidden] {\n display: none !important;\n }\n\n .dock-drop-indicator {\n position: absolute;\n pointer-events: none;\n border: 2px solid rgba(59, 130, 246, 0.9);\n background: rgba(59, 130, 246, 0.2);\n border-radius: 0.25rem;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 100;\n }\n\n .dock-drop-indicator[data-visible='true'] {\n opacity: 1;\n }\n\n .dock-drop-joystick {\n position: absolute;\n display: grid;\n grid-template-columns: repeat(3, min-content);\n grid-template-rows: repeat(3, min-content);\n gap: 0.125rem;\n padding: 0.125rem;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.15);\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);\n pointer-events: none;\n transform: translate(-50%, -50%);\n z-index: 110;\n }\n\n .dock-drop-joystick__spacer {\n width: 1.75rem;\n height: 1.75rem;\n pointer-events: none;\n }\n\n .dock-drop-joystick__button {\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.375rem;\n border: 1px solid rgba(59, 130, 246, 0.4);\n background: rgba(255, 255, 255, 0.9);\n color: rgba(30, 64, 175, 0.9);\n font-size: 0.75rem;\n line-height: 1;\n font-weight: 600;\n pointer-events: auto;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease, border-color 120ms ease;\n }\n\n .dock-drop-joystick__button[data-active='true'],\n .dock-drop-joystick__button:hover,\n .dock-drop-joystick__button:focus-visible {\n background: rgba(59, 130, 246, 0.25);\n border-color: rgba(59, 130, 246, 0.8);\n color: rgba(30, 64, 175, 1);\n }\n\n .dock-drop-joystick__button:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.9);\n outline-offset: 1px;\n }\n\n .dock-drop-joystick__button[data-zone='center'] {\n border-radius: 0.5rem;\n }\n\n ::slotted(*) {\n flex: 1 1 auto;\n display: block;\n min-width: 0;\n min-height: 0;\n }\n </style>\n <div class=\"dock-root\">\n <div class=\"dock-docked\"></div>\n <div class=\"dock-floating-layer\"></div>\n </div>\n <div class=\"dock-drop-indicator\"></div>\n <div class=\"dock-drop-joystick\" data-visible=\"false\">\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"top\"\n aria-label=\"Dock to top\"\n >\n ↑\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"left\"\n aria-label=\"Dock to left\"\n >\n ←\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"center\"\n aria-label=\"Dock to center\"\n >\n •\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"right\"\n aria-label=\"Dock to right\"\n >\n →\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"bottom\"\n aria-label=\"Dock to bottom\"\n >\n ↓\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n </div>\n`;\nlet cachedTemplate = null;\nlet cachedTemplateDocument = null;\nfunction ensureTemplate(documentRef) {\n if (!cachedTemplate || cachedTemplateDocument !== documentRef) {\n cachedTemplate = documentRef.createElement('template');\n cachedTemplate.innerHTML = templateHtml;\n cachedTemplateDocument = documentRef;\n }\n return cachedTemplate;\n}\nexport class MintDockManagerElement extends HTMLElement {\n static { this.documentRef = typeof document !== 'undefined' ? document : null; }\n static configureDocument(documentRef) {\n if (documentRef) {\n MintDockManagerElement.documentRef = documentRef;\n }\n }\n static get observedAttributes() {\n return ['layout'];\n }\n static { this.instanceCounter = 0; }\n constructor() {\n super();\n this.dropJoystickTarget = null;\n this.rootLayout = null;\n this.floatingLayouts = [];\n this.titles = {};\n this.pendingTabDragMetrics = null;\n this.resizeState = null;\n this.dragState = null;\n this.floatingDragState = null;\n this.floatingResizeState = null;\n this.pointerTrackingActive = false;\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n this.pendingDragEndTimeout = null;\n const documentRef = this.resolveDocument();\n this.documentRef = documentRef;\n this.windowRef = this.resolveWindow(documentRef);\n const shadowRoot = this.attachShadow({ mode: 'open' });\n const template = ensureTemplate(documentRef);\n shadowRoot.appendChild(template.content.cloneNode(true));\n const root = shadowRoot.querySelector('.dock-root');\n if (!root) {\n throw new Error('mint-dock-manager template is missing the root element.');\n }\n const docked = shadowRoot.querySelector('.dock-docked');\n if (!docked) {\n throw new Error('mint-dock-manager template is missing the docked surface element.');\n }\n const floatingLayer = shadowRoot.querySelector('.dock-floating-layer');\n if (!floatingLayer) {\n throw new Error('mint-dock-manager template is missing the floating layer element.');\n }\n const indicator = shadowRoot.querySelector('.dock-drop-indicator');\n if (!indicator) {\n throw new Error('mint-dock-manager template is missing the drop indicator element.');\n }\n const joystick = shadowRoot.querySelector('.dock-drop-joystick');\n if (!joystick) {\n throw new Error('mint-dock-manager template is missing the drop joystick element.');\n }\n const joystickButtons = Array.from(joystick.querySelectorAll('.dock-drop-joystick__button[data-zone]'));\n if (joystickButtons.length === 0) {\n throw new Error('mint-dock-manager template is missing drop joystick buttons.');\n }\n this.rootEl = root;\n this.dockedEl = docked;\n this.floatingLayerEl = floatingLayer;\n this.dropIndicator = indicator;\n this.dropJoystick = joystick;\n this.dropJoystickButtons = joystickButtons;\n this.instanceId = `mint-dock-${++MintDockManagerElement.instanceCounter}`;\n this.onPointerMove = this.onPointerMove.bind(this);\n this.onPointerUp = this.onPointerUp.bind(this);\n this.onDragOver = this.onDragOver.bind(this);\n this.onGlobalDragOver = this.onGlobalDragOver.bind(this);\n this.onGlobalDragEnd = this.onGlobalDragEnd.bind(this);\n this.onDrop = this.onDrop.bind(this);\n this.onDragLeave = this.onDragLeave.bind(this);\n this.onDrag = this.onDrag.bind(this);\n this.onDragMouseMove = this.onDragMouseMove.bind(this);\n this.onDragTouchMove = this.onDragTouchMove.bind(this);\n this.onDragMouseUp = this.onDragMouseUp.bind(this);\n this.onDragTouchEnd = this.onDragTouchEnd.bind(this);\n }\n connectedCallback() {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'application');\n }\n // Tag the docked surface with a root path so it can act as\n // a drop target when the main layout is empty.\n this.dockedEl.dataset['path'] = this.formatPath({ type: 'docked', segments: [] });\n this.render();\n this.rootEl.addEventListener('dragover', this.onDragOver);\n this.rootEl.addEventListener('drop', this.onDrop);\n this.rootEl.addEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.addEventListener('dragover', this.onDragOver);\n this.dropJoystick.addEventListener('drop', this.onDrop);\n this.dropJoystick.addEventListener('dragleave', this.onDragLeave);\n // Strengthen zone tracking by reacting to dragenter/dragover directly on the buttons.\n // This avoids relying solely on hit-testing each frame which can be jittery during HTML5 drag.\n this.dropJoystickButtons.forEach((btn) => {\n const handler = (e) => {\n if (!this.dragState)\n return;\n const z = btn.dataset['zone'];\n if (this.isDropZone(z)) {\n this.updateDropJoystickActiveZone(z);\n e.preventDefault();\n }\n };\n btn.addEventListener('dragenter', handler);\n btn.addEventListener('dragover', handler);\n });\n const win = this.windowRef;\n win?.addEventListener('dragover', this.onGlobalDragOver);\n win?.addEventListener('drag', this.onDrag);\n win?.addEventListener('dragend', this.onGlobalDragEnd, true);\n }\n disconnectedCallback() {\n this.rootEl.removeEventListener('dragover', this.onDragOver);\n this.rootEl.removeEventListener('drop', this.onDrop);\n this.rootEl.removeEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.removeEventListener('dragover', this.onDragOver);\n this.dropJoystick.removeEventListener('drop', this.onDrop);\n this.dropJoystick.removeEventListener('dragleave', this.onDragLeave);\n const win = this.windowRef;\n win?.removeEventListener('dragover', this.onGlobalDragOver);\n win?.removeEventListener('drag', this.onDrag);\n win?.removeEventListener('dragend', this.onGlobalDragEnd, true);\n this.stopDragPointerTracking();\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n }\n attributeChangedCallback(name, _oldValue, newValue) {\n if (name === 'layout') {\n this.layout = newValue ? this.parseLayout(newValue) : null;\n }\n }\n get layout() {\n return {\n root: this.cloneLayoutNode(this.rootLayout),\n floating: this.cloneFloatingArray(this.floatingLayouts),\n titles: { ...this.titles },\n };\n }\n set layout(value) {\n const snapshot = this.ensureSnapshot(value);\n this.rootLayout = this.cloneLayoutNode(snapshot.root);\n this.floatingLayouts = this.cloneFloatingArray(snapshot.floating);\n this.titles = snapshot.titles ? { ...snapshot.titles } : {};\n this.render();\n }\n get snapshot() {\n return this.layout;\n }\n toJSON() {\n return this.snapshot;\n }\n resolveDocument() {\n const staticDocument = MintDockManagerElement.documentRef;\n const ownerDocument = this.ownerDocument ?? null;\n const globalDocument = typeof document !== 'undefined' ? document : null;\n const resolvedDocument = staticDocument ?? ownerDocument ?? globalDocument;\n if (!resolvedDocument) {\n throw new Error('mint-dock-manager requires a Document to initialize.');\n }\n if (!MintDockManagerElement.documentRef) {\n MintDockManagerElement.documentRef = resolvedDocument;\n }\n return resolvedDocument;\n }\n resolveWindow(documentRef) {\n if (typeof window !== 'undefined') {\n return window;\n }\n return documentRef.defaultView ?? null;\n }\n parseLayout(value) {\n try {\n const parsed = JSON.parse(value);\n return this.ensureSnapshot(parsed);\n }\n catch (err) {\n console.warn('mint-dock-manager: failed to parse layout attribute', err);\n return null;\n }\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if (value.kind) {\n return { root: value, floating: [], titles: {} };\n }\n const layout = value;\n return {\n root: layout.root ?? null,\n floating: Array.isArray(layout.floating)\n ? layout.floating.map((floating) => this.normalizeFloatingLayout(floating))\n : [],\n titles: layout.titles ? { ...layout.titles } : {},\n };\n }\n render() {\n this.dockedEl.innerHTML = '';\n this.floatingLayerEl.innerHTML = '';\n this.hideDropIndicator();\n if (this.rootLayout) {\n const fragment = this.renderNode(this.rootLayout, []);\n this.dockedEl.appendChild(fragment);\n }\n this.renderFloatingPanes();\n }\n renderNode(node, path, floatingIndex) {\n if (node.kind === 'split') {\n return this.renderSplit(node, path, floatingIndex);\n }\n return this.renderStack(node, path, floatingIndex);\n }\n renderFloatingPanes() {\n this.floatingLayerEl.innerHTML = '';\n this.floatingLayouts.forEach((floating, index) => {\n const wrapper = this.documentRef.createElement('div');\n wrapper.classList.add('dock-floating');\n wrapper.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const { left, top, width, height } = floating.bounds;\n wrapper.style.left = `${left}px`;\n wrapper.style.top = `${top}px`;\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n const zIndex = this.getFloatingPaneZIndex(index);\n wrapper.style.zIndex = String(zIndex);\n const chrome = this.documentRef.createElement('div');\n chrome.classList.add('dock-floating__chrome');\n chrome.addEventListener('pointerdown', (event) => this.beginFloatingDrag(event, index, wrapper, chrome));\n const title = this.documentRef.createElement('div');\n title.classList.add('dock-floating__title');\n title.textContent = this.getFloatingWindowTitle(floating);\n chrome.appendChild(title);\n wrapper.appendChild(chrome);\n if (floating.root) {\n const content = this.renderNode(floating.root, [], index);\n content.classList.add('dock-floating__stack');\n wrapper.appendChild(content);\n }\n else {\n const placeholder = this.documentRef.createElement('div');\n placeholder.classList.add('dock-stack');\n placeholder.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n placeholder.appendChild(empty);\n wrapper.appendChild(placeholder);\n }\n const resizerConfigs = [\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-left'],\n edges: { horizontal: 'left', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top'],\n edges: { horizontal: 'none', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-right'],\n edges: { horizontal: 'right', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--right'],\n edges: { horizontal: 'right', vertical: 'none' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-right'],\n edges: { horizontal: 'right', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom'],\n edges: { horizontal: 'none', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-left'],\n edges: { horizontal: 'left', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--left'],\n edges: { horizontal: 'left', vertical: 'none' },\n },\n ];\n resizerConfigs.forEach(({ classes, edges }) => {\n const resizer = this.documentRef.createElement('div');\n resizer.classList.add(...classes);\n resizer.addEventListener('pointerdown', (event) => this.beginFloatingResize(event, index, wrapper, resizer, edges));\n wrapper.appendChild(resizer);\n });\n this.floatingLayerEl.appendChild(wrapper);\n });\n }\n beginFloatingDrag(event, index, wrapper, handle) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const { left, top } = floating.bounds;\n try {\n handle.setPointerCapture(event.pointerId);\n }\n catch (err) {\n /* no-op: pointer capture may not be supported in all environments */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingDragState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startLeft: left,\n startTop: top,\n wrapper,\n handle,\n };\n this.startPointerTracking();\n }\n beginFloatingResize(event, index, wrapper, handle, edges) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n try {\n handle.setPointerCapture(event.pointerId);\n }\n catch (err) {\n /* pointer capture may not be supported */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingResizeState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startWidth: floating.bounds.width,\n startHeight: floating.bounds.height,\n startLeft: floating.bounds.left,\n startTop: floating.bounds.top,\n wrapper,\n handle,\n edges,\n };\n this.startPointerTracking();\n }\n handleFloatingDragMove(event) {\n const state = this.floatingDragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const newLeft = state.startLeft + deltaX;\n const newTop = state.startTop + deltaY;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n this.updateFloatingDragDropTarget(event);\n }\n endFloatingDrag(pointerId) {\n const state = this.floatingDragState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch (err) {\n /* no-op */\n }\n const dropHandled = state.dropTarget\n ? this.handleFloatingStackDrop(state.index, state.dropTarget.path, state.dropTarget.zone)\n : false;\n this.floatingDragState = null;\n this.hideDropIndicator();\n if (!dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n updateFloatingDragDropTarget(event) {\n const state = this.floatingDragState;\n if (!state) {\n return;\n }\n const stack = this.findStackAtPoint(event.clientX, event.clientY);\n if (!stack) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n if (!path || (path.type === 'floating' && path.index === state.index)) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n // Reset sticky zone when moving to another stack while dragging the\n // floating window so the side doesn't carry over.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const zone = this.computeDropZone(stack, event, this.extractDropZoneFromEvent(event));\n if (zone) {\n state.dropTarget = { path, zone };\n }\n else if (state.dropTarget) {\n delete state.dropTarget;\n }\n this.showDropIndicator(stack, zone);\n }\n handleFloatingResizeMove(event) {\n const state = this.floatingResizeState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const minWidth = 192;\n const minHeight = 128;\n let newWidth = state.startWidth;\n let newHeight = state.startHeight;\n let newLeft = state.startLeft;\n let newTop = state.startTop;\n if (state.edges.horizontal === 'right') {\n newWidth = Math.max(minWidth, state.startWidth + deltaX);\n }\n else if (state.edges.horizontal === 'left') {\n newWidth = Math.max(minWidth, state.startWidth - deltaX);\n newLeft = state.startLeft + (state.startWidth - newWidth);\n }\n if (state.edges.vertical === 'bottom') {\n newHeight = Math.max(minHeight, state.startHeight + deltaY);\n }\n else if (state.edges.vertical === 'top') {\n newHeight = Math.max(minHeight, state.startHeight - deltaY);\n newTop = state.startTop + (state.startHeight - newHeight);\n }\n state.wrapper.style.width = `${newWidth}px`;\n state.wrapper.style.height = `${newHeight}px`;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.width = newWidth;\n floating.bounds.height = newHeight;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n }\n endFloatingResize(pointerId) {\n const state = this.floatingResizeState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch (err) {\n /* no-op */\n }\n this.floatingResizeState = null;\n this.dispatchLayoutChanged();\n }\n getFloatingPaneZIndex(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return 10 + index;\n }\n const base = typeof floating.zIndex === 'number' && Number.isFinite(floating.zIndex)\n ? floating.zIndex\n : 10 + index;\n return base;\n }\n promoteFloatingPane(index, wrapper) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const maxExisting = this.floatingLayouts.reduce((max, layout, idx) => {\n if (!layout) {\n return max;\n }\n const z = idx === index ? Number.NEGATIVE_INFINITY : this.getFloatingPaneZIndex(idx);\n return Math.max(max, z);\n }, 0);\n const nextZ = Math.max(maxExisting + 2, 12);\n floating.zIndex = nextZ;\n wrapper.style.zIndex = String(nextZ);\n }\n getFloatingWrapper(index) {\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n return this.floatingLayerEl.querySelector(selector);\n }\n startPointerTracking() {\n if (this.pointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.addEventListener('pointermove', this.onPointerMove);\n win?.addEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = true;\n }\n stopPointerTrackingIfIdle() {\n if (this.pointerTrackingActive &&\n !this.resizeState &&\n !this.floatingDragState &&\n !this.floatingResizeState) {\n const win = this.windowRef;\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n }\n }\n getFloatingWindowTitle(floating) {\n const fallback = 'Floating Pane';\n if (!floating || !floating.root) {\n return fallback;\n }\n const preferred = floating.activePane ?? this.findFirstPaneName(floating.root);\n if (!preferred) {\n return fallback;\n }\n return this.titles[preferred] ?? preferred ?? fallback;\n }\n updateFloatingWindowTitle(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n const wrapper = this.floatingLayerEl.querySelector(selector);\n if (!wrapper) {\n return;\n }\n const titleEl = wrapper.querySelector('.dock-floating__title');\n if (!titleEl) {\n return;\n }\n titleEl.textContent = this.getFloatingWindowTitle(floating);\n }\n renderSplit(node, path, floatingIndex) {\n const container = this.documentRef.createElement('div');\n container.classList.add('dock-split');\n container.dataset['direction'] = node.direction;\n container.dataset['path'] = path.join('/');\n const sizes = Array.isArray(node.sizes) ? node.sizes : [];\n node.children.forEach((child, index) => {\n const childWrapper = this.documentRef.createElement('div');\n childWrapper.classList.add('dock-split__child');\n childWrapper.dataset['index'] = String(index);\n const size = sizes[index];\n if (typeof size === 'number' && Number.isFinite(size)) {\n childWrapper.style.flex = `${Math.max(size, 0)} 1 0`;\n }\n else {\n childWrapper.style.flex = '1 1 0';\n }\n childWrapper.appendChild(this.renderNode(child, [...path, index], floatingIndex));\n container.appendChild(childWrapper);\n if (index < node.children.length - 1) {\n const divider = this.documentRef.createElement('div');\n divider.classList.add('dock-split__divider');\n divider.setAttribute('role', 'separator');\n divider.tabIndex = 0;\n divider.addEventListener('pointerdown', (event) => this.beginResize(event, container, floatingIndex !== undefined\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] }, index));\n container.appendChild(divider);\n }\n });\n return container;\n }\n renderStack(node, path, floatingIndex) {\n const stack = this.documentRef.createElement('div');\n stack.classList.add('dock-stack');\n const location = typeof floatingIndex === 'number'\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] };\n stack.dataset['path'] = this.formatPath(location);\n const header = this.documentRef.createElement('div');\n header.classList.add('dock-stack__header');\n header.setAttribute('role', 'tablist');\n const content = this.documentRef.createElement('div');\n content.classList.add('dock-stack__content');\n const panes = Array.from(new Set(node.panes));\n if (panes.length === 0) {\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n content.appendChild(empty);\n stack.append(header, content);\n return stack;\n }\n const activePane = panes.includes(node.activePane ?? '')\n ? node.activePane\n : panes[0];\n const baseSlug = path.length ? path.join('-') : 'root';\n const pathSlug = typeof floatingIndex === 'number' ? `f${floatingIndex}-${baseSlug}` : baseSlug;\n panes.forEach((paneName) => {\n const paneSlugRaw = paneName.replace(/[^a-zA-Z0-9_-]/g, '-');\n const paneSlug = paneSlugRaw.length > 0 ? paneSlugRaw : 'pane';\n const tabId = `${this.instanceId}-tab-${pathSlug}-${paneSlug}`;\n const panelId = `${this.instanceId}-panel-${pathSlug}-${paneSlug}`;\n const button = this.documentRef.createElement('button');\n button.type = 'button';\n button.classList.add('dock-tab');\n button.dataset['pane'] = paneName;\n button.id = tabId;\n button.textContent = this.titles[paneName] ?? paneName;\n button.setAttribute('role', 'tab');\n button.setAttribute('aria-controls', panelId);\n if (paneName === activePane) {\n button.classList.add('dock-tab--active');\n }\n button.setAttribute('aria-selected', String(paneName === activePane));\n button.draggable = true;\n button.addEventListener('pointerdown', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.captureTabDragMetrics(event, stackEl ?? null);\n event.stopPropagation();\n });\n button.addEventListener('pointerup', () => this.clearPendingTabDragMetrics());\n button.addEventListener('pointercancel', () => this.clearPendingTabDragMetrics());\n button.addEventListener('dragstart', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.beginPaneDrag(event, this.clonePath(location), paneName, stackEl ?? null);\n });\n button.addEventListener('dragend', () => {\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n });\n button.addEventListener('click', () => {\n this.activatePane(stack, paneName, this.clonePath(location));\n this.dispatchEvent(new CustomEvent('dock-pane-activated', {\n detail: { pane: paneName },\n bubbles: true,\n composed: true,\n }));\n });\n header.appendChild(button);\n const paneHost = this.documentRef.createElement('div');\n paneHost.classList.add('dock-stack__pane');\n paneHost.dataset['pane'] = paneName;\n paneHost.id = panelId;\n paneHost.setAttribute('role', 'tabpanel');\n paneHost.setAttribute('aria-labelledby', tabId);\n if (paneName !== activePane) {\n paneHost.setAttribute('hidden', '');\n }\n const slotEl = this.documentRef.createElement('slot');\n slotEl.name = paneName;\n paneHost.appendChild(slotEl);\n content.appendChild(paneHost);\n });\n stack.dataset['activePane'] = activePane;\n stack.append(header, content);\n return stack;\n }\n beginResize(event, container, path, index) {\n event.preventDefault();\n const divider = event.currentTarget;\n if (!divider) {\n return;\n }\n const orientation = container.dataset['direction'] ?? 'horizontal';\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n const initialSizes = children.map((child) => {\n const rect = child.getBoundingClientRect();\n return orientation === 'horizontal' ? rect.width : rect.height;\n });\n const beforeSize = initialSizes[index];\n const afterSize = initialSizes[index + 1];\n const startPos = orientation === 'horizontal' ? event.clientX : event.clientY;\n divider.setPointerCapture(event.pointerId);\n divider.dataset['resizing'] = 'true';\n this.resizeState = {\n path: this.clonePath(path),\n index,\n pointerId: event.pointerId,\n orientation,\n container,\n divider,\n startPos,\n initialSizes,\n beforeSize,\n afterSize,\n };\n this.startPointerTracking();\n }\n onPointerMove(event) {\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const state = this.resizeState;\n const splitNode = this.resolveSplitNode(state.path);\n if (!splitNode) {\n return;\n }\n const currentPos = state.orientation === 'horizontal' ? event.clientX : event.clientY;\n const delta = currentPos - state.startPos;\n const minSize = 48;\n const pairTotal = state.beforeSize + state.afterSize;\n let newBefore = Math.min(Math.max(state.beforeSize + delta, minSize), pairTotal - minSize);\n let newAfter = pairTotal - newBefore;\n if (!Number.isFinite(newBefore) || !Number.isFinite(newAfter)) {\n return;\n }\n if (newAfter < minSize) {\n newAfter = minSize;\n newBefore = pairTotal - minSize;\n }\n const newSizesPixels = [...state.initialSizes];\n newSizesPixels[state.index] = newBefore;\n newSizesPixels[state.index + 1] = newAfter;\n const total = newSizesPixels.reduce((acc, size) => acc + size, 0);\n const normalized = total > 0 ? newSizesPixels.map((size) => size / total) : [];\n splitNode.sizes = normalized;\n const children = Array.from(state.container.querySelectorAll(':scope > .dock-split__child'));\n normalized.forEach((size, idx) => {\n if (children[idx]) {\n children[idx].style.flex = `${Math.max(size, 0)} 1 0`;\n }\n });\n this.dispatchLayoutChanged();\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.handleFloatingResizeMove(event);\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n this.handleFloatingDragMove(event);\n }\n }\n onPointerUp(event) {\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const divider = this.resizeState.divider;\n divider.dataset['resizing'] = 'false';\n divider.releasePointerCapture(this.resizeState.pointerId);\n this.resizeState = null;\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n this.endFloatingDrag(event.pointerId);\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.endFloatingResize(event.pointerId);\n }\n this.stopPointerTrackingIfIdle();\n }\n captureTabDragMetrics(event, stackEl) {\n if (!stackEl) {\n this.pendingTabDragMetrics = null;\n return;\n }\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) {\n this.pendingTabDragMetrics = null;\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl.getBoundingClientRect();\n const pointerOffsetX = event.clientX - stackRect.left;\n const pointerOffsetY = event.clientY - stackRect.top;\n const left = stackRect.left - hostRect.left;\n const top = stackRect.top - hostRect.top;\n const width = Number.isFinite(stackRect.width) ? stackRect.width : 0;\n const height = Number.isFinite(stackRect.height) ? stackRect.height : 0;\n this.pendingTabDragMetrics = {\n pointerOffsetX,\n pointerOffsetY,\n left,\n top,\n width,\n height,\n startClientX: event.clientX,\n startClientY: event.clientY,\n };\n }\n clearPendingTabDragMetrics() {\n this.pendingTabDragMetrics = null;\n }\n beginPaneDrag(event, path, pane, stackEl) {\n if (!event.dataTransfer) {\n return;\n }\n // Create a ghost element for the drag image. This prevents the browser from cancelling\n // the drag operation when the original element is removed from the DOM during re-render.\n const ghost = event.currentTarget.cloneNode(true);\n ghost.style.position = 'absolute';\n ghost.style.left = '-9999px';\n ghost.style.top = '-9999px';\n ghost.style.width = `${event.currentTarget.offsetWidth}px`;\n ghost.style.height = `${event.currentTarget.offsetHeight}px`;\n this.shadowRoot?.appendChild(ghost);\n // Use the ghost element as the drag image.\n // The offset is set to where the user's cursor is on the original element.\n const dragImgOffsetX = Number.isFinite(event.offsetX) ? event.offsetX : 0;\n const dragImgOffsetY = Number.isFinite(event.offsetY) ? event.offsetY : 0;\n event.dataTransfer.setDragImage(ghost, dragImgOffsetX, dragImgOffsetY);\n // The ghost element is no longer needed after the drag image is set.\n // We defer its removal to ensure the browser has captured it.\n setTimeout(() => ghost.remove(), 0);\n const { path: sourcePath, floatingIndex, pointerOffsetX, pointerOffsetY, } = this.preparePaneDragSource(path, pane, stackEl, event);\n // Capture header bounds for detecting when to convert to floating\n const headerEl = stackEl?.querySelector('.dock-stack__header') ?? null;\n const headerRect = headerEl ? headerEl.getBoundingClientRect() : null;\n const headerBounds = headerRect\n ? { left: headerRect.left, top: headerRect.top, right: headerRect.right, bottom: headerRect.bottom }\n : null;\n const metrics = this.pendingTabDragMetrics;\n this.dragState = {\n pane,\n sourcePath: this.clonePath(sourcePath),\n floatingIndex,\n pointerOffsetX,\n pointerOffsetY,\n dropHandled: false,\n sourceStackEl: stackEl,\n sourceHeaderBounds: headerBounds,\n startClientX: metrics && Number.isFinite(metrics.startClientX)\n ? metrics.startClientX\n : Number.isFinite(event.clientX)\n ? event.clientX\n : undefined,\n startClientY: metrics && Number.isFinite(metrics.startClientY)\n ? metrics.startClientY\n : Number.isFinite(event.clientY)\n ? event.clientY\n : undefined,\n };\n // Seed last known pointer position from pointerdown metrics to avoid (0,0) glitches in Firefox\n if (this.dragState.startClientX !== undefined &&\n this.dragState.startClientY !== undefined &&\n Number.isFinite(this.dragState.startClientX) &&\n Number.isFinite(this.dragState.startClientY)) {\n this.lastDragPointerPosition = {\n x: this.dragState.startClientX,\n y: this.dragState.startClientY,\n };\n }\n // Prefer the pointer offset relative to the dragged tab to avoid jumps on conversion\n if (Number.isFinite(event.offsetX)) {\n this.dragState.pointerOffsetX = event.offsetX;\n }\n if (Number.isFinite(event.offsetY)) {\n this.dragState.pointerOffsetY = event.offsetY;\n }\n this.updateDraggedFloatingPosition(event);\n this.startDragPointerTracking();\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', pane);\n }\n preparePaneDragSource(path, pane, stackEl, event) {\n const location = this.resolveStackLocation(path);\n if (!location || !location.node.panes.includes(pane)) {\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n const metrics = this.pendingTabDragMetrics;\n const domHasSibling = !!stackEl &&\n Array.from(stackEl.querySelectorAll('.dock-tab')).some((button) => button.dataset['pane'] && button.dataset['pane'] !== pane);\n const hasSiblingInStack = location.node.panes.some((existing) => existing !== pane);\n const floating = location.context === 'floating' ? this.floatingLayouts[location.index] : null;\n const floatingPaneCount = floating && floating.root ? this.countPanesInTree(floating.root) : hasSiblingInStack ? 2 : 1;\n const shouldReuseExistingWindow = location.context === 'floating' &&\n !!floating &&\n !hasSiblingInStack &&\n !domHasSibling &&\n floatingPaneCount <= 1;\n if (shouldReuseExistingWindow) {\n if (floating) {\n floating.activePane = pane;\n this.updateFloatingWindowTitle(location.index);\n const wrapper = this.getFloatingWrapper(location.index);\n if (wrapper) {\n this.promoteFloatingPane(location.index, wrapper);\n }\n const hostRect = this.getBoundingClientRect();\n const pointerOffsetX = metrics &&\n Number.isFinite(metrics.pointerOffsetX) &&\n Number.isFinite(metrics.left) &&\n Number.isFinite(floating.bounds.left)\n ? metrics.pointerOffsetX + (metrics.left - floating.bounds.left)\n : Number.isFinite(event.clientX) && Number.isFinite(floating.bounds.left)\n ? event.clientX - hostRect.left - floating.bounds.left\n : floating.bounds.width / 2;\n const pointerOffsetY = metrics &&\n Number.isFinite(metrics.pointerOffsetY) &&\n Number.isFinite(metrics.top) &&\n Number.isFinite(floating.bounds.top)\n ? metrics.pointerOffsetY + (metrics.top - floating.bounds.top)\n : Number.isFinite(event.clientY) && Number.isFinite(floating.bounds.top)\n ? event.clientY - hostRect.top - floating.bounds.top\n : floating.bounds.height / 2;\n return {\n path,\n floatingIndex: location.index,\n pointerOffsetX,\n pointerOffsetY,\n };\n }\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n // Do not convert to floating yet; allow in-header reordering first.\n // We return placeholder values and will convert once the pointer leaves the tab header.\n const pointerOffsetXVal = metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : 0;\n const pointerOffsetYVal = metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : 0;\n return {\n path,\n floatingIndex: -1,\n pointerOffsetX: pointerOffsetXVal,\n pointerOffsetY: pointerOffsetYVal,\n };\n }\n endPaneDrag() {\n this.clearPendingDragEndTimeout();\n const state = this.dragState;\n this.dragState = null;\n this.hideDropIndicator();\n this.clearHeaderDragPlaceholder();\n this.stopDragPointerTracking();\n this.lastDragPointerPosition = null;\n if (state && state.floatingIndex !== null && !state.dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n onDragOver(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n // Keep internal pointer tracking up-to-date.\n this.updateDraggedFloatingPosition(event);\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n // Some browsers intermittently report (0,0) for dragover coordinates.\n // Mirror the robust logic used in onDrop: prefer actual event coordinates\n // when valid, otherwise fall back to the last tracked pointer position.\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? { clientX: this.lastDragPointerPosition.x, clientY: this.lastDragPointerPosition.y }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n if (!stack) {\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n // While reordering within the same header, suppress the joystick/indicator entirely\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath)) {\n const px = (point ? point.clientX : event.clientX);\n const py = (point ? point.clientY : event.clientY);\n if (Number.isFinite(px) && Number.isFinite(py) && this.isPointerOverSourceHeader(px, py)) {\n // Drive live reorder using the unified path so we update instantly.\n this.updatePaneDragDropTargetFromPoint(px, py);\n this.hideDropIndicator();\n return;\n }\n }\n // If the hovered stack changed, clear any sticky zone from the previous\n // target before computing the new zone.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint);\n this.showDropIndicator(stack, zone);\n }\n updateDraggedFloatingPosition(event) {\n if (!this.dragState) {\n return;\n }\n const { clientX, clientY } = event;\n const hasValidCoordinates = Number.isFinite(clientX) &&\n Number.isFinite(clientY) &&\n !(clientX === 0 && clientY === 0);\n if (hasValidCoordinates) {\n this.lastDragPointerPosition = { x: clientX, y: clientY };\n this.updateDraggedFloatingPositionFromPoint(clientX, clientY);\n return;\n }\n if (this.lastDragPointerPosition) {\n const { x, y } = this.lastDragPointerPosition;\n this.updateDraggedFloatingPositionFromPoint(x, y);\n }\n }\n onGlobalDragOver(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onDrag(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onGlobalDragEnd() {\n // Attempt to finalize a drop even if the drop event doesn't reach us (Firefox/edge cases)\n const state = this.dragState;\n const pos = this.lastDragPointerPosition;\n if (state && pos) {\n const stack = this.findStackAtPoint(pos.x, pos.y);\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n const path = stack ? this.parsePath(stack.dataset['path']) : (joystickPath ?? joystickTargetPath);\n const joystickZone = this.dropJoystick.dataset['zone'];\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : (stack ? this.computeDropZone(stack, { clientX: pos.x, clientY: pos.y }, null) : null);\n if (path && this.isDropZone(zone)) {\n this.handleDrop(path, zone);\n this.hideDropIndicator();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n }\n }\n else {\n this.hideDropIndicator();\n }\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n }\n updateDraggedFloatingPositionFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n if (!Number.isFinite(clientX) || !Number.isFinite(clientY)) {\n return;\n }\n // Ignore obviously bogus coordinates sometimes seen during HTML5 drag\n if (clientX === 0 && clientY === 0) {\n return;\n }\n // If still dragging a tab inside its header, only convert to floating once we leave the header.\n if (this.dragState.floatingIndex !== null && this.dragState.floatingIndex < 0) {\n const b = this.dragState.sourceHeaderBounds;\n const sx = this.dragState.startClientX ?? clientX;\n const sy = this.dragState.startClientY ?? clientY;\n const dist = Math.hypot(clientX - sx, clientY - sy);\n const threshold = 8; // pixels to move before converting (tuned up)\n // Default to inside while bounds are unknown to avoid premature floating\n let insideHeader = true;\n const insideByBounds = b ? this.isPointWithinBounds(b, clientX, clientY) : true;\n const insideByHitTest = this.isPointerOverSourceHeader(clientX, clientY);\n insideHeader = insideByBounds || insideByHitTest;\n if (!insideHeader && dist > threshold) {\n // Convert to floating now using current pointer position\n this.convertPendingTabDragToFloating(clientX, clientY);\n }\n }\n this.updatePaneDragDropTargetFromPoint(clientX, clientY);\n const { floatingIndex, pointerOffsetX, pointerOffsetY } = this.dragState;\n if (floatingIndex === null || floatingIndex < 0) {\n return;\n }\n const floating = this.floatingLayouts[floatingIndex];\n if (!floating) {\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const newLeft = clientX - hostRect.left - pointerOffsetX;\n const newTop = clientY - hostRect.top - pointerOffsetY;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n const wrapper = this.getFloatingWrapper(floatingIndex);\n if (wrapper) {\n wrapper.style.left = `${newLeft}px`;\n wrapper.style.top = `${newTop}px`;\n }\n }\n updatePaneDragDropTargetFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const stack = this.findStackAtPoint(clientX, clientY);\n const path = stack ? this.parsePath(stack.dataset['path']) : null;\n if (!stack || !path) {\n // While actively dragging, avoid hiding the indicator if it is visible.\n // Transient misses from hit-testing are common near the joystick.\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n return;\n }\n // If we moved to a different target stack, reset any sticky zone so\n // the new drop area doesn't inherit the previous side selection.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n // Previous behavior hid the indicator and returned early here; instead,\n // allow the live-reorder branch below to handle in-header drags.\n // While reordering within the same header, update order live and suppress joystick/indicator\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath)) {\n const inHeaderByBounds = !!this.dragState.sourceHeaderBounds && this.isPointWithinBounds(this.dragState.sourceHeaderBounds, clientX, clientY);\n const inHeaderByHitTest = this.isPointerOverSourceHeader(clientX, clientY);\n if (inHeaderByBounds || inHeaderByHitTest) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const idx = this.computeHeaderInsertIndex(header, clientX);\n if (this.dragState.liveReorderIndex !== idx) {\n this.ensureHeaderDragPlaceholder(header, this.dragState.pane);\n this.updateHeaderDragPlaceholderPosition(header, idx);\n const location = this.resolveStackLocation(path);\n if (location) {\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n }\n this.dragState.liveReorderIndex = idx;\n }\n }\n this.hideDropIndicator();\n return;\n }\n }\n const zoneHint = this.findDropZoneByPoint(clientX, clientY);\n const zone = this.computeDropZone(stack, { clientX, clientY }, zoneHint);\n this.showDropIndicator(stack, zone);\n }\n // Returns true when the pointer is currently over the source stack's header (tab strip)\n isPointerOverSourceHeader(clientX, clientY) {\n const state = this.dragState;\n if (!state) {\n return false;\n }\n const stackEl = state.sourceStackEl ?? null;\n const header = stackEl?.querySelector('.dock-stack__header');\n if (!header) {\n // Be conservative: if we cannot resolve the header, treat as inside\n return true;\n }\n const sr = this.shadowRoot;\n const elements = sr ? sr.elementsFromPoint(clientX, clientY) : [];\n for (const el of elements) {\n if (el instanceof HTMLElement && header.contains(el)) {\n return true;\n }\n }\n return false;\n }\n isPointWithinBounds(bounds, x, y) {\n return x >= bounds.left && x <= bounds.right && y >= bounds.top && y <= bounds.bottom;\n }\n // Ensure a placeholder tab exists during in-header drag and hide the real dragged tab visually\n ensureHeaderDragPlaceholder(header, pane) {\n if (this.dragState?.placeholderHeader === header && this.dragState.placeholderEl) {\n return;\n }\n const dragged = Array.from(header.querySelectorAll('.dock-tab')).find((t) => t.dataset['pane'] === pane) ?? null;\n if (!dragged) {\n return;\n }\n // Create placeholder\n const placeholder = this.documentRef.createElement('button');\n placeholder.type = 'button';\n placeholder.classList.add('dock-tab');\n placeholder.dataset['placeholder'] = 'true';\n placeholder.textContent = dragged.textContent ?? '';\n // Hide the original dragged tab so it doesn't duplicate visually\n dragged.style.visibility = 'hidden';\n // Insert placeholder next to dragged initially\n header.insertBefore(placeholder, dragged.nextSibling);\n if (this.dragState) {\n this.dragState.placeholderHeader = header;\n this.dragState.placeholderEl = placeholder;\n }\n }\n // Move the placeholder to the computed target index within the header\n updateHeaderDragPlaceholderPosition(header, targetIndex) {\n const placeholder = this.dragState?.placeholderEl ?? null;\n if (!placeholder) {\n return;\n }\n const tabs = Array.from(header.querySelectorAll('.dock-tab'))\n .filter((t) => t !== placeholder);\n const clampedTarget = Math.max(0, Math.min(targetIndex, tabs.length));\n const ref = tabs[clampedTarget] ?? null;\n header.insertBefore(placeholder, ref);\n }\n // Remove placeholder and restore original tab visibility\n clearHeaderDragPlaceholder() {\n const ph = this.dragState?.placeholderEl ?? null;\n const header = this.dragState?.placeholderHeader ?? null;\n if (header) {\n const dragged = this.dragState?.pane\n ? (Array.from(header.querySelectorAll('.dock-tab')).find((t) => t.dataset['pane'] === this.dragState?.pane) ?? null)\n : null;\n if (dragged) {\n dragged.style.visibility = '';\n }\n }\n if (ph && ph.parentElement) {\n ph.parentElement.removeChild(ph);\n }\n if (this.dragState) {\n this.dragState.placeholderEl = null;\n this.dragState.placeholderHeader = null;\n }\n }\n startDragPointerTracking() {\n if (this.dragPointerTrackingActive) {\n return;\n }\n this.lastDragPointerPosition = null;\n const win = this.windowRef;\n win?.addEventListener('mousemove', this.onDragMouseMove, true);\n win?.addEventListener('touchmove', this.onDragTouchMove, { passive: false });\n win?.addEventListener('mouseup', this.onDragMouseUp, true);\n win?.addEventListener('touchend', this.onDragTouchEnd, true);\n win?.addEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = true;\n }\n stopDragPointerTracking() {\n if (!this.dragPointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.removeEventListener('mousemove', this.onDragMouseMove, true);\n win?.removeEventListener('touchmove', this.onDragTouchMove);\n win?.removeEventListener('mouseup', this.onDragMouseUp, true);\n win?.removeEventListener('touchend', this.onDragTouchEnd, true);\n win?.removeEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n this.clearPendingDragEndTimeout();\n }\n onDragMouseMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n if (event.buttons === 0) {\n this.scheduleDeferredDragEnd();\n return;\n }\n this.lastDragPointerPosition = { x: event.clientX, y: event.clientY };\n this.updateDraggedFloatingPositionFromPoint(event.clientX, event.clientY);\n }\n onDragTouchMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n const touch = event.touches[0];\n if (!touch) {\n this.scheduleDeferredDragEnd();\n return;\n }\n event.preventDefault();\n this.lastDragPointerPosition = { x: touch.clientX, y: touch.clientY };\n this.updateDraggedFloatingPositionFromPoint(touch.clientX, touch.clientY);\n }\n onDragMouseUp() {\n // Prefer committing a drop from pointer-up since some browsers suppress drop events\n if (this.dragState) {\n const pos = this.lastDragPointerPosition;\n if (pos) {\n this.finalizeDropFromPoint(pos.x, pos.y);\n }\n }\n this.handleDragPointerUpCommon();\n }\n // Convert a currently in-header tab drag into a floating window\n convertPendingTabDragToFloating(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const state = this.dragState;\n if (state.floatingIndex !== null && state.floatingIndex >= 0) {\n return; // already floating\n }\n // Clean up any placeholder before converting\n this.clearHeaderDragPlaceholder();\n const location = this.resolveStackLocation(state.sourcePath);\n if (!location) {\n return;\n }\n const pane = state.pane;\n const stackEl = state.sourceStackEl ?? null;\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl?.getBoundingClientRect() ?? null;\n const metrics = this.pendingTabDragMetrics;\n const fallbackWidth = 320;\n const fallbackHeight = 240;\n const width = metrics && Number.isFinite(metrics.width) && metrics.width > 0\n ? metrics.width\n : stackRect && Number.isFinite(stackRect.width)\n ? stackRect.width\n : fallbackWidth;\n const height = metrics && Number.isFinite(metrics.height) && metrics.height > 0\n ? metrics.height\n : stackRect && Number.isFinite(stackRect.height)\n ? stackRect.height\n : fallbackHeight;\n const pointerOffsetX = Number.isFinite(this.dragState?.pointerOffsetX)\n ? this.dragState.pointerOffsetX\n : metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : width / 2;\n const pointerOffsetY = Number.isFinite(this.dragState?.pointerOffsetY)\n ? this.dragState.pointerOffsetY\n : metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : height / 2;\n const pointerLeft = Number.isFinite(clientX)\n ? clientX - hostRect.left - pointerOffsetX\n : 0;\n const pointerTop = Number.isFinite(clientY)\n ? clientY - hostRect.top - pointerOffsetY\n : 0;\n // Remove pane from its current stack and create a new floating entry\n this.removePaneFromLocation(location, pane);\n const floatingStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n const floatingLayout = {\n bounds: {\n left: pointerLeft,\n top: pointerTop,\n width,\n height,\n },\n root: floatingStack,\n activePane: pane,\n };\n this.floatingLayouts.push(floatingLayout);\n const newIndex = this.floatingLayouts.length - 1;\n this.render();\n const wrapper = this.getFloatingWrapper(newIndex);\n if (wrapper) {\n this.promoteFloatingPane(newIndex, wrapper);\n }\n // Update drag state so subsequent moves reposition the floating window\n state.sourcePath = { type: 'floating', index: newIndex, segments: [] };\n state.floatingIndex = newIndex;\n state.pointerOffsetX = pointerOffsetX;\n state.pointerOffsetY = pointerOffsetY;\n this.dispatchLayoutChanged();\n }\n // Compute the intended tab insert index within a header based on pointer X\n computeHeaderInsertIndex(header, clientX) {\n const tabs = Array.from(header.querySelectorAll('.dock-tab'))\n .filter((t) => t.dataset['placeholder'] !== 'true');\n if (tabs.length === 0) {\n return 0;\n }\n for (let i = 0; i < tabs.length; i += 1) {\n const rect = tabs[i].getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n if (clientX < mid) {\n return i;\n }\n }\n return tabs.length; // insert at end\n }\n reorderPaneInLocationAtIndex(location, pane, targetIndex) {\n const panes = location.node.panes;\n const currentIndex = panes.indexOf(pane);\n if (currentIndex === -1) {\n return;\n }\n const clampedTarget = Math.max(0, Math.min(targetIndex, panes.length - 1));\n if (clampedTarget === currentIndex) {\n return;\n }\n panes.splice(currentIndex, 1);\n panes.splice(clampedTarget, 0, pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n onDragTouchEnd() {\n this.handleDragPointerUpCommon();\n }\n // Commit a drop using current pointer coordinates and joystick state\n finalizeDropFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const stack = this.findStackAtPoint(clientX, clientY);\n const stackPath = stack ? this.parsePath(stack.dataset['path']) : null;\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickStoredPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n const path = (joystickVisible ? (joystickStoredPath ?? joystickTargetPath) : null) ?? stackPath;\n const joystickZone = this.dropJoystick.dataset['zone'];\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : (stack ? this.computeDropZone(stack, { clientX, clientY }, null) : null);\n // Same-header reorder case when no side zone is chosen\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n stack &&\n path &&\n stackPath &&\n this.pathsEqual(stackPath, this.dragState.sourcePath) &&\n (!zone || zone === 'center')) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const location = this.resolveStackLocation(path);\n if (location) {\n const idx = this.computeHeaderInsertIndex(header, clientX);\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n this.dragState.dropHandled = true;\n return;\n }\n }\n }\n if (path && this.isDropZone(zone)) {\n this.handleDrop(path, zone);\n this.dragState.dropHandled = true;\n }\n }\n clearPendingDragEndTimeout() {\n if (this.pendingDragEndTimeout !== null) {\n const win = this.windowRef;\n if (win && typeof this.pendingDragEndTimeout === 'number') {\n win.clearTimeout(this.pendingDragEndTimeout);\n }\n else {\n globalThis.clearTimeout(this.pendingDragEndTimeout);\n }\n this.pendingDragEndTimeout = null;\n }\n }\n scheduleDeferredDragEnd() {\n if (this.pendingDragEndTimeout !== null) {\n return;\n }\n const completeDrag = () => {\n this.pendingDragEndTimeout = null;\n this.hideDropIndicator();\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n };\n const win = this.windowRef;\n this.pendingDragEndTimeout = win\n ? win.setTimeout(completeDrag, 0)\n : setTimeout(completeDrag, 0);\n }\n onDrop(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? {\n clientX: this.lastDragPointerPosition.x,\n clientY: this.lastDragPointerPosition.y,\n }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n // Prefer joystick's stored target path when the joystick is visible (drop over buttons)\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n let path = stack\n ? this.parsePath(stack.dataset['path'])\n : (joystickPath ?? joystickTargetPath);\n if (!path && joystickVisible) {\n // As a last resort, target the main dock surface only when empty\n const dockPath = this.parsePath(this.dockedEl.dataset['path']);\n path = (!this.rootLayout ? dockPath : null);\n }\n // Defer same-header reorder decision until after zone resolution below\n // Prefer joystick's active zone if available, else infer from event/point\n const joystickZone = this.dropJoystick.dataset['zone'];\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : stack\n ? this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint)\n : (this.isDropZone(pointZoneHint ?? eventZoneHint) ? (pointZoneHint ?? eventZoneHint) : null);\n // If still in same header and no side zone chosen, treat as in-header reorder\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n stack &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath) &&\n (!zone || zone === 'center')) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const x = (point ? point.clientX : event.clientX);\n if (Number.isFinite(x)) {\n const location = this.resolveStackLocation(path);\n if (location) {\n const idx = this.computeHeaderInsertIndex(header, x);\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n this.dragState.dropHandled = true;\n this.endPaneDrag();\n return;\n }\n }\n }\n }\n // If joystick is visible and both path and zone are resolved, force using joystick as authoritative\n if (joystickVisible && path && this.isDropZone(joystickZone)) {\n this.handleDrop(path, joystickZone);\n this.endPaneDrag();\n return;\n }\n if (!zone) {\n this.hideDropIndicator();\n this.endPaneDrag();\n return;\n }\n this.handleDrop(path, zone);\n this.endPaneDrag();\n }\n onDragLeave(event) {\n const related = event.relatedTarget;\n // During active drags, browsers can emit spurious dragleave with null\n // relatedTarget while the pointer is still over the joystick/buttons.\n // Be conservative: if we can resolve a stack/joystick at the last known\n // pointer position, don’t hide (prevents flicker of active state).\n if (this.dragState) {\n const pos = (Number.isFinite(event.clientX) && Number.isFinite(event.clientY))\n ? { x: event.clientX, y: event.clientY }\n : this.lastDragPointerPosition;\n if (pos) {\n const stackAtPoint = this.findStackAtPoint(pos.x, pos.y);\n if (stackAtPoint) {\n return; // still inside our drop area; ignore this dragleave\n }\n }\n }\n if (!related) {\n this.hideDropIndicator();\n return;\n }\n const rootContains = this.rootEl.contains(related);\n const joystickContains = this.dropJoystick.contains(related);\n if (!rootContains && !joystickContains) {\n this.hideDropIndicator();\n }\n }\n handleDrop(targetPath, zone) {\n if (!this.dragState || !targetPath) {\n return;\n }\n const { pane, sourcePath } = this.dragState;\n const source = this.resolveStackLocation(sourcePath);\n const target = this.resolveStackLocation(targetPath);\n // Special case: allow dropping onto an empty main dock area (no root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n if (!source) {\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n const newRoot = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n this.rootLayout = newRoot;\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n if (!source || !target) {\n return;\n }\n if (zone === 'center' && this.pathsEqual(sourcePath, targetPath)) {\n if (!source.node.panes.includes(pane)) {\n return;\n }\n this.reorderPaneInLocation(source, pane);\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n if (zone === 'center') {\n this.addPaneToLocation(target, pane);\n this.setActivePaneForLocation(target, pane);\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const newStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n if (target.context === 'docked') {\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, newStack, zone);\n }\n else {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n return;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, newStack, zone);\n floating.activePane = pane;\n }\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n }\n handleFloatingStackDrop(sourceIndex, targetPath, zone) {\n const source = this.floatingLayouts[sourceIndex];\n if (!source || !source.root) {\n return false;\n }\n const target = this.resolveStackLocation(targetPath);\n // Allow dropping an entire floating stack onto an empty main dock area\n // (no existing root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n this.rootLayout = this.cloneLayoutNode(source.root);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (!target) {\n return false;\n }\n if (target.context === 'floating' && target.index === sourceIndex) {\n return false;\n }\n if (zone === 'center') {\n const panes = this.collectPaneNames(source.root);\n if (panes.length === 0) {\n return false;\n }\n panes.forEach((pane) => {\n this.addPaneToLocation(target, pane);\n });\n const activePane = source.activePane && panes.includes(source.activePane)\n ? source.activePane\n : this.findFirstPaneName(source.root) ?? panes[0];\n if (activePane) {\n this.setActivePaneForLocation(target, activePane);\n }\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (target.context === 'floating') {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n return false;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, source.root, zone);\n floating.activePane = source.activePane ?? this.findFirstPaneName(source.root) ?? undefined;\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, source.root, zone);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n insertWeight(sizes, index, totalChildren) {\n const existingCount = totalChildren - 1;\n const normalized = this.normalizeSizesArray(sizes, existingCount);\n const newWeight = 1 / totalChildren;\n const remaining = 1 - newWeight;\n const result = [];\n for (let i = 0; i < totalChildren; i += 1) {\n if (i === index) {\n result.push(newWeight);\n }\n else {\n const sourceIndex = i < index ? i : i - 1;\n result.push(normalized[sourceIndex] * remaining);\n }\n }\n return result;\n }\n removePaneFromStack(stack, pane, skipCleanup = false) {\n stack.panes = stack.panes.filter((p) => p !== pane);\n if (!stack.panes.includes(stack.activePane ?? '')) {\n if (stack.panes.length > 0) {\n stack.activePane = stack.panes[0];\n }\n else {\n delete stack.activePane;\n }\n }\n if (stack.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, stack);\n return true;\n }\n findParentSplit(node, child) {\n if (!node || node === child) {\n return null;\n }\n if (node.kind !== 'split') {\n return null;\n }\n const index = node.children.indexOf(child);\n if (index !== -1) {\n return { parent: node, index };\n }\n for (let i = 0; i < node.children.length; i += 1) {\n const result = this.findParentSplit(node.children[i], child);\n if (result) {\n return result;\n }\n }\n return null;\n }\n computeDropZone(stack, point, zoneHint) {\n // Do not force a zone: even when the main area is empty we only\n // activate a zone when the pointer is actually over a joystick button.\n const hintedZone = this.isDropZone(zoneHint) ? zoneHint : null;\n if (hintedZone) {\n this.updateDropJoystickActiveZone(hintedZone);\n return hintedZone;\n }\n const pointZone = point &&\n Number.isFinite(point.clientX) &&\n Number.isFinite(point.clientY)\n ? this.findDropZoneByPoint(point.clientX, point.clientY)\n : null;\n if (pointZone) {\n this.updateDropJoystickActiveZone(pointZone);\n return pointZone;\n }\n if (this.dropJoystickTarget === stack) {\n // Be sticky while hovering the joystick: if we recently had a zone\n // selected, prefer keeping it instead of briefly clearing to null\n // when the browser reports transient coordinates/targets during drag.\n const sticky = this.dropJoystick.dataset['zone'];\n if (this.isDropZone(sticky)) {\n this.updateDropJoystickActiveZone(sticky);\n return sticky;\n }\n this.updateDropJoystickActiveZone(null);\n }\n return null;\n }\n extractDropZoneFromEvent(event) {\n if (!event) {\n return null;\n }\n if (typeof event.composedPath === 'function') {\n const path = event.composedPath();\n const zone = this.findDropZoneInTargets(path);\n if (zone) {\n return zone;\n }\n }\n if ('clientX' in event && 'clientY' in event) {\n const pointEvent = event;\n const zoneFromPoint = this.findDropZoneByPoint(pointEvent.clientX, pointEvent.clientY);\n if (zoneFromPoint) {\n return zoneFromPoint;\n }\n }\n return null;\n }\n handleDragPointerUpCommon() {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n this.scheduleDeferredDragEnd();\n }\n findDropZoneInTargets(targets) {\n for (const target of targets) {\n if (target instanceof HTMLElement &&\n target.classList.contains('dock-drop-joystick__button')) {\n const zone = target.dataset?.['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n findDropZoneByPoint(clientX, clientY) {\n if (!this.dropJoystickButtons ||\n this.dropJoystick.dataset['visible'] !== 'true' ||\n !this.dropJoystickTarget) {\n return null;\n }\n for (const button of this.dropJoystickButtons) {\n // Skip hidden/inactive buttons (used in center-only mode)\n if ((button.dataset['hidden'] === 'true') || button.style.visibility === 'hidden' || button.style.display === 'none') {\n continue;\n }\n const rect = button.getBoundingClientRect();\n if (clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom) {\n const zone = button.dataset['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n updateDropJoystickActiveZone(zone) {\n // If no zone is computed but the joystick is visible, keep the last\n // known active zone to avoid visual jitter while dragging across\n // small gaps where hit‑testing momentarily fails.\n const visible = this.dropJoystick.dataset['visible'] === 'true';\n const sticky = visible ? this.dropJoystick.dataset['zone'] : undefined;\n const effectiveZone = zone ?? (this.isDropZone(sticky) ? sticky : null);\n this.dropJoystickButtons.forEach((button) => {\n const isActive = effectiveZone !== null && button.dataset['zone'] === effectiveZone;\n if (isActive) {\n button.dataset['active'] = 'true';\n }\n else {\n delete button.dataset['active'];\n }\n });\n if (effectiveZone) {\n this.dropJoystick.dataset['zone'] = effectiveZone;\n }\n else {\n delete this.dropJoystick.dataset['zone'];\n }\n }\n isDropZone(value) {\n return value === 'left' || value === 'right' || value === 'top' || value === 'bottom' || value === 'center';\n }\n showDropIndicator(stack, zone) {\n const targetPath = this.parsePath(stack.dataset['path']);\n const sourcePath = this.dragState?.sourcePath ?? null;\n if (targetPath && sourcePath && this.isOrIsAncestorOf(targetPath, sourcePath)) {\n // Don't show any drop indicators on the pane being dragged.\n return;\n }\n const rect = stack.getBoundingClientRect();\n const hostRect = this.getBoundingClientRect();\n const indicator = this.dropIndicator;\n const joystick = this.dropJoystick;\n joystick.hidden = false;\n const path = this.parsePath(stack.dataset['path']);\n let overlayZ = 100;\n if (path && path.type === 'floating') {\n overlayZ = this.getFloatingPaneZIndex(path.index) + 100;\n }\n indicator.style.zIndex = String(overlayZ);\n joystick.style.zIndex = String(overlayZ + 1);\n let left = rect.left - hostRect.left;\n let top = rect.top - hostRect.top;\n let width = rect.width;\n let height = rect.height;\n const portion = 0.5;\n if (zone) {\n switch (zone) {\n case 'left':\n width = rect.width * portion;\n break;\n case 'right':\n width = rect.width * portion;\n left += rect.width * (1 - portion);\n break;\n case 'top':\n height = rect.height * portion;\n break;\n case 'bottom':\n height = rect.height * portion;\n top += rect.height * (1 - portion);\n break;\n default:\n break;\n }\n indicator.style.left = `${left}px`;\n indicator.style.top = `${top}px`;\n indicator.style.width = `${width}px`;\n indicator.style.height = `${height}px`;\n indicator.dataset['visible'] = 'true';\n }\n else {\n indicator.dataset['visible'] = 'false';\n }\n joystick.style.left = `${rect.left - hostRect.left + rect.width / 2}px`;\n joystick.style.top = `${rect.top - hostRect.top + rect.height / 2}px`;\n joystick.dataset['visible'] = 'true';\n this.dropJoystick.style.display = 'grid';\n joystick.dataset['path'] = stack.dataset['path'] ?? '';\n const changedTarget = this.dropJoystickTarget && this.dropJoystickTarget !== stack;\n this.dropJoystickTarget = stack;\n if (changedTarget) {\n // New target stack: forget any previously sticky zone.\n delete this.dropJoystick.dataset['zone'];\n }\n // If main dock area is empty, show only the center button and collapse the grid\n const isEmptyMainArea = !this.rootLayout && (stack === this.dockedEl || (targetPath && targetPath.type === 'docked' && targetPath.segments.length === 0));\n const spacers = Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer'));\n if (isEmptyMainArea) {\n // Keep spacers visible so the joystick keeps its circular footprint.\n spacers.forEach((s) => {\n s.style.display = '';\n });\n this.dropJoystickButtons.forEach((btn) => {\n const isCenter = btn.dataset['zone'] === 'center';\n if (isCenter) {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n }\n else {\n // Hide visually but keep layout space; also prevent interaction.\n btn.style.visibility = 'hidden';\n btn.style.pointerEvents = 'none';\n btn.dataset['hidden'] = 'true';\n btn.style.display = '';\n }\n });\n // Keep default 3x3 grid so the circular background size stays the same.\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n // Do not set an active zone automatically; users must hover the button.\n }\n else {\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n });\n spacers.forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n this.updateDropJoystickActiveZone(zone);\n }\n hideDropIndicator() {\n this.dropIndicator.dataset['visible'] = 'false';\n this.dropJoystick.dataset['visible'] = 'false';\n this.dropJoystick.style.display = 'none';\n delete this.dropJoystick.dataset['path'];\n this.dropJoystickTarget = null;\n this.updateDropJoystickActiveZone(null);\n // Restore joystick structure to default.\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.display = '';\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n });\n Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer')).forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n findStackAtPoint(clientX, clientY) {\n const shadow = this.shadowRoot;\n if (!shadow) {\n return null;\n }\n const elements = shadow.elementsFromPoint(clientX, clientY);\n const stack = this.findStackInTargets(elements);\n if (stack) {\n return stack;\n }\n // If there are no docked stacks (all panes are floating), allow the\n // docked surface itself to serve as a drop target for the main zone.\n if (!this.rootLayout) {\n const dockRect = this.dockedEl.getBoundingClientRect();\n if (clientX >= dockRect.left &&\n clientX <= dockRect.right &&\n clientY >= dockRect.top &&\n clientY <= dockRect.bottom) {\n return this.dockedEl;\n }\n }\n return null;\n }\n findStackElement(event) {\n const path = event.composedPath();\n const stack = this.findStackInTargets(path);\n if (stack) {\n return stack;\n }\n // If the root dock area is empty, treat the docked surface as a valid\n // target when it appears in the composed path.\n if (!this.rootLayout) {\n for (const target of path) {\n if (target instanceof HTMLElement &&\n (target === this.dockedEl || target.classList.contains('dock-docked'))) {\n return this.dockedEl;\n }\n }\n }\n return null;\n }\n findStackInTargets(targets) {\n for (const element of targets) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element.classList.contains('dock-stack')) {\n return element;\n }\n if (this.dropJoystickTarget &&\n (element.classList.contains('dock-drop-joystick') ||\n element.classList.contains('dock-drop-joystick__button') ||\n element.classList.contains('dock-drop-joystick__spacer'))) {\n return this.dropJoystickTarget;\n }\n }\n return null;\n }\n activatePane(stack, paneName, path) {\n stack.dataset['activePane'] = paneName;\n const headerButtons = stack.querySelectorAll('.dock-tab');\n headerButtons.forEach((button) => {\n const isSelected = button.dataset['pane'] === paneName;\n button.classList.toggle('dock-tab--active', isSelected);\n button.setAttribute('aria-selected', String(isSelected));\n });\n const panes = stack.querySelectorAll('.dock-stack__pane');\n panes.forEach((pane) => {\n if (pane.dataset['pane'] === paneName) {\n pane.removeAttribute('hidden');\n }\n else {\n pane.setAttribute('hidden', '');\n }\n });\n const location = this.resolveStackLocation(path);\n if (!location) {\n return;\n }\n location.node.activePane = paneName;\n if (path.type === 'floating') {\n const floating = this.floatingLayouts[path.index];\n if (floating) {\n floating.activePane = paneName;\n }\n this.updateFloatingWindowTitle(path.index);\n }\n this.dispatchLayoutChanged();\n }\n getNodeAtPath(root, path) {\n if (!root) {\n return null;\n }\n let current = root;\n if (path.length === 0) {\n return current;\n }\n for (const segment of path) {\n if (!current || current.kind !== 'split') {\n return null;\n }\n current = current.children[segment] ?? null;\n }\n return current;\n }\n resolveSplitNode(path) {\n if (path.type === 'docked') {\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n const floating = this.floatingLayouts[path.index];\n if (!floating || !floating.root) {\n return null;\n }\n const node = this.getNodeAtPath(floating.root, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n replaceNodeInTree(root, target, replacement) {\n if (!root) {\n return replacement;\n }\n if (root === target) {\n return replacement;\n }\n const parentInfo = this.findParentSplit(root, target);\n if (!parentInfo) {\n return root;\n }\n parentInfo.parent.children[parentInfo.index] = replacement;\n this.normalizeSplitNode(parentInfo.parent);\n return root;\n }\n cleanupEmptyStackInTree(root, stack) {\n if (!root || stack.panes.length > 0) {\n return root;\n }\n const parentInfo = this.findParentSplit(root, stack);\n if (!parentInfo) {\n return root === stack ? null : root;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(stack);\n if (index === -1) {\n return root;\n }\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n cleanupSplitIfNecessary(root, split) {\n if (split.children.length === 1) {\n return this.replaceNodeInTree(root, split, split.children[0]);\n }\n if (split.children.length === 0) {\n const parentInfo = this.findParentSplit(root, split);\n if (!parentInfo) {\n return null;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(split);\n if (index !== -1) {\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n }\n return root;\n }\n dockNodeBeside(root, targetNode, newNode, zone) {\n const orientation = zone === 'left' || zone === 'right' ? 'horizontal' : 'vertical';\n const placeBefore = zone === 'left' || zone === 'top';\n const parentInfo = this.findParentSplit(root, targetNode);\n if (parentInfo && parentInfo.parent.direction === orientation) {\n const insertIndex = placeBefore ? parentInfo.index : parentInfo.index + 1;\n parentInfo.parent.children.splice(insertIndex, 0, newNode);\n parentInfo.parent.sizes = this.insertWeight(parentInfo.parent.sizes, insertIndex, parentInfo.parent.children.length);\n return root ?? newNode;\n }\n const split = {\n kind: 'split',\n direction: orientation,\n children: placeBefore ? [newNode, targetNode] : [targetNode, newNode],\n sizes: [0.5, 0.5],\n };\n return this.replaceNodeInTree(root, targetNode, split);\n }\n forEachStack(node, visitor, path = []) {\n if (!node) {\n return;\n }\n if (node.kind === 'stack') {\n visitor(node, path);\n return;\n }\n node.children.forEach((child, index) => this.forEachStack(child, visitor, [...path, index]));\n }\n findStackContainingPane(node, pane) {\n let result = null;\n this.forEachStack(node, (stack) => {\n if (!result && stack.panes.includes(pane)) {\n result = stack;\n }\n });\n return result;\n }\n findFirstPaneName(node) {\n let found = null;\n this.forEachStack(node, (stack) => {\n if (found || stack.panes.length === 0) {\n return;\n }\n if (stack.activePane && stack.panes.includes(stack.activePane)) {\n found = stack.activePane;\n }\n else {\n found = stack.panes[0];\n }\n });\n return found;\n }\n collectFloatingPaneMetadata(node) {\n // Deprecated method retained temporarily for signature compatibility.\n // Use collectPaneNames instead.\n const panes = this.collectPaneNames(node);\n const titles = {};\n panes.forEach((p) => {\n const t = this.titles[p];\n if (t) {\n titles[p] = t;\n }\n });\n return { panes, titles };\n }\n collectPaneNames(node) {\n const panes = [];\n this.forEachStack(node, (stack) => {\n stack.panes.forEach((pane) => panes.push(pane));\n });\n return panes;\n }\n normalizeFloatingLayout(layout) {\n const bounds = layout.bounds ?? { left: 0, top: 0, width: 320, height: 200 };\n const normalizedBounds = {\n left: Number.isFinite(bounds.left) ? bounds.left : 0,\n top: Number.isFinite(bounds.top) ? bounds.top : 0,\n width: Number.isFinite(bounds.width) ? Math.max(bounds.width, 160) : 320,\n height: Number.isFinite(bounds.height) ? Math.max(bounds.height, 120) : 200,\n };\n const root = layout.root ? this.cloneLayoutNode(layout.root) : null;\n return {\n id: layout.id,\n bounds: normalizedBounds,\n zIndex: layout.zIndex,\n root,\n activePane: layout.activePane,\n };\n }\n formatPath(path) {\n if (path.type === 'floating') {\n const suffix = path.segments.length > 0\n ? `/${path.segments.map((segment) => segment.toString()).join('/')}`\n : '';\n return `f:${path.index}${suffix}`;\n }\n const suffix = path.segments.join('/');\n return suffix.length > 0 ? `d:${suffix}` : 'd:';\n }\n clonePath(path) {\n if (path.type === 'floating') {\n return { type: 'floating', index: path.index, segments: [...path.segments] };\n }\n return { type: 'docked', segments: [...path.segments] };\n }\n parsePath(path) {\n if (!path) {\n return null;\n }\n if (path.startsWith('f:')) {\n const remainder = path.slice(2);\n const [indexPart, ...segmentParts] = remainder.split('/');\n const index = Number.parseInt(indexPart, 10);\n if (!Number.isFinite(index)) {\n return null;\n }\n const segments = segmentParts\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'floating', index, segments };\n }\n const normalized = path.startsWith('d:') ? path.slice(2) : path;\n if (normalized.length === 0) {\n return { type: 'docked', segments: [] };\n }\n const segments = normalized\n .split('/')\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'docked', segments };\n }\n pathsEqual(a, b) {\n if (a.type !== b.type) {\n return false;\n }\n if (a.type === 'floating') {\n const other = b;\n if (a.index !== other.index) {\n return false;\n }\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n const other = b;\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n isOrIsAncestorOf(ancestor, descendant) {\n if (ancestor.type !== descendant.type) {\n return false;\n }\n if (ancestor.type === 'floating') {\n if (descendant.index !== ancestor.index) {\n return false;\n }\n }\n if (ancestor.segments.length > descendant.segments.length) {\n return false;\n }\n return ancestor.segments.every((segment, i) => segment === descendant.segments[i]);\n }\n countPanesInTree(node) {\n if (!node) {\n return 0;\n }\n if (node.kind === 'stack') {\n return node.panes.length;\n }\n return node.children.reduce((total, child) => total + this.countPanesInTree(child), 0);\n }\n resolveStackLocation(path) {\n if (path.type === 'floating') {\n const layout = this.floatingLayouts[path.index];\n if (!layout || !layout.root) {\n return null;\n }\n const node = this.getNodeAtPath(layout.root, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'floating', index: path.index, path: [...path.segments], node };\n }\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'docked', path: [...path.segments], node };\n }\n removePaneFromLocation(location, pane, skipCleanup = false) {\n if (location.context === 'docked') {\n return this.removePaneFromStack(location.node, pane, skipCleanup);\n }\n return this.removePaneFromFloating(location.index, location.path, pane, skipCleanup);\n }\n addPaneToLocation(location, pane) {\n const panes = location.node.panes;\n const existingIndex = panes.indexOf(pane);\n if (existingIndex !== -1) {\n panes.splice(existingIndex, 1);\n }\n panes.push(pane);\n }\n setActivePaneForLocation(location, pane) {\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n cleanupLocation(location) {\n if (location.context === 'docked') {\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, location.node);\n }\n else {\n const floating = this.floatingLayouts[location.index];\n if (!floating) {\n return;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, location.node);\n if (!floating.root) {\n this.removeFloatingAt(location.index);\n }\n }\n }\n reorderPaneInLocation(location, pane) {\n const panes = location.node.panes;\n const index = panes.indexOf(pane);\n if (index === -1) {\n return;\n }\n panes.splice(index, 1);\n panes.push(pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n removeFloatingAt(index) {\n if (index < 0 || index >= this.floatingLayouts.length) {\n return;\n }\n this.floatingLayouts.splice(index, 1);\n }\n removePaneFromFloating(index, path, pane, skipCleanup = false) {\n const floating = this.floatingLayouts[index];\n if (!floating || !floating.root) {\n return false;\n }\n const node = this.getNodeAtPath(floating.root, path);\n if (!node || node.kind !== 'stack') {\n return false;\n }\n node.panes = node.panes.filter((p) => p !== pane);\n if (!node.panes.includes(node.activePane ?? '')) {\n if (node.panes.length > 0) {\n node.activePane = node.panes[0];\n }\n else {\n delete node.activePane;\n }\n }\n if (floating.activePane === pane) {\n const fallback = this.findFirstPaneName(floating.root);\n if (fallback) {\n floating.activePane = fallback;\n }\n else {\n delete floating.activePane;\n }\n }\n if (node.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, node);\n if (!floating.root) {\n this.removeFloatingAt(index);\n }\n return true;\n }\n normalizeSizesArray(sizes, count) {\n if (count <= 0) {\n return [];\n }\n if (!Array.isArray(sizes) || sizes.length !== count) {\n return Array.from({ length: count }, () => 1 / count);\n }\n const normalized = sizes.map((value) => (Number.isFinite(value) ? Math.max(value, 0) : 0));\n const total = normalized.reduce((acc, value) => acc + value, 0);\n if (total <= 0) {\n return Array.from({ length: count }, () => 1 / count);\n }\n return normalized.map((value) => value / total);\n }\n normalizeSplitNode(split) {\n split.sizes = this.normalizeSizesArray(split.sizes, split.children.length);\n }\n dispatchLayoutChanged() {\n this.dispatchEvent(new CustomEvent('dock-layout-changed', {\n detail: this.snapshot,\n bubbles: true,\n composed: true,\n }));\n }\n cloneLayoutNode(layout) {\n if (!layout) {\n return null;\n }\n return JSON.parse(JSON.stringify(layout));\n }\n cloneFloatingArray(layouts) {\n return JSON.parse(JSON.stringify(layouts));\n }\n}\nconst tagName = 'mint-dock-manager';\nif (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, MintDockManagerElement);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludC1kb2NrLW1hbmFnZXIuZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL3dlYi1jb21wb25lbnRzL21pbnQtZG9jay1tYW5hZ2VyLmVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2YXBCLENBQUM7QUFFRixJQUFJLGNBQWMsR0FBK0IsSUFBSSxDQUFDO0FBQ3RELElBQUksc0JBQXNCLEdBQW9CLElBQUksQ0FBQztBQUVuRCxTQUFTLGNBQWMsQ0FBQyxXQUFxQjtJQUMzQyxJQUFJLENBQUMsY0FBYyxJQUFJLHNCQUFzQixLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzlELGNBQWMsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELGNBQWMsQ0FBQyxTQUFTLEdBQUcsWUFB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QUMsRUFBRSxDQUFDO0lBQzFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHtcbiAgRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXQsXG4gIERvY2tMYXlvdXQsXG4gIERvY2tMYXlvdXROb2RlLFxuICBEb2NrTGF5b3V0U25hcHNob3QsXG4gIERvY2tTcGxpdE5vZGUsXG4gIERvY2tTdGFja05vZGUsXG59IGZyb20gJy4uL3R5cGVzL2RvY2stbGF5b3V0JztcblxudHlwZSBEb2NrUGF0aCA9XG4gIHwgeyB0eXBlOiAnZG9ja2VkJzsgc2VnbWVudHM6IG51bWJlcltdIH1cbiAgfCB7IHR5cGU6ICdmbG9hdGluZyc7IGluZGV4OiBudW1iZXI7IHNlZ21lbnRzOiBudW1iZXJbXSB9O1xuXG50eXBlIERvY2tlZExvY2F0aW9uID0geyBjb250ZXh0OiAnZG9ja2VkJzsgcGF0aDogbnVtYmVyW107IG5vZGU6IERvY2tTdGFja05vZGUgfTtcbnR5cGUgRmxvYXRpbmdMb2NhdGlvbiA9IHtcbiAgY29udGV4dDogJ2Zsb2F0aW5nJztcbiAgaW5kZXg6IG51bWJlcjtcbiAgcGF0aDogbnVtYmVyW107XG4gIG5vZGU6IERvY2tTdGFja05vZGU7XG59O1xuXG50eXBlIFJlc29sdmVkTG9jYXRpb24gPSBEb2NrZWRMb2NhdGlvbiB8IEZsb2F0aW5nTG9jYXRpb247XG5cbnR5cGUgRHJvcFpvbmUgPSAnY2VudGVyJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wJyB8ICdib3R0b20nO1xuXG50eXBlIEZsb2F0aW5nUmVzaXplRWRnZXMgPSB7XG4gIGhvcml6b250YWw6ICdsZWZ0JyB8ICdyaWdodCcgfCAnbm9uZSc7XG4gIHZlcnRpY2FsOiAndG9wJyB8ICdib3R0b20nIHwgJ25vbmUnO1xufTtcblxuY29uc3QgdGVtcGxhdGVIdG1sID0gYFxuICA8c3R5bGU+XG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGNvbnRhaW46IGxheW91dCBwYWludCBzaXplIHN0eWxlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgfVxuXG4gICAgLmRvY2stcm9vdCxcbiAgICAuZG9jay1kb2NrZWQsXG4gICAgLmRvY2stc3BsaXQsXG4gICAgLmRvY2stc3BsaXRfX2NoaWxkLFxuICAgIC5kb2NrLXN0YWNrLFxuICAgIC5kb2NrLXN0YWNrX19jb250ZW50LFxuICAgIC5kb2NrLXN0YWNrX19wYW5lIHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgIH1cblxuICAgIC5kb2NrLXJvb3Qge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuXG4gICAgLmRvY2stZG9ja2VkIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHotaW5kZXg6IDA7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmctbGF5ZXIge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmcge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7XG4gICAgICBib3gtc2hhZG93OiAwIDE2cHggMzJweCByZ2JhKDE1LCAyMywgNDIsIDAuMjUpO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIG1pbi13aWR0aDogMTJyZW07XG4gICAgICBtaW4taGVpZ2h0OiA4cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19jaHJvbWUge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIHBhZGRpbmc6IDAuMzVyZW0gMC43NXJlbTtcbiAgICAgIGN1cnNvcjogbW92ZTtcbiAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgdG8gYm90dG9tLFxuICAgICAgICByZ2JhKDE0OCwgMTYzLCAxODQsIDAuNiksXG4gICAgICAgIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4yNSlcbiAgICAgICk7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjUpO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX190aXRsZSB7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHJnYmEoMzAsIDQxLCA1OSwgMC45NSk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nID4gLmRvY2stc3RhY2sge1xuICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICBtaW4td2lkdGg6IDEycmVtO1xuICAgICAgbWluLWhlaWdodDogOHJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgIHotaW5kZXg6IDI7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE0OCwgMTYzLCAxODQsIDAuMjUpO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMjBtcyBlYXNlO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC40KTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLFxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20ge1xuICAgICAgbGVmdDogMC43NXJlbTtcbiAgICAgIHJpZ2h0OiAwLjc1cmVtO1xuICAgICAgaGVpZ2h0OiAwLjVyZW07XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcCB7XG4gICAgICB0b3A6IDA7XG4gICAgICBjdXJzb3I6IG4tcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20ge1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgY3Vyc29yOiBzLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tbGVmdCxcbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tcmlnaHQge1xuICAgICAgdG9wOiAxLjc1cmVtO1xuICAgICAgYm90dG9tOiAwLjc1cmVtO1xuICAgICAgd2lkdGg6IDAuNXJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tbGVmdCB7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgY3Vyc29yOiB3LXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tcmlnaHQge1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBjdXJzb3I6IGUtcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AtbGVmdCxcbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLXJpZ2h0LFxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20tbGVmdCxcbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLXJpZ2h0IHtcbiAgICAgIHdpZHRoOiAwLjc1cmVtO1xuICAgICAgaGVpZ2h0OiAwLjc1cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AtbGVmdCB7XG4gICAgICB0b3A6IDA7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgY3Vyc29yOiBudy1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1yaWdodCB7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGN1cnNvcjogbmUtcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20tbGVmdCB7XG4gICAgICBib3R0b206IDA7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgY3Vyc29yOiBzdy1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1yaWdodCB7XG4gICAgICByaWdodDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGN1cnNvcjogc2UtcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxIDEgMDtcbiAgICAgIGdhcDogMC4yNXJlbTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cInZlcnRpY2FsXCJdIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJob3Jpem9udGFsXCJdIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRfX2NoaWxkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxIDEgMDtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdF9fZGl2aWRlciB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBmbGV4OiAwIDAgYXV0bztcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJob3Jpem9udGFsXCJdID4gLmRvY2stc3BsaXRfX2RpdmlkZXIge1xuICAgICAgd2lkdGg6IDAuNXJlbTtcbiAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cInZlcnRpY2FsXCJdID4gLmRvY2stc3BsaXRfX2RpdmlkZXIge1xuICAgICAgaGVpZ2h0OiAwLjVyZW07XG4gICAgICBjdXJzb3I6IHJvdy1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRfX2RpdmlkZXI6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiA1MCU7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cImhvcml6b250YWxcIl0gPiAuZG9jay1zcGxpdF9fZGl2aWRlcjo6YWZ0ZXIge1xuICAgICAgd2lkdGg6IDAuMTI1cmVtO1xuICAgICAgaGVpZ2h0OiA2MCU7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiXSA+IC5kb2NrLXNwbGl0X19kaXZpZGVyOjphZnRlciB7XG4gICAgICB3aWR0aDogNjAlO1xuICAgICAgaGVpZ2h0OiAwLjEyNXJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdF9fZGl2aWRlcjpob3ZlcixcbiAgICAuZG9jay1zcGxpdF9fZGl2aWRlcjpmb2N1cy12aXNpYmxlLFxuICAgIC5kb2NrLXNwbGl0X19kaXZpZGVyW2RhdGEtcmVzaXppbmc9J3RydWUnXSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4zNSk7XG4gICAgfVxuXG4gICAgLmRvY2stc3RhY2sge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBmbGV4OiAxIDEgMDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpO1xuICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDRweCk7XG4gICAgfVxuXG4gICAgLmRvY2stc3RhY2tfX2hlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgZ2FwOiAwLjI1cmVtO1xuICAgICAgcGFkZGluZzogMC4yNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICB9XG5cbiAgICAuZG9jay10YWIge1xuICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIHBhZGRpbmc6IDAuMjVyZW0gMC41cmVtO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICBmb250OiBpbmhlcml0O1xuICAgICAgY3Vyc29yOiBncmFiO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxNjBtcyBlYXNlO1xuICAgIH1cblxuICAgIC5kb2NrLXRhYjphY3RpdmUge1xuICAgICAgY3Vyc29yOiBncmFiYmluZztcbiAgICB9XG5cbiAgICAuZG9jay10YWI6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICB9XG5cbiAgICAuZG9jay10YWI6Zm9jdXMtdmlzaWJsZSB7XG4gICAgICBvdXRsaW5lOiAycHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuOCk7XG4gICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgIH1cblxuICAgIC5kb2NrLXRhYi0tYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjE1KTtcbiAgICB9XG5cbiAgICAuZG9jay1zdGFja19fY29udGVudCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cblxuICAgIC5kb2NrLXN0YWNrX19wYW5lIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsZXg6IDEgMSAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cblxuICAgIC5kb2NrLXN0YWNrX19wYW5lW2hpZGRlbl0ge1xuICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3AtaW5kaWNhdG9yIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuOSk7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xuICAgICAgei1pbmRleDogMTAwO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3AtaW5kaWNhdG9yW2RhdGEtdmlzaWJsZT0ndHJ1ZSddIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1qb3lzdGljayB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgbWluLWNvbnRlbnQpO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQoMywgbWluLWNvbnRlbnQpO1xuICAgICAgZ2FwOiAwLjEyNXJlbTtcbiAgICAgIHBhZGRpbmc6IDAuMTI1cmVtO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuMTUpO1xuICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDE1LCAyMywgNDIsIDAuMjUpO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgIHotaW5kZXg6IDExMDtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXIge1xuICAgICAgd2lkdGg6IDEuNzVyZW07XG4gICAgICBoZWlnaHQ6IDEuNzVyZW07XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b24ge1xuICAgICAgd2lkdGg6IDEuNzVyZW07XG4gICAgICBoZWlnaHQ6IDEuNzVyZW07XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAuMzc1cmVtO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuNCk7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XG4gICAgICBjb2xvcjogcmdiYSgzMCwgNjQsIDE3NSwgMC45KTtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMjBtcyBlYXNlLCBjb2xvciAxMjBtcyBlYXNlLCBib3JkZXItY29sb3IgMTIwbXMgZWFzZTtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25bZGF0YS1hY3RpdmU9J3RydWUnXSxcbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b246aG92ZXIsXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uOmZvY3VzLXZpc2libGUge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMjUpO1xuICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC44KTtcbiAgICAgIGNvbG9yOiByZ2JhKDMwLCA2NCwgMTc1LCAxKTtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b246Zm9jdXMtdmlzaWJsZSB7XG4gICAgICBvdXRsaW5lOiAycHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuOSk7XG4gICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbltkYXRhLXpvbmU9J2NlbnRlciddIHtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbiAgICB9XG5cbiAgICA6OnNsb3R0ZWQoKikge1xuICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgfVxuICA8L3N0eWxlPlxuICA8ZGl2IGNsYXNzPVwiZG9jay1yb290XCI+XG4gICAgPGRpdiBjbGFzcz1cImRvY2stZG9ja2VkXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRvY2stZmxvYXRpbmctbGF5ZXJcIj48L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3AtaW5kaWNhdG9yXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tcIiBkYXRhLXZpc2libGU9XCJmYWxzZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlclwiPjwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBkYXRhLXpvbmU9XCJ0b3BcIlxuICAgICAgYXJpYS1sYWJlbD1cIkRvY2sgdG8gdG9wXCJcbiAgICA+XG4gICAgICDihpFcbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXJcIj48L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwibGVmdFwiXG4gICAgICBhcmlhLWxhYmVsPVwiRG9jayB0byBsZWZ0XCJcbiAgICA+XG4gICAgICDihpBcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwiY2VudGVyXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIGNlbnRlclwiXG4gICAgPlxuICAgICAg4oCiXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvblwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtem9uZT1cInJpZ2h0XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIHJpZ2h0XCJcbiAgICA+XG4gICAgICDihpJcbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXJcIj48L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwiYm90dG9tXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIGJvdHRvbVwiXG4gICAgPlxuICAgICAg4oaTXG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyXCI+PC9kaXY+XG4gIDwvZGl2PlxuYDtcblxubGV0IGNhY2hlZFRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5sZXQgY2FjaGVkVGVtcGxhdGVEb2N1bWVudDogRG9jdW1lbnQgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZW5zdXJlVGVtcGxhdGUoZG9jdW1lbnRSZWY6IERvY3VtZW50KTogSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIGlmICghY2FjaGVkVGVtcGxhdGUgfHwgY2FjaGVkVGVtcGxhdGVEb2N1bWVudCAhPT0gZG9jdW1lbnRSZWYpIHtcbiAgICBjYWNoZWRUZW1wbGF0ZSA9IGRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgY2FjaGVkVGVtcGxhdGUuaW5uZXJIVE1MID0gdGVtcGxhdGVIdG1sO1xuICAgIGNhY2hlZFRlbXBsYXRlRG9jdW1lbnQgPSBkb2N1bWVudFJlZjtcbiAgfVxuXG4gIHJldHVybiBjYWNoZWRUZW1wbGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pbnREb2NrTWFuYWdlckVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIGRvY3VtZW50UmVmOiBEb2N1bWVudCB8IG51bGwgPVxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IG51bGw7XG5cbiAgc3RhdGljIGNvbmZpZ3VyZURvY3VtZW50KGRvY3VtZW50UmVmOiBEb2N1bWVudCB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuZG9jdW1lbnRSZWYgPSBkb2N1bWVudFJlZjtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnbGF5b3V0J107XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRSZWY6IERvY3VtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1JlZjogKFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzKSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdEVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2NrZWRFbDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvYXRpbmdMYXllckVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wSW5kaWNhdG9yOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wSm95c3RpY2s6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGRyb3BKb3lzdGlja0J1dHRvbnM6IEhUTUxCdXR0b25FbGVtZW50W107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nO1xuICBwcml2YXRlIGRyb3BKb3lzdGlja1RhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByb290TGF5b3V0OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZsb2F0aW5nTGF5b3V0czogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXRbXSA9IFtdO1xuICBwcml2YXRlIHRpdGxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHBlbmRpbmdUYWJEcmFnTWV0cmljczpcbiAgICB8IHtcbiAgICAgICAgcG9pbnRlck9mZnNldFg6IG51bWJlcjtcbiAgICAgICAgcG9pbnRlck9mZnNldFk6IG51bWJlcjtcbiAgICAgICAgbGVmdDogbnVtYmVyO1xuICAgICAgICB0b3A6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIHN0YXJ0Q2xpZW50WDogbnVtYmVyO1xuICAgICAgICBzdGFydENsaWVudFk6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc2l6ZVN0YXRlOlxuICAgIHwge1xuICAgICAgICBwYXRoOiBEb2NrUGF0aDtcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgcG9pbnRlcklkOiBudW1iZXI7XG4gICAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICBkaXZpZGVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgc3RhcnRQb3M6IG51bWJlcjtcbiAgICAgICAgaW5pdGlhbFNpemVzOiBudW1iZXJbXTtcbiAgICAgICAgYmVmb3JlU2l6ZTogbnVtYmVyO1xuICAgICAgICBhZnRlclNpemU6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdTdGF0ZToge1xuICAgIHBhbmU6IHN0cmluZztcbiAgICBzb3VyY2VQYXRoOiBEb2NrUGF0aDtcbiAgICBmbG9hdGluZ0luZGV4OiBudW1iZXIgfCBudWxsO1xuICAgIHBvaW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gICAgcG9pbnRlck9mZnNldFk6IG51bWJlcjtcbiAgICBkcm9wSGFuZGxlZDogYm9vbGVhbjtcbiAgICAvLyBGb3IgdGFiIHJlb3JkZXJpbmcgYmVmb3JlIGNvbnZlcnRpbmcgdG8gZmxvYXRpbmdcbiAgICBzb3VyY2VTdGFja0VsPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHNvdXJjZUhlYWRlckJvdW5kcz86IHsgbGVmdDogbnVtYmVyOyB0b3A6IG51bWJlcjsgcmlnaHQ6IG51bWJlcjsgYm90dG9tOiBudW1iZXIgfSB8IG51bGw7XG4gICAgc3RhcnRDbGllbnRYPzogbnVtYmVyO1xuICAgIHN0YXJ0Q2xpZW50WT86IG51bWJlcjtcbiAgICBsaXZlUmVvcmRlckluZGV4PzogbnVtYmVyO1xuICAgIHBsYWNlaG9sZGVySGVhZGVyPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIHBsYWNlaG9sZGVyRWw/OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmbG9hdGluZ0RyYWdTdGF0ZTpcbiAgICB8IHtcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgcG9pbnRlcklkOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0WDogbnVtYmVyO1xuICAgICAgICBzdGFydFk6IG51bWJlcjtcbiAgICAgICAgc3RhcnRMZWZ0OiBudW1iZXI7XG4gICAgICAgIHN0YXJ0VG9wOiBudW1iZXI7XG4gICAgICAgIHdyYXBwZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICBoYW5kbGU6IEhUTUxFbGVtZW50O1xuICAgICAgICBkcm9wVGFyZ2V0PzogeyBwYXRoOiBEb2NrUGF0aDsgem9uZTogRHJvcFpvbmUgfTtcbiAgICAgIH1cbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZsb2F0aW5nUmVzaXplU3RhdGU6XG4gICAgfCB7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIHBvaW50ZXJJZDogbnVtYmVyO1xuICAgICAgICBzdGFydFg6IG51bWJlcjtcbiAgICAgICAgc3RhcnRZOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0V2lkdGg6IG51bWJlcjtcbiAgICAgICAgc3RhcnRIZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgc3RhcnRMZWZ0OiBudW1iZXI7XG4gICAgICAgIHN0YXJ0VG9wOiBudW1iZXI7XG4gICAgICAgIHdyYXBwZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICBoYW5kbGU6IEhUTUxFbGVtZW50O1xuICAgICAgICBlZGdlczogRmxvYXRpbmdSZXNpemVFZGdlcztcbiAgICAgIH1cbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0RyYWdFbmRUaW1lb3V0OiBudW1iZXIgfCBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgZG9jdW1lbnRSZWYgPSB0aGlzLnJlc29sdmVEb2N1bWVudCgpO1xuICAgIHRoaXMuZG9jdW1lbnRSZWYgPSBkb2N1bWVudFJlZjtcbiAgICB0aGlzLndpbmRvd1JlZiA9IHRoaXMucmVzb2x2ZVdpbmRvdyhkb2N1bWVudFJlZik7XG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZW5zdXJlVGVtcGxhdGUoZG9jdW1lbnRSZWYpO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGNvbnN0IHJvb3QgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1yb290Jyk7XG4gICAgaWYgKCFyb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHRlbXBsYXRlIGlzIG1pc3NpbmcgdGhlIHJvb3QgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NrZWQgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1kb2NrZWQnKTtcbiAgICBpZiAoIWRvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIHRoZSBkb2NrZWQgc3VyZmFjZSBlbGVtZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb2F0aW5nTGF5ZXIgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgJy5kb2NrLWZsb2F0aW5nLWxheWVyJyxcbiAgICApO1xuICAgIGlmICghZmxvYXRpbmdMYXllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIHRoZSBmbG9hdGluZyBsYXllciBlbGVtZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGljYXRvciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLWRyb3AtaW5kaWNhdG9yJyk7XG4gICAgaWYgKCFpbmRpY2F0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyB0aGUgZHJvcCBpbmRpY2F0b3IgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb3lzdGljayA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLWRyb3Atam95c3RpY2snKTtcbiAgICBpZiAoIWpveXN0aWNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHRlbXBsYXRlIGlzIG1pc3NpbmcgdGhlIGRyb3Agam95c3RpY2sgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb3lzdGlja0J1dHRvbnMgPSBBcnJheS5mcm9tKFxuICAgICAgam95c3RpY2sucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJy5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbltkYXRhLXpvbmVdJyksXG4gICAgKTtcbiAgICBpZiAoam95c3RpY2tCdXR0b25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIGRyb3Agam95c3RpY2sgYnV0dG9ucy4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3RFbCA9IHJvb3Q7XG4gICAgdGhpcy5kb2NrZWRFbCA9IGRvY2tlZDtcbiAgICB0aGlzLmZsb2F0aW5nTGF5ZXJFbCA9IGZsb2F0aW5nTGF5ZXI7XG4gICAgdGhpcy5kcm9wSW5kaWNhdG9yID0gaW5kaWNhdG9yO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrID0gam95c3RpY2s7XG4gICAgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zID0gam95c3RpY2tCdXR0b25zO1xuICAgIHRoaXMuaW5zdGFuY2VJZCA9IGBtaW50LWRvY2stJHsrK01pbnREb2NrTWFuYWdlckVsZW1lbnQuaW5zdGFuY2VDb3VudGVyfWA7XG4gICAgdGhpcy5vblBvaW50ZXJNb3ZlID0gdGhpcy5vblBvaW50ZXJNb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vblBvaW50ZXJVcCA9IHRoaXMub25Qb2ludGVyVXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ092ZXIgPSB0aGlzLm9uRHJhZ092ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uR2xvYmFsRHJhZ092ZXIgPSB0aGlzLm9uR2xvYmFsRHJhZ092ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uR2xvYmFsRHJhZ0VuZCA9IHRoaXMub25HbG9iYWxEcmFnRW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyb3AgPSB0aGlzLm9uRHJvcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnTGVhdmUgPSB0aGlzLm9uRHJhZ0xlYXZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWcgPSB0aGlzLm9uRHJhZy5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnTW91c2VNb3ZlID0gdGhpcy5vbkRyYWdNb3VzZU1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ1RvdWNoTW92ZSA9IHRoaXMub25EcmFnVG91Y2hNb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdNb3VzZVVwID0gdGhpcy5vbkRyYWdNb3VzZVVwLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdUb3VjaEVuZCA9IHRoaXMub25EcmFnVG91Y2hFbmQuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYXBwbGljYXRpb24nKTtcbiAgICB9XG4gICAgLy8gVGFnIHRoZSBkb2NrZWQgc3VyZmFjZSB3aXRoIGEgcm9vdCBwYXRoIHNvIGl0IGNhbiBhY3QgYXNcbiAgICAvLyBhIGRyb3AgdGFyZ2V0IHdoZW4gdGhlIG1haW4gbGF5b3V0IGlzIGVtcHR5LlxuICAgIHRoaXMuZG9ja2VkRWwuZGF0YXNldFsncGF0aCddID0gdGhpcy5mb3JtYXRQYXRoKHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzOiBbXSB9KTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHRoaXMucm9vdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLnJvb3RFbC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMucm9vdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIC8vIFN0cmVuZ3RoZW4gem9uZSB0cmFja2luZyBieSByZWFjdGluZyB0byBkcmFnZW50ZXIvZHJhZ292ZXIgZGlyZWN0bHkgb24gdGhlIGJ1dHRvbnMuXG4gICAgLy8gVGhpcyBhdm9pZHMgcmVseWluZyBzb2xlbHkgb24gaGl0LXRlc3RpbmcgZWFjaCBmcmFtZSB3aGljaCBjYW4gYmUgaml0dGVyeSBkdXJpbmcgSFRNTDUgZHJhZy5cbiAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKGU6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHogPSBidG4uZGF0YXNldFsnem9uZSddO1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bab25lKHopKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKHopO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBoYW5kbGVyKTtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGhhbmRsZXIpO1xuICAgIH0pO1xuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uR2xvYmFsRHJhZ092ZXIpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMub25EcmFnKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLm9uR2xvYmFsRHJhZ0VuZCwgdHJ1ZSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnT3Zlcik7XG4gICAgdGhpcy5yb290RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICB0aGlzLnJvb3RFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLm9uRHJhZ0xlYXZlKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnT3Zlcik7XG4gICAgdGhpcy5kcm9wSm95c3RpY2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLm9uRHJhZ0xlYXZlKTtcbiAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkdsb2JhbERyYWdPdmVyKTtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLm9uRHJhZyk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5vbkdsb2JhbERyYWdFbmQsIHRydWUpO1xuICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgIHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZTogc3RyaW5nLCBfb2xkVmFsdWU6IHN0cmluZyB8IG51bGwsIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKG5hbWUgPT09ICdsYXlvdXQnKSB7XG4gICAgICB0aGlzLmxheW91dCA9IG5ld1ZhbHVlID8gdGhpcy5wYXJzZUxheW91dChuZXdWYWx1ZSkgOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXlvdXQoKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICByZXR1cm4ge1xuICAgICAgcm9vdDogdGhpcy5jbG9uZUxheW91dE5vZGUodGhpcy5yb290TGF5b3V0KSxcbiAgICAgIGZsb2F0aW5nOiB0aGlzLmNsb25lRmxvYXRpbmdBcnJheSh0aGlzLmZsb2F0aW5nTGF5b3V0cyksXG4gICAgICB0aXRsZXM6IHsgLi4udGhpcy50aXRsZXMgfSxcbiAgICB9O1xuICB9XG5cbiAgc2V0IGxheW91dCh2YWx1ZTogRG9ja0xheW91dFNuYXBzaG90IHwgRG9ja0xheW91dCB8IERvY2tMYXlvdXROb2RlIHwgbnVsbCkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5lbnN1cmVTbmFwc2hvdCh2YWx1ZSk7XG4gICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5jbG9uZUxheW91dE5vZGUoc25hcHNob3Qucm9vdCk7XG4gICAgdGhpcy5mbG9hdGluZ0xheW91dHMgPSB0aGlzLmNsb25lRmxvYXRpbmdBcnJheShzbmFwc2hvdC5mbG9hdGluZyk7XG4gICAgdGhpcy50aXRsZXMgPSBzbmFwc2hvdC50aXRsZXMgPyB7IC4uLnNuYXBzaG90LnRpdGxlcyB9IDoge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldCBzbmFwc2hvdCgpOiBEb2NrTGF5b3V0U25hcHNob3Qge1xuICAgIHJldHVybiB0aGlzLmxheW91dDtcbiAgfVxuXG4gIHRvSlNPTigpOiBEb2NrTGF5b3V0U25hcHNob3Qge1xuICAgIHJldHVybiB0aGlzLnNuYXBzaG90O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRG9jdW1lbnQoKTogRG9jdW1lbnQge1xuICAgIGNvbnN0IHN0YXRpY0RvY3VtZW50ID0gTWludERvY2tNYW5hZ2VyRWxlbWVudC5kb2N1bWVudFJlZjtcbiAgICBjb25zdCBvd25lckRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50ID8/IG51bGw7XG4gICAgY29uc3QgZ2xvYmFsRG9jdW1lbnQgPVxuICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogbnVsbDtcbiAgICBjb25zdCByZXNvbHZlZERvY3VtZW50ID0gc3RhdGljRG9jdW1lbnQgPz8gb3duZXJEb2N1bWVudCA/PyBnbG9iYWxEb2N1bWVudDtcblxuICAgIGlmICghcmVzb2x2ZWREb2N1bWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciByZXF1aXJlcyBhIERvY3VtZW50IHRvIGluaXRpYWxpemUuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFNaW50RG9ja01hbmFnZXJFbGVtZW50LmRvY3VtZW50UmVmKSB7XG4gICAgICBNaW50RG9ja01hbmFnZXJFbGVtZW50LmRvY3VtZW50UmVmID0gcmVzb2x2ZWREb2N1bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWREb2N1bWVudDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVdpbmRvdyhcbiAgICBkb2N1bWVudFJlZjogRG9jdW1lbnQsXG4gICk6IChXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcykgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuXG4gICAgcmV0dXJuIChkb2N1bWVudFJlZi5kZWZhdWx0VmlldyBhcyAoV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMpIHwgbnVsbCkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VMYXlvdXQodmFsdWU6IHN0cmluZyk6IERvY2tMYXlvdXRTbmFwc2hvdCB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHZhbHVlKSBhc1xuICAgICAgICB8IERvY2tMYXlvdXRTbmFwc2hvdFxuICAgICAgICB8IERvY2tMYXlvdXRcbiAgICAgICAgfCBEb2NrTGF5b3V0Tm9kZVxuICAgICAgICB8IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5lbnN1cmVTbmFwc2hvdChwYXJzZWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdtaW50LWRvY2stbWFuYWdlcjogZmFpbGVkIHRvIHBhcnNlIGxheW91dCBhdHRyaWJ1dGUnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTbmFwc2hvdChcbiAgICB2YWx1ZTogRG9ja0xheW91dFNuYXBzaG90IHwgRG9ja0xheW91dCB8IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiBudWxsLCBmbG9hdGluZzogW10sIHRpdGxlczoge30gfTtcbiAgICB9XG5cbiAgICBpZiAoKHZhbHVlIGFzIERvY2tMYXlvdXROb2RlKS5raW5kKSB7XG4gICAgICByZXR1cm4geyByb290OiB2YWx1ZSBhcyBEb2NrTGF5b3V0Tm9kZSwgZmxvYXRpbmc6IFtdLCB0aXRsZXM6IHt9IH07XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0gdmFsdWUgYXMgRG9ja0xheW91dCB8IERvY2tMYXlvdXRTbmFwc2hvdDtcbiAgICByZXR1cm4ge1xuICAgICAgcm9vdDogbGF5b3V0LnJvb3QgPz8gbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBBcnJheS5pc0FycmF5KGxheW91dC5mbG9hdGluZylcbiAgICAgICAgPyBsYXlvdXQuZmxvYXRpbmcubWFwKChmbG9hdGluZykgPT4gdGhpcy5ub3JtYWxpemVGbG9hdGluZ0xheW91dChmbG9hdGluZykpXG4gICAgICAgIDogW10sXG4gICAgICB0aXRsZXM6IGxheW91dC50aXRsZXMgPyB7IC4uLmxheW91dC50aXRsZXMgfSA6IHt9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlbmRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmRvY2tlZEVsLmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuZmxvYXRpbmdMYXllckVsLmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcblxuICAgIGlmICh0aGlzLnJvb3RMYXlvdXQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5yZW5kZXJOb2RlKHRoaXMucm9vdExheW91dCwgW10pO1xuICAgICAgdGhpcy5kb2NrZWRFbC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJGbG9hdGluZ1BhbmVzKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck5vZGUoXG4gICAgbm9kZTogRG9ja0xheW91dE5vZGUsXG4gICAgcGF0aDogbnVtYmVyW10sXG4gICAgZmxvYXRpbmdJbmRleD86IG51bWJlcixcbiAgKTogSFRNTEVsZW1lbnQge1xuICAgIGlmIChub2RlLmtpbmQgPT09ICdzcGxpdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclNwbGl0KG5vZGUsIHBhdGgsIGZsb2F0aW5nSW5kZXgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbmRlclN0YWNrKG5vZGUsIHBhdGgsIGZsb2F0aW5nSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJGbG9hdGluZ1BhbmVzKCk6IHZvaWQge1xuICAgIHRoaXMuZmxvYXRpbmdMYXllckVsLmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuZmxvYXRpbmdMYXlvdXRzLmZvckVhY2goKGZsb2F0aW5nLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stZmxvYXRpbmcnKTtcbiAgICAgIHdyYXBwZXIuZGF0YXNldFsncGF0aCddID0gdGhpcy5mb3JtYXRQYXRoKHtcbiAgICAgICAgdHlwZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHNlZ21lbnRzOiBbXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZmxvYXRpbmcuYm91bmRzO1xuICAgICAgd3JhcHBlci5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICB3cmFwcGVyLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgICB3cmFwcGVyLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgd3JhcHBlci5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuXG4gICAgICBjb25zdCB6SW5kZXggPSB0aGlzLmdldEZsb2F0aW5nUGFuZVpJbmRleChpbmRleCk7XG4gICAgICB3cmFwcGVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyh6SW5kZXgpO1xuXG4gICAgICBjb25zdCBjaHJvbWUgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY2hyb21lLmNsYXNzTGlzdC5hZGQoJ2RvY2stZmxvYXRpbmdfX2Nocm9tZScpO1xuICAgICAgY2hyb21lLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PlxuICAgICAgICB0aGlzLmJlZ2luRmxvYXRpbmdEcmFnKGV2ZW50LCBpbmRleCwgd3JhcHBlciwgY2hyb21lKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRpdGxlLmNsYXNzTGlzdC5hZGQoJ2RvY2stZmxvYXRpbmdfX3RpdGxlJyk7XG4gICAgICB0aXRsZS50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RmxvYXRpbmdXaW5kb3dUaXRsZShmbG9hdGluZyk7XG4gICAgICBjaHJvbWUuYXBwZW5kQ2hpbGQodGl0bGUpO1xuXG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGNocm9tZSk7XG5cbiAgICAgIGlmIChmbG9hdGluZy5yb290KSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJlbmRlck5vZGUoZmxvYXRpbmcucm9vdCwgW10sIGluZGV4KTtcbiAgICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKCdkb2NrLWZsb2F0aW5nX19zdGFjaycpO1xuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBwbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrJyk7XG4gICAgICAgIHBsYWNlaG9sZGVyLmRhdGFzZXRbJ3BhdGgnXSA9IHRoaXMuZm9ybWF0UGF0aCh7XG4gICAgICAgICAgdHlwZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBzZWdtZW50czogW10sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbXB0eSA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVtcHR5LmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2tfX3BhbmUnKTtcbiAgICAgICAgZW1wdHkudGV4dENvbnRlbnQgPSAnTm8gcGFuZXMgY29uZmlndXJlZCc7XG4gICAgICAgIHBsYWNlaG9sZGVyLmFwcGVuZENoaWxkKGVtcHR5KTtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChwbGFjZWhvbGRlcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc2l6ZXJDb25maWdzOiB7IGNsYXNzZXM6IHN0cmluZ1tdOyBlZGdlczogRmxvYXRpbmdSZXNpemVFZGdlcyB9W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLWxlZnQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAndG9wJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdub25lJywgdmVydGljYWw6ICd0b3AnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLXJpZ2h0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICd0b3AnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tcmlnaHQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ25vbmUnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLXJpZ2h0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICdib3R0b20nIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tJ10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ25vbmUnLCB2ZXJ0aWNhbDogJ2JvdHRvbScgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20tbGVmdCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdsZWZ0JywgdmVydGljYWw6ICdib3R0b20nIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tbGVmdCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdsZWZ0JywgdmVydGljYWw6ICdub25lJyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmVzaXplckNvbmZpZ3MuZm9yRWFjaCgoeyBjbGFzc2VzLCBlZGdlcyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXNpemVyLmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XG4gICAgICAgIHJlc2l6ZXIuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXZlbnQpID0+XG4gICAgICAgICAgdGhpcy5iZWdpbkZsb2F0aW5nUmVzaXplKGV2ZW50LCBpbmRleCwgd3JhcHBlciwgcmVzaXplciwgZWRnZXMpLFxuICAgICAgICApO1xuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHJlc2l6ZXIpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZsb2F0aW5nTGF5ZXJFbC5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5GbG9hdGluZ0RyYWcoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHdyYXBwZXI6IEhUTUxFbGVtZW50LFxuICAgIGhhbmRsZTogSFRNTEVsZW1lbnQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbaW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgeyBsZWZ0LCB0b3AgfSA9IGZsb2F0aW5nLmJvdW5kcztcblxuICAgIHRyeSB7XG4gICAgICBoYW5kbGUuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIG5vLW9wOiBwb2ludGVyIGNhcHR1cmUgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgaW4gYWxsIGVudmlyb25tZW50cyAqL1xuICAgIH1cblxuICAgIHRoaXMucHJvbW90ZUZsb2F0aW5nUGFuZShpbmRleCwgd3JhcHBlcik7XG5cbiAgICB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlID0ge1xuICAgICAgaW5kZXgsXG4gICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCxcbiAgICAgIHN0YXJ0WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHN0YXJ0WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHN0YXJ0TGVmdDogbGVmdCxcbiAgICAgIHN0YXJ0VG9wOiB0b3AsXG4gICAgICB3cmFwcGVyLFxuICAgICAgaGFuZGxlLFxuICAgIH07XG5cbiAgICB0aGlzLnN0YXJ0UG9pbnRlclRyYWNraW5nKCk7XG4gIH1cblxuICBwcml2YXRlIGJlZ2luRmxvYXRpbmdSZXNpemUoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHdyYXBwZXI6IEhUTUxFbGVtZW50LFxuICAgIGhhbmRsZTogSFRNTEVsZW1lbnQsXG4gICAgZWRnZXM6IEZsb2F0aW5nUmVzaXplRWRnZXMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbaW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogcG9pbnRlciBjYXB0dXJlIG1heSBub3QgYmUgc3VwcG9ydGVkICovXG4gICAgfVxuXG4gICAgdGhpcy5wcm9tb3RlRmxvYXRpbmdQYW5lKGluZGV4LCB3cmFwcGVyKTtcblxuICAgIHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZSA9IHtcbiAgICAgIGluZGV4LFxuICAgICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgICBzdGFydFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBzdGFydFk6IGV2ZW50LmNsaWVudFksXG4gICAgICBzdGFydFdpZHRoOiBmbG9hdGluZy5ib3VuZHMud2lkdGgsXG4gICAgICBzdGFydEhlaWdodDogZmxvYXRpbmcuYm91bmRzLmhlaWdodCxcbiAgICAgIHN0YXJ0TGVmdDogZmxvYXRpbmcuYm91bmRzLmxlZnQsXG4gICAgICBzdGFydFRvcDogZmxvYXRpbmcuYm91bmRzLnRvcCxcbiAgICAgIHdyYXBwZXIsXG4gICAgICBoYW5kbGUsXG4gICAgICBlZGdlcyxcbiAgICB9O1xuXG4gICAgdGhpcy5zdGFydFBvaW50ZXJUcmFja2luZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGbG9hdGluZ0RyYWdNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxvYXRpbmdEcmFnU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSB8fCBldmVudC5wb2ludGVySWQgIT09IHN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSBzdGF0ZS5zdGFydFg7XG4gICAgY29uc3QgZGVsdGFZID0gZXZlbnQuY2xpZW50WSAtIHN0YXRlLnN0YXJ0WTtcbiAgICBjb25zdCBuZXdMZWZ0ID0gc3RhdGUuc3RhcnRMZWZ0ICsgZGVsdGFYO1xuICAgIGNvbnN0IG5ld1RvcCA9IHN0YXRlLnN0YXJ0VG9wICsgZGVsdGFZO1xuXG4gICAgc3RhdGUud3JhcHBlci5zdHlsZS5sZWZ0ID0gYCR7bmV3TGVmdH1weGA7XG4gICAgc3RhdGUud3JhcHBlci5zdHlsZS50b3AgPSBgJHtuZXdUb3B9cHhgO1xuXG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tzdGF0ZS5pbmRleF07XG4gICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICBmbG9hdGluZy5ib3VuZHMubGVmdCA9IG5ld0xlZnQ7XG4gICAgICBmbG9hdGluZy5ib3VuZHMudG9wID0gbmV3VG9wO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRmxvYXRpbmdEcmFnRHJvcFRhcmdldChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGVuZEZsb2F0aW5nRHJhZyhwb2ludGVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZTtcbiAgICBpZiAoIXN0YXRlIHx8IHBvaW50ZXJJZCAhPT0gc3RhdGUucG9pbnRlcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHN0YXRlLmhhbmRsZS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoc3RhdGUucG9pbnRlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIG5vLW9wICovXG4gICAgfVxuXG4gICAgY29uc3QgZHJvcEhhbmRsZWQgPSBzdGF0ZS5kcm9wVGFyZ2V0XG4gICAgICA/IHRoaXMuaGFuZGxlRmxvYXRpbmdTdGFja0Ryb3Aoc3RhdGUuaW5kZXgsIHN0YXRlLmRyb3BUYXJnZXQucGF0aCwgc3RhdGUuZHJvcFRhcmdldC56b25lKVxuICAgICAgOiBmYWxzZTtcblxuICAgIHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICBpZiAoIWRyb3BIYW5kbGVkKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmxvYXRpbmdEcmFnRHJvcFRhcmdldChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFjayA9IHRoaXMuZmluZFN0YWNrQXRQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICBpZiAoIXN0YWNrKSB7XG4gICAgICBpZiAoc3RhdGUuZHJvcFRhcmdldCkge1xuICAgICAgICBkZWxldGUgc3RhdGUuZHJvcFRhcmdldDtcbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pO1xuICAgIGlmICghcGF0aCB8fCAocGF0aC50eXBlID09PSAnZmxvYXRpbmcnICYmIHBhdGguaW5kZXggPT09IHN0YXRlLmluZGV4KSkge1xuICAgICAgaWYgKHN0YXRlLmRyb3BUYXJnZXQpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmRyb3BUYXJnZXQ7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBzdGlja3kgem9uZSB3aGVuIG1vdmluZyB0byBhbm90aGVyIHN0YWNrIHdoaWxlIGRyYWdnaW5nIHRoZVxuICAgIC8vIGZsb2F0aW5nIHdpbmRvdyBzbyB0aGUgc2lkZSBkb2Vzbid0IGNhcnJ5IG92ZXIuXG4gICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICE9PSBzdGFjaykge1xuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b25lID0gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIGV2ZW50LCB0aGlzLmV4dHJhY3REcm9wWm9uZUZyb21FdmVudChldmVudCkpO1xuXG4gICAgaWYgKHpvbmUpIHtcbiAgICAgIHN0YXRlLmRyb3BUYXJnZXQgPSB7IHBhdGgsIHpvbmUgfTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmRyb3BUYXJnZXQpIHtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5kcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Ryb3BJbmRpY2F0b3Ioc3RhY2ssIHpvbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGbG9hdGluZ1Jlc2l6ZU1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlO1xuICAgIGlmICghc3RhdGUgfHwgZXZlbnQucG9pbnRlcklkICE9PSBzdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gc3RhdGUuc3RhcnRYO1xuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSBzdGF0ZS5zdGFydFk7XG4gICAgY29uc3QgbWluV2lkdGggPSAxOTI7XG4gICAgY29uc3QgbWluSGVpZ2h0ID0gMTI4O1xuICAgIGxldCBuZXdXaWR0aCA9IHN0YXRlLnN0YXJ0V2lkdGg7XG4gICAgbGV0IG5ld0hlaWdodCA9IHN0YXRlLnN0YXJ0SGVpZ2h0O1xuICAgIGxldCBuZXdMZWZ0ID0gc3RhdGUuc3RhcnRMZWZ0O1xuICAgIGxldCBuZXdUb3AgPSBzdGF0ZS5zdGFydFRvcDtcblxuICAgIGlmIChzdGF0ZS5lZGdlcy5ob3Jpem9udGFsID09PSAncmlnaHQnKSB7XG4gICAgICBuZXdXaWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBzdGF0ZS5zdGFydFdpZHRoICsgZGVsdGFYKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVkZ2VzLmhvcml6b250YWwgPT09ICdsZWZ0Jykge1xuICAgICAgbmV3V2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgc3RhdGUuc3RhcnRXaWR0aCAtIGRlbHRhWCk7XG4gICAgICBuZXdMZWZ0ID0gc3RhdGUuc3RhcnRMZWZ0ICsgKHN0YXRlLnN0YXJ0V2lkdGggLSBuZXdXaWR0aCk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmVkZ2VzLnZlcnRpY2FsID09PSAnYm90dG9tJykge1xuICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBzdGF0ZS5zdGFydEhlaWdodCArIGRlbHRhWSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lZGdlcy52ZXJ0aWNhbCA9PT0gJ3RvcCcpIHtcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgc3RhdGUuc3RhcnRIZWlnaHQgLSBkZWx0YVkpO1xuICAgICAgbmV3VG9wID0gc3RhdGUuc3RhcnRUb3AgKyAoc3RhdGUuc3RhcnRIZWlnaHQgLSBuZXdIZWlnaHQpO1xuICAgIH1cblxuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUud2lkdGggPSBgJHtuZXdXaWR0aH1weGA7XG4gICAgc3RhdGUud3JhcHBlci5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUubGVmdCA9IGAke25ld0xlZnR9cHhgO1xuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUudG9wID0gYCR7bmV3VG9wfXB4YDtcblxuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbc3RhdGUuaW5kZXhdO1xuICAgIGlmIChmbG9hdGluZykge1xuICAgICAgZmxvYXRpbmcuYm91bmRzLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICBmbG9hdGluZy5ib3VuZHMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgZmxvYXRpbmcuYm91bmRzLmxlZnQgPSBuZXdMZWZ0O1xuICAgICAgZmxvYXRpbmcuYm91bmRzLnRvcCA9IG5ld1RvcDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuZEZsb2F0aW5nUmVzaXplKHBvaW50ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSB8fCBwb2ludGVySWQgIT09IHN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBzdGF0ZS5oYW5kbGUucmVsZWFzZVBvaW50ZXJDYXB0dXJlKHN0YXRlLnBvaW50ZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKiBuby1vcCAqL1xuICAgIH1cblxuICAgIHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmxvYXRpbmdQYW5lWkluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbaW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybiAxMCArIGluZGV4O1xuICAgIH1cbiAgICBjb25zdCBiYXNlID1cbiAgICAgIHR5cGVvZiBmbG9hdGluZy56SW5kZXggPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShmbG9hdGluZy56SW5kZXgpXG4gICAgICAgID8gZmxvYXRpbmcuekluZGV4XG4gICAgICAgIDogMTAgKyBpbmRleDtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvbW90ZUZsb2F0aW5nUGFuZShpbmRleDogbnVtYmVyLCB3cmFwcGVyOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbaW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhFeGlzdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzLnJlZHVjZSgobWF4LCBsYXlvdXQsIGlkeCkgPT4ge1xuICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHogPSBpZHggPT09IGluZGV4ID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDogdGhpcy5nZXRGbG9hdGluZ1BhbmVaSW5kZXgoaWR4KTtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIHopO1xuICAgIH0sIDApO1xuXG4gICAgY29uc3QgbmV4dFogPSBNYXRoLm1heChtYXhFeGlzdGluZyArIDIsIDEyKTtcbiAgICBmbG9hdGluZy56SW5kZXggPSBuZXh0WjtcbiAgICB3cmFwcGVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyhuZXh0Wik7XG4gIH1cblxuICBwcml2YXRlIGdldEZsb2F0aW5nV3JhcHBlcihpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGAuZG9jay1mbG9hdGluZ1tkYXRhLXBhdGg9XCIke3RoaXMuZm9ybWF0UGF0aCh7XG4gICAgICB0eXBlOiAnZmxvYXRpbmcnLFxuICAgICAgaW5kZXgsXG4gICAgICBzZWdtZW50czogW10sXG4gICAgfSl9XCJdYDtcbiAgICByZXR1cm4gdGhpcy5mbG9hdGluZ0xheWVyRWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oc2VsZWN0b3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBvaW50ZXJUcmFja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2ludGVyVHJhY2tpbmdBY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMub25Qb2ludGVyTW92ZSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICB0aGlzLnBvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BQb2ludGVyVHJhY2tpbmdJZklkbGUoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wb2ludGVyVHJhY2tpbmdBY3RpdmUgJiZcbiAgICAgICF0aGlzLnJlc2l6ZVN0YXRlICYmXG4gICAgICAhdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZSAmJlxuICAgICAgIXRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZVxuICAgICkge1xuICAgICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgICB0aGlzLnBvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmxvYXRpbmdXaW5kb3dUaXRsZShmbG9hdGluZzogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZhbGxiYWNrID0gJ0Zsb2F0aW5nIFBhbmUnO1xuICAgIGlmICghZmxvYXRpbmcgfHwgIWZsb2F0aW5nLnJvb3QpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmZXJyZWQgPSBmbG9hdGluZy5hY3RpdmVQYW5lID8/IHRoaXMuZmluZEZpcnN0UGFuZU5hbWUoZmxvYXRpbmcucm9vdCk7XG4gICAgaWYgKCFwcmVmZXJyZWQpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50aXRsZXNbcHJlZmVycmVkXSA/PyBwcmVmZXJyZWQgPz8gZmFsbGJhY2s7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZsb2F0aW5nV2luZG93VGl0bGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbaW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvciA9IGAuZG9jay1mbG9hdGluZ1tkYXRhLXBhdGg9XCIke3RoaXMuZm9ybWF0UGF0aCh7XG4gICAgICB0eXBlOiAnZmxvYXRpbmcnLFxuICAgICAgaW5kZXgsXG4gICAgICBzZWdtZW50czogW10sXG4gICAgfSl9XCJdYDtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5mbG9hdGluZ0xheWVyRWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oc2VsZWN0b3IpO1xuICAgIGlmICghd3JhcHBlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlRWwgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1mbG9hdGluZ19fdGl0bGUnKTtcbiAgICBpZiAoIXRpdGxlRWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGhpcy5nZXRGbG9hdGluZ1dpbmRvd1RpdGxlKGZsb2F0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU3BsaXQoXG4gICAgbm9kZTogRG9ja1NwbGl0Tm9kZSxcbiAgICBwYXRoOiBudW1iZXJbXSxcbiAgICBmbG9hdGluZ0luZGV4PzogbnVtYmVyLFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZG9jay1zcGxpdCcpO1xuICAgIGNvbnRhaW5lci5kYXRhc2V0WydkaXJlY3Rpb24nXSA9IG5vZGUuZGlyZWN0aW9uO1xuICAgIGNvbnRhaW5lci5kYXRhc2V0WydwYXRoJ10gPSBwYXRoLmpvaW4oJy8nKTtcblxuICAgIGNvbnN0IHNpemVzID0gQXJyYXkuaXNBcnJheShub2RlLnNpemVzKSA/IG5vZGUuc2l6ZXMgOiBbXTtcbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRXcmFwcGVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNoaWxkV3JhcHBlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXNwbGl0X19jaGlsZCcpO1xuICAgICAgY2hpbGRXcmFwcGVyLmRhdGFzZXRbJ2luZGV4J10gPSBTdHJpbmcoaW5kZXgpO1xuXG4gICAgICBjb25zdCBzaXplID0gc2l6ZXNbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoc2l6ZSkpIHtcbiAgICAgICAgY2hpbGRXcmFwcGVyLnN0eWxlLmZsZXggPSBgJHtNYXRoLm1heChzaXplLCAwKX0gMSAwYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkV3JhcHBlci5zdHlsZS5mbGV4ID0gJzEgMSAwJztcbiAgICAgIH1cblxuICAgICAgY2hpbGRXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyTm9kZShjaGlsZCwgWy4uLnBhdGgsIGluZGV4XSwgZmxvYXRpbmdJbmRleCkpO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoaWxkV3JhcHBlcik7XG5cbiAgICAgIGlmIChpbmRleCA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBkaXZpZGVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXNwbGl0X19kaXZpZGVyJyk7XG4gICAgICAgIGRpdmlkZXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NlcGFyYXRvcicpO1xuICAgICAgICBkaXZpZGVyLnRhYkluZGV4ID0gMDtcbiAgICAgICAgZGl2aWRlci5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldmVudCkgPT5cbiAgICAgICAgICB0aGlzLmJlZ2luUmVzaXplKFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBmbG9hdGluZ0luZGV4ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyB7IHR5cGU6ICdmbG9hdGluZycsIGluZGV4OiBmbG9hdGluZ0luZGV4LCBzZWdtZW50czogWy4uLnBhdGhdIH1cbiAgICAgICAgICAgICAgOiB7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50czogWy4uLnBhdGhdIH0sXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2aWRlcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTdGFjayhcbiAgICBub2RlOiBEb2NrU3RhY2tOb2RlLFxuICAgIHBhdGg6IG51bWJlcltdLFxuICAgIGZsb2F0aW5nSW5kZXg/OiBudW1iZXIsXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBzdGFjayA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3RhY2suY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFjaycpO1xuICAgIGNvbnN0IGxvY2F0aW9uOiBEb2NrUGF0aCA9XG4gICAgICB0eXBlb2YgZmxvYXRpbmdJbmRleCA9PT0gJ251bWJlcidcbiAgICAgICAgPyB7IHR5cGU6ICdmbG9hdGluZycsIGluZGV4OiBmbG9hdGluZ0luZGV4LCBzZWdtZW50czogWy4uLnBhdGhdIH1cbiAgICAgICAgOiB7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50czogWy4uLnBhdGhdIH07XG4gICAgc3RhY2suZGF0YXNldFsncGF0aCddID0gdGhpcy5mb3JtYXRQYXRoKGxvY2F0aW9uKTtcblxuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaGVhZGVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2tfX2hlYWRlcicpO1xuICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFibGlzdCcpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFja19fY29udGVudCcpO1xuXG4gICAgY29uc3QgcGFuZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQobm9kZS5wYW5lcykpO1xuICAgIGlmIChwYW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGVtcHR5ID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVtcHR5LmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2tfX3BhbmUnKTtcbiAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gJ05vIHBhbmVzIGNvbmZpZ3VyZWQnO1xuICAgICAgY29udGVudC5hcHBlbmRDaGlsZChlbXB0eSk7XG4gICAgICBzdGFjay5hcHBlbmQoaGVhZGVyLCBjb250ZW50KTtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVQYW5lID0gcGFuZXMuaW5jbHVkZXMobm9kZS5hY3RpdmVQYW5lID8/ICcnKVxuICAgICAgPyBub2RlLmFjdGl2ZVBhbmUhXG4gICAgICA6IHBhbmVzWzBdO1xuXG4gICAgY29uc3QgYmFzZVNsdWcgPSBwYXRoLmxlbmd0aCA/IHBhdGguam9pbignLScpIDogJ3Jvb3QnO1xuICAgIGNvbnN0IHBhdGhTbHVnID1cbiAgICAgIHR5cGVvZiBmbG9hdGluZ0luZGV4ID09PSAnbnVtYmVyJyA/IGBmJHtmbG9hdGluZ0luZGV4fS0ke2Jhc2VTbHVnfWAgOiBiYXNlU2x1ZztcbiAgICBwYW5lcy5mb3JFYWNoKChwYW5lTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcGFuZVNsdWdSYXcgPSBwYW5lTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAnLScpO1xuICAgICAgY29uc3QgcGFuZVNsdWcgPSBwYW5lU2x1Z1Jhdy5sZW5ndGggPiAwID8gcGFuZVNsdWdSYXcgOiAncGFuZSc7XG4gICAgICBjb25zdCB0YWJJZCA9IGAke3RoaXMuaW5zdGFuY2VJZH0tdGFiLSR7cGF0aFNsdWd9LSR7cGFuZVNsdWd9YDtcbiAgICAgIGNvbnN0IHBhbmVsSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LXBhbmVsLSR7cGF0aFNsdWd9LSR7cGFuZVNsdWd9YDtcblxuICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnZG9jay10YWInKTtcbiAgICAgIGJ1dHRvbi5kYXRhc2V0WydwYW5lJ10gPSBwYW5lTmFtZTtcbiAgICAgIGJ1dHRvbi5pZCA9IHRhYklkO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gdGhpcy50aXRsZXNbcGFuZU5hbWVdID8/IHBhbmVOYW1lO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWInKTtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY29udHJvbHMnLCBwYW5lbElkKTtcbiAgICAgIGlmIChwYW5lTmFtZSA9PT0gYWN0aXZlUGFuZSkge1xuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnZG9jay10YWItLWFjdGl2ZScpO1xuICAgICAgfVxuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIFN0cmluZyhwYW5lTmFtZSA9PT0gYWN0aXZlUGFuZSkpO1xuICAgICAgYnV0dG9uLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2tFbCA9IGJ1dHRvbi5jbG9zZXN0PEhUTUxFbGVtZW50PignLmRvY2stc3RhY2snKTtcbiAgICAgICAgdGhpcy5jYXB0dXJlVGFiRHJhZ01ldHJpY3MoZXZlbnQsIHN0YWNrRWwgPz8gbnVsbCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgKCkgPT4gdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpKTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgKCkgPT4gdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpKTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2tFbCA9IGJ1dHRvbi5jbG9zZXN0PEhUTUxFbGVtZW50PignLmRvY2stc3RhY2snKTtcbiAgICAgICAgdGhpcy5iZWdpblBhbmVEcmFnKGV2ZW50LCB0aGlzLmNsb25lUGF0aChsb2NhdGlvbiksIHBhbmVOYW1lLCBzdGFja0VsID8/IG51bGwpO1xuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gICAgICB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVBhbmUoc3RhY2ssIHBhbmVOYW1lLCB0aGlzLmNsb25lUGF0aChsb2NhdGlvbikpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdkb2NrLXBhbmUtYWN0aXZhdGVkJywge1xuICAgICAgICAgICAgZGV0YWlsOiB7IHBhbmU6IHBhbmVOYW1lIH0sXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChidXR0b24pO1xuXG4gICAgICBjb25zdCBwYW5lSG9zdCA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwYW5lSG9zdC5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19wYW5lJyk7XG4gICAgICBwYW5lSG9zdC5kYXRhc2V0WydwYW5lJ10gPSBwYW5lTmFtZTtcbiAgICAgIHBhbmVIb3N0LmlkID0gcGFuZWxJZDtcbiAgICAgIHBhbmVIb3N0LnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWJwYW5lbCcpO1xuICAgICAgcGFuZUhvc3Quc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCB0YWJJZCk7XG4gICAgICBpZiAocGFuZU5hbWUgIT09IGFjdGl2ZVBhbmUpIHtcbiAgICAgICAgcGFuZUhvc3Quc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNsb3RFbCA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnc2xvdCcpO1xuICAgICAgc2xvdEVsLm5hbWUgPSBwYW5lTmFtZTtcbiAgICAgIHBhbmVIb3N0LmFwcGVuZENoaWxkKHNsb3RFbCk7XG4gICAgICBjb250ZW50LmFwcGVuZENoaWxkKHBhbmVIb3N0KTtcbiAgICB9KTtcblxuICAgIHN0YWNrLmRhdGFzZXRbJ2FjdGl2ZVBhbmUnXSA9IGFjdGl2ZVBhbmU7XG4gICAgc3RhY2suYXBwZW5kKGhlYWRlciwgY29udGVudCk7XG4gICAgcmV0dXJuIHN0YWNrO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWdpblJlc2l6ZShcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgcGF0aDogRG9ja1BhdGgsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBkaXZpZGVyID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFkaXZpZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSAoY29udGFpbmVyLmRhdGFzZXRbJ2RpcmVjdGlvbiddIGFzICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcpID8/ICdob3Jpem9udGFsJztcbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgPiAuZG9jay1zcGxpdF9fY2hpbGQnKSk7XG4gICAgY29uc3QgaW5pdGlhbFNpemVzID0gY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIG9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyByZWN0LndpZHRoIDogcmVjdC5oZWlnaHQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCBiZWZvcmVTaXplID0gaW5pdGlhbFNpemVzW2luZGV4XTtcbiAgICBjb25zdCBhZnRlclNpemUgPSBpbml0aWFsU2l6ZXNbaW5kZXggKyAxXTtcbiAgICBjb25zdCBzdGFydFBvcyA9IG9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBldmVudC5jbGllbnRYIDogZXZlbnQuY2xpZW50WTtcblxuICAgIGRpdmlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICBkaXZpZGVyLmRhdGFzZXRbJ3Jlc2l6aW5nJ10gPSAndHJ1ZSc7XG4gICAgdGhpcy5yZXNpemVTdGF0ZSA9IHtcbiAgICAgIHBhdGg6IHRoaXMuY2xvbmVQYXRoKHBhdGgpLFxuICAgICAgaW5kZXgsXG4gICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgZGl2aWRlcixcbiAgICAgIHN0YXJ0UG9zLFxuICAgICAgaW5pdGlhbFNpemVzLFxuICAgICAgYmVmb3JlU2l6ZSxcbiAgICAgIGFmdGVyU2l6ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5zdGFydFBvaW50ZXJUcmFja2luZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMucmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMucmVzaXplU3RhdGU7XG4gICAgICBjb25zdCBzcGxpdE5vZGUgPSB0aGlzLnJlc29sdmVTcGxpdE5vZGUoc3RhdGUucGF0aCk7XG4gICAgICBpZiAoIXNwbGl0Tm9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBzdGF0ZS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkZWx0YSA9IGN1cnJlbnRQb3MgLSBzdGF0ZS5zdGFydFBvcztcbiAgICAgIGNvbnN0IG1pblNpemUgPSA0ODtcbiAgICAgIGNvbnN0IHBhaXJUb3RhbCA9IHN0YXRlLmJlZm9yZVNpemUgKyBzdGF0ZS5hZnRlclNpemU7XG5cbiAgICAgIGxldCBuZXdCZWZvcmUgPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoc3RhdGUuYmVmb3JlU2l6ZSArIGRlbHRhLCBtaW5TaXplKSxcbiAgICAgICAgcGFpclRvdGFsIC0gbWluU2l6ZSxcbiAgICAgICk7XG4gICAgICBsZXQgbmV3QWZ0ZXIgPSBwYWlyVG90YWwgLSBuZXdCZWZvcmU7XG5cbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG5ld0JlZm9yZSkgfHwgIU51bWJlci5pc0Zpbml0ZShuZXdBZnRlcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3QWZ0ZXIgPCBtaW5TaXplKSB7XG4gICAgICAgIG5ld0FmdGVyID0gbWluU2l6ZTtcbiAgICAgICAgbmV3QmVmb3JlID0gcGFpclRvdGFsIC0gbWluU2l6ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3U2l6ZXNQaXhlbHMgPSBbLi4uc3RhdGUuaW5pdGlhbFNpemVzXTtcbiAgICAgIG5ld1NpemVzUGl4ZWxzW3N0YXRlLmluZGV4XSA9IG5ld0JlZm9yZTtcbiAgICAgIG5ld1NpemVzUGl4ZWxzW3N0YXRlLmluZGV4ICsgMV0gPSBuZXdBZnRlcjtcblxuICAgICAgY29uc3QgdG90YWwgPSBuZXdTaXplc1BpeGVscy5yZWR1Y2UoKGFjYywgc2l6ZSkgPT4gYWNjICsgc2l6ZSwgMCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gdG90YWwgPiAwID8gbmV3U2l6ZXNQaXhlbHMubWFwKChzaXplKSA9PiBzaXplIC8gdG90YWwpIDogW107XG5cbiAgICAgIHNwbGl0Tm9kZS5zaXplcyA9IG5vcm1hbGl6ZWQ7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oc3RhdGUuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgPiAuZG9jay1zcGxpdF9fY2hpbGQnKSk7XG4gICAgICBub3JtYWxpemVkLmZvckVhY2goKHNpemUsIGlkeCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGRyZW5baWR4XSkge1xuICAgICAgICAgIGNoaWxkcmVuW2lkeF0uc3R5bGUuZmxleCA9IGAke01hdGgubWF4KHNpemUsIDApfSAxIDBgO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHRoaXMuaGFuZGxlRmxvYXRpbmdSZXNpemVNb3ZlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mbG9hdGluZ0RyYWdTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICB0aGlzLmhhbmRsZUZsb2F0aW5nRHJhZ01vdmUoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2l6ZVN0YXRlICYmIGV2ZW50LnBvaW50ZXJJZCA9PT0gdGhpcy5yZXNpemVTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIGNvbnN0IGRpdmlkZXIgPSB0aGlzLnJlc2l6ZVN0YXRlLmRpdmlkZXI7XG4gICAgICBkaXZpZGVyLmRhdGFzZXRbJ3Jlc2l6aW5nJ10gPSAnZmFsc2UnO1xuICAgICAgZGl2aWRlci5yZWxlYXNlUG9pbnRlckNhcHR1cmUodGhpcy5yZXNpemVTdGF0ZS5wb2ludGVySWQpO1xuICAgICAgdGhpcy5yZXNpemVTdGF0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgdGhpcy5lbmRGbG9hdGluZ0RyYWcoZXZlbnQucG9pbnRlcklkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlICYmIGV2ZW50LnBvaW50ZXJJZCA9PT0gdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgdGhpcy5lbmRGbG9hdGluZ1Jlc2l6ZShldmVudC5wb2ludGVySWQpO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcFBvaW50ZXJUcmFja2luZ0lmSWRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYXB0dXJlVGFiRHJhZ01ldHJpY3MoZXZlbnQ6IFBvaW50ZXJFdmVudCwgc3RhY2tFbDogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFzdGFja0VsKSB7XG4gICAgICB0aGlzLnBlbmRpbmdUYWJEcmFnTWV0cmljcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgfHwgIU51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKSkge1xuICAgICAgdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3MgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzdGFja1JlY3QgPSBzdGFja0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgcG9pbnRlck9mZnNldFggPSBldmVudC5jbGllbnRYIC0gc3RhY2tSZWN0LmxlZnQ7XG4gICAgY29uc3QgcG9pbnRlck9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gc3RhY2tSZWN0LnRvcDtcbiAgICBjb25zdCBsZWZ0ID0gc3RhY2tSZWN0LmxlZnQgLSBob3N0UmVjdC5sZWZ0O1xuICAgIGNvbnN0IHRvcCA9IHN0YWNrUmVjdC50b3AgLSBob3N0UmVjdC50b3A7XG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIuaXNGaW5pdGUoc3RhY2tSZWN0LndpZHRoKSA/IHN0YWNrUmVjdC53aWR0aCA6IDA7XG4gICAgY29uc3QgaGVpZ2h0ID0gTnVtYmVyLmlzRmluaXRlKHN0YWNrUmVjdC5oZWlnaHQpID8gc3RhY2tSZWN0LmhlaWdodCA6IDA7XG5cbiAgICB0aGlzLnBlbmRpbmdUYWJEcmFnTWV0cmljcyA9IHtcbiAgICAgIHBvaW50ZXJPZmZzZXRYLFxuICAgICAgcG9pbnRlck9mZnNldFksXG4gICAgICBsZWZ0LFxuICAgICAgdG9wLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBzdGFydENsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBzdGFydENsaWVudFk6IGV2ZW50LmNsaWVudFksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKTogdm9pZCB7XG4gICAgdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3MgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWdpblBhbmVEcmFnKFxuICAgIGV2ZW50OiBEcmFnRXZlbnQsXG4gICAgcGF0aDogRG9ja1BhdGgsXG4gICAgcGFuZTogc3RyaW5nLFxuICAgIHN0YWNrRWw6IEhUTUxFbGVtZW50IHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBnaG9zdCBlbGVtZW50IGZvciB0aGUgZHJhZyBpbWFnZS4gVGhpcyBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9tIGNhbmNlbGxpbmdcbiAgICAvLyB0aGUgZHJhZyBvcGVyYXRpb24gd2hlbiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTSBkdXJpbmcgcmUtcmVuZGVyLlxuICAgIGNvbnN0IGdob3N0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgICBnaG9zdC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZ2hvc3Quc3R5bGUubGVmdCA9ICctOTk5OXB4JztcbiAgICBnaG9zdC5zdHlsZS50b3AgPSAnLTk5OTlweCc7XG4gICAgZ2hvc3Quc3R5bGUud2lkdGggPSBgJHsoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkub2Zmc2V0V2lkdGh9cHhgO1xuICAgIGdob3N0LnN0eWxlLmhlaWdodCA9IGAkeyhldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRIZWlnaHR9cHhgO1xuICAgIHRoaXMuc2hhZG93Um9vdD8uYXBwZW5kQ2hpbGQoZ2hvc3QpO1xuXG4gICAgLy8gVXNlIHRoZSBnaG9zdCBlbGVtZW50IGFzIHRoZSBkcmFnIGltYWdlLlxuICAgIC8vIFRoZSBvZmZzZXQgaXMgc2V0IHRvIHdoZXJlIHRoZSB1c2VyJ3MgY3Vyc29yIGlzIG9uIHRoZSBvcmlnaW5hbCBlbGVtZW50LlxuICAgIGNvbnN0IGRyYWdJbWdPZmZzZXRYID0gTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFgpID8gKGV2ZW50IGFzIGFueSkub2Zmc2V0WCA6IDA7XG4gICAgY29uc3QgZHJhZ0ltZ09mZnNldFkgPSBOdW1iZXIuaXNGaW5pdGUoKGV2ZW50IGFzIGFueSkub2Zmc2V0WSkgPyAoZXZlbnQgYXMgYW55KS5vZmZzZXRZIDogMDtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGdob3N0LCBkcmFnSW1nT2Zmc2V0WCwgZHJhZ0ltZ09mZnNldFkpO1xuXG4gICAgLy8gVGhlIGdob3N0IGVsZW1lbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhZnRlciB0aGUgZHJhZyBpbWFnZSBpcyBzZXQuXG4gICAgLy8gV2UgZGVmZXIgaXRzIHJlbW92YWwgdG8gZW5zdXJlIHRoZSBicm93c2VyIGhhcyBjYXB0dXJlZCBpdC5cbiAgICBzZXRUaW1lb3V0KCgpID0+IGdob3N0LnJlbW92ZSgpLCAwKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHBhdGg6IHNvdXJjZVBhdGgsXG4gICAgICBmbG9hdGluZ0luZGV4LFxuICAgICAgcG9pbnRlck9mZnNldFgsXG4gICAgICBwb2ludGVyT2Zmc2V0WSxcbiAgICB9ID0gdGhpcy5wcmVwYXJlUGFuZURyYWdTb3VyY2UocGF0aCwgcGFuZSwgc3RhY2tFbCwgZXZlbnQpO1xuXG4gICAgLy8gQ2FwdHVyZSBoZWFkZXIgYm91bmRzIGZvciBkZXRlY3Rpbmcgd2hlbiB0byBjb252ZXJ0IHRvIGZsb2F0aW5nXG4gICAgY29uc3QgaGVhZGVyRWwgPSBzdGFja0VsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stc3RhY2tfX2hlYWRlcicpID8/IG51bGw7XG4gICAgY29uc3QgaGVhZGVyUmVjdCA9IGhlYWRlckVsID8gaGVhZGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsO1xuICAgIGNvbnN0IGhlYWRlckJvdW5kcyA9IGhlYWRlclJlY3RcbiAgICAgID8geyBsZWZ0OiBoZWFkZXJSZWN0LmxlZnQsIHRvcDogaGVhZGVyUmVjdC50b3AsIHJpZ2h0OiBoZWFkZXJSZWN0LnJpZ2h0LCBib3R0b206IGhlYWRlclJlY3QuYm90dG9tIH1cbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3M7XG5cbiAgICB0aGlzLmRyYWdTdGF0ZSA9IHtcbiAgICAgIHBhbmUsXG4gICAgICBzb3VyY2VQYXRoOiB0aGlzLmNsb25lUGF0aChzb3VyY2VQYXRoKSxcbiAgICAgIGZsb2F0aW5nSW5kZXgsXG4gICAgICBwb2ludGVyT2Zmc2V0WCxcbiAgICAgIHBvaW50ZXJPZmZzZXRZLFxuICAgICAgZHJvcEhhbmRsZWQ6IGZhbHNlLFxuICAgICAgc291cmNlU3RhY2tFbDogc3RhY2tFbCxcbiAgICAgIHNvdXJjZUhlYWRlckJvdW5kczogaGVhZGVyQm91bmRzLFxuICAgICAgc3RhcnRDbGllbnRYOlxuICAgICAgICBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnN0YXJ0Q2xpZW50WClcbiAgICAgICAgICA/IG1ldHJpY3Muc3RhcnRDbGllbnRYXG4gICAgICAgICAgOiBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WClcbiAgICAgICAgICA/IGV2ZW50LmNsaWVudFhcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHN0YXJ0Q2xpZW50WTpcbiAgICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5zdGFydENsaWVudFkpXG4gICAgICAgICAgPyBtZXRyaWNzLnN0YXJ0Q2xpZW50WVxuICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpXG4gICAgICAgICAgPyBldmVudC5jbGllbnRZXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICAvLyBTZWVkIGxhc3Qga25vd24gcG9pbnRlciBwb3NpdGlvbiBmcm9tIHBvaW50ZXJkb3duIG1ldHJpY3MgdG8gYXZvaWQgKDAsMCkgZ2xpdGNoZXMgaW4gRmlyZWZveFxuICAgIGlmIChcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgTnVtYmVyLmlzRmluaXRlKHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WCkgJiZcbiAgICAgIE51bWJlci5pc0Zpbml0ZSh0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFkpXG4gICAgKSB7XG4gICAgICB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uID0ge1xuICAgICAgICB4OiB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFggYXMgbnVtYmVyLFxuICAgICAgICB5OiB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFkgYXMgbnVtYmVyLFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gUHJlZmVyIHRoZSBwb2ludGVyIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgZHJhZ2dlZCB0YWIgdG8gYXZvaWQganVtcHMgb24gY29udmVyc2lvblxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoKGV2ZW50IGFzIGFueSkub2Zmc2V0WCkpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLnBvaW50ZXJPZmZzZXRYID0gKGV2ZW50IGFzIGFueSkub2Zmc2V0WCBhcyBudW1iZXI7XG4gICAgfVxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoKGV2ZW50IGFzIGFueSkub2Zmc2V0WSkpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLnBvaW50ZXJPZmZzZXRZID0gKGV2ZW50IGFzIGFueSkub2Zmc2V0WSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb24oZXZlbnQpO1xuICAgIHRoaXMuc3RhcnREcmFnUG9pbnRlclRyYWNraW5nKCk7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCBwYW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVBhbmVEcmFnU291cmNlKFxuICAgIHBhdGg6IERvY2tQYXRoLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgICBzdGFja0VsOiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICAgZXZlbnQ6IERyYWdFdmVudCxcbiAgKTogeyBwYXRoOiBEb2NrUGF0aDsgZmxvYXRpbmdJbmRleDogbnVtYmVyIHwgbnVsbDsgcG9pbnRlck9mZnNldFg6IG51bWJlcjsgcG9pbnRlck9mZnNldFk6IG51bWJlciB9IHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24ocGF0aCk7XG4gICAgaWYgKCFsb2NhdGlvbiB8fCAhbG9jYXRpb24ubm9kZS5wYW5lcy5pbmNsdWRlcyhwYW5lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZmxvYXRpbmdJbmRleDogbnVsbCxcbiAgICAgICAgcG9pbnRlck9mZnNldFg6IDAsXG4gICAgICAgIHBvaW50ZXJPZmZzZXRZOiAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzO1xuXG4gICAgY29uc3QgZG9tSGFzU2libGluZyA9XG4gICAgICAhIXN0YWNrRWwgJiZcbiAgICAgIEFycmF5LmZyb20oc3RhY2tFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stdGFiJykpLnNvbWUoXG4gICAgICAgIChidXR0b24pID0+IGJ1dHRvbi5kYXRhc2V0WydwYW5lJ10gJiYgYnV0dG9uLmRhdGFzZXRbJ3BhbmUnXSAhPT0gcGFuZSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBoYXNTaWJsaW5nSW5TdGFjayA9IGxvY2F0aW9uLm5vZGUucGFuZXMuc29tZSgoZXhpc3RpbmcpID0+IGV4aXN0aW5nICE9PSBwYW5lKTtcbiAgICBjb25zdCBmbG9hdGluZyA9IGxvY2F0aW9uLmNvbnRleHQgPT09ICdmbG9hdGluZycgPyB0aGlzLmZsb2F0aW5nTGF5b3V0c1tsb2NhdGlvbi5pbmRleF0gOiBudWxsO1xuICAgIGNvbnN0IGZsb2F0aW5nUGFuZUNvdW50ID1cbiAgICAgIGZsb2F0aW5nICYmIGZsb2F0aW5nLnJvb3QgPyB0aGlzLmNvdW50UGFuZXNJblRyZWUoZmxvYXRpbmcucm9vdCkgOiBoYXNTaWJsaW5nSW5TdGFjayA/IDIgOiAxO1xuICAgIGNvbnN0IHNob3VsZFJldXNlRXhpc3RpbmdXaW5kb3cgPVxuICAgICAgbG9jYXRpb24uY29udGV4dCA9PT0gJ2Zsb2F0aW5nJyAmJlxuICAgICAgISFmbG9hdGluZyAmJlxuICAgICAgIWhhc1NpYmxpbmdJblN0YWNrICYmXG4gICAgICAhZG9tSGFzU2libGluZyAmJlxuICAgICAgZmxvYXRpbmdQYW5lQ291bnQgPD0gMTtcblxuICAgIGlmIChzaG91bGRSZXVzZUV4aXN0aW5nV2luZG93KSB7XG4gICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgICAgIHRoaXMudXBkYXRlRmxvYXRpbmdXaW5kb3dUaXRsZShsb2NhdGlvbi5pbmRleCk7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldEZsb2F0aW5nV3JhcHBlcihsb2NhdGlvbi5pbmRleCk7XG4gICAgICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICAgICAgdGhpcy5wcm9tb3RlRmxvYXRpbmdQYW5lKGxvY2F0aW9uLmluZGV4LCB3cmFwcGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYID1cbiAgICAgICAgICBtZXRyaWNzICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MucG9pbnRlck9mZnNldFgpICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MubGVmdCkgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuYm91bmRzLmxlZnQpXG4gICAgICAgICAgICA/IG1ldHJpY3MucG9pbnRlck9mZnNldFggKyAobWV0cmljcy5sZWZ0IC0gZmxvYXRpbmcuYm91bmRzLmxlZnQpXG4gICAgICAgICAgICA6IE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRYKSAmJiBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuYm91bmRzLmxlZnQpXG4gICAgICAgICAgICA/IGV2ZW50LmNsaWVudFggLSBob3N0UmVjdC5sZWZ0IC0gZmxvYXRpbmcuYm91bmRzLmxlZnRcbiAgICAgICAgICAgIDogZmxvYXRpbmcuYm91bmRzLndpZHRoIC8gMjtcbiAgICAgICAgY29uc3QgcG9pbnRlck9mZnNldFkgPVxuICAgICAgICAgIG1ldHJpY3MgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WSkgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy50b3ApICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKGZsb2F0aW5nLmJvdW5kcy50b3ApXG4gICAgICAgICAgICA/IG1ldHJpY3MucG9pbnRlck9mZnNldFkgKyAobWV0cmljcy50b3AgLSBmbG9hdGluZy5ib3VuZHMudG9wKVxuICAgICAgICAgICAgOiBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WSkgJiYgTnVtYmVyLmlzRmluaXRlKGZsb2F0aW5nLmJvdW5kcy50b3ApXG4gICAgICAgICAgICA/IGV2ZW50LmNsaWVudFkgLSBob3N0UmVjdC50b3AgLSBmbG9hdGluZy5ib3VuZHMudG9wXG4gICAgICAgICAgICA6IGZsb2F0aW5nLmJvdW5kcy5oZWlnaHQgLyAyO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgZmxvYXRpbmdJbmRleDogbG9jYXRpb24uaW5kZXgsXG4gICAgICAgICAgcG9pbnRlck9mZnNldFgsXG4gICAgICAgICAgcG9pbnRlck9mZnNldFksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoLFxuICAgICAgICBmbG9hdGluZ0luZGV4OiBudWxsLFxuICAgICAgICBwb2ludGVyT2Zmc2V0WDogMCxcbiAgICAgICAgcG9pbnRlck9mZnNldFk6IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBEbyBub3QgY29udmVydCB0byBmbG9hdGluZyB5ZXQ7IGFsbG93IGluLWhlYWRlciByZW9yZGVyaW5nIGZpcnN0LlxuICAgIC8vIFdlIHJldHVybiBwbGFjZWhvbGRlciB2YWx1ZXMgYW5kIHdpbGwgY29udmVydCBvbmNlIHRoZSBwb2ludGVyIGxlYXZlcyB0aGUgdGFiIGhlYWRlci5cbiAgICBjb25zdCBwb2ludGVyT2Zmc2V0WFZhbCA9XG4gICAgICBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRYKVxuICAgICAgICA/IG1ldHJpY3MucG9pbnRlck9mZnNldFhcbiAgICAgICAgOiAwO1xuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZVmFsID1cbiAgICAgIG1ldHJpY3MgJiYgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MucG9pbnRlck9mZnNldFkpXG4gICAgICAgID8gbWV0cmljcy5wb2ludGVyT2Zmc2V0WVxuICAgICAgICA6IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIGZsb2F0aW5nSW5kZXg6IC0xLFxuICAgICAgcG9pbnRlck9mZnNldFg6IHBvaW50ZXJPZmZzZXRYVmFsLFxuICAgICAgcG9pbnRlck9mZnNldFk6IHBvaW50ZXJPZmZzZXRZVmFsLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuZFBhbmVEcmFnKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQZW5kaW5nRHJhZ0VuZFRpbWVvdXQoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZHJhZ1N0YXRlO1xuICAgIHRoaXMuZHJhZ1N0YXRlID0gbnVsbDtcbiAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgdGhpcy5jbGVhckhlYWRlckRyYWdQbGFjZWhvbGRlcigpO1xuICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uID0gbnVsbDtcbiAgICBpZiAoc3RhdGUgJiYgc3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJiAhc3RhdGUuZHJvcEhhbmRsZWQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gS2VlcCBpbnRlcm5hbCBwb2ludGVyIHRyYWNraW5nIHVwLXRvLWRhdGUuXG4gICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbihldmVudCk7XG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgfVxuXG4gICAgLy8gU29tZSBicm93c2VycyBpbnRlcm1pdHRlbnRseSByZXBvcnQgKDAsMCkgZm9yIGRyYWdvdmVyIGNvb3JkaW5hdGVzLlxuICAgIC8vIE1pcnJvciB0aGUgcm9idXN0IGxvZ2ljIHVzZWQgaW4gb25Ecm9wOiBwcmVmZXIgYWN0dWFsIGV2ZW50IGNvb3JkaW5hdGVzXG4gICAgLy8gd2hlbiB2YWxpZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbGFzdCB0cmFja2VkIHBvaW50ZXIgcG9zaXRpb24uXG4gICAgY29uc3QgcG9pbnRGcm9tRXZlbnQgPVxuICAgICAgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpICYmIE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKVxuICAgICAgICA/IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHBvaW50ID1cbiAgICAgIHBvaW50RnJvbUV2ZW50ID8/XG4gICAgICAodGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvblxuICAgICAgICA/IHsgY2xpZW50WDogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi54LCBjbGllbnRZOiB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uLnkgfVxuICAgICAgICA6IG51bGwpO1xuXG4gICAgY29uc3Qgc3RhY2sgPVxuICAgICAgdGhpcy5maW5kU3RhY2tFbGVtZW50KGV2ZW50KSA/P1xuICAgICAgKHBvaW50ID8gdGhpcy5maW5kU3RhY2tBdFBvaW50KHBvaW50LmNsaWVudFgsIHBvaW50LmNsaWVudFkpIDogbnVsbCk7XG4gICAgaWYgKCFzdGFjaykge1xuICAgICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSAhPT0gJ3RydWUnKSB7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKTtcbiAgICAvLyBXaGlsZSByZW9yZGVyaW5nIHdpdGhpbiB0aGUgc2FtZSBoZWFkZXIsIHN1cHByZXNzIHRoZSBqb3lzdGljay9pbmRpY2F0b3IgZW50aXJlbHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmRyYWdTdGF0ZSAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDAgJiZcbiAgICAgIHBhdGggJiZcbiAgICAgIHRoaXMucGF0aHNFcXVhbChwYXRoLCB0aGlzLmRyYWdTdGF0ZS5zb3VyY2VQYXRoKVxuICAgICkge1xuICAgICAgY29uc3QgcHggPSAocG9pbnQgPyBwb2ludC5jbGllbnRYIDogZXZlbnQuY2xpZW50WCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgcHkgPSAocG9pbnQgPyBwb2ludC5jbGllbnRZIDogZXZlbnQuY2xpZW50WSkgYXMgbnVtYmVyO1xuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShweCkgJiYgTnVtYmVyLmlzRmluaXRlKHB5KSAmJiB0aGlzLmlzUG9pbnRlck92ZXJTb3VyY2VIZWFkZXIocHgsIHB5KSkge1xuICAgICAgICAvLyBEcml2ZSBsaXZlIHJlb3JkZXIgdXNpbmcgdGhlIHVuaWZpZWQgcGF0aCBzbyB3ZSB1cGRhdGUgaW5zdGFudGx5LlxuICAgICAgICB0aGlzLnVwZGF0ZVBhbmVEcmFnRHJvcFRhcmdldEZyb21Qb2ludChweCwgcHkpO1xuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIGhvdmVyZWQgc3RhY2sgY2hhbmdlZCwgY2xlYXIgYW55IHN0aWNreSB6b25lIGZyb20gdGhlIHByZXZpb3VzXG4gICAgLy8gdGFyZ2V0IGJlZm9yZSBjb21wdXRpbmcgdGhlIG5ldyB6b25lLlxuICAgIGlmICh0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAmJiB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAhPT0gc3RhY2spIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRab25lSGludCA9IHRoaXMuZXh0cmFjdERyb3Bab25lRnJvbUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBwb2ludFpvbmVIaW50ID0gcG9pbnQgPyB0aGlzLmZpbmREcm9wWm9uZUJ5UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSkgOiBudWxsO1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmNvbXB1dGVEcm9wWm9uZShzdGFjaywgcG9pbnQgPz8gZXZlbnQsIHBvaW50Wm9uZUhpbnQgPz8gZXZlbnRab25lSGludCk7XG4gICAgdGhpcy5zaG93RHJvcEluZGljYXRvcihzdGFjaywgem9uZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBldmVudDtcbiAgICBjb25zdCBoYXNWYWxpZENvb3JkaW5hdGVzID1cbiAgICAgIE51bWJlci5pc0Zpbml0ZShjbGllbnRYKSAmJlxuICAgICAgTnVtYmVyLmlzRmluaXRlKGNsaWVudFkpICYmXG4gICAgICAhKGNsaWVudFggPT09IDAgJiYgY2xpZW50WSA9PT0gMCk7XG5cbiAgICBpZiAoaGFzVmFsaWRDb29yZGluYXRlcykge1xuICAgICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHsgeDogY2xpZW50WCwgeTogY2xpZW50WSB9O1xuICAgICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbkZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbikge1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uO1xuICAgICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uR2xvYmFsRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZyhldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25HbG9iYWxEcmFnRW5kKCk6IHZvaWQge1xuICAgIC8vIEF0dGVtcHQgdG8gZmluYWxpemUgYSBkcm9wIGV2ZW4gaWYgdGhlIGRyb3AgZXZlbnQgZG9lc24ndCByZWFjaCB1cyAoRmlyZWZveC9lZGdlIGNhc2VzKVxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgY29uc3QgcG9zID0gdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbjtcbiAgICBpZiAoc3RhdGUgJiYgcG9zKSB7XG4gICAgICBjb25zdCBzdGFjayA9IHRoaXMuZmluZFN0YWNrQXRQb2ludChwb3MueCwgcG9zLnkpO1xuICAgICAgY29uc3Qgam95c3RpY2tWaXNpYmxlID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddID09PSAndHJ1ZSc7XG4gICAgICBjb25zdCBqb3lzdGlja1BhdGggPSB0aGlzLnBhcnNlUGF0aCh0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0WydwYXRoJ10pO1xuICAgICAgY29uc3Qgam95c3RpY2tUYXJnZXQgPSB0aGlzLmRyb3BKb3lzdGlja1RhcmdldDtcbiAgICAgIGNvbnN0IGpveXN0aWNrVGFyZ2V0UGF0aCA9IGpveXN0aWNrVGFyZ2V0ID8gdGhpcy5wYXJzZVBhdGgoam95c3RpY2tUYXJnZXQuZGF0YXNldFsncGF0aCddKSA6IG51bGw7XG4gICAgICBjb25zdCBwYXRoID0gc3RhY2sgPyB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pIDogKGpveXN0aWNrUGF0aCA/PyBqb3lzdGlja1RhcmdldFBhdGgpO1xuICAgICAgY29uc3Qgam95c3RpY2tab25lID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddIGFzIERyb3Bab25lIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgem9uZSA9IHRoaXMuaXNEcm9wWm9uZShqb3lzdGlja1pvbmUpXG4gICAgICAgID8gam95c3RpY2tab25lXG4gICAgICAgIDogKHN0YWNrID8gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIHsgY2xpZW50WDogcG9zLngsIGNsaWVudFk6IHBvcy55IH0sIG51bGwpIDogbnVsbCk7XG4gICAgICBcbiAgICAgIGlmIChwYXRoICYmIHRoaXMuaXNEcm9wWm9uZSh6b25lKSkge1xuICAgICAgICB0aGlzLmhhbmRsZURyb3AocGF0aCwgem9uZSEpO1xuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVuZFBhbmVEcmFnKCk7XG4gICAgdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnZ2VkRmxvYXRpbmdQb3NpdGlvbkZyb21Qb2ludChcbiAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgY2xpZW50WTogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY2xpZW50WCkgfHwgIU51bWJlci5pc0Zpbml0ZShjbGllbnRZKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJZ25vcmUgb2J2aW91c2x5IGJvZ3VzIGNvb3JkaW5hdGVzIHNvbWV0aW1lcyBzZWVuIGR1cmluZyBIVE1MNSBkcmFnXG4gICAgaWYgKGNsaWVudFggPT09IDAgJiYgY2xpZW50WSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHN0aWxsIGRyYWdnaW5nIGEgdGFiIGluc2lkZSBpdHMgaGVhZGVyLCBvbmx5IGNvbnZlcnQgdG8gZmxvYXRpbmcgb25jZSB3ZSBsZWF2ZSB0aGUgaGVhZGVyLlxuICAgIGlmICh0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggPCAwKSB7XG4gICAgICBjb25zdCBiID0gdGhpcy5kcmFnU3RhdGUuc291cmNlSGVhZGVyQm91bmRzO1xuICAgICAgY29uc3Qgc3ggPSB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFggPz8gY2xpZW50WDtcbiAgICAgIGNvbnN0IHN5ID0gdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRZID8/IGNsaWVudFk7XG4gICAgICBjb25zdCBkaXN0ID0gTWF0aC5oeXBvdChjbGllbnRYIC0gc3gsIGNsaWVudFkgLSBzeSk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSA4OyAvLyBwaXhlbHMgdG8gbW92ZSBiZWZvcmUgY29udmVydGluZyAodHVuZWQgdXApXG4gICAgICAvLyBEZWZhdWx0IHRvIGluc2lkZSB3aGlsZSBib3VuZHMgYXJlIHVua25vd24gdG8gYXZvaWQgcHJlbWF0dXJlIGZsb2F0aW5nXG4gICAgICBsZXQgaW5zaWRlSGVhZGVyID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGluc2lkZUJ5Qm91bmRzID0gYiA/IHRoaXMuaXNQb2ludFdpdGhpbkJvdW5kcyhiLCBjbGllbnRYLCBjbGllbnRZKSA6IHRydWU7XG4gICAgICBjb25zdCBpbnNpZGVCeUhpdFRlc3QgPSB0aGlzLmlzUG9pbnRlck92ZXJTb3VyY2VIZWFkZXIoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBpbnNpZGVIZWFkZXIgPSBpbnNpZGVCeUJvdW5kcyB8fCBpbnNpZGVCeUhpdFRlc3Q7XG4gICAgICBpZiAoIWluc2lkZUhlYWRlciAmJiBkaXN0ID4gdGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdG8gZmxvYXRpbmcgbm93IHVzaW5nIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvblxuICAgICAgICB0aGlzLmNvbnZlcnRQZW5kaW5nVGFiRHJhZ1RvRmxvYXRpbmcoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQYW5lRHJhZ0Ryb3BUYXJnZXRGcm9tUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG5cbiAgICBjb25zdCB7IGZsb2F0aW5nSW5kZXgsIHBvaW50ZXJPZmZzZXRYLCBwb2ludGVyT2Zmc2V0WSB9ID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgaWYgKGZsb2F0aW5nSW5kZXggPT09IG51bGwgfHwgZmxvYXRpbmdJbmRleCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2Zsb2F0aW5nSW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbmV3TGVmdCA9IGNsaWVudFggLSBob3N0UmVjdC5sZWZ0IC0gcG9pbnRlck9mZnNldFg7XG4gICAgY29uc3QgbmV3VG9wID0gY2xpZW50WSAtIGhvc3RSZWN0LnRvcCAtIHBvaW50ZXJPZmZzZXRZO1xuXG4gICAgZmxvYXRpbmcuYm91bmRzLmxlZnQgPSBuZXdMZWZ0O1xuICAgIGZsb2F0aW5nLmJvdW5kcy50b3AgPSBuZXdUb3A7XG5cbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRGbG9hdGluZ1dyYXBwZXIoZmxvYXRpbmdJbmRleCk7XG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIHdyYXBwZXIuc3R5bGUubGVmdCA9IGAke25ld0xlZnR9cHhgO1xuICAgICAgd3JhcHBlci5zdHlsZS50b3AgPSBgJHtuZXdUb3B9cHhgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFuZURyYWdEcm9wVGFyZ2V0RnJvbVBvaW50KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5maW5kU3RhY2tBdFBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGNvbnN0IHBhdGggPSBzdGFjayA/IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGlmICghc3RhY2sgfHwgIXBhdGgpIHtcbiAgICAgIC8vIFdoaWxlIGFjdGl2ZWx5IGRyYWdnaW5nLCBhdm9pZCBoaWRpbmcgdGhlIGluZGljYXRvciBpZiBpdCBpcyB2aXNpYmxlLlxuICAgICAgLy8gVHJhbnNpZW50IG1pc3NlcyBmcm9tIGhpdC10ZXN0aW5nIGFyZSBjb21tb24gbmVhciB0aGUgam95c3RpY2suXG4gICAgICBpZiAodGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddICE9PSAndHJ1ZScpIHtcbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHRhcmdldCBzdGFjaywgcmVzZXQgYW55IHN0aWNreSB6b25lIHNvXG4gICAgICAvLyB0aGUgbmV3IGRyb3AgYXJlYSBkb2Vzbid0IGluaGVyaXQgdGhlIHByZXZpb3VzIHNpZGUgc2VsZWN0aW9uLlxuICAgIGlmICh0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAmJiB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAhPT0gc3RhY2spIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gUHJldmlvdXMgYmVoYXZpb3IgaGlkIHRoZSBpbmRpY2F0b3IgYW5kIHJldHVybmVkIGVhcmx5IGhlcmU7IGluc3RlYWQsXG4gICAgLy8gYWxsb3cgdGhlIGxpdmUtcmVvcmRlciBicmFuY2ggYmVsb3cgdG8gaGFuZGxlIGluLWhlYWRlciBkcmFncy5cblxuICAgIC8vIFdoaWxlIHJlb3JkZXJpbmcgd2l0aGluIHRoZSBzYW1lIGhlYWRlciwgdXBkYXRlIG9yZGVyIGxpdmUgYW5kIHN1cHByZXNzIGpveXN0aWNrL2luZGljYXRvclxuICAgIGlmIChcbiAgICAgIHRoaXMuZHJhZ1N0YXRlICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4IDwgMCAmJlxuICAgICAgcGF0aCAmJlxuICAgICAgdGhpcy5wYXRoc0VxdWFsKHBhdGgsIHRoaXMuZHJhZ1N0YXRlLnNvdXJjZVBhdGgpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbkhlYWRlckJ5Qm91bmRzID0gISF0aGlzLmRyYWdTdGF0ZS5zb3VyY2VIZWFkZXJCb3VuZHMgJiYgdGhpcy5pc1BvaW50V2l0aGluQm91bmRzKHRoaXMuZHJhZ1N0YXRlLnNvdXJjZUhlYWRlckJvdW5kcywgY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBjb25zdCBpbkhlYWRlckJ5SGl0VGVzdCA9IHRoaXMuaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIGlmIChpbkhlYWRlckJ5Qm91bmRzIHx8IGluSGVhZGVyQnlIaXRUZXN0KSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHN0YWNrLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFja19faGVhZGVyJyk7XG4gICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLmNvbXB1dGVIZWFkZXJJbnNlcnRJbmRleChoZWFkZXIsIGNsaWVudFgpO1xuICAgICAgICAgIGlmICh0aGlzLmRyYWdTdGF0ZS5saXZlUmVvcmRlckluZGV4ICE9PSBpZHgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlSGVhZGVyRHJhZ1BsYWNlaG9sZGVyKGhlYWRlciwgdGhpcy5kcmFnU3RhdGUucGFuZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlckRyYWdQbGFjZWhvbGRlclBvc2l0aW9uKGhlYWRlciwgaWR4KTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoKTtcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLnJlb3JkZXJQYW5lSW5Mb2NhdGlvbkF0SW5kZXgobG9jYXRpb24sIHRoaXMuZHJhZ1N0YXRlLnBhbmUsIGlkeCk7XG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyYWdTdGF0ZS5saXZlUmVvcmRlckluZGV4ID0gaWR4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB6b25lSGludCA9IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICBjb25zdCB6b25lID0gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIHsgY2xpZW50WCwgY2xpZW50WSB9LCB6b25lSGludCk7XG4gICAgdGhpcy5zaG93RHJvcEluZGljYXRvcihzdGFjaywgem9uZSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcG9pbnRlciBpcyBjdXJyZW50bHkgb3ZlciB0aGUgc291cmNlIHN0YWNrJ3MgaGVhZGVyICh0YWIgc3RyaXApXG4gIHByaXZhdGUgaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGFja0VsID0gc3RhdGUuc291cmNlU3RhY2tFbCA/PyBudWxsO1xuICAgIGNvbnN0IGhlYWRlciA9IHN0YWNrRWw/LnF1ZXJ5U2VsZWN0b3IoJy5kb2NrLXN0YWNrX19oZWFkZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgIC8vIEJlIGNvbnNlcnZhdGl2ZTogaWYgd2UgY2Fubm90IHJlc29sdmUgdGhlIGhlYWRlciwgdHJlYXQgYXMgaW5zaWRlXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc3IgPSB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgY29uc3QgZWxlbWVudHMgPSBzciA/IHNyLmVsZW1lbnRzRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpIDogW107XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgaGVhZGVyLmNvbnRhaW5zKGVsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BvaW50V2l0aGluQm91bmRzKFxuICAgIGJvdW5kczogeyBsZWZ0OiBudW1iZXI7IHJpZ2h0OiBudW1iZXI7IHRvcDogbnVtYmVyOyBib3R0b206IG51bWJlciB9LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB4ID49IGJvdW5kcy5sZWZ0ICYmIHggPD0gYm91bmRzLnJpZ2h0ICYmIHkgPj0gYm91bmRzLnRvcCAmJiB5IDw9IGJvdW5kcy5ib3R0b207XG4gIH1cblxuICAvLyBFbnN1cmUgYSBwbGFjZWhvbGRlciB0YWIgZXhpc3RzIGR1cmluZyBpbi1oZWFkZXIgZHJhZyBhbmQgaGlkZSB0aGUgcmVhbCBkcmFnZ2VkIHRhYiB2aXN1YWxseVxuICBwcml2YXRlIGVuc3VyZUhlYWRlckRyYWdQbGFjZWhvbGRlcihoZWFkZXI6IEhUTUxFbGVtZW50LCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnU3RhdGU/LnBsYWNlaG9sZGVySGVhZGVyID09PSBoZWFkZXIgJiYgdGhpcy5kcmFnU3RhdGUucGxhY2Vob2xkZXJFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkcmFnZ2VkID0gQXJyYXkuZnJvbShoZWFkZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXRhYicpKS5maW5kKCh0KSA9PiB0LmRhdGFzZXRbJ3BhbmUnXSA9PT0gcGFuZSkgPz8gbnVsbDtcbiAgICBpZiAoIWRyYWdnZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIHBsYWNlaG9sZGVyXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIHBsYWNlaG9sZGVyLnR5cGUgPSAnYnV0dG9uJztcbiAgICBwbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXRhYicpO1xuICAgIHBsYWNlaG9sZGVyLmRhdGFzZXRbJ3BsYWNlaG9sZGVyJ10gPSAndHJ1ZSc7XG4gICAgcGxhY2Vob2xkZXIudGV4dENvbnRlbnQgPSBkcmFnZ2VkLnRleHRDb250ZW50ID8/ICcnO1xuICAgIC8vIEhpZGUgdGhlIG9yaWdpbmFsIGRyYWdnZWQgdGFiIHNvIGl0IGRvZXNuJ3QgZHVwbGljYXRlIHZpc3VhbGx5XG4gICAgZHJhZ2dlZC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgLy8gSW5zZXJ0IHBsYWNlaG9sZGVyIG5leHQgdG8gZHJhZ2dlZCBpbml0aWFsbHlcbiAgICBoZWFkZXIuaW5zZXJ0QmVmb3JlKHBsYWNlaG9sZGVyLCBkcmFnZ2VkLm5leHRTaWJsaW5nKTtcbiAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLnBsYWNlaG9sZGVySGVhZGVyID0gaGVhZGVyO1xuICAgICAgdGhpcy5kcmFnU3RhdGUucGxhY2Vob2xkZXJFbCA9IHBsYWNlaG9sZGVyO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1vdmUgdGhlIHBsYWNlaG9sZGVyIHRvIHRoZSBjb21wdXRlZCB0YXJnZXQgaW5kZXggd2l0aGluIHRoZSBoZWFkZXJcbiAgcHJpdmF0ZSB1cGRhdGVIZWFkZXJEcmFnUGxhY2Vob2xkZXJQb3NpdGlvbihoZWFkZXI6IEhUTUxFbGVtZW50LCB0YXJnZXRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmRyYWdTdGF0ZT8ucGxhY2Vob2xkZXJFbCA/PyBudWxsO1xuICAgIGlmICghcGxhY2Vob2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFicyA9IEFycmF5LmZyb20oaGVhZGVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWInKSlcbiAgICAgIC5maWx0ZXIoKHQpID0+IHQgIT09IHBsYWNlaG9sZGVyKTtcbiAgICBjb25zdCBjbGFtcGVkVGFyZ2V0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGFyZ2V0SW5kZXgsIHRhYnMubGVuZ3RoKSk7XG4gICAgY29uc3QgcmVmID0gdGFic1tjbGFtcGVkVGFyZ2V0XSA/PyBudWxsO1xuICAgIGhlYWRlci5pbnNlcnRCZWZvcmUocGxhY2Vob2xkZXIsIHJlZik7XG4gIH1cblxuICAvLyBSZW1vdmUgcGxhY2Vob2xkZXIgYW5kIHJlc3RvcmUgb3JpZ2luYWwgdGFiIHZpc2liaWxpdHlcbiAgcHJpdmF0ZSBjbGVhckhlYWRlckRyYWdQbGFjZWhvbGRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBwaCA9IHRoaXMuZHJhZ1N0YXRlPy5wbGFjZWhvbGRlckVsID8/IG51bGw7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5kcmFnU3RhdGU/LnBsYWNlaG9sZGVySGVhZGVyID8/IG51bGw7XG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3QgZHJhZ2dlZCA9IHRoaXMuZHJhZ1N0YXRlPy5wYW5lXG4gICAgICAgID8gKEFycmF5LmZyb20oaGVhZGVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWInKSkuZmluZCgodCkgPT4gdC5kYXRhc2V0WydwYW5lJ10gPT09IHRoaXMuZHJhZ1N0YXRlPy5wYW5lKSA/PyBudWxsKVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAoZHJhZ2dlZCkge1xuICAgICAgICBkcmFnZ2VkLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBoICYmIHBoLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHBoLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLnBsYWNlaG9sZGVyRWwgPSBudWxsO1xuICAgICAgdGhpcy5kcmFnU3RhdGUucGxhY2Vob2xkZXJIZWFkZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREcmFnUG9pbnRlclRyYWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IG51bGw7XG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZ01vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uRHJhZ1RvdWNoTW92ZSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uRHJhZ01vdXNlVXAsIHRydWUpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uRHJhZ1RvdWNoRW5kLCB0cnVlKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5vbkRyYWdUb3VjaEVuZCwgdHJ1ZSk7XG4gICAgdGhpcy5kcmFnUG9pbnRlclRyYWNraW5nQWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZ01vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uRHJhZ1RvdWNoTW92ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkRyYWdNb3VzZVVwLCB0cnVlKTtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdUb3VjaEVuZCwgdHJ1ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMub25EcmFnVG91Y2hFbmQsIHRydWUpO1xuICAgIHRoaXMuZHJhZ1BvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSBudWxsO1xuICAgIHRoaXMuY2xlYXJQZW5kaW5nRHJhZ0VuZFRpbWVvdXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25EcmFnTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5zdG9wRHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5idXR0b25zID09PSAwKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlRGVmZXJyZWREcmFnRW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb25Gcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ1RvdWNoTW92ZShldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbMF07XG4gICAgaWYgKCF0b3VjaCkge1xuICAgICAgdGhpcy5zY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHsgeDogdG91Y2guY2xpZW50WCwgeTogdG91Y2guY2xpZW50WSB9O1xuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb25Gcm9tUG9pbnQodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ01vdXNlVXAoKTogdm9pZCB7XG4gICAgLy8gUHJlZmVyIGNvbW1pdHRpbmcgYSBkcm9wIGZyb20gcG9pbnRlci11cCBzaW5jZSBzb21lIGJyb3dzZXJzIHN1cHByZXNzIGRyb3AgZXZlbnRzXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uO1xuICAgICAgaWYgKHBvcykge1xuICAgICAgICB0aGlzLmZpbmFsaXplRHJvcEZyb21Qb2ludChwb3MueCwgcG9zLnkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmhhbmRsZURyYWdQb2ludGVyVXBDb21tb24oKTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgYSBjdXJyZW50bHkgaW4taGVhZGVyIHRhYiBkcmFnIGludG8gYSBmbG9hdGluZyB3aW5kb3dcbiAgcHJpdmF0ZSBjb252ZXJ0UGVuZGluZ1RhYkRyYWdUb0Zsb2F0aW5nKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZHJhZ1N0YXRlO1xuICAgIGlmIChzdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmIHN0YXRlLmZsb2F0aW5nSW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGZsb2F0aW5nXG4gICAgfVxuICAgIC8vIENsZWFuIHVwIGFueSBwbGFjZWhvbGRlciBiZWZvcmUgY29udmVydGluZ1xuICAgIHRoaXMuY2xlYXJIZWFkZXJEcmFnUGxhY2Vob2xkZXIoKTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24oc3RhdGUuc291cmNlUGF0aCk7XG4gICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhbmUgPSBzdGF0ZS5wYW5lO1xuICAgIGNvbnN0IHN0YWNrRWwgPSBzdGF0ZS5zb3VyY2VTdGFja0VsID8/IG51bGw7XG4gICAgY29uc3QgaG9zdFJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHN0YWNrUmVjdCA9IHN0YWNrRWw/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGw7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzO1xuXG4gICAgY29uc3QgZmFsbGJhY2tXaWR0aCA9IDMyMDtcbiAgICBjb25zdCBmYWxsYmFja0hlaWdodCA9IDI0MDtcbiAgICBjb25zdCB3aWR0aCA9XG4gICAgICBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLndpZHRoKSAmJiBtZXRyaWNzLndpZHRoID4gMFxuICAgICAgICA/IG1ldHJpY3Mud2lkdGhcbiAgICAgICAgOiBzdGFja1JlY3QgJiYgTnVtYmVyLmlzRmluaXRlKHN0YWNrUmVjdC53aWR0aClcbiAgICAgICAgPyBzdGFja1JlY3Qud2lkdGhcbiAgICAgICAgOiBmYWxsYmFja1dpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9XG4gICAgICBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLmhlaWdodCkgJiYgbWV0cmljcy5oZWlnaHQgPiAwXG4gICAgICAgID8gbWV0cmljcy5oZWlnaHRcbiAgICAgICAgOiBzdGFja1JlY3QgJiYgTnVtYmVyLmlzRmluaXRlKHN0YWNrUmVjdC5oZWlnaHQpXG4gICAgICAgID8gc3RhY2tSZWN0LmhlaWdodFxuICAgICAgICA6IGZhbGxiYWNrSGVpZ2h0O1xuXG4gICAgY29uc3QgcG9pbnRlck9mZnNldFggPSBOdW1iZXIuaXNGaW5pdGUodGhpcy5kcmFnU3RhdGU/LnBvaW50ZXJPZmZzZXRYIGFzIG51bWJlcilcbiAgICAgID8gKHRoaXMuZHJhZ1N0YXRlIS5wb2ludGVyT2Zmc2V0WCBhcyBudW1iZXIpXG4gICAgICA6IG1ldHJpY3MgJiYgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MucG9pbnRlck9mZnNldFgpXG4gICAgICA/IChtZXRyaWNzLnBvaW50ZXJPZmZzZXRYIGFzIG51bWJlcilcbiAgICAgIDogd2lkdGggLyAyO1xuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZID0gTnVtYmVyLmlzRmluaXRlKHRoaXMuZHJhZ1N0YXRlPy5wb2ludGVyT2Zmc2V0WSBhcyBudW1iZXIpXG4gICAgICA/ICh0aGlzLmRyYWdTdGF0ZSEucG9pbnRlck9mZnNldFkgYXMgbnVtYmVyKVxuICAgICAgOiBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRZKVxuICAgICAgPyAobWV0cmljcy5wb2ludGVyT2Zmc2V0WSBhcyBudW1iZXIpXG4gICAgICA6IGhlaWdodCAvIDI7XG5cbiAgICBjb25zdCBwb2ludGVyTGVmdCA9IE51bWJlci5pc0Zpbml0ZShjbGllbnRYKVxuICAgICAgPyBjbGllbnRYIC0gaG9zdFJlY3QubGVmdCAtIHBvaW50ZXJPZmZzZXRYXG4gICAgICA6IDA7XG4gICAgY29uc3QgcG9pbnRlclRvcCA9IE51bWJlci5pc0Zpbml0ZShjbGllbnRZKVxuICAgICAgPyBjbGllbnRZIC0gaG9zdFJlY3QudG9wIC0gcG9pbnRlck9mZnNldFlcbiAgICAgIDogMDtcblxuICAgIC8vIFJlbW92ZSBwYW5lIGZyb20gaXRzIGN1cnJlbnQgc3RhY2sgYW5kIGNyZWF0ZSBhIG5ldyBmbG9hdGluZyBlbnRyeVxuICAgIHRoaXMucmVtb3ZlUGFuZUZyb21Mb2NhdGlvbihsb2NhdGlvbiwgcGFuZSk7XG4gICAgY29uc3QgZmxvYXRpbmdTdGFjazogRG9ja1N0YWNrTm9kZSA9IHtcbiAgICAgIGtpbmQ6ICdzdGFjaycsXG4gICAgICBwYW5lczogW3BhbmVdLFxuICAgICAgYWN0aXZlUGFuZTogcGFuZSxcbiAgICB9O1xuXG4gICAgY29uc3QgZmxvYXRpbmdMYXlvdXQ6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0ID0ge1xuICAgICAgYm91bmRzOiB7XG4gICAgICAgIGxlZnQ6IHBvaW50ZXJMZWZ0LFxuICAgICAgICB0b3A6IHBvaW50ZXJUb3AsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICB9LFxuICAgICAgcm9vdDogZmxvYXRpbmdTdGFjayxcbiAgICAgIGFjdGl2ZVBhbmU6IHBhbmUsXG4gICAgfTtcblxuICAgIHRoaXMuZmxvYXRpbmdMYXlvdXRzLnB1c2goZmxvYXRpbmdMYXlvdXQpO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5mbG9hdGluZ0xheW91dHMubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldEZsb2F0aW5nV3JhcHBlcihuZXdJbmRleCk7XG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIHRoaXMucHJvbW90ZUZsb2F0aW5nUGFuZShuZXdJbmRleCwgd3JhcHBlcik7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSBkcmFnIHN0YXRlIHNvIHN1YnNlcXVlbnQgbW92ZXMgcmVwb3NpdGlvbiB0aGUgZmxvYXRpbmcgd2luZG93XG4gICAgc3RhdGUuc291cmNlUGF0aCA9IHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXg6IG5ld0luZGV4LCBzZWdtZW50czogW10gfTtcbiAgICBzdGF0ZS5mbG9hdGluZ0luZGV4ID0gbmV3SW5kZXg7XG4gICAgc3RhdGUucG9pbnRlck9mZnNldFggPSBwb2ludGVyT2Zmc2V0WDtcbiAgICBzdGF0ZS5wb2ludGVyT2Zmc2V0WSA9IHBvaW50ZXJPZmZzZXRZO1xuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBpbnRlbmRlZCB0YWIgaW5zZXJ0IGluZGV4IHdpdGhpbiBhIGhlYWRlciBiYXNlZCBvbiBwb2ludGVyIFhcbiAgcHJpdmF0ZSBjb21wdXRlSGVhZGVySW5zZXJ0SW5kZXgoaGVhZGVyOiBIVE1MRWxlbWVudCwgY2xpZW50WDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0YWJzID0gQXJyYXkuZnJvbShoZWFkZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXRhYicpKVxuICAgICAgLmZpbHRlcigodCkgPT4gdC5kYXRhc2V0WydwbGFjZWhvbGRlciddICE9PSAndHJ1ZScpO1xuICAgIGlmICh0YWJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRhYnNbaV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBtaWQgPSByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMjtcbiAgICAgIGlmIChjbGllbnRYIDwgbWlkKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFicy5sZW5ndGg7IC8vIGluc2VydCBhdCBlbmRcbiAgfVxuXG4gIHByaXZhdGUgcmVvcmRlclBhbmVJbkxvY2F0aW9uQXRJbmRleChsb2NhdGlvbjogUmVzb2x2ZWRMb2NhdGlvbiwgcGFuZTogc3RyaW5nLCB0YXJnZXRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFuZXMgPSBsb2NhdGlvbi5ub2RlLnBhbmVzO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHBhbmVzLmluZGV4T2YocGFuZSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2xhbXBlZFRhcmdldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRhcmdldEluZGV4LCBwYW5lcy5sZW5ndGggLSAxKSk7XG4gICAgaWYgKGNsYW1wZWRUYXJnZXQgPT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYW5lcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICBwYW5lcy5zcGxpY2UoY2xhbXBlZFRhcmdldCwgMCwgcGFuZSk7XG4gICAgbG9jYXRpb24ubm9kZS5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICBpZiAobG9jYXRpb24uY29udGV4dCA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tsb2NhdGlvbi5pbmRleF07XG4gICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdUb3VjaEVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZURyYWdQb2ludGVyVXBDb21tb24oKTtcbiAgfVxuXG4gIC8vIENvbW1pdCBhIGRyb3AgdXNpbmcgY3VycmVudCBwb2ludGVyIGNvb3JkaW5hdGVzIGFuZCBqb3lzdGljayBzdGF0ZVxuICBwcml2YXRlIGZpbmFsaXplRHJvcEZyb21Qb2ludChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0F0UG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgc3RhY2tQYXRoID0gc3RhY2sgPyB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pIDogbnVsbDtcbiAgICBjb25zdCBqb3lzdGlja1Zpc2libGUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPT09ICd0cnVlJztcbiAgICBjb25zdCBqb3lzdGlja1N0b3JlZFBhdGggPSB0aGlzLnBhcnNlUGF0aCh0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0WydwYXRoJ10pO1xuICAgIGNvbnN0IGpveXN0aWNrVGFyZ2V0ID0gdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQ7XG4gICAgY29uc3Qgam95c3RpY2tUYXJnZXRQYXRoID0gam95c3RpY2tUYXJnZXQgPyB0aGlzLnBhcnNlUGF0aChqb3lzdGlja1RhcmdldC5kYXRhc2V0WydwYXRoJ10pIDogbnVsbDtcbiAgICBjb25zdCBwYXRoID0gKGpveXN0aWNrVmlzaWJsZSA/IChqb3lzdGlja1N0b3JlZFBhdGggPz8gam95c3RpY2tUYXJnZXRQYXRoKSA6IG51bGwpID8/IHN0YWNrUGF0aDtcblxuICAgIGNvbnN0IGpveXN0aWNrWm9uZSA9IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXSBhcyBEcm9wWm9uZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB6b25lOiBEcm9wWm9uZSB8IG51bGwgPSB0aGlzLmlzRHJvcFpvbmUoam95c3RpY2tab25lKVxuICAgICAgPyBqb3lzdGlja1pvbmVcbiAgICAgIDogKHN0YWNrID8gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIHsgY2xpZW50WCwgY2xpZW50WSB9LCBudWxsKSA6IG51bGwpO1xuXG4gICAgLy8gU2FtZS1oZWFkZXIgcmVvcmRlciBjYXNlIHdoZW4gbm8gc2lkZSB6b25lIGlzIGNob3NlblxuICAgIGlmIChcbiAgICAgIHRoaXMuZHJhZ1N0YXRlICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4IDwgMCAmJlxuICAgICAgc3RhY2sgJiZcbiAgICAgIHBhdGggJiZcbiAgICAgIHN0YWNrUGF0aCAmJlxuICAgICAgdGhpcy5wYXRoc0VxdWFsKHN0YWNrUGF0aCwgdGhpcy5kcmFnU3RhdGUuc291cmNlUGF0aCkgJiZcbiAgICAgICghem9uZSB8fCB6b25lID09PSAnY2VudGVyJylcbiAgICApIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHN0YWNrLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFja19faGVhZGVyJyk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoKTtcbiAgICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5jb21wdXRlSGVhZGVySW5zZXJ0SW5kZXgoaGVhZGVyLCBjbGllbnRYKTtcbiAgICAgICAgICB0aGlzLnJlb3JkZXJQYW5lSW5Mb2NhdGlvbkF0SW5kZXgobG9jYXRpb24sIHRoaXMuZHJhZ1N0YXRlLnBhbmUsIGlkeCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGF0aCAmJiB0aGlzLmlzRHJvcFpvbmUoem9uZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlRHJvcChwYXRoLCB6b25lISk7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5kcm9wSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclBlbmRpbmdEcmFnRW5kVGltZW91dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgICAgaWYgKHdpbiAmJiB0eXBlb2YgdGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHdpbi5jbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVEZWZlcnJlZERyYWdFbmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0RyYWdFbmRUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVEcmFnID0gKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgPSBudWxsO1xuICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgIHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgdGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgPSB3aW5cbiAgICAgID8gd2luLnNldFRpbWVvdXQoY29tcGxldGVEcmFnLCAwKVxuICAgICAgOiBzZXRUaW1lb3V0KGNvbXBsZXRlRHJhZywgMCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgcG9pbnRGcm9tRXZlbnQgPVxuICAgICAgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpICYmIE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKVxuICAgICAgICA/IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHBvaW50ID1cbiAgICAgIHBvaW50RnJvbUV2ZW50ID8/XG4gICAgICAodGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvblxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGNsaWVudFg6IHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24ueCxcbiAgICAgICAgICAgIGNsaWVudFk6IHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24ueSxcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbCk7XG5cbiAgICBjb25zdCBzdGFjayA9XG4gICAgICB0aGlzLmZpbmRTdGFja0VsZW1lbnQoZXZlbnQpID8/XG4gICAgICAocG9pbnQgPyB0aGlzLmZpbmRTdGFja0F0UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSkgOiBudWxsKTtcblxuICAgIC8vIFByZWZlciBqb3lzdGljaydzIHN0b3JlZCB0YXJnZXQgcGF0aCB3aGVuIHRoZSBqb3lzdGljayBpcyB2aXNpYmxlIChkcm9wIG92ZXIgYnV0dG9ucylcbiAgICBjb25zdCBqb3lzdGlja1Zpc2libGUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPT09ICd0cnVlJztcbiAgICBjb25zdCBqb3lzdGlja1BhdGggPSB0aGlzLnBhcnNlUGF0aCh0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0WydwYXRoJ10pO1xuICAgIGNvbnN0IGpveXN0aWNrVGFyZ2V0ID0gdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQ7XG4gICAgY29uc3Qgam95c3RpY2tUYXJnZXRQYXRoID0gam95c3RpY2tUYXJnZXQgPyB0aGlzLnBhcnNlUGF0aChqb3lzdGlja1RhcmdldC5kYXRhc2V0WydwYXRoJ10pIDogbnVsbDtcbiAgICBsZXQgcGF0aCA9IHN0YWNrXG4gICAgICA/IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSlcbiAgICAgIDogKGpveXN0aWNrUGF0aCA/PyBqb3lzdGlja1RhcmdldFBhdGgpO1xuICAgIGlmICghcGF0aCAmJiBqb3lzdGlja1Zpc2libGUpIHtcbiAgICAgIC8vIEFzIGEgbGFzdCByZXNvcnQsIHRhcmdldCB0aGUgbWFpbiBkb2NrIHN1cmZhY2Ugb25seSB3aGVuIGVtcHR5XG4gICAgICBjb25zdCBkb2NrUGF0aCA9IHRoaXMucGFyc2VQYXRoKHRoaXMuZG9ja2VkRWwuZGF0YXNldFsncGF0aCddKTtcbiAgICAgIHBhdGggPSAoIXRoaXMucm9vdExheW91dCA/IGRvY2tQYXRoIDogbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgc2FtZS1oZWFkZXIgcmVvcmRlciBkZWNpc2lvbiB1bnRpbCBhZnRlciB6b25lIHJlc29sdXRpb24gYmVsb3dcblxuICAgIC8vIFByZWZlciBqb3lzdGljaydzIGFjdGl2ZSB6b25lIGlmIGF2YWlsYWJsZSwgZWxzZSBpbmZlciBmcm9tIGV2ZW50L3BvaW50XG4gICAgY29uc3Qgam95c3RpY2tab25lID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddIGFzIERyb3Bab25lIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGV2ZW50Wm9uZUhpbnQgPSB0aGlzLmV4dHJhY3REcm9wWm9uZUZyb21FdmVudChldmVudCk7XG4gICAgY29uc3QgcG9pbnRab25lSGludCA9IHBvaW50ID8gdGhpcy5maW5kRHJvcFpvbmVCeVBvaW50KHBvaW50LmNsaWVudFgsIHBvaW50LmNsaWVudFkpIDogbnVsbDtcbiAgICBjb25zdCB6b25lID0gdGhpcy5pc0Ryb3Bab25lKGpveXN0aWNrWm9uZSlcbiAgICAgID8gam95c3RpY2tab25lXG4gICAgICA6IHN0YWNrXG4gICAgICA/IHRoaXMuY29tcHV0ZURyb3Bab25lKHN0YWNrLCBwb2ludCA/PyBldmVudCwgcG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KVxuICAgICAgOiAodGhpcy5pc0Ryb3Bab25lKHBvaW50Wm9uZUhpbnQgPz8gZXZlbnRab25lSGludCkgPyAocG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KSA6IG51bGwpO1xuXG4gICAgXG4gICAgLy8gSWYgc3RpbGwgaW4gc2FtZSBoZWFkZXIgYW5kIG5vIHNpZGUgem9uZSBjaG9zZW4sIHRyZWF0IGFzIGluLWhlYWRlciByZW9yZGVyXG4gICAgaWYgKFxuICAgICAgdGhpcy5kcmFnU3RhdGUgJiZcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggIT09IG51bGwgJiZcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggPCAwICYmXG4gICAgICBzdGFjayAmJlxuICAgICAgcGF0aCAmJlxuICAgICAgdGhpcy5wYXRoc0VxdWFsKHBhdGgsIHRoaXMuZHJhZ1N0YXRlLnNvdXJjZVBhdGgpICYmXG4gICAgICAoIXpvbmUgfHwgem9uZSA9PT0gJ2NlbnRlcicpXG4gICAgKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBzdGFjay5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stc3RhY2tfX2hlYWRlcicpO1xuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBjb25zdCB4ID0gKHBvaW50ID8gcG9pbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFgpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZSh4KSkge1xuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoKTtcbiAgICAgICAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuY29tcHV0ZUhlYWRlckluc2VydEluZGV4KGhlYWRlciwgeCk7XG4gICAgICAgICAgICB0aGlzLnJlb3JkZXJQYW5lSW5Mb2NhdGlvbkF0SW5kZXgobG9jYXRpb24sIHRoaXMuZHJhZ1N0YXRlLnBhbmUsIGlkeCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgam95c3RpY2sgaXMgdmlzaWJsZSBhbmQgYm90aCBwYXRoIGFuZCB6b25lIGFyZSByZXNvbHZlZCwgZm9yY2UgdXNpbmcgam95c3RpY2sgYXMgYXV0aG9yaXRhdGl2ZVxuICAgIGlmIChqb3lzdGlja1Zpc2libGUgJiYgcGF0aCAmJiB0aGlzLmlzRHJvcFpvbmUoam95c3RpY2tab25lKSkge1xuICAgICAgdGhpcy5oYW5kbGVEcm9wKHBhdGgsIGpveXN0aWNrWm9uZSk7XG4gICAgICB0aGlzLmVuZFBhbmVEcmFnKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghem9uZSkge1xuICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZURyb3AocGF0aCwgem9uZSk7XG4gICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSB8IG51bGw7XG5cbiAgICAvLyBEdXJpbmcgYWN0aXZlIGRyYWdzLCBicm93c2VycyBjYW4gZW1pdCBzcHVyaW91cyBkcmFnbGVhdmUgd2l0aCBudWxsXG4gICAgLy8gcmVsYXRlZFRhcmdldCB3aGlsZSB0aGUgcG9pbnRlciBpcyBzdGlsbCBvdmVyIHRoZSBqb3lzdGljay9idXR0b25zLlxuICAgIC8vIEJlIGNvbnNlcnZhdGl2ZTogaWYgd2UgY2FuIHJlc29sdmUgYSBzdGFjay9qb3lzdGljayBhdCB0aGUgbGFzdCBrbm93blxuICAgIC8vIHBvaW50ZXIgcG9zaXRpb24sIGRvbuKAmXQgaGlkZSAocHJldmVudHMgZmxpY2tlciBvZiBhY3RpdmUgc3RhdGUpLlxuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgY29uc3QgcG9zID1cbiAgICAgICAgKE51bWJlci5pc0Zpbml0ZSgoZXZlbnQgYXMgRHJhZ0V2ZW50KS5jbGllbnRYKSAmJiBOdW1iZXIuaXNGaW5pdGUoKGV2ZW50IGFzIERyYWdFdmVudCkuY2xpZW50WSkpXG4gICAgICAgICAgPyB7IHg6IChldmVudCBhcyBEcmFnRXZlbnQpLmNsaWVudFgsIHk6IChldmVudCBhcyBEcmFnRXZlbnQpLmNsaWVudFkgfVxuICAgICAgICAgIDogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbjtcbiAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgY29uc3Qgc3RhY2tBdFBvaW50ID0gdGhpcy5maW5kU3RhY2tBdFBvaW50KHBvcy54LCBwb3MueSk7XG4gICAgICAgIGlmIChzdGFja0F0UG9pbnQpIHtcbiAgICAgICAgICByZXR1cm47IC8vIHN0aWxsIGluc2lkZSBvdXIgZHJvcCBhcmVhOyBpZ25vcmUgdGhpcyBkcmFnbGVhdmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcmVsYXRlZCkge1xuICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RDb250YWlucyA9IHRoaXMucm9vdEVsLmNvbnRhaW5zKHJlbGF0ZWQpO1xuICAgIGNvbnN0IGpveXN0aWNrQ29udGFpbnMgPSB0aGlzLmRyb3BKb3lzdGljay5jb250YWlucyhyZWxhdGVkKTtcbiAgICBpZiAoIXJvb3RDb250YWlucyAmJiAham95c3RpY2tDb250YWlucykge1xuICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJvcCh0YXJnZXRQYXRoOiBEb2NrUGF0aCB8IG51bGwsIHpvbmU6IERyb3Bab25lKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSB8fCAhdGFyZ2V0UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFuZSwgc291cmNlUGF0aCB9ID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgXG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihzb3VyY2VQYXRoKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHRhcmdldFBhdGgpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlOiBhbGxvdyBkcm9wcGluZyBvbnRvIGFuIGVtcHR5IG1haW4gZG9jayBhcmVhIChubyByb290KS5cbiAgICBpZiAoIXRhcmdldCAmJiB0YXJnZXRQYXRoLnR5cGUgPT09ICdkb2NrZWQnICYmICF0aGlzLnJvb3RMYXlvdXQpIHtcbiAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YWNrRW1wdGllZCA9IHRoaXMucmVtb3ZlUGFuZUZyb21Mb2NhdGlvbihzb3VyY2UsIHBhbmUsIHRydWUpO1xuICAgICAgY29uc3QgbmV3Um9vdDogRG9ja1N0YWNrTm9kZSA9IHtcbiAgICAgICAga2luZDogJ3N0YWNrJyxcbiAgICAgICAgcGFuZXM6IFtwYW5lXSxcbiAgICAgICAgYWN0aXZlUGFuZTogcGFuZSxcbiAgICAgIH07XG4gICAgICB0aGlzLnJvb3RMYXlvdXQgPSBuZXdSb290O1xuICAgICAgaWYgKHN0YWNrRW1wdGllZCkge1xuICAgICAgICB0aGlzLmNsZWFudXBMb2NhdGlvbihzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoem9uZSA9PT0gJ2NlbnRlcicgJiYgdGhpcy5wYXRoc0VxdWFsKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpKSB7XG4gICAgICBpZiAoIXNvdXJjZS5ub2RlLnBhbmVzLmluY2x1ZGVzKHBhbmUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVvcmRlclBhbmVJbkxvY2F0aW9uKHNvdXJjZSwgcGFuZSk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgICB0aGlzLmRyYWdTdGF0ZS5kcm9wSGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tFbXB0aWVkID0gdGhpcy5yZW1vdmVQYW5lRnJvbUxvY2F0aW9uKHNvdXJjZSwgcGFuZSwgdHJ1ZSk7XG5cbiAgICBpZiAoem9uZSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIHRoaXMuYWRkUGFuZVRvTG9jYXRpb24odGFyZ2V0LCBwYW5lKTtcbiAgICAgIHRoaXMuc2V0QWN0aXZlUGFuZUZvckxvY2F0aW9uKHRhcmdldCwgcGFuZSk7XG4gICAgICBpZiAoc3RhY2tFbXB0aWVkKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgICB0aGlzLmRyYWdTdGF0ZS5kcm9wSGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U3RhY2s6IERvY2tTdGFja05vZGUgPSB7XG4gICAgICBraW5kOiAnc3RhY2snLFxuICAgICAgcGFuZXM6IFtwYW5lXSxcbiAgICAgIGFjdGl2ZVBhbmU6IHBhbmUsXG4gICAgfTtcblxuICAgIGlmICh0YXJnZXQuY29udGV4dCA9PT0gJ2RvY2tlZCcpIHtcbiAgICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuZG9ja05vZGVCZXNpZGUodGhpcy5yb290TGF5b3V0LCB0YXJnZXQubm9kZSwgbmV3U3RhY2ssIHpvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3RhcmdldC5pbmRleF07XG4gICAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICAgIGlmIChzdGFja0VtcHRpZWQpIHtcbiAgICAgICAgICB0aGlzLmNsZWFudXBMb2NhdGlvbihzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZmxvYXRpbmcucm9vdCA9IHRoaXMuZG9ja05vZGVCZXNpZGUoZmxvYXRpbmcucm9vdCwgdGFyZ2V0Lm5vZGUsIG5ld1N0YWNrLCB6b25lKTtcbiAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgIH1cblxuICAgIGlmIChzdGFja0VtcHRpZWQpIHtcbiAgICAgIHRoaXMuY2xlYW51cExvY2F0aW9uKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmxvYXRpbmdTdGFja0Ryb3Aoc291cmNlSW5kZXg6IG51bWJlciwgdGFyZ2V0UGF0aDogRG9ja1BhdGgsIHpvbmU6IERyb3Bab25lKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5mbG9hdGluZ0xheW91dHNbc291cmNlSW5kZXhdO1xuICAgIGlmICghc291cmNlIHx8ICFzb3VyY2Uucm9vdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24odGFyZ2V0UGF0aCk7XG4gICAgLy8gQWxsb3cgZHJvcHBpbmcgYW4gZW50aXJlIGZsb2F0aW5nIHN0YWNrIG9udG8gYW4gZW1wdHkgbWFpbiBkb2NrIGFyZWFcbiAgICAvLyAobm8gZXhpc3Rpbmcgcm9vdCkuXG4gICAgaWYgKCF0YXJnZXQgJiYgdGFyZ2V0UGF0aC50eXBlID09PSAnZG9ja2VkJyAmJiAhdGhpcy5yb290TGF5b3V0KSB7XG4gICAgICB0aGlzLnJvb3RMYXlvdXQgPSB0aGlzLmNsb25lTGF5b3V0Tm9kZShzb3VyY2Uucm9vdCk7XG4gICAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQoc291cmNlSW5kZXgpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0LmNvbnRleHQgPT09ICdmbG9hdGluZycgJiYgdGFyZ2V0LmluZGV4ID09PSBzb3VyY2VJbmRleCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh6b25lID09PSAnY2VudGVyJykge1xuICAgICAgY29uc3QgcGFuZXMgPSB0aGlzLmNvbGxlY3RQYW5lTmFtZXMoc291cmNlLnJvb3QpO1xuICAgICAgaWYgKHBhbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHBhbmVzLmZvckVhY2goKHBhbmUpID0+IHtcbiAgICAgICAgdGhpcy5hZGRQYW5lVG9Mb2NhdGlvbih0YXJnZXQsIHBhbmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFjdGl2ZVBhbmUgPVxuICAgICAgICBzb3VyY2UuYWN0aXZlUGFuZSAmJiBwYW5lcy5pbmNsdWRlcyhzb3VyY2UuYWN0aXZlUGFuZSlcbiAgICAgICAgICA/IHNvdXJjZS5hY3RpdmVQYW5lXG4gICAgICAgICAgOiB0aGlzLmZpbmRGaXJzdFBhbmVOYW1lKHNvdXJjZS5yb290KSA/PyBwYW5lc1swXTtcblxuICAgICAgaWYgKGFjdGl2ZVBhbmUpIHtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVQYW5lRm9yTG9jYXRpb24odGFyZ2V0LCBhY3RpdmVQYW5lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW1vdmVGbG9hdGluZ0F0KHNvdXJjZUluZGV4KTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC5jb250ZXh0ID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3RhcmdldC5pbmRleF07XG4gICAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZmxvYXRpbmcucm9vdCA9IHRoaXMuZG9ja05vZGVCZXNpZGUoZmxvYXRpbmcucm9vdCwgdGFyZ2V0Lm5vZGUsIHNvdXJjZS5yb290LCB6b25lKTtcbiAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBzb3VyY2UuYWN0aXZlUGFuZSA/PyB0aGlzLmZpbmRGaXJzdFBhbmVOYW1lKHNvdXJjZS5yb290KSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQoc291cmNlSW5kZXgpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3RMYXlvdXQgPSB0aGlzLmRvY2tOb2RlQmVzaWRlKHRoaXMucm9vdExheW91dCwgdGFyZ2V0Lm5vZGUsIHNvdXJjZS5yb290LCB6b25lKTtcbiAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQoc291cmNlSW5kZXgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0V2VpZ2h0KHNpemVzOiBudW1iZXJbXSB8IHVuZGVmaW5lZCwgaW5kZXg6IG51bWJlciwgdG90YWxDaGlsZHJlbjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGV4aXN0aW5nQ291bnQgPSB0b3RhbENoaWxkcmVuIC0gMTtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVTaXplc0FycmF5KHNpemVzLCBleGlzdGluZ0NvdW50KTtcbiAgICBjb25zdCBuZXdXZWlnaHQgPSAxIC8gdG90YWxDaGlsZHJlbjtcbiAgICBjb25zdCByZW1haW5pbmcgPSAxIC0gbmV3V2VpZ2h0O1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsQ2hpbGRyZW47IGkgKz0gMSkge1xuICAgICAgaWYgKGkgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ld1dlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzb3VyY2VJbmRleCA9IGkgPCBpbmRleCA/IGkgOiBpIC0gMTtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9ybWFsaXplZFtzb3VyY2VJbmRleF0gKiByZW1haW5pbmcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQYW5lRnJvbVN0YWNrKHN0YWNrOiBEb2NrU3RhY2tOb2RlLCBwYW5lOiBzdHJpbmcsIHNraXBDbGVhbnVwID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBzdGFjay5wYW5lcyA9IHN0YWNrLnBhbmVzLmZpbHRlcigocCkgPT4gcCAhPT0gcGFuZSk7XG4gICAgaWYgKCFzdGFjay5wYW5lcy5pbmNsdWRlcyhzdGFjay5hY3RpdmVQYW5lID8/ICcnKSkge1xuICAgICAgaWYgKHN0YWNrLnBhbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RhY2suYWN0aXZlUGFuZSA9IHN0YWNrLnBhbmVzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHN0YWNrLmFjdGl2ZVBhbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YWNrLnBhbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2tpcENsZWFudXApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuY2xlYW51cEVtcHR5U3RhY2tJblRyZWUodGhpcy5yb290TGF5b3V0LCBzdGFjayk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJlbnRTcGxpdChcbiAgICBub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgY2hpbGQ6IERvY2tMYXlvdXROb2RlLFxuICApOiB7IHBhcmVudDogRG9ja1NwbGl0Tm9kZTsgaW5kZXg6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgaWYgKCFub2RlIHx8IG5vZGUgPT09IGNoaWxkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5raW5kICE9PSAnc3BsaXQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IG5vZGUuY2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIHsgcGFyZW50OiBub2RlLCBpbmRleCB9O1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kUGFyZW50U3BsaXQobm9kZS5jaGlsZHJlbltpXSwgY2hpbGQpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRHJvcFpvbmUoXG4gICAgc3RhY2s6IEhUTUxFbGVtZW50LFxuICAgIHBvaW50OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBudWxsLFxuICAgIHpvbmVIaW50PzogRHJvcFpvbmUgfCBudWxsLFxuICApOiBEcm9wWm9uZSB8IG51bGwge1xuICAgIC8vIERvIG5vdCBmb3JjZSBhIHpvbmU6IGV2ZW4gd2hlbiB0aGUgbWFpbiBhcmVhIGlzIGVtcHR5IHdlIG9ubHlcbiAgICAvLyBhY3RpdmF0ZSBhIHpvbmUgd2hlbiB0aGUgcG9pbnRlciBpcyBhY3R1YWxseSBvdmVyIGEgam95c3RpY2sgYnV0dG9uLlxuICAgIGNvbnN0IGhpbnRlZFpvbmUgPSB0aGlzLmlzRHJvcFpvbmUoem9uZUhpbnQpID8gem9uZUhpbnQgOiBudWxsO1xuICAgIGlmIChoaW50ZWRab25lKSB7XG4gICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUoaGludGVkWm9uZSk7XG4gICAgICByZXR1cm4gaGludGVkWm9uZTtcbiAgICB9XG5cbiAgICBjb25zdCBwb2ludFpvbmUgPVxuICAgICAgcG9pbnQgJiZcbiAgICAgIE51bWJlci5pc0Zpbml0ZShwb2ludC5jbGllbnRYKSAmJlxuICAgICAgTnVtYmVyLmlzRmluaXRlKHBvaW50LmNsaWVudFkpXG4gICAgICAgID8gdGhpcy5maW5kRHJvcFpvbmVCeVBvaW50KHBvaW50LmNsaWVudFgsIHBvaW50LmNsaWVudFkpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmIChwb2ludFpvbmUpIHtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShwb2ludFpvbmUpO1xuICAgICAgcmV0dXJuIHBvaW50Wm9uZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgPT09IHN0YWNrKSB7XG4gICAgICAvLyBCZSBzdGlja3kgd2hpbGUgaG92ZXJpbmcgdGhlIGpveXN0aWNrOiBpZiB3ZSByZWNlbnRseSBoYWQgYSB6b25lXG4gICAgICAvLyBzZWxlY3RlZCwgcHJlZmVyIGtlZXBpbmcgaXQgaW5zdGVhZCBvZiBicmllZmx5IGNsZWFyaW5nIHRvIG51bGxcbiAgICAgIC8vIHdoZW4gdGhlIGJyb3dzZXIgcmVwb3J0cyB0cmFuc2llbnQgY29vcmRpbmF0ZXMvdGFyZ2V0cyBkdXJpbmcgZHJhZy5cbiAgICAgIGNvbnN0IHN0aWNreSA9IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgIGlmICh0aGlzLmlzRHJvcFpvbmUoc3RpY2t5KSkge1xuICAgICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUoc3RpY2t5KTtcbiAgICAgICAgcmV0dXJuIHN0aWNreTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdERyb3Bab25lRnJvbUV2ZW50KGV2ZW50OiBFdmVudCk6IERyb3Bab25lIHwgbnVsbCB7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiAoZXZlbnQgYXMgRHJhZ0V2ZW50KS5jb21wb3NlZFBhdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHBhdGggPSAoZXZlbnQgYXMgRHJhZ0V2ZW50KS5jb21wb3NlZFBhdGgoKTtcbiAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmZpbmREcm9wWm9uZUluVGFyZ2V0cyhwYXRoKTtcbiAgICAgIGlmICh6b25lKSB7XG4gICAgICAgIHJldHVybiB6b25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgnY2xpZW50WCcgaW4gZXZlbnQgJiYgJ2NsaWVudFknIGluIGV2ZW50KSB7XG4gICAgICBjb25zdCBwb2ludEV2ZW50ID0gZXZlbnQgYXMgTW91c2VFdmVudDtcbiAgICAgIGNvbnN0IHpvbmVGcm9tUG9pbnQgPSB0aGlzLmZpbmREcm9wWm9uZUJ5UG9pbnQocG9pbnRFdmVudC5jbGllbnRYLCBwb2ludEV2ZW50LmNsaWVudFkpO1xuICAgICAgaWYgKHpvbmVGcm9tUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHpvbmVGcm9tUG9pbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdQb2ludGVyVXBDb21tb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5zdG9wRHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlRGVmZXJyZWREcmFnRW5kKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wWm9uZUluVGFyZ2V0cyh0YXJnZXRzOiBJdGVyYWJsZTxFdmVudFRhcmdldD4pOiBEcm9wWm9uZSB8IG51bGwge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcbiAgICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1kcm9wLWpveXN0aWNrX19idXR0b24nKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHpvbmUgPSB0YXJnZXQuZGF0YXNldD8uWyd6b25lJ107XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcFpvbmUoem9uZSkpIHtcbiAgICAgICAgICByZXR1cm4gem9uZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3Bab25lQnlQb2ludChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IERyb3Bab25lIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucyB8fFxuICAgICAgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddICE9PSAndHJ1ZScgfHxcbiAgICAgICF0aGlzLmRyb3BKb3lzdGlja1RhcmdldFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBidXR0b24gb2YgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zKSB7XG4gICAgICAvLyBTa2lwIGhpZGRlbi9pbmFjdGl2ZSBidXR0b25zICh1c2VkIGluIGNlbnRlci1vbmx5IG1vZGUpXG4gICAgICBpZiAoKGJ1dHRvbi5kYXRhc2V0WydoaWRkZW4nXSA9PT0gJ3RydWUnKSB8fCBidXR0b24uc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicgfHwgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSBidXR0b24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoXG4gICAgICAgIGNsaWVudFggPj0gcmVjdC5sZWZ0ICYmXG4gICAgICAgIGNsaWVudFggPD0gcmVjdC5yaWdodCAmJlxuICAgICAgICBjbGllbnRZID49IHJlY3QudG9wICYmXG4gICAgICAgIGNsaWVudFkgPD0gcmVjdC5ib3R0b21cbiAgICAgICkge1xuICAgICAgICBjb25zdCB6b25lID0gYnV0dG9uLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wWm9uZSh6b25lKSkge1xuICAgICAgICAgIHJldHVybiB6b25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUoem9uZTogRHJvcFpvbmUgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gSWYgbm8gem9uZSBpcyBjb21wdXRlZCBidXQgdGhlIGpveXN0aWNrIGlzIHZpc2libGUsIGtlZXAgdGhlIGxhc3RcbiAgICAvLyBrbm93biBhY3RpdmUgem9uZSB0byBhdm9pZCB2aXN1YWwgaml0dGVyIHdoaWxlIGRyYWdnaW5nIGFjcm9zc1xuICAgIC8vIHNtYWxsIGdhcHMgd2hlcmUgaGl04oCRdGVzdGluZyBtb21lbnRhcmlseSBmYWlscy5cbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddID09PSAndHJ1ZSc7XG4gICAgY29uc3Qgc3RpY2t5ID0gdmlzaWJsZSA/IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlZmZlY3RpdmVab25lOiBEcm9wWm9uZSB8IG51bGwgPSB6b25lID8/ICh0aGlzLmlzRHJvcFpvbmUoc3RpY2t5KSA/IHN0aWNreSA6IG51bGwpO1xuXG4gICAgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSBlZmZlY3RpdmVab25lICE9PSBudWxsICYmIGJ1dHRvbi5kYXRhc2V0Wyd6b25lJ10gPT09IGVmZmVjdGl2ZVpvbmU7XG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgYnV0dG9uLmRhdGFzZXRbJ2FjdGl2ZSddID0gJ3RydWUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGJ1dHRvbi5kYXRhc2V0WydhY3RpdmUnXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZWZmZWN0aXZlWm9uZSkge1xuICAgICAgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddID0gZWZmZWN0aXZlWm9uZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRHJvcFpvbmUodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB2YWx1ZSBpcyBEcm9wWm9uZSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnbGVmdCcgfHwgdmFsdWUgPT09ICdyaWdodCcgfHwgdmFsdWUgPT09ICd0b3AnIHx8IHZhbHVlID09PSAnYm90dG9tJyB8fCB2YWx1ZSA9PT0gJ2NlbnRlcic7XG4gIH1cblxuICBwcml2YXRlIHNob3dEcm9wSW5kaWNhdG9yKHN0YWNrOiBIVE1MRWxlbWVudCwgem9uZTogRHJvcFpvbmUgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IHRoaXMuZHJhZ1N0YXRlPy5zb3VyY2VQYXRoID8/IG51bGw7XG4gICAgaWYgKHRhcmdldFBhdGggJiYgc291cmNlUGF0aCAmJiB0aGlzLmlzT3JJc0FuY2VzdG9yT2YodGFyZ2V0UGF0aCwgc291cmNlUGF0aCkpIHtcbiAgICAgIC8vIERvbid0IHNob3cgYW55IGRyb3AgaW5kaWNhdG9ycyBvbiB0aGUgcGFuZSBiZWluZyBkcmFnZ2VkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBzdGFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaW5kaWNhdG9yID0gdGhpcy5kcm9wSW5kaWNhdG9yO1xuICAgIGNvbnN0IGpveXN0aWNrID0gdGhpcy5kcm9wSm95c3RpY2s7XG5cbiAgICBqb3lzdGljay5oaWRkZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pO1xuICAgIGxldCBvdmVybGF5WiA9IDEwMDtcbiAgICBpZiAocGF0aCAmJiBwYXRoLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIG92ZXJsYXlaID0gdGhpcy5nZXRGbG9hdGluZ1BhbmVaSW5kZXgocGF0aC5pbmRleCkgKyAxMDA7XG4gICAgfVxuICAgIGluZGljYXRvci5zdHlsZS56SW5kZXggPSBTdHJpbmcob3ZlcmxheVopO1xuICAgIGpveXN0aWNrLnN0eWxlLnpJbmRleCA9IFN0cmluZyhvdmVybGF5WiArIDEpO1xuXG4gICAgbGV0IGxlZnQgPSByZWN0LmxlZnQgLSBob3N0UmVjdC5sZWZ0O1xuICAgIGxldCB0b3AgPSByZWN0LnRvcCAtIGhvc3RSZWN0LnRvcDtcbiAgICBsZXQgd2lkdGggPSByZWN0LndpZHRoO1xuICAgIGxldCBoZWlnaHQgPSByZWN0LmhlaWdodDtcblxuICAgIGNvbnN0IHBvcnRpb24gPSAwLjU7XG5cbiAgICBpZiAoem9uZSkge1xuICAgICAgc3dpdGNoICh6b25lKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCAqIHBvcnRpb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICB3aWR0aCA9IHJlY3Qud2lkdGggKiBwb3J0aW9uO1xuICAgICAgICAgIGxlZnQgKz0gcmVjdC53aWR0aCAqICgxIC0gcG9ydGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKiBwb3J0aW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0ICogcG9ydGlvbjtcbiAgICAgICAgICB0b3AgKz0gcmVjdC5oZWlnaHQgKiAoMSAtIHBvcnRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpbmRpY2F0b3Iuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgaW5kaWNhdG9yLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgICBpbmRpY2F0b3Iuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICBpbmRpY2F0b3Iuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgIGluZGljYXRvci5kYXRhc2V0Wyd2aXNpYmxlJ10gPSAndHJ1ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGljYXRvci5kYXRhc2V0Wyd2aXNpYmxlJ10gPSAnZmFsc2UnO1xuICAgIH1cblxuICAgIGpveXN0aWNrLnN0eWxlLmxlZnQgPSBgJHtyZWN0LmxlZnQgLSBob3N0UmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDJ9cHhgO1xuICAgIGpveXN0aWNrLnN0eWxlLnRvcCA9IGAke3JlY3QudG9wIC0gaG9zdFJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyfXB4YDtcbiAgICBqb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPSAndHJ1ZSc7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZGlzcGxheSA9ICdncmlkJztcbiAgICBqb3lzdGljay5kYXRhc2V0WydwYXRoJ10gPSBzdGFjay5kYXRhc2V0WydwYXRoJ10gPz8gJyc7XG4gICAgY29uc3QgY2hhbmdlZFRhcmdldCA9IHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICE9PSBzdGFjaztcbiAgICB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCA9IHN0YWNrO1xuICAgIGlmIChjaGFuZ2VkVGFyZ2V0KSB7XG4gICAgICAvLyBOZXcgdGFyZ2V0IHN0YWNrOiBmb3JnZXQgYW55IHByZXZpb3VzbHkgc3RpY2t5IHpvbmUuXG4gICAgICBkZWxldGUgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddO1xuICAgIH1cblxuICAgIC8vIElmIG1haW4gZG9jayBhcmVhIGlzIGVtcHR5LCBzaG93IG9ubHkgdGhlIGNlbnRlciBidXR0b24gYW5kIGNvbGxhcHNlIHRoZSBncmlkXG4gICAgY29uc3QgaXNFbXB0eU1haW5BcmVhID0gIXRoaXMucm9vdExheW91dCAmJiAoc3RhY2sgPT09IHRoaXMuZG9ja2VkRWwgfHwgKHRhcmdldFBhdGggJiYgdGFyZ2V0UGF0aC50eXBlID09PSAnZG9ja2VkJyAmJiB0YXJnZXRQYXRoLnNlZ21lbnRzLmxlbmd0aCA9PT0gMCkpO1xuICAgIGNvbnN0IHNwYWNlcnMgPSBBcnJheS5mcm9tKHRoaXMuZHJvcEpveXN0aWNrLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXInKSk7XG4gICAgaWYgKGlzRW1wdHlNYWluQXJlYSkge1xuICAgICAgLy8gS2VlcCBzcGFjZXJzIHZpc2libGUgc28gdGhlIGpveXN0aWNrIGtlZXBzIGl0cyBjaXJjdWxhciBmb290cHJpbnQuXG4gICAgICBzcGFjZXJzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgcy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgY29uc3QgaXNDZW50ZXIgPSBidG4uZGF0YXNldFsnem9uZSddID09PSAnY2VudGVyJztcbiAgICAgICAgaWYgKGlzQ2VudGVyKSB7XG4gICAgICAgICAgYnRuLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAgIGRlbGV0ZSBidG4uZGF0YXNldFsnaGlkZGVuJ107XG4gICAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBIaWRlIHZpc3VhbGx5IGJ1dCBrZWVwIGxheW91dCBzcGFjZTsgYWxzbyBwcmV2ZW50IGludGVyYWN0aW9uLlxuICAgICAgICAgIGJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgYnRuLmRhdGFzZXRbJ2hpZGRlbiddID0gJ3RydWUnO1xuICAgICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gS2VlcCBkZWZhdWx0IDN4MyBncmlkIHNvIHRoZSBjaXJjdWxhciBiYWNrZ3JvdW5kIHNpemUgc3RheXMgdGhlIHNhbWUuXG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJyc7XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gJyc7XG4gICAgICAvLyBEbyBub3Qgc2V0IGFuIGFjdGl2ZSB6b25lIGF1dG9tYXRpY2FsbHk7IHVzZXJzIG11c3QgaG92ZXIgdGhlIGJ1dHRvbi5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICBkZWxldGUgYnRuLmRhdGFzZXRbJ2hpZGRlbiddO1xuICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfSk7XG4gICAgICBzcGFjZXJzLmZvckVhY2goKHMpID0+IChzLnN0eWxlLmRpc3BsYXkgPSAnJykpO1xuICAgICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9ICcnO1xuICAgICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZ3JpZFRlbXBsYXRlUm93cyA9ICcnO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUoem9uZSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVEcm9wSW5kaWNhdG9yKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcEluZGljYXRvci5kYXRhc2V0Wyd2aXNpYmxlJ10gPSAnZmFsc2UnO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICdmYWxzZSc7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkZWxldGUgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsncGF0aCddO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUobnVsbCk7XG4gICAgLy8gUmVzdG9yZSBqb3lzdGljayBzdHJ1Y3R1cmUgdG8gZGVmYXVsdC5cbiAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYnRuLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICBkZWxldGUgYnRuLmRhdGFzZXRbJ2hpZGRlbiddO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20odGhpcy5kcm9wSm95c3RpY2sucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlcicpKS5mb3JFYWNoKChzKSA9PiAocy5zdHlsZS5kaXNwbGF5ID0gJycpKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJyc7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suc3R5bGUuZ3JpZFRlbXBsYXRlUm93cyA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU3RhY2tBdFBvaW50KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBzaGFkb3cgPSB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgaWYgKCFzaGFkb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gc2hhZG93LmVsZW1lbnRzRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5maW5kU3RhY2tJblRhcmdldHMoZWxlbWVudHMpO1xuICAgIGlmIChzdGFjaykge1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZG9ja2VkIHN0YWNrcyAoYWxsIHBhbmVzIGFyZSBmbG9hdGluZyksIGFsbG93IHRoZVxuICAgIC8vIGRvY2tlZCBzdXJmYWNlIGl0c2VsZiB0byBzZXJ2ZSBhcyBhIGRyb3AgdGFyZ2V0IGZvciB0aGUgbWFpbiB6b25lLlxuICAgIGlmICghdGhpcy5yb290TGF5b3V0KSB7XG4gICAgICBjb25zdCBkb2NrUmVjdCA9IHRoaXMuZG9ja2VkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoXG4gICAgICAgIGNsaWVudFggPj0gZG9ja1JlY3QubGVmdCAmJlxuICAgICAgICBjbGllbnRYIDw9IGRvY2tSZWN0LnJpZ2h0ICYmXG4gICAgICAgIGNsaWVudFkgPj0gZG9ja1JlY3QudG9wICYmXG4gICAgICAgIGNsaWVudFkgPD0gZG9ja1JlY3QuYm90dG9tXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9ja2VkRWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpbmRTdGFja0VsZW1lbnQoZXZlbnQ6IERyYWdFdmVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgcGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpO1xuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5maW5kU3RhY2tJblRhcmdldHMocGF0aCk7XG4gICAgaWYgKHN0YWNrKSB7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHJvb3QgZG9jayBhcmVhIGlzIGVtcHR5LCB0cmVhdCB0aGUgZG9ja2VkIHN1cmZhY2UgYXMgYSB2YWxpZFxuICAgIC8vIHRhcmdldCB3aGVuIGl0IGFwcGVhcnMgaW4gdGhlIGNvbXBvc2VkIHBhdGguXG4gICAgaWYgKCF0aGlzLnJvb3RMYXlvdXQpIHtcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHBhdGgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAgICAgKHRhcmdldCA9PT0gdGhpcy5kb2NrZWRFbCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb2NrLWRvY2tlZCcpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kb2NrZWRFbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFN0YWNrSW5UYXJnZXRzKHRhcmdldHM6IEl0ZXJhYmxlPEV2ZW50VGFyZ2V0Pik6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRhcmdldHMpIHtcbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stc3RhY2snKSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgJiZcbiAgICAgICAgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb2NrLWRyb3Atam95c3RpY2snKSB8fFxuICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbicpIHx8XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyJykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZhdGVQYW5lKHN0YWNrOiBIVE1MRWxlbWVudCwgcGFuZU5hbWU6IHN0cmluZywgcGF0aDogRG9ja1BhdGgpOiB2b2lkIHtcbiAgICBzdGFjay5kYXRhc2V0WydhY3RpdmVQYW5lJ10gPSBwYW5lTmFtZTtcblxuICAgIGNvbnN0IGhlYWRlckJ1dHRvbnMgPSBzdGFjay5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignLmRvY2stdGFiJyk7XG4gICAgaGVhZGVyQnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidXR0b24uZGF0YXNldFsncGFuZSddID09PSBwYW5lTmFtZTtcbiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdkb2NrLXRhYi0tYWN0aXZlJywgaXNTZWxlY3RlZCk7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhbmVzID0gc3RhY2sucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrX19wYW5lJyk7XG4gICAgcGFuZXMuZm9yRWFjaCgocGFuZSkgPT4ge1xuICAgICAgaWYgKHBhbmUuZGF0YXNldFsncGFuZSddID09PSBwYW5lTmFtZSkge1xuICAgICAgICBwYW5lLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYW5lLnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHBhdGgpO1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2NhdGlvbi5ub2RlLmFjdGl2ZVBhbmUgPSBwYW5lTmFtZTtcbiAgICBpZiAocGF0aC50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3BhdGguaW5kZXhdO1xuICAgICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBwYW5lTmFtZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRmxvYXRpbmdXaW5kb3dUaXRsZShwYXRoLmluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Tm9kZUF0UGF0aChyb290OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsIHBhdGg6IG51bWJlcltdKTogRG9ja0xheW91dE5vZGUgfCBudWxsIHtcbiAgICBpZiAoIXJvb3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwgPSByb290O1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHBhdGgpIHtcbiAgICAgIGlmICghY3VycmVudCB8fCBjdXJyZW50LmtpbmQgIT09ICdzcGxpdCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbltzZWdtZW50XSA/PyBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU3BsaXROb2RlKHBhdGg6IERvY2tQYXRoKTogRG9ja1NwbGl0Tm9kZSB8IG51bGwge1xuICAgIGlmIChwYXRoLnR5cGUgPT09ICdkb2NrZWQnKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQXRQYXRoKHRoaXMucm9vdExheW91dCwgcGF0aC5zZWdtZW50cyk7XG4gICAgICByZXR1cm4gbm9kZSAmJiBub2RlLmtpbmQgPT09ICdzcGxpdCcgPyBub2RlIDogbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3BhdGguaW5kZXhdO1xuICAgIGlmICghZmxvYXRpbmcgfHwgIWZsb2F0aW5nLnJvb3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVBdFBhdGgoZmxvYXRpbmcucm9vdCwgcGF0aC5zZWdtZW50cyk7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5raW5kID09PSAnc3BsaXQnID8gbm9kZSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VOb2RlSW5UcmVlKFxuICAgIHJvb3Q6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICB0YXJnZXQ6IERvY2tMYXlvdXROb2RlLFxuICAgIHJlcGxhY2VtZW50OiBEb2NrTGF5b3V0Tm9kZSxcbiAgKTogRG9ja0xheW91dE5vZGUgfCBudWxsIHtcbiAgICBpZiAoIXJvb3QpIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICB9XG5cbiAgICBpZiAocm9vdCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50SW5mbyA9IHRoaXMuZmluZFBhcmVudFNwbGl0KHJvb3QsIHRhcmdldCk7XG4gICAgaWYgKCFwYXJlbnRJbmZvKSB7XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBwYXJlbnRJbmZvLnBhcmVudC5jaGlsZHJlbltwYXJlbnRJbmZvLmluZGV4XSA9IHJlcGxhY2VtZW50O1xuICAgIHRoaXMubm9ybWFsaXplU3BsaXROb2RlKHBhcmVudEluZm8ucGFyZW50KTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cEVtcHR5U3RhY2tJblRyZWUoXG4gICAgcm9vdDogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHN0YWNrOiBEb2NrU3RhY2tOb2RlLFxuICApOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGlmICghcm9vdCB8fCBzdGFjay5wYW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRJbmZvID0gdGhpcy5maW5kUGFyZW50U3BsaXQocm9vdCwgc3RhY2spO1xuICAgIGlmICghcGFyZW50SW5mbykge1xuICAgICAgcmV0dXJuIHJvb3QgPT09IHN0YWNrID8gbnVsbCA6IHJvb3Q7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gcGFyZW50SW5mby5wYXJlbnQ7XG4gICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzdGFjayk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxuXG4gICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50LnNpemVzKSkge1xuICAgICAgcGFyZW50LnNpemVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMubm9ybWFsaXplU3BsaXROb2RlKHBhcmVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5jbGVhbnVwU3BsaXRJZk5lY2Vzc2FyeShyb290LCBwYXJlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwU3BsaXRJZk5lY2Vzc2FyeShcbiAgICByb290OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgc3BsaXQ6IERvY2tTcGxpdE5vZGUsXG4gICk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKHNwbGl0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU5vZGVJblRyZWUocm9vdCwgc3BsaXQsIHNwbGl0LmNoaWxkcmVuWzBdKTtcbiAgICB9XG5cbiAgICBpZiAoc3BsaXQuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBwYXJlbnRJbmZvID0gdGhpcy5maW5kUGFyZW50U3BsaXQocm9vdCwgc3BsaXQpO1xuICAgICAgaWYgKCFwYXJlbnRJbmZvKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRJbmZvLnBhcmVudDtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yoc3BsaXQpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50LnNpemVzKSkge1xuICAgICAgICAgIHBhcmVudC5zaXplcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9ybWFsaXplU3BsaXROb2RlKHBhcmVudCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBTcGxpdElmTmVjZXNzYXJ5KHJvb3QsIHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBwcml2YXRlIGRvY2tOb2RlQmVzaWRlKFxuICAgIHJvb3Q6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICB0YXJnZXROb2RlOiBEb2NrU3RhY2tOb2RlLFxuICAgIG5ld05vZGU6IERvY2tMYXlvdXROb2RlLFxuICAgIHpvbmU6IERyb3Bab25lLFxuICApOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gem9uZSA9PT0gJ2xlZnQnIHx8IHpvbmUgPT09ICdyaWdodCcgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnO1xuICAgIGNvbnN0IHBsYWNlQmVmb3JlID0gem9uZSA9PT0gJ2xlZnQnIHx8IHpvbmUgPT09ICd0b3AnO1xuICAgIGNvbnN0IHBhcmVudEluZm8gPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChyb290LCB0YXJnZXROb2RlKTtcblxuICAgIGlmIChwYXJlbnRJbmZvICYmIHBhcmVudEluZm8ucGFyZW50LmRpcmVjdGlvbiA9PT0gb3JpZW50YXRpb24pIHtcbiAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gcGxhY2VCZWZvcmUgPyBwYXJlbnRJbmZvLmluZGV4IDogcGFyZW50SW5mby5pbmRleCArIDE7XG4gICAgICBwYXJlbnRJbmZvLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIG5ld05vZGUpO1xuICAgICAgcGFyZW50SW5mby5wYXJlbnQuc2l6ZXMgPSB0aGlzLmluc2VydFdlaWdodChcbiAgICAgICAgcGFyZW50SW5mby5wYXJlbnQuc2l6ZXMsXG4gICAgICAgIGluc2VydEluZGV4LFxuICAgICAgICBwYXJlbnRJbmZvLnBhcmVudC5jaGlsZHJlbi5sZW5ndGgsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJvb3QgPz8gbmV3Tm9kZTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdDogRG9ja1NwbGl0Tm9kZSA9IHtcbiAgICAgIGtpbmQ6ICdzcGxpdCcsXG4gICAgICBkaXJlY3Rpb246IG9yaWVudGF0aW9uLFxuICAgICAgY2hpbGRyZW46IHBsYWNlQmVmb3JlID8gW25ld05vZGUsIHRhcmdldE5vZGVdIDogW3RhcmdldE5vZGUsIG5ld05vZGVdLFxuICAgICAgc2l6ZXM6IFswLjUsIDAuNV0sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnJlcGxhY2VOb2RlSW5UcmVlKHJvb3QsIHRhcmdldE5vZGUsIHNwbGl0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9yRWFjaFN0YWNrKFxuICAgIG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICB2aXNpdG9yOiAoc3RhY2s6IERvY2tTdGFja05vZGUsIHBhdGg6IG51bWJlcltdKSA9PiB2b2lkLFxuICAgIHBhdGg6IG51bWJlcltdID0gW10sXG4gICk6IHZvaWQge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLmtpbmQgPT09ICdzdGFjaycpIHtcbiAgICAgIHZpc2l0b3Iobm9kZSwgcGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+XG4gICAgICB0aGlzLmZvckVhY2hTdGFjayhjaGlsZCwgdmlzaXRvciwgWy4uLnBhdGgsIGluZGV4XSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFN0YWNrQ29udGFpbmluZ1BhbmUoXG4gICAgbm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgKTogRG9ja1N0YWNrTm9kZSB8IG51bGwge1xuICAgIGxldCByZXN1bHQ6IERvY2tTdGFja05vZGUgfCBudWxsID0gbnVsbDtcbiAgICB0aGlzLmZvckVhY2hTdGFjayhub2RlLCAoc3RhY2spID0+IHtcbiAgICAgIGlmICghcmVzdWx0ICYmIHN0YWNrLnBhbmVzLmluY2x1ZGVzKHBhbmUpKSB7XG4gICAgICAgIHJlc3VsdCA9IHN0YWNrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGZpbmRGaXJzdFBhbmVOYW1lKG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCBmb3VuZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgdGhpcy5mb3JFYWNoU3RhY2sobm9kZSwgKHN0YWNrKSA9PiB7XG4gICAgICBpZiAoZm91bmQgfHwgc3RhY2sucGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFjay5hY3RpdmVQYW5lICYmIHN0YWNrLnBhbmVzLmluY2x1ZGVzKHN0YWNrLmFjdGl2ZVBhbmUpKSB7XG4gICAgICAgIGZvdW5kID0gc3RhY2suYWN0aXZlUGFuZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvdW5kID0gc3RhY2sucGFuZXNbMF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0RmxvYXRpbmdQYW5lTWV0YWRhdGEoXG4gICAgbm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICApOiB7IHBhbmVzOiBzdHJpbmdbXTsgdGl0bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0ge1xuICAgIC8vIERlcHJlY2F0ZWQgbWV0aG9kIHJldGFpbmVkIHRlbXBvcmFyaWx5IGZvciBzaWduYXR1cmUgY29tcGF0aWJpbGl0eS5cbiAgICAvLyBVc2UgY29sbGVjdFBhbmVOYW1lcyBpbnN0ZWFkLlxuICAgIGNvbnN0IHBhbmVzID0gdGhpcy5jb2xsZWN0UGFuZU5hbWVzKG5vZGUpO1xuICAgIGNvbnN0IHRpdGxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHBhbmVzLmZvckVhY2goKHApID0+IHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLnRpdGxlc1twXTtcbiAgICAgIGlmICh0KSB7XG4gICAgICAgIHRpdGxlc1twXSA9IHQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFuZXMsIHRpdGxlcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0UGFuZU5hbWVzKG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYW5lczogc3RyaW5nW10gPSBbXTtcbiAgICB0aGlzLmZvckVhY2hTdGFjayhub2RlLCAoc3RhY2spID0+IHtcbiAgICAgIHN0YWNrLnBhbmVzLmZvckVhY2goKHBhbmUpID0+IHBhbmVzLnB1c2gocGFuZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBwYW5lcztcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplRmxvYXRpbmdMYXlvdXQoXG4gICAgbGF5b3V0OiBEb2NrRmxvYXRpbmdTdGFja0xheW91dCxcbiAgKTogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXQge1xuICAgIGNvbnN0IGJvdW5kcyA9IGxheW91dC5ib3VuZHMgPz8geyBsZWZ0OiAwLCB0b3A6IDAsIHdpZHRoOiAzMjAsIGhlaWdodDogMjAwIH07XG4gICAgY29uc3Qgbm9ybWFsaXplZEJvdW5kcyA9IHtcbiAgICAgIGxlZnQ6IE51bWJlci5pc0Zpbml0ZShib3VuZHMubGVmdCkgPyBib3VuZHMubGVmdCA6IDAsXG4gICAgICB0b3A6IE51bWJlci5pc0Zpbml0ZShib3VuZHMudG9wKSA/IGJvdW5kcy50b3AgOiAwLFxuICAgICAgd2lkdGg6IE51bWJlci5pc0Zpbml0ZShib3VuZHMud2lkdGgpID8gTWF0aC5tYXgoYm91bmRzLndpZHRoLCAxNjApIDogMzIwLFxuICAgICAgaGVpZ2h0OiBOdW1iZXIuaXNGaW5pdGUoYm91bmRzLmhlaWdodCkgPyBNYXRoLm1heChib3VuZHMuaGVpZ2h0LCAxMjApIDogMjAwLFxuICAgIH07XG5cbiAgICBjb25zdCByb290ID0gbGF5b3V0LnJvb3QgPyB0aGlzLmNsb25lTGF5b3V0Tm9kZShsYXlvdXQucm9vdCkgOiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBsYXlvdXQuaWQsXG4gICAgICBib3VuZHM6IG5vcm1hbGl6ZWRCb3VuZHMsXG4gICAgICB6SW5kZXg6IGxheW91dC56SW5kZXgsXG4gICAgICByb290LFxuICAgICAgYWN0aXZlUGFuZTogbGF5b3V0LmFjdGl2ZVBhbmUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGF0aChwYXRoOiBEb2NrUGF0aCk6IHN0cmluZyB7XG4gICAgaWYgKHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3Qgc3VmZml4ID1cbiAgICAgICAgcGF0aC5zZWdtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBgLyR7cGF0aC5zZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudG9TdHJpbmcoKSkuam9pbignLycpfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgcmV0dXJuIGBmOiR7cGF0aC5pbmRleH0ke3N1ZmZpeH1gO1xuICAgIH1cbiAgICBjb25zdCBzdWZmaXggPSBwYXRoLnNlZ21lbnRzLmpvaW4oJy8nKTtcbiAgICByZXR1cm4gc3VmZml4Lmxlbmd0aCA+IDAgPyBgZDoke3N1ZmZpeH1gIDogJ2Q6JztcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVQYXRoKHBhdGg6IERvY2tQYXRoKTogRG9ja1BhdGgge1xuICAgIGlmIChwYXRoLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmbG9hdGluZycsIGluZGV4OiBwYXRoLmluZGV4LCBzZWdtZW50czogWy4uLnBhdGguc2VnbWVudHNdIH07XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50czogWy4uLnBhdGguc2VnbWVudHNdIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogRG9ja1BhdGggfCBudWxsIHtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ2Y6JykpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHBhdGguc2xpY2UoMik7XG4gICAgICBjb25zdCBbaW5kZXhQYXJ0LCAuLi5zZWdtZW50UGFydHNdID0gcmVtYWluZGVyLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBpbmRleCA9IE51bWJlci5wYXJzZUludChpbmRleFBhcnQsIDEwKTtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGluZGV4KSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gc2VnbWVudFBhcnRzXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQubGVuZ3RoID4gMClcbiAgICAgICAgLm1hcCgoc2VnbWVudCkgPT4gTnVtYmVyLnBhcnNlSW50KHNlZ21lbnQsIDEwKSlcbiAgICAgICAgLmZpbHRlcigodmFsdWUpID0+IE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXgsIHNlZ21lbnRzIH07XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGguc3RhcnRzV2l0aCgnZDonKSA/IHBhdGguc2xpY2UoMikgOiBwYXRoO1xuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplZFxuICAgICAgLnNwbGl0KCcvJylcbiAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IE51bWJlci5wYXJzZUludChzZWdtZW50LCAxMCkpXG4gICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4geyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHMgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0aHNFcXVhbChhOiBEb2NrUGF0aCwgYjogRG9ja1BhdGgpOiBib29sZWFuIHtcbiAgICBpZiAoYS50eXBlICE9PSBiLnR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoYS50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBvdGhlciA9IGIgYXMgRXh0cmFjdDxEb2NrUGF0aCwgeyB0eXBlOiAnZmxvYXRpbmcnIH0+O1xuICAgICAgaWYgKGEuaW5kZXggIT09IG90aGVyLmluZGV4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChhLnNlZ21lbnRzLmxlbmd0aCAhPT0gb3RoZXIuc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhLnNlZ21lbnRzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBvdGhlci5zZWdtZW50c1tpbmRleF0pO1xuICAgIH1cblxuICAgIGNvbnN0IG90aGVyID0gYiBhcyBFeHRyYWN0PERvY2tQYXRoLCB7IHR5cGU6ICdkb2NrZWQnIH0+O1xuICAgIGlmIChhLnNlZ21lbnRzLmxlbmd0aCAhPT0gb3RoZXIuc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGEuc2VnbWVudHMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IG90aGVyLnNlZ21lbnRzW2luZGV4XSk7XG4gIH1cblxuICBwcml2YXRlIGlzT3JJc0FuY2VzdG9yT2YoYW5jZXN0b3I6IERvY2tQYXRoLCBkZXNjZW5kYW50OiBEb2NrUGF0aCk6IGJvb2xlYW4ge1xuICAgIGlmIChhbmNlc3Rvci50eXBlICE9PSBkZXNjZW5kYW50LnR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoYW5jZXN0b3IudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgaWYgKChkZXNjZW5kYW50IGFzIGFueSkuaW5kZXggIT09IGFuY2VzdG9yLmluZGV4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYW5jZXN0b3Iuc2VnbWVudHMubGVuZ3RoID4gZGVzY2VuZGFudC5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3Iuc2VnbWVudHMuZXZlcnkoKHNlZ21lbnQsIGkpID0+IHNlZ21lbnQgPT09IGRlc2NlbmRhbnQuc2VnbWVudHNbaV0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudFBhbmVzSW5UcmVlKG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCk6IG51bWJlciB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKG5vZGUua2luZCA9PT0gJ3N0YWNrJykge1xuICAgICAgcmV0dXJuIG5vZGUucGFuZXMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5yZWR1Y2UoKHRvdGFsLCBjaGlsZCkgPT4gdG90YWwgKyB0aGlzLmNvdW50UGFuZXNJblRyZWUoY2hpbGQpLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0YWNrTG9jYXRpb24ocGF0aDogRG9ja1BhdGgpOiBSZXNvbHZlZExvY2F0aW9uIHwgbnVsbCB7XG4gICAgaWYgKHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5mbG9hdGluZ0xheW91dHNbcGF0aC5pbmRleF07XG4gICAgICBpZiAoIWxheW91dCB8fCAhbGF5b3V0LnJvb3QpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQXRQYXRoKGxheW91dC5yb290LCBwYXRoLnNlZ21lbnRzKTtcbiAgICAgIGlmICghbm9kZSB8fCBub2RlLmtpbmQgIT09ICdzdGFjaycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb250ZXh0OiAnZmxvYXRpbmcnLCBpbmRleDogcGF0aC5pbmRleCwgcGF0aDogWy4uLnBhdGguc2VnbWVudHNdLCBub2RlIH07XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUF0UGF0aCh0aGlzLnJvb3RMYXlvdXQsIHBhdGguc2VnbWVudHMpO1xuICAgIGlmICghbm9kZSB8fCBub2RlLmtpbmQgIT09ICdzdGFjaycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvbnRleHQ6ICdkb2NrZWQnLCBwYXRoOiBbLi4ucGF0aC5zZWdtZW50c10sIG5vZGUgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGFuZUZyb21Mb2NhdGlvbihcbiAgICBsb2NhdGlvbjogUmVzb2x2ZWRMb2NhdGlvbixcbiAgICBwYW5lOiBzdHJpbmcsXG4gICAgc2tpcENsZWFudXAgPSBmYWxzZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGxvY2F0aW9uLmNvbnRleHQgPT09ICdkb2NrZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVQYW5lRnJvbVN0YWNrKGxvY2F0aW9uLm5vZGUsIHBhbmUsIHNraXBDbGVhbnVwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZW1vdmVQYW5lRnJvbUZsb2F0aW5nKGxvY2F0aW9uLmluZGV4LCBsb2NhdGlvbi5wYXRoLCBwYW5lLCBza2lwQ2xlYW51cCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFBhbmVUb0xvY2F0aW9uKGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lcyA9IGxvY2F0aW9uLm5vZGUucGFuZXM7XG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IHBhbmVzLmluZGV4T2YocGFuZSk7XG4gICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICBwYW5lcy5zcGxpY2UoZXhpc3RpbmdJbmRleCwgMSk7XG4gICAgfVxuICAgIHBhbmVzLnB1c2gocGFuZSk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZVBhbmVGb3JMb2NhdGlvbihsb2NhdGlvbjogUmVzb2x2ZWRMb2NhdGlvbiwgcGFuZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9jYXRpb24ubm9kZS5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICBpZiAobG9jYXRpb24uY29udGV4dCA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tsb2NhdGlvbi5pbmRleF07XG4gICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwTG9jYXRpb24obG9jYXRpb246IFJlc29sdmVkTG9jYXRpb24pOiB2b2lkIHtcbiAgICBpZiAobG9jYXRpb24uY29udGV4dCA9PT0gJ2RvY2tlZCcpIHtcbiAgICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuY2xlYW51cEVtcHR5U3RhY2tJblRyZWUodGhpcy5yb290TGF5b3V0LCBsb2NhdGlvbi5ub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tsb2NhdGlvbi5pbmRleF07XG4gICAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZmxvYXRpbmcucm9vdCA9IHRoaXMuY2xlYW51cEVtcHR5U3RhY2tJblRyZWUoZmxvYXRpbmcucm9vdCwgbG9jYXRpb24ubm9kZSk7XG4gICAgICBpZiAoIWZsb2F0aW5nLnJvb3QpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGbG9hdGluZ0F0KGxvY2F0aW9uLmluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlb3JkZXJQYW5lSW5Mb2NhdGlvbihsb2NhdGlvbjogUmVzb2x2ZWRMb2NhdGlvbiwgcGFuZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGFuZXMgPSBsb2NhdGlvbi5ub2RlLnBhbmVzO1xuICAgIGNvbnN0IGluZGV4ID0gcGFuZXMuaW5kZXhPZihwYW5lKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcGFuZXMucHVzaChwYW5lKTtcbiAgICBsb2NhdGlvbi5ub2RlLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XTtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUZsb2F0aW5nQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbG9hdGluZ0xheW91dHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmxvYXRpbmdMYXlvdXRzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBhbmVGcm9tRmxvYXRpbmcoXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXRoOiBudW1iZXJbXSxcbiAgICBwYW5lOiBzdHJpbmcsXG4gICAgc2tpcENsZWFudXAgPSBmYWxzZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZyB8fCAhZmxvYXRpbmcucm9vdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVBdFBhdGgoZmxvYXRpbmcucm9vdCwgcGF0aCk7XG4gICAgaWYgKCFub2RlIHx8IG5vZGUua2luZCAhPT0gJ3N0YWNrJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG5vZGUucGFuZXMgPSBub2RlLnBhbmVzLmZpbHRlcigocCkgPT4gcCAhPT0gcGFuZSk7XG4gICAgaWYgKCFub2RlLnBhbmVzLmluY2x1ZGVzKG5vZGUuYWN0aXZlUGFuZSA/PyAnJykpIHtcbiAgICAgIGlmIChub2RlLnBhbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZS5hY3RpdmVQYW5lID0gbm9kZS5wYW5lc1swXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBub2RlLmFjdGl2ZVBhbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZsb2F0aW5nLmFjdGl2ZVBhbmUgPT09IHBhbmUpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gdGhpcy5maW5kRmlyc3RQYW5lTmFtZShmbG9hdGluZy5yb290KTtcbiAgICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gZmFsbGJhY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZmxvYXRpbmcuYWN0aXZlUGFuZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5wYW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNraXBDbGVhbnVwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmbG9hdGluZy5yb290ID0gdGhpcy5jbGVhbnVwRW1wdHlTdGFja0luVHJlZShmbG9hdGluZy5yb290LCBub2RlKTtcbiAgICBpZiAoIWZsb2F0aW5nLnJvb3QpIHtcbiAgICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChpbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVNpemVzQXJyYXkoc2l6ZXM6IG51bWJlcltdIHwgdW5kZWZpbmVkLCBjb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNpemVzKSB8fCBzaXplcy5sZW5ndGggIT09IGNvdW50KSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gMSAvIGNvdW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gc2l6ZXMubWFwKCh2YWx1ZSkgPT4gKE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyBNYXRoLm1heCh2YWx1ZSwgMCkgOiAwKSk7XG4gICAgY29uc3QgdG90YWwgPSBub3JtYWxpemVkLnJlZHVjZSgoYWNjLCB2YWx1ZSkgPT4gYWNjICsgdmFsdWUsIDApO1xuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gMSAvIGNvdW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZC5tYXAoKHZhbHVlKSA9PiB2YWx1ZSAvIHRvdGFsKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplU3BsaXROb2RlKHNwbGl0OiBEb2NrU3BsaXROb2RlKTogdm9pZCB7XG4gICAgc3BsaXQuc2l6ZXMgPSB0aGlzLm5vcm1hbGl6ZVNpemVzQXJyYXkoc3BsaXQuc2l6ZXMsIHNwbGl0LmNoaWxkcmVuLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ2RvY2stbGF5b3V0LWNoYW5nZWQnLCB7XG4gICAgICAgIGRldGFpbDogdGhpcy5zbmFwc2hvdCxcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUxheW91dE5vZGUobGF5b3V0OiBEb2NrTGF5b3V0Tm9kZSk6IERvY2tMYXlvdXROb2RlO1xuICBwcml2YXRlIGNsb25lTGF5b3V0Tm9kZShsYXlvdXQ6IERvY2tMYXlvdXROb2RlIHwgbnVsbCk6IERvY2tMYXlvdXROb2RlIHwgbnVsbDtcbiAgcHJpdmF0ZSBjbG9uZUxheW91dE5vZGUobGF5b3V0OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwpOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGlmICghbGF5b3V0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsYXlvdXQpKSBhcyBEb2NrTGF5b3V0Tm9kZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVGbG9hdGluZ0FycmF5KFxuICAgIGxheW91dHM6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0W10sXG4gICk6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0W10ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxheW91dHMpKSBhcyBEb2NrRmxvYXRpbmdTdGFja0xheW91dFtdO1xuICB9XG59XG5cbmNvbnN0IHRhZ05hbWUgPSAnbWludC1kb2NrLW1hbmFnZXInO1xuXG5pZiAodHlwZW9mIGN1c3RvbUVsZW1lbnRzICE9PSAndW5kZWZpbmVkJyAmJiAhY3VzdG9tRWxlbWVudHMuZ2V0KHRhZ05hbWUpKSB7XG4gIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0YWdOYW1lLCBNaW50RG9ja01hbmFnZXJFbGVtZW50KTtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAnbWludC1kb2NrLW1hbmFnZXInOiBNaW50RG9ja01hbmFnZXJFbGVtZW50O1xuICB9XG59XG4iXX0=","import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, Input, Output, QueryList, ViewChild, } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { BsDockPaneComponent } from './dock-pane.component';\nimport { MintDockManagerElement } from '../web-components/mint-dock-manager.element';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nexport class BsDockManagerComponent {\n set layout(value) {\n const snapshot = this.cloneLayout(this.ensureSnapshot(value));\n this._layout = snapshot;\n this.layoutString = this.stringifyLayout(snapshot);\n this.applyLayout();\n }\n get layout() {\n if (!this._layout.root && this._layout.floating.length === 0) {\n return null;\n }\n return this.cloneLayout(this._layout);\n }\n constructor(changeDetector, documentRef) {\n this.changeDetector = changeDetector;\n this.layoutChange = new EventEmitter();\n this.layoutSnapshotChange = new EventEmitter();\n this.layoutString = null;\n this.panes = new QueryList();\n this.trackByPane = (_, pane) => pane.name;\n this._layout = { root: null, floating: [] };\n if (documentRef) {\n MintDockManagerElement.configureDocument(documentRef);\n }\n }\n ngAfterViewInit() {\n this.applyLayout();\n }\n captureLayout() {\n const element = this.managerRef?.nativeElement;\n return element?.snapshot ?? { root: null, floating: [] };\n }\n onLayoutChanged(event) {\n const snapshot = event.detail ?? {\n root: null,\n floating: [],\n };\n this._layout = this.cloneLayout(snapshot);\n this.layoutString = this.stringifyLayout(this._layout);\n this.layoutChange.emit(this.layout);\n this.layoutSnapshotChange.emit(this.cloneLayout(snapshot));\n this.changeDetector.markForCheck();\n }\n applyLayout() {\n if (!this.managerRef) {\n return;\n }\n const element = this.managerRef.nativeElement;\n const layout = this.layout;\n element.layout = layout ?? null;\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if ('kind' in value) {\n return { root: value, floating: [], titles: {} };\n }\n return {\n root: value.root ?? null,\n floating: Array.isArray(value.floating) ? [...value.floating] : [],\n titles: value.titles ? { ...value.titles } : {},\n };\n }\n stringifyLayout(layout) {\n if (!layout.root && layout.floating.length === 0) {\n return null;\n }\n return JSON.stringify(layout);\n }\n cloneLayout(layout) {\n return JSON.parse(JSON.stringify(layout));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockManagerComponent, isStandalone: false, selector: \"bs-dock-manager\", inputs: { layout: \"layout\" }, outputs: { layoutChange: \"layoutChange\", layoutSnapshotChange: \"layoutSnapshotChange\" }, queries: [{ propertyName: \"panes\", predicate: BsDockPaneComponent }], viewQueries: [{ propertyName: \"managerRef\", first: true, predicate: [\"manager\"], descendants: true, static: true }], ngImport: i0, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i1.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, decorators: [{\n type: Component,\n args: [{ selector: 'bs-dock-manager', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Document, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }], propDecorators: { layout: [{\n type: Input\n }], layoutChange: [{\n type: Output\n }], layoutSnapshotChange: [{\n type: Output\n }], panes: [{\n type: ContentChildren,\n args: [BsDockPaneComponent]\n }], managerRef: [{\n type: ViewChild,\n args: ['manager', { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQVNyRixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLElBQ0ksTUFBTSxDQUFDLEtBQXlDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJ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dGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRG9ja0xheW91dCxcbiAgRG9ja0xheW91dE5vZGUsXG4gIERvY2tMYXlvdXRTbmFwc2hvdCxcbn0gZnJvbSAnLi4vdHlwZXMvZG9jay1sYXlvdXQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vZG9jay1wYW5lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNaW50RG9ja01hbmFnZXJFbGVtZW50IH0gZnJvbSAnLi4vd2ViLWNvbXBvbmVudHMvbWludC1kb2NrLW1hbmFnZXIuZWxlbWVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stbWFuYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpXG4gIHNldCBsYXlvdXQodmFsdWU6IERvY2tMYXlvdXROb2RlIHwgRG9ja0xheW91dCB8IG51bGwpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuY2xvbmVMYXlvdXQodGhpcy5lbnN1cmVTbmFwc2hvdCh2YWx1ZSkpO1xuICAgIHRoaXMuX2xheW91dCA9IHNuYXBzaG90O1xuICAgIHRoaXMubGF5b3V0U3RyaW5nID0gdGhpcy5zdHJpbmdpZnlMYXlvdXQoc25hcHNob3QpO1xuICAgIHRoaXMuYXBwbHlMYXlvdXQoKTtcbiAgfVxuICBnZXQgbGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5fbGF5b3V0LnJvb3QgJiYgdGhpcy5fbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lTGF5b3V0KHRoaXMuX2xheW91dCk7XG4gIH1cblxuICBAT3V0cHV0KCkgbGF5b3V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEb2NrTGF5b3V0U25hcHNob3QgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgbGF5b3V0U25hcHNob3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERvY2tMYXlvdXRTbmFwc2hvdD4oKTtcblxuICBsYXlvdXRTdHJpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQnNEb2NrUGFuZUNvbXBvbmVudCkgcGFuZXM6IFF1ZXJ5TGlzdDxCc0RvY2tQYW5lQ29tcG9uZW50PiA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgQFZpZXdDaGlsZCgnbWFuYWdlcicsIHsgc3RhdGljOiB0cnVlIH0pIG1hbmFnZXJSZWYhOiBFbGVtZW50UmVmPE1pbnREb2NrTWFuYWdlckVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5UGFuZSA9IChfOiBudW1iZXIsIHBhbmU6IEJzRG9ja1BhbmVDb21wb25lbnQpID0+IHBhbmUubmFtZTtcblxuICBwcml2YXRlIF9sYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCA9IHsgcm9vdDogbnVsbCwgZmxvYXRpbmc6IFtdIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnRSZWY6IERvY3VtZW50LFxuICApIHtcbiAgICBpZiAoZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuY29uZmlndXJlRG9jdW1lbnQoZG9jdW1lbnRSZWYpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5TGF5b3V0KCk7XG4gIH1cblxuICBjYXB0dXJlTGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMubWFuYWdlclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWxlbWVudD8uc25hcHNob3QgPz8geyByb290OiBudWxsLCBmbG9hdGluZzogW10gfTtcbiAgfVxuXG4gIG9uTGF5b3V0Q2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9XG4gICAgICAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8RG9ja0xheW91dFNuYXBzaG90PikuZGV0YWlsID8/IHtcbiAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgZmxvYXRpbmc6IFtdLFxuICAgICAgfTtcbiAgICB0aGlzLl9sYXlvdXQgPSB0aGlzLmNsb25lTGF5b3V0KHNuYXBzaG90KTtcbiAgICB0aGlzLmxheW91dFN0cmluZyA9IHRoaXMuc3RyaW5naWZ5TGF5b3V0KHRoaXMuX2xheW91dCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2UuZW1pdCh0aGlzLmxheW91dCk7XG4gICAgdGhpcy5sYXlvdXRTbmFwc2hvdENoYW5nZS5lbWl0KHRoaXMuY2xvbmVMYXlvdXQoc25hcHNob3QpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUxheW91dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFuYWdlclJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm1hbmFnZXJSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheW91dDtcbiAgICBlbGVtZW50LmxheW91dCA9IGxheW91dCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTbmFwc2hvdChcbiAgICB2YWx1ZTogRG9ja0xheW91dE5vZGUgfCBEb2NrTGF5b3V0IHwgbnVsbCxcbiAgKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiBudWxsLCBmbG9hdGluZzogW10sIHRpdGxlczoge30gfTtcbiAgICB9XG5cbiAgICBpZiAoJ2tpbmQnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiB2YWx1ZSwgZmxvYXRpbmc6IFtdLCB0aXRsZXM6IHt9IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IHZhbHVlLnJvb3QgPz8gbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBBcnJheS5pc0FycmF5KHZhbHVlLmZsb2F0aW5nKSA/IFsuLi52YWx1ZS5mbG9hdGluZ10gOiBbXSxcbiAgICAgIHRpdGxlczogdmFsdWUudGl0bGVzID8geyAuLi52YWx1ZS50aXRsZXMgfSA6IHt9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ2lmeUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghbGF5b3V0LnJvb3QgJiYgbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShsYXlvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGF5b3V0KSkgYXMgRG9ja0xheW91dFNuYXBzaG90O1xuICB9XG59XG4iLCI8bWludC1kb2NrLW1hbmFnZXJcbiAgI21hbmFnZXJcbiAgY2xhc3M9XCJicy1kb2NrLW1hbmFnZXJcIlxuICBbYXR0ci5sYXlvdXRdPVwibGF5b3V0U3RyaW5nXCJcbiAgKGRvY2stbGF5b3V0LWNoYW5nZWQpPVwib25MYXlvdXRDaGFuZ2VkKCRldmVudClcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lIG9mIHBhbmVzOyB0cmFja0J5OiB0cmFja0J5UGFuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJicy1kb2NrLXBhbmVcIiBbYXR0ci5zbG90XT1cInBhbmUubmFtZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhbmUudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L21pbnQtZG9jay1tYW5hZ2VyPlxuIl19","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BsDockManagerComponent } from './components/dock-manager.component';\nimport { BsDockPaneComponent } from './components/dock-pane.component';\nimport * as i0 from \"@angular/core\";\nexport class BsDockModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, declarations: [BsDockManagerComponent, BsDockPaneComponent], imports: [CommonModule], exports: [BsDockManagerComponent, BsDockPaneComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, imports: [CommonModule] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [BsDockManagerComponent, BsDockPaneComponent],\n imports: [CommonModule],\n exports: [BsDockManagerComponent, BsDockPaneComponent],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL2RvY2svc3JjL2xpYi9kb2NrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFRdkUsTUFBTSxPQUFPLFlBQVk7OEdBQVosWUFBWTsrR0FBWixZQUFZLGlCQUxSLHNCQUFzQixFQUFFLG1CQUFtQixhQUNoRCxZQUFZLGFBQ1osc0JBQXNCLEVBQUUsbUJBQW1COytHQUcxQyxZQUFZLFlBSmIsWUFBWTs7MkZBSVgsWUFBWTtrQkFOeEIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDM0QsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDdEQsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2RvY2stbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kb2NrLXBhbmUuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgQnNEb2NrTW9kdWxlIHt9XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludHBsYXllci1uZy1ib290c3RyYXAtZG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9taW50cGxheWVyLW5nLWJvb3RzdHJhcC1kb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":";;;;;AAEO,MAAM,mBAAmB,CAAC;AACjC,IAAI,kBAAkB,GAAG;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACxB,YAAY,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;AAC3E;AACA;AACA,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AACrL,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,oDAAoD,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACra;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AAC7H,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,QAAQ,EAAE,cAAc;AAC5C,oBAAoB,QAAQ,EAAE,CAAC,oDAAoD,CAAC;AACpF,oBAAoB,UAAU,EAAE,KAAK;AACrC,iBAAiB;AACjB,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;AACrC,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;AACxB,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC3B,gBAAgB,IAAI,EAAE,SAAS;AAC/B,gBAAgB,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;AACpD,aAAa,CAAC,EAAE,EAAE,CAAC;;ACzBnB,MAAM,YAAY,GAAG;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,IAAI,cAAc,GAAG,IAAI;AACzB,IAAI,sBAAsB,GAAG,IAAI;AACjC,SAAS,cAAc,CAAC,WAAW,EAAE;AACrC,IAAI,IAAI,CAAC,cAAc,IAAI,sBAAsB,KAAK,WAAW,EAAE;AACnE,QAAQ,cAAc,GAAG,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC;AAC9D,QAAQ,cAAc,CAAC,SAAS,GAAG,YAAY;AAC/C,QAAQ,sBAAsB,GAAG,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"}