@colijnit/homedecorator 255.1.1
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/_variables.scss +1 -0
- package/app/app.component.scss +30 -0
- package/app/app.version.d.ts +5 -0
- package/app/bundle/threedselector-bundle/threedselector-bundle.component.scss +24 -0
- package/app/bundle/threedselector-bundle/threedselector-selections-bundle.component.scss +4 -0
- package/app/core/components/debug/debug.component.d.ts +17 -0
- package/app/core/components/debug/debug.component.scss +27 -0
- package/app/core/components/error/error-message.component.d.ts +14 -0
- package/app/core/components/error/error-message.component.scss +18 -0
- package/app/core/components/tooltip/tooltip.component.d.ts +17 -0
- package/app/core/components/tooltip/tooltip.component.scss +34 -0
- package/app/core/const/dimensioning.d.ts +24 -0
- package/app/core/core.module.d.ts +27 -0
- package/app/core/directive/autofocus.directive.d.ts +11 -0
- package/app/core/directive/tooltip.directive.d.ts +21 -0
- package/app/core/directive/visibility-observer-master.directive.d.ts +12 -0
- package/app/core/directive/visibility-observer.directive.d.ts +16 -0
- package/app/core/enum/configuration-key.enum.d.ts +35 -0
- package/app/core/enum/export-type.enum.d.ts +5 -0
- package/app/core/enum/google-tag-manager-event.enum.d.ts +12 -0
- package/app/core/enum/icon-name.enum.d.ts +15 -0
- package/app/core/enum/icon.enum.d.ts +33 -0
- package/app/core/enum/light.enum.d.ts +7 -0
- package/app/core/enum/message-type.enum.d.ts +69 -0
- package/app/core/enum/model-type.enum.d.ts +6 -0
- package/app/core/enum/output-encoding.enum.d.ts +4 -0
- package/app/core/enum/shadow-map-type.enum.d.ts +6 -0
- package/app/core/enum/user-role-type.enum.d.ts +18 -0
- package/app/core/enum/view-mode.enum.d.ts +9 -0
- package/app/core/enum/xr-mode.enum.d.ts +4 -0
- package/app/core/interface/adjustable-element.interface.d.ts +5 -0
- package/app/core/interface/category.interface.d.ts +9 -0
- package/app/core/interface/changes.interface.d.ts +9 -0
- package/app/core/interface/child-params.interface.d.ts +3 -0
- package/app/core/interface/configuration-data.interface.d.ts +36 -0
- package/app/core/interface/external-settings.interface.d.ts +6 -0
- package/app/core/interface/info-dialog-data.interface.d.ts +4 -0
- package/app/core/interface/light-preset.interface.d.ts +18 -0
- package/app/core/interface/loading-overlay-data.interface.d.ts +4 -0
- package/app/core/interface/media-resource.interface.d.ts +6 -0
- package/app/core/interface/message-with-payload.interface.d.ts +81 -0
- package/app/core/interface/message-without-payload.interface.d.ts +35 -0
- package/app/core/interface/preset.interface.d.ts +8 -0
- package/app/core/interface/selected-floor-event.interface.d.ts +5 -0
- package/app/core/interface/selected-wall-event.interface.d.ts +6 -0
- package/app/core/interface/texture.interface.d.ts +37 -0
- package/app/core/interface/toolbar-icon.interface.d.ts +8 -0
- package/app/core/model/ar-position-indicator.d.ts +4 -0
- package/app/core/model/camera-settings.d.ts +12 -0
- package/app/core/model/category.d.ts +12 -0
- package/app/core/model/custom-button.d.ts +10 -0
- package/app/core/model/error-message.d.ts +8 -0
- package/app/core/model/export-object.d.ts +5 -0
- package/app/core/model/from-intersection-observer.d.ts +7 -0
- package/app/core/model/homedecorator-settings-options.d.ts +46 -0
- package/app/core/model/homedecorator-settings.d.ts +54 -0
- package/app/core/model/icon.d.ts +4 -0
- package/app/core/model/light-preset.d.ts +27 -0
- package/app/core/model/light-properties.d.ts +25 -0
- package/app/core/model/media-resource.d.ts +7 -0
- package/app/core/model/preset.d.ts +10 -0
- package/app/core/model/ral-color.d.ts +19 -0
- package/app/core/model/shadow-properties.d.ts +7 -0
- package/app/core/model/texture-type.d.ts +6 -0
- package/app/core/model/texture.d.ts +43 -0
- package/app/core/model/three-object.d.ts +1 -0
- package/app/core/model/toast-type.d.ts +5 -0
- package/app/core/model/toast.d.ts +5 -0
- package/app/core/model/xr-reticle.d.ts +17 -0
- package/app/core/pipe/append.pipe.d.ts +7 -0
- package/app/core/pipe/cm-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/filter.pipe.d.ts +7 -0
- package/app/core/pipe/keys.pipe.d.ts +7 -0
- package/app/core/pipe/localize.pipe.d.ts +10 -0
- package/app/core/pipe/m-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/prepend.pipe.d.ts +7 -0
- package/app/core/pipe/scm-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/sm-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/strip-html.pipe.d.ts +7 -0
- package/app/core/service/3dm-api.d.ts +65 -0
- package/app/core/service/app-state.service.d.ts +49 -0
- package/app/core/service/configuration.service.d.ts +15 -0
- package/app/core/service/debug.service.d.ts +16 -0
- package/app/core/service/dimensioning.service.d.ts +14 -0
- package/app/core/service/dynamic-camera.service.d.ts +23 -0
- package/app/core/service/environment.service.d.ts +8 -0
- package/app/core/service/error.service.d.ts +11 -0
- package/app/core/service/export.service.d.ts +18 -0
- package/app/core/service/file.service.d.ts +9 -0
- package/app/core/service/homedecorator-app-event.service.d.ts +23 -0
- package/app/core/service/homedecorator-app.service.d.ts +58 -0
- package/app/core/service/homedecorator-connector-adapter.service.d.ts +90 -0
- package/app/core/service/homedecorator-connector.service.d.ts +127 -0
- package/app/core/service/homedecorator-dictionary.service.d.ts +15 -0
- package/app/core/service/homedecorator-icon-cache.service.d.ts +21 -0
- package/app/core/service/homedecorator-settings.service.d.ts +23 -0
- package/app/core/service/homedecorator.service.d.ts +14 -0
- package/app/core/service/integration.service.d.ts +16 -0
- package/app/core/service/item-serialization.service.d.ts +78 -0
- package/app/core/service/json-utils.service.d.ts +7 -0
- package/app/core/service/message-bus.service.d.ts +21 -0
- package/app/core/service/permanent-store.service.d.ts +37 -0
- package/app/core/service/presets.service.d.ts +50 -0
- package/app/core/service/progress.service.d.ts +17 -0
- package/app/core/service/ral.service.d.ts +17 -0
- package/app/core/service/skip-button-info.service.d.ts +19 -0
- package/app/core/service/toast.service.d.ts +12 -0
- package/app/core/service/utils.service.d.ts +68 -0
- package/app/core/service/view-mode.service.d.ts +27 -0
- package/app/core/service/web-worker.service.d.ts +18 -0
- package/app/core/utils/clone-utils.d.ts +5 -0
- package/app/core/utils/color.utils.d.ts +7 -0
- package/app/core/utils/file.utils.d.ts +36 -0
- package/app/core/utils/function/is-empty.function.d.ts +1 -0
- package/app/core/utils/function/is-nill.function.d.ts +1 -0
- package/app/core/utils/material.utils.d.ts +33 -0
- package/app/core/utils/object.utils.d.ts +14 -0
- package/app/core/utils/relative-position.utils.d.ts +12 -0
- package/app/core/utils/variation-utils.d.ts +12 -0
- package/app/core/workers/enum/web-worker-message.enum.d.ts +4 -0
- package/app/core/workers/enum/web-worker-type.enum.d.ts +3 -0
- package/app/development/components/selected-child-material-texture.component.d.ts +58 -0
- package/app/development/components/selected-child-material-texture.component.scss +122 -0
- package/app/development/components/selected-child-material.component.d.ts +73 -0
- package/app/development/components/selected-child-material.component.scss +45 -0
- package/app/development/components/selected-child.component.d.ts +8 -0
- package/app/development/components/selected-child.component.scss +40 -0
- package/app/development/components/selected-object-base.d.ts +32 -0
- package/app/development/components/selected-object.component.d.ts +20 -0
- package/app/development/components/selected-object.component.scss +13 -0
- package/app/development/development.module.d.ts +19 -0
- package/app/development/directive/development.directive.d.ts +19 -0
- package/app/development/service/development.service.d.ts +49 -0
- package/app/homedecorator.component.d.ts +42 -0
- package/app/homedecorator.component.scss +34 -0
- package/app/homedecorator.module.d.ts +18 -0
- package/app/plugins/core3d/collision-manager/collision-manager.service.d.ts +23 -0
- package/app/plugins/core3d/collision-manager/floorplan-collision-detection.d.ts +9 -0
- package/app/plugins/core3d/collision-manager/snapping-collision.service.d.ts +47 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.d.ts +17 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.scss +30 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.d.ts +25 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.scss +13 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.d.ts +21 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.scss +6 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.d.ts +11 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.scss +19 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.d.ts +16 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.scss +23 -0
- package/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.d.ts +46 -0
- package/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.scss +93 -0
- package/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.d.ts +24 -0
- package/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.scss +93 -0
- package/app/plugins/core3d/components/lightplan/lightplan.component.d.ts +60 -0
- package/app/plugins/core3d/components/lightplan/lightplan.component.scss +102 -0
- package/app/plugins/core3d/components/scene-options/scene-options.component.d.ts +17 -0
- package/app/plugins/core3d/components/scene-options/scene-options.component.scss +54 -0
- package/app/plugins/core3d/core/angles.d.ts +8 -0
- package/app/plugins/core3d/core/corner-utils.d.ts +8 -0
- package/app/plugins/core3d/core/dimensioning.d.ts +19 -0
- package/app/plugins/core3d/core/utils.d.ts +147 -0
- package/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.d.ts +49 -0
- package/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.scss +3 -0
- package/app/plugins/core3d/core3d/core3d.component.d.ts +76 -0
- package/app/plugins/core3d/core3d/core3d.component.scss +27 -0
- package/app/plugins/core3d/core3d.module.d.ts +38 -0
- package/app/plugins/core3d/directive/scene.directive.d.ts +26 -0
- package/app/plugins/core3d/enum/ar-feature.enum.d.ts +12 -0
- package/app/plugins/core3d/enum/direction.enum.d.ts +8 -0
- package/app/plugins/core3d/enum/result-type.enum.d.ts +19 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/bounding-box-measurement.d.ts +28 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/box-measurement.d.ts +17 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/door-or-window-box-measurement.d.ts +29 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/measurable.d.ts +8 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/measurement-utils.d.ts +9 -0
- package/app/plugins/core3d/hud/custom-shape-name-label.d.ts +15 -0
- package/app/plugins/core3d/hud/floor-indicator.d.ts +20 -0
- package/app/plugins/core3d/hud/furniture-measurements.d.ts +12 -0
- package/app/plugins/core3d/hud/indicator-factory.d.ts +7 -0
- package/app/plugins/core3d/hud/measurements.d.ts +46 -0
- package/app/plugins/core3d/hud/on-wall-measurements.d.ts +18 -0
- package/app/plugins/core3d/hud/opening-symbol.d.ts +11 -0
- package/app/plugins/core3d/hud/rotation-helper.d.ts +44 -0
- package/app/plugins/core3d/hud/utils.d.ts +3 -0
- package/app/plugins/core3d/interface/dragged-data.interface.d.ts +10 -0
- package/app/plugins/core3d/interface/edge-visibility-changes.d.ts +5 -0
- package/app/plugins/core3d/interface/model.interface.d.ts +42 -0
- package/app/plugins/core3d/interface/opening.interface.d.ts +6 -0
- package/app/plugins/core3d/interface/scene-option-button.interface.d.ts +17 -0
- package/app/plugins/core3d/interface/scene-update.interface.d.ts +5 -0
- package/app/plugins/core3d/items/base-item.d.ts +97 -0
- package/app/plugins/core3d/items/custom-cylinder-floor-item.d.ts +12 -0
- package/app/plugins/core3d/items/custom-cylinder-wall-item.d.ts +13 -0
- package/app/plugins/core3d/items/custom-floor-item.d.ts +9 -0
- package/app/plugins/core3d/items/custom-objects.d.ts +55 -0
- package/app/plugins/core3d/items/custom-shape-floor-item.d.ts +9 -0
- package/app/plugins/core3d/items/custom-shape-wall-item.d.ts +10 -0
- package/app/plugins/core3d/items/custom-wall-floor-item.d.ts +19 -0
- package/app/plugins/core3d/items/custom-wall-item.d.ts +9 -0
- package/app/plugins/core3d/items/factory.d.ts +24 -0
- package/app/plugins/core3d/items/floor-item.d.ts +13 -0
- package/app/plugins/core3d/items/floor-pin.d.ts +11 -0
- package/app/plugins/core3d/items/floor-plane-item.d.ts +30 -0
- package/app/plugins/core3d/items/furniture.d.ts +3 -0
- package/app/plugins/core3d/items/in-wall-floor-item.d.ts +9 -0
- package/app/plugins/core3d/items/item-group.d.ts +51 -0
- package/app/plugins/core3d/items/item-type.d.ts +21 -0
- package/app/plugins/core3d/items/item.d.ts +84 -0
- package/app/plugins/core3d/items/metadata.d.ts +74 -0
- package/app/plugins/core3d/items/on-floor-item.d.ts +8 -0
- package/app/plugins/core3d/items/pin.d.ts +5 -0
- package/app/plugins/core3d/items/three-mesh.d.ts +8 -0
- package/app/plugins/core3d/items/wall-floor-item.d.ts +8 -0
- package/app/plugins/core3d/items/wall-objects.d.ts +512 -0
- package/app/plugins/core3d/items/wall-pin.d.ts +8 -0
- package/app/plugins/core3d/model/ar-parameters.d.ts +9 -0
- package/app/plugins/core3d/model/box-skin-default.d.ts +5 -0
- package/app/plugins/core3d/model/collision-info.d.ts +6 -0
- package/app/plugins/core3d/model/custom-floor-group-result.d.ts +18 -0
- package/app/plugins/core3d/model/cylinder-skin-default.d.ts +4 -0
- package/app/plugins/core3d/model/dragged-status.d.ts +18 -0
- package/app/plugins/core3d/model/face.d.ts +11 -0
- package/app/plugins/core3d/model/geometry.d.ts +11 -0
- package/app/plugins/core3d/model/scene-event.enum.d.ts +10 -0
- package/app/plugins/core3d/model/skin.d.ts +15 -0
- package/app/plugins/core3d/model/threed-model.d.ts +47 -0
- package/app/plugins/core3d/service/ar.service.d.ts +121 -0
- package/app/plugins/core3d/service/camera.service.d.ts +70 -0
- package/app/plugins/core3d/service/ceiling.service.d.ts +25 -0
- package/app/plugins/core3d/service/controls.d.ts +11 -0
- package/app/plugins/core3d/service/drag-and-drop.service.d.ts +73 -0
- package/app/plugins/core3d/service/error-glow.service.d.ts +18 -0
- package/app/plugins/core3d/service/floor.service.d.ts +43 -0
- package/app/plugins/core3d/service/font.service.d.ts +10 -0
- package/app/plugins/core3d/service/hud.service.d.ts +79 -0
- package/app/plugins/core3d/service/intersection.service.d.ts +10 -0
- package/app/plugins/core3d/service/item-group.service.d.ts +33 -0
- package/app/plugins/core3d/service/item.service.d.ts +37 -0
- package/app/plugins/core3d/service/light-presets.service.d.ts +46 -0
- package/app/plugins/core3d/service/lights.service.d.ts +38 -0
- package/app/plugins/core3d/service/message-board.service.d.ts +18 -0
- package/app/plugins/core3d/service/models.service.d.ts +37 -0
- package/app/plugins/core3d/service/outline.service.d.ts +40 -0
- package/app/plugins/core3d/service/rotation.service.d.ts +57 -0
- package/app/plugins/core3d/service/scene-event.service.d.ts +131 -0
- package/app/plugins/core3d/service/scene-options.service.d.ts +11 -0
- package/app/plugins/core3d/service/scene.service.d.ts +74 -0
- package/app/plugins/core3d/service/vr.service.d.ts +44 -0
- package/app/plugins/core3d/service/wall-measurements.service.d.ts +23 -0
- package/app/plugins/core3d/service/xr.service.d.ts +56 -0
- package/app/plugins/core3d/textures/DepthDataTexture.d.ts +5 -0
- package/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.d.ts +19 -0
- package/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.scss +7 -0
- package/app/plugins/furniture-manager/furniture-library/furniture-library.component.d.ts +27 -0
- package/app/plugins/furniture-manager/furniture-library/furniture-library.component.scss +20 -0
- package/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.d.ts +91 -0
- package/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.scss +57 -0
- package/app/plugins/furniture-manager/furniture-manager.module.d.ts +23 -0
- package/app/plugins/help/help/help.component.d.ts +21 -0
- package/app/plugins/help/help/help.component.scss +0 -0
- package/app/plugins/help/help-dialog/help-dialog.component.d.ts +20 -0
- package/app/plugins/help/help-dialog/help-dialog.component.scss +28 -0
- package/app/plugins/help/help.module.d.ts +12 -0
- package/app/plugins/lite-selector/lite-selector/component/animation/animation.component.d.ts +19 -0
- package/app/plugins/lite-selector/lite-selector/component/animation/animation.component.scss +0 -0
- package/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.d.ts +41 -0
- package/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.scss +25 -0
- package/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.d.ts +72 -0
- package/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.scss +146 -0
- package/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.d.ts +19 -0
- package/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.scss +37 -0
- package/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.d.ts +28 -0
- package/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.scss +127 -0
- package/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.d.ts +9 -0
- package/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.scss +47 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.d.ts +31 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.scss +11 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.d.ts +38 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.scss +80 -0
- package/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.d.ts +8 -0
- package/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.scss +10 -0
- package/app/plugins/lite-selector/lite-selector/lite-selector.component.d.ts +40 -0
- package/app/plugins/lite-selector/lite-selector/lite-selector.component.scss +10 -0
- package/app/plugins/lite-selector/lite-selector/service/customizer.service.d.ts +44 -0
- package/app/plugins/lite-selector/lite-selector.module.d.ts +22 -0
- package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +57 -0
- package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +75 -0
- package/app/plugins/model-uploader/model-uploader/model-upload.component.scss +34 -0
- package/app/plugins/model-uploader/model-uploader/model-uploader.component.d.ts +23 -0
- package/app/plugins/model-uploader/model-uploader.module.d.ts +16 -0
- package/app/plugins/plugin-interface.d.ts +5 -0
- package/app/plugins/plugins.module.d.ts +15 -0
- package/app/plugins/presets/presets/presets.component.d.ts +22 -0
- package/app/plugins/presets/presets/presets.component.scss +0 -0
- package/app/plugins/presets/presets.module.d.ts +10 -0
- package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.d.ts +19 -0
- package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.scss +4 -0
- package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.module.d.ts +10 -0
- package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +70 -0
- package/app/plugins/product-catalog/product-catalog/product-catalog.component.scss +128 -0
- package/app/plugins/product-catalog/product-catalog.module.d.ts +16 -0
- package/app/plugins/render/enum/connection-status.d.ts +6 -0
- package/app/plugins/render/enum/render-modes.d.ts +5 -0
- package/app/plugins/render/enum/render-status.d.ts +7 -0
- package/app/plugins/render/model/camera-position.d.ts +7 -0
- package/app/plugins/render/model/image-size.d.ts +6 -0
- package/app/plugins/render/model/lightning.d.ts +5 -0
- package/app/plugins/render/model/render-data.d.ts +15 -0
- package/app/plugins/render/model/render-environment.d.ts +6 -0
- package/app/plugins/render/model/render-parameters.d.ts +15 -0
- package/app/plugins/render/model/render-queue-item.d.ts +14 -0
- package/app/plugins/render/model/render-settings.d.ts +9 -0
- package/app/plugins/render/model/render.d.ts +14 -0
- package/app/plugins/render/render-controls/render-controls.component.d.ts +27 -0
- package/app/plugins/render/render-controls/render-controls.component.scss +51 -0
- package/app/plugins/render/render-dialog/render-dialog.component.d.ts +59 -0
- package/app/plugins/render/render-dialog/render-dialog.component.scss +320 -0
- package/app/plugins/render/render.module.d.ts +20 -0
- package/app/plugins/render/service/new-render.service.d.ts +65 -0
- package/app/plugins/render/service/render.service.d.ts +104 -0
- package/app/plugins/room-planner/components/appearance-section/appearance-section.component.d.ts +43 -0
- package/app/plugins/room-planner/components/appearance-section/appearance-section.component.scss +14 -0
- package/app/plugins/room-planner/components/color-picker/color-picker.component.d.ts +11 -0
- package/app/plugins/room-planner/components/color-picker/color-picker.component.scss +0 -0
- package/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.d.ts +49 -0
- package/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.scss +19 -0
- package/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.d.ts +49 -0
- package/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.scss +24 -0
- package/app/plugins/room-planner/components/dimension-input/dimension-input.component.d.ts +22 -0
- package/app/plugins/room-planner/components/dimension-input/dimension-input.component.scss +14 -0
- package/app/plugins/room-planner/components/edit-apply/edit-apply.component.d.ts +19 -0
- package/app/plugins/room-planner/components/edit-apply/edit-apply.component.scss +0 -0
- package/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.d.ts +28 -0
- package/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.scss +23 -0
- package/app/plugins/room-planner/components/file-drop/file-drop.component.d.ts +21 -0
- package/app/plugins/room-planner/components/file-drop/file-drop.component.scss +31 -0
- package/app/plugins/room-planner/components/floorplanner/const/defaults.d.ts +48 -0
- package/app/plugins/room-planner/components/floorplanner/floorplanner-mode.d.ts +9 -0
- package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +172 -0
- package/app/plugins/room-planner/components/floorplanner/floorplanner.component.scss +48 -0
- package/app/plugins/room-planner/components/floorplanner/service/floorplan.service.d.ts +103 -0
- package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +75 -0
- package/app/plugins/room-planner/components/floorplanner/snap-indicator-mode.d.ts +5 -0
- package/app/plugins/room-planner/components/floorplanner/utils/context.utils.d.ts +5 -0
- package/app/plugins/room-planner/components/object-library/object-library.component.d.ts +23 -0
- package/app/plugins/room-planner/components/object-library/object-library.component.scss +43 -0
- package/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.d.ts +22 -0
- package/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.scss +55 -0
- package/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.d.ts +11 -0
- package/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.scss +10 -0
- package/app/plugins/room-planner/components/selected-floor/selected-floor.component.d.ts +16 -0
- package/app/plugins/room-planner/components/selected-floor/selected-floor.component.scss +16 -0
- package/app/plugins/room-planner/components/selected-object/selected-object.component.d.ts +44 -0
- package/app/plugins/room-planner/components/selected-object/selected-object.component.scss +21 -0
- package/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.d.ts +57 -0
- package/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.scss +35 -0
- package/app/plugins/room-planner/components/selected-wall/selected-wall.component.d.ts +45 -0
- package/app/plugins/room-planner/components/selected-wall/selected-wall.component.scss +31 -0
- package/app/plugins/room-planner/components/settings/settings-options.component.d.ts +18 -0
- package/app/plugins/room-planner/components/settings/settings-options.component.scss +46 -0
- package/app/plugins/room-planner/components/settings/settings.component.d.ts +63 -0
- package/app/plugins/room-planner/components/settings/settings.component.scss +42 -0
- package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +125 -0
- package/app/plugins/room-planner/components/texture-editor/texture-editor.component.scss +38 -0
- package/app/plugins/room-planner/components/texture-picker/texture-picker.component.d.ts +25 -0
- package/app/plugins/room-planner/components/texture-picker/texture-picker.component.scss +49 -0
- package/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.d.ts +16 -0
- package/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.scss +5 -0
- package/app/plugins/room-planner/const/key.d.ts +10 -0
- package/app/plugins/room-planner/room-planner/room-planner.component.d.ts +236 -0
- package/app/plugins/room-planner/room-planner/room-planner.component.scss +167 -0
- package/app/plugins/room-planner/room-planner.module.d.ts +59 -0
- package/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.d.ts +18 -0
- package/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.scss +7 -0
- package/app/plugins/threed-in-photo/components/upload-image/upload-image.component.d.ts +18 -0
- package/app/plugins/threed-in-photo/components/upload-image/upload-image.component.scss +7 -0
- package/app/plugins/threed-in-photo/components/view-control/view-control.component.d.ts +30 -0
- package/app/plugins/threed-in-photo/components/view-control/view-control.component.scss +40 -0
- package/app/plugins/threed-in-photo/models/model-output.d.ts +14 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-build.service.d.ts +37 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-connection.service.d.ts +8 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-control.service.d.ts +14 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-event-listeners.service.d.ts +15 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-event.service.d.ts +9 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-initializer.service.d.ts +27 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-render.service.d.ts +20 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-scene.service.d.ts +12 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-view.service.d.ts +8 -0
- package/app/plugins/threed-in-photo/threed-in-photo.module.d.ts +17 -0
- package/app/plugins/threed-in-photo/utils/utils.d.ts +6 -0
- package/app/plugins/threedselector/element-buttons/element-buttons.component.d.ts +31 -0
- package/app/plugins/threedselector/element-buttons/element-buttons.component.scss +61 -0
- package/app/plugins/threedselector/element-slider/element-slider.component.d.ts +14 -0
- package/app/plugins/threedselector/element-slider/element-slider.component.scss +47 -0
- package/app/plugins/threedselector/element-toolbar/element-toolbar.component.d.ts +26 -0
- package/app/plugins/threedselector/element-toolbar/element-toolbar.component.scss +142 -0
- package/app/plugins/threedselector/threedselector/model/furniture-connected-part-integration.d.ts +7 -0
- package/app/plugins/threedselector/threedselector/model/furniture-integration.d.ts +12 -0
- package/app/plugins/threedselector/threedselector/model/furniture-part-integration.d.ts +14 -0
- package/app/plugins/threedselector/threedselector/model/furniture-part-variation.d.ts +7 -0
- package/app/plugins/threedselector/threedselector/model/material.d.ts +41 -0
- package/app/plugins/threedselector/threedselector/model/variation-settings.d.ts +53 -0
- package/app/plugins/threedselector/threedselector/model/variation.d.ts +11 -0
- package/app/plugins/threedselector/threedselector/service/animation.service.d.ts +22 -0
- package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +186 -0
- package/app/plugins/threedselector/threedselector/service/dimensions.service.d.ts +33 -0
- package/app/plugins/threedselector/threedselector/service/element.service.d.ts +45 -0
- package/app/plugins/threedselector/threedselector/service/light-creation.service.d.ts +9 -0
- package/app/plugins/threedselector/threedselector/service/load-furniture.service.d.ts +74 -0
- package/app/plugins/threedselector/threedselector/service/resize.service.d.ts +13 -0
- package/app/plugins/threedselector/threedselector/service/third-party-model.service.d.ts +66 -0
- package/app/plugins/threedselector/threedselector/service/threedselector.service.d.ts +22 -0
- package/app/plugins/threedselector/threedselector/service/variation-cache.service.d.ts +23 -0
- package/app/plugins/threedselector/threedselector/service/variation.service.d.ts +23 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +188 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.scss +82 -0
- package/app/plugins/threedselector/threedselector/utils/asset.utils.d.ts +19 -0
- package/app/plugins/threedselector/threedselector/utils/image.utils.d.ts +6 -0
- package/app/plugins/threedselector/threedselector/utils/json-parser.utils.d.ts +9 -0
- package/app/plugins/threedselector/threedselector/utils/scene-3d.utils.d.ts +10 -0
- package/app/plugins/threedselector/threedselector.module.d.ts +31 -0
- package/app/plugins/toolbar/download-dialog/download-dialog.component.d.ts +14 -0
- package/app/plugins/toolbar/download-dialog/download-dialog.component.scss +22 -0
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +66 -0
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +97 -0
- package/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.d.ts +8 -0
- package/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.scss +0 -0
- package/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.d.ts +36 -0
- package/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.scss +71 -0
- package/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.d.ts +36 -0
- package/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.scss +3 -0
- package/app/plugins/toolbar/open-dialog/open-dialog.component.d.ts +23 -0
- package/app/plugins/toolbar/open-dialog/open-dialog.component.scss +0 -0
- package/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.d.ts +34 -0
- package/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.scss +17 -0
- package/app/plugins/toolbar/save-dialog/save-dialog.component.d.ts +38 -0
- package/app/plugins/toolbar/save-dialog/save-dialog.component.scss +33 -0
- package/app/plugins/toolbar/saved-dialog/saved-dialog.component.d.ts +24 -0
- package/app/plugins/toolbar/saved-dialog/saved-dialog.component.scss +7 -0
- package/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.d.ts +9 -0
- package/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.scss +10 -0
- package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +101 -0
- package/app/plugins/toolbar/toolbar/toolbar.component.scss +251 -0
- package/app/plugins/toolbar/toolbar.module.d.ts +44 -0
- package/app/root/root.component.scss +0 -0
- package/app/service/dynamic-script.service.d.ts +8 -0
- package/app/service/google-tag-manager.service.d.ts +19 -0
- package/app/service/local-storage.service.d.ts +18 -0
- package/app/service/service-locator.service.d.ts +4 -0
- package/app/shared/base64-images.d.ts +4 -0
- package/app/shared/button-elevation/button-elevation.component.d.ts +40 -0
- package/app/shared/button-elevation/button-elevation.component.scss +109 -0
- package/app/shared/button-elevation/button-elevation.module.d.ts +16 -0
- package/app/shared/camera-settings-dialog/camera-settings-dialog.component.d.ts +24 -0
- package/app/shared/camera-settings-dialog/camera-settings-dialog.component.scss +30 -0
- package/app/shared/camera-settings-dialog/camera-settings-dialog.module.d.ts +16 -0
- package/app/shared/category-library/category-library.component.d.ts +10 -0
- package/app/shared/category-library/category-library.component.scss +16 -0
- package/app/shared/category-library/category-library.module.d.ts +11 -0
- package/app/shared/context-menu/context-menu.component.d.ts +12 -0
- package/app/shared/context-menu/context-menu.component.scss +25 -0
- package/app/shared/context-menu/context-menu.module.d.ts +14 -0
- package/app/shared/context-menu/item-context-menu/item-context-menu.component.d.ts +30 -0
- package/app/shared/context-menu/item-context-menu/item-context-menu.component.scss +32 -0
- package/app/shared/dialog/dialog.component.d.ts +26 -0
- package/app/shared/dialog/dialog.component.scss +25 -0
- package/app/shared/dialog/dialog.module.d.ts +12 -0
- package/app/shared/dialog/enum/dialog-type.enum.d.ts +6 -0
- package/app/shared/dialog/interface/dialog-config.interface.d.ts +7 -0
- package/app/shared/dialog/service/dialog.service.d.ts +11 -0
- package/app/shared/error-dialog/error-dialog.component.d.ts +11 -0
- package/app/shared/error-dialog/error-dialog.component.scss +0 -0
- package/app/shared/error-dialog/error-dialog.module.d.ts +10 -0
- package/app/shared/export-dialog/export-dialog.component.d.ts +11 -0
- package/app/shared/export-dialog/export-dialog.component.scss +19 -0
- package/app/shared/export-dialog/export-dialog.module.d.ts +11 -0
- package/app/shared/info-dialog/info-dialog.component.d.ts +9 -0
- package/app/shared/info-dialog/info-dialog.component.scss +15 -0
- package/app/shared/info-dialog/info-dialog.module.d.ts +12 -0
- package/app/shared/loader/hd-loader.component.d.ts +6 -0
- package/app/shared/loader/hd-loader.component.scss +44 -0
- package/app/shared/loader/hd-loader.module.d.ts +9 -0
- package/app/shared/loader/loader.component.scss +42 -0
- package/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.d.ts +8 -0
- package/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.scss +3 -0
- package/app/shared/loading-overlay/loading-overlay.component.d.ts +19 -0
- package/app/shared/loading-overlay/loading-overlay.component.scss +9 -0
- package/app/shared/loading-overlay/loading-overlay.module.d.ts +11 -0
- package/app/shared/model-dialog/model-dialog-furniture-list.component.d.ts +35 -0
- package/app/shared/model-dialog/model-dialog-furniture-list.component.scss +221 -0
- package/app/shared/model-dialog/model-dialog.component.d.ts +31 -0
- package/app/shared/model-dialog/model-dialog.component.scss +22 -0
- package/app/shared/model-dialog/model-dialog.module.d.ts +16 -0
- package/app/shared/progress-bar/progress-bar.component.d.ts +9 -0
- package/app/shared/progress-bar/progress-bar.component.scss +11 -0
- package/app/shared/progress-bar/progress-bar.module.d.ts +9 -0
- package/app/shared/register-dialog/register-dialog.component.d.ts +26 -0
- package/app/shared/register-dialog/register-dialog.component.scss +21 -0
- package/app/shared/screen-size-analysis/device-size-type.d.ts +5 -0
- package/app/shared/screen-size-analysis/navigator-type.enum.d.ts +4 -0
- package/app/shared/screen-size-analysis/screen-size-analysis.service.d.ts +27 -0
- package/app/shared/screen-size-analysis/screen-size-config.d.ts +5 -0
- package/app/shared/screen-size-analysis/screen-size-info.d.ts +10 -0
- package/app/shared/slider-input/slider-input.component.d.ts +13 -0
- package/app/shared/slider-input/slider-input.component.scss +12 -0
- package/app/shared/slider-input/slider-input.module.d.ts +13 -0
- package/app/shared/toolbar-icon/toolbar-icon.component.d.ts +12 -0
- package/app/shared/toolbar-icon/toolbar-icon.component.scss +8 -0
- package/app/shared/toolbar-icon/toolbar-icon.module.d.ts +11 -0
- package/app/shared/zoom-controls/zoom-controls.component.d.ts +16 -0
- package/app/shared/zoom-controls/zoom-controls.component.scss +0 -0
- package/app/shared/zoom-controls/zoom-controls.module.d.ts +10 -0
- package/assets/.gitkeep +0 -0
- package/assets/3d-models/pin.mtl +12 -0
- package/assets/3d-models/pin.obj +1083 -0
- package/assets/colors/ral.json +2345 -0
- package/assets/cursors/pencil.png +0 -0
- package/assets/cursors/pencil.svg +1 -0
- package/assets/fonts/helvetiker_regular.ttf +0 -0
- package/assets/fonts/helvetiker_regular.typeface.json +1 -0
- package/assets/fonts/helvetiker_regular.woff +0 -0
- package/assets/fonts/optimer_regular.typeface.json +1 -0
- package/assets/hdri/TSStudio3Point.hdr +135 -0
- package/assets/hdri/ground_MASK.jpg +0 -0
- package/assets/hdri/std_env_v2_A.hdr +0 -0
- package/assets/hdri/std_env_v2_B.hdr +0 -0
- package/assets/hdri/std_env_v2_C.hdr +0 -0
- package/assets/hdri/std_env_v2_D.hdr +0 -0
- package/assets/hdri/std_env_v2_E.hdr +46 -0
- package/assets/icons/add-button.svg +10 -0
- package/assets/icons/ar_circle.svg +7 -0
- package/assets/icons/arrow_point_down.svg +6 -0
- package/assets/icons/brush.svg +1 -0
- package/assets/icons/cart-shopping-regular.svg +1 -0
- package/assets/icons/check.svg +6 -0
- package/assets/icons/cit_powered_white.svg +92 -0
- package/assets/icons/conf_frame.svg +1 -0
- package/assets/icons/conf_plane.svg +1 -0
- package/assets/icons/cross.svg +1 -0
- package/assets/icons/cube-outline.svg +1 -0
- package/assets/icons/cube-unfolded.svg +1 -0
- package/assets/icons/delete-button.svg +16 -0
- package/assets/icons/download.svg +4 -0
- package/assets/icons/edit-button.svg +18 -0
- package/assets/icons/google-cardboard-orange.svg +1 -0
- package/assets/icons/google-cardboard.svg +1 -0
- package/assets/icons/hand-pointer.svg +1 -0
- package/assets/icons/height_adjust.svg +1 -0
- package/assets/icons/magic-wand.svg +57 -0
- package/assets/icons/magnifier.svg +12 -0
- package/assets/icons/measurements.svg +1 -0
- package/assets/icons/move-phone-ar.svg +4 -0
- package/assets/icons/qrcode.svg +1 -0
- package/assets/icons/street-view-orange.svg +5 -0
- package/assets/icons/street-view.svg +6 -0
- package/assets/icons/swap-button.svg +12 -0
- package/assets/icons/tilt-phone.svg +29 -0
- package/assets/icons/triangle_down.svg +1 -0
- package/assets/icons/triangle_up.svg +1 -0
- package/assets/images/colijn-logo.webp +0 -0
- package/assets/images/favicon.ico +0 -0
- package/assets/images/favicon.png +0 -0
- package/assets/images/ione360-logo.webp +0 -0
- package/assets/images/logo.svg +35 -0
- package/assets/workers/indexedDB-web-worker.js +74 -0
- package/bundle-styles.scss +267 -0
- package/bundles/colijnit-homedecorator.umd.js +47374 -0
- package/bundles/colijnit-homedecorator.umd.js.map +1 -0
- package/colijnit-homedecorator.d.ts +5 -0
- package/environments/environment.d.ts +11 -0
- package/esm2015/app/app.version.js +9 -0
- package/esm2015/app/core/components/debug/debug.component.js +57 -0
- package/esm2015/app/core/components/error/error-message.component.js +55 -0
- package/esm2015/app/core/components/tooltip/tooltip.component.js +73 -0
- package/esm2015/app/core/const/dimensioning.js +28 -0
- package/esm2015/app/core/core.module.js +159 -0
- package/esm2015/app/core/directive/autofocus.directive.js +26 -0
- package/esm2015/app/core/directive/tooltip.directive.js +64 -0
- package/esm2015/app/core/directive/visibility-observer-master.directive.js +53 -0
- package/esm2015/app/core/directive/visibility-observer.directive.js +54 -0
- package/esm2015/app/core/enum/configuration-key.enum.js +37 -0
- package/esm2015/app/core/enum/export-type.enum.js +7 -0
- package/esm2015/app/core/enum/google-tag-manager-event.enum.js +14 -0
- package/esm2015/app/core/enum/icon-name.enum.js +17 -0
- package/esm2015/app/core/enum/icon.enum.js +35 -0
- package/esm2015/app/core/enum/light.enum.js +9 -0
- package/esm2015/app/core/enum/message-type.enum.js +71 -0
- package/esm2015/app/core/enum/model-type.enum.js +8 -0
- package/esm2015/app/core/enum/output-encoding.enum.js +6 -0
- package/esm2015/app/core/enum/shadow-map-type.enum.js +8 -0
- package/esm2015/app/core/enum/user-role-type.enum.js +22 -0
- package/esm2015/app/core/enum/view-mode.enum.js +11 -0
- package/esm2015/app/core/enum/xr-mode.enum.js +6 -0
- package/esm2015/app/core/interface/adjustable-element.interface.js +2 -0
- package/esm2015/app/core/interface/category.interface.js +2 -0
- package/esm2015/app/core/interface/changes.interface.js +2 -0
- package/esm2015/app/core/interface/child-params.interface.js +2 -0
- package/esm2015/app/core/interface/configuration-data.interface.js +2 -0
- package/esm2015/app/core/interface/external-settings.interface.js +2 -0
- package/esm2015/app/core/interface/info-dialog-data.interface.js +2 -0
- package/esm2015/app/core/interface/light-preset.interface.js +2 -0
- package/esm2015/app/core/interface/loading-overlay-data.interface.js +2 -0
- package/esm2015/app/core/interface/media-resource.interface.js +2 -0
- package/esm2015/app/core/interface/message-with-payload.interface.js +2 -0
- package/esm2015/app/core/interface/message-without-payload.interface.js +2 -0
- package/esm2015/app/core/interface/preset.interface.js +2 -0
- package/esm2015/app/core/interface/selected-floor-event.interface.js +2 -0
- package/esm2015/app/core/interface/selected-wall-event.interface.js +2 -0
- package/esm2015/app/core/interface/texture.interface.js +2 -0
- package/esm2015/app/core/interface/toolbar-icon.interface.js +2 -0
- package/esm2015/app/core/model/ar-position-indicator.js +21 -0
- package/esm2015/app/core/model/camera-settings.js +14 -0
- package/esm2015/app/core/model/category.js +15 -0
- package/esm2015/app/core/model/custom-button.js +16 -0
- package/esm2015/app/core/model/error-message.js +9 -0
- package/esm2015/app/core/model/export-object.js +3 -0
- package/esm2015/app/core/model/from-intersection-observer.js +64 -0
- package/esm2015/app/core/model/homedecorator-settings-options.js +49 -0
- package/esm2015/app/core/model/homedecorator-settings.js +22 -0
- package/esm2015/app/core/model/icon.js +34 -0
- package/esm2015/app/core/model/light-preset.js +59 -0
- package/esm2015/app/core/model/light-properties.js +45 -0
- package/esm2015/app/core/model/media-resource.js +10 -0
- package/esm2015/app/core/model/preset.js +15 -0
- package/esm2015/app/core/model/ral-color.js +2 -0
- package/esm2015/app/core/model/shadow-properties.js +10 -0
- package/esm2015/app/core/model/texture-type.js +8 -0
- package/esm2015/app/core/model/texture.js +58 -0
- package/esm2015/app/core/model/three-object.js +2 -0
- package/esm2015/app/core/model/toast-type.js +7 -0
- package/esm2015/app/core/model/toast.js +7 -0
- package/esm2015/app/core/model/xr-reticle.js +87 -0
- package/esm2015/app/core/pipe/append.pipe.js +21 -0
- package/esm2015/app/core/pipe/cm-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/filter.pipe.js +20 -0
- package/esm2015/app/core/pipe/keys.pipe.js +22 -0
- package/esm2015/app/core/pipe/localize.pipe.js +28 -0
- package/esm2015/app/core/pipe/m-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/prepend.pipe.js +21 -0
- package/esm2015/app/core/pipe/scm-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/sm-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/strip-html.pipe.js +17 -0
- package/esm2015/app/core/service/3dm-api.js +246 -0
- package/esm2015/app/core/service/app-state.service.js +128 -0
- package/esm2015/app/core/service/configuration.service.js +72 -0
- package/esm2015/app/core/service/debug.service.js +45 -0
- package/esm2015/app/core/service/dimensioning.service.js +45 -0
- package/esm2015/app/core/service/dynamic-camera.service.js +107 -0
- package/esm2015/app/core/service/environment.service.js +17 -0
- package/esm2015/app/core/service/error.service.js +30 -0
- package/esm2015/app/core/service/export.service.js +97 -0
- package/esm2015/app/core/service/file.service.js +44 -0
- package/esm2015/app/core/service/homedecorator-app-event.service.js +27 -0
- package/esm2015/app/core/service/homedecorator-app.service.js +201 -0
- package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +455 -0
- package/esm2015/app/core/service/homedecorator-connector.service.js +604 -0
- package/esm2015/app/core/service/homedecorator-dictionary.service.js +73 -0
- package/esm2015/app/core/service/homedecorator-icon-cache.service.js +43 -0
- package/esm2015/app/core/service/homedecorator-settings.service.js +146 -0
- package/esm2015/app/core/service/homedecorator.service.js +37 -0
- package/esm2015/app/core/service/integration.service.js +56 -0
- package/esm2015/app/core/service/item-serialization.service.js +188 -0
- package/esm2015/app/core/service/json-utils.service.js +56 -0
- package/esm2015/app/core/service/message-bus.service.js +28 -0
- package/esm2015/app/core/service/permanent-store.service.js +135 -0
- package/esm2015/app/core/service/presets.service.js +297 -0
- package/esm2015/app/core/service/progress.service.js +74 -0
- package/esm2015/app/core/service/ral.service.js +98 -0
- package/esm2015/app/core/service/skip-button-info.service.js +60 -0
- package/esm2015/app/core/service/toast.service.js +23 -0
- package/esm2015/app/core/service/utils.service.js +566 -0
- package/esm2015/app/core/service/view-mode.service.js +61 -0
- package/esm2015/app/core/service/web-worker.service.js +44 -0
- package/esm2015/app/core/utils/clone-utils.js +41 -0
- package/esm2015/app/core/utils/color.utils.js +20 -0
- package/esm2015/app/core/utils/file.utils.js +234 -0
- package/esm2015/app/core/utils/function/is-empty.function.js +5 -0
- package/esm2015/app/core/utils/function/is-nill.function.js +5 -0
- package/esm2015/app/core/utils/material.utils.js +407 -0
- package/esm2015/app/core/utils/object.utils.js +191 -0
- package/esm2015/app/core/utils/relative-position.utils.js +74 -0
- package/esm2015/app/core/utils/variation-utils.js +314 -0
- package/esm2015/app/core/workers/enum/web-worker-message.enum.js +6 -0
- package/esm2015/app/core/workers/enum/web-worker-type.enum.js +5 -0
- package/esm2015/app/development/components/selected-child-material-texture.component.js +467 -0
- package/esm2015/app/development/components/selected-child-material.component.js +863 -0
- package/esm2015/app/development/components/selected-child.component.js +64 -0
- package/esm2015/app/development/components/selected-object-base.js +127 -0
- package/esm2015/app/development/components/selected-object.component.js +98 -0
- package/esm2015/app/development/development.module.js +74 -0
- package/esm2015/app/development/directive/development.directive.js +92 -0
- package/esm2015/app/development/service/development.service.js +212 -0
- package/esm2015/app/homedecorator.component.js +285 -0
- package/esm2015/app/homedecorator.module.js +60 -0
- package/esm2015/app/plugins/core3d/collision-manager/collision-manager.service.js +119 -0
- package/esm2015/app/plugins/core3d/collision-manager/floorplan-collision-detection.js +158 -0
- package/esm2015/app/plugins/core3d/collision-manager/snapping-collision.service.js +234 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.js +36 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.js +49 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.js +77 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.js +26 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.js +46 -0
- package/esm2015/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.js +197 -0
- package/esm2015/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.js +197 -0
- package/esm2015/app/plugins/core3d/components/lightplan/lightplan.component.js +512 -0
- package/esm2015/app/plugins/core3d/components/scene-options/scene-options.component.js +88 -0
- package/esm2015/app/plugins/core3d/core/angles.js +19 -0
- package/esm2015/app/plugins/core3d/core/corner-utils.js +9 -0
- package/esm2015/app/plugins/core3d/core/dimensioning.js +79 -0
- package/esm2015/app/plugins/core3d/core/utils.js +606 -0
- package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +289 -0
- package/esm2015/app/plugins/core3d/core3d/core3d.component.js +243 -0
- package/esm2015/app/plugins/core3d/core3d.module.js +201 -0
- package/esm2015/app/plugins/core3d/directive/scene.directive.js +41 -0
- package/esm2015/app/plugins/core3d/enum/ar-feature.enum.js +14 -0
- package/esm2015/app/plugins/core3d/enum/direction.enum.js +10 -0
- package/esm2015/app/plugins/core3d/enum/result-type.enum.js +21 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/bounding-box-measurement.js +99 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/box-measurement.js +35 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/door-or-window-box-measurement.js +95 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/measurable.js +2 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/measurement-utils.js +22 -0
- package/esm2015/app/plugins/core3d/hud/custom-shape-name-label.js +31 -0
- package/esm2015/app/plugins/core3d/hud/floor-indicator.js +80 -0
- package/esm2015/app/plugins/core3d/hud/furniture-measurements.js +44 -0
- package/esm2015/app/plugins/core3d/hud/indicator-factory.js +49 -0
- package/esm2015/app/plugins/core3d/hud/measurements.js +165 -0
- package/esm2015/app/plugins/core3d/hud/on-wall-measurements.js +80 -0
- package/esm2015/app/plugins/core3d/hud/opening-symbol.js +74 -0
- package/esm2015/app/plugins/core3d/hud/rotation-helper.js +263 -0
- package/esm2015/app/plugins/core3d/hud/utils.js +30 -0
- package/esm2015/app/plugins/core3d/interface/dragged-data.interface.js +2 -0
- package/esm2015/app/plugins/core3d/interface/edge-visibility-changes.js +2 -0
- package/esm2015/app/plugins/core3d/interface/model.interface.js +2 -0
- package/esm2015/app/plugins/core3d/interface/opening.interface.js +2 -0
- package/esm2015/app/plugins/core3d/interface/scene-option-button.interface.js +6 -0
- package/esm2015/app/plugins/core3d/interface/scene-update.interface.js +2 -0
- package/esm2015/app/plugins/core3d/items/base-item.js +233 -0
- package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +41 -0
- package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +45 -0
- package/esm2015/app/plugins/core3d/items/custom-floor-item.js +11 -0
- package/esm2015/app/plugins/core3d/items/custom-objects.js +295 -0
- package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +45 -0
- package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +37 -0
- package/esm2015/app/plugins/core3d/items/custom-wall-floor-item.js +84 -0
- package/esm2015/app/plugins/core3d/items/custom-wall-item.js +11 -0
- package/esm2015/app/plugins/core3d/items/factory.js +130 -0
- package/esm2015/app/plugins/core3d/items/floor-item.js +29 -0
- package/esm2015/app/plugins/core3d/items/floor-pin.js +31 -0
- package/esm2015/app/plugins/core3d/items/floor-plane-item.js +95 -0
- package/esm2015/app/plugins/core3d/items/furniture.js +2 -0
- package/esm2015/app/plugins/core3d/items/in-wall-floor-item.js +14 -0
- package/esm2015/app/plugins/core3d/items/item-group.js +160 -0
- package/esm2015/app/plugins/core3d/items/item-type.js +23 -0
- package/esm2015/app/plugins/core3d/items/item.js +388 -0
- package/esm2015/app/plugins/core3d/items/metadata.js +2 -0
- package/esm2015/app/plugins/core3d/items/on-floor-item.js +10 -0
- package/esm2015/app/plugins/core3d/items/pin.js +2 -0
- package/esm2015/app/plugins/core3d/items/three-mesh.js +17 -0
- package/esm2015/app/plugins/core3d/items/wall-floor-item.js +9 -0
- package/esm2015/app/plugins/core3d/items/wall-objects.js +2381 -0
- package/esm2015/app/plugins/core3d/items/wall-pin.js +25 -0
- package/esm2015/app/plugins/core3d/model/ar-parameters.js +12 -0
- package/esm2015/app/plugins/core3d/model/box-skin-default.js +17 -0
- package/esm2015/app/plugins/core3d/model/collision-info.js +2 -0
- package/esm2015/app/plugins/core3d/model/custom-floor-group-result.js +13 -0
- package/esm2015/app/plugins/core3d/model/cylinder-skin-default.js +14 -0
- package/esm2015/app/plugins/core3d/model/dragged-status.js +51 -0
- package/esm2015/app/plugins/core3d/model/face.js +18 -0
- package/esm2015/app/plugins/core3d/model/geometry.js +52 -0
- package/esm2015/app/plugins/core3d/model/scene-event.enum.js +12 -0
- package/esm2015/app/plugins/core3d/model/skin.js +2 -0
- package/esm2015/app/plugins/core3d/model/threed-model.js +49 -0
- package/esm2015/app/plugins/core3d/service/ar.service.js +844 -0
- package/esm2015/app/plugins/core3d/service/camera.service.js +340 -0
- package/esm2015/app/plugins/core3d/service/ceiling.service.js +104 -0
- package/esm2015/app/plugins/core3d/service/controls.js +763 -0
- package/esm2015/app/plugins/core3d/service/drag-and-drop.service.js +369 -0
- package/esm2015/app/plugins/core3d/service/error-glow.service.js +131 -0
- package/esm2015/app/plugins/core3d/service/floor.service.js +229 -0
- package/esm2015/app/plugins/core3d/service/font.service.js +27 -0
- package/esm2015/app/plugins/core3d/service/hud.service.js +404 -0
- package/esm2015/app/plugins/core3d/service/intersection.service.js +55 -0
- package/esm2015/app/plugins/core3d/service/item-group.service.js +117 -0
- package/esm2015/app/plugins/core3d/service/item.service.js +205 -0
- package/esm2015/app/plugins/core3d/service/light-presets.service.js +296 -0
- package/esm2015/app/plugins/core3d/service/lights.service.js +190 -0
- package/esm2015/app/plugins/core3d/service/message-board.service.js +60 -0
- package/esm2015/app/plugins/core3d/service/models.service.js +146 -0
- package/esm2015/app/plugins/core3d/service/outline.service.js +150 -0
- package/esm2015/app/plugins/core3d/service/rotation.service.js +183 -0
- package/esm2015/app/plugins/core3d/service/scene-event.service.js +1000 -0
- package/esm2015/app/plugins/core3d/service/scene-options.service.js +24 -0
- package/esm2015/app/plugins/core3d/service/scene.service.js +351 -0
- package/esm2015/app/plugins/core3d/service/vr.service.js +198 -0
- package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +79 -0
- package/esm2015/app/plugins/core3d/service/xr.service.js +397 -0
- package/esm2015/app/plugins/core3d/textures/DepthDataTexture.js +17 -0
- package/esm2015/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.js +54 -0
- package/esm2015/app/plugins/furniture-manager/furniture-library/furniture-library.component.js +92 -0
- package/esm2015/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.js +458 -0
- package/esm2015/app/plugins/furniture-manager/furniture-manager.module.js +100 -0
- package/esm2015/app/plugins/help/help/help.component.js +71 -0
- package/esm2015/app/plugins/help/help-dialog/help-dialog.component.js +83 -0
- package/esm2015/app/plugins/help/help.module.js +35 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/animation/animation.component.js +36 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.js +187 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.js +417 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.js +44 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.js +82 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.js +27 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.js +148 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.js +167 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.js +25 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +150 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/service/customizer.service.js +222 -0
- package/esm2015/app/plugins/lite-selector/lite-selector.module.js +108 -0
- package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +470 -0
- package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +132 -0
- package/esm2015/app/plugins/model-uploader/model-uploader.module.js +60 -0
- package/esm2015/app/plugins/plugin-interface.js +2 -0
- package/esm2015/app/plugins/plugins.module.js +80 -0
- package/esm2015/app/plugins/presets/presets/presets.component.js +72 -0
- package/esm2015/app/plugins/presets/presets.module.js +33 -0
- package/esm2015/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.js +57 -0
- package/esm2015/app/plugins/product-catalog/own-collection-catalog/product-own-collection.module.js +34 -0
- package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +428 -0
- package/esm2015/app/plugins/product-catalog/product-catalog.module.js +61 -0
- package/esm2015/app/plugins/render/enum/connection-status.js +8 -0
- package/esm2015/app/plugins/render/enum/render-modes.js +7 -0
- package/esm2015/app/plugins/render/enum/render-status.js +9 -0
- package/esm2015/app/plugins/render/model/camera-position.js +6 -0
- package/esm2015/app/plugins/render/model/image-size.js +3 -0
- package/esm2015/app/plugins/render/model/lightning.js +3 -0
- package/esm2015/app/plugins/render/model/render-data.js +6 -0
- package/esm2015/app/plugins/render/model/render-environment.js +3 -0
- package/esm2015/app/plugins/render/model/render-parameters.js +15 -0
- package/esm2015/app/plugins/render/model/render-queue-item.js +11 -0
- package/esm2015/app/plugins/render/model/render-settings.js +12 -0
- package/esm2015/app/plugins/render/model/render.js +10 -0
- package/esm2015/app/plugins/render/render-controls/render-controls.component.js +89 -0
- package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +318 -0
- package/esm2015/app/plugins/render/render.module.js +85 -0
- package/esm2015/app/plugins/render/service/new-render.service.js +302 -0
- package/esm2015/app/plugins/render/service/render.service.js +650 -0
- package/esm2015/app/plugins/room-planner/components/appearance-section/appearance-section.component.js +190 -0
- package/esm2015/app/plugins/room-planner/components/color-picker/color-picker.component.js +32 -0
- package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +219 -0
- package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +257 -0
- package/esm2015/app/plugins/room-planner/components/dimension-input/dimension-input.component.js +66 -0
- package/esm2015/app/plugins/room-planner/components/edit-apply/edit-apply.component.js +57 -0
- package/esm2015/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.js +79 -0
- package/esm2015/app/plugins/room-planner/components/file-drop/file-drop.component.js +107 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/const/defaults.js +57 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner-mode.js +11 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +1303 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/service/floorplan.service.js +536 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +330 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/snap-indicator-mode.js +7 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/utils/context.utils.js +53 -0
- package/esm2015/app/plugins/room-planner/components/object-library/object-library.component.js +63 -0
- package/esm2015/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.js +128 -0
- package/esm2015/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.js +37 -0
- package/esm2015/app/plugins/room-planner/components/selected-floor/selected-floor.component.js +36 -0
- package/esm2015/app/plugins/room-planner/components/selected-object/selected-object.component.js +203 -0
- package/esm2015/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.js +139 -0
- package/esm2015/app/plugins/room-planner/components/selected-wall/selected-wall.component.js +102 -0
- package/esm2015/app/plugins/room-planner/components/settings/settings-options.component.js +152 -0
- package/esm2015/app/plugins/room-planner/components/settings/settings.component.js +188 -0
- package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +617 -0
- package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +74 -0
- package/esm2015/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.js +48 -0
- package/esm2015/app/plugins/room-planner/const/key.js +12 -0
- package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +1681 -0
- package/esm2015/app/plugins/room-planner/room-planner.module.js +233 -0
- package/esm2015/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.js +43 -0
- package/esm2015/app/plugins/threed-in-photo/components/upload-image/upload-image.component.js +61 -0
- package/esm2015/app/plugins/threed-in-photo/components/view-control/view-control.component.js +164 -0
- package/esm2015/app/plugins/threed-in-photo/models/model-output.js +18 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-build.service.js +243 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-connection.service.js +50 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-control.service.js +33 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-event-listeners.service.js +36 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-event.service.js +19 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-initializer.service.js +53 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-render.service.js +61 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-scene.service.js +37 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-view.service.js +21 -0
- package/esm2015/app/plugins/threed-in-photo/threed-in-photo.module.js +67 -0
- package/esm2015/app/plugins/threed-in-photo/utils/utils.js +21 -0
- package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +95 -0
- package/esm2015/app/plugins/threedselector/element-slider/element-slider.component.js +28 -0
- package/esm2015/app/plugins/threedselector/element-toolbar/element-toolbar.component.js +80 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-connected-part-integration.js +3 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-integration.js +13 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-part-integration.js +6 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-part-variation.js +3 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/material.js +11 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/variation-settings.js +11 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/variation.js +3 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/animation.service.js +65 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +1343 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/dimensions.service.js +183 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/element.service.js +373 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/light-creation.service.js +35 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +291 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/resize.service.js +70 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/third-party-model.service.js +156 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/threedselector.service.js +101 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/variation-cache.service.js +133 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/variation.service.js +436 -0
- package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +1116 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +128 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/image.utils.js +33 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/json-parser.utils.js +188 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/scene-3d.utils.js +159 -0
- package/esm2015/app/plugins/threedselector/threedselector.module.js +129 -0
- package/esm2015/app/plugins/toolbar/download-dialog/download-dialog.component.js +33 -0
- package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +279 -0
- package/esm2015/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.js +22 -0
- package/esm2015/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.js +123 -0
- package/esm2015/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.js +140 -0
- package/esm2015/app/plugins/toolbar/open-dialog/open-dialog.component.js +83 -0
- package/esm2015/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.js +92 -0
- package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +146 -0
- package/esm2015/app/plugins/toolbar/saved-dialog/saved-dialog.component.js +66 -0
- package/esm2015/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.js +26 -0
- package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +676 -0
- package/esm2015/app/plugins/toolbar/toolbar.module.js +177 -0
- package/esm2015/app/service/dynamic-script.service.js +56 -0
- package/esm2015/app/service/google-tag-manager.service.js +89 -0
- package/esm2015/app/service/local-storage.service.js +93 -0
- package/esm2015/app/service/service-locator.service.js +4 -0
- package/esm2015/app/shared/base64-images.js +6 -0
- package/esm2015/app/shared/button-elevation/button-elevation.component.js +279 -0
- package/esm2015/app/shared/button-elevation/button-elevation.module.js +60 -0
- package/esm2015/app/shared/camera-settings-dialog/camera-settings-dialog.component.js +197 -0
- package/esm2015/app/shared/camera-settings-dialog/camera-settings-dialog.module.js +58 -0
- package/esm2015/app/shared/category-library/category-library.component.js +27 -0
- package/esm2015/app/shared/category-library/category-library.module.js +39 -0
- package/esm2015/app/shared/context-menu/context-menu.component.js +35 -0
- package/esm2015/app/shared/context-menu/context-menu.module.js +49 -0
- package/esm2015/app/shared/context-menu/item-context-menu/item-context-menu.component.js +93 -0
- package/esm2015/app/shared/dialog/dialog.component.js +119 -0
- package/esm2015/app/shared/dialog/dialog.module.js +45 -0
- package/esm2015/app/shared/dialog/enum/dialog-type.enum.js +8 -0
- package/esm2015/app/shared/dialog/interface/dialog-config.interface.js +2 -0
- package/esm2015/app/shared/dialog/service/dialog.service.js +21 -0
- package/esm2015/app/shared/error-dialog/error-dialog.component.js +24 -0
- package/esm2015/app/shared/error-dialog/error-dialog.module.js +30 -0
- package/esm2015/app/shared/export-dialog/export-dialog.component.js +68 -0
- package/esm2015/app/shared/export-dialog/export-dialog.module.js +35 -0
- package/esm2015/app/shared/info-dialog/info-dialog.component.js +54 -0
- package/esm2015/app/shared/info-dialog/info-dialog.module.js +37 -0
- package/esm2015/app/shared/loader/hd-loader.component.js +24 -0
- package/esm2015/app/shared/loader/hd-loader.module.js +33 -0
- package/esm2015/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.js +26 -0
- package/esm2015/app/shared/loading-overlay/loading-overlay.component.js +55 -0
- package/esm2015/app/shared/loading-overlay/loading-overlay.module.js +42 -0
- package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +325 -0
- package/esm2015/app/shared/model-dialog/model-dialog.component.js +104 -0
- package/esm2015/app/shared/model-dialog/model-dialog.module.js +64 -0
- package/esm2015/app/shared/progress-bar/progress-bar.component.js +39 -0
- package/esm2015/app/shared/progress-bar/progress-bar.module.js +33 -0
- package/esm2015/app/shared/register-dialog/register-dialog.component.js +112 -0
- package/esm2015/app/shared/screen-size-analysis/device-size-type.js +7 -0
- package/esm2015/app/shared/screen-size-analysis/navigator-type.enum.js +6 -0
- package/esm2015/app/shared/screen-size-analysis/screen-size-analysis.service.js +93 -0
- package/esm2015/app/shared/screen-size-analysis/screen-size-config.js +7 -0
- package/esm2015/app/shared/screen-size-analysis/screen-size-info.js +2 -0
- package/esm2015/app/shared/slider-input/slider-input.component.js +35 -0
- package/esm2015/app/shared/slider-input/slider-input.module.js +46 -0
- package/esm2015/app/shared/toolbar-icon/toolbar-icon.component.js +95 -0
- package/esm2015/app/shared/toolbar-icon/toolbar-icon.module.js +38 -0
- package/esm2015/app/shared/zoom-controls/zoom-controls.component.js +47 -0
- package/esm2015/app/shared/zoom-controls/zoom-controls.module.js +34 -0
- package/esm2015/colijnit-homedecorator.js +5 -0
- package/esm2015/environments/environment.js +17 -0
- package/esm2015/public_api.js +4 -0
- package/fesm2015/colijnit-homedecorator.js +45086 -0
- package/fesm2015/colijnit-homedecorator.js.map +1 -0
- package/homedecorator-globals.scss +361 -0
- package/package.json +48 -0
- package/palette.scss +32 -0
- package/public_api.d.ts +3 -0
- package/styles.scss +377 -0
|
@@ -0,0 +1,1343 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
|
|
11
|
+
import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
|
|
12
|
+
import { DecoNodeKind } from '@colijnit/configuratorapi/build/enum/deco-node-kind.enum';
|
|
13
|
+
import { Injectable } from '@angular/core';
|
|
14
|
+
import { Subject } from 'rxjs';
|
|
15
|
+
import { Euler, Vector3 } from 'three';
|
|
16
|
+
import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
|
|
17
|
+
import { HdecoPositioning } from '@colijnit/configuratorapi/build/enum/hdeco-positioning.enum';
|
|
18
|
+
import { environment } from '../../../../../environments/environment';
|
|
19
|
+
import * as TWEEN from '@tweenjs/tween.js';
|
|
20
|
+
import { Factory } from '../../../core3d/items/factory';
|
|
21
|
+
import { CustomFloorItem } from '../../../core3d/items/custom-floor-item';
|
|
22
|
+
import { Item } from '../../../core3d/items/item';
|
|
23
|
+
import { ItemType } from '../../../core3d/items/item-type';
|
|
24
|
+
import { CustomFloorGroupResult } from '../../../core3d/model/custom-floor-group-result';
|
|
25
|
+
import { FurnitureIntegration } from '../model/furniture-integration';
|
|
26
|
+
import { MessageType } from '../../../../core/enum/message-type.enum';
|
|
27
|
+
import { Scene3DUtil } from '../utils/scene-3d.utils';
|
|
28
|
+
import { ErrorMessage } from '../../../../core/model/error-message';
|
|
29
|
+
import { ViewMode } from '../../../../core/enum/view-mode.enum';
|
|
30
|
+
import { ResultType } from '../../../core3d/enum/result-type.enum';
|
|
31
|
+
import { isNill } from '../../../../core/utils/function/is-nill.function';
|
|
32
|
+
import { Utils } from '../../../core3d/core/utils';
|
|
33
|
+
import { MaterialUtils } from '../../../../core/utils/material.utils';
|
|
34
|
+
import { FloorPin } from '../../../core3d/items/floor-pin';
|
|
35
|
+
import { WallPin } from '../../../core3d/items/wall-pin';
|
|
36
|
+
import { FurniturePartIntegration } from '../model/furniture-part-integration';
|
|
37
|
+
import { CustomMesh, CustomObject3D } from '../../../core3d/items/custom-objects';
|
|
38
|
+
import { FurniturePartVariation } from '../model/furniture-part-variation';
|
|
39
|
+
import { FurnitureConnectedPartIntegration } from '../model/furniture-connected-part-integration';
|
|
40
|
+
import { GoogleTagManagerEvent } from '../../../../core/enum/google-tag-manager-event.enum';
|
|
41
|
+
import { CustomWallFloorItem } from '../../../core3d/items/custom-wall-floor-item';
|
|
42
|
+
import { ObjectUtils } from '../../../../core/utils/object.utils';
|
|
43
|
+
import { InfoDialogComponent } from '../../../../shared/info-dialog/info-dialog.component';
|
|
44
|
+
import * as i0 from "@angular/core";
|
|
45
|
+
import * as i1 from "@angular/material/dialog";
|
|
46
|
+
import * as i2 from "../../../../core/service/homedecorator-connector.service";
|
|
47
|
+
import * as i3 from "./threedselector.service";
|
|
48
|
+
import * as i4 from "../../../core3d/collision-manager/collision-manager.service";
|
|
49
|
+
import * as i5 from "../../../../core/service/message-bus.service";
|
|
50
|
+
import * as i6 from "../../../../core/service/homedecorator-dictionary.service";
|
|
51
|
+
import * as i7 from "../../../core3d/service/hud.service";
|
|
52
|
+
import * as i8 from "../../../core3d/service/scene.service";
|
|
53
|
+
import * as i9 from "../../../core3d/service/camera.service";
|
|
54
|
+
import * as i10 from "../../../core3d/service/scene-event.service";
|
|
55
|
+
import * as i11 from "../../../../core/service/homedecorator-app-event.service";
|
|
56
|
+
import * as i12 from "../../../../core/service/presets.service";
|
|
57
|
+
import * as i13 from "../../../core3d/service/item.service";
|
|
58
|
+
import * as i14 from "./element.service";
|
|
59
|
+
import * as i15 from "../../../../core/service/permanent-store.service";
|
|
60
|
+
import * as i16 from "../../../../service/google-tag-manager.service";
|
|
61
|
+
import * as i17 from "../../../../core/service/homedecorator-settings.service";
|
|
62
|
+
import * as i18 from "../../../../core/service/utils.service";
|
|
63
|
+
import * as i19 from "./variation.service";
|
|
64
|
+
import * as i20 from "../../../../core/service/app-state.service";
|
|
65
|
+
import * as i21 from "../../../../core/service/error.service";
|
|
66
|
+
import * as i22 from "../../../core3d/service/item-group.service";
|
|
67
|
+
import * as i23 from "./variation-cache.service";
|
|
68
|
+
import * as i24 from "./resize.service";
|
|
69
|
+
import * as i25 from "../../../../core/service/view-mode.service";
|
|
70
|
+
import * as i26 from "../../../core3d/service/floor.service";
|
|
71
|
+
const defaultPosition = new Vector3(4, 0, 1);
|
|
72
|
+
const defaultRotation = new Euler(0, Math.PI, 0);
|
|
73
|
+
export class BuildFurnitureService {
|
|
74
|
+
constructor(_dialog, _iOne, _threedSelectorService, _collisionManager, _messageBus, _dictionaryService, _hudService, _sceneService, _cameraService, _sceneEventService, _appEventService, _presetService, _itemService, _elementService, _permanentStoreService, _googleTagManager, _settingsService, _utilsService, _variationService, _appStateService, _errorService, _itemGroupService, _variationCacheService, _resizeService, _viewModeService, _floorService) {
|
|
75
|
+
this._dialog = _dialog;
|
|
76
|
+
this._iOne = _iOne;
|
|
77
|
+
this._threedSelectorService = _threedSelectorService;
|
|
78
|
+
this._collisionManager = _collisionManager;
|
|
79
|
+
this._messageBus = _messageBus;
|
|
80
|
+
this._dictionaryService = _dictionaryService;
|
|
81
|
+
this._hudService = _hudService;
|
|
82
|
+
this._sceneService = _sceneService;
|
|
83
|
+
this._cameraService = _cameraService;
|
|
84
|
+
this._sceneEventService = _sceneEventService;
|
|
85
|
+
this._appEventService = _appEventService;
|
|
86
|
+
this._presetService = _presetService;
|
|
87
|
+
this._itemService = _itemService;
|
|
88
|
+
this._elementService = _elementService;
|
|
89
|
+
this._permanentStoreService = _permanentStoreService;
|
|
90
|
+
this._googleTagManager = _googleTagManager;
|
|
91
|
+
this._settingsService = _settingsService;
|
|
92
|
+
this._utilsService = _utilsService;
|
|
93
|
+
this._variationService = _variationService;
|
|
94
|
+
this._appStateService = _appStateService;
|
|
95
|
+
this._errorService = _errorService;
|
|
96
|
+
this._itemGroupService = _itemGroupService;
|
|
97
|
+
this._variationCacheService = _variationCacheService;
|
|
98
|
+
this._resizeService = _resizeService;
|
|
99
|
+
this._viewModeService = _viewModeService;
|
|
100
|
+
this._floorService = _floorService;
|
|
101
|
+
this.toggleSelectedElement = new Subject();
|
|
102
|
+
this.configureModeChanged = new Subject();
|
|
103
|
+
this.buildFinished = new Subject();
|
|
104
|
+
this.answerSelected = new Subject();
|
|
105
|
+
this.arPlacementUpdate = new Subject();
|
|
106
|
+
this.showElementToolbar = false;
|
|
107
|
+
this.isMouseOverObject = false;
|
|
108
|
+
this.activeAnswers = [];
|
|
109
|
+
this.standAloneFirstBuildReady = false;
|
|
110
|
+
this._useNodeIdToLink = true;
|
|
111
|
+
this._standAlone = false;
|
|
112
|
+
this._originalElementPosition = new Vector3();
|
|
113
|
+
this._integrationEnabled = false;
|
|
114
|
+
this._placedAdjustables = [];
|
|
115
|
+
this._placedAddables = [];
|
|
116
|
+
this._adjustables = [];
|
|
117
|
+
this._addables = [];
|
|
118
|
+
this._genericSelection = false;
|
|
119
|
+
this._subs = [];
|
|
120
|
+
this._answerSelected = [];
|
|
121
|
+
this._furnitureConfigurations = [];
|
|
122
|
+
this.mouseOver = () => {
|
|
123
|
+
this.isMouseOverObject = true;
|
|
124
|
+
};
|
|
125
|
+
this.mouseOff = () => {
|
|
126
|
+
this.isMouseOverObject = false;
|
|
127
|
+
};
|
|
128
|
+
this.selectItem = (mesh) => {
|
|
129
|
+
// this.activeInstance = mesh.userData.itemId;
|
|
130
|
+
};
|
|
131
|
+
this.unSelectItem = () => {
|
|
132
|
+
// this.showLiteSelector = false;
|
|
133
|
+
// this.showSelections = false;
|
|
134
|
+
};
|
|
135
|
+
this.selectElement = (element, mousePos) => {
|
|
136
|
+
this._activeChildElement = element;
|
|
137
|
+
if (element.parent instanceof CustomObject3D) {
|
|
138
|
+
this._originalElementPosition.copy(element.parent.position);
|
|
139
|
+
// if (this._currentCustomFloorGroup.adjustable) {
|
|
140
|
+
if (this._isMoveableObject(element.parent)) {
|
|
141
|
+
const connector = element.parent.children.find(c => c.name.toLowerCase().indexOf('c_') > -1);
|
|
142
|
+
if (connector.connectedTo) {
|
|
143
|
+
const baseElement = this._currentCustomFloorGroup.getObjectByName(connector.connectedTo);
|
|
144
|
+
this.baseElementNodeId = baseElement.userData && baseElement.userData.selection ? baseElement.userData.selection.nodeId : 0;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
this.toggleSelectedElement.next(element);
|
|
149
|
+
};
|
|
150
|
+
this.unSelectElement = () => {
|
|
151
|
+
this._activeChildElement = undefined;
|
|
152
|
+
this.toggleSelectedElement.next(undefined);
|
|
153
|
+
};
|
|
154
|
+
this.moveChildElement = (element, pos) => {
|
|
155
|
+
const worldToLocalPos = this._currentCustomFloorGroup.worldToLocal(pos.clone());
|
|
156
|
+
this._moveChildElementToPosition(element, worldToLocalPos);
|
|
157
|
+
};
|
|
158
|
+
this.placeChildElement = (element) => __awaiter(this, void 0, void 0, function* () {
|
|
159
|
+
if (this._isMoveableObject(element) && element.moved) {
|
|
160
|
+
const baseElement = this._currentCustomFloorGroup.getObjectsByUserDataProp('selection', 'nodeId', this.baseElementNodeId);
|
|
161
|
+
// use instanceId from parent
|
|
162
|
+
const item = ObjectUtils.GetParentItem(element);
|
|
163
|
+
if (item) {
|
|
164
|
+
const connector = yield this._elementService.placeElementOnConnector(item.metadata.itemId, element, baseElement.length > 0 ? baseElement[0] : null);
|
|
165
|
+
this._saveElementConnector(element, connector);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
this.changeConfigureMode = (metadata, configuring) => __awaiter(this, void 0, void 0, function* () {
|
|
170
|
+
this.configureModeChanged.next({ metadata: metadata, configuring: configuring });
|
|
171
|
+
});
|
|
172
|
+
this.dragConnector = (connector, pos) => __awaiter(this, void 0, void 0, function* () {
|
|
173
|
+
this._resizeService.dragConnectorToNewPosition(connector, pos);
|
|
174
|
+
});
|
|
175
|
+
this._subs.push(this._iOne.connectionReset.subscribe(() => this._handleConnectionReset()), this._messageBus.subscribe(MessageType.ItemRemoved, (result) => this._handleItemRemovedFromScene(result)), this._messageBus.subscribe(MessageType.Undo, () => this._startWithNew(false)), this._messageBus.subscribe(MessageType.Redo, () => this._startWithNew(false)), this._messageBus.subscribe(MessageType.StartWithEmptyRoom, () => this._startWithNew()), this._messageBus.subscribe(MessageType.StartWithPreset, () => this._startWithNew()), this._messageBus.subscribe(MessageType.LoadRoomFromPreset, () => this._startWithNew()), this._messageBus.subscribe(MessageType.LoadRoomFromCloud, () => this._startWithNew()), this._messageBus.subscribe(MessageType.NewRoom, () => this._startWithNew()), this._messageBus.subscribe(MessageType.ResetRoomplan, () => this._startWithNew()), this._messageBus.subscribe(MessageType.LoadScaledDiagram, () => this._startWithNew()), this._appEventService.enableIntegration.subscribe((enabled) => {
|
|
176
|
+
if (enabled) {
|
|
177
|
+
this._enableIntegration();
|
|
178
|
+
}
|
|
179
|
+
}), this._presetService.beforeLoad.subscribe(() => {
|
|
180
|
+
this._cleanupBeforePresetLoad();
|
|
181
|
+
this._startWithNew();
|
|
182
|
+
}), this._presetService.afterLoad.subscribe(() => this._handleAfterPresetLoad()), this._permanentStoreService.codeSet.subscribe((code) => {
|
|
183
|
+
if (code) {
|
|
184
|
+
this._setCodeOnFurnitureConfiguration();
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
get useNodeIdToLink() {
|
|
189
|
+
return this._useNodeIdToLink;
|
|
190
|
+
}
|
|
191
|
+
get currentCustomFloorGroup() {
|
|
192
|
+
return this._currentCustomFloorGroup;
|
|
193
|
+
}
|
|
194
|
+
get standAlone() {
|
|
195
|
+
return this._standAlone;
|
|
196
|
+
}
|
|
197
|
+
set standAlone(value) {
|
|
198
|
+
this._standAlone = value;
|
|
199
|
+
if (this._standAlone) {
|
|
200
|
+
this._prepareStandAlone();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
get selections() {
|
|
204
|
+
return this._iOne.selections;
|
|
205
|
+
}
|
|
206
|
+
get scene() {
|
|
207
|
+
return this._sceneService.getScene();
|
|
208
|
+
}
|
|
209
|
+
ngOnDestroy() {
|
|
210
|
+
this._subs.forEach(s => s.unsubscribe());
|
|
211
|
+
this._cleanup();
|
|
212
|
+
}
|
|
213
|
+
build(result) {
|
|
214
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
+
this._elementService.removeElement(result.instanceId);
|
|
216
|
+
if (result && result.metaData && result.metaData.itemType === ItemType.FloorDecoration) {
|
|
217
|
+
return this._buildFloor(result);
|
|
218
|
+
}
|
|
219
|
+
if (!this.full3DObjectToUse) { // there's no 3d model so get out
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
const adjustables = this._getAdjustables();
|
|
223
|
+
if (adjustables && adjustables.length === 0) { // check if article has a gameObject
|
|
224
|
+
if (this.selections[0].nodeType === NodeType.Article && this.selections[0].gameObject) {
|
|
225
|
+
adjustables.push(this.selections[0]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// this._currentCustomFloorGroup = this._createConfigurableItem(result.instanceId, result.metaData);
|
|
229
|
+
const item = this._createConfigurableItem(result.instanceId, result.metaData);
|
|
230
|
+
if (adjustables && adjustables.length > 0) {
|
|
231
|
+
let connected = false;
|
|
232
|
+
for (let i = 0, len = adjustables.length; i < len; i++) {
|
|
233
|
+
const adjustable = this._createAdjustable(item, adjustables[i]);
|
|
234
|
+
if (adjustable) {
|
|
235
|
+
for (let ii = this._placedAdjustables.length - 1; ii >= 0; ii--) {
|
|
236
|
+
if (this._isMoveableObject(adjustable)) { // vrije verplaatsing mogelijk, connecten aan opgeslagen connector
|
|
237
|
+
const selection = adjustable.userData.selection;
|
|
238
|
+
this._addElementOnConnector(item, adjustable, selection.decoConnection ? selection.decoConnection : this.activeConnector, this.baseElementNodeId);
|
|
239
|
+
adjustable.visible = true;
|
|
240
|
+
connected = true;
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
if (Scene3DUtil.TrySelectorConnection(this.scene, item, this._placedAdjustables[ii], adjustable, i === 1)) {
|
|
245
|
+
adjustable.visible = true;
|
|
246
|
+
connected = true;
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
connected = false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (!connected && this._placedAdjustables.length > 1 && !environment.production) {
|
|
254
|
+
result.errorMessages.push(new ErrorMessage(`No connection found for: ${adjustable ? adjustable.name : adjustables[i].decoNode.gameObjectName}`));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
this._placeAddables(item);
|
|
258
|
+
yield this._loadVariations(item, result.metaData.itemId);
|
|
259
|
+
this._currentCustomFloorGroup = yield this._replaceCurrentItem(item, result.metaData, true);
|
|
260
|
+
if (this._viewModeService.viewMode !== ViewMode.InPhotoView) {
|
|
261
|
+
this._currentCustomFloorGroup.updatePivot();
|
|
262
|
+
}
|
|
263
|
+
result.furniture = this._currentCustomFloorGroup;
|
|
264
|
+
result.instanceId = result.metaData.itemId;
|
|
265
|
+
this.arPlacementUpdate.next(true);
|
|
266
|
+
this._handleIntegration(result.metaData.itemId, this._currentCustomFloorGroup);
|
|
267
|
+
if (this._currentCustomFloorGroup.itemGroup) {
|
|
268
|
+
this._itemGroupService.reattachToItemGroup(this._currentCustomFloorGroup, this._currentCustomFloorGroup.itemGroup, this._currentCustomFloorGroup.position);
|
|
269
|
+
}
|
|
270
|
+
this._answerSelected.length = 0;
|
|
271
|
+
if (this._currentCustomFloorGroup.children.length === 0) {
|
|
272
|
+
result.resultType = ResultType.GameobjectNameMismatchInSource;
|
|
273
|
+
return Promise.reject(result);
|
|
274
|
+
}
|
|
275
|
+
this._hudService.updateSelectedItemHud();
|
|
276
|
+
this.buildFinished.next(result);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
result.errorMessages.push(new ErrorMessage('NO_ADJUSTABLES', 'NO_ADJUSTABLES_INFO'));
|
|
280
|
+
result.resultType = ResultType.NoAdjustables;
|
|
281
|
+
return Promise.reject(result);
|
|
282
|
+
}
|
|
283
|
+
if (result.resultType === ResultType.NoSelections) {
|
|
284
|
+
result.resultType = ResultType.ConfigurationFixed;
|
|
285
|
+
}
|
|
286
|
+
else if (result.resultType !== ResultType.Obsolete && result.resultType !== ResultType.ConfigurationFixed) { // don't override these
|
|
287
|
+
result.resultType = ResultType.Loaded;
|
|
288
|
+
}
|
|
289
|
+
this._appEventService.readyToRender.next(this.standAloneFirstBuildReady);
|
|
290
|
+
this._sceneService.updatePathTracer();
|
|
291
|
+
return result;
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
startToBuild(result, metadata, shouldCopyInstance = false, looseOriginalConfiguration = true, standAlone, firstBuild = false) {
|
|
295
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
296
|
+
if (!isNill(standAlone)) {
|
|
297
|
+
this.standAlone = standAlone;
|
|
298
|
+
}
|
|
299
|
+
if (isNill(result)) {
|
|
300
|
+
result = new CustomFloorGroupResult(metadata ? metadata.itemIdentifier : '', metadata ? metadata.itemName : 'unknown');
|
|
301
|
+
result.metaData = metadata;
|
|
302
|
+
}
|
|
303
|
+
if (shouldCopyInstance) {
|
|
304
|
+
const originalInstanceId = result.metaData.itemId;
|
|
305
|
+
if (looseOriginalConfiguration) {
|
|
306
|
+
result.metaData.itemId = yield this._iOne.copyInstanceAndLoseOriginalConfiguration(originalInstanceId, result)
|
|
307
|
+
.catch((e) => {
|
|
308
|
+
return originalInstanceId;
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
result.metaData.itemId = yield this._iOne.copyInstanceAndSaveOriginalConfiguration(originalInstanceId, result)
|
|
313
|
+
.catch((e) => {
|
|
314
|
+
return originalInstanceId;
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (result.resultType !== ResultType.ArticleNotFound) {
|
|
319
|
+
yield this._setInstanceToConfigure(result)
|
|
320
|
+
.catch((e) => Promise.reject(result));
|
|
321
|
+
}
|
|
322
|
+
result.instanceId = result.metaData.itemId;
|
|
323
|
+
this.startPosition = result.metaData.position ? result.metaData.position.clone() : new Vector3();
|
|
324
|
+
const questionAndAnswers = yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
|
|
325
|
+
if (questionAndAnswers.question && !questionAndAnswers.question.grouped) {
|
|
326
|
+
this._iOne.handleAnswersReceived(questionAndAnswers.answers);
|
|
327
|
+
}
|
|
328
|
+
this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
|
|
329
|
+
if (questionAndAnswers.answers.length === 0) {
|
|
330
|
+
this.activeAnswers = [];
|
|
331
|
+
this.activeQuestion = undefined;
|
|
332
|
+
yield this._prepareSelectionsAndDecos(result)
|
|
333
|
+
.catch((e) => Promise.reject(e));
|
|
334
|
+
return this.build(result);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
this.activeQuestion = questionAndAnswers.question;
|
|
338
|
+
this.activeAnswers = questionAndAnswers.answers;
|
|
339
|
+
if (firstBuild) {
|
|
340
|
+
yield this._prepareSelectionsAndDecos(result)
|
|
341
|
+
.catch((e) => Promise.reject(e));
|
|
342
|
+
if (this._iOne.selections.length < 1) {
|
|
343
|
+
result.resultType = ResultType.NeedsUserInput;
|
|
344
|
+
}
|
|
345
|
+
else if (this._iOne.selections.length < 2) {
|
|
346
|
+
result.resultType = ResultType.BuildFromScratch;
|
|
347
|
+
}
|
|
348
|
+
else if (this._iOne.selections.length > 1) {
|
|
349
|
+
result.resultType = ResultType.NeedsUserInput;
|
|
350
|
+
}
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
getOptionsFromSelection(baseSelection) {
|
|
357
|
+
const selections = [];
|
|
358
|
+
let nodeLevel = -1;
|
|
359
|
+
const len = this.selections.length;
|
|
360
|
+
for (let i = 0; i < len; i++) {
|
|
361
|
+
const selection = this.selections[i];
|
|
362
|
+
const level = selection.presentationLevel;
|
|
363
|
+
if (nodeLevel !== -1) {
|
|
364
|
+
if (nodeLevel < level && this._canConnectSelections(baseSelection, selection) && this._selectionPublished(selection)) {
|
|
365
|
+
selections.push(selection);
|
|
366
|
+
}
|
|
367
|
+
if (nodeLevel >= level) {
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (selection.id === baseSelection.id && selection.node === baseSelection.node) {
|
|
372
|
+
nodeLevel = level;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return selections;
|
|
376
|
+
}
|
|
377
|
+
downloadCurrentCustomFloorgroup() {
|
|
378
|
+
const objectToExport = this._currentCustomFloorGroup ? this._currentCustomFloorGroup : this._itemService.items[0];
|
|
379
|
+
this._utilsService.showExportDialog(objectToExport);
|
|
380
|
+
}
|
|
381
|
+
downloadScene() {
|
|
382
|
+
const assetPath = this._settingsService.settings.assetPath;
|
|
383
|
+
// The ground plane looks odd in renders.
|
|
384
|
+
// The hud-ring and hud-circle are the walkthrough mode marker,
|
|
385
|
+
// which is not supposed to be rendered.
|
|
386
|
+
const elementsToRemove = ['ground-plane', 'hud-ring', 'hud-circle'];
|
|
387
|
+
let scene;
|
|
388
|
+
scene = this._sceneService.scene.clone();
|
|
389
|
+
elementsToRemove.forEach(elementName => {
|
|
390
|
+
const selectedObject = scene.getObjectByName(elementName);
|
|
391
|
+
scene.remove(selectedObject);
|
|
392
|
+
});
|
|
393
|
+
scene.add(this._cameraService.camera.clone());
|
|
394
|
+
this._utilsService.showExportDialog(scene);
|
|
395
|
+
}
|
|
396
|
+
createSimple3DModel(result, standAlone) {
|
|
397
|
+
if (!isNill(standAlone)) {
|
|
398
|
+
this.standAlone = standAlone;
|
|
399
|
+
}
|
|
400
|
+
if (!this.full3DObjectToUse) { // there's no 3d model so get out
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
403
|
+
// there are no selections or decos for simple articles, so empty lists for integration purposes
|
|
404
|
+
this._iOne.emptySelections();
|
|
405
|
+
this.full3DObjectToUse.children.forEach(c => c.visible = true);
|
|
406
|
+
if (!result.metaData.position) {
|
|
407
|
+
result.metaData.position = this.startPosition || defaultPosition;
|
|
408
|
+
}
|
|
409
|
+
if (!result.metaData.rotation) {
|
|
410
|
+
result.metaData.rotation = result.metaData.default180 ? defaultRotation : new Euler();
|
|
411
|
+
}
|
|
412
|
+
const itemConstructor = Factory.getClass(this.standAlone ? ItemType.FloorGroup : result.metaData.itemType);
|
|
413
|
+
const item = new itemConstructor(result.metaData, this.full3DObjectToUse);
|
|
414
|
+
result.metaData.objectUUID = item.uuid;
|
|
415
|
+
item.allowRotate = !this.standAlone;
|
|
416
|
+
item.highLightDisabled = !this._settingsService.settings.options.useStandaloneHighLight;
|
|
417
|
+
this._itemService.addItem(item);
|
|
418
|
+
if (item.itemGroup) {
|
|
419
|
+
this._itemGroupService.reattachToItemGroup(item, item.itemGroup, item.position);
|
|
420
|
+
}
|
|
421
|
+
// For simple articles we use object uuid, because they don't have an instanceId
|
|
422
|
+
this._upsertFurniture(item.uuid, { BrandIdentifier: result.metaData.itemIdentifier }, item);
|
|
423
|
+
this._handleIntegration(item.uuid, item);
|
|
424
|
+
result.furniture = item;
|
|
425
|
+
this._sceneService.updatePathTracer();
|
|
426
|
+
return result;
|
|
427
|
+
}
|
|
428
|
+
_buildFloor(result) {
|
|
429
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
430
|
+
const item = this._floorService.floorToConfigure;
|
|
431
|
+
item.metadata = result.metaData;
|
|
432
|
+
item.children[0].userData.selection = this.selections[0];
|
|
433
|
+
item.configuringChangeHandler = this.changeConfigureMode;
|
|
434
|
+
item.selectedHandler = this.selectItem;
|
|
435
|
+
item.unselectedHandler = this.unSelectItem;
|
|
436
|
+
yield this._loadVariations(item, result.metaData.itemId);
|
|
437
|
+
this._floorService.unHighLightFloors();
|
|
438
|
+
this._sceneService.needsRender = true;
|
|
439
|
+
this._currentCustomFloorGroup = item;
|
|
440
|
+
result.furniture = this._currentCustomFloorGroup;
|
|
441
|
+
result.instanceId = result.metaData.itemId;
|
|
442
|
+
this._handleIntegration(result.metaData.itemId, this._currentCustomFloorGroup);
|
|
443
|
+
if (this._currentCustomFloorGroup.itemGroup) {
|
|
444
|
+
this._itemGroupService.reattachToItemGroup(this._currentCustomFloorGroup, this._currentCustomFloorGroup.itemGroup, this._currentCustomFloorGroup.position);
|
|
445
|
+
}
|
|
446
|
+
this._answerSelected.length = 0;
|
|
447
|
+
this._hudService.updateSelectedItemHud();
|
|
448
|
+
this.buildFinished.next(result);
|
|
449
|
+
if (result.resultType === ResultType.NoSelections) {
|
|
450
|
+
result.resultType = ResultType.ConfigurationFixed;
|
|
451
|
+
}
|
|
452
|
+
else if (result.resultType !== ResultType.Obsolete && result.resultType !== ResultType.ConfigurationFixed) { // don't override these
|
|
453
|
+
result.resultType = ResultType.Loaded;
|
|
454
|
+
}
|
|
455
|
+
return result;
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
_startToBuildFromConfigurator(metadata) {
|
|
459
|
+
return this.startToBuild(null, metadata);
|
|
460
|
+
}
|
|
461
|
+
_setInstanceToConfigure(result) {
|
|
462
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
463
|
+
if (result.resultType !== ResultType.Timeout) {
|
|
464
|
+
if (result.metaData.itemId) {
|
|
465
|
+
yield this._iOne.setInstance(result.metaData.itemId)
|
|
466
|
+
.catch((e) => {
|
|
467
|
+
result.errorMessages.push(new ErrorMessage(e));
|
|
468
|
+
Promise.reject(result);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
const response = yield this._iOne.initNodeInstance(result.metaData.itemIdentifier)
|
|
473
|
+
.catch((e) => {
|
|
474
|
+
result.errorMessages.push(new ErrorMessage(e));
|
|
475
|
+
Promise.reject(result);
|
|
476
|
+
});
|
|
477
|
+
if (response && response.validationResult && response.validationResult.success) {
|
|
478
|
+
result.metaData.itemId = response.resultObject;
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
Promise.reject(result);
|
|
482
|
+
}
|
|
483
|
+
yield this._iOne.setInstance(result.metaData.itemId)
|
|
484
|
+
.catch((e) => {
|
|
485
|
+
result.errorMessages.push(new ErrorMessage(e));
|
|
486
|
+
Promise.reject(result);
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
return result;
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
return Promise.reject();
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
_prepareSelectionsAndDecos(result) {
|
|
497
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
498
|
+
this._reset();
|
|
499
|
+
try {
|
|
500
|
+
const selectionsAndDecoPromise = [];
|
|
501
|
+
selectionsAndDecoPromise.push(this._iOne.getSelectionsAsync(), this._iOne.getDecosAsync());
|
|
502
|
+
yield Promise.all(selectionsAndDecoPromise);
|
|
503
|
+
this._preloadMaterials(result.metaData.schema);
|
|
504
|
+
}
|
|
505
|
+
catch (e) {
|
|
506
|
+
}
|
|
507
|
+
if (this._iOne.selections.length < 2) { // no selections, only selection of type 'ART'
|
|
508
|
+
try {
|
|
509
|
+
if (result.resultType !== ResultType.ArticleNotFound && !result.metaData.originalItemId) { // article found, so init that first
|
|
510
|
+
result.metaData.originalItemId = result.metaData.itemId;
|
|
511
|
+
result.metaData.itemId = null;
|
|
512
|
+
yield this._setInstanceToConfigure(result);
|
|
513
|
+
result.resultType = ResultType.NoSelections;
|
|
514
|
+
return this.startToBuild(result); // 'restart' the build
|
|
515
|
+
}
|
|
516
|
+
this._getSelectionsAndDecosFromMetadata(result);
|
|
517
|
+
}
|
|
518
|
+
catch (e) {
|
|
519
|
+
return Promise.reject(e);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
this._iOne.selections.forEach(s => {
|
|
523
|
+
s.schema = result.metaData.schema;
|
|
524
|
+
s.instanceId = result.metaData.itemId;
|
|
525
|
+
}); // add schema for material creation
|
|
526
|
+
this._handleSelectionsReceived(result.metaData);
|
|
527
|
+
this._linkSelectionsAndDecos();
|
|
528
|
+
this._prepareTheSelections(result.metaData.itemId);
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
_preloadMaterials(schema) {
|
|
532
|
+
this._variationCacheService.preloadVariations(schema, this._iOne.decoNodes.map(d => d.gameObjectName), this.articleAssetPath);
|
|
533
|
+
}
|
|
534
|
+
_getSelectionsAndDecosFromMetadata(result) {
|
|
535
|
+
if (result.metaData.selections && result.metaData.decos) {
|
|
536
|
+
this._iOne.setSelections(result.metaData.selections);
|
|
537
|
+
this._iOne.setDecoNodes(Array.from(result.metaData.decos.values()));
|
|
538
|
+
result.metaData.obsolete = true;
|
|
539
|
+
if (result.resultType !== ResultType.ConfigurationNotFixed) {
|
|
540
|
+
result.resultType = ResultType.Obsolete;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
if (this._iOne.selections.length < 2 || this._iOne.decoNodes.length === 0) {
|
|
545
|
+
result.errorMessages.push(new ErrorMessage('NO_SELECTIONS_OR_DECOS', 'NO_SELECTIONS_OR_DECOS_INFO'));
|
|
546
|
+
}
|
|
547
|
+
throw result;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
_selectionPublished(selection) {
|
|
551
|
+
return ((selection.hierarchicalPublicationCode === null) || ((selection.hierarchicalPublicationCode & 2) > 0)) &&
|
|
552
|
+
((selection.nodeType === NodeType.Question &&
|
|
553
|
+
(((selection.questionPublicationCode & 2) > 0) ||
|
|
554
|
+
selection.questionPublicationCode === null || selection.questionPublicationCode === undefined)) ||
|
|
555
|
+
(selection.nodeType === NodeType.Answer &&
|
|
556
|
+
(((selection.answerPublicationCode & 2) > 0) ||
|
|
557
|
+
selection.answerPublicationCode === null || selection.answerPublicationCode === undefined)));
|
|
558
|
+
}
|
|
559
|
+
_handleIntegration(instanceId, object) {
|
|
560
|
+
if (this._integrationEnabled && !object.metadata.obsolete) {
|
|
561
|
+
const genericVariationSelections = this._iOne.selections.filter(s => s.decoNode && s.generic &&
|
|
562
|
+
s.decoNode.variation && s.decoNode.variation.type === DecoNodeType.Variation);
|
|
563
|
+
if (genericVariationSelections && genericVariationSelections.length > 0) {
|
|
564
|
+
this._upsertFurniture(instanceId, {
|
|
565
|
+
Variation: genericVariationSelections[0].decoNode.variation.brandId,
|
|
566
|
+
VariationDescription: genericVariationSelections[0].decoNode.variation.gameObjectName,
|
|
567
|
+
SupplierArticleNr: genericVariationSelections[0].decoNode.variation.supplierArticleNr
|
|
568
|
+
}, object);
|
|
569
|
+
}
|
|
570
|
+
this._handleIntegrationConnections(instanceId, object);
|
|
571
|
+
this._upsertFurniture(instanceId, { Position: object.position, Rotation: object.rotation }, object);
|
|
572
|
+
this._messageBus.emit(MessageType.ConfigurationChanged, this._furnitureConfigurations);
|
|
573
|
+
// console.log(this._furnitureConfigurations);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
_startWithNew(cleanup = true) {
|
|
577
|
+
this._furnitureConfigurations.length = 0;
|
|
578
|
+
if (cleanup) {
|
|
579
|
+
this._placedAdjustables.forEach(a => Utils.DisposeObject(a));
|
|
580
|
+
this._placedAddables.forEach(a => Utils.DisposeObject(a));
|
|
581
|
+
this._cleanup();
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
_cleanupBeforePresetLoad() {
|
|
585
|
+
MaterialUtils.ClearCaches();
|
|
586
|
+
}
|
|
587
|
+
/*
|
|
588
|
+
* Clear variables to let objects being disposed properly
|
|
589
|
+
*/
|
|
590
|
+
_handleAfterPresetLoad() {
|
|
591
|
+
// make sure nothing is keeping a lock
|
|
592
|
+
this._iOne.setInstance(null);
|
|
593
|
+
// clean
|
|
594
|
+
this._cleanup();
|
|
595
|
+
}
|
|
596
|
+
_cleanup() {
|
|
597
|
+
Utils.DisposeObject(this.full3DObjectToUse);
|
|
598
|
+
this.full3DObjectToUse = undefined;
|
|
599
|
+
this._currentCustomFloorGroup = undefined;
|
|
600
|
+
Utils.DisposeObject(this._activeChildElement);
|
|
601
|
+
this._activeChildElement = undefined;
|
|
602
|
+
this._placedAdjustables.length = 0;
|
|
603
|
+
this._placedAddables.length = 0;
|
|
604
|
+
this._adjustables.length = 0;
|
|
605
|
+
this._addables.length = 0;
|
|
606
|
+
}
|
|
607
|
+
_enableIntegration() {
|
|
608
|
+
this._integrationEnabled = true;
|
|
609
|
+
}
|
|
610
|
+
_handleItemRemovedFromScene(result) {
|
|
611
|
+
if (result.addedToGroup) {
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
if (result.item instanceof Item && !(result.item instanceof FloorPin || result.item instanceof WallPin)) {
|
|
615
|
+
if (this._integrationEnabled && result.item.userData) {
|
|
616
|
+
const id = result.item.userData.itemId ? result.item.userData.itemId : result.item.uuid;
|
|
617
|
+
this._furnitureConfigurations.splice(this._furnitureConfigurations.findIndex(f => f.Id === id), 1);
|
|
618
|
+
this._messageBus.emit(MessageType.ConfigurationChanged, this._furnitureConfigurations);
|
|
619
|
+
// console.log(this._furnitureConfigurations);
|
|
620
|
+
}
|
|
621
|
+
this._clearElements(result.item);
|
|
622
|
+
this._cleanup();
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
_clearElements(item) {
|
|
626
|
+
if (item instanceof CustomFloorItem && item.userData && item.userData.itemId) {
|
|
627
|
+
this.baseElementNodeId = undefined;
|
|
628
|
+
this._originalElementPosition.set(0, 0, 0);
|
|
629
|
+
this._elementService.removeElement(item.userData.itemId);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
_handleIntegrationConnections(id, object) {
|
|
633
|
+
const parts = [];
|
|
634
|
+
const childParts = object.configurable ? object.children : [object];
|
|
635
|
+
const len = childParts.length;
|
|
636
|
+
for (let i = 0; i < len; i++) {
|
|
637
|
+
const child = childParts[i];
|
|
638
|
+
const connection = new FurniturePartIntegration();
|
|
639
|
+
const variations = [];
|
|
640
|
+
if (child.userData && child.userData.selection && child.userData.selection.decoNode) {
|
|
641
|
+
connection.Id = childParts.findIndex(c => c === child).toString();
|
|
642
|
+
connection.SupplierArticleNr = child.userData.selection.supplierArticleNr;
|
|
643
|
+
connection.BrandIdentifier = child.userData.selection.decoNode.brandId;
|
|
644
|
+
connection.BrandDescription = child.userData.selection.decoNode.gameObjectName;
|
|
645
|
+
connection.Position = child.position;
|
|
646
|
+
connection.Rotation = child.rotation;
|
|
647
|
+
if (child.userData.selection.variations) {
|
|
648
|
+
if (child.userData.selection.variations.length === 1) {
|
|
649
|
+
const variation = child.userData.selection.variations[0];
|
|
650
|
+
connection.Variation = variation.brandId;
|
|
651
|
+
connection.VariationDescription = variation.gameObjectName;
|
|
652
|
+
}
|
|
653
|
+
else {
|
|
654
|
+
for (let j = 0; j < child.userData.selection.variations.length; j++) {
|
|
655
|
+
const variation = child.userData.selection.variations[j];
|
|
656
|
+
const variationPart = new FurniturePartVariation();
|
|
657
|
+
variationPart.Variation = variation.brandId;
|
|
658
|
+
variationPart.VariationDescription = variation.gameObjectName;
|
|
659
|
+
variationPart.MaterialId = variation.materialId;
|
|
660
|
+
variationPart.SupplierArticleNr = variation.supplierArticleNr;
|
|
661
|
+
variationPart.Option = variation.optionText;
|
|
662
|
+
variations.push(variationPart);
|
|
663
|
+
}
|
|
664
|
+
connection.Variations = variations;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
else { // a-artikel
|
|
669
|
+
connection.Id = childParts.findIndex(c => c === child).toString();
|
|
670
|
+
connection.BrandIdentifier = child.metadata.itemIdentifier;
|
|
671
|
+
connection.BrandDescription = child.metadata.itemName;
|
|
672
|
+
connection.Position = child.position;
|
|
673
|
+
connection.Rotation = child.rotation;
|
|
674
|
+
}
|
|
675
|
+
const connectors = [];
|
|
676
|
+
const clen = child.children.length;
|
|
677
|
+
for (let j = 0; j < clen; j++) {
|
|
678
|
+
const connector = child.children[j];
|
|
679
|
+
if ((connector instanceof CustomObject3D || connector instanceof CustomMesh) && connector.connectedTo) {
|
|
680
|
+
const conn = new FurnitureConnectedPartIntegration();
|
|
681
|
+
conn.ConnectionLabel = connector.name;
|
|
682
|
+
const foreignPartIdx = this._currentCustomFloorGroup.children.findIndex(c => c.name === connector.connectedTo);
|
|
683
|
+
conn.ForeignConnectionLabel = this._currentCustomFloorGroup.children[foreignPartIdx].userData.selection.decoNode.gameObjectName;
|
|
684
|
+
conn.ForeignPartId = foreignPartIdx.toString();
|
|
685
|
+
conn.Position = connector.position;
|
|
686
|
+
conn.Rotation = connector.rotation;
|
|
687
|
+
connectors.push(conn);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
connection.ConnectedParts = connectors;
|
|
691
|
+
parts.push(connection);
|
|
692
|
+
}
|
|
693
|
+
this._upsertFurniture(id, { Parts: parts }, object);
|
|
694
|
+
}
|
|
695
|
+
_upsertFurniture(id, object, item) {
|
|
696
|
+
if (this._integrationEnabled && !item.metadata.obsolete) {
|
|
697
|
+
const idx = this._furnitureConfigurations.findIndex(f => f.Id === id);
|
|
698
|
+
let furniture;
|
|
699
|
+
if (idx < 0) {
|
|
700
|
+
if (this._furnitureConfigurations.length === 1 && !this._furnitureConfigurations[0].Id) { // empty entry for mrp code, re-use that one
|
|
701
|
+
furniture = this._furnitureConfigurations[0];
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
furniture = new FurnitureIntegration();
|
|
705
|
+
this._furnitureConfigurations.push(furniture);
|
|
706
|
+
}
|
|
707
|
+
furniture.Id = id;
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
furniture = this._furnitureConfigurations[idx];
|
|
711
|
+
}
|
|
712
|
+
furniture.MrpCode = this._permanentStoreService.code;
|
|
713
|
+
for (const key in object) {
|
|
714
|
+
if (furniture.hasOwnProperty(key) && object.hasOwnProperty(key)) {
|
|
715
|
+
furniture[key] = object[key];
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
_setCodeOnFurnitureConfiguration() {
|
|
721
|
+
if (this._integrationEnabled) {
|
|
722
|
+
if (this._furnitureConfigurations.length < 1) {
|
|
723
|
+
const furniture = new FurnitureIntegration();
|
|
724
|
+
furniture.MrpCode = this._permanentStoreService.code;
|
|
725
|
+
this._furnitureConfigurations.push(furniture);
|
|
726
|
+
}
|
|
727
|
+
else {
|
|
728
|
+
this._furnitureConfigurations.forEach(f => f.MrpCode = this._permanentStoreService.code);
|
|
729
|
+
}
|
|
730
|
+
this._messageBus.emit(MessageType.ConfigurationChanged, this._furnitureConfigurations);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
_canConnectSelections(sel1, sel2) {
|
|
734
|
+
if (!sel1.decoNode || !sel2.decoNode) {
|
|
735
|
+
return false;
|
|
736
|
+
}
|
|
737
|
+
let canConnect = sel2.decoNode.type !== DecoNodeType.Part;
|
|
738
|
+
if (!canConnect) {
|
|
739
|
+
const len = sel1.decoNode.connectors.length;
|
|
740
|
+
for (let i = 0; i < len; i++) {
|
|
741
|
+
const leni = sel2.decoNode.connectors.length;
|
|
742
|
+
for (let ii = 0; ii < leni; ii++) {
|
|
743
|
+
canConnect = Scene3DUtil.CanSelectorConnect(sel1.decoNode.connectors, sel1.decoNode.connectors[i], sel2.decoNode.connectors[ii]);
|
|
744
|
+
if (canConnect) {
|
|
745
|
+
return true;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
return false;
|
|
750
|
+
}
|
|
751
|
+
return canConnect;
|
|
752
|
+
}
|
|
753
|
+
_handleSelectionsReceived(metadata) {
|
|
754
|
+
if (this._answerSelected.length > 0) {
|
|
755
|
+
const selection = this.selections.find(s => s.nodeId === this._answerSelected[this._answerSelected.length - 1].nodeId);
|
|
756
|
+
if (selection) {
|
|
757
|
+
let itemName = '';
|
|
758
|
+
if (metadata.itemName === '') {
|
|
759
|
+
if (metadata.itemDescription !== '') {
|
|
760
|
+
itemName = metadata.itemDescription;
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
itemName = metadata.itemIdentifier;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
else {
|
|
767
|
+
itemName = metadata.itemName;
|
|
768
|
+
}
|
|
769
|
+
this._googleTagManager.sendEvent(GoogleTagManagerEvent.AnswerChosen, {
|
|
770
|
+
'articleNr': metadata.itemIdentifier,
|
|
771
|
+
'product': itemName,
|
|
772
|
+
'optionDescription': selection.commercialAnswer ? selection.commercialAnswer : selection.answer,
|
|
773
|
+
'optionPath': selection.selection
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
_handleConnectionReset() {
|
|
779
|
+
if (this._currentCustomFloorGroup) {
|
|
780
|
+
this._currentCustomFloorGroup.setUnselected();
|
|
781
|
+
this._messageBus.emit(MessageType.ItemUnselected, undefined);
|
|
782
|
+
this._showWarning({ title: 'WARNING', message: 'REFRESH_DUE_TO_INACTIVITY' });
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
_handleAnswerSelected(answer) {
|
|
786
|
+
this._answerSelected.push(answer);
|
|
787
|
+
}
|
|
788
|
+
cancelAnswer(metadata, rebuild = true, getAnswers = false) {
|
|
789
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
790
|
+
yield this._iOne.cancelAnswer();
|
|
791
|
+
if (rebuild) {
|
|
792
|
+
this._startToBuildFromConfigurator(metadata);
|
|
793
|
+
}
|
|
794
|
+
else if (getAnswers) { // if not rebuild then check if we need to get answers
|
|
795
|
+
const questionAndAnswers = yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
|
|
796
|
+
this._iOne.handleAnswersReceived(questionAndAnswers.answers);
|
|
797
|
+
this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
|
|
798
|
+
}
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
selectSelection(selection, metadata, forceBackToNode, after, connector) {
|
|
802
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
803
|
+
yield this._iOne.selectSelection(selection, forceBackToNode, after, connector);
|
|
804
|
+
this._genericSelection = selection.generic;
|
|
805
|
+
this._startToBuildFromConfigurator(metadata);
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
deleteSelection(selection, metadata) {
|
|
809
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
810
|
+
this._elementService.removeElement(selection.instanceId, selection.node);
|
|
811
|
+
yield this._iOne.deleteSelection(selection);
|
|
812
|
+
this._startToBuildFromConfigurator(metadata);
|
|
813
|
+
});
|
|
814
|
+
}
|
|
815
|
+
replaceSelection(selection, metadata) {
|
|
816
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
817
|
+
yield this._iOne.replaceSelection(selection);
|
|
818
|
+
this._startToBuildFromConfigurator(metadata);
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
selectAnswer(answer, input, metadata) {
|
|
822
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
823
|
+
this._preloadMaterial(answer);
|
|
824
|
+
yield this._iOne.selectAnswer(answer, input);
|
|
825
|
+
this._handleAnswerSelected(answer);
|
|
826
|
+
const result = yield this._startToBuildFromConfigurator(metadata);
|
|
827
|
+
this.answerSelected.next(result);
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
_getActiveFurniture(instanceId) {
|
|
831
|
+
const configurables = this._itemService.getConfigurables();
|
|
832
|
+
const len = configurables.length;
|
|
833
|
+
for (let i = 0; i < len; i++) {
|
|
834
|
+
if (configurables[i].metadata && configurables[i].metadata.itemId === instanceId && !configurables[i].tempObject) {
|
|
835
|
+
return configurables[i];
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
_linkSelectionsAndDecos() {
|
|
840
|
+
const len = this.selections.length;
|
|
841
|
+
for (let i = 0; i < len; i++) {
|
|
842
|
+
// const id: string = this.selections[i].artNodeIdDeco;
|
|
843
|
+
let deco = this._iOne.decoNodes.find(d => d.id === this.selections[i].artNodeIdDeco);
|
|
844
|
+
if (!deco) {
|
|
845
|
+
deco = new DecoNode();
|
|
846
|
+
}
|
|
847
|
+
if (deco.type !== DecoNodeType.Variation) {
|
|
848
|
+
const variation = this._getVariations().find(v => v.parentId === this.selections[i].artNodeIdDeco);
|
|
849
|
+
if (variation) {
|
|
850
|
+
deco.variation = variation;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
this.selections[i].decoNode = deco;
|
|
854
|
+
}
|
|
855
|
+
this._iOne.selectionsAndDecosLinked.next();
|
|
856
|
+
}
|
|
857
|
+
_createConfigurableItem(instanceId, metadata) {
|
|
858
|
+
// const furniture: Item = this._getActiveFurniture(instanceId);
|
|
859
|
+
// const cloneSelections = JSON.parse(JSON.stringify(this.selections));
|
|
860
|
+
// cloneSelections.forEach(s => {
|
|
861
|
+
// s.imageData = undefined;
|
|
862
|
+
// s.imageDataLastAnswer = undefined;
|
|
863
|
+
// });
|
|
864
|
+
// if (furniture) {
|
|
865
|
+
// furniture.metadata.decos = Array.from(this._iOne.decoNodes);
|
|
866
|
+
// furniture.metadata.selections = cloneSelections;
|
|
867
|
+
// furniture.markForDeletionChildren();
|
|
868
|
+
// return furniture;
|
|
869
|
+
// }
|
|
870
|
+
if (!metadata.position) {
|
|
871
|
+
metadata.position = this.startPosition || defaultPosition;
|
|
872
|
+
}
|
|
873
|
+
if (!metadata.rotation) {
|
|
874
|
+
metadata.rotation = metadata.default180 ? defaultRotation : new Euler();
|
|
875
|
+
}
|
|
876
|
+
// If itemType is different in article compared to saved value in the .json, the itemType in article is applied
|
|
877
|
+
// metadata.itemType = this.itemType && this.itemType !== metadata.itemType ? this.itemType : metadata.itemType;
|
|
878
|
+
const itemConstructor = Factory.getClass(this.standAlone ? ItemType.CustomFloorGroup : metadata.itemType);
|
|
879
|
+
const item = new itemConstructor(metadata, undefined, // base on empty object
|
|
880
|
+
{
|
|
881
|
+
mouseOver: this.mouseOver,
|
|
882
|
+
mouseOff: this.mouseOff,
|
|
883
|
+
itemSelected: this.selectItem,
|
|
884
|
+
itemUnselected: this.unSelectItem,
|
|
885
|
+
elementSelected: this.selectElement,
|
|
886
|
+
elementUnselected: this.unSelectElement,
|
|
887
|
+
configuringChanged: this.changeConfigureMode,
|
|
888
|
+
childElementPositionChangedHandler: this.moveChildElement,
|
|
889
|
+
childElementPlaceHandler: this.placeChildElement
|
|
890
|
+
/*
|
|
891
|
+
childElementPositionChangedHandler: adjustable ? this.moveChildElement : undefined,
|
|
892
|
+
childElementPlaceHandler: adjustable ? this.placeChildElement : undefined
|
|
893
|
+
*/
|
|
894
|
+
});
|
|
895
|
+
item.canDelete = !this.standAlone;
|
|
896
|
+
item.canCopy = !this.standAlone;
|
|
897
|
+
item.allwaysConfigureMode = this.standAlone;
|
|
898
|
+
item.highLightDisabled = !this._settingsService.settings.options.useStandaloneHighLight;
|
|
899
|
+
item.tempObject = true;
|
|
900
|
+
item.name = metadata.itemName + '_clone';
|
|
901
|
+
item.visible = false;
|
|
902
|
+
this._itemService.addItem(item);
|
|
903
|
+
// this._upsertFurniture(metadata.itemId, {BrandIdentifier: metadata.itemIdentifier}, item);
|
|
904
|
+
return item;
|
|
905
|
+
}
|
|
906
|
+
_createPositionAnimation(object, from, to, easing) {
|
|
907
|
+
const tweenFrom = new Vector3().copy(from);
|
|
908
|
+
const tween = new TWEEN.Tween(tweenFrom)
|
|
909
|
+
.to(to, 1000)
|
|
910
|
+
.easing(easing)
|
|
911
|
+
.onUpdate(() => {
|
|
912
|
+
object.position.copy(tweenFrom);
|
|
913
|
+
this._sceneService.needsRender = true;
|
|
914
|
+
});
|
|
915
|
+
return new Promise((resolve, reject) => tween.onComplete(resolve.bind(this, tween)).onStop(reject).start());
|
|
916
|
+
}
|
|
917
|
+
_animateChanges(furniture, changes) {
|
|
918
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
919
|
+
// it's christmasss
|
|
920
|
+
const animations = [];
|
|
921
|
+
if (furniture instanceof CustomFloorItem) {
|
|
922
|
+
for (let i = 0; i < changes.length; i++) {
|
|
923
|
+
const easing = !changes[i].oldPosition ? TWEEN.Easing.Exponential.Out :
|
|
924
|
+
(!changes[i].newPosition ? TWEEN.Easing.Exponential.Out : TWEEN.Easing.Exponential.InOut);
|
|
925
|
+
const from = changes[i].oldPosition ? new Vector3().copy(changes[i].oldPosition) : new Vector3().copy(changes[i].newPosition).setY(10);
|
|
926
|
+
const to = changes[i].newPosition ? new Vector3().copy(changes[i].newPosition) : new Vector3().copy(changes[i].oldPosition).setY(10);
|
|
927
|
+
const obj = furniture.getObjectByName(changes[i].name);
|
|
928
|
+
if (!from.equals(to)) {
|
|
929
|
+
animations.push(this._createPositionAnimation(obj, from, to, easing));
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
return yield Promise.all(animations);
|
|
934
|
+
});
|
|
935
|
+
}
|
|
936
|
+
_replaceCurrentItem(newItem, metadata, animate = false) {
|
|
937
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
938
|
+
const furniture = this._getActiveFurniture(metadata.itemId);
|
|
939
|
+
const cloneSelections = JSON.parse(JSON.stringify(this.selections));
|
|
940
|
+
cloneSelections.forEach(s => {
|
|
941
|
+
s.imageData = undefined;
|
|
942
|
+
s.imageDataLastAnswer = undefined;
|
|
943
|
+
if (s.addables) {
|
|
944
|
+
s.addables.forEach(a => {
|
|
945
|
+
a.imageData = undefined;
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
});
|
|
949
|
+
if (furniture) {
|
|
950
|
+
furniture.metadata.decos = Array.from(this._iOne.decoNodes);
|
|
951
|
+
furniture.metadata.selections = cloneSelections;
|
|
952
|
+
if (furniture instanceof CustomWallFloorItem) {
|
|
953
|
+
newItem.currentWall = furniture.currentWall;
|
|
954
|
+
}
|
|
955
|
+
newItem.updatePivot();
|
|
956
|
+
const changes = furniture instanceof CustomFloorItem ? ObjectUtils.GetChanges(furniture.children, newItem.children) : [];
|
|
957
|
+
// animate removed items
|
|
958
|
+
const removedChanges = changes.filter(c => !c.newPosition);
|
|
959
|
+
if (animate && removedChanges && removedChanges.length > 0) { // animate changes to the model
|
|
960
|
+
yield this._animateChanges(furniture, removedChanges);
|
|
961
|
+
}
|
|
962
|
+
// remove children from furniture
|
|
963
|
+
furniture.clearChildren();
|
|
964
|
+
// add new children to furniture
|
|
965
|
+
newItem.children.map(c => furniture.addChild(c));
|
|
966
|
+
this._itemService.removeItem(newItem, false, false);
|
|
967
|
+
// animate (new) items
|
|
968
|
+
const otherChanges = changes.filter(c => c.newPosition);
|
|
969
|
+
if (animate && otherChanges && otherChanges.length > 0) { // animate changes to the model
|
|
970
|
+
yield this._animateChanges(furniture, otherChanges);
|
|
971
|
+
}
|
|
972
|
+
return furniture;
|
|
973
|
+
}
|
|
974
|
+
else {
|
|
975
|
+
newItem.visible = true;
|
|
976
|
+
newItem.tempObject = false;
|
|
977
|
+
newItem.name = metadata.itemName;
|
|
978
|
+
this._upsertFurniture(metadata.itemId, { BrandIdentifier: metadata.itemIdentifier }, newItem);
|
|
979
|
+
return newItem;
|
|
980
|
+
}
|
|
981
|
+
});
|
|
982
|
+
}
|
|
983
|
+
cancelConfiguringCurrentInstance() {
|
|
984
|
+
if (this._currentCustomFloorGroup) {
|
|
985
|
+
this._currentCustomFloorGroup.configuring = false;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
_isMoveableObject(obj) {
|
|
989
|
+
return obj.userData && obj.userData.selection && obj.userData.selection.hdecoPositioning === HdecoPositioning.Variable;
|
|
990
|
+
}
|
|
991
|
+
_addElementOnConnector(currentItem, element, connector, connectedNodeId) {
|
|
992
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
993
|
+
// const con: Object3D = this._currentCustomFloorGroup.getObjectByName(connector.connector);
|
|
994
|
+
// if (con) {e
|
|
995
|
+
// const pos: Vector3 = new Vector3().copy(con.position);
|
|
996
|
+
// con.localToWorld(pos);
|
|
997
|
+
const connectorFromElement = currentItem.connectorFromElement(element.userData.selection);
|
|
998
|
+
const idFromBaseElement = connectedNodeId ? connectedNodeId : connectorFromElement.connectedNodeId;
|
|
999
|
+
const baseElement = currentItem.getObjectsByUserDataProp('selection', 'nodeId', idFromBaseElement);
|
|
1000
|
+
const item = ObjectUtils.GetParentItem(element);
|
|
1001
|
+
if (item) {
|
|
1002
|
+
const conn = yield this._elementService.placeElementOnConnector(item.metadata.itemId, element, baseElement.length > 0 ? baseElement[0] : null, false, connector, false);
|
|
1003
|
+
this._saveElementConnector(element, conn);
|
|
1004
|
+
}
|
|
1005
|
+
// }
|
|
1006
|
+
});
|
|
1007
|
+
}
|
|
1008
|
+
_saveElementConnector(element, connector) {
|
|
1009
|
+
if (element && element.userData && element.userData.selection) {
|
|
1010
|
+
this._currentCustomFloorGroup.updateElementConnector(element.userData.selection, connector, this.baseElementNodeId);
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
/**
|
|
1014
|
+
* @param element The element to move
|
|
1015
|
+
* @param pos The local position
|
|
1016
|
+
* @private
|
|
1017
|
+
*/
|
|
1018
|
+
_moveChildElementToPosition(element, pos) {
|
|
1019
|
+
if (this._isMoveableObject(element)) {
|
|
1020
|
+
const worldToLocalPos = new Vector3().copy(pos).add(this._originalElementPosition);
|
|
1021
|
+
const baseElement = this._currentCustomFloorGroup.getObjectsByUserDataProp('selection', 'nodeId', this.baseElementNodeId);
|
|
1022
|
+
const item = ObjectUtils.GetParentItem(element);
|
|
1023
|
+
if (item) {
|
|
1024
|
+
this._elementService.moveElementToNewPosition(item.metadata.itemId, element, worldToLocalPos, baseElement.length > 0 ? baseElement[0] : null);
|
|
1025
|
+
// this._saveElementConnector(element, pos);
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
_reset() {
|
|
1030
|
+
this._placedAdjustables.length = 0;
|
|
1031
|
+
this._placedAddables.length = 0;
|
|
1032
|
+
this._adjustables.length = 0;
|
|
1033
|
+
this._addables.length = 0;
|
|
1034
|
+
// this._prepareTheSelections();
|
|
1035
|
+
// todo: check this
|
|
1036
|
+
// this._elementService.removeElement(this.activeInstance);
|
|
1037
|
+
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Returns the materialId of the parent up the tree until presentionlevel 1 is reached
|
|
1040
|
+
* @param id
|
|
1041
|
+
* @private
|
|
1042
|
+
*/
|
|
1043
|
+
_getMaterialIdFromParent(id) {
|
|
1044
|
+
const idx = this.selections.findIndex(s => s.node === id);
|
|
1045
|
+
let currentLevel = 999;
|
|
1046
|
+
if (idx > -1) {
|
|
1047
|
+
for (let i = idx; i > 0; i--) {
|
|
1048
|
+
const selection = this.selections[i];
|
|
1049
|
+
if (selection.presentationLevel >= currentLevel) {
|
|
1050
|
+
break;
|
|
1051
|
+
}
|
|
1052
|
+
currentLevel = selection.presentationLevel;
|
|
1053
|
+
if (selection.hdecoGameObject) {
|
|
1054
|
+
return selection.hdecoGameObject;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
return undefined;
|
|
1059
|
+
}
|
|
1060
|
+
_prepareTheSelections(instanceId) {
|
|
1061
|
+
const selections = this.selections.slice();
|
|
1062
|
+
const selectionOfArticle = selections.find(s => s.nodeType === NodeType.Article);
|
|
1063
|
+
const adjustableSelections = selections.filter(s => s.addAdjust === '2');
|
|
1064
|
+
const isArticleWithMaterial = adjustableSelections.length === 0 &&
|
|
1065
|
+
selectionOfArticle.gameObject &&
|
|
1066
|
+
selectionOfArticle.gameObject.length > 0;
|
|
1067
|
+
// get generic variations
|
|
1068
|
+
const globalVariations = this.selections
|
|
1069
|
+
.filter(s => (s.generic || adjustableSelections.length === 1) && s.decoNode.variation && !s.decoNode.type)
|
|
1070
|
+
.map((value, index, array) => {
|
|
1071
|
+
// find selection of variation
|
|
1072
|
+
const sel = this.selections.find(s => s.artNodeIdDeco === value.decoNode.variation.parentId);
|
|
1073
|
+
if (sel) {
|
|
1074
|
+
value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
|
|
1075
|
+
}
|
|
1076
|
+
value.decoNode.variation.materialId = this._getMaterialIdFromParent(value.node);
|
|
1077
|
+
return value.decoNode.variation;
|
|
1078
|
+
});
|
|
1079
|
+
// commented out for the moment
|
|
1080
|
+
// globalVariations.forEach(g => {
|
|
1081
|
+
// const parentIdx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.parentId);
|
|
1082
|
+
// if (parentIdx) { // remove parent selection
|
|
1083
|
+
// selections.splice(parentIdx, 1);
|
|
1084
|
+
// }
|
|
1085
|
+
// const idx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.id);
|
|
1086
|
+
// if (idx) { // move generic variations to top
|
|
1087
|
+
// const selection = selections[idx];
|
|
1088
|
+
// selections.splice(idx, 1);
|
|
1089
|
+
// selections.unshift(selection);
|
|
1090
|
+
// }
|
|
1091
|
+
// });
|
|
1092
|
+
const usedVariations = [];
|
|
1093
|
+
let globalVariationsRewrite = true;
|
|
1094
|
+
const len = selections.length;
|
|
1095
|
+
let lastAdded;
|
|
1096
|
+
let lastAdjustable;
|
|
1097
|
+
let newPart = false;
|
|
1098
|
+
let previousPresLevel = -1;
|
|
1099
|
+
let positioning;
|
|
1100
|
+
let optionText;
|
|
1101
|
+
for (let i = 0; i < len; i++) {
|
|
1102
|
+
const selection = selections[i];
|
|
1103
|
+
if (selection.presentationLevel === 1) {
|
|
1104
|
+
positioning = selection.hdecoPositioning;
|
|
1105
|
+
optionText = selection.question;
|
|
1106
|
+
}
|
|
1107
|
+
if (selection.presentationLevel > previousPresLevel) {
|
|
1108
|
+
selection.hdecoPositioning = selection.hdecoPositioning || positioning;
|
|
1109
|
+
}
|
|
1110
|
+
if (selection.decoNode) {
|
|
1111
|
+
if (selection.decoNode.type === DecoNodeType.Variation) {
|
|
1112
|
+
const decoNode = selection.decoNode;
|
|
1113
|
+
decoNode.optionText = optionText;
|
|
1114
|
+
// find selection of variation and set materialId in case of multimaterial
|
|
1115
|
+
decoNode.materialId = this._getMaterialIdFromParent(decoNode.nodeId);
|
|
1116
|
+
if (lastAdded) {
|
|
1117
|
+
if (newPart) {
|
|
1118
|
+
if (decoNode.materialId) {
|
|
1119
|
+
lastAdded.variations.push(decoNode);
|
|
1120
|
+
}
|
|
1121
|
+
else {
|
|
1122
|
+
lastAdded.variations = [decoNode];
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
else {
|
|
1126
|
+
lastAdded.variations.push(decoNode);
|
|
1127
|
+
}
|
|
1128
|
+
newPart = false;
|
|
1129
|
+
}
|
|
1130
|
+
else {
|
|
1131
|
+
if (globalVariationsRewrite) {
|
|
1132
|
+
globalVariations.length = 0;
|
|
1133
|
+
globalVariationsRewrite = false;
|
|
1134
|
+
}
|
|
1135
|
+
globalVariations.push(decoNode);
|
|
1136
|
+
}
|
|
1137
|
+
// const variation: FurniturePartVariation = new FurniturePartVariation();
|
|
1138
|
+
// variation.BrandId = selection.decoNode.brandId;
|
|
1139
|
+
// variation.Description = selection.decoNode.gameObjectName;
|
|
1140
|
+
// variation.MaterialId = (selection.decoNode as any).materialId;
|
|
1141
|
+
// variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
|
|
1142
|
+
// usedVariations.push(variation);
|
|
1143
|
+
}
|
|
1144
|
+
else if ((selection.decoNode.type === DecoNodeType.Part &&
|
|
1145
|
+
typeof selection.decoNode.gameObjectName === 'string' &&
|
|
1146
|
+
selection.decoNode.gameObjectName.length) || (isArticleWithMaterial)) {
|
|
1147
|
+
if (selection.decoNode.kind === DecoNodeKind.Adjustable || (isArticleWithMaterial)) {
|
|
1148
|
+
selection.variations = globalVariations;
|
|
1149
|
+
this._adjustables.push(selection);
|
|
1150
|
+
if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
|
|
1151
|
+
newPart = true;
|
|
1152
|
+
}
|
|
1153
|
+
lastAdded = selection;
|
|
1154
|
+
lastAdjustable = selection;
|
|
1155
|
+
}
|
|
1156
|
+
else if (selection.decoNode.kind === DecoNodeKind.Addable) {
|
|
1157
|
+
selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations;
|
|
1158
|
+
if (lastAdjustable) {
|
|
1159
|
+
lastAdjustable.addables.push(selection);
|
|
1160
|
+
}
|
|
1161
|
+
this._addables.push(selection);
|
|
1162
|
+
if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
|
|
1163
|
+
newPart = true;
|
|
1164
|
+
}
|
|
1165
|
+
lastAdded = selection;
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
previousPresLevel = selection.presentationLevel;
|
|
1170
|
+
}
|
|
1171
|
+
// this._upsertFurniture(this.activeInstance,
|
|
1172
|
+
// {Variations: usedVariations});
|
|
1173
|
+
}
|
|
1174
|
+
_getAdjustables(checkGameObject = true, checkType = true) {
|
|
1175
|
+
return this.selections.filter(s => {
|
|
1176
|
+
const node = s.decoNode;
|
|
1177
|
+
return node && (checkGameObject ? node.gameObjectName : true) && (checkType ? node.type === DecoNodeType.Part : true) && node.kind === DecoNodeKind.Adjustable;
|
|
1178
|
+
});
|
|
1179
|
+
}
|
|
1180
|
+
_getVariations() {
|
|
1181
|
+
if (this._iOne.decoNodes.length === 0) {
|
|
1182
|
+
return [];
|
|
1183
|
+
}
|
|
1184
|
+
return this._iOne.decoNodes.filter((deco) => {
|
|
1185
|
+
return deco.type === DecoNodeType.Variation;
|
|
1186
|
+
});
|
|
1187
|
+
}
|
|
1188
|
+
_createAdjustable(item, adj) {
|
|
1189
|
+
let obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(adj.decoNode.gameObjectName || adj.gameObject) : null;
|
|
1190
|
+
if (!obj) {
|
|
1191
|
+
// in case of glb files, the importer removes dots from names
|
|
1192
|
+
const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
|
|
1193
|
+
obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(name) : null;
|
|
1194
|
+
if (!obj) {
|
|
1195
|
+
console.warn(`No object with name ${adj.decoNode.gameObjectName} found!`);
|
|
1196
|
+
return null;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
let adjustable = obj.clone();
|
|
1200
|
+
adjustable.name = this._createUniqueName(item, obj);
|
|
1201
|
+
adjustable.userData.selection = adj;
|
|
1202
|
+
adjustable.position.set(0, 0, 0);
|
|
1203
|
+
adjustable.traverse(c => {
|
|
1204
|
+
c.visible = !c.name.toLowerCase().startsWith('c_');
|
|
1205
|
+
});
|
|
1206
|
+
item.addChild(adjustable);
|
|
1207
|
+
// the object being added to the customFloorGroup is being recreated so we loose the reference
|
|
1208
|
+
// therefor we need to retrieve the created object again
|
|
1209
|
+
adjustable = item.getObjectByName(adjustable.name);
|
|
1210
|
+
this._placedAdjustables.push(adjustable);
|
|
1211
|
+
return adjustable;
|
|
1212
|
+
}
|
|
1213
|
+
_createAddable(item, add, part2, part1) {
|
|
1214
|
+
const obj = this.full3DObjectToUse.getObjectByName(add.decoNode.gameObjectName);
|
|
1215
|
+
if (!obj) {
|
|
1216
|
+
return null;
|
|
1217
|
+
}
|
|
1218
|
+
// const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
|
|
1219
|
+
const addable = obj.clone();
|
|
1220
|
+
addable.name = this._createUniqueName(item, obj);
|
|
1221
|
+
addable.userData.selection = add;
|
|
1222
|
+
addable.position.set(0, 0, 0);
|
|
1223
|
+
addable.visible = true;
|
|
1224
|
+
if (part1 && part2) {
|
|
1225
|
+
return this._placeAddable(item, addable);
|
|
1226
|
+
}
|
|
1227
|
+
return addable;
|
|
1228
|
+
}
|
|
1229
|
+
_placeAddable(item, add) {
|
|
1230
|
+
item.addChild(add);
|
|
1231
|
+
const addable = item.getObjectByName(add.name);
|
|
1232
|
+
this._placedAddables.push(addable);
|
|
1233
|
+
return addable;
|
|
1234
|
+
}
|
|
1235
|
+
_createUniqueName(item, obj) {
|
|
1236
|
+
let iteration = 0;
|
|
1237
|
+
let name = `${item.name}_${obj.name}`;
|
|
1238
|
+
let existingObj = item.getObjectByName(name);
|
|
1239
|
+
while (existingObj) {
|
|
1240
|
+
iteration++;
|
|
1241
|
+
name = `${item.name}_${obj.name}` + (iteration !== 0 ? ('_' + iteration) : '');
|
|
1242
|
+
existingObj = item.getObjectByName(name);
|
|
1243
|
+
}
|
|
1244
|
+
return name;
|
|
1245
|
+
}
|
|
1246
|
+
_placeAddables(item) {
|
|
1247
|
+
const len = this._placedAdjustables.length;
|
|
1248
|
+
for (let i = 0; i < len; i++) {
|
|
1249
|
+
if (this._placedAdjustables[i].userData.hasOwnProperty('selection') && this._placedAdjustables[i].userData.selection) {
|
|
1250
|
+
const adjustableSelection = this._placedAdjustables[i].userData.selection;
|
|
1251
|
+
if (adjustableSelection) {
|
|
1252
|
+
const lena = adjustableSelection.addables.length;
|
|
1253
|
+
let conAddable;
|
|
1254
|
+
for (let ia = 0; ia < lena; ia++) {
|
|
1255
|
+
Scene3DUtil.TrySelectorConnection(this.scene, item, this._placedAdjustables[i], adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(item, add, part2, part1));
|
|
1256
|
+
if (conAddable) {
|
|
1257
|
+
Scene3DUtil.TrySelectorConnection(this.scene, item, conAddable, adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(item, add, part2, part1));
|
|
1258
|
+
}
|
|
1259
|
+
conAddable = this._placedAddables[this._placedAddables.length - 1];
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
_loadVariations(item, instanceId) {
|
|
1266
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1267
|
+
if (this._settingsService.settings.options.useVariationOnPart) {
|
|
1268
|
+
yield this._variationService.loadPart(this._adjustables, instanceId, item, true);
|
|
1269
|
+
}
|
|
1270
|
+
yield this._variationService.loadVariation(this._adjustables, instanceId, item, true);
|
|
1271
|
+
yield this._variationService.loadVariation(this._addables, instanceId, item, true);
|
|
1272
|
+
this._variationService.clearCache();
|
|
1273
|
+
});
|
|
1274
|
+
}
|
|
1275
|
+
_showWarning(data) {
|
|
1276
|
+
const dialogData = {
|
|
1277
|
+
title: this._dictionaryService.get(data.title), message: this._dictionaryService.get(data.message)
|
|
1278
|
+
};
|
|
1279
|
+
this._dialog.open(InfoDialogComponent, { data: dialogData });
|
|
1280
|
+
}
|
|
1281
|
+
_prepareStandAlone() {
|
|
1282
|
+
this._collisionManager.checkCollisions = false;
|
|
1283
|
+
if (this._settingsService.settings.options.cameraPositionFixed) {
|
|
1284
|
+
this._cameraService.lockCamera();
|
|
1285
|
+
this._cameraService.disableRotateHorizontal();
|
|
1286
|
+
// this._cameraService.disableRotateVertical();
|
|
1287
|
+
this._cameraService.disablePan();
|
|
1288
|
+
this._cameraService.controls.target = new Vector3(0, 50, 0);
|
|
1289
|
+
}
|
|
1290
|
+
this._sceneEventService.rotateNoDrag = true;
|
|
1291
|
+
}
|
|
1292
|
+
_preloadMaterial(answer) {
|
|
1293
|
+
if (answer.elementType === DecoNodeType.Variation && answer.gameObject) {
|
|
1294
|
+
const variationDecoNode = new DecoNode();
|
|
1295
|
+
variationDecoNode.gameObjectName = answer.gameObject;
|
|
1296
|
+
const adjustablesClone = this._adjustables.map(s => Object.assign({}, s));
|
|
1297
|
+
if (this._genericSelection) {
|
|
1298
|
+
if (this.currentCustomFloorGroup) {
|
|
1299
|
+
adjustablesClone.forEach((selection) => selection.variations = [variationDecoNode]);
|
|
1300
|
+
this._variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode.gameObjectName], this.articleAssetPath)
|
|
1301
|
+
.then(() => {
|
|
1302
|
+
this._variationService.loadVariation(adjustablesClone, '', this.currentCustomFloorGroup, true)
|
|
1303
|
+
.then(() => this._sceneService.needsRender = true);
|
|
1304
|
+
});
|
|
1305
|
+
}
|
|
1306
|
+
else {
|
|
1307
|
+
this._adjustables.forEach((selection) => selection.variations = [variationDecoNode]);
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
else {
|
|
1311
|
+
const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
|
|
1312
|
+
if (currentSelection) {
|
|
1313
|
+
if (this.currentCustomFloorGroup) {
|
|
1314
|
+
const selectionFromAdjustables = adjustablesClone
|
|
1315
|
+
.find((selection) => selection.nodeId === currentSelection.nodeId);
|
|
1316
|
+
if (selectionFromAdjustables) {
|
|
1317
|
+
selectionFromAdjustables.variations = [variationDecoNode];
|
|
1318
|
+
this._variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode.gameObjectName], this.articleAssetPath)
|
|
1319
|
+
.then(() => {
|
|
1320
|
+
this._variationService.loadVariation(adjustablesClone, '', this.currentCustomFloorGroup, true)
|
|
1321
|
+
.then(() => this._sceneService.needsRender = true);
|
|
1322
|
+
});
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
else {
|
|
1326
|
+
const selectionFromAdjustables = this._adjustables
|
|
1327
|
+
.find((selection) => selection.nodeId === currentSelection.nodeId);
|
|
1328
|
+
selectionFromAdjustables.variations = [variationDecoNode];
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
BuildFurnitureService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureService, deps: [{ token: i1.MatDialog }, { token: i2.HomedecoratorConnectorService }, { token: i3.ThreedselectorService }, { token: i4.CollisionManagerService }, { token: i5.MessageBusService }, { token: i6.HomedecoratorDictionaryService }, { token: i7.HudService }, { token: i8.SceneService }, { token: i9.CameraService }, { token: i10.SceneEventService }, { token: i11.HomedecoratorAppEventService }, { token: i12.PresetsService }, { token: i13.ItemService }, { token: i14.ElementService }, { token: i15.PermanentStoreService }, { token: i16.GoogleTagManagerService }, { token: i17.HomedecoratorSettingsService }, { token: i18.UtilsService }, { token: i19.VariationService }, { token: i20.AppStateService }, { token: i21.ErrorService }, { token: i22.ItemGroupService }, { token: i23.VariationCacheService }, { token: i24.ResizeService }, { token: i25.ViewModeService }, { token: i26.FloorService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1336
|
+
BuildFurnitureService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureService, providedIn: 'root' });
|
|
1337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureService, decorators: [{
|
|
1338
|
+
type: Injectable,
|
|
1339
|
+
args: [{
|
|
1340
|
+
providedIn: 'root'
|
|
1341
|
+
}]
|
|
1342
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.HomedecoratorConnectorService }, { type: i3.ThreedselectorService }, { type: i4.CollisionManagerService }, { type: i5.MessageBusService }, { type: i6.HomedecoratorDictionaryService }, { type: i7.HudService }, { type: i8.SceneService }, { type: i9.CameraService }, { type: i10.SceneEventService }, { type: i11.HomedecoratorAppEventService }, { type: i12.PresetsService }, { type: i13.ItemService }, { type: i14.ElementService }, { type: i15.PermanentStoreService }, { type: i16.GoogleTagManagerService }, { type: i17.HomedecoratorSettingsService }, { type: i18.UtilsService }, { type: i19.VariationService }, { type: i20.AppStateService }, { type: i21.ErrorService }, { type: i22.ItemGroupService }, { type: i23.VariationCacheService }, { type: i24.ResizeService }, { type: i25.ViewModeService }, { type: i26.FloorService }]; } });
|
|
1343
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtZnVybml0dXJlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yL3NlcnZpY2UvYnVpbGQtZnVybml0dXJlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN0RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFFdEYsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxLQUFLLEVBQXlCLE9BQU8sRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUU1RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0scURBQXFELENBQUM7QUFDN0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNkRBQTZELENBQUM7QUFHN0YsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BFLE9BQU8sS0FBSyxLQUFLLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBRXpELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxN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Q2hGLElBQUksd0JBQXdCLEVBQUU7NEJBQzVCLHdCQUF3QixDQUFDLFVBQVUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7NEJBQzFELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7aUNBQ3RJLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0NBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQztxQ0FDM0YsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDOzRCQUN2RCxDQUFDLENBQUMsQ0FBQzt5QkFDTjtxQkFDRjt5QkFBTTt3QkFDTCxNQUFNLHdCQUF3QixHQUFjLElBQUksQ0FBQyxZQUFZOzZCQUMxRCxJQUFJLENBQUMsQ0FBQyxTQUFvQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNoRix3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3FCQUMzRDtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDOzttSEFoMkNVLHFCQUFxQjt1SEFBckIscUJBQXFCLGNBRnBCLE1BQU07NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGVjb05vZGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZGVjby1ub2RlJztcclxuaW1wb3J0IHtEZWNvTm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtEZWNvTm9kZUtpbmR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUta2luZC5lbnVtJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7QW5zd2VyfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2Fuc3dlcic7XHJcbmltcG9ydCB7RXVsZXIsIE1lc2gsIE9iamVjdDNELCBTY2VuZSwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHtOb2RlVHlwZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL25vZGUtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtIZGVjb1Bvc2l0aW9uaW5nfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vaGRlY28tcG9zaXRpb25pbmcuZW51bSc7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9xdWVzdGlvbic7XHJcbmltcG9ydCB7ZW52aXJvbm1lbnR9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XHJcbmltcG9ydCAqIGFzIFRXRUVOIGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJztcclxuaW1wb3J0IHtGYWN0b3J5fSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvZmFjdG9yeSc7XHJcbmltcG9ydCB7Q3VzdG9tRmxvb3JJdGVtfSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLWZsb29yLWl0ZW0nO1xyXG5pbXBvcnQge0l0ZW19IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9pdGVtcy9pdGVtJztcclxuaW1wb3J0IHtJdGVtVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0tdHlwZSc7XHJcbmltcG9ydCB7TWV0YWRhdGF9IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9pdGVtcy9tZXRhZGF0YSc7XHJcbmltcG9ydCB7Q3VzdG9tRmxvb3JHcm91cFJlc3VsdH0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL21vZGVsL2N1c3RvbS1mbG9vci1ncm91cC1yZXN1bHQnO1xyXG5pbXBvcnQge0Z1cm5pdHVyZUludGVncmF0aW9ufSBmcm9tICcuLi9tb2RlbC9mdXJuaXR1cmUtaW50ZWdyYXRpb24nO1xyXG5pbXBvcnQge1RocmVlZHNlbGVjdG9yU2VydmljZX0gZnJvbSAnLi90aHJlZWRzZWxlY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb2xsaXNpb25NYW5hZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2NvbGxpc2lvbi1tYW5hZ2VyL2NvbGxpc2lvbi1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2UvbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL3NlcnZpY2UvaHVkLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlM2Qvc2VydmljZS9zY2VuZS1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtQcmVzZXRzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3ByZXNldHMuc2VydmljZSc7XHJcbmltcG9ydCB7SXRlbVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2l0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7RWxlbWVudFNlcnZpY2V9IGZyb20gJy4vZWxlbWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtQZXJtYW5lbnRTdG9yZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZS9wZXJtYW5lbnQtc3RvcmUuc2VydmljZSc7XHJcbmltcG9ydCB7R29vZ2xlVGFnTWFuYWdlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2UvZ29vZ2xlLXRhZy1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhcmlhdGlvblNlcnZpY2V9IGZyb20gJy4vdmFyaWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FwcFN0YXRlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2FwcC1zdGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtFcnJvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZS9lcnJvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtJdGVtR3JvdXBTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlM2Qvc2VydmljZS9pdGVtLWdyb3VwLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkNhY2hlU2VydmljZX0gZnJvbSAnLi92YXJpYXRpb24tY2FjaGUuc2VydmljZSc7XHJcbmltcG9ydCB7UmVzaXplU2VydmljZX0gZnJvbSAnLi9yZXNpemUuc2VydmljZSc7XHJcbmltcG9ydCB7Vmlld01vZGVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2Uvdmlldy1tb2RlLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VUeXBlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2VudW0vbWVzc2FnZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge1NjZW5lM0RVdGlsfSBmcm9tICcuLi91dGlscy9zY2VuZS0zZC51dGlscyc7XHJcbmltcG9ydCB7RXJyb3JNZXNzYWdlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVsL2Vycm9yLW1lc3NhZ2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2VudW0vdmlldy1tb2RlLmVudW0nO1xyXG5pbXBvcnQge1Jlc3VsdFR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9lbnVtL3Jlc3VsdC10eXBlLmVudW0nO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtVdGlsc30gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2NvcmUvdXRpbHMnO1xyXG5pbXBvcnQge01hdGVyaWFsVXRpbHN9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvbWF0ZXJpYWwudXRpbHMnO1xyXG5pbXBvcnQge0Zsb29yUGlufSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvZmxvb3ItcGluJztcclxuaW1wb3J0IHtXYWxsUGlufSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvd2FsbC1waW4nO1xyXG5pbXBvcnQge0Z1cm5pdHVyZVBhcnRJbnRlZ3JhdGlvbn0gZnJvbSAnLi4vbW9kZWwvZnVybml0dXJlLXBhcnQtaW50ZWdyYXRpb24nO1xyXG5pbXBvcnQge0N1c3RvbU1lc2gsIEN1c3RvbU9iamVjdDNEfSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLW9iamVjdHMnO1xyXG5pbXBvcnQge0Z1cm5pdHVyZVBhcnRWYXJpYXRpb259IGZyb20gJy4uL21vZGVsL2Z1cm5pdHVyZS1wYXJ0LXZhcmlhdGlvbic7XHJcbmltcG9ydCB7RnVybml0dXJlQ29ubmVjdGVkUGFydEludGVncmF0aW9ufSBmcm9tICcuLi9tb2RlbC9mdXJuaXR1cmUtY29ubmVjdGVkLXBhcnQtaW50ZWdyYXRpb24nO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJFdmVudH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9lbnVtL2dvb2dsZS10YWctbWFuYWdlci1ldmVudC5lbnVtJztcclxuaW1wb3J0IHtDaGFuZ2VzSW50ZXJmYWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2ludGVyZmFjZS9jaGFuZ2VzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7Q3VzdG9tV2FsbEZsb29ySXRlbX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS13YWxsLWZsb29yLWl0ZW0nO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL29iamVjdC51dGlscyc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2luZm8tZGlhbG9nL2luZm8tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0RhdGF9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL2luZm8tZGlhbG9nLWRhdGEuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItY29ubmVjdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItZGljdGlvbmFyeS5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3Itc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7Rmxvb3JTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlM2Qvc2VydmljZS9mbG9vci5zZXJ2aWNlJztcclxuaW1wb3J0IHtGbG9vclBsYW5lSXRlbX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2l0ZW1zL2Zsb29yLXBsYW5lLWl0ZW0nO1xyXG5cclxuY29uc3QgZGVmYXVsdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoNCwgMCwgMSk7XHJcbmNvbnN0IGRlZmF1bHRSb3RhdGlvbiA9IG5ldyBFdWxlcigwLCBNYXRoLlBJLCAwKTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJpbmdNb2RlQ2hhbmdlSW50ZXJmYWNlIHtcclxuICBtZXRhZGF0YTogTWV0YWRhdGE7XHJcbiAgY29uZmlndXJpbmc6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEJ1aWxkRnVybml0dXJlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgLy8gcHVibGljIGdldCBkZWNvcygpOiBNYXA8c3RyaW5nLCBEZWNvTm9kZT4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2dldERlY29zRnJvbUluc3RhbmNlKCk7XHJcbiAgLy8gfVxyXG4gIHB1YmxpYyBiYXNlRWxlbWVudE5vZGVJZDogbnVtYmVyO1xyXG5cclxuICBwdWJsaWMgYXJ0aWNsZUFzc2V0UGF0aDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0ZWRFbGVtZW50OiBTdWJqZWN0PE1lc2g+ID0gbmV3IFN1YmplY3Q8TWVzaD4oKTtcclxuICBwdWJsaWMgY29uZmlndXJlTW9kZUNoYW5nZWQ6IFN1YmplY3Q8Q29uZmlndXJpbmdNb2RlQ2hhbmdlSW50ZXJmYWNlPiA9IG5ldyBTdWJqZWN0PHsgbWV0YWRhdGE6IHt9LCBjb25maWd1cmluZzogZmFsc2UgfT4oKTtcclxuICBwdWJsaWMgYnVpbGRGaW5pc2hlZDogU3ViamVjdDxDdXN0b21GbG9vckdyb3VwUmVzdWx0PiA9IG5ldyBTdWJqZWN0PEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+KCk7XHJcbiAgcHVibGljIGFuc3dlclNlbGVjdGVkOiBTdWJqZWN0PEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+ID0gbmV3IFN1YmplY3Q8Q3VzdG9tRmxvb3JHcm91cFJlc3VsdD4oKTtcclxuICBwdWJsaWMgYXJQbGFjZW1lbnRVcGRhdGU6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyBzaG93RWxlbWVudFRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIHN0YXJ0UG9zaXRpb246IFZlY3RvcjM7XHJcbiAgcHVibGljIGZ1bGwzRE9iamVjdFRvVXNlOiBPYmplY3QzRDtcclxuXHJcbiAgcHVibGljIGlzTW91c2VPdmVyT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIHVzZWQgZm9yIGVsZW1lbnRzLCB0byBwbGFjZSBvYmplY3RzIG9uXHJcbiAgcHVibGljIGFjdGl2ZUNvbm5lY3RvcjogYW55O1xyXG5cclxuICBwdWJsaWMgZ2V0IHVzZU5vZGVJZFRvTGluaygpIHtcclxuICAgIHJldHVybiB0aGlzLl91c2VOb2RlSWRUb0xpbms7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRDdXN0b21GbG9vckdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFjdGl2ZVF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICBwdWJsaWMgYWN0aXZlQW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuXHJcbiAgcHVibGljIGdldCBzdGFuZEFsb25lKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YW5kQWxvbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHN0YW5kQWxvbmUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3N0YW5kQWxvbmUgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLl9zdGFuZEFsb25lKSB7XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVTdGFuZEFsb25lKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lPbmUuc2VsZWN0aW9ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFuZEFsb25lRmlyc3RCdWlsZFJlYWR5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZ2V0IHNjZW5lKCk6IFNjZW5lIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2VuZVNlcnZpY2UuZ2V0U2NlbmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZU5vZGVJZFRvTGluazogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfc3RhbmRBbG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9hY3RpdmVDaGlsZEVsZW1lbnQ6IE1lc2g7XHJcblxyXG4gIHByaXZhdGUgX29yaWdpbmFsRWxlbWVudFBvc2l0aW9uOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuICBwcml2YXRlIF9pbnRlZ3JhdGlvbkVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wbGFjZWRBZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9wbGFjZWRBZGRhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9hZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9hZGRhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cDogSXRlbTtcclxuICBwcml2YXRlIF9nZW5lcmljU2VsZWN0aW9uID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9hbnN3ZXJTZWxlY3RlZDogQW5zd2VyW10gPSBbXTtcclxuICBwcml2YXRlIF9mdXJuaXR1cmVDb25maWd1cmF0aW9uczogRnVybml0dXJlSW50ZWdyYXRpb25bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfaU9uZTogSG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aHJlZWRTZWxlY3RvclNlcnZpY2U6IFRocmVlZHNlbGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NvbGxpc2lvbk1hbmFnZXI6IENvbGxpc2lvbk1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUJ1czogTWVzc2FnZUJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWN0aW9uYXJ5U2VydmljZTogSG9tZWRlY29yYXRvckRpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHVkU2VydmljZTogSHVkU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhU2VydmljZTogQ2FtZXJhU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lRXZlbnRTZXJ2aWNlOiBTY2VuZUV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcEV2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByZXNldFNlcnZpY2U6IFByZXNldHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZWxlbWVudFNlcnZpY2U6IEVsZW1lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGVybWFuZW50U3RvcmVTZXJ2aWNlOiBQZXJtYW5lbnRTdG9yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9nb29nbGVUYWdNYW5hZ2VyOiBHb29nbGVUYWdNYW5hZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3V0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdmFyaWF0aW9uU2VydmljZTogVmFyaWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtR3JvdXBTZXJ2aWNlOiBJdGVtR3JvdXBTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdmFyaWF0aW9uQ2FjaGVTZXJ2aWNlOiBWYXJpYXRpb25DYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yZXNpemVTZXJ2aWNlOiBSZXNpemVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdmlld01vZGVTZXJ2aWNlOiBWaWV3TW9kZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mbG9vclNlcnZpY2U6IEZsb29yU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLl9pT25lLmNvbm5lY3Rpb25SZXNldC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5faGFuZGxlQ29ubmVjdGlvblJlc2V0KCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtUmVtb3ZlZCwgKHJlc3VsdDogeyBpdGVtOiBhbnksIGFkZGVkVG9Hcm91cDogYm9vbGVhbiB9KSA9PlxyXG4gICAgICAgIHRoaXMuX2hhbmRsZUl0ZW1SZW1vdmVkRnJvbVNjZW5lKHJlc3VsdCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5VbmRvLCAoKSA9PiB0aGlzLl9zdGFydFdpdGhOZXcoZmFsc2UpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuUmVkbywgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KGZhbHNlKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlN0YXJ0V2l0aEVtcHR5Um9vbSwgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TdGFydFdpdGhQcmVzZXQsICgpID0+IHRoaXMuX3N0YXJ0V2l0aE5ldygpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuTG9hZFJvb21Gcm9tUHJlc2V0LCAoKSA9PiB0aGlzLl9zdGFydFdpdGhOZXcoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkxvYWRSb29tRnJvbUNsb3VkLCAoKSA9PiB0aGlzLl9zdGFydFdpdGhOZXcoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLk5ld1Jvb20sICgpID0+IHRoaXMuX3N0YXJ0V2l0aE5ldygpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuUmVzZXRSb29tcGxhbiwgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5Mb2FkU2NhbGVkRGlhZ3JhbSwgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KCkpLFxyXG4gICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuZW5hYmxlSW50ZWdyYXRpb24uc3Vic2NyaWJlKChlbmFibGVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuX2VuYWJsZUludGVncmF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fcHJlc2V0U2VydmljZS5iZWZvcmVMb2FkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cEJlZm9yZVByZXNldExvYWQoKTtcclxuICAgICAgICB0aGlzLl9zdGFydFdpdGhOZXcoKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX3ByZXNldFNlcnZpY2UuYWZ0ZXJMb2FkLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9oYW5kbGVBZnRlclByZXNldExvYWQoKSksXHJcbiAgICAgIHRoaXMuX3Blcm1hbmVudFN0b3JlU2VydmljZS5jb2RlU2V0LnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvZGUpIHtcclxuICAgICAgICAgIHRoaXMuX3NldENvZGVPbkZ1cm5pdHVyZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGJ1aWxkKHJlc3VsdDogQ3VzdG9tRmxvb3JHcm91cFJlc3VsdCk6IFByb21pc2U8Q3VzdG9tRmxvb3JHcm91cFJlc3VsdD4ge1xyXG4gICAgdGhpcy5fZWxlbWVudFNlcnZpY2UucmVtb3ZlRWxlbWVudChyZXN1bHQuaW5zdGFuY2VJZCk7XHJcbiAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5tZXRhRGF0YSAmJiByZXN1bHQubWV0YURhdGEuaXRlbVR5cGUgPT09IEl0ZW1UeXBlLkZsb29yRGVjb3JhdGlvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYnVpbGRGbG9vcihyZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZ1bGwzRE9iamVjdFRvVXNlKSB7IC8vIHRoZXJlJ3Mgbm8gM2QgbW9kZWwgc28gZ2V0IG91dFxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWRqdXN0YWJsZXM6IFNlbGVjdGlvbltdID0gdGhpcy5fZ2V0QWRqdXN0YWJsZXMoKTtcclxuICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPT09IDApIHsgLy8gY2hlY2sgaWYgYXJ0aWNsZSBoYXMgYSBnYW1lT2JqZWN0XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbnNbMF0ubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFydGljbGUgJiYgdGhpcy5zZWxlY3Rpb25zWzBdLmdhbWVPYmplY3QpIHtcclxuICAgICAgICBhZGp1c3RhYmxlcy5wdXNoKHRoaXMuc2VsZWN0aW9uc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwID0gdGhpcy5fY3JlYXRlQ29uZmlndXJhYmxlSXRlbShyZXN1bHQuaW5zdGFuY2VJZCwgcmVzdWx0Lm1ldGFEYXRhKTtcclxuICAgIGNvbnN0IGl0ZW06IEl0ZW0gPSB0aGlzLl9jcmVhdGVDb25maWd1cmFibGVJdGVtKHJlc3VsdC5pbnN0YW5jZUlkLCByZXN1bHQubWV0YURhdGEpO1xyXG4gICAgaWYgKGFkanVzdGFibGVzICYmIGFkanVzdGFibGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuOiBudW1iZXIgPSBhZGp1c3RhYmxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGFibGU6IE9iamVjdDNEID0gdGhpcy5fY3JlYXRlQWRqdXN0YWJsZShpdGVtLCBhZGp1c3RhYmxlc1tpXSk7XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGUpIHtcclxuICAgICAgICAgIGZvciAobGV0IGlpID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoIC0gMTsgaWkgPj0gMDsgaWktLSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNNb3ZlYWJsZU9iamVjdChhZGp1c3RhYmxlKSkgeyAvLyB2cmlqZSB2ZXJwbGFhdHNpbmcgbW9nZWxpamssIGNvbm5lY3RlbiBhYW4gb3BnZXNsYWdlbiBjb25uZWN0b3JcclxuICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IGFkanVzdGFibGUudXNlckRhdGEuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2FkZEVsZW1lbnRPbkNvbm5lY3RvcihcclxuICAgICAgICAgICAgICAgIGl0ZW0sIGFkanVzdGFibGUsIHNlbGVjdGlvbi5kZWNvQ29ubmVjdGlvbiA/IHNlbGVjdGlvbi5kZWNvQ29ubmVjdGlvbiA6IHRoaXMuYWN0aXZlQ29ubmVjdG9yLCB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkKTtcclxuICAgICAgICAgICAgICBhZGp1c3RhYmxlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKFNjZW5lM0RVdGlsLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLnNjZW5lLFxyXG4gICAgICAgICAgICAgICAgaXRlbSwgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaWldLCBhZGp1c3RhYmxlLCBpID09PSAxKSkge1xyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY29ubmVjdGVkICYmIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA+IDEgJiYgIWVudmlyb25tZW50LnByb2R1Y3Rpb24pIHtcclxuICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IEVycm9yTWVzc2FnZShcclxuICAgICAgICAgICAgYE5vIGNvbm5lY3Rpb24gZm91bmQgZm9yOiAke2FkanVzdGFibGUgPyBhZGp1c3RhYmxlLm5hbWUgOiBhZGp1c3RhYmxlc1tpXS5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZX1gKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3BsYWNlQWRkYWJsZXMoaXRlbSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRWYXJpYXRpb25zKGl0ZW0sIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQpO1xyXG4gICAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGF3YWl0IHRoaXMuX3JlcGxhY2VDdXJyZW50SXRlbShpdGVtLCByZXN1bHQubWV0YURhdGEsIHRydWUpO1xyXG4gICAgICBpZiAodGhpcy5fdmlld01vZGVTZXJ2aWNlLnZpZXdNb2RlICE9PSBWaWV3TW9kZS5JblBob3RvVmlldykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLnVwZGF0ZVBpdm90KCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0LmZ1cm5pdHVyZSA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwO1xyXG4gICAgICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICAgIHRoaXMuYXJQbGFjZW1lbnRVcGRhdGUubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5faGFuZGxlSW50ZWdyYXRpb24ocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCwgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLml0ZW1Hcm91cCkge1xyXG4gICAgICAgIHRoaXMuX2l0ZW1Hcm91cFNlcnZpY2UucmVhdHRhY2hUb0l0ZW1Hcm91cChcclxuICAgICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuaXRlbUdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAucG9zaXRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICBpZiAodGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkdhbWVvYmplY3ROYW1lTWlzbWF0Y2hJblNvdXJjZTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9odWRTZXJ2aWNlLnVwZGF0ZVNlbGVjdGVkSXRlbUh1ZCgpO1xyXG4gICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dChyZXN1bHQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgRXJyb3JNZXNzYWdlKCdOT19BREpVU1RBQkxFUycsICdOT19BREpVU1RBQkxFU19JTkZPJykpO1xyXG4gICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTm9BZGp1c3RhYmxlcztcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgPT09IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zKSB7XHJcbiAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLk9ic29sZXRlICYmIHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25GaXhlZCkgeyAvLyBkb24ndCBvdmVycmlkZSB0aGVzZVxyXG4gICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTG9hZGVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLnJlYWR5VG9SZW5kZXIubmV4dCh0aGlzLnN0YW5kQWxvbmVGaXJzdEJ1aWxkUmVhZHkpO1xyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLnVwZGF0ZVBhdGhUcmFjZXIoKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc3RhcnRUb0J1aWxkKFxyXG4gICAgcmVzdWx0PzogQ3VzdG9tRmxvb3JHcm91cFJlc3VsdCxcclxuICAgIG1ldGFkYXRhPzogTWV0YWRhdGEsXHJcbiAgICBzaG91bGRDb3B5SW5zdGFuY2U6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIHN0YW5kQWxvbmU/OiBib29sZWFuLFxyXG4gICAgZmlyc3RCdWlsZDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogUHJvbWlzZTxDdXN0b21GbG9vckdyb3VwUmVzdWx0PiB7XHJcbiAgICBpZiAoIWlzTmlsbChzdGFuZEFsb25lKSkge1xyXG4gICAgICB0aGlzLnN0YW5kQWxvbmUgPSBzdGFuZEFsb25lO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzTmlsbChyZXN1bHQpKSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBDdXN0b21GbG9vckdyb3VwUmVzdWx0KFxyXG4gICAgICAgIG1ldGFkYXRhID8gbWV0YWRhdGEuaXRlbUlkZW50aWZpZXIgOiAnJyxcclxuICAgICAgICBtZXRhZGF0YSA/IG1ldGFkYXRhLml0ZW1OYW1lIDogJ3Vua25vd24nKTtcclxuICAgICAgcmVzdWx0Lm1ldGFEYXRhID0gbWV0YWRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3VsZENvcHlJbnN0YW5jZSkge1xyXG4gICAgICBjb25zdCBvcmlnaW5hbEluc3RhbmNlSWQ6IHN0cmluZyA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICAgIGlmIChsb29zZU9yaWdpbmFsQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSBhd2FpdCB0aGlzLl9pT25lLmNvcHlJbnN0YW5jZUFuZExvc2VPcmlnaW5hbENvbmZpZ3VyYXRpb24ob3JpZ2luYWxJbnN0YW5jZUlkLCByZXN1bHQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSW5zdGFuY2VJZDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSBhd2FpdCB0aGlzLl9pT25lLmNvcHlJbnN0YW5jZUFuZFNhdmVPcmlnaW5hbENvbmZpZ3VyYXRpb24ob3JpZ2luYWxJbnN0YW5jZUlkLCByZXN1bHQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSW5zdGFuY2VJZDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkFydGljbGVOb3RGb3VuZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHJlc3VsdClcclxuICAgICAgICAuY2F0Y2goKGUpID0+IFByb21pc2UucmVqZWN0KHJlc3VsdCkpO1xyXG4gICAgfVxyXG4gICAgcmVzdWx0Lmluc3RhbmNlSWQgPSByZXN1bHQubWV0YURhdGEuaXRlbUlkO1xyXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uID0gcmVzdWx0Lm1ldGFEYXRhLnBvc2l0aW9uID8gcmVzdWx0Lm1ldGFEYXRhLnBvc2l0aW9uLmNsb25lKCkgOiBuZXcgVmVjdG9yMygpO1xyXG5cclxuICAgIGNvbnN0IHF1ZXN0aW9uQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5faU9uZS5nZXRRdWVzdGlvbkFuZEFuc3dlcnNBc3luYygpOyAvLyBzZWUgaWYgdGhlcmUgaXMgdXNlciBpbnB1dCBuZWVkZWRcclxuICAgIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMucXVlc3Rpb24gJiYgIXF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbi5ncm91cGVkKSB7XHJcbiAgICAgIHRoaXMuX2lPbmUuaGFuZGxlQW5zd2Vyc1JlY2VpdmVkKHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5hY3RpdmVBbnN3ZXJzID0gW107XHJcbiAgICAgIHRoaXMuYWN0aXZlUXVlc3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgIGF3YWl0IHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zQW5kRGVjb3MocmVzdWx0KVxyXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gUHJvbWlzZS5yZWplY3QoZSkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5idWlsZChyZXN1bHQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVRdWVzdGlvbiA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbjtcclxuICAgICAgdGhpcy5hY3RpdmVBbnN3ZXJzID0gcXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnM7XHJcbiAgICAgIGlmIChmaXJzdEJ1aWxkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnNBbmREZWNvcyhyZXN1bHQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IFByb21pc2UucmVqZWN0KGUpKTtcclxuICAgICAgICBpZiAodGhpcy5faU9uZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5OZWVkc1VzZXJJbnB1dDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lPbmUuc2VsZWN0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuQnVpbGRGcm9tU2NyYXRjaDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lPbmUuc2VsZWN0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTmVlZHNVc2VySW5wdXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPcHRpb25zRnJvbVNlbGVjdGlvbihiYXNlU2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBTZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgbGV0IG5vZGVMZXZlbCA9IC0xO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgY29uc3QgbGV2ZWw6IG51bWJlciA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgaWYgKG5vZGVMZXZlbCAhPT0gLTEpIHtcclxuICAgICAgICBpZiAobm9kZUxldmVsIDwgbGV2ZWwgJiYgdGhpcy5fY2FuQ29ubmVjdFNlbGVjdGlvbnMoYmFzZVNlbGVjdGlvbiwgc2VsZWN0aW9uKSAmJiB0aGlzLl9zZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgc2VsZWN0aW9ucy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub2RlTGV2ZWwgPj0gbGV2ZWwpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLmlkID09PSBiYXNlU2VsZWN0aW9uLmlkICYmIHNlbGVjdGlvbi5ub2RlID09PSBiYXNlU2VsZWN0aW9uLm5vZGUpIHtcclxuICAgICAgICBub2RlTGV2ZWwgPSBsZXZlbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG93bmxvYWRDdXJyZW50Q3VzdG9tRmxvb3Jncm91cCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9iamVjdFRvRXhwb3J0OiBPYmplY3QzRCA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwID8gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAgOiB0aGlzLl9pdGVtU2VydmljZS5pdGVtc1swXTtcclxuICAgIHRoaXMuX3V0aWxzU2VydmljZS5zaG93RXhwb3J0RGlhbG9nKG9iamVjdFRvRXhwb3J0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb3dubG9hZFNjZW5lKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYXNzZXRQYXRoOiBzdHJpbmcgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoO1xyXG4gICAgLy8gVGhlIGdyb3VuZCBwbGFuZSBsb29rcyBvZGQgaW4gcmVuZGVycy5cclxuICAgIC8vIFRoZSBodWQtcmluZyBhbmQgaHVkLWNpcmNsZSBhcmUgdGhlIHdhbGt0aHJvdWdoIG1vZGUgbWFya2VyLFxyXG4gICAgLy8gd2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgY29uc3QgZWxlbWVudHNUb1JlbW92ZSA9IFsnZ3JvdW5kLXBsYW5lJywgJ2h1ZC1yaW5nJywgJ2h1ZC1jaXJjbGUnXTtcclxuXHJcbiAgICBsZXQgc2NlbmU6IFNjZW5lO1xyXG4gICAgc2NlbmUgPSB0aGlzLl9zY2VuZVNlcnZpY2Uuc2NlbmUuY2xvbmUoKTtcclxuXHJcbiAgICBlbGVtZW50c1RvUmVtb3ZlLmZvckVhY2goZWxlbWVudE5hbWUgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZE9iamVjdDogT2JqZWN0M0QgPSBzY2VuZS5nZXRPYmplY3RCeU5hbWUoZWxlbWVudE5hbWUpO1xyXG4gICAgICBzY2VuZS5yZW1vdmUoc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgfSk7XHJcbiAgICBzY2VuZS5hZGQodGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEuY2xvbmUoKSk7XHJcblxyXG4gICAgdGhpcy5fdXRpbHNTZXJ2aWNlLnNob3dFeHBvcnREaWFsb2coc2NlbmUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZVNpbXBsZTNETW9kZWwocmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0LCBzdGFuZEFsb25lPzogYm9vbGVhbik6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQge1xyXG4gICAgaWYgKCFpc05pbGwoc3RhbmRBbG9uZSkpIHtcclxuICAgICAgdGhpcy5zdGFuZEFsb25lID0gc3RhbmRBbG9uZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mdWxsM0RPYmplY3RUb1VzZSkgeyAvLyB0aGVyZSdzIG5vIDNkIG1vZGVsIHNvIGdldCBvdXRcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIC8vIHRoZXJlIGFyZSBubyBzZWxlY3Rpb25zIG9yIGRlY29zIGZvciBzaW1wbGUgYXJ0aWNsZXMsIHNvIGVtcHR5IGxpc3RzIGZvciBpbnRlZ3JhdGlvbiBwdXJwb3Nlc1xyXG4gICAgdGhpcy5faU9uZS5lbXB0eVNlbGVjdGlvbnMoKTtcclxuICAgIHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuY2hpbGRyZW4uZm9yRWFjaChjID0+IGMudmlzaWJsZSA9IHRydWUpO1xyXG4gICAgaWYgKCFyZXN1bHQubWV0YURhdGEucG9zaXRpb24pIHtcclxuICAgICAgcmVzdWx0Lm1ldGFEYXRhLnBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uIHx8IGRlZmF1bHRQb3NpdGlvbjtcclxuICAgIH1cclxuICAgIGlmICghcmVzdWx0Lm1ldGFEYXRhLnJvdGF0aW9uKSB7XHJcbiAgICAgIHJlc3VsdC5tZXRhRGF0YS5yb3RhdGlvbiA9IHJlc3VsdC5tZXRhRGF0YS5kZWZhdWx0MTgwID8gZGVmYXVsdFJvdGF0aW9uIDogbmV3IEV1bGVyKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtQ29uc3RydWN0b3IgPSBGYWN0b3J5LmdldENsYXNzKHRoaXMuc3RhbmRBbG9uZSA/IEl0ZW1UeXBlLkZsb29yR3JvdXAgOiByZXN1bHQubWV0YURhdGEuaXRlbVR5cGUpO1xyXG4gICAgY29uc3QgaXRlbSA9IG5ldyBpdGVtQ29uc3RydWN0b3IoXHJcbiAgICAgIHJlc3VsdC5tZXRhRGF0YSxcclxuICAgICAgdGhpcy5mdWxsM0RPYmplY3RUb1VzZVxyXG4gICAgKTtcclxuICAgIHJlc3VsdC5tZXRhRGF0YS5vYmplY3RVVUlEID0gaXRlbS51dWlkO1xyXG4gICAgaXRlbS5hbGxvd1JvdGF0ZSA9ICF0aGlzLnN0YW5kQWxvbmU7XHJcbiAgICBpdGVtLmhpZ2hMaWdodERpc2FibGVkID0gIXRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnVzZVN0YW5kYWxvbmVIaWdoTGlnaHQ7XHJcblxyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UuYWRkSXRlbShpdGVtKTtcclxuICAgIGlmIChpdGVtLml0ZW1Hcm91cCkge1xyXG4gICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlYXR0YWNoVG9JdGVtR3JvdXAoaXRlbSwgaXRlbS5pdGVtR3JvdXAsIGl0ZW0ucG9zaXRpb24pO1xyXG4gICAgfVxyXG4gICAgLy8gRm9yIHNpbXBsZSBhcnRpY2xlcyB3ZSB1c2Ugb2JqZWN0IHV1aWQsIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGFuIGluc3RhbmNlSWRcclxuICAgIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZShpdGVtLnV1aWQsIHtCcmFuZElkZW50aWZpZXI6IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWRlbnRpZmllcn0sIGl0ZW0pO1xyXG4gICAgdGhpcy5faGFuZGxlSW50ZWdyYXRpb24oaXRlbS51dWlkLCBpdGVtKTtcclxuXHJcbiAgICByZXN1bHQuZnVybml0dXJlID0gaXRlbTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS51cGRhdGVQYXRoVHJhY2VyKCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfYnVpbGRGbG9vcihyZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpOiBQcm9taXNlPEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+IHtcclxuICAgIGNvbnN0IGl0ZW06IEZsb29yUGxhbmVJdGVtID0gdGhpcy5fZmxvb3JTZXJ2aWNlLmZsb29yVG9Db25maWd1cmU7XHJcbiAgICBpdGVtLm1ldGFkYXRhID0gcmVzdWx0Lm1ldGFEYXRhO1xyXG4gICAgaXRlbS5jaGlsZHJlblswXS51c2VyRGF0YS5zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbnNbMF07XHJcbiAgICBpdGVtLmNvbmZpZ3VyaW5nQ2hhbmdlSGFuZGxlciA9IHRoaXMuY2hhbmdlQ29uZmlndXJlTW9kZTtcclxuICAgIGl0ZW0uc2VsZWN0ZWRIYW5kbGVyID0gdGhpcy5zZWxlY3RJdGVtO1xyXG4gICAgaXRlbS51bnNlbGVjdGVkSGFuZGxlciA9IHRoaXMudW5TZWxlY3RJdGVtO1xyXG4gICAgYXdhaXQgdGhpcy5fbG9hZFZhcmlhdGlvbnMoaXRlbSwgcmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCk7XHJcbiAgICB0aGlzLl9mbG9vclNlcnZpY2UudW5IaWdoTGlnaHRGbG9vcnMoKTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgICByZXN1bHQuZnVybml0dXJlID0gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXA7XHJcbiAgICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICB0aGlzLl9oYW5kbGVJbnRlZ3JhdGlvbihyZXN1bHQubWV0YURhdGEuaXRlbUlkLCB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCk7XHJcbiAgICBpZiAodGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuaXRlbUdyb3VwKSB7XHJcbiAgICAgIHRoaXMuX2l0ZW1Hcm91cFNlcnZpY2UucmVhdHRhY2hUb0l0ZW1Hcm91cChcclxuICAgICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuaXRlbUdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAucG9zaXRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYW5zd2VyU2VsZWN0ZWQubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2h1ZFNlcnZpY2UudXBkYXRlU2VsZWN0ZWRJdGVtSHVkKCk7XHJcbiAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dChyZXN1bHQpO1xyXG4gICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlID09PSBSZXN1bHRUeXBlLk5vU2VsZWN0aW9ucykge1xyXG4gICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuQ29uZmlndXJhdGlvbkZpeGVkO1xyXG4gICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5PYnNvbGV0ZSAmJiByZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uRml4ZWQpIHsgLy8gZG9uJ3Qgb3ZlcnJpZGUgdGhlc2VcclxuICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkxvYWRlZDtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKG1ldGFkYXRhOiBNZXRhZGF0YSk6IFByb21pc2U8Q3VzdG9tRmxvb3JHcm91cFJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRUb0J1aWxkKG51bGwsIG1ldGFkYXRhKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3NldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0KTogUHJvbWlzZTxDdXN0b21GbG9vckdyb3VwUmVzdWx0PiB7XHJcbiAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuVGltZW91dCkge1xyXG4gICAgICBpZiAocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2lPbmUuc2V0SW5zdGFuY2UocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9pT25lLmluaXROb2RlSW5zdGFuY2UocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZGVudGlmaWVyKVxyXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IEVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSByZXNwb25zZS5yZXN1bHRPYmplY3Q7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2lPbmUuc2V0SW5zdGFuY2UocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcHJlcGFyZVNlbGVjdGlvbnNBbmREZWNvcyhyZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpOiBQcm9taXNlPEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+IHtcclxuICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2U6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgIHNlbGVjdGlvbnNBbmREZWNvUHJvbWlzZS5wdXNoKHRoaXMuX2lPbmUuZ2V0U2VsZWN0aW9uc0FzeW5jKCksIHRoaXMuX2lPbmUuZ2V0RGVjb3NBc3luYygpKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlKTtcclxuICAgICAgdGhpcy5fcHJlbG9hZE1hdGVyaWFscyhyZXN1bHQubWV0YURhdGEuc2NoZW1hKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pT25lLnNlbGVjdGlvbnMubGVuZ3RoIDwgMikgeyAvLyBubyBzZWxlY3Rpb25zLCBvbmx5IHNlbGVjdGlvbiBvZiB0eXBlICdBUlQnXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkFydGljbGVOb3RGb3VuZCAmJiAhcmVzdWx0Lm1ldGFEYXRhLm9yaWdpbmFsSXRlbUlkKSB7IC8vIGFydGljbGUgZm91bmQsIHNvIGluaXQgdGhhdCBmaXJzdFxyXG4gICAgICAgICAgcmVzdWx0Lm1ldGFEYXRhLm9yaWdpbmFsSXRlbUlkID0gcmVzdWx0Lm1ldGFEYXRhLml0ZW1JZDtcclxuICAgICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSBudWxsO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fc2V0SW5zdGFuY2VUb0NvbmZpZ3VyZShyZXN1bHQpO1xyXG4gICAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLk5vU2VsZWN0aW9ucztcclxuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VG9CdWlsZChyZXN1bHQpOyAvLyAncmVzdGFydCcgdGhlIGJ1aWxkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2dldFNlbGVjdGlvbnNBbmREZWNvc0Zyb21NZXRhZGF0YShyZXN1bHQpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pT25lLnNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5zY2hlbWEgPSByZXN1bHQubWV0YURhdGEuc2NoZW1hO1xyXG4gICAgICBzLmluc3RhbmNlSWQgPSByZXN1bHQubWV0YURhdGEuaXRlbUlkO1xyXG4gICAgfSk7IC8vIGFkZCBzY2hlbWEgZm9yIG1hdGVyaWFsIGNyZWF0aW9uXHJcbiAgICB0aGlzLl9oYW5kbGVTZWxlY3Rpb25zUmVjZWl2ZWQocmVzdWx0Lm1ldGFEYXRhKTtcclxuICAgIHRoaXMuX2xpbmtTZWxlY3Rpb25zQW5kRGVjb3MoKTtcclxuICAgIHRoaXMuX3ByZXBhcmVUaGVTZWxlY3Rpb25zKHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlbG9hZE1hdGVyaWFscyhzY2hlbWE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLnByZWxvYWRWYXJpYXRpb25zKHNjaGVtYSwgdGhpcy5faU9uZS5kZWNvTm9kZXMubWFwKGQgPT4gZC5nYW1lT2JqZWN0TmFtZSksIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRTZWxlY3Rpb25zQW5kRGVjb3NGcm9tTWV0YWRhdGEocmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0KTogdm9pZCB7XHJcbiAgICBpZiAocmVzdWx0Lm1ldGFEYXRhLnNlbGVjdGlvbnMgJiYgcmVzdWx0Lm1ldGFEYXRhLmRlY29zKSB7XHJcbiAgICAgIHRoaXMuX2lPbmUuc2V0U2VsZWN0aW9ucyhyZXN1bHQubWV0YURhdGEuc2VsZWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuX2lPbmUuc2V0RGVjb05vZGVzKEFycmF5LmZyb20ocmVzdWx0Lm1ldGFEYXRhLmRlY29zLnZhbHVlcygpKSk7XHJcbiAgICAgIHJlc3VsdC5tZXRhRGF0YS5vYnNvbGV0ZSA9IHRydWU7XHJcbiAgICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uTm90Rml4ZWQpIHtcclxuICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuT2Jzb2xldGU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9pT25lLnNlbGVjdGlvbnMubGVuZ3RoIDwgMiB8fCB0aGlzLl9pT25lLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBFcnJvck1lc3NhZ2UoJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJykpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdGlvblB1Ymxpc2hlZChzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSA9PT0gbnVsbCkgfHwgKChzZWxlY3Rpb24uaGllcmFyY2hpY2FsUHVibGljYXRpb25Db2RlICYgMikgPiAwKSkgJiZcclxuICAgICAgKFxyXG4gICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmXHJcbiAgICAgICAgICAoKChzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUgJiAyKSA+IDApIHx8XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5xdWVzdGlvblB1YmxpY2F0aW9uQ29kZSA9PT0gbnVsbCB8fCBzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUgPT09IHVuZGVmaW5lZCkpIHx8XHJcbiAgICAgICAgKHNlbGVjdGlvbi5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQW5zd2VyICYmXHJcbiAgICAgICAgICAoKChzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlICYgMikgPiAwKSB8fFxyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlID09PSBudWxsIHx8IHNlbGVjdGlvbi5hbnN3ZXJQdWJsaWNhdGlvbkNvZGUgPT09IHVuZGVmaW5lZCkpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVJbnRlZ3JhdGlvbihpbnN0YW5jZUlkOiBzdHJpbmcsIG9iamVjdDogSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ludGVncmF0aW9uRW5hYmxlZCAmJiAhb2JqZWN0Lm1ldGFkYXRhLm9ic29sZXRlKSB7XHJcbiAgICAgIGNvbnN0IGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9XHJcbiAgICAgICAgdGhpcy5faU9uZS5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHMuZGVjb05vZGUgJiYgcy5nZW5lcmljICYmXHJcbiAgICAgICAgICAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbiAmJiAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uKTtcclxuICAgICAgaWYgKGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zICYmIGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLl91cHNlcnRGdXJuaXR1cmUoaW5zdGFuY2VJZCwge1xyXG4gICAgICAgICAgVmFyaWF0aW9uOiAoZ2VuZXJpY1ZhcmlhdGlvblNlbGVjdGlvbnNbMF0uZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24uYnJhbmRJZCxcclxuICAgICAgICAgIFZhcmlhdGlvbkRlc2NyaXB0aW9uOiAoZ2VuZXJpY1ZhcmlhdGlvblNlbGVjdGlvbnNbMF0uZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24uZ2FtZU9iamVjdE5hbWUsXHJcbiAgICAgICAgICBTdXBwbGllckFydGljbGVOcjogKGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zWzBdLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yXHJcbiAgICAgICAgfSwgb2JqZWN0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9oYW5kbGVJbnRlZ3JhdGlvbkNvbm5lY3Rpb25zKGluc3RhbmNlSWQsIG9iamVjdCk7XHJcbiAgICAgIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZShpbnN0YW5jZUlkLCB7UG9zaXRpb246IG9iamVjdC5wb3NpdGlvbiwgUm90YXRpb246IG9iamVjdC5yb3RhdGlvbn0sIG9iamVjdCk7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5Db25maWd1cmF0aW9uQ2hhbmdlZCwgdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdGFydFdpdGhOZXcoY2xlYW51cDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICBpZiAoY2xlYW51cCkge1xyXG4gICAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5mb3JFYWNoKGEgPT4gVXRpbHMuRGlzcG9zZU9iamVjdChhKSk7XHJcbiAgICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLmZvckVhY2goYSA9PiBVdGlscy5EaXNwb3NlT2JqZWN0KGEpKTtcclxuICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYW51cEJlZm9yZVByZXNldExvYWQoKTogdm9pZCB7XHJcbiAgICBNYXRlcmlhbFV0aWxzLkNsZWFyQ2FjaGVzKCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENsZWFyIHZhcmlhYmxlcyB0byBsZXQgb2JqZWN0cyBiZWluZyBkaXNwb3NlZCBwcm9wZXJseVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUFmdGVyUHJlc2V0TG9hZCgpOiB2b2lkIHtcclxuICAgIC8vIG1ha2Ugc3VyZSBub3RoaW5nIGlzIGtlZXBpbmcgYSBsb2NrXHJcbiAgICB0aGlzLl9pT25lLnNldEluc3RhbmNlKG51bGwpO1xyXG4gICAgLy8gY2xlYW5cclxuICAgIHRoaXMuX2NsZWFudXAoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFudXAoKTogdm9pZCB7XHJcbiAgICBVdGlscy5EaXNwb3NlT2JqZWN0KHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UpO1xyXG4gICAgdGhpcy5mdWxsM0RPYmplY3RUb1VzZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwID0gdW5kZWZpbmVkO1xyXG4gICAgVXRpbHMuRGlzcG9zZU9iamVjdCh0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQpO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2hpbGRFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9hZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fYWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2VuYWJsZUludGVncmF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5faW50ZWdyYXRpb25FbmFibGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUl0ZW1SZW1vdmVkRnJvbVNjZW5lKHJlc3VsdDogeyBpdGVtOiBhbnksIGFkZGVkVG9Hcm91cDogYm9vbGVhbiB9KTogdm9pZCB7XHJcbiAgICBpZiAocmVzdWx0LmFkZGVkVG9Hcm91cCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0Lml0ZW0gaW5zdGFuY2VvZiBJdGVtICYmICEocmVzdWx0Lml0ZW0gaW5zdGFuY2VvZiBGbG9vclBpbiB8fCByZXN1bHQuaXRlbSBpbnN0YW5jZW9mIFdhbGxQaW4pKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbnRlZ3JhdGlvbkVuYWJsZWQgJiYgcmVzdWx0Lml0ZW0udXNlckRhdGEpIHtcclxuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gcmVzdWx0Lml0ZW0udXNlckRhdGEuaXRlbUlkID8gcmVzdWx0Lml0ZW0udXNlckRhdGEuaXRlbUlkIDogcmVzdWx0Lml0ZW0udXVpZDtcclxuICAgICAgICB0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucy5zcGxpY2UodGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMuZmluZEluZGV4KGYgPT4gZi5JZCA9PT0gaWQpLCAxKTtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuQ29uZmlndXJhdGlvbkNoYW5nZWQsIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY2xlYXJFbGVtZW50cyhyZXN1bHQuaXRlbSk7XHJcbiAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFyRWxlbWVudHMoaXRlbTogSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDdXN0b21GbG9vckl0ZW0gJiYgaXRlbS51c2VyRGF0YSAmJiBpdGVtLnVzZXJEYXRhLml0ZW1JZCkge1xyXG4gICAgICB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbEVsZW1lbnRQb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgIHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnJlbW92ZUVsZW1lbnQoaXRlbS51c2VyRGF0YS5pdGVtSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlSW50ZWdyYXRpb25Db25uZWN0aW9ucyhpZDogc3RyaW5nLCBvYmplY3Q6IEl0ZW0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcnRzOiBGdXJuaXR1cmVQYXJ0SW50ZWdyYXRpb25bXSA9IFtdO1xyXG4gICAgY29uc3QgY2hpbGRQYXJ0czogT2JqZWN0M0RbXSA9IG9iamVjdC5jb25maWd1cmFibGUgPyBvYmplY3QuY2hpbGRyZW4gOiBbb2JqZWN0XTtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gY2hpbGRQYXJ0cy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkOiBhbnkgPSA8Q3VzdG9tT2JqZWN0M0Q+Y2hpbGRQYXJ0c1tpXTtcclxuICAgICAgY29uc3QgY29ubmVjdGlvbjogRnVybml0dXJlUGFydEludGVncmF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRJbnRlZ3JhdGlvbigpO1xyXG4gICAgICBjb25zdCB2YXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgICAgaWYgKGNoaWxkLnVzZXJEYXRhICYmIGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbiAmJiBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBjb25uZWN0aW9uLklkID0gY2hpbGRQYXJ0cy5maW5kSW5kZXgoYyA9PiBjID09PSBjaGlsZCkudG9TdHJpbmcoKTtcclxuICAgICAgICBjb25uZWN0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgIGNvbm5lY3Rpb24uQnJhbmRJZGVudGlmaWVyID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgICAgICAgY29ubmVjdGlvbi5CcmFuZERlc2NyaXB0aW9uID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgIGNvbm5lY3Rpb24uUG9zaXRpb24gPSBjaGlsZC5wb3NpdGlvbjtcclxuICAgICAgICBjb25uZWN0aW9uLlJvdGF0aW9uID0gY2hpbGQucm90YXRpb247XHJcbiAgICAgICAgaWYgKGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhdGlvbjogYW55ID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnNbMF07XHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uID0gdmFyaWF0aW9uLmJyYW5kSWQ7XHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24udmFyaWF0aW9uc1tqXTtcclxuICAgICAgICAgICAgICBjb25zdCB2YXJpYXRpb25QYXJ0OiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0LlZhcmlhdGlvbiA9IHZhcmlhdGlvbi5icmFuZElkO1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvblBhcnQuVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5NYXRlcmlhbElkID0gdmFyaWF0aW9uLm1hdGVyaWFsSWQ7XHJcbiAgICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5TdXBwbGllckFydGljbGVOciA9IHZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0Lk9wdGlvbiA9IHZhcmlhdGlvbi5vcHRpb25UZXh0O1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb25QYXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25uZWN0aW9uLlZhcmlhdGlvbnMgPSB2YXJpYXRpb25zO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHsgLy8gYS1hcnRpa2VsXHJcbiAgICAgICAgY29ubmVjdGlvbi5JZCA9IGNoaWxkUGFydHMuZmluZEluZGV4KGMgPT4gYyA9PT0gY2hpbGQpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29ubmVjdGlvbi5CcmFuZElkZW50aWZpZXIgPSBjaGlsZC5tZXRhZGF0YS5pdGVtSWRlbnRpZmllcjtcclxuICAgICAgICBjb25uZWN0aW9uLkJyYW5kRGVzY3JpcHRpb24gPSBjaGlsZC5tZXRhZGF0YS5pdGVtTmFtZTtcclxuICAgICAgICBjb25uZWN0aW9uLlBvc2l0aW9uID0gY2hpbGQucG9zaXRpb247XHJcbiAgICAgICAgY29ubmVjdGlvbi5Sb3RhdGlvbiA9IGNoaWxkLnJvdGF0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbm5lY3RvcnM6IEZ1cm5pdHVyZUNvbm5lY3RlZFBhcnRJbnRlZ3JhdGlvbltdID0gW107XHJcbiAgICAgIGNvbnN0IGNsZW46IG51bWJlciA9IGNoaWxkLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGVuOyBqKyspIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3I6IGFueSA9IGNoaWxkLmNoaWxkcmVuW2pdO1xyXG4gICAgICAgIGlmICgoY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tT2JqZWN0M0QgfHwgY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tTWVzaCkgJiYgKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKSB7XHJcbiAgICAgICAgICBjb25zdCBjb25uOiBGdXJuaXR1cmVDb25uZWN0ZWRQYXJ0SW50ZWdyYXRpb24gPSBuZXcgRnVybml0dXJlQ29ubmVjdGVkUGFydEludGVncmF0aW9uKCk7XHJcbiAgICAgICAgICBjb25uLkNvbm5lY3Rpb25MYWJlbCA9IGNvbm5lY3Rvci5uYW1lO1xyXG4gICAgICAgICAgY29uc3QgZm9yZWlnblBhcnRJZHg6IG51bWJlciA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuLmZpbmRJbmRleChjID0+IGMubmFtZSA9PT0gKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKTtcclxuICAgICAgICAgIGNvbm4uRm9yZWlnbkNvbm5lY3Rpb25MYWJlbCA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuW2ZvcmVpZ25QYXJ0SWR4XS51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICBjb25uLkZvcmVpZ25QYXJ0SWQgPSBmb3JlaWduUGFydElkeC50b1N0cmluZygpO1xyXG4gICAgICAgICAgY29ubi5Qb3NpdGlvbiA9IGNvbm5lY3Rvci5wb3NpdGlvbjtcclxuICAgICAgICAgIGNvbm4uUm90YXRpb24gPSBjb25uZWN0b3Iucm90YXRpb247XHJcbiAgICAgICAgICBjb25uZWN0b3JzLnB1c2goY29ubik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbm5lY3Rpb24uQ29ubmVjdGVkUGFydHMgPSBjb25uZWN0b3JzO1xyXG4gICAgICBwYXJ0cy5wdXNoKGNvbm5lY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXBzZXJ0RnVybml0dXJlKGlkLCB7UGFydHM6IHBhcnRzfSwgb2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Vwc2VydEZ1cm5pdHVyZShpZDogc3RyaW5nLCBvYmplY3Q6IGFueSwgaXRlbTogSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ludGVncmF0aW9uRW5hYmxlZCAmJiAhaXRlbS5tZXRhZGF0YS5vYnNvbGV0ZSkge1xyXG4gICAgICBjb25zdCBpZHg6IG51bWJlciA9IHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmZpbmRJbmRleChmID0+IGYuSWQgPT09IGlkKTtcclxuICAgICAgbGV0IGZ1cm5pdHVyZTogRnVybml0dXJlSW50ZWdyYXRpb247XHJcbiAgICAgIGlmIChpZHggPCAwKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbMF0uSWQpIHsgLy8gZW1wdHkgZW50cnkgZm9yIG1ycCBjb2RlLCByZS11c2UgdGhhdCBvbmVcclxuICAgICAgICAgIGZ1cm5pdHVyZSA9IHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmdXJuaXR1cmUgPSBuZXcgRnVybml0dXJlSW50ZWdyYXRpb24oKTtcclxuICAgICAgICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLnB1c2goZnVybml0dXJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVybml0dXJlLklkID0gaWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZnVybml0dXJlID0gdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbaWR4XTtcclxuICAgICAgfVxyXG4gICAgICBmdXJuaXR1cmUuTXJwQ29kZSA9IHRoaXMuX3Blcm1hbmVudFN0b3JlU2VydmljZS5jb2RlO1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcclxuICAgICAgICBpZiAoZnVybml0dXJlLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIGZ1cm5pdHVyZVtrZXldID0gb2JqZWN0W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRDb2RlT25GdXJuaXR1cmVDb25maWd1cmF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ludGVncmF0aW9uRW5hYmxlZCkge1xyXG4gICAgICBpZiAodGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIGNvbnN0IGZ1cm5pdHVyZTogRnVybml0dXJlSW50ZWdyYXRpb24gPSBuZXcgRnVybml0dXJlSW50ZWdyYXRpb24oKTtcclxuICAgICAgICBmdXJuaXR1cmUuTXJwQ29kZSA9IHRoaXMuX3Blcm1hbmVudFN0b3JlU2VydmljZS5jb2RlO1xyXG4gICAgICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLnB1c2goZnVybml0dXJlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucy5mb3JFYWNoKGYgPT4gZi5NcnBDb2RlID0gdGhpcy5fcGVybWFuZW50U3RvcmVTZXJ2aWNlLmNvZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5Db25maWd1cmF0aW9uQ2hhbmdlZCwgdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuQ29ubmVjdFNlbGVjdGlvbnMoc2VsMTogU2VsZWN0aW9uLCBzZWwyOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIGlmICghc2VsMS5kZWNvTm9kZSB8fCAhc2VsMi5kZWNvTm9kZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgY2FuQ29ubmVjdDogYm9vbGVhbiA9IHNlbDIuZGVjb05vZGUudHlwZSAhPT0gRGVjb05vZGVUeXBlLlBhcnQ7XHJcbiAgICBpZiAoIWNhbkNvbm5lY3QpIHtcclxuICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbGVuaTogbnVtYmVyID0gc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGVuaTsgaWkrKykge1xyXG4gICAgICAgICAgY2FuQ29ubmVjdCA9IFNjZW5lM0RVdGlsLkNhblNlbGVjdG9yQ29ubmVjdChzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMsIHNlbDEuZGVjb05vZGUuY29ubmVjdG9yc1tpXSwgc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzW2lpXSk7XHJcbiAgICAgICAgICBpZiAoY2FuQ29ubmVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbkNvbm5lY3Q7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVTZWxlY3Rpb25zUmVjZWl2ZWQobWV0YWRhdGE6IE1ldGFkYXRhKSB7XHJcbiAgICBpZiAodGhpcy5fYW5zd2VyU2VsZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zLmZpbmQocyA9PiBzLm5vZGVJZCA9PT0gdGhpcy5fYW5zd2VyU2VsZWN0ZWRbdGhpcy5fYW5zd2VyU2VsZWN0ZWQubGVuZ3RoIC0gMV0ubm9kZUlkKTtcclxuICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgIGxldCBpdGVtTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKG1ldGFkYXRhLml0ZW1OYW1lID09PSAnJykge1xyXG4gICAgICAgICAgaWYgKG1ldGFkYXRhLml0ZW1EZXNjcmlwdGlvbiAhPT0gJycpIHtcclxuICAgICAgICAgICAgaXRlbU5hbWUgPSBtZXRhZGF0YS5pdGVtRGVzY3JpcHRpb247XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtTmFtZSA9IG1ldGFkYXRhLml0ZW1JZGVudGlmaWVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpdGVtTmFtZSA9IG1ldGFkYXRhLml0ZW1OYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9nb29nbGVUYWdNYW5hZ2VyLnNlbmRFdmVudChHb29nbGVUYWdNYW5hZ2VyRXZlbnQuQW5zd2VyQ2hvc2VuLCB7XHJcbiAgICAgICAgICAnYXJ0aWNsZU5yJzogbWV0YWRhdGEuaXRlbUlkZW50aWZpZXIsXHJcbiAgICAgICAgICAncHJvZHVjdCc6IGl0ZW1OYW1lLFxyXG4gICAgICAgICAgJ29wdGlvbkRlc2NyaXB0aW9uJzogc2VsZWN0aW9uLmNvbW1lcmNpYWxBbnN3ZXIgPyBzZWxlY3Rpb24uY29tbWVyY2lhbEFuc3dlciA6IHNlbGVjdGlvbi5hbnN3ZXIsXHJcbiAgICAgICAgICAnb3B0aW9uUGF0aCc6IHNlbGVjdGlvbi5zZWxlY3Rpb25cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlQ29ubmVjdGlvblJlc2V0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLnNldFVuc2VsZWN0ZWQoKTtcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5lbWl0KE1lc3NhZ2VUeXBlLkl0ZW1VbnNlbGVjdGVkLCB1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLl9zaG93V2FybmluZyh7dGl0bGU6ICdXQVJOSU5HJywgbWVzc2FnZTogJ1JFRlJFU0hfRFVFX1RPX0lOQUNUSVZJVFknfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVBbnN3ZXJTZWxlY3RlZChhbnN3ZXI6IEFuc3dlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fYW5zd2VyU2VsZWN0ZWQucHVzaChhbnN3ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNhbmNlbEFuc3dlcihtZXRhZGF0YTogTWV0YWRhdGEsIHJlYnVpbGQ6IGJvb2xlYW4gPSB0cnVlLCBnZXRBbnN3ZXJzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuX2lPbmUuY2FuY2VsQW5zd2VyKCk7XHJcbiAgICBpZiAocmVidWlsZCkge1xyXG4gICAgICB0aGlzLl9zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKG1ldGFkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAoZ2V0QW5zd2VycykgeyAvLyBpZiBub3QgcmVidWlsZCB0aGVuIGNoZWNrIGlmIHdlIG5lZWQgdG8gZ2V0IGFuc3dlcnNcclxuICAgICAgY29uc3QgcXVlc3Rpb25BbmRBbnN3ZXJzOiBRdWVzdGlvbkFuZEFuc3dlcnMgPSBhd2FpdCB0aGlzLl9pT25lLmdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk7IC8vIHNlZSBpZiB0aGVyZSBpcyB1c2VyIGlucHV0IG5lZWRlZFxyXG4gICAgICB0aGlzLl9pT25lLmhhbmRsZUFuc3dlcnNSZWNlaXZlZChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycyk7XHJcbiAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZWxlY3RTZWxlY3Rpb24oXHJcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbiwgbWV0YWRhdGE6IE1ldGFkYXRhLCBmb3JjZUJhY2tUb05vZGU/OiBib29sZWFuLCBhZnRlcj86IGJvb2xlYW4sIGNvbm5lY3Rvcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5faU9uZS5zZWxlY3RTZWxlY3Rpb24oc2VsZWN0aW9uLCBmb3JjZUJhY2tUb05vZGUsIGFmdGVyLCBjb25uZWN0b3IpO1xyXG4gICAgdGhpcy5fZ2VuZXJpY1NlbGVjdGlvbiA9IHNlbGVjdGlvbi5nZW5lcmljO1xyXG4gICAgdGhpcy5fc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihtZXRhZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBtZXRhZGF0YTogTWV0YWRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnJlbW92ZUVsZW1lbnQoc2VsZWN0aW9uLmluc3RhbmNlSWQsIHNlbGVjdGlvbi5ub2RlKTtcclxuICAgIGF3YWl0IHRoaXMuX2lPbmUuZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICB0aGlzLl9zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKG1ldGFkYXRhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyByZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBtZXRhZGF0YTogTWV0YWRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuX2lPbmUucmVwbGFjZVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5fc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihtZXRhZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyLCBpbnB1dDogc3RyaW5nLCBtZXRhZGF0YTogTWV0YWRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3ByZWxvYWRNYXRlcmlhbChhbnN3ZXIpO1xyXG4gICAgYXdhaXQgdGhpcy5faU9uZS5zZWxlY3RBbnN3ZXIoYW5zd2VyLCBpbnB1dCk7XHJcbiAgICB0aGlzLl9oYW5kbGVBbnN3ZXJTZWxlY3RlZChhbnN3ZXIpO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0ID0gYXdhaXQgdGhpcy5fc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihtZXRhZGF0YSk7XHJcbiAgICB0aGlzLmFuc3dlclNlbGVjdGVkLm5leHQocmVzdWx0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEFjdGl2ZUZ1cm5pdHVyZShpbnN0YW5jZUlkOiBzdHJpbmcpOiBJdGVtIHtcclxuICAgIGNvbnN0IGNvbmZpZ3VyYWJsZXM6IGFueVtdID0gdGhpcy5faXRlbVNlcnZpY2UuZ2V0Q29uZmlndXJhYmxlcygpO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBjb25maWd1cmFibGVzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgaWYgKGNvbmZpZ3VyYWJsZXNbaV0ubWV0YWRhdGEgJiYgY29uZmlndXJhYmxlc1tpXS5tZXRhZGF0YS5pdGVtSWQgPT09IGluc3RhbmNlSWQgJiYgIWNvbmZpZ3VyYWJsZXNbaV0udGVtcE9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiBjb25maWd1cmFibGVzW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAvLyBjb25zdCBpZDogc3RyaW5nID0gdGhpcy5zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY287XHJcbiAgICAgIGxldCBkZWNvOiBhbnkgPSB0aGlzLl9pT25lLmRlY29Ob2Rlcy5maW5kKGQgPT4gZC5pZCA9PT0gdGhpcy5zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY28pO1xyXG4gICAgICBpZiAoIWRlY28pIHtcclxuICAgICAgICBkZWNvID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRlY28udHlwZSAhPT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbjogYW55ID0gdGhpcy5fZ2V0VmFyaWF0aW9ucygpLmZpbmQodiA9PiB2LnBhcmVudElkID09PSB0aGlzLnNlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1tpXS5kZWNvTm9kZSA9IGRlY287XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pT25lLnNlbGVjdGlvbnNBbmREZWNvc0xpbmtlZC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVDb25maWd1cmFibGVJdGVtKGluc3RhbmNlSWQ6IHN0cmluZywgbWV0YWRhdGE6IE1ldGFkYXRhKTogSXRlbSB7XHJcbiAgICAvLyBjb25zdCBmdXJuaXR1cmU6IEl0ZW0gPSB0aGlzLl9nZXRBY3RpdmVGdXJuaXR1cmUoaW5zdGFuY2VJZCk7XHJcbiAgICAvLyBjb25zdCBjbG9uZVNlbGVjdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0aW9ucykpO1xyXG4gICAgLy8gY2xvbmVTZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAvLyAgIHMuaW1hZ2VEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICBzLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyB9KTtcclxuICAgIC8vIGlmIChmdXJuaXR1cmUpIHtcclxuICAgIC8vICAgZnVybml0dXJlLm1ldGFkYXRhLmRlY29zID0gQXJyYXkuZnJvbSh0aGlzLl9pT25lLmRlY29Ob2Rlcyk7XHJcbiAgICAvLyAgIGZ1cm5pdHVyZS5tZXRhZGF0YS5zZWxlY3Rpb25zID0gY2xvbmVTZWxlY3Rpb25zO1xyXG4gICAgLy8gICBmdXJuaXR1cmUubWFya0ZvckRlbGV0aW9uQ2hpbGRyZW4oKTtcclxuICAgIC8vICAgcmV0dXJuIGZ1cm5pdHVyZTtcclxuICAgIC8vIH1cclxuICAgIGlmICghbWV0YWRhdGEucG9zaXRpb24pIHtcclxuICAgICAgbWV0YWRhdGEucG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb24gfHwgZGVmYXVsdFBvc2l0aW9uO1xyXG4gICAgfVxyXG4gICAgaWYgKCFtZXRhZGF0YS5yb3RhdGlvbikge1xyXG4gICAgICBtZXRhZGF0YS5yb3RhdGlvbiA9IG1ldGFkYXRhLmRlZmF1bHQxODAgPyBkZWZhdWx0Um90YXRpb24gOiBuZXcgRXVsZXIoKTtcclxuICAgIH1cclxuICAgIC8vIElmIGl0ZW1UeXBlIGlzIGRpZmZlcmVudCBpbiBhcnRpY2xlIGNvbXBhcmVkIHRvIHNhdmVkIHZhbHVlIGluIHRoZSAuanNvbiwgdGhlIGl0ZW1UeXBlIGluIGFydGljbGUgaXMgYXBwbGllZFxyXG4gICAgLy8gbWV0YWRhdGEuaXRlbVR5cGUgPSB0aGlzLml0ZW1UeXBlICYmIHRoaXMuaXRlbVR5cGUgIT09IG1ldGFkYXRhLml0ZW1UeXBlID8gdGhpcy5pdGVtVHlwZSA6IG1ldGFkYXRhLml0ZW1UeXBlO1xyXG4gICAgY29uc3QgaXRlbUNvbnN0cnVjdG9yID0gRmFjdG9yeS5nZXRDbGFzcyh0aGlzLnN0YW5kQWxvbmUgPyBJdGVtVHlwZS5DdXN0b21GbG9vckdyb3VwIDogbWV0YWRhdGEuaXRlbVR5cGUpO1xyXG4gICAgY29uc3QgaXRlbSA9IG5ldyBpdGVtQ29uc3RydWN0b3IoXHJcbiAgICAgIG1ldGFkYXRhLFxyXG4gICAgICB1bmRlZmluZWQsIC8vIGJhc2Ugb24gZW1wdHkgb2JqZWN0XHJcbiAgICAgIHtcclxuICAgICAgICBtb3VzZU92ZXI6IHRoaXMubW91c2VPdmVyLFxyXG4gICAgICAgIG1vdXNlT2ZmOiB0aGlzLm1vdXNlT2ZmLFxyXG4gICAgICAgIGl0ZW1TZWxlY3RlZDogdGhpcy5zZWxlY3RJdGVtLFxyXG4gICAgICAgIGl0ZW1VbnNlbGVjdGVkOiB0aGlzLnVuU2VsZWN0SXRlbSxcclxuICAgICAgICBlbGVtZW50U2VsZWN0ZWQ6IHRoaXMuc2VsZWN0RWxlbWVudCxcclxuICAgICAgICBlbGVtZW50VW5zZWxlY3RlZDogdGhpcy51blNlbGVjdEVsZW1lbnQsXHJcbiAgICAgICAgY29uZmlndXJpbmdDaGFuZ2VkOiB0aGlzLmNoYW5nZUNvbmZpZ3VyZU1vZGUsXHJcbiAgICAgICAgY2hpbGRFbGVtZW50UG9zaXRpb25DaGFuZ2VkSGFuZGxlcjogdGhpcy5tb3ZlQ2hpbGRFbGVtZW50LFxyXG4gICAgICAgIGNoaWxkRWxlbWVudFBsYWNlSGFuZGxlcjogdGhpcy5wbGFjZUNoaWxkRWxlbWVudFxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRQb3NpdGlvbkNoYW5nZWRIYW5kbGVyOiBhZGp1c3RhYmxlID8gdGhpcy5tb3ZlQ2hpbGRFbGVtZW50IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50UGxhY2VIYW5kbGVyOiBhZGp1c3RhYmxlID8gdGhpcy5wbGFjZUNoaWxkRWxlbWVudCA6IHVuZGVmaW5lZFxyXG4gICAgICAgICovXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBpdGVtLmNhbkRlbGV0ZSA9ICF0aGlzLnN0YW5kQWxvbmU7XHJcbiAgICBpdGVtLmNhbkNvcHkgPSAhdGhpcy5zdGFuZEFsb25lO1xyXG4gICAgaXRlbS5hbGx3YXlzQ29uZmlndXJlTW9kZSA9IHRoaXMuc3RhbmRBbG9uZTtcclxuICAgIGl0ZW0uaGlnaExpZ2h0RGlzYWJsZWQgPSAhdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlU3RhbmRhbG9uZUhpZ2hMaWdodDtcclxuICAgIGl0ZW0udGVtcE9iamVjdCA9IHRydWU7XHJcbiAgICBpdGVtLm5hbWUgPSBtZXRhZGF0YS5pdGVtTmFtZSArICdfY2xvbmUnO1xyXG4gICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5hZGRJdGVtKGl0ZW0pO1xyXG4gICAgLy8gdGhpcy5fdXBzZXJ0RnVybml0dXJlKG1ldGFkYXRhLml0ZW1JZCwge0JyYW5kSWRlbnRpZmllcjogbWV0YWRhdGEuaXRlbUlkZW50aWZpZXJ9LCBpdGVtKTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlUG9zaXRpb25BbmltYXRpb24ob2JqZWN0OiBPYmplY3QzRCwgZnJvbTogVmVjdG9yMywgdG86IFZlY3RvcjMsIGVhc2luZzogVFdFRU4uRWFzaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB0d2VlbkZyb206IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpLmNvcHkoZnJvbSk7XHJcbiAgICBjb25zdCB0d2VlbiA9IG5ldyBUV0VFTi5Ud2Vlbih0d2VlbkZyb20pXHJcbiAgICAgIC50byh0bywgMTAwMClcclxuICAgICAgLmVhc2luZyhlYXNpbmcpXHJcbiAgICAgIC5vblVwZGF0ZSgoKSA9PiB7XHJcbiAgICAgICAgb2JqZWN0LnBvc2l0aW9uLmNvcHkodHdlZW5Gcm9tKTtcclxuICAgICAgICB0aGlzLl9zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHR3ZWVuLm9uQ29tcGxldGUocmVzb2x2ZS5iaW5kKHRoaXMsIHR3ZWVuKSkub25TdG9wKHJlamVjdCkuc3RhcnQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9hbmltYXRlQ2hhbmdlcyhmdXJuaXR1cmU6IEl0ZW0sIGNoYW5nZXM6IENoYW5nZXNJbnRlcmZhY2VbXSk6IFByb21pc2U8dm9pZFtdPiB7XHJcbiAgICAvLyBpdCdzIGNocmlzdG1hc3NzXHJcbiAgICBjb25zdCBhbmltYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcclxuICAgIGlmIChmdXJuaXR1cmUgaW5zdGFuY2VvZiBDdXN0b21GbG9vckl0ZW0pIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZWFzaW5nOiBUV0VFTi5FYXNpbmcgPSAhY2hhbmdlc1tpXS5vbGRQb3NpdGlvbiA/IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5PdXQgOlxyXG4gICAgICAgICAgKCFjaGFuZ2VzW2ldLm5ld1Bvc2l0aW9uID8gVFdFRU4uRWFzaW5nLkV4cG9uZW50aWFsLk91dCA6IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5Jbk91dCk7XHJcbiAgICAgICAgY29uc3QgZnJvbTogVmVjdG9yMyA9XHJcbiAgICAgICAgICBjaGFuZ2VzW2ldLm9sZFBvc2l0aW9uID8gbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ub2xkUG9zaXRpb24pIDogbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ubmV3UG9zaXRpb24pLnNldFkoMTApO1xyXG4gICAgICAgIGNvbnN0IHRvOiBWZWN0b3IzID1cclxuICAgICAgICAgIGNoYW5nZXNbaV0ubmV3UG9zaXRpb24gPyBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5uZXdQb3NpdGlvbikgOiBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5vbGRQb3NpdGlvbikuc2V0WSgxMCk7XHJcbiAgICAgICAgY29uc3Qgb2JqOiBPYmplY3QzRCA9IGZ1cm5pdHVyZS5nZXRPYmplY3RCeU5hbWUoY2hhbmdlc1tpXS5uYW1lKTtcclxuICAgICAgICBpZiAoIWZyb20uZXF1YWxzKHRvKSkge1xyXG4gICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVQb3NpdGlvbkFuaW1hdGlvbihvYmosIGZyb20sIHRvLCBlYXNpbmcpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGFuaW1hdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcmVwbGFjZUN1cnJlbnRJdGVtKG5ld0l0ZW06IEl0ZW0sIG1ldGFkYXRhOiBNZXRhZGF0YSwgYW5pbWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJdGVtPiB7XHJcbiAgICBjb25zdCBmdXJuaXR1cmU6IEl0ZW0gPSB0aGlzLl9nZXRBY3RpdmVGdXJuaXR1cmUobWV0YWRhdGEuaXRlbUlkKTtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3Rpb25zKSk7XHJcbiAgICBjbG9uZVNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHMuaW1hZ2VEYXRhTGFzdEFuc3dlciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHMuYWRkYWJsZXMpIHtcclxuICAgICAgICBzLmFkZGFibGVzLmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgICBhLmltYWdlRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoZnVybml0dXJlKSB7XHJcbiAgICAgIGZ1cm5pdHVyZS5tZXRhZGF0YS5kZWNvcyA9IEFycmF5LmZyb20odGhpcy5faU9uZS5kZWNvTm9kZXMpO1xyXG4gICAgICBmdXJuaXR1cmUubWV0YWRhdGEuc2VsZWN0aW9ucyA9IGNsb25lU2VsZWN0aW9ucztcclxuICAgICAgaWYgKGZ1cm5pdHVyZSBpbnN0YW5jZW9mIEN1c3RvbVdhbGxGbG9vckl0ZW0pIHtcclxuICAgICAgICAobmV3SXRlbSBhcyBDdXN0b21XYWxsRmxvb3JJdGVtKS5jdXJyZW50V2FsbCA9IGZ1cm5pdHVyZS5jdXJyZW50V2FsbDtcclxuICAgICAgfVxyXG4gICAgICBuZXdJdGVtLnVwZGF0ZVBpdm90KCk7XHJcbiAgICAgIGNvbnN0IGNoYW5nZXM6IENoYW5nZXNJbnRlcmZhY2VbXSA9IGZ1cm5pdHVyZSBpbnN0YW5jZW9mIEN1c3RvbUZsb29ySXRlbSA/IE9iamVjdFV0aWxzLkdldENoYW5nZXMoZnVybml0dXJlLmNoaWxkcmVuLCBuZXdJdGVtLmNoaWxkcmVuKSA6IFtdO1xyXG4gICAgICAvLyBhbmltYXRlIHJlbW92ZWQgaXRlbXNcclxuICAgICAgY29uc3QgcmVtb3ZlZENoYW5nZXM6IENoYW5nZXNJbnRlcmZhY2VbXSA9IGNoYW5nZXMuZmlsdGVyKGMgPT4gIWMubmV3UG9zaXRpb24pO1xyXG4gICAgICBpZiAoYW5pbWF0ZSAmJiByZW1vdmVkQ2hhbmdlcyAmJiByZW1vdmVkQ2hhbmdlcy5sZW5ndGggPiAwKSB7IC8vIGFuaW1hdGUgY2hhbmdlcyB0byB0aGUgbW9kZWxcclxuICAgICAgICBhd2FpdCB0aGlzLl9hbmltYXRlQ2hhbmdlcyhmdXJuaXR1cmUsIHJlbW92ZWRDaGFuZ2VzKTtcclxuICAgICAgfVxyXG4gICAgICAvLyByZW1vdmUgY2hpbGRyZW4gZnJvbSBmdXJuaXR1cmVcclxuICAgICAgZnVybml0dXJlLmNsZWFyQ2hpbGRyZW4oKTtcclxuICAgICAgLy8gYWRkIG5ldyBjaGlsZHJlbiB0byBmdXJuaXR1cmVcclxuICAgICAgbmV3SXRlbS5jaGlsZHJlbi5tYXAoYyA9PiBmdXJuaXR1cmUuYWRkQ2hpbGQoYykpO1xyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKG5ld0l0ZW0sIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIC8vIGFuaW1hdGUgKG5ldykgaXRlbXNcclxuICAgICAgY29uc3Qgb3RoZXJDaGFuZ2VzOiBDaGFuZ2VzSW50ZXJmYWNlW10gPSBjaGFuZ2VzLmZpbHRlcihjID0+IGMubmV3UG9zaXRpb24pO1xyXG4gICAgICBpZiAoYW5pbWF0ZSAmJiBvdGhlckNoYW5nZXMgJiYgb3RoZXJDaGFuZ2VzLmxlbmd0aCA+IDApIHsgLy8gYW5pbWF0ZSBjaGFuZ2VzIHRvIHRoZSBtb2RlbFxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2FuaW1hdGVDaGFuZ2VzKGZ1cm5pdHVyZSwgb3RoZXJDaGFuZ2VzKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZnVybml0dXJlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3SXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgbmV3SXRlbS50ZW1wT2JqZWN0ID0gZmFsc2U7XHJcbiAgICAgIG5ld0l0ZW0ubmFtZSA9IG1ldGFkYXRhLml0ZW1OYW1lO1xyXG4gICAgICB0aGlzLl91cHNlcnRGdXJuaXR1cmUobWV0YWRhdGEuaXRlbUlkLCB7QnJhbmRJZGVudGlmaWVyOiBtZXRhZGF0YS5pdGVtSWRlbnRpZmllcn0sIG5ld0l0ZW0pO1xyXG4gICAgICByZXR1cm4gbmV3SXRlbTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZU92ZXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzTW91c2VPdmVyT2JqZWN0ID0gdHJ1ZTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgbW91c2VPZmYgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzTW91c2VPdmVyT2JqZWN0ID0gZmFsc2U7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHNlbGVjdEl0ZW0gPSAobWVzaDogTWVzaCkgPT4ge1xyXG4gICAgLy8gdGhpcy5hY3RpdmVJbnN0YW5jZSA9IG1lc2gudXNlckRhdGEuaXRlbUlkO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyB1blNlbGVjdEl0ZW0gPSAoKSA9PiB7XHJcbiAgICAvLyB0aGlzLnNob3dMaXRlU2VsZWN0b3IgPSBmYWxzZTtcclxuICAgIC8vIHRoaXMuc2hvd1NlbGVjdGlvbnMgPSBmYWxzZTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc2VsZWN0RWxlbWVudCA9IChlbGVtZW50OiBNZXNoLCBtb3VzZVBvczogVmVjdG9yMykgPT4ge1xyXG4gICAgdGhpcy5fYWN0aXZlQ2hpbGRFbGVtZW50ID0gZWxlbWVudDtcclxuICAgIGlmIChlbGVtZW50LnBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbU9iamVjdDNEKSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsRWxlbWVudFBvc2l0aW9uLmNvcHkoZWxlbWVudC5wYXJlbnQucG9zaXRpb24pO1xyXG4gICAgICAvLyBpZiAodGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuYWRqdXN0YWJsZSkge1xyXG4gICAgICBpZiAodGhpcy5faXNNb3ZlYWJsZU9iamVjdChlbGVtZW50LnBhcmVudCkpIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3I6IGFueSA9IGVsZW1lbnQucGFyZW50LmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjXycpID4gLTEpO1xyXG4gICAgICAgIGlmIChjb25uZWN0b3IuY29ubmVjdGVkVG8pIHtcclxuICAgICAgICAgIGNvbnN0IGJhc2VFbGVtZW50OiBPYmplY3QzRCA9IDxDdXN0b21PYmplY3QzRD50aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5nZXRPYmplY3RCeU5hbWUoY29ubmVjdG9yLmNvbm5lY3RlZFRvKTtcclxuICAgICAgICAgIHRoaXMuYmFzZUVsZW1lbnROb2RlSWQgPSBiYXNlRWxlbWVudC51c2VyRGF0YSAmJiBiYXNlRWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24gPyBiYXNlRWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24ubm9kZUlkIDogMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0ZWRFbGVtZW50Lm5leHQoZWxlbWVudCk7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHVuU2VsZWN0RWxlbWVudCA9ICgpID0+IHtcclxuICAgIHRoaXMuX2FjdGl2ZUNoaWxkRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0ZWRFbGVtZW50Lm5leHQodW5kZWZpbmVkKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgbW92ZUNoaWxkRWxlbWVudCA9IChlbGVtZW50OiBDdXN0b21PYmplY3QzRCwgcG9zOiBWZWN0b3IzKSA9PiB7XHJcbiAgICBjb25zdCB3b3JsZFRvTG9jYWxQb3M6IFZlY3RvcjMgPSB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC53b3JsZFRvTG9jYWwocG9zLmNsb25lKCkpO1xyXG4gICAgdGhpcy5fbW92ZUNoaWxkRWxlbWVudFRvUG9zaXRpb24oZWxlbWVudCwgd29ybGRUb0xvY2FsUG9zKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgcGxhY2VDaGlsZEVsZW1lbnQgPSBhc3luYyAoZWxlbWVudDogQ3VzdG9tT2JqZWN0M0QpID0+IHtcclxuICAgIGlmICh0aGlzLl9pc01vdmVhYmxlT2JqZWN0KGVsZW1lbnQpICYmIChlbGVtZW50IGFzIGFueSkubW92ZWQpIHtcclxuICAgICAgY29uc3QgYmFzZUVsZW1lbnQ6IE9iamVjdDNEW10gPVxyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmdldE9iamVjdHNCeVVzZXJEYXRhUHJvcCgnc2VsZWN0aW9uJywgJ25vZGVJZCcsIHRoaXMuYmFzZUVsZW1lbnROb2RlSWQpO1xyXG4gICAgICAvLyB1c2UgaW5zdGFuY2VJZCBmcm9tIHBhcmVudFxyXG4gICAgICBjb25zdCBpdGVtOiBJdGVtID0gT2JqZWN0VXRpbHMuR2V0UGFyZW50SXRlbShlbGVtZW50KTtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3I6IHN0cmluZyA9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl9lbGVtZW50U2VydmljZS5wbGFjZUVsZW1lbnRPbkNvbm5lY3RvcihcclxuICAgICAgICAgICAgaXRlbS5tZXRhZGF0YS5pdGVtSWQsIGVsZW1lbnQsIGJhc2VFbGVtZW50Lmxlbmd0aCA+IDAgPyBiYXNlRWxlbWVudFswXSA6IG51bGwpO1xyXG4gICAgICAgIHRoaXMuX3NhdmVFbGVtZW50Q29ubmVjdG9yKGVsZW1lbnQsIGNvbm5lY3Rvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwdWJsaWMgY2hhbmdlQ29uZmlndXJlTW9kZSA9IGFzeW5jIChtZXRhZGF0YTogTWV0YWRhdGEsIGNvbmZpZ3VyaW5nOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbmZpZ3VyZU1vZGVDaGFuZ2VkLm5leHQoe21ldGFkYXRhOiBtZXRhZGF0YSwgY29uZmlndXJpbmc6IGNvbmZpZ3VyaW5nfSk7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGRyYWdDb25uZWN0b3IgPSBhc3luYyAoY29ubmVjdG9yOiBDdXN0b21NZXNoLCBwb3M6IFZlY3RvcjMpID0+IHtcclxuICAgIHRoaXMuX3Jlc2l6ZVNlcnZpY2UuZHJhZ0Nvbm5lY3RvclRvTmV3UG9zaXRpb24oY29ubmVjdG9yLCBwb3MpO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBjYW5jZWxDb25maWd1cmluZ0N1cnJlbnRJbnN0YW5jZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5jb25maWd1cmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNNb3ZlYWJsZU9iamVjdChvYmo6IE9iamVjdDNEKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb2JqLnVzZXJEYXRhICYmIG9iai51c2VyRGF0YS5zZWxlY3Rpb24gJiYgb2JqLnVzZXJEYXRhLnNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nID09PSBIZGVjb1Bvc2l0aW9uaW5nLlZhcmlhYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfYWRkRWxlbWVudE9uQ29ubmVjdG9yKGN1cnJlbnRJdGVtOiBJdGVtLCBlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcsIGNvbm5lY3RlZE5vZGVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBjb25zdCBjb246IE9iamVjdDNEID0gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuZ2V0T2JqZWN0QnlOYW1lKGNvbm5lY3Rvci5jb25uZWN0b3IpO1xyXG4gICAgLy8gaWYgKGNvbikge2VcclxuICAgIC8vIGNvbnN0IHBvczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCkuY29weShjb24ucG9zaXRpb24pO1xyXG4gICAgLy8gY29uLmxvY2FsVG9Xb3JsZChwb3MpO1xyXG4gICAgY29uc3QgY29ubmVjdG9yRnJvbUVsZW1lbnQgPSBjdXJyZW50SXRlbS5jb25uZWN0b3JGcm9tRWxlbWVudChlbGVtZW50LnVzZXJEYXRhLnNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBpZEZyb21CYXNlRWxlbWVudDogbnVtYmVyID0gY29ubmVjdGVkTm9kZUlkID8gY29ubmVjdGVkTm9kZUlkIDogY29ubmVjdG9yRnJvbUVsZW1lbnQuY29ubmVjdGVkTm9kZUlkO1xyXG4gICAgY29uc3QgYmFzZUVsZW1lbnQ6IE9iamVjdDNEW10gPSBjdXJyZW50SXRlbS5nZXRPYmplY3RzQnlVc2VyRGF0YVByb3AoJ3NlbGVjdGlvbicsICdub2RlSWQnLCBpZEZyb21CYXNlRWxlbWVudCk7XHJcblxyXG4gICAgY29uc3QgaXRlbTogSXRlbSA9IE9iamVjdFV0aWxzLkdldFBhcmVudEl0ZW0oZWxlbWVudCk7XHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICBjb25zdCBjb25uOiBzdHJpbmcgPVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnBsYWNlRWxlbWVudE9uQ29ubmVjdG9yKFxyXG4gICAgICAgICAgaXRlbS5tZXRhZGF0YS5pdGVtSWQsIGVsZW1lbnQsIGJhc2VFbGVtZW50Lmxlbmd0aCA+IDAgPyBiYXNlRWxlbWVudFswXSA6IG51bGwsIGZhbHNlLCBjb25uZWN0b3IsIGZhbHNlKTtcclxuICAgICAgdGhpcy5fc2F2ZUVsZW1lbnRDb25uZWN0b3IoZWxlbWVudCwgY29ubik7XHJcbiAgICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudXNlckRhdGEgJiYgZWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAudXBkYXRlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LnVzZXJEYXRhLnNlbGVjdGlvbiwgY29ubmVjdG9yLCB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIG1vdmVcclxuICAgKiBAcGFyYW0gcG9zIFRoZSBsb2NhbCBwb3NpdGlvblxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbW92ZUNoaWxkRWxlbWVudFRvUG9zaXRpb24oZWxlbWVudDogT2JqZWN0M0QsIHBvczogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzTW92ZWFibGVPYmplY3QoZWxlbWVudCkpIHtcclxuICAgICAgY29uc3Qgd29ybGRUb0xvY2FsUG9zOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKS5jb3B5KHBvcykuYWRkKHRoaXMuX29yaWdpbmFsRWxlbWVudFBvc2l0aW9uKTtcclxuICAgICAgY29uc3QgYmFzZUVsZW1lbnQ6IE9iamVjdDNEW10gPVxyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmdldE9iamVjdHNCeVVzZXJEYXRhUHJvcCgnc2VsZWN0aW9uJywgJ25vZGVJZCcsIHRoaXMuYmFzZUVsZW1lbnROb2RlSWQpO1xyXG4gICAgICBjb25zdCBpdGVtOiBJdGVtID0gT2JqZWN0VXRpbHMuR2V0UGFyZW50SXRlbShlbGVtZW50KTtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50U2VydmljZS5tb3ZlRWxlbWVudFRvTmV3UG9zaXRpb24oXHJcbiAgICAgICAgICBpdGVtLm1ldGFkYXRhLml0ZW1JZCwgZWxlbWVudCwgd29ybGRUb0xvY2FsUG9zLCBiYXNlRWxlbWVudC5sZW5ndGggPiAwID8gYmFzZUVsZW1lbnRbMF0gOiBudWxsKTtcclxuICAgICAgICAvLyB0aGlzLl9zYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LCBwb3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fYWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAvLyB0aGlzLl9wcmVwYXJlVGhlU2VsZWN0aW9ucygpO1xyXG4gICAgLy8gdG9kbzogY2hlY2sgdGhpc1xyXG4gICAgLy8gdGhpcy5fZWxlbWVudFNlcnZpY2UucmVtb3ZlRWxlbWVudCh0aGlzLmFjdGl2ZUluc3RhbmNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG1hdGVyaWFsSWQgb2YgdGhlIHBhcmVudCB1cCB0aGUgdHJlZSB1bnRpbCBwcmVzZW50aW9ubGV2ZWwgMSBpcyByZWFjaGVkXHJcbiAgICogQHBhcmFtIGlkXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRNYXRlcmlhbElkRnJvbVBhcmVudChpZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGlkeDogbnVtYmVyID0gdGhpcy5zZWxlY3Rpb25zLmZpbmRJbmRleChzID0+IHMubm9kZSA9PT0gaWQpO1xyXG4gICAgbGV0IGN1cnJlbnRMZXZlbDogbnVtYmVyID0gOTk5O1xyXG4gICAgaWYgKGlkeCA+IC0xKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSBpZHg7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbnNbaV07XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA+PSBjdXJyZW50TGV2ZWwpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50TGV2ZWwgPSBzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWw7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3QpIHtcclxuICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uaGRlY29HYW1lT2JqZWN0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVUaGVTZWxlY3Rpb25zKGluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMuc2VsZWN0aW9ucy5zbGljZSgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uT2ZBcnRpY2xlOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zLmZpbmQocyA9PiBzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BcnRpY2xlKTtcclxuICAgIGNvbnN0IGFkanVzdGFibGVTZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IHNlbGVjdGlvbnMuZmlsdGVyKHMgPT4gcy5hZGRBZGp1c3QgPT09ICcyJyk7XHJcbiAgICBjb25zdCBpc0FydGljbGVXaXRoTWF0ZXJpYWw6IGJvb2xlYW4gPVxyXG4gICAgICBhZGp1c3RhYmxlU2VsZWN0aW9ucy5sZW5ndGggPT09IDAgJiZcclxuICAgICAgc2VsZWN0aW9uT2ZBcnRpY2xlLmdhbWVPYmplY3QgJiZcclxuICAgICAgc2VsZWN0aW9uT2ZBcnRpY2xlLmdhbWVPYmplY3QubGVuZ3RoID4gMDtcclxuICAgIC8vIGdldCBnZW5lcmljIHZhcmlhdGlvbnNcclxuICAgIGNvbnN0IGdsb2JhbFZhcmlhdGlvbnM6IERlY29Ob2RlW10gPSB0aGlzLnNlbGVjdGlvbnNcclxuICAgICAgLmZpbHRlcihzID0+IChzLmdlbmVyaWMgfHwgYWRqdXN0YWJsZVNlbGVjdGlvbnMubGVuZ3RoID09PSAxKSAmJiAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbiAmJiAhcy5kZWNvTm9kZS50eXBlKVxyXG4gICAgICAubWFwKCh2YWx1ZTogU2VsZWN0aW9uLCBpbmRleDogbnVtYmVyLCBhcnJheTogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb25cclxuICAgICAgICBjb25zdCBzZWw6IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24ucGFyZW50SWQpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB0aGlzLl9nZXRNYXRlcmlhbElkRnJvbVBhcmVudCh2YWx1ZS5ub2RlKTtcclxuICAgICAgICByZXR1cm4gKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uO1xyXG4gICAgICB9KTtcclxuICAgIC8vIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBtb21lbnRcclxuICAgIC8vIGdsb2JhbFZhcmlhdGlvbnMuZm9yRWFjaChnID0+IHtcclxuICAgIC8vICAgY29uc3QgcGFyZW50SWR4ID0gc2VsZWN0aW9ucy5maW5kSW5kZXgocyA9PiBzLmRlY29Ob2RlICYmIHMuZGVjb05vZGUuaWQgPT09IGcucGFyZW50SWQpO1xyXG4gICAgLy8gICBpZiAocGFyZW50SWR4KSB7IC8vIHJlbW92ZSBwYXJlbnQgc2VsZWN0aW9uXHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy5zcGxpY2UocGFyZW50SWR4LCAxKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBjb25zdCBpZHggPSBzZWxlY3Rpb25zLmZpbmRJbmRleChzID0+IHMuZGVjb05vZGUgJiYgcy5kZWNvTm9kZS5pZCA9PT0gZy5pZCk7XHJcbiAgICAvLyAgIGlmIChpZHgpIHsgLy8gbW92ZSBnZW5lcmljIHZhcmlhdGlvbnMgdG8gdG9wXHJcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpZHhdO1xyXG4gICAgLy8gICAgIHNlbGVjdGlvbnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy51bnNoaWZ0KHNlbGVjdGlvbik7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG5cclxuICAgIGNvbnN0IHVzZWRWYXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgbGV0IG5ld1BhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgIGxldCBvcHRpb25UZXh0OiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgb3B0aW9uVGV4dCA9IHNlbGVjdGlvbi5xdWVzdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGRlY29Ob2RlID0gc2VsZWN0aW9uLmRlY29Ob2RlO1xyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkub3B0aW9uVGV4dCA9IG9wdGlvblRleHQ7XHJcbiAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb24gYW5kIHNldCBtYXRlcmlhbElkIGluIGNhc2Ugb2YgbXVsdGltYXRlcmlhbFxyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkubWF0ZXJpYWxJZCA9IHRoaXMuX2dldE1hdGVyaWFsSWRGcm9tUGFyZW50KGRlY29Ob2RlLm5vZGVJZCk7XHJcbiAgICAgICAgICBpZiAobGFzdEFkZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucyA9IFtkZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSkge1xyXG4gICAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMucHVzaChkZWNvTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBjb25zdCB2YXJpYXRpb246IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24gPSBuZXcgRnVybml0dXJlUGFydFZhcmlhdGlvbigpO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLkJyYW5kSWQgPSBzZWxlY3Rpb24uZGVjb05vZGUuYnJhbmRJZDtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5EZXNjcmlwdGlvbiA9IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZTtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5NYXRlcmlhbElkID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQ7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uU3VwcGxpZXJBcnRpY2xlTnIgPSAoc2VsZWN0aW9uLmRlY29Ob2RlIGFzIGFueSkuc3VwcGxpZXJBcnRpY2xlTnI7XHJcbiAgICAgICAgICAvLyB1c2VkVmFyaWF0aW9ucy5wdXNoKHZhcmlhdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIGlmICgoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0ICYmXHJcbiAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICAgICAgc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLmxlbmd0aCkgfHwgKGlzQXJ0aWNsZVdpdGhNYXRlcmlhbCkpIHtcclxuICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGUgfHwgKGlzQXJ0aWNsZVdpdGhNYXRlcmlhbCkpIHtcclxuICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICB0aGlzLl9hZGp1c3RhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIGlmICghbGFzdEFkZGVkIHx8IChsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkIHx8IGxhc3RBZGRlZC5ub2RlICE9PSBzZWxlY3Rpb24ubm9kZSkpIHtcclxuICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgIGxhc3RBZGp1c3RhYmxlID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkZGFibGUpIHtcclxuICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBsYXN0QWRqdXN0YWJsZSA/IGxhc3RBZGp1c3RhYmxlLnZhcmlhdGlvbnMgOiBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICBpZiAobGFzdEFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwcmV2aW91c1ByZXNMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZSh0aGlzLmFjdGl2ZUluc3RhbmNlLFxyXG4gICAgLy8gICB7VmFyaWF0aW9uczogdXNlZFZhcmlhdGlvbnN9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEFkanVzdGFibGVzKGNoZWNrR2FtZU9iamVjdDogYm9vbGVhbiA9IHRydWUsIGNoZWNrVHlwZTogYm9vbGVhbiA9IHRydWUpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHtcclxuICAgICAgY29uc3Qgbm9kZTogRGVjb05vZGUgPSBzLmRlY29Ob2RlO1xyXG4gICAgICByZXR1cm4gbm9kZSAmJiAoY2hlY2tHYW1lT2JqZWN0ID8gbm9kZS5nYW1lT2JqZWN0TmFtZSA6IHRydWUpICYmIChjaGVja1R5cGUgPyBub2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0IDogdHJ1ZSkgJiYgbm9kZS5raW5kID09PSBEZWNvTm9kZUtpbmQuQWRqdXN0YWJsZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VmFyaWF0aW9ucygpOiBhbnlbXSB7XHJcbiAgICBpZiAodGhpcy5faU9uZS5kZWNvTm9kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9pT25lLmRlY29Ob2Rlcy5maWx0ZXIoKGRlY286IERlY29Ob2RlKSA9PiB7XHJcbiAgICAgIHJldHVybiBkZWNvLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb247XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUFkanVzdGFibGUoaXRlbTogSXRlbSwgYWRqOiBTZWxlY3Rpb24pOiBDdXN0b21PYmplY3QzRCB7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUoYWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IGFkai5nYW1lT2JqZWN0KSA6IG51bGw7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgIGNvbnN0IG5hbWUgPSBhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUucmVwbGFjZSgvWy5dL2csICcnKTtcclxuICAgICAgb2JqID0gdGhpcy5mdWxsM0RPYmplY3RUb1VzZSA/IHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpIDogbnVsbDtcclxuICAgICAgaWYgKCFvYmopIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYE5vIG9iamVjdCB3aXRoIG5hbWUgJHthZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWV9IGZvdW5kIWApO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgYWRqdXN0YWJsZTogYW55ID0gb2JqLmNsb25lKCk7XHJcbiAgICBhZGp1c3RhYmxlLm5hbWUgPSB0aGlzLl9jcmVhdGVVbmlxdWVOYW1lKGl0ZW0sIG9iaik7XHJcbiAgICBhZGp1c3RhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkajtcclxuICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgYWRqdXN0YWJsZS50cmF2ZXJzZShjID0+IHtcclxuICAgICAgYy52aXNpYmxlID0gIWMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XHJcbiAgICB9KTtcclxuICAgIGl0ZW0uYWRkQ2hpbGQoYWRqdXN0YWJsZSk7XHJcbiAgICAvLyB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIHRvIHRoZSBjdXN0b21GbG9vckdyb3VwIGlzIGJlaW5nIHJlY3JlYXRlZCBzbyB3ZSBsb29zZSB0aGUgcmVmZXJlbmNlXHJcbiAgICAvLyB0aGVyZWZvciB3ZSBuZWVkIHRvIHJldHJpZXZlIHRoZSBjcmVhdGVkIG9iamVjdCBhZ2FpblxyXG4gICAgYWRqdXN0YWJsZSA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkanVzdGFibGUubmFtZSk7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5wdXNoKGFkanVzdGFibGUpO1xyXG4gICAgcmV0dXJuIGFkanVzdGFibGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVBZGRhYmxlKGl0ZW06IEl0ZW0sIGFkZDogU2VsZWN0aW9uLCBwYXJ0Mj86IGFueSwgcGFydDE/OiBhbnkpOiBDdXN0b21PYmplY3QzRCB7XHJcbiAgICBjb25zdCBvYmo6IGFueSA9IHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuZ2V0T2JqZWN0QnlOYW1lKGFkZC5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSk7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VsZWN0aW9uRnJvbUlkKGFkai5hcnROb2RlSWREZWNvKTtcclxuICAgIGNvbnN0IGFkZGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgYWRkYWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShpdGVtLCBvYmopO1xyXG4gICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIGFkZGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlQWRkYWJsZShpdGVtLCBhZGRhYmxlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhZGRhYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcGxhY2VBZGRhYmxlKGl0ZW06IEl0ZW0sIGFkZDogYW55KTogQ3VzdG9tT2JqZWN0M0Qge1xyXG4gICAgaXRlbS5hZGRDaGlsZChhZGQpO1xyXG4gICAgY29uc3QgYWRkYWJsZTogQ3VzdG9tT2JqZWN0M0QgPSBpdGVtLmdldE9iamVjdEJ5TmFtZShhZGQubmFtZSkgYXMgQ3VzdG9tT2JqZWN0M0Q7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5wdXNoKGFkZGFibGUpO1xyXG4gICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVVbmlxdWVOYW1lKGl0ZW06IEl0ZW0sIG9iajogT2JqZWN0M0QpOiBzdHJpbmcge1xyXG4gICAgbGV0IGl0ZXJhdGlvbiA9IDA7XHJcbiAgICBsZXQgbmFtZSA9IGAke2l0ZW0ubmFtZX1fJHtvYmoubmFtZX1gO1xyXG4gICAgbGV0IGV4aXN0aW5nT2JqID0gaXRlbS5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICB3aGlsZSAoZXhpc3RpbmdPYmopIHtcclxuICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgIG5hbWUgPSBgJHtpdGVtLm5hbWV9XyR7b2JqLm5hbWV9YCArIChpdGVyYXRpb24gIT09IDAgPyAoJ18nICsgaXRlcmF0aW9uKSA6ICcnKTtcclxuICAgICAgZXhpc3RpbmdPYmogPSBpdGVtLmdldE9iamVjdEJ5TmFtZShuYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcGxhY2VBZGRhYmxlcyhpdGVtOiBJdGVtKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLmhhc093blByb3BlcnR5KCdzZWxlY3Rpb24nKSAmJiB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb247XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGxlbmE6IG51bWJlciA9IGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXMubGVuZ3RoO1xyXG4gICAgICAgICAgbGV0IGNvbkFkZGFibGU6IGFueTtcclxuICAgICAgICAgIGZvciAobGV0IGlhID0gMDsgaWEgPCBsZW5hOyBpYSsrKSB7XHJcbiAgICAgICAgICAgIFNjZW5lM0RVdGlsLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLnNjZW5lLFxyXG4gICAgICAgICAgICAgIGl0ZW0sIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgKGFkZCwgcGFydDI/LCBwYXJ0MT8pID0+IHRoaXMuX2NyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgaWYgKGNvbkFkZGFibGUpIHtcclxuICAgICAgICAgICAgICBTY2VuZTNEVXRpbC5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5zY2VuZSxcclxuICAgICAgICAgICAgICAgIGl0ZW0sIGNvbkFkZGFibGUsIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLl9jcmVhdGVBZGRhYmxlKGl0ZW0sIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uQWRkYWJsZSA9IHRoaXMuX3BsYWNlZEFkZGFibGVzW3RoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfbG9hZFZhcmlhdGlvbnMoaXRlbTogSXRlbSwgaW5zdGFuY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlVmFyaWF0aW9uT25QYXJ0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvblNlcnZpY2UubG9hZFBhcnQodGhpcy5fYWRqdXN0YWJsZXMsIGluc3RhbmNlSWQsIGl0ZW0sIHRydWUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuX2FkanVzdGFibGVzLCBpbnN0YW5jZUlkLCBpdGVtLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvblNlcnZpY2UubG9hZFZhcmlhdGlvbih0aGlzLl9hZGRhYmxlcywgaW5zdGFuY2VJZCwgaXRlbSwgdHJ1ZSk7XHJcbiAgICB0aGlzLl92YXJpYXRpb25TZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Nob3dXYXJuaW5nKGRhdGE6IEluZm9EaWFsb2dEYXRhKSB7XHJcbiAgICBjb25zdCBkaWFsb2dEYXRhOiBJbmZvRGlhbG9nRGF0YSA9IHtcclxuICAgICAgdGl0bGU6IHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChkYXRhLnRpdGxlKSwgbWVzc2FnZTogdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KGRhdGEubWVzc2FnZSlcclxuICAgIH07XHJcbiAgICB0aGlzLl9kaWFsb2cub3BlbihJbmZvRGlhbG9nQ29tcG9uZW50LCB7ZGF0YTogZGlhbG9nRGF0YX0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlcGFyZVN0YW5kQWxvbmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb2xsaXNpb25NYW5hZ2VyLmNoZWNrQ29sbGlzaW9ucyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLmNhbWVyYVBvc2l0aW9uRml4ZWQpIHtcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5sb2NrQ2FtZXJhKCk7XHJcbiAgICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuZGlzYWJsZVJvdGF0ZUhvcml6b250YWwoKTtcclxuICAgICAgLy8gdGhpcy5fY2FtZXJhU2VydmljZS5kaXNhYmxlUm90YXRlVmVydGljYWwoKTtcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5kaXNhYmxlUGFuKCk7XHJcbiAgICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY29udHJvbHMudGFyZ2V0ID0gbmV3IFZlY3RvcjMoMCwgNTAsIDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NlbmVFdmVudFNlcnZpY2Uucm90YXRlTm9EcmFnID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZWxvYWRNYXRlcmlhbChhbnN3ZXI6IEFuc3dlcik6IHZvaWQge1xyXG4gICAgaWYgKGFuc3dlci5lbGVtZW50VHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbiAmJiBhbnN3ZXIuZ2FtZU9iamVjdCkge1xyXG4gICAgICBjb25zdCB2YXJpYXRpb25EZWNvTm9kZTogRGVjb05vZGUgPSBuZXcgRGVjb05vZGUoKTtcclxuICAgICAgdmFyaWF0aW9uRGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgPSBhbnN3ZXIuZ2FtZU9iamVjdDtcclxuICAgICAgY29uc3QgYWRqdXN0YWJsZXNDbG9uZTogU2VsZWN0aW9uW10gPSB0aGlzLl9hZGp1c3RhYmxlcy5tYXAocyA9PiBPYmplY3QuYXNzaWduKHt9LCBzKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZ2VuZXJpY1NlbGVjdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwKSB7XHJcbiAgICAgICAgICBhZGp1c3RhYmxlc0Nsb25lLmZvckVhY2goKHNlbGVjdGlvbjogU2VsZWN0aW9uKSA9PiBzZWxlY3Rpb24udmFyaWF0aW9ucyA9IFt2YXJpYXRpb25EZWNvTm9kZV0pO1xyXG4gICAgICAgICAgdGhpcy5fdmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLnByZWxvYWRWYXJpYXRpb25zQXN5bmMoYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZS5nYW1lT2JqZWN0TmFtZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3ZhcmlhdGlvblNlcnZpY2UubG9hZFZhcmlhdGlvbihhZGp1c3RhYmxlc0Nsb25lLCAnJywgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMuZm9yRWFjaCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb246IFNlbGVjdGlvbiA9IE9iamVjdFV0aWxzLkdldFNlbGVjdGlvbkZyb21TZWxlY3RlZE9iamVjdCh0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Gcm9tQWRqdXN0YWJsZXM6IFNlbGVjdGlvbiA9IGFkanVzdGFibGVzQ2xvbmVcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcykge1xyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcy52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXTtcclxuICAgICAgICAgICAgICB0aGlzLl92YXJpYXRpb25DYWNoZVNlcnZpY2UucHJlbG9hZFZhcmlhdGlvbnNBc3luYyhhZGp1c3RhYmxlc0Nsb25lWzBdLnNjaGVtYSwgW3ZhcmlhdGlvbkRlY29Ob2RlLmdhbWVPYmplY3ROYW1lXSwgdGhpcy5hcnRpY2xlQXNzZXRQYXRoKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl92YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24oYWRqdXN0YWJsZXNDbG9uZSwgJycsIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRnJvbUFkanVzdGFibGVzOiBTZWxlY3Rpb24gPSB0aGlzLl9hZGp1c3RhYmxlc1xyXG4gICAgICAgICAgICAgIC5maW5kKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4gc2VsZWN0aW9uLm5vZGVJZCA9PT0gY3VycmVudFNlbGVjdGlvbi5ub2RlSWQpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25Gcm9tQWRqdXN0YWJsZXMudmFyaWF0aW9ucyA9IFt2YXJpYXRpb25EZWNvTm9kZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|