@netgrif/components
Version:
Netgrif Application Engine frontend Angular components
186 lines • 40.7 kB
JavaScript
import { Component, Inject } from '@angular/core';
import { extractIconAndTitle, extractSearchTypeFromData, extractFieldValueFromData, groupNavigationViewIdSegmentFactory, NAE_NAVIGATION_ITEM_TASK_DATA, NAE_VIEW_ID_SEGMENT, SearchMode, ViewIdService, GroupNavigationConstants, hasView } from '@netgrif/components-core';
import { DefaultTabbedCaseViewComponent } from '../default-tabbed-case-view/default-tabbed-case-view.component';
import { DefaultTabbedTaskViewComponent } from '../default-tabbed-task-view/default-tabbed-task-view.component';
import { ActivatedRoute } from '@angular/router';
import { DefaultTicketViewComponent } from "../default-ticket-view/default-ticket-view.component";
import { DefaultTabbedSingleTaskViewComponent } from "../default-tabbed-single-task-view/default-tabbed-single-task-view.component";
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "@netgrif/components-core";
import * as i3 from "@angular/router";
import * as i4 from "@ngbracket/ngx-layout";
import * as i5 from "../../../../../tabs/tab-view/tab-view.component";
export class DefaultTabViewComponent {
_navigationItemTaskData;
translationService;
extractionService;
activatedRoute;
tabs;
constructor(_navigationItemTaskData, translationService, extractionService, activatedRoute) {
this._navigationItemTaskData = _navigationItemTaskData;
this.translationService = translationService;
this.extractionService = extractionService;
this.activatedRoute = activatedRoute;
this.tabs = this.getTabs();
}
getTabs() {
const menuItemDataGroups = this._navigationItemTaskData.slice(0, 4);
const viewDataGroups = this._navigationItemTaskData.slice(4, this._navigationItemTaskData.length);
const viewType = extractFieldValueFromData(menuItemDataGroups, "view_configuration_type");
switch (viewType) {
case "tabbed_case_view":
return this.getCaseTabs(menuItemDataGroups, viewDataGroups);
case "tabbed_task_view":
return this.getTaskTabs(menuItemDataGroups, viewDataGroups);
case "tabbed_ticket_view":
return this.getTicketTabs(menuItemDataGroups, viewDataGroups);
default:
throw new Error(`Cannot resolve tabs for '${viewType}' view type`);
}
}
getCaseTabs(menuItemDataGroups, viewDataGroups) {
const labelData = extractIconAndTitle(menuItemDataGroups, this.translationService);
const blockNetsString = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_BANNED_PROCESS_CREATION);
const blockNets = blockNetsString === undefined ? [] : blockNetsString.split(',');
const createCaseButtonTitle = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CREATE_CASE_BUTTON_TITLE);
const createCaseButtonIcon = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CREATE_CASE_BUTTON_ICON);
const requireTitle = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_TITLE_IN_CREATION);
const showCreateCaseButton = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_SHOW_CREATE_CASE_BUTTON);
const chainedViewType = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_CHAINED_VIEW_CONFIGURATION_TYPE);
const newCaseButtonConfig = {
enableCaseTitle: requireTitle,
isCaseTitleRequired: requireTitle,
newCaseButtonConfig: {
createCaseButtonTitle,
createCaseButtonIcon,
showCreateCaseButton: showCreateCaseButton,
},
blockNets: blockNets
};
const caseSearchType = extractSearchTypeFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_VIEW_SEARCH_TYPE);
const caseSearchTypeConfig = {
showSearchIcon: true,
showSearchToggleButton: caseSearchType === SearchMode.ADVANCED,
initialSearchMode: (caseSearchType === undefined) ? undefined : SearchMode.FULLTEXT,
};
const caseShowMoreMenu = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_SHOW_MORE_MENU);
const caseViewHeadersChangeable = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_HEADERS_CHANGEABLE);
const caseViewHeadersMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_HEADERS_MODE);
const caseViewAllowTableMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_ALLOW_TABLE_MODE);
const caseViewDefaultHeadersMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_CASE_DEFAULT_HEADERS_MODE);
if (!hasView(viewDataGroups)) {
throw new Error(`Case view has missing configuration for task view.`);
}
const taskSearchType = extractSearchTypeFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_VIEW_SEARCH_TYPE);
const taskShowMoreMenu = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_SHOW_MORE_MENU);
const taskSearchTypeConfig = {
showSearchIcon: true,
showSearchToggleButton: taskSearchType === SearchMode.ADVANCED,
initialSearchMode: (taskSearchType === undefined) ? undefined : SearchMode.FULLTEXT,
};
const taskViewHeadersChangeable = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_HEADERS_CHANGEABLE);
const taskViewHeadersMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_HEADERS_MODE);
const taskViewAllowTableMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_ALLOW_TABLE_MODE);
const taskViewDefaultHeadersMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_DEFAULT_HEADERS_MODE);
const taskViewAdditionalFilter = this.extractionService.extractCompleteAdditionalFilterFromData(viewDataGroups);
let mergeWithBaseFilter = (chainedViewType === "tabbed_task_view_configuration") ? extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_MERGE_FILTERS) : true;
const additionalAllowedNets = this.extractionService.extractAdditionalFilterAllowedNets(viewDataGroups)?.allowedNetsIdentifiers;
const chainedViewComponent = chainedViewType === "tabbed_single_task_view_configuration" ? DefaultTabbedSingleTaskViewComponent : DefaultTabbedTaskViewComponent;
return [
{
label: { text: labelData.name, icon: labelData.icon },
canBeClosed: false,
tabContentComponent: DefaultTabbedCaseViewComponent,
injectedObject: {
tabViewComponent: chainedViewComponent,
tabViewOrder: 0,
navigationItemTaskData: this._navigationItemTaskData,
newCaseButtonConfiguration: newCaseButtonConfig,
caseViewSearchTypeConfiguration: caseSearchTypeConfig,
caseViewShowMoreMenu: caseShowMoreMenu,
caseViewHeadersChangeable: caseViewHeadersChangeable,
caseViewHeadersMode: caseViewHeadersMode,
caseViewAllowTableMode: caseViewAllowTableMode,
caseViewDefaultHeadersMode: caseViewDefaultHeadersMode,
taskViewSearchTypeConfiguration: taskSearchTypeConfig,
taskViewShowMoreMenu: taskShowMoreMenu,
taskViewHeadersChangeable: taskViewHeadersChangeable,
taskViewHeadersMode: taskViewHeadersMode,
taskViewAllowTableMode: taskViewAllowTableMode,
taskViewDefaultHeadersMode: taskViewDefaultHeadersMode,
taskViewMergeWithBaseFilter: mergeWithBaseFilter,
taskViewAdditionalFilter: taskViewAdditionalFilter,
taskViewAdditionalAllowedNets: additionalAllowedNets
}
}
];
}
getTaskTabs(menuItemDataGroups, viewDataGroups) {
const labelData = extractIconAndTitle(menuItemDataGroups, this.translationService);
const taskSearchType = extractSearchTypeFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_VIEW_SEARCH_TYPE);
const headersChangeable = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_HEADERS_CHANGEABLE);
const headersMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_HEADERS_MODE);
const allowTableMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_ALLOW_TABLE_MODE);
const defaultHeadersMode = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_DEFAULT_HEADERS_MODE);
const showToggleButton = taskSearchType === SearchMode.ADVANCED;
const searchTypeConfig = {
showSearchIcon: true,
showSearchToggleButton: showToggleButton,
initialSearchMode: (taskSearchType === undefined) ? undefined : SearchMode.FULLTEXT,
};
const showMoreMenu = extractFieldValueFromData(viewDataGroups, GroupNavigationConstants.ITEM_FIELD_ID_TASK_SHOW_MORE_MENU);
const filter = this.extractionService.extractCompleteFilterFromData(viewDataGroups);
return [
{
label: { text: labelData.name, icon: labelData.icon },
canBeClosed: false,
tabContentComponent: DefaultTabbedTaskViewComponent,
injectedObject: {
navigationItemTaskData: this._navigationItemTaskData,
baseFilter: filter,
searchTypeConfiguration: searchTypeConfig,
showMoreMenu: showMoreMenu,
headersChangeable: headersChangeable,
headersMode: headersMode,
allowTableMode: allowTableMode,
defaultHeadersMode: defaultHeadersMode
}
}
];
}
getTicketTabs(menuItemDataGroups, viewDataGroups) {
const labelData = extractIconAndTitle(menuItemDataGroups, this.translationService);
if (!hasView(viewDataGroups)) {
throw new Error(`Ticket view has missing configuration for single task view.`);
}
return [
{
label: { text: labelData.name, icon: labelData.icon },
canBeClosed: false,
tabContentComponent: DefaultTicketViewComponent,
injectedObject: {
navigationItemTaskData: this._navigationItemTaskData,
tabViewComponent: DefaultTabbedSingleTaskViewComponent,
tabViewOrder: 0,
}
}
];
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultTabViewComponent, deps: [{ token: NAE_NAVIGATION_ITEM_TASK_DATA }, { token: i1.TranslateService }, { token: i2.FilterExtractionService }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DefaultTabViewComponent, selector: "nc-default-tab-view", providers: [
ViewIdService,
{ provide: NAE_VIEW_ID_SEGMENT, useFactory: groupNavigationViewIdSegmentFactory, deps: [ActivatedRoute] }
], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" class=\"full-height\">\n <nc-tab-view [initialTabs]=\"tabs\" stretch=\"false\" class=\"full-height block\"></nc-tab-view>\n</div>\n", styles: [".full-height{height:100%}.block{display:block!important}\n"], dependencies: [{ kind: "directive", type: i4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "component", type: i5.TabViewComponent, selector: "nc-tab-view" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultTabViewComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-default-tab-view', providers: [
ViewIdService,
{ provide: NAE_VIEW_ID_SEGMENT, useFactory: groupNavigationViewIdSegmentFactory, deps: [ActivatedRoute] }
], template: "<div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" class=\"full-height\">\n <nc-tab-view [initialTabs]=\"tabs\" stretch=\"false\" class=\"full-height block\"></nc-tab-view>\n</div>\n", styles: [".full-height{height:100%}.block{display:block!important}\n"] }]
}], ctorParameters: () => [{ type: Array, decorators: [{
type: Inject,
args: [NAE_NAVIGATION_ITEM_TASK_DATA]
}] }, { type: i1.TranslateService }, { type: i2.FilterExtractionService }, { type: i3.ActivatedRoute }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10YWItdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMvc3JjL2xpYi9uYXZpZ2F0aW9uL2dyb3VwLW5hdmlnYXRpb24tY29tcG9uZW50LXJlc29sdmVyL2RlZmF1bHQtY29tcG9uZW50cy90YWJiZWQvZGVmYXVsdC10YWItdmlldy9kZWZhdWx0LXRhYi12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL25hdmlnYXRpb24vZ3JvdXAtbmF2aWdhdGlvbi1jb21wb25lbnQtcmVzb2x2ZXIvZGVmYXVsdC1jb21wb25lbnRzL3RhYmJlZC9kZWZhdWx0LXRhYi12aWV3L2RlZmF1bHQtdGFiLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUVILG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLG1DQUFtQyxFQUNuQyw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBR25CLFVBQVUsRUFFVixhQUFhLEVBRWIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFFVixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBQzlHLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUNoRyxPQUFPLEVBQ0gsb0NBQW9DLEVBQ3ZDLE1BQU0sOEVBQThFLENB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LEVBQUUsY0FBZ0M7UUFDMUYsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7U0FDbEY7UUFFRCxPQUFPO1lBQ0g7Z0JBQ0ksS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUM7Z0JBQ25ELFdBQVcsRUFBRSxLQUFLO2dCQUNsQixtQkFBbUIsRUFBRSwwQkFBMEI7Z0JBQy9DLGNBQWMsRUFBRTtvQkFDWixzQkFBc0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCO29CQUNwRCxnQkFBZ0IsRUFBRSxvQ0FBb0M7b0JBQ3RELFlBQVksRUFBRSxDQUFDO2lCQUNsQjthQUNKO1NBQ0osQ0FBQztJQUNOLENBQUM7d0dBdktRLHVCQUF1QixrQkFJWiw2QkFBNkI7NEZBSnhDLHVCQUF1Qiw4Q0FMckI7WUFDUCxhQUFhO1lBQ2IsRUFBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLG1DQUFtQyxFQUFFLElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFDO1NBQzFHLDBCQ25DTCxpTUFHQTs7NEZEa0NhLHVCQUF1QjtrQkFUbkMsU0FBUzsrQkFDSSxxQkFBcUIsYUFHcEI7d0JBQ1AsYUFBYTt3QkFDYixFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsbUNBQW1DLEVBQUUsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUM7cUJBQzFHOzswQkFNWSxNQUFNOzJCQUFDLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBEYXRhR3JvdXAsXG4gICAgZXh0cmFjdEljb25BbmRUaXRsZSxcbiAgICBleHRyYWN0U2VhcmNoVHlwZUZyb21EYXRhLFxuICAgIGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGEsXG4gICAgZ3JvdXBOYXZpZ2F0aW9uVmlld0lkU2VnbWVudEZhY3RvcnksXG4gICAgTkFFX05BVklHQVRJT05fSVRFTV9UQVNLX0RBVEEsXG4gICAgTkFFX1ZJRVdfSURfU0VHTUVOVCxcbiAgICBOZXdDYXNlQ3JlYXRpb25Db25maWd1cmF0aW9uRGF0YSxcbiAgICBTZWFyY2hDb21wb25lbnRDb25maWd1cmF0aW9uLFxuICAgIFNlYXJjaE1vZGUsXG4gICAgVGFiQ29udGVudCxcbiAgICBWaWV3SWRTZXJ2aWNlLFxuICAgIEZpbHRlckV4dHJhY3Rpb25TZXJ2aWNlLFxuICAgIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cyxcbiAgICBoYXNWaWV3LFxuICAgIEkxOG5GaWVsZFZhbHVlXG59IGZyb20gJ0BuZXRncmlmL2NvbXBvbmVudHMtY29yZSc7XG5pbXBvcnQge0RlZmF1bHRUYWJiZWRDYXNlVmlld0NvbXBvbmVudH0gZnJvbSAnLi4vZGVmYXVsdC10YWJiZWQtY2FzZS12aWV3L2RlZmF1bHQtdGFiYmVkLWNhc2Utdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHtEZWZhdWx0VGFiYmVkVGFza1ZpZXdDb21wb25lbnR9IGZyb20gJy4uL2RlZmF1bHQtdGFiYmVkLXRhc2stdmlldy9kZWZhdWx0LXRhYmJlZC10YXNrLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge0RlZmF1bHRUaWNrZXRWaWV3Q29tcG9uZW50fSBmcm9tIFwiLi4vZGVmYXVsdC10aWNrZXQtdmlldy9kZWZhdWx0LXRpY2tldC12aWV3LmNvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBEZWZhdWx0VGFiYmVkU2luZ2xlVGFza1ZpZXdDb21wb25lbnRcbn0gZnJvbSBcIi4uL2RlZmF1bHQtdGFiYmVkLXNpbmdsZS10YXNrLXZpZXcvZGVmYXVsdC10YWJiZWQtc2luZ2xlLXRhc2stdmlldy5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYy1kZWZhdWx0LXRhYi12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGVmYXVsdC10YWItdmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGVmYXVsdC10YWItdmlldy5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBWaWV3SWRTZXJ2aWNlLFxuICAgICAgICB7cHJvdmlkZTogTkFFX1ZJRVdfSURfU0VHTUVOVCwgdXNlRmFjdG9yeTogZ3JvdXBOYXZpZ2F0aW9uVmlld0lkU2VnbWVudEZhY3RvcnksIGRlcHM6IFtBY3RpdmF0ZWRSb3V0ZV19XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBEZWZhdWx0VGFiVmlld0NvbXBvbmVudCB7XG5cbiAgICB0YWJzOiBBcnJheTxUYWJDb250ZW50PjtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoTkFFX05BVklHQVRJT05fSVRFTV9UQVNLX0RBVEEpIHByb3RlY3RlZCBfbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YTogQXJyYXk8RGF0YUdyb3VwPixcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBleHRyYWN0aW9uU2VydmljZTogRmlsdGVyRXh0cmFjdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xuICAgICAgICB0aGlzLnRhYnMgPSB0aGlzLmdldFRhYnMoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0VGFicygpOiBUYWJDb250ZW50W10ge1xuICAgICAgICBjb25zdCBtZW51SXRlbURhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4gPSB0aGlzLl9uYXZpZ2F0aW9uSXRlbVRhc2tEYXRhLnNsaWNlKDAsIDQpXG4gICAgICAgIGNvbnN0IHZpZXdEYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+ID0gdGhpcy5fbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YS5zbGljZSg0LCB0aGlzLl9uYXZpZ2F0aW9uSXRlbVRhc2tEYXRhLmxlbmd0aCk7XG5cbiAgICAgICAgY29uc3Qgdmlld1R5cGU6IHN0cmluZyA9IGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGEobWVudUl0ZW1EYXRhR3JvdXBzLCBcInZpZXdfY29uZmlndXJhdGlvbl90eXBlXCIpXG4gICAgICAgIHN3aXRjaCAodmlld1R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJiZWRfY2FzZV92aWV3XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FzZVRhYnMobWVudUl0ZW1EYXRhR3JvdXBzLCB2aWV3RGF0YUdyb3Vwcyk7XG4gICAgICAgICAgICBjYXNlIFwidGFiYmVkX3Rhc2tfdmlld1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFRhc2tUYWJzKG1lbnVJdGVtRGF0YUdyb3Vwcywgdmlld0RhdGFHcm91cHMpO1xuICAgICAgICAgICAgY2FzZSBcInRhYmJlZF90aWNrZXRfdmlld1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFRpY2tldFRhYnMobWVudUl0ZW1EYXRhR3JvdXBzLCB2aWV3RGF0YUdyb3Vwcyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgdGFicyBmb3IgJyR7dmlld1R5cGV9JyB2aWV3IHR5cGVgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDYXNlVGFicyhtZW51SXRlbURhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4sIHZpZXdEYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogVGFiQ29udGVudFtdIHtcbiAgICAgICAgY29uc3QgbGFiZWxEYXRhID0gZXh0cmFjdEljb25BbmRUaXRsZShtZW51SXRlbURhdGFHcm91cHMsIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlKTtcblxuICAgICAgICBjb25zdCBibG9ja05ldHNTdHJpbmcgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhPHN0cmluZz4odmlld0RhdGFHcm91cHMsIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX0NBU0VfQkFOTkVEX1BST0NFU1NfQ1JFQVRJT04pO1xuICAgICAgICBjb25zdCBibG9ja05ldHMgPSBibG9ja05ldHNTdHJpbmcgPT09IHVuZGVmaW5lZCA/IFtdIDogYmxvY2tOZXRzU3RyaW5nLnNwbGl0KCcsJylcbiAgICAgICAgY29uc3QgY3JlYXRlQ2FzZUJ1dHRvblRpdGxlOiBJMThuRmllbGRWYWx1ZSA9IGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGE8STE4bkZpZWxkVmFsdWU+KHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9DUkVBVEVfQ0FTRV9CVVRUT05fVElUTEUpO1xuICAgICAgICBjb25zdCBjcmVhdGVDYXNlQnV0dG9uSWNvbjogc3RyaW5nID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxzdHJpbmc+KHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9DUkVBVEVfQ0FTRV9CVVRUT05fSUNPTik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVUaXRsZTogYm9vbGVhbiA9IGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGE8Ym9vbGVhbj4odmlld0RhdGFHcm91cHMsIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX0NBU0VfVElUTEVfSU5fQ1JFQVRJT04pO1xuICAgICAgICBjb25zdCBzaG93Q3JlYXRlQ2FzZUJ1dHRvbjogYm9vbGVhbiA9IGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGE8Ym9vbGVhbj4odmlld0RhdGFHcm91cHMsIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX1NIT1dfQ1JFQVRFX0NBU0VfQlVUVE9OKTtcbiAgICAgICAgY29uc3QgY2hhaW5lZFZpZXdUeXBlOiBzdHJpbmcgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhKHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9DSEFJTkVEX1ZJRVdfQ09ORklHVVJBVElPTl9UWVBFKTtcblxuICAgICAgICBjb25zdCBuZXdDYXNlQnV0dG9uQ29uZmlnOiBOZXdDYXNlQ3JlYXRpb25Db25maWd1cmF0aW9uRGF0YSA9IHtcbiAgICAgICAgICAgIGVuYWJsZUNhc2VUaXRsZTogcmVxdWlyZVRpdGxlLFxuICAgICAgICAgICAgaXNDYXNlVGl0bGVSZXF1aXJlZDogcmVxdWlyZVRpdGxlLFxuICAgICAgICAgICAgbmV3Q2FzZUJ1dHRvbkNvbmZpZzoge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUNhc2VCdXR0b25UaXRsZSxcbiAgICAgICAgICAgICAgICBjcmVhdGVDYXNlQnV0dG9uSWNvbixcbiAgICAgICAgICAgICAgICBzaG93Q3JlYXRlQ2FzZUJ1dHRvbjogc2hvd0NyZWF0ZUNhc2VCdXR0b24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvY2tOZXRzOiBibG9ja05ldHNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2FzZVNlYXJjaFR5cGUgPSBleHRyYWN0U2VhcmNoVHlwZUZyb21EYXRhKHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9DQVNFX1ZJRVdfU0VBUkNIX1RZUEUpO1xuICAgICAgICBjb25zdCBjYXNlU2VhcmNoVHlwZUNvbmZpZzogU2VhcmNoQ29tcG9uZW50Q29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgIHNob3dTZWFyY2hJY29uOiB0cnVlLFxuICAgICAgICAgICAgc2hvd1NlYXJjaFRvZ2dsZUJ1dHRvbjogY2FzZVNlYXJjaFR5cGUgPT09IFNlYXJjaE1vZGUuQURWQU5DRUQsXG4gICAgICAgICAgICBpbml0aWFsU2VhcmNoTW9kZTogKGNhc2VTZWFyY2hUeXBlID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogU2VhcmNoTW9kZS5GVUxMVEVYVCxcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYXNlU2hvd01vcmVNZW51ID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxib29sZWFuPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfQ0FTRV9TSE9XX01PUkVfTUVOVSk7XG4gICAgICAgIGNvbnN0IGNhc2VWaWV3SGVhZGVyc0NoYW5nZWFibGUgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhPGJvb2xlYW4+KHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9DQVNFX0hFQURFUlNfQ0hBTkdFQUJMRSk7XG4gICAgICAgIGNvbnN0IGNhc2VWaWV3SGVhZGVyc01vZGUgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhPHN0cmluZ1tdPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfQ0FTRV9IRUFERVJTX01PREUpO1xuICAgICAgICBjb25zdCBjYXNlVmlld0FsbG93VGFibGVNb2RlID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxib29sZWFuPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfQ0FTRV9BTExPV19UQUJMRV9NT0RFKTtcbiAgICAgICAgY29uc3QgY2FzZVZpZXdEZWZhdWx0SGVhZGVyc01vZGUgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhPHN0cmluZ1tdPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfQ0FTRV9ERUZBVUxUX0hFQURFUlNfTU9ERSk7XG5cbiAgICAgICAgaWYgKCFoYXNWaWV3KHZpZXdEYXRhR3JvdXBzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYXNlIHZpZXcgaGFzIG1pc3NpbmcgY29uZmlndXJhdGlvbiBmb3IgdGFzayB2aWV3LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFza1NlYXJjaFR5cGUgPSBleHRyYWN0U2VhcmNoVHlwZUZyb21EYXRhKHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9UQVNLX1ZJRVdfU0VBUkNIX1RZUEUpO1xuICAgICAgICBjb25zdCB0YXNrU2hvd01vcmVNZW51ID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxib29sZWFuPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfVEFTS19TSE9XX01PUkVfTUVOVSk7XG4gICAgICAgIGNvbnN0IHRhc2tTZWFyY2hUeXBlQ29uZmlnOiBTZWFyY2hDb21wb25lbnRDb25maWd1cmF0aW9uID0ge1xuICAgICAgICAgICAgc2hvd1NlYXJjaEljb246IHRydWUsXG4gICAgICAgICAgICBzaG93U2VhcmNoVG9nZ2xlQnV0dG9uOiB0YXNrU2VhcmNoVHlwZSA9PT0gU2VhcmNoTW9kZS5BRFZBTkNFRCxcbiAgICAgICAgICAgIGluaXRpYWxTZWFyY2hNb2RlOiAodGFza1NlYXJjaFR5cGUgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiBTZWFyY2hNb2RlLkZVTExURVhULFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2tWaWV3SGVhZGVyc0NoYW5nZWFibGUgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhPGJvb2xlYW4+KHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9UQVNLX0hFQURFUlNfQ0hBTkdFQUJMRSk7XG4gICAgICAgIGNvbnN0IHRhc2tWaWV3SGVhZGVyc01vZGUgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhPHN0cmluZ1tdPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfVEFTS19IRUFERVJTX01PREUpO1xuICAgICAgICBjb25zdCB0YXNrVmlld0FsbG93VGFibGVNb2RlID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxib29sZWFuPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfVEFTS19BTExPV19UQUJMRV9NT0RFKTtcbiAgICAgICAgY29uc3QgdGFza1ZpZXdEZWZhdWx0SGVhZGVyc01vZGUgPSBleHRyYWN0RmllbGRWYWx1ZUZyb21EYXRhPHN0cmluZ1tdPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfVEFTS19ERUZBVUxUX0hFQURFUlNfTU9ERSk7XG4gICAgICAgIGNvbnN0IHRhc2tWaWV3QWRkaXRpb25hbEZpbHRlciA9IHRoaXMuZXh0cmFjdGlvblNlcnZpY2UuZXh0cmFjdENvbXBsZXRlQWRkaXRpb25hbEZpbHRlckZyb21EYXRhKHZpZXdEYXRhR3JvdXBzKTtcbiAgICAgICAgbGV0IG1lcmdlV2l0aEJhc2VGaWx0ZXI6IGJvb2xlYW4gPSAoY2hhaW5lZFZpZXdUeXBlID09PSBcInRhYmJlZF90YXNrX3ZpZXdfY29uZmlndXJhdGlvblwiKSA/IGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGE8Ym9vbGVhbj4odmlld0RhdGFHcm91cHMsIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX01FUkdFX0ZJTFRFUlMpIDogdHJ1ZTtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbEFsbG93ZWROZXRzID0gdGhpcy5leHRyYWN0aW9uU2VydmljZS5leHRyYWN0QWRkaXRpb25hbEZpbHRlckFsbG93ZWROZXRzKHZpZXdEYXRhR3JvdXBzKT8uYWxsb3dlZE5ldHNJZGVudGlmaWVycztcbiAgICAgICAgY29uc3QgY2hhaW5lZFZpZXdDb21wb25lbnQgPSBjaGFpbmVkVmlld1R5cGUgPT09IFwidGFiYmVkX3NpbmdsZV90YXNrX3ZpZXdfY29uZmlndXJhdGlvblwiID8gRGVmYXVsdFRhYmJlZFNpbmdsZVRhc2tWaWV3Q29tcG9uZW50IDogRGVmYXVsdFRhYmJlZFRhc2tWaWV3Q29tcG9uZW50O1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHt0ZXh0OiBsYWJlbERhdGEubmFtZSwgaWNvbjogbGFiZWxEYXRhLmljb259LFxuICAgICAgICAgICAgICAgIGNhbkJlQ2xvc2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0YWJDb250ZW50Q29tcG9uZW50OiBEZWZhdWx0VGFiYmVkQ2FzZVZpZXdDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgaW5qZWN0ZWRPYmplY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFiVmlld0NvbXBvbmVudDogY2hhaW5lZFZpZXdDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhYlZpZXdPcmRlcjogMCxcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YTogdGhpcy5fbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YSxcblxuICAgICAgICAgICAgICAgICAgICBuZXdDYXNlQnV0dG9uQ29uZmlndXJhdGlvbjogbmV3Q2FzZUJ1dHRvbkNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgY2FzZVZpZXdTZWFyY2hUeXBlQ29uZmlndXJhdGlvbjogY2FzZVNlYXJjaFR5cGVDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGNhc2VWaWV3U2hvd01vcmVNZW51OiBjYXNlU2hvd01vcmVNZW51LFxuICAgICAgICAgICAgICAgICAgICBjYXNlVmlld0hlYWRlcnNDaGFuZ2VhYmxlOiBjYXNlVmlld0hlYWRlcnNDaGFuZ2VhYmxlLFxuICAgICAgICAgICAgICAgICAgICBjYXNlVmlld0hlYWRlcnNNb2RlOiBjYXNlVmlld0hlYWRlcnNNb2RlLFxuICAgICAgICAgICAgICAgICAgICBjYXNlVmlld0FsbG93VGFibGVNb2RlOiBjYXNlVmlld0FsbG93VGFibGVNb2RlLFxuICAgICAgICAgICAgICAgICAgICBjYXNlVmlld0RlZmF1bHRIZWFkZXJzTW9kZTogY2FzZVZpZXdEZWZhdWx0SGVhZGVyc01vZGUsXG5cbiAgICAgICAgICAgICAgICAgICAgdGFza1ZpZXdTZWFyY2hUeXBlQ29uZmlndXJhdGlvbjogdGFza1NlYXJjaFR5cGVDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIHRhc2tWaWV3U2hvd01vcmVNZW51OiB0YXNrU2hvd01vcmVNZW51LFxuICAgICAgICAgICAgICAgICAgICB0YXNrVmlld0hlYWRlcnNDaGFuZ2VhYmxlOiB0YXNrVmlld0hlYWRlcnNDaGFuZ2VhYmxlLFxuICAgICAgICAgICAgICAgICAgICB0YXNrVmlld0hlYWRlcnNNb2RlOiB0YXNrVmlld0hlYWRlcnNNb2RlLFxuICAgICAgICAgICAgICAgICAgICB0YXNrVmlld0FsbG93VGFibGVNb2RlOiB0YXNrVmlld0FsbG93VGFibGVNb2RlLFxuICAgICAgICAgICAgICAgICAgICB0YXNrVmlld0RlZmF1bHRIZWFkZXJzTW9kZTogdGFza1ZpZXdEZWZhdWx0SGVhZGVyc01vZGUsXG4gICAgICAgICAgICAgICAgICAgIHRhc2tWaWV3TWVyZ2VXaXRoQmFzZUZpbHRlcjogbWVyZ2VXaXRoQmFzZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgdGFza1ZpZXdBZGRpdGlvbmFsRmlsdGVyOiB0YXNrVmlld0FkZGl0aW9uYWxGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRhc2tWaWV3QWRkaXRpb25hbEFsbG93ZWROZXRzOiBhZGRpdGlvbmFsQWxsb3dlZE5ldHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFRhc2tUYWJzKG1lbnVJdGVtRGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPiwgdmlld0RhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiBUYWJDb250ZW50W10ge1xuICAgICAgICBjb25zdCBsYWJlbERhdGEgPSBleHRyYWN0SWNvbkFuZFRpdGxlKG1lbnVJdGVtRGF0YUdyb3VwcywgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UpO1xuICAgICAgICBjb25zdCB0YXNrU2VhcmNoVHlwZSA9IGV4dHJhY3RTZWFyY2hUeXBlRnJvbURhdGEodmlld0RhdGFHcm91cHMsIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX1RBU0tfVklFV19TRUFSQ0hfVFlQRSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnNDaGFuZ2VhYmxlID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxib29sZWFuPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfVEFTS19IRUFERVJTX0NIQU5HRUFCTEUpO1xuICAgICAgICBjb25zdCBoZWFkZXJzTW9kZSA9IGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGE8c3RyaW5nW10+KHZpZXdEYXRhR3JvdXBzLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9UQVNLX0hFQURFUlNfTU9ERSk7XG4gICAgICAgIGNvbnN0IGFsbG93VGFibGVNb2RlID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxib29sZWFuPih2aWV3RGF0YUdyb3VwcywgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfVEFTS19BTExPV19UQUJMRV9NT0RFKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEhlYWRlcnNNb2RlID0gZXh0cmFjdEZpZWxkVmFsdWVGcm9tRGF0YTxzdHJpbmdbXT4odmlld0RhdGFHcm91cHMsIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX1RBU0tfREVGQVVMVF9IRUFERVJTX01PREUpO1xuICAgICAgICBjb25zdCBzaG93VG9nZ2xlQnV0dG9uID0gdGFza1NlYXJjaFR5cGUgPT09IFNlYXJjaE1vZGUuQURWQU5DRURcbiAgICAgICAgY29uc3Qgc2VhcmNoVHlwZUNvbmZpZzogU2VhcmNoQ29tcG9uZW50Q29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgIHNob3dTZWFyY2hJY29uOiB0cnVlLFxuICAgICAgICAgICAgc2hvd1NlYXJjaFRvZ2dsZUJ1dHRvbjogc2hvd1RvZ2dsZUJ1dHRvbixcbiAgICAgICAgICAgIGluaXRpYWxTZWFyY2hNb2RlOiAodGFza1NlYXJjaFR5cGUgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiBTZWFyY2hNb2RlLkZVTExURVhULFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNob3dNb3JlTWVudSA9IGV4dHJhY3RGaWVsZFZhbHVlRnJvbURhdGE8Ym9vbGVhbj4odmlld0RhdGFHcm91cHMsIEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX1RBU0tfU0hPV19NT1JFX01FTlUpO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZXh0cmFjdGlvblNlcnZpY2UuZXh0cmFjdENvbXBsZXRlRmlsdGVyRnJvbURhdGEodmlld0RhdGFHcm91cHMpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiB7dGV4dDogbGFiZWxEYXRhLm5hbWUsIGljb246IGxhYmVsRGF0YS5pY29ufSxcbiAgICAgICAgICAgICAgICBjYW5CZUNsb3NlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGFiQ29udGVudENvbXBvbmVudDogRGVmYXVsdFRhYmJlZFRhc2tWaWV3Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGluamVjdGVkT2JqZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25JdGVtVGFza0RhdGE6IHRoaXMuX25hdmlnYXRpb25JdGVtVGFza0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VGaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVHlwZUNvbmZpZ3VyYXRpb246IHNlYXJjaFR5cGVDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIHNob3dNb3JlTWVudTogc2hvd01vcmVNZW51LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzQ2hhbmdlYWJsZTogaGVhZGVyc0NoYW5nZWFibGUsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNNb2RlOiBoZWFkZXJzTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUYWJsZU1vZGU6IGFsbG93VGFibGVNb2RlLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGVhZGVyc01vZGU6IGRlZmF1bHRIZWFkZXJzTW9kZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0VGlja2V0VGFicyhtZW51SXRlbURhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4sIHZpZXdEYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogVGFiQ29udGVudFtdIHtcbiAgICAgICAgY29uc3QgbGFiZWxEYXRhID0gZXh0cmFjdEljb25BbmRUaXRsZShtZW51SXRlbURhdGFHcm91cHMsIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlKTtcblxuICAgICAgICBpZiAoIWhhc1ZpZXcodmlld0RhdGFHcm91cHMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpY2tldCB2aWV3IGhhcyBtaXNzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHNpbmdsZSB0YXNrIHZpZXcuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiB7dGV4dDogbGFiZWxEYXRhLm5hbWUsIGljb246IGxhYmVsRGF0YS5pY29ufSxcbiAgICAgICAgICAgICAgICBjYW5CZUNsb3NlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGFiQ29udGVudENvbXBvbmVudDogRGVmYXVsdFRpY2tldFZpZXdDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgaW5qZWN0ZWRPYmplY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YTogdGhpcy5fbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdGFiVmlld0NvbXBvbmVudDogRGVmYXVsdFRhYmJlZFNpbmdsZVRhc2tWaWV3Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWJWaWV3T3JkZXI6IDAsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cblxufVxuIiwiPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBzdHJldGNoXCIgY2xhc3M9XCJmdWxsLWhlaWdodFwiPlxuICAgIDxuYy10YWItdmlldyBbaW5pdGlhbFRhYnNdPVwidGFic1wiIHN0cmV0Y2g9XCJmYWxzZVwiIGNsYXNzPVwiZnVsbC1oZWlnaHQgYmxvY2tcIj48L25jLXRhYi12aWV3PlxuPC9kaXY+XG4iXX0=