barsa-sap-ui 2.0.104 → 2.0.106

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,6 +1,7 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, Renderer2, ViewChild } from '@angular/core';
2
2
  import { ToolbarComponent } from '@fundamental-ngx/core';
3
- import { BaseComponent } from 'barsa-novin-ray-core';
3
+ import { BaseComponent, PortalService } from 'barsa-novin-ray-core';
4
+ import { takeUntil } from 'rxjs';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/common";
6
7
  import * as i2 from "barsa-novin-ray-core";
@@ -23,9 +24,15 @@ export class UlvToolbarComponent extends BaseComponent {
23
24
  this.editModeClick = new EventEmitter();
24
25
  this.viewClick = new EventEmitter();
25
26
  this.createNewInlineMo = new EventEmitter();
27
+ this._renderer2 = inject(Renderer2);
28
+ this._portalService = inject(PortalService);
29
+ this.visibled = false;
26
30
  }
27
31
  ngAfterViewInit() {
28
32
  super.ngAfterViewInit();
33
+ this._portalService.windowResize$.pipe(takeUntil(this._onDestroy$)).subscribe(() => {
34
+ this._setWidth();
35
+ });
29
36
  }
30
37
  ngOnChanges(changes) {
31
38
  super.ngOnChanges(changes);
@@ -44,8 +51,24 @@ export class UlvToolbarComponent extends BaseComponent {
44
51
  }
45
52
  onVisibilityChange(e) {
46
53
  if (e === 'Visible') {
47
- this._refreshToolbar();
54
+ if (!this.visibled) {
55
+ this.visibled = true;
56
+ this._setWidth();
57
+ }
58
+ else {
59
+ this._refreshToolbar();
60
+ }
61
+ }
62
+ }
63
+ _setWidth() {
64
+ if (!this.visibled) {
65
+ return;
48
66
  }
67
+ const x = this.el.nativeElement.parentNode.getBoundingClientRect().width;
68
+ this._renderer2.setStyle(this.el.nativeElement, 'width', x + 'px');
69
+ setTimeout(() => {
70
+ this._refreshToolbar();
71
+ });
49
72
  }
50
73
  onGroupbySettings() {
51
74
  this.groupbyClick.emit(this.deviceName);
@@ -75,11 +98,11 @@ export class UlvToolbarComponent extends BaseComponent {
75
98
  }
76
99
  }
77
100
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: UlvToolbarComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
78
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: UlvToolbarComponent, selector: "bsu-ulv-toolbar", inputs: { allowGridColumnSort: "allowGridColumnSort", useLayoutItemTextForControl: "useLayoutItemTextForControl", enableSearch: "enableSearch", hideTitle: "hideTitle", title: "title", icon: "icon", deviceName: "deviceName", deviceSize: "deviceSize", access: "access", hideToolbar: "hideToolbar", toolbarButtons: "toolbarButtons", contentDensity: "contentDensity", inlineEditMode: "inlineEditMode", allowInlineEdit: "allowInlineEdit", gridSetting: "gridSetting", viewCollection: "viewCollection", reportView: "reportView", inDialog: "inDialog", isMultiSelect: "isMultiSelect", cls: "cls", hasSelected: "hasSelected", config: "config", hidden: "hidden", buttons: "buttons", moDataListCount: "moDataListCount" }, outputs: { search: "search", groupbyClick: "groupbyClick", sortClick: "sortClick", columnClick: "columnClick", editModeClick: "editModeClick", viewClick: "viewClick", createNewInlineMo: "createNewInlineMo" }, viewQueries: [{ propertyName: "_tlbCmp", first: true, predicate: ToolbarComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!useLayoutItemTextForControl && !hideToolbar) {\n<fd-toolbar\n #toolbar\n [shouldOverflow]=\"deviceSize === 's'\"\n [ngClass]=\"deviceSize\"\n [hasTitle]=\"!hideTitle\"\n [forceOverflow]=\"true\"\n [ngClass]=\"cls\"\n intersectionObserver\n [intersectionThreshold]=\"0.1\"\n (visibilityChange)=\"onVisibilityChange($event)\"\n>\n @if(!hideTitle && deviceSize !== 's' ? (title | bbbTranslate) : ''){ @if(icon){\n <fd-icon [glyph]=\"icon\"></fd-icon>\n }\n <h4 fd-title>{{ title | bbbTranslate }}</h4>\n } @if (deviceSize !== 's') {\n <fd-toolbar-spacer fd-toolbar-item></fd-toolbar-spacer>\n } @if (!hideToolbar) { @for (btn of toolbarButtons; track _trackBy(i, btn); let i = $index) { @if (btn !== '-' &&\n btn.Command && !btn.Command.CustomUi && !btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"btn.itemId === 'Edit' ? 'always' : btn.Command?.IsBuiltin ? 'low' : 'high'\"\n [ulvCommandHandler]=\"btn\"\n [disable]=\"inlineEditMode && btn.itemId === 'New'\"\n [disabled]=\"btn.Command._isEnable === false ? true : false\"\n [fdType]=\"!btn.Command._isEnable ? 'transparent' : btn.Command.JsonExtraProp?.Design || 'transparent'\"\n [glyph]=\"deviceSize === 's' ? null : btn.Command.JsonExtraProp?.Icon\"\n [title]=\"(btn.Command?.IsBuiltin ? btn.text : '') | bbbTranslate\"\n (click)=\"inlineEditMode && btn.itemId === 'New' && createNewInlineMo.emit()\"\n bodyClick\n >\n @if (!btn.Command.JsonExtraProp?.Icon && !btn.Command?.IsBuiltin && btn.icon) {\n <img width=\"16\" [src]=\"btn.icon\" />\n } @if (!btn.hideText || deviceSize === 's') {\n <span>{{ btn.text | bbbTranslate }}</span>\n }\n </button>\n } @if ((btn === '-' || btn.type === 'seperator') && deviceName !== 'mobile') {\n <fd-toolbar-separator fd-toolbar-item></fd-toolbar-separator>\n } @if (btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [fdMenu]=\"true\"\n [fdType]=\"btn.Command?.IsBuiltin ? 'standard' : 'transparent'\"\n [label]=\"btn.text | bbbTranslate\"\n [ariaLabel]=\"btn.text | bbbTranslate\"\n [fdMenuTrigger]=\"menu\"\n bodyClick\n >\n <fd-menu #menu>\n @for (btnCommand of btn.menu.items; track btnCommand) {\n <li fd-menu-item [ulvCommandHandler]=\"btnCommand\" (click)=\"menu.close()\">\n <div fd-menu-interactive>\n <span fd-menu-title>{{ btnCommand.text | bbbTranslate }}</span>\n </div>\n </li>\n }\n </fd-menu>\n </button>\n } @if (btn !== '-' && btn.Command && btn.Command.CustomUi) {\n <bnrc-dynamic-form-toolbaritem\n fd-toolbar-item\n [ulvCommandHandler]=\"btn\"\n [component]=\"btn.Command?.CustomUi\"\n [context]=\"btn\"\n [isEnable]=\"btn.Command?._isEnable\"\n [deviceName]=\"deviceName\"\n [deviceSize]=\"deviceSize\"\n bodyClick\n ></bnrc-dynamic-form-toolbaritem>\n } }\n <ng-content select=\"[fd-toolbar-item]\"></ng-content>\n @if (allowInlineEdit && access?.Edit) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"inlineEditMode ? 'emphasized' : 'transparent'\"\n [glyph]=\"'edit'\"\n [label]=\"deviceSize === 's' ? ('Inline Edit In List' | bbbTranslate) : ''\"\n (click)=\"onEditMode()\"\n [attr.fdOverflowPriority]=\"'always'\"\n [title]=\"'Inline Edit In List' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (gridSetting && gridSetting.Hidden !== true && allowGridColumnSort) { @if (deviceSize === 's') {\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onGroupbySettings()\"\n [label]=\"'Groups' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onSortSettings()\"\n [label]=\"'Sort' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onColumnSettings()\"\n [label]=\"'Columns' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (deviceSize !== 's') {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"'never'\"\n [fdMenu]=\"true\"\n fdType=\"transparent\"\n glyph=\"action-settings\"\n [title]=\"'Settings' | bbbTranslate\"\n [fdMenuTrigger]=\"tableMenuSettings\"\n bodyClick\n ></button>\n }\n <fd-menu #tableMenuSettings>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onColumnSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"action-settings\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Columns' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onSortSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"sort\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Sort' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onGroupbySettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"group-2\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Groups' | bbbTranslate }}\n </span>\n </div>\n </li>\n </fd-menu>\n } @if (viewCollection && viewCollection.length > 1) {\n <fd-split-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"deviceSize === 's' ? 'always' : 'low'\"\n [fdType]=\"'transparent'\"\n [mainAction]=\"{\n keepMainAction: true,\n mainActionTitle: splitBtnTitle\n }\"\n >\n <fd-menu>\n @for (viewObject of viewCollection; track viewObject) {\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"onChangeView(viewObject)\" bodyClick>\n <span fd-menu-title>\n <fd-icon [glyph]=\"viewObject.UiComponent.Settings?.Icon\"> </fd-icon>\n </span>\n </div>\n </li>\n }\n </fd-menu>\n </fd-split-button>\n }\n <ng-template #splitBtnTitle>\n <fd-icon [glyph]=\"reportView.UiComponent.Settings?.Icon\"></fd-icon>\n </ng-template>\n <ng-template #splitBtnSettings>\n <fd-icon [glyph]=\"'action-settings'\"></fd-icon>\n </ng-template>\n }\n</fd-toolbar>\n}\n", styles: [":host{display:block;width:100%;position:relative}:host fd-toolbar.border-b-0{border-bottom-width:0px!important}:host ::ng-deep .fd-toolbar{flex-wrap:nowrap!important}:host ::ng-deep .fd-toolbar{border-top:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-left:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-right:var(--sapList_BorderWidth) solid var(--sapList_BorderColor)}:host fd-toolbar.s ::ng-deep .fd-toolbar{justify-content:end}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.DynamicFormToolbaritemComponent, selector: "bnrc-dynamic-form-toolbaritem", inputs: ["mo", "index", "deviceName", "deviceSize", "context", "btn", "isEnable", "showText", "allColumns", "conditionalFormats"], outputs: ["btnClick"] }, { kind: "directive", type: i2.UlvCommandDirective, selector: "[ulvCommandHandler]", inputs: ["ulvCommandHandler", "disable"], outputs: ["commandClick"] }, { kind: "directive", type: i2.IntersectionObserverDirective, selector: "[intersectionObserver]", inputs: ["intersectionDebounce", "intersectionRootMargin", "intersectionRoot", "intersectionThreshold"], outputs: ["visibilityChange"] }, { kind: "directive", type: i2.BodyClickDirective, selector: "[bodyClick]", inputs: ["disableBodyClick"] }, { kind: "component", type: i3.ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i4.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "color", "background", "class", "ariaLabel", "ariaHidden"] }, { kind: "component", type: i5.MenuComponent, selector: "fd-menu", inputs: ["mobile", "disabled", "focusTrapped", "focusAutoCapture", "openOnHoverTime", "mobileConfig", "ariaLabel", "ariaLabelledby", "id"], outputs: ["activePath"] }, { kind: "component", type: i5.MenuItemComponent, selector: "li[fd-menu-item]", inputs: ["disabled", "itemId", "submenu", "parentSubmenu", "hasSeparator"], outputs: ["onSelect"], exportAs: ["fd-menu-item"] }, { kind: "component", type: i5.MenuInteractiveComponent, selector: "[fd-menu-interactive]" }, { kind: "directive", type: i5.MenuTitleDirective, selector: "[fd-menu-title]" }, { kind: "component", type: i5.MenuAddonDirective, selector: "fd-menu-addon", inputs: ["position", "submenuIndicator", "ariaHidden"] }, { kind: "directive", type: i5.MenuTriggerDirective, selector: "[fdMenuTrigger]", inputs: ["fdMenuTrigger"] }, { kind: "component", type: i6.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i7.SplitButtonComponent, selector: "fd-split-button", inputs: ["glyph", "glyphFont", "disabled", "fdType", "expandButtonTitle", "selected", "fixedWidth", "mainAction", "arialLabel"], outputs: ["primaryButtonClicked"] }, { kind: "component", type: i8.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i8.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "directive", type: i8.ToolbarSpacerDirective, selector: "fd-toolbar-spacer", inputs: ["width", "class", "fixed"] }, { kind: "component", type: i8.ToolbarSeparatorComponent, selector: "fd-toolbar-separator" }, { kind: "pipe", type: i2.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
101
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: UlvToolbarComponent, selector: "bsu-ulv-toolbar", inputs: { allowGridColumnSort: "allowGridColumnSort", useLayoutItemTextForControl: "useLayoutItemTextForControl", enableSearch: "enableSearch", hideTitle: "hideTitle", title: "title", icon: "icon", deviceName: "deviceName", deviceSize: "deviceSize", access: "access", hideToolbar: "hideToolbar", toolbarButtons: "toolbarButtons", contentDensity: "contentDensity", inlineEditMode: "inlineEditMode", allowInlineEdit: "allowInlineEdit", gridSetting: "gridSetting", viewCollection: "viewCollection", reportView: "reportView", inDialog: "inDialog", isMultiSelect: "isMultiSelect", cls: "cls", hasSelected: "hasSelected", config: "config", hidden: "hidden", buttons: "buttons", moDataListCount: "moDataListCount" }, outputs: { search: "search", groupbyClick: "groupbyClick", sortClick: "sortClick", columnClick: "columnClick", editModeClick: "editModeClick", viewClick: "viewClick", createNewInlineMo: "createNewInlineMo" }, viewQueries: [{ propertyName: "_tlbCmp", first: true, predicate: ToolbarComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n style=\"width: 100%; height: 0; visibility: hidden; opacity: 0\"\n intersectionObserver\n [intersectionThreshold]=\"0.1\"\n (visibilityChange)=\"onVisibilityChange($event)\"\n></div>\n@if (!useLayoutItemTextForControl && !hideToolbar && visibled) {\n<fd-toolbar\n #toolbar\n [shouldOverflow]=\"deviceSize === 's'\"\n [ngClass]=\"deviceSize\"\n [hasTitle]=\"!hideTitle\"\n [forceOverflow]=\"true\"\n [ngClass]=\"cls\"\n>\n @if(!hideTitle && deviceSize !== 's' ? (title | bbbTranslate) : ''){ @if(icon){\n <fd-icon [glyph]=\"icon\"></fd-icon>\n }\n <h4 fd-title>{{ title | bbbTranslate }}</h4>\n } @if (deviceSize !== 's') {\n <fd-toolbar-spacer fd-toolbar-item></fd-toolbar-spacer>\n } @if (!hideToolbar) { @for (btn of toolbarButtons; track _trackBy(i, btn); let i = $index) { @if (btn !== '-' &&\n btn.Command && !btn.Command.CustomUi && !btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"btn.itemId === 'Edit' ? 'always' : btn.Command?.IsBuiltin ? 'low' : 'high'\"\n [ulvCommandHandler]=\"btn\"\n [disable]=\"inlineEditMode && btn.itemId === 'New'\"\n [disabled]=\"btn.Command._isEnable === false ? true : false\"\n [fdType]=\"!btn.Command._isEnable ? 'transparent' : btn.Command.JsonExtraProp?.Design || 'transparent'\"\n [glyph]=\"deviceSize === 's' ? null : btn.Command.JsonExtraProp?.Icon\"\n [title]=\"(btn.Command?.IsBuiltin ? btn.text : '') | bbbTranslate\"\n (click)=\"inlineEditMode && btn.itemId === 'New' && createNewInlineMo.emit()\"\n bodyClick\n >\n @if (!btn.Command.JsonExtraProp?.Icon && !btn.Command?.IsBuiltin && btn.icon) {\n <img width=\"16\" [src]=\"btn.icon\" />\n } @if (!btn.hideText || deviceSize === 's') {\n <span>{{ btn.text | bbbTranslate }}</span>\n }\n </button>\n } @if ((btn === '-' || btn.type === 'seperator') && deviceName !== 'mobile') {\n <fd-toolbar-separator fd-toolbar-item></fd-toolbar-separator>\n } @if (btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [fdMenu]=\"true\"\n [fdType]=\"btn.Command?.IsBuiltin ? 'standard' : 'transparent'\"\n [label]=\"btn.text | bbbTranslate\"\n [ariaLabel]=\"btn.text | bbbTranslate\"\n [fdMenuTrigger]=\"menu\"\n bodyClick\n >\n <fd-menu #menu>\n @for (btnCommand of btn.menu.items; track btnCommand) {\n <li fd-menu-item [ulvCommandHandler]=\"btnCommand\" (click)=\"menu.close()\">\n <div fd-menu-interactive>\n <span fd-menu-title>{{ btnCommand.text | bbbTranslate }}</span>\n </div>\n </li>\n }\n </fd-menu>\n </button>\n } @if (btn !== '-' && btn.Command && btn.Command.CustomUi) {\n <bnrc-dynamic-form-toolbaritem\n fd-toolbar-item\n [ulvCommandHandler]=\"btn\"\n [component]=\"btn.Command?.CustomUi\"\n [context]=\"btn\"\n [isEnable]=\"btn.Command?._isEnable\"\n [deviceName]=\"deviceName\"\n [deviceSize]=\"deviceSize\"\n bodyClick\n ></bnrc-dynamic-form-toolbaritem>\n } }\n <ng-content select=\"[fd-toolbar-item]\"></ng-content>\n @if (allowInlineEdit && access?.Edit) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"inlineEditMode ? 'emphasized' : 'transparent'\"\n [glyph]=\"'edit'\"\n [label]=\"deviceSize === 's' ? ('Inline Edit In List' | bbbTranslate) : ''\"\n (click)=\"onEditMode()\"\n [attr.fdOverflowPriority]=\"'always'\"\n [title]=\"'Inline Edit In List' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (gridSetting && gridSetting.Hidden !== true && allowGridColumnSort) { @if (deviceSize === 's') {\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onGroupbySettings()\"\n [label]=\"'Groups' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onSortSettings()\"\n [label]=\"'Sort' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onColumnSettings()\"\n [label]=\"'Columns' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (deviceSize !== 's') {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"'never'\"\n [fdMenu]=\"true\"\n fdType=\"transparent\"\n glyph=\"action-settings\"\n [title]=\"'Settings' | bbbTranslate\"\n [fdMenuTrigger]=\"tableMenuSettings\"\n bodyClick\n ></button>\n }\n <fd-menu #tableMenuSettings>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onColumnSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"action-settings\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Columns' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onSortSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"sort\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Sort' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onGroupbySettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"group-2\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Groups' | bbbTranslate }}\n </span>\n </div>\n </li>\n </fd-menu>\n } @if (viewCollection && viewCollection.length > 1) {\n <fd-split-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"deviceSize === 's' ? 'always' : 'low'\"\n [fdType]=\"'transparent'\"\n [mainAction]=\"{\n keepMainAction: true,\n mainActionTitle: splitBtnTitle\n }\"\n >\n <fd-menu>\n @for (viewObject of viewCollection; track viewObject) {\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"onChangeView(viewObject)\" bodyClick>\n <span fd-menu-title>\n <fd-icon [glyph]=\"viewObject.UiComponent.Settings?.Icon\"> </fd-icon>\n </span>\n </div>\n </li>\n }\n </fd-menu>\n </fd-split-button>\n }\n <ng-template #splitBtnTitle>\n <fd-icon [glyph]=\"reportView.UiComponent.Settings?.Icon\"></fd-icon>\n </ng-template>\n <ng-template #splitBtnSettings>\n <fd-icon [glyph]=\"'action-settings'\"></fd-icon>\n </ng-template>\n }\n</fd-toolbar>\n}\n", styles: [":host{display:block;width:100%;position:relative}:host fd-toolbar.border-b-0{border-bottom-width:0px!important}:host ::ng-deep .fd-toolbar{flex-wrap:nowrap!important}:host ::ng-deep .fd-toolbar{border-top:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-left:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-right:var(--sapList_BorderWidth) solid var(--sapList_BorderColor)}:host fd-toolbar.s ::ng-deep .fd-toolbar{justify-content:end}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.DynamicFormToolbaritemComponent, selector: "bnrc-dynamic-form-toolbaritem", inputs: ["mo", "index", "deviceName", "deviceSize", "context", "btn", "isEnable", "showText", "allColumns", "conditionalFormats"], outputs: ["btnClick"] }, { kind: "directive", type: i2.UlvCommandDirective, selector: "[ulvCommandHandler]", inputs: ["ulvCommandHandler", "disable"], outputs: ["commandClick"] }, { kind: "directive", type: i2.IntersectionObserverDirective, selector: "[intersectionObserver]", inputs: ["intersectionDebounce", "intersectionRootMargin", "intersectionRoot", "intersectionThreshold"], outputs: ["visibilityChange"] }, { kind: "directive", type: i2.BodyClickDirective, selector: "[bodyClick]", inputs: ["disableBodyClick"] }, { kind: "component", type: i3.ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i4.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "color", "background", "class", "ariaLabel", "ariaHidden"] }, { kind: "component", type: i5.MenuComponent, selector: "fd-menu", inputs: ["mobile", "disabled", "focusTrapped", "focusAutoCapture", "openOnHoverTime", "mobileConfig", "ariaLabel", "ariaLabelledby", "id"], outputs: ["activePath"] }, { kind: "component", type: i5.MenuItemComponent, selector: "li[fd-menu-item]", inputs: ["disabled", "itemId", "submenu", "parentSubmenu", "hasSeparator"], outputs: ["onSelect"], exportAs: ["fd-menu-item"] }, { kind: "component", type: i5.MenuInteractiveComponent, selector: "[fd-menu-interactive]" }, { kind: "directive", type: i5.MenuTitleDirective, selector: "[fd-menu-title]" }, { kind: "component", type: i5.MenuAddonDirective, selector: "fd-menu-addon", inputs: ["position", "submenuIndicator", "ariaHidden"] }, { kind: "directive", type: i5.MenuTriggerDirective, selector: "[fdMenuTrigger]", inputs: ["fdMenuTrigger"] }, { kind: "component", type: i6.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i7.SplitButtonComponent, selector: "fd-split-button", inputs: ["glyph", "glyphFont", "disabled", "fdType", "expandButtonTitle", "selected", "fixedWidth", "mainAction", "arialLabel"], outputs: ["primaryButtonClicked"] }, { kind: "component", type: i8.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i8.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "directive", type: i8.ToolbarSpacerDirective, selector: "fd-toolbar-spacer", inputs: ["width", "class", "fixed"] }, { kind: "component", type: i8.ToolbarSeparatorComponent, selector: "fd-toolbar-separator" }, { kind: "pipe", type: i2.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
79
102
  }
80
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: UlvToolbarComponent, decorators: [{
81
104
  type: Component,
82
- args: [{ selector: 'bsu-ulv-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!useLayoutItemTextForControl && !hideToolbar) {\n<fd-toolbar\n #toolbar\n [shouldOverflow]=\"deviceSize === 's'\"\n [ngClass]=\"deviceSize\"\n [hasTitle]=\"!hideTitle\"\n [forceOverflow]=\"true\"\n [ngClass]=\"cls\"\n intersectionObserver\n [intersectionThreshold]=\"0.1\"\n (visibilityChange)=\"onVisibilityChange($event)\"\n>\n @if(!hideTitle && deviceSize !== 's' ? (title | bbbTranslate) : ''){ @if(icon){\n <fd-icon [glyph]=\"icon\"></fd-icon>\n }\n <h4 fd-title>{{ title | bbbTranslate }}</h4>\n } @if (deviceSize !== 's') {\n <fd-toolbar-spacer fd-toolbar-item></fd-toolbar-spacer>\n } @if (!hideToolbar) { @for (btn of toolbarButtons; track _trackBy(i, btn); let i = $index) { @if (btn !== '-' &&\n btn.Command && !btn.Command.CustomUi && !btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"btn.itemId === 'Edit' ? 'always' : btn.Command?.IsBuiltin ? 'low' : 'high'\"\n [ulvCommandHandler]=\"btn\"\n [disable]=\"inlineEditMode && btn.itemId === 'New'\"\n [disabled]=\"btn.Command._isEnable === false ? true : false\"\n [fdType]=\"!btn.Command._isEnable ? 'transparent' : btn.Command.JsonExtraProp?.Design || 'transparent'\"\n [glyph]=\"deviceSize === 's' ? null : btn.Command.JsonExtraProp?.Icon\"\n [title]=\"(btn.Command?.IsBuiltin ? btn.text : '') | bbbTranslate\"\n (click)=\"inlineEditMode && btn.itemId === 'New' && createNewInlineMo.emit()\"\n bodyClick\n >\n @if (!btn.Command.JsonExtraProp?.Icon && !btn.Command?.IsBuiltin && btn.icon) {\n <img width=\"16\" [src]=\"btn.icon\" />\n } @if (!btn.hideText || deviceSize === 's') {\n <span>{{ btn.text | bbbTranslate }}</span>\n }\n </button>\n } @if ((btn === '-' || btn.type === 'seperator') && deviceName !== 'mobile') {\n <fd-toolbar-separator fd-toolbar-item></fd-toolbar-separator>\n } @if (btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [fdMenu]=\"true\"\n [fdType]=\"btn.Command?.IsBuiltin ? 'standard' : 'transparent'\"\n [label]=\"btn.text | bbbTranslate\"\n [ariaLabel]=\"btn.text | bbbTranslate\"\n [fdMenuTrigger]=\"menu\"\n bodyClick\n >\n <fd-menu #menu>\n @for (btnCommand of btn.menu.items; track btnCommand) {\n <li fd-menu-item [ulvCommandHandler]=\"btnCommand\" (click)=\"menu.close()\">\n <div fd-menu-interactive>\n <span fd-menu-title>{{ btnCommand.text | bbbTranslate }}</span>\n </div>\n </li>\n }\n </fd-menu>\n </button>\n } @if (btn !== '-' && btn.Command && btn.Command.CustomUi) {\n <bnrc-dynamic-form-toolbaritem\n fd-toolbar-item\n [ulvCommandHandler]=\"btn\"\n [component]=\"btn.Command?.CustomUi\"\n [context]=\"btn\"\n [isEnable]=\"btn.Command?._isEnable\"\n [deviceName]=\"deviceName\"\n [deviceSize]=\"deviceSize\"\n bodyClick\n ></bnrc-dynamic-form-toolbaritem>\n } }\n <ng-content select=\"[fd-toolbar-item]\"></ng-content>\n @if (allowInlineEdit && access?.Edit) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"inlineEditMode ? 'emphasized' : 'transparent'\"\n [glyph]=\"'edit'\"\n [label]=\"deviceSize === 's' ? ('Inline Edit In List' | bbbTranslate) : ''\"\n (click)=\"onEditMode()\"\n [attr.fdOverflowPriority]=\"'always'\"\n [title]=\"'Inline Edit In List' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (gridSetting && gridSetting.Hidden !== true && allowGridColumnSort) { @if (deviceSize === 's') {\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onGroupbySettings()\"\n [label]=\"'Groups' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onSortSettings()\"\n [label]=\"'Sort' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onColumnSettings()\"\n [label]=\"'Columns' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (deviceSize !== 's') {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"'never'\"\n [fdMenu]=\"true\"\n fdType=\"transparent\"\n glyph=\"action-settings\"\n [title]=\"'Settings' | bbbTranslate\"\n [fdMenuTrigger]=\"tableMenuSettings\"\n bodyClick\n ></button>\n }\n <fd-menu #tableMenuSettings>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onColumnSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"action-settings\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Columns' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onSortSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"sort\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Sort' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onGroupbySettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"group-2\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Groups' | bbbTranslate }}\n </span>\n </div>\n </li>\n </fd-menu>\n } @if (viewCollection && viewCollection.length > 1) {\n <fd-split-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"deviceSize === 's' ? 'always' : 'low'\"\n [fdType]=\"'transparent'\"\n [mainAction]=\"{\n keepMainAction: true,\n mainActionTitle: splitBtnTitle\n }\"\n >\n <fd-menu>\n @for (viewObject of viewCollection; track viewObject) {\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"onChangeView(viewObject)\" bodyClick>\n <span fd-menu-title>\n <fd-icon [glyph]=\"viewObject.UiComponent.Settings?.Icon\"> </fd-icon>\n </span>\n </div>\n </li>\n }\n </fd-menu>\n </fd-split-button>\n }\n <ng-template #splitBtnTitle>\n <fd-icon [glyph]=\"reportView.UiComponent.Settings?.Icon\"></fd-icon>\n </ng-template>\n <ng-template #splitBtnSettings>\n <fd-icon [glyph]=\"'action-settings'\"></fd-icon>\n </ng-template>\n }\n</fd-toolbar>\n}\n", styles: [":host{display:block;width:100%;position:relative}:host fd-toolbar.border-b-0{border-bottom-width:0px!important}:host ::ng-deep .fd-toolbar{flex-wrap:nowrap!important}:host ::ng-deep .fd-toolbar{border-top:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-left:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-right:var(--sapList_BorderWidth) solid var(--sapList_BorderColor)}:host fd-toolbar.s ::ng-deep .fd-toolbar{justify-content:end}\n"] }]
105
+ args: [{ selector: 'bsu-ulv-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n style=\"width: 100%; height: 0; visibility: hidden; opacity: 0\"\n intersectionObserver\n [intersectionThreshold]=\"0.1\"\n (visibilityChange)=\"onVisibilityChange($event)\"\n></div>\n@if (!useLayoutItemTextForControl && !hideToolbar && visibled) {\n<fd-toolbar\n #toolbar\n [shouldOverflow]=\"deviceSize === 's'\"\n [ngClass]=\"deviceSize\"\n [hasTitle]=\"!hideTitle\"\n [forceOverflow]=\"true\"\n [ngClass]=\"cls\"\n>\n @if(!hideTitle && deviceSize !== 's' ? (title | bbbTranslate) : ''){ @if(icon){\n <fd-icon [glyph]=\"icon\"></fd-icon>\n }\n <h4 fd-title>{{ title | bbbTranslate }}</h4>\n } @if (deviceSize !== 's') {\n <fd-toolbar-spacer fd-toolbar-item></fd-toolbar-spacer>\n } @if (!hideToolbar) { @for (btn of toolbarButtons; track _trackBy(i, btn); let i = $index) { @if (btn !== '-' &&\n btn.Command && !btn.Command.CustomUi && !btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"btn.itemId === 'Edit' ? 'always' : btn.Command?.IsBuiltin ? 'low' : 'high'\"\n [ulvCommandHandler]=\"btn\"\n [disable]=\"inlineEditMode && btn.itemId === 'New'\"\n [disabled]=\"btn.Command._isEnable === false ? true : false\"\n [fdType]=\"!btn.Command._isEnable ? 'transparent' : btn.Command.JsonExtraProp?.Design || 'transparent'\"\n [glyph]=\"deviceSize === 's' ? null : btn.Command.JsonExtraProp?.Icon\"\n [title]=\"(btn.Command?.IsBuiltin ? btn.text : '') | bbbTranslate\"\n (click)=\"inlineEditMode && btn.itemId === 'New' && createNewInlineMo.emit()\"\n bodyClick\n >\n @if (!btn.Command.JsonExtraProp?.Icon && !btn.Command?.IsBuiltin && btn.icon) {\n <img width=\"16\" [src]=\"btn.icon\" />\n } @if (!btn.hideText || deviceSize === 's') {\n <span>{{ btn.text | bbbTranslate }}</span>\n }\n </button>\n } @if ((btn === '-' || btn.type === 'seperator') && deviceName !== 'mobile') {\n <fd-toolbar-separator fd-toolbar-item></fd-toolbar-separator>\n } @if (btn.menu) {\n <button\n fd-button\n fd-toolbar-item\n [fdMenu]=\"true\"\n [fdType]=\"btn.Command?.IsBuiltin ? 'standard' : 'transparent'\"\n [label]=\"btn.text | bbbTranslate\"\n [ariaLabel]=\"btn.text | bbbTranslate\"\n [fdMenuTrigger]=\"menu\"\n bodyClick\n >\n <fd-menu #menu>\n @for (btnCommand of btn.menu.items; track btnCommand) {\n <li fd-menu-item [ulvCommandHandler]=\"btnCommand\" (click)=\"menu.close()\">\n <div fd-menu-interactive>\n <span fd-menu-title>{{ btnCommand.text | bbbTranslate }}</span>\n </div>\n </li>\n }\n </fd-menu>\n </button>\n } @if (btn !== '-' && btn.Command && btn.Command.CustomUi) {\n <bnrc-dynamic-form-toolbaritem\n fd-toolbar-item\n [ulvCommandHandler]=\"btn\"\n [component]=\"btn.Command?.CustomUi\"\n [context]=\"btn\"\n [isEnable]=\"btn.Command?._isEnable\"\n [deviceName]=\"deviceName\"\n [deviceSize]=\"deviceSize\"\n bodyClick\n ></bnrc-dynamic-form-toolbaritem>\n } }\n <ng-content select=\"[fd-toolbar-item]\"></ng-content>\n @if (allowInlineEdit && access?.Edit) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"inlineEditMode ? 'emphasized' : 'transparent'\"\n [glyph]=\"'edit'\"\n [label]=\"deviceSize === 's' ? ('Inline Edit In List' | bbbTranslate) : ''\"\n (click)=\"onEditMode()\"\n [attr.fdOverflowPriority]=\"'always'\"\n [title]=\"'Inline Edit In List' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (gridSetting && gridSetting.Hidden !== true && allowGridColumnSort) { @if (deviceSize === 's') {\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onGroupbySettings()\"\n [label]=\"'Groups' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onSortSettings()\"\n [label]=\"'Sort' | bbbTranslate\"\n bodyClick\n ></button>\n <button\n fd-toolbar-item\n fd-button\n [contentDensity]=\"contentDensity\"\n fdType=\"transparent\"\n [attr.fdOverflowPriority]=\"'always'\"\n (click)=\"onColumnSettings()\"\n [label]=\"'Columns' | bbbTranslate\"\n bodyClick\n ></button>\n } @if (deviceSize !== 's') {\n <button\n fd-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"'never'\"\n [fdMenu]=\"true\"\n fdType=\"transparent\"\n glyph=\"action-settings\"\n [title]=\"'Settings' | bbbTranslate\"\n [fdMenuTrigger]=\"tableMenuSettings\"\n bodyClick\n ></button>\n }\n <fd-menu #tableMenuSettings>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onColumnSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"action-settings\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Columns' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onSortSettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"sort\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Sort' | bbbTranslate }}\n </span>\n </div>\n </li>\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"tableMenuSettings.close(); onGroupbySettings()\" bodyClick>\n <fd-menu-addon position=\"before\" glyph=\"group-2\"></fd-menu-addon>\n <span fd-menu-title>\n {{ 'Groups' | bbbTranslate }}\n </span>\n </div>\n </li>\n </fd-menu>\n } @if (viewCollection && viewCollection.length > 1) {\n <fd-split-button\n fd-toolbar-item\n [attr.fdOverflowPriority]=\"deviceSize === 's' ? 'always' : 'low'\"\n [fdType]=\"'transparent'\"\n [mainAction]=\"{\n keepMainAction: true,\n mainActionTitle: splitBtnTitle\n }\"\n >\n <fd-menu>\n @for (viewObject of viewCollection; track viewObject) {\n <li fd-menu-item>\n <div fd-menu-interactive (click)=\"onChangeView(viewObject)\" bodyClick>\n <span fd-menu-title>\n <fd-icon [glyph]=\"viewObject.UiComponent.Settings?.Icon\"> </fd-icon>\n </span>\n </div>\n </li>\n }\n </fd-menu>\n </fd-split-button>\n }\n <ng-template #splitBtnTitle>\n <fd-icon [glyph]=\"reportView.UiComponent.Settings?.Icon\"></fd-icon>\n </ng-template>\n <ng-template #splitBtnSettings>\n <fd-icon [glyph]=\"'action-settings'\"></fd-icon>\n </ng-template>\n }\n</fd-toolbar>\n}\n", styles: [":host{display:block;width:100%;position:relative}:host fd-toolbar.border-b-0{border-bottom-width:0px!important}:host ::ng-deep .fd-toolbar{flex-wrap:nowrap!important}:host ::ng-deep .fd-toolbar{border-top:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-left:var(--sapList_BorderWidth) solid var(--sapList_BorderColor);border-right:var(--sapList_BorderWidth) solid var(--sapList_BorderColor)}:host fd-toolbar.s ::ng-deep .fd-toolbar{justify-content:end}\n"] }]
83
106
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { _tlbCmp: [{
84
107
  type: ViewChild,
85
108
  args: [ToolbarComponent]
@@ -148,4 +171,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
148
171
  }], createNewInlineMo: [{
149
172
  type: Output
150
173
  }] } });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWx2LXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWx2LXRvb2xiYXIvdWx2LXRvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWx2LXRvb2xiYXIvdWx2LXRvb2xiYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RSxPQUFPLEVBQ0gsYUFBYSxFQUtoQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7O0FBUTlCLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxhQUFhO0lBb0NsRCxZQUFtQixFQUFjLEVBQVUsSUFBdUI7UUFDOUQsS0FBSyxFQUFFLENBQUM7UUFETyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUEvQnpELGNBQVMsR0FBRyxLQUFLLENBQUM7UUF1QmpCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3BDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMxQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN2QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDekMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUNqRCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBSXZELENBQUM7SUFDRCxlQUFlO1FBQ1gsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ25DLElBQUksY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzdCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMzQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRXZCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUIsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFDRCxpQkFBaUI7UUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELGNBQWM7UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELGdCQUFnQjtRQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsVUFBVTtRQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVksQ0FBQyxJQUFzQjtRQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQ2hCLE9BQU8sSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBQ00sUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBQ08sZUFBZTtRQUNuQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7OEdBeEZRLG1CQUFtQjtrR0FBbkIsbUJBQW1CLHUvQkFDakIsZ0JBQWdCLDRGQzdCL0IscW9PQTZMQTs7MkZEakthLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDSSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTTsrR0FHbEIsT0FBTztzQkFBbkMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ2xCLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHksIFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xuXG5pbXBvcnQge1xuICAgIEJhc2VDb21wb25lbnQsXG4gICAgRGVmYXVsdENvbW1hbmRzQWNjZXNzLFxuICAgIEFiYnJldmF0aW9uRGV2aWNlU2l6ZSxcbiAgICBEZXZpY2VTaXplLFxuICAgIFVpUmVwb3J0Vmlld0Jhc2Vcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2JzdS11bHYtdG9vbGJhcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Vsdi10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi91bHYtdG9vbGJhci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFVsdlRvb2xiYXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBAVmlld0NoaWxkKFRvb2xiYXJDb21wb25lbnQpIF90bGJDbXA6IFRvb2xiYXJDb21wb25lbnQ7XG4gICAgQElucHV0KCkgYWxsb3dHcmlkQ29sdW1uU29ydDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB1c2VMYXlvdXRJdGVtVGV4dEZvckNvbnRyb2w6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZW5hYmxlU2VhcmNoOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVUaXRsZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaWNvbjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRldmljZU5hbWU6IERldmljZVNpemU7XG4gICAgQElucHV0KCkgZGV2aWNlU2l6ZTogQWJicmV2YXRpb25EZXZpY2VTaXplO1xuICAgIEBJbnB1dCgpIGFjY2VzczogRGVmYXVsdENvbW1hbmRzQWNjZXNzO1xuICAgIEBJbnB1dCgpIGhpZGVUb29sYmFyOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHRvb2xiYXJCdXR0b25zOiBhbnlbXTtcbiAgICBASW5wdXQoKSBjb250ZW50RGVuc2l0eTogQ29udGVudERlbnNpdHk7XG4gICAgQElucHV0KCkgaW5saW5lRWRpdE1vZGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYWxsb3dJbmxpbmVFZGl0OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGdyaWRTZXR0aW5nOiBhbnk7XG4gICAgQElucHV0KCkgdmlld0NvbGxlY3Rpb246IGFueVtdO1xuICAgIEBJbnB1dCgpIHJlcG9ydFZpZXc6IFVpUmVwb3J0Vmlld0Jhc2U7XG4gICAgQElucHV0KCkgaW5EaWFsb2c6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNNdWx0aVNlbGVjdDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjbHM6IGFueTtcblxuICAgIEBJbnB1dCgpIGhhc1NlbGVjdGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbmZpZzogYW55O1xuICAgIEBJbnB1dCgpIGhpZGRlbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBidXR0b25zOiBhbnlbXTtcbiAgICBASW5wdXQoKSBtb0RhdGFMaXN0Q291bnQ6IG51bWJlcjtcbiAgICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgQE91dHB1dCgpIGdyb3VwYnlDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIEBPdXRwdXQoKSBzb3J0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgICBAT3V0cHV0KCkgY29sdW1uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgICBAT3V0cHV0KCkgZWRpdE1vZGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgdmlld0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxVaVJlcG9ydFZpZXdCYXNlPigpO1xuICAgIEBPdXRwdXQoKSBjcmVhdGVOZXdJbmxpbmVNbyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBlbmFibGU6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IocHVibGljIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIGNvbnN0IHsgdG9vbGJhckJ1dHRvbnMgfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmICh0b29sYmFyQnV0dG9ucykge1xuICAgICAgICAgICAgaWYgKHRvb2xiYXJCdXR0b25zLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hUb29sYmFyKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hUb29sYmFyKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG9uVmlzaWJpbGl0eUNoYW5nZShlKTogdm9pZCB7XG4gICAgICAgIGlmIChlID09PSAnVmlzaWJsZScpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hUb29sYmFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Hcm91cGJ5U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ3JvdXBieUNsaWNrLmVtaXQodGhpcy5kZXZpY2VOYW1lKTtcbiAgICB9XG4gICAgb25Tb3J0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc29ydENsaWNrLmVtaXQodGhpcy5kZXZpY2VOYW1lKTtcbiAgICB9XG4gICAgb25Db2x1bW5TZXR0aW5ncygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2x1bW5DbGljay5lbWl0KHRoaXMuZGV2aWNlTmFtZSk7XG4gICAgfVxuICAgIG9uRWRpdE1vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdE1vZGVDbGljay5lbWl0KCk7XG4gICAgfVxuICAgIG9uQ2hhbmdlVmlldyh2aWV3OiBVaVJlcG9ydFZpZXdCYXNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlld0NsaWNrLmVtaXQodmlldyk7XG4gICAgfVxuICAgIF90cmFja0J5KGluZGV4LCBpdGVtKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0/Lml0ZW1JZDtcbiAgICB9XG4gICAgcHVibGljIGlkZW50aWZ5KGluZGV4LCBpdGVtKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGV4dDtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcmVmcmVzaFRvb2xiYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl90bGJDbXApIHtcbiAgICAgICAgICAgIHRoaXMuX3RsYkNtcC5mb3JjZU92ZXJmbG93ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl90bGJDbXAudXBkYXRlQ29sbGFwc2libGVJdGVtcygpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmICghdXNlTGF5b3V0SXRlbVRleHRGb3JDb250cm9sICYmICFoaWRlVG9vbGJhcikge1xuPGZkLXRvb2xiYXJcbiAgICAjdG9vbGJhclxuICAgIFtzaG91bGRPdmVyZmxvd109XCJkZXZpY2VTaXplID09PSAncydcIlxuICAgIFtuZ0NsYXNzXT1cImRldmljZVNpemVcIlxuICAgIFtoYXNUaXRsZV09XCIhaGlkZVRpdGxlXCJcbiAgICBbZm9yY2VPdmVyZmxvd109XCJ0cnVlXCJcbiAgICBbbmdDbGFzc109XCJjbHNcIlxuICAgIGludGVyc2VjdGlvbk9ic2VydmVyXG4gICAgW2ludGVyc2VjdGlvblRocmVzaG9sZF09XCIwLjFcIlxuICAgICh2aXNpYmlsaXR5Q2hhbmdlKT1cIm9uVmlzaWJpbGl0eUNoYW5nZSgkZXZlbnQpXCJcbj5cbiAgICBAaWYoIWhpZGVUaXRsZSAmJiBkZXZpY2VTaXplICE9PSAncycgPyAodGl0bGUgfCBiYmJUcmFuc2xhdGUpIDogJycpeyBAaWYoaWNvbil7XG4gICAgPGZkLWljb24gW2dseXBoXT1cImljb25cIj48L2ZkLWljb24+XG4gICAgfVxuICAgIDxoNCBmZC10aXRsZT57eyB0aXRsZSB8IGJiYlRyYW5zbGF0ZSB9fTwvaDQ+XG4gICAgfSBAaWYgKGRldmljZVNpemUgIT09ICdzJykge1xuICAgIDxmZC10b29sYmFyLXNwYWNlciBmZC10b29sYmFyLWl0ZW0+PC9mZC10b29sYmFyLXNwYWNlcj5cbiAgICB9IEBpZiAoIWhpZGVUb29sYmFyKSB7IEBmb3IgKGJ0biBvZiB0b29sYmFyQnV0dG9uczsgdHJhY2sgX3RyYWNrQnkoaSwgYnRuKTsgbGV0IGkgPSAkaW5kZXgpIHsgQGlmIChidG4gIT09ICctJyAmJlxuICAgIGJ0bi5Db21tYW5kICYmICFidG4uQ29tbWFuZC5DdXN0b21VaSAmJiAhYnRuLm1lbnUpIHtcbiAgICA8YnV0dG9uXG4gICAgICAgIGZkLWJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2F0dHIuZmRPdmVyZmxvd1ByaW9yaXR5XT1cImJ0bi5pdGVtSWQgPT09ICdFZGl0JyA/ICdhbHdheXMnIDogYnRuLkNvbW1hbmQ/LklzQnVpbHRpbiA/ICdsb3cnIDogJ2hpZ2gnXCJcbiAgICAgICAgW3VsdkNvbW1hbmRIYW5kbGVyXT1cImJ0blwiXG4gICAgICAgIFtkaXNhYmxlXT1cImlubGluZUVkaXRNb2RlICYmIGJ0bi5pdGVtSWQgPT09ICdOZXcnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImJ0bi5Db21tYW5kLl9pc0VuYWJsZSA9PT0gZmFsc2UgPyB0cnVlIDogZmFsc2VcIlxuICAgICAgICBbZmRUeXBlXT1cIiFidG4uQ29tbWFuZC5faXNFbmFibGUgPyAndHJhbnNwYXJlbnQnIDogYnRuLkNvbW1hbmQuSnNvbkV4dHJhUHJvcD8uRGVzaWduIHx8ICd0cmFuc3BhcmVudCdcIlxuICAgICAgICBbZ2x5cGhdPVwiZGV2aWNlU2l6ZSA9PT0gJ3MnID8gbnVsbCA6IGJ0bi5Db21tYW5kLkpzb25FeHRyYVByb3A/Lkljb25cIlxuICAgICAgICBbdGl0bGVdPVwiKGJ0bi5Db21tYW5kPy5Jc0J1aWx0aW4gPyBidG4udGV4dCA6ICcnKSB8IGJiYlRyYW5zbGF0ZVwiXG4gICAgICAgIChjbGljayk9XCJpbmxpbmVFZGl0TW9kZSAmJiBidG4uaXRlbUlkID09PSAnTmV3JyAmJiBjcmVhdGVOZXdJbmxpbmVNby5lbWl0KClcIlxuICAgICAgICBib2R5Q2xpY2tcbiAgICA+XG4gICAgICAgIEBpZiAoIWJ0bi5Db21tYW5kLkpzb25FeHRyYVByb3A/Lkljb24gJiYgIWJ0bi5Db21tYW5kPy5Jc0J1aWx0aW4gJiYgYnRuLmljb24pIHtcbiAgICAgICAgPGltZyB3aWR0aD1cIjE2XCIgW3NyY109XCJidG4uaWNvblwiIC8+XG4gICAgICAgIH0gQGlmICghYnRuLmhpZGVUZXh0IHx8IGRldmljZVNpemUgPT09ICdzJykge1xuICAgICAgICA8c3Bhbj57eyBidG4udGV4dCB8IGJiYlRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgIDwvYnV0dG9uPlxuICAgIH0gQGlmICgoYnRuID09PSAnLScgfHwgYnRuLnR5cGUgPT09ICdzZXBlcmF0b3InKSAmJiBkZXZpY2VOYW1lICE9PSAnbW9iaWxlJykge1xuICAgIDxmZC10b29sYmFyLXNlcGFyYXRvciBmZC10b29sYmFyLWl0ZW0+PC9mZC10b29sYmFyLXNlcGFyYXRvcj5cbiAgICB9IEBpZiAoYnRuLm1lbnUpIHtcbiAgICA8YnV0dG9uXG4gICAgICAgIGZkLWJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2ZkTWVudV09XCJ0cnVlXCJcbiAgICAgICAgW2ZkVHlwZV09XCJidG4uQ29tbWFuZD8uSXNCdWlsdGluID8gJ3N0YW5kYXJkJyA6ICd0cmFuc3BhcmVudCdcIlxuICAgICAgICBbbGFiZWxdPVwiYnRuLnRleHQgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBbYXJpYUxhYmVsXT1cImJ0bi50ZXh0IHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgW2ZkTWVudVRyaWdnZXJdPVwibWVudVwiXG4gICAgICAgIGJvZHlDbGlja1xuICAgID5cbiAgICAgICAgPGZkLW1lbnUgI21lbnU+XG4gICAgICAgICAgICBAZm9yIChidG5Db21tYW5kIG9mIGJ0bi5tZW51Lml0ZW1zOyB0cmFjayBidG5Db21tYW5kKSB7XG4gICAgICAgICAgICA8bGkgZmQtbWVudS1pdGVtIFt1bHZDb21tYW5kSGFuZGxlcl09XCJidG5Db21tYW5kXCIgKGNsaWNrKT1cIm1lbnUuY2xvc2UoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZmQtbWVudS1pbnRlcmFjdGl2ZT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbWVudS10aXRsZT57eyBidG5Db21tYW5kLnRleHQgfCBiYmJUcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2ZkLW1lbnU+XG4gICAgPC9idXR0b24+XG4gICAgfSBAaWYgKGJ0biAhPT0gJy0nICYmIGJ0bi5Db21tYW5kICYmIGJ0bi5Db21tYW5kLkN1c3RvbVVpKSB7XG4gICAgPGJucmMtZHluYW1pYy1mb3JtLXRvb2xiYXJpdGVtXG4gICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICBbdWx2Q29tbWFuZEhhbmRsZXJdPVwiYnRuXCJcbiAgICAgICAgW2NvbXBvbmVudF09XCJidG4uQ29tbWFuZD8uQ3VzdG9tVWlcIlxuICAgICAgICBbY29udGV4dF09XCJidG5cIlxuICAgICAgICBbaXNFbmFibGVdPVwiYnRuLkNvbW1hbmQ/Ll9pc0VuYWJsZVwiXG4gICAgICAgIFtkZXZpY2VOYW1lXT1cImRldmljZU5hbWVcIlxuICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgYm9keUNsaWNrXG4gICAgPjwvYm5yYy1keW5hbWljLWZvcm0tdG9vbGJhcml0ZW0+XG4gICAgfSB9XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2ZkLXRvb2xiYXItaXRlbV1cIj48L25nLWNvbnRlbnQ+XG4gICAgQGlmIChhbGxvd0lubGluZUVkaXQgJiYgYWNjZXNzPy5FZGl0KSB7XG4gICAgPGJ1dHRvblxuICAgICAgICBmZC1idXR0b25cbiAgICAgICAgZmQtdG9vbGJhci1pdGVtXG4gICAgICAgIFtmZFR5cGVdPVwiaW5saW5lRWRpdE1vZGUgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgW2dseXBoXT1cIidlZGl0J1wiXG4gICAgICAgIFtsYWJlbF09XCJkZXZpY2VTaXplID09PSAncycgPyAoJ0lubGluZSBFZGl0IEluIExpc3QnIHwgYmJiVHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uRWRpdE1vZGUoKVwiXG4gICAgICAgIFthdHRyLmZkT3ZlcmZsb3dQcmlvcml0eV09XCInYWx3YXlzJ1wiXG4gICAgICAgIFt0aXRsZV09XCInSW5saW5lIEVkaXQgSW4gTGlzdCcgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBib2R5Q2xpY2tcbiAgICA+PC9idXR0b24+XG4gICAgfSBAaWYgKGdyaWRTZXR0aW5nICYmIGdyaWRTZXR0aW5nLkhpZGRlbiAhPT0gdHJ1ZSAmJiBhbGxvd0dyaWRDb2x1bW5Tb3J0KSB7IEBpZiAoZGV2aWNlU2l6ZSA9PT0gJ3MnKSB7XG4gICAgPGJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgIFtjb250ZW50RGVuc2l0eV09XCJjb250ZW50RGVuc2l0eVwiXG4gICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgW2F0dHIuZmRPdmVyZmxvd1ByaW9yaXR5XT1cIidhbHdheXMnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBieVNldHRpbmdzKClcIlxuICAgICAgICBbbGFiZWxdPVwiJ0dyb3VwcycgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBib2R5Q2xpY2tcbiAgICA+PC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgIFtjb250ZW50RGVuc2l0eV09XCJjb250ZW50RGVuc2l0eVwiXG4gICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgW2F0dHIuZmRPdmVyZmxvd1ByaW9yaXR5XT1cIidhbHdheXMnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uU29ydFNldHRpbmdzKClcIlxuICAgICAgICBbbGFiZWxdPVwiJ1NvcnQnIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgYm9keUNsaWNrXG4gICAgPjwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgZmQtdG9vbGJhci1pdGVtXG4gICAgICAgIGZkLWJ1dHRvblxuICAgICAgICBbY29udGVudERlbnNpdHldPVwiY29udGVudERlbnNpdHlcIlxuICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgIFthdHRyLmZkT3ZlcmZsb3dQcmlvcml0eV09XCInYWx3YXlzJ1wiXG4gICAgICAgIChjbGljayk9XCJvbkNvbHVtblNldHRpbmdzKClcIlxuICAgICAgICBbbGFiZWxdPVwiJ0NvbHVtbnMnIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgYm9keUNsaWNrXG4gICAgPjwvYnV0dG9uPlxuICAgIH0gQGlmIChkZXZpY2VTaXplICE9PSAncycpIHtcbiAgICA8YnV0dG9uXG4gICAgICAgIGZkLWJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2F0dHIuZmRPdmVyZmxvd1ByaW9yaXR5XT1cIiduZXZlcidcIlxuICAgICAgICBbZmRNZW51XT1cInRydWVcIlxuICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgIGdseXBoPVwiYWN0aW9uLXNldHRpbmdzXCJcbiAgICAgICAgW3RpdGxlXT1cIidTZXR0aW5ncycgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBbZmRNZW51VHJpZ2dlcl09XCJ0YWJsZU1lbnVTZXR0aW5nc1wiXG4gICAgICAgIGJvZHlDbGlja1xuICAgID48L2J1dHRvbj5cbiAgICB9XG4gICAgPGZkLW1lbnUgI3RhYmxlTWVudVNldHRpbmdzPlxuICAgICAgICA8bGkgZmQtbWVudS1pdGVtPlxuICAgICAgICAgICAgPGRpdiBmZC1tZW51LWludGVyYWN0aXZlIChjbGljayk9XCJ0YWJsZU1lbnVTZXR0aW5ncy5jbG9zZSgpOyBvbkNvbHVtblNldHRpbmdzKClcIiBib2R5Q2xpY2s+XG4gICAgICAgICAgICAgICAgPGZkLW1lbnUtYWRkb24gcG9zaXRpb249XCJiZWZvcmVcIiBnbHlwaD1cImFjdGlvbi1zZXR0aW5nc1wiPjwvZmQtbWVudS1hZGRvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQ29sdW1ucycgfCBiYmJUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIGZkLW1lbnUtaXRlbT5cbiAgICAgICAgICAgIDxkaXYgZmQtbWVudS1pbnRlcmFjdGl2ZSAoY2xpY2spPVwidGFibGVNZW51U2V0dGluZ3MuY2xvc2UoKTsgb25Tb3J0U2V0dGluZ3MoKVwiIGJvZHlDbGljaz5cbiAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwic29ydFwiPjwvZmQtbWVudS1hZGRvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICB7eyAnU29ydCcgfCBiYmJUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIGZkLW1lbnUtaXRlbT5cbiAgICAgICAgICAgIDxkaXYgZmQtbWVudS1pbnRlcmFjdGl2ZSAoY2xpY2spPVwidGFibGVNZW51U2V0dGluZ3MuY2xvc2UoKTsgb25Hcm91cGJ5U2V0dGluZ3MoKVwiIGJvZHlDbGljaz5cbiAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwiZ3JvdXAtMlwiPjwvZmQtbWVudS1hZGRvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICB7eyAnR3JvdXBzJyB8IGJiYlRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgIDwvZmQtbWVudT5cbiAgICB9IEBpZiAodmlld0NvbGxlY3Rpb24gJiYgdmlld0NvbGxlY3Rpb24ubGVuZ3RoID4gMSkge1xuICAgIDxmZC1zcGxpdC1idXR0b25cbiAgICAgICAgZmQtdG9vbGJhci1pdGVtXG4gICAgICAgIFthdHRyLmZkT3ZlcmZsb3dQcmlvcml0eV09XCJkZXZpY2VTaXplID09PSAncycgPyAnYWx3YXlzJyA6ICdsb3cnXCJcbiAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgW21haW5BY3Rpb25dPVwie1xuICAgICAgICAgICAga2VlcE1haW5BY3Rpb246IHRydWUsXG4gICAgICAgICAgICBtYWluQWN0aW9uVGl0bGU6IHNwbGl0QnRuVGl0bGVcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICA8ZmQtbWVudT5cbiAgICAgICAgICAgIEBmb3IgKHZpZXdPYmplY3Qgb2Ygdmlld0NvbGxlY3Rpb247IHRyYWNrIHZpZXdPYmplY3QpIHtcbiAgICAgICAgICAgIDxsaSBmZC1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgICAgPGRpdiBmZC1tZW51LWludGVyYWN0aXZlIChjbGljayk9XCJvbkNoYW5nZVZpZXcodmlld09iamVjdClcIiBib2R5Q2xpY2s+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGZkLW1lbnUtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtaWNvbiBbZ2x5cGhdPVwidmlld09iamVjdC5VaUNvbXBvbmVudC5TZXR0aW5ncz8uSWNvblwiPiA8L2ZkLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZmQtbWVudT5cbiAgICA8L2ZkLXNwbGl0LWJ1dHRvbj5cbiAgICB9XG4gICAgPG5nLXRlbXBsYXRlICNzcGxpdEJ0blRpdGxlPlxuICAgICAgICA8ZmQtaWNvbiBbZ2x5cGhdPVwicmVwb3J0Vmlldy5VaUNvbXBvbmVudC5TZXR0aW5ncz8uSWNvblwiPjwvZmQtaWNvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjc3BsaXRCdG5TZXR0aW5ncz5cbiAgICAgICAgPGZkLWljb24gW2dseXBoXT1cIidhY3Rpb24tc2V0dGluZ3MnXCI+PC9mZC1pY29uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgfVxuPC9mZC10b29sYmFyPlxufVxuIl19
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWx2LXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWx2LXRvb2xiYXIvdWx2LXRvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvdWx2LXRvb2xiYXIvdWx2LXRvb2xiYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFFVCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFrQixnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpFLE9BQU8sRUFDSCxhQUFhLEVBS2IsYUFBYSxFQUNoQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7QUFRakMsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGFBQWE7SUFzQ2xELFlBQW1CLEVBQWMsRUFBVSxJQUF1QjtRQUM5RCxLQUFLLEVBQUUsQ0FBQztRQURPLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQWpDekQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXVCakIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDcEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzFDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3ZDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsY0FBUyxHQUFHLElBQUksWUFB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QUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5LCBUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBCYXNlQ29tcG9uZW50LFxuICAgIERlZmF1bHRDb21tYW5kc0FjY2VzcyxcbiAgICBBYmJyZXZhdGlvbkRldmljZVNpemUsXG4gICAgRGV2aWNlU2l6ZSxcbiAgICBVaVJlcG9ydFZpZXdCYXNlLFxuICAgIFBvcnRhbFNlcnZpY2Vcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYnN1LXVsdi10b29sYmFyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdWx2LXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Vsdi10b29sYmFyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVWx2VG9vbGJhckNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBWaWV3Q2hpbGQoVG9vbGJhckNvbXBvbmVudCkgX3RsYkNtcDogVG9vbGJhckNvbXBvbmVudDtcbiAgICBASW5wdXQoKSBhbGxvd0dyaWRDb2x1bW5Tb3J0OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHVzZUxheW91dEl0ZW1UZXh0Rm9yQ29udHJvbDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBlbmFibGVTZWFyY2g6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlkZVRpdGxlID0gZmFsc2U7XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGV2aWNlTmFtZTogRGV2aWNlU2l6ZTtcbiAgICBASW5wdXQoKSBkZXZpY2VTaXplOiBBYmJyZXZhdGlvbkRldmljZVNpemU7XG4gICAgQElucHV0KCkgYWNjZXNzOiBEZWZhdWx0Q29tbWFuZHNBY2Nlc3M7XG4gICAgQElucHV0KCkgaGlkZVRvb2xiYXI6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdG9vbGJhckJ1dHRvbnM6IGFueVtdO1xuICAgIEBJbnB1dCgpIGNvbnRlbnREZW5zaXR5OiBDb250ZW50RGVuc2l0eTtcbiAgICBASW5wdXQoKSBpbmxpbmVFZGl0TW9kZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhbGxvd0lubGluZUVkaXQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZ3JpZFNldHRpbmc6IGFueTtcbiAgICBASW5wdXQoKSB2aWV3Q29sbGVjdGlvbjogYW55W107XG4gICAgQElucHV0KCkgcmVwb3J0VmlldzogVWlSZXBvcnRWaWV3QmFzZTtcbiAgICBASW5wdXQoKSBpbkRpYWxvZzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc011bHRpU2VsZWN0OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNsczogYW55O1xuXG4gICAgQElucHV0KCkgaGFzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29uZmlnOiBhbnk7XG4gICAgQElucHV0KCkgaGlkZGVuOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGJ1dHRvbnM6IGFueVtdO1xuICAgIEBJbnB1dCgpIG1vRGF0YUxpc3RDb3VudDogbnVtYmVyO1xuICAgIEBPdXRwdXQoKSBzZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgICBAT3V0cHV0KCkgZ3JvdXBieUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgQE91dHB1dCgpIHNvcnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIEBPdXRwdXQoKSBjb2x1bW5DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIEBPdXRwdXQoKSBlZGl0TW9kZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSB2aWV3Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFVpUmVwb3J0Vmlld0Jhc2U+KCk7XG4gICAgQE91dHB1dCgpIGNyZWF0ZU5ld0lubGluZU1vID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIGVuYWJsZTogYm9vbGVhbjtcbiAgICBfcmVuZGVyZXIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgX3BvcnRhbFNlcnZpY2UgPSBpbmplY3QoUG9ydGFsU2VydmljZSk7XG4gICAgY29uc3RydWN0b3IocHVibGljIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHRoaXMuX3BvcnRhbFNlcnZpY2Uud2luZG93UmVzaXplJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NldFdpZHRoKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICBjb25zdCB7IHRvb2xiYXJCdXR0b25zIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAodG9vbGJhckJ1dHRvbnMpIHtcbiAgICAgICAgICAgIGlmICh0b29sYmFyQnV0dG9ucy5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoVG9vbGJhcigpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoVG9vbGJhcigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpYmxlZCA9IGZhbHNlO1xuICAgIG9uVmlzaWJpbGl0eUNoYW5nZShlKTogdm9pZCB7XG4gICAgICAgIGlmIChlID09PSAnVmlzaWJsZScpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52aXNpYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldFdpZHRoKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hUb29sYmFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIF9zZXRXaWR0aCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpc2libGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB0aGlzLl9yZW5kZXJlcjIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCB4ICsgJ3B4Jyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFRvb2xiYXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uR3JvdXBieVNldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdyb3VwYnlDbGljay5lbWl0KHRoaXMuZGV2aWNlTmFtZSk7XG4gICAgfVxuICAgIG9uU29ydFNldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNvcnRDbGljay5lbWl0KHRoaXMuZGV2aWNlTmFtZSk7XG4gICAgfVxuICAgIG9uQ29sdW1uU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29sdW1uQ2xpY2suZW1pdCh0aGlzLmRldmljZU5hbWUpO1xuICAgIH1cbiAgICBvbkVkaXRNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRNb2RlQ2xpY2suZW1pdCgpO1xuICAgIH1cbiAgICBvbkNoYW5nZVZpZXcodmlldzogVWlSZXBvcnRWaWV3QmFzZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnZpZXdDbGljay5lbWl0KHZpZXcpO1xuICAgIH1cbiAgICBfdHJhY2tCeShpbmRleCwgaXRlbSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtPy5pdGVtSWQ7XG4gICAgfVxuICAgIHB1YmxpYyBpZGVudGlmeShpbmRleCwgaXRlbSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtLnRleHQ7XG4gICAgfVxuICAgIHByaXZhdGUgX3JlZnJlc2hUb29sYmFyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fdGxiQ21wKSB7XG4gICAgICAgICAgICB0aGlzLl90bGJDbXAuZm9yY2VPdmVyZmxvdyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fdGxiQ21wLnVwZGF0ZUNvbGxhcHNpYmxlSXRlbXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDA7IHZpc2liaWxpdHk6IGhpZGRlbjsgb3BhY2l0eTogMFwiXG4gICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJcbiAgICBbaW50ZXJzZWN0aW9uVGhyZXNob2xkXT1cIjAuMVwiXG4gICAgKHZpc2liaWxpdHlDaGFuZ2UpPVwib25WaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIlxuPjwvZGl2PlxuQGlmICghdXNlTGF5b3V0SXRlbVRleHRGb3JDb250cm9sICYmICFoaWRlVG9vbGJhciAmJiB2aXNpYmxlZCkge1xuPGZkLXRvb2xiYXJcbiAgICAjdG9vbGJhclxuICAgIFtzaG91bGRPdmVyZmxvd109XCJkZXZpY2VTaXplID09PSAncydcIlxuICAgIFtuZ0NsYXNzXT1cImRldmljZVNpemVcIlxuICAgIFtoYXNUaXRsZV09XCIhaGlkZVRpdGxlXCJcbiAgICBbZm9yY2VPdmVyZmxvd109XCJ0cnVlXCJcbiAgICBbbmdDbGFzc109XCJjbHNcIlxuPlxuICAgIEBpZighaGlkZVRpdGxlICYmIGRldmljZVNpemUgIT09ICdzJyA/ICh0aXRsZSB8IGJiYlRyYW5zbGF0ZSkgOiAnJyl7IEBpZihpY29uKXtcbiAgICA8ZmQtaWNvbiBbZ2x5cGhdPVwiaWNvblwiPjwvZmQtaWNvbj5cbiAgICB9XG4gICAgPGg0IGZkLXRpdGxlPnt7IHRpdGxlIHwgYmJiVHJhbnNsYXRlIH19PC9oND5cbiAgICB9IEBpZiAoZGV2aWNlU2l6ZSAhPT0gJ3MnKSB7XG4gICAgPGZkLXRvb2xiYXItc3BhY2VyIGZkLXRvb2xiYXItaXRlbT48L2ZkLXRvb2xiYXItc3BhY2VyPlxuICAgIH0gQGlmICghaGlkZVRvb2xiYXIpIHsgQGZvciAoYnRuIG9mIHRvb2xiYXJCdXR0b25zOyB0cmFjayBfdHJhY2tCeShpLCBidG4pOyBsZXQgaSA9ICRpbmRleCkgeyBAaWYgKGJ0biAhPT0gJy0nICYmXG4gICAgYnRuLkNvbW1hbmQgJiYgIWJ0bi5Db21tYW5kLkN1c3RvbVVpICYmICFidG4ubWVudSkge1xuICAgIDxidXR0b25cbiAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICBbYXR0ci5mZE92ZXJmbG93UHJpb3JpdHldPVwiYnRuLml0ZW1JZCA9PT0gJ0VkaXQnID8gJ2Fsd2F5cycgOiBidG4uQ29tbWFuZD8uSXNCdWlsdGluID8gJ2xvdycgOiAnaGlnaCdcIlxuICAgICAgICBbdWx2Q29tbWFuZEhhbmRsZXJdPVwiYnRuXCJcbiAgICAgICAgW2Rpc2FibGVdPVwiaW5saW5lRWRpdE1vZGUgJiYgYnRuLml0ZW1JZCA9PT0gJ05ldydcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiYnRuLkNvbW1hbmQuX2lzRW5hYmxlID09PSBmYWxzZSA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgIFtmZFR5cGVdPVwiIWJ0bi5Db21tYW5kLl9pc0VuYWJsZSA/ICd0cmFuc3BhcmVudCcgOiBidG4uQ29tbWFuZC5Kc29uRXh0cmFQcm9wPy5EZXNpZ24gfHwgJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgIFtnbHlwaF09XCJkZXZpY2VTaXplID09PSAncycgPyBudWxsIDogYnRuLkNvbW1hbmQuSnNvbkV4dHJhUHJvcD8uSWNvblwiXG4gICAgICAgIFt0aXRsZV09XCIoYnRuLkNvbW1hbmQ/LklzQnVpbHRpbiA/IGJ0bi50ZXh0IDogJycpIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgKGNsaWNrKT1cImlubGluZUVkaXRNb2RlICYmIGJ0bi5pdGVtSWQgPT09ICdOZXcnICYmIGNyZWF0ZU5ld0lubGluZU1vLmVtaXQoKVwiXG4gICAgICAgIGJvZHlDbGlja1xuICAgID5cbiAgICAgICAgQGlmICghYnRuLkNvbW1hbmQuSnNvbkV4dHJhUHJvcD8uSWNvbiAmJiAhYnRuLkNvbW1hbmQ/LklzQnVpbHRpbiAmJiBidG4uaWNvbikge1xuICAgICAgICA8aW1nIHdpZHRoPVwiMTZcIiBbc3JjXT1cImJ0bi5pY29uXCIgLz5cbiAgICAgICAgfSBAaWYgKCFidG4uaGlkZVRleHQgfHwgZGV2aWNlU2l6ZSA9PT0gJ3MnKSB7XG4gICAgICAgIDxzcGFuPnt7IGJ0bi50ZXh0IHwgYmJiVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgPC9idXR0b24+XG4gICAgfSBAaWYgKChidG4gPT09ICctJyB8fCBidG4udHlwZSA9PT0gJ3NlcGVyYXRvcicpICYmIGRldmljZU5hbWUgIT09ICdtb2JpbGUnKSB7XG4gICAgPGZkLXRvb2xiYXItc2VwYXJhdG9yIGZkLXRvb2xiYXItaXRlbT48L2ZkLXRvb2xiYXItc2VwYXJhdG9yPlxuICAgIH0gQGlmIChidG4ubWVudSkge1xuICAgIDxidXR0b25cbiAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICBbZmRNZW51XT1cInRydWVcIlxuICAgICAgICBbZmRUeXBlXT1cImJ0bi5Db21tYW5kPy5Jc0J1aWx0aW4gPyAnc3RhbmRhcmQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgIFtsYWJlbF09XCJidG4udGV4dCB8IGJiYlRyYW5zbGF0ZVwiXG4gICAgICAgIFthcmlhTGFiZWxdPVwiYnRuLnRleHQgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBbZmRNZW51VHJpZ2dlcl09XCJtZW51XCJcbiAgICAgICAgYm9keUNsaWNrXG4gICAgPlxuICAgICAgICA8ZmQtbWVudSAjbWVudT5cbiAgICAgICAgICAgIEBmb3IgKGJ0bkNvbW1hbmQgb2YgYnRuLm1lbnUuaXRlbXM7IHRyYWNrIGJ0bkNvbW1hbmQpIHtcbiAgICAgICAgICAgIDxsaSBmZC1tZW51LWl0ZW0gW3VsdkNvbW1hbmRIYW5kbGVyXT1cImJ0bkNvbW1hbmRcIiAoY2xpY2spPVwibWVudS5jbG9zZSgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBmZC1tZW51LWludGVyYWN0aXZlPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1tZW51LXRpdGxlPnt7IGJ0bkNvbW1hbmQudGV4dCB8IGJiYlRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZmQtbWVudT5cbiAgICA8L2J1dHRvbj5cbiAgICB9IEBpZiAoYnRuICE9PSAnLScgJiYgYnRuLkNvbW1hbmQgJiYgYnRuLkNvbW1hbmQuQ3VzdG9tVWkpIHtcbiAgICA8Ym5yYy1keW5hbWljLWZvcm0tdG9vbGJhcml0ZW1cbiAgICAgICAgZmQtdG9vbGJhci1pdGVtXG4gICAgICAgIFt1bHZDb21tYW5kSGFuZGxlcl09XCJidG5cIlxuICAgICAgICBbY29tcG9uZW50XT1cImJ0bi5Db21tYW5kPy5DdXN0b21VaVwiXG4gICAgICAgIFtjb250ZXh0XT1cImJ0blwiXG4gICAgICAgIFtpc0VuYWJsZV09XCJidG4uQ29tbWFuZD8uX2lzRW5hYmxlXCJcbiAgICAgICAgW2RldmljZU5hbWVdPVwiZGV2aWNlTmFtZVwiXG4gICAgICAgIFtkZXZpY2VTaXplXT1cImRldmljZVNpemVcIlxuICAgICAgICBib2R5Q2xpY2tcbiAgICA+PC9ibnJjLWR5bmFtaWMtZm9ybS10b29sYmFyaXRlbT5cbiAgICB9IH1cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZmQtdG9vbGJhci1pdGVtXVwiPjwvbmctY29udGVudD5cbiAgICBAaWYgKGFsbG93SW5saW5lRWRpdCAmJiBhY2Nlc3M/LkVkaXQpIHtcbiAgICA8YnV0dG9uXG4gICAgICAgIGZkLWJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2ZkVHlwZV09XCJpbmxpbmVFZGl0TW9kZSA/ICdlbXBoYXNpemVkJyA6ICd0cmFuc3BhcmVudCdcIlxuICAgICAgICBbZ2x5cGhdPVwiJ2VkaXQnXCJcbiAgICAgICAgW2xhYmVsXT1cImRldmljZVNpemUgPT09ICdzJyA/ICgnSW5saW5lIEVkaXQgSW4gTGlzdCcgfCBiYmJUcmFuc2xhdGUpIDogJydcIlxuICAgICAgICAoY2xpY2spPVwib25FZGl0TW9kZSgpXCJcbiAgICAgICAgW2F0dHIuZmRPdmVyZmxvd1ByaW9yaXR5XT1cIidhbHdheXMnXCJcbiAgICAgICAgW3RpdGxlXT1cIidJbmxpbmUgRWRpdCBJbiBMaXN0JyB8IGJiYlRyYW5zbGF0ZVwiXG4gICAgICAgIGJvZHlDbGlja1xuICAgID48L2J1dHRvbj5cbiAgICB9IEBpZiAoZ3JpZFNldHRpbmcgJiYgZ3JpZFNldHRpbmcuSGlkZGVuICE9PSB0cnVlICYmIGFsbG93R3JpZENvbHVtblNvcnQpIHsgQGlmIChkZXZpY2VTaXplID09PSAncycpIHtcbiAgICA8YnV0dG9uXG4gICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICBmZC1idXR0b25cbiAgICAgICAgW2NvbnRlbnREZW5zaXR5XT1cImNvbnRlbnREZW5zaXR5XCJcbiAgICAgICAgZmRUeXBlPVwidHJhbnNwYXJlbnRcIlxuICAgICAgICBbYXR0ci5mZE92ZXJmbG93UHJpb3JpdHldPVwiJ2Fsd2F5cydcIlxuICAgICAgICAoY2xpY2spPVwib25Hcm91cGJ5U2V0dGluZ3MoKVwiXG4gICAgICAgIFtsYWJlbF09XCInR3JvdXBzJyB8IGJiYlRyYW5zbGF0ZVwiXG4gICAgICAgIGJvZHlDbGlja1xuICAgID48L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICBmZC1idXR0b25cbiAgICAgICAgW2NvbnRlbnREZW5zaXR5XT1cImNvbnRlbnREZW5zaXR5XCJcbiAgICAgICAgZmRUeXBlPVwidHJhbnNwYXJlbnRcIlxuICAgICAgICBbYXR0ci5mZE92ZXJmbG93UHJpb3JpdHldPVwiJ2Fsd2F5cydcIlxuICAgICAgICAoY2xpY2spPVwib25Tb3J0U2V0dGluZ3MoKVwiXG4gICAgICAgIFtsYWJlbF09XCInU29ydCcgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBib2R5Q2xpY2tcbiAgICA+PC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgIFtjb250ZW50RGVuc2l0eV09XCJjb250ZW50RGVuc2l0eVwiXG4gICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgW2F0dHIuZmRPdmVyZmxvd1ByaW9yaXR5XT1cIidhbHdheXMnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ29sdW1uU2V0dGluZ3MoKVwiXG4gICAgICAgIFtsYWJlbF09XCInQ29sdW1ucycgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBib2R5Q2xpY2tcbiAgICA+PC9idXR0b24+XG4gICAgfSBAaWYgKGRldmljZVNpemUgIT09ICdzJykge1xuICAgIDxidXR0b25cbiAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICBbYXR0ci5mZE92ZXJmbG93UHJpb3JpdHldPVwiJ25ldmVyJ1wiXG4gICAgICAgIFtmZE1lbnVdPVwidHJ1ZVwiXG4gICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgZ2x5cGg9XCJhY3Rpb24tc2V0dGluZ3NcIlxuICAgICAgICBbdGl0bGVdPVwiJ1NldHRpbmdzJyB8IGJiYlRyYW5zbGF0ZVwiXG4gICAgICAgIFtmZE1lbnVUcmlnZ2VyXT1cInRhYmxlTWVudVNldHRpbmdzXCJcbiAgICAgICAgYm9keUNsaWNrXG4gICAgPjwvYnV0dG9uPlxuICAgIH1cbiAgICA8ZmQtbWVudSAjdGFibGVNZW51U2V0dGluZ3M+XG4gICAgICAgIDxsaSBmZC1tZW51LWl0ZW0+XG4gICAgICAgICAgICA8ZGl2IGZkLW1lbnUtaW50ZXJhY3RpdmUgKGNsaWNrKT1cInRhYmxlTWVudVNldHRpbmdzLmNsb3NlKCk7IG9uQ29sdW1uU2V0dGluZ3MoKVwiIGJvZHlDbGljaz5cbiAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwiYWN0aW9uLXNldHRpbmdzXCI+PC9mZC1tZW51LWFkZG9uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGZkLW1lbnUtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdDb2x1bW5zJyB8IGJiYlRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgZmQtbWVudS1pdGVtPlxuICAgICAgICAgICAgPGRpdiBmZC1tZW51LWludGVyYWN0aXZlIChjbGljayk9XCJ0YWJsZU1lbnVTZXR0aW5ncy5jbG9zZSgpOyBvblNvcnRTZXR0aW5ncygpXCIgYm9keUNsaWNrPlxuICAgICAgICAgICAgICAgIDxmZC1tZW51LWFkZG9uIHBvc2l0aW9uPVwiYmVmb3JlXCIgZ2x5cGg9XCJzb3J0XCI+PC9mZC1tZW51LWFkZG9uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGZkLW1lbnUtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdTb3J0JyB8IGJiYlRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgZmQtbWVudS1pdGVtPlxuICAgICAgICAgICAgPGRpdiBmZC1tZW51LWludGVyYWN0aXZlIChjbGljayk9XCJ0YWJsZU1lbnVTZXR0aW5ncy5jbG9zZSgpOyBvbkdyb3VwYnlTZXR0aW5ncygpXCIgYm9keUNsaWNrPlxuICAgICAgICAgICAgICAgIDxmZC1tZW51LWFkZG9uIHBvc2l0aW9uPVwiYmVmb3JlXCIgZ2x5cGg9XCJncm91cC0yXCI+PC9mZC1tZW51LWFkZG9uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGZkLW1lbnUtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdHcm91cHMnIHwgYmJiVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgPC9mZC1tZW51PlxuICAgIH0gQGlmICh2aWV3Q29sbGVjdGlvbiAmJiB2aWV3Q29sbGVjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgPGZkLXNwbGl0LWJ1dHRvblxuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2F0dHIuZmRPdmVyZmxvd1ByaW9yaXR5XT1cImRldmljZVNpemUgPT09ICdzJyA/ICdhbHdheXMnIDogJ2xvdydcIlxuICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICBbbWFpbkFjdGlvbl09XCJ7XG4gICAgICAgICAgICBrZWVwTWFpbkFjdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIG1haW5BY3Rpb25UaXRsZTogc3BsaXRCdG5UaXRsZVxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxmZC1tZW51PlxuICAgICAgICAgICAgQGZvciAodmlld09iamVjdCBvZiB2aWV3Q29sbGVjdGlvbjsgdHJhY2sgdmlld09iamVjdCkge1xuICAgICAgICAgICAgPGxpIGZkLW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgICA8ZGl2IGZkLW1lbnUtaW50ZXJhY3RpdmUgKGNsaWNrKT1cIm9uQ2hhbmdlVmlldyh2aWV3T2JqZWN0KVwiIGJvZHlDbGljaz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbWVudS10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1pY29uIFtnbHlwaF09XCJ2aWV3T2JqZWN0LlVpQ29tcG9uZW50LlNldHRpbmdzPy5JY29uXCI+IDwvZmQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9mZC1tZW51PlxuICAgIDwvZmQtc3BsaXQtYnV0dG9uPlxuICAgIH1cbiAgICA8bmctdGVtcGxhdGUgI3NwbGl0QnRuVGl0bGU+XG4gICAgICAgIDxmZC1pY29uIFtnbHlwaF09XCJyZXBvcnRWaWV3LlVpQ29tcG9uZW50LlNldHRpbmdzPy5JY29uXCI+PC9mZC1pY29uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNzcGxpdEJ0blNldHRpbmdzPlxuICAgICAgICA8ZmQtaWNvbiBbZ2x5cGhdPVwiJ2FjdGlvbi1zZXR0aW5ncydcIj48L2ZkLWljb24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICB9XG48L2ZkLXRvb2xiYXI+XG59XG4iXX0=