@openziti/ziti-console-lib 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/styles/global.scss +70 -0
- package/fesm2022/openziti-ziti-console-lib.mjs +2136 -1327
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/index.d.ts +5689 -6
- package/index.d.ts.map +1 -0
- package/package.json +10 -12
- package/esm2022/lib/ZAC_VERSION.mjs +0 -4
- package/esm2022/lib/app.initializer.mjs +0 -24
- package/esm2022/lib/default-app-config.mjs +0 -5
- package/esm2022/lib/features/card/card.component.mjs +0 -34
- package/esm2022/lib/features/card-list/card-list.component.mjs +0 -55
- package/esm2022/lib/features/config-editor/config-editor.component.mjs +0 -337
- package/esm2022/lib/features/confirm/confirm.component.mjs +0 -77
- package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +0 -93
- package/esm2022/lib/features/custom-tags/custom-tags.component.mjs +0 -111
- package/esm2022/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.mjs +0 -46
- package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +0 -49
- package/esm2022/lib/features/data-table/cells/table-cell-select/table-cell-select.component.mjs +0 -58
- package/esm2022/lib/features/data-table/cells/table-cell-token/table-cell-token.component.mjs +0 -123
- package/esm2022/lib/features/data-table/column-headers/table-column-default/table-column-default.component.mjs +0 -268
- package/esm2022/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.mjs +0 -93
- package/esm2022/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.mjs +0 -37
- package/esm2022/lib/features/data-table/column-headers/table-column-select/table-column-select.component.mjs +0 -33
- package/esm2022/lib/features/data-table/data-table-filter.service.mjs +0 -138
- package/esm2022/lib/features/data-table/data-table.component.mjs +0 -918
- package/esm2022/lib/features/data-table/data-table.service.mjs +0 -98
- package/esm2022/lib/features/data-table/table-filter-bar/filter-bar.component.mjs +0 -108
- package/esm2022/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.mjs +0 -26
- package/esm2022/lib/features/data-table/tooltips/os-tooltip.component.mjs +0 -29
- package/esm2022/lib/features/data-table/tooltips/sdk-tooltip.component.mjs +0 -34
- package/esm2022/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.mjs +0 -72
- package/esm2022/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.mjs +0 -134
- package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.mjs +0 -189
- package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.mjs +0 -50
- package/esm2022/lib/features/dynamic-widgets/number/number-input.component.mjs +0 -95
- package/esm2022/lib/features/dynamic-widgets/object/object.component.mjs +0 -121
- package/esm2022/lib/features/dynamic-widgets/password/password-input.component.mjs +0 -83
- package/esm2022/lib/features/dynamic-widgets/port-ranges/port-ranges.component.mjs +0 -100
- package/esm2022/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.mjs +0 -201
- package/esm2022/lib/features/dynamic-widgets/selector/selector-input.component.mjs +0 -166
- package/esm2022/lib/features/dynamic-widgets/string/string-input.component.mjs +0 -108
- package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +0 -126
- package/esm2022/lib/features/extendable/extendable.component.mjs +0 -55
- package/esm2022/lib/features/extendable/extensions-noop.service.mjs +0 -52
- package/esm2022/lib/features/header-bar/header-bar.component.mjs +0 -105
- package/esm2022/lib/features/json-view/json-view.component.mjs +0 -212
- package/esm2022/lib/features/list-page-features/list-page-form/list-page-form.component.mjs +0 -138
- package/esm2022/lib/features/list-page-features/list-page-header/list-page-header.component.mjs +0 -66
- package/esm2022/lib/features/loading-indicator/loading-indicator.component.mjs +0 -29
- package/esm2022/lib/features/login/login-dialog.component.mjs +0 -121
- package/esm2022/lib/features/messaging/growler.component.mjs +0 -62
- package/esm2022/lib/features/messaging/growler.model.mjs +0 -24
- package/esm2022/lib/features/messaging/growler.module.mjs +0 -34
- package/esm2022/lib/features/messaging/growler.service.mjs +0 -71
- package/esm2022/lib/features/messaging/logger.service.mjs +0 -174
- package/esm2022/lib/features/multi-action-button/multi-action-button.component.mjs +0 -30
- package/esm2022/lib/features/no-items/no-items.component.mjs +0 -46
- package/esm2022/lib/features/overrides/overrides.component.mjs +0 -118
- package/esm2022/lib/features/overrides/overrides.service.mjs +0 -114
- package/esm2022/lib/features/preview-list/preview-list.component.mjs +0 -151
- package/esm2022/lib/features/preview-selections/preview-selections.component.mjs +0 -114
- package/esm2022/lib/features/progress-meter/progress-meter.component.mjs +0 -43
- package/esm2022/lib/features/progress-wizard/progress-wizard.component.mjs +0 -90
- package/esm2022/lib/features/projectable-forms/api-session/api-session-form.component.mjs +0 -143
- package/esm2022/lib/features/projectable-forms/api-session/api-session-form.service.mjs +0 -118
- package/esm2022/lib/features/projectable-forms/auth-policy/auth-policy-form.component.mjs +0 -337
- package/esm2022/lib/features/projectable-forms/auth-policy/auth-policy-form.service.mjs +0 -114
- package/esm2022/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.mjs +0 -399
- package/esm2022/lib/features/projectable-forms/certificate-authority/certificate-authority-form.service.mjs +0 -95
- package/esm2022/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.component.mjs +0 -217
- package/esm2022/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.service.mjs +0 -54
- package/esm2022/lib/features/projectable-forms/config-type/config-type-form.component.mjs +0 -244
- package/esm2022/lib/features/projectable-forms/config-type/config-type-form.service.mjs +0 -92
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +0 -275
- package/esm2022/lib/features/projectable-forms/configuration/configuration.service.mjs +0 -137
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +0 -231
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.service.mjs +0 -118
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +0 -277
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.mjs +0 -188
- package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +0 -101
- package/esm2022/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.mjs +0 -54
- package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +0 -135
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +0 -471
- package/esm2022/lib/features/projectable-forms/identity/identity-form.service.mjs +0 -131
- package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.mjs +0 -533
- package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.mjs +0 -79
- package/esm2022/lib/features/projectable-forms/posture-check/posture-check-form.component.mjs +0 -437
- package/esm2022/lib/features/projectable-forms/posture-check/posture-check-form.service.mjs +0 -81
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +0 -315
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +0 -330
- package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +0 -591
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +0 -1036
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +0 -275
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.mjs +0 -172
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +0 -279
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.service.mjs +0 -230
- package/esm2022/lib/features/projectable-forms/session/session-form.component.mjs +0 -213
- package/esm2022/lib/features/projectable-forms/session/session-form.service.mjs +0 -84
- package/esm2022/lib/features/projectable-forms/terminator/terminator-form.component.mjs +0 -244
- package/esm2022/lib/features/projectable-forms/terminator/terminator-form.service.mjs +0 -130
- package/esm2022/lib/features/projectable-forms/transit-router/transit-router-form.component.mjs +0 -224
- package/esm2022/lib/features/projectable-forms/transit-router/transit-router-form.service.mjs +0 -118
- package/esm2022/lib/features/qr-code/qr-code.component.mjs +0 -166
- package/esm2022/lib/features/quick-add/quick-add.component.mjs +0 -50
- package/esm2022/lib/features/reset-enrollment/reset-enrollment.component.mjs +0 -86
- package/esm2022/lib/features/reset-enrollment/reset-enrollment.service.mjs +0 -61
- package/esm2022/lib/features/side-modal/side-modal.component.mjs +0 -45
- package/esm2022/lib/features/side-navigator/side-navigator.component.mjs +0 -127
- package/esm2022/lib/features/sidebars/side-navbar/side-navbar.component.mjs +0 -54
- package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +0 -291
- package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.component.mjs +0 -586
- package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.helper.mjs +0 -373
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +0 -1706
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.helper.mjs +0 -591
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs +0 -883
- package/esm2022/lib/features/visualizer/visualizer-service.class.mjs +0 -32
- package/esm2022/lib/models/api-session.mjs +0 -7
- package/esm2022/lib/models/auth-policy.mjs +0 -31
- package/esm2022/lib/models/certificate-authority.mjs +0 -16
- package/esm2022/lib/models/config-type.mjs +0 -10
- package/esm2022/lib/models/config.mjs +0 -10
- package/esm2022/lib/models/edge-router-policy.mjs +0 -11
- package/esm2022/lib/models/edge-router.mjs +0 -13
- package/esm2022/lib/models/identity.mjs +0 -34
- package/esm2022/lib/models/jwt-signer.mjs +0 -20
- package/esm2022/lib/models/posture-check.mjs +0 -29
- package/esm2022/lib/models/service-edge-router-policy.mjs +0 -11
- package/esm2022/lib/models/service-policy.mjs +0 -13
- package/esm2022/lib/models/service.mjs +0 -12
- package/esm2022/lib/models/session.mjs +0 -7
- package/esm2022/lib/models/terminator.mjs +0 -14
- package/esm2022/lib/pages/api-sessions/api-sessions-page.component.mjs +0 -112
- package/esm2022/lib/pages/api-sessions/api-sessions-page.service.mjs +0 -235
- package/esm2022/lib/pages/attributes/attributes.component.mjs +0 -104
- package/esm2022/lib/pages/auth-policies/auth-policies-page.component.mjs +0 -120
- package/esm2022/lib/pages/auth-policies/auth-policies-page.service.mjs +0 -215
- package/esm2022/lib/pages/callback/callback.component.mjs +0 -155
- package/esm2022/lib/pages/certificate-authorities/certificate-authorities-page.component.mjs +0 -119
- package/esm2022/lib/pages/certificate-authorities/certificate-authorities-page.service.mjs +0 -240
- package/esm2022/lib/pages/config-types/config-types-page.component.mjs +0 -130
- package/esm2022/lib/pages/config-types/config-types-page.service.mjs +0 -134
- package/esm2022/lib/pages/configurations/configurations-page.component.mjs +0 -134
- package/esm2022/lib/pages/configurations/configurations-page.service.mjs +0 -251
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +0 -128
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +0 -407
- package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +0 -136
- package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +0 -354
- package/esm2022/lib/pages/geolocate/geolocate.component.mjs +0 -130
- package/esm2022/lib/pages/identities/identities-page.component.mjs +0 -221
- package/esm2022/lib/pages/identities/identities-page.service.mjs +0 -591
- package/esm2022/lib/pages/jwt-signers/jwt-signers-page.component.mjs +0 -160
- package/esm2022/lib/pages/jwt-signers/jwt-signers-page.service.mjs +0 -177
- package/esm2022/lib/pages/posture-checks/posture-checks-page.component.mjs +0 -103
- package/esm2022/lib/pages/posture-checks/posture-checks-page.service.mjs +0 -200
- package/esm2022/lib/pages/profile/profile.component.mjs +0 -58
- package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.mjs +0 -122
- package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.mjs +0 -367
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +0 -124
- package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +0 -446
- package/esm2022/lib/pages/services/services-page.component.mjs +0 -218
- package/esm2022/lib/pages/services/services-page.service.mjs +0 -378
- package/esm2022/lib/pages/sessions/sessions-page.component.mjs +0 -112
- package/esm2022/lib/pages/sessions/sessions-page.service.mjs +0 -228
- package/esm2022/lib/pages/settings/settings.component.mjs +0 -61
- package/esm2022/lib/pages/terminators/terminators-page.component.mjs +0 -97
- package/esm2022/lib/pages/terminators/terminators-page.service.mjs +0 -235
- package/esm2022/lib/pages/transit-routers/transit-routers-page.component.mjs +0 -129
- package/esm2022/lib/pages/transit-routers/transit-routers-page.service.mjs +0 -248
- package/esm2022/lib/safe.pipe.mjs +0 -18
- package/esm2022/lib/services/auth.service.mjs +0 -94
- package/esm2022/lib/services/console-events.service.mjs +0 -20
- package/esm2022/lib/services/csv-download.service.mjs +0 -91
- package/esm2022/lib/services/deactivate-guard.service.mjs +0 -17
- package/esm2022/lib/services/login-service.class.mjs +0 -47
- package/esm2022/lib/services/node-data.service.mjs +0 -397
- package/esm2022/lib/services/noop-login.service.mjs +0 -41
- package/esm2022/lib/services/schema.service.mjs +0 -807
- package/esm2022/lib/services/settings-service.class.mjs +0 -120
- package/esm2022/lib/services/settings.service.mjs +0 -203
- package/esm2022/lib/services/tab-name.service.mjs +0 -76
- package/esm2022/lib/services/validation.service.mjs +0 -156
- package/esm2022/lib/services/ziti-controller-data.service.mjs +0 -340
- package/esm2022/lib/services/ziti-data.service.mjs +0 -100
- package/esm2022/lib/services/ziti-domain-controller.service.mjs +0 -3
- package/esm2022/lib/shared/list-page-component.class.mjs +0 -186
- package/esm2022/lib/shared/list-page-service.class.mjs +0 -244
- package/esm2022/lib/urls.mjs +0 -34
- package/esm2022/lib/zac-routing.module.mjs +0 -34
- package/esm2022/lib/ziti-console-lib.module.mjs +0 -538
- package/esm2022/lib/ziti-console.constants.mjs +0 -20
- package/esm2022/openziti-ziti-console-lib.mjs +0 -5
- package/esm2022/public-api.mjs +0 -130
- package/lib/ZAC_VERSION.d.ts +0 -4
- package/lib/ZAC_VERSION.d.ts.map +0 -1
- package/lib/app.initializer.d.ts +0 -3
- package/lib/app.initializer.d.ts.map +0 -1
- package/lib/default-app-config.d.ts +0 -9
- package/lib/default-app-config.d.ts.map +0 -1
- package/lib/features/card/card.component.d.ts +0 -13
- package/lib/features/card/card.component.d.ts.map +0 -1
- package/lib/features/card-list/card-list.component.d.ts +0 -27
- package/lib/features/card-list/card-list.component.d.ts.map +0 -1
- package/lib/features/config-editor/config-editor.component.d.ts +0 -50
- package/lib/features/config-editor/config-editor.component.d.ts.map +0 -1
- package/lib/features/confirm/confirm.component.d.ts +0 -34
- package/lib/features/confirm/confirm.component.d.ts.map +0 -1
- package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts +0 -32
- package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts.map +0 -1
- package/lib/features/custom-tags/custom-tags.component.d.ts +0 -37
- package/lib/features/custom-tags/custom-tags.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts +0 -16
- package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts +0 -20
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts +0 -15
- package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts +0 -22
- package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts +0 -52
- package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts +0 -27
- package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts +0 -19
- package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts +0 -15
- package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts.map +0 -1
- package/lib/features/data-table/data-table-filter.service.d.ts +0 -37
- package/lib/features/data-table/data-table-filter.service.d.ts.map +0 -1
- package/lib/features/data-table/data-table.component.d.ts +0 -164
- package/lib/features/data-table/data-table.component.d.ts.map +0 -1
- package/lib/features/data-table/data-table.service.d.ts +0 -20
- package/lib/features/data-table/data-table.service.d.ts.map +0 -1
- package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts +0 -25
- package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts.map +0 -1
- package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts +0 -10
- package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts.map +0 -1
- package/lib/features/data-table/tooltips/os-tooltip.component.d.ts +0 -15
- package/lib/features/data-table/tooltips/os-tooltip.component.d.ts.map +0 -1
- package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts +0 -15
- package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts +0 -19
- package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts +0 -28
- package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts +0 -50
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts +0 -14
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/number/number-input.component.d.ts +0 -23
- package/lib/features/dynamic-widgets/number/number-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/object/object.component.d.ts +0 -26
- package/lib/features/dynamic-widgets/object/object.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/password/password-input.component.d.ts +0 -24
- package/lib/features/dynamic-widgets/password/password-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts +0 -22
- package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts +0 -60
- package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts +0 -30
- package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/string/string-input.component.d.ts +0 -27
- package/lib/features/dynamic-widgets/string/string-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts +0 -26
- package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +0 -1
- package/lib/features/extendable/extendable.component.d.ts +0 -15
- package/lib/features/extendable/extendable.component.d.ts.map +0 -1
- package/lib/features/extendable/extensions-noop.service.d.ts +0 -35
- package/lib/features/extendable/extensions-noop.service.d.ts.map +0 -1
- package/lib/features/header-bar/header-bar.component.d.ts +0 -29
- package/lib/features/header-bar/header-bar.component.d.ts.map +0 -1
- package/lib/features/json-view/json-view.component.d.ts +0 -40
- package/lib/features/json-view/json-view.component.d.ts.map +0 -1
- package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts +0 -35
- package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts.map +0 -1
- package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts +0 -14
- package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts.map +0 -1
- package/lib/features/loading-indicator/loading-indicator.component.d.ts +0 -11
- package/lib/features/loading-indicator/loading-indicator.component.d.ts.map +0 -1
- package/lib/features/login/login-dialog.component.d.ts +0 -30
- package/lib/features/login/login-dialog.component.d.ts.map +0 -1
- package/lib/features/messaging/growler.component.d.ts +0 -19
- package/lib/features/messaging/growler.component.d.ts.map +0 -1
- package/lib/features/messaging/growler.model.d.ts +0 -8
- package/lib/features/messaging/growler.model.d.ts.map +0 -1
- package/lib/features/messaging/growler.module.d.ts +0 -10
- package/lib/features/messaging/growler.module.d.ts.map +0 -1
- package/lib/features/messaging/growler.service.d.ts +0 -18
- package/lib/features/messaging/growler.service.d.ts.map +0 -1
- package/lib/features/messaging/logger.service.d.ts +0 -27
- package/lib/features/messaging/logger.service.d.ts.map +0 -1
- package/lib/features/multi-action-button/multi-action-button.component.d.ts +0 -13
- package/lib/features/multi-action-button/multi-action-button.component.d.ts.map +0 -1
- package/lib/features/no-items/no-items.component.d.ts +0 -19
- package/lib/features/no-items/no-items.component.d.ts.map +0 -1
- package/lib/features/overrides/overrides.component.d.ts +0 -33
- package/lib/features/overrides/overrides.component.d.ts.map +0 -1
- package/lib/features/overrides/overrides.service.d.ts +0 -18
- package/lib/features/overrides/overrides.service.d.ts.map +0 -1
- package/lib/features/preview-list/preview-list.component.d.ts +0 -34
- package/lib/features/preview-list/preview-list.component.d.ts.map +0 -1
- package/lib/features/preview-selections/preview-selections.component.d.ts +0 -39
- package/lib/features/preview-selections/preview-selections.component.d.ts.map +0 -1
- package/lib/features/progress-meter/progress-meter.component.d.ts +0 -19
- package/lib/features/progress-meter/progress-meter.component.d.ts.map +0 -1
- package/lib/features/progress-wizard/progress-wizard.component.d.ts +0 -31
- package/lib/features/progress-wizard/progress-wizard.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/api-session/api-session-form.component.d.ts +0 -50
- package/lib/features/projectable-forms/api-session/api-session-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/api-session/api-session-form.service.d.ts +0 -27
- package/lib/features/projectable-forms/api-session/api-session-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.component.d.ts +0 -74
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.service.d.ts +0 -38
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.d.ts +0 -80
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.service.d.ts +0 -37
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.component.d.ts +0 -62
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.service.d.ts +0 -28
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/config-type/config-type-form.component.d.ts +0 -63
- package/lib/features/projectable-forms/config-type/config-type-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/config-type/config-type-form.service.d.ts +0 -27
- package/lib/features/projectable-forms/config-type/config-type-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +0 -62
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/configuration/configuration.service.d.ts +0 -33
- package/lib/features/projectable-forms/configuration/configuration.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +0 -53
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts +0 -29
- package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +0 -54
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts +0 -40
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +0 -29
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts +0 -15
- package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts +0 -38
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +0 -93
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/identity/identity-form.service.d.ts +0 -20
- package/lib/features/projectable-forms/identity/identity-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts +0 -97
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.d.ts +0 -21
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/posture-check/posture-check-form.component.d.ts +0 -134
- package/lib/features/projectable-forms/posture-check/posture-check-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/posture-check/posture-check-form.service.d.ts +0 -23
- package/lib/features/projectable-forms/posture-check/posture-check-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +0 -92
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +0 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts +0 -70
- package/lib/features/projectable-forms/service/service-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service/service-form.service.d.ts +0 -123
- package/lib/features/projectable-forms/service/service-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +0 -173
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts +0 -53
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.d.ts +0 -38
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +0 -55
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts +0 -48
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/session/session-form.component.d.ts +0 -63
- package/lib/features/projectable-forms/session/session-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/session/session-form.service.d.ts +0 -23
- package/lib/features/projectable-forms/session/session-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/terminator/terminator-form.component.d.ts +0 -58
- package/lib/features/projectable-forms/terminator/terminator-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/terminator/terminator-form.service.d.ts +0 -33
- package/lib/features/projectable-forms/terminator/terminator-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/transit-router/transit-router-form.component.d.ts +0 -50
- package/lib/features/projectable-forms/transit-router/transit-router-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/transit-router/transit-router-form.service.d.ts +0 -27
- package/lib/features/projectable-forms/transit-router/transit-router-form.service.d.ts.map +0 -1
- package/lib/features/qr-code/qr-code.component.d.ts +0 -45
- package/lib/features/qr-code/qr-code.component.d.ts.map +0 -1
- package/lib/features/quick-add/quick-add.component.d.ts +0 -15
- package/lib/features/quick-add/quick-add.component.d.ts.map +0 -1
- package/lib/features/reset-enrollment/reset-enrollment.component.d.ts +0 -27
- package/lib/features/reset-enrollment/reset-enrollment.component.d.ts.map +0 -1
- package/lib/features/reset-enrollment/reset-enrollment.service.d.ts +0 -13
- package/lib/features/reset-enrollment/reset-enrollment.service.d.ts.map +0 -1
- package/lib/features/side-modal/side-modal.component.d.ts +0 -15
- package/lib/features/side-modal/side-modal.component.d.ts.map +0 -1
- package/lib/features/side-navigator/side-navigator.component.d.ts +0 -33
- package/lib/features/side-navigator/side-navigator.component.d.ts.map +0 -1
- package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts +0 -16
- package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts.map +0 -1
- package/lib/features/tag-selector/tag-selector.component.d.ts +0 -59
- package/lib/features/tag-selector/tag-selector.component.d.ts.map +0 -1
- package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts +0 -54
- package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts.map +0 -1
- package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts +0 -21
- package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts.map +0 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts +0 -146
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts.map +0 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts +0 -172
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts.map +0 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts +0 -35
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts.map +0 -1
- package/lib/features/visualizer/visualizer-service.class.d.ts +0 -10
- package/lib/features/visualizer/visualizer-service.class.d.ts.map +0 -1
- package/lib/models/api-session.d.ts +0 -18
- package/lib/models/api-session.d.ts.map +0 -1
- package/lib/models/auth-policy.d.ts +0 -8
- package/lib/models/auth-policy.d.ts.map +0 -1
- package/lib/models/certificate-authority.d.ts +0 -14
- package/lib/models/certificate-authority.d.ts.map +0 -1
- package/lib/models/config-type.d.ts +0 -7
- package/lib/models/config-type.d.ts.map +0 -1
- package/lib/models/config.d.ts +0 -7
- package/lib/models/config.d.ts.map +0 -1
- package/lib/models/edge-router-policy.d.ts +0 -8
- package/lib/models/edge-router-policy.d.ts.map +0 -1
- package/lib/models/edge-router.d.ts +0 -10
- package/lib/models/edge-router.d.ts.map +0 -1
- package/lib/models/identity.d.ts +0 -16
- package/lib/models/identity.d.ts.map +0 -1
- package/lib/models/jwt-signer.d.ts +0 -17
- package/lib/models/jwt-signer.d.ts.map +0 -1
- package/lib/models/posture-check.d.ts +0 -17
- package/lib/models/posture-check.d.ts.map +0 -1
- package/lib/models/service-edge-router-policy.d.ts +0 -8
- package/lib/models/service-edge-router-policy.d.ts.map +0 -1
- package/lib/models/service-policy.d.ts +0 -10
- package/lib/models/service-policy.d.ts.map +0 -1
- package/lib/models/service.d.ts +0 -9
- package/lib/models/service.d.ts.map +0 -1
- package/lib/models/session.d.ts +0 -17
- package/lib/models/session.d.ts.map +0 -1
- package/lib/models/terminator.d.ts +0 -11
- package/lib/models/terminator.d.ts.map +0 -1
- package/lib/pages/api-sessions/api-sessions-page.component.d.ts +0 -30
- package/lib/pages/api-sessions/api-sessions-page.component.d.ts.map +0 -1
- package/lib/pages/api-sessions/api-sessions-page.service.d.ts +0 -31
- package/lib/pages/api-sessions/api-sessions-page.service.d.ts.map +0 -1
- package/lib/pages/attributes/attributes.component.d.ts +0 -31
- package/lib/pages/attributes/attributes.component.d.ts.map +0 -1
- package/lib/pages/auth-policies/auth-policies-page.component.d.ts +0 -29
- package/lib/pages/auth-policies/auth-policies-page.component.d.ts.map +0 -1
- package/lib/pages/auth-policies/auth-policies-page.service.d.ts +0 -34
- package/lib/pages/auth-policies/auth-policies-page.service.d.ts.map +0 -1
- package/lib/pages/callback/callback.component.d.ts +0 -22
- package/lib/pages/callback/callback.component.d.ts.map +0 -1
- package/lib/pages/certificate-authorities/certificate-authorities-page.component.d.ts +0 -30
- package/lib/pages/certificate-authorities/certificate-authorities-page.component.d.ts.map +0 -1
- package/lib/pages/certificate-authorities/certificate-authorities-page.service.d.ts +0 -35
- package/lib/pages/certificate-authorities/certificate-authorities-page.service.d.ts.map +0 -1
- package/lib/pages/config-types/config-types-page.component.d.ts +0 -31
- package/lib/pages/config-types/config-types-page.component.d.ts.map +0 -1
- package/lib/pages/config-types/config-types-page.service.d.ts +0 -29
- package/lib/pages/config-types/config-types-page.service.d.ts.map +0 -1
- package/lib/pages/configurations/configurations-page.component.d.ts +0 -30
- package/lib/pages/configurations/configurations-page.component.d.ts.map +0 -1
- package/lib/pages/configurations/configurations-page.service.d.ts +0 -80
- package/lib/pages/configurations/configurations-page.service.d.ts.map +0 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts +0 -33
- package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts.map +0 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +0 -63
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +0 -1
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts +0 -36
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts.map +0 -1
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts +0 -51
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +0 -1
- package/lib/pages/geolocate/geolocate.component.d.ts +0 -32
- package/lib/pages/geolocate/geolocate.component.d.ts.map +0 -1
- package/lib/pages/identities/identities-page.component.d.ts +0 -40
- package/lib/pages/identities/identities-page.component.d.ts.map +0 -1
- package/lib/pages/identities/identities-page.service.d.ts +0 -64
- package/lib/pages/identities/identities-page.service.d.ts.map +0 -1
- package/lib/pages/jwt-signers/jwt-signers-page.component.d.ts +0 -34
- package/lib/pages/jwt-signers/jwt-signers-page.component.d.ts.map +0 -1
- package/lib/pages/jwt-signers/jwt-signers-page.service.d.ts +0 -31
- package/lib/pages/jwt-signers/jwt-signers-page.service.d.ts.map +0 -1
- package/lib/pages/posture-checks/posture-checks-page.component.d.ts +0 -29
- package/lib/pages/posture-checks/posture-checks-page.component.d.ts.map +0 -1
- package/lib/pages/posture-checks/posture-checks-page.service.d.ts +0 -28
- package/lib/pages/posture-checks/posture-checks-page.service.d.ts.map +0 -1
- package/lib/pages/profile/profile.component.d.ts +0 -17
- package/lib/pages/profile/profile.component.d.ts.map +0 -1
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.d.ts +0 -33
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.d.ts.map +0 -1
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts +0 -57
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts.map +0 -1
- package/lib/pages/service-policies/service-policies-page.component.d.ts +0 -34
- package/lib/pages/service-policies/service-policies-page.component.d.ts.map +0 -1
- package/lib/pages/service-policies/service-policies-page.service.d.ts +0 -63
- package/lib/pages/service-policies/service-policies-page.service.d.ts.map +0 -1
- package/lib/pages/services/services-page.component.d.ts +0 -42
- package/lib/pages/services/services-page.component.d.ts.map +0 -1
- package/lib/pages/services/services-page.service.d.ts +0 -69
- package/lib/pages/services/services-page.service.d.ts.map +0 -1
- package/lib/pages/sessions/sessions-page.component.d.ts +0 -30
- package/lib/pages/sessions/sessions-page.component.d.ts.map +0 -1
- package/lib/pages/sessions/sessions-page.service.d.ts +0 -30
- package/lib/pages/sessions/sessions-page.service.d.ts.map +0 -1
- package/lib/pages/settings/settings.component.d.ts +0 -23
- package/lib/pages/settings/settings.component.d.ts.map +0 -1
- package/lib/pages/terminators/terminators-page.component.d.ts +0 -29
- package/lib/pages/terminators/terminators-page.component.d.ts.map +0 -1
- package/lib/pages/terminators/terminators-page.service.d.ts +0 -32
- package/lib/pages/terminators/terminators-page.service.d.ts.map +0 -1
- package/lib/pages/transit-routers/transit-routers-page.component.d.ts +0 -35
- package/lib/pages/transit-routers/transit-routers-page.component.d.ts.map +0 -1
- package/lib/pages/transit-routers/transit-routers-page.service.d.ts +0 -50
- package/lib/pages/transit-routers/transit-routers-page.service.d.ts.map +0 -1
- package/lib/safe.pipe.d.ts +0 -11
- package/lib/safe.pipe.d.ts.map +0 -1
- package/lib/services/auth.service.d.ts +0 -21
- package/lib/services/auth.service.d.ts.map +0 -1
- package/lib/services/console-events.service.d.ts +0 -12
- package/lib/services/console-events.service.d.ts.map +0 -1
- package/lib/services/csv-download.service.d.ts +0 -11
- package/lib/services/csv-download.service.d.ts.map +0 -1
- package/lib/services/deactivate-guard.service.d.ts +0 -14
- package/lib/services/deactivate-guard.service.d.ts.map +0 -1
- package/lib/services/login-service.class.d.ts +0 -30
- package/lib/services/login-service.class.d.ts.map +0 -1
- package/lib/services/node-data.service.d.ts +0 -38
- package/lib/services/node-data.service.d.ts.map +0 -1
- package/lib/services/noop-login.service.d.ts +0 -22
- package/lib/services/noop-login.service.d.ts.map +0 -1
- package/lib/services/schema.service.d.ts +0 -63
- package/lib/services/schema.service.d.ts.map +0 -1
- package/lib/services/settings-service.class.d.ts +0 -36
- package/lib/services/settings-service.class.d.ts.map +0 -1
- package/lib/services/settings.service.d.ts +0 -20
- package/lib/services/settings.service.d.ts.map +0 -1
- package/lib/services/tab-name.service.d.ts +0 -20
- package/lib/services/tab-name.service.d.ts.map +0 -1
- package/lib/services/validation.service.d.ts +0 -20
- package/lib/services/validation.service.d.ts.map +0 -1
- package/lib/services/ziti-controller-data.service.d.ts +0 -36
- package/lib/services/ziti-controller-data.service.d.ts.map +0 -1
- package/lib/services/ziti-data.service.d.ts +0 -49
- package/lib/services/ziti-data.service.d.ts.map +0 -1
- package/lib/services/ziti-domain-controller.service.d.ts +0 -13
- package/lib/services/ziti-domain-controller.service.d.ts.map +0 -1
- package/lib/shared/list-page-component.class.d.ts +0 -57
- package/lib/shared/list-page-component.class.d.ts.map +0 -1
- package/lib/shared/list-page-service.class.d.ts +0 -81
- package/lib/shared/list-page-service.class.d.ts.map +0 -1
- package/lib/urls.d.ts +0 -34
- package/lib/urls.d.ts.map +0 -1
- package/lib/zac-routing.module.d.ts +0 -8
- package/lib/zac-routing.module.d.ts.map +0 -1
- package/lib/ziti-console-lib.module.d.ts +0 -121
- package/lib/ziti-console-lib.module.d.ts.map +0 -1
- package/lib/ziti-console.constants.d.ts +0 -5
- package/lib/ziti-console.constants.d.ts.map +0 -1
- package/openziti-ziti-console-lib.d.ts.map +0 -1
- package/public-api.d.ts +0 -127
- package/public-api.d.ts.map +0 -1
package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs
DELETED
|
@@ -1,883 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as d3 from 'd3';
|
|
3
|
-
import _ from 'lodash';
|
|
4
|
-
import { ServicePolicy, Attribute, Children, Identity, ERouter, ERPolicy, Group, Service, Config } from './network-visualizer.helper';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class TreeNodeProcessor {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.uniqId = 0;
|
|
9
|
-
}
|
|
10
|
-
getPagingObject(pagesize) {
|
|
11
|
-
const paging = {
|
|
12
|
-
searchOn: 'name',
|
|
13
|
-
noSearch: false,
|
|
14
|
-
filter: '',
|
|
15
|
-
total: pagesize,
|
|
16
|
-
page: 1,
|
|
17
|
-
sort: 'name',
|
|
18
|
-
order: 'asc',
|
|
19
|
-
};
|
|
20
|
-
return paging;
|
|
21
|
-
}
|
|
22
|
-
async processIdentitiesForNodeClick(identityNode, networkGraph, rawEndpoints, uniqId, zitiService, configs) {
|
|
23
|
-
const myPromise = await new Promise(async (resolve, reject) => {
|
|
24
|
-
const wait_promises = [];
|
|
25
|
-
this.uniqId = uniqId;
|
|
26
|
-
const rawEp = this.findRawEndpoint(identityNode.data.name, rawEndpoints);
|
|
27
|
-
let rawEpAttributes = [];
|
|
28
|
-
if (rawEp.roleAttributes) {
|
|
29
|
-
rawEpAttributes = rawEp.roleAttributes;
|
|
30
|
-
}
|
|
31
|
-
;
|
|
32
|
-
for (let i = 0; i < rawEpAttributes.length; i++) {
|
|
33
|
-
const attribute = new Attribute();
|
|
34
|
-
attribute.id = this.createId();
|
|
35
|
-
attribute.name = rawEpAttributes[i];
|
|
36
|
-
attribute.type = 'Identity Attribute';
|
|
37
|
-
identityNode.data.children.push(attribute);
|
|
38
|
-
}
|
|
39
|
-
const bindServices = new Children();
|
|
40
|
-
const dialServices = new Children();
|
|
41
|
-
bindServices.id = this.createId();
|
|
42
|
-
dialServices.id = this.createId();
|
|
43
|
-
let identityServicePolicies = [];
|
|
44
|
-
const pagesize = 500;
|
|
45
|
-
// fetch associated routers
|
|
46
|
-
const url = this.getLinkForResource(rawEp, 'edge-routers').replace('./', '');
|
|
47
|
-
let associatedRouters = [];
|
|
48
|
-
const paging = this.getPagingObject(pagesize);
|
|
49
|
-
const erChailds = new Children();
|
|
50
|
-
erChailds.id = this.createId();
|
|
51
|
-
erChailds.name = 'Associated Edge Routers';
|
|
52
|
-
erChailds.type = 'Edge Routers';
|
|
53
|
-
const associatedRoutersPromise = await zitiService.get(url, paging, [])
|
|
54
|
-
.then((result) => {
|
|
55
|
-
result.data.forEach((re) => {
|
|
56
|
-
const tmp = new ERouter();
|
|
57
|
-
tmp.id = this.createId();
|
|
58
|
-
tmp.name = re.name;
|
|
59
|
-
tmp.type = 'Edge Router';
|
|
60
|
-
erChailds.children.push(tmp);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
const policies_url = this.getLinkForResource(rawEp, 'service-policies').replace('./', '');
|
|
64
|
-
const policies_paging = this.getPagingObject(pagesize);
|
|
65
|
-
const firstPromise = await zitiService
|
|
66
|
-
.get(policies_url, policies_paging, [])
|
|
67
|
-
.then((result) => {
|
|
68
|
-
identityServicePolicies = result.data;
|
|
69
|
-
});
|
|
70
|
-
const promises = [];
|
|
71
|
-
identityServicePolicies.forEach((sp) => {
|
|
72
|
-
const nodeArray = this.getServicesForAServicePolicy(sp, zitiService, 500);
|
|
73
|
-
promises.push(nodeArray);
|
|
74
|
-
});
|
|
75
|
-
await Promise.all(promises).then((nodeArray) => {
|
|
76
|
-
nodeArray.forEach((arOb) => {
|
|
77
|
-
if (arOb[0] === 'Bind') {
|
|
78
|
-
bindServices.children = this.arrayObjectCopyRightToLeft(bindServices.children, arOb[1]);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
dialServices.children = this.arrayObjectCopyRightToLeft(dialServices.children, arOb[1]);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
Promise.all(wait_promises).then(() => {
|
|
86
|
-
if (erChailds.children.length > 0) {
|
|
87
|
-
erChailds.name = erChailds.name + '(' + erChailds.children.length + ')';
|
|
88
|
-
identityNode.data.children.push(erChailds);
|
|
89
|
-
}
|
|
90
|
-
if (bindServices.children.length > 0) {
|
|
91
|
-
bindServices.name = 'Bind-Services(' + bindServices.children.length + ')';
|
|
92
|
-
identityNode.data.children.push(bindServices);
|
|
93
|
-
}
|
|
94
|
-
if (dialServices.children.length > 0) {
|
|
95
|
-
dialServices.name = 'Dial-Services(' + dialServices.children.length + ')';
|
|
96
|
-
identityNode.data.children.push(dialServices);
|
|
97
|
-
}
|
|
98
|
-
resolve('this is a promise');
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
102
|
-
return nd.children;
|
|
103
|
-
});
|
|
104
|
-
return [networkGraph, this.uniqId];
|
|
105
|
-
} // end of function
|
|
106
|
-
createId() {
|
|
107
|
-
++this.uniqId;
|
|
108
|
-
return this.uniqId;
|
|
109
|
-
}
|
|
110
|
-
createServiceNode(sr) {
|
|
111
|
-
const serviceOb = new Service();
|
|
112
|
-
serviceOb.id = this.createId();
|
|
113
|
-
serviceOb.uuid = sr.id;
|
|
114
|
-
serviceOb.name = sr.name;
|
|
115
|
-
serviceOb.type = 'Service';
|
|
116
|
-
return serviceOb;
|
|
117
|
-
}
|
|
118
|
-
arrayObjectCopyRightToLeft(leftArr, rightArr) {
|
|
119
|
-
const leftArrIds = [];
|
|
120
|
-
leftArr.forEach((ob) => {
|
|
121
|
-
leftArrIds.push(ob.id);
|
|
122
|
-
});
|
|
123
|
-
rightArr.forEach((ob) => {
|
|
124
|
-
if (!leftArr.includes(ob.id)) {
|
|
125
|
-
leftArr.push(ob);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
return leftArr;
|
|
129
|
-
}
|
|
130
|
-
addItemToArray(Idnetities, ob) {
|
|
131
|
-
if (ob.name && !Idnetities.find((item) => item.uuid === ob.id)) {
|
|
132
|
-
Idnetities.push(this.createIdentity(ob));
|
|
133
|
-
}
|
|
134
|
-
return Idnetities;
|
|
135
|
-
}
|
|
136
|
-
createIdentity(ob) {
|
|
137
|
-
const endpoint = new Identity();
|
|
138
|
-
endpoint.id = this.createId();
|
|
139
|
-
endpoint.uuid = ob.id;
|
|
140
|
-
endpoint.name = ob.name;
|
|
141
|
-
endpoint.online = ob.hasApiSession === true ? 'Yes' : 'No';
|
|
142
|
-
endpoint.type = 'Identity';
|
|
143
|
-
endpoint.status = ob.sdkInfo !== null ? 'Registered' : 'Not Registered';
|
|
144
|
-
if (ob.sdkInfo) {
|
|
145
|
-
endpoint.os = ob.sdkInfo.type ? ob.sdkInfo.type : ob.sdkInfo.appId;
|
|
146
|
-
endpoint.osVersion = ob.sdkInfo.version;
|
|
147
|
-
}
|
|
148
|
-
if (ob.authPolicy && ob.authPolicy.name.includes("BrowZer")) {
|
|
149
|
-
endpoint.type = 'BrowZer Identity';
|
|
150
|
-
}
|
|
151
|
-
endpoint.createdAt = ob.createdAt;
|
|
152
|
-
endpoint.updatedAt = ob.updatedAt;
|
|
153
|
-
return endpoint;
|
|
154
|
-
}
|
|
155
|
-
getLinkForResource(ob, resource) {
|
|
156
|
-
return ob['_links'][resource]['href'];
|
|
157
|
-
}
|
|
158
|
-
findServicesHostedOnEndpoint(rawEp, services, servicePolicies, zitiService) {
|
|
159
|
-
const servicesArr = [];
|
|
160
|
-
const childrenNoGroups = [];
|
|
161
|
-
const endpointAttr = rawEp.roleAttributes ? rawEp.roleAttributes : [];
|
|
162
|
-
endpointAttr.push('@' + rawEp.id);
|
|
163
|
-
let dialServiceAttrs = [];
|
|
164
|
-
let bindServiceAttrs = [];
|
|
165
|
-
const bindPolicies = new Children();
|
|
166
|
-
bindPolicies.name = 'Bind-Policies';
|
|
167
|
-
const dialPolicies = new Children();
|
|
168
|
-
dialPolicies.name = 'Dial-Policies';
|
|
169
|
-
bindPolicies.id = this.createId();
|
|
170
|
-
dialPolicies.id = this.createId();
|
|
171
|
-
servicePolicies.find((sp) => {
|
|
172
|
-
sp.identityRoles.find((attr) => {
|
|
173
|
-
if (endpointAttr.includes(attr)) {
|
|
174
|
-
if (sp.type === 'Bind') {
|
|
175
|
-
const sPolicy = new ServicePolicy();
|
|
176
|
-
sPolicy.id = this.createId();
|
|
177
|
-
sPolicy.name = sp.name;
|
|
178
|
-
sPolicy.type = sp.type;
|
|
179
|
-
sPolicy.children = this.getServicesForPolicy(services, sp);
|
|
180
|
-
bindPolicies.children.push(sp);
|
|
181
|
-
bindServiceAttrs = fillArray(bindServiceAttrs, sp.serviceRoles);
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
const sPolicy = new ServicePolicy();
|
|
185
|
-
sPolicy.id = this.createId();
|
|
186
|
-
sPolicy.name = sp.name;
|
|
187
|
-
sPolicy.type = sp.type;
|
|
188
|
-
sPolicy.children = this.getServicesForPolicy(services, sp);
|
|
189
|
-
dialPolicies.children.push(sPolicy);
|
|
190
|
-
dialServiceAttrs = fillArray(dialServiceAttrs, sp.serviceRoles);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
function fillArray(arr1, arr2) {
|
|
196
|
-
arr2.forEach((item) => {
|
|
197
|
-
arr1.push(item);
|
|
198
|
-
});
|
|
199
|
-
return arr1;
|
|
200
|
-
}
|
|
201
|
-
const bindServices = [];
|
|
202
|
-
const dialServices = [];
|
|
203
|
-
services && services.forEach((sr) => {
|
|
204
|
-
sr.roleAttributes && sr.roleAttributes.forEach((attr) => {
|
|
205
|
-
if (dialServiceAttrs.includes(attr)) {
|
|
206
|
-
dialServices.push(this.createServiceNode(sr));
|
|
207
|
-
}
|
|
208
|
-
if (bindServiceAttrs.includes(attr)) {
|
|
209
|
-
bindServices.push(this.createServiceNode(sr));
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
if (dialServices.length > 0) {
|
|
214
|
-
const dialGroup = new Children();
|
|
215
|
-
dialGroup.id = this.createId();
|
|
216
|
-
dialGroup.name = 'Services-Dial';
|
|
217
|
-
dialGroup.children = dialServices;
|
|
218
|
-
servicesArr.push(dialGroup);
|
|
219
|
-
}
|
|
220
|
-
if (bindServices.length > 0) {
|
|
221
|
-
const bindGroup = new Children();
|
|
222
|
-
bindGroup.id = this.createId();
|
|
223
|
-
bindGroup.name = 'Services-Bind';
|
|
224
|
-
bindGroup.children = bindServices;
|
|
225
|
-
servicesArr.push(bindGroup);
|
|
226
|
-
}
|
|
227
|
-
return servicesArr;
|
|
228
|
-
} // end of find servicesHostedOnEndpoint
|
|
229
|
-
getServicesForPolicy(services, spOb) {
|
|
230
|
-
const servicesFotPolicy = [];
|
|
231
|
-
services && services.forEach((sr) => {
|
|
232
|
-
const attrs = sr.roleAttributes ? sr.roleAttributes : [];
|
|
233
|
-
attrs.push('@' + spOb.id);
|
|
234
|
-
attrs.find((atr) => {
|
|
235
|
-
if (spOb.serviceRoles.includes(atr)) {
|
|
236
|
-
const serviceNode = new Service();
|
|
237
|
-
serviceNode.id = this.createId();
|
|
238
|
-
serviceNode.name = sr.name;
|
|
239
|
-
serviceNode.type = 'Service';
|
|
240
|
-
servicesFotPolicy.push(serviceNode);
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
return servicesFotPolicy;
|
|
245
|
-
}
|
|
246
|
-
findRawEndpoint(epName, endpoints) {
|
|
247
|
-
return endpoints.find((ep) => ep.name === epName);
|
|
248
|
-
}
|
|
249
|
-
serviceConfigAlias(configs) {
|
|
250
|
-
let intercept = [];
|
|
251
|
-
_.isArray(configs) && configs.forEach((conf) => {
|
|
252
|
-
let addresses = '';
|
|
253
|
-
let ports = '';
|
|
254
|
-
if (conf.data.addresses) {
|
|
255
|
-
addresses = conf.data.addresses.toString();
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
addresses = conf.data.address;
|
|
259
|
-
}
|
|
260
|
-
if (_.isArray(conf.data.portRanges)) {
|
|
261
|
-
conf.data.portRanges.forEach((portsJson) => {
|
|
262
|
-
for (const key in portsJson) {
|
|
263
|
-
ports = ports + key + ':' + portsJson[key] + ' ';
|
|
264
|
-
}
|
|
265
|
-
ports = ports + ';';
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
ports = conf.data.port;
|
|
270
|
-
}
|
|
271
|
-
intercept.push(addresses);
|
|
272
|
-
intercept.push(ports);
|
|
273
|
-
});
|
|
274
|
-
return intercept;
|
|
275
|
-
}
|
|
276
|
-
async processServicesForNodeClick(serviceNode, networkGraph, services, uniqId, zitiService) {
|
|
277
|
-
const myPromise = await new Promise(async (resolve, reject) => {
|
|
278
|
-
const wait_promises = [];
|
|
279
|
-
this.uniqId = uniqId;
|
|
280
|
-
const rawServiceObj = services.find((s) => s.name === serviceNode.data.name);
|
|
281
|
-
const attributeswithName = [];
|
|
282
|
-
rawServiceObj.roleAttributes && rawServiceObj.roleAttributes.find((srattr) => {
|
|
283
|
-
attributeswithName.push(srattr);
|
|
284
|
-
});
|
|
285
|
-
const serviceAttributes = new Children();
|
|
286
|
-
serviceAttributes.name = 'Attributes';
|
|
287
|
-
serviceAttributes.type = 'Attributes';
|
|
288
|
-
serviceAttributes.id = this.createId();
|
|
289
|
-
for (let k = 0; k < attributeswithName.length; k++) {
|
|
290
|
-
const attrOb = new Attribute();
|
|
291
|
-
attrOb.id = this.createId();
|
|
292
|
-
attrOb.name = attributeswithName[k];
|
|
293
|
-
attrOb.type = 'Attribute';
|
|
294
|
-
serviceAttributes.children.push(attrOb);
|
|
295
|
-
} // end inner for loop
|
|
296
|
-
if (serviceAttributes.children.length > 0) {
|
|
297
|
-
serviceAttributes.name = serviceAttributes.name + '(' + serviceAttributes.children.length + ')';
|
|
298
|
-
serviceNode.data.children.push(serviceAttributes);
|
|
299
|
-
}
|
|
300
|
-
let service_configs = [];
|
|
301
|
-
const configs_url = this.getLinkForResource(rawServiceObj, 'configs');
|
|
302
|
-
const pagesize = 500;
|
|
303
|
-
const pagingOb = this.getPagingObject(pagesize);
|
|
304
|
-
const configPromise = await zitiService
|
|
305
|
-
.get(configs_url, pagingOb, [])
|
|
306
|
-
.then((configs) => {
|
|
307
|
-
service_configs = configs && configs.data ? configs.data : [];
|
|
308
|
-
const childs = new Children();
|
|
309
|
-
childs.id = this.createId();
|
|
310
|
-
childs.name = 'Service Configs';
|
|
311
|
-
childs.type = 'Service Configs';
|
|
312
|
-
const service_configs_Arr = [];
|
|
313
|
-
service_configs.forEach((cfg) => {
|
|
314
|
-
const obj = new Config();
|
|
315
|
-
obj.id = this.createId();
|
|
316
|
-
obj.name = cfg.name;
|
|
317
|
-
obj.uuid = cfg.uuid;
|
|
318
|
-
obj.data = JSON.stringify(cfg.data);
|
|
319
|
-
service_configs_Arr.push(obj);
|
|
320
|
-
});
|
|
321
|
-
if (service_configs_Arr.length > 0) {
|
|
322
|
-
childs.children = service_configs_Arr;
|
|
323
|
-
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
324
|
-
serviceNode.data.children.push(childs);
|
|
325
|
-
serviceNode.data.intercept = this.serviceConfigAlias(service_configs);
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
wait_promises.push(configPromise);
|
|
329
|
-
const service_edge_router_policies_url = this.getLinkForResource(rawServiceObj, 'service-edge-router-policies');
|
|
330
|
-
let service_routers_urls = [];
|
|
331
|
-
const ser_promse = await zitiService
|
|
332
|
-
.get(service_edge_router_policies_url.replace('./', ''), pagingOb, [])
|
|
333
|
-
.then((result) => {
|
|
334
|
-
result.data.forEach((serp) => {
|
|
335
|
-
service_routers_urls.push(this.getLinkForResource(serp, 'edge-routers'));
|
|
336
|
-
});
|
|
337
|
-
;
|
|
338
|
-
});
|
|
339
|
-
wait_promises.push(ser_promse);
|
|
340
|
-
let serp_page_Promises = [];
|
|
341
|
-
service_routers_urls.forEach((er_url) => {
|
|
342
|
-
const promse = zitiService
|
|
343
|
-
.get(er_url.replace('./', ''), pagingOb, []);
|
|
344
|
-
// .then(result => [policy.type, result]);
|
|
345
|
-
serp_page_Promises.push(promse);
|
|
346
|
-
});
|
|
347
|
-
let associatedRouters = [];
|
|
348
|
-
await Promise.all(serp_page_Promises).then((values) => {
|
|
349
|
-
values && values.forEach((res) => {
|
|
350
|
-
if (res && res.data.length > 0) {
|
|
351
|
-
res.data.forEach((er) => {
|
|
352
|
-
const erOb = new ERouter();
|
|
353
|
-
erOb.id = this.createId();
|
|
354
|
-
erOb.name = er.name;
|
|
355
|
-
er.type = 'Edge Router';
|
|
356
|
-
associatedRouters.push(erOb);
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
const tmp = new Children();
|
|
361
|
-
tmp.name = "Associated Edge Routers(" + associatedRouters.length + ')';
|
|
362
|
-
tmp.type = "Edge Routers";
|
|
363
|
-
tmp.children = associatedRouters;
|
|
364
|
-
tmp.id = this.createId();
|
|
365
|
-
serviceNode.data.children.push(tmp);
|
|
366
|
-
});
|
|
367
|
-
const service_policies_url = this.getLinkForResource(rawServiceObj, 'service-policies').replace('./', ''); // dial, Bind info
|
|
368
|
-
let bindPolicies = [];
|
|
369
|
-
let bindIdnetities = [];
|
|
370
|
-
let dialIdnetities = [];
|
|
371
|
-
const promise2 = await zitiService
|
|
372
|
-
.get(service_policies_url, pagingOb, [])
|
|
373
|
-
.then((policies) => {
|
|
374
|
-
bindPolicies = policies.data;
|
|
375
|
-
});
|
|
376
|
-
const pagePromises = [];
|
|
377
|
-
bindPolicies.forEach((policy) => {
|
|
378
|
-
const bindIdentitiesUrl = this.getLinkForResource(policy, 'identities');
|
|
379
|
-
const promse = zitiService
|
|
380
|
-
.get(bindIdentitiesUrl.replace('./', ''), pagingOb, [])
|
|
381
|
-
.then(result => [policy.type, result]);
|
|
382
|
-
pagePromises.push(promse);
|
|
383
|
-
});
|
|
384
|
-
await Promise.all(pagePromises).then((values) => {
|
|
385
|
-
values && values.forEach((res) => {
|
|
386
|
-
if (res && res[1].data.length > 0) {
|
|
387
|
-
res[1].data.forEach((rs) => {
|
|
388
|
-
if (res[0] === 'Bind') {
|
|
389
|
-
bindIdnetities = this.addItemToArray(bindIdnetities, rs);
|
|
390
|
-
}
|
|
391
|
-
else if (res[0] === 'Dial') {
|
|
392
|
-
dialIdnetities = this.addItemToArray(dialIdnetities, rs);
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
else {
|
|
397
|
-
if (res[0] === 'Bind') {
|
|
398
|
-
bindIdnetities = this.addItemToArray(bindIdnetities, res[1].data);
|
|
399
|
-
}
|
|
400
|
-
else if (res[0] === 'Dial') {
|
|
401
|
-
dialIdnetities = this.addItemToArray(dialIdnetities, res[1].data);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
});
|
|
405
|
-
const tmp = new Children();
|
|
406
|
-
tmp.name = "Bind Identities(" + bindIdnetities.length + ')';
|
|
407
|
-
tmp.type = "Identities";
|
|
408
|
-
tmp.children = bindIdnetities;
|
|
409
|
-
tmp.id = this.createId();
|
|
410
|
-
serviceNode.data.children.push(tmp);
|
|
411
|
-
const tmpDial = new Children();
|
|
412
|
-
tmpDial.name = "Dial Identities(" + dialIdnetities.length + ')';
|
|
413
|
-
tmpDial.type = "Identities";
|
|
414
|
-
tmpDial.children = dialIdnetities;
|
|
415
|
-
tmpDial.id = this.createId();
|
|
416
|
-
serviceNode.data.children.push(tmpDial);
|
|
417
|
-
resolve('this is a promise');
|
|
418
|
-
});
|
|
419
|
-
Promise.all(wait_promises).then(() => { });
|
|
420
|
-
}); // end of mypromise
|
|
421
|
-
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
422
|
-
return nd.children;
|
|
423
|
-
});
|
|
424
|
-
return [networkGraph, this.uniqId];
|
|
425
|
-
} // end of processServicesForNodeClick
|
|
426
|
-
async processServicePoliciesForNodeClick(policyNode, networkGraph, servicePolicies, uniqId, zitiService) {
|
|
427
|
-
const myPromise = await new Promise(async (resolve, reject) => {
|
|
428
|
-
const wait_promises = [];
|
|
429
|
-
this.uniqId = uniqId;
|
|
430
|
-
const rawSPolicy = servicePolicies.find((s) => s.name === policyNode.data.name);
|
|
431
|
-
const childs = new Children();
|
|
432
|
-
childs.name = "Attributes";
|
|
433
|
-
childs.id = this.createId();
|
|
434
|
-
rawSPolicy.serviceRoles && rawSPolicy.serviceRoles.forEach((ob) => {
|
|
435
|
-
const attr = new Attribute();
|
|
436
|
-
attr.name = ob;
|
|
437
|
-
attr.id = this.createId();
|
|
438
|
-
attr.type = "Service Attribute";
|
|
439
|
-
childs.children.push(attr);
|
|
440
|
-
});
|
|
441
|
-
rawSPolicy.identityRoles && rawSPolicy.identityRoles.forEach((ob) => {
|
|
442
|
-
const attr = new Attribute();
|
|
443
|
-
attr.name = ob;
|
|
444
|
-
attr.id = this.createId();
|
|
445
|
-
attr.type = "Identity Attribute";
|
|
446
|
-
childs.children.push(attr);
|
|
447
|
-
});
|
|
448
|
-
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
449
|
-
policyNode.data.children.push(childs);
|
|
450
|
-
const pagesize = 500;
|
|
451
|
-
const identities_paging = this.getPagingObject(pagesize);
|
|
452
|
-
const bindIdentitiesUrl = this.getLinkForResource(rawSPolicy, 'identities');
|
|
453
|
-
// this.logger.info('bindIdentitiesUrl',bindIdentitiesUrl);
|
|
454
|
-
const sp_promise = await zitiService.get(bindIdentitiesUrl, identities_paging, [])
|
|
455
|
-
.then((ids) => {
|
|
456
|
-
const childs = new Children();
|
|
457
|
-
childs.name = rawSPolicy.type + '-Identities';
|
|
458
|
-
childs.id = this.createId();
|
|
459
|
-
ids.data.forEach((idOb) => {
|
|
460
|
-
childs.children.push(this.createIdentity(idOb));
|
|
461
|
-
});
|
|
462
|
-
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
463
|
-
policyNode.data.children.push(childs);
|
|
464
|
-
});
|
|
465
|
-
wait_promises.push(sp_promise);
|
|
466
|
-
const services_paging = this.getPagingObject(pagesize);
|
|
467
|
-
const bindServicesUrl = this.getLinkForResource(rawSPolicy, 'services'); // pull services
|
|
468
|
-
const _promise = await zitiService.get(bindServicesUrl, services_paging, [])
|
|
469
|
-
.then((result) => {
|
|
470
|
-
const childs = new Children();
|
|
471
|
-
childs.name = rawSPolicy.type + '-Services';
|
|
472
|
-
childs.id = this.createId();
|
|
473
|
-
result.data.forEach((idOb) => {
|
|
474
|
-
const sp = new Service();
|
|
475
|
-
sp.id = idOb.id;
|
|
476
|
-
sp.name = idOb.name;
|
|
477
|
-
sp.type = 'Service';
|
|
478
|
-
childs.children.push(sp);
|
|
479
|
-
});
|
|
480
|
-
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
481
|
-
policyNode.data.children.push(childs);
|
|
482
|
-
});
|
|
483
|
-
wait_promises.push(_promise);
|
|
484
|
-
Promise.all(wait_promises).then(() => {
|
|
485
|
-
resolve('resolve.');
|
|
486
|
-
});
|
|
487
|
-
}); // end mypromise
|
|
488
|
-
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
489
|
-
return nd.children;
|
|
490
|
-
});
|
|
491
|
-
return [networkGraph, this.uniqId];
|
|
492
|
-
}
|
|
493
|
-
async getServicesForAServicePolicy(policyObject, zitiService, pagesize = 500) {
|
|
494
|
-
const childs = [];
|
|
495
|
-
const services_paging = this.getPagingObject(pagesize);
|
|
496
|
-
const bindServicesUrl = this.getLinkForResource(policyObject, 'services');
|
|
497
|
-
const _promise = await zitiService.get(bindServicesUrl, services_paging, [])
|
|
498
|
-
.then((result) => {
|
|
499
|
-
result.data.forEach((idOb) => {
|
|
500
|
-
const sp = new Service();
|
|
501
|
-
sp.id = this.createId();
|
|
502
|
-
sp.uuid = idOb.id;
|
|
503
|
-
sp.name = idOb.name;
|
|
504
|
-
sp.type = 'Service';
|
|
505
|
-
childs.push(sp);
|
|
506
|
-
});
|
|
507
|
-
});
|
|
508
|
-
return [policyObject.type, childs];
|
|
509
|
-
}
|
|
510
|
-
async processEdgeroutersForNodeClick(edgerouterNode, networkGraph, edgerouters, uniqId, zitiService) {
|
|
511
|
-
const mainPromise = await new Promise(async (resolve, reject) => {
|
|
512
|
-
const wait_promises = [];
|
|
513
|
-
this.uniqId = uniqId;
|
|
514
|
-
const er = edgerouters.find((s) => s.name === edgerouterNode.data.name);
|
|
515
|
-
const erAttributes = er.roleAttributes ? er.roleAttributes : [];
|
|
516
|
-
erAttributes.find((attr) => {
|
|
517
|
-
const att = new Attribute();
|
|
518
|
-
att.id = this.createId();
|
|
519
|
-
att.name = attr;
|
|
520
|
-
att.type = 'Edge Router Attribute';
|
|
521
|
-
edgerouterNode.data.children.push(att);
|
|
522
|
-
});
|
|
523
|
-
const pagesize = 500;
|
|
524
|
-
const services_paging = this.getPagingObject(pagesize);
|
|
525
|
-
const erpoliciesUrl = this.getLinkForResource(er, 'edge-router-policies');
|
|
526
|
-
let erpoliciesForER = [];
|
|
527
|
-
const erpoliciespromise = await zitiService.get(erpoliciesUrl, services_paging, [])
|
|
528
|
-
.then(async (result) => {
|
|
529
|
-
erpoliciesForER = result.data;
|
|
530
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
531
|
-
const promises = [];
|
|
532
|
-
for (let page = 2; page <= pages; page++) {
|
|
533
|
-
services_paging.page = page;
|
|
534
|
-
const tmp_promise = await zitiService.get(erpoliciesUrl, services_paging, []).then((pageResult) => {
|
|
535
|
-
pageResult.data.forEach((serv) => {
|
|
536
|
-
erpoliciesForER.push(serv);
|
|
537
|
-
});
|
|
538
|
-
});
|
|
539
|
-
promises.push(tmp_promise);
|
|
540
|
-
wait_promises.push(tmp_promise);
|
|
541
|
-
} // end for loop
|
|
542
|
-
Promise.all(promises).then(() => {
|
|
543
|
-
const erpolChilds = new Children();
|
|
544
|
-
erpolChilds.id = this.createId();
|
|
545
|
-
erpoliciesForER.forEach((pol) => {
|
|
546
|
-
const policy = new ERPolicy();
|
|
547
|
-
policy.id = this.createId();
|
|
548
|
-
policy.uuid = pol.id;
|
|
549
|
-
policy.name = pol.name;
|
|
550
|
-
policy.type = 'Edge Router Policy';
|
|
551
|
-
policy.isSystem = pol.isSystem;
|
|
552
|
-
policy.semantic = pol.semantic;
|
|
553
|
-
policy.rootNode = 'No';
|
|
554
|
-
erpolChilds.children.push(policy);
|
|
555
|
-
});
|
|
556
|
-
erpolChilds.name = "Edge Router Policies(" + erpolChilds.children.length + ')';
|
|
557
|
-
edgerouterNode.data.children.push(erpolChilds);
|
|
558
|
-
});
|
|
559
|
-
});
|
|
560
|
-
wait_promises.push(erpoliciespromise);
|
|
561
|
-
Promise.all(wait_promises).then(() => {
|
|
562
|
-
resolve('this is a promise');
|
|
563
|
-
});
|
|
564
|
-
});
|
|
565
|
-
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
566
|
-
return nd.children;
|
|
567
|
-
});
|
|
568
|
-
return [networkGraph, this.uniqId];
|
|
569
|
-
}
|
|
570
|
-
serviceGrouping(servicesChildren, servicestree) {
|
|
571
|
-
const protocolRDPGrp = new Group(this.createId(), 'Services [protocol-RDP]', 'Services created for RDP protocol');
|
|
572
|
-
const protocolHTTPSGrp = new Group(this.createId(), 'Services [protocol-HTTPS]', 'Service created for HTTPS protocol');
|
|
573
|
-
const protocolHTTPGrp = new Group(this.createId(), 'Services [protocol-HTTP]', 'Service created for HTTP protocol');
|
|
574
|
-
const protocolFTPGrp = new Group(this.createId(), 'Services [protocol-FTP]', 'Service created for FTP protocol');
|
|
575
|
-
const abcdGrp = new Group(this.createId(), 'Services [A-D]', 'Service name starts with A to D');
|
|
576
|
-
const efghGrp = new Group(this.createId(), 'Services [E-H]', 'Service name starts with E to H');
|
|
577
|
-
const ijklGrp = new Group(this.createId(), 'Services [I-L]', 'Service name starts with I to L');
|
|
578
|
-
const mnopGrp = new Group(this.createId(), 'Services [M-P]', 'Service name starts with M to P');
|
|
579
|
-
const qrstGrp = new Group(this.createId(), 'Services [G-T]', 'Service name starts with Q to T');
|
|
580
|
-
const uvwxGrp = new Group(this.createId(), 'Services [U-X]', 'Service name starts with U to X');
|
|
581
|
-
const yzGrp = new Group(this.createId(), 'Services [Y-Z]', 'Service name starts with Y and Z');
|
|
582
|
-
const oneTo9Grp = new Group(this.createId(), 'Services [1-9]', 'Service name starts with 0 to 9');
|
|
583
|
-
for (let i = 0; i < servicestree.length; i++) {
|
|
584
|
-
const serviceobj = servicestree[i];
|
|
585
|
-
const cha = serviceobj.name.charAt(0).toLowerCase();
|
|
586
|
-
if (serviceobj.protocol === 'rdp') {
|
|
587
|
-
protocolRDPGrp.children.push(serviceobj);
|
|
588
|
-
}
|
|
589
|
-
else if (serviceobj.protocol === 'https') {
|
|
590
|
-
protocolHTTPSGrp.children.push(serviceobj);
|
|
591
|
-
}
|
|
592
|
-
else if (serviceobj.protocol === 'http') {
|
|
593
|
-
protocolHTTPGrp.children.push(serviceobj);
|
|
594
|
-
}
|
|
595
|
-
else if (serviceobj.protocol === 'ftp') {
|
|
596
|
-
protocolFTPGrp.children.push(serviceobj);
|
|
597
|
-
}
|
|
598
|
-
else if (cha === 'a' || cha === 'b' || cha === 'c' || cha === 'd') {
|
|
599
|
-
abcdGrp.children.push(serviceobj);
|
|
600
|
-
}
|
|
601
|
-
else if (cha === 'e' || cha === 'f' || cha === 'g' || cha === 'h') {
|
|
602
|
-
efghGrp.children.push(serviceobj);
|
|
603
|
-
}
|
|
604
|
-
else if (cha === 'i' || cha === 'j' || cha === 'k' || cha === 'l') {
|
|
605
|
-
ijklGrp.children.push(serviceobj);
|
|
606
|
-
}
|
|
607
|
-
else if (cha === 'm' || cha === 'n' || cha === 'o' || cha === 'p') {
|
|
608
|
-
mnopGrp.children.push(serviceobj);
|
|
609
|
-
}
|
|
610
|
-
else if (cha === 'q' || cha === 'r' || cha === 's' || cha === 't') {
|
|
611
|
-
qrstGrp.children.push(serviceobj);
|
|
612
|
-
}
|
|
613
|
-
else if (cha === 'u' || cha === 'v' || cha === 'w' || cha === 'x') {
|
|
614
|
-
uvwxGrp.children.push(serviceobj);
|
|
615
|
-
}
|
|
616
|
-
else if (cha === 'y' || cha === 'z') {
|
|
617
|
-
yzGrp.children.push(serviceobj);
|
|
618
|
-
}
|
|
619
|
-
else if (cha === '0' ||
|
|
620
|
-
cha === '1' ||
|
|
621
|
-
cha === '2' ||
|
|
622
|
-
cha === '3' ||
|
|
623
|
-
cha === '4' ||
|
|
624
|
-
cha === '5' ||
|
|
625
|
-
cha === '6' ||
|
|
626
|
-
cha === '7' ||
|
|
627
|
-
cha === '8' ||
|
|
628
|
-
cha === '9') {
|
|
629
|
-
oneTo9Grp.children.push(serviceobj);
|
|
630
|
-
}
|
|
631
|
-
} // end main for loop
|
|
632
|
-
if (protocolRDPGrp.children.length > 0) {
|
|
633
|
-
protocolRDPGrp.children.sort(function (a, b) {
|
|
634
|
-
return a.name.localeCompare(b.name);
|
|
635
|
-
});
|
|
636
|
-
protocolRDPGrp.name = protocolRDPGrp.name + '(' + protocolRDPGrp.children.length + ')';
|
|
637
|
-
servicesChildren.children.push(protocolRDPGrp);
|
|
638
|
-
}
|
|
639
|
-
if (protocolHTTPSGrp.children.length > 0) {
|
|
640
|
-
protocolHTTPSGrp.children.sort(function (a, b) {
|
|
641
|
-
return a.name.localeCompare(b.name);
|
|
642
|
-
});
|
|
643
|
-
protocolHTTPSGrp.name = protocolHTTPSGrp.name + '(' + protocolHTTPSGrp.children.length + ')';
|
|
644
|
-
servicesChildren.children.push(protocolHTTPSGrp);
|
|
645
|
-
}
|
|
646
|
-
if (protocolHTTPGrp.children.length > 0) {
|
|
647
|
-
protocolHTTPGrp.children.sort(function (a, b) {
|
|
648
|
-
return a.name.localeCompare(b.name);
|
|
649
|
-
});
|
|
650
|
-
protocolHTTPGrp.name = protocolHTTPGrp.name + '(' + protocolHTTPGrp.children.length + ')';
|
|
651
|
-
servicesChildren.children.push(protocolHTTPGrp);
|
|
652
|
-
}
|
|
653
|
-
if (protocolFTPGrp.children.length > 0) {
|
|
654
|
-
protocolFTPGrp.children.sort(function (a, b) {
|
|
655
|
-
return a.name.localeCompare(b.name);
|
|
656
|
-
});
|
|
657
|
-
protocolFTPGrp.name = protocolFTPGrp.name + '(' + protocolFTPGrp.children.length + ')';
|
|
658
|
-
servicesChildren.children.push(protocolFTPGrp);
|
|
659
|
-
}
|
|
660
|
-
if (abcdGrp.children.length > 0) {
|
|
661
|
-
abcdGrp.children.sort(function (a, b) {
|
|
662
|
-
return a.name.localeCompare(b.name);
|
|
663
|
-
});
|
|
664
|
-
abcdGrp.name = abcdGrp.name + '(' + abcdGrp.children.length + ')';
|
|
665
|
-
servicesChildren.children.push(abcdGrp);
|
|
666
|
-
}
|
|
667
|
-
if (efghGrp.children.length > 0) {
|
|
668
|
-
efghGrp.children.sort(function (a, b) {
|
|
669
|
-
return a.name.localeCompare(b.name);
|
|
670
|
-
});
|
|
671
|
-
efghGrp.name = efghGrp.name + '(' + efghGrp.children.length + ')';
|
|
672
|
-
servicesChildren.children.push(efghGrp);
|
|
673
|
-
}
|
|
674
|
-
if (ijklGrp.children.length > 0) {
|
|
675
|
-
ijklGrp.children.sort(function (a, b) {
|
|
676
|
-
return a.name.localeCompare(b.name);
|
|
677
|
-
});
|
|
678
|
-
ijklGrp.name = ijklGrp.name + '(' + ijklGrp.children.length + ')';
|
|
679
|
-
servicesChildren.children.push(ijklGrp);
|
|
680
|
-
}
|
|
681
|
-
if (mnopGrp.children.length > 0) {
|
|
682
|
-
mnopGrp.children.sort(function (a, b) {
|
|
683
|
-
return a.name.localeCompare(b.name);
|
|
684
|
-
});
|
|
685
|
-
mnopGrp.name = mnopGrp.name + '(' + mnopGrp.children.length + ')';
|
|
686
|
-
servicesChildren.children.push(mnopGrp);
|
|
687
|
-
}
|
|
688
|
-
if (qrstGrp.children.length > 0) {
|
|
689
|
-
qrstGrp.children.sort(function (a, b) {
|
|
690
|
-
return a.name.localeCompare(b.name);
|
|
691
|
-
});
|
|
692
|
-
qrstGrp.name = qrstGrp.name + '(' + qrstGrp.children.length + ')';
|
|
693
|
-
servicesChildren.children.push(qrstGrp);
|
|
694
|
-
}
|
|
695
|
-
if (uvwxGrp.children.length > 0) {
|
|
696
|
-
uvwxGrp.children.sort(function (a, b) {
|
|
697
|
-
return a.name.localeCompare(b.name);
|
|
698
|
-
});
|
|
699
|
-
uvwxGrp.name = uvwxGrp.name + '(' + uvwxGrp.children.length + ')';
|
|
700
|
-
servicesChildren.children.push(uvwxGrp);
|
|
701
|
-
}
|
|
702
|
-
if (yzGrp.children.length > 0) {
|
|
703
|
-
yzGrp.children.sort(function (a, b) {
|
|
704
|
-
return a.name.localeCompare(b.name);
|
|
705
|
-
});
|
|
706
|
-
yzGrp.name = yzGrp.name + '(' + yzGrp.children.length + ')';
|
|
707
|
-
servicesChildren.children.push(yzGrp);
|
|
708
|
-
}
|
|
709
|
-
if (oneTo9Grp.children.length > 0) {
|
|
710
|
-
oneTo9Grp.children.sort(function (a, b) {
|
|
711
|
-
return a.name.localeCompare(b.name);
|
|
712
|
-
});
|
|
713
|
-
oneTo9Grp.name = oneTo9Grp.name + '(' + oneTo9Grp.children.length + ')';
|
|
714
|
-
servicesChildren.children.push(oneTo9Grp);
|
|
715
|
-
}
|
|
716
|
-
servicesChildren.name = servicesChildren.name + '(' + servicestree.length + ')';
|
|
717
|
-
return servicesChildren;
|
|
718
|
-
}
|
|
719
|
-
async processEdgeRouterPoliciesForNodeClick(erPolicyNode, networkGraph, edgeRouterPolicies, uniqId, zitiService) {
|
|
720
|
-
const myPromise = await new Promise(async (resolve, reject) => {
|
|
721
|
-
const wait_promises = [];
|
|
722
|
-
this.uniqId = uniqId;
|
|
723
|
-
const rawERPolicy = edgeRouterPolicies.find((s) => s.name === erPolicyNode.data.name);
|
|
724
|
-
const pagesize = 500;
|
|
725
|
-
const er_url = this.getLinkForResource(rawERPolicy, 'edge-routers').replace('./', '');
|
|
726
|
-
let associatedRouters = [];
|
|
727
|
-
const paging = this.getPagingObject(pagesize);
|
|
728
|
-
const erChailds = new Children();
|
|
729
|
-
erChailds.name = 'Associated Edge Routers';
|
|
730
|
-
erChailds.type = 'Edge Routers';
|
|
731
|
-
erChailds.id = this.createId();
|
|
732
|
-
const associatedRoutersPromise = await zitiService.get(er_url, paging, [])
|
|
733
|
-
.then((result) => {
|
|
734
|
-
result.data.forEach((er) => {
|
|
735
|
-
const tmp = new ERouter();
|
|
736
|
-
tmp.id = this.createId();
|
|
737
|
-
tmp.name = er.name;
|
|
738
|
-
tmp.type = 'Edge Router';
|
|
739
|
-
tmp.verified = er.isVerified ? 'Yes' : 'No';
|
|
740
|
-
tmp.online = er.isOnline ? 'Yes' : 'No';
|
|
741
|
-
tmp.disabled = er.disabled ? 'Yes' : 'No';
|
|
742
|
-
tmp.rootNode = 'Yes';
|
|
743
|
-
tmp.tunnelerEnabled = er.tunnelerEnabled ? er.tunnelerEnabled : 'No';
|
|
744
|
-
tmp.syncStatus = er.syncStatus ? er.syncStatus : 'No';
|
|
745
|
-
tmp.createdAt = er.createdAt;
|
|
746
|
-
tmp.updatedAt = er.updatedAt;
|
|
747
|
-
erChailds.children.push(tmp);
|
|
748
|
-
});
|
|
749
|
-
erChailds.name = erChailds.name + '(' + erChailds.children.length + ')';
|
|
750
|
-
erPolicyNode.data.children.push(erChailds);
|
|
751
|
-
});
|
|
752
|
-
wait_promises.push(associatedRoutersPromise);
|
|
753
|
-
const services_paging = this.getPagingObject(pagesize);
|
|
754
|
-
const url = this.getLinkForResource(rawERPolicy, 'identities');
|
|
755
|
-
let ids = [];
|
|
756
|
-
const idpromise = zitiService.get(url, services_paging, [])
|
|
757
|
-
.then((result) => {
|
|
758
|
-
ids = result.data;
|
|
759
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
760
|
-
const promises = [];
|
|
761
|
-
for (let page = 2; page <= pages; page++) {
|
|
762
|
-
services_paging.page = page;
|
|
763
|
-
const tmp_promise = zitiService.get(url, services_paging, []).then((pageResult) => {
|
|
764
|
-
pageResult.data.forEach((serv) => {
|
|
765
|
-
ids.push(serv);
|
|
766
|
-
});
|
|
767
|
-
});
|
|
768
|
-
promises.push(tmp_promise);
|
|
769
|
-
wait_promises.push(tmp_promise);
|
|
770
|
-
} // end for loop
|
|
771
|
-
Promise.all(promises).then(() => {
|
|
772
|
-
const idChilds = new Children();
|
|
773
|
-
idChilds.id = this.createId();
|
|
774
|
-
ids.forEach((idOb) => {
|
|
775
|
-
idChilds.children.push(this.createIdentity(idOb));
|
|
776
|
-
});
|
|
777
|
-
idChilds.name = "Accessible Identities(" + idChilds.children.length + ')';
|
|
778
|
-
erPolicyNode.data.children.push(idChilds);
|
|
779
|
-
});
|
|
780
|
-
});
|
|
781
|
-
wait_promises.push(idpromise);
|
|
782
|
-
Promise.all(wait_promises).then(() => {
|
|
783
|
-
resolve('this is a promise');
|
|
784
|
-
});
|
|
785
|
-
});
|
|
786
|
-
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
787
|
-
return nd.children;
|
|
788
|
-
});
|
|
789
|
-
return [networkGraph, this.uniqId];
|
|
790
|
-
} // end
|
|
791
|
-
async processServiceEdgeRouterPoliciesForNodeClick(serviceErPolicyNode, networkGraph, serviceEdgeRouterPolicies, uniqId, zitiService) {
|
|
792
|
-
const myPromise = await new Promise((resolve, reject) => {
|
|
793
|
-
this.uniqId = uniqId;
|
|
794
|
-
const wait_promises = [];
|
|
795
|
-
const rawServiceERPolicy = serviceEdgeRouterPolicies.find((s) => s.name === serviceErPolicyNode.data.name);
|
|
796
|
-
const pagesize = 500;
|
|
797
|
-
const services_paging = this.getPagingObject(pagesize);
|
|
798
|
-
const url = this.getLinkForResource(rawServiceERPolicy, 'edge-routers');
|
|
799
|
-
let routers = [];
|
|
800
|
-
const erpromise = zitiService.get(url, services_paging, [])
|
|
801
|
-
.then((result) => {
|
|
802
|
-
routers = result.data;
|
|
803
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
804
|
-
const promises = [];
|
|
805
|
-
for (let page = 2; page <= pages; page++) {
|
|
806
|
-
services_paging.page = page;
|
|
807
|
-
const tmp_promise = zitiService.get(url, services_paging, []).then((pageResult) => {
|
|
808
|
-
pageResult.data.forEach((serv) => {
|
|
809
|
-
routers.push(serv);
|
|
810
|
-
});
|
|
811
|
-
});
|
|
812
|
-
promises.push(tmp_promise);
|
|
813
|
-
wait_promises.push(tmp_promise);
|
|
814
|
-
} // end for loop
|
|
815
|
-
Promise.all(promises).then(() => {
|
|
816
|
-
const erChilds = new Children();
|
|
817
|
-
erChilds.id = this.createId();
|
|
818
|
-
routers.forEach((er) => {
|
|
819
|
-
const idOb = new ERouter();
|
|
820
|
-
idOb.id = this.createId();
|
|
821
|
-
idOb.uuid = er.id;
|
|
822
|
-
idOb.name = er.name;
|
|
823
|
-
idOb.type = 'Edge Router';
|
|
824
|
-
erChilds.children.push(idOb);
|
|
825
|
-
});
|
|
826
|
-
erChilds.name = "Edge Routers(" + erChilds.children.length + ')';
|
|
827
|
-
serviceErPolicyNode.data.children.push(erChilds);
|
|
828
|
-
});
|
|
829
|
-
});
|
|
830
|
-
wait_promises.push(erpromise);
|
|
831
|
-
const services_pagingB = this.getPagingObject(pagesize);
|
|
832
|
-
const urlB = this.getLinkForResource(rawServiceERPolicy, 'services');
|
|
833
|
-
let serArray = [];
|
|
834
|
-
const serpromise = zitiService.get(urlB, services_pagingB, [])
|
|
835
|
-
.then((result) => {
|
|
836
|
-
serArray = result.data;
|
|
837
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
838
|
-
const promisesB = [];
|
|
839
|
-
for (let page = 2; page <= pages; page++) {
|
|
840
|
-
services_pagingB.page = page;
|
|
841
|
-
const tmp_promiseB = zitiService.get(urlB, services_pagingB, []).then((pageResult) => {
|
|
842
|
-
pageResult.data.forEach((serv) => {
|
|
843
|
-
serArray.push(serv);
|
|
844
|
-
});
|
|
845
|
-
});
|
|
846
|
-
promisesB.push(tmp_promiseB);
|
|
847
|
-
wait_promises.push(tmp_promiseB);
|
|
848
|
-
} // end for loop
|
|
849
|
-
Promise.all(promisesB).then(() => {
|
|
850
|
-
const srChilds = new Children();
|
|
851
|
-
srChilds.id = this.createId();
|
|
852
|
-
serArray.forEach((sr) => {
|
|
853
|
-
const srOb = new Service();
|
|
854
|
-
srOb.id = this.createId();
|
|
855
|
-
srOb.uuid = sr.id;
|
|
856
|
-
srOb.name = sr.name;
|
|
857
|
-
srOb.type = 'Service';
|
|
858
|
-
srChilds.children.push(srOb);
|
|
859
|
-
});
|
|
860
|
-
srChilds.name = "Services(" + srChilds.children.length + ')';
|
|
861
|
-
serviceErPolicyNode.data.children.push(srChilds);
|
|
862
|
-
});
|
|
863
|
-
});
|
|
864
|
-
wait_promises.push(serpromise);
|
|
865
|
-
Promise.all(wait_promises).then(() => {
|
|
866
|
-
resolve('Done');
|
|
867
|
-
});
|
|
868
|
-
});
|
|
869
|
-
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
870
|
-
return nd.children;
|
|
871
|
-
});
|
|
872
|
-
return [networkGraph, this.uniqId];
|
|
873
|
-
} // end
|
|
874
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeNodeProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
875
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeNodeProcessor, providedIn: 'root' }); }
|
|
876
|
-
} // end of class
|
|
877
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeNodeProcessor, decorators: [{
|
|
878
|
-
type: Injectable,
|
|
879
|
-
args: [{
|
|
880
|
-
providedIn: 'root',
|
|
881
|
-
}]
|
|
882
|
-
}] });
|
|
883
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLnRyZWVub2RlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvbmV0d29yay12aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci50cmVlbm9kZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFLdEksTUFBTSxPQUFPLGlCQUFpQjtJQUg5QjtRQUlJLFdBQU0sR0FBRyxDQUFDLENBQUM7S0F5OUJkO0lBeDlCRyxlQUFlLENBQUMsUUFBUTtRQUN0QixNQUFNLE1BQU0sR0FBRztZQUNiLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLEVBQUU7WUFDVixLQUFLLEVBQUUsUUFBUTtZQUNmLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUsS0FBSztTQUNiLENBQUM7UUFDRixPQUFRLE1BQU0sQ0FBQztJQUNqQixDQUFDO0lBRUQsS0FBSyxDQUFDLDZCQUE2QixDQUMvQixZQUFZLEVBQ1osWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNYLE9BQU87UUFFWCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksT0FBTyxDQUFFLEtBQUssRUFBRSxP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QUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNoRyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNoRyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNoRyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNoRyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNoRyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNoRyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUMvRixNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUVsRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFF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QyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNsRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNsRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNsRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNsRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNsRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLENB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QUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3ZELE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxNQUFNOytHQXo5QkMsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGZCxNQUFNO0VBNDlCcEIsZUFBZTs0RkExOUJKLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU2VydmljZVBvbGljeSwgQXR0cmlidXRlLCBDaGlsZHJlbiwgSWRlbnRpdHksIEVSb3V0ZXIsIEVSUG9saWN5LCBHcm91cCwgU2VydmljZSwgQ29uZmlnIH0gZnJvbSAnLi9uZXR3b3JrLXZpc3VhbGl6ZXIuaGVscGVyJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVHJlZU5vZGVQcm9jZXNzb3Ige1xuICAgIHVuaXFJZCA9IDA7XG4gICAgZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKSB7XG4gICAgICBjb25zdCBwYWdpbmcgPSB7XG4gICAgICAgIHNlYXJjaE9uOiAnbmFtZScsXG4gICAgICAgIG5vU2VhcmNoOiBmYWxzZSxcbiAgICAgICAgZmlsdGVyOiAnJyxcbiAgICAgICAgdG90YWw6IHBhZ2VzaXplLFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBzb3J0OiAnbmFtZScsXG4gICAgICAgIG9yZGVyOiAnYXNjJyxcbiAgICAgIH07XG4gICAgICByZXR1cm4gIHBhZ2luZztcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzSWRlbnRpdGllc0Zvck5vZGVDbGljayhcbiAgICAgICAgaWRlbnRpdHlOb2RlLFxuICAgICAgICBuZXR3b3JrR3JhcGgsXG4gICAgICAgIHJhd0VuZHBvaW50cyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZSxcbiAgICAgICAgY29uZmlnc1xuICAgICkge1xuICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKCBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgY29uc3Qgd2FpdF9wcm9taXNlcyA9IFtdO1xuICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgY29uc3QgcmF3RXAgPSB0aGlzLmZpbmRSYXdFbmRwb2ludChpZGVudGl0eU5vZGUuZGF0YS5uYW1lLCByYXdFbmRwb2ludHMpO1xuICAgICAgICBsZXQgcmF3RXBBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGlmIChyYXdFcC5yb2xlQXR0cmlidXRlcykge3Jhd0VwQXR0cmlidXRlcyA9IHJhd0VwLnJvbGVBdHRyaWJ1dGVzfTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0VwQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgICAgYXR0cmlidXRlLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICBhdHRyaWJ1dGUubmFtZSA9IHJhd0VwQXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgYXR0cmlidXRlLnR5cGUgPSAnSWRlbnRpdHkgQXR0cmlidXRlJztcbiAgICAgICAgICAgICAgaWRlbnRpdHlOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChhdHRyaWJ1dGUpO1xuICAgICAgICB9XG5cbiAgICAgIGNvbnN0IGJpbmRTZXJ2aWNlcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgY29uc3QgZGlhbFNlcnZpY2VzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICBiaW5kU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBkaWFsU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBsZXQgaWRlbnRpdHlTZXJ2aWNlUG9saWNpZXMgPSBbXTtcbiAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgIC8vIGZldGNoIGFzc29jaWF0ZWQgcm91dGVyc1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3RXAsICdlZGdlLXJvdXRlcnMnKS5yZXBsYWNlKCcuLycsICcnKTtcbiAgICAgIGxldCBhc3NvY2lhdGVkUm91dGVycyA9IFtdO1xuICAgICAgY29uc3QgcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgY29uc3QgZXJDaGFpbGRzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVyQ2hhaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgZXJDaGFpbGRzLm5hbWU9ICdBc3NvY2lhdGVkIEVkZ2UgUm91dGVycyc7XG4gICAgICAgIGVyQ2hhaWxkcy50eXBlPSAnRWRnZSBSb3V0ZXJzJztcbiAgICAgIGNvbnN0IGFzc29jaWF0ZWRSb3V0ZXJzUHJvbWlzZSA9ICBhd2FpdCB6aXRpU2VydmljZS5nZXQodXJsLCBwYWdpbmcsIFtdKVxuICAgICAgICAgICAudGhlbiggKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmZvckVhY2goIChyZSkgPT4ge1xuICAgICAgICAgICAgICAgY29uc3QgdG1wID0gbmV3IEVSb3V0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICB0bXAuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgdG1wLm5hbWUgPSByZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgIHRtcC50eXBlID0gJ0VkZ2UgUm91dGVyJztcbiAgICAgICAgICAgICAgICAgICBlckNoYWlsZHMuY2hpbGRyZW4ucHVzaCh0bXApO1xuICAgICAgICAgICAgIH0gKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShyYXdFcCwgJ3NlcnZpY2UtcG9saWNpZXMnKS5yZXBsYWNlKCcuLycsICcnKTtcbiAgICAgIGNvbnN0IHBvbGljaWVzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgIGNvbnN0IGZpcnN0UHJvbWlzZSA9ICBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KHBvbGljaWVzX3VybCwgcG9saWNpZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5U2VydmljZVBvbGljaWVzID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBpZGVudGl0eVNlcnZpY2VQb2xpY2llcy5mb3JFYWNoKCAoc3ApID0+IHtcbiAgICAgICAgICAgICBjb25zdCBub2RlQXJyYXkgPSAgdGhpcy5nZXRTZXJ2aWNlc0ZvckFTZXJ2aWNlUG9saWN5KHNwLCB6aXRpU2VydmljZSwgNTAwKTtcbiAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vZGVBcnJheSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCAobm9kZUFycmF5KSA9PiB7XG4gICAgICAgICAgICAgbm9kZUFycmF5LmZvckVhY2goIChhck9iKSA9PiB7XG4gICAgICAgICAgICAgIGlmKGFyT2JbMF0gPT09ICdCaW5kJyApIHtcbiAgICAgICAgICAgICAgICAgYmluZFNlcnZpY2VzLmNoaWxkcmVuID0gdGhpcy5hcnJheU9iamVjdENvcHlSaWdodFRvTGVmdChiaW5kU2VydmljZXMuY2hpbGRyZW4sIGFyT2JbMV0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICBkaWFsU2VydmljZXMuY2hpbGRyZW4gPSB0aGlzLmFycmF5T2JqZWN0Q29weVJpZ2h0VG9MZWZ0KGRpYWxTZXJ2aWNlcy5jaGlsZHJlbiwgYXJPYlsxXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9ICk7XG4gICAgICAgIH0pO1xuXG4gICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgIGlmIChlckNoYWlsZHMuY2hpbGRyZW4ubGVuZ3RoID4wICkge1xuICAgICAgICAgICAgIGVyQ2hhaWxkcy5uYW1lID0gZXJDaGFpbGRzLm5hbWUrJygnK2VyQ2hhaWxkcy5jaGlsZHJlbi5sZW5ndGgrJyknO1xuICAgICAgICAgICAgIGlkZW50aXR5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goZXJDaGFpbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZihiaW5kU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoPjApIHtcbiAgICAgICAgICAgICAgYmluZFNlcnZpY2VzLm5hbWUgPSAnQmluZC1TZXJ2aWNlcygnK2JpbmRTZXJ2aWNlcy5jaGlsZHJlbi5sZW5ndGgrJyknO1xuICAgICAgICAgICAgICBpZGVudGl0eU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGJpbmRTZXJ2aWNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZGlhbFNlcnZpY2VzLmNoaWxkcmVuLmxlbmd0aD4wKSB7XG4gICAgICAgICAgICAgIGRpYWxTZXJ2aWNlcy5uYW1lID0gJ0RpYWwtU2VydmljZXMoJytkaWFsU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoKycpJztcbiAgICAgICAgICAgICAgaWRlbnRpdHlOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChkaWFsU2VydmljZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgIG5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeShuZXR3b3JrR3JhcGguZGF0YSwgZnVuY3Rpb24gKG5kKSB7XG4gICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICB9KTtcbiAgICAgICAgIHJldHVybiBbbmV0d29ya0dyYXBoLCB0aGlzLnVuaXFJZF07XG4gICAgfSAvLyBlbmQgb2YgZnVuY3Rpb25cblxuICAgIGNyZWF0ZUlkKCkge1xuICAgICAgICArK3RoaXMudW5pcUlkO1xuICAgICAgICByZXR1cm4gdGhpcy51bmlxSWQ7XG4gICAgfVxuXG4gICBjcmVhdGVTZXJ2aWNlTm9kZSggc3IpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZU9iID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgIHNlcnZpY2VPYi5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgIHNlcnZpY2VPYi51dWlkID0gc3IuaWQ7XG4gICAgICAgICBzZXJ2aWNlT2IubmFtZSA9IHNyLm5hbWU7XG4gICAgICAgICBzZXJ2aWNlT2IudHlwZSA9ICdTZXJ2aWNlJztcbiAgICAgICByZXR1cm4gc2VydmljZU9iO1xuICAgfVxuXG4gICBhcnJheU9iamVjdENvcHlSaWdodFRvTGVmdChsZWZ0QXJyLHJpZ2h0QXJyKSB7XG4gICAgIGNvbnN0IGxlZnRBcnJJZHMgPSBbXTtcbiAgICAgbGVmdEFyci5mb3JFYWNoKCAob2IpID0+IHtcbiAgICAgICBsZWZ0QXJySWRzLnB1c2gob2IuaWQpO1xuICAgICB9ICk7XG5cbiAgICAgcmlnaHRBcnIuZm9yRWFjaCggKG9iKSA9PiB7XG4gICAgICBpZiAoIWxlZnRBcnIuaW5jbHVkZXMob2IuaWQpKSB7XG4gICAgICAgICAgIGxlZnRBcnIucHVzaChvYik7XG4gICAgICB9XG4gICAgIH0gKTtcblxuICAgIHJldHVybiBsZWZ0QXJyO1xuICAgfVxuXG4gIGFkZEl0ZW1Ub0FycmF5KElkbmV0aXRpZXMsIG9iKSB7XG4gICAgaWYgKCBvYi5uYW1lICYmICFJZG5ldGl0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXVpZCA9PT0gb2IuaWQpKSB7XG4gICAgICBJZG5ldGl0aWVzLnB1c2godGhpcy5jcmVhdGVJZGVudGl0eShvYikpO1xuICAgIH1cbiAgICByZXR1cm4gSWRuZXRpdGllcztcbiAgfVxuICBjcmVhdGVJZGVudGl0eShvYikge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgSWRlbnRpdHkoKTtcbiAgICAgICBlbmRwb2ludC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICBlbmRwb2ludC51dWlkID0gb2IuaWQ7XG4gICAgICAgZW5kcG9pbnQubmFtZSA9IG9iLm5hbWU7XG4gICAgICAgZW5kcG9pbnQub25saW5lID0gb2IuaGFzQXBpU2Vzc2lvbiA9PT0gdHJ1ZSA/ICdZZXMnOiAnTm8nO1xuICAgICAgIGVuZHBvaW50LnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgIGVuZHBvaW50LnN0YXR1cyA9IG9iLnNka0luZm8gIT09IG51bGwgPyAnUmVnaXN0ZXJlZCc6ICdOb3QgUmVnaXN0ZXJlZCc7XG4gICAgICAgaWYgKG9iLnNka0luZm8pIHtcbiAgICAgICAgICAgZW5kcG9pbnQub3MgPSBvYi5zZGtJbmZvLnR5cGU/IG9iLnNka0luZm8udHlwZTogb2Iuc2RrSW5mby5hcHBJZDtcbiAgICAgICAgICAgZW5kcG9pbnQub3NWZXJzaW9uID0gb2Iuc2RrSW5mby52ZXJzaW9uO1xuICAgICAgIH1cbiAgICAgICBpZiAob2IuYXV0aFBvbGljeSAmJiBvYi5hdXRoUG9saWN5Lm5hbWUuaW5jbHVkZXMoXCJCcm93WmVyXCIpKSB7XG4gICAgICAgICAgIGVuZHBvaW50LnR5cGUgPSAnQnJvd1plciBJZGVudGl0eSc7XG4gICAgICAgfVxuICAgICAgIGVuZHBvaW50LmNyZWF0ZWRBdCA9IG9iLmNyZWF0ZWRBdDtcbiAgICAgICBlbmRwb2ludC51cGRhdGVkQXQgPSBvYi51cGRhdGVkQXQ7XG5cbiAgICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG4gIGdldExpbmtGb3JSZXNvdXJjZShvYiwgcmVzb3VyY2UpIHtcbiAgICByZXR1cm4gb2JbJ19saW5rcyddW3Jlc291cmNlXVsnaHJlZiddO1xuICB9XG5cbiAgICBmaW5kU2VydmljZXNIb3N0ZWRPbkVuZHBvaW50KHJhd0VwLCBzZXJ2aWNlcywgc2VydmljZVBvbGljaWVzLCB6aXRpU2VydmljZSkge1xuICAgICAgIGNvbnN0IHNlcnZpY2VzQXJyID0gW107XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuTm9Hcm91cHMgPSBbXTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRBdHRyID0gcmF3RXAucm9sZUF0dHJpYnV0ZXM/IHJhd0VwLnJvbGVBdHRyaWJ1dGVzOiBbXTtcbiAgICAgICAgZW5kcG9pbnRBdHRyLnB1c2goJ0AnK3Jhd0VwLmlkKTtcblxuICAgICAgICBsZXQgZGlhbFNlcnZpY2VBdHRycyA9IFtdO1xuICAgICAgICBsZXQgYmluZFNlcnZpY2VBdHRycyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGJpbmRQb2xpY2llcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICBiaW5kUG9saWNpZXMubmFtZSA9ICdCaW5kLVBvbGljaWVzJztcbiAgICAgICAgY29uc3QgZGlhbFBvbGljaWVzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgICAgICBkaWFsUG9saWNpZXMubmFtZSA9ICdEaWFsLVBvbGljaWVzJztcblxuICAgICAgICBiaW5kUG9saWNpZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgIGRpYWxQb2xpY2llcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcblxuICAgICAgICBzZXJ2aWNlUG9saWNpZXMuZmluZCggKHNwKSA9PiB7XG4gICAgICAgICAgc3AuaWRlbnRpdHlSb2xlcy5maW5kKCAoYXR0cikgPT4ge1xuICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRBdHRyLmluY2x1ZGVzKGF0dHIpICkge1xuICAgICAgICAgICAgICAgaWYgKHNwLnR5cGUgPT09ICdCaW5kJykge1xuICAgICAgICAgICAgICAgICAgIGNvbnN0IHNQb2xpY3kgPSBuZXcgU2VydmljZVBvbGljeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS5uYW1lID0gc3AubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzUG9saWN5LnR5cGUgPSBzcC50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuY2hpbGRyZW4gPSB0aGlzLmdldFNlcnZpY2VzRm9yUG9saWN5KHNlcnZpY2VzLCBzcCk7XG4gICAgICAgICAgICAgICAgICAgYmluZFBvbGljaWVzLmNoaWxkcmVuLnB1c2goc3ApO1xuICAgICAgICAgICAgICAgICAgIGJpbmRTZXJ2aWNlQXR0cnMgPSBmaWxsQXJyYXkoYmluZFNlcnZpY2VBdHRycywgc3Auc2VydmljZVJvbGVzKTtcbiAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgIGNvbnN0IHNQb2xpY3kgPSBuZXcgU2VydmljZVBvbGljeSgpO1xuICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kubmFtZSA9IHNwLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICBzUG9saWN5LnR5cGUgPSBzcC50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS5jaGlsZHJlbiA9IHRoaXMuZ2V0U2VydmljZXNGb3JQb2xpY3koc2VydmljZXMsIHNwKSA7XG4gICAgICAgICAgICAgICAgIGRpYWxQb2xpY2llcy5jaGlsZHJlbi5wdXNoKHNQb2xpY3kpO1xuICAgICAgICAgICAgICAgIGRpYWxTZXJ2aWNlQXR0cnMgPSBmaWxsQXJyYXkoZGlhbFNlcnZpY2VBdHRycywgc3Auc2VydmljZVJvbGVzKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9ICk7XG5cbiAgICAgICAgZnVuY3Rpb24gZmlsbEFycmF5KGFycjEsIGFycjIpIHtcbiAgICAgICAgICBhcnIyLmZvckVhY2goIChpdGVtKSA9PiB7XG4gICAgICAgICAgIGFycjEucHVzaChpdGVtKTtcbiAgICAgICAgICB9ICk7XG4gICAgICAgICAgcmV0dXJuIGFycjE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiaW5kU2VydmljZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZGlhbFNlcnZpY2VzID0gW107XG5cbiAgICAgICAgc2VydmljZXMgJiYgc2VydmljZXMuZm9yRWFjaCggKHNyKSA9PiB7XG4gICAgICAgICAgc3Iucm9sZUF0dHJpYnV0ZXMgJiYgc3Iucm9sZUF0dHJpYnV0ZXMuZm9yRWFjaCggKGF0dHIpID0+IHtcbiAgICAgICAgICAgICBpZiAoZGlhbFNlcnZpY2VBdHRycy5pbmNsdWRlcyhhdHRyKSApIHtcbiAgICAgICAgICAgICAgIGRpYWxTZXJ2aWNlcy5wdXNoKHRoaXMuY3JlYXRlU2VydmljZU5vZGUoc3IpICk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGlmIChiaW5kU2VydmljZUF0dHJzLmluY2x1ZGVzKGF0dHIpICkge1xuICAgICAgICAgICAgICAgIGJpbmRTZXJ2aWNlcy5wdXNoKCB0aGlzLmNyZWF0ZVNlcnZpY2VOb2RlKHNyKSApO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICB9ICk7XG4gICAgICAgIH0pO1xuICAgICAgIGlmIChkaWFsU2VydmljZXMubGVuZ3RoID4wICkge1xuICAgICAgICAgIGNvbnN0IGRpYWxHcm91cCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgIGRpYWxHcm91cC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICBkaWFsR3JvdXAubmFtZSA9ICdTZXJ2aWNlcy1EaWFsJztcbiAgICAgICAgICBkaWFsR3JvdXAuY2hpbGRyZW4gPSBkaWFsU2VydmljZXM7XG4gICAgICAgICAgc2VydmljZXNBcnIucHVzaChkaWFsR3JvdXApO1xuICAgICAgIH1cbiAgICAgICBpZiAoYmluZFNlcnZpY2VzLmxlbmd0aCA+MCApIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRHcm91cCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgYmluZEdyb3VwLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgYmluZEdyb3VwLm5hbWUgPSAnU2VydmljZXMtQmluZCc7XG4gICAgICAgICAgICBiaW5kR3JvdXAuY2hpbGRyZW4gPSBiaW5kU2VydmljZXM7XG4gICAgICAgICAgICBzZXJ2aWNlc0Fyci5wdXNoKGJpbmRHcm91cCk7XG4gICAgICAgfVxuICAgICByZXR1cm4gc2VydmljZXNBcnI7XG5cblxuICAgIH0gLy8gZW5kIG9mIGZpbmQgc2VydmljZXNIb3N0ZWRPbkVuZHBvaW50XG5cbiAgIGdldFNlcnZpY2VzRm9yUG9saWN5KHNlcnZpY2VzLCBzcE9iKSB7XG4gICAgIGNvbnN0IHNlcnZpY2VzRm90UG9saWN5ID0gW107XG4gICAgIHNlcnZpY2VzICYmIHNlcnZpY2VzLmZvckVhY2goIChzcikgPT4ge1xuICAgICAgICAgY29uc3QgYXR0cnMgPSBzci5yb2xlQXR0cmlidXRlcyA/IHNyLnJvbGVBdHRyaWJ1dGVzOiBbXTtcbiAgICAgICAgIGF0dHJzLnB1c2goJ0AnK3NwT2IuaWQpO1xuICAgICAgICAgYXR0cnMuZmluZCggKGF0cikgPT4ge1xuICAgICAgICAgICAgaWYoc3BPYi5zZXJ2aWNlUm9sZXMuaW5jbHVkZXMoYXRyKSApe1xuICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZU5vZGUgPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgc2VydmljZU5vZGUuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICBzZXJ2aWNlTm9kZS5uYW1lID0gc3IubmFtZTtcbiAgICAgICAgICAgICAgIHNlcnZpY2VOb2RlLnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICAgc2VydmljZXNGb3RQb2xpY3kucHVzaChzZXJ2aWNlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgfSk7XG4gICAgcmV0dXJuIHNlcnZpY2VzRm90UG9saWN5O1xuICAgfVxuXG4gICAgZmluZFJhd0VuZHBvaW50KGVwTmFtZSwgZW5kcG9pbnRzKSB7XG4gICAgICAgcmV0dXJuIGVuZHBvaW50cy5maW5kKChlcCkgPT4gZXAubmFtZSA9PT0gZXBOYW1lKTtcbiAgICB9XG5cbiAgc2VydmljZUNvbmZpZ0FsaWFzKGNvbmZpZ3MpIHtcbiAgICAgbGV0IGludGVyY2VwdCA9IFtdO1xuICAgICBfLmlzQXJyYXkoY29uZmlncykgJiYgY29uZmlncy5mb3JFYWNoKCAoY29uZikgPT4ge1xuICAgICAgICAgICBsZXQgYWRkcmVzc2VzID0gJyc7XG4gICAgICAgICAgIGxldCBwb3J0cyA9ICcnO1xuICAgICAgICAgIGlmIChjb25mLmRhdGEuYWRkcmVzc2VzKSB7XG4gICAgICAgICAgICAgYWRkcmVzc2VzID0gY29uZi5kYXRhLmFkZHJlc3Nlcy50b1N0cmluZygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgYWRkcmVzc2VzID0gY29uZi5kYXRhLmFkZHJlc3M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF8uaXNBcnJheShjb25mLmRhdGEucG9ydFJhbmdlcykgKSB7XG4gICAgICAgICAgICAgIGNvbmYuZGF0YS5wb3J0UmFuZ2VzLmZvckVhY2goIChwb3J0c0pzb24pID0+IHtcbiAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHBvcnRzSnNvbikge1xuICAgICAgICAgICAgICAgICAgcG9ydHMgPSBwb3J0cyArIGtleSArJzonK3BvcnRzSnNvbltrZXldICsnICcgO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBwb3J0cyA9IHBvcnRzICsgJzsnO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBvcnRzID0gIGNvbmYuZGF0YS5wb3J0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnRlcmNlcHQucHVzaChhZGRyZXNzZXMpO1xuICAgICAgICAgIGludGVyY2VwdC5wdXNoKHBvcnRzKTtcbiAgICAgfSk7XG4gICAgIHJldHVybiBpbnRlcmNlcHQ7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzU2VydmljZXNGb3JOb2RlQ2xpY2soc2VydmljZU5vZGUsIG5ldHdvcmtHcmFwaCwgc2VydmljZXMsIHVuaXFJZCwgeml0aVNlcnZpY2UpIHtcbiAgICAgY29uc3QgbXlQcm9taXNlID0gYXdhaXQgbmV3IFByb21pc2UoIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd2FpdF9wcm9taXNlcyA9IFtdO1xuICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgY29uc3QgcmF3U2VydmljZU9iaiA9IHNlcnZpY2VzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gc2VydmljZU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc3dpdGhOYW1lID0gW107XG5cbiAgICAgICAgcmF3U2VydmljZU9iai5yb2xlQXR0cmlidXRlcyAmJiByYXdTZXJ2aWNlT2JqLnJvbGVBdHRyaWJ1dGVzLmZpbmQoKHNyYXR0cikgPT4ge1xuICAgICAgICAgICAgYXR0cmlidXRlc3dpdGhOYW1lLnB1c2goc3JhdHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VBdHRyaWJ1dGVzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLm5hbWUgPSAnQXR0cmlidXRlcyc7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLnR5cGUgPSAnQXR0cmlidXRlcyc7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGF0dHJpYnV0ZXN3aXRoTmFtZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgYXR0ck9iID0gbmV3IEF0dHJpYnV0ZSgpO1xuICAgICAgICAgICAgYXR0ck9iLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgYXR0ck9iLm5hbWUgPSBhdHRyaWJ1dGVzd2l0aE5hbWVba107XG4gICAgICAgICAgICBhdHRyT2IudHlwZSA9ICdBdHRyaWJ1dGUnO1xuXG4gICAgICAgICAgICBzZXJ2aWNlQXR0cmlidXRlcy5jaGlsZHJlbi5wdXNoKGF0dHJPYik7XG4gICAgICAgIH0gLy8gZW5kIGlubmVyIGZvciBsb29wXG4gICAgICAgIGlmIChzZXJ2aWNlQXR0cmlidXRlcy5jaGlsZHJlbi5sZW5ndGggPjAgKSB7XG4gICAgICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLm5hbWUgPSBzZXJ2aWNlQXR0cmlidXRlcy5uYW1lKycoJysgc2VydmljZUF0dHJpYnV0ZXMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goc2VydmljZUF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlcnZpY2VfY29uZmlncyA9IFtdO1xuICAgICAgICBjb25zdCBjb25maWdzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd1NlcnZpY2VPYmosICdjb25maWdzJyk7XG4gICAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgICAgICBjb25zdCBwYWdpbmdPYiA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgY29uc3QgY29uZmlnUHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAuZ2V0KGNvbmZpZ3NfdXJsLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAudGhlbigoY29uZmlncykgPT4ge1xuICAgICAgICAgICBzZXJ2aWNlX2NvbmZpZ3MgPSBjb25maWdzICYmIGNvbmZpZ3MuZGF0YSA/IGNvbmZpZ3MuZGF0YSA6IFtdO1xuICAgICAgICAgICBjb25zdCBjaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgY2hpbGRzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICBjaGlsZHMubmFtZSA9ICdTZXJ2aWNlIENvbmZpZ3MnO1xuICAgICAgICAgICBjaGlsZHMudHlwZSA9ICdTZXJ2aWNlIENvbmZpZ3MnO1xuICAgICAgICAgICBjb25zdCBzZXJ2aWNlX2NvbmZpZ3NfQXJyID0gW107XG4gICAgICAgICAgIHNlcnZpY2VfY29uZmlncy5mb3JFYWNoKCAoY2ZnKSA9PiB7XG4gICAgICAgICAgICAgY29uc3Qgb2JqID0gbmV3IENvbmZpZygpO1xuICAgICAgICAgICAgIG9iai5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBvYmoubmFtZSA9IGNmZy5uYW1lO1xuICAgICAgICAgICAgIG9iai51dWlkID0gY2ZnLnV1aWQ7XG4gICAgICAgICAgICAgb2JqLmRhdGEgPSBKU09OLnN0cmluZ2lmeShjZmcuZGF0YSk7XG4gICAgICAgICAgICAgc2VydmljZV9jb25maWdzX0Fyci5wdXNoKG9iaik7XG4gICAgICAgICAgIH0gKTtcblxuICAgICAgICAgICBpZiAoc2VydmljZV9jb25maWdzX0Fyci5sZW5ndGggPjAgKSB7XG4gICAgICAgICAgICAgIGNoaWxkcy5jaGlsZHJlbiA9IHNlcnZpY2VfY29uZmlnc19BcnI7XG4gICAgICAgICAgICAgIGNoaWxkcy5uYW1lID0gY2hpbGRzLm5hbWUgKycoJytjaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goY2hpbGRzKTtcbiAgICAgICAgICAgICAgc2VydmljZU5vZGUuZGF0YS5pbnRlcmNlcHQgPSB0aGlzLnNlcnZpY2VDb25maWdBbGlhcyhzZXJ2aWNlX2NvbmZpZ3MpO1xuICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKGNvbmZpZ1Byb21pc2UpO1xuICAgICAgIGNvbnN0IHNlcnZpY2VfZWRnZV9yb3V0ZXJfcG9saWNpZXNfdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoXG4gICAgICAgICByYXdTZXJ2aWNlT2JqLFxuICAgICAgICAnc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llcydcbiAgICAgICApO1xuICAgICAgIGxldCBzZXJ2aWNlX3JvdXRlcnNfdXJscyA9IFtdO1xuICAgICAgIGNvbnN0IHNlcl9wcm9tc2UgPSAgYXdhaXQgeml0aVNlcnZpY2VcbiAgICAgICAgICAgICAuZ2V0KHNlcnZpY2VfZWRnZV9yb3V0ZXJfcG9saWNpZXNfdXJsLnJlcGxhY2UoJy4vJywgJycpLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAgICAgLnRoZW4oIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmZvckVhY2goIChzZXJwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Vfcm91dGVyc191cmxzLnB1c2goIHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHNlcnAsJ2VkZ2Utcm91dGVycycpICk7XG4gICAgICAgICAgICAgICAgICB9ICk7O1xuICAgICAgICAgICAgIH0pO1xuICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChzZXJfcHJvbXNlKTtcbiAgICAgICBsZXQgc2VycF9wYWdlX1Byb21pc2VzID0gW107XG4gICAgICAgc2VydmljZV9yb3V0ZXJzX3VybHMuZm9yRWFjaCgoZXJfdXJsKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvbXNlID0gIHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldChlcl91cmwucmVwbGFjZSgnLi8nLCAnJyksIHBhZ2luZ09iLCBbXSk7XG4gICAgICAgICAgICAgICAgLy8gLnRoZW4ocmVzdWx0ID0+IFtwb2xpY3kudHlwZSwgcmVzdWx0XSk7XG4gICAgICAgICAgc2VycF9wYWdlX1Byb21pc2VzLnB1c2gocHJvbXNlKTtcbiAgICAgICB9KTtcbiAgICAgICBsZXQgYXNzb2NpYXRlZFJvdXRlcnMgPSBbXTtcbiAgICAgICBhd2FpdCBQcm9taXNlLmFsbChzZXJwX3BhZ2VfUHJvbWlzZXMpLnRoZW4oICh2YWx1ZXM6YW55KSA9PiB7XG4gICAgICAgICB2YWx1ZXMgJiYgdmFsdWVzLmZvckVhY2goKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKCAoZXIpPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXJPYiA9IG5ldyBFUm91dGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlck9iLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJPYi5uYW1lID0gICBlci5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXIudHlwZSA9ICdFZGdlIFJvdXRlcic7XG4gICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkUm91dGVycy5wdXNoKGVyT2IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgIH0pXG4gICAgICAgICBjb25zdCB0bXAgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICB0bXAubmFtZSA9IFwiQXNzb2NpYXRlZCBFZGdlIFJvdXRlcnMoXCIgKyBhc3NvY2lhdGVkUm91dGVycy5sZW5ndGggKycpJztcbiAgICAgICAgICAgICB0bXAudHlwZSA9IFwiRWRnZSBSb3V0ZXJzXCI7XG4gICAgICAgICAgICAgdG1wLmNoaWxkcmVuID0gYXNzb2NpYXRlZFJvdXRlcnM7XG4gICAgICAgICAgICAgdG1wLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgIHNlcnZpY2VOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaCh0bXApO1xuICAgICAgIH0pO1xuXG4gICAgICAgY29uc3Qgc2VydmljZV9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgcmF3U2VydmljZU9iaixcbiAgICAgICAgJ3NlcnZpY2UtcG9saWNpZXMnXG4gICAgICAgKS5yZXBsYWNlKCcuLycsICcnKTsgLy8gZGlhbCwgQmluZCBpbmZvXG5cbiAgICAgICBsZXQgYmluZFBvbGljaWVzID0gW107XG4gICAgICAgbGV0IGJpbmRJZG5ldGl0aWVzID0gW107XG4gICAgICAgbGV0IGRpYWxJZG5ldGl0aWVzID0gW107XG5cbiAgICAgICBjb25zdCBwcm9taXNlMiA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgLmdldChzZXJ2aWNlX3BvbGljaWVzX3VybCwgcGFnaW5nT2IsIFtdKVxuICAgICAgIC50aGVuKChwb2xpY2llcykgPT4ge1xuICAgICAgICAgYmluZFBvbGljaWVzID0gcG9saWNpZXMuZGF0YTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwYWdlUHJvbWlzZXMgPSBbXTtcbiAgICAgIGJpbmRQb2xpY2llcy5mb3JFYWNoKCAgKHBvbGljeSkgPT4ge1xuICAgICAgICAgY29uc3QgYmluZElkZW50aXRpZXNVcmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICAgICdpZGVudGl0aWVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcHJvbXNlID0gIHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldChiaW5kSWRlbnRpdGllc1VybC5yZXBsYWNlKCcuLycsICcnKSwgcGFnaW5nT2IsIFtdKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiBbcG9saWN5LnR5cGUsIHJlc3VsdF0pO1xuICAgICAgICAgIHBhZ2VQcm9taXNlcy5wdXNoKHByb21zZSk7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHBhZ2VQcm9taXNlcykudGhlbiggKHZhbHVlczphbnkpID0+IHtcbiAgICAgICAgICB2YWx1ZXMgJiYgdmFsdWVzLmZvckVhY2goKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgaWYgKHJlcyAmJiByZXNbMV0uZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJlc1sxXS5kYXRhLmZvckVhY2goKHJzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYocmVzWzBdID09PSAnQmluZCcpIHtcbiAgICAgICAgICAgICAgICAgYmluZElkbmV0aXRpZXMgPSB0aGlzLmFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCBycyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlc1swXSA9PT0gJ0RpYWwnKXtcbiAgICAgICAgICAgICAgICAgZGlhbElkbmV0aXRpZXMgPSB0aGlzLmFkZEl0ZW1Ub0FycmF5KGRpYWxJZG5ldGl0aWVzLCBycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIGlmKHJlc1swXSA9PT0gJ0JpbmQnKSB7XG4gICAgICAgICAgICAgICAgIGJpbmRJZG5ldGl0aWVzID0gdGhpcy5hZGRJdGVtVG9BcnJheShiaW5kSWRuZXRpdGllcywgcmVzWzFdLmRhdGEpO1xuICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlc1swXSA9PT0gJ0RpYWwnKXtcbiAgICAgICAgICAgICAgICAgZGlhbElkbmV0aXRpZXMgPSB0aGlzLmFkZEl0ZW1Ub0FycmF5KGRpYWxJZG5ldGl0aWVzLCByZXNbMV0uZGF0YSk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgIH1cblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgIGNvbnN0IHRtcCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIHRtcC5uYW1lID0gXCJCaW5kIElkZW50aXRpZXMoXCIgKyBiaW5kSWRuZXRpdGllcy5sZW5ndGggKycpJztcbiAgICAgICAgICAgICB0bXAudHlwZSA9IFwiSWRlbnRpdGllc1wiO1xuICAgICAgICAgICAgIHRtcC5jaGlsZHJlbiA9IGJpbmRJZG5ldGl0aWVzO1xuICAgICAgICAgICAgIHRtcC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2godG1wKTtcbiAgICAgICAgICAgY29uc3QgdG1wRGlhbCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIHRtcERpYWwubmFtZSA9IFwiRGlhbCBJZGVudGl0aWVzKFwiICsgZGlhbElkbmV0aXRpZXMubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgdG1wRGlhbC50eXBlID0gXCJJZGVudGl0aWVzXCI7XG4gICAgICAgICAgICAgdG1wRGlhbC5jaGlsZHJlbiA9IGRpYWxJZG5ldGl0aWVzO1xuICAgICAgICAgICAgIHRtcERpYWwuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgc2VydmljZU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKHRtcERpYWwpO1xuICAgICAgICAgcmVzb2x2ZSgndGhpcyBpcyBhIHByb21pc2UnKTtcbiAgICAgIH0pO1xuICAgICAgIFByb21pc2UuYWxsKHdhaXRfcHJvbWlzZXMpLnRoZW4oICgpID0+IHsgfSk7XG4gICAgfSk7IC8vIGVuZCBvZiBteXByb21pc2VcblxuICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICByZXR1cm4gbmQuY2hpbGRyZW47XG4gICAgIH0pO1xuICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgfSAvLyBlbmQgb2YgcHJvY2Vzc1NlcnZpY2VzRm9yTm9kZUNsaWNrXG5cblxuICBhc3luYyBwcm9jZXNzU2VydmljZVBvbGljaWVzRm9yTm9kZUNsaWNrKHBvbGljeU5vZGUsIG5ldHdvcmtHcmFwaCwgIHNlcnZpY2VQb2xpY2llcywgdW5pcUlkLCB6aXRpU2VydmljZSkge1xuICAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcUlkID0gdW5pcUlkO1xuICAgICAgICBjb25zdCByYXdTUG9saWN5ID0gc2VydmljZVBvbGljaWVzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gcG9saWN5Tm9kZS5kYXRhLm5hbWUpO1xuICAgICAgICBjb25zdCBjaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgIGNoaWxkcy5uYW1lID0gXCJBdHRyaWJ1dGVzXCI7XG4gICAgICAgICBjaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG5cbiAgICAgICAgcmF3U1BvbGljeS5zZXJ2aWNlUm9sZXMgJiYgcmF3U1BvbGljeS5zZXJ2aWNlUm9sZXMuZm9yRWFjaCggKG9iKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0ciA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgIGF0dHIubmFtZSA9IG9iO1xuICAgICAgICAgICAgYXR0ci5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGF0dHIudHlwZSA9IFwiU2VydmljZSBBdHRyaWJ1dGVcIjtcbiAgICAgICAgICBjaGlsZHMuY2hpbGRyZW4ucHVzaChhdHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJhd1NQb2xpY3kuaWRlbnRpdHlSb2xlcyAmJiByYXdTUG9saWN5LmlkZW50aXR5Um9sZXMuZm9yRWFjaCggKG9iKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0ciA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgYXR0ci5uYW1lID0gb2I7XG4gICAgICAgICAgIGF0dHIuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgIGF0dHIudHlwZSA9IFwiSWRlbnRpdHkgQXR0cmlidXRlXCI7XG4gICAgICAgICAgY2hpbGRzLmNoaWxkcmVuLnB1c2goYXR0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjaGlsZHMubmFtZSA9IGNoaWxkcy5uYW1lICsgJygnKyBjaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgcG9saWN5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goY2hpbGRzKTtcblxuICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgY29uc3QgaWRlbnRpdGllc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgIGNvbnN0IGJpbmRJZGVudGl0aWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoIHJhd1NQb2xpY3ksICdpZGVudGl0aWVzJyApO1xuICAgICAgICAvLyB0aGlzLmxvZ2dlci5pbmZvKCdiaW5kSWRlbnRpdGllc1VybCcsYmluZElkZW50aXRpZXNVcmwpO1xuICAgICAgICBjb25zdCBzcF9wcm9taXNlID0gYXdhaXQgeml0aVNlcnZpY2UuZ2V0KGJpbmRJZGVudGl0aWVzVXJsLCBpZGVudGl0aWVzX3BhZ2luZywgW10pXG4gICAgICAgLnRoZW4oKGlkcykgPT4ge1xuICAgICAgICAgY29uc3QgY2hpbGRzID1uZXcgQ2hpbGRyZW4oKVxuICAgICAgICAgY2hpbGRzLm5hbWUgPSByYXdTUG9saWN5LnR5cGUrICctSWRlbnRpdGllcyc7XG4gICAgICAgICBjaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICBpZHMuZGF0YS5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICBjaGlsZHMuY2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZUlkZW50aXR5KGlkT2IpICk7XG4gICAgICAgICB9KTtcbiAgICAgICAgIGNoaWxkcy5uYW1lID0gY2hpbGRzLm5hbWUgKyAnKCcgKyBjaGlsZHMuY2hpbGRyZW4ubGVuZ3RoKycpJztcbiAgICAgICAgIHBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGNoaWxkcyk7XG4gICAgICAgfSk7XG4gICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHNwX3Byb21pc2UpO1xuXG4gICAgICAgY29uc3Qgc2VydmljZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgIGNvbnN0IGJpbmRTZXJ2aWNlc1VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKCByYXdTUG9saWN5LCAnc2VydmljZXMnICk7ICAvLyBwdWxsIHNlcnZpY2VzXG4gICAgICAgY29uc3QgX3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoYmluZFNlcnZpY2VzVXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgIGNvbnN0IGNoaWxkcyA9bmV3IENoaWxkcmVuKClcbiAgICAgICAgIGNoaWxkcy5uYW1lID0gcmF3U1BvbGljeS50eXBlKyAnLVNlcnZpY2VzJztcbiAgICAgICAgIGNoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgIHJlc3VsdC5kYXRhLmZvckVhY2goIChpZE9iKSA9PiB7XG4gICAgICAgICAgIGNvbnN0IHNwID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgICAgIHNwLmlkID0gaWRPYi5pZDtcbiAgICAgICAgICAgIHNwLm5hbWUgPSBpZE9iLm5hbWU7XG4gICAgICAgICAgICBzcC50eXBlID0gJ1NlcnZpY2UnO1xuICAgICAgICAgICAgY2hpbGRzLmNoaWxkcmVuLnB1c2goc3ApO1xuICAgICAgICAgfSk7XG4gICAgICAgICBjaGlsZHMubmFtZSA9IGNoaWxkcy5uYW1lICsgJygnICsgY2hpbGRzLmNoaWxkcmVuLmxlbmd0aCsnKSc7XG4gICAgICAgICBwb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChjaGlsZHMpO1xuICAgICAgIH0pO1xuXG4gICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKF9wcm9taXNlKTtcblxuICAgICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgICAgIHJlc29sdmUoJ3Jlc29sdmUuJyk7XG4gICAgICAgIH0pO1xuXG4gICAgIH0pOyAvLyBlbmQgbXlwcm9taXNlXG4gICAgICAgIG5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeShuZXR3b3JrR3JhcGguZGF0YSwgZnVuY3Rpb24gKG5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbmQuY2hpbGRyZW47XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH1cblxuICAgYXN5bmMgZ2V0U2VydmljZXNGb3JBU2VydmljZVBvbGljeShwb2xpY3lPYmplY3QsIHppdGlTZXJ2aWNlLCBwYWdlc2l6ZT01MDApIHtcbiAgICAgICBjb25zdCBjaGlsZHMgPSBbXTtcbiAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgY29uc3QgYmluZFNlcnZpY2VzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoIHBvbGljeU9iamVjdCwgJ3NlcnZpY2VzJyApO1xuICAgICAgIGNvbnN0IF9wcm9taXNlID0gYXdhaXQgeml0aVNlcnZpY2UuZ2V0KGJpbmRTZXJ2aWNlc1VybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICByZXN1bHQuZGF0YS5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICBjb25zdCBzcCA9IG5ldyBTZXJ2aWNlKCk7XG4gICAgICAgICAgICBzcC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIHNwLnV1aWQgPSBpZE9iLmlkO1xuICAgICAgICAgICAgc3AubmFtZSA9IGlkT2IubmFtZTtcbiAgICAgICAgICAgIHNwLnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICBjaGlsZHMucHVzaChzcCk7XG4gICAgICAgICB9KTtcbiAgICAgICB9KTtcbiAgICAgICByZXR1cm4gW3BvbGljeU9iamVjdC50eXBlLCBjaGlsZHNdO1xuICAgfVxuXG4gICBhc3luYyBwcm9jZXNzRWRnZXJvdXRlcnNGb3JOb2RlQ2xpY2soXG4gICAgICAgIGVkZ2Vyb3V0ZXJOb2RlLFxuICAgICAgICBuZXR3b3JrR3JhcGgsXG4gICAgICAgIGVkZ2Vyb3V0ZXJzLFxuICAgICAgICB1bmlxSWQsXG4gICAgICAgIHppdGlTZXJ2aWNlXG4gICAgKVxuICAgIHtcbiAgICAgY29uc3QgbWFpblByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcUlkID0gdW5pcUlkO1xuICAgICAgICBjb25zdCBlciA9IGVkZ2Vyb3V0ZXJzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gZWRnZXJvdXRlck5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3QgZXJBdHRyaWJ1dGVzID0gZXIucm9sZUF0dHJpYnV0ZXM/IGVyLnJvbGVBdHRyaWJ1dGVzOiBbXTtcblxuICAgICAgICAgZXJBdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGF0dCA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgIGF0dC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGF0dC5uYW1lID0gYXR0cjtcbiAgICAgICAgICAgIGF0dC50eXBlID0gJ0VkZ2UgUm91dGVyIEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICBlZGdlcm91dGVyTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goYXR0KTtcbiAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgICAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICBjb25zdCBlcnBvbGljaWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoZXIsICdlZGdlLXJvdXRlci1wb2xpY2llcycpO1xuICAgICAgIGxldCBlcnBvbGljaWVzRm9yRVIgPSBbXTtcbiAgICAgICBjb25zdCBlcnBvbGljaWVzcHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlLmdldChlcnBvbGljaWVzVXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgIC50aGVuKCBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXJwb2xpY2llc0ZvckVSID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnBvbGljaWVzVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycG9saWNpZXNGb3JFUi5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHByb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICB9IC8vIGVuZCBmb3IgbG9vcFxuICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgZXJwb2xDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBlcnBvbENoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBlcnBvbGljaWVzRm9yRVIuZm9yRWFjaCggKHBvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvbGljeSA9IG5ldyBFUlBvbGljeSgpO1xuICAgICAgICAgICAgICAgIHBvbGljeS5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICBwb2xpY3kudXVpZCA9IHBvbC5pZDtcbiAgICAgICAgICAgICAgICBwb2xpY3kubmFtZSA9IHBvbC5uYW1lO1xuICAgICAgICAgICAgICAgIHBvbGljeS50eXBlID0gJ0VkZ2UgUm91dGVyIFBvbGljeSc7XG4gICAgICAgICAgICAgICAgcG9saWN5LmlzU3lzdGVtID0gcG9sLmlzU3lzdGVtO1xuICAgICAgICAgICAgICAgIHBvbGljeS5zZW1hbnRpYyA9IHBvbC5zZW1hbnRpYztcbiAgICAgICAgICAgICAgICBwb2xpY3kucm9vdE5vZGUgPSAnTm8nO1xuICAgICAgICAgICAgICAgIGVycG9sQ2hpbGRzLmNoaWxkcmVuLnB1c2gocG9saWN5KTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIGVycG9sQ2hpbGRzLm5hbWUgPSBcIkVkZ2UgUm91dGVyIFBvbGljaWVzKFwiKyBlcnBvbENoaWxkcy5jaGlsZHJlbi5sZW5ndGggKycpJztcbiAgICAgICAgICAgICAgIGVkZ2Vyb3V0ZXJOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChlcnBvbENoaWxkcyk7XG4gICAgICAgICAgIH0pO1xuICAgICAgIH0pO1xuICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChlcnBvbGljaWVzcHJvbWlzZSk7XG5cbiAgICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgndGhpcyBpcyBhIHByb21pc2UnKTtcbiAgICAgICB9KTtcbiAgICAgfSk7XG4gICAgICAgIG5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeShuZXR3b3JrR3JhcGguZGF0YSwgZnVuY3Rpb24gKG5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbmQuY2hpbGRyZW47XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgfVxuXG4gICAgc2VydmljZUdyb3VwaW5nKHNlcnZpY2VzQ2hpbGRyZW4sIHNlcnZpY2VzdHJlZSkge1xuICAgICAgICBjb25zdCBwcm90b2NvbFJEUEdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSWQoKSxcbiAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtUkRQXScsXG4gICAgICAgICAgICAnU2VydmljZXMgY3JlYXRlZCBmb3IgUkRQIHByb3RvY29sJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBwcm90b2NvbEhUVFBTR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVJZCgpLFxuICAgICAgICAgICAgJ1NlcnZpY2VzIFtwcm90b2NvbC1IVFRQU10nLFxuICAgICAgICAgICAgJ1NlcnZpY2UgY3JlYXRlZCBmb3IgSFRUUFMgcHJvdG9jb2wnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByb3RvY29sSFRUUEdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSWQoKSxcbiAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtSFRUUF0nLFxuICAgICAgICAgICAgJ1NlcnZpY2UgY3JlYXRlZCBmb3IgSFRUUCBwcm90b2NvbCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xGVFBHcnAgPSBuZXcgR3JvdXAoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUlkKCksXG4gICAgICAgICAgICAnU2VydmljZXMgW3Byb3RvY29sLUZUUF0nLFxuICAgICAgICAgICAgJ1NlcnZpY2UgY3JlYXRlZCBmb3IgRlRQIHByb3RvY29sJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGFiY2RHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW0EtRF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIEEgdG8gRCcpO1xuICAgICAgICBjb25zdCBlZmdoR3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtFLUhdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBFIHRvIEgnKTtcbiAgICAgICAgY29uc3QgaWprbEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbSS1MXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggSSB0byBMJyk7XG4gICAgICAgIGNvbnN0IG1ub3BHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW00tUF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIE0gdG8gUCcpO1xuICAgICAgICBjb25zdCBxcnN0R3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtHLVRdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBRIHRvIFQnKTtcbiAgICAgICAgY29uc3QgdXZ3eEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbVS1YXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggVSB0byBYJyk7XG4gICAgICAgIGNvbnN0IHl6R3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtZLVpdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBZIGFuZCBaJyk7XG4gICAgICAgIGNvbnN0IG9uZVRvOUdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbMS05XScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggMCB0byA5Jyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXJ2aWNlc3RyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VvYmogPSBzZXJ2aWNlc3RyZWVbaV07XG4gICAgICAgICAgICBjb25zdCBjaGEgPSBzZXJ2aWNlb2JqLm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAncmRwJykge1xuICAgICAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdodHRwcycpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdodHRwJykge1xuICAgICAgICAgICAgICAgIHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnZnRwJykge1xuICAgICAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ2EnIHx8IGNoYSA9PT0gJ2InIHx8IGNoYSA9PT0gJ2MnIHx8IGNoYSA9PT0gJ2QnKSB7XG4gICAgICAgICAgICAgICAgYWJjZEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdlJyB8fCBjaGEgPT09ICdmJyB8fCBjaGEgPT09ICdnJyB8fCBjaGEgPT09ICdoJykge1xuICAgICAgICAgICAgICAgIGVmZ2hHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAnaScgfHwgY2hhID09PSAnaicgfHwgY2hhID09PSAnaycgfHwgY2hhID09PSAnbCcpIHtcbiAgICAgICAgICAgICAgICBpamtsR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ20nIHx8IGNoYSA9PT0gJ24nIHx8IGNoYSA9PT0gJ28nIHx8IGNoYSA9PT0gJ3AnKSB7XG4gICAgICAgICAgICAgICAgbW5vcEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdxJyB8fCBjaGEgPT09ICdyJyB8fCBjaGEgPT09ICdzJyB8fCBjaGEgPT09ICd0Jykge1xuICAgICAgICAgICAgICAgIHFyc3RHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAndScgfHwgY2hhID09PSAndicgfHwgY2hhID09PSAndycgfHwgY2hhID09PSAneCcpIHtcbiAgICAgICAgICAgICAgICB1dnd4R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ3knIHx8IGNoYSA9PT0gJ3onKSB7XG4gICAgICAgICAgICAgICAgeXpHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgY2hhID09PSAnMCcgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzInIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnMycgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc0JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzUnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnNicgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc3JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzgnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnOSdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IC8vIGVuZCBtYWluIGZvciBsb29wXG5cbiAgICAgICAgaWYgKHByb3RvY29sUkRQR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvdG9jb2xSRFBHcnAubmFtZSA9IHByb3RvY29sUkRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocHJvdG9jb2xSRFBHcnApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3RvY29sSFRUUFNHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJvdG9jb2xIVFRQU0dycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUFNHcnAubmFtZSA9IHByb3RvY29sSFRUUFNHcnAubmFtZSArICcoJyArIHByb3RvY29sSFRUUFNHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUFNHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJvdG9jb2xIVFRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvdG9jb2xIVFRQR3JwLm5hbWUgPSBwcm90b2NvbEhUVFBHcnAubmFtZSArICcoJyArIHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocHJvdG9jb2xIVFRQR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdG9jb2xGVFBHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJvdG9jb2xGVFBHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm90b2NvbEZUUEdycC5uYW1lID0gcHJvdG9jb2xGVFBHcnAubmFtZSArICcoJyArIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChwcm90b2NvbEZUUEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFiY2RHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWJjZEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFiY2RHcnAubmFtZSA9IGFiY2RHcnAubmFtZSArICcoJyArIGFiY2RHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGFiY2RHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlZmdoR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGVmZ2hHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlZmdoR3JwLm5hbWUgPSBlZmdoR3JwLm5hbWUgKyAnKCcgKyBlZmdoR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChlZmdoR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWprbEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpamtsR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWprbEdycC5uYW1lID0gaWprbEdycC5uYW1lICsgJygnICsgaWprbEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goaWprbEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ub3BHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbW5vcEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1ub3BHcnAubmFtZSA9IG1ub3BHcnAubmFtZSArICcoJyArIG1ub3BHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG1ub3BHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChxcnN0R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHFyc3RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBxcnN0R3JwLm5hbWUgPSBxcnN0R3JwLm5hbWUgKyAnKCcgKyBxcnN0R3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChxcnN0R3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXZ3eEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB1dnd4R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdXZ3eEdycC5uYW1lID0gdXZ3eEdycC5uYW1lICsgJygnICsgdXZ3eEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2godXZ3eEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHl6R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHl6R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeXpHcnAubmFtZSA9IHl6R3JwLm5hbWUgKyAnKCcgKyB5ekdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goeXpHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmVUbzlHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb25lVG85R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25lVG85R3JwLm5hbWUgPSBvbmVUbzlHcnAubmFtZSArICcoJyArIG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gob25lVG85R3JwKTtcbiAgICAgICAgfVxuICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLm5hbWUgPSBzZXJ2aWNlc0NoaWxkcmVuLm5hbWUgKyAnKCcgKyBzZXJ2aWNlc3RyZWUubGVuZ3RoICsgJyknO1xuICAgICAgICByZXR1cm4gc2VydmljZXNDaGlsZHJlbjtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzRWRnZVJvdXRlclBvbGljaWVzRm9yTm9kZUNsaWNrKFxuICAgICAgICBlclBvbGljeU5vZGUsXG4gICAgICAgIG5ldHdvcmtHcmFwaCxcbiAgICAgICAgZWRnZVJvdXRlclBvbGljaWVzLFxuICAgICAgICB1bmlxSWQsXG4gICAgICAgIHppdGlTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgY29uc3QgbXlQcm9taXNlID0gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdhaXRfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgICBjb25zdCByYXdFUlBvbGljeSA9IGVkZ2VSb3V0ZXJQb2xpY2llcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IGVyUG9saWN5Tm9kZS5kYXRhLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuXG4gICAgICBjb25zdCBlcl91cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShyYXdFUlBvbGljeSwgJ2VkZ2Utcm91dGVycycpLnJlcGxhY2UoJy4vJywgJycpO1xuICAgICAgbGV0IGFzc29jaWF0ZWRSb3V0ZXJzID0gW107XG4gICAgICBjb25zdCBwYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICBjb25zdCBlckNoYWlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgZXJDaGFpbGRzLm5hbWU9ICdBc3NvY2lhdGVkIEVkZ2UgUm91dGVycyc7XG4gICAgICAgIGVyQ2hhaWxkcy50eXBlPSAnRWRnZSBSb3V0ZXJzJztcbiAgICAgICAgZXJDaGFpbGRzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgY29uc3QgYXNzb2NpYXRlZFJvdXRlcnNQcm9taXNlID0gIGF3YWl0IHppdGlTZXJ2aWNlLmdldChlcl91cmwsIHBhZ2luZywgW10pXG4gICAgICAgICAgIC50aGVuKCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaCggKGVyKSA9PiB7XG4gICAgICAgICAgICAgICBjb25zdCB0bXAgPSBuZXcgRVJvdXRlcigpO1xuICAgICAgICAgICAgICAgICAgIHRtcC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICB0bXAubmFtZSA9IGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgdG1wLnR5cGUgPSAnRWRnZSBSb3V0ZXInO1xuICAgICAgICAgICAgICAgICAgIHRtcC52ZXJpZmllZCA9IGVyLmlzVmVyaWZpZWQ/ICdZZXMnOiAnTm8nO1xuICAgICAgICAgICAgICAgICAgIHRtcC5vbmxpbmUgPSBlci5pc09ubGluZT8gJ1llcyc6ICdObyc7XG4gICAgICAgICAgICAgICAgICAgdG1wLmRpc2FibGVkID0gZXIuZGlzYWJsZWQ/ICdZZXMnOiAnTm8nO1xuICAgICAgICAgICAgICAgICAgIHRtcC5yb290Tm9kZSA9ICdZZXMnO1xuICAgICAgICAgICAgICAgICAgIHRtcC50dW5uZWxlckVuYWJsZWQgPSBlci50dW5uZWxlckVuYWJsZWQ/IGVyLnR1bm5lbGVyRW5hYmxlZDonTm8nO1xuICAgICAgICAgICAgICAgICAgIHRtcC5zeW5jU3RhdHVzID0gZXIuc3luY1N0YXR1cz8gZXIuc3luY1N0YXR1czogJ05vJztcbiAgICAgICAgICAgICAgICAgICB0bXAuY3JlYXRlZEF0ID0gZXIuY3JlYXRlZEF0O1xuICAgICAgICAgICAgICAgICAgIHRtcC51cGRhdGVkQXQgPSBlci51cGRhdGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgZXJDaGFpbGRzLmNoaWxkcmVuLnB1c2godG1wKTtcbiAgICAgICAgICAgICB9ICk7XG4gICAgICAgICAgIGVyQ2hhaWxkcy5uYW1lID0gZXJDaGFpbGRzLm5hbWUgKycoJysgZXJDaGFpbGRzLmNoaWxkcmVuLmxlbmd0aCArJyknO1xuICAgICAgICAgICBlclBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGVyQ2hhaWxkcyk7XG4gICAgICB9KTtcbiAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goYXNzb2NpYXRlZFJvdXRlcnNQcm9taXNlKTtcblxuICAgICAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShyYXdFUlBvbGljeSwgJ2lkZW50aXRpZXMnKTtcbiAgICAgICAgICBsZXQgaWRzID0gW107XG4gICAgICAgICAgY29uc3QgaWRwcm9taXNlID0geml0aVNlcnZpY2UuZ2V0KHVybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZHMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHByb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgfSAvLyBlbmQgZm9yIGxvb3BcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICBjb25zdCBpZENoaWxkcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIGlkQ2hpbGRzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgIGlkcy5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICAgICAgIGlkQ2hpbGRzLmNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVJZGVudGl0eShpZE9iKSk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlkQ2hpbGRzLm5hbWUgPSBcIkFjY2Vzc2libGUgSWRlbnRpdGllcyhcIisgaWRDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBlclBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGlkQ2hpbGRzKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChpZHByb21pc2UpO1xuICAgICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgICB9ICk7XG5cbiAgICAgICB9KTtcblxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH0gLy8gZW5kXG5cbiAgYXN5bmMgcHJvY2Vzc1NlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIHNlcnZpY2VFclBvbGljeU5vZGUsXG4gICAgICAgIG5ldHdvcmtHcmFwaCxcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgICkge1xuICAgICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgICAgY29uc3QgcmF3U2VydmljZUVSUG9saWN5ID0gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHNlcnZpY2VFclBvbGljeU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3U2VydmljZUVSUG9saWN5LCAnZWRnZS1yb3V0ZXJzJyk7XG4gICAgICAgICAgbGV0IHJvdXRlcnMgPSBbXTtcbiAgICAgICAgICBjb25zdCBlcnByb21pc2UgPSB6aXRpU2VydmljZS5nZXQodXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJvdXRlcnMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlcnMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBsb29wXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgZXJDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBlckNoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICByb3V0ZXJzLmZvckVhY2goIChlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkT2IgPSBuZXcgRVJvdXRlcigpO1xuICAgICAgICAgICAgICAgIGlkT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgaWRPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgaWRPYi5uYW1lID0gZXIubmFtZTtcbiAgICAgICAgICAgICAgICBpZE9iLnR5cGUgPSAnRWRnZSBSb3V0ZXInO1xuICAgICAgICAgICAgICAgIGVyQ2hpbGRzLmNoaWxkcmVuLnB1c2goaWRPYik7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBlckNoaWxkcy5uYW1lID0gXCJFZGdlIFJvdXRlcnMoXCIrIGVyQ2hpbGRzLmNoaWxkcmVuLmxlbmd0aCArJyknO1xuICAgICAgICAgICAgICAgc2VydmljZUVyUG9saWN5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goZXJDaGlsZHMpO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChlcnByb21pc2UpO1xuXG4gICAgICAgICAgY29uc3Qgc2VydmljZXNfcGFnaW5nQiA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcblxuICAgICAgICAgIGNvbnN0IHVybEIgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShyYXdTZXJ2aWNlRVJQb2xpY3ksICdzZXJ2aWNlcycpO1xuICAgICAgICAgIGxldCBzZXJBcnJheSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHNlcnByb21pc2UgPSB6aXRpU2VydmljZS5nZXQodXJsQiwgc2VydmljZXNfcGFnaW5nQiwgW10pXG4gICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc2VyQXJyYXkgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzQiA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmdCLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZUIgPSB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsQixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmdCLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgKSAudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcGFnZVJlc3VsdC5kYXRhLmZvckVhY2goKHNlcnYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyQXJyYXkucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlc0IucHVzaCh0bXBfcHJvbWlzZUIpO1xuICAgICAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2godG1wX3Byb21pc2VCKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBsb29wXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlc0IpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgIGNvbnN0IHNyQ2hpbGRzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgICAgICAgc3JDaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgc2VyQXJyYXkuZm9yRWFjaCggKHNyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3JPYiA9IG5ldyBTZXJ2aWNlKCk7XG4gICAgICAgICAgICAgICAgc3JPYi5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICBzck9iLnV1aWQgPSBzci5pZDtcbiAgICAgICAgICAgICAgICBzck9iLm5hbWUgPSBzci5uYW1lO1xuICAgICAgICAgICAgICAgIHNyT2IudHlwZSA9ICdTZXJ2aWNlJztcbiAgICAgICAgICAgICAgICBzckNoaWxkcy5jaGlsZHJlbi5wdXNoKHNyT2IpO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBzckNoaWxkcy5uYW1lID0gXCJTZXJ2aWNlcyhcIisgc3JDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgIHNlcnZpY2VFclBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKHNyQ2hpbGRzKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChzZXJwcm9taXNlKTtcblxuICAgICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgnRG9uZScpO1xuICAgICAgICAgfSApO1xuXG4gICAgICAgfSk7XG5cbiAgICAgICAgbmV0d29ya0dyYXBoID0gZDMuaGllcmFyY2h5KG5ldHdvcmtHcmFwaC5kYXRhLCBmdW5jdGlvbiAobmQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZC5jaGlsZHJlbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBbbmV0d29ya0dyYXBoLCB0aGlzLnVuaXFJZF07XG4gICAgfSAvLyBlbmRcbn0gLy8gZW5kIG9mIGNsYXNzXG4iXX0=
|