@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
245 lines • 33.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ElementRef } from '@angular/core';
import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator';
import { SmeResponsiveWindowBreakpoints, SmeResponsiveWindowManagerComponent } from '../common/sme-responsive-window-manager.component';
export class SplitViewResponsiveWindowManager extends SmeResponsiveWindowManagerComponent {
constructor() {
super(...arguments);
this.name = 'sme-split-view';
/**
* The orientation parameter last set from the resizer component.
*/
this.previousOrientation = 'bottom';
this.splitViewResizerPresetMargin = {
Reflow: {
lower: undefined,
upper: undefined
},
PhoneDown: {
lower: undefined,
upper: undefined
},
PhoneUp: {
lower: 100,
upper: 100
}
};
this.splitViewResizerPresetPaneDistance = {
Reflow: undefined,
PhoneDown: undefined,
PhoneUp: 200
};
this.smeSplitViewClassList = {
phoneUp: ['sme-arrange-stack-v', 'sme-layout-absolute', 'sme-position-inset-none', 'sme-arrange-overflow-hide'],
phoneDown: ['sme-position-flex-none', 'sme-layout-relative'],
reflow: ['sme-position-flex-none', 'sme-layout-relative']
};
this.smeSplitViewPaneClassList = {
phoneUp: [],
phoneDown: ['sme-position-flex-none', 'sme-layout-relative'],
reflow: ['sme-position-flex-none', 'sme-layout-relative']
};
this.smeSplitViewContentClassList = {
phoneUp: [],
phoneDown: ['sme-position-flex-none', 'sme-layout-relative'],
reflow: ['sme-position-flex-none', 'sme-layout-relative']
};
this.smeSplitViewContentContainerClassList = {
phoneUp: ['sme-arrange-overflow-auto'],
phoneDown: [],
reflow: []
};
this.smeSplitViewPaneContainerClassList = {
phoneUp: ['sme-arrange-overflow-auto'],
phoneDown: [],
reflow: []
};
}
/**
* Getter for orientation.
*/
get orientation() {
if (this.cssV2) {
const size = this.prevSize;
// before responsive window manager initialization
if (!size) {
return this.previousOrientation;
}
if ([SmeResponsiveWindowBreakpoints.Reflow, SmeResponsiveWindowBreakpoints.PhoneDown].includes(size.size)) {
if (this.previousOrientation === 'left') {
return 'top';
}
if (this.previousOrientation === 'right') {
return 'bottom';
}
}
}
return this.previousOrientation;
}
paneDistance(currentPaneDistance) {
if (this?.cssV2) {
const size = this.prevSize;
if (!size) {
return currentPaneDistance;
}
switch (size.size) {
case SmeResponsiveWindowBreakpoints.Reflow:
return this.splitViewResizerPresetPaneDistance.Reflow;
case SmeResponsiveWindowBreakpoints.PhoneDown:
return this.splitViewResizerPresetPaneDistance.PhoneDown;
case SmeResponsiveWindowBreakpoints.PhoneUp:
default:
return currentPaneDistance;
}
}
return currentPaneDistance;
}
splitViewResizerMargin(presetLower, presetUpper) {
if (!presetLower) {
presetLower = this.splitViewResizerPresetMargin.PhoneUp.lower;
}
if (!presetUpper) {
presetUpper = this.splitViewResizerPresetMargin.PhoneUp.upper;
}
if (!this || !this.cssV2) {
return this.splitViewResizerMarginPhoneUp(presetLower, presetUpper);
}
switch (this.size) {
case SmeResponsiveWindowBreakpoints.Reflow:
return this.splitViewResizerPresetMargin.Reflow;
case SmeResponsiveWindowBreakpoints.PhoneDown:
return this.splitViewResizerPresetMargin.PhoneDown;
case SmeResponsiveWindowBreakpoints.PhoneUp:
return this.splitViewResizerMarginPhoneUp(presetLower, presetUpper);
}
}
/**
* Split view on window size changed event.
* @param contentContainer section class relative under sme-split-view wrapped with content
* @param paneContainer section class relative under sme-split-view wrapped with pane
* @returns void
*/
onWindowSizeChanged(contentContainer, paneContainer) {
if (!this.cssV2) {
return;
}
if (!contentContainer || !paneContainer) {
return;
}
const splitViewElement = contentContainer.nativeElement.parentElement;
if (!splitViewElement || splitViewElement.tagName.toLocaleLowerCase() !== 'sme-split-view') {
return;
}
const splitViewPane = paneContainer.nativeElement.querySelector('sme-split-view-pane');
if (!splitViewPane) {
return;
}
const splitViewContent = contentContainer.nativeElement.querySelector('sme-split-view-content');
if (!splitViewContent) {
return;
}
// Do not mess up with the side nav
if (paneContainer.nativeElement.querySelector('nav[role="navigation"]')) {
return;
}
const size = this.prevSize;
// Calculates the height for the master view component.
if (!size.phoneDown && !size.reflowMode) {
if (contentContainer) {
this.updateClassArrayOnWindowSize(this.smeSplitViewContentContainerClassList, 'phoneUp', contentContainer.nativeElement);
}
if (paneContainer) {
this.updateClassArrayOnWindowSize(this.smeSplitViewPaneContainerClassList, 'phoneUp', paneContainer.nativeElement);
}
if (splitViewElement) {
this.updateClassArrayOnWindowSize(this.smeSplitViewClassList, 'phoneUp', splitViewElement);
}
if (splitViewPane) {
this.updateClassArrayOnWindowSize(this.smeSplitViewPaneClassList, 'phoneUp', splitViewPane);
}
if (splitViewContent) {
this.updateClassArrayOnWindowSize(this.smeSplitViewContentClassList, 'phoneUp', splitViewContent);
}
}
else if (size.phoneDown) {
if (contentContainer) {
this.updateClassArrayOnWindowSize(this.smeSplitViewContentContainerClassList, 'phoneDown', contentContainer.nativeElement);
}
if (paneContainer) {
this.updateClassArrayOnWindowSize(this.smeSplitViewPaneContainerClassList, 'phoneDown', paneContainer.nativeElement);
}
if (splitViewElement) {
this.updateClassArrayOnWindowSize(this.smeSplitViewClassList, 'phoneDown', splitViewElement);
}
if (splitViewPane) {
this.updateClassArrayOnWindowSize(this.smeSplitViewPaneClassList, 'phoneDown', splitViewPane);
}
if (splitViewContent) {
this.updateClassArrayOnWindowSize(this.smeSplitViewContentClassList, 'phoneDown', splitViewContent);
}
}
else if (size.reflowMode) {
if (contentContainer) {
this.updateClassArrayOnWindowSize(this.smeSplitViewContentContainerClassList, 'reflow', contentContainer.nativeElement);
}
if (paneContainer) {
this.updateClassArrayOnWindowSize(this.smeSplitViewPaneContainerClassList, 'reflow', paneContainer.nativeElement);
}
if (splitViewElement) {
this.updateClassArrayOnWindowSize(this.smeSplitViewClassList, 'reflow', splitViewElement);
}
if (splitViewPane) {
this.updateClassArrayOnWindowSize(this.smeSplitViewPaneClassList, 'reflow', splitViewPane);
}
if (splitViewContent) {
this.updateClassArrayOnWindowSize(this.smeSplitViewContentClassList, 'reflow', splitViewContent);
}
}
}
/**
* Returns the section wrapped the split view content or pane
* @param children the children html content for selection
* @param type either it is pane or content
* @returns the split view content or pane sections
*/
getPaneContext(children, type) {
if (!['sme-split-view-content', 'sme-split-view-pane'].includes(type)) {
return;
}
let result;
for (let i = 0; i < children.length; i++) {
if (children[i] && children[i].tagName && children[i].tagName.toLowerCase() === 'section') {
// Finds the nearest and return.
const target = children[i].querySelector(type);
if (target) {
result = {
nativeElement: children[i]
};
break;
}
}
}
return result;
}
splitViewResizerMarginPhoneUp(presetLower, presetUpper) {
let res;
if (presetLower === this.splitViewResizerPresetMargin.PhoneUp.lower &&
presetUpper === this.splitViewResizerPresetMargin.PhoneUp.upper) {
res = this.splitViewResizerPresetMargin.PhoneUp;
}
else {
res = {
lower: presetLower,
upper: presetUpper
};
}
return res;
}
}
__decorate([
Yield(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [ElementRef, ElementRef]),
__metadata("design:returntype", void 0)
], SplitViewResponsiveWindowManager.prototype, "onWindowSizeChanged", null);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtdmlldy1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc3BsaXQtdmlldy9zcGxpdC12aWV3LXJlc3BvbnNpdmUtd2luZG93LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSw4QkFBOEIsRUFDbkMsbUNBQW1DLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQU9uRyxNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsbUNBQW1DO0lBQXpGOztRQUNvQixTQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDeEM7O1dBRUc7UUFDSSx3QkFBbUIsR0FBRyxRQUFRLENBQUM7UUEwQm5CLGlDQUE0QixHQUFHO1lBQzlDLE1BQU0sRUFBRTtnQkFDSixLQUFLLEVBQUUsU0FBUztnQkFDaEIsS0FBSyxFQUFFLFNBQVM7YUFDbkI7WUFDRCxTQUFTLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLEtBQUssRUFBRSxTQUFTO2FBQ25CO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLEtBQUssRUFBRSxHQUFHO2dCQUNWLEtBQUssRUFBRSxHQUFHO2FBQ2I7U0FDSixDQUFDO1FBRWlCLHVDQUFrQyxHQUFHO1lBQ3BELE1BQU0sRUFBRSxTQUFTO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLE9BQU8sRUFBRSxHQUFHO1NBQ2YsQ0FBQztRQUVNLDBCQUFxQixHQUFHO1lBQzVCLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixDQUFDO1lBQy9HLFNBQVMsRUFBRSxDQUFDLHdCQUF3QixFQUFFLHFCQUFxQixD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Q3JCLENBQUM7U0FDTDtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUNKO0FBdkpHO0lBQUMsS0FBSyxFQUFFOztxQ0FDcUMsVUFBVSxFQUFpQixVQUFVOzsyRUF5R2pGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cyxcclxuICAgIFNtZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL3NtZS1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0Vmlld1Jlc2l6ZXJNYXJnaW4ge1xyXG4gICAgbG93ZXI6IG51bWJlcjtcclxuICAgIHVwcGVyOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTcGxpdFZpZXdSZXNwb25zaXZlV2luZG93TWFuYWdlciBleHRlbmRzIFNtZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyByZWFkb25seSBuYW1lID0gJ3NtZS1zcGxpdC12aWV3JztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9yaWVudGF0aW9uIHBhcmFtZXRlciBsYXN0IHNldCBmcm9tIHRoZSByZXNpemVyIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHByZXZpb3VzT3JpZW50YXRpb24gPSAnYm90dG9tJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHRlciBmb3Igb3JpZW50YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgb3JpZW50YXRpb24oKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodGhpcy5jc3NWMikge1xyXG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcmV2U2l6ZTtcclxuICAgICAgICAgICAgLy8gYmVmb3JlIHJlc3BvbnNpdmUgd2luZG93IG1hbmFnZXIgaW5pdGlhbGl6YXRpb25cclxuICAgICAgICAgICAgaWYgKCFzaXplKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91c09yaWVudGF0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoW1NtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5SZWZsb3csIFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5QaG9uZURvd25dLmluY2x1ZGVzKHNpemUuc2l6ZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzT3JpZW50YXRpb24gPT09ICdsZWZ0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9wJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzT3JpZW50YXRpb24gPT09ICdyaWdodCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2JvdHRvbSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzT3JpZW50YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNwbGl0Vmlld1Jlc2l6ZXJQcmVzZXRNYXJnaW4gPSB7XHJcbiAgICAgICAgUmVmbG93OiB7XHJcbiAgICAgICAgICAgIGxvd2VyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVwcGVyOiB1bmRlZmluZWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIFBob25lRG93bjoge1xyXG4gICAgICAgICAgICBsb3dlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1cHBlcjogdW5kZWZpbmVkXHJcbiAgICAgICAgfSxcclxuICAgICAgICBQaG9uZVVwOiB7XHJcbiAgICAgICAgICAgIGxvd2VyOiAxMDAsXHJcbiAgICAgICAgICAgIHVwcGVyOiAxMDBcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBzcGxpdFZpZXdSZXNpemVyUHJlc2V0UGFuZURpc3RhbmNlID0ge1xyXG4gICAgICAgIFJlZmxvdzogdW5kZWZpbmVkLFxyXG4gICAgICAgIFBob25lRG93bjogdW5kZWZpbmVkLFxyXG4gICAgICAgIFBob25lVXA6IDIwMFxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHNtZVNwbGl0Vmlld0NsYXNzTGlzdCA9IHtcclxuICAgICAgICBwaG9uZVVwOiBbJ3NtZS1hcnJhbmdlLXN0YWNrLXYnLCAnc21lLWxheW91dC1hYnNvbHV0ZScsICdzbWUtcG9zaXRpb24taW5zZXQtbm9uZScsICdzbWUtYXJyYW5nZS1vdmVyZmxvdy1oaWRlJ10sXHJcbiAgICAgICAgcGhvbmVEb3duOiBbJ3NtZS1wb3NpdGlvbi1mbGV4LW5vbmUnLCAnc21lLWxheW91dC1yZWxhdGl2ZSddLFxyXG4gICAgICAgIHJlZmxvdzogWydzbWUtcG9zaXRpb24tZmxleC1ub25lJywgJ3NtZS1sYXlvdXQtcmVsYXRpdmUnXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHNtZVNwbGl0Vmlld1BhbmVDbGFzc0xpc3QgPSB7XHJcbiAgICAgICAgcGhvbmVVcDogW10sXHJcbiAgICAgICAgcGhvbmVEb3duOiBbJ3NtZS1wb3NpdGlvbi1mbGV4LW5vbmUnLCAnc21lLWxheW91dC1yZWxhdGl2ZSddLFxyXG4gICAgICAgIHJlZmxvdzogWydzbWUtcG9zaXRpb24tZmxleC1ub25lJywgJ3NtZS1sYXlvdXQtcmVsYXRpdmUnXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHNtZVNwbGl0Vmlld0NvbnRlbnRDbGFzc0xpc3QgPSB7XHJcbiAgICAgICAgcGhvbmVVcDogW10sXHJcbiAgICAgICAgcGhvbmVEb3duOiBbJ3NtZS1wb3NpdGlvbi1mbGV4LW5vbmUnLCAnc21lLWxheW91dC1yZWxhdGl2ZSddLFxyXG4gICAgICAgIHJlZmxvdzogWydzbWUtcG9zaXRpb24tZmxleC1ub25lJywgJ3NtZS1sYXlvdXQtcmVsYXRpdmUnXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHNtZVNwbGl0Vmlld0NvbnRlbnRDb250YWluZXJDbGFzc0xpc3QgPSB7XHJcbiAgICAgICAgcGhvbmVVcDogWydzbWUtYXJyYW5nZS1vdmVyZmxvdy1hdXRvJ10sXHJcbiAgICAgICAgcGhvbmVEb3duOiBbXSxcclxuICAgICAgICByZWZsb3c6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgc21lU3BsaXRWaWV3UGFuZUNvbnRhaW5lckNsYXNzTGlzdCA9IHtcclxuICAgICAgICBwaG9uZVVwOiBbJ3NtZS1hcnJhbmdlLW92ZXJmbG93LWF1dG8nXSxcclxuICAgICAgICBwaG9uZURvd246IFtdLFxyXG4gICAgICAgIHJlZmxvdzogW11cclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIHBhbmVEaXN0YW5jZShjdXJyZW50UGFuZURpc3RhbmNlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzPy5jc3NWMikge1xyXG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcmV2U2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICghc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYW5lRGlzdGFuY2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoc2l6ZS5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5SZWZsb3c6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRWaWV3UmVzaXplclByZXNldFBhbmVEaXN0YW5jZS5SZWZsb3c7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5QaG9uZURvd246XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRWaWV3UmVzaXplclByZXNldFBhbmVEaXN0YW5jZS5QaG9uZURvd247XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5QaG9uZVVwOlxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFBhbmVEaXN0YW5jZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYW5lRGlzdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNwbGl0Vmlld1Jlc2l6ZXJNYXJnaW4ocHJlc2V0TG93ZXI6IG51bWJlciwgcHJlc2V0VXBwZXI6IG51bWJlcik6IFNwbGl0Vmlld1Jlc2l6ZXJNYXJnaW4ge1xyXG4gICAgICAgIGlmICghcHJlc2V0TG93ZXIpIHtcclxuICAgICAgICAgICAgcHJlc2V0TG93ZXIgPSB0aGlzLnNwbGl0Vmlld1Jlc2l6ZXJQcmVzZXRNYXJnaW4uUGhvbmVVcC5sb3dlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcHJlc2V0VXBwZXIpIHtcclxuICAgICAgICAgICAgcHJlc2V0VXBwZXIgPSB0aGlzLnNwbGl0Vmlld1Jlc2l6ZXJQcmVzZXRNYXJnaW4uUGhvbmVVcC51cHBlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5jc3NWMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpdFZpZXdSZXNpemVyTWFyZ2luUGhvbmVVcChwcmVzZXRMb3dlciwgcHJlc2V0VXBwZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnNpemUpIHtcclxuICAgICAgICAgICAgY2FzZSBTbWVSZXNwb25zaXZlV2luZG93QnJlYWtwb2ludHMuUmVmbG93OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRWaWV3UmVzaXplclByZXNldE1hcmdpbi5SZWZsb3c7XHJcbiAgICAgICAgICAgIGNhc2UgU21lUmVzcG9uc2l2ZVdpbmRvd0JyZWFrcG9pbnRzLlBob25lRG93bjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0Vmlld1Jlc2l6ZXJQcmVzZXRNYXJnaW4uUGhvbmVEb3duO1xyXG4gICAgICAgICAgICBjYXNlIFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5QaG9uZVVwOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRWaWV3UmVzaXplck1hcmdpblBob25lVXAocHJlc2V0TG93ZXIsIHByZXNldFVwcGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGxpdCB2aWV3IG9uIHdpbmRvdyBzaXplIGNoYW5nZWQgZXZlbnQuXHJcbiAgICAgKiBAcGFyYW0gY29udGVudENvbnRhaW5lciBzZWN0aW9uIGNsYXNzIHJlbGF0aXZlIHVuZGVyIHNtZS1zcGxpdC12aWV3IHdyYXBwZWQgd2l0aCBjb250ZW50XHJcbiAgICAgKiBAcGFyYW0gcGFuZUNvbnRhaW5lciBzZWN0aW9uIGNsYXNzIHJlbGF0aXZlIHVuZGVyIHNtZS1zcGxpdC12aWV3IHdyYXBwZWQgd2l0aCBwYW5lXHJcbiAgICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICAgKi9cclxuICAgIEBZaWVsZCgpXHJcbiAgICBwdWJsaWMgb25XaW5kb3dTaXplQ2hhbmdlZChjb250ZW50Q29udGFpbmVyOiBFbGVtZW50UmVmLCBwYW5lQ29udGFpbmVyOiBFbGVtZW50UmVmKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNzc1YyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29udGVudENvbnRhaW5lciB8fCAhcGFuZUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzcGxpdFZpZXdFbGVtZW50ID0gY29udGVudENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCFzcGxpdFZpZXdFbGVtZW50IHx8IHNwbGl0Vmlld0VsZW1lbnQudGFnTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpICE9PSAnc21lLXNwbGl0LXZpZXcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNwbGl0Vmlld1BhbmUgPSBwYW5lQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignc21lLXNwbGl0LXZpZXctcGFuZScpO1xyXG4gICAgICAgIGlmICghc3BsaXRWaWV3UGFuZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzcGxpdFZpZXdDb250ZW50ID0gY29udGVudENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NtZS1zcGxpdC12aWV3LWNvbnRlbnQnKTtcclxuICAgICAgICBpZiAoIXNwbGl0Vmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRG8gbm90IG1lc3MgdXAgd2l0aCB0aGUgc2lkZSBuYXZcclxuICAgICAgICBpZiAocGFuZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdltyb2xlPVwibmF2aWdhdGlvblwiXScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByZXZTaXplO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGVzIHRoZSBoZWlnaHQgZm9yIHRoZSBtYXN0ZXIgdmlldyBjb21wb25lbnQuXHJcbiAgICAgICAgaWYgKCFzaXplLnBob25lRG93biAmJiAhc2l6ZS5yZWZsb3dNb2RlKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3Q29udGVudENvbnRhaW5lckNsYXNzTGlzdCwgJ3Bob25lVXAnLCBjb250ZW50Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFuZUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3UGFuZUNvbnRhaW5lckNsYXNzTGlzdCwgJ3Bob25lVXAnLCBwYW5lQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc3BsaXRWaWV3RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3Q2xhc3NMaXN0LCAncGhvbmVVcCcsIHNwbGl0Vmlld0VsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc3BsaXRWaWV3UGFuZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3UGFuZUNsYXNzTGlzdCwgJ3Bob25lVXAnLCBzcGxpdFZpZXdQYW5lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNwbGl0Vmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZVNwbGl0Vmlld0NvbnRlbnRDbGFzc0xpc3QsICdwaG9uZVVwJywgc3BsaXRWaWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHNpemUucGhvbmVEb3duKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzQXJyYXlPbldpbmRvd1NpemUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWVTcGxpdFZpZXdDb250ZW50Q29udGFpbmVyQ2xhc3NMaXN0LCAncGhvbmVEb3duJywgY29udGVudENvbnRhaW5lci5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhbmVDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZVNwbGl0Vmlld1BhbmVDb250YWluZXJDbGFzc0xpc3QsICdwaG9uZURvd24nLCBwYW5lQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc3BsaXRWaWV3RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3Q2xhc3NMaXN0LCAncGhvbmVEb3duJywgc3BsaXRWaWV3RWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNwbGl0Vmlld1BhbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZVNwbGl0Vmlld1BhbmVDbGFzc0xpc3QsICdwaG9uZURvd24nLCBzcGxpdFZpZXdQYW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3BsaXRWaWV3Q29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3Q29udGVudENsYXNzTGlzdCwgJ3Bob25lRG93bicsIHNwbGl0Vmlld0NvbnRlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChzaXplLnJlZmxvd01vZGUpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NBcnJheU9uV2luZG93U2l6ZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtZVNwbGl0Vmlld0NvbnRlbnRDb250YWluZXJDbGFzc0xpc3QsICdyZWZsb3cnLCBjb250ZW50Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFuZUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3UGFuZUNvbnRhaW5lckNsYXNzTGlzdCwgJ3JlZmxvdycsIHBhbmVDb250YWluZXIubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzcGxpdFZpZXdFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzQXJyYXlPbldpbmRvd1NpemUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWVTcGxpdFZpZXdDbGFzc0xpc3QsICdyZWZsb3cnLCBzcGxpdFZpZXdFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3BsaXRWaWV3UGFuZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc0FycmF5T25XaW5kb3dTaXplKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21lU3BsaXRWaWV3UGFuZUNsYXNzTGlzdCwgJ3JlZmxvdycsIHNwbGl0Vmlld1BhbmUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzcGxpdFZpZXdDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzQXJyYXlPbldpbmRvd1NpemUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWVTcGxpdFZpZXdDb250ZW50Q2xhc3NMaXN0LCAncmVmbG93Jywgc3BsaXRWaWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzZWN0aW9uIHdyYXBwZWQgdGhlIHNwbGl0IHZpZXcgY29udGVudCBvciBwYW5lXHJcbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gdGhlIGNoaWxkcmVuIGh0bWwgY29udGVudCBmb3Igc2VsZWN0aW9uXHJcbiAgICAgKiBAcGFyYW0gdHlwZSBlaXRoZXIgaXQgaXMgcGFuZSBvciBjb250ZW50XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgc3BsaXQgdmlldyBjb250ZW50IG9yIHBhbmUgc2VjdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBhbmVDb250ZXh0KGNoaWxkcmVuOiBIVE1MQ29sbGVjdGlvbiwgdHlwZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFbJ3NtZS1zcGxpdC12aWV3LWNvbnRlbnQnLCAnc21lLXNwbGl0LXZpZXctcGFuZSddLmluY2x1ZGVzKHR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IEVsZW1lbnRSZWY7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gJiYgY2hpbGRyZW5baV0udGFnTmFtZSAmJiBjaGlsZHJlbltpXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzZWN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgLy8gRmluZHMgdGhlIG5lYXJlc3QgYW5kIHJldHVybi5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGNoaWxkcmVuW2ldLnF1ZXJ5U2VsZWN0b3IodHlwZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDxFbGVtZW50UmVmPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRWxlbWVudDogY2hpbGRyZW5baV1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3BsaXRWaWV3UmVzaXplck1hcmdpblBob25lVXAocHJlc2V0TG93ZXI6IG51bWJlciwgcHJlc2V0VXBwZXI6IG51bWJlcikge1xyXG4gICAgICAgIGxldCByZXM6IFNwbGl0Vmlld1Jlc2l6ZXJNYXJnaW47XHJcbiAgICAgICAgaWYgKHByZXNldExvd2VyID09PSB0aGlzLnNwbGl0Vmlld1Jlc2l6ZXJQcmVzZXRNYXJnaW4uUGhvbmVVcC5sb3dlciAmJlxyXG4gICAgICAgICAgICBwcmVzZXRVcHBlciA9PT0gdGhpcy5zcGxpdFZpZXdSZXNpemVyUHJlc2V0TWFyZ2luLlBob25lVXAudXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuc3BsaXRWaWV3UmVzaXplclByZXNldE1hcmdpbi5QaG9uZVVwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcyA9IHtcclxuICAgICAgICAgICAgICAgIGxvd2VyOiBwcmVzZXRMb3dlcixcclxuICAgICAgICAgICAgICAgIHVwcGVyOiBwcmVzZXRVcHBlclxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxufVxyXG4iXX0=