barsa-novin-ray-core 2.2.72 → 2.2.74
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/fesm2022/barsa-novin-ray-core.mjs +671 -660
- package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
- package/lib/abstract-classes/field-base.d.ts +1 -1
- package/lib/abstract-classes/number-base.d.ts +1 -1
- package/lib/date-services/date.service.d.ts +1 -1
- package/lib/directives/base.directive.d.ts +1 -1
- package/lib/directives/splide-slider.directive.d.ts +1 -0
- package/lib/dynamic-component/base-view-item-props.d.ts +4 -4
- package/lib/resolvers/login-settings.resolver.d.ts +1 -1
- package/lib/resolvers/tile-group-breadcrumb.resolver.d.ts +1 -1
- package/lib/root-portal/root-portal.component.d.ts +2 -0
- package/lib/services/notification.service.d.ts +2 -2
- package/lib/services/portal.service.d.ts +4 -1
- package/package.json +3 -5
- package/esm2022/barsa-novin-ray-core.mjs +0 -5
- package/esm2022/lib/abstract-classes/application-base.mjs +0 -25
- package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
- package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -89
- package/esm2022/lib/abstract-classes/base.component.mjs +0 -60
- package/esm2022/lib/abstract-classes/field-base.mjs +0 -244
- package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
- package/esm2022/lib/abstract-classes/form-base.mjs +0 -164
- package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
- package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -132
- package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
- package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -100
- package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -57
- package/esm2022/lib/abstract-classes/index.mjs +0 -25
- package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -49
- package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -68
- package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
- package/esm2022/lib/abstract-classes/models.mjs +0 -184
- package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
- package/esm2022/lib/abstract-classes/number-base.mjs +0 -201
- package/esm2022/lib/abstract-classes/page-base.mjs +0 -98
- package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -41
- package/esm2022/lib/abstract-classes/report-base.mjs +0 -266
- package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -54
- package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -450
- package/esm2022/lib/abstract-classes/system-base.mjs +0 -25
- package/esm2022/lib/abstract-classes/tile-props.mjs +0 -49
- package/esm2022/lib/auth-guard.mjs +0 -48
- package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -311
- package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -522
- package/esm2022/lib/base-ulv-setting.component.mjs +0 -46
- package/esm2022/lib/base.module.mjs +0 -28
- package/esm2022/lib/button-loading/button-loading.component.mjs +0 -20
- package/esm2022/lib/constants.mjs +0 -963
- package/esm2022/lib/container.component.mjs +0 -100
- package/esm2022/lib/controllers/base-controller.mjs +0 -9
- package/esm2022/lib/controllers/base-view.mjs +0 -24
- package/esm2022/lib/controllers/index.mjs +0 -4
- package/esm2022/lib/controllers/models.mjs +0 -2
- package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
- package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
- package/esm2022/lib/date-services/date-info.mjs +0 -2
- package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
- package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
- package/esm2022/lib/date-services/date.service.mjs +0 -149
- package/esm2022/lib/date-services/index.mjs +0 -6
- package/esm2022/lib/device.mjs +0 -663
- package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -46
- package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -25
- package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -36
- package/esm2022/lib/directives/base.directive.mjs +0 -55
- package/esm2022/lib/directives/body-click.directive.mjs +0 -36
- package/esm2022/lib/directives/column-resizer.directive.mjs +0 -40
- package/esm2022/lib/directives/copy.directive.mjs +0 -60
- package/esm2022/lib/directives/count-down.directive.mjs +0 -109
- package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -43
- package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -66
- package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -70
- package/esm2022/lib/directives/ellipsify.directive.mjs +0 -73
- package/esm2022/lib/directives/field-binding.directive.mjs +0 -18
- package/esm2022/lib/directives/fill-empty-space.mjs +0 -89
- package/esm2022/lib/directives/form-close.directive.mjs +0 -33
- package/esm2022/lib/directives/img-lazy.directive.mjs +0 -82
- package/esm2022/lib/directives/index.mjs +0 -42
- package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -52
- package/esm2022/lib/directives/items-renderer.directive.mjs +0 -60
- package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -49
- package/esm2022/lib/directives/load-external-files.directive.mjs +0 -38
- package/esm2022/lib/directives/mobile.directive.mjs +0 -30
- package/esm2022/lib/directives/nowraptext.directive.mjs +0 -27
- package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -27
- package/esm2022/lib/directives/placeHolder.directive.mjs +0 -16
- package/esm2022/lib/directives/prevent-default.directive.mjs +0 -21
- package/esm2022/lib/directives/print-files.directive.mjs +0 -39
- package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -81
- package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -76
- package/esm2022/lib/directives/render-ulv.directive.mjs +0 -52
- package/esm2022/lib/directives/route-form-change.directive.mjs +0 -38
- package/esm2022/lib/directives/save-image.directive.mjs +0 -28
- package/esm2022/lib/directives/splide-slider.directive.mjs +0 -103
- package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -21
- package/esm2022/lib/directives/table-resizer.directive.mjs +0 -236
- package/esm2022/lib/directives/ulv-command.directive.mjs +0 -43
- package/esm2022/lib/directives/until-inview.directive.mjs +0 -53
- package/esm2022/lib/directives/webotp.directive.mjs +0 -49
- package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -61
- package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -97
- package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -53
- package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -83
- package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -27
- package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -552
- package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -163
- package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
- package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -69
- package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -78
- package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -64
- package/esm2022/lib/dynamic-component/index.mjs +0 -11
- package/esm2022/lib/empty-page/empty-page.component.mjs +0 -49
- package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
- package/esm2022/lib/field-ui/field-ui.component.mjs +0 -149
- package/esm2022/lib/form/form.component.mjs +0 -212
- package/esm2022/lib/form-new/form-new.component.mjs +0 -31
- package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
- package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
- package/esm2022/lib/form-page-routing/constants.mjs +0 -9
- package/esm2022/lib/form-page-routing/index.mjs +0 -3
- package/esm2022/lib/from-intersection-observer.mjs +0 -53
- package/esm2022/lib/global-error-handler.mjs +0 -26
- package/esm2022/lib/injdection-tokens.mjs +0 -8
- package/esm2022/lib/modal-root.component.mjs +0 -34
- package/esm2022/lib/not-found/not-found.component.mjs +0 -16
- package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
- package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -20
- package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -36
- package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -27
- package/esm2022/lib/pipes/card-media-size.pipe.mjs +0 -21
- package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -41
- package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -33
- package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -23
- package/esm2022/lib/pipes/column-value.pipe.mjs +0 -35
- package/esm2022/lib/pipes/column-valueof-parameters.pipe.mjs +0 -34
- package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -17
- package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -41
- package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -32
- package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -33
- package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -35
- package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -21
- package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -23
- package/esm2022/lib/pipes/filter-inline-action-list.pipe.mjs +0 -19
- package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -45
- package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -20
- package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -17
- package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -25
- package/esm2022/lib/pipes/filter.pipe.mjs +0 -34
- package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -28
- package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -20
- package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -43
- package/esm2022/lib/pipes/groupby.pipe.mjs +0 -64
- package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -23
- package/esm2022/lib/pipes/hide-accept-cancel-buttons.pipe.mjs +0 -24
- package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -23
- package/esm2022/lib/pipes/index.mjs +0 -55
- package/esm2022/lib/pipes/isimage.pipe.mjs +0 -20
- package/esm2022/lib/pipes/list-count.pipe.mjs +0 -18
- package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -43
- package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -59
- package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -17
- package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -36
- package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -18
- package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -19
- package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -91
- package/esm2022/lib/pipes/numeral.pipe.mjs +0 -44
- package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -23
- package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -21
- package/esm2022/lib/pipes/replace.pipe.mjs +0 -18
- package/esm2022/lib/pipes/reverse.pipe.mjs +0 -23
- package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -26
- package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -21
- package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -24
- package/esm2022/lib/pipes/sort.pipe.mjs +0 -49
- package/esm2022/lib/pipes/string-to-number.pipe.mjs +0 -26
- package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
- package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -60
- package/esm2022/lib/pipes/toolbar-settings.pipe.mjs +0 -27
- package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -17
- package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -26
- package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -19
- package/esm2022/lib/portal-page/portal-page.component.mjs +0 -24
- package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -37
- package/esm2022/lib/redirect-home-guard.mjs +0 -51
- package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
- package/esm2022/lib/report-container/report-container.component.mjs +0 -63
- package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
- package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -42
- package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
- package/esm2022/lib/resolvers/index.mjs +0 -7
- package/esm2022/lib/resolvers/login-settings.resolver.mjs +0 -18
- package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
- package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
- package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
- package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
- package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
- package/esm2022/lib/root-page/root-page.component.mjs +0 -21
- package/esm2022/lib/root-portal/root-portal.component.mjs +0 -218
- package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
- package/esm2022/lib/services/api.service.mjs +0 -63
- package/esm2022/lib/services/audio-recording.service.mjs +0 -95
- package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
- package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
- package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
- package/esm2022/lib/services/column.service.mjs +0 -20
- package/esm2022/lib/services/container.service.mjs +0 -69
- package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
- package/esm2022/lib/services/form-panel.service.mjs +0 -394
- package/esm2022/lib/services/form.service.mjs +0 -14
- package/esm2022/lib/services/groupby.service.mjs +0 -21
- package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
- package/esm2022/lib/services/index.mjs +0 -32
- package/esm2022/lib/services/indexeddb.service.mjs +0 -34
- package/esm2022/lib/services/layout-main-content.service.mjs +0 -19
- package/esm2022/lib/services/layout.service.mjs +0 -42
- package/esm2022/lib/services/local-storage.service.mjs +0 -32
- package/esm2022/lib/services/log.service.mjs +0 -50
- package/esm2022/lib/services/network-status.service.mjs +0 -15
- package/esm2022/lib/services/notification-popup.service.mjs +0 -2
- package/esm2022/lib/services/notification-sw.service.mjs +0 -180
- package/esm2022/lib/services/notification.service.mjs +0 -189
- package/esm2022/lib/services/portal.service.mjs +0 -946
- package/esm2022/lib/services/prompt-update.service.mjs +0 -56
- package/esm2022/lib/services/routing.service.mjs +0 -60
- package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
- package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
- package/esm2022/lib/services/tabpage.service.mjs +0 -13
- package/esm2022/lib/services/toast.service.mjs +0 -2
- package/esm2022/lib/services/ui.service.mjs +0 -23
- package/esm2022/lib/services/ulvmain.service.mjs +0 -824
- package/esm2022/lib/services/upload.service.mjs +0 -166
- package/esm2022/lib/services/video-recording.service.mjs +0 -115
- package/esm2022/lib/unlimit-session/unlimit-session.component.mjs +0 -40
- package/esm2022/public-api.mjs +0 -42
|
@@ -1,946 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, NgModuleFactory } from '@angular/core';
|
|
2
|
-
import { DOCUMENT } from '@angular/common';
|
|
3
|
-
import { BehaviorSubject, of, from, forkJoin, fromEvent, Subject, combineLatest } from 'rxjs';
|
|
4
|
-
import { tap, map, concatMap, finalize, publishReplay, refCount, exhaustMap, distinctUntilChanged, startWith, debounceTime, filter } from 'rxjs/operators';
|
|
5
|
-
import { BarsaApi } from '../abstract-classes/barsa-api';
|
|
6
|
-
import { ExecuteDynamicCommand, getComponentDefined, getDeviceIsMobile, getDeviceIsTablet, getHeaderValue, getUniqueId } from '../constants';
|
|
7
|
-
import { PortalPageResolver } from '../resolvers/portal-page.resolver';
|
|
8
|
-
import { AuthGuard } from '../auth-guard';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "./dynamic-component.service";
|
|
11
|
-
import * as i2 from "./api.service";
|
|
12
|
-
import * as i3 from "./log.service";
|
|
13
|
-
import * as i4 from "./barsa-dialog.service";
|
|
14
|
-
import * as i5 from "@angular/router";
|
|
15
|
-
import * as i6 from "@angular/common";
|
|
16
|
-
import * as i7 from "./local-storage.service";
|
|
17
|
-
export class PortalService {
|
|
18
|
-
constructor(dcm, apiService, logService, dialogService, compiler, _router, _location, _localStorage, _document) {
|
|
19
|
-
this.dcm = dcm;
|
|
20
|
-
this.apiService = apiService;
|
|
21
|
-
this.logService = logService;
|
|
22
|
-
this.dialogService = dialogService;
|
|
23
|
-
this.compiler = compiler;
|
|
24
|
-
this._router = _router;
|
|
25
|
-
this._location = _location;
|
|
26
|
-
this._localStorage = _localStorage;
|
|
27
|
-
this._document = _document;
|
|
28
|
-
this.offsetTop = 0;
|
|
29
|
-
this.loginLoading = new BehaviorSubject(false);
|
|
30
|
-
this.loaded = false;
|
|
31
|
-
this.formPanels = {};
|
|
32
|
-
this.cachedImages = {};
|
|
33
|
-
this.cachedPageData = {};
|
|
34
|
-
this.pages = [];
|
|
35
|
-
this.rtlSource = new BehaviorSubject(true);
|
|
36
|
-
this.dictionary = {};
|
|
37
|
-
this.portalDataSource = new BehaviorSubject(null);
|
|
38
|
-
this.openForm$ = new Subject();
|
|
39
|
-
this._isAnonumousSource = new BehaviorSubject(true);
|
|
40
|
-
this._pushAction$ = new BehaviorSubject(null);
|
|
41
|
-
this._deviceSizeSource = new BehaviorSubject(this._initalizeDeviceSize());
|
|
42
|
-
this._loggedInSource = new BehaviorSubject(false);
|
|
43
|
-
this.routeInitializedSource = new BehaviorSubject(false);
|
|
44
|
-
this.dateTextSource = new BehaviorSubject('');
|
|
45
|
-
this._navigationStart$ = new BehaviorSubject(null);
|
|
46
|
-
this._navigationEnd$ = new BehaviorSubject(null);
|
|
47
|
-
this._userPortalSettings$ = new BehaviorSubject({});
|
|
48
|
-
this._cssUrlSource = new BehaviorSubject(null);
|
|
49
|
-
this._cssVariableUrlSource = new BehaviorSubject(null);
|
|
50
|
-
this._cssCustomUrlSource = new BehaviorSubject(null);
|
|
51
|
-
this._searchTerm$ = new BehaviorSubject('');
|
|
52
|
-
this._windowResize$ = new Subject();
|
|
53
|
-
this._deviceLandscape$ = new BehaviorSubject(!window.matchMedia('(orientation: portrait)').matches);
|
|
54
|
-
this._standalone$ = new BehaviorSubject(window.matchMedia('(display-mode: standalone)').matches);
|
|
55
|
-
this._documentVisibilitychange$ = new Subject();
|
|
56
|
-
this.initialize();
|
|
57
|
-
this._initLandscape();
|
|
58
|
-
this._initStandalone();
|
|
59
|
-
this._initVisibilityChange();
|
|
60
|
-
this._initPushActions();
|
|
61
|
-
}
|
|
62
|
-
get isRtl() {
|
|
63
|
-
return this.rtlSource.getValue();
|
|
64
|
-
}
|
|
65
|
-
get userLoggedIn() {
|
|
66
|
-
return this._loggedInSource.getValue();
|
|
67
|
-
}
|
|
68
|
-
get pushAction$() {
|
|
69
|
-
return this._pushAction$.asObservable().pipe();
|
|
70
|
-
}
|
|
71
|
-
get documentVisibilitychange$() {
|
|
72
|
-
return this._documentVisibilitychange$.asObservable();
|
|
73
|
-
}
|
|
74
|
-
get isStandalone() {
|
|
75
|
-
return this._standalone$.getValue();
|
|
76
|
-
}
|
|
77
|
-
get standalone$() {
|
|
78
|
-
return this._standalone$.asObservable();
|
|
79
|
-
}
|
|
80
|
-
get landscape$() {
|
|
81
|
-
return this._deviceLandscape$.asObservable();
|
|
82
|
-
}
|
|
83
|
-
get windowResize$() {
|
|
84
|
-
return this._windowResize$.asObservable().pipe(debounceTime(300));
|
|
85
|
-
}
|
|
86
|
-
get portalData() {
|
|
87
|
-
return this.portalDataSource.getValue();
|
|
88
|
-
}
|
|
89
|
-
get searchTerm$() {
|
|
90
|
-
return this._searchTerm$.asObservable();
|
|
91
|
-
}
|
|
92
|
-
get cssUrl$() {
|
|
93
|
-
return this._cssUrlSource.asObservable().pipe(distinctUntilChanged());
|
|
94
|
-
}
|
|
95
|
-
get cssVariableUrl$() {
|
|
96
|
-
return this._cssVariableUrlSource.asObservable().pipe(distinctUntilChanged());
|
|
97
|
-
}
|
|
98
|
-
get cssCustomUrl$() {
|
|
99
|
-
return this._cssCustomUrlSource.asObservable();
|
|
100
|
-
}
|
|
101
|
-
get userPortalSettings() {
|
|
102
|
-
return this._userPortalSettings$.getValue();
|
|
103
|
-
}
|
|
104
|
-
get userPortalSettings$() {
|
|
105
|
-
return this._userPortalSettings$.asObservable();
|
|
106
|
-
}
|
|
107
|
-
get deviceSize() {
|
|
108
|
-
return this._deviceSizeSource.getValue();
|
|
109
|
-
}
|
|
110
|
-
get isAnonymous$() {
|
|
111
|
-
return this._isAnonumousSource.asObservable();
|
|
112
|
-
}
|
|
113
|
-
get navigationEnd$() {
|
|
114
|
-
return this._navigationEnd$.asObservable();
|
|
115
|
-
}
|
|
116
|
-
get navigationStart$() {
|
|
117
|
-
return this._navigationStart$.asObservable();
|
|
118
|
-
}
|
|
119
|
-
loadMo(id, typedefId) {
|
|
120
|
-
return this.apiService.loadPortalPageData(id, typedefId);
|
|
121
|
-
}
|
|
122
|
-
pushActionNext(pushAction) {
|
|
123
|
-
this._localStorage.setItem('pushAction', JSON.stringify(pushAction));
|
|
124
|
-
this._pushAction$.next(pushAction);
|
|
125
|
-
}
|
|
126
|
-
setSearchTerm(term) {
|
|
127
|
-
this._searchTerm$.next(term);
|
|
128
|
-
}
|
|
129
|
-
windowResize() {
|
|
130
|
-
this._windowResize$.next();
|
|
131
|
-
}
|
|
132
|
-
naviationEnd(event) {
|
|
133
|
-
this._navigationEnd$.next(event);
|
|
134
|
-
}
|
|
135
|
-
naviationStart(event) {
|
|
136
|
-
this._navigationStart$.next(event);
|
|
137
|
-
}
|
|
138
|
-
setUserPortalSettings(userPortalSettings) {
|
|
139
|
-
const value = this._userPortalSettings$.getValue();
|
|
140
|
-
if (userPortalSettings.$TypeDefName) {
|
|
141
|
-
value[userPortalSettings.$TypeDefName] = userPortalSettings;
|
|
142
|
-
this._userPortalSettings$.next({ ...value });
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
setCssUrlTheme(themeUrl, cssVariableUrl) {
|
|
146
|
-
this._cssUrlSource.next(themeUrl);
|
|
147
|
-
this._cssCustomUrlSource.next(themeUrl);
|
|
148
|
-
if (cssVariableUrl) {
|
|
149
|
-
this._cssVariableUrlSource.next(cssVariableUrl);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
setData(key, data) {
|
|
153
|
-
if (!this.dictionary[key]) {
|
|
154
|
-
this.dictionary[key] = new BehaviorSubject(data);
|
|
155
|
-
this.dictionary[key].next(data);
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
const oldVal = this.dictionary[key].getValue();
|
|
159
|
-
if (oldVal !== data) {
|
|
160
|
-
this.dictionary[key].next(data);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
getData(key, defaultValue = null) {
|
|
165
|
-
if (!this.dictionary[key]) {
|
|
166
|
-
this.dictionary[key] = new BehaviorSubject(defaultValue);
|
|
167
|
-
}
|
|
168
|
-
return this.dictionary[key].asObservable();
|
|
169
|
-
}
|
|
170
|
-
getDataSync(key, defaultValue = null) {
|
|
171
|
-
if (!this.dictionary[key]) {
|
|
172
|
-
return defaultValue;
|
|
173
|
-
}
|
|
174
|
-
return this.dictionary[key].getValue();
|
|
175
|
-
}
|
|
176
|
-
createForReport(navItem) {
|
|
177
|
-
return from(new Promise((resolve, reject) => {
|
|
178
|
-
BarsaApi.Ul.UlvMainCtrlr.CreateForReport({}, navItem, (err, result) => {
|
|
179
|
-
if (err) {
|
|
180
|
-
reject(err);
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
resolve(result);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}));
|
|
187
|
-
}
|
|
188
|
-
renderUlvMainUi(navItem, vcr, injector, isReportPage = false) {
|
|
189
|
-
return this.createForReport(navItem).pipe(exhaustMap((ulvMainCtrlr) => this.getUlvMainUiComponent(ulvMainCtrlr.Adapter.Control, injector, isReportPage).pipe(tap((ulvManiUiComponent) => vcr.insert(ulvManiUiComponent.hostView)), map(() => ulvMainCtrlr))));
|
|
190
|
-
}
|
|
191
|
-
getUlvMainUiComponent(customUlvMainUi, injector, isReportPage) {
|
|
192
|
-
const customUiSetting = BarsaApi.Common.Util.TryGetValue(customUlvMainUi.Setting, 'CustomUi', null);
|
|
193
|
-
const { moduleName, modulePath, componentName, selector } = getComponentDefined(customUlvMainUi, customUiSetting);
|
|
194
|
-
return this.getComponent(moduleName, modulePath, componentName, selector, injector).pipe(map((component) => {
|
|
195
|
-
const componentInstance = component.instance;
|
|
196
|
-
componentInstance.id = customUlvMainUi.id;
|
|
197
|
-
componentInstance.context = customUlvMainUi;
|
|
198
|
-
componentInstance.isReportPage = isReportPage;
|
|
199
|
-
customUlvMainUi.controlUi = componentInstance;
|
|
200
|
-
return component;
|
|
201
|
-
}));
|
|
202
|
-
}
|
|
203
|
-
initialize() {
|
|
204
|
-
this.deviceSize$ = this._deviceSizeSource.asObservable();
|
|
205
|
-
this.portalData$ = this.portalDataSource.asObservable();
|
|
206
|
-
this.rtl$ = this.rtlSource.asObservable();
|
|
207
|
-
this.userLoggedIn$ = this._loggedInSource
|
|
208
|
-
.asObservable()
|
|
209
|
-
.pipe(map((isLoggedIn) => isLoggedIn && BarsaApi.LoginFormData.IsAnonymous === false));
|
|
210
|
-
this.dirValue$ = this.rtl$.pipe(map((isRtl) => (isRtl ? 'rtl' : 'ltr')));
|
|
211
|
-
this.routeInitialized$ = this.routeInitializedSource.asObservable().pipe(distinctUntilChanged());
|
|
212
|
-
this._standalone$.asObservable().subscribe((c) => {
|
|
213
|
-
if (c) {
|
|
214
|
-
this._document.body.classList.add('standalone');
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
this._document.body.classList.add('noStandalone');
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
this._deviceLandscape$.asObservable().subscribe((c) => {
|
|
221
|
-
if (c) {
|
|
222
|
-
this._document.body.classList.add('landscape');
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
this._deviceSizeSource.asObservable().subscribe((c) => {
|
|
226
|
-
if (c === 's') {
|
|
227
|
-
this._document.body.classList.add('smalldevice');
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
this.dateText$ = this.dateTextSource.asObservable();
|
|
231
|
-
this.portalSettings$ = this.portalDataSource
|
|
232
|
-
.asObservable()
|
|
233
|
-
.pipe(map((portalData) => (portalData ? portalData.PortalSettings : {})));
|
|
234
|
-
fromEvent(window, 'resize')
|
|
235
|
-
.pipe(startWith(null), debounceTime(1000))
|
|
236
|
-
.subscribe((c) => {
|
|
237
|
-
this._windowResize$.next();
|
|
238
|
-
this._setDeviceSize();
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
_setDeviceSize() {
|
|
242
|
-
const deviceSize = this._initalizeDeviceSize();
|
|
243
|
-
this._deviceSizeSource.next(deviceSize);
|
|
244
|
-
}
|
|
245
|
-
_initalizeDeviceSize() {
|
|
246
|
-
const _ismobile = getDeviceIsMobile();
|
|
247
|
-
if (_ismobile) {
|
|
248
|
-
BarsaApi.Bw.IsMobile = true;
|
|
249
|
-
}
|
|
250
|
-
const _isTablet = getDeviceIsTablet();
|
|
251
|
-
let _windoWSize = 's';
|
|
252
|
-
if (window.innerWidth <= 600) {
|
|
253
|
-
_windoWSize = 's';
|
|
254
|
-
}
|
|
255
|
-
else if (window.innerWidth > 600 && window.innerWidth <= 992) {
|
|
256
|
-
_windoWSize = 'm';
|
|
257
|
-
}
|
|
258
|
-
else if (window.innerWidth > 992 && window.innerWidth <= 1200) {
|
|
259
|
-
_windoWSize = 'l';
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
_windoWSize = 'xl';
|
|
263
|
-
}
|
|
264
|
-
if (_ismobile && _windoWSize !== 'l' && _windoWSize !== 'xl' && _windoWSize !== 'm') {
|
|
265
|
-
return 's';
|
|
266
|
-
}
|
|
267
|
-
if (_isTablet && _windoWSize !== 'l' && _windoWSize !== 'xl') {
|
|
268
|
-
return 'm';
|
|
269
|
-
}
|
|
270
|
-
return _windoWSize;
|
|
271
|
-
}
|
|
272
|
-
compileModule(dependency) {
|
|
273
|
-
const module$ = this.getModule(dependency);
|
|
274
|
-
return module$.pipe(concatMap((modules) => {
|
|
275
|
-
const moduleFactory = this.getNgModuleFactory(modules, dependency.name);
|
|
276
|
-
return of(moduleFactory);
|
|
277
|
-
}));
|
|
278
|
-
}
|
|
279
|
-
getModule(dependency) {
|
|
280
|
-
const { name, kebabName, umd, exportAs } = dependency;
|
|
281
|
-
const base = `/assets/modules/${kebabName}/bundles`;
|
|
282
|
-
const date = BarsaApi.LoginFormData.abc;
|
|
283
|
-
const path = `${base}/${kebabName}.umd.js?t=${date}`;
|
|
284
|
-
return of(true).pipe(concatMap(() => {
|
|
285
|
-
const modules = this.getRegisteredModules(umd, exportAs, name);
|
|
286
|
-
if (modules) {
|
|
287
|
-
return of(modules);
|
|
288
|
-
}
|
|
289
|
-
return this.loadJs$(path).pipe(map(() => this.getRegisteredModules(umd, exportAs, name)));
|
|
290
|
-
}));
|
|
291
|
-
}
|
|
292
|
-
setValueOnObject(path, index, modules, object) {
|
|
293
|
-
const splited = path.split('.');
|
|
294
|
-
const prop = splited[index];
|
|
295
|
-
if (typeof object[prop] === typeof undefined) {
|
|
296
|
-
object[prop] = {};
|
|
297
|
-
}
|
|
298
|
-
if (index === splited.length - 1) {
|
|
299
|
-
object[prop] = modules;
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
this.setValueOnObject(path, index + 1, modules, object[prop]);
|
|
303
|
-
}
|
|
304
|
-
getComponent(moduleName, modulePath, componentName, selector, parentInjector) {
|
|
305
|
-
return this.dcm.getComponentBySelector(selector, moduleName, parentInjector);
|
|
306
|
-
}
|
|
307
|
-
loadJs$(path) {
|
|
308
|
-
return from(new Promise((resolve, reject) => {
|
|
309
|
-
const script = document.createElement('script');
|
|
310
|
-
script.setAttribute('type', 'text/javascript');
|
|
311
|
-
script.setAttribute('src', path);
|
|
312
|
-
script.onload = () => {
|
|
313
|
-
resolve(path);
|
|
314
|
-
};
|
|
315
|
-
document.getElementsByTagName('head')[0].appendChild(script);
|
|
316
|
-
setTimeout(() => {
|
|
317
|
-
reject();
|
|
318
|
-
}, 5000);
|
|
319
|
-
}));
|
|
320
|
-
}
|
|
321
|
-
ReportExecuteById(reportId) {
|
|
322
|
-
const ulvParams = this._getUlvParamsBy('', reportId);
|
|
323
|
-
return from(this._reportExecutePromise(ulvParams));
|
|
324
|
-
}
|
|
325
|
-
ReportExecute(reportName) {
|
|
326
|
-
return from(this.ReportExecutePromise(reportName));
|
|
327
|
-
}
|
|
328
|
-
ReportExecutePromise(reportName) {
|
|
329
|
-
const ulvParams = this._getUlvParamsBy(reportName);
|
|
330
|
-
return this._reportExecutePromise(ulvParams);
|
|
331
|
-
}
|
|
332
|
-
_getUlvParamsBy(reportName, reportId) {
|
|
333
|
-
return {
|
|
334
|
-
Flags: {
|
|
335
|
-
Data: 'True',
|
|
336
|
-
Extra: 'False',
|
|
337
|
-
Search: 'False',
|
|
338
|
-
View: 'False'
|
|
339
|
-
// General:"False", // ulvmainctrl does not craete ui control raise error
|
|
340
|
-
},
|
|
341
|
-
ReportName: reportName,
|
|
342
|
-
ReportId: reportId,
|
|
343
|
-
UsageEnum: 'SystemContainer'
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
_reportExecutePromise(ulvParams) {
|
|
347
|
-
return new Promise((resolve, reject) => {
|
|
348
|
-
BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
|
|
349
|
-
resolve(result.Data);
|
|
350
|
-
}, (err) => {
|
|
351
|
-
reject(err);
|
|
352
|
-
});
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
addFormPanelCtrlr(id, formpanelCtrlr) {
|
|
356
|
-
this.formPanels[id] = formpanelCtrlr;
|
|
357
|
-
}
|
|
358
|
-
setUserLoginStatus(status) {
|
|
359
|
-
this._loggedInSource.next(status);
|
|
360
|
-
}
|
|
361
|
-
extractAllPages(portalData) {
|
|
362
|
-
if (!portalData) {
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
portalData.ChildPageList.MoDataList.forEach((pageData) => {
|
|
366
|
-
this.addChildPages(pageData);
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
extractAllPages_Old(portalData) {
|
|
370
|
-
if (!portalData) {
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
const config = this._router.config;
|
|
374
|
-
portalData.ChildPageList.MoDataList.forEach((pageData) => {
|
|
375
|
-
const path = pageData.Route.replace('/', '');
|
|
376
|
-
config.push(this.createRoute(pageData, path, pageData.HasAuthorize, pageData.PageModule?.$Caption, null, null));
|
|
377
|
-
if (pageData.IsDefaultRoute || pageData.IsDefaultRoute === 'True') {
|
|
378
|
-
this.defaultRoute = path;
|
|
379
|
-
config.push(this.createRoute(pageData, '', false, portalData.PageModule?.$Caption, path, null));
|
|
380
|
-
}
|
|
381
|
-
this.addChildPages(pageData);
|
|
382
|
-
});
|
|
383
|
-
this._router.resetConfig(config);
|
|
384
|
-
if (this._location.path() === '') {
|
|
385
|
-
// this._router.navigate([this.defaultRoute]);
|
|
386
|
-
this._router.navigate(['']);
|
|
387
|
-
}
|
|
388
|
-
// this.routeInitialized();
|
|
389
|
-
}
|
|
390
|
-
ssoLogin() {
|
|
391
|
-
AjaxHelper.AjaxRequest('/api/base/ssologin', null, false, () => {
|
|
392
|
-
// console.log(response);
|
|
393
|
-
}, () => {
|
|
394
|
-
alert('error in sso login.');
|
|
395
|
-
}, null);
|
|
396
|
-
}
|
|
397
|
-
ssoLogout() {
|
|
398
|
-
AjaxHelper.AjaxRequest('/api/base/ssologout', null, false, () => {
|
|
399
|
-
// console.log(response);
|
|
400
|
-
}, () => {
|
|
401
|
-
alert('error in sso logout.');
|
|
402
|
-
}, null);
|
|
403
|
-
}
|
|
404
|
-
addChildPages(pageData) {
|
|
405
|
-
this.pages.push(pageData);
|
|
406
|
-
if (!pageData.ChildPageList?.MoDataList?.length) {
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
pageData.ChildPageList.MoDataList.forEach((childPage) => {
|
|
410
|
-
this.addChildPages(childPage);
|
|
411
|
-
});
|
|
412
|
-
}
|
|
413
|
-
/* eslint-disable */
|
|
414
|
-
createRoute(pageData, path, hasAuthorized, moduleName, redirectTo, isDynamicRoute) {
|
|
415
|
-
return {};
|
|
416
|
-
}
|
|
417
|
-
createRoute2(pageData, path, hasAuthorized, moduleName, redirectTo = null, isDynamicRoute = false) {
|
|
418
|
-
let modulePath = BarsaApi.Common.Util.GetKebabCase(moduleName);
|
|
419
|
-
const umd = moduleName;
|
|
420
|
-
modulePath = modulePath.substring(1, modulePath.length);
|
|
421
|
-
const dynamicRoute = {};
|
|
422
|
-
dynamicRoute.path = path;
|
|
423
|
-
dynamicRoute.data = { pageData };
|
|
424
|
-
if (!isDynamicRoute) {
|
|
425
|
-
dynamicRoute.resolve = {
|
|
426
|
-
pageData: PortalPageResolver
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
if (path === '') {
|
|
430
|
-
dynamicRoute.pathMatch = 'full';
|
|
431
|
-
}
|
|
432
|
-
if (redirectTo) {
|
|
433
|
-
dynamicRoute.redirectTo = redirectTo;
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
if (hasAuthorized) {
|
|
437
|
-
dynamicRoute.canActivate = [AuthGuard];
|
|
438
|
-
}
|
|
439
|
-
dynamicRoute.loadChildren = () => {
|
|
440
|
-
const dependencies = JSON.parse(pageData.Dependencies); // eval(pageData.Dependencies);
|
|
441
|
-
const pageLibrary = {
|
|
442
|
-
name: moduleName,
|
|
443
|
-
kebabName: modulePath,
|
|
444
|
-
umd,
|
|
445
|
-
exportAs: [moduleName]
|
|
446
|
-
};
|
|
447
|
-
const dependencies$ = from(dependencies).pipe(concatMap((dependency) => this.compileModule(dependency)));
|
|
448
|
-
return forkJoin([dependencies$]).pipe(concatMap(() => this.getModule(pageLibrary)), map((modules) => modules[moduleName + 'Module']), tap(() => this.routeInitialized()));
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
return dynamicRoute;
|
|
452
|
-
}
|
|
453
|
-
routeInitialized() {
|
|
454
|
-
this.routeInitializedSource.next(true);
|
|
455
|
-
}
|
|
456
|
-
loginByAnonymous() {
|
|
457
|
-
this.loginLoading.next(true);
|
|
458
|
-
return this.apiService.loginPortal().pipe(map((result) => {
|
|
459
|
-
if (typeof result === 'object' && result !== null) {
|
|
460
|
-
this.logService.debug(result);
|
|
461
|
-
window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, result.data.sth);
|
|
462
|
-
return true;
|
|
463
|
-
}
|
|
464
|
-
else {
|
|
465
|
-
return false;
|
|
466
|
-
}
|
|
467
|
-
}), finalize(() => {
|
|
468
|
-
this.loginLoading.next(false);
|
|
469
|
-
}));
|
|
470
|
-
}
|
|
471
|
-
getPageData(url, isRoot) {
|
|
472
|
-
if (isRoot || url === '' || url === '/') {
|
|
473
|
-
return this.portalData$;
|
|
474
|
-
}
|
|
475
|
-
if (url.indexOf('?') > -1) {
|
|
476
|
-
url = url.substr(0, url.indexOf('?'));
|
|
477
|
-
}
|
|
478
|
-
if (this.cachedPageData[url]) {
|
|
479
|
-
return this.cachedPageData[url];
|
|
480
|
-
}
|
|
481
|
-
const pageData = this.findPageByRoute(url);
|
|
482
|
-
this.cachedPageData[url] = this.apiService
|
|
483
|
-
.loadPortalPageData(pageData?.Id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
|
|
484
|
-
.pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
|
|
485
|
-
this.addChildRoute(pageMo, pageMo.ChildPageList);
|
|
486
|
-
this.addChildPages(pageMo);
|
|
487
|
-
}), publishReplay(1), refCount());
|
|
488
|
-
// this.cachedPageData[url] = this.portalData$.pipe(
|
|
489
|
-
// filter((portalData) => portalData != null),
|
|
490
|
-
// map((portalData) => ),
|
|
491
|
-
// concatMap((pageData) => {
|
|
492
|
-
// return
|
|
493
|
-
// }),
|
|
494
|
-
// tap(pageData=>{})
|
|
495
|
-
// );
|
|
496
|
-
return this.cachedPageData[url];
|
|
497
|
-
}
|
|
498
|
-
resolveData(routePageData) {
|
|
499
|
-
// const pageData = this.pages.find((c) => c.Route === routePageData.Route && c.Module === routePageData.Module);
|
|
500
|
-
const pageData = this.pages.find((c) => c.Route === routePageData.Route);
|
|
501
|
-
if (!pageData) {
|
|
502
|
-
return of(null);
|
|
503
|
-
}
|
|
504
|
-
const id = pageData.Id;
|
|
505
|
-
if (this.cachedPageData[id]) {
|
|
506
|
-
return this.cachedPageData[id];
|
|
507
|
-
}
|
|
508
|
-
this.cachedPageData[id] = this.apiService
|
|
509
|
-
.loadPortalPageData(id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
|
|
510
|
-
.pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
|
|
511
|
-
this.addChildRoute(pageMo, pageMo.ChildPageList);
|
|
512
|
-
this.addChildPages(pageMo);
|
|
513
|
-
}), publishReplay(1), refCount());
|
|
514
|
-
// this.cachedPageData[url] = this.portalData$.pipe(
|
|
515
|
-
// filter((portalData) => portalData != null),
|
|
516
|
-
// map((portalData) => ),
|
|
517
|
-
// concatMap((pageData) => {
|
|
518
|
-
// return
|
|
519
|
-
// }),
|
|
520
|
-
// tap(pageData=>{})
|
|
521
|
-
// );
|
|
522
|
-
return this.cachedPageData[id];
|
|
523
|
-
}
|
|
524
|
-
addChildRoute(pageMo, ChildPageList) {
|
|
525
|
-
return;
|
|
526
|
-
}
|
|
527
|
-
addChildRoute_Old(pageMo, ChildPageList) {
|
|
528
|
-
if (!ChildPageList?.MoDataList?.length) {
|
|
529
|
-
return;
|
|
530
|
-
}
|
|
531
|
-
const config = this._router.config;
|
|
532
|
-
const parentPath = pageMo.Route.replace('/', '');
|
|
533
|
-
const parentRoute = config.find((c) => (c.path = parentPath));
|
|
534
|
-
const children = [];
|
|
535
|
-
if (parentRoute) {
|
|
536
|
-
ChildPageList.MoDataList.forEach((child) => {
|
|
537
|
-
const path = child.Route.replace('/', '');
|
|
538
|
-
const childroute = this.createRoute(child, path, child.HasAuthorize, child.PageModule?.$Caption, null, true);
|
|
539
|
-
children.push(childroute);
|
|
540
|
-
});
|
|
541
|
-
// debugger;
|
|
542
|
-
parentRoute._loadedConfig.routes[0].children = children;
|
|
543
|
-
this._router.resetConfig(config);
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
loadPortalData_Old1() {
|
|
547
|
-
return this.apiService.loadPortal(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId).pipe(tap((portalSetting) => {
|
|
548
|
-
const portalData = portalSetting.Data.Mo;
|
|
549
|
-
this.extractAllPages(portalData);
|
|
550
|
-
this.portalDataSource.next(portalData);
|
|
551
|
-
}), concatMap(() => from(this.loadSystem())), tap((all) => this.dateTextSource.next(BarsaApi.LoginFormData.DateText)));
|
|
552
|
-
}
|
|
553
|
-
loadPortalDataSync_Old2() {
|
|
554
|
-
const portalSetting = this.apiService.loadPortalSync(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId);
|
|
555
|
-
const portalData = portalSetting.Data.Mo;
|
|
556
|
-
this.extractAllPages(portalData);
|
|
557
|
-
this.portalDataSource.next(portalData);
|
|
558
|
-
this.loadSystem();
|
|
559
|
-
this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
|
|
560
|
-
}
|
|
561
|
-
_getDefaultPage(c) {
|
|
562
|
-
if (!c || !c.length) {
|
|
563
|
-
return null;
|
|
564
|
-
}
|
|
565
|
-
let x = c.find((c) => c.IsDefaultRoute === 'True');
|
|
566
|
-
if (x) {
|
|
567
|
-
return x;
|
|
568
|
-
}
|
|
569
|
-
let x2 = null;
|
|
570
|
-
c.forEach((element) => {
|
|
571
|
-
if (x2) {
|
|
572
|
-
return;
|
|
573
|
-
}
|
|
574
|
-
x2 = this._getDefaultPage(element.ChildPageList?.MoDataList);
|
|
575
|
-
});
|
|
576
|
-
return x2;
|
|
577
|
-
}
|
|
578
|
-
loadPortalDataSync() {
|
|
579
|
-
if (BarsaApi.LoginFormData?.error?.userMessage) {
|
|
580
|
-
return;
|
|
581
|
-
}
|
|
582
|
-
const portalSettingStr = BarsaApi.Bw.RunBlMethod('GetPortal', BarsaApi.LoginFormData.PortalId);
|
|
583
|
-
const portalSetting = BarsaApi.Ext.decode(portalSettingStr);
|
|
584
|
-
const portalData = portalSetting;
|
|
585
|
-
if (portalData) {
|
|
586
|
-
const defaultPage = this._getDefaultPage(portalData.ChildPageList.MoDataList);
|
|
587
|
-
this.DefaultPage = defaultPage;
|
|
588
|
-
let configRoute = this._router.config;
|
|
589
|
-
const removePaged = [];
|
|
590
|
-
configRoute.forEach((c, index) => {
|
|
591
|
-
const route = '/' + c.path;
|
|
592
|
-
if (c.path !== '' && portalData.ChildPageList.MoDataList.findIndex((d) => d.Route === route) === -1) {
|
|
593
|
-
removePaged.push(c);
|
|
594
|
-
}
|
|
595
|
-
});
|
|
596
|
-
const pathToRemove = removePaged.map((d) => d.path);
|
|
597
|
-
configRoute = configRoute.filter((c) => pathToRemove.indexOf(c.path) === -1);
|
|
598
|
-
if (defaultPage != null) {
|
|
599
|
-
const defaultPageRoute = defaultPage.Route.replace('/', '');
|
|
600
|
-
const defaultPath = configRoute.find((c) => c.path === '');
|
|
601
|
-
defaultPath && (defaultPath.redirectTo = defaultPageRoute);
|
|
602
|
-
configRoute.push({ path: '**', redirectTo: defaultPageRoute });
|
|
603
|
-
// const notFoundPath = configRoute.find((c) => c.path === '**');
|
|
604
|
-
// notFoundPath && (notFoundPath.redirectTo = defaultPage.Route.replace('/', ''));
|
|
605
|
-
this._router.resetConfig(configRoute);
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
this.extractAllPages(portalData);
|
|
609
|
-
this.portalDataSource.next(portalData);
|
|
610
|
-
this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
|
|
611
|
-
}
|
|
612
|
-
ShowForm(e) {
|
|
613
|
-
BarsaApi.Bw.Form.Show({
|
|
614
|
-
Mo: e.mo,
|
|
615
|
-
MoContext: {
|
|
616
|
-
ViewName: e.nama
|
|
617
|
-
},
|
|
618
|
-
EventHandlers: {
|
|
619
|
-
AfterReady: function (sender, ee) {
|
|
620
|
-
//do something here
|
|
621
|
-
e.afterReady?.(ee);
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
});
|
|
625
|
-
}
|
|
626
|
-
get loginRoute$() {
|
|
627
|
-
return this.portalData$.pipe(map((portalData) => {
|
|
628
|
-
const loginPage = portalData?.ChildPageList.MoDataList.find((c) => c.IsLoginRoute === 'True');
|
|
629
|
-
return loginPage?.Route || 'login';
|
|
630
|
-
}));
|
|
631
|
-
}
|
|
632
|
-
RunBlMethodAsync(methodName, parameters) {
|
|
633
|
-
return new Promise((resolve, reject) => {
|
|
634
|
-
BarsaApi.Bw.RunBlMethodAsync({
|
|
635
|
-
Parameters: parameters,
|
|
636
|
-
Method: methodName,
|
|
637
|
-
SuccessFn: (data) => {
|
|
638
|
-
resolve(data);
|
|
639
|
-
},
|
|
640
|
-
FailFn: (err) => {
|
|
641
|
-
reject(err);
|
|
642
|
-
}
|
|
643
|
-
});
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
ExecuteNotificationAction(id, actionTitle) {
|
|
647
|
-
BarsaApi.Bw.RunBlMethodAsync({
|
|
648
|
-
Parameters: [id, actionTitle],
|
|
649
|
-
Method: 'ExecuteNotificationAction',
|
|
650
|
-
SuccessFn: (e) => {
|
|
651
|
-
this._removePushAction();
|
|
652
|
-
if (e.DynamicCommandId) {
|
|
653
|
-
ExecuteDynamicCommand({ Id: e.DynamicCommandId }, e.Mo);
|
|
654
|
-
}
|
|
655
|
-
else if (e.ShowFormSetting) {
|
|
656
|
-
const { MoId, ViewName } = e.ShowFormSetting;
|
|
657
|
-
setTimeout(() => BarsaApi.Bw.Form.Show({ MoId, MoContext: { ViewName } }), 500);
|
|
658
|
-
}
|
|
659
|
-
},
|
|
660
|
-
FailFn: (e) => {
|
|
661
|
-
this._removePushAction();
|
|
662
|
-
this.logService.error(e);
|
|
663
|
-
}
|
|
664
|
-
});
|
|
665
|
-
}
|
|
666
|
-
loadUserPortalSetting() {
|
|
667
|
-
if (BarsaApi.LoginFormData?.error?.userMessage) {
|
|
668
|
-
return;
|
|
669
|
-
}
|
|
670
|
-
const ulvParams = {
|
|
671
|
-
Flags: {
|
|
672
|
-
Data: 'True',
|
|
673
|
-
Extra: 'False',
|
|
674
|
-
Search: 'False',
|
|
675
|
-
View: 'False'
|
|
676
|
-
// General:"False", // ulvmainctrl does not craete ui control raise error
|
|
677
|
-
},
|
|
678
|
-
ReportName: '_تنظيمات_پايه_پورتال',
|
|
679
|
-
UsageEnum: 'SystemContainer'
|
|
680
|
-
};
|
|
681
|
-
BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
|
|
682
|
-
const molist = result.Data.MoDataList;
|
|
683
|
-
const userPortalSetting = {};
|
|
684
|
-
molist.forEach((mo) => {
|
|
685
|
-
if (mo.Inheritance && mo.Inheritance.$TypeDefName) {
|
|
686
|
-
userPortalSetting[mo.Inheritance.$TypeDefName] = mo.Inheritance;
|
|
687
|
-
}
|
|
688
|
-
});
|
|
689
|
-
this._userPortalSettings$.next(userPortalSetting);
|
|
690
|
-
}, (err) => {
|
|
691
|
-
this.logService.error(err);
|
|
692
|
-
});
|
|
693
|
-
// BarsaApi.Bw.RunBlMethodAsync({
|
|
694
|
-
// Parameters: [],
|
|
695
|
-
// Method: 'GetUserPortalSettings',
|
|
696
|
-
// SuccessFn: (userPortalSetting: MetaobjectDataModel) => {
|
|
697
|
-
// },
|
|
698
|
-
// FailFn: (e) => {
|
|
699
|
-
// this.logService.error(e);
|
|
700
|
-
// }
|
|
701
|
-
// });
|
|
702
|
-
}
|
|
703
|
-
loadServerStartupData() {
|
|
704
|
-
return new Promise((resolve, reject) => {
|
|
705
|
-
if (!BarsaApi.Offline.hasInit) {
|
|
706
|
-
BarsaApi.Offline.afterInitCallback = () => {
|
|
707
|
-
this._loadServerStartupData(resolve, reject);
|
|
708
|
-
};
|
|
709
|
-
}
|
|
710
|
-
else
|
|
711
|
-
this._loadServerStartupData(resolve, reject);
|
|
712
|
-
});
|
|
713
|
-
}
|
|
714
|
-
_loadServerStartupData(resolve, reject) {
|
|
715
|
-
const ajaxHelper = typeof AjaxHelper2 === 'undefined' ? AjaxHelper : AjaxHelper2;
|
|
716
|
-
ajaxHelper.AjaxRequest('/api/base/ServerStartupData', {}, false, (response) => {
|
|
717
|
-
let dataText = response.responseText;
|
|
718
|
-
dataText = dataText.replace(/'/g, '"');
|
|
719
|
-
dataText = BarsaApi.Common.Util.ReplaceArabicCharchter(dataText);
|
|
720
|
-
BarsaApi.LoginForm.PortalInitialize(dataText);
|
|
721
|
-
if (typeof BarsaApi.LoginFormData.IsAnonymous === 'undefined') {
|
|
722
|
-
if (BarsaApi.LoginFormData?.error?.userMessage) {
|
|
723
|
-
BarsaApi.Bw.Msg.Error(BarsaApi.LoginFormData?.error?.userMessage);
|
|
724
|
-
}
|
|
725
|
-
else {
|
|
726
|
-
BarsaApi.Bw.Msg.Error('امکان ورود با کاربر پورتال وجود ندارد.');
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
if (BarsaApi.LoginFormData.IsServiceDesk) {
|
|
730
|
-
const config = this._router.config;
|
|
731
|
-
config[0].redirectTo = 'servicedesk';
|
|
732
|
-
this._router.resetConfig(config);
|
|
733
|
-
}
|
|
734
|
-
this._initAfterLoginFormData();
|
|
735
|
-
resolve(BarsaApi.LoginFormData);
|
|
736
|
-
}, () => {
|
|
737
|
-
alert('error in get server startup data.');
|
|
738
|
-
reject('error in get server startup data.');
|
|
739
|
-
}, null);
|
|
740
|
-
}
|
|
741
|
-
ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false) {
|
|
742
|
-
if (!formpanelCtrlr) {
|
|
743
|
-
console.warn('form panel controler is undefined!');
|
|
744
|
-
return;
|
|
745
|
-
}
|
|
746
|
-
const mo = formpanelCtrlr.Mo;
|
|
747
|
-
const headerLayout = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.HeaderLayout', null);
|
|
748
|
-
let isModal = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.ExtraJsonProp.Modal', false);
|
|
749
|
-
isModal =
|
|
750
|
-
isModal ||
|
|
751
|
-
BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.IsModal', false);
|
|
752
|
-
const modalSetting = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.ModalSetting', null);
|
|
753
|
-
if (modalSetting) {
|
|
754
|
-
isModal = true;
|
|
755
|
-
}
|
|
756
|
-
formpanelCtrlr.Setting.IsModal = isModal;
|
|
757
|
-
formpanelCtrlr.IsModal = isModal;
|
|
758
|
-
const breadCrumb = getHeaderValue(headerLayout?.BreadCrumb);
|
|
759
|
-
const queryParams = {
|
|
760
|
-
id: mo.$State === 'New' ? '0' : mo.Id,
|
|
761
|
-
tyid: mo.$TypeDefId,
|
|
762
|
-
tycp: mo.$Caption ? mo.$Caption : null,
|
|
763
|
-
repid: mo.$ReportId,
|
|
764
|
-
vid: formpanelCtrlr?.Setting?.View?.TypeViewId,
|
|
765
|
-
bc: breadCrumb ? breadCrumb : mo.$State === 'New' ? mo.$TypeDefName : mo.$Caption
|
|
766
|
-
};
|
|
767
|
-
const id = getUniqueId(4);
|
|
768
|
-
this.addFormPanelCtrlr(id, formpanelCtrlr);
|
|
769
|
-
this.openForm$.next(); // event emit for other components to know form open
|
|
770
|
-
if (isModal) {
|
|
771
|
-
this.dialogService.showForm(dialogComponent, {
|
|
772
|
-
...queryParams,
|
|
773
|
-
formpanelCtrlr
|
|
774
|
-
}, vcr);
|
|
775
|
-
}
|
|
776
|
-
else {
|
|
777
|
-
const state = { formPanelCtrlrId: id };
|
|
778
|
-
if (isPage) {
|
|
779
|
-
router.navigate([
|
|
780
|
-
'form',
|
|
781
|
-
{
|
|
782
|
-
outlets: {
|
|
783
|
-
main: ['show', { ...queryParams, formPanelCtrlrId: id, isFirst: true }]
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
], {
|
|
787
|
-
state,
|
|
788
|
-
relativeTo: activatedRoute,
|
|
789
|
-
skipLocationChange: isReload
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
else {
|
|
793
|
-
router.navigate([
|
|
794
|
-
'popup',
|
|
795
|
-
{
|
|
796
|
-
outlets: {
|
|
797
|
-
main: ['show', { ...queryParams, formPanelCtrlrId: id }]
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
], {
|
|
801
|
-
relativeTo: activatedRoute,
|
|
802
|
-
state,
|
|
803
|
-
queryParamsHandling: 'preserve',
|
|
804
|
-
skipLocationChange: isReload
|
|
805
|
-
});
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
loadSystem(id = 0) {
|
|
810
|
-
if (BarsaApi.LoginFormData?.error?.userMessage) {
|
|
811
|
-
return Promise.reject(BarsaApi.LoginFormData?.error?.userMessage);
|
|
812
|
-
}
|
|
813
|
-
if (id === 0) {
|
|
814
|
-
BarsaApi.Ul.ApplicationCtrlr.DefaultSystemId = null;
|
|
815
|
-
}
|
|
816
|
-
return new Promise((resolve, reject) => {
|
|
817
|
-
BarsaApi.Ul.ApplicationCtrlr._loadSystem(id, true, (data) => {
|
|
818
|
-
resolve(data);
|
|
819
|
-
}, (err) => {
|
|
820
|
-
reject(err);
|
|
821
|
-
});
|
|
822
|
-
});
|
|
823
|
-
}
|
|
824
|
-
_removePushAction() {
|
|
825
|
-
const pushActionStr = this._localStorage.getItem('pushAction');
|
|
826
|
-
if (pushActionStr) {
|
|
827
|
-
this._localStorage.remove('pushAction');
|
|
828
|
-
const pushAction = JSON.parse(pushActionStr);
|
|
829
|
-
this._pushAction$.next(pushAction);
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
_checkLocalStoragePushAction() {
|
|
833
|
-
const pushActionStr = this._localStorage.getItem('pushAction');
|
|
834
|
-
if (pushActionStr) {
|
|
835
|
-
this._localStorage.remove('pushAction');
|
|
836
|
-
const pushAction = JSON.parse(pushActionStr);
|
|
837
|
-
this._pushAction$.next(pushAction);
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
_initAfterLoginFormData() {
|
|
841
|
-
this.rtlSource.next(BarsaApi.LoginFormData.IsRtl);
|
|
842
|
-
this._isAnonumousSource.next(BarsaApi.LoginFormData.IsAnonymous);
|
|
843
|
-
this.setUserLoginStatus(BarsaApi.LoginFormData.IsUserLoggedIn);
|
|
844
|
-
this._loggedInSource.next(this._loggedInSource.getValue() && BarsaApi.LoginFormData.IsAnonymous === false);
|
|
845
|
-
}
|
|
846
|
-
_initVisibilityChange() {
|
|
847
|
-
document.addEventListener('visibilitychange', () => {
|
|
848
|
-
if (document.visibilityState === 'visible') {
|
|
849
|
-
this._documentVisibilitychange$.next(false);
|
|
850
|
-
}
|
|
851
|
-
else {
|
|
852
|
-
this._documentVisibilitychange$.next(true);
|
|
853
|
-
}
|
|
854
|
-
});
|
|
855
|
-
}
|
|
856
|
-
_initStandalone() {
|
|
857
|
-
window.matchMedia('(display-mode: standalone)').addEventListener('change', (e) => {
|
|
858
|
-
const isMatch = e.matches;
|
|
859
|
-
if (isMatch) {
|
|
860
|
-
this._standalone$.next(true);
|
|
861
|
-
}
|
|
862
|
-
else {
|
|
863
|
-
this._standalone$.next(false);
|
|
864
|
-
}
|
|
865
|
-
});
|
|
866
|
-
}
|
|
867
|
-
_initPushActions() {
|
|
868
|
-
this._checkLocalStoragePushAction();
|
|
869
|
-
combineLatest([this.userLoggedIn$, this.pushAction$])
|
|
870
|
-
.pipe(
|
|
871
|
-
// withLatestFrom(this._portalService.pushAction$),
|
|
872
|
-
// filter(([userLoggedin, action]) => userLoggedin)
|
|
873
|
-
filter(([userLoggedin, pushAction]) => userLoggedin))
|
|
874
|
-
.subscribe(([userLoggedin, pushAction]) => {
|
|
875
|
-
if (pushAction != null) {
|
|
876
|
-
if (!pushAction.notificationTag) {
|
|
877
|
-
if (pushAction.moid && pushAction.tpid && pushAction.action == 'show') {
|
|
878
|
-
setTimeout(() => BarsaApi.Bw.Form.Show({ MoId: pushAction.moid }), 500);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
else {
|
|
882
|
-
this.ExecuteNotificationAction(pushAction.notificationTag, pushAction.action);
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
});
|
|
886
|
-
}
|
|
887
|
-
_initLandscape() {
|
|
888
|
-
window.matchMedia('(orientation: portrait)').addEventListener('change', (e) => {
|
|
889
|
-
const isMatch = e.matches;
|
|
890
|
-
if (isMatch) {
|
|
891
|
-
this._deviceLandscape$.next(false); // portrait
|
|
892
|
-
}
|
|
893
|
-
else {
|
|
894
|
-
this._deviceLandscape$.next(true); // landscape
|
|
895
|
-
}
|
|
896
|
-
});
|
|
897
|
-
}
|
|
898
|
-
findPageByRoute(url) {
|
|
899
|
-
const findedPage = this.pages.find((c) => c.Route === url);
|
|
900
|
-
return findedPage || null;
|
|
901
|
-
}
|
|
902
|
-
getNgModuleFactory(modules, moduleName) {
|
|
903
|
-
const moduleClass = modules[moduleName + 'Module'];
|
|
904
|
-
let moduleFactory;
|
|
905
|
-
if (moduleClass instanceof NgModuleFactory) {
|
|
906
|
-
moduleFactory = moduleClass;
|
|
907
|
-
}
|
|
908
|
-
else {
|
|
909
|
-
const compiled = this.compiler.compileModuleAndAllComponentsSync(moduleClass);
|
|
910
|
-
moduleFactory = compiled.ngModuleFactory;
|
|
911
|
-
}
|
|
912
|
-
return moduleFactory;
|
|
913
|
-
}
|
|
914
|
-
getRegisteredModules(umd, exportAs, moduleName) {
|
|
915
|
-
let modules;
|
|
916
|
-
if (umd !== '') {
|
|
917
|
-
modules = window;
|
|
918
|
-
umd.split('.').forEach((c) => {
|
|
919
|
-
if (typeof modules !== typeof undefined) {
|
|
920
|
-
modules = modules[c];
|
|
921
|
-
}
|
|
922
|
-
});
|
|
923
|
-
}
|
|
924
|
-
else {
|
|
925
|
-
modules = window[moduleName];
|
|
926
|
-
}
|
|
927
|
-
if (exportAs.length > 0 && modules) {
|
|
928
|
-
exportAs.forEach((c) => {
|
|
929
|
-
this.setValueOnObject(c, 0, modules, window);
|
|
930
|
-
});
|
|
931
|
-
}
|
|
932
|
-
return modules;
|
|
933
|
-
}
|
|
934
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, deps: [{ token: i1.DynamicComponentService }, { token: i2.ApiService }, { token: i3.LogService }, { token: i4.BarsaDialogService }, { token: i0.Compiler }, { token: i5.Router }, { token: i6.Location }, { token: i7.LocalStorageService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
935
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, providedIn: 'root' }); }
|
|
936
|
-
}
|
|
937
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, decorators: [{
|
|
938
|
-
type: Injectable,
|
|
939
|
-
args: [{
|
|
940
|
-
providedIn: 'root'
|
|
941
|
-
}]
|
|
942
|
-
}], ctorParameters: () => [{ type: i1.DynamicComponentService }, { type: i2.ApiService }, { type: i3.LogService }, { type: i4.BarsaDialogService }, { type: i0.Compiler }, { type: i5.Router }, { type: i6.Location }, { type: i7.LocalStorageService }, { type: Document, decorators: [{
|
|
943
|
-
type: Inject,
|
|
944
|
-
args: [DOCUMENT]
|
|
945
|
-
}] }] });
|
|
946
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL3NlcnZpY2VzL3BvcnRhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxNQUFNLEVBQ04sVUFBVSxFQUVWLGVBQWUsRUFHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRXJELE9BQU8sRUFBYyxlQUFlLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUcsT0FBTyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsU0FBUyxFQUNULFFBQVEsRUFDUixhQUFhLEVBQ2IsUUFBUSxFQUNSLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxnQkFBZ0IsQ0FBQztBQWN4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHekQsT0FBTyxFQUNILHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsV0FBVyxFQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sYUFBYTtJQTJDdEIsWUFDWSxHQUE0QixFQUM1QixVQUFzQixFQUN0QixVQUFzQixFQUN0QixhQUFpQyxFQUNqQyxRQUFrQixFQUNsQixPQUFlLEVBQ2YsU0FBbUIsRUFDbkIsYUFBa0MsRUFDaEIsU0FBbUI7UUFS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LE1BQU07OzRGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFxRFEsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBpbGVyLFxyXG4gICAgQ29tcG9uZW50UmVmLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5qZWN0YWJsZSxcclxuICAgIEluamVjdG9yLFxyXG4gICAgTmdNb2R1bGVGYWN0b3J5LFxyXG4gICAgVHlwZSxcclxuICAgIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQsIExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25TdGFydCwgUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgb2YsIGZyb20sIGZvcmtKb2luLCBmcm9tRXZlbnQsIFN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICAgIHRhcCxcclxuICAgIG1hcCxcclxuICAgIGNvbmNhdE1hcCxcclxuICAgIGZpbmFsaXplLFxyXG4gICAgcHVibGlzaFJlcGxheSxcclxuICAgIHJlZkNvdW50LFxyXG4gICAgZXhoYXVzdE1hcCxcclxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gICAgc3RhcnRXaXRoLFxyXG4gICAgZGVib3VuY2VUaW1lLFxyXG4gICAgZmlsdGVyICAgIFxyXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBBYmJyZXZhdGlvbkRldmljZVNpemUsXHJcbiAgICBMb2dpblJlc3VsdCxcclxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBNb0ZvclJlcG9ydE1vZGVsLFxyXG4gICAgUGFnZURhdGFNb2RlbCxcclxuICAgIFBvcnRhbERhdGFNb2RlbCxcclxuICAgIFJlcG9ydE1vZGVsLFxyXG4gICAgVWx2UGFyYW1UeXBlXHJcbn0gZnJvbSAnLi4vYWJzdHJhY3QtY2xhc3Nlcy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL2xvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFyc2FBcGkgfSBmcm9tICcuLi9hYnN0cmFjdC1jbGFzc2VzL2JhcnNhLWFwaSc7XHJcbmltcG9ydCB7IEJhcnNhRGlhbG9nU2VydmljZSB9IGZyb20gJy4vYmFyc2EtZGlhbG9nLnNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEV4ZWN1dGVEeW5hbWljQ29tbWFuZCxcclxuICAgIGdldENvbXBvbmVudERlZmluZWQsXHJcbiAgICBnZXREZXZpY2VJc01vYmlsZSxcclxuICAgIGdldERldmljZUlzVGFibGV0LFxyXG4gICAgZ2V0SGVhZGVyVmFsdWUsXHJcbiAgICBnZXRVbmlxdWVJZFxyXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IFBvcnRhbFBhZ2VSZXNvbHZlciB9IGZyb20gJy4uL3Jlc29sdmVycy9wb3J0YWwtcGFnZS5yZXNvbHZlcic7XHJcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJy4uL2F1dGgtZ3VhcmQnO1xyXG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4vZHluYW1pYy1jb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuZGVjbGFyZSBsZXQgQWpheEhlbHBlcjogYW55O1xyXG5kZWNsYXJlIGxldCBBamF4SGVscGVyMjogYW55O1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb3J0YWxTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvZmZzZXRUb3AgPSAwO1xyXG5cclxuICAgIGxvZ2luTG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICAgIGxvYWRlZCA9IGZhbHNlO1xyXG4gICAgZm9ybVBhbmVsczogYW55ID0ge307XHJcbiAgICBjYWNoZWRJbWFnZXM6IGFueSA9IHt9O1xyXG4gICAgZGF0ZVRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XHJcbiAgICBkZWZhdWx0Um91dGU6IHN0cmluZztcclxuICAgIGNhY2hlZFBhZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbD4gfSA9IHt9O1xyXG4gICAgcGFnZXM6IFBhZ2VEYXRhTW9kZWxbXSA9IFtdO1xyXG4gICAgcnRsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuICAgIHVzZXJMb2dnZWRJbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBkaWN0aW9uYXJ5OiB7IFtrZXk6IHN0cmluZ106IEJlaGF2aW9yU3ViamVjdDxhbnk+IH0gPSB7fTtcclxuICAgIHBvcnRhbERhdGFTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBvcnRhbERhdGFNb2RlbCB8IG51bGw+KG51bGwpO1xyXG4gICAgcG9ydGFsU2V0dGluZ3MkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+O1xyXG4gICAgcG9ydGFsRGF0YSQ6IE9ic2VydmFibGU8UG9ydGFsRGF0YU1vZGVsIHwgbnVsbD47XHJcbiAgICBkZXZpY2VTaXplJDogT2JzZXJ2YWJsZTxBYmJyZXZhdGlvbkRldmljZVNpemU+O1xyXG4gICAgcnRsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIGRpclZhbHVlJDogT2JzZXJ2YWJsZTwncnRsJyB8ICdsdHInPjtcclxuICAgIHJvdXRlSW5pdGlhbGl6ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgb3BlbkZvcm0kID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIF9pc0Fub251bW91c1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgICBfcHVzaEFjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbm90aWZpY2F0aW9uVGFnOiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nOyBtb2lkOiBzdHJpbmc7IHRwaWQ6IHN0cmluZyB9IHwgbnVsbD4oXHJcbiAgICAgICAgbnVsbFxyXG4gICAgKTtcclxuICAgIHByaXZhdGUgX2RldmljZVNpemVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFiYnJldmF0aW9uRGV2aWNlU2l6ZT4odGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpKTtcclxuICAgIHByaXZhdGUgX2xvZ2dlZEluU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7ICAgIFxyXG4gICAgcHJpdmF0ZSByb3V0ZUluaXRpYWxpemVkU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwcml2YXRlIGRhdGVUZXh0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcclxuICAgIHByaXZhdGUgX25hdmlnYXRpb25TdGFydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5hdmlnYXRpb25TdGFydCB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfbmF2aWdhdGlvbkVuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5hdmlnYXRpb25FbmQgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX3VzZXJQb3J0YWxTZXR0aW5ncyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlY29yZDxzdHJpbmcsIE1ldGFvYmplY3REYXRhTW9kZWw+Pih7fSk7XHJcbiAgICBwcml2YXRlIF9jc3NVcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfY3NzVmFyaWFibGVVcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfY3NzQ3VzdG9tVXJsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX3NlYXJjaFRlcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcclxuICAgIHByaXZhdGUgX3dpbmRvd1Jlc2l6ZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZGV2aWNlTGFuZHNjYXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oIXdpbmRvdy5tYXRjaE1lZGlhKCcob3JpZW50YXRpb246IHBvcnRyYWl0KScpLm1hdGNoZXMpO1xyXG4gICAgcHJpdmF0ZSBfc3RhbmRhbG9uZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHdpbmRvdy5tYXRjaE1lZGlhKCcoZGlzcGxheS1tb2RlOiBzdGFuZGFsb25lKScpLm1hdGNoZXMpO1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRWaXNpYmlsaXR5Y2hhbmdlJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICBEZWZhdWx0UGFnZTogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGRjbTogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IEJhcnNhRGlhbG9nU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbXBpbGVyOiBDb21waWxlcixcclxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICAgICAgcHJpdmF0ZSBfbG9jYWxTdG9yYWdlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5faW5pdExhbmRzY2FwZSgpO1xyXG4gICAgICAgIHRoaXMuX2luaXRTdGFuZGFsb25lKCk7XHJcbiAgICAgICAgdGhpcy5faW5pdFZpc2liaWxpdHlDaGFuZ2UoKTtcclxuICAgICAgICB0aGlzLl9pbml0UHVzaEFjdGlvbnMoKTtcclxuICAgIH1cclxuICAgIGdldCBpc1J0bCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ydGxTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIGdldCB1c2VyTG9nZ2VkSW4oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ2dlZEluU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgcHVzaEFjdGlvbiQoKTogT2JzZXJ2YWJsZTx7IG5vdGlmaWNhdGlvblRhZzogc3RyaW5nOyBtb2lkOiBzdHJpbmc7IHRwaWQ6IHN0cmluZzsgYWN0aW9uOiBzdHJpbmcgfSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaEFjdGlvbiQuYXNPYnNlcnZhYmxlKCkucGlwZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGRvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNTdGFuZGFsb25lKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFuZGFsb25lJC5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHN0YW5kYWxvbmUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFuZGFsb25lJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBsYW5kc2NhcGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VMYW5kc2NhcGUkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHdpbmRvd1Jlc2l6ZSQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd1Jlc2l6ZSQuYXNPYnNlcnZhYmxlKCkucGlwZShkZWJvdW5jZVRpbWUoMzAwKSk7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9ydGFsRGF0YSgpOiBQb3J0YWxEYXRhTW9kZWwgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgc2VhcmNoVGVybSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGVybSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgY3NzVXJsJCgpOiBPYnNlcnZhYmxlPFNhZmVSZXNvdXJjZVVybCB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3NzVXJsU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcbiAgICB9XHJcbiAgICBnZXQgY3NzVmFyaWFibGVVcmwkKCk6IE9ic2VydmFibGU8U2FmZVJlc291cmNlVXJsIHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jc3NWYXJpYWJsZVVybFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNzc0N1c3RvbVVybCQoKTogT2JzZXJ2YWJsZTxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc0N1c3RvbVVybFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCB1c2VyUG9ydGFsU2V0dGluZ3MoKTogUmVjb3JkPHN0cmluZywgTWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgdXNlclBvcnRhbFNldHRpbmdzJCgpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIE1ldGFvYmplY3REYXRhTW9kZWw+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgZGV2aWNlU2l6ZSgpOiBBYmJyZXZhdGlvbkRldmljZVNpemUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VTaXplU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNBbm9ueW1vdXMkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBuYXZpZ2F0aW9uRW5kJCgpOiBPYnNlcnZhYmxlPE5hdmlnYXRpb25FbmQgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25FbmQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IG5hdmlnYXRpb25TdGFydCQoKTogT2JzZXJ2YWJsZTxOYXZpZ2F0aW9uU3RhcnQgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TdGFydCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWRNbyhpZDogc3RyaW5nLCB0eXBlZGVmSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5sb2FkUG9ydGFsUGFnZURhdGEoaWQsIHR5cGVkZWZJZCk7XHJcbiAgICB9XHJcbiAgICBwdXNoQWN0aW9uTmV4dChwdXNoQWN0aW9uOiB7IG5vdGlmaWNhdGlvblRhZzsgbW9pZDsgdHBpZDsgYWN0aW9uIH0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncHVzaEFjdGlvbicsIEpTT04uc3RyaW5naWZ5KHB1c2hBY3Rpb24pKTtcclxuICAgICAgICB0aGlzLl9wdXNoQWN0aW9uJC5uZXh0KHB1c2hBY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgc2V0U2VhcmNoVGVybSh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hUZXJtJC5uZXh0KHRlcm0pO1xyXG4gICAgfVxyXG4gICAgd2luZG93UmVzaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3dpbmRvd1Jlc2l6ZSQubmV4dCgpO1xyXG4gICAgfVxyXG4gICAgbmF2aWF0aW9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvbkVuZCQubmV4dChldmVudCk7XHJcbiAgICB9XHJcbiAgICBuYXZpYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblN0YXJ0JC5uZXh0KGV2ZW50KTtcclxuICAgIH1cclxuICAgIHNldFVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3M6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAodXNlclBvcnRhbFNldHRpbmdzLiRUeXBlRGVmTmFtZSkge1xyXG4gICAgICAgICAgICB2YWx1ZVt1c2VyUG9ydGFsU2V0dGluZ3MuJFR5cGVEZWZOYW1lXSA9IHVzZXJQb3J0YWxTZXR0aW5ncztcclxuICAgICAgICAgICAgdGhpcy5fdXNlclBvcnRhbFNldHRpbmdzJC5uZXh0KHsgLi4udmFsdWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0Q3NzVXJsVGhlbWUodGhlbWVVcmw6IFNhZmVSZXNvdXJjZVVybCwgY3NzVmFyaWFibGVVcmw/OiBTYWZlUmVzb3VyY2VVcmwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jc3NVcmxTb3VyY2UubmV4dCh0aGVtZVVybCk7XHJcbiAgICAgICAgdGhpcy5fY3NzQ3VzdG9tVXJsU291cmNlLm5leHQodGhlbWVVcmwpO1xyXG4gICAgICAgIGlmIChjc3NWYXJpYWJsZVVybCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jc3NWYXJpYWJsZVVybFNvdXJjZS5uZXh0KGNzc1ZhcmlhYmxlVXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGF0YShrZXksIGRhdGEpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XS5uZXh0KGRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuZGljdGlvbmFyeVtrZXldLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChvbGRWYWwgIT09IGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldLm5leHQoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXREYXRhKGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KGRlZmF1bHRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnlba2V5XS5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldERhdGFTeW5jPFQ+KGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogVCB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy5kaWN0aW9uYXJ5W2tleV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyeVtrZXldLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVGb3JSZXBvcnQobmF2SXRlbSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLlVsLlVsdk1haW5DdHJsci5DcmVhdGVGb3JSZXBvcnQoe30sIG5hdkl0ZW0sIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZW5kZXJVbHZNYWluVWkoXHJcbiAgICAgICAgbmF2SXRlbSxcclxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIGlzUmVwb3J0UGFnZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZvclJlcG9ydChuYXZJdGVtKS5waXBlKFxyXG4gICAgICAgICAgICBleGhhdXN0TWFwKCh1bHZNYWluQ3RybHIpID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFVsdk1haW5VaUNvbXBvbmVudCh1bHZNYWluQ3RybHIuQWRhcHRlci5Db250cm9sLCBpbmplY3RvciwgaXNSZXBvcnRQYWdlKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcCgodWx2TWFuaVVpQ29tcG9uZW50KSA9PiB2Y3IuaW5zZXJ0KHVsdk1hbmlVaUNvbXBvbmVudC5ob3N0VmlldykpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB1bHZNYWluQ3RybHIpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgZ2V0VWx2TWFpblVpQ29tcG9uZW50KGN1c3RvbVVsdk1haW5VaSwgaW5qZWN0b3I6IEluamVjdG9yLCBpc1JlcG9ydFBhZ2UpOiBPYnNlcnZhYmxlPENvbXBvbmVudFJlZjxhbnk+PiB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tVWlTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY3VzdG9tVWx2TWFpblVpLlNldHRpbmcsICdDdXN0b21VaScsIG51bGwpO1xyXG4gICAgICAgIGNvbnN0IHsgbW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IgfSA9IGdldENvbXBvbmVudERlZmluZWQoXHJcbiAgICAgICAgICAgIGN1c3RvbVVsdk1haW5VaSxcclxuICAgICAgICAgICAgY3VzdG9tVWlTZXR0aW5nXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnQobW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IsIGluamVjdG9yKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKGNvbXBvbmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnQuaW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pZCA9IGN1c3RvbVVsdk1haW5VaS5pZDtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNvbnRleHQgPSBjdXN0b21VbHZNYWluVWk7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pc1JlcG9ydFBhZ2UgPSBpc1JlcG9ydFBhZ2U7XHJcbiAgICAgICAgICAgICAgICBjdXN0b21VbHZNYWluVWkuY29udHJvbFVpID0gY29tcG9uZW50SW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGV2aWNlU2l6ZSQgPSB0aGlzLl9kZXZpY2VTaXplU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMucG9ydGFsRGF0YSQgPSB0aGlzLnBvcnRhbERhdGFTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5ydGwkID0gdGhpcy5ydGxTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy51c2VyTG9nZ2VkSW4kID0gdGhpcy5fbG9nZ2VkSW5Tb3VyY2VcclxuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcCgoaXNMb2dnZWRJbikgPT4gaXNMb2dnZWRJbiAmJiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSBmYWxzZSkpO1xyXG4gICAgICAgIHRoaXMuZGlyVmFsdWUkID0gdGhpcy5ydGwkLnBpcGUobWFwKChpc1J0bCkgPT4gKGlzUnRsID8gJ3J0bCcgOiAnbHRyJykpKTtcclxuICAgICAgICB0aGlzLnJvdXRlSW5pdGlhbGl6ZWQkID0gdGhpcy5yb3V0ZUluaXRpYWxpemVkU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcbiAgICAgICAgdGhpcy5fc3RhbmRhbG9uZSQuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3N0YW5kYWxvbmUnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbm9TdGFuZGFsb25lJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGV2aWNlTGFuZHNjYXBlJC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKGMpID0+IHtcclxuICAgICAgICAgICAgaWYgKGMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbGFuZHNjYXBlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZXZpY2VTaXplU291cmNlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYyA9PT0gJ3MnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3NtYWxsZGV2aWNlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGVUZXh0JCA9IHRoaXMuZGF0ZVRleHRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5wb3J0YWxTZXR0aW5ncyQgPSB0aGlzLnBvcnRhbERhdGFTb3VyY2VcclxuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcCgocG9ydGFsRGF0YSkgPT4gKHBvcnRhbERhdGEgPyBwb3J0YWxEYXRhLlBvcnRhbFNldHRpbmdzIDogKHt9IGFzIGFueSkpKSk7XHJcbiAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXHJcbiAgICAgICAgICAgIC5waXBlKHN0YXJ0V2l0aChudWxsKSwgZGVib3VuY2VUaW1lKDEwMDApKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aW5kb3dSZXNpemUkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldERldmljZVNpemUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2V0RGV2aWNlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkZXZpY2VTaXplID0gdGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpO1xyXG4gICAgICAgIHRoaXMuX2RldmljZVNpemVTb3VyY2UubmV4dChkZXZpY2VTaXplKTtcclxuICAgIH1cclxuICAgIF9pbml0YWxpemVEZXZpY2VTaXplKCk6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSB7XHJcbiAgICAgICAgY29uc3QgX2lzbW9iaWxlID0gZ2V0RGV2aWNlSXNNb2JpbGUoKTtcclxuICAgICAgICBpZiAoX2lzbW9iaWxlKSB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LklzTW9iaWxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgX2lzVGFibGV0ID0gZ2V0RGV2aWNlSXNUYWJsZXQoKTtcclxuICAgICAgICBsZXQgX3dpbmRvV1NpemU6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSA9ICdzJztcclxuICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNjAwKSB7XHJcbiAgICAgICAgICAgIF93aW5kb1dTaXplID0gJ3MnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiA2MDAgJiYgd2luZG93LmlubmVyV2lkdGggPD0gOTkyKSB7XHJcbiAgICAgICAgICAgIF93aW5kb1dTaXplID0gJ20nO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiA5OTIgJiYgd2luZG93LmlubmVyV2lkdGggPD0gMTIwMCkge1xyXG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdsJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICd4bCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChfaXNtb2JpbGUgJiYgX3dpbmRvV1NpemUgIT09ICdsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ3hsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ20nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAncyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChfaXNUYWJsZXQgJiYgX3dpbmRvV1NpemUgIT09ICdsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ3hsJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ20nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3dpbmRvV1NpemU7XHJcbiAgICB9XHJcbiAgICBjb21waWxlTW9kdWxlKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSk6IE9ic2VydmFibGU8TmdNb2R1bGVGYWN0b3J5PGFueT4+IHtcclxuICAgICAgICBjb25zdCBtb2R1bGUkID0gdGhpcy5nZXRNb2R1bGUoZGVwZW5kZW5jeSk7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZSQucGlwZShcclxuICAgICAgICAgICAgY29uY2F0TWFwKChtb2R1bGVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVGYWN0b3J5ID0gdGhpcy5nZXROZ01vZHVsZUZhY3RvcnkobW9kdWxlcywgZGVwZW5kZW5jeS5uYW1lKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZihtb2R1bGVGYWN0b3J5KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgZ2V0TW9kdWxlKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgeyBuYW1lLCBrZWJhYk5hbWUsIHVtZCwgZXhwb3J0QXMgfSA9IGRlcGVuZGVuY3k7XHJcbiAgICAgICAgY29uc3QgYmFzZSA9IGAvYXNzZXRzL21vZHVsZXMvJHtrZWJhYk5hbWV9L2J1bmRsZXNgO1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLmFiYztcclxuICAgICAgICBjb25zdCBwYXRoID0gYCR7YmFzZX0vJHtrZWJhYk5hbWV9LnVtZC5qcz90PSR7ZGF0ZX1gO1xyXG4gICAgICAgIHJldHVybiBvZih0cnVlKS5waXBlKFxyXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IHRoaXMuZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kLCBleHBvcnRBcywgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihtb2R1bGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRKcyQocGF0aCkucGlwZShtYXAoKCkgPT4gdGhpcy5nZXRSZWdpc3RlcmVkTW9kdWxlcyh1bWQsIGV4cG9ydEFzLCBuYW1lKSkpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWVPbk9iamVjdChwYXRoLCBpbmRleCwgbW9kdWxlcywgb2JqZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc3BsaXRlZCA9IHBhdGguc3BsaXQoJy4nKTtcclxuICAgICAgICBjb25zdCBwcm9wID0gc3BsaXRlZFtpbmRleF07XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbcHJvcF0gPT09IHR5cGVvZiB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb2JqZWN0W3Byb3BdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gc3BsaXRlZC5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIG9iamVjdFtwcm9wXSA9IG1vZHVsZXM7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZU9uT2JqZWN0KHBhdGgsIGluZGV4ICsgMSwgbW9kdWxlcywgb2JqZWN0W3Byb3BdKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnQoXHJcbiAgICAgICAgbW9kdWxlTmFtZTogc3RyaW5nLFxyXG4gICAgICAgIG1vZHVsZVBhdGg6IHN0cmluZyxcclxuICAgICAgICBjb21wb25lbnROYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgc2VsZWN0b3I6IHN0cmluZyxcclxuICAgICAgICBwYXJlbnRJbmplY3RvcjogSW5qZWN0b3JcclxuICAgICk6IE9ic2VydmFibGU8Q29tcG9uZW50UmVmPGFueT4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kY20uZ2V0Q29tcG9uZW50QnlTZWxlY3RvcihzZWxlY3RvciwgbW9kdWxlTmFtZSwgcGFyZW50SW5qZWN0b3IpO1xyXG4gICAgfVxyXG4gICAgbG9hZEpzJChwYXRoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCBwYXRoKTtcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBSZXBvcnRFeGVjdXRlQnlJZChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNb0ZvclJlcG9ydE1vZGVsPiB7XHJcbiAgICAgICAgY29uc3QgdWx2UGFyYW1zID0gdGhpcy5fZ2V0VWx2UGFyYW1zQnkoJycsIHJlcG9ydElkKTtcclxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLl9yZXBvcnRFeGVjdXRlUHJvbWlzZSh1bHZQYXJhbXMpKTtcclxuICAgIH1cclxuICAgIFJlcG9ydEV4ZWN1dGUocmVwb3J0TmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNb0ZvclJlcG9ydE1vZGVsPiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5SZXBvcnRFeGVjdXRlUHJvbWlzZShyZXBvcnROYW1lKSk7XHJcbiAgICB9XHJcbiAgICBSZXBvcnRFeGVjdXRlUHJvbWlzZShyZXBvcnROYW1lOiBzdHJpbmcpOiBQcm9taXNlPE1vRm9yUmVwb3J0TW9kZWw+IHtcclxuICAgICAgICBjb25zdCB1bHZQYXJhbXMgPSB0aGlzLl9nZXRVbHZQYXJhbXNCeShyZXBvcnROYW1lKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVwb3J0RXhlY3V0ZVByb21pc2UodWx2UGFyYW1zKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2dldFVsdlBhcmFtc0J5KHJlcG9ydE5hbWU6IHN0cmluZywgcmVwb3J0SWQ/OiBzdHJpbmcpOiBVbHZQYXJhbVR5cGUge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIEZsYWdzOiB7XHJcbiAgICAgICAgICAgICAgICBEYXRhOiAnVHJ1ZScsXHJcbiAgICAgICAgICAgICAgICBFeHRyYTogJ0ZhbHNlJyxcclxuICAgICAgICAgICAgICAgIFNlYXJjaDogJ0ZhbHNlJyxcclxuICAgICAgICAgICAgICAgIFZpZXc6ICdGYWxzZSdcclxuICAgICAgICAgICAgICAgIC8vIEdlbmVyYWw6XCJGYWxzZVwiLCAvLyB1bHZtYWluY3RybCBkb2VzIG5vdCBjcmFldGUgdWkgY29udHJvbCByYWlzZSBlcnJvclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBSZXBvcnROYW1lOiByZXBvcnROYW1lLFxyXG4gICAgICAgICAgICBSZXBvcnRJZDogcmVwb3J0SWQsXHJcbiAgICAgICAgICAgIFVzYWdlRW51bTogJ1N5c3RlbUNvbnRhaW5lcidcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlcG9ydEV4ZWN1dGVQcm9taXNlKHVsdlBhcmFtczogVWx2UGFyYW1UeXBlKTogUHJvbWlzZTxNb0ZvclJlcG9ydE1vZGVsPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPE1vRm9yUmVwb3J0TW9kZWw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuQncuRXhlY3V0ZVJlcG9ydChcclxuICAgICAgICAgICAgICAgIHsgdWx2UGFyYW1zIH0sXHJcbiAgICAgICAgICAgICAgICAocmVzdWx0OiBSZXBvcnRNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0LkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRGb3JtUGFuZWxDdHJscihpZCwgZm9ybXBhbmVsQ3RybHI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9ybVBhbmVsc1tpZF0gPSBmb3JtcGFuZWxDdHJscjtcclxuICAgIH1cclxuICAgIHNldFVzZXJMb2dpblN0YXR1cyhzdGF0dXM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sb2dnZWRJblNvdXJjZS5uZXh0KHN0YXR1cyk7XHJcbiAgICB9XHJcbiAgICBleHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghcG9ydGFsRGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvcnRhbERhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKHBhZ2VEYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlRGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBleHRyYWN0QWxsUGFnZXNfT2xkKHBvcnRhbERhdGE6IFBvcnRhbERhdGFNb2RlbCB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXBvcnRhbERhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fcm91dGVyLmNvbmZpZztcclxuICAgICAgICBwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChwYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gcGFnZURhdGEuUm91dGUucmVwbGFjZSgnLycsICcnKTtcclxuICAgICAgICAgICAgY29uZmlnLnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBwYWdlRGF0YS5IYXNBdXRob3JpemUsIHBhZ2VEYXRhLlBhZ2VNb2R1bGU/LiRDYXB0aW9uLCBudWxsLCBudWxsKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAocGFnZURhdGEuSXNEZWZhdWx0Um91dGUgfHwgcGFnZURhdGEuSXNEZWZhdWx0Um91dGUgPT09ICdUcnVlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Um91dGUgPSBwYXRoO1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLnB1c2godGhpcy5jcmVhdGVSb3V0ZShwYWdlRGF0YSwgJycsIGZhbHNlLCBwb3J0YWxEYXRhLlBhZ2VNb2R1bGU/LiRDYXB0aW9uLCBwYXRoLCBudWxsKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlRGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xvY2F0aW9uLnBhdGgoKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFt0aGlzLmRlZmF1bHRSb3V0ZV0pO1xyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMucm91dGVJbml0aWFsaXplZCgpO1xyXG4gICAgfVxyXG4gICAgc3NvTG9naW4oKTogdm9pZCB7XHJcbiAgICAgICAgQWpheEhlbHBlci5BamF4UmVxdWVzdChcclxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dpbicsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCdlcnJvciBpbiBzc28gbG9naW4uJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgc3NvTG9nb3V0KCk6IHZvaWQge1xyXG4gICAgICAgIEFqYXhIZWxwZXIuQWpheFJlcXVlc3QoXHJcbiAgICAgICAgICAgICcvYXBpL2Jhc2Uvc3NvbG9nb3V0JyxcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYWxlcnQoJ2Vycm9yIGluIHNzbyBsb2dvdXQuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgYWRkQ2hpbGRQYWdlcyhwYWdlRGF0YTogUGFnZURhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFnZXMucHVzaChwYWdlRGF0YSk7XHJcbiAgICAgICAgaWYgKCFwYWdlRGF0YS5DaGlsZFBhZ2VMaXN0Py5Nb0RhdGFMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYWdlRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgoY2hpbGRQYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhjaGlsZFBhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIGNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBoYXNBdXRob3JpemVkLCBtb2R1bGVOYW1lLCByZWRpcmVjdFRvLCBpc0R5bmFtaWNSb3V0ZSk6IFJvdXRlIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBjcmVhdGVSb3V0ZTIoXHJcbiAgICAgICAgcGFnZURhdGEsXHJcbiAgICAgICAgcGF0aCxcclxuICAgICAgICBoYXNBdXRob3JpemVkLFxyXG4gICAgICAgIG1vZHVsZU5hbWUsXHJcbiAgICAgICAgcmVkaXJlY3RUbzogc3RyaW5nIHwgbnVsbCA9IG51bGwsXHJcbiAgICAgICAgaXNEeW5hbWljUm91dGU6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogUm91dGUge1xyXG4gICAgICAgIGxldCBtb2R1bGVQYXRoOiBzdHJpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5HZXRLZWJhYkNhc2UobW9kdWxlTmFtZSk7XHJcbiAgICAgICAgY29uc3QgdW1kID0gbW9kdWxlTmFtZTtcclxuICAgICAgICBtb2R1bGVQYXRoID0gbW9kdWxlUGF0aC5zdWJzdHJpbmcoMSwgbW9kdWxlUGF0aC5sZW5ndGgpO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNSb3V0ZTogUm91dGUgPSB7fTtcclxuICAgICAgICBkeW5hbWljUm91dGUucGF0aCA9IHBhdGg7XHJcbiAgICAgICAgZHluYW1pY1JvdXRlLmRhdGEgPSB7IHBhZ2VEYXRhIH07XHJcbiAgICAgICAgaWYgKCFpc0R5bmFtaWNSb3V0ZSkge1xyXG4gICAgICAgICAgICBkeW5hbWljUm91dGUucmVzb2x2ZSA9IHtcclxuICAgICAgICAgICAgICAgIHBhZ2VEYXRhOiBQb3J0YWxQYWdlUmVzb2x2ZXJcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhdGggPT09ICcnKSB7XHJcbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5wYXRoTWF0Y2ggPSAnZnVsbCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWRpcmVjdFRvKSB7XHJcbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5yZWRpcmVjdFRvID0gcmVkaXJlY3RUbztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaGFzQXV0aG9yaXplZCkge1xyXG4gICAgICAgICAgICAgICAgZHluYW1pY1JvdXRlLmNhbkFjdGl2YXRlID0gW0F1dGhHdWFyZF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZHluYW1pY1JvdXRlLmxvYWRDaGlsZHJlbiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llczogTGlicmFyeURlcGVuZWN5W10gPSBKU09OLnBhcnNlKHBhZ2VEYXRhLkRlcGVuZGVuY2llcyk7IC8vIGV2YWwocGFnZURhdGEuRGVwZW5kZW5jaWVzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VMaWJyYXJ5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAga2ViYWJOYW1lOiBtb2R1bGVQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHVtZCxcclxuICAgICAgICAgICAgICAgICAgICBleHBvcnRBczogW21vZHVsZU5hbWVdXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzJCA9IGZyb20oZGVwZW5kZW5jaWVzKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoZGVwZW5kZW5jeTogTGlicmFyeURlcGVuZWN5KSA9PiB0aGlzLmNvbXBpbGVNb2R1bGUoZGVwZW5kZW5jeSkpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkZXBlbmRlbmNpZXMkXSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5nZXRNb2R1bGUocGFnZUxpYnJhcnkpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAoKG1vZHVsZXMpID0+IG1vZHVsZXNbbW9kdWxlTmFtZSArICdNb2R1bGUnXSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucm91dGVJbml0aWFsaXplZCgpKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkeW5hbWljUm91dGU7XHJcbiAgICB9XHJcbiAgICByb3V0ZUluaXRpYWxpemVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucm91dGVJbml0aWFsaXplZFNvdXJjZS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGxvZ2luQnlBbm9ueW1vdXMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgdGhpcy5sb2dpbkxvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmxvZ2luUG9ydGFsKCkucGlwZShcclxuICAgICAgICAgICAgbWFwKChyZXN1bHQ6IExvZ2luUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKEJhcnNhQXBpLkxvZ2luQWN0aW9uLnRva2VuMlN0b3JhZ2VLZXksIHJlc3VsdC5kYXRhLnN0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9naW5Mb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0UGFnZURhdGEodXJsOiBzdHJpbmcsIGlzUm9vdDogYm9vbGVhbik6IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbCB8IG51bGw+IHtcclxuICAgICAgICBpZiAoaXNSb290IHx8IHVybCA9PT0gJycgfHwgdXJsID09PSAnLycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9ydGFsRGF0YSQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgdXJsLmluZGV4T2YoJz8nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGFnZURhdGEgPSB0aGlzLmZpbmRQYWdlQnlSb3V0ZSh1cmwpO1xyXG5cclxuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0gPSB0aGlzLmFwaVNlcnZpY2VcclxuICAgICAgICAgICAgLmxvYWRQb3J0YWxQYWdlRGF0YShwYWdlRGF0YT8uSWQsIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5nZXRWYWx1ZSgpPy5DaGlsZFBhZ2VMaXN0LlR5cGVEZWZJZClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHBhZ2VNbykgPT4gcGFnZU1vLkRhdGEuTW8pLFxyXG4gICAgICAgICAgICAgICAgdGFwKChwYWdlTW8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VNbyk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXHJcbiAgICAgICAgICAgICAgICByZWZDb3VudCgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxyXG4gICAgICAgIC8vICAgZmlsdGVyKChwb3J0YWxEYXRhKSA9PiBwb3J0YWxEYXRhICE9IG51bGwpLFxyXG4gICAgICAgIC8vICAgbWFwKChwb3J0YWxEYXRhKSA9PiApLFxyXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgIC8vICAgICByZXR1cm5cclxuICAgICAgICAvLyAgIH0pLFxyXG5cclxuICAgICAgICAvLyAgIHRhcChwYWdlRGF0YT0+e30pXHJcbiAgICAgICAgLy8gKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHJlc29sdmVEYXRhKHJvdXRlUGFnZURhdGEpOiBPYnNlcnZhYmxlPFBhZ2VEYXRhTW9kZWwgfCBudWxsPiB7XHJcbiAgICAgICAgLy8gY29uc3QgcGFnZURhdGEgPSB0aGlzLnBhZ2VzLmZpbmQoKGMpID0+IGMuUm91dGUgPT09IHJvdXRlUGFnZURhdGEuUm91dGUgJiYgYy5Nb2R1bGUgPT09IHJvdXRlUGFnZURhdGEuTW9kdWxlKTtcclxuICAgICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZXMuZmluZCgoYykgPT4gYy5Sb3V0ZSA9PT0gcm91dGVQYWdlRGF0YS5Sb3V0ZSk7XHJcbiAgICAgICAgaWYgKCFwYWdlRGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gcGFnZURhdGEuSWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVtpZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGVkUGFnZURhdGFbaWRdID0gdGhpcy5hcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5sb2FkUG9ydGFsUGFnZURhdGEoaWQsIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5nZXRWYWx1ZSgpPy5DaGlsZFBhZ2VMaXN0LlR5cGVEZWZJZClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHBhZ2VNbykgPT4gcGFnZU1vLkRhdGEuTW8pLFxyXG4gICAgICAgICAgICAgICAgdGFwKChwYWdlTW8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VNbyk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXHJcbiAgICAgICAgICAgICAgICByZWZDb3VudCgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxyXG4gICAgICAgIC8vICAgZmlsdGVyKChwb3J0YWxEYXRhKSA9PiBwb3J0YWxEYXRhICE9IG51bGwpLFxyXG4gICAgICAgIC8vICAgbWFwKChwb3J0YWxEYXRhKSA9PiApLFxyXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgIC8vICAgICByZXR1cm5cclxuICAgICAgICAvLyAgIH0pLFxyXG5cclxuICAgICAgICAvLyAgIHRhcChwYWdlRGF0YT0+e30pXHJcbiAgICAgICAgLy8gKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVtpZF07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ2hpbGRSb3V0ZShwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhZGRDaGlsZFJvdXRlX09sZChwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIUNoaWxkUGFnZUxpc3Q/Lk1vRGF0YUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9yb3V0ZXIuY29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYWdlTW8uUm91dGUucmVwbGFjZSgnLycsICcnKTtcclxuICAgICAgICBjb25zdCBwYXJlbnRSb3V0ZSA9IGNvbmZpZy5maW5kKChjKSA9PiAoYy5wYXRoID0gcGFyZW50UGF0aCkpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiBSb3V0ZVtdID0gW107XHJcbiAgICAgICAgaWYgKHBhcmVudFJvdXRlKSB7XHJcbiAgICAgICAgICAgIENoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGNoaWxkLlJvdXRlLnJlcGxhY2UoJy8nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJvdXRlID0gdGhpcy5jcmVhdGVSb3V0ZShcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZCxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLkhhc0F1dGhvcml6ZSxcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5QYWdlTW9kdWxlPy4kQ2FwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkcm91dGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gZGVidWdnZXI7XHJcblxyXG4gICAgICAgICAgICAocGFyZW50Um91dGUgYXMgYW55KS5fbG9hZGVkQ29uZmlnLnJvdXRlc1swXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YV9PbGQxKCk6IE9ic2VydmFibGU8UG9ydGFsRGF0YU1vZGVsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5sb2FkUG9ydGFsKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsSWQsIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsVHlwZURlZklkKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKHBvcnRhbFNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRhbERhdGEgPSBwb3J0YWxTZXR0aW5nLkRhdGEuTW87XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5uZXh0KHBvcnRhbERhdGEpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IGZyb20odGhpcy5sb2FkU3lzdGVtKCkpKSxcclxuICAgICAgICAgICAgdGFwKChhbGwpID0+IHRoaXMuZGF0ZVRleHRTb3VyY2UubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkRhdGVUZXh0KSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGxvYWRQb3J0YWxEYXRhU3luY19PbGQyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmcgPSB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbFN5bmMoXHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsSWQsXHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsVHlwZURlZklkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBwb3J0YWxEYXRhID0gcG9ydGFsU2V0dGluZy5EYXRhLk1vO1xyXG5cclxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3J0YWxEYXRhU291cmNlLm5leHQocG9ydGFsRGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMubG9hZFN5c3RlbSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9nZXREZWZhdWx0UGFnZShjOiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKCFjIHx8ICFjLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHggPSBjLmZpbmQoKGMpID0+IGMuSXNEZWZhdWx0Um91dGUgPT09ICdUcnVlJyk7XHJcbiAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB4MjogYW55ID0gbnVsbDtcclxuICAgICAgICBjLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHgyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgeDIgPSB0aGlzLl9nZXREZWZhdWx0UGFnZShlbGVtZW50LkNoaWxkUGFnZUxpc3Q/Lk1vRGF0YUxpc3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB4MjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YVN5bmMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmdTdHIgPSBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZCgnR2V0UG9ydGFsJywgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxJZCk7XHJcbiAgICAgICAgY29uc3QgcG9ydGFsU2V0dGluZyA9IEJhcnNhQXBpLkV4dC5kZWNvZGUocG9ydGFsU2V0dGluZ1N0cik7XHJcbiAgICAgICAgY29uc3QgcG9ydGFsRGF0YTogUGFnZURhdGFNb2RlbCA9IHBvcnRhbFNldHRpbmc7XHJcbiAgICAgICAgaWYgKHBvcnRhbERhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFBhZ2UgPSB0aGlzLl9nZXREZWZhdWx0UGFnZShwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdCk7XHJcbiAgICAgICAgICAgIHRoaXMuRGVmYXVsdFBhZ2UgPSBkZWZhdWx0UGFnZTtcclxuICAgICAgICAgICAgbGV0IGNvbmZpZ1JvdXRlID0gdGhpcy5fcm91dGVyLmNvbmZpZztcclxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlUGFnZWQ6IFJvdXRlW10gPSBbXTtcclxuICAgICAgICAgICAgY29uZmlnUm91dGUuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gJy8nICsgYy5wYXRoO1xyXG4gICAgICAgICAgICAgICAgaWYgKGMucGF0aCAhPT0gJycgJiYgcG9ydGFsRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZmluZEluZGV4KChkKSA9PiBkLlJvdXRlID09PSByb3V0ZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUGFnZWQucHVzaChjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhUb1JlbW92ZSA9IHJlbW92ZVBhZ2VkLm1hcCgoZCkgPT4gZC5wYXRoKTtcclxuICAgICAgICAgICAgY29uZmlnUm91dGUgPSBjb25maWdSb3V0ZS5maWx0ZXIoKGMpID0+IHBhdGhUb1JlbW92ZS5pbmRleE9mKGMucGF0aCkgPT09IC0xKTtcclxuICAgICAgICAgICAgaWYgKGRlZmF1bHRQYWdlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYWdlUm91dGUgPSBkZWZhdWx0UGFnZS5Sb3V0ZS5yZXBsYWNlKCcvJywgJycpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFBhdGggPSBjb25maWdSb3V0ZS5maW5kKChjKSA9PiBjLnBhdGggPT09ICcnKTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRQYXRoICYmIChkZWZhdWx0UGF0aC5yZWRpcmVjdFRvID0gZGVmYXVsdFBhZ2VSb3V0ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25maWdSb3V0ZS5wdXNoKHsgcGF0aDogJyoqJywgcmVkaXJlY3RUbzogZGVmYXVsdFBhZ2VSb3V0ZSB9KTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IG5vdEZvdW5kUGF0aCA9IGNvbmZpZ1JvdXRlLmZpbmQoKGMpID0+IGMucGF0aCA9PT0gJyoqJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBub3RGb3VuZFBhdGggJiYgKG5vdEZvdW5kUGF0aC5yZWRpcmVjdFRvID0gZGVmYXVsdFBhZ2UuUm91dGUucmVwbGFjZSgnLycsICcnKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZ1JvdXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhIGFzIFBvcnRhbERhdGFNb2RlbCk7XHJcblxyXG4gICAgICAgIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5uZXh0KHBvcnRhbERhdGEgYXMgUG9ydGFsRGF0YU1vZGVsKTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRlVGV4dFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuRGF0ZVRleHQpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFNob3dGb3JtKGU6IHsgbW86IE1ldGFvYmplY3REYXRhTW9kZWw7IG5hbWE6IHN0cmluZzsgYWZ0ZXJSZWFkeT86IChlOiBhbnkpID0+IHZvaWQgfSk6IHZvaWQge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LkZvcm0uU2hvdyh7XHJcbiAgICAgICAgICAgIE1vOiBlLm1vLFxyXG4gICAgICAgICAgICBNb0NvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIFZpZXdOYW1lOiBlLm5hbWFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRXZlbnRIYW5kbGVyczoge1xyXG4gICAgICAgICAgICAgICAgQWZ0ZXJSZWFkeTogZnVuY3Rpb24gKHNlbmRlciwgZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2RvIHNvbWV0aGluZyBoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgZS5hZnRlclJlYWR5Py4oZWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGxvZ2luUm91dGUkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9ydGFsRGF0YSQucGlwZShcclxuICAgICAgICAgICAgbWFwKChwb3J0YWxEYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dpblBhZ2UgPSBwb3J0YWxEYXRhPy5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZmluZCgoYykgPT4gYy5Jc0xvZ2luUm91dGUgPT09ICdUcnVlJyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9naW5QYWdlPy5Sb3V0ZSB8fCAnbG9naW4nO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgUnVuQmxNZXRob2RBc3luYzxUPihtZXRob2ROYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgICAgICBNZXRob2Q6IG1ldGhvZE5hbWUsXHJcbiAgICAgICAgICAgICAgICBTdWNjZXNzRm46IChkYXRhOiBUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBGYWlsRm46IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgRXhlY3V0ZU5vdGlmaWNhdGlvbkFjdGlvbihpZDogc3RyaW5nLCBhY3Rpb25UaXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtpZCwgYWN0aW9uVGl0bGVdLFxyXG4gICAgICAgICAgICBNZXRob2Q6ICdFeGVjdXRlTm90aWZpY2F0aW9uQWN0aW9uJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoZToge1xyXG4gICAgICAgICAgICAgICAgTW86IE1ldGFvYmplY3REYXRhTW9kZWw7XHJcbiAgICAgICAgICAgICAgICBEeW5hbWljQ29tbWFuZElkOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBTaG93Rm9ybVNldHRpbmc6IHsgTW9JZDogc3RyaW5nOyBWaWV3TmFtZTogc3RyaW5nIH07XHJcbiAgICAgICAgICAgIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVB1c2hBY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIGlmIChlLkR5bmFtaWNDb21tYW5kSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBFeGVjdXRlRHluYW1pY0NvbW1hbmQoeyBJZDogZS5EeW5hbWljQ29tbWFuZElkIH0sIGUuTW8pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLlNob3dGb3JtU2V0dGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgTW9JZCwgVmlld05hbWUgfSA9IGUuU2hvd0Zvcm1TZXR0aW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gQmFyc2FBcGkuQncuRm9ybS5TaG93KHsgTW9JZCwgTW9Db250ZXh0OiB7IFZpZXdOYW1lIH0gfSksIDUwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVB1c2hBY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGxvYWRVc2VyUG9ydGFsU2V0dGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdWx2UGFyYW1zID0ge1xyXG4gICAgICAgICAgICBGbGFnczoge1xyXG4gICAgICAgICAgICAgICAgRGF0YTogJ1RydWUnLFxyXG4gICAgICAgICAgICAgICAgRXh0cmE6ICdGYWxzZScsXHJcbiAgICAgICAgICAgICAgICBTZWFyY2g6ICdGYWxzZScsXHJcbiAgICAgICAgICAgICAgICBWaWV3OiAnRmFsc2UnXHJcbiAgICAgICAgICAgICAgICAvLyBHZW5lcmFsOlwiRmFsc2VcIiwgLy8gdWx2bWFpbmN0cmwgZG9lcyBub3QgY3JhZXRlIHVpIGNvbnRyb2wgcmFpc2UgZXJyb3JcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgUmVwb3J0TmFtZTogJ1/YqtmG2LjZitmF2KfYql/Zvtin2YrZh1/ZvtmI2LHYqtin2YQnLFxyXG4gICAgICAgICAgICBVc2FnZUVudW06ICdTeXN0ZW1Db250YWluZXInXHJcbiAgICAgICAgfTtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5FeGVjdXRlUmVwb3J0KFxyXG4gICAgICAgICAgICB7IHVsdlBhcmFtcyB9LFxyXG4gICAgICAgICAgICAocmVzdWx0OiBSZXBvcnRNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9saXN0ID0gcmVzdWx0LkRhdGEuTW9EYXRhTGlzdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJQb3J0YWxTZXR0aW5nOiBSZWNvcmQ8c3RyaW5nLCBNZXRhb2JqZWN0RGF0YU1vZGVsPiA9IHt9O1xyXG4gICAgICAgICAgICAgICAgbW9saXN0LmZvckVhY2goKG1vKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vLkluaGVyaXRhbmNlICYmIG1vLkluaGVyaXRhbmNlLiRUeXBlRGVmTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ1ttby5Jbmhlcml0YW5jZS4kVHlwZURlZk5hbWVdID0gbW8uSW5oZXJpdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLm5leHQodXNlclBvcnRhbFNldHRpbmcpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgLy8gICAgIFBhcmFtZXRlcnM6IFtdLFxyXG4gICAgICAgIC8vICAgICBNZXRob2Q6ICdHZXRVc2VyUG9ydGFsU2V0dGluZ3MnLFxyXG4gICAgICAgIC8vICAgICBTdWNjZXNzRm46ICh1c2VyUG9ydGFsU2V0dGluZzogTWV0YW9iamVjdERhdGFNb2RlbCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB9LFxyXG4gICAgICAgIC8vICAgICBGYWlsRm46IChlKSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuICAgIGxvYWRTZXJ2ZXJTdGFydHVwRGF0YSgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIUJhcnNhQXBpLk9mZmxpbmUuaGFzSW5pdCkge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuT2ZmbGluZS5hZnRlckluaXRDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU2VydmVyU3RhcnR1cERhdGEocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLl9sb2FkU2VydmVyU3RhcnR1cERhdGEocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9sb2FkU2VydmVyU3RhcnR1cERhdGEocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWpheEhlbHBlciA9IHR5cGVvZiBBamF4SGVscGVyMiA9PT0gJ3VuZGVmaW5lZCcgPyBBamF4SGVscGVyIDogQWpheEhlbHBlcjI7XHJcbiAgICAgICAgYWpheEhlbHBlci5BamF4UmVxdWVzdChcclxuICAgICAgICAgICAgJy9hcGkvYmFzZS9TZXJ2ZXJTdGFydHVwRGF0YScsXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YVRleHQgPSByZXNwb25zZS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IGRhdGFUZXh0LnJlcGxhY2UoLycvZywgJ1wiJyk7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlJlcGxhY2VBcmFiaWNDaGFyY2h0ZXIoZGF0YVRleHQpO1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuTG9naW5Gb3JtLlBvcnRhbEluaXRpYWxpemUoZGF0YVRleHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhPy5lcnJvcj8udXNlck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuTXNnLkVycm9yKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuTXNnLkVycm9yKCfYp9mF2qnYp9mGINmI2LHZiNivINio2Kcg2qnYp9ix2KjYsSDZvtmI2LHYqtin2YQg2YjYrNmI2K8g2YbYr9in2LHYry4nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNTZXJ2aWNlRGVzaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnWzBdLnJlZGlyZWN0VG8gPSAnc2VydmljZWRlc2snO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIucmVzZXRDb25maWcoY29uZmlnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRBZnRlckxvZ2luRm9ybURhdGEoKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCdlcnJvciBpbiBnZXQgc2VydmVyIHN0YXJ0dXAgZGF0YS4nKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3IgaW4gZ2V0IHNlcnZlciBzdGFydHVwIGRhdGEuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIFNob3dGb3JtUGFuZWxDb250cm9sKFxyXG4gICAgICAgIGZvcm1wYW5lbEN0cmxyOiBhbnksXHJcbiAgICAgICAgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIGRpYWxvZ0NvbXBvbmVudDogVHlwZTxhbnk+LFxyXG4gICAgICAgIGlzUGFnZTogYm9vbGVhbixcclxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgaXNSZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFmb3JtcGFuZWxDdHJscikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2Zvcm0gcGFuZWwgY29udHJvbGVyIGlzIHVuZGVmaW5lZCEnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtbyA9IGZvcm1wYW5lbEN0cmxyLk1vO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckxheW91dCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkhlYWRlckxheW91dCcsIG51bGwpO1xyXG4gICAgICAgIGxldCBpc01vZGFsID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoZm9ybXBhbmVsQ3RybHIsICdTZXR0aW5nLlZpZXcuRXh0cmFKc29uUHJvcC5Nb2RhbCcsIGZhbHNlKTtcclxuICAgICAgICBpc01vZGFsID1cclxuICAgICAgICAgICAgaXNNb2RhbCB8fFxyXG4gICAgICAgICAgICBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShmb3JtcGFuZWxDdHJsciwgJ1NldHRpbmcuVmlldy5DdXN0b21VaS5QYXJhbWV0ZXJzLklzTW9kYWwnLCBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgbW9kYWxTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIGZvcm1wYW5lbEN0cmxyLFxyXG4gICAgICAgICAgICAnU2V0dGluZy5WaWV3LkN1c3RvbVVpLlBhcmFtZXRlcnMuTW9kYWxTZXR0aW5nJyxcclxuICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKG1vZGFsU2V0dGluZykge1xyXG4gICAgICAgICAgICBpc01vZGFsID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ybXBhbmVsQ3RybHIuU2V0dGluZy5Jc01vZGFsID0gaXNNb2RhbDtcclxuICAgICAgICBmb3JtcGFuZWxDdHJsci5Jc01vZGFsID0gaXNNb2RhbDtcclxuICAgICAgICBjb25zdCBicmVhZENydW1iID0gZ2V0SGVhZGVyVmFsdWUoaGVhZGVyTGF5b3V0Py5CcmVhZENydW1iKTtcclxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcclxuICAgICAgICAgICAgaWQ6IG1vLiRTdGF0ZSA9PT0gJ05ldycgPyAnMCcgOiBtby5JZCxcclxuICAgICAgICAgICAgdHlpZDogbW8uJFR5cGVEZWZJZCxcclxuICAgICAgICAgICAgdHljcDogbW8uJENhcHRpb24gPyBtby4kQ2FwdGlvbiA6IG51bGwsXHJcbiAgICAgICAgICAgIHJlcGlkOiBtby4kUmVwb3J0SWQsXHJcbiAgICAgICAgICAgIHZpZDogZm9ybXBhbmVsQ3RybHI/LlNldHRpbmc/LlZpZXc/LlR5cGVWaWV3SWQsXHJcbiAgICAgICAgICAgIGJjOiBicmVhZENydW1iID8gYnJlYWRDcnVtYiA6IG1vLiRTdGF0ZSA9PT0gJ05ldycgPyBtby4kVHlwZURlZk5hbWUgOiBtby4kQ2FwdGlvblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaWQgPSBnZXRVbmlxdWVJZCg0KTtcclxuICAgICAgICB0aGlzLmFkZEZvcm1QYW5lbEN0cmxyKGlkLCBmb3JtcGFuZWxDdHJscik7XHJcbiAgICAgICAgdGhpcy5vcGVuRm9ybSQubmV4dCgpOyAvLyBldmVudCBlbWl0IGZvciBvdGhlciBjb21wb25lbnRzIHRvIGtub3cgZm9ybSBvcGVuXHJcbiAgICAgICAgaWYgKGlzTW9kYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dGb3JtKFxyXG4gICAgICAgICAgICAgICAgZGlhbG9nQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1wYW5lbEN0cmxyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdmNyXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGZvcm1QYW5lbEN0cmxySWQ6IGlkIH07XHJcbiAgICAgICAgICAgIGlmIChpc1BhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGV0czoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW46IFsnc2hvdycsIHsgLi4ucXVlcnlQYXJhbXMsIGZvcm1QYW5lbEN0cmxySWQ6IGlkLCBpc0ZpcnN0OiB0cnVlIH1dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IGFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwTG9jYXRpb25DaGFuZ2U6IGlzUmVsb2FkXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwb3B1cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxldHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBbJ3Nob3cnLCB7IC4uLnF1ZXJ5UGFyYW1zLCBmb3JtUGFuZWxDdHJscklkOiBpZCB9XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IGFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ3ByZXNlcnZlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcExvY2F0aW9uQ2hhbmdlOiBpc1JlbG9hZFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbG9hZFN5c3RlbShpZDogbnVtYmVyID0gMCk6IFByb21pc2U8UG9ydGFsRGF0YU1vZGVsPiB7XHJcbiAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLlVsLkFwcGxpY2F0aW9uQ3RybHIuRGVmYXVsdFN5c3RlbUlkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5fbG9hZFN5c3RlbShcclxuICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9yZW1vdmVQdXNoQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHB1c2hBY3Rpb25TdHIgPSB0aGlzLl9sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHVzaEFjdGlvbicpO1xyXG4gICAgICAgIGlmIChwdXNoQWN0aW9uU3RyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmUoJ3B1c2hBY3Rpb24nKTtcclxuICAgICAgICAgICAgY29uc3QgcHVzaEFjdGlvbiA9IEpTT04ucGFyc2UocHVzaEFjdGlvblN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1c2hBY3Rpb24kLm5leHQocHVzaEFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfY2hlY2tMb2NhbFN0b3JhZ2VQdXNoQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHB1c2hBY3Rpb25TdHIgPSB0aGlzLl9sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHVzaEFjdGlvbicpO1xyXG4gICAgICAgIGlmIChwdXNoQWN0aW9uU3RyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmUoJ3B1c2hBY3Rpb24nKTtcclxuICAgICAgICAgICAgY29uc3QgcHVzaEFjdGlvbiA9IEpTT04ucGFyc2UocHVzaEFjdGlvblN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1c2hBY3Rpb24kLm5leHQocHVzaEFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaW5pdEFmdGVyTG9naW5Gb3JtRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJ0bFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNSdGwpO1xyXG4gICAgICAgIHRoaXMuX2lzQW5vbnVtb3VzU291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc0Fub255bW91cyk7XHJcbiAgICAgICAgdGhpcy5zZXRVc2VyTG9naW5TdGF0dXMoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc1VzZXJMb2dnZWRJbik7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VkSW5Tb3VyY2UubmV4dCh0aGlzLl9sb2dnZWRJblNvdXJjZS5nZXRWYWx1ZSgpICYmIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMgPT09IGZhbHNlKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2luaXRWaXNpYmlsaXR5Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRWaXNpYmlsaXR5Y2hhbmdlJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaW5pdFN0YW5kYWxvbmUoKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhkaXNwbGF5LW1vZGU6IHN0YW5kYWxvbmUpJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNNYXRjaCA9IGUubWF0Y2hlcztcclxuXHJcbiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFuZGFsb25lJC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhbmRhbG9uZSQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2luaXRQdXNoQWN0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jaGVja0xvY2FsU3RvcmFnZVB1c2hBY3Rpb24oKTtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnVzZXJMb2dnZWRJbiQsIHRoaXMucHVzaEFjdGlvbiRdKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhMYXRlc3RGcm9tKHRoaXMuX3BvcnRhbFNlcnZpY2UucHVzaEFjdGlvbiQpLFxyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyKChbdXNlckxvZ2dlZGluLCBhY3Rpb25dKSA9PiB1c2VyTG9nZ2VkaW4pXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKFt1c2VyTG9nZ2VkaW4sIHB1c2hBY3Rpb25dKSA9PiB1c2VyTG9nZ2VkaW4pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3VzZXJMb2dnZWRpbiwgcHVzaEFjdGlvbl0pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwdXNoQWN0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXB1c2hBY3Rpb24ubm90aWZpY2F0aW9uVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdXNoQWN0aW9uLm1vaWQgJiYgcHVzaEFjdGlvbi50cGlkICYmIHB1c2hBY3Rpb24uYWN0aW9uID09ICdzaG93Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBCYXJzYUFwaS5Cdy5Gb3JtLlNob3coeyBNb0lkOiBwdXNoQWN0aW9uLm1vaWQgfSksIDUwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkV4ZWN1dGVOb3RpZmljYXRpb25BY3Rpb24ocHVzaEFjdGlvbi5ub3RpZmljYXRpb25UYWcsIHB1c2hBY3Rpb24uYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaW5pdExhbmRzY2FwZSgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc01hdGNoID0gZS5tYXRjaGVzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RldmljZUxhbmRzY2FwZSQubmV4dChmYWxzZSk7IC8vIHBvcnRyYWl0XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXZpY2VMYW5kc2NhcGUkLm5leHQodHJ1ZSk7IC8vIGxhbmRzY2FwZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGZpbmRQYWdlQnlSb3V0ZSh1cmw6IHN0cmluZyk6IFBhZ2VEYXRhTW9kZWwgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBmaW5kZWRQYWdlID0gdGhpcy5wYWdlcy5maW5kKChjKSA9PiBjLlJvdXRlID09PSB1cmwpO1xyXG4gICAgICAgIHJldHVybiBmaW5kZWRQYWdlIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldE5nTW9kdWxlRmFjdG9yeShtb2R1bGVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBtb2R1bGVOYW1lOiBzdHJpbmcpOiBOZ01vZHVsZUZhY3Rvcnk8YW55PiB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlQ2xhc3MgPSBtb2R1bGVzW21vZHVsZU5hbWUgKyAnTW9kdWxlJ107XHJcbiAgICAgICAgbGV0IG1vZHVsZUZhY3Rvcnk6IE5nTW9kdWxlRmFjdG9yeTxhbnk+O1xyXG4gICAgICAgIGlmIChtb2R1bGVDbGFzcyBpbnN0YW5jZW9mIE5nTW9kdWxlRmFjdG9yeSkge1xyXG4gICAgICAgICAgICBtb2R1bGVGYWN0b3J5ID0gbW9kdWxlQ2xhc3M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVyLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyhtb2R1bGVDbGFzcyk7XHJcbiAgICAgICAgICAgIG1vZHVsZUZhY3RvcnkgPSBjb21waWxlZC5uZ01vZHVsZUZhY3Rvcnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb2R1bGVGYWN0b3J5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kOiBzdHJpbmcsIGV4cG9ydEFzOiBzdHJpbmdbXSwgbW9kdWxlTmFtZTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XHJcbiAgICAgICAgbGV0IG1vZHVsZXM7XHJcbiAgICAgICAgaWYgKHVtZCAhPT0gJycpIHtcclxuICAgICAgICAgICAgbW9kdWxlcyA9IHdpbmRvdztcclxuICAgICAgICAgICAgdW1kLnNwbGl0KCcuJykuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGVzICE9PSB0eXBlb2YgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyA9IG1vZHVsZXNbY107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXMgPSB3aW5kb3dbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleHBvcnRBcy5sZW5ndGggPiAwICYmIG1vZHVsZXMpIHtcclxuICAgICAgICAgICAgZXhwb3J0QXMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZU9uT2JqZWN0KGMsIDAsIG1vZHVsZXMsIHdpbmRvdyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbW9kdWxlcztcclxuICAgIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIExpYnJhcnlEZXBlbmVjeSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBrZWJhYk5hbWU6IHN0cmluZztcclxuICAgIHVtZDogc3RyaW5nO1xyXG4gICAgZXhwb3J0QXM6IHN0cmluZ1tdO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWRDcnVtYkluZm8ge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHVybDogc3RyaW5nO1xyXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlO1xyXG59XHJcbiJdfQ==
|