@energycap/components 0.41.0 → 0.41.1-ECAP-27592-angular-17.20241219-1718
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/{esm2020 → esm2022}/energycap-components.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components.module.mjs +418 -418
- package/{esm2020 → esm2022}/lib/controls/banner/banner.component.mjs +109 -109
- package/{esm2020 → esm2022}/lib/controls/button/button.component.mjs +106 -106
- package/{esm2020 → esm2022}/lib/controls/button/copy-button-base.directive.mjs +67 -67
- package/{esm2020 → esm2022}/lib/controls/button/copy-button.directive.mjs +28 -28
- package/{esm2020 → esm2022}/lib/controls/button/copy-table-button.directive.mjs +43 -43
- package/{esm2020 → esm2022}/lib/controls/calendar/calendar-item.component.mjs +59 -59
- package/{esm2020 → esm2022}/lib/controls/calendar/calendar.component.mjs +200 -200
- package/{esm2020 → esm2022}/lib/controls/calendar/calendar.types.mjs +3 -3
- package/{esm2020 → esm2022}/lib/controls/checkbox/checkbox.component.mjs +140 -140
- package/{esm2020 → esm2022}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
- package/{esm2020 → esm2022}/lib/controls/combobox/combobox.component.mjs +879 -879
- package/{esm2020 → esm2022}/lib/controls/date-input/date-input.component.mjs +256 -256
- package/{esm2020 → esm2022}/lib/controls/dropdown/dropdown.component.mjs +243 -243
- package/{esm2020 → esm2022}/lib/controls/file-upload/file-upload.component.mjs +261 -261
- package/{esm2020 → esm2022}/lib/controls/form-control/form-control.component.mjs +104 -104
- package/{esm2020 → esm2022}/lib/controls/form-control-base.mjs +151 -151
- package/{esm2020 → esm2022}/lib/controls/form-control-label/form-control-label.component.mjs +136 -136
- package/{esm2020 → esm2022}/lib/controls/form-group/form-group.component.mjs +261 -261
- package/{esm2020 → esm2022}/lib/controls/help-popover/help-popover.component.mjs +31 -31
- package/{esm2020 → esm2022}/lib/controls/item-picker/item-picker.component.mjs +329 -329
- package/{esm2020 → esm2022}/lib/controls/link-button/link-button.component.mjs +11 -11
- package/{esm2020 → esm2022}/lib/controls/menu/menu.component.mjs +485 -485
- package/{esm2020 → esm2022}/lib/controls/navigation/link-item.mjs +1 -1
- package/{esm2020 → esm2022}/lib/controls/navigation/nav-group.mjs +38 -38
- package/{esm2020 → esm2022}/lib/controls/navigation/nav-item-active.directive.mjs +92 -92
- package/{esm2020 → esm2022}/lib/controls/navigation/nav-item.mjs +1 -1
- package/{esm2020 → esm2022}/lib/controls/numericbox/numericbox.component.mjs +372 -372
- package/{esm2020 → esm2022}/lib/controls/popover/popover.component.mjs +117 -117
- package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button-option.mjs +2 -2
- package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button.component.mjs +82 -82
- package/{esm2020 → esm2022}/lib/controls/select/select.component.mjs +88 -88
- package/{esm2020 → esm2022}/lib/controls/tabs/tabs.component.mjs +47 -47
- package/{esm2020 → esm2022}/lib/controls/textbox/textbox.component.mjs +155 -155
- package/{esm2020 → esm2022}/lib/core/cache.service.mjs +105 -105
- package/esm2022/lib/core/custom-validators.mjs +29 -0
- package/esm2022/lib/core/date-time-helper.mjs +220 -0
- package/{esm2020 → esm2022}/lib/core/error.service.mjs +61 -61
- package/{esm2020 → esm2022}/lib/core/router-helper.service.mjs +111 -111
- package/{esm2020 → esm2022}/lib/core/scroll.service.mjs +89 -89
- package/{esm2020 → esm2022}/lib/core/telemetry-tracker.service.mjs +16 -16
- package/{esm2020 → esm2022}/lib/core/telemetry.service.mjs +38 -38
- package/{esm2020 → esm2022}/lib/core/validation-message.service.mjs +185 -185
- package/{esm2020 → esm2022}/lib/core/validation-patterns.mjs +30 -30
- package/{esm2020 → esm2022}/lib/core/window.service.mjs +186 -186
- package/{esm2020 → esm2022}/lib/display/app-bar/app-bar.component.mjs +46 -46
- package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
- package/{esm2020 → esm2022}/lib/display/avatar/avatar.service.mjs +64 -64
- package/{esm2020 → esm2022}/lib/display/confirm/confirm.component.mjs +168 -168
- package/{esm2020 → esm2022}/lib/display/dialog/dialog-content.mjs +1 -1
- package/{esm2020 → esm2022}/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -63
- package/{esm2020 → esm2022}/lib/display/dialog/dialog-types.mjs +76 -76
- package/{esm2020 → esm2022}/lib/display/dialog/dialog.component.mjs +281 -281
- package/{esm2020 → esm2022}/lib/display/dialog/dialog.service.mjs +71 -71
- package/{esm2020 → esm2022}/lib/display/help/help-types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-base.mjs +111 -111
- package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
- package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -61
- package/{esm2020 → esm2022}/lib/display/item-display/item-display.component.mjs +81 -81
- package/{esm2020 → esm2022}/lib/display/json-display/json-display.component.mjs +47 -47
- package/{esm2020 → esm2022}/lib/display/resizable/resizable-base.mjs +120 -120
- package/{esm2020 → esm2022}/lib/display/resizable/resizable.component.mjs +52 -52
- package/{esm2020 → esm2022}/lib/display/spinner/spinner.component.mjs +12 -12
- package/{esm2020 → esm2022}/lib/display/splash/splash.component.mjs +42 -42
- package/{esm2020 → esm2022}/lib/display/splash/splash.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/display/table/resizable-column.component.mjs +20 -20
- package/{esm2020 → esm2022}/lib/display/table/resizable-table.directive.mjs +227 -227
- package/{esm2020 → esm2022}/lib/display/table/searchable-table.component.mjs +342 -342
- package/{esm2020 → esm2022}/lib/display/table/table-detail-row.component.mjs +19 -19
- package/{esm2020 → esm2022}/lib/display/table/table-locked-column.component.mjs +58 -58
- package/{esm2020 → esm2022}/lib/display/table/table-master-header-row.component.mjs +14 -14
- package/{esm2020 → esm2022}/lib/display/table/table-master-row.component.mjs +163 -163
- package/{esm2020 → esm2022}/lib/display/table/table-pagination.component.mjs +155 -155
- package/{esm2020 → esm2022}/lib/display/table/table-selectable-row.component.mjs +235 -235
- package/{esm2020 → esm2022}/lib/display/table/table.component.mjs +249 -249
- package/{esm2020 → esm2022}/lib/display/tags/tag.mjs +17 -17
- package/{esm2020 → esm2022}/lib/display/tags/tags.component.mjs +77 -77
- package/{esm2020 → esm2022}/lib/display/toast/toast/toast.component.mjs +77 -77
- package/{esm2020 → esm2022}/lib/display/toast/toast-types.mjs +7 -7
- package/{esm2020 → esm2022}/lib/display/toast/toast.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/display/toast/toaster/toaster.component.mjs +114 -114
- package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.component.mjs +28 -28
- package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.service.mjs +78 -78
- package/{esm2020 → esm2022}/lib/display/tooltip-directive/tooltip.directive.mjs +173 -173
- package/{esm2020 → esm2022}/lib/display/tour/tour-types.mjs +33 -33
- package/{esm2020 → esm2022}/lib/display/tour/tour.component.mjs +398 -398
- package/{esm2020 → esm2022}/lib/display/tour/tour.service.mjs +75 -75
- package/{esm2020 → esm2022}/lib/display/tree/tree.component.mjs +135 -135
- package/{esm2020 → esm2022}/lib/display/view-overlay/view-overlay.component.mjs +58 -58
- package/{esm2020 → esm2022}/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -32
- package/{esm2020 → esm2022}/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -111
- package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
- package/{esm2020 → esm2022}/lib/shared/display/pipes/date-display.pipe.mjs +50 -50
- package/{esm2020 → esm2022}/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -30
- package/{esm2020 → esm2022}/lib/shared/display/pipes/relative-date.pipe.mjs +62 -62
- package/{esm2020 → esm2022}/lib/shared/display/pipes/row-count.pipe.mjs +48 -48
- package/{esm2020 → esm2022}/lib/shared/display/pipes/time-display.pipe.mjs +41 -41
- package/esm2022/lib/shared/display.mjs +6 -0
- package/esm2022/lib/shared/form-group.helper.mjs +67 -0
- package/{esm2020 → esm2022}/lib/shared/json-helper.mjs +18 -18
- package/esm2022/lib/shared/lodash-helper.mjs +52 -0
- package/{esm2020 → esm2022}/lib/shared/page/page-base/page-base.component.mjs +387 -387
- package/{esm2020 → esm2022}/lib/shared/page/page-statuses.mjs +22 -22
- package/{esm2020 → esm2022}/lib/shared/page/page-title/page-title.component.mjs +23 -23
- package/{esm2020 → esm2022}/lib/shared/page/page-view/page-view.component.mjs +147 -147
- package/{esm2020 → esm2022}/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +16 -16
- package/{esm2020 → esm2022}/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +16 -16
- package/{esm2020 → esm2022}/lib/shared/testing/page-base-component-test-helper.spec.mjs +37 -37
- package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
- package/{esm2020 → esm2022}/lib/shared/testing/public-mocks.spec.mjs +148 -148
- package/{esm2020 → esm2022}/lib/shared/testing/spy-factory.spec.mjs +39 -39
- package/{esm2020 → esm2022}/lib/shared/testing/translation-mocks.spec.mjs +56 -56
- package/{esm2020 → esm2022}/lib/shared/user-preference.service.mjs +17 -17
- package/{esm2020 → esm2022}/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -246
- package/{esm2020 → esm2022}/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -68
- package/{esm2020 → esm2022}/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -18
- package/{esm2020 → esm2022}/public-api.mjs +114 -114
- package/{fesm2020 → fesm2022}/energycap-components.mjs +11797 -11793
- package/fesm2022/energycap-components.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components.module.d.ts +91 -91
- package/lib/controls/banner/banner.component.d.ts +50 -50
- package/lib/controls/button/button.component.d.ts +78 -78
- package/lib/controls/button/copy-button-base.directive.d.ts +20 -20
- package/lib/controls/button/copy-button.directive.d.ts +14 -14
- package/lib/controls/button/copy-table-button.directive.d.ts +19 -19
- package/lib/controls/calendar/calendar-item.component.d.ts +17 -17
- package/lib/controls/calendar/calendar.component.d.ts +54 -54
- package/lib/controls/calendar/calendar.types.d.ts +7 -7
- package/lib/controls/checkbox/checkbox.component.d.ts +65 -65
- package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -25
- package/lib/controls/combobox/combobox.component.d.ts +418 -418
- package/lib/controls/date-input/date-input.component.d.ts +80 -80
- package/lib/controls/dropdown/dropdown.component.d.ts +161 -161
- package/lib/controls/file-upload/file-upload.component.d.ts +124 -124
- package/lib/controls/form-control/form-control.component.d.ts +30 -30
- package/lib/controls/form-control-base.d.ts +110 -110
- package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -73
- package/lib/controls/form-group/form-group.component.d.ts +105 -105
- package/lib/controls/help-popover/help-popover.component.d.ts +11 -11
- package/lib/controls/item-picker/item-picker.component.d.ts +164 -164
- package/lib/controls/link-button/link-button.component.d.ts +5 -5
- package/lib/controls/menu/menu.component.d.ts +255 -255
- package/lib/controls/navigation/link-item.d.ts +32 -32
- package/lib/controls/navigation/nav-group.d.ts +18 -18
- package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -42
- package/lib/controls/navigation/nav-item.d.ts +31 -31
- package/lib/controls/numericbox/numericbox.component.d.ts +148 -148
- package/lib/controls/popover/popover.component.d.ts +51 -51
- package/lib/controls/radio-button/radio-button-option.d.ts +19 -19
- package/lib/controls/radio-button/radio-button.component.d.ts +53 -53
- package/lib/controls/select/select.component.d.ts +44 -44
- package/lib/controls/tabs/tabs.component.d.ts +30 -30
- package/lib/controls/textbox/textbox.component.d.ts +107 -107
- package/lib/core/cache.service.d.ts +33 -33
- package/lib/core/custom-validators.d.ts +20 -20
- package/lib/core/date-time-helper.d.ts +101 -101
- package/lib/core/error.service.d.ts +20 -20
- package/lib/core/router-helper.service.d.ts +48 -48
- package/lib/core/scroll.service.d.ts +36 -36
- package/lib/core/telemetry-tracker.service.d.ts +13 -13
- package/lib/core/telemetry.service.d.ts +31 -31
- package/lib/core/validation-message.service.d.ts +26 -26
- package/lib/core/validation-patterns.d.ts +22 -22
- package/lib/core/window.service.d.ts +116 -116
- package/lib/display/app-bar/app-bar.component.d.ts +20 -20
- package/lib/display/avatar/avatar.component.d.ts +35 -35
- package/lib/display/avatar/avatar.service.d.ts +24 -24
- package/lib/display/confirm/confirm.component.d.ts +123 -123
- package/lib/display/dialog/dialog-content.d.ts +19 -19
- package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -32
- package/lib/display/dialog/dialog-types.d.ts +130 -130
- package/lib/display/dialog/dialog.component.d.ts +120 -120
- package/lib/display/dialog/dialog.service.d.ts +48 -48
- package/lib/display/help/help-types.d.ts +33 -33
- package/lib/display/hierarchy/hierarchy-base.d.ts +97 -97
- package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -53
- package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -34
- package/lib/display/item-display/item-display.component.d.ts +43 -43
- package/lib/display/json-display/json-display.component.d.ts +16 -16
- package/lib/display/resizable/resizable-base.d.ts +67 -67
- package/lib/display/resizable/resizable.component.d.ts +31 -31
- package/lib/display/spinner/spinner.component.d.ts +5 -5
- package/lib/display/splash/splash.component.d.ts +16 -16
- package/lib/display/splash/splash.service.d.ts +22 -22
- package/lib/display/table/resizable-column.component.d.ts +10 -10
- package/lib/display/table/resizable-table.directive.d.ts +93 -93
- package/lib/display/table/searchable-table.component.d.ts +206 -206
- package/lib/display/table/table-detail-row.component.d.ts +8 -8
- package/lib/display/table/table-locked-column.component.d.ts +20 -20
- package/lib/display/table/table-master-header-row.component.d.ts +9 -9
- package/lib/display/table/table-master-row.component.d.ts +113 -113
- package/lib/display/table/table-pagination.component.d.ts +91 -91
- package/lib/display/table/table-selectable-row.component.d.ts +102 -102
- package/lib/display/table/table.component.d.ts +121 -121
- package/lib/display/tags/tag.d.ts +18 -18
- package/lib/display/tags/tags.component.d.ts +48 -48
- package/lib/display/toast/toast/toast.component.d.ts +23 -23
- package/lib/display/toast/toast-types.d.ts +24 -24
- package/lib/display/toast/toast.service.d.ts +20 -20
- package/lib/display/toast/toaster/toaster.component.d.ts +35 -35
- package/lib/display/tooltip/tooltip.component.d.ts +70 -70
- package/lib/display/tooltip/tooltip.service.d.ts +16 -16
- package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -44
- package/lib/display/tour/tour-types.d.ts +70 -70
- package/lib/display/tour/tour.component.d.ts +147 -147
- package/lib/display/tour/tour.service.d.ts +38 -38
- package/lib/display/tree/tree.component.d.ts +75 -75
- package/lib/display/view-overlay/view-overlay.component.d.ts +38 -38
- package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -14
- package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -60
- package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -101
- package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -21
- package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -9
- package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -36
- package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -23
- package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -18
- package/lib/shared/display.d.ts +42 -42
- package/lib/shared/form-group.helper.d.ts +31 -31
- package/lib/shared/json-helper.d.ts +7 -7
- package/lib/shared/lodash-helper.d.ts +18 -18
- package/lib/shared/page/page-base/page-base.component.d.ts +259 -259
- package/lib/shared/page/page-statuses.d.ts +13 -13
- package/lib/shared/page/page-title/page-title.component.d.ts +9 -9
- package/lib/shared/page/page-view/page-view.component.d.ts +102 -102
- package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -4
- package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -4
- package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -30
- package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -28
- package/lib/shared/testing/public-mocks.spec.d.ts +90 -90
- package/lib/shared/testing/spy-factory.spec.d.ts +27 -27
- package/lib/shared/testing/translation-mocks.spec.d.ts +30 -30
- package/lib/shared/user-preference.service.d.ts +13 -13
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -134
- package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -27
- package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -10
- package/package.json +12 -18
- package/public-api.d.ts +111 -111
- package/schematics/rxjs-7-upgrade/index.d.ts +3 -3
- package/schematics/rxjs-7-upgrade/index.js +67 -67
- package/schematics/rxjs-7-upgrade/schema.d.ts +4 -4
- package/schematics/rxjs-7-upgrade/schema.js +2 -2
- package/schematics/utilities/typescript.d.ts +7 -7
- package/schematics/utilities/typescript.js +41 -41
- package/schematics/utilities/workspace.d.ts +8 -8
- package/schematics/utilities/workspace.js +71 -71
- package/esm2020/lib/core/custom-validators.mjs +0 -29
- package/esm2020/lib/core/date-time-helper.mjs +0 -220
- package/esm2020/lib/display/avatar/avatar.component.mjs +0 -67
- package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +0 -163
- package/esm2020/lib/shared/display.mjs +0 -6
- package/esm2020/lib/shared/form-group.helper.mjs +0 -67
- package/esm2020/lib/shared/lodash-helper.mjs +0 -51
- package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
- package/fesm2015/energycap-components.mjs +0 -12211
- package/fesm2015/energycap-components.mjs.map +0 -1
- package/fesm2020/energycap-components.mjs.map +0 -1
@@ -1,387 +1,387 @@
|
|
1
|
-
import { Directive, HostBinding } from '@angular/core';
|
2
|
-
import { UntypedFormGroup } from '@angular/forms';
|
3
|
-
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
4
|
-
import { TranslateService } from '@ngx-translate/core';
|
5
|
-
import { lastValueFrom, ReplaySubject, Subject } from 'rxjs';
|
6
|
-
import { filter, take, takeUntil } from 'rxjs/operators';
|
7
|
-
import { ErrorService } from '../../../core/error.service';
|
8
|
-
import { RouterHelper } from '../../../core/router-helper.service';
|
9
|
-
import { ScrollService } from '../../../core/scroll.service';
|
10
|
-
import { DialogService } from '../../../display/dialog/dialog.service';
|
11
|
-
import { SplashService } from '../../../display/splash/splash.service';
|
12
|
-
import { Overlay } from '../../../display/view-overlay/view-overlay.component';
|
13
|
-
import { PageStatus, PageStatuses } from '../page-statuses';
|
14
|
-
import * as i0 from "@angular/core";
|
15
|
-
export class PageInitResult {
|
16
|
-
constructor() {
|
17
|
-
this.title = '';
|
18
|
-
this.subTitle = '';
|
19
|
-
this.subTitleUrl = '';
|
20
|
-
}
|
21
|
-
}
|
22
|
-
export class PageBaseComponent {
|
23
|
-
constructor(injector) {
|
24
|
-
/** Default css classes applied to host element */
|
25
|
-
this.classList = 'd-flex flex-grow';
|
26
|
-
/**
|
27
|
-
* Title for the page displayed in the header
|
28
|
-
*/
|
29
|
-
this.title = '';
|
30
|
-
/**
|
31
|
-
* Sub title for the page displayed in the header
|
32
|
-
*/
|
33
|
-
this.subTitle = '';
|
34
|
-
/**
|
35
|
-
* Sub title url for the page displayed in the header
|
36
|
-
*/
|
37
|
-
this.subTitleUrl = '';
|
38
|
-
/**
|
39
|
-
* Status overlay for the page
|
40
|
-
*/
|
41
|
-
this.status = new Overlay('pending', 'Loading');
|
42
|
-
/**
|
43
|
-
* Form group to be used if needed by the page
|
44
|
-
*/
|
45
|
-
this.formGroup = new UntypedFormGroup({});
|
46
|
-
/**
|
47
|
-
* Default invalid form message, override if a more specific message is needed
|
48
|
-
*/
|
49
|
-
this.defaultInvalidFormMessage = 'PleaseCorrectForm_SC';
|
50
|
-
/**
|
51
|
-
* Default unknown save error message, override if a more specific message is needed
|
52
|
-
*/
|
53
|
-
this.defaultUnknownSaveError = 'PageBaseUnknownSaveError_SC';
|
54
|
-
/**
|
55
|
-
* Used to opt out of hiding the splash screen when the page is loaded
|
56
|
-
*/
|
57
|
-
this.skipHideSplashOnComplete = false;
|
58
|
-
/**
|
59
|
-
* When set to true any navigation end events that are strictly query param changes will
|
60
|
-
* not call the onNavigationEnd function. This allows pages to change the view with query
|
61
|
-
* params and not trigger a full refresh.
|
62
|
-
*/
|
63
|
-
this.ignoreQueryParamsOnNavigationChange = false;
|
64
|
-
this.previousUrl = "";
|
65
|
-
/**
|
66
|
-
* Used to unsubscribe from observables
|
67
|
-
*/
|
68
|
-
this.destroyed = new Subject();
|
69
|
-
/**
|
70
|
-
* Used to know when the page has been loaded, this will be completed
|
71
|
-
* after onAfterViewInit
|
72
|
-
*/
|
73
|
-
this._afterViewInitComplete = new ReplaySubject();
|
74
|
-
this.afterViewInitComplete = this._afterViewInitComplete;
|
75
|
-
/**
|
76
|
-
* Errors to be shown for the component.
|
77
|
-
* Automatically populated on promise rejection from save and shared with the UI.
|
78
|
-
*/
|
79
|
-
this._errors = '';
|
80
|
-
this.errorService = injector.get(ErrorService);
|
81
|
-
this.translateService = injector.get(TranslateService);
|
82
|
-
this.scrollService = injector.get(ScrollService);
|
83
|
-
this.router = injector.get(Router);
|
84
|
-
this.activatedRoute = injector.get(ActivatedRoute);
|
85
|
-
this.dialogService = injector.get(DialogService);
|
86
|
-
this.splashService = injector.get(SplashService);
|
87
|
-
this.routerHelper = injector.get(RouterHelper);
|
88
|
-
}
|
89
|
-
get errors() {
|
90
|
-
return this._errors;
|
91
|
-
}
|
92
|
-
/**
|
93
|
-
* Optional lifecycle hook that is called as part of the Angular ngOnInit lifecycle hook.
|
94
|
-
* Called before onInit is called for the first time. Add setup logic here that does
|
95
|
-
* not need to be run on every reload.
|
96
|
-
*/
|
97
|
-
onFirstInit() { }
|
98
|
-
async ngOnInit() {
|
99
|
-
try {
|
100
|
-
this.showStatus(PageStatus.Loading);
|
101
|
-
this.setUpRouterSubscriptions();
|
102
|
-
this.onFirstInit();
|
103
|
-
this.initPromise = this.onInit();
|
104
|
-
await this.initPromise;
|
105
|
-
}
|
106
|
-
catch (error) {
|
107
|
-
this.splashService.hideSplash();
|
108
|
-
this.onError(error);
|
109
|
-
}
|
110
|
-
;
|
111
|
-
}
|
112
|
-
/**
|
113
|
-
* This method is called just after the Angular Lifecycle event ngOnAfterViewInit.
|
114
|
-
* It fires after all sub-components have gone through their initialization phase.
|
115
|
-
* It is in this phase that the view components should already exist, so a derived class should
|
116
|
-
* load data from the API to populate any view components. The promise that
|
117
|
-
* is returned must not resolve until all required data has completely loaded
|
118
|
-
*/
|
119
|
-
async onAfterViewInit() { }
|
120
|
-
;
|
121
|
-
async ngAfterViewInit() {
|
122
|
-
try {
|
123
|
-
const initResult = await this.initPromise;
|
124
|
-
this.parseInitResult(initResult);
|
125
|
-
await this.onAfterViewInit();
|
126
|
-
this._afterViewInitComplete.next();
|
127
|
-
this._afterViewInitComplete.complete();
|
128
|
-
await this.onFormLoadComplete();
|
129
|
-
if (this.status.status === 'pending') {
|
130
|
-
this.showStatus(PageStatus.Loaded);
|
131
|
-
}
|
132
|
-
if (!this.skipHideSplashOnComplete) {
|
133
|
-
this.splashService.hideSplash();
|
134
|
-
}
|
135
|
-
}
|
136
|
-
catch (error) {
|
137
|
-
this.splashService.hideSplash();
|
138
|
-
this.onError(error);
|
139
|
-
}
|
140
|
-
}
|
141
|
-
/**
|
142
|
-
* A lifecycle method that executes once all data has been loaded
|
143
|
-
* through ngAfterViewInit and from local storage if required.
|
144
|
-
* It is at this point that you can subscribe to changes on the form
|
145
|
-
* reliably
|
146
|
-
*
|
147
|
-
* @protected
|
148
|
-
* @memberof PageBaseComponent
|
149
|
-
*/
|
150
|
-
async onFormLoadComplete() { }
|
151
|
-
/**
|
152
|
-
* A lifecycle hook that is called after every NavigationEnd event.
|
153
|
-
*/
|
154
|
-
onNavigationEnd() { }
|
155
|
-
/**
|
156
|
-
* Reload the component kicking off the ngOnInit and ngAfterViewInit lifecycle hooks.
|
157
|
-
* Any state that needs to be reset should be done so before calling this method.
|
158
|
-
*/
|
159
|
-
reload() {
|
160
|
-
this._afterViewInitComplete = new ReplaySubject();
|
161
|
-
this.showStatus(PageStatus.Loading);
|
162
|
-
this.initPromise = this.onInit();
|
163
|
-
this.ngAfterViewInit();
|
164
|
-
}
|
165
|
-
/**
|
166
|
-
* When overridden in a derived class this method will sync the form state
|
167
|
-
* into the object that will be persisted to the API. The value should not
|
168
|
-
* actually be sent to the API yet.
|
169
|
-
*/
|
170
|
-
async applyModelUpdates() { }
|
171
|
-
;
|
172
|
-
/**
|
173
|
-
* Save the model state to the API and return a promise that
|
174
|
-
* contains the updated entityID. The promise should be rejected
|
175
|
-
* if the save fails and errors and the overlay status will be updated
|
176
|
-
* accordingly
|
177
|
-
*/
|
178
|
-
async saveToApi() { }
|
179
|
-
;
|
180
|
-
/**
|
181
|
-
* Called after the save has completed successfully.
|
182
|
-
* It is the responsibility of the derived class to navigate
|
183
|
-
* to a properties/status page or emit appropriately if within a dialog
|
184
|
-
* @param entityId
|
185
|
-
*/
|
186
|
-
onSaveComplete(entityId) { }
|
187
|
-
;
|
188
|
-
/**
|
189
|
-
* Function called when the user clicks save. We will first touch all controls to show validation messages
|
190
|
-
* if the form is invalid. If the form is valid we will attempt to save and any errors will be reported
|
191
|
-
* back to the user
|
192
|
-
* @param event
|
193
|
-
*/
|
194
|
-
async onSave(event) {
|
195
|
-
this.formGroup.markAllAsTouched();
|
196
|
-
// If the form has pending async validators, wait for it them to complete before proceeding
|
197
|
-
if (this.formGroup.pending) {
|
198
|
-
// Show the saving overlay when the form has pending async validators
|
199
|
-
this.showStatus(PageStatus.Saving);
|
200
|
-
await lastValueFrom(this.formGroup.statusChanges.pipe(filter(status => status !== 'PENDING'), take(1), takeUntil(this.destroyed)));
|
201
|
-
}
|
202
|
-
if (this.formGroup.valid) {
|
203
|
-
await this.save();
|
204
|
-
}
|
205
|
-
else {
|
206
|
-
// Remove the saving overlay to display any errors
|
207
|
-
this.showStatus(PageStatus.Loaded);
|
208
|
-
// Only show the banner with the generic message if the parent component hasn't already set one
|
209
|
-
// by implementing onSave for additional validation
|
210
|
-
if (this.errors === '') {
|
211
|
-
this.showErrorBanner(this.defaultInvalidFormMessage);
|
212
|
-
}
|
213
|
-
if (this.scrollContainerSelector) {
|
214
|
-
setTimeout(() => {
|
215
|
-
this.scrollService.scrollToItem(this.scrollContainerSelector, ".ng-invalid");
|
216
|
-
});
|
217
|
-
}
|
218
|
-
}
|
219
|
-
}
|
220
|
-
/**
|
221
|
-
* Function available to trigger a save and bypass the form validation checks.
|
222
|
-
* This is useful if the user chooses a remove action from within an edit dialog. If the dialog form is invalid
|
223
|
-
* that is no concern to the user if they wish to remove the item they are editing.
|
224
|
-
* @param event
|
225
|
-
*/
|
226
|
-
async onSaveWithoutValidate(event) {
|
227
|
-
await this.save();
|
228
|
-
}
|
229
|
-
/**
|
230
|
-
* Function called when the component is destroyed
|
231
|
-
*/
|
232
|
-
ngOnDestroy() {
|
233
|
-
this.destroyed.next();
|
234
|
-
this.destroyed.unsubscribe();
|
235
|
-
}
|
236
|
-
/**
|
237
|
-
* Function that will log an error that is passed in to the console
|
238
|
-
* @param e
|
239
|
-
*/
|
240
|
-
onError(error) {
|
241
|
-
this.errorService.logConsoleError(error);
|
242
|
-
this.showErrorOverlay(error);
|
243
|
-
}
|
244
|
-
/**
|
245
|
-
* Show an error message in a whole-page overlay. This will prevent any more
|
246
|
-
* interactions with the page. It can take a string error message or a raw API
|
247
|
-
* error that needs to be parsed. If the API error isn't something we can handle
|
248
|
-
* a generic message is shown instead
|
249
|
-
* @param {(Error | string)} error
|
250
|
-
*/
|
251
|
-
showErrorOverlay(error) {
|
252
|
-
this.getErrorMessage(error).subscribe((translatedMessage) => {
|
253
|
-
this.status.setStatus('error', translatedMessage);
|
254
|
-
});
|
255
|
-
}
|
256
|
-
/**
|
257
|
-
* Show an error in the banner at the top of the screen. This will not produce a
|
258
|
-
* whole-page overlay like the function showError will. It can take a string error message
|
259
|
-
* or raw API error that needs to be parsed. If the API error isn't something we can handle,
|
260
|
-
* a generic message (customizable via unknownErrorDefault) is shown instead.
|
261
|
-
* @param error
|
262
|
-
* @param unknownErrorDefault
|
263
|
-
*/
|
264
|
-
showErrorBanner(error, unknownErrorDefault) {
|
265
|
-
this.getErrorMessage(error, unknownErrorDefault).subscribe((translatedMessage) => {
|
266
|
-
this._errors = translatedMessage;
|
267
|
-
this.showStatus(PageStatus.Loaded);
|
268
|
-
});
|
269
|
-
}
|
270
|
-
/**
|
271
|
-
* Parses and translates an API error or error string.
|
272
|
-
* @param e
|
273
|
-
* @param unknownErrorDefault
|
274
|
-
*/
|
275
|
-
getErrorMessage(e, unknownErrorDefault) {
|
276
|
-
let extractedMessage = this.errorService.parseApiError(e, unknownErrorDefault);
|
277
|
-
return this.translateService.get(extractedMessage);
|
278
|
-
}
|
279
|
-
/**
|
280
|
-
* Clear the errors to hide the errors banner.
|
281
|
-
*/
|
282
|
-
hideErrorBanner() {
|
283
|
-
this._errors = '';
|
284
|
-
}
|
285
|
-
/**
|
286
|
-
* Change the display status to overlay the whole page while loading or saving
|
287
|
-
* and clear it when the form is ready
|
288
|
-
* @protected
|
289
|
-
* @param {PageStatus} status
|
290
|
-
* @memberof FormBaseComponent
|
291
|
-
*/
|
292
|
-
showStatus(status) {
|
293
|
-
let knownStatus = PageStatuses[status];
|
294
|
-
if (knownStatus) {
|
295
|
-
this.status.setStatus(knownStatus.status, knownStatus.message, undefined, knownStatus.noDataTemplate, knownStatus.overlayClassList);
|
296
|
-
}
|
297
|
-
}
|
298
|
-
/**
|
299
|
-
* Allows the component to enter a pending status and execute a function that on completion will return the status
|
300
|
-
* to hasData. If an error occurs within the callback an error banner can be shown.
|
301
|
-
* @param callback
|
302
|
-
* @param pendingMessage - optional custom pending message
|
303
|
-
* @returns
|
304
|
-
*/
|
305
|
-
async runBlockingAction(callback, pendingMessage) {
|
306
|
-
this.hideErrorBanner();
|
307
|
-
this.status.setStatus('pending', pendingMessage);
|
308
|
-
return callback().catch(error => {
|
309
|
-
this.showErrorBanner(error);
|
310
|
-
// Throw the error for any downstream components that may be listening and need to react
|
311
|
-
// to any errors happening within this callback
|
312
|
-
throw (error);
|
313
|
-
}).finally(() => {
|
314
|
-
this.showStatus(PageStatus.Loaded);
|
315
|
-
});
|
316
|
-
}
|
317
|
-
;
|
318
|
-
/**
|
319
|
-
* Parses the page init result and sets the necessary properties on the page
|
320
|
-
* @param result
|
321
|
-
*/
|
322
|
-
parseInitResult(result) {
|
323
|
-
this.initResult = result;
|
324
|
-
this.title = result.title;
|
325
|
-
this.subTitle = result.subTitle;
|
326
|
-
this.subTitleUrl = result.subTitleUrl;
|
327
|
-
this.breadcrumbs = result.breadcrumbs;
|
328
|
-
this.help = result.help;
|
329
|
-
}
|
330
|
-
/**
|
331
|
-
* Controls the page status, triggers the save action and handles errors thrown.
|
332
|
-
*/
|
333
|
-
async save() {
|
334
|
-
this.showStatus(PageStatus.Saving);
|
335
|
-
try {
|
336
|
-
await this.applyModelUpdates();
|
337
|
-
let entityId = await this.saveToApi() || -1;
|
338
|
-
this._errors = '';
|
339
|
-
this.onSaveComplete(entityId);
|
340
|
-
}
|
341
|
-
catch (error) {
|
342
|
-
//clear the "saving" overlay and show the message at the top of the view through the errors property
|
343
|
-
this.showErrorBanner(error, this.defaultUnknownSaveError);
|
344
|
-
this.splashService.hideSplash();
|
345
|
-
}
|
346
|
-
}
|
347
|
-
/**
|
348
|
-
* Sets up the router event subscriptions
|
349
|
-
*/
|
350
|
-
setUpRouterSubscriptions() {
|
351
|
-
if (!this.navigationEndSubscription && !this.destroyed.closed) {
|
352
|
-
this.previousUrl = this.router.url;
|
353
|
-
// React to navigation events
|
354
|
-
this.navigationEndSubscription = this.router.events.pipe(takeUntil(this.destroyed), filter(e => e instanceof NavigationEnd)).subscribe(e => {
|
355
|
-
try {
|
356
|
-
let currentUrl = e.url;
|
357
|
-
if (this.ignoreQueryParamsOnNavigationChange) {
|
358
|
-
if (this.previousUrl.split('?')[0] !== currentUrl.split('?')[0]) {
|
359
|
-
this.navigationEndHandler(e.url);
|
360
|
-
}
|
361
|
-
}
|
362
|
-
else {
|
363
|
-
if (this.previousUrl !== currentUrl) {
|
364
|
-
this.navigationEndHandler(e.url);
|
365
|
-
}
|
366
|
-
}
|
367
|
-
}
|
368
|
-
catch (error) {
|
369
|
-
this.onError(error);
|
370
|
-
}
|
371
|
-
});
|
372
|
-
}
|
373
|
-
}
|
374
|
-
navigationEndHandler(url) {
|
375
|
-
this.previousUrl = url;
|
376
|
-
this.onNavigationEnd();
|
377
|
-
}
|
378
|
-
}
|
379
|
-
|
380
|
-
|
381
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
382
|
-
type: Directive
|
383
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { classList: [{
|
384
|
-
type: HostBinding,
|
385
|
-
args: ['class']
|
386
|
-
}] } });
|
387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLWJhc2UvcGFnZS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxXQUFXLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFNUQsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFDRSxVQUFLLEdBQVksRUFBRSxDQUFDO1FBQ3BCLGFBQVEsR0FB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QU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEhvc3RCaW5kaW5nLCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgbGFzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vLi4vLi4vY29udHJvbHMvbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcbmltcG9ydCB7IEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZXJyb3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlckhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcm91dGVyLWhlbHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2Nyb2xsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWxwIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9oZWxwL2hlbHAtdHlwZXMnO1xyXG5pbXBvcnQgeyBTcGxhc2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9zcGxhc2gvc3BsYXNoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPdmVybGF5IH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS92aWV3LW92ZXJsYXkvdmlldy1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBhZ2VTdGF0dXMsIFBhZ2VTdGF0dXNlcyB9IGZyb20gJy4uL3BhZ2Utc3RhdHVzZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhZ2VJbml0UmVzdWx0IHtcclxuICB0aXRsZT86IHN0cmluZyA9ICcnO1xyXG4gIHN1YlRpdGxlPzogc3RyaW5nID0gJyc7XHJcbiAgc3ViVGl0bGVVcmw/OiBzdHJpbmcgPSAnJztcclxuICBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcclxuICBoZWxwPzogSGVscDtcclxufVxyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWdlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogRGVmYXVsdCBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIGhvc3QgZWxlbWVudCAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcm90ZWN0ZWQgY2xhc3NMaXN0ID0gJ2QtZmxleCBmbGV4LWdyb3cnO1xyXG5cclxuICAvKipcclxuICAgKiBUaXRsZSBmb3IgdGhlIHBhZ2UgZGlzcGxheWVkIGluIHRoZSBoZWFkZXJcclxuICAgKi9cclxuICBwdWJsaWMgdGl0bGU/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogU3ViIHRpdGxlIGZvciB0aGUgcGFnZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdWJUaXRsZT86IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBTdWIgdGl0bGUgdXJsIGZvciB0aGUgcGFnZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdWJUaXRsZVVybD86IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBTdGF0dXMgb3ZlcmxheSBmb3IgdGhlIHBhZ2VcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdHVzOiBPdmVybGF5ID0gbmV3IE92ZXJsYXkoJ3BlbmRpbmcnLCAnTG9hZGluZycpO1xyXG5cclxuICAvKipcclxuICAgKiBCcmVhZGNydW1icyBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdWx0IHJldHVybmVkIGZyb20gdGhlIG9uSW5pdCBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBpbml0UmVzdWx0ITogUGFnZUluaXRSZXN1bHQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21wb25lbnQsIHdoaWNoIGNhbiBvbmx5IGJlIHNldCB0aHJvdWdoIG9uSW5pdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBoZWxwOiBIZWxwIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBGb3JtIGdyb3VwIHRvIGJlIHVzZWQgaWYgbmVlZGVkIGJ5IHRoZSBwYWdlXHJcbiAgICovXHJcbiAgcHVibGljIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBpbnZhbGlkIGZvcm0gbWVzc2FnZSwgb3ZlcnJpZGUgaWYgYSBtb3JlIHNwZWNpZmljIG1lc3NhZ2UgaXMgbmVlZGVkXHJcbiAgICovXHJcbiAgcHVibGljIGRlZmF1bHRJbnZhbGlkRm9ybU1lc3NhZ2U6IHN0cmluZyA9ICdQbGVhc2VDb3JyZWN0Rm9ybV9TQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmF1bHQgdW5rbm93biBzYXZlIGVycm9yIG1lc3NhZ2UsIG92ZXJyaWRlIGlmIGEgbW9yZSBzcGVjaWZpYyBtZXNzYWdlIGlzIG5lZWRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZWZhdWx0VW5rbm93blNhdmVFcnJvcjogc3RyaW5nID0gJ1BhZ2VCYXNlVW5rbm93blNhdmVFcnJvcl9TQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gb3B0IG91dCBvZiBoaWRpbmcgdGhlIHNwbGFzaCBzY3JlZW4gd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWRcclxuICAgKi9cclxuICBwdWJsaWMgc2tpcEhpZGVTcGxhc2hPbkNvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gc2V0IHRvIHRydWUgYW55IG5hdmlnYXRpb24gZW5kIGV2ZW50cyB0aGF0IGFyZSBzdHJpY3RseSBxdWVyeSBwYXJhbSBjaGFuZ2VzIHdpbGxcclxuICAgKiBub3QgY2FsbCB0aGUgb25OYXZpZ2F0aW9uRW5kIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyBwYWdlcyB0byBjaGFuZ2UgdGhlIHZpZXcgd2l0aCBxdWVyeVxyXG4gICAqIHBhcmFtcyBhbmQgbm90IHRyaWdnZXIgYSBmdWxsIHJlZnJlc2guXHJcbiAgICovXHJcbiAgcHVibGljIGlnbm9yZVF1ZXJ5UGFyYW1zT25OYXZpZ2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgcHJldmlvdXNVcmw6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gdW5zdWJzY3JpYmUgZnJvbSBvYnNlcnZhYmxlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIGtub3cgd2hlbiB0aGUgcGFnZSBoYXMgYmVlbiBsb2FkZWQsIHRoaXMgd2lsbCBiZSBjb21wbGV0ZWRcclxuICAgKiBhZnRlciBvbkFmdGVyVmlld0luaXRcclxuICAgKi9cclxuICBwcml2YXRlIF9hZnRlclZpZXdJbml0Q29tcGxldGU6IFJlcGxheVN1YmplY3Q8dm9pZD4gPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xyXG4gIHB1YmxpYyBhZnRlclZpZXdJbml0Q29tcGxldGU6IE9ic2VydmFibGU8dm9pZD4gPSB0aGlzLl9hZnRlclZpZXdJbml0Q29tcGxldGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGRlZmluZWQgdGhlIGZvcm0gd2lsbCBhdXRvbWF0aWNhbGx5IHNjcm9sbCB0byB0aGUgZmlyc3QgaW52YWxpZCBmb3JtIGNvbnRyb2xcclxuICAgKiBpZiBpdCdzIG91dHNpZGUgb2YgdGhlIHZpZXdcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSByb3V0ZXIgZXZlbnRzIE5hdmlnYXRpb25FbmRcclxuICAgKiBVc2VkIHRvIGtub3cgaWYgYWxyZWFkeSBzdWJzY3JpYmVkIHRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRW5kU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvKipcclxuICAgKiBDb21tb24gc2VydmljZXMgdXNlZCBieSBwYWdlLWJhc2VcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyO1xyXG4gIHByb3RlY3RlZCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGU7XHJcbiAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHNwbGFzaFNlcnZpY2U6IFNwbGFzaFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHJvdXRlckhlbHBlcjogUm91dGVySGVscGVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgIHRoaXMuZXJyb3JTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KEVycm9yU2VydmljZSk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XHJcbiAgICB0aGlzLnNjcm9sbFNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU2Nyb2xsU2VydmljZSk7XHJcbiAgICB0aGlzLnJvdXRlciA9IGluamVjdG9yLmdldChSb3V0ZXIpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSA9IGluamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBpbmplY3Rvci5nZXQoRGlhbG9nU2VydmljZSk7XHJcbiAgICB0aGlzLnNwbGFzaFNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU3BsYXNoU2VydmljZSk7XHJcbiAgICB0aGlzLnJvdXRlckhlbHBlciA9IGluamVjdG9yLmdldChSb3V0ZXJIZWxwZXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXJyb3JzIHRvIGJlIHNob3duIGZvciB0aGUgY29tcG9uZW50LlxyXG4gICAqIEF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIG9uIHByb21pc2UgcmVqZWN0aW9uIGZyb20gc2F2ZSBhbmQgc2hhcmVkIHdpdGggdGhlIFVJLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Vycm9yczogc3RyaW5nID0gJyc7XHJcbiAgcHVibGljIGdldCBlcnJvcnMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9lcnJvcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBBbmd1bGFyIG5nT25Jbml0IGxpZmVjeWNsZSBob29rLlxyXG4gICAqIENhbGxlZCBiZWZvcmUgb25Jbml0IGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuIEFkZCBzZXR1cCBsb2dpYyBoZXJlIHRoYXQgZG9lc1xyXG4gICAqIG5vdCBuZWVkIHRvIGJlIHJ1biBvbiBldmVyeSByZWxvYWQuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG9uRmlyc3RJbml0KCk6IHZvaWQgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyBhcyBwYXJ0IG9mIHRoZSBBbmd1bGFyIG5nT25Jbml0XHJcbiAgICogbGlmZWN5Y2xlIGhvb2suIEl0IG11c3QgcHJvdmlkZSBhIFBhZ2VJbml0UmVzdWx0IGJhY2sgdG8gdGhlIGJhc2UgY2xhc3MgdG8gcHJvcGVybHlcclxuICAgKiBzZXQgdXAgdGhlIHBhZ2UuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uSW5pdCgpOiBQcm9taXNlPFBhZ2VJbml0UmVzdWx0PjtcclxuICBwcm90ZWN0ZWQgaW5pdFByb21pc2UhOiBQcm9taXNlPFBhZ2VJbml0UmVzdWx0PjtcclxuXHJcbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGluZyk7XHJcbiAgICAgIHRoaXMuc2V0VXBSb3V0ZXJTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgIHRoaXMub25GaXJzdEluaXQoKTtcclxuICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMub25Jbml0KCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmluaXRQcm9taXNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcclxuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgQW5ndWxhciBMaWZlY3ljbGUgZXZlbnQgbmdPbkFmdGVyVmlld0luaXQuXHJcbiAgICogSXQgZmlyZXMgYWZ0ZXIgYWxsIHN1Yi1jb21wb25lbnRzIGhhdmUgZ29uZSB0aHJvdWdoIHRoZWlyIGluaXRpYWxpemF0aW9uIHBoYXNlLlxyXG4gICAqIEl0IGlzIGluIHRoaXMgcGhhc2UgdGhhdCB0aGUgdmlldyBjb21wb25lbnRzIHNob3VsZCBhbHJlYWR5IGV4aXN0LCBzbyBhIGRlcml2ZWQgY2xhc3Mgc2hvdWxkXHJcbiAgICogbG9hZCBkYXRhIGZyb20gdGhlIEFQSSB0byBwb3B1bGF0ZSBhbnkgdmlldyBjb21wb25lbnRzLiBUaGUgcHJvbWlzZSB0aGF0XHJcbiAgICogaXMgcmV0dXJuZWQgbXVzdCBub3QgcmVzb2x2ZSB1bnRpbCBhbGwgcmVxdWlyZWQgZGF0YSBoYXMgY29tcGxldGVseSBsb2FkZWRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4geyB9O1xyXG4gIHB1YmxpYyBhc3luYyBuZ0FmdGVyVmlld0luaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcclxuICAgICAgdGhpcy5wYXJzZUluaXRSZXN1bHQoaW5pdFJlc3VsdCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJWaWV3SW5pdCgpO1xyXG5cclxuICAgICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlLm5leHQoKTtcclxuICAgICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLm9uRm9ybUxvYWRDb21wbGV0ZSgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc3RhdHVzLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLnNraXBIaWRlU3BsYXNoT25Db21wbGV0ZSkge1xyXG4gICAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnNwbGFzaFNlcnZpY2UuaGlkZVNwbGFzaCgpO1xyXG4gICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBsaWZlY3ljbGUgbWV0aG9kIHRoYXQgZXhlY3V0ZXMgb25jZSBhbGwgZGF0YSBoYXMgYmVlbiBsb2FkZWRcclxuICAgKiB0aHJvdWdoIG5nQWZ0ZXJWaWV3SW5pdCBhbmQgZnJvbSBsb2NhbCBzdG9yYWdlIGlmIHJlcXVpcmVkLlxyXG4gICAqIEl0IGlzIGF0IHRoaXMgcG9pbnQgdGhhdCB5b3UgY2FuIHN1YnNjcmliZSB0byBjaGFuZ2VzIG9uIHRoZSBmb3JtXHJcbiAgICogcmVsaWFibHlcclxuICAgKlxyXG4gICAqIEBwcm90ZWN0ZWRcclxuICAgKiBAbWVtYmVyb2YgUGFnZUJhc2VDb21wb25lbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgb25Gb3JtTG9hZENvbXBsZXRlKCk6IFByb21pc2U8YW55PiB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBldmVyeSBOYXZpZ2F0aW9uRW5kIGV2ZW50LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBvbk5hdmlnYXRpb25FbmQoKTogdm9pZCB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVsb2FkIHRoZSBjb21wb25lbnQga2lja2luZyBvZmYgdGhlIG5nT25Jbml0IGFuZCBuZ0FmdGVyVmlld0luaXQgbGlmZWN5Y2xlIGhvb2tzLlxyXG4gICAqIEFueSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHJlc2V0IHNob3VsZCBiZSBkb25lIHNvIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZWxvYWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hZnRlclZpZXdJbml0Q29tcGxldGUgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xyXG5cclxuICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRpbmcpO1xyXG4gICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMub25Jbml0KCk7XHJcbiAgICB0aGlzLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBvdmVycmlkZGVuIGluIGEgZGVyaXZlZCBjbGFzcyB0aGlzIG1ldGhvZCB3aWxsIHN5bmMgdGhlIGZvcm0gc3RhdGVcclxuICAgKiBpbnRvIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgQVBJLiBUaGUgdmFsdWUgc2hvdWxkIG5vdFxyXG4gICAqIGFjdHVhbGx5IGJlIHNlbnQgdG8gdGhlIEFQSSB5ZXQuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5TW9kZWxVcGRhdGVzKCk6IFByb21pc2U8dm9pZD4geyB9O1xyXG5cclxuICAvKipcclxuICAgKiBTYXZlIHRoZSBtb2RlbCBzdGF0ZSB0byB0aGUgQVBJIGFuZCByZXR1cm4gYSBwcm9taXNlIHRoYXRcclxuICAgKiBjb250YWlucyB0aGUgdXBkYXRlZCBlbnRpdHlJRC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlamVjdGVkXHJcbiAgICogaWYgdGhlIHNhdmUgZmFpbHMgYW5kIGVycm9ycyBhbmQgdGhlIG92ZXJsYXkgc3RhdHVzIHdpbGwgYmUgdXBkYXRlZFxyXG4gICAqIGFjY29yZGluZ2x5XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVUb0FwaSgpOiBQcm9taXNlPG51bWJlciB8IHZvaWQ+IHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIGFmdGVyIHRoZSBzYXZlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxyXG4gICAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgZGVyaXZlZCBjbGFzcyB0byBuYXZpZ2F0ZVxyXG4gICAqIHRvIGEgcHJvcGVydGllcy9zdGF0dXMgcGFnZSBvciBlbWl0IGFwcHJvcHJpYXRlbHkgaWYgd2l0aGluIGEgZGlhbG9nXHJcbiAgICogQHBhcmFtIGVudGl0eUlkXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG9uU2F2ZUNvbXBsZXRlKGVudGl0eUlkPzogbnVtYmVyKTogdm9pZCB7IH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzYXZlLiAgV2Ugd2lsbCBmaXJzdCB0b3VjaCBhbGwgY29udHJvbHMgdG8gc2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzXHJcbiAgICogaWYgdGhlIGZvcm0gaXMgaW52YWxpZC4gIElmIHRoZSBmb3JtIGlzIHZhbGlkIHdlIHdpbGwgYXR0ZW1wdCB0byBzYXZlIGFuZCBhbnkgZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWRcclxuICAgKiBiYWNrIHRvIHRoZSB1c2VyXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIG9uU2F2ZShldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBoYXMgcGVuZGluZyBhc3luYyB2YWxpZGF0b3JzLCB3YWl0IGZvciBpdCB0aGVtIHRvIGNvbXBsZXRlIGJlZm9yZSBwcm9jZWVkaW5nXHJcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAucGVuZGluZykge1xyXG4gICAgICAvLyBTaG93IHRoZSBzYXZpbmcgb3ZlcmxheSB3aGVuIHRoZSBmb3JtIGhhcyBwZW5kaW5nIGFzeW5jIHZhbGlkYXRvcnNcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuU2F2aW5nKTtcclxuICAgICAgYXdhaXQgbGFzdFZhbHVlRnJvbSh0aGlzLmZvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzLnBpcGUoZmlsdGVyKHN0YXR1cyA9PiBzdGF0dXMgIT09ICdQRU5ESU5HJyksIHRha2UoMSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZW1vdmUgdGhlIHNhdmluZyBvdmVybGF5IHRvIGRpc3BsYXkgYW55IGVycm9yc1xyXG4gICAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkZWQpO1xyXG4gICAgICBcclxuICAgICAgLy8gT25seSBzaG93IHRoZSBiYW5uZXIgd2l0aCB0aGUgZ2VuZXJpYyBtZXNzYWdlIGlmIHRoZSBwYXJlbnQgY29tcG9uZW50IGhhc24ndCBhbHJlYWR5IHNldCBvbmVcclxuICAgICAgLy8gYnkgaW1wbGVtZW50aW5nIG9uU2F2ZSBmb3IgYWRkaXRpb25hbCB2YWxpZGF0aW9uXHJcbiAgICAgIGlmICh0aGlzLmVycm9ycyA9PT0gJycpIHtcclxuICAgICAgICB0aGlzLnNob3dFcnJvckJhbm5lcih0aGlzLmRlZmF1bHRJbnZhbGlkRm9ybU1lc3NhZ2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXJTZWxlY3Rvcikge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvSXRlbSh0aGlzLnNjcm9sbENvbnRhaW5lclNlbGVjdG9yISwgXCIubmctaW52YWxpZFwiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gYXZhaWxhYmxlIHRvIHRyaWdnZXIgYSBzYXZlIGFuZCBieXBhc3MgdGhlIGZvcm0gdmFsaWRhdGlvbiBjaGVja3MuXHJcbiAgICogVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHVzZXIgY2hvb3NlcyBhIHJlbW92ZSBhY3Rpb24gZnJvbSB3aXRoaW4gYW4gZWRpdCBkaWFsb2cuIElmIHRoZSBkaWFsb2cgZm9ybSBpcyBpbnZhbGlkXHJcbiAgICogdGhhdCBpcyBubyBjb25jZXJuIHRvIHRoZSB1c2VyIGlmIHRoZXkgd2lzaCB0byByZW1vdmUgdGhlIGl0ZW0gdGhleSBhcmUgZWRpdGluZy5cclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgb25TYXZlV2l0aG91dFZhbGlkYXRlKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0aGF0IHdpbGwgbG9nIGFuIGVycm9yIHRoYXQgaXMgcGFzc2VkIGluIHRvIHRoZSBjb25zb2xlXHJcbiAgICogQHBhcmFtIGVcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25FcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcclxuICAgIHRoaXMuZXJyb3JTZXJ2aWNlLmxvZ0NvbnNvbGVFcnJvcihlcnJvcik7XHJcbiAgICB0aGlzLnNob3dFcnJvck92ZXJsYXkoZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBtZXNzYWdlIGluIGEgd2hvbGUtcGFnZSBvdmVybGF5LiBUaGlzIHdpbGwgcHJldmVudCBhbnkgbW9yZVxyXG4gICAqIGludGVyYWN0aW9ucyB3aXRoIHRoZSBwYWdlLiBJdCBjYW4gdGFrZSBhIHN0cmluZyBlcnJvciBtZXNzYWdlIG9yIGEgcmF3IEFQSVxyXG4gICAqIGVycm9yIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLiBJZiB0aGUgQVBJIGVycm9yIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlXHJcbiAgICogYSBnZW5lcmljIG1lc3NhZ2UgaXMgc2hvd24gaW5zdGVhZFxyXG4gICAqIEBwYXJhbSB7KEVycm9yIHwgc3RyaW5nKX0gZXJyb3JcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd0Vycm9yT3ZlcmxheShlcnJvcjogRXJyb3IgfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKS5zdWJzY3JpYmUoKHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdlcnJvcicsIHRyYW5zbGF0ZWRNZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBpbiB0aGUgYmFubmVyIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4gIFRoaXMgd2lsbCBub3QgcHJvZHVjZSBhXHJcbiAgICogd2hvbGUtcGFnZSBvdmVybGF5IGxpa2UgdGhlIGZ1bmN0aW9uIHNob3dFcnJvciB3aWxsLiAgSXQgY2FuIHRha2UgYSBzdHJpbmcgZXJyb3IgbWVzc2FnZVxyXG4gICAqIG9yIHJhdyBBUEkgZXJyb3IgdGhhdCBuZWVkcyB0byBiZSBwYXJzZWQuICBJZiB0aGUgQVBJIGVycm9yIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlLFxyXG4gICAqIGEgZ2VuZXJpYyBtZXNzYWdlIChjdXN0b21pemFibGUgdmlhIHVua25vd25FcnJvckRlZmF1bHQpIGlzIHNob3duIGluc3RlYWQuXHJcbiAgICogQHBhcmFtIGVycm9yXHJcbiAgICogQHBhcmFtIHVua25vd25FcnJvckRlZmF1bHRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd0Vycm9yQmFubmVyKGVycm9yOiBFcnJvciB8IHN0cmluZywgdW5rbm93bkVycm9yRGVmYXVsdD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IsIHVua25vd25FcnJvckRlZmF1bHQpLnN1YnNjcmliZSgodHJhbnNsYXRlZE1lc3NhZ2U6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLl9lcnJvcnMgPSB0cmFuc2xhdGVkTWVzc2FnZTtcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2VzIGFuZCB0cmFuc2xhdGVzIGFuIEFQSSBlcnJvciBvciBlcnJvciBzdHJpbmcuXHJcbiAgICogQHBhcmFtIGVcclxuICAgKiBAcGFyYW0gdW5rbm93bkVycm9yRGVmYXVsdFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBnZXRFcnJvck1lc3NhZ2UoZTogRXJyb3IgfCBzdHJpbmcsIHVua25vd25FcnJvckRlZmF1bHQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgbGV0IGV4dHJhY3RlZE1lc3NhZ2UgPSB0aGlzLmVycm9yU2VydmljZS5wYXJzZUFwaUVycm9yKGUsIHVua25vd25FcnJvckRlZmF1bHQpO1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoZXh0cmFjdGVkTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgZXJyb3JzIHRvIGhpZGUgdGhlIGVycm9ycyBiYW5uZXIuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGhpZGVFcnJvckJhbm5lcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Vycm9ycyA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBkaXNwbGF5IHN0YXR1cyB0byBvdmVybGF5IHRoZSB3aG9sZSBwYWdlIHdoaWxlIGxvYWRpbmcgb3Igc2F2aW5nXHJcbiAgICogYW5kIGNsZWFyIGl0IHdoZW4gdGhlIGZvcm0gaXMgcmVhZHlcclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICogQHBhcmFtIHtQYWdlU3RhdHVzfSBzdGF0dXNcclxuICAgKiBAbWVtYmVyb2YgRm9ybUJhc2VDb21wb25lbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd1N0YXR1cyhzdGF0dXM6IFBhZ2VTdGF0dXMpIHtcclxuICAgIGxldCBrbm93blN0YXR1cyA9IFBhZ2VTdGF0dXNlc1tzdGF0dXNdO1xyXG4gICAgaWYgKGtub3duU3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cyhrbm93blN0YXR1cy5zdGF0dXMsIGtub3duU3RhdHVzLm1lc3NhZ2UsIHVuZGVmaW5lZCwga25vd25TdGF0dXMubm9EYXRhVGVtcGxhdGUsIGtub3duU3RhdHVzLm92ZXJsYXlDbGFzc0xpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxsb3dzIHRoZSBjb21wb25lbnQgdG8gZW50ZXIgYSBwZW5kaW5nIHN0YXR1cyBhbmQgZXhlY3V0ZSBhIGZ1bmN0aW9uIHRoYXQgb24gY29tcGxldGlvbiB3aWxsIHJldHVybiB0aGUgc3RhdHVzXHJcbiAgICogdG8gaGFzRGF0YS4gSWYgYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgY2FsbGJhY2sgYW4gZXJyb3IgYmFubmVyIGNhbiBiZSBzaG93bi5cclxuICAgKiBAcGFyYW0gY2FsbGJhY2tcclxuICAgKiBAcGFyYW0gcGVuZGluZ01lc3NhZ2UgLSBvcHRpb25hbCBjdXN0b20gcGVuZGluZyBtZXNzYWdlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgcnVuQmxvY2tpbmdBY3Rpb24oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8YW55PiwgcGVuZGluZ01lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5oaWRlRXJyb3JCYW5uZXIoKTtcclxuICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygncGVuZGluZycsIHBlbmRpbmdNZXNzYWdlKTtcclxuXHJcbiAgICByZXR1cm4gY2FsbGJhY2soKS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0Vycm9yQmFubmVyKGVycm9yKTtcclxuICAgICAgLy8gVGhyb3cgdGhlIGVycm9yIGZvciBhbnkgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgbWF5IGJlIGxpc3RlbmluZyBhbmQgbmVlZCB0byByZWFjdFxyXG4gICAgICAvLyB0byBhbnkgZXJyb3JzIGhhcHBlbmluZyB3aXRoaW4gdGhpcyBjYWxsYmFja1xyXG4gICAgICB0aHJvdyAoZXJyb3IpO1xyXG4gICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRlZCk7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBQYXJzZXMgdGhlIHBhZ2UgaW5pdCByZXN1bHQgYW5kIHNldHMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIG9uIHRoZSBwYWdlXHJcbiAgICogQHBhcmFtIHJlc3VsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VJbml0UmVzdWx0KHJlc3VsdDogUGFnZUluaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdFJlc3VsdCA9IHJlc3VsdDtcclxuICAgIHRoaXMudGl0bGUgPSByZXN1bHQudGl0bGU7XHJcbiAgICB0aGlzLnN1YlRpdGxlID0gcmVzdWx0LnN1YlRpdGxlO1xyXG4gICAgdGhpcy5zdWJUaXRsZVVybCA9IHJlc3VsdC5zdWJUaXRsZVVybDtcclxuICAgIHRoaXMuYnJlYWRjcnVtYnMgPSByZXN1bHQuYnJlYWRjcnVtYnM7XHJcbiAgICB0aGlzLmhlbHAgPSByZXN1bHQuaGVscDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIHRoZSBwYWdlIHN0YXR1cywgdHJpZ2dlcnMgdGhlIHNhdmUgYWN0aW9uIGFuZCBoYW5kbGVzIGVycm9ycyB0aHJvd24uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuU2F2aW5nKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5TW9kZWxVcGRhdGVzKCk7XHJcbiAgICAgIGxldCBlbnRpdHlJZCA9IGF3YWl0IHRoaXMuc2F2ZVRvQXBpKCkgfHwgLTE7XHJcblxyXG4gICAgICB0aGlzLl9lcnJvcnMgPSAnJztcclxuXHJcbiAgICAgIHRoaXMub25TYXZlQ29tcGxldGUoZW50aXR5SWQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy9jbGVhciB0aGUgXCJzYXZpbmdcIiBvdmVybGF5IGFuZCBzaG93IHRoZSBtZXNzYWdlIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXcgdGhyb3VnaCB0aGUgZXJyb3JzIHByb3BlcnR5XHJcbiAgICAgIHRoaXMuc2hvd0Vycm9yQmFubmVyKGVycm9yLCB0aGlzLmRlZmF1bHRVbmtub3duU2F2ZUVycm9yKTtcclxuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdXAgdGhlIHJvdXRlciBldmVudCBzdWJzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRVcFJvdXRlclN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubmF2aWdhdGlvbkVuZFN1YnNjcmlwdGlvbiAmJiAhdGhpcy5kZXN0cm95ZWQuY2xvc2VkKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXNVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgICAvLyBSZWFjdCB0byBuYXZpZ2F0aW9uIGV2ZW50c1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25FbmRTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxyXG4gICAgICAgIGZpbHRlcihlID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcclxuICAgICAgKS5zdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCBjdXJyZW50VXJsOiBzdHJpbmcgPSAoPE5hdmlnYXRpb25FbmQ+ZSkudXJsO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlnbm9yZVF1ZXJ5UGFyYW1zT25OYXZpZ2F0aW9uQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzVXJsLnNwbGl0KCc/JylbMF0gIT09IGN1cnJlbnRVcmwuc3BsaXQoJz8nKVswXSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkVuZEhhbmRsZXIoKDxOYXZpZ2F0aW9uRW5kPmUpLnVybCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzVXJsICE9PSBjdXJyZW50VXJsKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRW5kSGFuZGxlcigoPE5hdmlnYXRpb25FbmQ+ZSkudXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRpb25FbmRIYW5kbGVyKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnByZXZpb3VzVXJsID0gdXJsO1xyXG4gICAgdGhpcy5vbk5hdmlnYXRpb25FbmQoKTtcclxuICB9XHJcbn1cclxuIl19
|
1
|
+
import { Directive, HostBinding } from '@angular/core';
|
2
|
+
import { UntypedFormGroup } from '@angular/forms';
|
3
|
+
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
4
|
+
import { TranslateService } from '@ngx-translate/core';
|
5
|
+
import { lastValueFrom, ReplaySubject, Subject } from 'rxjs';
|
6
|
+
import { filter, take, takeUntil } from 'rxjs/operators';
|
7
|
+
import { ErrorService } from '../../../core/error.service';
|
8
|
+
import { RouterHelper } from '../../../core/router-helper.service';
|
9
|
+
import { ScrollService } from '../../../core/scroll.service';
|
10
|
+
import { DialogService } from '../../../display/dialog/dialog.service';
|
11
|
+
import { SplashService } from '../../../display/splash/splash.service';
|
12
|
+
import { Overlay } from '../../../display/view-overlay/view-overlay.component';
|
13
|
+
import { PageStatus, PageStatuses } from '../page-statuses';
|
14
|
+
import * as i0 from "@angular/core";
|
15
|
+
export class PageInitResult {
|
16
|
+
constructor() {
|
17
|
+
this.title = '';
|
18
|
+
this.subTitle = '';
|
19
|
+
this.subTitleUrl = '';
|
20
|
+
}
|
21
|
+
}
|
22
|
+
export class PageBaseComponent {
|
23
|
+
constructor(injector) {
|
24
|
+
/** Default css classes applied to host element */
|
25
|
+
this.classList = 'd-flex flex-grow';
|
26
|
+
/**
|
27
|
+
* Title for the page displayed in the header
|
28
|
+
*/
|
29
|
+
this.title = '';
|
30
|
+
/**
|
31
|
+
* Sub title for the page displayed in the header
|
32
|
+
*/
|
33
|
+
this.subTitle = '';
|
34
|
+
/**
|
35
|
+
* Sub title url for the page displayed in the header
|
36
|
+
*/
|
37
|
+
this.subTitleUrl = '';
|
38
|
+
/**
|
39
|
+
* Status overlay for the page
|
40
|
+
*/
|
41
|
+
this.status = new Overlay('pending', 'Loading');
|
42
|
+
/**
|
43
|
+
* Form group to be used if needed by the page
|
44
|
+
*/
|
45
|
+
this.formGroup = new UntypedFormGroup({});
|
46
|
+
/**
|
47
|
+
* Default invalid form message, override if a more specific message is needed
|
48
|
+
*/
|
49
|
+
this.defaultInvalidFormMessage = 'PleaseCorrectForm_SC';
|
50
|
+
/**
|
51
|
+
* Default unknown save error message, override if a more specific message is needed
|
52
|
+
*/
|
53
|
+
this.defaultUnknownSaveError = 'PageBaseUnknownSaveError_SC';
|
54
|
+
/**
|
55
|
+
* Used to opt out of hiding the splash screen when the page is loaded
|
56
|
+
*/
|
57
|
+
this.skipHideSplashOnComplete = false;
|
58
|
+
/**
|
59
|
+
* When set to true any navigation end events that are strictly query param changes will
|
60
|
+
* not call the onNavigationEnd function. This allows pages to change the view with query
|
61
|
+
* params and not trigger a full refresh.
|
62
|
+
*/
|
63
|
+
this.ignoreQueryParamsOnNavigationChange = false;
|
64
|
+
this.previousUrl = "";
|
65
|
+
/**
|
66
|
+
* Used to unsubscribe from observables
|
67
|
+
*/
|
68
|
+
this.destroyed = new Subject();
|
69
|
+
/**
|
70
|
+
* Used to know when the page has been loaded, this will be completed
|
71
|
+
* after onAfterViewInit
|
72
|
+
*/
|
73
|
+
this._afterViewInitComplete = new ReplaySubject();
|
74
|
+
this.afterViewInitComplete = this._afterViewInitComplete;
|
75
|
+
/**
|
76
|
+
* Errors to be shown for the component.
|
77
|
+
* Automatically populated on promise rejection from save and shared with the UI.
|
78
|
+
*/
|
79
|
+
this._errors = '';
|
80
|
+
this.errorService = injector.get(ErrorService);
|
81
|
+
this.translateService = injector.get(TranslateService);
|
82
|
+
this.scrollService = injector.get(ScrollService);
|
83
|
+
this.router = injector.get(Router);
|
84
|
+
this.activatedRoute = injector.get(ActivatedRoute);
|
85
|
+
this.dialogService = injector.get(DialogService);
|
86
|
+
this.splashService = injector.get(SplashService);
|
87
|
+
this.routerHelper = injector.get(RouterHelper);
|
88
|
+
}
|
89
|
+
get errors() {
|
90
|
+
return this._errors;
|
91
|
+
}
|
92
|
+
/**
|
93
|
+
* Optional lifecycle hook that is called as part of the Angular ngOnInit lifecycle hook.
|
94
|
+
* Called before onInit is called for the first time. Add setup logic here that does
|
95
|
+
* not need to be run on every reload.
|
96
|
+
*/
|
97
|
+
onFirstInit() { }
|
98
|
+
async ngOnInit() {
|
99
|
+
try {
|
100
|
+
this.showStatus(PageStatus.Loading);
|
101
|
+
this.setUpRouterSubscriptions();
|
102
|
+
this.onFirstInit();
|
103
|
+
this.initPromise = this.onInit();
|
104
|
+
await this.initPromise;
|
105
|
+
}
|
106
|
+
catch (error) {
|
107
|
+
this.splashService.hideSplash();
|
108
|
+
this.onError(error);
|
109
|
+
}
|
110
|
+
;
|
111
|
+
}
|
112
|
+
/**
|
113
|
+
* This method is called just after the Angular Lifecycle event ngOnAfterViewInit.
|
114
|
+
* It fires after all sub-components have gone through their initialization phase.
|
115
|
+
* It is in this phase that the view components should already exist, so a derived class should
|
116
|
+
* load data from the API to populate any view components. The promise that
|
117
|
+
* is returned must not resolve until all required data has completely loaded
|
118
|
+
*/
|
119
|
+
async onAfterViewInit() { }
|
120
|
+
;
|
121
|
+
async ngAfterViewInit() {
|
122
|
+
try {
|
123
|
+
const initResult = await this.initPromise;
|
124
|
+
this.parseInitResult(initResult);
|
125
|
+
await this.onAfterViewInit();
|
126
|
+
this._afterViewInitComplete.next();
|
127
|
+
this._afterViewInitComplete.complete();
|
128
|
+
await this.onFormLoadComplete();
|
129
|
+
if (this.status.status === 'pending') {
|
130
|
+
this.showStatus(PageStatus.Loaded);
|
131
|
+
}
|
132
|
+
if (!this.skipHideSplashOnComplete) {
|
133
|
+
this.splashService.hideSplash();
|
134
|
+
}
|
135
|
+
}
|
136
|
+
catch (error) {
|
137
|
+
this.splashService.hideSplash();
|
138
|
+
this.onError(error);
|
139
|
+
}
|
140
|
+
}
|
141
|
+
/**
|
142
|
+
* A lifecycle method that executes once all data has been loaded
|
143
|
+
* through ngAfterViewInit and from local storage if required.
|
144
|
+
* It is at this point that you can subscribe to changes on the form
|
145
|
+
* reliably
|
146
|
+
*
|
147
|
+
* @protected
|
148
|
+
* @memberof PageBaseComponent
|
149
|
+
*/
|
150
|
+
async onFormLoadComplete() { }
|
151
|
+
/**
|
152
|
+
* A lifecycle hook that is called after every NavigationEnd event.
|
153
|
+
*/
|
154
|
+
onNavigationEnd() { }
|
155
|
+
/**
|
156
|
+
* Reload the component kicking off the ngOnInit and ngAfterViewInit lifecycle hooks.
|
157
|
+
* Any state that needs to be reset should be done so before calling this method.
|
158
|
+
*/
|
159
|
+
reload() {
|
160
|
+
this._afterViewInitComplete = new ReplaySubject();
|
161
|
+
this.showStatus(PageStatus.Loading);
|
162
|
+
this.initPromise = this.onInit();
|
163
|
+
this.ngAfterViewInit();
|
164
|
+
}
|
165
|
+
/**
|
166
|
+
* When overridden in a derived class this method will sync the form state
|
167
|
+
* into the object that will be persisted to the API. The value should not
|
168
|
+
* actually be sent to the API yet.
|
169
|
+
*/
|
170
|
+
async applyModelUpdates() { }
|
171
|
+
;
|
172
|
+
/**
|
173
|
+
* Save the model state to the API and return a promise that
|
174
|
+
* contains the updated entityID. The promise should be rejected
|
175
|
+
* if the save fails and errors and the overlay status will be updated
|
176
|
+
* accordingly
|
177
|
+
*/
|
178
|
+
async saveToApi() { }
|
179
|
+
;
|
180
|
+
/**
|
181
|
+
* Called after the save has completed successfully.
|
182
|
+
* It is the responsibility of the derived class to navigate
|
183
|
+
* to a properties/status page or emit appropriately if within a dialog
|
184
|
+
* @param entityId
|
185
|
+
*/
|
186
|
+
onSaveComplete(entityId) { }
|
187
|
+
;
|
188
|
+
/**
|
189
|
+
* Function called when the user clicks save. We will first touch all controls to show validation messages
|
190
|
+
* if the form is invalid. If the form is valid we will attempt to save and any errors will be reported
|
191
|
+
* back to the user
|
192
|
+
* @param event
|
193
|
+
*/
|
194
|
+
async onSave(event) {
|
195
|
+
this.formGroup.markAllAsTouched();
|
196
|
+
// If the form has pending async validators, wait for it them to complete before proceeding
|
197
|
+
if (this.formGroup.pending) {
|
198
|
+
// Show the saving overlay when the form has pending async validators
|
199
|
+
this.showStatus(PageStatus.Saving);
|
200
|
+
await lastValueFrom(this.formGroup.statusChanges.pipe(filter(status => status !== 'PENDING'), take(1), takeUntil(this.destroyed)));
|
201
|
+
}
|
202
|
+
if (this.formGroup.valid) {
|
203
|
+
await this.save();
|
204
|
+
}
|
205
|
+
else {
|
206
|
+
// Remove the saving overlay to display any errors
|
207
|
+
this.showStatus(PageStatus.Loaded);
|
208
|
+
// Only show the banner with the generic message if the parent component hasn't already set one
|
209
|
+
// by implementing onSave for additional validation
|
210
|
+
if (this.errors === '') {
|
211
|
+
this.showErrorBanner(this.defaultInvalidFormMessage);
|
212
|
+
}
|
213
|
+
if (this.scrollContainerSelector) {
|
214
|
+
setTimeout(() => {
|
215
|
+
this.scrollService.scrollToItem(this.scrollContainerSelector, ".ng-invalid");
|
216
|
+
});
|
217
|
+
}
|
218
|
+
}
|
219
|
+
}
|
220
|
+
/**
|
221
|
+
* Function available to trigger a save and bypass the form validation checks.
|
222
|
+
* This is useful if the user chooses a remove action from within an edit dialog. If the dialog form is invalid
|
223
|
+
* that is no concern to the user if they wish to remove the item they are editing.
|
224
|
+
* @param event
|
225
|
+
*/
|
226
|
+
async onSaveWithoutValidate(event) {
|
227
|
+
await this.save();
|
228
|
+
}
|
229
|
+
/**
|
230
|
+
* Function called when the component is destroyed
|
231
|
+
*/
|
232
|
+
ngOnDestroy() {
|
233
|
+
this.destroyed.next();
|
234
|
+
this.destroyed.unsubscribe();
|
235
|
+
}
|
236
|
+
/**
|
237
|
+
* Function that will log an error that is passed in to the console
|
238
|
+
* @param e
|
239
|
+
*/
|
240
|
+
onError(error) {
|
241
|
+
this.errorService.logConsoleError(error);
|
242
|
+
this.showErrorOverlay(error);
|
243
|
+
}
|
244
|
+
/**
|
245
|
+
* Show an error message in a whole-page overlay. This will prevent any more
|
246
|
+
* interactions with the page. It can take a string error message or a raw API
|
247
|
+
* error that needs to be parsed. If the API error isn't something we can handle
|
248
|
+
* a generic message is shown instead
|
249
|
+
* @param {(Error | string)} error
|
250
|
+
*/
|
251
|
+
showErrorOverlay(error) {
|
252
|
+
this.getErrorMessage(error).subscribe((translatedMessage) => {
|
253
|
+
this.status.setStatus('error', translatedMessage);
|
254
|
+
});
|
255
|
+
}
|
256
|
+
/**
|
257
|
+
* Show an error in the banner at the top of the screen. This will not produce a
|
258
|
+
* whole-page overlay like the function showError will. It can take a string error message
|
259
|
+
* or raw API error that needs to be parsed. If the API error isn't something we can handle,
|
260
|
+
* a generic message (customizable via unknownErrorDefault) is shown instead.
|
261
|
+
* @param error
|
262
|
+
* @param unknownErrorDefault
|
263
|
+
*/
|
264
|
+
showErrorBanner(error, unknownErrorDefault) {
|
265
|
+
this.getErrorMessage(error, unknownErrorDefault).subscribe((translatedMessage) => {
|
266
|
+
this._errors = translatedMessage;
|
267
|
+
this.showStatus(PageStatus.Loaded);
|
268
|
+
});
|
269
|
+
}
|
270
|
+
/**
|
271
|
+
* Parses and translates an API error or error string.
|
272
|
+
* @param e
|
273
|
+
* @param unknownErrorDefault
|
274
|
+
*/
|
275
|
+
getErrorMessage(e, unknownErrorDefault) {
|
276
|
+
let extractedMessage = this.errorService.parseApiError(e, unknownErrorDefault);
|
277
|
+
return this.translateService.get(extractedMessage);
|
278
|
+
}
|
279
|
+
/**
|
280
|
+
* Clear the errors to hide the errors banner.
|
281
|
+
*/
|
282
|
+
hideErrorBanner() {
|
283
|
+
this._errors = '';
|
284
|
+
}
|
285
|
+
/**
|
286
|
+
* Change the display status to overlay the whole page while loading or saving
|
287
|
+
* and clear it when the form is ready
|
288
|
+
* @protected
|
289
|
+
* @param {PageStatus} status
|
290
|
+
* @memberof FormBaseComponent
|
291
|
+
*/
|
292
|
+
showStatus(status) {
|
293
|
+
let knownStatus = PageStatuses[status];
|
294
|
+
if (knownStatus) {
|
295
|
+
this.status.setStatus(knownStatus.status, knownStatus.message, undefined, knownStatus.noDataTemplate, knownStatus.overlayClassList);
|
296
|
+
}
|
297
|
+
}
|
298
|
+
/**
|
299
|
+
* Allows the component to enter a pending status and execute a function that on completion will return the status
|
300
|
+
* to hasData. If an error occurs within the callback an error banner can be shown.
|
301
|
+
* @param callback
|
302
|
+
* @param pendingMessage - optional custom pending message
|
303
|
+
* @returns
|
304
|
+
*/
|
305
|
+
async runBlockingAction(callback, pendingMessage) {
|
306
|
+
this.hideErrorBanner();
|
307
|
+
this.status.setStatus('pending', pendingMessage);
|
308
|
+
return callback().catch(error => {
|
309
|
+
this.showErrorBanner(error);
|
310
|
+
// Throw the error for any downstream components that may be listening and need to react
|
311
|
+
// to any errors happening within this callback
|
312
|
+
throw (error);
|
313
|
+
}).finally(() => {
|
314
|
+
this.showStatus(PageStatus.Loaded);
|
315
|
+
});
|
316
|
+
}
|
317
|
+
;
|
318
|
+
/**
|
319
|
+
* Parses the page init result and sets the necessary properties on the page
|
320
|
+
* @param result
|
321
|
+
*/
|
322
|
+
parseInitResult(result) {
|
323
|
+
this.initResult = result;
|
324
|
+
this.title = result.title;
|
325
|
+
this.subTitle = result.subTitle;
|
326
|
+
this.subTitleUrl = result.subTitleUrl;
|
327
|
+
this.breadcrumbs = result.breadcrumbs;
|
328
|
+
this.help = result.help;
|
329
|
+
}
|
330
|
+
/**
|
331
|
+
* Controls the page status, triggers the save action and handles errors thrown.
|
332
|
+
*/
|
333
|
+
async save() {
|
334
|
+
this.showStatus(PageStatus.Saving);
|
335
|
+
try {
|
336
|
+
await this.applyModelUpdates();
|
337
|
+
let entityId = await this.saveToApi() || -1;
|
338
|
+
this._errors = '';
|
339
|
+
this.onSaveComplete(entityId);
|
340
|
+
}
|
341
|
+
catch (error) {
|
342
|
+
//clear the "saving" overlay and show the message at the top of the view through the errors property
|
343
|
+
this.showErrorBanner(error, this.defaultUnknownSaveError);
|
344
|
+
this.splashService.hideSplash();
|
345
|
+
}
|
346
|
+
}
|
347
|
+
/**
|
348
|
+
* Sets up the router event subscriptions
|
349
|
+
*/
|
350
|
+
setUpRouterSubscriptions() {
|
351
|
+
if (!this.navigationEndSubscription && !this.destroyed.closed) {
|
352
|
+
this.previousUrl = this.router.url;
|
353
|
+
// React to navigation events
|
354
|
+
this.navigationEndSubscription = this.router.events.pipe(takeUntil(this.destroyed), filter(e => e instanceof NavigationEnd)).subscribe(e => {
|
355
|
+
try {
|
356
|
+
let currentUrl = e.url;
|
357
|
+
if (this.ignoreQueryParamsOnNavigationChange) {
|
358
|
+
if (this.previousUrl.split('?')[0] !== currentUrl.split('?')[0]) {
|
359
|
+
this.navigationEndHandler(e.url);
|
360
|
+
}
|
361
|
+
}
|
362
|
+
else {
|
363
|
+
if (this.previousUrl !== currentUrl) {
|
364
|
+
this.navigationEndHandler(e.url);
|
365
|
+
}
|
366
|
+
}
|
367
|
+
}
|
368
|
+
catch (error) {
|
369
|
+
this.onError(error);
|
370
|
+
}
|
371
|
+
});
|
372
|
+
}
|
373
|
+
}
|
374
|
+
navigationEndHandler(url) {
|
375
|
+
this.previousUrl = url;
|
376
|
+
this.onNavigationEnd();
|
377
|
+
}
|
378
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PageBaseComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
|
379
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: PageBaseComponent, host: { properties: { "class": "this.classList" } }, ngImport: i0 }); }
|
380
|
+
}
|
381
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PageBaseComponent, decorators: [{
|
382
|
+
type: Directive
|
383
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { classList: [{
|
384
|
+
type: HostBinding,
|
385
|
+
args: ['class']
|
386
|
+
}] } });
|
387
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLWJhc2UvcGFnZS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxXQUFXLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFNUQsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFDRSxVQUFLLEdBQVksRUFBRSxDQUFDO1FBQ3BCLGFBQVEsR0FB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QU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEhvc3RCaW5kaW5nLCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgbGFzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vLi4vLi4vY29udHJvbHMvbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcbmltcG9ydCB7IEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZXJyb3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlckhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcm91dGVyLWhlbHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2Nyb2xsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWxwIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9oZWxwL2hlbHAtdHlwZXMnO1xyXG5pbXBvcnQgeyBTcGxhc2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9zcGxhc2gvc3BsYXNoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPdmVybGF5IH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS92aWV3LW92ZXJsYXkvdmlldy1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBhZ2VTdGF0dXMsIFBhZ2VTdGF0dXNlcyB9IGZyb20gJy4uL3BhZ2Utc3RhdHVzZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhZ2VJbml0UmVzdWx0IHtcclxuICB0aXRsZT86IHN0cmluZyA9ICcnO1xyXG4gIHN1YlRpdGxlPzogc3RyaW5nID0gJyc7XHJcbiAgc3ViVGl0bGVVcmw/OiBzdHJpbmcgPSAnJztcclxuICBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcclxuICBoZWxwPzogSGVscDtcclxufVxyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWdlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogRGVmYXVsdCBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIGhvc3QgZWxlbWVudCAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcm90ZWN0ZWQgY2xhc3NMaXN0ID0gJ2QtZmxleCBmbGV4LWdyb3cnO1xyXG5cclxuICAvKipcclxuICAgKiBUaXRsZSBmb3IgdGhlIHBhZ2UgZGlzcGxheWVkIGluIHRoZSBoZWFkZXJcclxuICAgKi9cclxuICBwdWJsaWMgdGl0bGU/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogU3ViIHRpdGxlIGZvciB0aGUgcGFnZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdWJUaXRsZT86IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBTdWIgdGl0bGUgdXJsIGZvciB0aGUgcGFnZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdWJUaXRsZVVybD86IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBTdGF0dXMgb3ZlcmxheSBmb3IgdGhlIHBhZ2VcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdHVzOiBPdmVybGF5ID0gbmV3IE92ZXJsYXkoJ3BlbmRpbmcnLCAnTG9hZGluZycpO1xyXG5cclxuICAvKipcclxuICAgKiBCcmVhZGNydW1icyBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdWx0IHJldHVybmVkIGZyb20gdGhlIG9uSW5pdCBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBpbml0UmVzdWx0ITogUGFnZUluaXRSZXN1bHQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21wb25lbnQsIHdoaWNoIGNhbiBvbmx5IGJlIHNldCB0aHJvdWdoIG9uSW5pdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBoZWxwOiBIZWxwIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBGb3JtIGdyb3VwIHRvIGJlIHVzZWQgaWYgbmVlZGVkIGJ5IHRoZSBwYWdlXHJcbiAgICovXHJcbiAgcHVibGljIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBpbnZhbGlkIGZvcm0gbWVzc2FnZSwgb3ZlcnJpZGUgaWYgYSBtb3JlIHNwZWNpZmljIG1lc3NhZ2UgaXMgbmVlZGVkXHJcbiAgICovXHJcbiAgcHVibGljIGRlZmF1bHRJbnZhbGlkRm9ybU1lc3NhZ2U6IHN0cmluZyA9ICdQbGVhc2VDb3JyZWN0Rm9ybV9TQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmF1bHQgdW5rbm93biBzYXZlIGVycm9yIG1lc3NhZ2UsIG92ZXJyaWRlIGlmIGEgbW9yZSBzcGVjaWZpYyBtZXNzYWdlIGlzIG5lZWRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZWZhdWx0VW5rbm93blNhdmVFcnJvcjogc3RyaW5nID0gJ1BhZ2VCYXNlVW5rbm93blNhdmVFcnJvcl9TQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gb3B0IG91dCBvZiBoaWRpbmcgdGhlIHNwbGFzaCBzY3JlZW4gd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWRcclxuICAgKi9cclxuICBwdWJsaWMgc2tpcEhpZGVTcGxhc2hPbkNvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gc2V0IHRvIHRydWUgYW55IG5hdmlnYXRpb24gZW5kIGV2ZW50cyB0aGF0IGFyZSBzdHJpY3RseSBxdWVyeSBwYXJhbSBjaGFuZ2VzIHdpbGxcclxuICAgKiBub3QgY2FsbCB0aGUgb25OYXZpZ2F0aW9uRW5kIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyBwYWdlcyB0byBjaGFuZ2UgdGhlIHZpZXcgd2l0aCBxdWVyeVxyXG4gICAqIHBhcmFtcyBhbmQgbm90IHRyaWdnZXIgYSBmdWxsIHJlZnJlc2guXHJcbiAgICovXHJcbiAgcHVibGljIGlnbm9yZVF1ZXJ5UGFyYW1zT25OYXZpZ2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgcHJldmlvdXNVcmw6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gdW5zdWJzY3JpYmUgZnJvbSBvYnNlcnZhYmxlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIGtub3cgd2hlbiB0aGUgcGFnZSBoYXMgYmVlbiBsb2FkZWQsIHRoaXMgd2lsbCBiZSBjb21wbGV0ZWRcclxuICAgKiBhZnRlciBvbkFmdGVyVmlld0luaXRcclxuICAgKi9cclxuICBwcml2YXRlIF9hZnRlclZpZXdJbml0Q29tcGxldGU6IFJlcGxheVN1YmplY3Q8dm9pZD4gPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xyXG4gIHB1YmxpYyBhZnRlclZpZXdJbml0Q29tcGxldGU6IE9ic2VydmFibGU8dm9pZD4gPSB0aGlzLl9hZnRlclZpZXdJbml0Q29tcGxldGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGRlZmluZWQgdGhlIGZvcm0gd2lsbCBhdXRvbWF0aWNhbGx5IHNjcm9sbCB0byB0aGUgZmlyc3QgaW52YWxpZCBmb3JtIGNvbnRyb2xcclxuICAgKiBpZiBpdCdzIG91dHNpZGUgb2YgdGhlIHZpZXdcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSByb3V0ZXIgZXZlbnRzIE5hdmlnYXRpb25FbmRcclxuICAgKiBVc2VkIHRvIGtub3cgaWYgYWxyZWFkeSBzdWJzY3JpYmVkIHRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRW5kU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvKipcclxuICAgKiBDb21tb24gc2VydmljZXMgdXNlZCBieSBwYWdlLWJhc2VcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyO1xyXG4gIHByb3RlY3RlZCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGU7XHJcbiAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHNwbGFzaFNlcnZpY2U6IFNwbGFzaFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHJvdXRlckhlbHBlcjogUm91dGVySGVscGVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgIHRoaXMuZXJyb3JTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KEVycm9yU2VydmljZSk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XHJcbiAgICB0aGlzLnNjcm9sbFNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU2Nyb2xsU2VydmljZSk7XHJcbiAgICB0aGlzLnJvdXRlciA9IGluamVjdG9yLmdldChSb3V0ZXIpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSA9IGluamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBpbmplY3Rvci5nZXQoRGlhbG9nU2VydmljZSk7XHJcbiAgICB0aGlzLnNwbGFzaFNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU3BsYXNoU2VydmljZSk7XHJcbiAgICB0aGlzLnJvdXRlckhlbHBlciA9IGluamVjdG9yLmdldChSb3V0ZXJIZWxwZXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXJyb3JzIHRvIGJlIHNob3duIGZvciB0aGUgY29tcG9uZW50LlxyXG4gICAqIEF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIG9uIHByb21pc2UgcmVqZWN0aW9uIGZyb20gc2F2ZSBhbmQgc2hhcmVkIHdpdGggdGhlIFVJLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Vycm9yczogc3RyaW5nID0gJyc7XHJcbiAgcHVibGljIGdldCBlcnJvcnMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9lcnJvcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBBbmd1bGFyIG5nT25Jbml0IGxpZmVjeWNsZSBob29rLlxyXG4gICAqIENhbGxlZCBiZWZvcmUgb25Jbml0IGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuIEFkZCBzZXR1cCBsb2dpYyBoZXJlIHRoYXQgZG9lc1xyXG4gICAqIG5vdCBuZWVkIHRvIGJlIHJ1biBvbiBldmVyeSByZWxvYWQuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG9uRmlyc3RJbml0KCk6IHZvaWQgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyBhcyBwYXJ0IG9mIHRoZSBBbmd1bGFyIG5nT25Jbml0XHJcbiAgICogbGlmZWN5Y2xlIGhvb2suIEl0IG11c3QgcHJvdmlkZSBhIFBhZ2VJbml0UmVzdWx0IGJhY2sgdG8gdGhlIGJhc2UgY2xhc3MgdG8gcHJvcGVybHlcclxuICAgKiBzZXQgdXAgdGhlIHBhZ2UuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uSW5pdCgpOiBQcm9taXNlPFBhZ2VJbml0UmVzdWx0PjtcclxuICBwcm90ZWN0ZWQgaW5pdFByb21pc2UhOiBQcm9taXNlPFBhZ2VJbml0UmVzdWx0PjtcclxuXHJcbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGluZyk7XHJcbiAgICAgIHRoaXMuc2V0VXBSb3V0ZXJTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgIHRoaXMub25GaXJzdEluaXQoKTtcclxuICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMub25Jbml0KCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmluaXRQcm9taXNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcclxuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgQW5ndWxhciBMaWZlY3ljbGUgZXZlbnQgbmdPbkFmdGVyVmlld0luaXQuXHJcbiAgICogSXQgZmlyZXMgYWZ0ZXIgYWxsIHN1Yi1jb21wb25lbnRzIGhhdmUgZ29uZSB0aHJvdWdoIHRoZWlyIGluaXRpYWxpemF0aW9uIHBoYXNlLlxyXG4gICAqIEl0IGlzIGluIHRoaXMgcGhhc2UgdGhhdCB0aGUgdmlldyBjb21wb25lbnRzIHNob3VsZCBhbHJlYWR5IGV4aXN0LCBzbyBhIGRlcml2ZWQgY2xhc3Mgc2hvdWxkXHJcbiAgICogbG9hZCBkYXRhIGZyb20gdGhlIEFQSSB0byBwb3B1bGF0ZSBhbnkgdmlldyBjb21wb25lbnRzLiBUaGUgcHJvbWlzZSB0aGF0XHJcbiAgICogaXMgcmV0dXJuZWQgbXVzdCBub3QgcmVzb2x2ZSB1bnRpbCBhbGwgcmVxdWlyZWQgZGF0YSBoYXMgY29tcGxldGVseSBsb2FkZWRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4geyB9O1xyXG4gIHB1YmxpYyBhc3luYyBuZ0FmdGVyVmlld0luaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcclxuICAgICAgdGhpcy5wYXJzZUluaXRSZXN1bHQoaW5pdFJlc3VsdCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJWaWV3SW5pdCgpO1xyXG5cclxuICAgICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlLm5leHQoKTtcclxuICAgICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLm9uRm9ybUxvYWRDb21wbGV0ZSgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc3RhdHVzLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLnNraXBIaWRlU3BsYXNoT25Db21wbGV0ZSkge1xyXG4gICAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnNwbGFzaFNlcnZpY2UuaGlkZVNwbGFzaCgpO1xyXG4gICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBsaWZlY3ljbGUgbWV0aG9kIHRoYXQgZXhlY3V0ZXMgb25jZSBhbGwgZGF0YSBoYXMgYmVlbiBsb2FkZWRcclxuICAgKiB0aHJvdWdoIG5nQWZ0ZXJWaWV3SW5pdCBhbmQgZnJvbSBsb2NhbCBzdG9yYWdlIGlmIHJlcXVpcmVkLlxyXG4gICAqIEl0IGlzIGF0IHRoaXMgcG9pbnQgdGhhdCB5b3UgY2FuIHN1YnNjcmliZSB0byBjaGFuZ2VzIG9uIHRoZSBmb3JtXHJcbiAgICogcmVsaWFibHlcclxuICAgKlxyXG4gICAqIEBwcm90ZWN0ZWRcclxuICAgKiBAbWVtYmVyb2YgUGFnZUJhc2VDb21wb25lbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgb25Gb3JtTG9hZENvbXBsZXRlKCk6IFByb21pc2U8YW55PiB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBldmVyeSBOYXZpZ2F0aW9uRW5kIGV2ZW50LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBvbk5hdmlnYXRpb25FbmQoKTogdm9pZCB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVsb2FkIHRoZSBjb21wb25lbnQga2lja2luZyBvZmYgdGhlIG5nT25Jbml0IGFuZCBuZ0FmdGVyVmlld0luaXQgbGlmZWN5Y2xlIGhvb2tzLlxyXG4gICAqIEFueSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHJlc2V0IHNob3VsZCBiZSBkb25lIHNvIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZWxvYWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hZnRlclZpZXdJbml0Q29tcGxldGUgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xyXG5cclxuICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRpbmcpO1xyXG4gICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMub25Jbml0KCk7XHJcbiAgICB0aGlzLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBvdmVycmlkZGVuIGluIGEgZGVyaXZlZCBjbGFzcyB0aGlzIG1ldGhvZCB3aWxsIHN5bmMgdGhlIGZvcm0gc3RhdGVcclxuICAgKiBpbnRvIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgQVBJLiBUaGUgdmFsdWUgc2hvdWxkIG5vdFxyXG4gICAqIGFjdHVhbGx5IGJlIHNlbnQgdG8gdGhlIEFQSSB5ZXQuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5TW9kZWxVcGRhdGVzKCk6IFByb21pc2U8dm9pZD4geyB9O1xyXG5cclxuICAvKipcclxuICAgKiBTYXZlIHRoZSBtb2RlbCBzdGF0ZSB0byB0aGUgQVBJIGFuZCByZXR1cm4gYSBwcm9taXNlIHRoYXRcclxuICAgKiBjb250YWlucyB0aGUgdXBkYXRlZCBlbnRpdHlJRC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlamVjdGVkXHJcbiAgICogaWYgdGhlIHNhdmUgZmFpbHMgYW5kIGVycm9ycyBhbmQgdGhlIG92ZXJsYXkgc3RhdHVzIHdpbGwgYmUgdXBkYXRlZFxyXG4gICAqIGFjY29yZGluZ2x5XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVUb0FwaSgpOiBQcm9taXNlPG51bWJlciB8IHZvaWQ+IHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIGFmdGVyIHRoZSBzYXZlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxyXG4gICAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgZGVyaXZlZCBjbGFzcyB0byBuYXZpZ2F0ZVxyXG4gICAqIHRvIGEgcHJvcGVydGllcy9zdGF0dXMgcGFnZSBvciBlbWl0IGFwcHJvcHJpYXRlbHkgaWYgd2l0aGluIGEgZGlhbG9nXHJcbiAgICogQHBhcmFtIGVudGl0eUlkXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG9uU2F2ZUNvbXBsZXRlKGVudGl0eUlkPzogbnVtYmVyKTogdm9pZCB7IH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzYXZlLiAgV2Ugd2lsbCBmaXJzdCB0b3VjaCBhbGwgY29udHJvbHMgdG8gc2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzXHJcbiAgICogaWYgdGhlIGZvcm0gaXMgaW52YWxpZC4gIElmIHRoZSBmb3JtIGlzIHZhbGlkIHdlIHdpbGwgYXR0ZW1wdCB0byBzYXZlIGFuZCBhbnkgZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWRcclxuICAgKiBiYWNrIHRvIHRoZSB1c2VyXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIG9uU2F2ZShldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBoYXMgcGVuZGluZyBhc3luYyB2YWxpZGF0b3JzLCB3YWl0IGZvciBpdCB0aGVtIHRvIGNvbXBsZXRlIGJlZm9yZSBwcm9jZWVkaW5nXHJcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAucGVuZGluZykge1xyXG4gICAgICAvLyBTaG93IHRoZSBzYXZpbmcgb3ZlcmxheSB3aGVuIHRoZSBmb3JtIGhhcyBwZW5kaW5nIGFzeW5jIHZhbGlkYXRvcnNcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuU2F2aW5nKTtcclxuICAgICAgYXdhaXQgbGFzdFZhbHVlRnJvbSh0aGlzLmZvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzLnBpcGUoZmlsdGVyKHN0YXR1cyA9PiBzdGF0dXMgIT09ICdQRU5ESU5HJyksIHRha2UoMSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZW1vdmUgdGhlIHNhdmluZyBvdmVybGF5IHRvIGRpc3BsYXkgYW55IGVycm9yc1xyXG4gICAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkZWQpO1xyXG4gICAgICBcclxuICAgICAgLy8gT25seSBzaG93IHRoZSBiYW5uZXIgd2l0aCB0aGUgZ2VuZXJpYyBtZXNzYWdlIGlmIHRoZSBwYXJlbnQgY29tcG9uZW50IGhhc24ndCBhbHJlYWR5IHNldCBvbmVcclxuICAgICAgLy8gYnkgaW1wbGVtZW50aW5nIG9uU2F2ZSBmb3IgYWRkaXRpb25hbCB2YWxpZGF0aW9uXHJcbiAgICAgIGlmICh0aGlzLmVycm9ycyA9PT0gJycpIHtcclxuICAgICAgICB0aGlzLnNob3dFcnJvckJhbm5lcih0aGlzLmRlZmF1bHRJbnZhbGlkRm9ybU1lc3NhZ2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXJTZWxlY3Rvcikge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvSXRlbSh0aGlzLnNjcm9sbENvbnRhaW5lclNlbGVjdG9yISwgXCIubmctaW52YWxpZFwiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gYXZhaWxhYmxlIHRvIHRyaWdnZXIgYSBzYXZlIGFuZCBieXBhc3MgdGhlIGZvcm0gdmFsaWRhdGlvbiBjaGVja3MuXHJcbiAgICogVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHVzZXIgY2hvb3NlcyBhIHJlbW92ZSBhY3Rpb24gZnJvbSB3aXRoaW4gYW4gZWRpdCBkaWFsb2cuIElmIHRoZSBkaWFsb2cgZm9ybSBpcyBpbnZhbGlkXHJcbiAgICogdGhhdCBpcyBubyBjb25jZXJuIHRvIHRoZSB1c2VyIGlmIHRoZXkgd2lzaCB0byByZW1vdmUgdGhlIGl0ZW0gdGhleSBhcmUgZWRpdGluZy5cclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgb25TYXZlV2l0aG91dFZhbGlkYXRlKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0aGF0IHdpbGwgbG9nIGFuIGVycm9yIHRoYXQgaXMgcGFzc2VkIGluIHRvIHRoZSBjb25zb2xlXHJcbiAgICogQHBhcmFtIGVcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25FcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcclxuICAgIHRoaXMuZXJyb3JTZXJ2aWNlLmxvZ0NvbnNvbGVFcnJvcihlcnJvcik7XHJcbiAgICB0aGlzLnNob3dFcnJvck92ZXJsYXkoZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBtZXNzYWdlIGluIGEgd2hvbGUtcGFnZSBvdmVybGF5LiBUaGlzIHdpbGwgcHJldmVudCBhbnkgbW9yZVxyXG4gICAqIGludGVyYWN0aW9ucyB3aXRoIHRoZSBwYWdlLiBJdCBjYW4gdGFrZSBhIHN0cmluZyBlcnJvciBtZXNzYWdlIG9yIGEgcmF3IEFQSVxyXG4gICAqIGVycm9yIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLiBJZiB0aGUgQVBJIGVycm9yIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlXHJcbiAgICogYSBnZW5lcmljIG1lc3NhZ2UgaXMgc2hvd24gaW5zdGVhZFxyXG4gICAqIEBwYXJhbSB7KEVycm9yIHwgc3RyaW5nKX0gZXJyb3JcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd0Vycm9yT3ZlcmxheShlcnJvcjogRXJyb3IgfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKS5zdWJzY3JpYmUoKHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdlcnJvcicsIHRyYW5zbGF0ZWRNZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBpbiB0aGUgYmFubmVyIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4gIFRoaXMgd2lsbCBub3QgcHJvZHVjZSBhXHJcbiAgICogd2hvbGUtcGFnZSBvdmVybGF5IGxpa2UgdGhlIGZ1bmN0aW9uIHNob3dFcnJvciB3aWxsLiAgSXQgY2FuIHRha2UgYSBzdHJpbmcgZXJyb3IgbWVzc2FnZVxyXG4gICAqIG9yIHJhdyBBUEkgZXJyb3IgdGhhdCBuZWVkcyB0byBiZSBwYXJzZWQuICBJZiB0aGUgQVBJIGVycm9yIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlLFxyXG4gICAqIGEgZ2VuZXJpYyBtZXNzYWdlIChjdXN0b21pemFibGUgdmlhIHVua25vd25FcnJvckRlZmF1bHQpIGlzIHNob3duIGluc3RlYWQuXHJcbiAgICogQHBhcmFtIGVycm9yXHJcbiAgICogQHBhcmFtIHVua25vd25FcnJvckRlZmF1bHRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd0Vycm9yQmFubmVyKGVycm9yOiBFcnJvciB8IHN0cmluZywgdW5rbm93bkVycm9yRGVmYXVsdD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IsIHVua25vd25FcnJvckRlZmF1bHQpLnN1YnNjcmliZSgodHJhbnNsYXRlZE1lc3NhZ2U6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLl9lcnJvcnMgPSB0cmFuc2xhdGVkTWVzc2FnZTtcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2VzIGFuZCB0cmFuc2xhdGVzIGFuIEFQSSBlcnJvciBvciBlcnJvciBzdHJpbmcuXHJcbiAgICogQHBhcmFtIGVcclxuICAgKiBAcGFyYW0gdW5rbm93bkVycm9yRGVmYXVsdFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBnZXRFcnJvck1lc3NhZ2UoZTogRXJyb3IgfCBzdHJpbmcsIHVua25vd25FcnJvckRlZmF1bHQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgbGV0IGV4dHJhY3RlZE1lc3NhZ2UgPSB0aGlzLmVycm9yU2VydmljZS5wYXJzZUFwaUVycm9yKGUsIHVua25vd25FcnJvckRlZmF1bHQpO1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoZXh0cmFjdGVkTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgZXJyb3JzIHRvIGhpZGUgdGhlIGVycm9ycyBiYW5uZXIuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGhpZGVFcnJvckJhbm5lcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Vycm9ycyA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBkaXNwbGF5IHN0YXR1cyB0byBvdmVybGF5IHRoZSB3aG9sZSBwYWdlIHdoaWxlIGxvYWRpbmcgb3Igc2F2aW5nXHJcbiAgICogYW5kIGNsZWFyIGl0IHdoZW4gdGhlIGZvcm0gaXMgcmVhZHlcclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICogQHBhcmFtIHtQYWdlU3RhdHVzfSBzdGF0dXNcclxuICAgKiBAbWVtYmVyb2YgRm9ybUJhc2VDb21wb25lbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd1N0YXR1cyhzdGF0dXM6IFBhZ2VTdGF0dXMpIHtcclxuICAgIGxldCBrbm93blN0YXR1cyA9IFBhZ2VTdGF0dXNlc1tzdGF0dXNdO1xyXG4gICAgaWYgKGtub3duU3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cyhrbm93blN0YXR1cy5zdGF0dXMsIGtub3duU3RhdHVzLm1lc3NhZ2UsIHVuZGVmaW5lZCwga25vd25TdGF0dXMubm9EYXRhVGVtcGxhdGUsIGtub3duU3RhdHVzLm92ZXJsYXlDbGFzc0xpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxsb3dzIHRoZSBjb21wb25lbnQgdG8gZW50ZXIgYSBwZW5kaW5nIHN0YXR1cyBhbmQgZXhlY3V0ZSBhIGZ1bmN0aW9uIHRoYXQgb24gY29tcGxldGlvbiB3aWxsIHJldHVybiB0aGUgc3RhdHVzXHJcbiAgICogdG8gaGFzRGF0YS4gSWYgYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgY2FsbGJhY2sgYW4gZXJyb3IgYmFubmVyIGNhbiBiZSBzaG93bi5cclxuICAgKiBAcGFyYW0gY2FsbGJhY2tcclxuICAgKiBAcGFyYW0gcGVuZGluZ01lc3NhZ2UgLSBvcHRpb25hbCBjdXN0b20gcGVuZGluZyBtZXNzYWdlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgcnVuQmxvY2tpbmdBY3Rpb24oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8YW55PiwgcGVuZGluZ01lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5oaWRlRXJyb3JCYW5uZXIoKTtcclxuICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygncGVuZGluZycsIHBlbmRpbmdNZXNzYWdlKTtcclxuXHJcbiAgICByZXR1cm4gY2FsbGJhY2soKS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0Vycm9yQmFubmVyKGVycm9yKTtcclxuICAgICAgLy8gVGhyb3cgdGhlIGVycm9yIGZvciBhbnkgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgbWF5IGJlIGxpc3RlbmluZyBhbmQgbmVlZCB0byByZWFjdFxyXG4gICAgICAvLyB0byBhbnkgZXJyb3JzIGhhcHBlbmluZyB3aXRoaW4gdGhpcyBjYWxsYmFja1xyXG4gICAgICB0aHJvdyAoZXJyb3IpO1xyXG4gICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRlZCk7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBQYXJzZXMgdGhlIHBhZ2UgaW5pdCByZXN1bHQgYW5kIHNldHMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIG9uIHRoZSBwYWdlXHJcbiAgICogQHBhcmFtIHJlc3VsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VJbml0UmVzdWx0KHJlc3VsdDogUGFnZUluaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdFJlc3VsdCA9IHJlc3VsdDtcclxuICAgIHRoaXMudGl0bGUgPSByZXN1bHQudGl0bGU7XHJcbiAgICB0aGlzLnN1YlRpdGxlID0gcmVzdWx0LnN1YlRpdGxlO1xyXG4gICAgdGhpcy5zdWJUaXRsZVVybCA9IHJlc3VsdC5zdWJUaXRsZVVybDtcclxuICAgIHRoaXMuYnJlYWRjcnVtYnMgPSByZXN1bHQuYnJlYWRjcnVtYnM7XHJcbiAgICB0aGlzLmhlbHAgPSByZXN1bHQuaGVscDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIHRoZSBwYWdlIHN0YXR1cywgdHJpZ2dlcnMgdGhlIHNhdmUgYWN0aW9uIGFuZCBoYW5kbGVzIGVycm9ycyB0aHJvd24uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuU2F2aW5nKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5TW9kZWxVcGRhdGVzKCk7XHJcbiAgICAgIGxldCBlbnRpdHlJZCA9IGF3YWl0IHRoaXMuc2F2ZVRvQXBpKCkgfHwgLTE7XHJcblxyXG4gICAgICB0aGlzLl9lcnJvcnMgPSAnJztcclxuXHJcbiAgICAgIHRoaXMub25TYXZlQ29tcGxldGUoZW50aXR5SWQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy9jbGVhciB0aGUgXCJzYXZpbmdcIiBvdmVybGF5IGFuZCBzaG93IHRoZSBtZXNzYWdlIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXcgdGhyb3VnaCB0aGUgZXJyb3JzIHByb3BlcnR5XHJcbiAgICAgIHRoaXMuc2hvd0Vycm9yQmFubmVyKGVycm9yLCB0aGlzLmRlZmF1bHRVbmtub3duU2F2ZUVycm9yKTtcclxuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdXAgdGhlIHJvdXRlciBldmVudCBzdWJzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRVcFJvdXRlclN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubmF2aWdhdGlvbkVuZFN1YnNjcmlwdGlvbiAmJiAhdGhpcy5kZXN0cm95ZWQuY2xvc2VkKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXNVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgICAvLyBSZWFjdCB0byBuYXZpZ2F0aW9uIGV2ZW50c1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25FbmRTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxyXG4gICAgICAgIGZpbHRlcihlID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcclxuICAgICAgKS5zdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCBjdXJyZW50VXJsOiBzdHJpbmcgPSAoPE5hdmlnYXRpb25FbmQ+ZSkudXJsO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlnbm9yZVF1ZXJ5UGFyYW1zT25OYXZpZ2F0aW9uQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzVXJsLnNwbGl0KCc/JylbMF0gIT09IGN1cnJlbnRVcmwuc3BsaXQoJz8nKVswXSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkVuZEhhbmRsZXIoKDxOYXZpZ2F0aW9uRW5kPmUpLnVybCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzVXJsICE9PSBjdXJyZW50VXJsKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRW5kSGFuZGxlcigoPE5hdmlnYXRpb25FbmQ+ZSkudXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRpb25FbmRIYW5kbGVyKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnByZXZpb3VzVXJsID0gdXJsO1xyXG4gICAgdGhpcy5vbk5hdmlnYXRpb25FbmQoKTtcclxuICB9XHJcbn1cclxuIl19
|