@mediusinc/mng-commons 1.3.0-1c14fa2b → 2.0.0-rc.0-08f92864
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.
- package/assets/i18n/en.json +9 -0
- package/assets/i18n/sl.json +9 -0
- package/esm2020/lib/api/utils/medius-rest.util.mjs +1 -1
- package/esm2020/lib/components/action/action.component.mjs +76 -20
- package/esm2020/lib/components/action/editor/action-editor.component.mjs +12 -12
- package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +6 -6
- package/esm2020/lib/components/action/models/action-component.model.mjs +1 -1
- package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
- package/esm2020/lib/components/action/models/action-execution.model.mjs +1 -1
- package/esm2020/lib/components/action/route/action-route.component.mjs +6 -5
- package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +11 -10
- package/esm2020/lib/components/form/date-range/date-range.component.mjs +9 -8
- package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +13 -11
- package/esm2020/lib/components/form/editor/form-editor.component.mjs +14 -11
- package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +13 -9
- package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +8 -7
- package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +8 -7
- package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +11 -9
- package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +50 -20
- package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +5 -5
- package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +27 -17
- package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +32 -12
- package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +21 -12
- package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +13 -11
- package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +1 -1
- package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +10 -9
- package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +11 -10
- package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
- package/esm2020/lib/components/layout/breadcrumb.component.mjs +7 -6
- package/esm2020/lib/components/layout/footer.component.mjs +6 -5
- package/esm2020/lib/components/layout/main-layout.component.mjs +8 -8
- package/esm2020/lib/components/layout/menu-item.component.mjs +43 -23
- package/esm2020/lib/components/layout/menu.component.mjs +24 -13
- package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +3 -3
- package/esm2020/lib/components/layout/topbar.component.mjs +14 -12
- package/esm2020/lib/components/layout/version.component.mjs +6 -6
- package/esm2020/lib/components/tableview/models/table.event.mjs +1 -1
- package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +38 -10
- package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +5 -6
- package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +14 -13
- package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +29 -12
- package/esm2020/lib/components/tableview/table/table.component.mjs +33 -17
- package/esm2020/lib/components/tableview/tableview.component.mjs +13 -11
- package/esm2020/lib/descriptors/action/action-button.descriptor.mjs +60 -0
- package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +2 -2
- package/esm2020/lib/descriptors/action/action.descriptor.mjs +579 -0
- package/esm2020/lib/descriptors/action/index.mjs +4 -0
- package/esm2020/lib/descriptors/editor/editor.descriptor.mjs +291 -0
- package/esm2020/lib/descriptors/editor/field-validation.descriptor.mjs +25 -0
- package/esm2020/lib/descriptors/editor/field.descriptor.mjs +990 -0
- package/esm2020/lib/descriptors/editor/index.mjs +4 -0
- package/esm2020/lib/descriptors/filter/filter.descriptor.mjs +370 -0
- package/esm2020/lib/descriptors/filter/index.mjs +2 -0
- package/esm2020/lib/descriptors/index.mjs +1 -11
- package/esm2020/lib/descriptors/table/column.descriptor.mjs +406 -0
- package/esm2020/lib/descriptors/table/index.mjs +3 -0
- package/esm2020/lib/descriptors/table/table.descriptor.mjs +497 -0
- package/esm2020/lib/descriptors/tableview/index.mjs +2 -0
- package/esm2020/lib/descriptors/tableview/tableview.descriptor.mjs +346 -0
- package/esm2020/lib/directives/component.directive.mjs +5 -4
- package/esm2020/lib/directives/template.directive.mjs +5 -4
- package/esm2020/lib/mng-commons.module.mjs +108 -138
- package/esm2020/lib/models/column-value.model.mjs +1 -1
- package/esm2020/lib/models/config.model.mjs +1 -1
- package/esm2020/lib/models/menu.model.mjs +1 -1
- package/esm2020/lib/models/view-container.model.mjs +1 -1
- package/esm2020/lib/pipes/boolean.pipe.mjs +5 -4
- package/esm2020/lib/pipes/class-map.pipe.mjs +5 -4
- package/esm2020/lib/pipes/enum.pipe.mjs +5 -4
- package/esm2020/lib/pipes/enumerate-async.pipe.mjs +5 -4
- package/esm2020/lib/pipes/enumerate.pipe.mjs +5 -4
- package/esm2020/lib/pipes/getter.pipe.mjs +5 -4
- package/esm2020/lib/pipes/i18n-property.pipe.mjs +5 -4
- package/esm2020/lib/pipes/json-path.pipe.mjs +5 -4
- package/esm2020/lib/pipes/locale-default-row-class.pipe.mjs +5 -4
- package/esm2020/lib/pipes/parametrize.pipe.mjs +5 -4
- package/esm2020/lib/pipes/template.pipe.mjs +5 -4
- package/esm2020/lib/provide-commons.mjs +73 -0
- package/esm2020/lib/router/index.mjs +2 -1
- package/esm2020/lib/router/models/router.model.mjs +1 -1
- package/esm2020/lib/router/route-builder.mjs +31 -144
- package/esm2020/lib/router/routes-builder.mjs +67 -0
- package/esm2020/lib/router/tableview-route-builder.mjs +2 -2
- package/esm2020/lib/security/authorization.guard.mjs +8 -5
- package/esm2020/lib/security/authorization.service.mjs +8 -5
- package/esm2020/lib/services/action-executor.service.mjs +13 -7
- package/esm2020/lib/services/commons.service.mjs +15 -10
- package/esm2020/lib/services/configuration.service.mjs +27 -20
- package/esm2020/lib/services/internal/commons-init.service.mjs +13 -7
- package/esm2020/lib/services/navigation.service.mjs +8 -5
- package/esm2020/lib/services/providers/config-service.provider.mjs +5 -4
- package/esm2020/lib/services/router.service.mjs +97 -0
- package/esm2020/lib/services/version.service.mjs +8 -5
- package/esm2020/lib/services/view-container.component.service.mjs +4 -4
- package/esm2020/lib/styles/styles.util.mjs +1 -1
- package/esm2020/lib/utils/action-data-provider.util.mjs +1 -1
- package/esm2020/lib/utils/editor-formly.util.mjs +2 -2
- package/esm2020/lib/utils/export.util.mjs +20 -0
- package/esm2020/lib/utils/i18n.util.mjs +1 -1
- package/esm2020/lib/utils/index.mjs +2 -1
- package/esm2020/lib/utils/notification.util.mjs +1 -1
- package/esm2020/lib/utils/route.util.mjs +13 -1
- package/esm2020/lib/utils/tableview.util.mjs +1 -1
- package/esm2020/public-api.mjs +7 -1
- package/fesm2015/mediusinc-mng-commons.mjs +6767 -6381
- package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
- package/fesm2020/mediusinc-mng-commons.mjs +6707 -6325
- package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
- package/lib/api/utils/medius-rest.util.d.ts +1 -1
- package/lib/components/action/action.component.d.ts +10 -5
- package/lib/components/action/editor/action-editor.component.d.ts +2 -2
- package/lib/components/action/localization/data-language-dropdown.component.d.ts +2 -2
- package/lib/components/action/models/action-component.model.d.ts +1 -1
- package/lib/components/action/models/action-confirmation-service.model.d.ts +1 -1
- package/lib/components/action/models/action-execution.model.d.ts +2 -2
- package/lib/components/action/route/action-route.component.d.ts +2 -2
- package/lib/components/form/autocomplete/autocomplete.component.d.ts +1 -1
- package/lib/components/form/date-range/date-range.component.d.ts +1 -1
- package/lib/components/form/dropdown/dropdown.component.d.ts +1 -1
- package/lib/components/form/editor/form-editor.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +1 -1
- package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +3 -2
- package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +2 -2
- package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +1 -1
- package/lib/components/form/formly/models/formly-field.model.d.ts +2 -2
- package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +1 -1
- package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -2
- package/lib/components/form/models/field-action-context.model.d.ts +1 -1
- package/lib/components/layout/breadcrumb.component.d.ts +1 -1
- package/lib/components/layout/footer.component.d.ts +1 -1
- package/lib/components/layout/main-layout.component.d.ts +1 -1
- package/lib/components/layout/menu-item.component.d.ts +6 -2
- package/lib/components/layout/menu.component.d.ts +9 -3
- package/lib/components/layout/topbar.component.d.ts +1 -1
- package/lib/components/layout/version.component.d.ts +1 -1
- package/lib/components/tableview/models/table.event.d.ts +1 -1
- package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +9 -2
- package/lib/components/tableview/route/tableview-route.component.d.ts +3 -2
- package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +2 -2
- package/lib/components/tableview/table/column-value/column-value.component.d.ts +2 -2
- package/lib/components/tableview/table/table.component.d.ts +4 -2
- package/lib/components/tableview/tableview.component.d.ts +3 -2
- package/lib/descriptors/{action-button.descriptor.d.ts → action/action-button.descriptor.d.ts} +1 -1
- package/lib/descriptors/action/action-confirmation.descriptor.d.ts +2 -2
- package/lib/descriptors/{action.descriptor.d.ts → action/action.descriptor.d.ts} +16 -8
- package/lib/descriptors/action/index.d.ts +3 -0
- package/lib/descriptors/{editor.descriptor.d.ts → editor/editor.descriptor.d.ts} +9 -6
- package/lib/descriptors/{field-validation.descriptor.d.ts → editor/field-validation.descriptor.d.ts} +1 -1
- package/lib/descriptors/{field.descriptor.d.ts → editor/field.descriptor.d.ts} +14 -10
- package/lib/descriptors/editor/index.d.ts +3 -0
- package/lib/descriptors/{filter.descriptor.d.ts → filter/filter.descriptor.d.ts} +11 -9
- package/lib/descriptors/filter/index.d.ts +1 -0
- package/lib/descriptors/index.d.ts +0 -10
- package/lib/descriptors/{column.descriptor.d.ts → table/column.descriptor.d.ts} +4 -4
- package/lib/descriptors/table/index.d.ts +2 -0
- package/lib/descriptors/{table.descriptor.d.ts → table/table.descriptor.d.ts} +12 -7
- package/lib/descriptors/tableview/index.d.ts +1 -0
- package/lib/descriptors/{tableview.descriptor.d.ts → tableview/tableview.descriptor.d.ts} +9 -7
- package/lib/directives/component.directive.d.ts +1 -1
- package/lib/directives/template.directive.d.ts +1 -1
- package/lib/mng-commons.module.d.ts +90 -88
- package/lib/models/column-value.model.d.ts +1 -1
- package/lib/models/config.model.d.ts +1 -0
- package/lib/models/menu.model.d.ts +1 -1
- package/lib/models/version.model.d.ts +1 -1
- package/lib/models/view-container.model.d.ts +1 -1
- package/lib/pipes/boolean.pipe.d.ts +1 -1
- package/lib/pipes/class-map.pipe.d.ts +1 -1
- package/lib/pipes/enum.pipe.d.ts +1 -1
- package/lib/pipes/enumerate-async.pipe.d.ts +1 -1
- package/lib/pipes/enumerate.pipe.d.ts +1 -1
- package/lib/pipes/getter.pipe.d.ts +1 -1
- package/lib/pipes/i18n-property.pipe.d.ts +1 -1
- package/lib/pipes/json-path.pipe.d.ts +1 -1
- package/lib/pipes/locale-default-row-class.pipe.d.ts +2 -2
- package/lib/pipes/parametrize.pipe.d.ts +1 -1
- package/lib/pipes/template.pipe.d.ts +1 -1
- package/lib/provide-commons.d.ts +3 -0
- package/lib/router/index.d.ts +1 -0
- package/lib/router/models/router.model.d.ts +5 -2
- package/lib/router/route-builder.d.ts +12 -48
- package/lib/router/routes-builder.d.ts +29 -0
- package/lib/router/tableview-route-builder.d.ts +2 -1
- package/lib/services/action-executor.service.d.ts +2 -1
- package/lib/services/commons.service.d.ts +3 -3
- package/lib/services/configuration.service.d.ts +4 -1
- package/lib/services/internal/commons-init.service.d.ts +4 -2
- package/lib/services/router.service.d.ts +22 -0
- package/lib/services/view-container.component.service.d.ts +1 -1
- package/lib/styles/styles.util.d.ts +2 -1
- package/lib/types/type.model.d.ts +8 -8
- package/lib/utils/editor-formly.util.d.ts +1 -1
- package/lib/utils/export.util.d.ts +5 -0
- package/lib/utils/i18n.util.d.ts +2 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/notification.util.d.ts +2 -1
- package/lib/utils/route.util.d.ts +55 -0
- package/lib/utils/tableview.util.d.ts +1 -1
- package/package.json +6 -6
- package/public-api.d.ts +6 -0
- package/scss/common/layout/_breadcrumb.scss +12 -2
- package/scss/common/layout/_exception.scss +1 -1
- package/scss/common/layout/_inlinemenu.scss +13 -0
- package/scss/common/layout/_login.scss +1 -0
- package/scss/common/layout/_rightmenu.scss +5 -0
- package/scss/common/layout/menu/_menu_common.scss +1 -1
- package/scss/common/theme/designer/_components.scss +4 -4
- package/scss/common/theme/designer/_mixins.scss +29 -0
- package/scss/common/theme/extensions/_datatable.scss +2 -2
- package/scss/common/variables/layout/_layout_dark.scss +0 -1
- package/scss/common/variables/layout/_layout_light.scss +0 -1
- package/scss/common/variables/theme/_theme_dark.scss +72 -46
- package/scss/common/variables/theme/_theme_light.scss +70 -33
- package/scss/mng-overrides/_layout_menu.scss +4 -0
- package/version-info.json +6 -6
- package/esm2020/lib/descriptors/action-button.descriptor.mjs +0 -60
- package/esm2020/lib/descriptors/action.descriptor.mjs +0 -560
- package/esm2020/lib/descriptors/column.descriptor.mjs +0 -405
- package/esm2020/lib/descriptors/editor.descriptor.mjs +0 -290
- package/esm2020/lib/descriptors/field-validation.descriptor.mjs +0 -25
- package/esm2020/lib/descriptors/field.descriptor.mjs +0 -987
- package/esm2020/lib/descriptors/filter.descriptor.mjs +0 -368
- package/esm2020/lib/descriptors/table.descriptor.mjs +0 -482
- package/esm2020/lib/descriptors/tableview.descriptor.mjs +0 -344
|
@@ -1,32 +1,31 @@
|
|
|
1
|
+
import { AsyncPipe, NgClass, NgForOf, NgIf, NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
1
2
|
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Optional, Output, ViewChild, ViewChildren } from '@angular/core';
|
|
2
3
|
import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart } from '@angular/router';
|
|
4
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
3
5
|
import { FilterMatchMode } from 'primeng/api';
|
|
4
|
-
import {
|
|
6
|
+
import { SkeletonModule } from 'primeng/skeleton';
|
|
7
|
+
import { Table, TableModule } from 'primeng/table';
|
|
5
8
|
import { BehaviorSubject, Observable, ReplaySubject, isObservable, of } from 'rxjs';
|
|
6
9
|
import { filter, map } from 'rxjs/operators';
|
|
7
10
|
import { MediusFilterMatchType, MediusQueryParam, MediusQueryParamBuilder, MediusQueryResult } from '../../../api/models';
|
|
8
11
|
import { MediusRestUtil } from '../../../api/utils';
|
|
9
|
-
import { TableDynamicDescriptor } from '../../../descriptors';
|
|
12
|
+
import { TableDynamicDescriptor } from '../../../descriptors/table';
|
|
10
13
|
import { ActionPositionEnum, FilterTypeEnum, TableFilterDisplayEnum, TablePaginationModeEnum, TableSizeEnum } from '../../../descriptors/types';
|
|
11
14
|
import { MngComponentDirective, MngTemplateDirective } from '../../../directives';
|
|
15
|
+
import { MngClassMapPipe, MngI18nPropertyPipe, MngLocaleDefaultRowClassPipe } from '../../../pipes';
|
|
12
16
|
import { StylesUtil } from '../../../styles';
|
|
13
17
|
import { NotificationUtil } from '../../../utils';
|
|
18
|
+
import { MngActionComponent } from '../../action';
|
|
14
19
|
import { MngTableCellClickEvent, MngTableLoadEvent } from '../models';
|
|
20
|
+
import { MngTableColumnFilterComponent } from './column-filter/column-filter.component';
|
|
21
|
+
import { MngTableColumnValueComponent } from './column-value/column-value.component';
|
|
15
22
|
import * as i0 from "@angular/core";
|
|
16
23
|
import * as i1 from "@angular/router";
|
|
17
24
|
import * as i2 from "@ngx-translate/core";
|
|
18
25
|
import * as i3 from "../../../services";
|
|
19
|
-
import * as i4 from "
|
|
26
|
+
import * as i4 from "primeng/table";
|
|
20
27
|
import * as i5 from "primeng/api";
|
|
21
|
-
import * as i6 from "primeng/
|
|
22
|
-
import * as i7 from "primeng/skeleton";
|
|
23
|
-
import * as i8 from "../../../directives/component.directive";
|
|
24
|
-
import * as i9 from "./column-value/column-value.component";
|
|
25
|
-
import * as i10 from "./column-filter/column-filter.component";
|
|
26
|
-
import * as i11 from "../../action/action.component";
|
|
27
|
-
import * as i12 from "../../../pipes/i18n-property.pipe";
|
|
28
|
-
import * as i13 from "../../../pipes/class-map.pipe";
|
|
29
|
-
import * as i14 from "../../../pipes/locale-default-row-class.pipe";
|
|
28
|
+
import * as i6 from "primeng/skeleton";
|
|
30
29
|
export class MngTableComponent {
|
|
31
30
|
constructor(injector, router, route, translate, mngCommonsService, actionExecutor, viewContainerService) {
|
|
32
31
|
this.injector = injector;
|
|
@@ -530,11 +529,28 @@ export class MngTableComponent {
|
|
|
530
529
|
}
|
|
531
530
|
}
|
|
532
531
|
}
|
|
533
|
-
MngTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
534
|
-
MngTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngTableComponent, selector: "mng-table", inputs: { initialDescriptor: ["descriptor", "initialDescriptor"], items: "items", queryResult: "queryResult", loading: "loading", dataProvider: "dataProvider", useQueryParams: "useQueryParams", selectionMode: "selectionMode", selectionEnabled: "selectionEnabled", actions: "actions", isColumnClickable: "isColumnClickable", viewContainerInit: ["viewContainer", "viewContainerInit"], captionComponent: "captionComponent", columnActionComponent: "columnActionComponent", columnActionMinWidth: "columnActionMinWidth" }, outputs: { loadEventEmitter: "tableLoad", cellClickEventEmitter: "cellClick", selectionChangeEventEmitter: "selectionChange", captionCmpInstEventEmitter: "captionComponentInstance", columnActionCmpInstEventEmitter: "columnActionComponentInstance" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "primeTable", first: true, predicate: Table, descendants: true }, { propertyName: "components", predicate: MngComponentDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"$any(descriptor?.dataKeyProperty ?? null)\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"$any(selectionEnabled ? selectionMode : null)\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"$any(rowHeight)\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <ng-container *ngFor=\"let col of descriptor?.columns\">\n <th\n *ngIf=\"col.isSortEnabled\"\n [pSortableColumn]=\"col.property\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.title ?? (col.property | i18nProperty: descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th\n *ngIf=\"!col.isSortEnabled\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n {{ col.title ?? (col.property | i18nProperty: descriptor!.model) | translate }}\n <ng-container>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <th\n *ngFor=\"let col of descriptor?.columns\"\n [class]=\"(col.filterDescriptor ? 'mng-column-filter-' + col.filterDescriptor.filterType + ' ' : ' ') + col.filterDescriptor?.columnClassName\"\n [style.width.%]=\"col.filterDescriptor?.columnWidth ?? col.width\"\n [style.min-width.px]=\"col.filterDescriptor?.columnMinWidth ?? col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe: descriptor?.rowClassNameMapFn:item | mngLocaleDefaultRowClass: descriptor:item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <td\n *ngFor=\"let col of descriptor?.columns\"\n (click)=\"onCellClick($event, col, item, idx)\"\n [class]=\"\n col.className +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor ? ' mng-column-filter-' + col.filterDescriptor.filterType : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <span class=\"p-column-title\">{{ col.title ?? (col.property | i18nProperty: descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td\n *ngIf=\"showInlineActionsColumn\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainerInit\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i6.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i6.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i6.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i6.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i6.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i6.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i7.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i8.MngComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "inputs"], outputs: ["instanceCreated"] }, { kind: "component", type: i9.MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "component", type: i10.MngTableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor", "display"] }, { kind: "component", type: i11.MngActionComponent, selector: "mng-action", inputs: ["action", "item", "itemId", "actionData", "queryParam", "dataProvider", "hostComponent", "route", "disabled", "loading", "viewContainer", "selectedItems"], outputs: ["finish"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: i12.MngI18nPropertyPipe, name: "i18nProperty" }, { kind: "pipe", type: i13.MngClassMapPipe, name: "mngClassMapPipe" }, { kind: "pipe", type: i14.MngLocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
535
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
532
|
+
MngTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngTableComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.MngCommonsService }, { token: i3.MngActionExecutorService }, { token: i3.MngViewContainerComponentService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
533
|
+
MngTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: MngTableComponent, isStandalone: true, selector: "mng-table", inputs: { initialDescriptor: ["descriptor", "initialDescriptor"], items: "items", queryResult: "queryResult", loading: "loading", dataProvider: "dataProvider", useQueryParams: "useQueryParams", selectionMode: "selectionMode", selectionEnabled: "selectionEnabled", actions: "actions", isColumnClickable: "isColumnClickable", viewContainerInit: ["viewContainer", "viewContainerInit"], captionComponent: "captionComponent", columnActionComponent: "columnActionComponent", columnActionMinWidth: "columnActionMinWidth" }, outputs: { loadEventEmitter: "tableLoad", cellClickEventEmitter: "cellClick", selectionChangeEventEmitter: "selectionChange", captionCmpInstEventEmitter: "captionComponentInstance", columnActionCmpInstEventEmitter: "columnActionComponentInstance" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "primeTable", first: true, predicate: Table, descendants: true }, { propertyName: "components", predicate: MngComponentDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"$any(descriptor?.dataKeyProperty ?? null)\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"$any(selectionEnabled ? selectionMode : null)\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"$any(rowHeight)\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <ng-container *ngFor=\"let col of descriptor?.columns\">\n <th\n *ngIf=\"col.isSortEnabled\"\n pResizableColumn\n [pSortableColumn]=\"col.property\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.title ?? (col.property | i18nProperty : descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th\n pResizableColumn\n *ngIf=\"!col.isSortEnabled\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n {{ col.title ?? (col.property | i18nProperty : descriptor!.model) | translate }}\n <ng-container>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <th\n *ngFor=\"let col of descriptor?.columns\"\n [class]=\"(col.filterDescriptor ? 'mng-column-filter-' + col.filterDescriptor.filterType + ' ' : ' ') + col.filterDescriptor?.columnClassName\"\n [style.width.%]=\"col.filterDescriptor?.columnWidth ?? col.width\"\n [style.min-width.px]=\"col.filterDescriptor?.columnMinWidth ?? col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe : descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass : descriptor : item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <td\n *ngFor=\"let col of descriptor?.columns\"\n (click)=\"onCellClick($event, col, item, idx)\"\n [class]=\"\n col.className +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor ? ' mng-column-filter-' + col.filterDescriptor.filterType : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <span class=\"p-column-title\">{{ col.title ?? (col.property | i18nProperty : descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td\n *ngIf=\"showInlineActionsColumn\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainerInit\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i4.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i4.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i4.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i4.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: MngComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "inputs"], outputs: ["instanceCreated"] }, { kind: "pipe", type: MngI18nPropertyPipe, name: "i18nProperty" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MngTableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor", "display"] }, { kind: "pipe", type: MngClassMapPipe, name: "mngClassMapPipe" }, { kind: "pipe", type: MngLocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "component", type: MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "component", type: MngActionComponent, selector: "mng-action", inputs: ["action", "item", "itemId", "actionData", "queryParam", "dataProvider", "hostComponent", "route", "disabled", "loading", "viewContainer", "selectedItems"], outputs: ["finish"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i6.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
534
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngTableComponent, decorators: [{
|
|
536
535
|
type: Component,
|
|
537
|
-
args: [{ selector: 'mng-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"$any(descriptor?.dataKeyProperty ?? null)\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"$any(selectionEnabled ? selectionMode : null)\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"$any(rowHeight)\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <ng-container *ngFor=\"let col of descriptor?.columns\">\n <th\n *ngIf=\"col.isSortEnabled\"\n [pSortableColumn]=\"col.property\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.title ?? (col.property | i18nProperty: descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th\n *ngIf=\"!col.isSortEnabled\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n {{ col.title ?? (col.property | i18nProperty: descriptor!.model) | translate }}\n <ng-container>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <th\n *ngFor=\"let col of descriptor?.columns\"\n [class]=\"(col.filterDescriptor ? 'mng-column-filter-' + col.filterDescriptor.filterType + ' ' : ' ') + col.filterDescriptor?.columnClassName\"\n [style.width.%]=\"col.filterDescriptor?.columnWidth ?? col.width\"\n [style.min-width.px]=\"col.filterDescriptor?.columnMinWidth ?? col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe: descriptor?.rowClassNameMapFn:item | mngLocaleDefaultRowClass: descriptor:item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <td\n *ngFor=\"let col of descriptor?.columns\"\n (click)=\"onCellClick($event, col, item, idx)\"\n [class]=\"\n col.className +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor ? ' mng-column-filter-' + col.filterDescriptor.filterType : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <span class=\"p-column-title\">{{ col.title ?? (col.property | i18nProperty: descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td\n *ngIf=\"showInlineActionsColumn\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainerInit\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n" }]
|
|
536
|
+
args: [{ standalone: true, selector: 'mng-table', imports: [
|
|
537
|
+
NgIf,
|
|
538
|
+
AsyncPipe,
|
|
539
|
+
TableModule,
|
|
540
|
+
TranslateModule,
|
|
541
|
+
MngComponentDirective,
|
|
542
|
+
MngI18nPropertyPipe,
|
|
543
|
+
NgForOf,
|
|
544
|
+
NgClass,
|
|
545
|
+
NgStyle,
|
|
546
|
+
NgTemplateOutlet,
|
|
547
|
+
MngTableColumnFilterComponent,
|
|
548
|
+
MngClassMapPipe,
|
|
549
|
+
MngLocaleDefaultRowClassPipe,
|
|
550
|
+
MngTableColumnValueComponent,
|
|
551
|
+
MngActionComponent,
|
|
552
|
+
SkeletonModule
|
|
553
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"$any(descriptor?.dataKeyProperty ?? null)\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"$any(selectionEnabled ? selectionMode : null)\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"$any(rowHeight)\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <ng-container *ngFor=\"let col of descriptor?.columns\">\n <th\n *ngIf=\"col.isSortEnabled\"\n pResizableColumn\n [pSortableColumn]=\"col.property\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.title ?? (col.property | i18nProperty : descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th\n pResizableColumn\n *ngIf=\"!col.isSortEnabled\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [class]=\"\n col.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor\n ? ' mng-column-filter-' + col.filterDescriptor.filterType\n : '')\n \">\n {{ col.title ?? (col.property | i18nProperty : descriptor!.model) | translate }}\n <ng-container>\n <mng-table-column-filter\n *ngIf=\"col.filterDescriptor && descriptor!.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor!.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn></th>\n <th\n *ngFor=\"let col of descriptor?.columns\"\n [class]=\"(col.filterDescriptor ? 'mng-column-filter-' + col.filterDescriptor.filterType + ' ' : ' ') + col.filterDescriptor?.columnClassName\"\n [style.width.%]=\"col.filterDescriptor?.columnWidth ?? col.width\"\n [style.min-width.px]=\"col.filterDescriptor?.columnMinWidth ?? col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"showInlineActionsColumn\" [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe : descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass : descriptor : item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn>\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <td\n *ngFor=\"let col of descriptor?.columns\"\n (click)=\"onCellClick($event, col, item, idx)\"\n [class]=\"\n col.className +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.filterDescriptor ? ' mng-column-filter-' + col.filterDescriptor.filterType : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width.%]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\">\n <span class=\"p-column-title\">{{ col.title ?? (col.property | i18nProperty : descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td\n *ngIf=\"showInlineActionsColumn\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainerInit\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n" }]
|
|
538
554
|
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.MngCommonsService }, { type: i3.MngActionExecutorService }, { type: i3.MngViewContainerComponentService, decorators: [{
|
|
539
555
|
type: Optional
|
|
540
556
|
}] }]; }, propDecorators: { initialDescriptor: [{
|
|
@@ -592,4 +608,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
|
|
|
592
608
|
type: ViewChild,
|
|
593
609
|
args: [Table]
|
|
594
610
|
}] } });
|
|
595
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBRVosS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBS04sU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWlCLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBR2xJLE9BQU8sRUFBQyxlQUFlLEVBQTBDLE1BQU0sYUFBYSxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDcEMsT0FBTyxFQUFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFnQixZQUFZLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDeEgsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE9BQU8sRUFBZ0csc0JBQXNCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzSixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFB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K0I7Z0JBR08sU0FBUztzQkFBdEQsZUFBZTt1QkFBQyxvQkFBb0I7Z0JBQ08sVUFBVTtzQkFBckQsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBQ1YsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uQ2FuY2VsLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIE5hdmlnYXRpb25TdGFydCwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0ZpbHRlck1hdGNoTW9kZSwgRmlsdGVyTWV0YWRhdGEsIExhenlMb2FkRXZlbnQsIFNvcnRNZXRhfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge1RhYmxlfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGlzT2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge01lZGl1c0ZpbHRlck1hdGNoVHlwZSwgTWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIsIE1lZGl1c1F1ZXJ5UmVzdWx0fSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWxzJztcbmltcG9ydCB7TWVkaXVzUmVzdFV0aWx9IGZyb20gJy4uLy4uLy4uL2FwaS91dGlscyc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlcn0gZnJvbSAnLi4vLi4vLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtBY3Rpb25EZXNjcmlwdG9yLCBDb2x1bW5EZXNjcmlwdG9yLCBGaWx0ZXJEZXNjcmlwdG9yLCBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLCBUYWJsZURlc2NyaXB0b3IsIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzJztcbmltcG9ydCB7QWN0aW9uUG9zaXRpb25FbnVtLCBGaWx0ZXJUeXBlRW51bSwgVGFibGVGaWx0ZXJEaXNwbGF5RW51bSwgVGFibGVQYWdpbmF0aW9uTW9kZUVudW0sIFRhYmxlU2l6ZUVudW19IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL3R5cGVzJztcbmltcG9ydCB7TW5nQ29tcG9uZW50RGlyZWN0aXZlLCBNbmdUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQge0lWaWV3Q29udGFpbmVyfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsIE1uZ0NvbW1vbnNTZXJ2aWNlLCBNbmdWaWV3Q29udGFpbmVyQ29tcG9uZW50U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtTdHlsZXNVdGlsfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMnO1xuaW1wb3J0IHtOb3RpZmljYXRpb25VdGlsfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQge0FjdGlvbkluc3RhbmNlfSBmcm9tICcuLi8uLi9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7TW5nVGFibGVDZWxsQ2xpY2tFdmVudCwgTW5nVGFibGVMb2FkRXZlbnR9IGZyb20gJy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbW5nLXRhYmxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ1RhYmxlQ29tcG9uZW50PFQsIFM+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpbHRlckRpc3BsYXlSb3c6IFRhYmxlRmlsdGVyRGlzcGxheUVudW0gPSBUYWJsZUZpbHRlckRpc3BsYXlFbnVtLlJvdztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyRGlzcGxheU1lbnU6IFRhYmxlRmlsdGVyRGlzcGxheUVudW0gPSBUYWJsZUZpbHRlckRpc3BsYXlFbnVtLk1lbnU7XG5cbiAgICAvLyBtZXRhZGF0YSBpbnB1dFxuICAgIEBJbnB1dCgnZGVzY3JpcHRvcicpIHB1YmxpYyBpbml0aWFsRGVzY3JpcHRvciE6IFRhYmxlRGVzY3JpcHRvcjxUPjtcbiAgICBwdWJsaWMgZGVzY3JpcHRvcj86IFRhYmxlRGVzY3JpcHRvcjxUPjtcblxuICAgIC8vIGRhdGEgc291cmNlIGlucHV0c1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtcz86IE9ic2VydmFibGU8QXJyYXk8VD4+IHwgQXJyYXk8VD47XG4gICAgQElucHV0KCkgcHVibGljIHF1ZXJ5UmVzdWx0PzogT2JzZXJ2YWJsZTxNZWRpdXNRdWVyeVJlc3VsdDxUPj4gfCBNZWRpdXNRdWVyeVJlc3VsdDxUPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZz86IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhUHJvdmlkZXI/OiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdXNlUXVlcnlQYXJhbXMgPSBmYWxzZTtcblxuICAgIC8vIGV4dHJhIGZlYXR1cmVzIGlucHV0XG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3Rpb25FbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyBhY3Rpb25zXG4gICAgQElucHV0KCkgcHVibGljIGFjdGlvbnM6IEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8VD4+ID0gW107XG5cbiAgICAvLyB2aXN1YWxcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNDb2x1bW5DbGlja2FibGU/OiBib29sZWFuO1xuXG4gICAgLy8gY29tcG9uZW50IGlucHV0c1xuICAgIEBJbnB1dCgndmlld0NvbnRhaW5lcicpIHB1YmxpYyB2aWV3Q29udGFpbmVySW5pdD86IElWaWV3Q29udGFpbmVyPFQsIFM+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjYXB0aW9uQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5BY3Rpb25Db21wb25lbnQ/OiBUeXBlPGFueT47XG4gICAgQElucHV0KCkgcHVibGljIGNvbHVtbkFjdGlvbk1pbldpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIGV2ZW50IG91dHB1dHNcbiAgICBAT3V0cHV0KCd0YWJsZUxvYWQnKSBwdWJsaWMgbG9hZEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TW5nVGFibGVMb2FkRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgnY2VsbENsaWNrJykgcHVibGljIGNlbGxDbGlja0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TW5nVGFibGVDZWxsQ2xpY2tFdmVudDxUPj4oKTtcbiAgICBAT3V0cHV0KCdzZWxlY3Rpb25DaGFuZ2UnKSBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxUPj4oKTtcbiAgICBAT3V0cHV0KCdjYXB0aW9uQ29tcG9uZW50SW5zdGFuY2UnKSBwdWJsaWMgY2FwdGlvbkNtcEluc3RFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCdjb2x1bW5BY3Rpb25Db21wb25lbnRJbnN0YW5jZScpIHB1YmxpYyBjb2x1bW5BY3Rpb25DbXBJbnN0RXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvLyBjb250ZW50IGFuZCB2aWV3IHF1ZXJpZXNcbiAgICBAQ29udGVudENoaWxkcmVuKE1uZ1RlbXBsYXRlRGlyZWN0aXZlKSBwdWJsaWMgdGVtcGxhdGVzITogUXVlcnlMaXN0PE1uZ1RlbXBsYXRlRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkcmVuKE1uZ0NvbXBvbmVudERpcmVjdGl2ZSkgcHVibGljIGNvbXBvbmVudHMhOiBRdWVyeUxpc3Q8TW5nQ29tcG9uZW50RGlyZWN0aXZlPGFueT4+O1xuICAgIEBWaWV3Q2hpbGQoVGFibGUpIHB1YmxpYyBwcmltZVRhYmxlITogVGFibGU7XG5cbiAgICAvLyB0ZW1wbGF0ZXNcbiAgICBwdWJsaWMgY2FwdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwdWJsaWMgY29sdW1uQWN0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHB1YmxpYyBmb290ZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvLyBkYXRhIHByb3ZpZGVyIGFuZCBpdGVtc1xuICAgIHB1YmxpYyBpc0xhenkgPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNQYWdpbmF0aW9uID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB1c2VEYXRhUHJvdmlkZXIgPSBmYWxzZTtcbiAgICBwcml2YXRlIHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWRTdWJlamN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgcHVibGljIHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQkID0gdGhpcy51c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkU3ViZWpjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcXVlcnlSZXN1bHQkPzogT2JzZXJ2YWJsZTxNZWRpdXNRdWVyeVJlc3VsdDxUPj47XG4gICAgcHVibGljIGxvYWRpbmckPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwdWJsaWMgZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtczogQXJyYXk8VD4gPSBbXTtcbiAgICBwcml2YXRlIGl0ZW1zU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PEFycmF5PFQ+PigxKTtcblxuICAgIHByaXZhdGUgcXVlcnlSZXN1bHRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICAvLyBwYWdpbmF0aW9uLCBzb3J0IGFuZCBmaWx0ZXJzXG4gICAgcHVibGljIHJvd3NQZXJQYWdlT3B0aW9ucyE6IEFycmF5PG51bWJlcj47XG4gICAgcHVibGljIHJvd3MhOiBudW1iZXI7XG4gICAgcHVibGljIG9mZnNldCA9IDA7XG4gICAgcHVibGljIG11bHRpU29ydE1ldGE6IFNvcnRNZXRhW10gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgZmlsdGVyTWV0YWRhdGE6IHtbczogc3RyaW5nXTogRmlsdGVyTWV0YWRhdGF9ID0ge307XG5cbiAgICAvLyBpbmZpbml0ZSBzY3JvbGxcbiAgICBwdWJsaWMgaW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcblxuICAgIC8vIHZpc3VhbFxuICAgIHB1YmxpYyBjbGFzc05hbWUhOiBzdHJpbmc7XG4gICAgcHVibGljIHRhYmxlRnVsbEhlaWdodE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHJvd0hlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBzZWxlY3Rpb25cbiAgICBwdWJsaWMgc2VsZWN0aW9uOiBBcnJheTxUPiA9IFtdO1xuXG4gICAgLy8gZGF0YSBwcm92aWRlclxuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU2VydmljZTogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PigxKTtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50PzogTGF6eUxvYWRFdmVudDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnRWZXJzaW9uID0gMDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb24gPSAwO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gZmlsdGVyLCBzb3J0XG4gICAgcHVibGljIGhhc0NvbHVtbkZpbHRlcnMgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzRmlsdGVyQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNTb3J0Q2hhbmdlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgZmlsdGVyRGVzY3JpcHRvcnM6IEFycmF5PEZpbHRlckRlc2NyaXB0b3I8YW55Pj4gPSBbXTtcblxuICAgIC8vIGFjdGlvbnNcbiAgICBwdWJsaWMgc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcm93Q2xpY2tBY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9yPFQ+W10gPSBbXTtcbiAgICBwdWJsaWMgcm93SW5saW5lQWN0aW9uczogQWN0aW9uRGVzY3JpcHRvcjxUPltdID0gW107XG5cbiAgICAvLyBvdGhlclxuICAgIHByaXZhdGUgcm91dGVySXNOYXZpZ2F0aW9uT3V0c2lkZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXI/OiBJVmlld0NvbnRhaW5lcjxULCBTPjtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtbmdDb21tb25zU2VydmljZTogTW5nQ29tbW9uc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYWN0aW9uRXhlY3V0b3I6IE1uZ0FjdGlvbkV4ZWN1dG9yU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB2aWV3Q29udGFpbmVyU2VydmljZTogTW5nVmlld0NvbnRhaW5lckNvbXBvbmVudFNlcnZpY2U8VCwgUz4gfCBudWxsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIgPSB0aGlzLnZpZXdDb250YWluZXJJbml0ID8/IHRoaXMudmlld0NvbnRhaW5lclNlcnZpY2UgPz8gdW5kZWZpbmVkO1xuICAgICAgICAvLyBVc2VkIGZvciBjb25maWdzIHdpdGhpbiB0aGlzIG1ldGhvZCBhbmQgaXMgbm90IGR5bmFtaWNhbGx5IHNldCBieSBUYWJsZUR5bmFtaWNEZXNjcmlwdG9yXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWdEZXNjcmlwdG9yID0gdGhpcy5pbml0aWFsRGVzY3JpcHRvcjtcblxuICAgICAgICBpZiAoISh0aGlzLmluaXRpYWxEZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFibGVEeW5hbWljRGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IHRoaXMuaW5pdGlhbERlc2NyaXB0b3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXAgcm93IHNldHRpbmdzXG4gICAgICAgIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMgPSB0aGlzLmRlc2NyaXB0b3I/LmNvbHVtbnMuZmlsdGVyKGMgPT4gdHlwZW9mIGMuZmlsdGVyRGVzY3JpcHRvciAhPT0gJ3VuZGVmaW5lZCcpLm1hcChjID0+IGMuZmlsdGVyRGVzY3JpcHRvciEpID8/IFtdO1xuICAgICAgICB0aGlzLmhhc0NvbHVtbkZpbHRlcnMgPSB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLmxlbmd0aCA+IDA7XG4gICAgICAgIHRoaXMucm93cyA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5kZWZhdWx0TnVtUm93cyA/PyAyNTtcbiAgICAgICAgdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnMgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8ucm93c1BlclBhZ2VPcHRpb25zID8/IFsyNSwgNTAsIDEwMF07XG5cbiAgICAgICAgLy8gcHJvY2VzcyBhY3Rpb25zXG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuYWN0aW9ucykge1xuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24ucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEFjdGlvblBvc2l0aW9uRW51bS5Sb3dDbGljazpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dDbGlja0FjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEFjdGlvblBvc2l0aW9uRW51bS5Sb3dJbmxpbmU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93SW5saW5lQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPSB0eXBlb2YgdGhpcy5jb2x1bW5BY3Rpb25Db21wb25lbnQgIT09ICd1bmRlZmluZWQnIHx8IHRoaXMucm93SW5saW5lQWN0aW9ucy5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vIGRlZmluZSBhbGwgc3R5bGVzXG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LmNsYXNzTmFtZSA/PyAnJztcbiAgICAgICAgdGhpcy50YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8udGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID8/IG51bGw7XG4gICAgICAgIHRoaXMucm93SGVpZ2h0ID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnJvd0hlaWdodCA/PyBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNDb2x1bW5DbGlja2FibGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBkZWZpbmUgaWYgY2VsbCBjbGljayBpcyBiZWluZyBvYnNlcnZlZCB2aWEgb3V0cHV0XG4gICAgICAgICAgICB0aGlzLmlzQ29sdW1uQ2xpY2thYmxlID0gdGhpcy5yb3dDbGlja0FjdGlvbnMubGVuZ3RoID4gMCB8fCB0aGlzLmNlbGxDbGlja0V2ZW50RW1pdHRlci5vYnNlcnZlZDtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGJhc2VDb25maWdEZXNjcmlwdG9yPy5zaXplKSB7XG4gICAgICAgICAgICBjYXNlIFRhYmxlU2l6ZUVudW0uU21hbGw6XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1zbSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRhYmxlU2l6ZUVudW0uTGFyZ2U6XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1sZyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2VDb25maWdEZXNjcmlwdG9yPy5oYXNHcmlkbGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lICs9ICcgcC1kYXRhdGFibGUtZ3JpZGxpbmVzJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZUNvbmZpZ0Rlc2NyaXB0b3IgJiYgIXRoaXMuY29sdW1uQWN0aW9uTWluV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uQWN0aW9uTWluV2lkdGggPSBTdHlsZXNVdGlsLmNhbGN1bGF0ZVRhYmxlQ29sdW1uQWN0aW9uV2lkdGgoXG4gICAgICAgICAgICAgICAgYmFzZUNvbmZpZ0Rlc2NyaXB0b3IgYXMgVGFibGVEZXNjcmlwdG9yPHVua25vd24+LFxuICAgICAgICAgICAgICAgIHRoaXMucm93SW5saW5lQWN0aW9ucyBhcyBBcnJheTxBY3Rpb25EZXNjcmlwdG9yPHVua25vd24+PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGluZmluaXRlIHNjcm9sbFxuICAgICAgICBsZXQgcGFnaW5hdGlvbk1vZGUgPSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5Ob25lO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2VDb25maWdEZXNjcmlwdG9yPy5wYWdpbmF0aW9uTW9kZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgY2hvaWNlIGlzIHRoZSBtb3N0IHN0cm9uZyAtIGlmIGRlZmluZWQsIHVzZSB0aGlzIHZhbHVlXG4gICAgICAgICAgICBwYWdpbmF0aW9uTW9kZSA9IGJhc2VDb25maWdEZXNjcmlwdG9yLnBhZ2luYXRpb25Nb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmRhdGFQcm92aWRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBwcm92aWRlciBpcyB1c2VkLCB1c2UgcGFnaW5hdGlvblxuICAgICAgICAgICAgcGFnaW5hdGlvbk1vZGUgPSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5QYWdpbmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhZ2luYXRpb25Nb2RlID09PSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5JbmZpbml0ZVNjcm9sbCkge1xuICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRnVsbEhlaWdodE9mZnNldCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy50YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPz8gMzE1O1xuICAgICAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8ucm93SGVpZ2h0ID8/IDQ1O1xuICAgICAgICAgICAgdGhpcy51c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBhZ2luYXRpb25Nb2RlID09PSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5QYWdpbmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmlzUGFnaW5hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBkYXRhIHByb3ZpZGVyIGlzIHN1cHBsaWVkLCBpZiBpcywgdXNlIGl0IHByaW1hcmlseVxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIC8vIG1hcCBzdWJqZWN0cyB0byBvYnNlcnZhYmxlcyBhbmQgaW5pdGlhdGUgZGF0YVxuICAgICAgICAgICAgdGhpcy51c2VEYXRhUHJvdmlkZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc0xhenkgPSB0aGlzLmRhdGFQcm92aWRlci5pc0xhenk7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0JCA9IHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICBjb25zdCBlbXB0eVF1ZXJ5UmVzdWx0ID0gbmV3IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+KCk7XG4gICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gW107XG4gICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LmFsbERhdGFDb3VudCA9IDA7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChlbXB0eVF1ZXJ5UmVzdWx0KTtcblxuICAgICAgICAgICAgLy8gaW5qZWN0IHNlcnZpY2VcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4odGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFQcm92aWRlci5nZXRBbGxSZWxvYWQkLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2gocmVsb2FkU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHF1ZXJ5IHJlc3VsdCBpcyBwcm92aWRlZCwgdXNlIGl0IGFzIHNlY29uZGFyeSBzb3VyY2Ugb3IgZWxzZSB0cnkgdG8gdXNlIGl0ZW1zXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVyeVJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5xdWVyeVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLnF1ZXJ5UmVzdWx0IDogb2YodGhpcy5xdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gKGlzT2JzZXJ2YWJsZSh0aGlzLml0ZW1zKSA/IHRoaXMuaXRlbXMgOiB0aGlzLml0ZW1zU3ViamVjdC5hc09ic2VydmFibGUoKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKHYxLCB2MikgPT4gdjEubGVuZ3RoID09PSB2Mi5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHYxLmV2ZXJ5KCh2MWksIGlkeCkgPT4gdjFpW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldID09PSB2MltpZHhdW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldKSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChpdGVtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQucGFnZURhdGEgPSBpdGVtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0LmFsbERhdGFDb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeVJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghaXNPYnNlcnZhYmxlKHRoaXMuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNTdWJqZWN0Lm5leHQodGhpcy5pdGVtcyA/PyBbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvYWRpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMubG9hZGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLmxvYWRpbmcgOiBvZih0aGlzLmxvYWRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbFF1ZXJ5UGFyYW1NYXAgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXMgJiZcbiAgICAgICAgICAgICgoIWluaXRpYWxRdWVyeVBhcmFtTWFwLmhhcygnc29ydCcpICYmIGJhc2VDb25maWdEZXNjcmlwdG9yPy5oYXNEZWZhdWx0U29ydCkgfHxcbiAgICAgICAgICAgICAgICAoIWluaXRpYWxRdWVyeVBhcmFtTWFwLmhhcygnZmlsdGVyJykgJiYgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5zb21lKGZkID0+IGZkLmhhc0RlZmF1bHRWYWx1ZSkpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgc29ydC9maWx0ZXJzIGFyZSBhcHBsaWVkLCBubyBhZGRpdGlvbmFsIGZpbHRlcmluZy9zb3J0aW5nIGlzIHNwZWNpZmllZCBpbiBxdWVyeSBwYXJhbVxuICAgICAgICAgICAgLy8gcmVkaXJlY3QgbXVzdCBiZSBkb25lIGF0IGZpcnN0IHN0ZXBcbiAgICAgICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW0gPSBNZWRpdXNSZXN0VXRpbC5mcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLCB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLCB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBMYXp5TG9hZEV2ZW50ID0ge307XG4gICAgICAgICAgICBldmVudC5tdWx0aVNvcnRNZXRhID0gdGhpcy5jcmVhdGVTb3J0TWV0YShtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgICAgIGV2ZW50LmZpbHRlcnMgPSB0aGlzLmNyZWF0ZUZpbHRlck1ldGEobWVkaXVzUXVlcnlQYXJhbSk7XG5cbiAgICAgICAgICAgIC8vIGZpcnN0IG5hdmlnYXRlIHRvIGNvcnJlY3QgdXJsIHdpdGggZGVmYXVsdCBmaWx0ZXJzL3NvcnRzXG4gICAgICAgICAgICB0aGlzLnJvdXRlclxuICAgICAgICAgICAgICAgIC5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogTWVkaXVzUmVzdFV0aWwuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50LCB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplRGF0YUxvYWRpbmdUcmlnZ2VycygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplRGF0YUxvYWRpbmdUcmlnZ2VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWVyeVJlc3VsdFN1YnNjcmlwdGlvbiA9IHRoaXMucXVlcnlSZXN1bHQkLnN1YnNjcmliZShlID0+ICh0aGlzLnF1ZXJ5UmVzdWx0ID0gZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh0ZW1wbGF0ZS5nZXRUeXBlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29sdW1uQWN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5BY3Rpb25UZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0lubGluZUFjdGlvbnNDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10gJiYgIWNoYW5nZXNbJ2l0ZW1zJ10uZmlyc3RDaGFuZ2UgJiYgQXJyYXkuaXNBcnJheShjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNTdWJqZWN0Lm5leHQoY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5xdWVyeVJlc3VsdFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxvYWQoZW1pdEV2ZW50ID0gZmFsc2UsIHJlc2V0UGFyYW1zID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXNCdWlsZGVyID0gcmVzZXRQYXJhbXNcbiAgICAgICAgICAgID8gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdLCAwKVxuICAgICAgICAgICAgOiBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGVGcm9tRXhpc3RpbmcodGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtID8/IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCkpXG4gICAgICAgICAgICAgICAgICAud2l0aEl0ZW1zUGVyUGFnZSh0aGlzLnJvd3MpXG4gICAgICAgICAgICAgICAgICAud2l0aEl0ZW1zT2Zmc2V0KHRoaXMub2Zmc2V0KTtcblxuICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocXVlcnlQYXJhbXNCdWlsZGVyLmJ1aWxkKCksIGVtaXRFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVMYXp5TG9hZChldmVudDogTGF6eUxvYWRFdmVudCkge1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50VmVyc2lvbisrO1xuXG4gICAgICAgIGlmICh0aGlzLnVzZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Lm11bHRpU29ydE1ldGEgfHwgZXZlbnQubXVsdGlTb3J0TWV0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBzb3J0IG1ldGEgdG8gZXZlbnQgaWYgbm90IG11bHRpc29ydCBtZXRhIGlzIHByZXNlbnRcbiAgICAgICAgICAgICAgICBldmVudC5tdWx0aVNvcnRNZXRhID0gdGhpcy5jcmVhdGVTb3J0TWV0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFldmVudC5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQuZmlsdGVycyA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMucm91dGVySXNOYXZpZ2F0aW9uT3V0c2lkZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIG5lY2Vzc2FyeTogZnJvbSBzb21lIHJlYXNvbiwgcHJpbWVORyBjb21taXRzIG9uZSBsYXN0IGxhenkgbG9hZCBldmVudCB3aGVuZXZlciBhbnkgYW5ndWxhciByb3V0ZXIgbmF2aWdhdGlvbiBvY2N1cnNcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogTWVkaXVzUmVzdFV0aWwuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50LCB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW1zID0gZXZlbnQgPyBNZWRpdXNSZXN0VXRpbC5mcm9tUHJpbWVMYXp5TG9hZEV2ZW50VG9NZWRpdXNRdWVyeVBhcmFtcyhldmVudCkgOiBuZXcgTWVkaXVzUXVlcnlQYXJhbSgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKG1lZGl1c1F1ZXJ5UGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgb25UYWJsZVNvcnQoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmlzU29ydENoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgb25UYWJsZUZpbHRlcihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaXNGaWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DZWxsQ2xpY2soZXZlbnQ6IEV2ZW50LCBjb2w6IENvbHVtbkRlc2NyaXB0b3I8YW55LCBUPiwgaXRlbTogVCwgaWR4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbW5nRXZlbnQgPSBuZXcgTW5nVGFibGVDZWxsQ2xpY2tFdmVudDxUPihjb2wsIGl0ZW0sIGlkeCk7XG4gICAgICAgIHRoaXMuY2VsbENsaWNrRXZlbnRFbWl0dGVyLm5leHQobW5nRXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5yb3dDbGlja0FjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLnJvd0NsaWNrQWN0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uRXhlY3V0b3IudHJpZ2dlclJvd0NsaWNrQWN0aW9uKGFjdGlvbiwgbW5nRXZlbnQsIHRoaXMucm91dGUsIHRoaXMuZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IEFycmF5PFQ+KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNhcHRpb25DbXBJbnN0PEM+KGluc3RhbmNlOiBDKSB7XG4gICAgICAgIHRoaXMuY2FwdGlvbkNtcEluc3RFdmVudEVtaXR0ZXIubmV4dChpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sdW1uQWN0aW9uQ21wSW5zdDxDPihpbnN0YW5jZTogQykge1xuICAgICAgICB0aGlzLmNvbHVtbkFjdGlvbkNtcEluc3RFdmVudEVtaXR0ZXIubmV4dChpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQWN0aW9uRmluaXNoKHJ1blJlc3VsdDogQWN0aW9uSW5zdGFuY2U8VCwgdW5rbm93bj4pIHtcbiAgICAgICAgaWYgKCFydW5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocXVlcnlQYXJhbTogTWVkaXVzUXVlcnlQYXJhbSB8IG51bGwgPSBudWxsLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgaWYgKCFxdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdKS5idWlsZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb24rKztcblxuICAgICAgICBNZWRpdXNSZXN0VXRpbC5tb2RpZnlGaWx0ZXJQcm9wZXJ0aWVzKHF1ZXJ5UGFyYW0sIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMpO1xuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhUHJvdmlkZXJcbiAgICAgICAgICAgID8uZ2V0QWxsKHF1ZXJ5UGFyYW0sIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSwgdGhpcy5kZXNjcmlwdG9yPy5pc0xvY2FsaXplZCA/IHRoaXMubW5nQ29tbW9uc1NlcnZpY2UuYXBwRGF0YUxhbmd1YWdlID8/IHVuZGVmaW5lZCA6IHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxEZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFibGVEeW5hbWljRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gdGhpcy5pbml0aWFsRGVzY3JpcHRvci50b1RhYmxlRGVzY3JpcHRvckZyb21EYXRhKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzID0gdGhpcy5kZXNjcmlwdG9yLmNvbHVtbnMuZmlsdGVyKGMgPT4gdHlwZW9mIGMuZmlsdGVyRGVzY3JpcHRvciAhPT0gJ3VuZGVmaW5lZCcpLm1hcChjID0+IGMuZmlsdGVyRGVzY3JpcHRvciEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNDb2x1bW5GaWx0ZXJzID0gdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5sZW5ndGggPiAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5pbml0aWFsRGVzY3JpcHRvci5kZWZhdWx0TnVtUm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93c1BlclBhZ2VPcHRpb25zID0gdGhpcy5pbml0aWFsRGVzY3JpcHRvci5yb3dzUGVyUGFnZU9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGVzY3JpcHRvciA9IHRoaXMuaW5pdGlhbERlc2NyaXB0b3Iub25EYXRhUmVjZWl2ZWRUeXBlQnVpbGRpbmcocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ZpbHRlckNoYW5nZWQgfHwgdGhpcy5pc1NvcnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXMuc3BsaWNlKHF1ZXJ5UGFyYW0hLml0ZW1zT2Zmc2V0ID8/IDAsIHF1ZXJ5UGFyYW0hLml0ZW1zUGVyUGFnZSA/PyB0aGlzLnJvd3MsIC4uLihyZXMucGFnZURhdGEgPz8gW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA9IFsuLi50aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTb3J0Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHdoYXQgaGFwcGVucyBvbiBlcnJvciB3aXRoIG5vIG1vZGVsIGluaXNpZGUgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25VdGlsLnRhYmxlTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMuZGVzY3JpcHRvciEsIGVyciwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1wdHlRdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChlbXB0eVF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtbmdFdmVudCA9IG5ldyBNbmdUYWJsZUxvYWRFdmVudCgpO1xuICAgICAgICAgICAgbW5nRXZlbnQub3JpZ2luYWxFdmVudCA9IHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudCA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtbmdFdmVudC5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTtcbiAgICAgICAgICAgIHRoaXMubG9hZEV2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHBhcmFtczogUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW0gPSBNZWRpdXNSZXN0VXRpbC5mcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyhwYXJhbXMsIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMsIHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24gPCB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uICsgMSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIG9ubHkgaWYgbmV3IHZlcnNpb24gZnJvbSBxdWVyeSBwYXJhbXMgd2lsbCBiZSBoaWdoZXJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZFN1YmVqY3QubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgdGhpcy5tdWx0aVNvcnRNZXRhID0gdGhpcy5jcmVhdGVTb3J0TWV0YShtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNZXRhZGF0YSA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YShtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgdGhpcy5yb3dzID0gbWVkaXVzUXVlcnlQYXJhbT8uaXRlbXNQZXJQYWdlID8/IHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG1lZGl1c1F1ZXJ5UGFyYW0/Lml0ZW1zT2Zmc2V0ID8/IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJNZXRhKG1lZGl1c1F1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtKSB7XG4gICAgICAgIGxldCBwYXJhbXM6IE1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgICAgIGlmICghbWVkaXVzUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgcGFyYW1zID0gbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltZUZpbHRlck1ldGE6IHtbczogc3RyaW5nXTogRmlsdGVyTWV0YWRhdGF9ID0ge307XG4gICAgICAgIC8vIGlmIGFueSBmaWx0ZXIgaXMgcHJlc2VudCwgbm8gZGVmYXVsdCBmaWx0ZXJzIHNob3VsZCBiZSBhcHBsaWVkIVxuICAgICAgICBjb25zdCBhcHBseURlZmF1bHRGaWx0ZXJzID0gKHBhcmFtcy5maWx0ZXJQYXJhbXM/Lmxlbmd0aCA/PyAwKSA9PT0gMDtcblxuICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hNb2RlO1xuICAgICAgICAgICAgc3dpdGNoIChmLmZpbHRlclR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZpbHRlclR5cGVFbnVtLlN0cmluZzpcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlLkNPTlRBSU5TO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZpbHRlclR5cGVFbnVtLkRhdGU6XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5EQVRFX0lTO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZpbHRlclR5cGVFbnVtLkxvb2t1cDpcbiAgICAgICAgICAgICAgICBjYXNlIEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW06IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9va3VwRmlsdGVyID0gZiBhcyBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPGFueT47XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb29rdXBGaWx0ZXIubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5JTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5FUVVBTFM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5FUVVBTFM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZi5kZWZhdWx0RmlsdGVyTWF0Y2hNb2RlKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gZi5kZWZhdWx0RmlsdGVyTWF0Y2hNb2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZi5tYXRjaE1vZGVzICYmICFmLm1hdGNoTW9kZXM/LmluY2x1ZGVzKG1hdGNoTW9kZSkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBmLm1hdGNoTW9kZXNbMF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoYXBwbHlEZWZhdWx0RmlsdGVycykge1xuICAgICAgICAgICAgICAgIGlmIChmLmRlZmF1bHRWYWx1ZVRvICYmIGYuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW2YuZGVmYXVsdFZhbHVlLCBmLmRlZmF1bHRWYWx1ZVRvXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGYuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZi5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmltZUZpbHRlck1ldGFbZi5wcm9wZXJ0eV0gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogbWF0Y2hNb2RlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJhbXMuZmlsdGVyUGFyYW1zPy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMuZmluZChmZCA9PiBmZC5maWx0ZXJQcm9wZXJ0eSA9PT0gZi5wcm9wZXJ0eSB8fCBmZC5wcm9wZXJ0eSA9PT0gZi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaE1vZGUgPSBmLmZpbHRlck1hdGNoVHlwZSAmJiBkZXNjcmlwdG9yID8gTWVkaXVzUmVzdFV0aWwuZ2V0TWFwcGluZyhmLmZpbHRlck1hdGNoVHlwZSwgZGVzY3JpcHRvci5maWx0ZXJUeXBlLCAyKT8uWzBdIDogTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVxdWFscztcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIG1hdGNoTW9kZSkge1xuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGYuZmlsdGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uRGF0ZSAmJiB0eXBlb2YgZmlsdGVyVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsdGVyVmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBmaWx0ZXJWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlID0gbmV3IERhdGUoZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJhbmdlIGlzIHByb3ZpZGVkLCB0YWtlIHRoYXQgaW50byBhY2NvdW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZi5maWx0ZXJWYWx1ZVRvID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZi5maWx0ZXJWYWx1ZVRvID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVUbyA9IG5ldyBEYXRlKGYuZmlsdGVyVmFsdWVUbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IFtmaWx0ZXJWYWx1ZSwgZmlsdGVyVmFsdWVUb107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJpbWVGaWx0ZXJNZXRhW2Rlc2NyaXB0b3IucHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogbWF0Y2hNb2RlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcmltZUZpbHRlck1ldGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTb3J0TWV0YShtZWRpdXNRdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSk6IFNvcnRNZXRhW10ge1xuICAgICAgICBsZXQgcGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICBpZiAoIW1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBtZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNvcnRNZXRhOiBTb3J0TWV0YVtdO1xuICAgICAgICBjb25zdCBhcHBseURlZmF1bHRTb3J0cyA9IChwYXJhbXMuc29ydFByb3BlcnR5Py5sZW5ndGggPz8gMCkgPT09IDA7XG5cbiAgICAgICAgaWYgKGFwcGx5RGVmYXVsdFNvcnRzICYmIHRoaXMuZGVzY3JpcHRvcj8uaGFzRGVmYXVsdFNvcnQpIHtcbiAgICAgICAgICAgIHNvcnRNZXRhID0gdGhpcy5kZXNjcmlwdG9yLmRlZmF1bHRTb3J0UHJvcGVydHkubWFwKFxuICAgICAgICAgICAgICAgIChwLCBpZHgpID0+XG4gICAgICAgICAgICAgICAgICAgIDxTb3J0TWV0YT57XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiB0aGlzLmRlc2NyaXB0b3IhLmRlZmF1bHRTb3J0QXNjW2lkeF0gPyAxIDogLTFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvcnRNZXRhID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbXMuc29ydFByb3BlcnR5Py5mb3JFYWNoKChzLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBzb3J0TWV0YS5maW5kSW5kZXgodmFsdWUgPT4gdmFsdWUuZmllbGQgPT09IHMpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIHNvcnRNZXRhW2V4aXN0aW5nSW5kZXhdLm9yZGVyID0gcGFyYW1zLnNvcnRBc2M/LltpZHhdID8/IHRydWUgPyAxIDogLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvcnRNZXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogcyxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IHBhcmFtcy5zb3J0QXNjPy5baWR4XSA/PyB0cnVlID8gMSA6IC0xXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0TWV0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEYXRhTG9hZGluZ1RyaWdnZXJzKCkge1xuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgLy8gdHJpZ2dlciB0YWJsZSBsb2FkcyBmcm9tIHJvdXRlIHVwZGF0ZXNcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlUXBTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShxcCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGFibGVGcm9tUm91dGVVcGRhdGUocXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByb3V0ZXJFdlN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgJiYgZS51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdICE9PSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25DYW5jZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHJvdXRlUXBTdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2gocm91dGVyRXZTdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbG9hZCBkYXRhIGltbWVkaWF0ZWx5IGJ5IGNyZWF0aW5nIGRlZmF1bHQgc29ydHMgYW5kIGZpbHRlcnMgKHByaW1lbmcgd2lsbCB0cmlnZ2VyIG9uTGF6eUxvYWQgZXZlbnQgb24gc29ydCZmaWx0ZXIgbWV0YWRhdGEgY2hhbmdlKVxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnQgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlTb3J0TWV0YSA9IGRlZmF1bHRTb3J0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gdGhpcy5jcmVhdGVGaWx0ZXJNZXRhKCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTWV0YWRhdGEgPSBkZWZhdWx0RmlsdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBbc3R5bGUuaGVpZ2h0XT1cInRhYmxlRnVsbEhlaWdodE9mZnNldCA/ICdjYWxjKDEwMHZoIC0gJyArIHRhYmxlRnVsbEhlaWdodE9mZnNldCArICdweCknIDogbnVsbFwiPlxuICAgIDwhLS0gTVVTVCBOT1QgdXNlIG9ic2VydmFibGUgZm9yIHZhbHVlIHdoZW4gdXNpbmcgdmlydHVhbCBzY3JvbGwgLSBkb2VzIG5vdCB3b3JrIGZvciBzb21lIHJlYXNvbiAtLT5cbiAgICA8cC10YWJsZVxuICAgICAgICAqbmdJZj1cIiF1c2VRdWVyeVBhcmFtcyB8fCAodXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCQgfCBhc3luYylcIlxuICAgICAgICBbdmFsdWVdPVwiaW5maW5pdGVTY3JvbGwgPyBkYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zIDogKHF1ZXJ5UmVzdWx0JCB8IGFzeW5jKT8ucGFnZURhdGEgPz8gW11cIlxuICAgICAgICBbZGF0YUtleV09XCIkYW55KGRlc2NyaXB0b3I/LmRhdGFLZXlQcm9wZXJ0eSA/PyBudWxsKVwiXG4gICAgICAgIFtsYXp5XT1cImlzTGF6eVwiXG4gICAgICAgIFtsb2FkaW5nXT1cIihsb2FkaW5nJCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgIFtwYWdpbmF0b3JdPVwiaXNQYWdpbmF0aW9uICYmICFpbmZpbml0ZVNjcm9sbFwiXG4gICAgICAgIFtyb3dzXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyAyMCA6IHJvd3MpXCJcbiAgICAgICAgW2ZpcnN0XT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyAwIDogb2Zmc2V0KVwiXG4gICAgICAgIFt0b3RhbFJlY29yZHNdPVwiJGFueShpbmZpbml0ZVNjcm9sbCA/IG51bGwgOiAocXVlcnlSZXN1bHQkIHwgYXN5bmMpPy5hbGxEYXRhQ291bnQgPz8gMClcIlxuICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyBudWxsIDogcm93c1BlclBhZ2VPcHRpb25zKVwiXG4gICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwiIWluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgW2N1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGVdPVwiJ21uZ1RhYmxlLnBhZ2luYXRpb25Nc2cnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW211bHRpU29ydE1ldGFdPVwiJGFueShtdWx0aVNvcnRNZXRhKVwiXG4gICAgICAgIFtmaWx0ZXJzXT1cImZpbHRlck1ldGFkYXRhXCJcbiAgICAgICAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCIkYW55KHNlbGVjdGlvbkVuYWJsZWQgPyBzZWxlY3Rpb25Nb2RlIDogbnVsbClcIlxuICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIiRhbnkocm93SGVpZ2h0KVwiXG4gICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICBbcm93SG92ZXJdPVwiZGVzY3JpcHRvcj8uaGFzSG92ZXIgPz8gdHJ1ZVwiXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cImNsYXNzTmFtZVwiXG4gICAgICAgIChvbkxhenlMb2FkKT1cIm9uVGFibGVMYXp5TG9hZCgkZXZlbnQpXCJcbiAgICAgICAgKG9uU29ydCk9XCJvblRhYmxlU29ydCgkZXZlbnQpXCJcbiAgICAgICAgKG9uRmlsdGVyKT1cIm9uVGFibGVGaWx0ZXIoJGV2ZW50KVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjYXB0aW9uVGVtcGxhdGUgfHwgY2FwdGlvbkNvbXBvbmVudCB8fCBkZXNjcmlwdG9yPy50aXRsZVwiIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXB0aW9uVGVtcGxhdGU7IGVsc2UgY29tcG9uZW50T3JEZWZhdWx0Q2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb21wb25lbnRPckRlZmF1bHRDYXB0aW9uPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYXB0aW9uQ29tcG9uZW50OyBlbHNlIGRlZmF1bHRDYXB0aW9uXCIgW21uZ0NvbXBvbmVudF09XCJjYXB0aW9uQ29tcG9uZW50XCIgKGluc3RhbmNlQ3JlYXRlZCk9XCJvbkNhcHRpb25DbXBJbnN0KCRldmVudClcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDYXB0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJwLTAgbS0wXCI+e3sgZGVzY3JpcHRvcj8udGl0bGUgfX08L2g1PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIiFkZXNjcmlwdG9yPy5oaWRlSGVhZGVyXCIgY2xhc3M9XCJtbmctdGFibGUtaGVhZGVyXCIgW2NsYXNzXT1cImRlc2NyaXB0b3I/LmhlYWRlckNsYXNzTmFtZVwiPlxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNlbGVjdGlvbkVuYWJsZWQgJiYgc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJ1wiIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uPjwvdGg+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGRlc2NyaXB0b3I/LmNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5pc1NvcnRFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC5tYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmhlYWRlckNsYXNzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZmlsdGVyRGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5maWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLnRpdGxlID8/IChjb2wucHJvcGVydHkgfCBpMThuUHJvcGVydHk6IGRlc2NyaXB0b3IhLm1vZGVsKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmZpbHRlckRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvciEuZmlsdGVyRGlzcGxheSA9PT0gZmlsdGVyRGlzcGxheU1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheV09XCJkZXNjcmlwdG9yIS5maWx0ZXJEaXNwbGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaXB0b3JdPVwiY29sLmZpbHRlckRlc2NyaXB0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21uZy10YWJsZS1jb2x1bW4tZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhY29sLmlzU29ydEVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29sLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sLm1heFdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuaGVhZGVyQ2xhc3NOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3JpcHRvcj8uZmlsdGVyRGlzcGxheSA9PT0gZmlsdGVyRGlzcGxheVJvdyAmJiBoYXNDb2x1bW5GaWx0ZXJzICYmIGNvbC5maWx0ZXJEZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJyBtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2wudGl0bGUgPz8gKGNvbC5wcm9wZXJ0eSB8IGkxOG5Qcm9wZXJ0eTogZGVzY3JpcHRvciEubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLWZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5maWx0ZXJEZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IhLmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlNZW51XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXldPVwiZGVzY3JpcHRvciEuZmlsdGVyRGlzcGxheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctdGFibGUtY29sdW1uLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNob3dJbmxpbmVBY3Rpb25zQ29sdW1uXCIgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5BY3Rpb25NaW5XaWR0aFwiIHBGcm96ZW5Db2x1bW4+PC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJkZXNjcmlwdG9yPy5maWx0ZXJEaXNwbGF5ID09PSBmaWx0ZXJEaXNwbGF5Um93ICYmIGhhc0NvbHVtbkZpbHRlcnNcIiBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uPjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgZGVzY3JpcHRvcj8uY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIoY29sLmZpbHRlckRlc2NyaXB0b3IgPyAnbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5maWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGUgKyAnICcgOiAnICcpICsgY29sLmZpbHRlckRlc2NyaXB0b3I/LmNvbHVtbkNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yPy5jb2x1bW5XaWR0aCA/PyBjb2wud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yPy5jb2x1bW5NaW5XaWR0aCA/PyBjb2wubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC5tYXhXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiICpuZ0lmPVwiY29sLmZpbHRlckRlc2NyaXB0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLWZpbHRlciBbZGlzcGxheV09XCJkZXNjcmlwdG9yIS5maWx0ZXJEaXNwbGF5XCIgW2Rlc2NyaXB0b3JdPVwiY29sLmZpbHRlckRlc2NyaXB0b3JcIj48L21uZy10YWJsZS1jb2x1bW4tZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNob3dJbmxpbmVBY3Rpb25zQ29sdW1uXCIgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5BY3Rpb25NaW5XaWR0aFwiIHBGcm96ZW5Db2x1bW4+PC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtaXRlbSBsZXQtaWR4PVwicm93SW5kZXhcIj5cbiAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicm93SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJkZXNjcmlwdG9yPy5yb3dDbGFzc05hbWUgfCBtbmdDbGFzc01hcFBpcGU6IGRlc2NyaXB0b3I/LnJvd0NsYXNzTmFtZU1hcEZuOml0ZW0gfCBtbmdMb2NhbGVEZWZhdWx0Um93Q2xhc3M6IGRlc2NyaXB0b3I6aXRlbVwiPlxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbkVuYWJsZWQgJiYgc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJ1wiIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0aW9uRW5hYmxlZCAmJiBzZWxlY3Rpb25Nb2RlID09PSAnc2luZ2xlJ1wiIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVSYWRpb0J1dHRvbiBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZVJhZGlvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgZGVzY3JpcHRvcj8uY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNlbGxDbGljaygkZXZlbnQsIGNvbCwgaXRlbSwgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5jbGFzc05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZmlsdGVyRGVzY3JpcHRvciA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5maWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGUgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNsaWNrYWJsZV09XCJpc0NvbHVtbkNsaWNrYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wubWF4V2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC50aXRsZSA/PyAoY29sLnByb3BlcnR5IHwgaTE4blByb3BlcnR5OiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbFwiIFtpdGVtXT1cIml0ZW1cIj48L21uZy10YWJsZS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93SW5saW5lQWN0aW9uc0NvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWFjdGlvbiBqdXN0aWZ5LWNvbnRlbnQtZW5kIHRleHQtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgICAgICAgICAgICAgICBhbGlnbkZyb3plbj1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZTsgZWxzZSBzaG93Q29sdW1uQWN0aW9uQ29tcG9uZW50T3JEZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHtyb3dJdGVtOiBpdGVtLCByb3dJbmRleDogaWR4fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93Q29sdW1uQWN0aW9uQ29tcG9uZW50T3JEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbkFjdGlvbkNvbXBvbmVudDsgZWxzZSBkZWZhdWx0Q29sdW1uQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21uZ0NvbXBvbmVudF09XCJjb2x1bW5BY3Rpb25Db21wb25lbnQhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2VDcmVhdGVkKT1cIm9uQ29sdW1uQWN0aW9uQ21wSW5zdCgkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW5BY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHJvd0lubGluZUFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25dPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld0NvbnRhaW5lcl09XCJ2aWV3Q29udGFpbmVySW5pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hvc3RDb21wb25lbnRdPVwidGhpc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1JZF09XCJkZXNjcmlwdG9yPy5tb2RlbD8uaWRQcm9wZXJ0eU5hbWUgPyBpdGVtW2Rlc2NyaXB0b3IhLm1vZGVsIS5pZFByb3BlcnR5TmFtZSFdIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie2l0ZW1JbmRleDogaWR4fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCk9XCJvbkFjdGlvbkZpbmlzaCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1hY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxvYWRpbmdib2R5XCI+XG4gICAgICAgICAgICA8dHIgW3N0eWxlLmhlaWdodC5weF09XCJyb3dIZWlnaHRcIj5cbiAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCIoZGVzY3JpcHRvcj8uY29sdW1ucz8ubGVuZ3RoID8/IDApICsgKHNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID8gMSA6IDApICsgKHNlbGVjdGlvbkVuYWJsZWQgPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctdGV4dFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cC1za2VsZXRvbiBbbmdTdHlsZV09XCJ7d2lkdGg6ICcxMDAlJ31cIj48L3Atc2tlbGV0b24+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICAgICAgPHRyIFtzdHlsZS5oZWlnaHQucHhdPVwicm93SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiKGRlc2NyaXB0b3I/LmNvbHVtbnM/Lmxlbmd0aCA/PyAwKSArIChzaG93SW5saW5lQWN0aW9uc0NvbHVtbiA/IDEgOiAwKSArIChzZWxlY3Rpb25FbmFibGVkID8gMSA6IDApXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdtbmdUYWJsZS5ub0l0ZW1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImZvb3RlclRlbXBsYXRlXCIgcFRlbXBsYXRlPVwic3VtbWFyeVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmb290ZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7cXVlcnlSZXN1bHQ6IHF1ZXJ5UmVzdWx0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvcC10YWJsZT5cbjwvZGl2PlxuIl19
|
|
611
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFFWixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFLTixTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBaUIsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFFbEksT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUEwQyxNQUFNLGFBQWEsQ0FBQztBQUNyRixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFnQixZQUFZLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixF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Uzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nQ2xhc3MsIE5nRm9yT2YsIE5nSWYsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFR5cGUsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25DYW5jZWwsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgTmF2aWdhdGlvblN0YXJ0LCBQYXJhbXMsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck1ldGFkYXRhLCBMYXp5TG9hZEV2ZW50LCBTb3J0TWV0YX0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtTa2VsZXRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9za2VsZXRvbic7XG5pbXBvcnQge1RhYmxlLCBUYWJsZU1vZHVsZX0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uLCBpc09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyLCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtNZWRpdXNGaWx0ZXJNYXRjaFR5cGUsIE1lZGl1c1F1ZXJ5UGFyYW0sIE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLCBNZWRpdXNRdWVyeVJlc3VsdH0gZnJvbSAnLi4vLi4vLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge01lZGl1c1Jlc3RVdGlsfSBmcm9tICcuLi8uLi8uLi9hcGkvdXRpbHMnO1xuaW1wb3J0IHtJVGFibGVEYXRhUHJvdmlkZXJ9IGZyb20gJy4uLy4uLy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7QWN0aW9uRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvYWN0aW9uJztcbmltcG9ydCB7RmlsdGVyRGVzY3JpcHRvciwgRmlsdGVyTG9va3VwRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvZmlsdGVyJztcbmltcG9ydCB7Q29sdW1uRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdGFibGUnO1xuaW1wb3J0IHtUYWJsZURlc2NyaXB0b3IsIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL3RhYmxlJztcbmltcG9ydCB7QWN0aW9uUG9zaXRpb25FbnVtLCBGaWx0ZXJUeXBlRW51bSwgVGFibGVGaWx0ZXJEaXNwbGF5RW51bSwgVGFibGVQYWdpbmF0aW9uTW9kZUVudW0sIFRhYmxlU2l6ZUVudW19IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL3R5cGVzJztcbmltcG9ydCB7TW5nQ29tcG9uZW50RGlyZWN0aXZlLCBNbmdUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQge0lWaWV3Q29udGFpbmVyfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdDbGFzc01hcFBpcGUsIE1uZ0kxOG5Qcm9wZXJ0eVBpcGUsIE1uZ0xvY2FsZURlZmF1bHRSb3dDbGFzc1BpcGV9IGZyb20gJy4uLy4uLy4uL3BpcGVzJztcbmltcG9ydCB7TW5nQWN0aW9uRXhlY3V0b3JTZXJ2aWNlLCBNbmdDb21tb25zU2VydmljZSwgTW5nVmlld0NvbnRhaW5lckNvbXBvbmVudFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7U3R5bGVzVXRpbH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzJztcbmltcG9ydCB7Tm90aWZpY2F0aW9uVXRpbH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHtNbmdBY3Rpb25Db21wb25lbnR9IGZyb20gJy4uLy4uL2FjdGlvbic7XG5pbXBvcnQge0FjdGlvbkluc3RhbmNlfSBmcm9tICcuLi8uLi9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7TW5nVGFibGVDZWxsQ2xpY2tFdmVudCwgTW5nVGFibGVMb2FkRXZlbnR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge01uZ1RhYmxlQ29sdW1uRmlsdGVyQ29tcG9uZW50fSBmcm9tICcuL2NvbHVtbi1maWx0ZXIvY29sdW1uLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHtNbmdUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50fSBmcm9tICcuL2NvbHVtbi12YWx1ZS9jb2x1bW4tdmFsdWUuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy10YWJsZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgVGFibGVNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgTW5nQ29tcG9uZW50RGlyZWN0aXZlLFxuICAgICAgICBNbmdJMThuUHJvcGVydHlQaXBlLFxuICAgICAgICBOZ0Zvck9mLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBOZ1N0eWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBNbmdUYWJsZUNvbHVtbkZpbHRlckNvbXBvbmVudCxcbiAgICAgICAgTW5nQ2xhc3NNYXBQaXBlLFxuICAgICAgICBNbmdMb2NhbGVEZWZhdWx0Um93Q2xhc3NQaXBlLFxuICAgICAgICBNbmdUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50LFxuICAgICAgICBNbmdBY3Rpb25Db21wb25lbnQsXG4gICAgICAgIFNrZWxldG9uTW9kdWxlXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNbmdUYWJsZUNvbXBvbmVudDxULCBTPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJEaXNwbGF5Um93OiBUYWJsZUZpbHRlckRpc3BsYXlFbnVtID0gVGFibGVGaWx0ZXJEaXNwbGF5RW51bS5Sb3c7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpbHRlckRpc3BsYXlNZW51OiBUYWJsZUZpbHRlckRpc3BsYXlFbnVtID0gVGFibGVGaWx0ZXJEaXNwbGF5RW51bS5NZW51O1xuXG4gICAgLy8gbWV0YWRhdGEgaW5wdXRcbiAgICBASW5wdXQoJ2Rlc2NyaXB0b3InKSBwdWJsaWMgaW5pdGlhbERlc2NyaXB0b3IhOiBUYWJsZURlc2NyaXB0b3I8VD47XG4gICAgcHVibGljIGRlc2NyaXB0b3I/OiBUYWJsZURlc2NyaXB0b3I8VD47XG5cbiAgICAvLyBkYXRhIHNvdXJjZSBpbnB1dHNcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM/OiBPYnNlcnZhYmxlPEFycmF5PFQ+PiB8IEFycmF5PFQ+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBxdWVyeVJlc3VsdD86IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+IHwgTWVkaXVzUXVlcnlSZXN1bHQ8VD47XG4gICAgQElucHV0KCkgcHVibGljIGxvYWRpbmc/OiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YVByb3ZpZGVyPzogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT47XG4gICAgQElucHV0KCkgcHVibGljIHVzZVF1ZXJ5UGFyYW1zID0gZmFsc2U7XG5cbiAgICAvLyBleHRyYSBmZWF0dXJlcyBpbnB1dFxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLy8gYWN0aW9uc1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25zOiBBcnJheTxBY3Rpb25EZXNjcmlwdG9yPFQ+PiA9IFtdO1xuXG4gICAgLy8gdmlzdWFsXG4gICAgQElucHV0KCkgcHVibGljIGlzQ29sdW1uQ2xpY2thYmxlPzogYm9vbGVhbjtcblxuICAgIC8vIGNvbXBvbmVudCBpbnB1dHNcbiAgICBASW5wdXQoJ3ZpZXdDb250YWluZXInKSBwdWJsaWMgdmlld0NvbnRhaW5lckluaXQ/OiBJVmlld0NvbnRhaW5lcjxULCBTPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FwdGlvbkNvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY29sdW1uQWN0aW9uQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5BY3Rpb25NaW5XaWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgQE91dHB1dCgndGFibGVMb2FkJykgcHVibGljIGxvYWRFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE1uZ1RhYmxlTG9hZEV2ZW50PigpO1xuICAgIEBPdXRwdXQoJ2NlbGxDbGljaycpIHB1YmxpYyBjZWxsQ2xpY2tFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4+KCk7XG4gICAgQE91dHB1dCgnc2VsZWN0aW9uQ2hhbmdlJykgcHVibGljIHNlbGVjdGlvbkNoYW5nZUV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8VD4+KCk7XG4gICAgQE91dHB1dCgnY2FwdGlvbkNvbXBvbmVudEluc3RhbmNlJykgcHVibGljIGNhcHRpb25DbXBJbnN0RXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgnY29sdW1uQWN0aW9uQ29tcG9uZW50SW5zdGFuY2UnKSBwdWJsaWMgY29sdW1uQWN0aW9uQ21wSW5zdEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLy8gY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgQENvbnRlbnRDaGlsZHJlbihNbmdUZW1wbGF0ZURpcmVjdGl2ZSkgcHVibGljIHRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxNbmdUZW1wbGF0ZURpcmVjdGl2ZT47XG4gICAgQFZpZXdDaGlsZHJlbihNbmdDb21wb25lbnREaXJlY3RpdmUpIHB1YmxpYyBjb21wb25lbnRzITogUXVlcnlMaXN0PE1uZ0NvbXBvbmVudERpcmVjdGl2ZTxhbnk+PjtcbiAgICBAVmlld0NoaWxkKFRhYmxlKSBwdWJsaWMgcHJpbWVUYWJsZSE6IFRhYmxlO1xuXG4gICAgLy8gdGVtcGxhdGVzXG4gICAgcHVibGljIGNhcHRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHVibGljIGNvbHVtbkFjdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwdWJsaWMgZm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLy8gZGF0YSBwcm92aWRlciBhbmQgaXRlbXNcbiAgICBwdWJsaWMgaXNMYXp5ID0gZmFsc2U7XG4gICAgcHVibGljIGlzUGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgdXNlRGF0YVByb3ZpZGVyID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB1c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkU3ViZWpjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHB1YmxpYyB1c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkJCA9IHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZFN1YmVqY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHF1ZXJ5UmVzdWx0JD86IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+O1xuICAgIHB1YmxpYyBsb2FkaW5nJD86IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHVibGljIGRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXM6IEFycmF5PFQ+ID0gW107XG4gICAgcHJpdmF0ZSBpdGVtc1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxUPj4oMSk7XG5cbiAgICBwcml2YXRlIHF1ZXJ5UmVzdWx0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gcGFnaW5hdGlvbiwgc29ydCBhbmQgZmlsdGVyc1xuICAgIHB1YmxpYyByb3dzUGVyUGFnZU9wdGlvbnMhOiBBcnJheTxudW1iZXI+O1xuICAgIHB1YmxpYyByb3dzITogbnVtYmVyO1xuICAgIHB1YmxpYyBvZmZzZXQgPSAwO1xuICAgIHB1YmxpYyBtdWx0aVNvcnRNZXRhOiBTb3J0TWV0YVtdIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGZpbHRlck1ldGFkYXRhOiB7W3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhfSA9IHt9O1xuXG4gICAgLy8gaW5maW5pdGUgc2Nyb2xsXG4gICAgcHVibGljIGluZmluaXRlU2Nyb2xsID0gZmFsc2U7XG5cbiAgICAvLyB2aXN1YWxcbiAgICBwdWJsaWMgY2xhc3NOYW1lITogc3RyaW5nO1xuICAgIHB1YmxpYyB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByb3dIZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gc2VsZWN0aW9uXG4gICAgcHVibGljIHNlbGVjdGlvbjogQXJyYXk8VD4gPSBbXTtcblxuICAgIC8vIGRhdGEgcHJvdmlkZXJcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclNlcnZpY2U6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxNZWRpdXNRdWVyeVJlc3VsdDxUPj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudD86IExhenlMb2FkRXZlbnQ7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50VmVyc2lvbiA9IDA7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbTtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uID0gMDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8vIGZpbHRlciwgc29ydFxuICAgIHB1YmxpYyBoYXNDb2x1bW5GaWx0ZXJzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0ZpbHRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzU29ydENoYW5nZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGZpbHRlckRlc2NyaXB0b3JzOiBBcnJheTxGaWx0ZXJEZXNjcmlwdG9yPGFueT4+ID0gW107XG5cbiAgICAvLyBhY3Rpb25zXG4gICAgcHVibGljIHNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID0gZmFsc2U7XG4gICAgcHVibGljIHJvd0NsaWNrQWN0aW9uczogQWN0aW9uRGVzY3JpcHRvcjxUPltdID0gW107XG4gICAgcHVibGljIHJvd0lubGluZUFjdGlvbnM6IEFjdGlvbkRlc2NyaXB0b3I8VD5bXSA9IFtdO1xuXG4gICAgLy8gb3RoZXJcbiAgICBwcml2YXRlIHJvdXRlcklzTmF2aWdhdGlvbk91dHNpZGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyPzogSVZpZXdDb250YWluZXI8VCwgUz47XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW5nQ29tbW9uc1NlcnZpY2U6IE1uZ0NvbW1vbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFjdGlvbkV4ZWN1dG9yOiBNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdmlld0NvbnRhaW5lclNlcnZpY2U6IE1uZ1ZpZXdDb250YWluZXJDb21wb25lbnRTZXJ2aWNlPFQsIFM+IHwgbnVsbFxuICAgICkge31cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyID0gdGhpcy52aWV3Q29udGFpbmVySW5pdCA/PyB0aGlzLnZpZXdDb250YWluZXJTZXJ2aWNlID8/IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gVXNlZCBmb3IgY29uZmlncyB3aXRoaW4gdGhpcyBtZXRob2QgYW5kIGlzIG5vdCBkeW5hbWljYWxseSBzZXQgYnkgVGFibGVEeW5hbWljRGVzY3JpcHRvclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnRGVzY3JpcHRvciA9IHRoaXMuaW5pdGlhbERlc2NyaXB0b3I7XG5cbiAgICAgICAgaWYgKCEodGhpcy5pbml0aWFsRGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3IpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSB0aGlzLmluaXRpYWxEZXNjcmlwdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFwIHJvdyBzZXR0aW5nc1xuICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzID0gdGhpcy5kZXNjcmlwdG9yPy5jb2x1bW5zLmZpbHRlcihjID0+IHR5cGVvZiBjLmZpbHRlckRlc2NyaXB0b3IgIT09ICd1bmRlZmluZWQnKS5tYXAoYyA9PiBjLmZpbHRlckRlc2NyaXB0b3IhKSA/PyBbXTtcbiAgICAgICAgdGhpcy5oYXNDb2x1bW5GaWx0ZXJzID0gdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5sZW5ndGggPiAwO1xuICAgICAgICB0aGlzLnJvd3MgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8uZGVmYXVsdE51bVJvd3MgPz8gMjU7XG4gICAgICAgIHRoaXMucm93c1BlclBhZ2VPcHRpb25zID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnJvd3NQZXJQYWdlT3B0aW9ucyA/PyBbMjUsIDUwLCAxMDBdO1xuXG4gICAgICAgIC8vIHByb2Nlc3MgYWN0aW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25Qb3NpdGlvbkVudW0uUm93Q2xpY2s6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93Q2xpY2tBY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25Qb3NpdGlvbkVudW0uUm93SW5saW5lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0lubGluZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID0gdHlwZW9mIHRoaXMuY29sdW1uQWN0aW9uQ29tcG9uZW50ICE9PSAndW5kZWZpbmVkJyB8fCB0aGlzLnJvd0lubGluZUFjdGlvbnMubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyBkZWZpbmUgYWxsIHN0eWxlc1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5jbGFzc05hbWUgPz8gJyc7XG4gICAgICAgIHRoaXMudGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnRhYmxlRnVsbEhlaWdodE9mZnNldCA/PyBudWxsO1xuICAgICAgICB0aGlzLnJvd0hlaWdodCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5yb3dIZWlnaHQgPz8gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlzQ29sdW1uQ2xpY2thYmxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gZGVmaW5lIGlmIGNlbGwgY2xpY2sgaXMgYmVpbmcgb2JzZXJ2ZWQgdmlhIG91dHB1dFxuICAgICAgICAgICAgdGhpcy5pc0NvbHVtbkNsaWNrYWJsZSA9IHRoaXMucm93Q2xpY2tBY3Rpb25zLmxlbmd0aCA+IDAgfHwgdGhpcy5jZWxsQ2xpY2tFdmVudEVtaXR0ZXIub2JzZXJ2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChiYXNlQ29uZmlnRGVzY3JpcHRvcj8uc2l6ZSkge1xuICAgICAgICAgICAgY2FzZSBUYWJsZVNpemVFbnVtLlNtYWxsOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lICs9ICcgcC1kYXRhdGFibGUtc20nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUYWJsZVNpemVFbnVtLkxhcmdlOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lICs9ICcgcC1kYXRhdGFibGUtbGcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlQ29uZmlnRGVzY3JpcHRvcj8uaGFzR3JpZGxpbmVzKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLWdyaWRsaW5lcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2VDb25maWdEZXNjcmlwdG9yICYmICF0aGlzLmNvbHVtbkFjdGlvbk1pbldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkFjdGlvbk1pbldpZHRoID0gU3R5bGVzVXRpbC5jYWxjdWxhdGVUYWJsZUNvbHVtbkFjdGlvbldpZHRoKFxuICAgICAgICAgICAgICAgIGJhc2VDb25maWdEZXNjcmlwdG9yIGFzIFRhYmxlRGVzY3JpcHRvcjx1bmtub3duPixcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0lubGluZUFjdGlvbnMgYXMgQXJyYXk8QWN0aW9uRGVzY3JpcHRvcjx1bmtub3duPj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBpbmZpbml0ZSBzY3JvbGxcbiAgICAgICAgbGV0IHBhZ2luYXRpb25Nb2RlID0gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uTm9uZTtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlQ29uZmlnRGVzY3JpcHRvcj8ucGFnaW5hdGlvbk1vZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGNob2ljZSBpcyB0aGUgbW9zdCBzdHJvbmcgLSBpZiBkZWZpbmVkLCB1c2UgdGhpcyB2YWx1ZVxuICAgICAgICAgICAgcGFnaW5hdGlvbk1vZGUgPSBiYXNlQ29uZmlnRGVzY3JpcHRvci5wYWdpbmF0aW9uTW9kZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5kYXRhUHJvdmlkZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyB3aGVuIGRhdGEgcHJvdmlkZXIgaXMgdXNlZCwgdXNlIHBhZ2luYXRpb25cbiAgICAgICAgICAgIHBhZ2luYXRpb25Nb2RlID0gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uUGFnaW5hdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWdpbmF0aW9uTW9kZSA9PT0gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uSW5maW5pdGVTY3JvbGwpIHtcbiAgICAgICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8udGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID8/IDMxNTtcbiAgICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnJvd0hlaWdodCA/PyA0NTtcbiAgICAgICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXMgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChwYWdpbmF0aW9uTW9kZSA9PT0gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uUGFnaW5hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pc1BhZ2luYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBwcm92aWRlciBpcyBzdXBwbGllZCwgaWYgaXMsIHVzZSBpdCBwcmltYXJpbHlcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAvLyBtYXAgc3ViamVjdHMgdG8gb2JzZXJ2YWJsZXMgYW5kIGluaXRpYXRlIGRhdGFcbiAgICAgICAgICAgIHRoaXMudXNlRGF0YVByb3ZpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNMYXp5ID0gdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXp5O1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJlc3VsdCQgPSB0aGlzLmRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyQgPSB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgICAgY29uc3QgZW1wdHlRdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5wYWdlRGF0YSA9IFtdO1xuICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5hbGxEYXRhQ291bnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQoZW1wdHlRdWVyeVJlc3VsdCk7XG5cbiAgICAgICAgICAgIC8vIGluamVjdCBzZXJ2aWNlXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxhbnk+KHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhUHJvdmlkZXIuZ2V0QWxsUmVsb2FkJC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHJlbG9hZFN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBxdWVyeSByZXN1bHQgaXMgcHJvdmlkZWQsIHVzZSBpdCBhcyBzZWNvbmRhcnkgc291cmNlIG9yIGVsc2UgdHJ5IHRvIHVzZSBpdGVtc1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0JCA9IHRoaXMucXVlcnlSZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlID8gdGhpcy5xdWVyeVJlc3VsdCA6IG9mKHRoaXMucXVlcnlSZXN1bHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0JCA9IChpc09ic2VydmFibGUodGhpcy5pdGVtcykgPyB0aGlzLml0ZW1zIDogdGhpcy5pdGVtc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh2MSwgdjIpID0+IHYxLmxlbmd0aCA9PT0gdjIubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB2MS5ldmVyeSgodjFpLCBpZHgpID0+IHYxaVt0aGlzLmRlc2NyaXB0b3IuZGF0YUtleVByb3BlcnR5XSA9PT0gdjJbaWR4XVt0aGlzLmRlc2NyaXB0b3IuZGF0YUtleVByb3BlcnR5XSkpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoaXRlbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gaXRlbXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdC5hbGxEYXRhQ291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzT2JzZXJ2YWJsZSh0aGlzLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMgPz8gW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2FkaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQgPSB0aGlzLmxvYWRpbmcgaW5zdGFuY2VvZiBPYnNlcnZhYmxlID8gdGhpcy5sb2FkaW5nIDogb2YodGhpcy5sb2FkaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluaXRpYWxRdWVyeVBhcmFtTWFwID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnVzZVF1ZXJ5UGFyYW1zICYmXG4gICAgICAgICAgICAoKCFpbml0aWFsUXVlcnlQYXJhbU1hcC5oYXMoJ3NvcnQnKSAmJiBiYXNlQ29uZmlnRGVzY3JpcHRvcj8uaGFzRGVmYXVsdFNvcnQpIHx8XG4gICAgICAgICAgICAgICAgKCFpbml0aWFsUXVlcnlQYXJhbU1hcC5oYXMoJ2ZpbHRlcicpICYmIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMuc29tZShmZCA9PiBmZC5oYXNEZWZhdWx0VmFsdWUpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0IHNvcnQvZmlsdGVycyBhcmUgYXBwbGllZCwgbm8gYWRkaXRpb25hbCBmaWx0ZXJpbmcvc29ydGluZyBpcyBzcGVjaWZpZWQgaW4gcXVlcnkgcGFyYW1cbiAgICAgICAgICAgIC8vIHJlZGlyZWN0IG11c3QgYmUgZG9uZSBhdCBmaXJzdCBzdGVwXG4gICAgICAgICAgICBjb25zdCBtZWRpdXNRdWVyeVBhcmFtID0gTWVkaXVzUmVzdFV0aWwuZnJvbUFuZ3VsYXJRdWVyeVBhcmFtc1RvTWVkaXVzUXVlcnlQYXJhbXModGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcywgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycywgdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnNbMF0pO1xuXG4gICAgICAgICAgICBjb25zdCBldmVudDogTGF6eUxvYWRFdmVudCA9IHt9O1xuICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YSA9IHRoaXMuY3JlYXRlU29ydE1ldGEobWVkaXVzUXVlcnlQYXJhbSk7XG4gICAgICAgICAgICBldmVudC5maWx0ZXJzID0gdGhpcy5jcmVhdGVGaWx0ZXJNZXRhKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuXG4gICAgICAgICAgICAvLyBmaXJzdCBuYXZpZ2F0ZSB0byBjb3JyZWN0IHVybCB3aXRoIGRlZmF1bHQgZmlsdGVycy9zb3J0c1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXJcbiAgICAgICAgICAgICAgICAubmF2aWdhdGUoW10sIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IE1lZGl1c1Jlc3RVdGlsLmZyb21QcmltZUxhenlMb2FkRXZlbnRUb0FuZ3VsYXJRdWVyeVBhcmFtcyhldmVudCwgdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnNbMF0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMb2FkaW5nVHJpZ2dlcnMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMb2FkaW5nVHJpZ2dlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVlcnlSZXN1bHRTdWJzY3JpcHRpb24gPSB0aGlzLnF1ZXJ5UmVzdWx0JC5zdWJzY3JpYmUoZSA9PiAodGhpcy5xdWVyeVJlc3VsdCA9IGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAodGVtcGxhdGUuZ2V0VHlwZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvblRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbHVtbkFjdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uQWN0aW9uVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dJbmxpbmVBY3Rpb25zQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdmb290ZXInOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvb3RlclRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydpdGVtcyddICYmICFjaGFuZ2VzWydpdGVtcyddLmZpcnN0Q2hhbmdlICYmIEFycmF5LmlzQXJyYXkoY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zU3ViamVjdC5uZXh0KGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMucXVlcnlSZXN1bHRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkKGVtaXRFdmVudCA9IGZhbHNlLCByZXNldFBhcmFtcyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zQnVpbGRlciA9IHJlc2V0UGFyYW1zXG4gICAgICAgICAgICA/IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSh0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSwgMClcbiAgICAgICAgICAgIDogTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlRnJvbUV4aXN0aW5nKHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbSA/PyBuZXcgTWVkaXVzUXVlcnlQYXJhbSgpKVxuICAgICAgICAgICAgICAgICAgLndpdGhJdGVtc1BlclBhZ2UodGhpcy5yb3dzKVxuICAgICAgICAgICAgICAgICAgLndpdGhJdGVtc09mZnNldCh0aGlzLm9mZnNldCk7XG5cbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHF1ZXJ5UGFyYW1zQnVpbGRlci5idWlsZCgpLCBlbWl0RXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlTGF6eUxvYWQoZXZlbnQ6IExhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24rKztcblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgaWYgKCFldmVudC5tdWx0aVNvcnRNZXRhIHx8IGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGRlZmF1bHQgc29ydCBtZXRhIHRvIGV2ZW50IGlmIG5vdCBtdWx0aXNvcnQgbWV0YSBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YSA9IHRoaXMuY3JlYXRlU29ydE1ldGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZXZlbnQuZmlsdGVycykge1xuICAgICAgICAgICAgICAgIGV2ZW50LmZpbHRlcnMgPSB0aGlzLmNyZWF0ZUZpbHRlck1ldGEoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnJvdXRlcklzTmF2aWdhdGlvbk91dHNpZGVJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaGVjayBpcyBuZWNlc3Nhcnk6IGZyb20gc29tZSByZWFzb24sIHByaW1lTkcgY29tbWl0cyBvbmUgbGFzdCBsYXp5IGxvYWQgZXZlbnQgd2hlbmV2ZXIgYW55IGFuZ3VsYXIgcm91dGVyIG5hdmlnYXRpb24gb2NjdXJzXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IE1lZGl1c1Jlc3RVdGlsLmZyb21QcmltZUxhenlMb2FkRXZlbnRUb0FuZ3VsYXJRdWVyeVBhcmFtcyhldmVudCwgdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnNbMF0pXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpdXNRdWVyeVBhcmFtcyA9IGV2ZW50ID8gTWVkaXVzUmVzdFV0aWwuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvTWVkaXVzUXVlcnlQYXJhbXMoZXZlbnQpIDogbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihtZWRpdXNRdWVyeVBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uVGFibGVTb3J0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc1NvcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uVGFibGVGaWx0ZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmlzRmlsdGVyQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2VsbENsaWNrKGV2ZW50OiBFdmVudCwgY29sOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4sIGl0ZW06IFQsIGlkeDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG1uZ0V2ZW50ID0gbmV3IE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4oY29sLCBpdGVtLCBpZHgpO1xuICAgICAgICB0aGlzLmNlbGxDbGlja0V2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMucm93Q2xpY2tBY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5yb3dDbGlja0FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkV4ZWN1dG9yLnRyaWdnZXJSb3dDbGlja0FjdGlvbihhY3Rpb24sIG1uZ0V2ZW50LCB0aGlzLnJvdXRlLCB0aGlzLmRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBBcnJheTxUPikge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZUV2ZW50RW1pdHRlci5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DYXB0aW9uQ21wSW5zdDxDPihpbnN0YW5jZTogQykge1xuICAgICAgICB0aGlzLmNhcHRpb25DbXBJbnN0RXZlbnRFbWl0dGVyLm5leHQoaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbHVtbkFjdGlvbkNtcEluc3Q8Qz4oaW5zdGFuY2U6IEMpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5BY3Rpb25DbXBJbnN0RXZlbnRFbWl0dGVyLm5leHQoaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkFjdGlvbkZpbmlzaChydW5SZXN1bHQ6IEFjdGlvbkluc3RhbmNlPFQsIHVua25vd24+KSB7XG4gICAgICAgIGlmICghcnVuUmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHF1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0gfCBudWxsID0gbnVsbCwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMudXNlRGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuXG4gICAgICAgIGlmICghcXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbSA9IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSh0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSkuYnVpbGQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtO1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uKys7XG5cbiAgICAgICAgTWVkaXVzUmVzdFV0aWwubW9kaWZ5RmlsdGVyUHJvcGVydGllcyhxdWVyeVBhcmFtLCB0aGlzLmZpbHRlckRlc2NyaXB0b3JzKTtcblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVByb3ZpZGVyXG4gICAgICAgICAgICA/LmdldEFsbChxdWVyeVBhcmFtLCB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UsIHRoaXMuZGVzY3JpcHRvcj8uaXNMb2NhbGl6ZWQgPyB0aGlzLm1uZ0NvbW1vbnNTZXJ2aWNlLmFwcERhdGFMYW5ndWFnZSA/PyB1bmRlZmluZWQgOiB1bmRlZmluZWQpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsRGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IHRoaXMuaW5pdGlhbERlc2NyaXB0b3IudG9UYWJsZURlc2NyaXB0b3JGcm9tRGF0YShyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycyA9IHRoaXMuZGVzY3JpcHRvci5jb2x1bW5zLmZpbHRlcihjID0+IHR5cGVvZiBjLmZpbHRlckRlc2NyaXB0b3IgIT09ICd1bmRlZmluZWQnKS5tYXAoYyA9PiBjLmZpbHRlckRlc2NyaXB0b3IhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzQ29sdW1uRmlsdGVycyA9IHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMubGVuZ3RoID4gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1BhZ2luYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93cyA9IHRoaXMuaW5pdGlhbERlc2NyaXB0b3IuZGVmYXVsdE51bVJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd3NQZXJQYWdlT3B0aW9ucyA9IHRoaXMuaW5pdGlhbERlc2NyaXB0b3Iucm93c1BlclBhZ2VPcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmRlc2NyaXB0b3IgPSB0aGlzLmluaXRpYWxEZXNjcmlwdG9yLm9uRGF0YVJlY2VpdmVkVHlwZUJ1aWxkaW5nKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmZpbml0ZVNjcm9sbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJDaGFuZ2VkIHx8IHRoaXMuaXNTb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zLnNwbGljZShxdWVyeVBhcmFtIS5pdGVtc09mZnNldCA/PyAwLCBxdWVyeVBhcmFtIS5pdGVtc1BlclBhZ2UgPz8gdGhpcy5yb3dzLCAuLi4ocmVzLnBhZ2VEYXRhID8/IFtdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXMgPSBbLi4udGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRmlsdGVyQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU29ydENoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB3aGF0IGhhcHBlbnMgb24gZXJyb3Igd2l0aCBubyBtb2RlbCBpbmlzaWRlIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVXRpbC50YWJsZU5vdGlmaWNhdGlvbkVycm9yKHRoaXMudHJhbnNsYXRlLCB0aGlzLmRlc2NyaXB0b3IhLCBlcnIsIHRoaXMudmlld0NvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5UXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5wYWdlRGF0YSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LmFsbERhdGFDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQoZW1wdHlRdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgbW5nRXZlbnQgPSBuZXcgTW5nVGFibGVMb2FkRXZlbnQoKTtcbiAgICAgICAgICAgIG1uZ0V2ZW50Lm9yaWdpbmFsRXZlbnQgPSB0aGlzLmRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnQgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbW5nRXZlbnQucXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07XG4gICAgICAgICAgICB0aGlzLmxvYWRFdmVudEVtaXR0ZXIubmV4dChtbmdFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRUYWJsZUZyb21Sb3V0ZVVwZGF0ZShwYXJhbXM6IFBhcmFtcykge1xuICAgICAgICBjb25zdCBtZWRpdXNRdWVyeVBhcmFtID0gTWVkaXVzUmVzdFV0aWwuZnJvbUFuZ3VsYXJRdWVyeVBhcmFtc1RvTWVkaXVzUXVlcnlQYXJhbXMocGFyYW1zLCB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLCB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnRWZXJzaW9uIDwgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtVmVyc2lvbiArIDEpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBvbmx5IGlmIG5ldyB2ZXJzaW9uIGZyb20gcXVlcnkgcGFyYW1zIHdpbGwgYmUgaGlnaGVyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWRTdWJlamN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihtZWRpdXNRdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtKSB7XG4gICAgICAgIHRoaXMubXVsdGlTb3J0TWV0YSA9IHRoaXMuY3JlYXRlU29ydE1ldGEobWVkaXVzUXVlcnlQYXJhbSk7XG4gICAgICAgIHRoaXMuZmlsdGVyTWV0YWRhdGEgPSB0aGlzLmNyZWF0ZUZpbHRlck1ldGEobWVkaXVzUXVlcnlQYXJhbSk7XG4gICAgICAgIHRoaXMucm93cyA9IG1lZGl1c1F1ZXJ5UGFyYW0/Lml0ZW1zUGVyUGFnZSA/PyB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBtZWRpdXNRdWVyeVBhcmFtPy5pdGVtc09mZnNldCA/PyAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRmlsdGVyTWV0YShtZWRpdXNRdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSkge1xuICAgICAgICBsZXQgcGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICBpZiAoIW1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBtZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWVGaWx0ZXJNZXRhOiB7W3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhfSA9IHt9O1xuICAgICAgICAvLyBpZiBhbnkgZmlsdGVyIGlzIHByZXNlbnQsIG5vIGRlZmF1bHQgZmlsdGVycyBzaG91bGQgYmUgYXBwbGllZCFcbiAgICAgICAgY29uc3QgYXBwbHlEZWZhdWx0RmlsdGVycyA9IChwYXJhbXMuZmlsdGVyUGFyYW1zPy5sZW5ndGggPz8gMCkgPT09IDA7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgbGV0IG1hdGNoTW9kZTtcbiAgICAgICAgICAgIHN3aXRjaCAoZi5maWx0ZXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5DT05UQUlOUztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5EYXRlOlxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuREFURV9JUztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXA6XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvb2t1cEZpbHRlciA9IGYgYXMgRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxhbnk+O1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9va3VwRmlsdGVyLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuSU47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuRVFVQUxTO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuRVFVQUxTO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGYuZGVmYXVsdEZpbHRlck1hdGNoTW9kZSkge1xuICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IGYuZGVmYXVsdEZpbHRlck1hdGNoTW9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGYubWF0Y2hNb2RlcyAmJiAhZi5tYXRjaE1vZGVzPy5pbmNsdWRlcyhtYXRjaE1vZGUpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gZi5tYXRjaE1vZGVzWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGFwcGx5RGVmYXVsdEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZi5kZWZhdWx0VmFsdWVUbyAmJiBmLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtmLmRlZmF1bHRWYWx1ZSwgZi5kZWZhdWx0VmFsdWVUb107XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGYuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJpbWVGaWx0ZXJNZXRhW2YucHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IG1hdGNoTW9kZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFyYW1zLmZpbHRlclBhcmFtcz8uZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZmQgPT4gZmQuZmlsdGVyUHJvcGVydHkgPT09IGYucHJvcGVydHkgfHwgZmQucHJvcGVydHkgPT09IGYucHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gZi5maWx0ZXJNYXRjaFR5cGUgJiYgZGVzY3JpcHRvciA/IE1lZGl1c1Jlc3RVdGlsLmdldE1hcHBpbmcoZi5maWx0ZXJNYXRjaFR5cGUsIGRlc2NyaXB0b3IuZmlsdGVyVHlwZSwgMik/LlswXSA6IE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHM7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBtYXRjaE1vZGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyVmFsdWUgPSBmLmZpbHRlclZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkRhdGUgJiYgdHlwZW9mIGZpbHRlclZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbHRlclZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmlsdGVyVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IG5ldyBEYXRlKGZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiByYW5nZSBpcyBwcm92aWRlZCwgdGFrZSB0aGF0IGludG8gYWNjb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGYuZmlsdGVyVmFsdWVUbyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGYuZmlsdGVyVmFsdWVUbyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlVG8gPSBuZXcgRGF0ZShmLmZpbHRlclZhbHVlVG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBbZmlsdGVyVmFsdWUsIGZpbHRlclZhbHVlVG9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtkZXNjcmlwdG9yLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IG1hdGNoTW9kZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJpbWVGaWx0ZXJNZXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU29ydE1ldGEobWVkaXVzUXVlcnlQYXJhbT86IE1lZGl1c1F1ZXJ5UGFyYW0pOiBTb3J0TWV0YVtdIHtcbiAgICAgICAgbGV0IHBhcmFtczogTWVkaXVzUXVlcnlQYXJhbTtcbiAgICAgICAgaWYgKCFtZWRpdXNRdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBuZXcgTWVkaXVzUXVlcnlQYXJhbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyYW1zID0gbWVkaXVzUXVlcnlQYXJhbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzb3J0TWV0YTogU29ydE1ldGFbXTtcbiAgICAgICAgY29uc3QgYXBwbHlEZWZhdWx0U29ydHMgPSAocGFyYW1zLnNvcnRQcm9wZXJ0eT8ubGVuZ3RoID8/IDApID09PSAwO1xuXG4gICAgICAgIGlmIChhcHBseURlZmF1bHRTb3J0cyAmJiB0aGlzLmRlc2NyaXB0b3I/Lmhhc0RlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgICBzb3J0TWV0YSA9IHRoaXMuZGVzY3JpcHRvci5kZWZhdWx0U29ydFByb3BlcnR5Lm1hcChcbiAgICAgICAgICAgICAgICAocCwgaWR4KSA9PlxuICAgICAgICAgICAgICAgICAgICA8U29ydE1ldGE+e1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogdGhpcy5kZXNjcmlwdG9yIS5kZWZhdWx0U29ydEFzY1tpZHhdID8gMSA6IC0xXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3J0TWV0YSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFyYW1zLnNvcnRQcm9wZXJ0eT8uZm9yRWFjaCgocywgaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gc29ydE1ldGEuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlLmZpZWxkID09PSBzKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0luZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBzb3J0TWV0YVtleGlzdGluZ0luZGV4XS5vcmRlciA9IHBhcmFtcy5zb3J0QXNjPy5baWR4XSA/PyB0cnVlID8gMSA6IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3J0TWV0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHMsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiBwYXJhbXMuc29ydEFzYz8uW2lkeF0gPz8gdHJ1ZSA/IDEgOiAtMVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc29ydE1ldGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRGF0YUxvYWRpbmdUcmlnZ2VycygpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlUXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgdGFibGUgbG9hZHMgZnJvbSByb3V0ZSB1cGRhdGVzXG4gICAgICAgICAgICBjb25zdCByb3V0ZVFwU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUocXAgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHFwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgcm91dGVyRXZTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgZSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0ICYmIGUudXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSAhPT0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uQ2FuY2VsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVySXNOYXZpZ2F0aW9uT3V0c2lkZUluUHJvZ3Jlc3MgPSBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChyb3V0ZVFwU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHJvdXRlckV2U3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxvYWQgZGF0YSBpbW1lZGlhdGVseSBieSBjcmVhdGluZyBkZWZhdWx0IHNvcnRzIGFuZCBmaWx0ZXJzIChwcmltZW5nIHdpbGwgdHJpZ2dlciBvbkxhenlMb2FkIGV2ZW50IG9uIHNvcnQmZmlsdGVyIG1ldGFkYXRhIGNoYW5nZSlcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0ID0gdGhpcy5jcmVhdGVTb3J0TWV0YSgpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRTb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBkZWZhdWx0U29ydDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YSgpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlck1ldGFkYXRhID0gZGVmYXVsdEZpbHRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgW3N0eWxlLmhlaWdodF09XCJ0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPyAnY2FsYygxMDB2aCAtICcgKyB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgKyAncHgpJyA6IG51bGxcIj5cbiAgICA8IS0tIE1VU1QgTk9UIHVzZSBvYnNlcnZhYmxlIGZvciB2YWx1ZSB3aGVuIHVzaW5nIHZpcnR1YWwgc2Nyb2xsIC0gZG9lcyBub3Qgd29yayBmb3Igc29tZSByZWFzb24gLS0+XG4gICAgPHAtdGFibGVcbiAgICAgICAgKm5nSWY9XCIhdXNlUXVlcnlQYXJhbXMgfHwgKHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgW3ZhbHVlXT1cImluZmluaXRlU2Nyb2xsID8gZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA6IChxdWVyeVJlc3VsdCQgfCBhc3luYyk/LnBhZ2VEYXRhID8/IFtdXCJcbiAgICAgICAgW2RhdGFLZXldPVwiJGFueShkZXNjcmlwdG9yPy5kYXRhS2V5UHJvcGVydHkgPz8gbnVsbClcIlxuICAgICAgICBbbGF6eV09XCJpc0xhenlcIlxuICAgICAgICBbbG9hZGluZ109XCIobG9hZGluZyQgfCBhc3luYykgPz8gZmFsc2VcIlxuICAgICAgICBbcGFnaW5hdG9yXT1cImlzUGFnaW5hdGlvbiAmJiAhaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICBbcm93c109XCIkYW55KGluZmluaXRlU2Nyb2xsID8gMjAgOiByb3dzKVwiXG4gICAgICAgIFtmaXJzdF09XCIkYW55KGluZmluaXRlU2Nyb2xsID8gMCA6IG9mZnNldClcIlxuICAgICAgICBbdG90YWxSZWNvcmRzXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyBudWxsIDogKHF1ZXJ5UmVzdWx0JCB8IGFzeW5jKT8uYWxsRGF0YUNvdW50ID8/IDApXCJcbiAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCIkYW55KGluZmluaXRlU2Nyb2xsID8gbnVsbCA6IHJvd3NQZXJQYWdlT3B0aW9ucylcIlxuICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cIiFpbmZpbml0ZVNjcm9sbFwiXG4gICAgICAgIFtjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXT1cIidtbmdUYWJsZS5wYWdpbmF0aW9uTXNnJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFttdWx0aVNvcnRNZXRhXT1cIiRhbnkobXVsdGlTb3J0TWV0YSlcIlxuICAgICAgICBbZmlsdGVyc109XCJmaWx0ZXJNZXRhZGF0YVwiXG4gICAgICAgIHNvcnRNb2RlPVwibXVsdGlwbGVcIlxuICAgICAgICBbKHNlbGVjdGlvbildPVwic2VsZWN0aW9uXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwiJGFueShzZWxlY3Rpb25FbmFibGVkID8gc2VsZWN0aW9uTW9kZSA6IG51bGwpXCJcbiAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIkYW55KHJvd0hlaWdodClcIlxuICAgICAgICBzY3JvbGxIZWlnaHQ9XCJmbGV4XCJcbiAgICAgICAgW3Jvd0hvdmVyXT1cImRlc2NyaXB0b3I/Lmhhc0hvdmVyID8/IHRydWVcIlxuICAgICAgICBbc3R5bGVDbGFzc109XCJjbGFzc05hbWVcIlxuICAgICAgICBbcmVzaXphYmxlQ29sdW1uc109XCJkZXNjcmlwdG9yPy5oYXNSZXNpemFibGVDb2x1bW5zID8/IGZhbHNlXCJcbiAgICAgICAgW2NvbHVtblJlc2l6ZU1vZGVdPVwiZGVzY3JpcHRvcj8uY29sdW1uUmVzaXplTW9kZSA/PyAnZml0J1wiXG4gICAgICAgIChvbkxhenlMb2FkKT1cIm9uVGFibGVMYXp5TG9hZCgkZXZlbnQpXCJcbiAgICAgICAgKG9uU29ydCk9XCJvblRhYmxlU29ydCgkZXZlbnQpXCJcbiAgICAgICAgKG9uRmlsdGVyKT1cIm9uVGFibGVGaWx0ZXIoJGV2ZW50KVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjYXB0aW9uVGVtcGxhdGUgfHwgY2FwdGlvbkNvbXBvbmVudCB8fCBkZXNjcmlwdG9yPy50aXRsZVwiIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXB0aW9uVGVtcGxhdGU7IGVsc2UgY29tcG9uZW50T3JEZWZhdWx0Q2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb21wb25lbnRPckRlZmF1bHRDYXB0aW9uPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYXB0aW9uQ29tcG9uZW50OyBlbHNlIGRlZmF1bHRDYXB0aW9uXCIgW21uZ0NvbXBvbmVudF09XCJjYXB0aW9uQ29tcG9uZW50XCIgKGluc3RhbmNlQ3JlYXRlZCk9XCJvbkNhcHRpb25DbXBJbnN0KCRldmVudClcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDYXB0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJwLTAgbS0wXCI+e3sgZGVzY3JpcHRvcj8udGl0bGUgfX08L2g1PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIiFkZXNjcmlwdG9yPy5oaWRlSGVhZGVyXCIgY2xhc3M9XCJtbmctdGFibGUtaGVhZGVyXCIgW2NsYXNzXT1cImRlc2NyaXB0b3I/LmhlYWRlckNsYXNzTmFtZVwiPlxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNlbGVjdGlvbkVuYWJsZWQgJiYgc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJ1wiIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uPjwvdGg+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGRlc2NyaXB0b3I/LmNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5pc1NvcnRFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC5tYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmhlYWRlckNsYXNzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZmlsdGVyRGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5maWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLnRpdGxlID8/IChjb2wucHJvcGVydHkgfCBpMThuUHJvcGVydHkgOiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLnByb3BlcnR5XCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLWZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5maWx0ZXJEZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IhLmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlNZW51XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXldPVwiZGVzY3JpcHRvciEuZmlsdGVyRGlzcGxheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctdGFibGUtY29sdW1uLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5pc1NvcnRFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC5tYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmhlYWRlckNsYXNzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZmlsdGVyRGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5maWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLnRpdGxlID8/IChjb2wucHJvcGVydHkgfCBpMThuUHJvcGVydHkgOiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmZpbHRlckRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvciEuZmlsdGVyRGlzcGxheSA9PT0gZmlsdGVyRGlzcGxheU1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheV09XCJkZXNjcmlwdG9yIS5maWx0ZXJEaXNwbGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaXB0b3JdPVwiY29sLmZpbHRlckRlc2NyaXB0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21uZy10YWJsZS1jb2x1bW4tZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2hvd0lubGluZUFjdGlvbnNDb2x1bW5cIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCIgcEZyb3plbkNvbHVtbj48L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0ciAqbmdJZj1cImRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVyc1wiIGNsYXNzPVwibW5nLWNvbHVtbi1maWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBXZSBuZWVkIHRoZSBsaW5lIGJlbG93LCBiZWNhdXNlIG90aGVyd2lzZSBwLXRhYmxlUmFkaW9CdXR0b24gc2hpZnRzIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zIGluIHRhYmxlIC0tPlxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNlbGVjdGlvbkVuYWJsZWQgJiYgc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZSdcIiBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4+PC90aD5cbiAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBkZXNjcmlwdG9yPy5jb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIihjb2wuZmlsdGVyRGVzY3JpcHRvciA/ICdtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZSArICcgJyA6ICcgJykgKyBjb2wuZmlsdGVyRGVzY3JpcHRvcj8uY29sdW1uQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29sLmZpbHRlckRlc2NyaXB0b3I/LmNvbHVtbldpZHRoID8/IGNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLmZpbHRlckRlc2NyaXB0b3I/LmNvbHVtbk1pbldpZHRoID8/IGNvbC5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sLm1heFdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCIgKm5nSWY9XCJjb2wuZmlsdGVyRGVzY3JpcHRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyIFtkaXNwbGF5XT1cImRlc2NyaXB0b3IhLmZpbHRlckRpc3BsYXlcIiBbZGVzY3JpcHRvcl09XCJjb2wuZmlsdGVyRGVzY3JpcHRvclwiPjwvbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2hvd0lubGluZUFjdGlvbnNDb2x1bW5cIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCIgcEZyb3plbkNvbHVtbj48L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1pdGVtIGxldC1pZHg9XCJyb3dJbmRleFwiPlxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJyb3dIZWlnaHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRlc2NyaXB0b3I/LnJvd0NsYXNzTmFtZSB8IG1uZ0NsYXNzTWFwUGlwZSA6IGRlc2NyaXB0b3I/LnJvd0NsYXNzTmFtZU1hcEZuIDogaXRlbSB8IG1uZ0xvY2FsZURlZmF1bHRSb3dDbGFzcyA6IGRlc2NyaXB0b3IgOiBpdGVtXCI+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0aW9uRW5hYmxlZCAmJiBzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZVJhZGlvQnV0dG9uIFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlUmFkaW9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBkZXNjcmlwdG9yPy5jb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKCRldmVudCwgY29sLCBpdGVtLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNsYXNzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3JpcHRvcj8uZmlsdGVyRGlzcGxheSA9PT0gZmlsdGVyRGlzcGxheVJvdyAmJiBoYXNDb2x1bW5GaWx0ZXJzICYmIGNvbC5maWx0ZXJEZXNjcmlwdG9yID8gJyBtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZSA6ICcnKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cImlzQ29sdW1uQ2xpY2thYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29sLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC5tYXhXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLnRpdGxlID8/IChjb2wucHJvcGVydHkgfCBpMThuUHJvcGVydHkgOiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbFwiIFtpdGVtXT1cIml0ZW1cIj48L21uZy10YWJsZS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93SW5saW5lQWN0aW9uc0NvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWFjdGlvbiBqdXN0aWZ5LWNvbnRlbnQtZW5kIHRleHQtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgICAgICAgICAgICAgICBhbGlnbkZyb3plbj1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZTsgZWxzZSBzaG93Q29sdW1uQWN0aW9uQ29tcG9uZW50T3JEZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHtyb3dJdGVtOiBpdGVtLCByb3dJbmRleDogaWR4fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93Q29sdW1uQWN0aW9uQ29tcG9uZW50T3JEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbkFjdGlvbkNvbXBvbmVudDsgZWxzZSBkZWZhdWx0Q29sdW1uQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21uZ0NvbXBvbmVudF09XCJjb2x1bW5BY3Rpb25Db21wb25lbnQhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2VDcmVhdGVkKT1cIm9uQ29sdW1uQWN0aW9uQ21wSW5zdCgkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW5BY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHJvd0lubGluZUFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25dPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld0NvbnRhaW5lcl09XCJ2aWV3Q29udGFpbmVySW5pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hvc3RDb21wb25lbnRdPVwidGhpc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1JZF09XCJkZXNjcmlwdG9yPy5tb2RlbD8uaWRQcm9wZXJ0eU5hbWUgPyBpdGVtW2Rlc2NyaXB0b3IhLm1vZGVsIS5pZFByb3BlcnR5TmFtZSFdIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie2l0ZW1JbmRleDogaWR4fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCk9XCJvbkFjdGlvbkZpbmlzaCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1hY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxvYWRpbmdib2R5XCI+XG4gICAgICAgICAgICA8dHIgW3N0eWxlLmhlaWdodC5weF09XCJyb3dIZWlnaHRcIj5cbiAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCIoZGVzY3JpcHRvcj8uY29sdW1ucz8ubGVuZ3RoID8/IDApICsgKHNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID8gMSA6IDApICsgKHNlbGVjdGlvbkVuYWJsZWQgPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctdGV4dFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cC1za2VsZXRvbiBbbmdTdHlsZV09XCJ7d2lkdGg6ICcxMDAlJ31cIj48L3Atc2tlbGV0b24+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICAgICAgPHRyIFtzdHlsZS5oZWlnaHQucHhdPVwicm93SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiKGRlc2NyaXB0b3I/LmNvbHVtbnM/Lmxlbmd0aCA/PyAwKSArIChzaG93SW5saW5lQWN0aW9uc0NvbHVtbiA/IDEgOiAwKSArIChzZWxlY3Rpb25FbmFibGVkID8gMSA6IDApXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdtbmdUYWJsZS5ub0l0ZW1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImZvb3RlclRlbXBsYXRlXCIgcFRlbXBsYXRlPVwic3VtbWFyeVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmb290ZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7cXVlcnlSZXN1bHQ6IHF1ZXJ5UmVzdWx0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvcC10YWJsZT5cbjwvZGl2PlxuIl19
|