@sumaris-net/ngx-components 1.23.44 → 2.0.0-rc3
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/doc/build.md +2 -2
- package/doc/changelog.md +8 -0
- package/esm2020/public_api.mjs +278 -0
- package/esm2020/public_test_api.mjs +46 -0
- package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
- package/esm2020/src/app/admin/admin.module.mjs +34 -0
- package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
- package/esm2020/src/app/admin/services/person.service.mjs +161 -0
- package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
- package/esm2020/src/app/admin/users/list/users.mjs +233 -0
- package/esm2020/src/app/admin/users/list/users.module.mjs +58 -0
- package/esm2020/src/app/core/about/modal-about.mjs +71 -0
- package/esm2020/src/app/core/account/account.mjs +230 -0
- package/esm2020/src/app/core/auth/form/form-auth.mjs +131 -0
- package/esm2020/src/app/core/auth/modal/modal-auth.mjs +72 -0
- package/esm2020/src/app/core/core.module.mjs +223 -0
- package/esm2020/src/app/core/core.testing.module.mjs +86 -0
- package/esm2020/src/app/core/form/editor.class.mjs +672 -0
- package/esm2020/src/app/core/form/entity-editor-modal.class.mjs +407 -0
- package/esm2020/src/app/core/form/entity-editor.class.mjs +646 -0
- package/esm2020/src/app/core/form/entity-metadata.component.mjs +25 -0
- package/esm2020/src/app/core/form/form-buttons-bar.component.mjs +71 -0
- package/esm2020/src/app/core/form/form.class.mjs +337 -0
- package/esm2020/src/app/core/form/form.utils.mjs +299 -0
- package/esm2020/src/app/core/form/list.form.mjs +222 -0
- package/esm2020/src/app/core/form/properties/properties.form.mjs +129 -0
- package/esm2020/src/app/core/form/properties/property.validator.mjs +23 -0
- package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +90 -0
- package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +39 -0
- package/esm2020/src/app/core/graphql/graphql.module.mjs +22 -0
- package/esm2020/src/app/core/graphql/graphql.service.mjs +730 -0
- package/esm2020/src/app/core/graphql/graphql.utils.mjs +117 -0
- package/esm2020/src/app/core/home/home.mjs +257 -0
- package/esm2020/src/app/core/icon/icon.component.mjs +41 -0
- package/esm2020/src/app/core/icon/icon.module.mjs +29 -0
- package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +337 -0
- package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +33 -0
- package/esm2020/src/app/core/menu/menu.component.mjs +317 -0
- package/{esm2015/src/app/core/menu/menu.model.js → esm2020/src/app/core/menu/menu.model.mjs} +0 -0
- package/esm2020/src/app/core/menu/menu.module.mjs +45 -0
- package/{esm2015/src/app/core/menu/menu.service.js → esm2020/src/app/core/menu/menu.service.mjs} +9 -7
- package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +27 -0
- package/esm2020/src/app/core/peer/select-peer.modal.mjs +130 -0
- package/esm2020/src/app/core/peer/select-peer.module.mjs +35 -0
- package/esm2020/src/app/core/register/confirm/confirm.mjs +81 -0
- package/esm2020/src/app/core/register/form/form-register.mjs +181 -0
- package/esm2020/src/app/core/register/modal/modal-register.mjs +52 -0
- package/esm2020/src/app/core/register/register.module.mjs +42 -0
- package/esm2020/src/app/core/services/account.service.mjs +1112 -0
- package/esm2020/src/app/core/services/auth-guard.service.mjs +71 -0
- package/esm2020/src/app/core/services/base-entity-service.class.mjs +432 -0
- package/esm2020/src/app/core/services/base-graphql-service.class.mjs +219 -0
- package/{esm2015/src/app/core/services/base58.js → esm2020/src/app/core/services/base58.mjs} +0 -0
- package/{esm2015/src/app/core/services/config/core.config.js → esm2020/src/app/core/services/config/core.config.mjs} +0 -0
- package/esm2020/src/app/core/services/config.service.mjs +354 -0
- package/{esm2015/src/app/core/services/crypto.service.js → esm2020/src/app/core/services/crypto.service.mjs} +7 -5
- package/{esm2015/src/app/core/services/errors.js → esm2020/src/app/core/services/errors.mjs} +0 -0
- package/esm2020/src/app/core/services/local-settings.service.mjs +442 -0
- package/esm2020/src/app/core/services/model/account.model.mjs +50 -0
- package/esm2020/src/app/core/services/model/config.model.mjs +89 -0
- package/esm2020/src/app/core/services/model/department.model.mjs +30 -0
- package/esm2020/src/app/core/services/model/entity.decorators.mjs +107 -0
- package/esm2020/src/app/core/services/model/entity.model.mjs +242 -0
- package/{esm2015/src/app/core/services/model/filter.model.js → esm2020/src/app/core/services/model/filter.model.mjs} +0 -0
- package/{esm2015/src/app/core/services/model/history.model.js → esm2020/src/app/core/services/model/history.model.mjs} +0 -0
- package/{esm2015/src/app/core/services/model/model.enum.js → esm2020/src/app/core/services/model/model.enum.mjs} +0 -0
- package/esm2020/src/app/core/services/model/peer.model.mjs +68 -0
- package/esm2020/src/app/core/services/model/person.model.mjs +83 -0
- package/esm2020/src/app/core/services/model/referential.model.mjs +145 -0
- package/esm2020/src/app/core/services/model/settings.model.mjs +75 -0
- package/esm2020/src/app/core/services/network.service.mjs +595 -0
- package/esm2020/src/app/core/services/network.utils.mjs +16 -0
- package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
- package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
- package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
- package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
- package/esm2020/src/app/core/services/platform.service.mjs +476 -0
- package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +422 -0
- package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
- package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
- package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
- package/esm2020/src/app/core/services/validator/account.validator.mjs +52 -0
- package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
- package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
- package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +29 -0
- package/esm2020/src/app/core/settings/settings.page.mjs +290 -0
- package/esm2020/src/app/core/table/actions-column.component.mjs +96 -0
- package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +394 -0
- package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
- package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
- package/esm2020/src/app/core/table/table.class.mjs +1666 -0
- package/esm2020/src/app/core/table/table.utils.mjs +13 -0
- package/esm2020/src/app/core/table/testing/table.testing.mjs +264 -0
- package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
- package/esm2020/src/app/core/text-popover/testing/text-popover.testing.mjs +37 -0
- package/esm2020/src/app/core/text-popover/testing/text-popover.testing.module.mjs +45 -0
- package/esm2020/src/app/core/text-popover/text-form.component.mjs +84 -0
- package/esm2020/src/app/core/text-popover/text-popover.component.mjs +92 -0
- package/esm2020/src/app/shared/alerts.mjs +238 -0
- package/esm2020/src/app/shared/audio/audio.mjs +201 -0
- package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
- package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
- package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
- package/{esm2015/src/app/shared/constants.js → esm2020/src/app/shared/constants.mjs} +2 -1
- package/esm2020/src/app/shared/dates.mjs +134 -0
- package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
- package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
- package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
- package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
- package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
- package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
- package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
- package/esm2020/src/app/shared/events.mjs +64 -0
- package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
- package/esm2020/src/app/shared/file/file.service.mjs +117 -0
- package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
- package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
- package/{esm2015/src/app/shared/file/uri.utils.js → esm2020/src/app/shared/file/uri.utils.mjs} +0 -0
- package/{esm2015/src/app/shared/focusable.js → esm2020/src/app/shared/focusable.mjs} +0 -0
- package/esm2020/src/app/shared/form/field.component.mjs +244 -0
- package/{esm2015/src/app/shared/form/field.model.js → esm2020/src/app/shared/form/field.model.mjs} +1 -1
- package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
- package/esm2020/src/app/shared/forms.mjs +374 -0
- package/esm2020/src/app/shared/functions.mjs +430 -0
- package/{esm2015/src/app/shared/gesture/gesture-config.js → esm2020/src/app/shared/gesture/gesture-config.mjs} +7 -5
- package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
- package/{esm2015/src/app/shared/graph/colors.utils.js → esm2020/src/app/shared/graph/colors.utils.mjs} +0 -0
- package/esm2020/src/app/shared/graph/graph-colors.mjs +254 -0
- package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
- package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
- package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
- package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
- package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
- package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
- package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +279 -0
- package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +46 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +89 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +33 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
- package/esm2020/src/app/shared/image/image.model.mjs +2 -0
- package/esm2020/src/app/shared/image/image.module.mjs +29 -0
- package/esm2020/src/app/shared/image/image.service.mjs +99 -0
- package/{esm2015/src/app/shared/inputs.js → esm2020/src/app/shared/inputs.mjs} +4 -4
- package/{esm2015/src/app/shared/interceptors/progess.interceptor.js → esm2020/src/app/shared/interceptors/progess.interceptor.mjs} +0 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +836 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
- package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +205 -0
- package/esm2020/src/app/shared/material/badge/badge.directive.mjs +157 -0
- package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
- package/esm2020/src/app/shared/material/badge/badge.test.mjs +26 -0
- package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
- package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
- package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
- package/esm2020/src/app/shared/material/chips/material.chips.mjs +691 -0
- package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +136 -0
- package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
- package/esm2020/src/app/shared/material/datetime/material.date.mjs +388 -0
- package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +327 -0
- package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +434 -0
- package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +110 -0
- package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +111 -0
- package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
- package/{esm2015/src/app/shared/material/duration/duration.utils.js → esm2020/src/app/shared/material/duration/duration.utils.mjs} +0 -0
- package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
- package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
- package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
- package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
- package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +74 -0
- package/{esm2015/src/app/shared/material/material.animations.js → esm2020/src/app/shared/material/material.animations.mjs} +0 -0
- package/esm2020/src/app/shared/material/material.module.mjs +224 -0
- package/esm2020/src/app/shared/material/material.testing.module.mjs +145 -0
- package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
- package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
- package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
- package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
- package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
- package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
- package/{esm2015/src/app/shared/material/numpad/numpad.model.js → esm2020/src/app/shared/material/numpad/numpad.model.mjs} +1 -1
- package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
- package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
- package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +42 -0
- package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
- package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +334 -0
- package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +51 -0
- package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +65 -0
- package/esm2020/src/app/shared/observables.mjs +96 -0
- package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +135 -0
- package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
- package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +49 -0
- package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +42 -0
- package/{esm2015/src/app/shared/pipes/date-from-now.pipe.js → esm2020/src/app/shared/pipes/date-from-now.pipe.mjs} +13 -12
- package/{esm2015/src/app/shared/pipes/duration.pipe.js → esm2020/src/app/shared/pipes/duration.pipe.mjs} +13 -12
- package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
- package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
- package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
- package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
- package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
- package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
- package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
- package/{esm2015/src/app/shared/pipes/number-format.pipe.js → esm2020/src/app/shared/pipes/number-format.pipe.mjs} +14 -9
- package/esm2020/src/app/shared/pipes/pipes.module.mjs +210 -0
- package/esm2020/src/app/shared/pipes/property.pipes.mjs +96 -0
- package/esm2020/src/app/shared/pipes/string.pipes.mjs +69 -0
- package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
- package/esm2020/src/app/shared/platforms.mjs +49 -0
- package/esm2020/src/app/shared/services/entity-service.class.mjs +7 -0
- package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
- package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +331 -0
- package/esm2020/src/app/shared/services/progress-bar.service.mjs +32 -0
- package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
- package/esm2020/src/app/shared/services/startable-service.class.mjs +105 -0
- package/esm2020/src/app/shared/services/storage/storage.service.mjs +132 -0
- package/esm2020/src/app/shared/services/storage/storage.utils.mjs +13 -0
- package/esm2020/src/app/shared/services/translate-context.service.mjs +81 -0
- package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
- package/esm2020/src/app/shared/services.mjs +62 -0
- package/esm2020/src/app/shared/shared-routing.module.mjs +63 -0
- package/esm2020/src/app/shared/shared.module.mjs +208 -0
- package/esm2020/src/app/shared/shared.testing.module.mjs +76 -0
- package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
- package/esm2020/src/app/shared/toast/toast.testing.mjs +51 -0
- package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/toast/toasts.mjs +144 -0
- package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
- package/esm2020/src/app/shared/toolbar/toolbar.mjs +226 -0
- package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
- package/{esm2015/src/app/shared/types.js → esm2020/src/app/shared/types.mjs} +0 -0
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
- package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
- package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
- package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
- package/esm2020/src/app/shared/validator/validators.mjs +544 -0
- package/{esm2015/src/app/shared/version/versions.js → esm2020/src/app/shared/version/versions.mjs} +0 -0
- package/esm2020/src/app/social/job/job.model.mjs +26 -0
- package/esm2020/src/app/social/job/job.module.mjs +35 -0
- package/esm2020/src/app/social/job/job.service.mjs +71 -0
- package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +210 -0
- package/esm2020/src/app/social/job/progression/job-progression.list.mjs +22 -0
- package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +53 -0
- package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +55 -0
- package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
- package/esm2020/src/app/social/message/message.form.mjs +81 -0
- package/esm2020/src/app/social/message/message.modal.mjs +93 -0
- package/esm2020/src/app/social/message/message.model.mjs +65 -0
- package/esm2020/src/app/social/message/message.module.mjs +35 -0
- package/esm2020/src/app/social/message/message.service.mjs +84 -0
- package/{esm2015/src/app/social/social.errors.js → esm2020/src/app/social/social.errors.mjs} +0 -0
- package/esm2020/src/app/social/social.module.mjs +47 -0
- package/esm2020/src/app/social/social.testing.module.mjs +51 -0
- package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +108 -0
- package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +212 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +228 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +107 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
- package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
- package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
- package/esm2020/src/app/social/user-event/user-event.service.mjs +486 -0
- package/{esm2015/src/app/vendor.js → esm2020/src/app/vendor.mjs} +3 -3
- package/esm2020/src/environments/environment.class.mjs +5 -0
- package/esm2020/src/environments/environment.mjs +86 -0
- package/esm2020/sumaris-net.ngx-components.mjs +5 -0
- package/fesm2015/sumaris-net.ngx-components.mjs +33173 -0
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
- package/fesm2020/sumaris-net.ngx-components.mjs +32440 -0
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +27 -32
- package/public_api.d.ts +29 -31
- package/public_test_api.d.ts +37 -0
- package/resources/README.md +8 -0
- package/src/app/admin/admin-routing.module.d.ts +7 -0
- package/src/app/admin/admin.module.d.ts +7 -0
- package/src/app/admin/services/person.service.d.ts +3 -0
- package/src/app/admin/services/validator/person.validator.d.ts +8 -5
- package/src/app/admin/users/list/users.d.ts +11 -7
- package/src/app/admin/users/list/users.module.d.ts +14 -0
- package/src/app/core/about/modal-about.d.ts +3 -0
- package/src/app/core/account/account.d.ts +11 -8
- package/src/app/core/auth/form/form-auth.d.ts +6 -3
- package/src/app/core/auth/modal/modal-auth.d.ts +3 -0
- package/src/app/core/core.module.d.ts +36 -0
- package/src/app/core/core.testing.module.d.ts +10 -0
- package/src/app/core/form/editor.class.d.ts +6 -1
- package/src/app/core/form/entity-editor-modal.class.d.ts +7 -4
- package/src/app/core/form/entity-editor.class.d.ts +4 -1
- package/src/app/core/form/entity-metadata.component.d.ts +3 -0
- package/src/app/core/form/form-buttons-bar.component.d.ts +3 -0
- package/src/app/core/form/form.class.d.ts +12 -9
- package/src/app/core/form/form.utils.d.ts +5 -5
- package/src/app/core/form/list.form.d.ts +10 -7
- package/src/app/core/form/properties/properties.form.d.ts +43 -0
- package/src/app/core/form/properties/property.validator.d.ts +13 -0
- package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
- package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
- package/src/app/core/graphql/graphql.module.d.ts +5 -0
- package/src/app/core/graphql/graphql.service.d.ts +9 -2
- package/src/app/core/graphql/graphql.utils.d.ts +8 -0
- package/src/app/core/home/home.d.ts +4 -1
- package/src/app/core/icon/icon.component.d.ts +5 -2
- package/src/app/core/icon/icon.module.d.ts +7 -0
- package/src/app/core/install/install-upgrade-card.component.d.ts +5 -2
- package/src/app/core/install/install-upgrade-card.module.d.ts +10 -0
- package/src/app/core/menu/menu.component.d.ts +7 -5
- package/src/app/core/menu/menu.module.d.ts +8 -0
- package/src/app/core/menu/menu.service.d.ts +3 -0
- package/src/app/core/offline/update-offline-mode-card.component.d.ts +3 -0
- package/src/app/core/peer/select-peer.modal.d.ts +7 -4
- package/src/app/core/peer/select-peer.module.d.ts +9 -0
- package/src/app/core/register/confirm/confirm.d.ts +3 -0
- package/src/app/core/register/form/form-register.d.ts +10 -7
- package/src/app/core/register/modal/modal-register.d.ts +3 -0
- package/src/app/core/register/register.module.d.ts +12 -0
- package/src/app/core/services/account.service.d.ts +5 -2
- package/src/app/core/services/auth-guard.service.d.ts +3 -0
- package/src/app/core/services/base-entity-service.class.d.ts +3 -0
- package/src/app/core/services/base-graphql-service.class.d.ts +3 -0
- package/src/app/core/services/config.service.d.ts +4 -1
- package/src/app/core/services/crypto.service.d.ts +3 -0
- package/src/app/core/services/local-settings.service.d.ts +5 -1
- package/src/app/core/services/model/referential.model.d.ts +1 -1
- package/src/app/core/services/network.service.d.ts +6 -5
- package/src/app/core/services/pipes/account.pipes.d.ts +7 -0
- package/src/app/core/services/pipes/department-to-string.pipe.d.ts +4 -0
- package/src/app/core/services/pipes/person-to-string.pipe.d.ts +4 -0
- package/src/app/core/services/pipes/usage-mode.pipes.d.ts +7 -0
- package/src/app/core/services/platform.service.d.ts +22 -21
- package/src/app/core/services/storage/entities-storage.service.d.ts +5 -2
- package/src/app/core/services/storage/entity-store.class.d.ts +3 -3
- package/src/app/core/services/testing/referential.validator.d.ts +8 -5
- package/src/app/core/services/validator/account.validator.d.ts +6 -3
- package/src/app/core/services/validator/base.validator.class.d.ts +8 -5
- package/src/app/core/services/validator/local-settings.validator.d.ts +8 -5
- package/src/app/core/services/validator/user-settings.validator.d.ts +6 -3
- package/src/app/core/settings/settings.page.d.ts +8 -5
- package/src/app/core/table/actions-column.component.d.ts +3 -0
- package/src/app/core/table/entities-table-datasource.class.d.ts +16 -15
- package/src/app/core/table/memory-table.class.d.ts +3 -0
- package/src/app/core/table/table-select-columns.component.d.ts +4 -5
- package/src/app/core/table/table.class.d.ts +52 -34
- package/src/app/core/table/table.utils.d.ts +2 -1
- package/src/app/core/table/testing/table.testing.d.ts +13 -15
- package/src/app/core/table/testing/table.testing.module.d.ts +9 -0
- package/src/app/core/text-popover/testing/text-popover.testing.d.ts +4 -1
- package/src/app/core/text-popover/testing/text-popover.testing.module.d.ts +9 -0
- package/src/app/core/text-popover/text-form.component.d.ts +7 -4
- package/src/app/core/text-popover/text-popover.component.d.ts +3 -0
- package/src/app/shared/alerts.d.ts +4 -4
- package/src/app/shared/audio/audio.d.ts +20 -11
- package/src/app/shared/audio/audio.testing.d.ts +13 -0
- package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
- package/src/app/shared/capacitor/keyboard.d.ts +16 -0
- package/src/app/shared/capacitor/plugins.d.ts +7 -0
- package/src/app/shared/constants.d.ts +1 -0
- package/src/app/shared/debug/debug.component.d.ts +13 -0
- package/src/app/shared/debug/debug.module.d.ts +12 -0
- package/src/app/shared/directives/autofocus.directive.d.ts +9 -7
- package/src/app/shared/directives/autotitle.directive.d.ts +3 -0
- package/src/app/shared/directives/directives.module.d.ts +10 -0
- package/src/app/shared/directives/drag-and-drop.directive.d.ts +3 -0
- package/src/app/shared/directives/ng-var.directive.d.ts +3 -0
- package/src/app/shared/directives/resizable/resizable.component.d.ts +3 -0
- package/src/app/shared/directives/resizable/resizable.directive.d.ts +3 -0
- package/src/app/shared/directives/resizable/resizable.module.d.ts +6 -0
- package/src/app/shared/file/file.service.d.ts +3 -0
- package/src/app/shared/file/file.utils.d.ts +1 -1
- package/src/app/shared/form/field.component.d.ts +12 -3
- package/src/app/shared/form/field.model.d.ts +2 -2
- package/src/app/shared/form/loading-spinner.d.ts +3 -0
- package/src/app/shared/forms.d.ts +13 -13
- package/src/app/shared/gesture/gesture-config.d.ts +3 -0
- package/src/app/shared/gesture/hammer.utils.d.ts +11 -11
- package/src/app/shared/graph/graph-colors.d.ts +8 -7
- package/src/app/shared/guard/component-dirty.guard.d.ts +3 -0
- package/src/app/shared/help/help.modal.d.ts +4 -1
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +3 -0
- package/src/app/shared/hotkeys/hotkeys.service.d.ts +4 -1
- package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +9 -0
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +77 -0
- package/src/app/shared/image/gallery/image-gallery.module.d.ts +12 -0
- package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
- package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
- package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +15 -0
- package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
- package/src/app/shared/image/image.model.d.ts +5 -0
- package/src/app/shared/image/image.module.d.ts +8 -0
- package/src/app/shared/image/image.service.d.ts +32 -0
- package/src/app/shared/inputs.d.ts +3 -3
- package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +11 -40
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +19 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +12 -9
- package/src/app/shared/material/badge/badge.directive.d.ts +28 -0
- package/src/app/shared/material/badge/badge.module.d.ts +10 -0
- package/src/app/shared/material/badge/badge.test.d.ts +12 -0
- package/src/app/shared/material/boolean/boolean.module.d.ts +17 -0
- package/src/app/shared/material/boolean/material.boolean.d.ts +7 -4
- package/src/app/shared/material/chips/chips.module.d.ts +19 -0
- package/src/app/shared/material/chips/material.chips.d.ts +11 -8
- package/src/app/shared/material/chips/testing/chips.test.d.ts +8 -5
- package/src/app/shared/material/datetime/datetime.module.d.ts +22 -0
- package/src/app/shared/material/datetime/material.date.d.ts +19 -18
- package/src/app/shared/material/datetime/material.dateshort.d.ts +10 -9
- package/src/app/shared/material/datetime/material.datetime.d.ts +21 -20
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +11 -9
- package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +11 -9
- package/src/app/shared/material/duration/duration.module.d.ts +16 -0
- package/src/app/shared/material/duration/material.duration.d.ts +8 -5
- package/src/app/shared/material/latlong/material.latlong.d.ts +8 -5
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +17 -0
- package/src/app/shared/material/latlong/testing/latlong.test.d.ts +10 -7
- package/src/app/shared/material/material.module.d.ts +43 -0
- package/src/app/shared/material/material.testing.module.d.ts +19 -0
- package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +3 -0
- package/src/app/shared/material/numpad/numpad.component.d.ts +4 -1
- package/src/app/shared/material/numpad/numpad.container.d.ts +5 -2
- package/src/app/shared/material/numpad/numpad.content.d.ts +3 -0
- package/src/app/shared/material/numpad/numpad.directive.d.ts +4 -1
- package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -0
- package/src/app/shared/material/numpad/numpad.model.d.ts +1 -1
- package/src/app/shared/material/numpad/numpad.module.d.ts +14 -0
- package/src/app/shared/material/numpad/testing/numpad.test.d.ts +7 -4
- package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +3 -0
- package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +3 -0
- package/src/app/shared/material/swipe/material.swipe.d.ts +6 -3
- package/src/app/shared/material/swipe/swipe.module.d.ts +13 -0
- package/src/app/shared/material/swipe/testing/swipe.test.d.ts +7 -4
- package/src/app/shared/pipes/arrays.pipe.d.ts +17 -0
- package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
- package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +4 -0
- package/src/app/shared/pipes/date-format.pipe.d.ts +4 -0
- package/src/app/shared/pipes/date-from-now.pipe.d.ts +4 -0
- package/src/app/shared/pipes/duration.pipe.d.ts +4 -0
- package/src/app/shared/pipes/file-size.pipe.d.ts +3 -0
- package/src/app/shared/pipes/form.pipes.d.ts +18 -5
- package/src/app/shared/pipes/highlight.pipe.d.ts +4 -0
- package/src/app/shared/pipes/latlong-format.pipe.d.ts +7 -0
- package/src/app/shared/pipes/maps.pipe.d.ts +10 -0
- package/src/app/shared/pipes/math.pipes.d.ts +10 -0
- package/src/app/shared/pipes/ng-init.pipe.d.ts +3 -0
- package/src/app/shared/pipes/number-format.pipe.d.ts +4 -0
- package/src/app/shared/pipes/pipes.module.d.ts +24 -0
- package/src/app/shared/pipes/property.pipes.d.ts +6 -0
- package/src/app/shared/pipes/string.pipes.d.ts +11 -0
- package/src/app/shared/pipes/translate-context.pipe.d.ts +7 -0
- package/src/app/shared/platforms.d.ts +1 -0
- package/src/app/shared/services/memory-entity-service.class.d.ts +3 -0
- package/src/app/shared/services/progress-bar.service.d.ts +4 -1
- package/src/app/shared/services/startable-observable-service.class.d.ts +1 -1
- package/src/app/shared/services/startable-service.class.d.ts +1 -1
- package/src/app/shared/services/storage/storage.service.d.ts +23 -0
- package/src/app/shared/services/storage/storage.utils.d.ts +19 -0
- package/src/app/shared/services/translate-context.service.d.ts +3 -0
- package/src/app/shared/services/validator-service.class.d.ts +2 -2
- package/src/app/shared/shared-routing.module.d.ts +7 -0
- package/src/app/shared/shared.module.d.ts +23 -0
- package/src/app/shared/shared.testing.module.d.ts +12 -0
- package/src/app/shared/testing/tests.page.d.ts +3 -0
- package/src/app/shared/toast/toast.testing.d.ts +6 -5
- package/src/app/shared/toast/toast.testing.module.d.ts +9 -0
- package/src/app/shared/toast/toasts.d.ts +5 -2
- package/src/app/shared/toolbar/modal-toolbar.d.ts +5 -2
- package/src/app/shared/toolbar/toolbar.d.ts +9 -5
- package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
- package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +4 -1
- package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +9 -0
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +3 -0
- package/src/app/shared/upload-file/upload-file.component.d.ts +3 -0
- package/src/app/shared/validator/form-error-adapter.class.d.ts +3 -0
- package/src/app/shared/validator/validators.d.ts +9 -9
- package/src/app/social/job/job.module.d.ts +9 -0
- package/src/app/social/job/job.service.d.ts +3 -0
- package/src/app/social/job/progression/job-progression.icon.d.ts +4 -1
- package/src/app/social/job/progression/job-progression.list.d.ts +3 -0
- package/src/app/social/job/testing/job-progression.testing.d.ts +3 -0
- package/src/app/social/job/testing/job-progression.testing.service.d.ts +3 -0
- package/src/app/social/job/testing/job.testing.module.d.ts +9 -0
- package/src/app/social/message/message.form.d.ts +5 -2
- package/src/app/social/message/message.modal.d.ts +5 -2
- package/src/app/social/message/message.module.d.ts +9 -0
- package/src/app/social/message/message.service.d.ts +3 -0
- package/src/app/social/social.module.d.ts +10 -0
- package/src/app/social/social.testing.module.d.ts +9 -0
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -1
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +7 -4
- package/src/app/social/user-event/testing/user-event.testing.d.ts +3 -0
- package/src/app/social/user-event/testing/user-event.testing.model.d.ts +1 -0
- package/src/app/social/user-event/testing/user-event.testing.module.d.ts +9 -0
- package/src/app/social/user-event/testing/user-event.testing.service.d.ts +5 -1
- package/src/app/social/user-event/user-event.model.d.ts +3 -2
- package/src/app/social/user-event/user-event.module.d.ts +10 -0
- package/src/app/social/user-event/user-event.service.d.ts +16 -11
- package/src/assets/audio/beep-notification.mp3 +0 -0
- package/src/assets/i18n/fr.json +9 -2
- package/src/environments/environment.class.d.ts +2 -0
- package/src/environments/environment.d.ts +1 -1
- package/src/theme/_icons.scss +1 -1
- package/src/theme/_material.globals.scss +29 -31
- package/src/theme/_material.scss +32 -6
- package/src/theme/_mixins.scss +4 -4
- package/src/theme/_ngx-components.scss +27 -0
- package/src/theme/_print.scss +24 -0
- package/bundles/sumaris-net.ngx-components.umd.js +0 -35755
- package/bundles/sumaris-net.ngx-components.umd.js.map +0 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +0 -25
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +0 -1
- package/esm2015/public_api.js +0 -245
- package/esm2015/src/app/admin/admin-routing.module.js +0 -34
- package/esm2015/src/app/admin/admin.module.js +0 -34
- package/esm2015/src/app/admin/services/filter/person.filter.js +0 -59
- package/esm2015/src/app/admin/services/person.service.js +0 -175
- package/esm2015/src/app/admin/services/validator/person.validator.js +0 -37
- package/esm2015/src/app/admin/users/list/users.js +0 -216
- package/esm2015/src/app/core/about/modal-about.js +0 -63
- package/esm2015/src/app/core/account/account.js +0 -240
- package/esm2015/src/app/core/auth/form/form-auth.js +0 -134
- package/esm2015/src/app/core/auth/modal/modal-auth.js +0 -78
- package/esm2015/src/app/core/core.module.js +0 -127
- package/esm2015/src/app/core/core.testing.module.js +0 -51
- package/esm2015/src/app/core/form/editor.class.js +0 -698
- package/esm2015/src/app/core/form/entity-editor-modal.class.js +0 -422
- package/esm2015/src/app/core/form/entity-editor.class.js +0 -676
- package/esm2015/src/app/core/form/entity-metadata.component.js +0 -22
- package/esm2015/src/app/core/form/form-buttons-bar.component.js +0 -63
- package/esm2015/src/app/core/form/form.class.js +0 -342
- package/esm2015/src/app/core/form/form.utils.js +0 -299
- package/esm2015/src/app/core/form/list.form.js +0 -219
- package/esm2015/src/app/core/form/properties.form.js +0 -119
- package/esm2015/src/app/core/graphql/graphql.module.js +0 -18
- package/esm2015/src/app/core/graphql/graphql.service.js +0 -734
- package/esm2015/src/app/core/graphql/graphql.utils.js +0 -106
- package/esm2015/src/app/core/home/home.js +0 -265
- package/esm2015/src/app/core/icon/icon.component.js +0 -32
- package/esm2015/src/app/core/icon/icon.module.js +0 -26
- package/esm2015/src/app/core/install/install-upgrade-card.component.js +0 -358
- package/esm2015/src/app/core/menu/menu.component.js +0 -329
- package/esm2015/src/app/core/menu/menu.module.js +0 -28
- package/esm2015/src/app/core/offline/update-offline-mode-card.component.js +0 -26
- package/esm2015/src/app/core/peer/select-peer.modal.js +0 -134
- package/esm2015/src/app/core/register/confirm/confirm.js +0 -86
- package/esm2015/src/app/core/register/form/form-register.js +0 -172
- package/esm2015/src/app/core/register/modal/modal-register.js +0 -55
- package/esm2015/src/app/core/services/account.service.js +0 -1165
- package/esm2015/src/app/core/services/auth-guard.service.js +0 -77
- package/esm2015/src/app/core/services/base-entity-service.class.js +0 -454
- package/esm2015/src/app/core/services/base-graphql-service.class.js +0 -221
- package/esm2015/src/app/core/services/config.service.js +0 -385
- package/esm2015/src/app/core/services/local-settings.service.js +0 -460
- package/esm2015/src/app/core/services/model/account.model.js +0 -50
- package/esm2015/src/app/core/services/model/config.model.js +0 -89
- package/esm2015/src/app/core/services/model/department.model.js +0 -30
- package/esm2015/src/app/core/services/model/entity.decorators.js +0 -104
- package/esm2015/src/app/core/services/model/entity.model.js +0 -245
- package/esm2015/src/app/core/services/model/peer.model.js +0 -68
- package/esm2015/src/app/core/services/model/person.model.js +0 -83
- package/esm2015/src/app/core/services/model/referential.model.js +0 -147
- package/esm2015/src/app/core/services/model/settings.model.js +0 -75
- package/esm2015/src/app/core/services/network.service.js +0 -631
- package/esm2015/src/app/core/services/network.utils.js +0 -19
- package/esm2015/src/app/core/services/pipes/account.pipes.js +0 -28
- package/esm2015/src/app/core/services/pipes/department-to-string.pipe.js +0 -18
- package/esm2015/src/app/core/services/pipes/person-to-string.pipe.js +0 -18
- package/esm2015/src/app/core/services/pipes/usage-mode.pipes.js +0 -27
- package/esm2015/src/app/core/services/platform.service.js +0 -549
- package/esm2015/src/app/core/services/storage/entities-storage.service.js +0 -452
- package/esm2015/src/app/core/services/storage/entity-store.class.js +0 -461
- package/esm2015/src/app/core/services/testing/referential-filter.model.js +0 -23
- package/esm2015/src/app/core/services/testing/referential.validator.js +0 -44
- package/esm2015/src/app/core/services/validator/account.validator.js +0 -55
- package/esm2015/src/app/core/services/validator/base.validator.class.js +0 -48
- package/esm2015/src/app/core/services/validator/local-settings.validator.js +0 -72
- package/esm2015/src/app/core/services/validator/user-settings.validator.js +0 -30
- package/esm2015/src/app/core/settings/settings.page.js +0 -305
- package/esm2015/src/app/core/table/actions-column.component.js +0 -74
- package/esm2015/src/app/core/table/entities-table-datasource.class.js +0 -405
- package/esm2015/src/app/core/table/memory-table.class.js +0 -59
- package/esm2015/src/app/core/table/table-select-columns.component.js +0 -44
- package/esm2015/src/app/core/table/table.class.js +0 -1677
- package/esm2015/src/app/core/table/table.utils.js +0 -13
- package/esm2015/src/app/core/table/testing/table.testing.js +0 -242
- package/esm2015/src/app/core/table/testing/table.testing.module.js +0 -26
- package/esm2015/src/app/core/text-popover/testing/text-popover.testing.js +0 -37
- package/esm2015/src/app/core/text-popover/testing/text-popover.testing.module.js +0 -33
- package/esm2015/src/app/core/text-popover/text-form.component.js +0 -72
- package/esm2015/src/app/core/text-popover/text-popover.component.js +0 -90
- package/esm2015/src/app/shared/alerts.js +0 -251
- package/esm2015/src/app/shared/audio/audio.js +0 -178
- package/esm2015/src/app/shared/dates.js +0 -134
- package/esm2015/src/app/shared/directives/autofocus.directive.js +0 -90
- package/esm2015/src/app/shared/directives/autotitle.directive.js +0 -27
- package/esm2015/src/app/shared/directives/directives.module.js +0 -30
- package/esm2015/src/app/shared/directives/drag-and-drop.directive.js +0 -43
- package/esm2015/src/app/shared/directives/ng-var.directive.js +0 -32
- package/esm2015/src/app/shared/directives/resizable/resizable.component.js +0 -54
- package/esm2015/src/app/shared/directives/resizable/resizable.directive.js +0 -34
- package/esm2015/src/app/shared/directives/resizable/resizable.module.js +0 -12
- package/esm2015/src/app/shared/events.js +0 -61
- package/esm2015/src/app/shared/file/csv.utils.js +0 -70
- package/esm2015/src/app/shared/file/file.service.js +0 -120
- package/esm2015/src/app/shared/file/file.utils.js +0 -116
- package/esm2015/src/app/shared/file/images.utils.js +0 -166
- package/esm2015/src/app/shared/form/field.component.js +0 -206
- package/esm2015/src/app/shared/form/loading-spinner.js +0 -24
- package/esm2015/src/app/shared/forms.js +0 -358
- package/esm2015/src/app/shared/functions.js +0 -431
- package/esm2015/src/app/shared/gesture/hammer.utils.js +0 -2
- package/esm2015/src/app/shared/graph/graph-colors.js +0 -205
- package/esm2015/src/app/shared/guard/component-dirty.guard.js +0 -61
- package/esm2015/src/app/shared/help/help.modal.js +0 -56
- package/esm2015/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.js +0 -20
- package/esm2015/src/app/shared/hotkeys/hotkeys.service.js +0 -91
- package/esm2015/src/app/shared/hotkeys/shared-hotkeys.module.js +0 -29
- package/esm2015/src/app/shared/http/http.utils.js +0 -57
- package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +0 -825
- package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.module.js +0 -46
- package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +0 -200
- package/esm2015/src/app/shared/material/badge/badge-icon.directive.js +0 -135
- package/esm2015/src/app/shared/material/badge/badge-icon.module.js +0 -23
- package/esm2015/src/app/shared/material/badge/badge-icon.test.js +0 -17
- package/esm2015/src/app/shared/material/boolean/boolean.module.js +0 -41
- package/esm2015/src/app/shared/material/boolean/material.boolean.js +0 -223
- package/esm2015/src/app/shared/material/chips/chips.module.js +0 -45
- package/esm2015/src/app/shared/material/chips/material.chips.js +0 -636
- package/esm2015/src/app/shared/material/chips/testing/chips.test.js +0 -138
- package/esm2015/src/app/shared/material/datetime/datetime.module.js +0 -54
- package/esm2015/src/app/shared/material/datetime/material.date.js +0 -375
- package/esm2015/src/app/shared/material/datetime/material.dateshort.js +0 -316
- package/esm2015/src/app/shared/material/datetime/material.datetime.js +0 -398
- package/esm2015/src/app/shared/material/datetime/testing/mat-date-time.test.js +0 -110
- package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +0 -108
- package/esm2015/src/app/shared/material/duration/duration.module.js +0 -40
- package/esm2015/src/app/shared/material/duration/material.duration.js +0 -246
- package/esm2015/src/app/shared/material/latlong/latlong.utils.js +0 -249
- package/esm2015/src/app/shared/material/latlong/material.latlong.js +0 -350
- package/esm2015/src/app/shared/material/latlong/material.latlong.module.js +0 -41
- package/esm2015/src/app/shared/material/latlong/testing/latlong.test.js +0 -70
- package/esm2015/src/app/shared/material/material.module.js +0 -93
- package/esm2015/src/app/shared/material/material.testing.module.js +0 -111
- package/esm2015/src/app/shared/material/numpad/numpad.append-to-input.directive.js +0 -96
- package/esm2015/src/app/shared/material/numpad/numpad.component.js +0 -73
- package/esm2015/src/app/shared/material/numpad/numpad.container.js +0 -149
- package/esm2015/src/app/shared/material/numpad/numpad.content.js +0 -14
- package/esm2015/src/app/shared/material/numpad/numpad.directive.js +0 -148
- package/esm2015/src/app/shared/material/numpad/numpad.dom-service.js +0 -37
- package/esm2015/src/app/shared/material/numpad/numpad.module.js +0 -39
- package/esm2015/src/app/shared/material/numpad/testing/numpad.test.js +0 -44
- package/esm2015/src/app/shared/material/paginator/material.paginator-i18n.js +0 -44
- package/esm2015/src/app/shared/material/stepper/material.stepper-i18n.js +0 -24
- package/esm2015/src/app/shared/material/swipe/material.swipe.js +0 -308
- package/esm2015/src/app/shared/material/swipe/swipe.module.js +0 -33
- package/esm2015/src/app/shared/material/swipe/testing/swipe.test.js +0 -68
- package/esm2015/src/app/shared/observables.js +0 -99
- package/esm2015/src/app/shared/pipes/arrays.pipe.js +0 -110
- package/esm2015/src/app/shared/pipes/date-diff-duration.pipe.js +0 -50
- package/esm2015/src/app/shared/pipes/date-format.pipe.js +0 -43
- package/esm2015/src/app/shared/pipes/file-size.pipe.js +0 -58
- package/esm2015/src/app/shared/pipes/form.pipes.js +0 -177
- package/esm2015/src/app/shared/pipes/highlight.pipe.js +0 -43
- package/esm2015/src/app/shared/pipes/latlong-format.pipe.js +0 -36
- package/esm2015/src/app/shared/pipes/maps.pipe.js +0 -48
- package/esm2015/src/app/shared/pipes/math.pipes.js +0 -44
- package/esm2015/src/app/shared/pipes/ng-init.pipe.js +0 -18
- package/esm2015/src/app/shared/pipes/pipes.module.js +0 -117
- package/esm2015/src/app/shared/pipes/property.pipes.js +0 -98
- package/esm2015/src/app/shared/pipes/string.pipes.js +0 -53
- package/esm2015/src/app/shared/pipes/translate-context.pipe.js +0 -36
- package/esm2015/src/app/shared/platforms.js +0 -45
- package/esm2015/src/app/shared/services/entity-service.class.js +0 -8
- package/esm2015/src/app/shared/services/job.utils.js +0 -96
- package/esm2015/src/app/shared/services/memory-entity-service.class.js +0 -342
- package/esm2015/src/app/shared/services/progress-bar.service.js +0 -30
- package/esm2015/src/app/shared/services/startable-observable-service.class.js +0 -124
- package/esm2015/src/app/shared/services/startable-service.class.js +0 -110
- package/esm2015/src/app/shared/services/storage.utils.js +0 -41
- package/esm2015/src/app/shared/services/translate-context.service.js +0 -83
- package/esm2015/src/app/shared/services/validator-service.class.js +0 -2
- package/esm2015/src/app/shared/services.js +0 -61
- package/esm2015/src/app/shared/shared-routing.module.js +0 -54
- package/esm2015/src/app/shared/shared.module.js +0 -135
- package/esm2015/src/app/shared/shared.testing.module.js +0 -33
- package/esm2015/src/app/shared/testing/tests.page.js +0 -34
- package/esm2015/src/app/shared/toast/toast.testing.js +0 -39
- package/esm2015/src/app/shared/toast/toast.testing.module.js +0 -33
- package/esm2015/src/app/shared/toast/toasts.js +0 -119
- package/esm2015/src/app/shared/toolbar/modal-toolbar.js +0 -53
- package/esm2015/src/app/shared/toolbar/toolbar.js +0 -213
- package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.js +0 -59
- package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.module.js +0 -33
- package/esm2015/src/app/shared/upload-file/upload-file-popover.component.js +0 -98
- package/esm2015/src/app/shared/upload-file/upload-file.component.js +0 -202
- package/esm2015/src/app/shared/upload-file/upload-file.model.js +0 -20
- package/esm2015/src/app/shared/validator/form-error-adapter.class.js +0 -99
- package/esm2015/src/app/shared/validator/validators.js +0 -537
- package/esm2015/src/app/social/job/job.model.js +0 -26
- package/esm2015/src/app/social/job/job.module.js +0 -25
- package/esm2015/src/app/social/job/job.service.js +0 -66
- package/esm2015/src/app/social/job/progression/job-progression.icon.js +0 -208
- package/esm2015/src/app/social/job/progression/job-progression.list.js +0 -20
- package/esm2015/src/app/social/job/testing/job-progression.testing.js +0 -49
- package/esm2015/src/app/social/job/testing/job-progression.testing.service.js +0 -52
- package/esm2015/src/app/social/job/testing/job.testing.module.js +0 -25
- package/esm2015/src/app/social/message/message.form.js +0 -73
- package/esm2015/src/app/social/message/message.modal.js +0 -96
- package/esm2015/src/app/social/message/message.model.js +0 -65
- package/esm2015/src/app/social/message/message.module.js +0 -25
- package/esm2015/src/app/social/message/message.service.js +0 -87
- package/esm2015/src/app/social/social.module.js +0 -28
- package/esm2015/src/app/social/social.testing.module.js +0 -39
- package/esm2015/src/app/social/user-event/notification/user-event-notification.icon.js +0 -106
- package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +0 -203
- package/esm2015/src/app/social/user-event/testing/user-event.testing.js +0 -230
- package/esm2015/src/app/social/user-event/testing/user-event.testing.model.js +0 -103
- package/esm2015/src/app/social/user-event/testing/user-event.testing.module.js +0 -25
- package/esm2015/src/app/social/user-event/testing/user-event.testing.service.js +0 -117
- package/esm2015/src/app/social/user-event/user-event.model.js +0 -2
- package/esm2015/src/app/social/user-event/user-event.module.js +0 -27
- package/esm2015/src/app/social/user-event/user-event.service.js +0 -509
- package/esm2015/src/environments/environment.class.js +0 -5
- package/esm2015/src/environments/environment.js +0 -81
- package/esm2015/sumaris-net.ngx-components.js +0 -21
- package/fesm2015/sumaris-net.ngx-components.js +0 -30297
- package/fesm2015/sumaris-net.ngx-components.js.map +0 -1
- package/src/app/core/form/properties.form.d.ts +0 -40
- package/src/app/shared/material/badge/badge-icon.directive.d.ts +0 -28
- package/src/app/shared/material/badge/badge-icon.module.d.ts +0 -2
- package/src/app/shared/material/badge/badge-icon.test.d.ts +0 -9
- package/src/app/shared/services/storage.utils.d.ts +0 -13
- package/sumaris-net.ngx-components.d.ts +0 -20
- package/sumaris-net.ngx-components.metadata.json +0 -1
|
@@ -0,0 +1,730 @@
|
|
|
1
|
+
import { of, Subject } from 'rxjs';
|
|
2
|
+
import { ApolloClient, ApolloLink, InMemoryCache, NetworkStatus } from '@apollo/client/core';
|
|
3
|
+
import { ErrorCodes, ServerErrorCodes } from '../services/errors';
|
|
4
|
+
import { catchError, distinctUntilChanged, filter, first, map, mergeMap, throttleTime } from 'rxjs/operators';
|
|
5
|
+
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
|
|
6
|
+
import { AppWebSocket, createTrackerLink, isMutationOperation, isSubscriptionOperation, restoreTrackedQueries, StorageServiceWrapper } from './graphql.utils';
|
|
7
|
+
import { RetryLink } from '@apollo/client/link/retry';
|
|
8
|
+
import QueueLink from 'apollo-link-queue';
|
|
9
|
+
import SerializingLink from 'apollo-link-serialize';
|
|
10
|
+
import loggerLink from 'apollo-link-logger';
|
|
11
|
+
import { EntityUtils } from '../services/model/entity.model';
|
|
12
|
+
import { isNil, isNotNil, toNumber } from '../../shared/functions';
|
|
13
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
14
|
+
import { persistCache } from 'apollo3-cache-persist';
|
|
15
|
+
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
16
|
+
import { StartableService } from '../../shared/services/startable-service.class';
|
|
17
|
+
import { isMobile } from '../../shared/platforms';
|
|
18
|
+
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
|
|
19
|
+
import { createClient } from 'graphql-ws';
|
|
20
|
+
import * as i0 from "@angular/core";
|
|
21
|
+
import * as i1 from "@ionic/angular";
|
|
22
|
+
import * as i2 from "apollo-angular";
|
|
23
|
+
import * as i3 from "apollo-angular/http";
|
|
24
|
+
import * as i4 from "../services/network.service";
|
|
25
|
+
import * as i5 from "../../shared/services/storage/storage.service";
|
|
26
|
+
import * as i6 from "../services/crypto.service";
|
|
27
|
+
export const APP_GRAPHQL_TYPE_POLICIES = new InjectionToken('graphqlTypePolicies');
|
|
28
|
+
export class GraphqlService extends StartableService {
|
|
29
|
+
constructor(platform, apollo, httpLink, network, storage, cryptoService, environment, typePolicies) {
|
|
30
|
+
super(platform); // Wait platform
|
|
31
|
+
this.platform = platform;
|
|
32
|
+
this.apollo = apollo;
|
|
33
|
+
this.httpLink = httpLink;
|
|
34
|
+
this.network = network;
|
|
35
|
+
this.storage = storage;
|
|
36
|
+
this.cryptoService = cryptoService;
|
|
37
|
+
this.environment = environment;
|
|
38
|
+
this.typePolicies = typePolicies;
|
|
39
|
+
this.connectionParams = {};
|
|
40
|
+
this.onNetworkError = new Subject();
|
|
41
|
+
this.customErrors = {};
|
|
42
|
+
this._debug = !environment.production;
|
|
43
|
+
this._defaultFetchPolicy = environment.apolloFetchPolicy;
|
|
44
|
+
// Listen network status
|
|
45
|
+
this._networkStatusChanged$ = network.onNetworkStatusChanges
|
|
46
|
+
.pipe(filter(isNotNil), distinctUntilChanged());
|
|
47
|
+
// When getting network error: try to ping peer, and toggle to offline
|
|
48
|
+
this.onNetworkError
|
|
49
|
+
.pipe(throttleTime(300), filter(() => this.network.online), mergeMap(() => this.network.checkPeerAlive()), filter(alive => !alive))
|
|
50
|
+
.subscribe(() => this.network.setForceOffline(true, { showToast: true }));
|
|
51
|
+
}
|
|
52
|
+
get client() {
|
|
53
|
+
return this._data;
|
|
54
|
+
}
|
|
55
|
+
get cache() {
|
|
56
|
+
return this.apollo.client.cache;
|
|
57
|
+
}
|
|
58
|
+
get defaultFetchPolicy() {
|
|
59
|
+
return this._defaultFetchPolicy;
|
|
60
|
+
}
|
|
61
|
+
setAuthToken(token) {
|
|
62
|
+
if (token) {
|
|
63
|
+
console.debug('[graphql] Apply token authentication to headers');
|
|
64
|
+
this.connectionParams.authToken = token;
|
|
65
|
+
}
|
|
66
|
+
// Clean auth token
|
|
67
|
+
else if (this.connectionParams.authToken) {
|
|
68
|
+
console.debug('[graphql] Remove token authentication from headers');
|
|
69
|
+
delete this.connectionParams.authToken;
|
|
70
|
+
// Clear cache
|
|
71
|
+
this.clearCache();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
setAuthBasic(basic) {
|
|
75
|
+
if (basic) {
|
|
76
|
+
console.debug('[graphql] Apply basic authentication to headers');
|
|
77
|
+
this.connectionParams.authBasic = basic;
|
|
78
|
+
}
|
|
79
|
+
// Clean auth basic
|
|
80
|
+
else if (this.connectionParams.authBasic) {
|
|
81
|
+
console.debug('[graphql] Remove basic authentication from headers');
|
|
82
|
+
delete this.connectionParams.authBasic;
|
|
83
|
+
// Clear cache
|
|
84
|
+
this.clearCache();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Allow to add a field resolver
|
|
89
|
+
* (see doc: https://www.apollographql.com/docs/react/data/local-state/#handling-client-fields-with-resolvers)
|
|
90
|
+
*
|
|
91
|
+
* @param resolvers
|
|
92
|
+
*/
|
|
93
|
+
async addResolver(resolvers) {
|
|
94
|
+
if (!this.started)
|
|
95
|
+
await this.ready();
|
|
96
|
+
this.apollo.client.addResolvers(resolvers);
|
|
97
|
+
}
|
|
98
|
+
async query(opts) {
|
|
99
|
+
if (!this.started)
|
|
100
|
+
await this.ready();
|
|
101
|
+
let res;
|
|
102
|
+
try {
|
|
103
|
+
res = await this.client.query({
|
|
104
|
+
query: opts.query,
|
|
105
|
+
variables: opts.variables,
|
|
106
|
+
fetchPolicy: opts.fetchPolicy || this._defaultFetchPolicy || undefined
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
res = this.toApolloError(err, opts.error);
|
|
111
|
+
}
|
|
112
|
+
if (res.errors) {
|
|
113
|
+
throw res.errors[0];
|
|
114
|
+
}
|
|
115
|
+
return res.data;
|
|
116
|
+
}
|
|
117
|
+
watchQueryRef(opts) {
|
|
118
|
+
return this.apollo.watchQuery({
|
|
119
|
+
query: opts.query,
|
|
120
|
+
variables: opts.variables,
|
|
121
|
+
fetchPolicy: opts.fetchPolicy || this._defaultFetchPolicy || undefined,
|
|
122
|
+
notifyOnNetworkStatusChange: true
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
queryRefValuesChanges(queryRef, opts) {
|
|
126
|
+
return queryRef
|
|
127
|
+
.valueChanges
|
|
128
|
+
.pipe(catchError(error => this.onApolloError(error, opts.error)), filter(value => value.networkStatus === NetworkStatus.ready || value.networkStatus === NetworkStatus.error), map(({ data, errors }) => {
|
|
129
|
+
if (errors) {
|
|
130
|
+
throw errors[0];
|
|
131
|
+
}
|
|
132
|
+
return data;
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
watchQuery(opts) {
|
|
136
|
+
const queryRef = this.watchQueryRef(opts);
|
|
137
|
+
return this.queryRefValuesChanges(queryRef, opts);
|
|
138
|
+
}
|
|
139
|
+
async mutate(opts) {
|
|
140
|
+
// If offline, compute an optimistic response for tracked queries
|
|
141
|
+
if ((opts.forceOffline || this.network.offline) && opts.offlineResponse) {
|
|
142
|
+
if (typeof opts.offlineResponse === 'function') {
|
|
143
|
+
opts.context = opts.context || {};
|
|
144
|
+
const optimisticResponseFn = opts.offlineResponse;
|
|
145
|
+
opts.optimisticResponse = await optimisticResponseFn(opts.context);
|
|
146
|
+
if (this._debug)
|
|
147
|
+
console.debug('[graphql] [offline] Using an optimistic response: ', opts.optimisticResponse);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
opts.optimisticResponse = opts.offlineResponse;
|
|
151
|
+
}
|
|
152
|
+
if (opts.forceOffline) {
|
|
153
|
+
const res = { data: opts.optimisticResponse };
|
|
154
|
+
if (opts.update) {
|
|
155
|
+
opts.update(this.apollo.client.cache, res);
|
|
156
|
+
}
|
|
157
|
+
return res.data;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const res = await this.apollo.mutate({
|
|
161
|
+
mutation: opts.mutation,
|
|
162
|
+
variables: opts.variables,
|
|
163
|
+
context: opts.context,
|
|
164
|
+
optimisticResponse: opts.optimisticResponse,
|
|
165
|
+
update: opts.update
|
|
166
|
+
})
|
|
167
|
+
.pipe(catchError(error => this.onApolloError(error, opts.error)), first()).toPromise();
|
|
168
|
+
if (Array.isArray(res.errors)) {
|
|
169
|
+
throw res.errors[0];
|
|
170
|
+
}
|
|
171
|
+
return res.data;
|
|
172
|
+
}
|
|
173
|
+
subscribe(opts, extra) {
|
|
174
|
+
return this.apollo.subscribe({
|
|
175
|
+
query: opts.query,
|
|
176
|
+
fetchPolicy: opts && opts.fetchPolicy || 'network-only',
|
|
177
|
+
errorPolicy: opts && opts.errorPolicy || undefined,
|
|
178
|
+
variables: opts.variables
|
|
179
|
+
}, {
|
|
180
|
+
useZone: true,
|
|
181
|
+
...extra
|
|
182
|
+
})
|
|
183
|
+
.pipe(catchError(error => this.onApolloError(error, opts.error)), map(({ data, errors }) => {
|
|
184
|
+
if (errors) {
|
|
185
|
+
throw errors[0];
|
|
186
|
+
}
|
|
187
|
+
return data;
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
insertIntoQueryCache(cache, opts) {
|
|
191
|
+
cache = cache || this.apollo.client.cache;
|
|
192
|
+
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
193
|
+
try {
|
|
194
|
+
let data = cache.readQuery({ query: opts.query, variables: opts.variables });
|
|
195
|
+
if (data && data[opts.arrayFieldName]) {
|
|
196
|
+
// Copy because immutable
|
|
197
|
+
data = { ...data };
|
|
198
|
+
// Append to result array
|
|
199
|
+
data[opts.arrayFieldName] = [...data[opts.arrayFieldName], { ...opts.data }];
|
|
200
|
+
// Resort, if need
|
|
201
|
+
if (opts.sortFn) {
|
|
202
|
+
data[opts.arrayFieldName].sort(opts.sortFn);
|
|
203
|
+
}
|
|
204
|
+
// Exclude if exceed max size
|
|
205
|
+
const size = toNumber(opts.variables && opts.variables['size'], -1);
|
|
206
|
+
if (size > 0 && data[opts.arrayFieldName].length > size) {
|
|
207
|
+
data[opts.arrayFieldName].splice(size, data[opts.arrayFieldName].length - size);
|
|
208
|
+
}
|
|
209
|
+
// Increment total
|
|
210
|
+
if (isNotNil(opts.totalFieldName)) {
|
|
211
|
+
if (isNotNil(data[opts.totalFieldName])) {
|
|
212
|
+
data[opts.totalFieldName] += 1;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
cache.writeQuery({
|
|
219
|
+
query: opts.query,
|
|
220
|
+
variables: opts.variables,
|
|
221
|
+
data
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
// continue
|
|
230
|
+
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
231
|
+
if (this._debug)
|
|
232
|
+
console.error('[graphql] Error while updating cache: ', err);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
addManyToQueryCache(cache, opts) {
|
|
236
|
+
if (!opts.data || !opts.data.length)
|
|
237
|
+
return; // nothing to process
|
|
238
|
+
cache = cache || this.apollo.client.cache;
|
|
239
|
+
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
240
|
+
try {
|
|
241
|
+
let data = cache.readQuery({ query: opts.query, variables: opts.variables });
|
|
242
|
+
if (data && data[opts.arrayFieldName]) {
|
|
243
|
+
// Copy because immutable
|
|
244
|
+
data = { ...data };
|
|
245
|
+
// Keep only not existing res
|
|
246
|
+
const equalsFn = opts.equalsFn || ((d1, d2) => d1['id'] === d2['id'] && d1['entityName'] === d2['entityName']);
|
|
247
|
+
const newItems = opts.data.filter(inputValue => data[opts.arrayFieldName].findIndex(existingValue => equalsFn(inputValue, existingValue)) === -1);
|
|
248
|
+
if (!newItems.length)
|
|
249
|
+
return; // No new value
|
|
250
|
+
// Append to array
|
|
251
|
+
data[opts.arrayFieldName] = [...data[opts.arrayFieldName], ...newItems];
|
|
252
|
+
// Resort, if need
|
|
253
|
+
if (opts.sortFn) {
|
|
254
|
+
data[opts.arrayFieldName].sort(opts.sortFn);
|
|
255
|
+
}
|
|
256
|
+
// Exclude if exceed max size
|
|
257
|
+
const size = toNumber(opts.variables && opts.variables['size'], -1);
|
|
258
|
+
if (size > 0 && data[opts.arrayFieldName].length > size) {
|
|
259
|
+
data[opts.arrayFieldName].splice(size, data[opts.arrayFieldName].length - size);
|
|
260
|
+
}
|
|
261
|
+
// Increment the total
|
|
262
|
+
if (isNotNil(opts.totalFieldName)) {
|
|
263
|
+
if (isNotNil(data[opts.totalFieldName])) {
|
|
264
|
+
data[opts.arrayFieldName] += newItems.length;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Write to cache
|
|
271
|
+
cache.writeQuery({
|
|
272
|
+
query: opts.query,
|
|
273
|
+
variables: opts.variables,
|
|
274
|
+
data
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
// continue
|
|
283
|
+
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
284
|
+
if (this._debug)
|
|
285
|
+
console.warn('[graphql] Error while updating cache: ', err);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Remove from cache, and return if removed or not
|
|
290
|
+
*
|
|
291
|
+
* @param cache
|
|
292
|
+
* @param opts
|
|
293
|
+
*/
|
|
294
|
+
removeFromCachedQueryById(cache, opts) {
|
|
295
|
+
cache = cache || this.apollo.client.cache;
|
|
296
|
+
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
297
|
+
try {
|
|
298
|
+
let data = cache.readQuery({ query: opts.query, variables: opts.variables });
|
|
299
|
+
if (data && data[opts.arrayFieldName]) {
|
|
300
|
+
// Copy because immutable
|
|
301
|
+
data = { ...data };
|
|
302
|
+
const index = data[opts.arrayFieldName].findIndex(item => item['id'] === opts.ids);
|
|
303
|
+
if (index === -1)
|
|
304
|
+
return false; // Skip (nothing removed)
|
|
305
|
+
// Copy, then remove deleted item
|
|
306
|
+
data[opts.arrayFieldName] = data[opts.arrayFieldName].slice();
|
|
307
|
+
const deletedItem = data[opts.arrayFieldName].splice(index, 1)[0];
|
|
308
|
+
cache.evict({ id: cache.identify(deletedItem) });
|
|
309
|
+
// Decrement the total
|
|
310
|
+
if (isNotNil(opts.totalFieldName)) {
|
|
311
|
+
if (isNotNil(data[opts.totalFieldName])) {
|
|
312
|
+
data[opts.totalFieldName] -= 1;
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Write to cache
|
|
319
|
+
cache.writeQuery({
|
|
320
|
+
query: opts.query,
|
|
321
|
+
variables: opts.variables,
|
|
322
|
+
data
|
|
323
|
+
});
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
// continue
|
|
333
|
+
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
334
|
+
if (this._debug)
|
|
335
|
+
console.warn('[graphql] Error while removing from cache: ', err);
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Remove ids from cache, and return the number of items removed
|
|
341
|
+
*
|
|
342
|
+
* @param cache
|
|
343
|
+
* @param opts
|
|
344
|
+
*/
|
|
345
|
+
removeFromCachedQueryByIds(cache, opts) {
|
|
346
|
+
cache = cache || this.apollo.client.cache;
|
|
347
|
+
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
348
|
+
try {
|
|
349
|
+
let data = cache.readQuery(opts);
|
|
350
|
+
if (data && data[opts.arrayFieldName]) {
|
|
351
|
+
// Copy because immutable
|
|
352
|
+
data = { ...data };
|
|
353
|
+
const deletedIndexes = data[opts.arrayFieldName].reduce((res, item, index) => opts.ids.includes(item['id']) ? res.concat(index) : res, []);
|
|
354
|
+
if (deletedIndexes.length <= 0)
|
|
355
|
+
return 0; // Skip (nothing removed)
|
|
356
|
+
// Query has NO total
|
|
357
|
+
if (isNil(opts.totalFieldName)) {
|
|
358
|
+
// Evict each object
|
|
359
|
+
deletedIndexes
|
|
360
|
+
.map(index => data[opts.arrayFieldName][index])
|
|
361
|
+
.map(item => cache.identify(item))
|
|
362
|
+
.forEach(id => cache.evict({ id }));
|
|
363
|
+
}
|
|
364
|
+
// Query has a total
|
|
365
|
+
else {
|
|
366
|
+
// Copy the array
|
|
367
|
+
data[opts.arrayFieldName] = data[opts.arrayFieldName].slice();
|
|
368
|
+
// remove from array, then evict
|
|
369
|
+
deletedIndexes
|
|
370
|
+
// Reverse: to keep valid index
|
|
371
|
+
.reverse()
|
|
372
|
+
// Remove from the array
|
|
373
|
+
.map(index => data[opts.arrayFieldName].splice(index, 1)[0])
|
|
374
|
+
// Evict from cache
|
|
375
|
+
.map(item => cache.identify(item))
|
|
376
|
+
.forEach(id => cache.evict({ id }));
|
|
377
|
+
if (isNotNil(data[opts.totalFieldName])) {
|
|
378
|
+
data[opts.totalFieldName] -= deletedIndexes.length; // Remove deletion count
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
console.warn('[graphql] Unable to update the total in cached query. Unknown result part: ' + opts.totalFieldName);
|
|
382
|
+
}
|
|
383
|
+
cache.writeQuery({
|
|
384
|
+
query: opts.query,
|
|
385
|
+
variables: opts.variables,
|
|
386
|
+
data
|
|
387
|
+
});
|
|
388
|
+
return deletedIndexes.length;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
393
|
+
return 0;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
catch (err) {
|
|
397
|
+
// continue
|
|
398
|
+
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
399
|
+
if (this._debug)
|
|
400
|
+
console.warn('[graphql] Error while removing from cache: ', err);
|
|
401
|
+
return 0;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
updateToQueryCache(cache, opts) {
|
|
405
|
+
cache = cache || this.apollo.client.cache;
|
|
406
|
+
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
407
|
+
try {
|
|
408
|
+
let data = cache.readQuery(opts);
|
|
409
|
+
if (data && data[opts.arrayFieldName]) {
|
|
410
|
+
// Copy because immutable
|
|
411
|
+
data = { ...data };
|
|
412
|
+
const equalsFn = opts.equalsFn || ((d1, d2) => EntityUtils.equals(d1, d2, 'id'));
|
|
413
|
+
// Update if exists, or insert
|
|
414
|
+
const index = data[opts.arrayFieldName].findIndex(v => equalsFn(opts.data, v));
|
|
415
|
+
if (index !== -1) {
|
|
416
|
+
data[opts.arrayFieldName] = data[opts.arrayFieldName].slice().splice(index, 1, opts.data);
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
data[opts.arrayFieldName] = [...data[opts.arrayFieldName], opts.data];
|
|
420
|
+
}
|
|
421
|
+
// Increment total (if changed)
|
|
422
|
+
if (isNotNil(opts.totalFieldName) && index === -1) {
|
|
423
|
+
if (isNotNil(data[opts.totalFieldName])) {
|
|
424
|
+
data[opts.totalFieldName] += 1;
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
cache.writeQuery({
|
|
431
|
+
query: opts.query,
|
|
432
|
+
variables: opts.variables,
|
|
433
|
+
data
|
|
434
|
+
});
|
|
435
|
+
return; // OK: stop here
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
// continue
|
|
440
|
+
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
441
|
+
if (this._debug)
|
|
442
|
+
console.warn('[graphql] Error while updating cache: ', err);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
async clearCache(client) {
|
|
446
|
+
client = (client || this.client);
|
|
447
|
+
if (client) {
|
|
448
|
+
console.info('[graphql] Cleaning cache... ');
|
|
449
|
+
const now = this._debug && Date.now();
|
|
450
|
+
// Clearing the cache
|
|
451
|
+
await client.cache.reset();
|
|
452
|
+
if (this._debug)
|
|
453
|
+
console.debug(`[graphql] Cleaning cache [OK] in ${Date.now() - now}ms`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
registerCustomError(error) {
|
|
457
|
+
this.customErrors = { ...this.customErrors, ...error };
|
|
458
|
+
}
|
|
459
|
+
/* -- protected methods -- */
|
|
460
|
+
async ngOnStart() {
|
|
461
|
+
// Wait network and storage
|
|
462
|
+
await Promise.all([
|
|
463
|
+
this.storage.ready(),
|
|
464
|
+
this.network.ready()
|
|
465
|
+
]);
|
|
466
|
+
console.info('[graphql] Starting graphql...');
|
|
467
|
+
const mobile = isMobile(window);
|
|
468
|
+
const enableTrackMutationQueries = !mobile;
|
|
469
|
+
const peer = this.network.peer;
|
|
470
|
+
if (!peer)
|
|
471
|
+
throw Error('[graphql] Missing peer. Unable to start graphql service');
|
|
472
|
+
const uri = peer.url + '/graphql';
|
|
473
|
+
const wsUrl = uri.replace(/^http(s)?:/, 'ws$1:') + '/websocket';
|
|
474
|
+
console.info('[graphql] Base uri: ' + uri);
|
|
475
|
+
console.info('[graphql] Subscription uri: ' + wsUrl);
|
|
476
|
+
this.httpParams = this.httpParams || {};
|
|
477
|
+
this.httpParams.uri = uri;
|
|
478
|
+
this.wsParams = {
|
|
479
|
+
...this.wsParams,
|
|
480
|
+
lazy: true,
|
|
481
|
+
connectionParams: this.connectionParams,
|
|
482
|
+
webSocketImpl: AppWebSocket,
|
|
483
|
+
url: wsUrl,
|
|
484
|
+
shouldRetry: (errOrCloseEvent) => {
|
|
485
|
+
console.warn('[graphql-service] [WS] Trying to reconnect...', errOrCloseEvent);
|
|
486
|
+
return true;
|
|
487
|
+
},
|
|
488
|
+
retryAttempts: 10
|
|
489
|
+
};
|
|
490
|
+
// Create a storage configuration
|
|
491
|
+
const storage = new StorageServiceWrapper(this.storage);
|
|
492
|
+
let client = this.apollo.client;
|
|
493
|
+
if (!client) {
|
|
494
|
+
console.debug('[apollo] Creating GraphQL client...');
|
|
495
|
+
// Websocket link
|
|
496
|
+
const wsLink = new GraphQLWsLink(createClient(this.wsParams));
|
|
497
|
+
// Retry when failed link
|
|
498
|
+
const retryLink = new RetryLink();
|
|
499
|
+
const authLink = new ApolloLink((operation, forward) => {
|
|
500
|
+
const authorization = [];
|
|
501
|
+
if (this.connectionParams.authToken) {
|
|
502
|
+
authorization.push(`token ${this.connectionParams.authToken}`);
|
|
503
|
+
}
|
|
504
|
+
if (this.connectionParams.authBasic) {
|
|
505
|
+
authorization.push(`Basic ${this.connectionParams.authBasic}`);
|
|
506
|
+
}
|
|
507
|
+
const headers = new HttpHeaders()
|
|
508
|
+
.append('Authorization', authorization);
|
|
509
|
+
// Use the setContext method to set the HTTP headers.
|
|
510
|
+
operation.setContext({
|
|
511
|
+
...operation.getContext(),
|
|
512
|
+
...{ headers }
|
|
513
|
+
});
|
|
514
|
+
// Call the next link in the middleware chain.
|
|
515
|
+
return forward(operation);
|
|
516
|
+
});
|
|
517
|
+
// Http link
|
|
518
|
+
const httpLink = this.httpLink.create(this.httpParams);
|
|
519
|
+
// Cache
|
|
520
|
+
const cache = new InMemoryCache({
|
|
521
|
+
typePolicies: this.typePolicies
|
|
522
|
+
});
|
|
523
|
+
// Add cache persistence
|
|
524
|
+
if (this.environment.persistCache) {
|
|
525
|
+
console.debug('[graphql] Starting persistence cache...');
|
|
526
|
+
await persistCache({
|
|
527
|
+
cache,
|
|
528
|
+
storage,
|
|
529
|
+
trigger: this.platform.is('android') ? 'background' : 'write',
|
|
530
|
+
debounce: 1000,
|
|
531
|
+
debug: true
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
let mutationLinks;
|
|
535
|
+
// Add queue to store tracked queries, when offline
|
|
536
|
+
if (enableTrackMutationQueries) {
|
|
537
|
+
const serializingLink = new SerializingLink();
|
|
538
|
+
const trackerLink = createTrackerLink({
|
|
539
|
+
storage,
|
|
540
|
+
onNetworkStatusChange: this._networkStatusChanged$,
|
|
541
|
+
debounce: 1000,
|
|
542
|
+
debug: true
|
|
543
|
+
});
|
|
544
|
+
// Creating a mutation queue
|
|
545
|
+
const queueLink = new QueueLink();
|
|
546
|
+
this.registerSubscription(this._networkStatusChanged$
|
|
547
|
+
.subscribe(type => {
|
|
548
|
+
// Network is offline: start buffering into queue
|
|
549
|
+
if (type === 'none') {
|
|
550
|
+
console.info('[graphql] offline mode: enable mutations buffer');
|
|
551
|
+
queueLink.close();
|
|
552
|
+
}
|
|
553
|
+
// Network is online
|
|
554
|
+
else {
|
|
555
|
+
console.info('[graphql] online mode: disable mutations buffer');
|
|
556
|
+
queueLink.open();
|
|
557
|
+
}
|
|
558
|
+
}));
|
|
559
|
+
mutationLinks = [
|
|
560
|
+
loggerLink,
|
|
561
|
+
queueLink,
|
|
562
|
+
trackerLink,
|
|
563
|
+
queueLink,
|
|
564
|
+
serializingLink,
|
|
565
|
+
retryLink,
|
|
566
|
+
authLink,
|
|
567
|
+
httpLink
|
|
568
|
+
];
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
mutationLinks = [
|
|
572
|
+
retryLink,
|
|
573
|
+
authLink,
|
|
574
|
+
httpLink
|
|
575
|
+
];
|
|
576
|
+
}
|
|
577
|
+
// create Apollo
|
|
578
|
+
client = new ApolloClient({
|
|
579
|
+
cache,
|
|
580
|
+
link: ApolloLink.split(
|
|
581
|
+
// Handle mutations
|
|
582
|
+
isMutationOperation, ApolloLink.from(mutationLinks), ApolloLink.split(
|
|
583
|
+
// Handle subscriptions
|
|
584
|
+
isSubscriptionOperation, wsLink,
|
|
585
|
+
// Handle queries
|
|
586
|
+
ApolloLink.from([
|
|
587
|
+
retryLink,
|
|
588
|
+
authLink,
|
|
589
|
+
httpLink
|
|
590
|
+
]))),
|
|
591
|
+
connectToDevTools: !this.environment.production
|
|
592
|
+
});
|
|
593
|
+
this.apollo.client = client;
|
|
594
|
+
}
|
|
595
|
+
// Enable tracked queries persistence
|
|
596
|
+
if (enableTrackMutationQueries && this.environment.persistCache) {
|
|
597
|
+
try {
|
|
598
|
+
await restoreTrackedQueries({
|
|
599
|
+
apolloClient: client,
|
|
600
|
+
storage,
|
|
601
|
+
debug: true
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
catch (err) {
|
|
605
|
+
console.error('[graphql] Failed to restore tracked queries from storage: ' + (err && err.message || err), err);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
// Listen for network restart
|
|
609
|
+
this.registerSubscription(this.network.on('start', () => this.restart()));
|
|
610
|
+
// Listen for clear cache request, from network
|
|
611
|
+
this.registerSubscription(this.network.on('resetCache', () => this.clearCache()));
|
|
612
|
+
console.info('[graphql] Starting graphql [OK]');
|
|
613
|
+
return client;
|
|
614
|
+
}
|
|
615
|
+
async ngOnStop() {
|
|
616
|
+
console.info('[graphql] Stopping graphql service...');
|
|
617
|
+
await this.resetClient();
|
|
618
|
+
}
|
|
619
|
+
async resetClient(client) {
|
|
620
|
+
client = (client || this.apollo.client);
|
|
621
|
+
if (!client)
|
|
622
|
+
return;
|
|
623
|
+
console.info('[graphql] Resetting Apollo client...');
|
|
624
|
+
client.stop();
|
|
625
|
+
await Promise.all([
|
|
626
|
+
client.clearStore(),
|
|
627
|
+
this.clearCache(client)
|
|
628
|
+
]);
|
|
629
|
+
}
|
|
630
|
+
onApolloError(err, defaultError) {
|
|
631
|
+
return of(this.toApolloError(err, defaultError));
|
|
632
|
+
}
|
|
633
|
+
toApolloError(err, defaultError) {
|
|
634
|
+
let error =
|
|
635
|
+
// If network error: try to convert to App (read as JSON), or create an UNKNOWN_NETWORK_ERROR
|
|
636
|
+
(err.networkError && ((err.networkError.error && this.toAppError(err.networkError.error))
|
|
637
|
+
|| this.toAppError(err.networkError)
|
|
638
|
+
|| (err.networkError.error && this.createAppErrorByCode(err.networkError.error.status))
|
|
639
|
+
|| this.createAppErrorByCode(ErrorCodes.UNKNOWN_NETWORK_ERROR)))
|
|
640
|
+
// If graphQL: try to convert the first error found
|
|
641
|
+
|| (err.graphQLErrors && err.graphQLErrors.length && this.toAppError(err.graphQLErrors[0]))
|
|
642
|
+
|| this.toAppError(err)
|
|
643
|
+
|| this.toAppError(err.originalError)
|
|
644
|
+
|| (err.graphQLErrors && err.graphQLErrors[0])
|
|
645
|
+
|| err;
|
|
646
|
+
console.error('[graphql] ' + (error && error.message || error), error.stack || '');
|
|
647
|
+
if (error && error.code === ErrorCodes.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
|
|
648
|
+
console.error('[graphql] original error: ' + err.networkError.message);
|
|
649
|
+
this.onNetworkError.next(error);
|
|
650
|
+
}
|
|
651
|
+
if ((!error || !error.code) && defaultError) {
|
|
652
|
+
error = { ...defaultError, details: error, stack: err.stack };
|
|
653
|
+
}
|
|
654
|
+
return {
|
|
655
|
+
data: null,
|
|
656
|
+
errors: [error],
|
|
657
|
+
loading: false,
|
|
658
|
+
networkStatus: NetworkStatus.error
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
createAppErrorByCode(errorCode) {
|
|
662
|
+
const message = this.getI18nErrorMessageByCode(errorCode);
|
|
663
|
+
if (message) {
|
|
664
|
+
return {
|
|
665
|
+
code: errorCode,
|
|
666
|
+
message: this.getI18nErrorMessageByCode(errorCode)
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
return undefined;
|
|
670
|
+
}
|
|
671
|
+
getI18nErrorMessageByCode(errorCode) {
|
|
672
|
+
// look in registered error codes
|
|
673
|
+
const customErrorMessage = this.customErrors[errorCode];
|
|
674
|
+
if (customErrorMessage) {
|
|
675
|
+
return customErrorMessage;
|
|
676
|
+
}
|
|
677
|
+
// Default, switch on error code
|
|
678
|
+
switch (errorCode) {
|
|
679
|
+
case ServerErrorCodes.UNAUTHORIZED:
|
|
680
|
+
return 'ERROR.UNAUTHORIZED';
|
|
681
|
+
case ServerErrorCodes.FORBIDDEN:
|
|
682
|
+
return 'ERROR.FORBIDDEN';
|
|
683
|
+
case ErrorCodes.UNKNOWN_NETWORK_ERROR:
|
|
684
|
+
return 'ERROR.UNKNOWN_NETWORK_ERROR';
|
|
685
|
+
case ServerErrorCodes.BAD_UPDATE_DATE:
|
|
686
|
+
return 'ERROR.BAD_UPDATE_DATE';
|
|
687
|
+
case ServerErrorCodes.DATA_LOCKED:
|
|
688
|
+
return 'ERROR.DATA_LOCKED';
|
|
689
|
+
case ServerErrorCodes.BAD_APP_VERSION:
|
|
690
|
+
return 'ERROR.BAD_APP_VERSION';
|
|
691
|
+
}
|
|
692
|
+
return undefined;
|
|
693
|
+
}
|
|
694
|
+
toAppError(err) {
|
|
695
|
+
let error = err;
|
|
696
|
+
const message = err && err.message || err;
|
|
697
|
+
if (typeof message === 'string' && message.trim().indexOf('{"code":') === 0) {
|
|
698
|
+
try {
|
|
699
|
+
error = JSON.parse(message
|
|
700
|
+
// Remove special characters before parsing (e.g. SQL errors from an Oracle database)
|
|
701
|
+
.replace('\n', ' ')
|
|
702
|
+
.replace('\r', ''));
|
|
703
|
+
}
|
|
704
|
+
catch (parseError) {
|
|
705
|
+
console.error('Unable to parse error as JSON: ', parseError);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
if (error && error.code) {
|
|
709
|
+
return this.createAppErrorByCode(error.code) || error && error.message || error;
|
|
710
|
+
}
|
|
711
|
+
return undefined;
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
GraphqlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.6", ngImport: i0, type: GraphqlService, deps: [{ token: i1.Platform }, { token: i2.Apollo }, { token: i3.HttpLink }, { token: i4.NetworkService }, { token: i5.StorageService }, { token: i6.CryptoService }, { token: ENVIRONMENT }, { token: APP_GRAPHQL_TYPE_POLICIES, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
715
|
+
GraphqlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.6", ngImport: i0, type: GraphqlService, providedIn: 'root' });
|
|
716
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImport: i0, type: GraphqlService, decorators: [{
|
|
717
|
+
type: Injectable,
|
|
718
|
+
args: [{
|
|
719
|
+
providedIn: 'root'
|
|
720
|
+
}]
|
|
721
|
+
}], ctorParameters: function () { return [{ type: i1.Platform }, { type: i2.Apollo }, { type: i3.HttpLink }, { type: i4.NetworkService }, { type: i5.StorageService }, { type: i6.CryptoService }, { type: undefined, decorators: [{
|
|
722
|
+
type: Inject,
|
|
723
|
+
args: [ENVIRONMENT]
|
|
724
|
+
}] }, { type: undefined, decorators: [{
|
|
725
|
+
type: Optional
|
|
726
|
+
}, {
|
|
727
|
+
type: Inject,
|
|
728
|
+
args: [APP_GRAPHQL_TYPE_POLICIES]
|
|
729
|
+
}] }]; } });
|
|
730
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2dyYXBocWwvZ3JhcGhxbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFFTCxZQUFZLEVBQ1osVUFBVSxFQUdWLGFBQWEsRUFFYixhQUFhLEVBSWQsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDOUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUcsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUzRSxPQUFPLEVBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUosT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sVUFBVSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE9BQU8sRUFBQyxXQUFXLEVBQVUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7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QUFHLENBQUM7cUJBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN2QjtZQUNELE9BQU8sVUFBVSxFQUFFO2dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzlEO1NBQ0Y7UUFDRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7U0FDakY7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDOzsyR0F6MUJVLGNBQWMsaUxBOEJmLFdBQVcsYUFDQyx5QkFBeUI7K0dBL0JwQyxjQUFjLGNBRmIsTUFBTTsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBK0JJLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYnNlcnZhYmxlLCBvZiwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0Fwb2xsbywgRXh0cmFTdWJzY3JpcHRpb25PcHRpb25zLCBRdWVyeVJlZn0gZnJvbSAnYXBvbGxvLWFuZ3VsYXInO1xuaW1wb3J0IHtcbiAgQXBvbGxvQ2FjaGUsXG4gIEFwb2xsb0NsaWVudCxcbiAgQXBvbGxvTGluayxcbiAgQXBvbGxvUXVlcnlSZXN1bHQsXG4gIEZldGNoUG9saWN5LFxuICBJbk1lbW9yeUNhY2hlLFxuICBNdXRhdGlvblVwZGF0ZXJGbixcbiAgTmV0d29ya1N0YXR1cyxcbiAgT3BlcmF0aW9uVmFyaWFibGVzLFxuICBUeXBlUG9saWNpZXMsXG4gIFdhdGNoUXVlcnlGZXRjaFBvbGljeVxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7RXJyb3JDb2RlcywgU2VydmVyRXJyb3JDb2RlcywgU2VydmljZUVycm9yfSBmcm9tICcuLi9zZXJ2aWNlcy9lcnJvcnMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwLCBtZXJnZU1hcCwgdGhyb3R0bGVUaW1lfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb25uZWN0aW9uVHlwZSwgTmV0d29ya1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQge0FwcFdlYlNvY2tldCwgY3JlYXRlVHJhY2tlckxpbmssIGlzTXV0YXRpb25PcGVyYXRpb24sIGlzU3Vic2NyaXB0aW9uT3BlcmF0aW9uLCByZXN0b3JlVHJhY2tlZFF1ZXJpZXMsIFN0b3JhZ2VTZXJ2aWNlV3JhcHBlcn0gZnJvbSAnLi9ncmFwaHFsLnV0aWxzJztcbmltcG9ydCB7UmV0cnlMaW5rfSBmcm9tICdAYXBvbGxvL2NsaWVudC9saW5rL3JldHJ5JztcbmltcG9ydCBRdWV1ZUxpbmsgZnJvbSAnYXBvbGxvLWxpbmstcXVldWUnO1xuaW1wb3J0IFNlcmlhbGl6aW5nTGluayBmcm9tICdhcG9sbG8tbGluay1zZXJpYWxpemUnO1xuaW1wb3J0IGxvZ2dlckxpbmsgZnJvbSAnYXBvbGxvLWxpbmstbG9nZ2VyJztcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7RW50aXR5VXRpbHMsIElFbnRpdHl9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge2lzTmlsLCBpc05vdE5pbCwgdG9OdW1iZXJ9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtSZXNvbHZlcnN9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUvdHlwZXMnO1xuaW1wb3J0IHtIdHRwSGVhZGVyc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtFbXB0eU9iamVjdH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXIvdHlwZXMnO1xuaW1wb3J0IHtIdHRwTGluaywgT3B0aW9uc30gZnJvbSAnYXBvbGxvLWFuZ3VsYXIvaHR0cCc7XG5pbXBvcnQge3BlcnNpc3RDYWNoZSwgUGVyc2lzdGVudFN0b3JhZ2V9IGZyb20gJ2Fwb2xsbzMtY2FjaGUtcGVyc2lzdCc7XG5pbXBvcnQge0Vycm9yUG9saWN5LCBNdXRhdGlvbkJhc2VPcHRpb25zfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL3dhdGNoUXVlcnlPcHRpb25zJztcbmltcG9ydCB7Q2FjaGV9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NhY2hlL2NvcmUvdHlwZXMvQ2FjaGUnO1xuaW1wb3J0IHtFTlZJUk9OTUVOVH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7Q3J5cHRvU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHtQcm9wZXJ0aWVzTWFwfSBmcm9tICcuLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHtTdGFydGFibGVTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtpc01vYmlsZX0gZnJvbSAnLi4vLi4vc2hhcmVkL3BsYXRmb3Jtcyc7XG5pbXBvcnQge1N0b3JhZ2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtHcmFwaFFMV3NMaW5rfSBmcm9tICdAYXBvbGxvL2NsaWVudC9saW5rL3N1YnNjcmlwdGlvbnMnO1xuaW1wb3J0IHtDbGllbnRPcHRpb25zLCBjcmVhdGVDbGllbnR9IGZyb20gJ2dyYXBocWwtd3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoUXVlcnlPcHRpb25zPFY+IHtcbiAgcXVlcnk6IGFueTtcbiAgdmFyaWFibGVzPzogVjtcbiAgZXJyb3I/OiBTZXJ2aWNlRXJyb3I7XG4gIGZldGNoUG9saWN5PzogV2F0Y2hRdWVyeUZldGNoUG9saWN5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11dGF0ZVF1ZXJ5T3B0aW9uczxULCBWID0gT3BlcmF0aW9uVmFyaWFibGVzPiBleHRlbmRzIE11dGF0aW9uQmFzZU9wdGlvbnM8VCwgVj4ge1xuICBtdXRhdGlvbjogYW55O1xuICB2YXJpYWJsZXM/OiBWO1xuICBlcnJvcj86IFNlcnZpY2VFcnJvcjtcbiAgY29udGV4dD86IHtcbiAgICBzZXJpYWxpemF0aW9uS2V5Pzogc3RyaW5nO1xuICAgIHRyYWNrZWQ/OiBib29sZWFuO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gIH07XG4gIG9wdGltaXN0aWNSZXNwb25zZT86IFQ7XG4gIG9mZmxpbmVSZXNwb25zZT86IFQgfCAoKGNvbnRleHQ6IGFueSkgPT4gUHJvbWlzZTxUPik7XG4gIHVwZGF0ZT86IE11dGF0aW9uVXBkYXRlckZuPFQ+O1xuICBmb3JjZU9mZmxpbmU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQVBQX0dSQVBIUUxfVFlQRV9QT0xJQ0lFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUeXBlUG9saWNpZXM+KCdncmFwaHFsVHlwZVBvbGljaWVzJyk7XG5cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25QYXJhbXMgPSB7XG4gIGF1dGhUb2tlbj86IHN0cmluZztcbiAgYXV0aEJhc2ljPzogc3RyaW5nO1xufTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR3JhcGhxbFNlcnZpY2UgZXh0ZW5kcyBTdGFydGFibGVTZXJ2aWNlPEFwb2xsb0NsaWVudDxhbnk+PiB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmV0d29ya1N0YXR1c0NoYW5nZWQkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25UeXBlPjtcblxuICBwcml2YXRlIGh0dHBQYXJhbXM6IE9wdGlvbnM7XG4gIHByaXZhdGUgd3NQYXJhbXM6IENsaWVudE9wdGlvbnM8Q29ubmVjdGlvblBhcmFtcz47XG4gIHByaXZhdGUgY29ubmVjdGlvblBhcmFtczogQ29ubmVjdGlvblBhcmFtcyA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0RmV0Y2hQb2xpY3k6IFdhdGNoUXVlcnlGZXRjaFBvbGljeTtcbiAgcHJpdmF0ZSBvbk5ldHdvcmtFcnJvciA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgY3VzdG9tRXJyb3JzOiBQcm9wZXJ0aWVzTWFwID0ge307XG5cbiAgZ2V0IGNsaWVudCgpOiBBcG9sbG9DbGllbnQ8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBnZXQgY2FjaGUoKTogQXBvbGxvQ2FjaGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZTtcbiAgfVxuXG4gIGdldCBkZWZhdWx0RmV0Y2hQb2xpY3koKTogV2F0Y2hRdWVyeUZldGNoUG9saWN5IHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEZldGNoUG9saWN5O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBhcG9sbG86IEFwb2xsbyxcbiAgICBwcml2YXRlIGh0dHBMaW5rOiBIdHRwTGluayxcbiAgICBwcml2YXRlIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9HUkFQSFFMX1RZUEVfUE9MSUNJRVMpIHByaXZhdGUgdHlwZVBvbGljaWVzOiBUeXBlUG9saWNpZXNcbiAgKSB7XG4gICAgc3VwZXIocGxhdGZvcm0pOyAvLyBXYWl0IHBsYXRmb3JtXG5cbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIHRoaXMuX2RlZmF1bHRGZXRjaFBvbGljeSA9IGVudmlyb25tZW50LmFwb2xsb0ZldGNoUG9saWN5O1xuXG4gICAgLy8gTGlzdGVuIG5ldHdvcmsgc3RhdHVzXG4gICAgdGhpcy5fbmV0d29ya1N0YXR1c0NoYW5nZWQkID0gbmV0d29yay5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKTtcblxuICAgIC8vIFdoZW4gZ2V0dGluZyBuZXR3b3JrIGVycm9yOiB0cnkgdG8gcGluZyBwZWVyLCBhbmQgdG9nZ2xlIHRvIG9mZmxpbmVcbiAgICB0aGlzLm9uTmV0d29ya0Vycm9yXG4gICAgICAucGlwZShcbiAgICAgICAgdGhyb3R0bGVUaW1lKDMwMCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLm5ldHdvcmsub25saW5lKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5uZXR3b3JrLmNoZWNrUGVlckFsaXZlKCkpLFxuICAgICAgICBmaWx0ZXIoYWxpdmUgPT4gIWFsaXZlKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5ldHdvcmsuc2V0Rm9yY2VPZmZsaW5lKHRydWUsIHtzaG93VG9hc3Q6IHRydWV9KSk7XG5cbiAgfVxuXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gQXBwbHkgdG9rZW4gYXV0aGVudGljYXRpb24gdG8gaGVhZGVycycpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhUb2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICAvLyBDbGVhbiBhdXRoIHRva2VuXG4gICAgZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhUb2tlbikge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIFJlbW92ZSB0b2tlbiBhdXRoZW50aWNhdGlvbiBmcm9tIGhlYWRlcnMnKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VuO1xuICAgICAgLy8gQ2xlYXIgY2FjaGVcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldEF1dGhCYXNpYyhiYXNpYzogc3RyaW5nKSB7XG4gICAgaWYgKGJhc2ljKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gQXBwbHkgYmFzaWMgYXV0aGVudGljYXRpb24gdG8gaGVhZGVycycpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhCYXNpYyA9IGJhc2ljO1xuICAgIH1cbiAgICAvLyBDbGVhbiBhdXRoIGJhc2ljXG4gICAgZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhCYXNpYykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIFJlbW92ZSBiYXNpYyBhdXRoZW50aWNhdGlvbiBmcm9tIGhlYWRlcnMnKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aEJhc2ljO1xuICAgICAgLy8gQ2xlYXIgY2FjaGVcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBhZGQgYSBmaWVsZCByZXNvbHZlclxuICAgKiAgKHNlZSBkb2M6IGh0dHBzOi8vd3d3LmFwb2xsb2dyYXBocWwuY29tL2RvY3MvcmVhY3QvZGF0YS9sb2NhbC1zdGF0ZS8jaGFuZGxpbmctY2xpZW50LWZpZWxkcy13aXRoLXJlc29sdmVycylcbiAgICpcbiAgICogQHBhcmFtIHJlc29sdmVyc1xuICAgKi9cbiAgYXN5bmMgYWRkUmVzb2x2ZXIocmVzb2x2ZXJzOiBSZXNvbHZlcnMgfCBSZXNvbHZlcnNbXSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgdGhpcy5hcG9sbG8uY2xpZW50LmFkZFJlc29sdmVycyhyZXNvbHZlcnMpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnk8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiB7XG4gICAgcXVlcnk6IGFueTtcbiAgICB2YXJpYWJsZXM/OiBWO1xuICAgIGVycm9yPzogU2VydmljZUVycm9yO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gIH0pOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5PEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+LCBWPih7XG4gICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICBmZXRjaFBvbGljeTogb3B0cy5mZXRjaFBvbGljeSB8fCAodGhpcy5fZGVmYXVsdEZldGNoUG9saWN5IGFzIEZldGNoUG9saWN5KSB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzID0gdGhpcy50b0Fwb2xsb0Vycm9yPFQ+KGVyciwgb3B0cy5lcnJvcik7XG4gICAgfVxuICAgIGlmIChyZXMuZXJyb3JzKSB7XG4gICAgICB0aHJvdyByZXMuZXJyb3JzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmRhdGE7XG4gIH1cblxuICB3YXRjaFF1ZXJ5UmVmPFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0czogV2F0Y2hRdWVyeU9wdGlvbnM8Vj4pOiBRdWVyeVJlZjxULCBWPiB7XG4gICAgcmV0dXJuIHRoaXMuYXBvbGxvLndhdGNoUXVlcnk8VCwgVj4oe1xuICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdHMuZmV0Y2hQb2xpY3kgfHwgKHRoaXMuX2RlZmF1bHRGZXRjaFBvbGljeSBhcyBGZXRjaFBvbGljeSkgfHwgdW5kZWZpbmVkLFxuICAgICAgbm90aWZ5T25OZXR3b3JrU3RhdHVzQ2hhbmdlOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBxdWVyeVJlZlZhbHVlc0NoYW5nZXM8VCwgViA9IEVtcHR5T2JqZWN0PihxdWVyeVJlZjogUXVlcnlSZWY8VCwgVj4sIG9wdHM6IFdhdGNoUXVlcnlPcHRpb25zPFY+KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHF1ZXJ5UmVmXG4gICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLm9uQXBvbGxvRXJyb3I8VD4oZXJyb3IsIG9wdHMuZXJyb3IpKSxcbiAgICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlLm5ldHdvcmtTdGF0dXMgPT09IE5ldHdvcmtTdGF0dXMucmVhZHkgfHwgdmFsdWUubmV0d29ya1N0YXR1cyA9PT0gTmV0d29ya1N0YXR1cy5lcnJvciksXG4gICAgICAgIG1hcCgoe2RhdGEsIGVycm9yc30pID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHdhdGNoUXVlcnk8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiBXYXRjaFF1ZXJ5T3B0aW9uczxWPik6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHF1ZXJ5UmVmOiBRdWVyeVJlZjxULCBWPiA9IHRoaXMud2F0Y2hRdWVyeVJlZihvcHRzKTtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVJlZlZhbHVlc0NoYW5nZXMocXVlcnlSZWYsIG9wdHMpO1xuICB9XG5cbiAgYXN5bmMgbXV0YXRlPFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0czogTXV0YXRlUXVlcnlPcHRpb25zPFQsIFY+KTogUHJvbWlzZTxUPiB7XG5cbiAgICAvLyBJZiBvZmZsaW5lLCBjb21wdXRlIGFuIG9wdGltaXN0aWMgcmVzcG9uc2UgZm9yIHRyYWNrZWQgcXVlcmllc1xuICAgIGlmICgob3B0cy5mb3JjZU9mZmxpbmUgfHwgdGhpcy5uZXR3b3JrLm9mZmxpbmUpICYmIG9wdHMub2ZmbGluZVJlc3BvbnNlKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMub2ZmbGluZVJlc3BvbnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdHMuY29udGV4dCA9IG9wdHMuY29udGV4dCB8fCB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW1pc3RpY1Jlc3BvbnNlRm4gPSAob3B0cy5vZmZsaW5lUmVzcG9uc2UgYXMgKChjb250ZXh0OiBhbnkpID0+IFByb21pc2U8VD4pKTtcbiAgICAgICAgb3B0cy5vcHRpbWlzdGljUmVzcG9uc2UgPSBhd2FpdCBvcHRpbWlzdGljUmVzcG9uc2VGbihvcHRzLmNvbnRleHQpO1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tncmFwaHFsXSBbb2ZmbGluZV0gVXNpbmcgYW4gb3B0aW1pc3RpYyByZXNwb25zZTogJywgb3B0cy5vcHRpbWlzdGljUmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG9wdHMub3B0aW1pc3RpY1Jlc3BvbnNlID0gb3B0cy5vZmZsaW5lUmVzcG9uc2UgYXMgVDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmZvcmNlT2ZmbGluZSkge1xuICAgICAgICBjb25zdCByZXMgPSB7ZGF0YTogb3B0cy5vcHRpbWlzdGljUmVzcG9uc2V9O1xuICAgICAgICBpZiAob3B0cy51cGRhdGUpIHtcbiAgICAgICAgICBvcHRzLnVwZGF0ZSh0aGlzLmFwb2xsby5jbGllbnQuY2FjaGUsIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcy5kYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYXBvbGxvLm11dGF0ZTxBcG9sbG9RdWVyeVJlc3VsdDxUPiwgVj4oe1xuICAgICAgbXV0YXRpb246IG9wdHMubXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgY29udGV4dDogb3B0cy5jb250ZXh0LFxuICAgICAgb3B0aW1pc3RpY1Jlc3BvbnNlOiBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSBhcyBhbnksXG4gICAgICB1cGRhdGU6IG9wdHMudXBkYXRlIGFzIGFueVxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLm9uQXBvbGxvRXJyb3I8VD4oZXJyb3IsIG9wdHMuZXJyb3IpKSxcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgLy8gVG8gZGVidWcsIGlmIG5lZWQ6XG4gICAgICAgIC8vdGFwKChyZXMpID0+ICghcmVzKSAmJiBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gVW5rbm93biBlcnJvciBkdXJpbmcgbXV0YXRpb24uIENoZWNrIGVycm9ycyBpbiBjb25zb2xlIChtYXkgYmUgYW4gaW52YWxpZCBnZW5lcmF0ZWQgY2FjaGUgaWQgPyknKSlcbiAgICAgICkudG9Qcm9taXNlKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLmVycm9ycykpIHtcbiAgICAgIHRocm93IHJlcy5lcnJvcnNbMF07XG4gICAgfVxuICAgIHJldHVybiByZXMuZGF0YSBhcyBUO1xuICB9XG5cbiAgc3Vic2NyaWJlPFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0czoge1xuICAgIHF1ZXJ5OiBhbnk7XG4gICAgdmFyaWFibGVzOiBWO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gICAgZXJyb3JQb2xpY3k/OiBFcnJvclBvbGljeTtcbiAgICBlcnJvcj86IFNlcnZpY2VFcnJvcjtcbiAgfSwgZXh0cmE/OiBFeHRyYVN1YnNjcmlwdGlvbk9wdGlvbnMpOiBPYnNlcnZhYmxlPFQ+IHtcblxuICAgIHJldHVybiB0aGlzLmFwb2xsby5zdWJzY3JpYmU8VD4oe1xuICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICBmZXRjaFBvbGljeTogb3B0cyAmJiBvcHRzLmZldGNoUG9saWN5IHx8ICduZXR3b3JrLW9ubHknLFxuICAgICAgZXJyb3JQb2xpY3k6IG9wdHMgJiYgb3B0cy5lcnJvclBvbGljeSB8fCB1bmRlZmluZWQsXG4gICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzXG4gICAgfSwge1xuICAgICAgdXNlWm9uZTogdHJ1ZSxcbiAgICAgIC4uLmV4dHJhXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMub25BcG9sbG9FcnJvcjxUPihlcnJvciwgb3B0cy5lcnJvcikpLFxuICAgICAgICBtYXAoKHtkYXRhLCBlcnJvcnN9KSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBpbnNlcnRJbnRvUXVlcnlDYWNoZTxULCBWID0gRW1wdHlPYmplY3Q+KGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHM6IENhY2hlLlJlYWRRdWVyeU9wdGlvbnM8ViwgYW55PiAmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IFQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0Rm4/OiAoZDE6IFQsIGQyOiBUKSA9PiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPzogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHtcblxuICAgIGNhY2hlID0gY2FjaGUgfHwgdGhpcy5hcG9sbG8uY2xpZW50LmNhY2hlO1xuICAgIG9wdHMuYXJyYXlGaWVsZE5hbWUgPSBvcHRzLmFycmF5RmllbGROYW1lIHx8ICdkYXRhJztcblxuICAgIHRyeSB7XG4gICAgICBsZXQgZGF0YSA9IGNhY2hlLnJlYWRRdWVyeTxhbnksIFY+KHtxdWVyeTogb3B0cy5xdWVyeSwgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlc30pO1xuXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIC8vIEFwcGVuZCB0byByZXN1bHQgYXJyYXlcbiAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IFsgLi4uZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSwgey4uLm9wdHMuZGF0YX1dO1xuXG4gICAgICAgIC8vIFJlc29ydCwgaWYgbmVlZFxuICAgICAgICBpZiAob3B0cy5zb3J0Rm4pIHtcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNvcnQob3B0cy5zb3J0Rm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhjbHVkZSBpZiBleGNlZWQgbWF4IHNpemVcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRvTnVtYmVyKG9wdHMudmFyaWFibGVzICYmIG9wdHMudmFyaWFibGVzWydzaXplJ10sIC0xKTtcbiAgICAgICAgaWYgKHNpemUgPiAwICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0ubGVuZ3RoID4gc2l6ZSkge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKHNpemUsIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0ubGVuZ3RoIC0gc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNyZW1lbnQgdG90YWxcbiAgICAgICAgaWYgKGlzTm90TmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0pKSB7XG4gICAgICAgICAgICBkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLnRvdGFsRmllbGROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYWNoZS53cml0ZVF1ZXJ5KHtcbiAgICAgICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLmFycmF5RmllbGROYW1lKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgICAvLyByZWFkIGluIGNhY2hlIGlzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhIHJlc3VsdC4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL3JlYWN0LWFwb2xsby9pc3N1ZXMvMTc3NiNpc3N1ZWNvbW1lbnQtMzcyMjM3OTQwXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZXJyb3IoJ1tncmFwaHFsXSBFcnJvciB3aGlsZSB1cGRhdGluZyBjYWNoZTogJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBhZGRNYW55VG9RdWVyeUNhY2hlPFQgPSBhbnksIFYgPSBFbXB0eU9iamVjdD4oY2FjaGU6IEFwb2xsb0NhY2hlPGFueT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmllbGROYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBUW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsc0ZuPzogKGQxOiBULCBkMjogVCkgPT4gYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydEZuPzogKGQxOiBULCBkMjogVCkgPT4gbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkge1xuXG4gICAgaWYgKCFvcHRzLmRhdGEgfHwgIW9wdHMuZGF0YS5sZW5ndGgpIHJldHVybjsgLy8gbm90aGluZyB0byBwcm9jZXNzXG5cbiAgICBjYWNoZSA9IGNhY2hlIHx8IHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZTtcbiAgICBvcHRzLmFycmF5RmllbGROYW1lID0gb3B0cy5hcnJheUZpZWxkTmFtZSB8fCAnZGF0YSc7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IGRhdGEgPSBjYWNoZS5yZWFkUXVlcnk8YW55LCBWPih7cXVlcnk6IG9wdHMucXVlcnksIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXN9KTtcblxuICAgICAgaWYgKGRhdGEgJiYgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSkge1xuICAgICAgICAvLyBDb3B5IGJlY2F1c2UgaW1tdXRhYmxlXG4gICAgICAgIGRhdGEgPSB7IC4uLmRhdGEgfTtcblxuICAgICAgICAvLyBLZWVwIG9ubHkgbm90IGV4aXN0aW5nIHJlc1xuICAgICAgICBjb25zdCBlcXVhbHNGbiA9IG9wdHMuZXF1YWxzRm4gfHwgKChkMSwgZDIpID0+IGQxWydpZCddID09PSBkMlsnaWQnXSAmJiBkMVsnZW50aXR5TmFtZSddID09PSBkMlsnZW50aXR5TmFtZSddKTtcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBvcHRzLmRhdGEuZmlsdGVyKGlucHV0VmFsdWUgPT4gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5maW5kSW5kZXgoZXhpc3RpbmdWYWx1ZSA9PiBlcXVhbHNGbihpbnB1dFZhbHVlLCBleGlzdGluZ1ZhbHVlKSkgPT09IC0xKTtcblxuICAgICAgICBpZiAoIW5ld0l0ZW1zLmxlbmd0aCkgcmV0dXJuOyAvLyBObyBuZXcgdmFsdWVcblxuICAgICAgICAvLyBBcHBlbmQgdG8gYXJyYXlcbiAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IFsgLi4uZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSwgLi4ubmV3SXRlbXNdO1xuXG4gICAgICAgIC8vIFJlc29ydCwgaWYgbmVlZFxuICAgICAgICBpZiAob3B0cy5zb3J0Rm4pIHtcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNvcnQob3B0cy5zb3J0Rm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhjbHVkZSBpZiBleGNlZWQgbWF4IHNpemVcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRvTnVtYmVyKG9wdHMudmFyaWFibGVzICYmIG9wdHMudmFyaWFibGVzWydzaXplJ10sIC0xKTtcbiAgICAgICAgaWYgKHNpemUgPiAwICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0ubGVuZ3RoID4gc2l6ZSkge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKHNpemUsIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0ubGVuZ3RoIC0gc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIHRvdGFsXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSkge1xuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSArPSBuZXdJdGVtcy5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLnRvdGFsRmllbGROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0byBjYWNoZVxuICAgICAgICBjYWNoZS53cml0ZVF1ZXJ5KHtcbiAgICAgICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLmFycmF5RmllbGROYW1lKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgICAvLyByZWFkIGluIGNhY2hlIGlzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhIHJlc3VsdC4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL3JlYWN0LWFwb2xsby9pc3N1ZXMvMTc3NiNpc3N1ZWNvbW1lbnQtMzcyMjM3OTQwXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUud2FybignW2dyYXBocWxdIEVycm9yIHdoaWxlIHVwZGF0aW5nIGNhY2hlOiAnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZnJvbSBjYWNoZSwgYW5kIHJldHVybiBpZiByZW1vdmVkIG9yIG5vdFxuICAgKlxuICAgKiBAcGFyYW0gY2FjaGVcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIHJlbW92ZUZyb21DYWNoZWRRdWVyeUJ5SWQ8ViA9IEVtcHR5T2JqZWN0LCBJRCA9IG51bWJlcj4oY2FjaGU6IEFwb2xsb0NhY2hlPGFueT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0czogQ2FjaGUuUmVhZFF1ZXJ5T3B0aW9uczxWLCBhbnk+ICYge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlGaWVsZE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmllbGROYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBJRDsgLy8gRG8gTk9UIHVzZSAnaWQnLCBhcyBhbHJlYWR5IHVzZWQgYnkgdGhlIEFwb2xsbyBBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTogYm9vbGVhbiB7XG5cbiAgICBjYWNoZSA9IGNhY2hlIHx8IHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZTtcbiAgICBvcHRzLmFycmF5RmllbGROYW1lID0gb3B0cy5hcnJheUZpZWxkTmFtZSB8fCAnZGF0YSc7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IGRhdGEgPSBjYWNoZS5yZWFkUXVlcnk8YW55LCBWPih7cXVlcnk6IG9wdHMucXVlcnksIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXN9KTtcblxuICAgICAgaWYgKGRhdGEgJiYgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSkge1xuICAgICAgICAvLyBDb3B5IGJlY2F1c2UgaW1tdXRhYmxlXG4gICAgICAgIGRhdGEgPSB7IC4uLmRhdGEgfTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uZmluZEluZGV4KGl0ZW0gPT4gaXRlbVsnaWQnXSA9PT0gb3B0cy5pZHMpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7IC8vIFNraXAgKG5vdGhpbmcgcmVtb3ZlZClcblxuICAgICAgICAvLyBDb3B5LCB0aGVuIHJlbW92ZSBkZWxldGVkIGl0ZW1cbiAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc2xpY2UoKTtcbiAgICAgICAgY29uc3QgZGVsZXRlZEl0ZW0gPSBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgIGNhY2hlLmV2aWN0KHtpZDogY2FjaGUuaWRlbnRpZnkoZGVsZXRlZEl0ZW0pfSk7XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRoZSB0b3RhbFxuICAgICAgICBpZiAoaXNOb3ROaWwob3B0cy50b3RhbEZpZWxkTmFtZSkpIHtcbiAgICAgICAgICBpZiAoaXNOb3ROaWwoZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSkpIHtcbiAgICAgICAgICAgIGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0gLT0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRvIGNhY2hlXG4gICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLmFycmF5RmllbGROYW1lKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWVcbiAgICAgIC8vIHJlYWQgaW4gY2FjaGUgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgcmVzdWx0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvcmVhY3QtYXBvbGxvL2lzc3Vlcy8xNzc2I2lzc3VlY29tbWVudC0zNzIyMzc5NDBcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgcmVtb3ZpbmcgZnJvbSBjYWNoZTogJywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGlkcyBmcm9tIGNhY2hlLCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgcmVtb3ZlZFxuICAgKlxuICAgKiBAcGFyYW0gY2FjaGVcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIHJlbW92ZUZyb21DYWNoZWRRdWVyeUJ5SWRzPFYgPSBFbXB0eU9iamVjdCwgSUQgPSBudW1iZXI+KGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlGaWVsZE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHM6IElEW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOiBudW1iZXIge1xuXG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhID0gY2FjaGUucmVhZFF1ZXJ5KG9wdHMpO1xuXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRJbmRleGVzID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5yZWR1Y2UoKHJlcywgaXRlbSwgaW5kZXgpID0+IG9wdHMuaWRzLmluY2x1ZGVzKGl0ZW1bJ2lkJ10pID8gcmVzLmNvbmNhdChpbmRleCkgOiByZXMsIFtdKTtcblxuICAgICAgICBpZiAoZGVsZXRlZEluZGV4ZXMubGVuZ3RoIDw9IDApIHJldHVybiAwOyAvLyBTa2lwIChub3RoaW5nIHJlbW92ZWQpXG5cbiAgICAgICAgLy8gUXVlcnkgaGFzIE5PIHRvdGFsXG4gICAgICAgIGlmIChpc05pbChvcHRzLnRvdGFsRmllbGROYW1lKSkge1xuXG4gICAgICAgICAgLy8gRXZpY3QgZWFjaCBvYmplY3RcbiAgICAgICAgICBkZWxldGVkSW5kZXhlc1xuICAgICAgICAgICAgLm1hcChpbmRleCA9PiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdW2luZGV4XSlcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBjYWNoZS5pZGVudGlmeShpdGVtKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGlkID0+IGNhY2hlLmV2aWN0KHtpZH0pKTtcblxuICAgICAgICB9XG4gICAgICAgIC8vIFF1ZXJ5IGhhcyBhIHRvdGFsXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIENvcHkgdGhlIGFycmF5XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc2xpY2UoKTtcblxuICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGFycmF5LCB0aGVuIGV2aWN0XG4gICAgICAgICAgZGVsZXRlZEluZGV4ZXNcbiAgICAgICAgICAgIC8vIFJldmVyc2U6IHRvIGtlZXAgdmFsaWQgaW5kZXhcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgLm1hcChpbmRleCA9PiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNwbGljZShpbmRleCwgMSlbMF0pXG4gICAgICAgICAgICAvLyBFdmljdCBmcm9tIGNhY2hlXG4gICAgICAgICAgICAubWFwKGl0ZW0gPT4gY2FjaGUuaWRlbnRpZnkoaXRlbSkpXG4gICAgICAgICAgICAuZm9yRWFjaChpZCA9PiBjYWNoZS5ldmljdCh7aWR9KSk7XG5cbiAgICAgICAgICBpZiAoaXNOb3ROaWwoZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSkpIHtcbiAgICAgICAgICAgIGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0gLT0gZGVsZXRlZEluZGV4ZXMubGVuZ3RoOyAvLyBSZW1vdmUgZGVsZXRpb24gY291bnRcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIHRoZSB0b3RhbCBpbiBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLnRvdGFsRmllbGROYW1lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWNoZS53cml0ZVF1ZXJ5KHtcbiAgICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBkZWxldGVkSW5kZXhlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMuYXJyYXlGaWVsZE5hbWUpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgICAvLyByZWFkIGluIGNhY2hlIGlzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhIHJlc3VsdC4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL3JlYWN0LWFwb2xsby9pc3N1ZXMvMTc3NiNpc3N1ZWNvbW1lbnQtMzcyMjM3OTQwXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUud2FybignW2dyYXBocWxdIEVycm9yIHdoaWxlIHJlbW92aW5nIGZyb20gY2FjaGU6ICcsIGVycik7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUb1F1ZXJ5Q2FjaGU8VCBleHRlbmRzIElFbnRpdHk8YW55PixcbiAgICBWID0gRW1wdHlPYmplY3Q+KGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgb3B0czogQ2FjaGUuUmVhZFF1ZXJ5T3B0aW9uczxWLCBhbnk+ICYge1xuICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogVDtcbiAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzRm4/OiAoZDE6IFQsIGQyOiBUKSA9PiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgfSkge1xuICAgIGNhY2hlID0gY2FjaGUgfHwgdGhpcy5hcG9sbG8uY2xpZW50LmNhY2hlO1xuICAgIG9wdHMuYXJyYXlGaWVsZE5hbWUgPSBvcHRzLmFycmF5RmllbGROYW1lIHx8ICdkYXRhJztcblxuICAgIHRyeSB7XG4gICAgICBsZXQgZGF0YTogYW55ID0gY2FjaGUucmVhZFF1ZXJ5KG9wdHMpO1xuXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIGNvbnN0IGVxdWFsc0ZuID0gb3B0cy5lcXVhbHNGbiB8fCAoKGQxLCBkMikgPT4gRW50aXR5VXRpbHMuZXF1YWxzKGQxLCBkMiwgJ2lkJykpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBpZiBleGlzdHMsIG9yIGluc2VydFxuICAgICAgICBjb25zdCBpbmRleCA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uZmluZEluZGV4KHYgPT4gZXF1YWxzRm4ob3B0cy5kYXRhLCB2KSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zbGljZSgpLnNwbGljZShpbmRleCwgMSwgb3B0cy5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gWyAuLi5kYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLCBvcHRzLmRhdGFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHRvdGFsIChpZiBjaGFuZ2VkKVxuICAgICAgICBpZiAoaXNOb3ROaWwob3B0cy50b3RhbEZpZWxkTmFtZSkgJiYgaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0pKSB7XG4gICAgICAgICAgICBkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLnRvdGFsRmllbGROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYWNoZS53cml0ZVF1ZXJ5KHtcbiAgICAgICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjsgLy8gT0s6IHN0b3AgaGVyZVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWVcbiAgICAgIC8vIHJlYWQgaW4gY2FjaGUgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgcmVzdWx0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvcmVhY3QtYXBvbGxvL2lzc3Vlcy8xNzc2I2lzc3VlY29tbWVudC0zNzIyMzc5NDBcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgdXBkYXRpbmcgY2FjaGU6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2xlYXJDYWNoZShjbGllbnQ/OiBBcG9sbG9DbGllbnQ8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNsaWVudCA9IChjbGllbnQgfHwgdGhpcy5jbGllbnQpIGFzIEFwb2xsb0NsaWVudDxhbnk+O1xuICAgIGlmIChjbGllbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIENsZWFuaW5nIGNhY2hlLi4uICcpO1xuICAgICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQ2xlYXJpbmcgdGhlIGNhY2hlXG4gICAgICBhd2FpdCBjbGllbnQuY2FjaGUucmVzZXQoKTtcblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZ3JhcGhxbF0gQ2xlYW5pbmcgY2FjaGUgW09LXSBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlckN1c3RvbUVycm9yKGVycm9yOiBQcm9wZXJ0aWVzTWFwKSB7XG4gICAgdGhpcy5jdXN0b21FcnJvcnMgPSB7Li4udGhpcy5jdXN0b21FcnJvcnMsIC4uLmVycm9yfTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPEFwb2xsb0NsaWVudDxhbnk+PiB7XG5cbiAgICAvLyBXYWl0IG5ldHdvcmsgYW5kIHN0b3JhZ2VcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnN0b3JhZ2UucmVhZHkoKSxcbiAgICAgIHRoaXMubmV0d29yay5yZWFkeSgpXG4gICAgXSk7XG5cbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBTdGFydGluZyBncmFwaHFsLi4uJyk7XG4gICAgY29uc3QgbW9iaWxlID0gaXNNb2JpbGUod2luZG93KTtcbiAgICBjb25zdCBlbmFibGVUcmFja011dGF0aW9uUXVlcmllcyA9ICFtb2JpbGU7XG5cbiAgICBjb25zdCBwZWVyID0gdGhpcy5uZXR3b3JrLnBlZXI7XG4gICAgaWYgKCFwZWVyKSB0aHJvdyBFcnJvcignW2dyYXBocWxdIE1pc3NpbmcgcGVlci4gVW5hYmxlIHRvIHN0YXJ0IGdyYXBocWwgc2VydmljZScpO1xuXG4gICAgY29uc3QgdXJpID0gcGVlci51cmwgKyAnL2dyYXBocWwnO1xuICAgIGNvbnN0IHdzVXJsID0gdXJpLnJlcGxhY2UoL15odHRwKHMpPzovLCAnd3MkMTonKSArICcvd2Vic29ja2V0JztcbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBCYXNlIHVyaTogJyArIHVyaSk7XG4gICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gU3Vic2NyaXB0aW9uIHVyaTogJyArIHdzVXJsKTtcblxuICAgIHRoaXMuaHR0cFBhcmFtcyA9IHRoaXMuaHR0cFBhcmFtcyB8fCB7fTtcbiAgICB0aGlzLmh0dHBQYXJhbXMudXJpID0gdXJpO1xuXG4gICAgdGhpcy53c1BhcmFtcyA9IHtcbiAgICAgIC4uLnRoaXMud3NQYXJhbXMsXG4gICAgICBsYXp5OiB0cnVlLFxuICAgICAgY29ubmVjdGlvblBhcmFtczogdGhpcy5jb25uZWN0aW9uUGFyYW1zLFxuICAgICAgd2ViU29ja2V0SW1wbDogQXBwV2ViU29ja2V0LFxuICAgICAgdXJsOiB3c1VybCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyT3JDbG9zZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWwtc2VydmljZV0gW1dTXSBUcnlpbmcgdG8gcmVjb25uZWN0Li4uJywgZXJyT3JDbG9zZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgcmV0cnlBdHRlbXB0czogMTBcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgc3RvcmFnZSBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qgc3RvcmFnZTogUGVyc2lzdGVudFN0b3JhZ2U8c3RyaW5nPiA9IG5ldyBTdG9yYWdlU2VydmljZVdyYXBwZXIodGhpcy5zdG9yYWdlKTtcblxuICAgIGxldCBjbGllbnQgPSB0aGlzLmFwb2xsby5jbGllbnQ7XG4gICAgaWYgKCFjbGllbnQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1thcG9sbG9dIENyZWF0aW5nIEdyYXBoUUwgY2xpZW50Li4uJyk7XG5cbiAgICAgIC8vIFdlYnNvY2tldCBsaW5rXG4gICAgICBjb25zdCB3c0xpbmsgPSBuZXcgR3JhcGhRTFdzTGluayhjcmVhdGVDbGllbnQodGhpcy53c1BhcmFtcykpO1xuXG4gICAgICAvLyBSZXRyeSB3aGVuIGZhaWxlZCBsaW5rXG4gICAgICBjb25zdCByZXRyeUxpbmsgPSBuZXcgUmV0cnlMaW5rKCk7XG4gICAgICBjb25zdCBhdXRoTGluayA9IG5ldyBBcG9sbG9MaW5rKChvcGVyYXRpb24sIGZvcndhcmQpID0+IHtcblxuICAgICAgICBjb25zdCBhdXRob3JpemF0aW9uID0gW107XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VuKSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbi5wdXNoKGB0b2tlbiAke3RoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoVG9rZW59YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoQmFzaWMpIHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uLnB1c2goYEJhc2ljICR7dGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhCYXNpY31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcbiAgICAgICAgICAuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgYXV0aG9yaXphdGlvbik7XG5cbiAgICAgICAgLy8gVXNlIHRoZSBzZXRDb250ZXh0IG1ldGhvZCB0byBzZXQgdGhlIEhUVFAgaGVhZGVycy5cbiAgICAgICAgb3BlcmF0aW9uLnNldENvbnRleHQoe1xuICAgICAgICAgIC4uLm9wZXJhdGlvbi5nZXRDb250ZXh0KCksXG4gICAgICAgICAgLi4ue2hlYWRlcnN9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENhbGwgdGhlIG5leHQgbGluayBpbiB0aGUgbWlkZGxld2FyZSBjaGFpbi5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQob3BlcmF0aW9uKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBIdHRwIGxpbmtcbiAgICAgIGNvbnN0IGh0dHBMaW5rID0gdGhpcy5odHRwTGluay5jcmVhdGUodGhpcy5odHRwUGFyYW1zKTtcblxuICAgICAgLy8gQ2FjaGVcbiAgICAgIGNvbnN0IGNhY2hlID0gbmV3IEluTWVtb3J5Q2FjaGUoe1xuICAgICAgICB0eXBlUG9saWNpZXM6IHRoaXMudHlwZVBvbGljaWVzXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGNhY2hlIHBlcnNpc3RlbmNlXG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5wZXJzaXN0Q2FjaGUpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIFN0YXJ0aW5nIHBlcnNpc3RlbmNlIGNhY2hlLi4uJyk7XG4gICAgICAgIGF3YWl0IHBlcnNpc3RDYWNoZSh7XG4gICAgICAgICAgY2FjaGUsXG4gICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICB0cmlnZ2VyOiB0aGlzLnBsYXRmb3JtLmlzKCdhbmRyb2lkJykgPyAnYmFja2dyb3VuZCcgOiAnd3JpdGUnLFxuICAgICAgICAgIGRlYm91bmNlOiAxMDAwLFxuICAgICAgICAgIGRlYnVnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgbXV0YXRpb25MaW5rczogQXJyYXk8QXBvbGxvTGluaz47XG5cbiAgICAgIC8vIEFkZCBxdWV1ZSB0byBzdG9yZSB0cmFja2VkIHF1ZXJpZXMsIHdoZW4gb2ZmbGluZVxuICAgICAgaWYgKGVuYWJsZVRyYWNrTXV0YXRpb25RdWVyaWVzKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6aW5nTGluayA9IG5ldyBTZXJpYWxpemluZ0xpbmsoKTtcbiAgICAgICAgY29uc3QgdHJhY2tlckxpbmsgPSBjcmVhdGVUcmFja2VyTGluayh7XG4gICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICBvbk5ldHdvcmtTdGF0dXNDaGFuZ2U6IHRoaXMuX25ldHdvcmtTdGF0dXNDaGFuZ2VkJCxcbiAgICAgICAgICBkZWJvdW5jZTogMTAwMCxcbiAgICAgICAgICBkZWJ1ZzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ3JlYXRpbmcgYSBtdXRhdGlvbiBxdWV1ZVxuICAgICAgICBjb25zdCBxdWV1ZUxpbmsgPSBuZXcgUXVldWVMaW5rKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24odGhpcy5fbmV0d29ya1N0YXR1c0NoYW5nZWQkXG4gICAgICAgICAgLnN1YnNjcmliZSh0eXBlID0+IHtcbiAgICAgICAgICAgIC8vIE5ldHdvcmsgaXMgb2ZmbGluZTogc3RhcnQgYnVmZmVyaW5nIGludG8gcXVldWVcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gb2ZmbGluZSBtb2RlOiBlbmFibGUgbXV0YXRpb25zIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICBxdWV1ZUxpbmsuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5ldHdvcmsgaXMgb25saW5lXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gb25saW5lIG1vZGU6IGRpc2FibGUgbXV0YXRpb25zIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICBxdWV1ZUxpbmsub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgbXV0YXRpb25MaW5rcyA9IFtcbiAgICAgICAgICBsb2dnZXJMaW5rLFxuICAgICAgICAgIHF1ZXVlTGluayxcbiAgICAgICAgICB0cmFja2VyTGluayxcbiAgICAgICAgICBxdWV1ZUxpbmssXG4gICAgICAgICAgc2VyaWFsaXppbmdMaW5rLFxuICAgICAgICAgIHJldHJ5TGluayxcbiAgICAgICAgICBhdXRoTGluayxcbiAgICAgICAgICBodHRwTGlua1xuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG11dGF0aW9uTGlua3MgPSBbXG4gICAgICAgICAgcmV0cnlMaW5rLFxuICAgICAgICAgIGF1dGhMaW5rLFxuICAgICAgICAgIGh0dHBMaW5rXG4gICAgICAgIF07XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZSBBcG9sbG9cbiAgICAgIGNsaWVudCA9IG5ldyBBcG9sbG9DbGllbnQoe1xuICAgICAgICBjYWNoZSxcbiAgICAgICAgbGluazpcbiAgICAgICAgICBBcG9sbG9MaW5rLnNwbGl0KFxuICAgICAgICAgICAgLy8gSGFuZGxlIG11dGF0aW9uc1xuICAgICAgICAgICAgaXNNdXRhdGlvbk9wZXJhdGlvbixcbiAgICAgICAgICAgIEFwb2xsb0xpbmsuZnJvbShtdXRhdGlvbkxpbmtzKSxcblxuICAgICAgICAgICAgQXBvbGxvTGluay5zcGxpdChcbiAgICAgICAgICAgICAgLy8gSGFuZGxlIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgICAgaXNTdWJzY3JpcHRpb25PcGVyYXRpb24sXG4gICAgICAgICAgICAgIHdzTGluayxcblxuICAgICAgICAgICAgICAvLyBIYW5kbGUgcXVlcmllc1xuICAgICAgICAgICAgICBBcG9sbG9MaW5rLmZyb20oW1xuICAgICAgICAgICAgICAgIHJldHJ5TGluayxcbiAgICAgICAgICAgICAgICBhdXRoTGluayxcbiAgICAgICAgICAgICAgICBodHRwTGlua1xuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgIGNvbm5lY3RUb0RldlRvb2xzOiAhdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hcG9sbG8uY2xpZW50ID0gY2xpZW50O1xuICAgIH1cblxuICAgIC8vIEVuYWJsZSB0cmFja2VkIHF1ZXJpZXMgcGVyc2lzdGVuY2VcbiAgICBpZiAoZW5hYmxlVHJhY2tNdXRhdGlvblF1ZXJpZXMgJiYgdGhpcy5lbnZpcm9ubWVudC5wZXJzaXN0Q2FjaGUpIHtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVzdG9yZVRyYWNrZWRRdWVyaWVzKHtcbiAgICAgICAgICBhcG9sbG9DbGllbnQ6IGNsaWVudCxcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIGRlYnVnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tncmFwaHFsXSBGYWlsZWQgdG8gcmVzdG9yZSB0cmFja2VkIHF1ZXJpZXMgZnJvbSBzdG9yYWdlOiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpLCBlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExpc3RlbiBmb3IgbmV0d29yayByZXN0YXJ0XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMubmV0d29yay5vbignc3RhcnQnLCAoKSA9PiB0aGlzLnJlc3RhcnQoKSlcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjbGVhciBjYWNoZSByZXF1ZXN0LCBmcm9tIG5ldHdvcmtcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5uZXR3b3JrLm9uKCdyZXNldENhY2hlJywgKCkgPT4gdGhpcy5jbGVhckNhY2hlKCkpXG4gICAgKTtcblxuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIFN0YXJ0aW5nIGdyYXBocWwgW09LXScpO1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0b3AoKSB7XG4gICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gU3RvcHBpbmcgZ3JhcGhxbCBzZXJ2aWNlLi4uJyk7XG4gICAgYXdhaXQgdGhpcy5yZXNldENsaWVudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc2V0Q2xpZW50KGNsaWVudD86IEFwb2xsb0NsaWVudDxhbnk+KSB7XG4gICAgY2xpZW50ID0gKGNsaWVudCB8fCB0aGlzLmFwb2xsby5jbGllbnQpIGFzIEFwb2xsb0NsaWVudDxhbnk+O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBSZXNldHRpbmcgQXBvbGxvIGNsaWVudC4uLicpO1xuICAgIGNsaWVudC5zdG9wKCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgY2xpZW50LmNsZWFyU3RvcmUoKSxcbiAgICAgIHRoaXMuY2xlYXJDYWNoZShjbGllbnQpXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIG9uQXBvbGxvRXJyb3I8VD4oZXJyOiBhbnksIGRlZmF1bHRFcnJvcj86IGFueSk6IE9ic2VydmFibGU8QXBvbGxvUXVlcnlSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gb2YodGhpcy50b0Fwb2xsb0Vycm9yPFQ+KGVyciwgZGVmYXVsdEVycm9yKSk7XG4gIH1cblxuICBwcml2YXRlIHRvQXBvbGxvRXJyb3I8VD4oZXJyOiBhbnksIGRlZmF1bHRFcnJvcj86IGFueSk6IEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+IHtcbiAgICBsZXQgZXJyb3IgPVxuICAgICAgLy8gSWYgbmV0d29yayBlcnJvcjogdHJ5IHRvIGNvbnZlcnQgdG8gQXBwIChyZWFkIGFzIEpTT04pLCBvciBjcmVhdGUgYW4gVU5LTk9XTl9ORVRXT1JLX0VSUk9SXG4gICAgICAoZXJyLm5ldHdvcmtFcnJvciAmJiAoXG4gICAgICAgICAgKGVyci5uZXR3b3JrRXJyb3IuZXJyb3IgJiYgdGhpcy50b0FwcEVycm9yKGVyci5uZXR3b3JrRXJyb3IuZXJyb3IpKVxuICAgICAgICAgIHx8IHRoaXMudG9BcHBFcnJvcihlcnIubmV0d29ya0Vycm9yKVxuICAgICAgICAgIHx8IChlcnIubmV0d29ya0Vycm9yLmVycm9yICYmIHRoaXMuY3JlYXRlQXBwRXJyb3JCeUNvZGUoZXJyLm5ldHdvcmtFcnJvci5lcnJvci5zdGF0dXMpKVxuICAgICAgICAgIHx8IHRoaXMuY3JlYXRlQXBwRXJyb3JCeUNvZGUoRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1IpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC8vIElmIGdyYXBoUUw6IHRyeSB0byBjb252ZXJ0IHRoZSBmaXJzdCBlcnJvciBmb3VuZFxuICAgICAgfHwgKGVyci5ncmFwaFFMRXJyb3JzICYmIGVyci5ncmFwaFFMRXJyb3JzLmxlbmd0aCAmJiB0aGlzLnRvQXBwRXJyb3IoZXJyLmdyYXBoUUxFcnJvcnNbMF0pKVxuICAgICAgfHwgdGhpcy50b0FwcEVycm9yKGVycilcbiAgICAgIHx8IHRoaXMudG9BcHBFcnJvcihlcnIub3JpZ2luYWxFcnJvcilcbiAgICAgIHx8IChlcnIuZ3JhcGhRTEVycm9ycyAmJiBlcnIuZ3JhcGhRTEVycm9yc1swXSlcbiAgICAgIHx8IGVycjtcbiAgICBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gJyArIChlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yKSwgZXJyb3Iuc3RhY2sgfHwgJycpO1xuICAgIGlmIChlcnJvciAmJiBlcnJvci5jb2RlID09PSBFcnJvckNvZGVzLlVOS05PV05fTkVUV09SS19FUlJPUiAmJiBlcnIubmV0d29ya0Vycm9yICYmIGVyci5uZXR3b3JrRXJyb3IubWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcignW2dyYXBocWxdIG9yaWdpbmFsIGVycm9yOiAnICsgZXJyLm5ldHdvcmtFcnJvci5tZXNzYWdlKTtcbiAgICAgIHRoaXMub25OZXR3b3JrRXJyb3IubmV4dChlcnJvcik7XG4gICAgfVxuICAgIGlmICgoIWVycm9yIHx8ICFlcnJvci5jb2RlKSAmJiBkZWZhdWx0RXJyb3IpIHtcbiAgICAgIGVycm9yID0gey4uLmRlZmF1bHRFcnJvciwgZGV0YWlsczogZXJyb3IsIHN0YWNrOiBlcnIuc3RhY2t9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIGVycm9yczogW2Vycm9yXSxcbiAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgbmV0d29ya1N0YXR1czogTmV0d29ya1N0YXR1cy5lcnJvclxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFwcEVycm9yQnlDb2RlKGVycm9yQ29kZTogbnVtYmVyKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXRJMThuRXJyb3JNZXNzYWdlQnlDb2RlKGVycm9yQ29kZSk7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IGVycm9yQ29kZSxcbiAgICAgICAgbWVzc2FnZTogdGhpcy5nZXRJMThuRXJyb3JNZXNzYWdlQnlDb2RlKGVycm9yQ29kZSlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEkxOG5FcnJvck1lc3NhZ2VCeUNvZGUoZXJyb3JDb2RlOiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXG4gICAgLy8gbG9vayBpbiByZWdpc3RlcmVkIGVycm9yIGNvZGVzXG4gICAgY29uc3QgY3VzdG9tRXJyb3JNZXNzYWdlID0gdGhpcy5jdXN0b21FcnJvcnNbZXJyb3JDb2RlXTtcbiAgICBpZiAoY3VzdG9tRXJyb3JNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gY3VzdG9tRXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQsIHN3aXRjaCBvbiBlcnJvciBjb2RlXG4gICAgc3dpdGNoIChlcnJvckNvZGUpIHtcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5VTkFVVEhPUklaRUQ6XG4gICAgICAgIHJldHVybiAnRVJST1IuVU5BVVRIT1JJWkVEJztcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5GT1JCSURERU46XG4gICAgICAgIHJldHVybiAnRVJST1IuRk9SQklEREVOJztcbiAgICAgIGNhc2UgRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1I6XG4gICAgICAgIHJldHVybiAnRVJST1IuVU5LTk9XTl9ORVRXT1JLX0VSUk9SJztcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5CQURfVVBEQVRFX0RBVEU6XG4gICAgICAgIHJldHVybiAnRVJST1IuQkFEX1VQREFURV9EQVRFJztcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5EQVRBX0xPQ0tFRDpcbiAgICAgICAgcmV0dXJuICdFUlJPUi5EQVRBX0xPQ0tFRCc7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuQkFEX0FQUF9WRVJTSU9OOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLkJBRF9BUFBfVkVSU0lPTic7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdG9BcHBFcnJvcihlcnI6IGFueSk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGVycm9yID0gZXJyO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyO1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS50cmltKCkuaW5kZXhPZigne1wiY29kZVwiOicpID09PSAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UobWVzc2FnZVxuICAgICAgICAgIC8vIFJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMgYmVmb3JlIHBhcnNpbmcgKGUuZy4gU1FMIGVycm9ycyBmcm9tIGFuIE9yYWNsZSBkYXRhYmFzZSlcbiAgICAgICAgICAucmVwbGFjZSgnXFxuJywgJyAnKVxuICAgICAgICAgIC5yZXBsYWNlKCdcXHInLCAnJykpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIHBhcnNlIGVycm9yIGFzIEpTT046ICcsIHBhcnNlRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQXBwRXJyb3JCeUNvZGUoZXJyb3IuY29kZSkgfHwgZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG59XG4iXX0=
|