@pega/angular-sdk-components 24.2.12 → 25.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/pega-angular-sdk-components.mjs +4828 -3717
- package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
- package/index.d.ts +4963 -3
- package/package.json +21 -6
- package/esm2022/lib/_bridge/angular-pconnect.mjs +0 -428
- package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +0 -107
- package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +0 -239
- package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +0 -142
- package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +0 -50
- package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +0 -29
- package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +0 -31
- package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +0 -51
- package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +0 -31
- package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +0 -82
- package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +0 -37
- package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +0 -38
- package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +0 -36
- package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +0 -25
- package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +0 -28
- package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +0 -42
- package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +0 -145
- package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +0 -33
- package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +0 -93
- package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +0 -18
- package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +0 -296
- package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +0 -96
- package/esm2022/lib/_components/field/check-box/check-box.component.mjs +0 -225
- package/esm2022/lib/_components/field/currency/currency.component.mjs +0 -195
- package/esm2022/lib/_components/field/date/date.component.mjs +0 -205
- package/esm2022/lib/_components/field/date-time/date-time.component.mjs +0 -196
- package/esm2022/lib/_components/field/decimal/decimal.component.mjs +0 -205
- package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +0 -300
- package/esm2022/lib/_components/field/email/email.component.mjs +0 -165
- package/esm2022/lib/_components/field/group/group.component.mjs +0 -64
- package/esm2022/lib/_components/field/integer/integer.component.mjs +0 -168
- package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +0 -45
- package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +0 -314
- package/esm2022/lib/_components/field/multiselect/utils.mjs +0 -187
- package/esm2022/lib/_components/field/percentage/percentage.component.mjs +0 -190
- package/esm2022/lib/_components/field/phone/phone.component.mjs +0 -155
- package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +0 -182
- package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +0 -109
- package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +0 -95
- package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +0 -57
- package/esm2022/lib/_components/field/text/text.component.mjs +0 -142
- package/esm2022/lib/_components/field/text-area/text-area.component.mjs +0 -165
- package/esm2022/lib/_components/field/text-content/text-content.component.mjs +0 -69
- package/esm2022/lib/_components/field/text-input/text-input.component.mjs +0 -165
- package/esm2022/lib/_components/field/time/time.component.mjs +0 -174
- package/esm2022/lib/_components/field/url/url.component.mjs +0 -165
- package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +0 -266
- package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +0 -18
- package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +0 -71
- package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +0 -461
- package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +0 -68
- package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +0 -24
- package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +0 -335
- package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +0 -32
- package/esm2022/lib/_components/infra/Containers/view-container/helper.mjs +0 -22
- package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +0 -211
- package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +0 -31
- package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +0 -407
- package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +0 -47
- package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +0 -87
- package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +0 -143
- package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +0 -18
- package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +0 -80
- package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +0 -136
- package/esm2022/lib/_components/infra/reference/reference.component.mjs +0 -126
- package/esm2022/lib/_components/infra/region/region.component.mjs +0 -33
- package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +0 -223
- package/esm2022/lib/_components/infra/stages/stages.component.mjs +0 -62
- package/esm2022/lib/_components/infra/view/view.component.mjs +0 -188
- package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +0 -156
- package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +0 -43
- package/esm2022/lib/_components/template/base/details-template-base.mjs +0 -56
- package/esm2022/lib/_components/template/base/form-template-base.mjs +0 -16
- package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +0 -101
- package/esm2022/lib/_components/template/case-view/case-view.component.mjs +0 -185
- package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +0 -68
- package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +0 -242
- package/esm2022/lib/_components/template/default-form/default-form.component.mjs +0 -73
- package/esm2022/lib/_components/template/details/details.component.mjs +0 -76
- package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +0 -45
- package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +0 -42
- package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +0 -39
- package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +0 -51
- package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +0 -48
- package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +0 -48
- package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +0 -65
- package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +0 -23
- package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +0 -131
- package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +0 -24
- package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +0 -22
- package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +0 -40
- package/esm2022/lib/_components/template/list-page/list-page.component.mjs +0 -14
- package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +0 -208
- package/esm2022/lib/_components/template/list-view/list-view.component.mjs +0 -1217
- package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +0 -60
- package/esm2022/lib/_components/template/list-view/utils.mjs +0 -662
- package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +0 -44
- package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +0 -30
- package/esm2022/lib/_components/template/one-column/one-column.component.mjs +0 -31
- package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +0 -16
- package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +0 -30
- package/esm2022/lib/_components/template/page/page.component.mjs +0 -52
- package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +0 -149
- package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +0 -138
- package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +0 -104
- package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +0 -271
- package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +0 -813
- package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +0 -129
- package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +0 -16
- package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +0 -67
- package/esm2022/lib/_components/template/three-column/three-column.component.mjs +0 -31
- package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +0 -16
- package/esm2022/lib/_components/template/two-column/two-column.component.mjs +0 -31
- package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +0 -40
- package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +0 -30
- package/esm2022/lib/_components/template/utils.mjs +0 -38
- package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +0 -31
- package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +0 -53
- package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +0 -137
- package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +0 -24
- package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +0 -393
- package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +0 -80
- package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +0 -521
- package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +0 -638
- package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +0 -57
- package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +0 -75
- package/esm2022/lib/_components/widget/todo/todo.component.mjs +0 -230
- package/esm2022/lib/_components/widget/utility/utility.component.mjs +0 -34
- package/esm2022/lib/_directives/thousand-seperator.directive.mjs +0 -28
- package/esm2022/lib/_helpers/case-utils.mjs +0 -71
- package/esm2022/lib/_helpers/common.mjs +0 -20
- package/esm2022/lib/_helpers/createstage-utils.mjs +0 -15
- package/esm2022/lib/_helpers/currency-utils.mjs +0 -57
- package/esm2022/lib/_helpers/date-format-utils.mjs +0 -68
- package/esm2022/lib/_helpers/event-util.mjs +0 -18
- package/esm2022/lib/_helpers/field-group-utils.mjs +0 -47
- package/esm2022/lib/_helpers/filter-utils.mjs +0 -105
- package/esm2022/lib/_helpers/formatters/boolean.mjs +0 -20
- package/esm2022/lib/_helpers/formatters/common.mjs +0 -17
- package/esm2022/lib/_helpers/formatters/currency-map.mjs +0 -903
- package/esm2022/lib/_helpers/formatters/currency.mjs +0 -68
- package/esm2022/lib/_helpers/formatters/date.mjs +0 -69
- package/esm2022/lib/_helpers/formatters/format-utils.mjs +0 -76
- package/esm2022/lib/_helpers/formatters/index.mjs +0 -124
- package/esm2022/lib/_helpers/instructions-utils.mjs +0 -36
- package/esm2022/lib/_helpers/tab-utils.mjs +0 -59
- package/esm2022/lib/_helpers/template-utils.mjs +0 -56
- package/esm2022/lib/_helpers/utils.mjs +0 -412
- package/esm2022/lib/_helpers/versionHelpers.mjs +0 -12
- package/esm2022/lib/_messages/error-messages.service.mjs +0 -31
- package/esm2022/lib/_messages/progress-spinner.service.mjs +0 -30
- package/esm2022/lib/_messages/update-worklist.service.mjs +0 -30
- package/esm2022/lib/_services/banner.service.mjs +0 -35
- package/esm2022/lib/_services/case.service.mjs +0 -32
- package/esm2022/lib/_services/datapage.service.mjs +0 -52
- package/esm2022/lib/_services/endpoints.mjs +0 -60
- package/esm2022/lib/_services/server-config.service.mjs +0 -52
- package/esm2022/lib/_types/PConnProps.interface.mjs +0 -2
- package/esm2022/pega-angular-sdk-components.mjs +0 -5
- package/esm2022/public-api.mjs +0 -145
- package/esm2022/sdk-local-component-map.mjs +0 -9
- package/lib/_bridge/angular-pconnect.d.ts +0 -142
- package/lib/_bridge/component-mapper/component-mapper.component.d.ts +0 -20
- package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +0 -219
- package/lib/_bridge/helpers/sdk_component_map.d.ts +0 -3
- package/lib/_components/designSystemExtension/alert/alert.component.d.ts +0 -12
- package/lib/_components/designSystemExtension/alert-banner/alert-banner.component.d.ts +0 -13
- package/lib/_components/designSystemExtension/banner/banner.component.d.ts +0 -14
- package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -19
- package/lib/_components/designSystemExtension/field-group/field-group.component.d.ts +0 -12
- package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +0 -20
- package/lib/_components/designSystemExtension/material-details/material-details.component.d.ts +0 -15
- package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +0 -13
- package/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.d.ts +0 -15
- package/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.d.ts +0 -9
- package/lib/_components/designSystemExtension/material-utility/material-utility.component.d.ts +0 -16
- package/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.d.ts +0 -11
- package/lib/_components/designSystemExtension/operator/operator.component.d.ts +0 -25
- package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +0 -15
- package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +0 -23
- package/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.d.ts +0 -7
- package/lib/_components/field/auto-complete/auto-complete.component.d.ts +0 -79
- package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +0 -23
- package/lib/_components/field/check-box/check-box.component.d.ts +0 -69
- package/lib/_components/field/currency/currency.component.d.ts +0 -54
- package/lib/_components/field/date/date.component.d.ts +0 -76
- package/lib/_components/field/date-time/date-time.component.d.ts +0 -62
- package/lib/_components/field/decimal/decimal.component.d.ts +0 -54
- package/lib/_components/field/dropdown/dropdown.component.d.ts +0 -71
- package/lib/_components/field/email/email.component.d.ts +0 -45
- package/lib/_components/field/group/group.component.d.ts +0 -32
- package/lib/_components/field/integer/integer.component.d.ts +0 -45
- package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +0 -14
- package/lib/_components/field/multiselect/multiselect.component.d.ts +0 -64
- package/lib/_components/field/multiselect/utils.d.ts +0 -8
- package/lib/_components/field/percentage/percentage.component.d.ts +0 -53
- package/lib/_components/field/phone/phone.component.d.ts +0 -43
- package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +0 -60
- package/lib/_components/field/rich-text/rich-text.component.d.ts +0 -43
- package/lib/_components/field/scalar-list/scalar-list.component.d.ts +0 -36
- package/lib/_components/field/semantic-link/semantic-link.component.d.ts +0 -29
- package/lib/_components/field/text/text.component.d.ts +0 -41
- package/lib/_components/field/text-area/text-area.component.d.ts +0 -46
- package/lib/_components/field/text-content/text-content.component.d.ts +0 -29
- package/lib/_components/field/text-input/text-input.component.d.ts +0 -46
- package/lib/_components/field/time/time.component.d.ts +0 -46
- package/lib/_components/field/url/url.component.d.ts +0 -45
- package/lib/_components/field/user-reference/user-reference.component.d.ts +0 -50
- package/lib/_components/infra/Containers/base-components/flow-container-base.component.d.ts +0 -8
- package/lib/_components/infra/Containers/base-components/helper.d.ts +0 -1
- package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +0 -82
- package/lib/_components/infra/Containers/flow-container/helpers.d.ts +0 -3
- package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -14
- package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +0 -69
- package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -14
- package/lib/_components/infra/Containers/view-container/helper.d.ts +0 -2
- package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -50
- package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +0 -12
- package/lib/_components/infra/assignment/assignment.component.d.ts +0 -74
- package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +0 -17
- package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -19
- package/lib/_components/infra/defer-load/defer-load.component.d.ts +0 -46
- package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +0 -8
- package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -30
- package/lib/_components/infra/navbar/navbar.component.d.ts +0 -52
- package/lib/_components/infra/reference/reference.component.d.ts +0 -36
- package/lib/_components/infra/region/region.component.d.ts +0 -13
- package/lib/_components/infra/root-container/root-container.component.d.ts +0 -36
- package/lib/_components/infra/stages/stages.component.d.ts +0 -28
- package/lib/_components/infra/view/view.component.d.ts +0 -40
- package/lib/_components/template/app-shell/app-shell.component.d.ts +0 -54
- package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -26
- package/lib/_components/template/base/details-template-base.d.ts +0 -21
- package/lib/_components/template/base/form-template-base.d.ts +0 -10
- package/lib/_components/template/case-summary/case-summary.component.d.ts +0 -35
- package/lib/_components/template/case-view/case-view.component.d.ts +0 -54
- package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -37
- package/lib/_components/template/data-reference/data-reference.component.d.ts +0 -40
- package/lib/_components/template/default-form/default-form.component.d.ts +0 -22
- package/lib/_components/template/details/details.component.d.ts +0 -11
- package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +0 -12
- package/lib/_components/template/details-one-column/details-one-column.component.d.ts +0 -11
- package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +0 -13
- package/lib/_components/template/details-three-column/details-three-column.component.d.ts +0 -14
- package/lib/_components/template/details-two-column/details-two-column.component.d.ts +0 -14
- package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +0 -13
- package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +0 -20
- package/lib/_components/template/field-group-list/field-group-list.component.d.ts +0 -9
- package/lib/_components/template/field-group-template/field-group-template.component.d.ts +0 -55
- package/lib/_components/template/field-value-list/field-value-list.component.d.ts +0 -9
- package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -15
- package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -24
- package/lib/_components/template/list-page/list-page.component.d.ts +0 -6
- package/lib/_components/template/list-view/DefaultViewMeta.d.ts +0 -1
- package/lib/_components/template/list-view/list-view.component.d.ts +0 -165
- package/lib/_components/template/list-view/listViewHelpers.d.ts +0 -1
- package/lib/_components/template/list-view/utils.d.ts +0 -118
- package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -24
- package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -13
- package/lib/_components/template/one-column/one-column.component.d.ts +0 -14
- package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -8
- package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -13
- package/lib/_components/template/page/page.component.d.ts +0 -24
- package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -34
- package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -36
- package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -42
- package/lib/_components/template/simple-table-manual/helpers.d.ts +0 -82
- package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +0 -168
- package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -31
- package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +0 -8
- package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -25
- package/lib/_components/template/three-column/three-column.component.d.ts +0 -14
- package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -8
- package/lib/_components/template/two-column/two-column.component.d.ts +0 -14
- package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -16
- package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -13
- package/lib/_components/template/utils.d.ts +0 -9
- package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +0 -14
- package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +0 -19
- package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +0 -51
- package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -18
- package/lib/_components/widget/attachment/attachment.component.d.ts +0 -74
- package/lib/_components/widget/case-history/case-history.component.d.ts +0 -23
- package/lib/_components/widget/feed-container/feed-container.component.d.ts +0 -48
- package/lib/_components/widget/file-utility/file-utility.component.d.ts +0 -149
- package/lib/_components/widget/list-utility/list-utility.component.d.ts +0 -23
- package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -28
- package/lib/_components/widget/todo/todo.component.d.ts +0 -61
- package/lib/_components/widget/utility/utility.component.d.ts +0 -24
- package/lib/_directives/thousand-seperator.directive.d.ts +0 -9
- package/lib/_helpers/case-utils.d.ts +0 -19
- package/lib/_helpers/common.d.ts +0 -3
- package/lib/_helpers/createstage-utils.d.ts +0 -1
- package/lib/_helpers/currency-utils.d.ts +0 -10
- package/lib/_helpers/date-format-utils.d.ts +0 -12
- package/lib/_helpers/event-util.d.ts +0 -1
- package/lib/_helpers/field-group-utils.d.ts +0 -16
- package/lib/_helpers/filter-utils.d.ts +0 -46
- package/lib/_helpers/formatters/boolean.d.ts +0 -3
- package/lib/_helpers/formatters/common.d.ts +0 -2
- package/lib/_helpers/formatters/currency-map.d.ts +0 -1132
- package/lib/_helpers/formatters/currency.d.ts +0 -8
- package/lib/_helpers/formatters/date.d.ts +0 -9
- package/lib/_helpers/formatters/format-utils.d.ts +0 -8
- package/lib/_helpers/formatters/index.d.ts +0 -17
- package/lib/_helpers/instructions-utils.d.ts +0 -4
- package/lib/_helpers/tab-utils.d.ts +0 -4
- package/lib/_helpers/template-utils.d.ts +0 -16
- package/lib/_helpers/utils.d.ts +0 -40
- package/lib/_helpers/versionHelpers.d.ts +0 -8
- package/lib/_messages/error-messages.service.d.ts +0 -15
- package/lib/_messages/progress-spinner.service.d.ts +0 -14
- package/lib/_messages/update-worklist.service.d.ts +0 -14
- package/lib/_services/banner.service.d.ts +0 -8
- package/lib/_services/case.service.d.ts +0 -12
- package/lib/_services/datapage.service.d.ts +0 -14
- package/lib/_services/endpoints.d.ts +0 -38
- package/lib/_services/server-config.service.d.ts +0 -31
- package/lib/_types/PConnProps.interface.d.ts +0 -17
- package/public-api.d.ts +0 -140
- package/sdk-local-component-map.d.ts +0 -2
|
@@ -1,662 +0,0 @@
|
|
|
1
|
-
import { getDefaultViewMeta } from './DefaultViewMeta';
|
|
2
|
-
const USER_REFERENCE = 'UserReference';
|
|
3
|
-
const PAGE = '!P!';
|
|
4
|
-
const PAGELIST = '!PL!';
|
|
5
|
-
export const formatConstants = {
|
|
6
|
-
WorkStatus: 'WorkStatus',
|
|
7
|
-
Integer: 'Integer',
|
|
8
|
-
WorkLink: 'WorkLink'
|
|
9
|
-
};
|
|
10
|
-
class DataApi {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.originalPropertyToMappedProperty = {};
|
|
13
|
-
this.mappedPropertyToOriginalProperty = {};
|
|
14
|
-
this.setPropertyMaps = this.setPropertyMaps.bind(this);
|
|
15
|
-
this.getMappedProperty = this.getMappedProperty.bind(this);
|
|
16
|
-
this.getOriginalProperty = this.getOriginalProperty.bind(this);
|
|
17
|
-
}
|
|
18
|
-
setPropertyMaps(originalToMappedPropertyObj = {}, mappedToOriginalPropertyObj = {}) {
|
|
19
|
-
this.originalPropertyToMappedProperty = {
|
|
20
|
-
...this.originalPropertyToMappedProperty,
|
|
21
|
-
...originalToMappedPropertyObj
|
|
22
|
-
};
|
|
23
|
-
this.mappedPropertyToOriginalProperty = {
|
|
24
|
-
...this.mappedPropertyToOriginalProperty,
|
|
25
|
-
...mappedToOriginalPropertyObj
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
getMappedProperty(propertyName) {
|
|
29
|
-
return this.originalPropertyToMappedProperty[propertyName] ?? propertyName;
|
|
30
|
-
}
|
|
31
|
-
getOriginalProperty(propertyName) {
|
|
32
|
-
return this.mappedPropertyToOriginalProperty[propertyName] ?? propertyName;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export async function getContext(componentConfig) {
|
|
36
|
-
const { promisesArray = [] // array of promises which can be invoked paralelly,
|
|
37
|
-
} = componentConfig;
|
|
38
|
-
const promisesResponseArray = await Promise.all(promisesArray);
|
|
39
|
-
const dataApi = new DataApi();
|
|
40
|
-
return {
|
|
41
|
-
promisesResponseArray,
|
|
42
|
-
setPropertyMaps: dataApi.setPropertyMaps,
|
|
43
|
-
getMappedProperty: dataApi.getMappedProperty,
|
|
44
|
-
getOriginalProperty: dataApi.getOriginalProperty
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* [getFieldNameFromEmbeddedFieldName]
|
|
49
|
-
* Description - converting embeddedField name starting with !P! or !PL! to normal field
|
|
50
|
-
* @ignore
|
|
51
|
-
* @param {string} propertyName EmbeddedField name starting with !P! or !PL!
|
|
52
|
-
* @returns {string} returns converted string without !P! or !PL! and :
|
|
53
|
-
*
|
|
54
|
-
* @example <caption>Example for getFieldNameFromEmbeddedFieldName </caption>
|
|
55
|
-
* getFieldNameFromEmbeddedFieldName('!P!Organisation:Name') return 'Organisation.Name'
|
|
56
|
-
* getFieldNameFromEmbeddedFieldName('!PL!Employees:Name') return 'Employees.Name'
|
|
57
|
-
*/
|
|
58
|
-
export function getFieldNameFromEmbeddedFieldName(propertyName) {
|
|
59
|
-
let value = propertyName;
|
|
60
|
-
if (value.startsWith(PAGE) || value.startsWith(PAGELIST)) {
|
|
61
|
-
value = value.substring(value.lastIndexOf('!') + 1);
|
|
62
|
-
value = value.replace(/:/g, '.');
|
|
63
|
-
}
|
|
64
|
-
return value;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* [updateMetaEmbeddedFieldID]
|
|
68
|
-
* Description - If the fieldID in meta starts with '!P!' or '!PL!' and contains ':' then replace them with .(dot)
|
|
69
|
-
* @ignore
|
|
70
|
-
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
|
|
71
|
-
*/
|
|
72
|
-
export function updateMetaEmbeddedFieldID(metaFields) {
|
|
73
|
-
return metaFields.forEach(metaField => {
|
|
74
|
-
if (metaField.fieldID?.startsWith(PAGE) || metaField.fieldID?.startsWith(PAGELIST)) {
|
|
75
|
-
metaField.fieldID = getFieldNameFromEmbeddedFieldName(metaField.fieldID);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
export const isEmbeddedField = field => {
|
|
80
|
-
if (field?.startsWith('@')) {
|
|
81
|
-
field = field.substring(field.indexOf(' ') + 1);
|
|
82
|
-
if (field[0] === '.')
|
|
83
|
-
field = field.substring(1);
|
|
84
|
-
}
|
|
85
|
-
return field?.indexOf('.') > 0;
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* [isPageListProperty]
|
|
89
|
-
* Description - checking if propertyName is pageList or not
|
|
90
|
-
* @ignore
|
|
91
|
-
* @param {string} propertyName PropertyName
|
|
92
|
-
* @returns {boolean} true if property is pageList else false
|
|
93
|
-
*
|
|
94
|
-
* @example <caption>Example for isPageListProperty </caption>
|
|
95
|
-
* isPageListProperty('!PL!Employees.Name') return true
|
|
96
|
-
* isPageListProperty('!P!Employees.Name') return false
|
|
97
|
-
* isPageListProperty('Name') return false
|
|
98
|
-
*/
|
|
99
|
-
export function isPageListProperty(propertyName) {
|
|
100
|
-
return propertyName.startsWith(PAGELIST);
|
|
101
|
-
}
|
|
102
|
-
export const isPageListInPath = (propertyName, currentClassID) => {
|
|
103
|
-
if (!propertyName.includes('.')) {
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
const [first, ...rest] = propertyName.split('.');
|
|
107
|
-
const metadata = PCore.getMetadataUtils().getPropertyMetadata(first, currentClassID);
|
|
108
|
-
if (metadata?.type === 'Page List') {
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
return isPageListInPath(rest.join('.'), metadata?.pageClass);
|
|
112
|
-
};
|
|
113
|
-
/**
|
|
114
|
-
* [getEmbeddedFieldName]
|
|
115
|
-
* Description - converting normal field name to embedded field starting with !P! or !PL!
|
|
116
|
-
* @ignore
|
|
117
|
-
* @param {string} propertyName Field name
|
|
118
|
-
* @param {string} classID classID of datapage
|
|
119
|
-
* @returns {string} returns converted string with !P! or !PL! and :
|
|
120
|
-
*
|
|
121
|
-
* @example <caption>Example for getEmbeddedFieldName </caption>
|
|
122
|
-
* For page property, getEmbeddedFieldName('Organisation.Name') return '!P!Organisation:Name'
|
|
123
|
-
* For pageList property, getEmbeddedFieldName('Employees.Name') return '!PL!Employees:Name'
|
|
124
|
-
*/
|
|
125
|
-
export function getEmbeddedFieldName(propertyName, classID) {
|
|
126
|
-
let value = propertyName;
|
|
127
|
-
if (isPageListInPath(value, classID)) {
|
|
128
|
-
value = `!PL!${value.replace(/\./g, ':')}`;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
value = `!P!${value.replace(/\./g, ':')}`;
|
|
132
|
-
}
|
|
133
|
-
return value;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* [preparePropertyMaps]
|
|
137
|
-
* Description - preparing maps for property names and set it in dataApi context
|
|
138
|
-
* @ignore
|
|
139
|
-
* @param {Array} fields fields array
|
|
140
|
-
* @param {string} classID classID of datapage
|
|
141
|
-
* @param {string} context dataApi context
|
|
142
|
-
* @returns {boolean} true if pageListProperty is present
|
|
143
|
-
*/
|
|
144
|
-
export function preparePropertyMaps(fields, classID, context) {
|
|
145
|
-
const { setPropertyMaps } = context;
|
|
146
|
-
const maps = fields.reduce((acc, field) => {
|
|
147
|
-
let { value } = field.config;
|
|
148
|
-
if (value.startsWith('@')) {
|
|
149
|
-
value = value.substring(value.indexOf(' ') + 1);
|
|
150
|
-
if (value[0] === '.')
|
|
151
|
-
value = value.substring(1);
|
|
152
|
-
}
|
|
153
|
-
let name = value;
|
|
154
|
-
// Preparing name for embedded property
|
|
155
|
-
if (isEmbeddedField(name)) {
|
|
156
|
-
name = getEmbeddedFieldName(name, classID);
|
|
157
|
-
}
|
|
158
|
-
if (isPageListProperty(name) && !acc[2]) {
|
|
159
|
-
acc[2] = true;
|
|
160
|
-
}
|
|
161
|
-
acc[0][value] = name;
|
|
162
|
-
acc[1][name] = value;
|
|
163
|
-
return acc;
|
|
164
|
-
}, [{}, {}, false]);
|
|
165
|
-
setPropertyMaps(maps[0], maps[1]);
|
|
166
|
-
return maps[2];
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* [getConfigEmbeddedFieldsMeta]
|
|
170
|
-
* Description - Get the metadata for configured embedded fields
|
|
171
|
-
* @ignore
|
|
172
|
-
* @param {Set} configFields Set of config fields
|
|
173
|
-
* @param {string} classID clasID of datapage
|
|
174
|
-
* @returns {Array} Metadata of configured embedded fields
|
|
175
|
-
*/
|
|
176
|
-
export function getConfigEmbeddedFieldsMeta(configFields, classID) {
|
|
177
|
-
const configEmbeddedFieldsMeta = [];
|
|
178
|
-
configFields.forEach(field => {
|
|
179
|
-
let value = field;
|
|
180
|
-
if (isEmbeddedField(value)) {
|
|
181
|
-
// conversion Page.PageList[].property => Page.PageList.property
|
|
182
|
-
if (value.includes('[')) {
|
|
183
|
-
value = value.substring(0, value.indexOf('[')) + value.substring(value.indexOf(']') + 1);
|
|
184
|
-
}
|
|
185
|
-
const meta = PCore.getMetadataUtils().getEmbeddedPropertyMetadata(value, classID);
|
|
186
|
-
meta.fieldID = field;
|
|
187
|
-
configEmbeddedFieldsMeta.push(meta);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
return configEmbeddedFieldsMeta;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* [mergeConfigEmbeddedFieldsMeta]
|
|
194
|
-
* Description - Get the metadata for configured embedded fields
|
|
195
|
-
* @ignore
|
|
196
|
-
* @param {Array} configEmbeddedFieldsMeta config fields metadata.
|
|
197
|
-
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields
|
|
198
|
-
*/
|
|
199
|
-
export function mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields) {
|
|
200
|
-
const mergedMetaFields = [...metaFields];
|
|
201
|
-
configEmbeddedFieldsMeta.forEach(configFieldMeta => {
|
|
202
|
-
const fieldMeta = metaFields.find(metaField => metaField.fieldID === configFieldMeta.fieldID);
|
|
203
|
-
if (!fieldMeta)
|
|
204
|
-
mergedMetaFields.push(configFieldMeta);
|
|
205
|
-
});
|
|
206
|
-
return mergedMetaFields;
|
|
207
|
-
}
|
|
208
|
-
const oldToNewFieldTypeMapping = {
|
|
209
|
-
'Date Time': 'Date & time',
|
|
210
|
-
Date: 'Date only'
|
|
211
|
-
};
|
|
212
|
-
/**
|
|
213
|
-
* [updateFieldType]
|
|
214
|
-
* Description - Updates the field type if its changed in the new implementation. Such mapping is maintained in oldToNewFieldTypeMapping.
|
|
215
|
-
* @ignore
|
|
216
|
-
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
|
|
217
|
-
*/
|
|
218
|
-
function updateFieldType(metaFields) {
|
|
219
|
-
metaFields.forEach(metaField => {
|
|
220
|
-
if (metaField.type)
|
|
221
|
-
metaField.type = oldToNewFieldTypeMapping[metaField.type] || metaField.type;
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
function getPresetMetaAttribute(attribute) {
|
|
225
|
-
const { type, config: { label, value } } = attribute;
|
|
226
|
-
return {
|
|
227
|
-
type,
|
|
228
|
-
name: value.startsWith('@') ? value.substring(4) : value,
|
|
229
|
-
label: label.startsWith('@') ? label.substring(3) : label
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* [generateViewMetaData]
|
|
234
|
-
* Description - Returns a list of metaobjects of the fields provided.
|
|
235
|
-
* @ignore
|
|
236
|
-
* @param {Array} rawFields List of fields to update meta for
|
|
237
|
-
* @param {string} classID Class ID from the response
|
|
238
|
-
* @returns {Array} List of fields with updated meta objects.
|
|
239
|
-
*/
|
|
240
|
-
function generateViewMetaData(rawFields, classID, showField) {
|
|
241
|
-
return rawFields.map(item => getDefaultViewMeta(item, classID, showField));
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* [getConfigFields]
|
|
245
|
-
* Description - Returns list of config fields with primary fields meta updated.
|
|
246
|
-
* @ignore
|
|
247
|
-
* @param {Array} configFields List of Authored fields
|
|
248
|
-
* @param {Array} primaryFields List of Primary Fields
|
|
249
|
-
* @param {Array} metaFields Metadata of all fields
|
|
250
|
-
* @param {string} classID Class ID from the response
|
|
251
|
-
* @returns {Array} List of all fields with their meta updated.
|
|
252
|
-
*/
|
|
253
|
-
function getConfigFields(configFields, primaryFields, metaFields, classID) {
|
|
254
|
-
const presetConfigFields = configFields;
|
|
255
|
-
const primaryFieldsViewIndex = presetConfigFields.findIndex(field => field.config.value === 'pyPrimaryFields');
|
|
256
|
-
if (!primaryFields || !primaryFields.length) {
|
|
257
|
-
if (primaryFieldsViewIndex < 0)
|
|
258
|
-
return presetConfigFields;
|
|
259
|
-
presetConfigFields.splice(primaryFieldsViewIndex, 1);
|
|
260
|
-
return presetConfigFields;
|
|
261
|
-
}
|
|
262
|
-
if (primaryFieldsViewIndex > -1) {
|
|
263
|
-
// list of uncommon fields - non overlap of primary fields grouped view and independent entity columns of primary type
|
|
264
|
-
const uncommonFieldsList = primaryFields.filter(primaryField => !presetConfigFields.some(presetConfigField => presetConfigField.config.value.split('.')[1] === primaryField));
|
|
265
|
-
const uncommonFieldsRawMeta = [];
|
|
266
|
-
uncommonFieldsList.forEach(uncommonField => {
|
|
267
|
-
const uncommonFieldMeta = metaFields.find(metaField => metaField.fieldID === uncommonField);
|
|
268
|
-
if (uncommonFieldMeta)
|
|
269
|
-
uncommonFieldsRawMeta.push(uncommonFieldMeta);
|
|
270
|
-
});
|
|
271
|
-
const uncommonFieldsConfigMeta = generateViewMetaData(uncommonFieldsRawMeta, classID, true);
|
|
272
|
-
presetConfigFields.splice(primaryFieldsViewIndex, 1, ...uncommonFieldsConfigMeta);
|
|
273
|
-
}
|
|
274
|
-
return presetConfigFields;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* [getTableConfigFromPresetMeta]
|
|
278
|
-
* Description - Get the table config from the presets meta.
|
|
279
|
-
* @ignore
|
|
280
|
-
* @param {object} presetMeta Presets meta
|
|
281
|
-
* @param {boolean} isMetaWithPresets true if meta has presets else false
|
|
282
|
-
* @param {Function} getPConnect Callback to get the PConnect object
|
|
283
|
-
* @param {string} classID Class ID from the response
|
|
284
|
-
* @param {Array} primaryFields List of Primary Fields
|
|
285
|
-
* @param {Array} metaFields List of all metafields
|
|
286
|
-
* @returns {object} Table config object
|
|
287
|
-
*/
|
|
288
|
-
export function getTableConfigFromPresetMeta(presetMeta, isMetaWithPresets, pConn$, classID, primaryFields, metaFields) {
|
|
289
|
-
let presetId;
|
|
290
|
-
let presetName;
|
|
291
|
-
let cardHeader;
|
|
292
|
-
let secondaryText;
|
|
293
|
-
let timelineDate;
|
|
294
|
-
let timelineTitle;
|
|
295
|
-
let timelineStatus;
|
|
296
|
-
let timelineIcon;
|
|
297
|
-
let { filterExpression } = pConn$.getRawMetadata().config;
|
|
298
|
-
let fieldsMeta;
|
|
299
|
-
let configFields;
|
|
300
|
-
if (isMetaWithPresets) {
|
|
301
|
-
presetId = presetMeta.id;
|
|
302
|
-
presetName = presetMeta.label;
|
|
303
|
-
cardHeader = presetMeta.cardHeader && getPresetMetaAttribute(presetMeta.cardHeader);
|
|
304
|
-
secondaryText = presetMeta.secondaryText && getPresetMetaAttribute(presetMeta.secondaryText);
|
|
305
|
-
timelineDate = presetMeta.timelineDate && getPresetMetaAttribute(presetMeta.timelineDate);
|
|
306
|
-
timelineTitle = presetMeta.timelineTitle && getPresetMetaAttribute(presetMeta.timelineTitle);
|
|
307
|
-
timelineStatus = presetMeta.timelineStatus && getPresetMetaAttribute(presetMeta.timelineStatus);
|
|
308
|
-
timelineIcon = presetMeta.timelineIcon && getPresetMetaAttribute(presetMeta.timelineIcon);
|
|
309
|
-
filterExpression = presetMeta.config.filterExpression;
|
|
310
|
-
[fieldsMeta] = presetMeta.children;
|
|
311
|
-
if (presetMeta.timelineTitle &&
|
|
312
|
-
!fieldsMeta.children.find(fieldMeta => {
|
|
313
|
-
return fieldMeta?.config?.value === presetMeta.timelineTitle?.config?.value;
|
|
314
|
-
})) {
|
|
315
|
-
const { type, config } = presetMeta.timelineTitle;
|
|
316
|
-
fieldsMeta.children.push({ type, config: { ...config, show: false } });
|
|
317
|
-
}
|
|
318
|
-
if (presetMeta.timelineDate &&
|
|
319
|
-
!fieldsMeta.children.find(fieldMeta => {
|
|
320
|
-
return fieldMeta?.config?.value === presetMeta.timelineDate?.config?.value;
|
|
321
|
-
})) {
|
|
322
|
-
const { type, config } = presetMeta.timelineDate;
|
|
323
|
-
fieldsMeta.children.push({ type, config: { ...config, show: false } });
|
|
324
|
-
}
|
|
325
|
-
configFields = getConfigFields(fieldsMeta.children, primaryFields, metaFields, classID);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
fieldsMeta = presetMeta.props;
|
|
329
|
-
configFields = getConfigFields(fieldsMeta
|
|
330
|
-
.getPConnect()
|
|
331
|
-
.getChildren()
|
|
332
|
-
?.map(child => {
|
|
333
|
-
return child.getPConnect().getRawMetadata();
|
|
334
|
-
}), primaryFields, metaFields, classID);
|
|
335
|
-
}
|
|
336
|
-
return {
|
|
337
|
-
presetId,
|
|
338
|
-
presetName,
|
|
339
|
-
cardHeader,
|
|
340
|
-
secondaryText,
|
|
341
|
-
timelineDate,
|
|
342
|
-
timelineTitle,
|
|
343
|
-
timelineStatus,
|
|
344
|
-
timelineIcon,
|
|
345
|
-
filterExpression,
|
|
346
|
-
fieldsMeta,
|
|
347
|
-
configFields
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* [getReportColumns]
|
|
352
|
-
* Description - Returns a set of columns from the report response.
|
|
353
|
-
* @ignore
|
|
354
|
-
* @param {object} response -
|
|
355
|
-
* @returns {Set} Set of columns from the report response
|
|
356
|
-
*/
|
|
357
|
-
function getReportColumns(response) {
|
|
358
|
-
const { data: { data: reportColumns } } = response;
|
|
359
|
-
const reportColumnsSet = new Set();
|
|
360
|
-
reportColumns?.forEach(item => {
|
|
361
|
-
let val = item.pyFieldName;
|
|
362
|
-
// Remove '.' from index 0 only, if '.' is present
|
|
363
|
-
if (val[0] === '.') {
|
|
364
|
-
val = val.substring(1);
|
|
365
|
-
}
|
|
366
|
-
reportColumnsSet.add(val);
|
|
367
|
-
});
|
|
368
|
-
return reportColumnsSet;
|
|
369
|
-
}
|
|
370
|
-
/**
|
|
371
|
-
* [getConfigFieldValue]
|
|
372
|
-
* Descritpion - Returns a valid value for a configuration field. Remove any annotations and also "."
|
|
373
|
-
* @ignore
|
|
374
|
-
* @param {object} config
|
|
375
|
-
* config.value - Raw value
|
|
376
|
-
* @returns {string} value - Value with out any annotations or "."
|
|
377
|
-
*/
|
|
378
|
-
function getConfigFieldValue(config) {
|
|
379
|
-
let { value } = config;
|
|
380
|
-
if (value.startsWith('@')) {
|
|
381
|
-
value = value.substring(value.indexOf(' ') + 1);
|
|
382
|
-
if (value[0] === '.')
|
|
383
|
-
value = value.substring(1);
|
|
384
|
-
}
|
|
385
|
-
return value;
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* [prepareConfigFields]
|
|
389
|
-
* Description - Prepares a set of configuration fields and pushes each config type to a set using the callback parameter.
|
|
390
|
-
* @ignore
|
|
391
|
-
* @param {object} configFields List of Authored fields
|
|
392
|
-
* @param {Function} pushToComponentsList Callback to push the field type to a set.
|
|
393
|
-
* @returns {Set} configFieldSet
|
|
394
|
-
*/
|
|
395
|
-
function prepareConfigFields(configFields, pushToComponentsList) {
|
|
396
|
-
const configFieldSet = new Set();
|
|
397
|
-
configFields.forEach(item => {
|
|
398
|
-
pushToComponentsList(item.type);
|
|
399
|
-
const val = getConfigFieldValue(item.config);
|
|
400
|
-
configFieldSet.add(val);
|
|
401
|
-
});
|
|
402
|
-
return configFieldSet;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* [findAuthoredField]
|
|
406
|
-
* Description - Finds an authored field from yhe list of config fields.
|
|
407
|
-
* @ignore
|
|
408
|
-
* @param {Array} configFields List of Authored fields
|
|
409
|
-
* @param {string} fieldID Filter
|
|
410
|
-
* @returns {object} config with its field value equal to fieldID, which means an authored field
|
|
411
|
-
*/
|
|
412
|
-
function findAuthoredField(configFields, fieldID) {
|
|
413
|
-
return configFields.find(configField => {
|
|
414
|
-
const val = getConfigFieldValue(configField.config);
|
|
415
|
-
return val === fieldID;
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* [findAndUpdateAuthoredFieldConfig]
|
|
420
|
-
* Description - Find the authored field, and update its config.
|
|
421
|
-
* @ignore
|
|
422
|
-
* @param {Array} configFields List of Authored fields
|
|
423
|
-
* @param {object} item Field item to copy displayAs and category information
|
|
424
|
-
* @param {string} classId classID from the response
|
|
425
|
-
*/
|
|
426
|
-
function findAndUpdateAuthoredFieldConfig(configFields, item, classId) {
|
|
427
|
-
const authoredField = findAuthoredField(configFields, item.fieldID);
|
|
428
|
-
if (authoredField?.config) {
|
|
429
|
-
if (item.displayAs) {
|
|
430
|
-
authoredField.config.displayAs = item.displayAs;
|
|
431
|
-
}
|
|
432
|
-
authoredField.config.classID = item.classID ?? classId;
|
|
433
|
-
if (authoredField.type === USER_REFERENCE) {
|
|
434
|
-
authoredField.config.associationID = item.associationID || item.fieldID;
|
|
435
|
-
}
|
|
436
|
-
authoredField.config.category = item.category;
|
|
437
|
-
// FieldType identifies whether the field is configured as pickList
|
|
438
|
-
authoredField.config.fieldType = item.fieldType;
|
|
439
|
-
// type defined on the property rule,
|
|
440
|
-
// used for the picklist field to assign the appropriate type
|
|
441
|
-
authoredField.config.propertyType = item.dataType || item.type;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* [isAnExtraField]
|
|
446
|
-
* Description - Returns true if the field is an extra field. Extra field is the one which is not authored but part of the report.
|
|
447
|
-
* @ignore
|
|
448
|
-
* @param {Array} configFields List of Authored fields
|
|
449
|
-
* @param {Set} configFieldSet Set if Authored filed values
|
|
450
|
-
* @param {Set} reportColumnsSet Set of columns from the report
|
|
451
|
-
* @param {object} item Config field item
|
|
452
|
-
* @param {string} classId Class ID from the response
|
|
453
|
-
* @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
|
|
454
|
-
* @returns {boolean} true If the field is an extra field else false.
|
|
455
|
-
*/
|
|
456
|
-
function isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classId, showDynamicFields) {
|
|
457
|
-
// Is the field already present in authoring metadata?
|
|
458
|
-
// Mutates config fields to copy displayAs and category information
|
|
459
|
-
if (configFieldSet.has(item.fieldID)) {
|
|
460
|
-
findAndUpdateAuthoredFieldConfig(configFields, item, classId);
|
|
461
|
-
return false;
|
|
462
|
-
}
|
|
463
|
-
// If field is not authored and not part of report columns then discard it
|
|
464
|
-
return showDynamicFields || !!reportColumnsSet.has(item.fieldID);
|
|
465
|
-
}
|
|
466
|
-
/**
|
|
467
|
-
* [prepareExtraFields]
|
|
468
|
-
* Description - Returns a list of extra fields with their meta updated.
|
|
469
|
-
* @ignore
|
|
470
|
-
* @param {Array} metaFields List of fields
|
|
471
|
-
* @param {Array} configFields List of Authored fields
|
|
472
|
-
* @param {Set} configFieldSet Set if Authored filed values
|
|
473
|
-
* @param {Set} reportColumnsSet Set of columns from the report
|
|
474
|
-
* @param {string} classID Class ID from the response
|
|
475
|
-
* @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
|
|
476
|
-
* @returns {Array} List of extra fields with their meta updated.
|
|
477
|
-
*/
|
|
478
|
-
function prepareExtraFields(metaFields, configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields) {
|
|
479
|
-
// Filter all the extra fields
|
|
480
|
-
const extraFileds = metaFields.filter(item => {
|
|
481
|
-
return isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classID, showDynamicFields);
|
|
482
|
-
});
|
|
483
|
-
return generateViewMetaData(extraFileds, classID, false);
|
|
484
|
-
// Update the meta object of each of the extra fields.
|
|
485
|
-
}
|
|
486
|
-
const AssignDashObjects = ['Assign-Worklist', 'Assign-WorkBasket'];
|
|
487
|
-
function populateRenderingOptions(name, config, field) {
|
|
488
|
-
const shouldDisplayAsSemanticLink = 'displayAsLink' in field.config && field.config.displayAsLink;
|
|
489
|
-
if (shouldDisplayAsSemanticLink) {
|
|
490
|
-
config.customObject.isAssignmentLink = AssignDashObjects.includes(field.config.classID);
|
|
491
|
-
if (field.config.value.startsWith('@CA')) {
|
|
492
|
-
config.customObject.isAssociation = true;
|
|
493
|
-
}
|
|
494
|
-
config.cellRenderer = formatConstants.WorkLink;
|
|
495
|
-
}
|
|
496
|
-
else if (name === 'pyStatusWork' || name === 'pyAssignmentStatus') {
|
|
497
|
-
config.cellRenderer = formatConstants.WorkStatus;
|
|
498
|
-
}
|
|
499
|
-
else if (name === 'pxUrgencyWork') {
|
|
500
|
-
config.cellRenderer = formatConstants.Integer;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
export function initializeColumns(fields = [], getMappedProperty = null) {
|
|
504
|
-
return fields.map((field, originalColIndex) => {
|
|
505
|
-
let name = field.config.value;
|
|
506
|
-
if (name.startsWith('@')) {
|
|
507
|
-
name = name.substring(name.indexOf(' ') + 1);
|
|
508
|
-
if (name[0] === '.')
|
|
509
|
-
name = name.substring(1);
|
|
510
|
-
}
|
|
511
|
-
name = getMappedProperty?.(name) ?? name;
|
|
512
|
-
let label = field.config.label || field.config.caption;
|
|
513
|
-
const { show = true, displayAs } = field.config;
|
|
514
|
-
if (label.startsWith('@')) {
|
|
515
|
-
label = label.substring(3);
|
|
516
|
-
}
|
|
517
|
-
const config = {
|
|
518
|
-
name,
|
|
519
|
-
label,
|
|
520
|
-
show,
|
|
521
|
-
classID: field.config.classID,
|
|
522
|
-
id: field.id || name || originalColIndex,
|
|
523
|
-
displayAs,
|
|
524
|
-
associationID: field.config.associationID,
|
|
525
|
-
...(field.config.classID && { category: field.config.category }),
|
|
526
|
-
customObject: {},
|
|
527
|
-
fieldType: field.config.fieldType,
|
|
528
|
-
meta: {
|
|
529
|
-
...field
|
|
530
|
-
}
|
|
531
|
-
};
|
|
532
|
-
populateRenderingOptions(name, config, field);
|
|
533
|
-
return config;
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
export const getItemKey = fields => {
|
|
537
|
-
let itemKey;
|
|
538
|
-
if (fields.findIndex(field => field.id === 'pyGUID') > -1) {
|
|
539
|
-
itemKey = 'pyGUID';
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
itemKey = 'pzInsKey';
|
|
543
|
-
}
|
|
544
|
-
return itemKey;
|
|
545
|
-
};
|
|
546
|
-
export function preparePatchQueryFields(fields, isDataObject = false, classID = '') {
|
|
547
|
-
const queryFields = [];
|
|
548
|
-
fields.forEach(field => {
|
|
549
|
-
const patchFields = [];
|
|
550
|
-
if (field.cellRenderer === 'WorkLink') {
|
|
551
|
-
if (field.customObject && field.customObject.isAssignmentLink) {
|
|
552
|
-
const associationName = field.name.includes(':') ? `${field.name.split(':')[0]}:` : '';
|
|
553
|
-
patchFields.push(`${associationName}pzInsKey`);
|
|
554
|
-
patchFields.push(`${associationName}pxRefObjectClass`);
|
|
555
|
-
}
|
|
556
|
-
else if (field.customObject && field.customObject.isAssociation) {
|
|
557
|
-
const associationCategory = field.name.split(':')[0];
|
|
558
|
-
patchFields.push(`${associationCategory}:pyID`);
|
|
559
|
-
patchFields.push(`${associationCategory}:pzInsKey`);
|
|
560
|
-
patchFields.push(`${associationCategory}:pxObjClass`);
|
|
561
|
-
}
|
|
562
|
-
else if (isDataObject) {
|
|
563
|
-
const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
|
|
564
|
-
const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
|
|
565
|
-
dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? patchFields.push(item.linkedField) : patchFields.push(item.keyName)));
|
|
566
|
-
}
|
|
567
|
-
else {
|
|
568
|
-
patchFields.push('pyID');
|
|
569
|
-
patchFields.push('pzInsKey');
|
|
570
|
-
patchFields.push('pxObjClass');
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
patchFields.forEach(k => {
|
|
574
|
-
if (!queryFields.find(q => q === k)) {
|
|
575
|
-
queryFields.push(k);
|
|
576
|
-
}
|
|
577
|
-
});
|
|
578
|
-
});
|
|
579
|
-
return queryFields;
|
|
580
|
-
}
|
|
581
|
-
/**
|
|
582
|
-
* Update the renderer type for the properties of type Page.
|
|
583
|
-
*/
|
|
584
|
-
export function updatePageFieldsConfig(configFields, parentClassID) {
|
|
585
|
-
return configFields.forEach(item => {
|
|
586
|
-
const { type, config: { value } } = item;
|
|
587
|
-
const propertyName = PCore.getAnnotationUtils().getPropertyName(value);
|
|
588
|
-
if (isEmbeddedField(value) && !isPageListInPath(propertyName, parentClassID)) {
|
|
589
|
-
item.config.componentType = type;
|
|
590
|
-
item.type = 'PagePropertyRenderer';
|
|
591
|
-
}
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
|
-
export const readContextResponse = async (context, params) => {
|
|
595
|
-
const { pConn$, apiContext, children, showDynamicFields, referenceList, isDataObject } = params;
|
|
596
|
-
// let { listContext } = params;
|
|
597
|
-
const { promisesResponseArray, apiContext: otherContext } = context;
|
|
598
|
-
// eslint-disable-next-line sonarjs/no-unused-collection
|
|
599
|
-
const listOfComponents = [];
|
|
600
|
-
const { data: { fields: metaFields, classID, isQueryable } } = promisesResponseArray[0];
|
|
601
|
-
let { data: { primaryFields } } = promisesResponseArray[0];
|
|
602
|
-
// When list is configured with Include all class fields configuration, provide support for Primary fields column
|
|
603
|
-
if (showDynamicFields) {
|
|
604
|
-
const sourceMetadata = PCore.getMetadataUtils().getDataPageMetadata(referenceList);
|
|
605
|
-
if (sourceMetadata?.primaryFields) {
|
|
606
|
-
primaryFields = sourceMetadata.primaryFields;
|
|
607
|
-
}
|
|
608
|
-
// updating metaData fieldID to normal property if it has fieldID starts with !P! or !PL!
|
|
609
|
-
updateMetaEmbeddedFieldID(metaFields);
|
|
610
|
-
}
|
|
611
|
-
updateFieldType(metaFields);
|
|
612
|
-
if (isDataObject) {
|
|
613
|
-
const compositeKeys = [];
|
|
614
|
-
const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
|
|
615
|
-
const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
|
|
616
|
-
dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? compositeKeys.push(item.linkedField) : compositeKeys.push(item.keyName)));
|
|
617
|
-
if (compositeKeys.length && otherContext) {
|
|
618
|
-
otherContext.setCompositeKeys(compositeKeys);
|
|
619
|
-
}
|
|
620
|
-
if (otherContext) {
|
|
621
|
-
otherContext.fetchRowActionDetails = null;
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
const presetArray = [];
|
|
625
|
-
const rawMetadata = pConn$.getRawMetadata().config;
|
|
626
|
-
const rawPresets = rawMetadata.presets;
|
|
627
|
-
const isMetaWithPresets = rawPresets && rawPresets.length !== 0;
|
|
628
|
-
const childrenIterator = isMetaWithPresets ? rawPresets : children;
|
|
629
|
-
const resolvedPresets = pConn$.getConfigProps().presets;
|
|
630
|
-
let fields;
|
|
631
|
-
let tableConfig;
|
|
632
|
-
childrenIterator?.forEach((presetMeta, index) => {
|
|
633
|
-
const { configFields } = getTableConfigFromPresetMeta({ ...presetMeta, label: resolvedPresets[index].label }, isMetaWithPresets, pConn$, classID, primaryFields, metaFields);
|
|
634
|
-
const pushToComponentsList = fieldType => {
|
|
635
|
-
listOfComponents.push(fieldType);
|
|
636
|
-
};
|
|
637
|
-
// read report columns response - in case of nonqueryable ignore the response and rely only on the fields configured at authoing time in presets
|
|
638
|
-
const reportColumnsSet = isQueryable ? getReportColumns(promisesResponseArray[1]) : new Set();
|
|
639
|
-
const configFieldSet = prepareConfigFields(configFields, pushToComponentsList);
|
|
640
|
-
// FIXME #EmbeddedPropertyPatch
|
|
641
|
-
// TODO: Remove this merge logic when the metadata response includes all optimized embedded page and pagelists
|
|
642
|
-
// merging configured embedded properties with metadata so that while preparing extra fields, config fields can get other properties from meta(eg: category, displayAsLink)
|
|
643
|
-
// get configured embedded properties metadata and get new mergedMetaFields
|
|
644
|
-
const configEmbeddedFieldsMeta = getConfigEmbeddedFieldsMeta(configFieldSet, classID);
|
|
645
|
-
const mergedMetaFields = mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields);
|
|
646
|
-
const extraFields = prepareExtraFields(mergedMetaFields, // passing new merged meta fields which has meta of configured embedded fields of current preset
|
|
647
|
-
configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields);
|
|
648
|
-
if (isQueryable) {
|
|
649
|
-
updatePageFieldsConfig(configFields, classID);
|
|
650
|
-
preparePropertyMaps([...configFields, ...extraFields], classID, context);
|
|
651
|
-
}
|
|
652
|
-
const { getMappedProperty } = context;
|
|
653
|
-
fields = initializeColumns([...configFields, ...extraFields], getMappedProperty);
|
|
654
|
-
const patchQueryFields = preparePatchQueryFields(fields, isDataObject, classID);
|
|
655
|
-
const itemKey = getItemKey(fields);
|
|
656
|
-
tableConfig = { fieldDefs: fields, patchQueryFields, itemKey, isQueryable };
|
|
657
|
-
});
|
|
658
|
-
const meta = tableConfig;
|
|
659
|
-
params.listContext = { meta, presets: presetArray, apiContext: { ...apiContext } };
|
|
660
|
-
return params.listContext;
|
|
661
|
-
};
|
|
662
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvbGlzdC12aWV3L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXZELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQztBQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUM7QUFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBRXhCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixVQUFVLEVBQUUsWUFBWTtJQUN4QixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsTUFBTSxPQUFPO0lBR1g7UUFDRSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsZUFBZSxDQUFDLDJCQUEyQixHQUFHLEVBQUUsRUFBRSwyQkFBMkIsR0FBRyxFQUFFO1FBQ2hGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRztZQUN0QyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0M7WUFDeEMsR0FBRywyQkFBMkI7U0FDL0IsQ0FBQztRQUNGLElB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QXVCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsV0FBVyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7SUFDekIsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUNuRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RGVmYXVsdFZpZXdNZXRhIH0gZnJvbSAnLi9EZWZhdWx0Vmlld01ldGEnO1xuXG5jb25zdCBVU0VSX1JFRkVSRU5DRSA9ICdVc2VyUmVmZXJlbmNlJztcbmNvbnN0IFBBR0UgPSAnIVAhJztcbmNvbnN0IFBBR0VMSVNUID0gJyFQTCEnO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0Q29uc3RhbnRzID0ge1xuICBXb3JrU3RhdHVzOiAnV29ya1N0YXR1cycsXG4gIEludGVnZXI6ICdJbnRlZ2VyJyxcbiAgV29ya0xpbms6ICdXb3JrTGluaydcbn07XG5cbmNsYXNzIERhdGFBcGkge1xuICBtYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eTogYW55O1xuICBvcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eTogYW55O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9yaWdpbmFsUHJvcGVydHlUb01hcHBlZFByb3BlcnR5ID0ge307XG4gICAgdGhpcy5tYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eSA9IHt9O1xuICAgIHRoaXMuc2V0UHJvcGVydHlNYXBzID0gdGhpcy5zZXRQcm9wZXJ0eU1hcHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE1hcHBlZFByb3BlcnR5ID0gdGhpcy5nZXRNYXBwZWRQcm9wZXJ0eS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0T3JpZ2luYWxQcm9wZXJ0eSA9IHRoaXMuZ2V0T3JpZ2luYWxQcm9wZXJ0eS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgc2V0UHJvcGVydHlNYXBzKG9yaWdpbmFsVG9NYXBwZWRQcm9wZXJ0eU9iaiA9IHt9LCBtYXBwZWRUb09yaWdpbmFsUHJvcGVydHlPYmogPSB7fSkge1xuICAgIHRoaXMub3JpZ2luYWxQcm9wZXJ0eVRvTWFwcGVkUHJvcGVydHkgPSB7XG4gICAgICAuLi50aGlzLm9yaWdpbmFsUHJvcGVydHlUb01hcHBlZFByb3BlcnR5LFxuICAgICAgLi4ub3JpZ2luYWxUb01hcHBlZFByb3BlcnR5T2JqXG4gICAgfTtcbiAgICB0aGlzLm1hcHBlZFByb3BlcnR5VG9PcmlnaW5hbFByb3BlcnR5ID0ge1xuICAgICAgLi4udGhpcy5tYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eSxcbiAgICAgIC4uLm1hcHBlZFRvT3JpZ2luYWxQcm9wZXJ0eU9ialxuICAgIH07XG4gIH1cblxuICBnZXRNYXBwZWRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eVtwcm9wZXJ0eU5hbWVdID8/IHByb3BlcnR5TmFtZTtcbiAgfVxuXG4gIGdldE9yaWdpbmFsUHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwcGVkUHJvcGVydHlUb09yaWdpbmFsUHJvcGVydHlbcHJvcGVydHlOYW1lXSA/PyBwcm9wZXJ0eU5hbWU7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHQoY29tcG9uZW50Q29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICBwcm9taXNlc0FycmF5ID0gW10gLy8gYXJyYXkgb2YgcHJvbWlzZXMgd2hpY2ggY2FuIGJlIGludm9rZWQgcGFyYWxlbGx5LFxuICB9ID0gY29tcG9uZW50Q29uZmlnO1xuICBjb25zdCBwcm9taXNlc1Jlc3BvbnNlQXJyYXkgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlc0FycmF5KTtcbiAgY29uc3QgZGF0YUFwaSA9IG5ldyBEYXRhQXBpKCk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZXNSZXNwb25zZUFycmF5LFxuICAgIHNldFByb3BlcnR5TWFwczogZGF0YUFwaS5zZXRQcm9wZXJ0eU1hcHMsXG4gICAgZ2V0TWFwcGVkUHJvcGVydHk6IGRhdGFBcGkuZ2V0TWFwcGVkUHJvcGVydHksXG4gICAgZ2V0T3JpZ2luYWxQcm9wZXJ0eTogZGF0YUFwaS5nZXRPcmlnaW5hbFByb3BlcnR5XG4gIH07XG59XG5cbi8qKlxuICogW2dldEZpZWxkTmFtZUZyb21FbWJlZGRlZEZpZWxkTmFtZV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgICAgICAgICBjb252ZXJ0aW5nIGVtYmVkZGVkRmllbGQgbmFtZSBzdGFydGluZyB3aXRoICFQISBvciAhUEwhIHRvIG5vcm1hbCBmaWVsZFxuICogQGlnbm9yZVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSAgIEVtYmVkZGVkRmllbGQgbmFtZSBzdGFydGluZyB3aXRoICFQISBvciAhUEwhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgICAgICAgICAgICAgcmV0dXJucyBjb252ZXJ0ZWQgc3RyaW5nIHdpdGhvdXQgIVAhIG9yICFQTCEgYW5kIDpcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FeGFtcGxlIGZvciBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUgPC9jYXB0aW9uPlxuICogZ2V0RmllbGROYW1lRnJvbUVtYmVkZGVkRmllbGROYW1lKCchUCFPcmdhbmlzYXRpb246TmFtZScpIHJldHVybiAnT3JnYW5pc2F0aW9uLk5hbWUnXG4gKiBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUoJyFQTCFFbXBsb3llZXM6TmFtZScpIHJldHVybiAnRW1wbG95ZWVzLk5hbWUnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUocHJvcGVydHlOYW1lKSB7XG4gIGxldCB2YWx1ZSA9IHByb3BlcnR5TmFtZTtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoUEFHRSkgfHwgdmFsdWUuc3RhcnRzV2l0aChQQUdFTElTVCkpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZignIScpICsgMSk7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC86L2csICcuJyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFt1cGRhdGVNZXRhRW1iZWRkZWRGaWVsZElEXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgSWYgdGhlIGZpZWxkSUQgaW4gbWV0YSBzdGFydHMgd2l0aCAnIVAhJyBvciAnIVBMIScgYW5kIGNvbnRhaW5zICc6JyB0aGVuIHJlcGxhY2UgdGhlbSB3aXRoIC4oZG90KVxuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gbWV0YUZpZWxkcyAgRmllbGRzIG1ldGFkYXRhIEFycmF5LiBDb250YWlucyBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1ldGFFbWJlZGRlZEZpZWxkSUQobWV0YUZpZWxkcykge1xuICByZXR1cm4gbWV0YUZpZWxkcy5mb3JFYWNoKG1ldGFGaWVsZCA9PiB7XG4gICAgaWYgKG1ldGFGaWVsZC5maWVsZElEPy5zdGFydHNXaXRoKFBBR0UpIHx8IG1ldGFGaWVsZC5maWVsZElEPy5zdGFydHNXaXRoKFBBR0VMSVNUKSkge1xuICAgICAgbWV0YUZpZWxkLmZpZWxkSUQgPSBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUobWV0YUZpZWxkLmZpZWxkSUQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBpc0VtYmVkZGVkRmllbGQgPSBmaWVsZCA9PiB7XG4gIGlmIChmaWVsZD8uc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcoZmllbGQuaW5kZXhPZignICcpICsgMSk7XG4gICAgaWYgKGZpZWxkWzBdID09PSAnLicpIGZpZWxkID0gZmllbGQuc3Vic3RyaW5nKDEpO1xuICB9XG4gIHJldHVybiBmaWVsZD8uaW5kZXhPZignLicpID4gMDtcbn07XG5cbi8qKlxuICogW2lzUGFnZUxpc3RQcm9wZXJ0eV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgIGNoZWNraW5nIGlmIHByb3BlcnR5TmFtZSBpcyBwYWdlTGlzdCBvciBub3RcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgICBQcm9wZXJ0eU5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSAgdHJ1ZSBpZiBwcm9wZXJ0eSBpcyBwYWdlTGlzdCBlbHNlIGZhbHNlXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RXhhbXBsZSBmb3IgaXNQYWdlTGlzdFByb3BlcnR5IDwvY2FwdGlvbj5cbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnIVBMIUVtcGxveWVlcy5OYW1lJykgcmV0dXJuIHRydWVcbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnIVAhRW1wbG95ZWVzLk5hbWUnKSByZXR1cm4gZmFsc2VcbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnTmFtZScpIHJldHVybiBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYWdlTGlzdFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICByZXR1cm4gcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoUEFHRUxJU1QpO1xufVxuXG5leHBvcnQgY29uc3QgaXNQYWdlTGlzdEluUGF0aCA9IChwcm9wZXJ0eU5hbWUsIGN1cnJlbnRDbGFzc0lEKSA9PiB7XG4gIGlmICghcHJvcGVydHlOYW1lLmluY2x1ZGVzKCcuJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHByb3BlcnR5TmFtZS5zcGxpdCgnLicpO1xuICBjb25zdCBtZXRhZGF0YTogYW55ID0gUENvcmUuZ2V0TWV0YWRhdGFVdGlscygpLmdldFByb3BlcnR5TWV0YWRhdGEoZmlyc3QsIGN1cnJlbnRDbGFzc0lEKTtcbiAgaWYgKG1ldGFkYXRhPy50eXBlID09PSAnUGFnZSBMaXN0Jykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBpc1BhZ2VMaXN0SW5QYXRoKHJlc3Quam9pbignLicpLCBtZXRhZGF0YT8ucGFnZUNsYXNzKTtcbn07XG5cbi8qKlxuICogW2dldEVtYmVkZGVkRmllbGROYW1lXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgICAgIGNvbnZlcnRpbmcgbm9ybWFsIGZpZWxkIG5hbWUgdG8gZW1iZWRkZWQgZmllbGQgc3RhcnRpbmcgd2l0aCAhUCEgb3IgIVBMIVxuICogQGlnbm9yZVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSAgIEZpZWxkIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc0lEICAgICAgICBjbGFzc0lEIG9mIGRhdGFwYWdlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgICAgICAgICAgICAgcmV0dXJucyBjb252ZXJ0ZWQgc3RyaW5nIHdpdGggIVAhIG9yICFQTCEgYW5kIDpcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FeGFtcGxlIGZvciBnZXRFbWJlZGRlZEZpZWxkTmFtZSA8L2NhcHRpb24+XG4gKiBGb3IgcGFnZSBwcm9wZXJ0eSwgZ2V0RW1iZWRkZWRGaWVsZE5hbWUoJ09yZ2FuaXNhdGlvbi5OYW1lJykgcmV0dXJuICchUCFPcmdhbmlzYXRpb246TmFtZSdcbiAqIEZvciBwYWdlTGlzdCBwcm9wZXJ0eSwgZ2V0RW1iZWRkZWRGaWVsZE5hbWUoJ0VtcGxveWVlcy5OYW1lJykgcmV0dXJuICchUEwhRW1wbG95ZWVzOk5hbWUnXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVtYmVkZGVkRmllbGROYW1lKHByb3BlcnR5TmFtZSwgY2xhc3NJRCkge1xuICBsZXQgdmFsdWUgPSBwcm9wZXJ0eU5hbWU7XG4gIGlmIChpc1BhZ2VMaXN0SW5QYXRoKHZhbHVlLCBjbGFzc0lEKSkge1xuICAgIHZhbHVlID0gYCFQTCEke3ZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnOicpfWA7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBgIVAhJHt2YWx1ZS5yZXBsYWNlKC9cXC4vZywgJzonKX1gO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBbcHJlcGFyZVByb3BlcnR5TWFwc11cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgIHByZXBhcmluZyBtYXBzIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmQgc2V0IGl0IGluIGRhdGFBcGkgY29udGV4dFxuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gZmllbGRzICAgZmllbGRzIGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NJRCAgY2xhc3NJRCBvZiBkYXRhcGFnZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgIGRhdGFBcGkgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgcGFnZUxpc3RQcm9wZXJ0eSBpcyBwcmVzZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUHJvcGVydHlNYXBzKGZpZWxkcywgY2xhc3NJRCwgY29udGV4dCkge1xuICBjb25zdCB7IHNldFByb3BlcnR5TWFwcyB9ID0gY29udGV4dDtcbiAgY29uc3QgbWFwcyA9IGZpZWxkcy5yZWR1Y2UoXG4gICAgKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB7IHZhbHVlIH0gPSBmaWVsZC5jb25maWc7XG4gICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoJyAnKSArIDEpO1xuICAgICAgICBpZiAodmFsdWVbMF0gPT09ICcuJykgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgICBsZXQgbmFtZSA9IHZhbHVlO1xuICAgICAgLy8gUHJlcGFyaW5nIG5hbWUgZm9yIGVtYmVkZGVkIHByb3BlcnR5XG4gICAgICBpZiAoaXNFbWJlZGRlZEZpZWxkKG5hbWUpKSB7XG4gICAgICAgIG5hbWUgPSBnZXRFbWJlZGRlZEZpZWxkTmFtZShuYW1lLCBjbGFzc0lEKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BhZ2VMaXN0UHJvcGVydHkobmFtZSkgJiYgIWFjY1syXSkge1xuICAgICAgICBhY2NbMl0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgYWNjWzBdW3ZhbHVlXSA9IG5hbWU7XG4gICAgICBhY2NbMV1bbmFtZV0gPSB2YWx1ZTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIFt7fSwge30sIGZhbHNlXVxuICApO1xuICBzZXRQcm9wZXJ0eU1hcHMobWFwc1swXSwgbWFwc1sxXSk7XG4gIHJldHVybiBtYXBzWzJdO1xufVxuXG4vKipcbiAqIFtnZXRDb25maWdFbWJlZGRlZEZpZWxkc01ldGFdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICBHZXQgdGhlIG1ldGFkYXRhIGZvciBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkc1xuICogQGlnbm9yZVxuICogQHBhcmFtIHtTZXR9IGNvbmZpZ0ZpZWxkcyAgU2V0IG9mIGNvbmZpZyBmaWVsZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc0lEICAgIGNsYXNJRCBvZiBkYXRhcGFnZVxuICogQHJldHVybnMge0FycmF5fSAgICAgICAgICAgTWV0YWRhdGEgb2YgY29uZmlndXJlZCBlbWJlZGRlZCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YShjb25maWdGaWVsZHMsIGNsYXNzSUQpIHtcbiAgY29uc3QgY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhOiBhbnlbXSA9IFtdO1xuICBjb25maWdGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgbGV0IHZhbHVlID0gZmllbGQ7XG4gICAgaWYgKGlzRW1iZWRkZWRGaWVsZCh2YWx1ZSkpIHtcbiAgICAgIC8vIGNvbnZlcnNpb24gUGFnZS5QYWdlTGlzdFtdLnByb3BlcnR5ID0+IFBhZ2UuUGFnZUxpc3QucHJvcGVydHlcbiAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnWycpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmluZGV4T2YoJ1snKSkgKyB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignXScpICsgMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXRhOiBhbnkgPSBQQ29yZS5nZXRNZXRhZGF0YVV0aWxzKCkuZ2V0RW1iZWRkZWRQcm9wZXJ0eU1ldGFkYXRhKHZhbHVlLCBjbGFzc0lEKTtcbiAgICAgIG1ldGEuZmllbGRJRCA9IGZpZWxkO1xuICAgICAgY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLnB1c2gobWV0YSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YTtcbn1cblxuLyoqXG4gKiBbbWVyZ2VDb25maWdFbWJlZGRlZEZpZWxkc01ldGFdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICBHZXQgdGhlIG1ldGFkYXRhIGZvciBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkc1xuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhICBjb25maWcgZmllbGRzIG1ldGFkYXRhLlxuICogQHBhcmFtIHtBcnJheX0gbWV0YUZpZWxkcyAgRmllbGRzIG1ldGFkYXRhIEFycmF5LiBDb250YWlucyBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25maWdFbWJlZGRlZEZpZWxkc01ldGEoY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLCBtZXRhRmllbGRzKSB7XG4gIGNvbnN0IG1lcmdlZE1ldGFGaWVsZHMgPSBbLi4ubWV0YUZpZWxkc107XG4gIGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YS5mb3JFYWNoKGNvbmZpZ0ZpZWxkTWV0YSA9PiB7XG4gICAgY29uc3QgZmllbGRNZXRhID0gbWV0YUZpZWxkcy5maW5kKG1ldGFGaWVsZCA9PiBtZXRhRmllbGQuZmllbGRJRCA9PT0gY29uZmlnRmllbGRNZXRhLmZpZWxkSUQpO1xuICAgIGlmICghZmllbGRNZXRhKSBtZXJnZWRNZXRhRmllbGRzLnB1c2goY29uZmlnRmllbGRNZXRhKTtcbiAgfSk7XG4gIHJldHVybiBtZXJnZWRNZXRhRmllbGRzO1xufVxuXG5jb25zdCBvbGRUb05ld0ZpZWxkVHlwZU1hcHBpbmcgPSB7XG4gICdEYXRlIFRpbWUnOiAnRGF0ZSAmIHRpbWUnLFxuICBEYXRlOiAnRGF0ZSBvbmx5J1xufTtcblxuLyoqXG4gKiBbdXBkYXRlRmllbGRUeXBlXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgVXBkYXRlcyB0aGUgZmllbGQgdHlwZSBpZiBpdHMgY2hhbmdlZCBpbiB0aGUgbmV3IGltcGxlbWVudGF0aW9uLiBTdWNoIG1hcHBpbmcgaXMgbWFpbnRhaW5lZCBpbiBvbGRUb05ld0ZpZWxkVHlwZU1hcHBpbmcuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge0FycmF5fSBtZXRhRmllbGRzICBGaWVsZHMgbWV0YWRhdGEgQXJyYXkuIENvbnRhaW5zIG1ldGFkYXRhIG9mIGFsbCB0aGUgZmllbGRzLlxuICovXG5mdW5jdGlvbiB1cGRhdGVGaWVsZFR5cGUobWV0YUZpZWxkcykge1xuICBtZXRhRmllbGRzLmZvckVhY2gobWV0YUZpZWxkID0+IHtcbiAgICBpZiAobWV0YUZpZWxkLnR5cGUpIG1ldGFGaWVsZC50eXBlID0gb2xkVG9OZXdGaWVsZFR5cGVNYXBwaW5nW21ldGFGaWVsZC50eXBlXSB8fCBtZXRhRmllbGQudHlwZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZXNldE1ldGFBdHRyaWJ1dGUoYXR0cmlidXRlKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIGNvbmZpZzogeyBsYWJlbCwgdmFsdWUgfVxuICB9ID0gYXR0cmlidXRlO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgbmFtZTogdmFsdWUuc3RhcnRzV2l0aCgnQCcpID8gdmFsdWUuc3Vic3RyaW5nKDQpIDogdmFsdWUsXG4gICAgbGFiZWw6IGxhYmVsLnN0YXJ0c1dpdGgoJ0AnKSA/IGxhYmVsLnN1YnN0cmluZygzKSA6IGxhYmVsXG4gIH07XG59XG5cbi8qKlxuICogW2dlbmVyYXRlVmlld01ldGFEYXRhXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIGEgbGlzdCBvZiAgbWV0YW9iamVjdHMgb2YgdGhlIGZpZWxkcyBwcm92aWRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICByYXdGaWVsZHMgICAgICAgICBMaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUgbWV0YSBmb3JcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lEICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcmV0dXJucyB7QXJyYXl9ICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGZpZWxkcyB3aXRoIHVwZGF0ZWQgbWV0YSBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVZpZXdNZXRhRGF0YShyYXdGaWVsZHMsIGNsYXNzSUQsIHNob3dGaWVsZCkge1xuICByZXR1cm4gcmF3RmllbGRzLm1hcChpdGVtID0+IGdldERlZmF1bHRWaWV3TWV0YShpdGVtLCBjbGFzc0lELCBzaG93RmllbGQpKTtcbn1cblxuLyoqXG4gKiBbZ2V0Q29uZmlnRmllbGRzXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIGxpc3Qgb2YgY29uZmlnIGZpZWxkcyB3aXRoIHByaW1hcnkgZmllbGRzIG1ldGEgdXBkYXRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBjb25maWdGaWVsZHMgICAgICBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge0FycmF5fSAgIHByaW1hcnlGaWVsZHMgICAgIExpc3Qgb2YgUHJpbWFyeSBGaWVsZHNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBtZXRhRmllbGRzICAgICAgICBNZXRhZGF0YSBvZiBhbGwgZmllbGRzXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY2xhc3NJRCAgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGFsbCBmaWVsZHMgd2l0aCB0aGVpciBtZXRhIHVwZGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0ZpZWxkcyhjb25maWdGaWVsZHMsIHByaW1hcnlGaWVsZHMsIG1ldGFGaWVsZHMsIGNsYXNzSUQpIHtcbiAgY29uc3QgcHJlc2V0Q29uZmlnRmllbGRzID0gY29uZmlnRmllbGRzO1xuICBjb25zdCBwcmltYXJ5RmllbGRzVmlld0luZGV4ID0gcHJlc2V0Q29uZmlnRmllbGRzLmZpbmRJbmRleChmaWVsZCA9PiBmaWVsZC5jb25maWcudmFsdWUgPT09ICdweVByaW1hcnlGaWVsZHMnKTtcbiAgaWYgKCFwcmltYXJ5RmllbGRzIHx8ICFwcmltYXJ5RmllbGRzLmxlbmd0aCkge1xuICAgIGlmIChwcmltYXJ5RmllbGRzVmlld0luZGV4IDwgMCkgcmV0dXJuIHByZXNldENvbmZpZ0ZpZWxkcztcblxuICAgIHByZXNldENvbmZpZ0ZpZWxkcy5zcGxpY2UocHJpbWFyeUZpZWxkc1ZpZXdJbmRleCwgMSk7XG5cbiAgICByZXR1cm4gcHJlc2V0Q29uZmlnRmllbGRzO1xuICB9XG5cbiAgaWYgKHByaW1hcnlGaWVsZHNWaWV3SW5kZXggPiAtMSkge1xuICAgIC8vIGxpc3Qgb2YgdW5jb21tb24gZmllbGRzIC0gbm9uIG92ZXJsYXAgb2YgcHJpbWFyeSBmaWVsZHMgZ3JvdXBlZCB2aWV3IGFuZCBpbmRlcGVuZGVudCBlbnRpdHkgY29sdW1ucyBvZiBwcmltYXJ5IHR5cGVcbiAgICBjb25zdCB1bmNvbW1vbkZpZWxkc0xpc3QgPSBwcmltYXJ5RmllbGRzLmZpbHRlcihcbiAgICAgIHByaW1hcnlGaWVsZCA9PiAhcHJlc2V0Q29uZmlnRmllbGRzLnNvbWUocHJlc2V0Q29uZmlnRmllbGQgPT4gcHJlc2V0Q29uZmlnRmllbGQuY29uZmlnLnZhbHVlLnNwbGl0KCcuJylbMV0gPT09IHByaW1hcnlGaWVsZClcbiAgICApO1xuICAgIGNvbnN0IHVuY29tbW9uRmllbGRzUmF3TWV0YTogYW55W10gPSBbXTtcbiAgICB1bmNvbW1vbkZpZWxkc0xpc3QuZm9yRWFjaCh1bmNvbW1vbkZpZWxkID0+IHtcbiAgICAgIGNvbnN0IHVuY29tbW9uRmllbGRNZXRhID0gbWV0YUZpZWxkcy5maW5kKG1ldGFGaWVsZCA9PiBtZXRhRmllbGQuZmllbGRJRCA9PT0gdW5jb21tb25GaWVsZCk7XG4gICAgICBpZiAodW5jb21tb25GaWVsZE1ldGEpIHVuY29tbW9uRmllbGRzUmF3TWV0YS5wdXNoKHVuY29tbW9uRmllbGRNZXRhKTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmNvbW1vbkZpZWxkc0NvbmZpZ01ldGEgPSBnZW5lcmF0ZVZpZXdNZXRhRGF0YSh1bmNvbW1vbkZpZWxkc1Jhd01ldGEsIGNsYXNzSUQsIHRydWUpO1xuXG4gICAgcHJlc2V0Q29uZmlnRmllbGRzLnNwbGljZShwcmltYXJ5RmllbGRzVmlld0luZGV4LCAxLCAuLi51bmNvbW1vbkZpZWxkc0NvbmZpZ01ldGEpO1xuICB9XG4gIHJldHVybiBwcmVzZXRDb25maWdGaWVsZHM7XG59XG5cbi8qKlxuICogW2dldFRhYmxlQ29uZmlnRnJvbVByZXNldE1ldGFdXG4gKiBEZXNjcmlwdGlvbiAtIEdldCB0aGUgdGFibGUgY29uZmlnIGZyb20gdGhlIHByZXNldHMgbWV0YS5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAgIHByZXNldE1ldGEgICAgICAgICAgUHJlc2V0cyBtZXRhXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gICBpc01ldGFXaXRoUHJlc2V0cyAgIHRydWUgaWYgbWV0YSBoYXMgcHJlc2V0cyBlbHNlIGZhbHNlXG4gKiBAcGFyYW0gICB7RnVuY3Rpb259ICBnZXRQQ29ubmVjdCAgICAgICAgIENhbGxiYWNrIHRvIGdldCB0aGUgUENvbm5lY3Qgb2JqZWN0XG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICBjbGFzc0lEICAgICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgICBwcmltYXJ5RmllbGRzICAgICAgIExpc3Qgb2YgUHJpbWFyeSBGaWVsZHNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICAgIG1ldGFGaWVsZHMgICAgICAgICAgTGlzdCBvZiBhbGwgbWV0YWZpZWxkc1xuICogQHJldHVybnMge29iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBjb25maWcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbmZpZ0Zyb21QcmVzZXRNZXRhKHByZXNldE1ldGEsIGlzTWV0YVdpdGhQcmVzZXRzLCBwQ29ubiQsIGNsYXNzSUQsIHByaW1hcnlGaWVsZHMsIG1ldGFGaWVsZHMpIHtcbiAgbGV0IHByZXNldElkO1xuICBsZXQgcHJlc2V0TmFtZTtcbiAgbGV0IGNhcmRIZWFkZXI7XG4gIGxldCBzZWNvbmRhcnlUZXh0O1xuICBsZXQgdGltZWxpbmVEYXRlO1xuICBsZXQgdGltZWxpbmVUaXRsZTtcbiAgbGV0IHRpbWVsaW5lU3RhdHVzO1xuICBsZXQgdGltZWxpbmVJY29uO1xuICBsZXQgeyBmaWx0ZXJFeHByZXNzaW9uIH0gPSBwQ29ubiQuZ2V0UmF3TWV0YWRhdGEoKS5jb25maWc7XG4gIGxldCBmaWVsZHNNZXRhO1xuICBsZXQgY29uZmlnRmllbGRzO1xuICBpZiAoaXNNZXRhV2l0aFByZXNldHMpIHtcbiAgICBwcmVzZXRJZCA9IHByZXNldE1ldGEuaWQ7XG4gICAgcHJlc2V0TmFtZSA9IHByZXNldE1ldGEubGFiZWw7XG4gICAgY2FyZEhlYWRlciA9IHByZXNldE1ldGEuY2FyZEhlYWRlciAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEuY2FyZEhlYWRlcik7XG4gICAgc2Vjb25kYXJ5VGV4dCA9IHByZXNldE1ldGEuc2Vjb25kYXJ5VGV4dCAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEuc2Vjb25kYXJ5VGV4dCk7XG4gICAgdGltZWxpbmVEYXRlID0gcHJlc2V0TWV0YS50aW1lbGluZURhdGUgJiYgZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZSk7XG4gICAgdGltZWxpbmVUaXRsZSA9IHByZXNldE1ldGEudGltZWxpbmVUaXRsZSAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEudGltZWxpbmVUaXRsZSk7XG4gICAgdGltZWxpbmVTdGF0dXMgPSBwcmVzZXRNZXRhLnRpbWVsaW5lU3RhdHVzICYmIGdldFByZXNldE1ldGFBdHRyaWJ1dGUocHJlc2V0TWV0YS50aW1lbGluZVN0YXR1cyk7XG4gICAgdGltZWxpbmVJY29uID0gcHJlc2V0TWV0YS50aW1lbGluZUljb24gJiYgZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShwcmVzZXRNZXRhLnRpbWVsaW5lSWNvbik7XG4gICAgZmlsdGVyRXhwcmVzc2lvbiA9IHByZXNldE1ldGEuY29uZmlnLmZpbHRlckV4cHJlc3Npb247XG4gICAgW2ZpZWxkc01ldGFdID0gcHJlc2V0TWV0YS5jaGlsZHJlbjtcbiAgICBpZiAoXG4gICAgICBwcmVzZXRNZXRhLnRpbWVsaW5lVGl0bGUgJiZcbiAgICAgICFmaWVsZHNNZXRhLmNoaWxkcmVuLmZpbmQoZmllbGRNZXRhID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkTWV0YT8uY29uZmlnPy52YWx1ZSA9PT0gcHJlc2V0TWV0YS50aW1lbGluZVRpdGxlPy5jb25maWc/LnZhbHVlO1xuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgY29uZmlnIH0gPSBwcmVzZXRNZXRhLnRpbWVsaW5lVGl0bGU7XG4gICAgICBmaWVsZHNNZXRhLmNoaWxkcmVuLnB1c2goeyB0eXBlLCBjb25maWc6IHsgLi4uY29uZmlnLCBzaG93OiBmYWxzZSB9IH0pO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZSAmJlxuICAgICAgIWZpZWxkc01ldGEuY2hpbGRyZW4uZmluZChmaWVsZE1ldGEgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGRNZXRhPy5jb25maWc/LnZhbHVlID09PSBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZT8uY29uZmlnPy52YWx1ZTtcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIGNvbmZpZyB9ID0gcHJlc2V0TWV0YS50aW1lbGluZURhdGU7XG4gICAgICBmaWVsZHNNZXRhLmNoaWxkcmVuLnB1c2goeyB0eXBlLCBjb25maWc6IHsgLi4uY29uZmlnLCBzaG93OiBmYWxzZSB9IH0pO1xuICAgIH1cbiAgICBjb25maWdGaWVsZHMgPSBnZXRDb25maWdGaWVsZHMoZmllbGRzTWV0YS5jaGlsZHJlbiwgcHJpbWFyeUZpZWxkcywgbWV0YUZpZWxkcywgY2xhc3NJRCk7XG4gIH0gZWxzZSB7XG4gICAgZmllbGRzTWV0YSA9IHByZXNldE1ldGEucHJvcHM7XG4gICAgY29uZmlnRmllbGRzID0gZ2V0Q29uZmlnRmllbGRzKFxuICAgICAgZmllbGRzTWV0YVxuICAgICAgICAuZ2V0UENvbm5lY3QoKVxuICAgICAgICAuZ2V0Q2hpbGRyZW4oKVxuICAgICAgICA/Lm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLmdldFBDb25uZWN0KCkuZ2V0UmF3TWV0YWRhdGEoKTtcbiAgICAgICAgfSksXG4gICAgICBwcmltYXJ5RmllbGRzLFxuICAgICAgbWV0YUZpZWxkcyxcbiAgICAgIGNsYXNzSURcbiAgICApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJlc2V0SWQsXG4gICAgcHJlc2V0TmFtZSxcbiAgICBjYXJkSGVhZGVyLFxuICAgIHNlY29uZGFyeVRleHQsXG4gICAgdGltZWxpbmVEYXRlLFxuICAgIHRpbWVsaW5lVGl0bGUsXG4gICAgdGltZWxpbmVTdGF0dXMsXG4gICAgdGltZWxpbmVJY29uLFxuICAgIGZpbHRlckV4cHJlc3Npb24sXG4gICAgZmllbGRzTWV0YSxcbiAgICBjb25maWdGaWVsZHNcbiAgfTtcbn1cblxuLyoqXG4gKiBbZ2V0UmVwb3J0Q29sdW1uc11cbiAqIERlc2NyaXB0aW9uIC0gUmV0dXJucyBhIHNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHJlcG9ydCByZXNwb25zZS5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IHJlc3BvbnNlIC1cbiAqIEByZXR1cm5zIHtTZXR9IFNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHJlcG9ydCByZXNwb25zZVxuICovXG5mdW5jdGlvbiBnZXRSZXBvcnRDb2x1bW5zKHJlc3BvbnNlKSB7XG4gIGNvbnN0IHtcbiAgICBkYXRhOiB7IGRhdGE6IHJlcG9ydENvbHVtbnMgfVxuICB9ID0gcmVzcG9uc2U7XG4gIGNvbnN0IHJlcG9ydENvbHVtbnNTZXQgPSBuZXcgU2V0KCk7XG4gIHJlcG9ydENvbHVtbnM/LmZvckVhY2goaXRlbSA9PiB7XG4gICAgbGV0IHZhbCA9IGl0ZW0ucHlGaWVsZE5hbWU7XG4gICAgLy8gUmVtb3ZlICcuJyBmcm9tIGluZGV4IDAgb25seSwgaWYgJy4nIGlzIHByZXNlbnRcbiAgICBpZiAodmFsWzBdID09PSAnLicpIHtcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIHJlcG9ydENvbHVtbnNTZXQuYWRkKHZhbCk7XG4gIH0pO1xuICByZXR1cm4gcmVwb3J0Q29sdW1uc1NldDtcbn1cblxuLyoqXG4gKiBbZ2V0Q29uZmlnRmllbGRWYWx1ZV1cbiAqIERlc2NyaXRwaW9uIC0gUmV0dXJucyBhIHZhbGlkIHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gZmllbGQuIFJlbW92ZSBhbnkgYW5ub3RhdGlvbnMgYW5kIGFsc28gXCIuXCJcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IGNvbmZpZ1xuICogICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlIC0gUmF3IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHdpdGggb3V0IGFueSBhbm5vdGF0aW9ucyBvciBcIi5cIlxuICovXG5mdW5jdGlvbiBnZXRDb25maWdGaWVsZFZhbHVlKGNvbmZpZykge1xuICBsZXQgeyB2YWx1ZSB9ID0gY29uZmlnO1xuICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnLicpIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBbcHJlcGFyZUNvbmZpZ0ZpZWxkc11cbiAqIERlc2NyaXB0aW9uIC0gUHJlcGFyZXMgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBmaWVsZHMgYW5kIHB1c2hlcyBlYWNoIGNvbmZpZyB0eXBlIHRvIGEgc2V0IHVzaW5nIHRoZSBjYWxsYmFjayBwYXJhbWV0ZXIuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7b2JqZWN0fSAgICBjb25maWdGaWVsZHMgICAgICAgICAgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtGdW5jdGlvbn0gIHB1c2hUb0NvbXBvbmVudHNMaXN0IENhbGxiYWNrIHRvIHB1c2ggdGhlIGZpZWxkIHR5cGUgdG8gYSBzZXQuXG4gKiBAcmV0dXJucyB7U2V0fSAgICAgICBjb25maWdGaWVsZFNldFxuICovXG5mdW5jdGlvbiBwcmVwYXJlQ29uZmlnRmllbGRzKGNvbmZpZ0ZpZWxkcywgcHVzaFRvQ29tcG9uZW50c0xpc3QpIHtcbiAgY29uc3QgY29uZmlnRmllbGRTZXQgPSBuZXcgU2V0KCk7XG4gIGNvbmZpZ0ZpZWxkcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIHB1c2hUb0NvbXBvbmVudHNMaXN0KGl0ZW0udHlwZSk7XG4gICAgY29uc3QgdmFsID0gZ2V0Q29uZmlnRmllbGRWYWx1ZShpdGVtLmNvbmZpZyk7XG4gICAgY29uZmlnRmllbGRTZXQuYWRkKHZhbCk7XG4gIH0pO1xuICByZXR1cm4gY29uZmlnRmllbGRTZXQ7XG59XG5cbi8qKlxuICogW2ZpbmRBdXRob3JlZEZpZWxkXVxuICogRGVzY3JpcHRpb24gLSBGaW5kcyBhbiBhdXRob3JlZCBmaWVsZCBmcm9tIHloZSBsaXN0IG9mIGNvbmZpZyBmaWVsZHMuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgZmllbGRJRCAgICAgIEZpbHRlclxuICogQHJldHVybnMge29iamVjdH0gICAgICAgICAgICAgIGNvbmZpZyB3aXRoIGl0cyBmaWVsZCB2YWx1ZSBlcXVhbCB0byBmaWVsZElELCB3aGljaCBtZWFucyBhbiBhdXRob3JlZCBmaWVsZFxuICovXG5mdW5jdGlvbiBmaW5kQXV0aG9yZWRGaWVsZChjb25maWdGaWVsZHMsIGZpZWxkSUQpIHtcbiAgcmV0dXJuIGNvbmZpZ0ZpZWxkcy5maW5kKGNvbmZpZ0ZpZWxkID0+IHtcbiAgICBjb25zdCB2YWwgPSBnZXRDb25maWdGaWVsZFZhbHVlKGNvbmZpZ0ZpZWxkLmNvbmZpZyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gZmllbGRJRDtcbiAgfSk7XG59XG5cbi8qKlxuICogW2ZpbmRBbmRVcGRhdGVBdXRob3JlZEZpZWxkQ29uZmlnXVxuICogRGVzY3JpcHRpb24gLSBGaW5kIHRoZSBhdXRob3JlZCBmaWVsZCwgYW5kIHVwZGF0ZSBpdHMgY29uZmlnLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIGNvbmZpZ0ZpZWxkcyBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge29iamVjdH0gIGl0ZW0gICAgICAgIEZpZWxkIGl0ZW0gdG8gY29weSBkaXNwbGF5QXMgYW5kIGNhdGVnb3J5IGluZm9ybWF0aW9uXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY2xhc3NJZCAgICAgY2xhc3NJRCBmcm9tIHRoZSByZXNwb25zZVxuICovXG5mdW5jdGlvbiBmaW5kQW5kVXBkYXRlQXV0aG9yZWRGaWVsZENvbmZpZyhjb25maWdGaWVsZHMsIGl0ZW0sIGNsYXNzSWQpIHtcbiAgY29uc3QgYXV0aG9yZWRGaWVsZCA9IGZpbmRBdXRob3JlZEZpZWxkKGNvbmZpZ0ZpZWxkcywgaXRlbS5maWVsZElEKTtcbiAgaWYgKGF1dGhvcmVkRmllbGQ/LmNvbmZpZykge1xuICAgIGlmIChpdGVtLmRpc3BsYXlBcykge1xuICAgICAgYXV0aG9yZWRGaWVsZC5jb25maWcuZGlzcGxheUFzID0gaXRlbS5kaXNwbGF5QXM7XG4gICAgfVxuICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLmNsYXNzSUQgPSBpdGVtLmNsYXNzSUQgPz8gY2xhc3NJZDtcblxuICAgIGlmIChhdXRob3JlZEZpZWxkLnR5cGUgPT09IFVTRVJfUkVGRVJFTkNFKSB7XG4gICAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5hc3NvY2lhdGlvbklEID0gaXRlbS5hc3NvY2lhdGlvbklEIHx8IGl0ZW0uZmllbGRJRDtcbiAgICB9XG4gICAgYXV0aG9yZWRGaWVsZC5jb25maWcuY2F0ZWdvcnkgPSBpdGVtLmNhdGVnb3J5O1xuICAgIC8vIEZpZWxkVHlwZSBpZGVudGlmaWVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIGNvbmZpZ3VyZWQgYXMgcGlja0xpc3RcbiAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5maWVsZFR5cGUgPSBpdGVtLmZpZWxkVHlwZTtcbiAgICAvLyB0eXBlIGRlZmluZWQgb24gdGhlIHByb3BlcnR5IHJ1bGUsXG4gICAgLy8gdXNlZCBmb3IgdGhlIHBpY2tsaXN0IGZpZWxkIHRvIGFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLnByb3BlcnR5VHlwZSA9IGl0ZW0uZGF0YVR5cGUgfHwgaXRlbS50eXBlO1xuICB9XG59XG5cbi8qKlxuICogW2lzQW5FeHRyYUZpZWxkXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGFuIGV4dHJhIGZpZWxkLiBFeHRyYSBmaWVsZCBpcyB0aGUgb25lIHdoaWNoIGlzIG5vdCBhdXRob3JlZCBidXQgcGFydCBvZiB0aGUgcmVwb3J0LlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIGNvbmZpZ0ZpZWxkcyAgICAgIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7U2V0fSAgICAgY29uZmlnRmllbGRTZXQgICAgU2V0IGlmIEF1dGhvcmVkIGZpbGVkIHZhbHVlc1xuICogQHBhcmFtICAge1NldH0gICAgIHJlcG9ydENvbHVtbnNTZXQgU2V0IG9mIGNvbHVtbnMgZnJvbSB0aGUgcmVwb3J0XG4gKiBAcGFyYW0gICB7b2JqZWN0fSAgaXRlbSAgICAgICAgICAgICBDb25maWcgZmllbGQgaXRlbVxuICogQHBhcmFtICAge3N0cmluZ30gIGNsYXNzSWQgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSAgIHtib29sZWFufSBzaG93RHluYW1pY0ZpZWxkcyBGbGFnIGluZGljYXRpbmcgd2hldGhlciBmaWVsZHMgYXJlIGZldGNoZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZVxuICogQHJldHVybnMge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgdHJ1ZSBJZiB0aGUgZmllbGQgaXMgYW4gZXh0cmEgZmllbGQgZWxzZSBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gaXNBbkV4dHJhRmllbGQoY29uZmlnRmllbGRzLCBjb25maWdGaWVsZFNldCwgcmVwb3J0Q29sdW1uc1NldCwgaXRlbSwgY2xhc3NJZCwgc2hvd0R5bmFtaWNGaWVsZHMpIHtcbiAgLy8gSXMgdGhlIGZpZWxkIGFscmVhZHkgcHJlc2VudCBpbiBhdXRob3JpbmcgbWV0YWRhdGE/XG4gIC8vIE11dGF0ZXMgY29uZmlnIGZpZWxkcyB0byBjb3B5IGRpc3BsYXlBcyBhbmQgY2F0ZWdvcnkgaW5mb3JtYXRpb25cbiAgaWYgKGNvbmZpZ0ZpZWxkU2V0LmhhcyhpdGVtLmZpZWxkSUQpKSB7XG4gICAgZmluZEFuZFVwZGF0ZUF1dGhvcmVkRmllbGRDb25maWcoY29uZmlnRmllbGRzLCBpdGVtLCBjbGFzc0lkKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBmaWVsZCBpcyBub3QgYXV0aG9yZWQgYW5kIG5vdCBwYXJ0IG9mIHJlcG9ydCBjb2x1bW5zIHRoZW4gZGlzY2FyZCBpdFxuICByZXR1cm4gc2hvd0R5bmFtaWNGaWVsZHMgfHwgISFyZXBvcnRDb2x1bW5zU2V0LmhhcyhpdGVtLmZpZWxkSUQpO1xufVxuXG4vKipcbiAqIFtwcmVwYXJlRXh0cmFGaWVsZHNdXG4gKiBEZXNjcmlwdGlvbiAtIFJldHVybnMgYSBsaXN0IG9mIGV4dHJhIGZpZWxkcyB3aXRoIHRoZWlyIG1ldGEgdXBkYXRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBtZXRhRmllbGRzICAgICAgIExpc3Qgb2YgZmllbGRzXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzICAgICAgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtTZXR9ICAgICBjb25maWdGaWVsZFNldCAgICBTZXQgaWYgQXV0aG9yZWQgZmlsZWQgdmFsdWVzXG4gKiBAcGFyYW0gICB7U2V0fSAgICAgcmVwb3J0Q29sdW1uc1NldCBTZXQgb2YgY29sdW1ucyBmcm9tIHRoZSByZXBvcnRcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lEICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gc2hvd0R5bmFtaWNGaWVsZHMgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgZmllbGRzIGFyZSBmZXRjaGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWVcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZXh0cmEgZmllbGRzIHdpdGggdGhlaXIgbWV0YSB1cGRhdGVkLlxuICovXG5mdW5jdGlvbiBwcmVwYXJlRXh0cmFGaWVsZHMobWV0YUZpZWxkcywgY29uZmlnRmllbGRzLCBjb25maWdGaWVsZFNldCwgcmVwb3J0Q29sdW1uc1NldCwgY2xhc3NJRCwgc2hvd0R5bmFtaWNGaWVsZHMpIHtcbiAgLy8gRmlsdGVyIGFsbCB0aGUgZXh0cmEgZmllbGRzXG4gIGNvbnN0IGV4dHJhRmlsZWRzID0gbWV0YUZpZWxkcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgcmV0dXJuIGlzQW5FeHRyYUZpZWxkKGNvbmZpZ0ZpZWxkcywgY29uZmlnRmllbGRTZXQsIHJlcG9ydENvbHVtbnNTZXQsIGl0ZW0sIGNsYXNzSUQsIHNob3dEeW5hbWljRmllbGRzKTtcbiAgfSk7XG4gIHJldHVybiBnZW5lcmF0ZVZpZXdNZXRhRGF0YShleHRyYUZpbGVkcywgY2xhc3NJRCwgZmFsc2UpO1xuICAvLyBVcGRhdGUgdGhlIG1ldGEgb2JqZWN0IG9mIGVhY2ggb2YgdGhlIGV4dHJhIGZpZWxkcy5cbn1cblxuY29uc3QgQXNzaWduRGFzaE9iamVjdHMgPSBbJ0Fzc2lnbi1Xb3JrbGlzdCcsICdBc3NpZ24tV29ya0Jhc2tldCddO1xuXG5mdW5jdGlvbiBwb3B1bGF0ZVJlbmRlcmluZ09wdGlvbnMobmFtZSwgY29uZmlnLCBmaWVsZCkge1xuICBjb25zdCBzaG91bGREaXNwbGF5QXNTZW1hbnRpY0xpbmsgPSAnZGlzcGxheUFzTGluaycgaW4gZmllbGQuY29uZmlnICYmIGZpZWxkLmNvbmZpZy5kaXNwbGF5QXNMaW5rO1xuICBpZiAoc2hvdWxkRGlzcGxheUFzU2VtYW50aWNMaW5rKSB7XG4gICAgY29uZmlnLmN1c3RvbU9iamVjdC5pc0Fzc2lnbm1lbnRMaW5rID0gQXNzaWduRGFzaE9iamVjdHMuaW5jbHVkZXMoZmllbGQuY29uZmlnLmNsYXNzSUQpO1xuICAgIGlmIChmaWVsZC5jb25maWcudmFsdWUuc3RhcnRzV2l0aCgnQENBJykpIHtcbiAgICAgIGNvbmZpZy5jdXN0b21PYmplY3QuaXNBc3NvY2lhdGlvbiA9IHRydWU7XG4gICAgfVxuICAgIGNvbmZpZy5jZWxsUmVuZGVyZXIgPSBmb3JtYXRDb25zdGFudHMuV29ya0xpbms7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3B5U3RhdHVzV29yaycgfHwgbmFtZSA9PT0gJ3B5QXNzaWdubWVudFN0YXR1cycpIHtcbiAgICBjb25maWcuY2VsbFJlbmRlcmVyID0gZm9ybWF0Q29uc3RhbnRzLldvcmtTdGF0dXM7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3B4VXJnZW5jeVdvcmsnKSB7XG4gICAgY29uZmlnLmNlbGxSZW5kZXJlciA9IGZvcm1hdENvbnN0YW50cy5JbnRlZ2VyO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbHVtbnMoZmllbGRzOiBhbnlbXSA9IFtdLCBnZXRNYXBwZWRQcm9wZXJ0eTogYW55ID0gbnVsbCkge1xuICByZXR1cm4gZmllbGRzLm1hcCgoZmllbGQsIG9yaWdpbmFsQ29sSW5kZXgpID0+IHtcbiAgICBsZXQgbmFtZSA9IGZpZWxkLmNvbmZpZy52YWx1ZTtcblxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgICBpZiAobmFtZVswXSA9PT0gJy4nKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIG5hbWUgPSBnZXRNYXBwZWRQcm9wZXJ0eT8uKG5hbWUpID8/IG5hbWU7XG5cbiAgICBsZXQgbGFiZWwgPSBmaWVsZC5jb25maWcubGFiZWwgfHwgZmllbGQuY29uZmlnLmNhcHRpb247XG4gICAgY29uc3QgeyBzaG93ID0gdHJ1ZSwgZGlzcGxheUFzIH0gPSBmaWVsZC5jb25maWc7XG4gICAgaWYgKGxhYmVsLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGxhYmVsLFxuICAgICAgc2hvdyxcbiAgICAgIGNsYXNzSUQ6IGZpZWxkLmNvbmZpZy5jbGFzc0lELFxuICAgICAgaWQ6IGZpZWxkLmlkIHx8IG5hbWUgfHwgb3JpZ2luYWxDb2xJbmRleCxcbiAgICAgIGRpc3BsYXlBcyxcbiAgICAgIGFzc29jaWF0aW9uSUQ6IGZpZWxkLmNvbmZpZy5hc3NvY2lhdGlvbklELFxuICAgICAgLi4uKGZpZWxkLmNvbmZpZy5jbGFzc0lEICYmIHsgY2F0ZWdvcnk6IGZpZWxkLmNvbmZpZy5jYXRlZ29yeSB9KSxcbiAgICAgIGN1c3RvbU9iamVjdDoge30sXG4gICAgICBmaWVsZFR5cGU6IGZpZWxkLmNvbmZpZy5maWVsZFR5cGUsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLmZpZWxkXG4gICAgICB9XG4gICAgfTtcblxuICAgIHBvcHVsYXRlUmVuZGVyaW5nT3B0aW9ucyhuYW1lLCBjb25maWcsIGZpZWxkKTtcblxuICAgIHJldHVybiBjb25maWc7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0SXRlbUtleSA9IGZpZWxkcyA9PiB7XG4gIGxldCBpdGVtS2V5O1xuICBpZiAoZmllbGRzLmZpbmRJbmRleChmaWVsZCA9PiBmaWVsZC5pZCA9PT0gJ3B5R1VJRCcpID4gLTEpIHtcbiAgICBpdGVtS2V5ID0gJ3B5R1VJRCc7XG4gIH0gZWxzZSB7XG4gICAgaXRlbUtleSA9ICdwekluc0tleSc7XG4gIH1cbiAgcmV0dXJuIGl0ZW1LZXk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBhdGNoUXVlcnlGaWVsZHMoZmllbGRzLCBpc0RhdGFPYmplY3QgPSBmYWxzZSwgY2xhc3NJRCA9ICcnKSB7XG4gIGNvbnN0IHF1ZXJ5RmllbGRzOiBhbnlbXSA9IFtdO1xuICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgY29uc3QgcGF0Y2hGaWVsZHM6IGFueVtdID0gW107XG4gICAgaWYgKGZpZWxkLmNlbGxSZW5kZXJlciA9PT0gJ1dvcmtMaW5rJykge1xuICAgICAgaWYgKGZpZWxkLmN1c3RvbU9iamVjdCAmJiBmaWVsZC5jdXN0b21PYmplY3QuaXNBc3NpZ25tZW50TGluaykge1xuICAgICAgICBjb25zdCBhc3NvY2lhdGlvbk5hbWUgPSBmaWVsZC5uYW1lLmluY2x1ZGVzKCc6JykgPyBgJHtmaWVsZC5uYW1lLnNwbGl0KCc6JylbMF19OmAgOiAnJztcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbk5hbWV9cHpJbnNLZXlgKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbk5hbWV9cHhSZWZPYmplY3RDbGFzc2ApO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC5jdXN0b21PYmplY3QgJiYgZmllbGQuY3VzdG9tT2JqZWN0LmlzQXNzb2NpYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXNzb2NpYXRpb25DYXRlZ29yeSA9IGZpZWxkLm5hbWUuc3BsaXQoJzonKVswXTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpweUlEYCk7XG4gICAgICAgIHBhdGNoRmllbGRzLnB1c2goYCR7YXNzb2NpYXRpb25DYXRlZ29yeX06cHpJbnNLZXlgKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpweE9iakNsYXNzYCk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGF0YU9iamVjdCkge1xuICAgICAgICBjb25zdCBkYXRhVmlld05hbWUgPSBQQ29yZS5nZXREYXRhVHlwZVV0aWxzKCkuZ2V0U2F2YWJsZURhdGFQYWdlKGNsYXNzSUQpO1xuICAgICAgICBjb25zdCBkYXRhUGFnZUtleXMgPSBQQ29yZS5nZXREYXRhVHlwZVV0aWxzKCkuZ2V0RGF0YVBhZ2VLZXlzKGRhdGFWaWV3TmFtZSk7XG4gICAgICAgIGRhdGFQYWdlS2V5cz8uZm9yRWFjaChpdGVtID0+IChpdGVtLmlzQWx0ZXJuYXRlS2V5U3RvcmFnZSA/IHBhdGNoRmllbGRzLnB1c2goaXRlbS5saW5rZWRGaWVsZCkgOiBwYXRjaEZpZWxkcy5wdXNoKGl0ZW0ua2V5TmFtZSkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoRmllbGRzLnB1c2goJ3B5SUQnKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaCgncHpJbnNLZXknKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaCgncHhPYmpDbGFzcycpO1xuICAgICAgfVxuICAgIH1cbiAgICBwYXRjaEZpZWxkcy5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKCFxdWVyeUZpZWxkcy5maW5kKHEgPT4gcSA9PT0gaykpIHtcbiAgICAgICAgcXVlcnlGaWVsZHMucHVzaChrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHF1ZXJ5RmllbGRzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdHlwZSBQYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUGFnZUZpZWxkc0NvbmZpZyhjb25maWdGaWVsZHMsIHBhcmVudENsYXNzSUQpIHtcbiAgcmV0dXJuIGNvbmZpZ0ZpZWxkcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBjb25maWc6IHsgdmFsdWUgfVxuICAgIH0gPSBpdGVtO1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IFBDb3JlLmdldEFubm90YXRpb25VdGlscygpLmdldFByb3BlcnR5TmFtZSh2YWx1ZSk7XG4gICAgaWYgKGlzRW1iZWRkZWRGaWVsZCh2YWx1ZSkgJiYgIWlzUGFnZUxpc3RJblBhdGgocHJvcGVydHlOYW1lLCBwYXJlbnRDbGFzc0lEKSkge1xuICAgICAgaXRlbS5jb25maWcuY29tcG9uZW50VHlwZSA9IHR5cGU7XG4gICAgICBpdGVtLnR5cGUgPSAnUGFnZVByb3BlcnR5UmVuZGVyZXInO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCByZWFkQ29udGV4dFJlc3BvbnNlID0gYXN5bmMgKGNvbnRleHQsIHBhcmFtcykgPT4ge1xuICBjb25zdCB7IHBDb25uJCwgYXBpQ29udGV4dCwgY2hpbGRyZW4sIHNob3dEeW5hbWljRmllbGRzLCByZWZlcmVuY2VMaXN0LCBpc0RhdGFPYmplY3QgfSA9IHBhcmFtcztcbiAgLy8gbGV0IHsgbGlzdENvbnRleHQgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBwcm9taXNlc1Jlc3BvbnNlQXJyYXksIGFwaUNvbnRleHQ6IG90aGVyQ29udGV4dCB9ID0gY29udGV4dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvbm8tdW51c2VkLWNvbGxlY3Rpb25cbiAgY29uc3QgbGlzdE9mQ29tcG9uZW50czogYW55W10gPSBbXTtcbiAgY29uc3Qge1xuICAgIGRhdGE6IHsgZmllbGRzOiBtZXRhRmllbGRzLCBjbGFzc0lELCBpc1F1ZXJ5YWJsZSB9XG4gIH0gPSBwcm9taXNlc1Jlc3BvbnNlQXJyYXlbMF07XG4gIGxldCB7XG4gICAgZGF0YTogeyBwcmltYXJ5RmllbGRzIH1cbiAgfSA9IHByb21pc2VzUmVzcG9uc2VBcnJheVswXTtcbiAgLy8gV2hlbiBsaXN0IGlzIGNvbmZpZ3VyZWQgd2l0aCBJbmNsdWRlIGFsbCBjbGFzcyBmaWVsZHMgY29uZmlndXJhdGlvbiwgcHJvdmlkZSBzdXBwb3J0IGZvciBQcmltYXJ5IGZpZWxkcyBjb2x1bW5cbiAgaWYgKHNob3dEeW5hbWljRmllbGRzKSB7XG4gICAgY29uc3Qgc291cmNlTWV0YWRhdGEgPSBQQ29yZS5nZXRNZXRhZGF0YVV0aWxzKCkuZ2V0RGF0YVBhZ2VNZXRhZGF0YShyZWZlcmVuY2VMaXN0KTtcbiAgICBpZiAoc291cmNlTWV0YWRhdGE/LnByaW1hcnlGaWVsZHMpIHtcbiAgICAgIHByaW1hcnlGaWVsZHMgPSBzb3VyY2VNZXRhZGF0YS5wcmltYXJ5RmllbGRzO1xuICAgIH1cbiAgICAvLyB1cGRhdGluZyBtZXRhRGF0YSBmaWVsZElEIHRvIG5vcm1hbCBwcm9wZXJ0eSBpZiBpdCBoYXMgZmllbGRJRCBzdGFydHMgd2l0aCAhUCEgb3IgIVBMIVxuICAgIHVwZGF0ZU1ldGFFbWJlZGRlZEZpZWxkSUQobWV0YUZpZWxkcyk7XG4gIH1cbiAgdXBkYXRlRmllbGRUeXBlKG1ldGFGaWVsZHMpO1xuXG4gIGlmIChpc0RhdGFPYmplY3QpIHtcbiAgICBjb25zdCBjb21wb3NpdGVLZXlzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGRhdGFWaWV3TmFtZSA9IFBDb3JlLmdldERhdGFUeXBlVXRpbHMoKS5nZXRTYXZhYmxlRGF0YVBhZ2UoY2xhc3NJRCk7XG4gICAgY29uc3QgZGF0YVBhZ2VLZXlzID0gUENvcmUuZ2V0RGF0YVR5cGVVdGlscygpLmdldERhdGFQYWdlS2V5cyhkYXRhVmlld05hbWUpO1xuICAgIGRhdGFQYWdlS2V5cz8uZm9yRWFjaChpdGVtID0+IChpdGVtLmlzQWx0ZXJuYXRlS2V5U3RvcmFnZSA/IGNvbXBvc2l0ZUtleXMucHVzaChpdGVtLmxpbmtlZEZpZWxkKSA6IGNvbXBvc2l0ZUtleXMucHVzaChpdGVtLmtleU5hbWUpKSk7XG4gICAgaWYgKGNvbXBvc2l0ZUtleXMubGVuZ3RoICYmIG90aGVyQ29udGV4dCkge1xuICAgICAgb3RoZXJDb250ZXh0LnNldENvbXBvc2l0ZUtleXMoY29tcG9zaXRlS2V5cyk7XG4gICAgfVxuICAgIGlmIChvdGhlckNvbnRleHQpIHtcbiAgICAgIG90aGVyQ29udGV4dC5mZXRjaFJvd0FjdGlvbkRldGFpbHMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByZXNldEFycmF5ID0gW107XG4gIGNvbnN0IHJhd01ldGFkYXRhID0gcENvbm4kLmdldFJhd01ldGFkYXRhKCkuY29uZmlnO1xuICBjb25zdCByYXdQcmVzZXRzID0gcmF3TWV0YWRhdGEucHJlc2V0cztcbiAgY29uc3QgaXNNZXRhV2l0aFByZXNldHMgPSByYXdQcmVzZXRzICYmIHJhd1ByZXNldHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBjaGlsZHJlbkl0ZXJhdG9yID0gaXNNZXRhV2l0aFByZXNldHMgPyByYXdQcmVzZXRzIDogY2hpbGRyZW47XG4gIGNvbnN0IHJlc29sdmVkUHJlc2V0cyA9IHBDb25uJC5nZXRDb25maWdQcm9wcygpLnByZXNldHM7XG4gIGxldCBmaWVsZHM7XG4gIGxldCB0YWJsZUNvbmZpZztcbiAgY2hpbGRyZW5JdGVyYXRvcj8uZm9yRWFjaCgocHJlc2V0TWV0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB7IGNvbmZpZ0ZpZWxkcyB9ID0gZ2V0VGFibGVDb25maWdGcm9tUHJlc2V0TWV0YShcbiAgICAgIHsgLi4ucHJlc2V0TWV0YSwgbGFiZWw6IHJlc29sdmVkUHJlc2V0c1tpbmRleF0ubGFiZWwgfSxcbiAgICAgIGlzTWV0YVdpdGhQcmVzZXRzLFxuICAgICAgcENvbm4kLFxuICAgICAgY2xhc3NJRCxcbiAgICAgIHByaW1hcnlGaWVsZHMsXG4gICAgICBtZXRhRmllbGRzXG4gICAgKTtcbiAgICBjb25zdCBwdXNoVG9Db21wb25lbnRzTGlzdCA9IGZpZWxkVHlwZSA9PiB7XG4gICAgICBsaXN0T2ZDb21wb25lbnRzLnB1c2goZmllbGRUeXBlKTtcbiAgICB9O1xuICAgIC8vIHJlYWQgcmVwb3J0IGNvbHVtbnMgcmVzcG9uc2UgLSBpbiBjYXNlIG9mIG5vbnF1ZXJ5YWJsZSBpZ25vcmUgdGhlIHJlc3BvbnNlIGFuZCByZWx5IG9ubHkgb24gdGhlIGZpZWxkcyBjb25maWd1cmVkIGF0IGF1dGhvaW5nIHRpbWUgaW4gcHJlc2V0c1xuICAgIGNvbnN0IHJlcG9ydENvbHVtbnNTZXQgPSBpc1F1ZXJ5YWJsZSA/IGdldFJlcG9ydENvbHVtbnMocHJvbWlzZXNSZXNwb25zZUFycmF5WzFdKSA6IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IGNvbmZpZ0ZpZWxkU2V0ID0gcHJlcGFyZUNvbmZpZ0ZpZWxkcyhjb25maWdGaWVsZHMsIHB1c2hUb0NvbXBvbmVudHNMaXN0KTtcblxuICAgIC8vIEZJWE1FICNFbWJlZGRlZFByb3BlcnR5UGF0Y2hcbiAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBtZXJnZSBsb2dpYyB3aGVuIHRoZSBtZXRhZGF0YSByZXNwb25zZSBpbmNsdWRlcyBhbGwgb3B0aW1pemVkIGVtYmVkZGVkIHBhZ2UgYW5kIHBhZ2VsaXN0c1xuICAgIC8vIG1lcmdpbmcgY29uZmlndXJlZCBlbWJlZGRlZCBwcm9wZXJ0aWVzIHdpdGggbWV0YWRhdGEgc28gdGhhdCB3aGlsZSBwcmVwYXJpbmcgZXh0cmEgZmllbGRzLCBjb25maWcgZmllbGRzIGNhbiBnZXQgb3RoZXIgcHJvcGVydGllcyBmcm9tIG1ldGEoZWc6IGNhdGVnb3J5LCBkaXNwbGF5QXNMaW5rKVxuICAgIC8vIGdldCBjb25maWd1cmVkIGVtYmVkZGVkIHByb3BlcnRpZXMgbWV0YWRhdGEgYW5kIGdldCBuZXcgbWVyZ2VkTWV0YUZpZWxkc1xuICAgIGNvbnN0IGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YSA9IGdldENvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YShjb25maWdGaWVsZFNldCwgY2xhc3NJRCk7XG4gICAgY29uc3QgbWVyZ2VkTWV0YUZpZWxkcyA9IG1lcmdlQ29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhKGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YSwgbWV0YUZpZWxkcyk7XG5cbiAgICBjb25zdCBleHRyYUZpZWxkcyA9IHByZXBhcmVFeHRyYUZpZWxkcyhcbiAgICAgIG1lcmdlZE1ldGFGaWVsZHMsIC8vIHBhc3NpbmcgbmV3IG1lcmdlZCBtZXRhIGZpZWxkcyB3aGljaCBoYXMgbWV0YSBvZiBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkcyBvZiBjdXJyZW50IHByZXNldFxuICAgICAgY29uZmlnRmllbGRzLFxuICAgICAgY29uZmlnRmllbGRTZXQsXG4gICAgICByZXBvcnRDb2x1bW5zU2V0LFxuICAgICAgY2xhc3NJRCxcbiAgICAgIHNob3dEeW5hbWljRmllbGRzXG4gICAgKTtcblxuICAgIGlmIChpc1F1ZXJ5YWJsZSkge1xuICAgICAgdXBkYXRlUGFnZUZpZWxkc0NvbmZpZyhjb25maWdGaWVsZHMsIGNsYXNzSUQpO1xuICAgICAgcHJlcGFyZVByb3BlcnR5TWFwcyhbLi4uY29uZmlnRmllbGRzLCAuLi5leHRyYUZpZWxkc10sIGNsYXNzSUQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ2V0TWFwcGVkUHJvcGVydHkgfSA9IGNvbnRleHQ7XG5cbiAgICBmaWVsZHMgPSBpbml0aWFsaXplQ29sdW1ucyhbLi4uY29uZmlnRmllbGRzLCAuLi5leHRyYUZpZWxkc10sIGdldE1hcHBlZFByb3BlcnR5KTtcbiAgICBjb25zdCBwYXRjaFF1ZXJ5RmllbGRzID0gcHJlcGFyZVBhdGNoUXVlcnlGaWVsZHMoZmllbGRzLCBpc0RhdGFPYmplY3QsIGNsYXNzSUQpO1xuICAgIGNvbnN0IGl0ZW1LZXkgPSBnZXRJdGVtS2V5KGZpZWxkcyk7XG4gICAgdGFibGVDb25maWcgPSB7IGZpZWxkRGVmczogZmllbGRzLCBwYXRjaFF1ZXJ5RmllbGRzLCBpdGVtS2V5LCBpc1F1ZXJ5YWJsZSB9O1xuICB9KTtcbiAgY29uc3QgbWV0YSA9IHRhYmxlQ29uZmlnO1xuICBwYXJhbXMubGlzdENvbnRleHQgPSB7IG1ldGEsIHByZXNldHM6IHByZXNldEFycmF5LCBhcGlDb250ZXh0OiB7IC4uLmFwaUNvbnRleHQgfSB9O1xuICByZXR1cm4gcGFyYW1zLmxpc3RDb250ZXh0O1xufTtcbiJdfQ==
|