@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,1000 @@
|
|
|
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 { Injectable } from '@angular/core';
|
|
11
|
+
import { Item } from '../items/item';
|
|
12
|
+
import { Vector2, Vector3 } from 'three';
|
|
13
|
+
import { SceneEventState } from '../model/scene-event.enum';
|
|
14
|
+
import { Subject } from 'rxjs';
|
|
15
|
+
import { fromEvent } from 'rxjs/internal/observable/fromEvent';
|
|
16
|
+
import { debounceTime, delay, filter, takeUntil } from 'rxjs/operators';
|
|
17
|
+
import { of } from 'rxjs/internal/observable/of';
|
|
18
|
+
import { MessageType } from '../../../core/enum/message-type.enum';
|
|
19
|
+
import { ViewMode } from '../../../core/enum/view-mode.enum';
|
|
20
|
+
import { RelativePositionUtils } from '../../../core/utils/relative-position.utils';
|
|
21
|
+
import { CustomWallFloorItem } from '../items/custom-wall-floor-item';
|
|
22
|
+
import { ItemGroup } from '../items/item-group';
|
|
23
|
+
import { isFloorDecoration, isFloorType, isFurnitureType, isInWallType, isOnFloorType, isWallFloorType, isWallType } from '../items/factory';
|
|
24
|
+
import { InWallItem, WallItem } from '../items/wall-objects';
|
|
25
|
+
import * as i0 from "@angular/core";
|
|
26
|
+
import * as i1 from "./hud.service";
|
|
27
|
+
import * as i2 from "../../../core/service/message-bus.service";
|
|
28
|
+
import * as i3 from "./scene.service";
|
|
29
|
+
import * as i4 from "./drag-and-drop.service";
|
|
30
|
+
import * as i5 from "./rotation.service";
|
|
31
|
+
import * as i6 from "./camera.service";
|
|
32
|
+
import * as i7 from "../../room-planner/components/floorplanner/service/room.service";
|
|
33
|
+
import * as i8 from "./floor.service";
|
|
34
|
+
import * as i9 from "./intersection.service";
|
|
35
|
+
import * as i10 from "../../../core/service/view-mode.service";
|
|
36
|
+
import * as i11 from "./item-group.service";
|
|
37
|
+
import * as i12 from "./item.service";
|
|
38
|
+
import * as i13 from "../../../core/service/homedecorator-app.service";
|
|
39
|
+
import * as i14 from "../../../core/service/homedecorator-app-event.service";
|
|
40
|
+
export class SceneEventService {
|
|
41
|
+
constructor(_hudService, _messageBusService, _sceneService, _dragAndDropService, _rotationService, _cameraService, _roomService, _floorService, _intersectionService, _viewModeService, _itemGroupService, _itemService, _appService, _eventService) {
|
|
42
|
+
this._hudService = _hudService;
|
|
43
|
+
this._messageBusService = _messageBusService;
|
|
44
|
+
this._sceneService = _sceneService;
|
|
45
|
+
this._dragAndDropService = _dragAndDropService;
|
|
46
|
+
this._rotationService = _rotationService;
|
|
47
|
+
this._cameraService = _cameraService;
|
|
48
|
+
this._roomService = _roomService;
|
|
49
|
+
this._floorService = _floorService;
|
|
50
|
+
this._intersectionService = _intersectionService;
|
|
51
|
+
this._viewModeService = _viewModeService;
|
|
52
|
+
this._itemGroupService = _itemGroupService;
|
|
53
|
+
this._itemService = _itemService;
|
|
54
|
+
this._appService = _appService;
|
|
55
|
+
this._eventService = _eventService;
|
|
56
|
+
this.intersectOffsetForWalls = 20;
|
|
57
|
+
this.longTouchDuration = 600;
|
|
58
|
+
this.rotateNoDrag = false;
|
|
59
|
+
this._mousePosition = new Vector2();
|
|
60
|
+
this._oldMousePosition = new Vector2();
|
|
61
|
+
this._rotationStartPoint = null;
|
|
62
|
+
this._defaultCursorStyle = 'pointer';
|
|
63
|
+
this._explorePressed = false;
|
|
64
|
+
this._inDragOver = false;
|
|
65
|
+
this._mouseDown = false;
|
|
66
|
+
this._mouseMoved = false; // has mouse moved since down click
|
|
67
|
+
this._rotateMouseOver = false;
|
|
68
|
+
this._groupingMode = false;
|
|
69
|
+
this._state = SceneEventState.UNSELECTED;
|
|
70
|
+
this._subs = [];
|
|
71
|
+
this._debouncedSaveState = new Subject();
|
|
72
|
+
}
|
|
73
|
+
ngOnDestroy() {
|
|
74
|
+
this._subs.forEach(s => s.unsubscribe());
|
|
75
|
+
this._element = undefined;
|
|
76
|
+
}
|
|
77
|
+
init(element) {
|
|
78
|
+
this._element = element;
|
|
79
|
+
this._controls = this._cameraService.controls;
|
|
80
|
+
this._camera = this._cameraService.camera;
|
|
81
|
+
this._touchStart = fromEvent(element, 'touchstart');
|
|
82
|
+
this._touchEnd = fromEvent(element, 'touchend');
|
|
83
|
+
this._touchCancel = fromEvent(element, 'touchcancel');
|
|
84
|
+
this._touchMove = fromEvent(element, 'touchmove');
|
|
85
|
+
fromEvent(element, 'mousedown')
|
|
86
|
+
.pipe(filter((event) => event.button === 0))
|
|
87
|
+
.subscribe(event => this._leftMouseDownEvent(event));
|
|
88
|
+
fromEvent(element, 'mouseup').subscribe((event) => this._mouseUpEvent(event));
|
|
89
|
+
fromEvent(element, 'mousemove').subscribe((event) => this._mouseMoveEvent(event));
|
|
90
|
+
this._touchStart.subscribe((event) => this._touchStartEvent(event));
|
|
91
|
+
this._touchEnd.subscribe((event) => this._touchEndEvent(event));
|
|
92
|
+
this._touchCancel.subscribe((event) => this._touchEndEvent(event));
|
|
93
|
+
this._touchMove.subscribe((event) => this._touchMoveEvent(event));
|
|
94
|
+
fromEvent(window, 'keydown').subscribe((event) => this._keyDownEvent(event));
|
|
95
|
+
fromEvent(element, 'dragenter').subscribe((event) => this._dragEnterEvent(event));
|
|
96
|
+
fromEvent(element, 'dragexit').subscribe((event) => this._dragExitEvent(event));
|
|
97
|
+
fromEvent(element, 'dragover').subscribe((event) => this._dragOverEvent(event));
|
|
98
|
+
fromEvent(element, 'drop').subscribe(event => this._onDrop(event));
|
|
99
|
+
this._subs.push(this._messageBusService.subscribe(MessageType.SetDrag, (data) => {
|
|
100
|
+
if (data instanceof Item) {
|
|
101
|
+
this._dragAndDropService.draggedData = {
|
|
102
|
+
name: data.name,
|
|
103
|
+
type: data.metadata.itemType
|
|
104
|
+
};
|
|
105
|
+
this._dragAndDropService.draggedItem = data;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this._dragAndDropService.draggedData = data;
|
|
109
|
+
}
|
|
110
|
+
}), this._messageBusService.subscribe(MessageType.StartDrag, ({ x, y, z }) => this.startDragging(x, y, z)), this._messageBusService.subscribe(MessageType.ExitDrag, () => this._dragExitEvent(event)), this._messageBusService.subscribe(MessageType.PlaceOnTouch, () => this._initPlaceOnTouchRequest()), this._debouncedSaveState.pipe(debounceTime(800)).subscribe((action) => {
|
|
111
|
+
this._messageBusService.emit(MessageType.SaveState, { action: `3D ${action}` });
|
|
112
|
+
}), this._debouncedSaveState.pipe(debounceTime(200)).subscribe(() => {
|
|
113
|
+
this._hudService.updateLabelMeasurements();
|
|
114
|
+
}), this._viewModeService.viewModeChanged.subscribe(mode => this.setExploreMode(mode === ViewMode.WalkThrough)), this._itemGroupService.objectAdded.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.grouped.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.ungrouped.subscribe(() => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.ItemRemoved, () => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.StartGroupObject, () => this._setGroupingMode(true)));
|
|
115
|
+
}
|
|
116
|
+
setExploreMode(on = true) {
|
|
117
|
+
if (on) {
|
|
118
|
+
this._switchState(SceneEventState.EXPLORE);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this._switchState(SceneEventState.UNSELECTED);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
setSelectedObject(object, mesh) {
|
|
125
|
+
if (this._state === SceneEventState.UNSELECTED && object) {
|
|
126
|
+
this._switchState(SceneEventState.SELECTED);
|
|
127
|
+
}
|
|
128
|
+
if (this._selectedObject != null && this._selectedObject !== object) {
|
|
129
|
+
this._selectedObject.setUnselected();
|
|
130
|
+
}
|
|
131
|
+
if (object) {
|
|
132
|
+
if (object instanceof ItemGroup) {
|
|
133
|
+
this._setSelectObject(object);
|
|
134
|
+
this._itemGroupService.selectedGroup = object;
|
|
135
|
+
}
|
|
136
|
+
else if (object.parent instanceof ItemGroup) {
|
|
137
|
+
this._setSelectObject(object.parent);
|
|
138
|
+
this._itemGroupService.selectedGroup = object.parent;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this._setSelectObject(object, mesh);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
if (this._selectedObject) {
|
|
146
|
+
this._selectedObject.setUnselected();
|
|
147
|
+
this._messageBusService.emit(MessageType.ItemUnselected, this._selectedObject);
|
|
148
|
+
this._selectedObject = null;
|
|
149
|
+
}
|
|
150
|
+
this._prevSelectedObject = null;
|
|
151
|
+
}
|
|
152
|
+
this._markSceneToUpdate();
|
|
153
|
+
}
|
|
154
|
+
startDragging(x, y, z) {
|
|
155
|
+
const draggedData = this._getDraggedData();
|
|
156
|
+
if (!this._dragAndDropService.draggedStatus.allowedNew || !draggedData) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this._switchState(SceneEventState.DND);
|
|
160
|
+
this._dragAndDropService.draggedStatus.dragEnter();
|
|
161
|
+
const vec3 = z ? new Vector3(x, y, z) : this.intersectingVec3(new Vector2(x, y));
|
|
162
|
+
if (this._dragAndDropService.draggedItem) {
|
|
163
|
+
this._dragAndDropService.draggedStatus.objectLoaded();
|
|
164
|
+
this._dragAndDropService.updateDraggedPosition(vec3);
|
|
165
|
+
}
|
|
166
|
+
else if (isFurnitureType(draggedData.type) || isWallType(draggedData.type)) {
|
|
167
|
+
this._dragAndDropService.dragModel(vec3, this._floorIntersection(this._sceneService.positionInSceneToScreen(vec3)));
|
|
168
|
+
}
|
|
169
|
+
else if (isFloorDecoration(draggedData.type)) {
|
|
170
|
+
this._dragAndDropService.dragFloorDecoration(this._floorIntersection(this._sceneService.positionInSceneToScreen(vec3)));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
intersectingVec3(vec2, intersection) {
|
|
174
|
+
if (!intersection) {
|
|
175
|
+
const gIntersections = this._groundIntersections(vec2);
|
|
176
|
+
return gIntersections && gIntersections[0] && gIntersections[0].point;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
return intersection.point;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
_isRotating() {
|
|
183
|
+
return this._state === SceneEventState.ROTATING && (!this._appService.sku || this._viewModeService.viewMode === ViewMode.InPhotoView);
|
|
184
|
+
}
|
|
185
|
+
_keyDownEvent(event) {
|
|
186
|
+
if (event.key === 'Escape') {
|
|
187
|
+
this._cancelDragDrop();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
_dragEnterEvent(event) {
|
|
191
|
+
event.preventDefault();
|
|
192
|
+
const mousePos = RelativePositionUtils.GetClientMousePosition(event);
|
|
193
|
+
this.startDragging(mousePos.x, mousePos.y);
|
|
194
|
+
}
|
|
195
|
+
_dragExitEvent(event) {
|
|
196
|
+
if (event) {
|
|
197
|
+
event.preventDefault();
|
|
198
|
+
}
|
|
199
|
+
const draggedData = this._getDraggedData();
|
|
200
|
+
if (draggedData) {
|
|
201
|
+
this._dragAndDropService.finishDragging();
|
|
202
|
+
this._switchState(SceneEventState.UNSELECTED);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
_dragOverEvent(event) {
|
|
206
|
+
event.preventDefault();
|
|
207
|
+
if (this._state !== SceneEventState.DND || this._inDragOver) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
this._inDragOver = true;
|
|
211
|
+
this._dragAndDropService.draggedStatus.dragOver();
|
|
212
|
+
const canvas = event.currentTarget;
|
|
213
|
+
const mousePos = RelativePositionUtils.GetClientMousePosition(event);
|
|
214
|
+
this._mousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
|
|
215
|
+
const draggedData = this._dragAndDropService.draggedData;
|
|
216
|
+
let intersection = this._wallIntersection(this._mousePosition);
|
|
217
|
+
const intersectedFloor = this._floorIntersection(this._mousePosition);
|
|
218
|
+
this._dragAndDropService.intersectedWall = intersection;
|
|
219
|
+
this._dragAndDropService.intersectedFloor = intersectedFloor;
|
|
220
|
+
this._intersectedWall = undefined;
|
|
221
|
+
this._intersectedFloor = undefined;
|
|
222
|
+
if (isWallType(draggedData.type) || (isWallFloorType(draggedData.type) && intersection)) {
|
|
223
|
+
if (intersection) {
|
|
224
|
+
this._intersectedWall = intersection;
|
|
225
|
+
}
|
|
226
|
+
if (intersection && !isFurnitureType(draggedData.type)) {
|
|
227
|
+
this._acceptDrop(event);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else if (isFloorType(draggedData.type) || isFloorDecoration(draggedData.type) || (isWallFloorType(draggedData.type) && intersectedFloor)) {
|
|
231
|
+
this._intersectedFloor = intersection = this._floorIntersection(this._mousePosition);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
if (event.dataTransfer) {
|
|
235
|
+
event.dataTransfer.dropEffect = 'move';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const intersectedPoint = this.intersectingVec3(this._mousePosition, intersection);
|
|
239
|
+
if (intersectedPoint) {
|
|
240
|
+
this._dragAndDropService.updateDraggedPosition(intersectedPoint);
|
|
241
|
+
this._acceptDrop(event);
|
|
242
|
+
this._markSceneToUpdate();
|
|
243
|
+
}
|
|
244
|
+
this._inDragOver = false;
|
|
245
|
+
}
|
|
246
|
+
_onDrop(event) {
|
|
247
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
+
event.preventDefault();
|
|
249
|
+
if (this._state !== SceneEventState.DND) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const canvas = event.currentTarget;
|
|
253
|
+
const mousePos = RelativePositionUtils.GetClientMousePosition(event);
|
|
254
|
+
this._mousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
|
|
255
|
+
const draggedData = this._dragAndDropService.draggedData;
|
|
256
|
+
let position = null;
|
|
257
|
+
let intersection = null;
|
|
258
|
+
if (isWallType(draggedData.type) || (isWallFloorType(draggedData.type) && this._intersectedWall)) {
|
|
259
|
+
position = this._intersectedWall && this._intersectedWall.point;
|
|
260
|
+
intersection = this._intersectedWall;
|
|
261
|
+
}
|
|
262
|
+
else if (isFloorType(draggedData.type) || isFloorDecoration(draggedData.type) || (isWallFloorType(draggedData.type) && this._intersectedFloor)) {
|
|
263
|
+
position = this._intersectedFloor && this._intersectedFloor.point;
|
|
264
|
+
intersection = this._intersectedFloor;
|
|
265
|
+
}
|
|
266
|
+
if (position) {
|
|
267
|
+
const intersectedPoint = this.intersectingVec3(this._mousePosition, intersection);
|
|
268
|
+
this._dragAndDropService.draggedPlaced(intersectedPoint, intersection);
|
|
269
|
+
this._messageBusService.emit(MessageType.SaveState, { action: 'item added' });
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
this._cancelDragDrop();
|
|
273
|
+
}
|
|
274
|
+
if (!this._dragAndDropService.draggedStatus.isObjectLoaded) {
|
|
275
|
+
this._dragAndDropService.draggedStatus.markToCleanUp();
|
|
276
|
+
this._releaseState(draggedData);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
this._releaseState(draggedData);
|
|
280
|
+
this._dragAndDropService.finishDragging();
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
_cancelDragDrop() {
|
|
285
|
+
this._dragAndDropService.draggedStatus.dragCanceled();
|
|
286
|
+
this._dragAndDropService.finishDragging();
|
|
287
|
+
this._switchState(SceneEventState.SELECTED);
|
|
288
|
+
this._messageBusService.emit(MessageType.FinishedIOneFurnitureBuild);
|
|
289
|
+
}
|
|
290
|
+
_mouseUpEvent(event) {
|
|
291
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
292
|
+
this._mouseDown = false;
|
|
293
|
+
if (this._state === SceneEventState.DND) {
|
|
294
|
+
return this._onDrop(event);
|
|
295
|
+
}
|
|
296
|
+
switch (this._state) {
|
|
297
|
+
case SceneEventState.DRAGGING:
|
|
298
|
+
case SceneEventState.DRAGGINGCONNECTOR:
|
|
299
|
+
this._switchState(SceneEventState.SELECTED);
|
|
300
|
+
if (this._selectedObject) {
|
|
301
|
+
this._dragAndDropService.clickReleased();
|
|
302
|
+
if (this._selectedObject instanceof Item) {
|
|
303
|
+
this._selectedObject.endDrag();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
break;
|
|
307
|
+
case SceneEventState.ROTATING:
|
|
308
|
+
if (this._selectedObject) {
|
|
309
|
+
this._dragAndDropService.clickReleased();
|
|
310
|
+
this._messageBusService.emit(MessageType.SaveState, { action: 'item rotated' });
|
|
311
|
+
}
|
|
312
|
+
this._switchState(SceneEventState.SELECTED);
|
|
313
|
+
break;
|
|
314
|
+
case SceneEventState.UNSELECTED:
|
|
315
|
+
if (!this._selectedObject && !this._mouseMoved) {
|
|
316
|
+
this._checkWallsAndFloors(event);
|
|
317
|
+
}
|
|
318
|
+
break;
|
|
319
|
+
case SceneEventState.SELECTED:
|
|
320
|
+
if (!this._selectedObject && !this._mouseMoved) {
|
|
321
|
+
this._checkWallsAndFloors(event);
|
|
322
|
+
}
|
|
323
|
+
if (this._intersectedObject == null && !this._mouseMoved) {
|
|
324
|
+
this._switchState(SceneEventState.UNSELECTED);
|
|
325
|
+
}
|
|
326
|
+
break;
|
|
327
|
+
case SceneEventState.EXPLORE:
|
|
328
|
+
yield this._navigateExplore();
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
_navigateExplore() {
|
|
334
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
335
|
+
this._overrideDefaultCursorStyle('pointer');
|
|
336
|
+
const point = this._pointOnFloor(this._mousePosition);
|
|
337
|
+
if (point) {
|
|
338
|
+
const distance = this._camera.position.distanceTo(point);
|
|
339
|
+
this._hudService.exploreFloorHover(this._mousePosition, point, distance);
|
|
340
|
+
if (!this._mouseMoved) {
|
|
341
|
+
yield this._hudService.confirmExplore();
|
|
342
|
+
yield this._cameraService.controls.animateMoveTo(point);
|
|
343
|
+
this._updateExplorePoint();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
_initPlaceOnTouchRequest() {
|
|
349
|
+
if (this._dragAndDropService.draggedStatus.allowedNew && this._getDraggedData()) {
|
|
350
|
+
this._switchState(SceneEventState.DND);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
_touchEndEvent(event) {
|
|
354
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
355
|
+
if (this._isMouseEventAllowed(event)) {
|
|
356
|
+
this._mouseDown = false;
|
|
357
|
+
switch (this._state) {
|
|
358
|
+
case SceneEventState.SELECTED:
|
|
359
|
+
case SceneEventState.UNSELECTED:
|
|
360
|
+
if (!this._mouseMoved) {
|
|
361
|
+
this._updateIntersections();
|
|
362
|
+
if (this._intersectedObject) {
|
|
363
|
+
this._itemGroupService.resetObjectsToGroup();
|
|
364
|
+
this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
|
|
365
|
+
this._addToItemGroup(this._intersectedObject);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
break;
|
|
369
|
+
case SceneEventState.DRAGGING:
|
|
370
|
+
if (this._selectedObject) {
|
|
371
|
+
this._dragAndDropService.clickReleased();
|
|
372
|
+
}
|
|
373
|
+
this._switchState(SceneEventState.SELECTED);
|
|
374
|
+
break;
|
|
375
|
+
case SceneEventState.ROTATING:
|
|
376
|
+
this._switchState(SceneEventState.SELECTED);
|
|
377
|
+
if (this._selectedObject) {
|
|
378
|
+
this._dragAndDropService.clickReleased();
|
|
379
|
+
this._messageBusService.emit(MessageType.SaveState, { action: 'item rotated' });
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
case SceneEventState.EXPLORE:
|
|
383
|
+
if (!this._mouseMoved) {
|
|
384
|
+
yield this._navigateExplore();
|
|
385
|
+
}
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
_touchMoveEvent(event) {
|
|
392
|
+
if (this._state === SceneEventState.DND) {
|
|
393
|
+
return this._dragOverEvent.bind(this)(event);
|
|
394
|
+
}
|
|
395
|
+
if (this._isMouseEventAllowed(event)) {
|
|
396
|
+
this._setMousePositionFromTouchEvent(event);
|
|
397
|
+
this._mouseMoved = true;
|
|
398
|
+
if (!this._mouseDown) {
|
|
399
|
+
this._updateIntersections();
|
|
400
|
+
}
|
|
401
|
+
switch (this._state) {
|
|
402
|
+
case SceneEventState.UNSELECTED:
|
|
403
|
+
this._updateMouseover();
|
|
404
|
+
break;
|
|
405
|
+
case SceneEventState.SELECTED:
|
|
406
|
+
this._updateMouseover();
|
|
407
|
+
this._hudService.cameraRotation();
|
|
408
|
+
break;
|
|
409
|
+
case SceneEventState.DRAGGING:
|
|
410
|
+
case SceneEventState.ROTATING:
|
|
411
|
+
this._clickDragged();
|
|
412
|
+
this._markSceneToUpdate();
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
_clearIntersectedObject() {
|
|
418
|
+
this._intersectedMesh = null;
|
|
419
|
+
this._intersectedObject = null;
|
|
420
|
+
}
|
|
421
|
+
_toggleRotationHudIntersection(on) {
|
|
422
|
+
if (this._hudService.isMouseOver() !== on) {
|
|
423
|
+
this._rotateMouseOver = on;
|
|
424
|
+
this._hudService.setMouseOver(on);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
_updateIntersections() {
|
|
428
|
+
const intersects = this._getIntersections(this._mousePosition, this._itemService.getObjectPlanes(), { onlyVisible: true, includeFloors: false });
|
|
429
|
+
const wallIntersect = this._wallIntersection(this._mousePosition);
|
|
430
|
+
// object intersection is prioritized
|
|
431
|
+
if (intersects.length > 0 &&
|
|
432
|
+
((wallIntersect && wallIntersect.distance + this.intersectOffsetForWalls > intersects[0].distance) || !wallIntersect)) {
|
|
433
|
+
this._toggleRotationHudIntersection(false);
|
|
434
|
+
this._setIntersectedObject(intersects[0].object);
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
this._clearIntersectedObject();
|
|
438
|
+
const snapperArea = this._hudService.getRotationSnapperArea();
|
|
439
|
+
if (snapperArea === null) {
|
|
440
|
+
// check if intersects with configurable floor
|
|
441
|
+
const floorIntersects = this._getIntersections(this._mousePosition, this._itemService.getObjectPlanes(), { onlyVisible: true, includeFloor: true, onlyConfigurableFloors: true });
|
|
442
|
+
if (floorIntersects.length > 0) {
|
|
443
|
+
this._toggleRotationHudIntersection(false);
|
|
444
|
+
this._setIntersectedObject(floorIntersects[0].object);
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
const hudIntersects = this._getIntersections(this._mousePosition, [snapperArea], { recursive: true });
|
|
451
|
+
if (hudIntersects.length > 0) {
|
|
452
|
+
this._toggleRotationHudIntersection(true);
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
this._toggleRotationHudIntersection(false);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// returns the first intersection object
|
|
460
|
+
_itemIntersection(vec2, item) {
|
|
461
|
+
let intersections = null;
|
|
462
|
+
if (!item.metadata) {
|
|
463
|
+
intersections = this._getIntersections(vec2, [item], { filterByNormals: true });
|
|
464
|
+
}
|
|
465
|
+
else if (isWallFloorType(item.metadata.itemType)) {
|
|
466
|
+
intersections = this._getIntersections(vec2, this._roomService.wallEdgePlanes(), { filterByNormals: true });
|
|
467
|
+
if (!intersections || intersections.length === 0) {
|
|
468
|
+
intersections = this._getIntersections(vec2, [this._floorService.groundPlane], {});
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
else if (isWallType(item.metadata.itemType)) {
|
|
472
|
+
intersections = this._getIntersections(vec2, this._roomService.wallEdgePlanes(), { filterByNormals: true });
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
intersections = this._getIntersections(vec2, [this._floorService.groundPlane], {});
|
|
476
|
+
}
|
|
477
|
+
if (intersections && intersections.length > 0) {
|
|
478
|
+
return intersections[0];
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
return null;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
// filter by normals will only return objects facing the camera
|
|
485
|
+
_getIntersections(mousePos, objects, options) {
|
|
486
|
+
const mouseVector = this._mouseToVec3(mousePos);
|
|
487
|
+
return this._intersectionService.getIntersections(mouseVector, objects, options);
|
|
488
|
+
}
|
|
489
|
+
_setMousePositionFromTouchEvent(event) {
|
|
490
|
+
const touch = event.touches[0];
|
|
491
|
+
if (touch) {
|
|
492
|
+
const canvas = event.target;
|
|
493
|
+
this._mousePosition.set(touch.pageX - (canvas ? canvas.offsetLeft : 0), touch.pageY - (canvas ? canvas.offsetTop : 0));
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
_touchStartEvent(event) {
|
|
497
|
+
if (this._isMouseEventAllowed(event)) {
|
|
498
|
+
const longTouch = of(1)
|
|
499
|
+
.pipe(delay(this.longTouchDuration))
|
|
500
|
+
.pipe(takeUntil(this._touchStart))
|
|
501
|
+
.pipe(takeUntil(this._touchEnd))
|
|
502
|
+
.pipe(takeUntil(this._touchCancel));
|
|
503
|
+
longTouch.subscribe(() => {
|
|
504
|
+
this._updateIntersections();
|
|
505
|
+
if (this._intersectedObject && !this._mouseMoved) {
|
|
506
|
+
this._addToItemGroup(this._intersectedObject, this._prevSelectedObject);
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
this._mouseMoved = false;
|
|
510
|
+
this._mouseDown = true;
|
|
511
|
+
this._setMousePositionFromTouchEvent(event);
|
|
512
|
+
switch (this._state) {
|
|
513
|
+
case SceneEventState.SELECTED:
|
|
514
|
+
this._updateIntersections();
|
|
515
|
+
if (this._rotateMouseOver || this.rotateNoDrag) {
|
|
516
|
+
this._switchState(SceneEventState.ROTATING);
|
|
517
|
+
const itemIntersection = this._itemIntersection(this._mousePosition, this._selectedObject);
|
|
518
|
+
if (itemIntersection) {
|
|
519
|
+
this._rotationStartPoint = itemIntersection.point;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
else if (this._intersectedObject) {
|
|
523
|
+
this._prevSelectedObject = this._selectedObject;
|
|
524
|
+
if (!this._intersectedObject.fixed) {
|
|
525
|
+
this._switchState(SceneEventState.DRAGGING);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
break;
|
|
529
|
+
case SceneEventState.DND:
|
|
530
|
+
this._onDrop(event);
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
_leftMouseDownEvent(event) {
|
|
536
|
+
if (this._isMouseEventAllowed(event)) {
|
|
537
|
+
if (event) {
|
|
538
|
+
event.preventDefault();
|
|
539
|
+
}
|
|
540
|
+
const canvas = event.currentTarget;
|
|
541
|
+
const mousePos = RelativePositionUtils.GetClientMousePosition(event);
|
|
542
|
+
this._oldMousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
|
|
543
|
+
this._mouseMoved = false;
|
|
544
|
+
this._mouseDown = true;
|
|
545
|
+
switch (this._state) {
|
|
546
|
+
case SceneEventState.SELECTED:
|
|
547
|
+
if (this._rotateMouseOver) {
|
|
548
|
+
if (this._selectedObject) {
|
|
549
|
+
this._switchState(SceneEventState.ROTATING);
|
|
550
|
+
const itemIntersection = this._itemIntersection(this._mousePosition, this._selectedObject);
|
|
551
|
+
if (itemIntersection) {
|
|
552
|
+
this._rotationStartPoint = itemIntersection.point;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
else if (this._intersectedObject) {
|
|
557
|
+
if (this._intersectedMesh && this._intersectedMesh.name && this._intersectedMesh.name.toLowerCase().startsWith('c_')) {
|
|
558
|
+
this._switchState(SceneEventState.DRAGGINGCONNECTOR);
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
if (!event.ctrlKey) {
|
|
562
|
+
if (this._groupingMode) {
|
|
563
|
+
this._addToItemGroup(this._intersectedObject, this._selectedObject);
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
this._itemGroupService.resetObjectsToGroup();
|
|
567
|
+
this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
this._addToItemGroup(this._intersectedObject, this._selectedObject);
|
|
572
|
+
}
|
|
573
|
+
if (!this._intersectedObject.fixed && !this.rotateNoDrag) {
|
|
574
|
+
this._switchState(SceneEventState.DRAGGING);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
break;
|
|
579
|
+
case SceneEventState.UNSELECTED:
|
|
580
|
+
const floor = this._floorIntersection(this._mousePosition);
|
|
581
|
+
if (floor) {
|
|
582
|
+
if (floor.object.parent && floor.object.parent instanceof Item && floor.object.parent.configurable) {
|
|
583
|
+
this._setIntersectedObject(floor.object);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
if (this._intersectedObject) {
|
|
587
|
+
this._itemGroupService.resetObjectsToGroup();
|
|
588
|
+
this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
|
|
589
|
+
if (!this._intersectedObject.fixed) {
|
|
590
|
+
if (this.rotateNoDrag) {
|
|
591
|
+
const itemIntersection = this._itemIntersection(this._mousePosition, this._selectedObject);
|
|
592
|
+
if (itemIntersection) {
|
|
593
|
+
this._rotationStartPoint = itemIntersection.point;
|
|
594
|
+
}
|
|
595
|
+
this._switchState(SceneEventState.ROTATING);
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
this._switchState(SceneEventState.DRAGGING);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
break;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
_overrideDefaultCursorStyle(style) {
|
|
607
|
+
this._defaultCursorStyle = style;
|
|
608
|
+
this._setCursorStyle(this._defaultCursorStyle);
|
|
609
|
+
}
|
|
610
|
+
_setGroupingMode(enableGrouping) {
|
|
611
|
+
this._groupingMode = enableGrouping;
|
|
612
|
+
this._addToItemGroup(this._intersectedObject, this._prevSelectedObject);
|
|
613
|
+
}
|
|
614
|
+
_getDraggedData() {
|
|
615
|
+
return this._dragAndDropService.draggedData;
|
|
616
|
+
}
|
|
617
|
+
_clickPressed(vec2) {
|
|
618
|
+
const vec = vec2 || this._mousePosition;
|
|
619
|
+
if (this._selectedObject) {
|
|
620
|
+
const intersection = this._itemIntersection(vec, this._selectedObject);
|
|
621
|
+
if (intersection) {
|
|
622
|
+
this._dragAndDropService.draggedItem = this._selectedObject;
|
|
623
|
+
this._dragAndDropService.setDragOffset(intersection.point);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
_clickConnectorPressed(vec2) {
|
|
628
|
+
const vec = vec2 || this._mousePosition;
|
|
629
|
+
if (this._intersectedMesh) {
|
|
630
|
+
const intersections = this._getIntersections(vec, [this._intersectedMesh, this._floorService.groundPlane]);
|
|
631
|
+
if (intersections && intersections.length > 1 && intersections.find(i => i.object.name === this._intersectedMesh.name)) {
|
|
632
|
+
const groundPlane = intersections.find(i => i.object.name === 'ground-plane');
|
|
633
|
+
if (groundPlane) {
|
|
634
|
+
this._dragAndDropService.setDragOffset(groundPlane.point, false);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
_clickDragged() {
|
|
640
|
+
if (this._selectedObject && !this._selectedObject.locked) {
|
|
641
|
+
const intersection = this._itemIntersection(this._mousePosition, this._selectedObject);
|
|
642
|
+
if (intersection) {
|
|
643
|
+
if (this._isRotating()) {
|
|
644
|
+
this._rotationStartPoint =
|
|
645
|
+
this._rotationService.rotate(this._selectedObject, this._rotationStartPoint, intersection.point, !this.rotateNoDrag);
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
this._dragAndDropService.clickDragged(intersection);
|
|
649
|
+
this._messageBusService.emit(MessageType.ClickDragged);
|
|
650
|
+
this._debouncedSaveState.next('item dragged');
|
|
651
|
+
}
|
|
652
|
+
this._hudService.update();
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
_dragConnector() {
|
|
657
|
+
if (this._selectedObject && !this._selectedObject.locked) {
|
|
658
|
+
// const intersections = this._getIntersections(this._mousePosition, [this._floorService.groundPlane], {});
|
|
659
|
+
// if (intersections && intersections.length === 1) {
|
|
660
|
+
// this._dragAndDropService.dragConnector(this._intersectedMesh, intersections[0].point);
|
|
661
|
+
// }
|
|
662
|
+
this._dragAndDropService.dragConnector(this._intersectedMesh, this._mouseToVec3(this._mousePosition));
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
_checkWallsAndFloors(event) {
|
|
666
|
+
if (this._state === SceneEventState.UNSELECTED && this._mouseoverObject == null) {
|
|
667
|
+
const wall = this._wallIntersection(this._mousePosition);
|
|
668
|
+
if (wall) {
|
|
669
|
+
const edge = wall.object.userData.edge;
|
|
670
|
+
this._roomService.selectWall(event, edge.wall, edge);
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
const floor = this._floorIntersection(this._mousePosition);
|
|
674
|
+
if (floor) {
|
|
675
|
+
const room = floor.object.userData.room;
|
|
676
|
+
this._roomService.selectFloor(event, room);
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
_wallIntersection(vec2) {
|
|
682
|
+
const intersections = this._wallIntersections(vec2);
|
|
683
|
+
if (intersections && intersections.length > 0) {
|
|
684
|
+
return intersections[0];
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
return null;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
_wallIntersections(vec2) {
|
|
691
|
+
const wallEdgePlanes = this._roomService.wallEdgePlanes();
|
|
692
|
+
return this._getIntersections(vec2, wallEdgePlanes, { filterByNormals: true });
|
|
693
|
+
}
|
|
694
|
+
_edgeIntersections(vec2) {
|
|
695
|
+
const edges = this._roomService.floorPlanes();
|
|
696
|
+
return this._getIntersections(vec2, edges, { filterByNormals: true });
|
|
697
|
+
}
|
|
698
|
+
_groundIntersections(vec2) {
|
|
699
|
+
return this._getIntersections(vec2, [this._floorService.groundPlane], { filterByNormals: true });
|
|
700
|
+
}
|
|
701
|
+
_wallEdgeIntersected(intersectedWalls, intersectedEdges) {
|
|
702
|
+
const walls = intersectedEdges.map((i) => i.object.userData.wall);
|
|
703
|
+
const filteredWalls = intersectedWalls.filter((intersectedWall) => {
|
|
704
|
+
const wall = intersectedWall.object.userData.edge && intersectedWall.object.userData.edge.wall;
|
|
705
|
+
return walls.indexOf(wall) !== -1;
|
|
706
|
+
});
|
|
707
|
+
return filteredWalls.length > 0;
|
|
708
|
+
}
|
|
709
|
+
_floorIntersection(vec2) {
|
|
710
|
+
const floorPlanes = this._roomService.floorPlanes();
|
|
711
|
+
const floorIntersects = this._getIntersections(vec2, floorPlanes, { filterByNormals: false, includeFloors: true });
|
|
712
|
+
if (floorIntersects.length > 0) {
|
|
713
|
+
return floorIntersects[0];
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
return null;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
_pointOnFloor(vec2) {
|
|
720
|
+
if (this._intersectedObject &&
|
|
721
|
+
!(isOnFloorType(this._intersectedObject.userData.itemType) || isInWallType(this._intersectedObject.userData.itemType))) {
|
|
722
|
+
return null;
|
|
723
|
+
}
|
|
724
|
+
const intersectedFloor = this._floorIntersection(vec2);
|
|
725
|
+
if (!intersectedFloor) {
|
|
726
|
+
return null;
|
|
727
|
+
}
|
|
728
|
+
const intersectedWalls = this._wallIntersections(vec2);
|
|
729
|
+
if (!intersectedWalls.length) {
|
|
730
|
+
return intersectedFloor.point;
|
|
731
|
+
}
|
|
732
|
+
const intersectedEdges = this._edgeIntersections(vec2);
|
|
733
|
+
if (this._wallEdgeIntersected(intersectedWalls, intersectedEdges)) {
|
|
734
|
+
return null;
|
|
735
|
+
}
|
|
736
|
+
return intersectedFloor.point;
|
|
737
|
+
}
|
|
738
|
+
_isMouseEventAllowed(event) {
|
|
739
|
+
return event ? (event.target && event.target.nodeName === 'CANVAS') : true;
|
|
740
|
+
}
|
|
741
|
+
_mouseMoveEvent(event) {
|
|
742
|
+
if (this._state === SceneEventState.DND) {
|
|
743
|
+
return this._dragOverEvent.bind(this)(event);
|
|
744
|
+
}
|
|
745
|
+
if (this._isMouseEventAllowed(event)) {
|
|
746
|
+
const mousePos = event ? RelativePositionUtils.GetClientMousePosition(event) : this._mousePosition;
|
|
747
|
+
let canvas;
|
|
748
|
+
if (event) {
|
|
749
|
+
event.preventDefault();
|
|
750
|
+
canvas = event.currentTarget;
|
|
751
|
+
}
|
|
752
|
+
this._mousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
|
|
753
|
+
if (this._oldMousePosition.x !== mousePos.x && this._oldMousePosition.y !== mousePos.y) {
|
|
754
|
+
this._mouseMoved = true;
|
|
755
|
+
}
|
|
756
|
+
if (!this._mouseDown) {
|
|
757
|
+
this._updateIntersections();
|
|
758
|
+
}
|
|
759
|
+
else {
|
|
760
|
+
this._dragAndDropService.intersectedWall = this._wallIntersection(this._mousePosition);
|
|
761
|
+
this._dragAndDropService.intersectedFloor = this._floorIntersection(this._mousePosition);
|
|
762
|
+
}
|
|
763
|
+
if (this.rotateNoDrag) {
|
|
764
|
+
this._controls.enabled = true;
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
switch (this._state) {
|
|
768
|
+
case SceneEventState.UNSELECTED:
|
|
769
|
+
this._updateMouseover();
|
|
770
|
+
break;
|
|
771
|
+
case SceneEventState.SELECTED:
|
|
772
|
+
if (this._mouseDown && this._mouseMoved) {
|
|
773
|
+
this._hudService.cameraRotation();
|
|
774
|
+
}
|
|
775
|
+
this._updateMouseover();
|
|
776
|
+
break;
|
|
777
|
+
case SceneEventState.EXPLORE:
|
|
778
|
+
this._hudService.stopExplore();
|
|
779
|
+
if (this._mouseDown) {
|
|
780
|
+
this._setCursorStyle('move');
|
|
781
|
+
}
|
|
782
|
+
else {
|
|
783
|
+
this._explorePressed = false;
|
|
784
|
+
if (!this._mouseoverObject) {
|
|
785
|
+
this._updateExplorePoint();
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
break;
|
|
789
|
+
case SceneEventState.DRAGGING:
|
|
790
|
+
case SceneEventState.ROTATING:
|
|
791
|
+
this._clickDragged();
|
|
792
|
+
this._markSceneToUpdate();
|
|
793
|
+
this._eventService.objectMovingOrRotating.next();
|
|
794
|
+
break;
|
|
795
|
+
case SceneEventState.DRAGGINGCONNECTOR:
|
|
796
|
+
this._dragConnector();
|
|
797
|
+
break;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
_updateExplorePoint() {
|
|
802
|
+
const point = this._pointOnFloor(this._mousePosition);
|
|
803
|
+
if (point) {
|
|
804
|
+
this._setCursorStyle('pointer');
|
|
805
|
+
const distance = this._camera.position.distanceTo(point);
|
|
806
|
+
this._hudService.exploreFloorHover(this._mousePosition, point, distance);
|
|
807
|
+
}
|
|
808
|
+
else {
|
|
809
|
+
this._setCursorStyle('crosshair');
|
|
810
|
+
this._hudService.stopExplore();
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
_updateExploreIndicator() {
|
|
814
|
+
this._hudService.stopExplore();
|
|
815
|
+
const point = this._pointOnFloor(this._mousePosition);
|
|
816
|
+
if (point) {
|
|
817
|
+
this._setCursorStyle('pointer');
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
this._setCursorStyle('crosshair');
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
_acceptDrop(event) {
|
|
824
|
+
if (event.dataTransfer && event.dataTransfer.dropEffect) {
|
|
825
|
+
event.dataTransfer.dropEffect = 'copy';
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
_releaseState(draggedData) {
|
|
829
|
+
if (draggedData && draggedData.isCopy) {
|
|
830
|
+
this._switchState(SceneEventState.SELECTED);
|
|
831
|
+
}
|
|
832
|
+
else {
|
|
833
|
+
this._switchState(SceneEventState.UNSELECTED);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
_addToItemGroup(object, prevSelectedObject) {
|
|
837
|
+
const isIntersectWithGroupMember = object instanceof ItemGroup || object.parent instanceof ItemGroup;
|
|
838
|
+
if (!isIntersectWithGroupMember && !object.configuring && this._canGroupItems(object, prevSelectedObject)) {
|
|
839
|
+
if (prevSelectedObject) {
|
|
840
|
+
this._itemGroupService.addIfNotExist(prevSelectedObject);
|
|
841
|
+
}
|
|
842
|
+
this._itemGroupService.addOrRemoveIfExist(object);
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
_canGroupFloorItem(item) {
|
|
846
|
+
return !(item instanceof WallItem) || (item instanceof CustomWallFloorItem && !item.currentWall);
|
|
847
|
+
}
|
|
848
|
+
_canGroupWallItem(item) {
|
|
849
|
+
return ((item instanceof WallItem && !(item instanceof InWallItem)) ||
|
|
850
|
+
(item instanceof CustomWallFloorItem && item.currentWall !== undefined));
|
|
851
|
+
}
|
|
852
|
+
_canGroupItems(newItem, previousItem) {
|
|
853
|
+
return this._canGroupWallItem(newItem) && this._canGroupWallItem(previousItem) &&
|
|
854
|
+
newItem.currentWall === previousItem.currentWall ||
|
|
855
|
+
this._canGroupFloorItem(newItem) && this._canGroupFloorItem(previousItem);
|
|
856
|
+
}
|
|
857
|
+
_switchState(newState) {
|
|
858
|
+
if (newState !== this._state) {
|
|
859
|
+
this._onExit(this._state);
|
|
860
|
+
this._onEntry(newState);
|
|
861
|
+
}
|
|
862
|
+
this._state = newState;
|
|
863
|
+
this._hudService.setRotating(this._isRotating());
|
|
864
|
+
}
|
|
865
|
+
_onEntry(onState) {
|
|
866
|
+
switch (onState) {
|
|
867
|
+
case SceneEventState.UNSELECTED:
|
|
868
|
+
this.setSelectedObject(null);
|
|
869
|
+
this._controls.enabled = true;
|
|
870
|
+
break;
|
|
871
|
+
case SceneEventState.SELECTED:
|
|
872
|
+
this._controls.enabled = true;
|
|
873
|
+
break;
|
|
874
|
+
case SceneEventState.ROTATING:
|
|
875
|
+
this._controls.enabled = this._appService.sku;
|
|
876
|
+
break;
|
|
877
|
+
case SceneEventState.DRAGGING:
|
|
878
|
+
this._setCursorStyle('move');
|
|
879
|
+
this._clickPressed();
|
|
880
|
+
this._controls.enabled = false;
|
|
881
|
+
break;
|
|
882
|
+
case SceneEventState.DRAGGINGCONNECTOR:
|
|
883
|
+
this._clickConnectorPressed();
|
|
884
|
+
this._controls.enabled = false;
|
|
885
|
+
break;
|
|
886
|
+
case SceneEventState.EXPLORE:
|
|
887
|
+
this._overrideDefaultCursorStyle('pointer');
|
|
888
|
+
this.setSelectedObject(null);
|
|
889
|
+
this._cameraMoveSub = this._cameraService.cameraMovementChanged.subscribe(() => this._updateExploreIndicator());
|
|
890
|
+
break;
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
_onExit(onState) {
|
|
894
|
+
switch (onState) {
|
|
895
|
+
case SceneEventState.UNSELECTED:
|
|
896
|
+
case SceneEventState.SELECTED:
|
|
897
|
+
break;
|
|
898
|
+
case SceneEventState.DRAGGING:
|
|
899
|
+
this._setCursorStyle(this._defaultCursorStyle);
|
|
900
|
+
break;
|
|
901
|
+
case SceneEventState.ROTATING:
|
|
902
|
+
break;
|
|
903
|
+
case SceneEventState.EXPLORE:
|
|
904
|
+
this._overrideDefaultCursorStyle('auto');
|
|
905
|
+
this._hudService.stopExplore();
|
|
906
|
+
if (this._cameraMoveSub) {
|
|
907
|
+
this._cameraMoveSub.unsubscribe();
|
|
908
|
+
}
|
|
909
|
+
break;
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
_setIntersectedObject(mesh) {
|
|
913
|
+
this._intersectedMesh = mesh;
|
|
914
|
+
if (typeof mesh['getRoot'] === 'function') {
|
|
915
|
+
this._intersectedObject = mesh.getRoot();
|
|
916
|
+
}
|
|
917
|
+
else if (mesh.parent) {
|
|
918
|
+
this._setIntersectedObject(mesh.parent);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
// Reverted changes from IONE-31399
|
|
922
|
+
_mouseToVec3(vec2) {
|
|
923
|
+
const rendererElement = this._element;
|
|
924
|
+
const mPosition = new Vector2((vec2.x / rendererElement.clientWidth) * 2 - 1, -(vec2.y / rendererElement.clientHeight) * 2 + 1);
|
|
925
|
+
const vector = new Vector3(mPosition.x, mPosition.y, 0.5);
|
|
926
|
+
vector.unproject(this._camera);
|
|
927
|
+
return vector;
|
|
928
|
+
// const rendererElement = this._element;
|
|
929
|
+
// const mPosition = new Vector2(
|
|
930
|
+
// (vec2.x / rendererElement.clientWidth) * 2 - 1,
|
|
931
|
+
// -(vec2.y / rendererElement.clientHeight) * 2 + 1
|
|
932
|
+
// );
|
|
933
|
+
// const vector = new Vector3(mPosition.x, mPosition.y, 0.5);
|
|
934
|
+
// vector.unproject(this._camera);
|
|
935
|
+
// return vector;
|
|
936
|
+
}
|
|
937
|
+
_setSelectObject(object, mesh) {
|
|
938
|
+
object.setSelected(mesh, this._mouseToVec3(this._mousePosition));
|
|
939
|
+
this._selectedObject = object;
|
|
940
|
+
this._messageBusService.emit(MessageType.ItemSelected, object);
|
|
941
|
+
}
|
|
942
|
+
_updateMouseover() {
|
|
943
|
+
if (this._intersectedObject != null) {
|
|
944
|
+
if (this._mouseoverObject != null) {
|
|
945
|
+
if (this._mouseoverObject !== this._intersectedObject) {
|
|
946
|
+
this._setObjectMouseOff(this._mouseoverObject);
|
|
947
|
+
this._mouseoverObject = this._intersectedObject;
|
|
948
|
+
this._setObjectMouseOver(this._mouseoverObject, this._intersectedMesh);
|
|
949
|
+
this._markSceneToUpdate();
|
|
950
|
+
}
|
|
951
|
+
else {
|
|
952
|
+
// do nothing, mouseover already set
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
else {
|
|
956
|
+
this._mouseoverObject = this._intersectedObject;
|
|
957
|
+
this._setObjectMouseOver(this._mouseoverObject, this._intersectedMesh);
|
|
958
|
+
this._setCursorStyle('pointer');
|
|
959
|
+
this._markSceneToUpdate();
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
else if (this._mouseoverObject != null) {
|
|
963
|
+
this._setObjectMouseOff(this._mouseoverObject);
|
|
964
|
+
this._setCursorStyle(this._defaultCursorStyle);
|
|
965
|
+
this._mouseoverObject = null;
|
|
966
|
+
this._markSceneToUpdate();
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
_setObjectMouseOver(object, mesh) {
|
|
970
|
+
if (object.parent && object.parent instanceof ItemGroup) {
|
|
971
|
+
object.parent.mouseOver();
|
|
972
|
+
}
|
|
973
|
+
else {
|
|
974
|
+
object.mouseOver(mesh);
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
_setObjectMouseOff(object) {
|
|
978
|
+
if (object.parent && object.parent instanceof ItemGroup) {
|
|
979
|
+
object.parent.mouseOff();
|
|
980
|
+
}
|
|
981
|
+
else {
|
|
982
|
+
object.mouseOff();
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
_markSceneToUpdate() {
|
|
986
|
+
this._sceneService.needsRender = true;
|
|
987
|
+
}
|
|
988
|
+
_setCursorStyle(style) {
|
|
989
|
+
this._element.style.cursor = style;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
SceneEventService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SceneEventService, deps: [{ token: i1.HudService }, { token: i2.MessageBusService }, { token: i3.SceneService }, { token: i4.DragAndDropService }, { token: i5.RotationService }, { token: i6.CameraService }, { token: i7.RoomService }, { token: i8.FloorService }, { token: i9.IntersectionService }, { token: i10.ViewModeService }, { token: i11.ItemGroupService }, { token: i12.ItemService }, { token: i13.HomedecoratorAppService }, { token: i14.HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
993
|
+
SceneEventService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SceneEventService, providedIn: 'root' });
|
|
994
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SceneEventService, decorators: [{
|
|
995
|
+
type: Injectable,
|
|
996
|
+
args: [{
|
|
997
|
+
providedIn: 'root'
|
|
998
|
+
}]
|
|
999
|
+
}], ctorParameters: function () { return [{ type: i1.HudService }, { type: i2.MessageBusService }, { type: i3.SceneService }, { type: i4.DragAndDropService }, { type: i5.RotationService }, { type: i6.CameraService }, { type: i7.RoomService }, { type: i8.FloorService }, { type: i9.IntersectionService }, { type: i10.ViewModeService }, { type: i11.ItemGroupService }, { type: i12.ItemService }, { type: i13.HomedecoratorAppService }, { type: i14.HomedecoratorAppEventService }]; } });
|
|
1000
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtZXZlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvY29yZTNkL3NlcnZpY2Uvc2NlbmUtZXZlbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUF1QyxPQUFPLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUkxRCxPQUFPLEVBQWEsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RCxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBVy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNJLE9BQU8s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LElBQVU7UUFDOUQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksU0FBUyxFQUFFO1lBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDM0I7YUFBTTtZQUNMLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBd0I7UUFDakQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksU0FBUyxFQUFFO1lBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDMUI7YUFBTTtZQUNMLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLENBQUM7OytHQWhpQ1UsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0l0ZW19IGZyb20gJy4uL2l0ZW1zL2l0ZW0nO1xyXG5pbXBvcnQge0NhbWVyYSwgSW50ZXJzZWN0aW9uLCBNZXNoLCBPYmplY3QzRCwgVmVjdG9yMiwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1NjZW5lRXZlbnRTdGF0ZX0gZnJvbSAnLi4vbW9kZWwvc2NlbmUtZXZlbnQuZW51bSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi9odWQuc2VydmljZSc7XHJcbmltcG9ydCB7RHJhZ0FuZERyb3BTZXJ2aWNlfSBmcm9tICcuL2RyYWctYW5kLWRyb3Auc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi9jYW1lcmEuc2VydmljZSc7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtmcm9tRXZlbnR9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQnO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGVsYXksIGZpbHRlciwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7b2Z9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZic7XHJcbmltcG9ydCB7TWVzc2FnZUJ1c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9tZXNzYWdlLWJ1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHtTY2VuZVNlcnZpY2V9IGZyb20gJy4vc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7Um90YXRpb25TZXJ2aWNlfSBmcm9tICcuL3JvdGF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jvb21TZXJ2aWNlfSBmcm9tICcuLi8uLi9yb29tLXBsYW5uZXIvY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvc2VydmljZS9yb29tLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Zsb29yU2VydmljZX0gZnJvbSAnLi9mbG9vci5zZXJ2aWNlJztcclxuaW1wb3J0IHtJbnRlcnNlY3Rpb25TZXJ2aWNlfSBmcm9tICcuL2ludGVyc2VjdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtWaWV3TW9kZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS92aWV3LW1vZGUuc2VydmljZSc7XHJcbmltcG9ydCB7SXRlbUdyb3VwU2VydmljZX0gZnJvbSAnLi9pdGVtLWdyb3VwLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuL2l0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckFwcFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWFwcC5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtWaWV3TW9kZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL3ZpZXctbW9kZS5lbnVtJztcclxuaW1wb3J0IHtSZWxhdGl2ZVBvc2l0aW9uVXRpbHN9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVsYXRpdmUtcG9zaXRpb24udXRpbHMnO1xyXG5pbXBvcnQge0N1c3RvbVdhbGxGbG9vckl0ZW19IGZyb20gJy4uL2l0ZW1zL2N1c3RvbS13YWxsLWZsb29yLWl0ZW0nO1xyXG5pbXBvcnQge0l0ZW1Hcm91cH0gZnJvbSAnLi4vaXRlbXMvaXRlbS1ncm91cCc7XHJcbmltcG9ydCB7aXNGbG9vckRlY29yYXRpb24sIGlzRmxvb3JUeXBlLCBpc0Z1cm5pdHVyZVR5cGUsIGlzSW5XYWxsVHlwZSwgaXNPbkZsb29yVHlwZSwgaXNXYWxsRmxvb3JUeXBlLCBpc1dhbGxUeXBlfSBmcm9tICcuLi9pdGVtcy9mYWN0b3J5JztcclxuaW1wb3J0IHtJbldhbGxJdGVtLCBXYWxsSXRlbX0gZnJvbSAnLi4vaXRlbXMvd2FsbC1vYmplY3RzJztcclxuaW1wb3J0IHtDdXN0b21NZXNofSBmcm9tICcuLi9pdGVtcy9jdXN0b20tb2JqZWN0cyc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItYXBwLWV2ZW50LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2NlbmVFdmVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcnNlY3RPZmZzZXRGb3JXYWxscyA9IDIwO1xyXG4gIHB1YmxpYyByZWFkb25seSBsb25nVG91Y2hEdXJhdGlvbiA9IDYwMDtcclxuXHJcbiAgcHVibGljIHJvdGF0ZU5vRHJhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9jb250cm9sczogYW55O1xyXG4gIHByaXZhdGUgX2NhbWVyYTogQ2FtZXJhO1xyXG5cclxuICBwcml2YXRlIF9tb3VzZVBvc2l0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoKTtcclxuICBwcml2YXRlIF9vbGRNb3VzZVBvc2l0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgcHJpdmF0ZSBfcm90YXRpb25TdGFydFBvaW50OiBWZWN0b3IzID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfaW50ZXJzZWN0ZWRPYmplY3Q6IEl0ZW07XHJcbiAgcHJpdmF0ZSBfaW50ZXJzZWN0ZWRNZXNoOiBDdXN0b21NZXNoIHwgTWVzaDtcclxuICBwcml2YXRlIF9tb3VzZW92ZXJPYmplY3Q6IEl0ZW07XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRPYmplY3Q6IGFueTtcclxuICBwcml2YXRlIF9wcmV2U2VsZWN0ZWRPYmplY3Q6IGFueTtcclxuICBwcml2YXRlIF9kZWZhdWx0Q3Vyc29yU3R5bGUgPSAncG9pbnRlcic7XHJcbiAgcHJpdmF0ZSBfZXhwbG9yZVByZXNzZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pbkRyYWdPdmVyID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX21vdXNlRG93biA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX21vdXNlTW92ZWQgPSBmYWxzZTsgLy8gaGFzIG1vdXNlIG1vdmVkIHNpbmNlIGRvd24gY2xpY2tcclxuXHJcbiAgcHJpdmF0ZSBfcm90YXRlTW91c2VPdmVyID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZ3JvdXBpbmdNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3N0YXRlID0gU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ7XHJcblxyXG4gIHByaXZhdGUgX2ludGVyc2VjdGVkV2FsbDogSW50ZXJzZWN0aW9uO1xyXG4gIHByaXZhdGUgX2ludGVyc2VjdGVkRmxvb3I6IEludGVyc2VjdGlvbjtcclxuXHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9jYW1lcmFNb3ZlU3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHByaXZhdGUgX2RlYm91bmNlZFNhdmVTdGF0ZTogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwcml2YXRlIF90b3VjaFN0YXJ0OiBPYnNlcnZhYmxlPEV2ZW50PjtcclxuICBwcml2YXRlIF90b3VjaEVuZDogT2JzZXJ2YWJsZTxFdmVudD47XHJcbiAgcHJpdmF0ZSBfdG91Y2hDYW5jZWw6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG4gIHByaXZhdGUgX3RvdWNoTW92ZTogT2JzZXJ2YWJsZTxFdmVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfaHVkU2VydmljZTogSHVkU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VCdXNTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZHJhZ0FuZERyb3BTZXJ2aWNlOiBEcmFnQW5kRHJvcFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb3RhdGlvblNlcnZpY2U6IFJvdGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NhbWVyYVNlcnZpY2U6IENhbWVyYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb29tU2VydmljZTogUm9vbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mbG9vclNlcnZpY2U6IEZsb29yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2ludGVyc2VjdGlvblNlcnZpY2U6IEludGVyc2VjdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF92aWV3TW9kZVNlcnZpY2U6IFZpZXdNb2RlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2l0ZW1Hcm91cFNlcnZpY2U6IEl0ZW1Hcm91cFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwU2VydmljZSxcclxuICAgIHByaXZhdGUgX2V2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5fZWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuX2NvbnRyb2xzID0gdGhpcy5fY2FtZXJhU2VydmljZS5jb250cm9scztcclxuICAgIHRoaXMuX2NhbWVyYSA9IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhO1xyXG5cclxuICAgIHRoaXMuX3RvdWNoU3RhcnQgPSBmcm9tRXZlbnQoZWxlbWVudCwgJ3RvdWNoc3RhcnQnKTtcclxuICAgIHRoaXMuX3RvdWNoRW5kID0gZnJvbUV2ZW50KGVsZW1lbnQsICd0b3VjaGVuZCcpO1xyXG4gICAgdGhpcy5fdG91Y2hDYW5jZWwgPSBmcm9tRXZlbnQoZWxlbWVudCwgJ3RvdWNoY2FuY2VsJyk7XHJcbiAgICB0aGlzLl90b3VjaE1vdmUgPSBmcm9tRXZlbnQoZWxlbWVudCwgJ3RvdWNobW92ZScpO1xyXG5cclxuICAgIGZyb21FdmVudChlbGVtZW50LCAnbW91c2Vkb3duJylcclxuICAgICAgLnBpcGUoZmlsdGVyKChldmVudDogTW91c2VFdmVudCkgPT4gZXZlbnQuYnV0dG9uID09PSAwKSlcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB0aGlzLl9sZWZ0TW91c2VEb3duRXZlbnQoZXZlbnQpKTtcclxuICAgIGZyb21FdmVudChlbGVtZW50LCAnbW91c2V1cCcpLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHRoaXMuX21vdXNlVXBFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdtb3VzZW1vdmUnKS5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB0aGlzLl9tb3VzZU1vdmVFdmVudChldmVudCkpO1xyXG4gICAgdGhpcy5fdG91Y2hTdGFydC5zdWJzY3JpYmUoKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB0aGlzLl90b3VjaFN0YXJ0RXZlbnQoZXZlbnQpKTtcclxuICAgIHRoaXMuX3RvdWNoRW5kLnN1YnNjcmliZSgoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHRoaXMuX3RvdWNoRW5kRXZlbnQoZXZlbnQpKTtcclxuICAgIHRoaXMuX3RvdWNoQ2FuY2VsLnN1YnNjcmliZSgoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHRoaXMuX3RvdWNoRW5kRXZlbnQoZXZlbnQpKTtcclxuICAgIHRoaXMuX3RvdWNoTW92ZS5zdWJzY3JpYmUoKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB0aGlzLl90b3VjaE1vdmVFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ2tleWRvd24nKS5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9rZXlEb3duRXZlbnQoZXZlbnQpKTtcclxuICAgIGZyb21FdmVudChlbGVtZW50LCAnZHJhZ2VudGVyJykuc3Vic2NyaWJlKChldmVudDogRHJhZ0V2ZW50KSA9PiB0aGlzLl9kcmFnRW50ZXJFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdkcmFnZXhpdCcpLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5fZHJhZ0V4aXRFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdkcmFnb3ZlcicpLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5fZHJhZ092ZXJFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdkcm9wJykuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuX29uRHJvcChldmVudCkpO1xyXG5cclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNldERyYWcsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBJdGVtKSB7XHJcbiAgICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZERhdGEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogZGF0YS5tZXRhZGF0YS5pdGVtVHlwZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkSXRlbSA9IGRhdGE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywgKHt4LCB5LCB6fSkgPT5cclxuICAgICAgICB0aGlzLnN0YXJ0RHJhZ2dpbmcoeCwgeSwgeikpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuRXhpdERyYWcsICgpID0+IHRoaXMuX2RyYWdFeGl0RXZlbnQoZXZlbnQpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlBsYWNlT25Ub3VjaCwgKCkgPT4gdGhpcy5faW5pdFBsYWNlT25Ub3VjaFJlcXVlc3QoKSksXHJcbiAgICAgIHRoaXMuX2RlYm91bmNlZFNhdmVTdGF0ZS5waXBlKGRlYm91bmNlVGltZSg4MDApKS5zdWJzY3JpYmUoKGFjdGlvbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246IGAzRCAke2FjdGlvbn1gfSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9kZWJvdW5jZWRTYXZlU3RhdGUucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9odWRTZXJ2aWNlLnVwZGF0ZUxhYmVsTWVhc3VyZW1lbnRzKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl92aWV3TW9kZVNlcnZpY2Uudmlld01vZGVDaGFuZ2VkLnN1YnNjcmliZShtb2RlID0+IHRoaXMuc2V0RXhwbG9yZU1vZGUobW9kZSA9PT0gVmlld01vZGUuV2Fsa1Rocm91Z2gpKSxcclxuICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5vYmplY3RBZGRlZC5zdWJzY3JpYmUoKG9iamVjdCkgPT4gdGhpcy5zZXRTZWxlY3RlZE9iamVjdChvYmplY3QpKSxcclxuICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5ncm91cGVkLnN1YnNjcmliZSgob2JqZWN0KSA9PiB0aGlzLnNldFNlbGVjdGVkT2JqZWN0KG9iamVjdCkpLFxyXG4gICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnVuZ3JvdXBlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRTZWxlY3RlZE9iamVjdChudWxsKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtUmVtb3ZlZCwgKCkgPT4gdGhpcy5zZXRTZWxlY3RlZE9iamVjdChudWxsKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TdGFydEdyb3VwT2JqZWN0LCAoKSA9PiB0aGlzLl9zZXRHcm91cGluZ01vZGUodHJ1ZSkpXHJcbiAgICApO1xyXG5cclxuICB9XHJcbiAgcHVibGljIHNldEV4cGxvcmVNb2RlKG9uID0gdHJ1ZSkge1xyXG4gICAgaWYgKG9uKSB7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RlZE9iamVjdChvYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXAsIG1lc2g/OiBNZXNoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEICYmIG9iamVjdCkge1xyXG4gICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCAhPSBudWxsICYmIHRoaXMuX3NlbGVjdGVkT2JqZWN0ICE9PSBvYmplY3QpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRPYmplY3Quc2V0VW5zZWxlY3RlZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0U2VsZWN0T2JqZWN0KG9iamVjdCk7XHJcbiAgICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5zZWxlY3RlZEdyb3VwID0gb2JqZWN0O1xyXG4gICAgICB9IGVsc2UgaWYgKG9iamVjdC5wYXJlbnQgaW5zdGFuY2VvZiBJdGVtR3JvdXApIHtcclxuICAgICAgICB0aGlzLl9zZXRTZWxlY3RPYmplY3Qob2JqZWN0LnBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5zZWxlY3RlZEdyb3VwID0gb2JqZWN0LnBhcmVudDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZXRTZWxlY3RPYmplY3Qob2JqZWN0LCBtZXNoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRPYmplY3Quc2V0VW5zZWxlY3RlZCgpO1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSXRlbVVuc2VsZWN0ZWQsIHRoaXMuX3NlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZE9iamVjdCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcHJldlNlbGVjdGVkT2JqZWN0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9tYXJrU2NlbmVUb1VwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0RHJhZ2dpbmcoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo/OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGRyYWdnZWREYXRhID0gdGhpcy5fZ2V0RHJhZ2dlZERhdGEoKTtcclxuICAgIGlmICghdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdnZWRTdGF0dXMuYWxsb3dlZE5ldyB8fCAhZHJhZ2dlZERhdGEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLkRORCk7XHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5kcmFnRW50ZXIoKTtcclxuICAgIGNvbnN0IHZlYzM6IFZlY3RvcjMgPSB6ID8gbmV3IFZlY3RvcjMoeCwgeSwgeikgOiB0aGlzLmludGVyc2VjdGluZ1ZlYzMobmV3IFZlY3RvcjIoeCwgeSkpO1xyXG4gICAgaWYgKHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkSXRlbSkge1xyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5vYmplY3RMb2FkZWQoKTtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLnVwZGF0ZURyYWdnZWRQb3NpdGlvbih2ZWMzKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGdXJuaXR1cmVUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IGlzV2FsbFR5cGUoZHJhZ2dlZERhdGEudHlwZSkpIHtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdNb2RlbCh2ZWMzLCB0aGlzLl9mbG9vckludGVyc2VjdGlvbih0aGlzLl9zY2VuZVNlcnZpY2UucG9zaXRpb25JblNjZW5lVG9TY3JlZW4odmVjMykpKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGbG9vckRlY29yYXRpb24oZHJhZ2dlZERhdGEudHlwZSkpIHtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdGbG9vckRlY29yYXRpb24odGhpcy5fZmxvb3JJbnRlcnNlY3Rpb24odGhpcy5fc2NlbmVTZXJ2aWNlLnBvc2l0aW9uSW5TY2VuZVRvU2NyZWVuKHZlYzMpKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW50ZXJzZWN0aW5nVmVjMyh2ZWMyOiBWZWN0b3IyLCBpbnRlcnNlY3Rpb24/OiBJbnRlcnNlY3Rpb24pOiBWZWN0b3IzIHtcclxuICAgIGlmICghaW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGdJbnRlcnNlY3Rpb25zID0gdGhpcy5fZ3JvdW5kSW50ZXJzZWN0aW9ucyh2ZWMyKTtcclxuICAgICAgcmV0dXJuIGdJbnRlcnNlY3Rpb25zICYmIGdJbnRlcnNlY3Rpb25zWzBdICYmIGdJbnRlcnNlY3Rpb25zWzBdLnBvaW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGludGVyc2VjdGlvbi5wb2ludDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzUm90YXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09IFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORyAmJiAoIXRoaXMuX2FwcFNlcnZpY2Uuc2t1IHx8IHRoaXMuX3ZpZXdNb2RlU2VydmljZS52aWV3TW9kZSA9PT0gVmlld01vZGUuSW5QaG90b1ZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfa2V5RG93bkV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICB0aGlzLl9jYW5jZWxEcmFnRHJvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZHJhZ0VudGVyRXZlbnQoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IG1vdXNlUG9zOiBWZWN0b3IyID0gUmVsYXRpdmVQb3NpdGlvblV0aWxzLkdldENsaWVudE1vdXNlUG9zaXRpb24oZXZlbnQpO1xyXG4gICAgdGhpcy5zdGFydERyYWdnaW5nKG1vdXNlUG9zLngsIG1vdXNlUG9zLnkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZHJhZ0V4aXRFdmVudChldmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkcmFnZ2VkRGF0YSA9IHRoaXMuX2dldERyYWdnZWREYXRhKCk7XHJcbiAgICBpZiAoZHJhZ2dlZERhdGEpIHtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmZpbmlzaERyYWdnaW5nKCk7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RyYWdPdmVyRXZlbnQoZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAodGhpcy5fc3RhdGUgIT09IFNjZW5lRXZlbnRTdGF0ZS5ETkQgfHwgdGhpcy5faW5EcmFnT3Zlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faW5EcmFnT3ZlciA9IHRydWU7XHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5kcmFnT3ZlcigpO1xyXG4gICAgY29uc3QgY2FudmFzOiBIVE1MRWxlbWVudCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICBjb25zdCBtb3VzZVBvczogVmVjdG9yMiA9IFJlbGF0aXZlUG9zaXRpb25VdGlscy5HZXRDbGllbnRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcclxuICAgIHRoaXMuX21vdXNlUG9zaXRpb24uc2V0KG1vdXNlUG9zLnggLSAoY2FudmFzID8gY2FudmFzLm9mZnNldExlZnQgOiAwKSwgbW91c2VQb3MueSAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0VG9wIDogMCkpO1xyXG5cclxuICAgIGNvbnN0IGRyYWdnZWREYXRhID0gdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdnZWREYXRhO1xyXG5cclxuICAgIGxldCBpbnRlcnNlY3Rpb246IEludGVyc2VjdGlvbiA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICBjb25zdCBpbnRlcnNlY3RlZEZsb29yOiBJbnRlcnNlY3Rpb24gPSB0aGlzLl9mbG9vckludGVyc2VjdGlvbih0aGlzLl9tb3VzZVBvc2l0aW9uKTtcclxuXHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuaW50ZXJzZWN0ZWRXYWxsID0gaW50ZXJzZWN0aW9uO1xyXG4gICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmludGVyc2VjdGVkRmxvb3IgPSBpbnRlcnNlY3RlZEZsb29yO1xyXG4gICAgdGhpcy5faW50ZXJzZWN0ZWRXYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5faW50ZXJzZWN0ZWRGbG9vciA9IHVuZGVmaW5lZDtcclxuICAgIGlmIChpc1dhbGxUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IChpc1dhbGxGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgJiYgaW50ZXJzZWN0aW9uKSkge1xyXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5faW50ZXJzZWN0ZWRXYWxsID0gaW50ZXJzZWN0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb24gJiYgIWlzRnVybml0dXJlVHlwZShkcmFnZ2VkRGF0YS50eXBlKSkge1xyXG4gICAgICAgIHRoaXMuX2FjY2VwdERyb3AoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzRmxvb3JUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IGlzRmxvb3JEZWNvcmF0aW9uKGRyYWdnZWREYXRhLnR5cGUpIHx8IChpc1dhbGxGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgJiYgaW50ZXJzZWN0ZWRGbG9vcikpIHtcclxuICAgICAgdGhpcy5faW50ZXJzZWN0ZWRGbG9vciA9IGludGVyc2VjdGlvbiA9IHRoaXMuX2Zsb29ySW50ZXJzZWN0aW9uKHRoaXMuX21vdXNlUG9zaXRpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xyXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW50ZXJzZWN0ZWRQb2ludDogVmVjdG9yMyA9IHRoaXMuaW50ZXJzZWN0aW5nVmVjMyh0aGlzLl9tb3VzZVBvc2l0aW9uLCBpbnRlcnNlY3Rpb24pO1xyXG5cclxuICAgIGlmIChpbnRlcnNlY3RlZFBvaW50KSB7XHJcbiAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS51cGRhdGVEcmFnZ2VkUG9zaXRpb24oaW50ZXJzZWN0ZWRQb2ludCk7XHJcbiAgICAgIHRoaXMuX2FjY2VwdERyb3AoZXZlbnQpO1xyXG4gICAgICB0aGlzLl9tYXJrU2NlbmVUb1VwZGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faW5EcmFnT3ZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfb25Ecm9wKGV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSBTY2VuZUV2ZW50U3RhdGUuRE5EKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNhbnZhczogSFRNTEVsZW1lbnQgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xyXG4gICAgY29uc3QgbW91c2VQb3M6IFZlY3RvcjIgPSBSZWxhdGl2ZVBvc2l0aW9uVXRpbHMuR2V0Q2xpZW50TW91c2VQb3NpdGlvbihldmVudCk7XHJcbiAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLnNldChtb3VzZVBvcy54IC0gKGNhbnZhcyA/IGNhbnZhcy5vZmZzZXRMZWZ0IDogMCksIG1vdXNlUG9zLnkgLSAoY2FudmFzID8gY2FudmFzLm9mZnNldFRvcCA6IDApKTtcclxuXHJcbiAgICBjb25zdCBkcmFnZ2VkRGF0YSA9IHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkRGF0YTtcclxuICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IG51bGw7XHJcbiAgICBsZXQgaW50ZXJzZWN0aW9uOiBJbnRlcnNlY3Rpb24gPSBudWxsO1xyXG5cclxuICAgIGlmIChpc1dhbGxUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IChpc1dhbGxGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgJiYgdGhpcy5faW50ZXJzZWN0ZWRXYWxsKSkge1xyXG4gICAgICBwb3NpdGlvbiA9IHRoaXMuX2ludGVyc2VjdGVkV2FsbCAmJiB0aGlzLl9pbnRlcnNlY3RlZFdhbGwucG9pbnQ7XHJcbiAgICAgIGludGVyc2VjdGlvbiA9IHRoaXMuX2ludGVyc2VjdGVkV2FsbDtcclxuICAgIH0gZWxzZSBpZiAoaXNGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgfHwgaXNGbG9vckRlY29yYXRpb24oZHJhZ2dlZERhdGEudHlwZSkgfHwgKGlzV2FsbEZsb29yVHlwZShkcmFnZ2VkRGF0YS50eXBlKSAmJiB0aGlzLl9pbnRlcnNlY3RlZEZsb29yKSkge1xyXG4gICAgICBwb3NpdGlvbiA9IHRoaXMuX2ludGVyc2VjdGVkRmxvb3IgJiYgdGhpcy5faW50ZXJzZWN0ZWRGbG9vci5wb2ludDtcclxuICAgICAgaW50ZXJzZWN0aW9uID0gdGhpcy5faW50ZXJzZWN0ZWRGbG9vcjtcclxuICAgIH1cclxuICAgIGlmIChwb3NpdGlvbikge1xyXG4gICAgICBjb25zdCBpbnRlcnNlY3RlZFBvaW50OiBWZWN0b3IzID0gdGhpcy5pbnRlcnNlY3RpbmdWZWMzKHRoaXMuX21vdXNlUG9zaXRpb24sIGludGVyc2VjdGlvbik7XHJcbiAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkUGxhY2VkKGludGVyc2VjdGVkUG9pbnQsIGludGVyc2VjdGlvbik7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnaXRlbSBhZGRlZCd9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2NhbmNlbERyYWdEcm9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5pc09iamVjdExvYWRlZCkge1xyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5tYXJrVG9DbGVhblVwKCk7XHJcbiAgICAgIHRoaXMuX3JlbGVhc2VTdGF0ZShkcmFnZ2VkRGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9yZWxlYXNlU3RhdGUoZHJhZ2dlZERhdGEpO1xyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZmluaXNoRHJhZ2dpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhbmNlbERyYWdEcm9wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdnZWRTdGF0dXMuZHJhZ0NhbmNlbGVkKCk7XHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZmluaXNoRHJhZ2dpbmcoKTtcclxuICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlQnVzU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkZpbmlzaGVkSU9uZUZ1cm5pdHVyZUJ1aWxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX21vdXNlVXBFdmVudChldmVudD86IE1vdXNlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX21vdXNlRG93biA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2NlbmVFdmVudFN0YXRlLkRORCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fb25Ecm9wKGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLkRSQUdHSU5HOlxyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lOR0NPTk5FQ1RPUjpcclxuICAgICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmNsaWNrUmVsZWFzZWQoKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRPYmplY3QuZW5kRHJhZygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkc6XHJcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuY2xpY2tSZWxlYXNlZCgpO1xyXG4gICAgICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdpdGVtIHJvdGF0ZWQnfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ6XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZE9iamVjdCAmJiAhdGhpcy5fbW91c2VNb3ZlZCkge1xyXG4gICAgICAgICAgdGhpcy5fY2hlY2tXYWxsc0FuZEZsb29ycyhldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRDpcclxuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVkT2JqZWN0ICYmICF0aGlzLl9tb3VzZU1vdmVkKSB7XHJcbiAgICAgICAgICB0aGlzLl9jaGVja1dhbGxzQW5kRmxvb3JzKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0ID09IG51bGwgJiYgIXRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLkVYUExPUkU6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fbmF2aWdhdGVFeHBsb3JlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9uYXZpZ2F0ZUV4cGxvcmUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9vdmVycmlkZURlZmF1bHRDdXJzb3JTdHlsZSgncG9pbnRlcicpO1xyXG4gICAgY29uc3QgcG9pbnQgPSB0aGlzLl9wb2ludE9uRmxvb3IodGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICBpZiAocG9pbnQpIHtcclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLl9jYW1lcmEucG9zaXRpb24uZGlzdGFuY2VUbyhwb2ludCk7XHJcbiAgICAgIHRoaXMuX2h1ZFNlcnZpY2UuZXhwbG9yZUZsb29ySG92ZXIodGhpcy5fbW91c2VQb3NpdGlvbiwgcG9pbnQsIGRpc3RhbmNlKTtcclxuICAgICAgaWYgKCF0aGlzLl9tb3VzZU1vdmVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faHVkU2VydmljZS5jb25maXJtRXhwbG9yZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2NhbWVyYVNlcnZpY2UuY29udHJvbHMuYW5pbWF0ZU1vdmVUbyhwb2ludCk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlRXhwbG9yZVBvaW50KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRQbGFjZU9uVG91Y2hSZXF1ZXN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkU3RhdHVzLmFsbG93ZWROZXcgJiYgdGhpcy5fZ2V0RHJhZ2dlZERhdGEoKSkge1xyXG4gICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuRE5EKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3RvdWNoRW5kRXZlbnQoZXZlbnQ6IFRvdWNoRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9pc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICB0aGlzLl9tb3VzZURvd24gPSBmYWxzZTtcclxuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEOlxyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ6XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSW50ZXJzZWN0aW9ucygpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlc2V0T2JqZWN0c1RvR3JvdXAoKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkT2JqZWN0KHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0LCB0aGlzLl9pbnRlcnNlY3RlZE1lc2gpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2FkZFRvSXRlbUdyb3VwKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkc6XHJcbiAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmNsaWNrUmVsZWFzZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORzpcclxuICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmNsaWNrUmVsZWFzZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdpdGVtIHJvdGF0ZWQnfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9tb3VzZU1vdmVkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX25hdmlnYXRlRXhwbG9yZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RvdWNoTW92ZUV2ZW50KGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IFNjZW5lRXZlbnRTdGF0ZS5ETkQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2RyYWdPdmVyRXZlbnQuYmluZCh0aGlzKShldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faXNNb3VzZUV2ZW50QWxsb3dlZChldmVudCkpIHtcclxuICAgICAgdGhpcy5fc2V0TW91c2VQb3NpdGlvbkZyb21Ub3VjaEV2ZW50KGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMuX21vdXNlTW92ZWQgPSB0cnVlO1xyXG4gICAgICBpZiAoIXRoaXMuX21vdXNlRG93bikge1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUludGVyc2VjdGlvbnMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ6XHJcbiAgICAgICAgICB0aGlzLl91cGRhdGVNb3VzZW92ZXIoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEOlxyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlTW91c2VvdmVyKCk7XHJcbiAgICAgICAgICB0aGlzLl9odWRTZXJ2aWNlLmNhbWVyYVJvdGF0aW9uKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lORzpcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORzpcclxuICAgICAgICAgIHRoaXMuX2NsaWNrRHJhZ2dlZCgpO1xyXG4gICAgICAgICAgdGhpcy5fbWFya1NjZW5lVG9VcGRhdGUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGVhckludGVyc2VjdGVkT2JqZWN0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5faW50ZXJzZWN0ZWRNZXNoID0gbnVsbDtcclxuICAgIHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKG9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faHVkU2VydmljZS5pc01vdXNlT3ZlcigpICE9PSBvbikge1xyXG4gICAgICB0aGlzLl9yb3RhdGVNb3VzZU92ZXIgPSBvbjtcclxuICAgICAgdGhpcy5faHVkU2VydmljZS5zZXRNb3VzZU92ZXIob24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlSW50ZXJzZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKFxyXG4gICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLFxyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5nZXRPYmplY3RQbGFuZXMoKSxcclxuICAgICAge29ubHlWaXNpYmxlOiB0cnVlLCBpbmNsdWRlRmxvb3JzOiBmYWxzZX1cclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgd2FsbEludGVyc2VjdCA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcblxyXG4gICAgLy8gb2JqZWN0IGludGVyc2VjdGlvbiBpcyBwcmlvcml0aXplZFxyXG4gICAgaWYgKGludGVyc2VjdHMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAoKHdhbGxJbnRlcnNlY3QgJiYgd2FsbEludGVyc2VjdC5kaXN0YW5jZSArIHRoaXMuaW50ZXJzZWN0T2Zmc2V0Rm9yV2FsbHMgPiBpbnRlcnNlY3RzWzBdLmRpc3RhbmNlKSB8fCAhd2FsbEludGVyc2VjdCkpIHtcclxuICAgICAgdGhpcy5fdG9nZ2xlUm90YXRpb25IdWRJbnRlcnNlY3Rpb24oZmFsc2UpO1xyXG4gICAgICB0aGlzLl9zZXRJbnRlcnNlY3RlZE9iamVjdChpbnRlcnNlY3RzWzBdLm9iamVjdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9jbGVhckludGVyc2VjdGVkT2JqZWN0KCk7XHJcbiAgICAgIGNvbnN0IHNuYXBwZXJBcmVhID0gdGhpcy5faHVkU2VydmljZS5nZXRSb3RhdGlvblNuYXBwZXJBcmVhKCk7XHJcbiAgICAgIGlmIChzbmFwcGVyQXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIGludGVyc2VjdHMgd2l0aCBjb25maWd1cmFibGUgZmxvb3JcclxuICAgICAgICBjb25zdCBmbG9vckludGVyc2VjdHMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKFxyXG4gICAgICAgICAgdGhpcy5fbW91c2VQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmdldE9iamVjdFBsYW5lcygpLFxyXG4gICAgICAgICAge29ubHlWaXNpYmxlOiB0cnVlLCBpbmNsdWRlRmxvb3I6IHRydWUsIG9ubHlDb25maWd1cmFibGVGbG9vcnM6IHRydWV9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZmxvb3JJbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3NldEludGVyc2VjdGVkT2JqZWN0KGZsb29ySW50ZXJzZWN0c1swXS5vYmplY3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBodWRJbnRlcnNlY3RzID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyhcclxuICAgICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLFxyXG4gICAgICAgIFtzbmFwcGVyQXJlYV0sXHJcbiAgICAgICAge3JlY3Vyc2l2ZTogdHJ1ZX1cclxuICAgICAgKTtcclxuICAgICAgaWYgKGh1ZEludGVyc2VjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJucyB0aGUgZmlyc3QgaW50ZXJzZWN0aW9uIG9iamVjdFxyXG4gIHByaXZhdGUgX2l0ZW1JbnRlcnNlY3Rpb24odmVjMiwgaXRlbSk6IGFueSB7XHJcbiAgICBsZXQgaW50ZXJzZWN0aW9ucyA9IG51bGw7XHJcbiAgICBpZiAoIWl0ZW0ubWV0YWRhdGEpIHtcclxuICAgICAgaW50ZXJzZWN0aW9ucyA9IHRoaXMuX2dldEludGVyc2VjdGlvbnModmVjMiwgW2l0ZW1dLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgICB9IGVsc2UgaWYgKGlzV2FsbEZsb29yVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICBpbnRlcnNlY3Rpb25zID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCB0aGlzLl9yb29tU2VydmljZS53YWxsRWRnZVBsYW5lcygpLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgICAgIGlmICghaW50ZXJzZWN0aW9ucyB8fCBpbnRlcnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIGludGVyc2VjdGlvbnMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKHZlYzIsIFt0aGlzLl9mbG9vclNlcnZpY2UuZ3JvdW5kUGxhbmVdLCB7fSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaXNXYWxsVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICBpbnRlcnNlY3Rpb25zID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCB0aGlzLl9yb29tU2VydmljZS53YWxsRWRnZVBsYW5lcygpLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbnRlcnNlY3Rpb25zID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCBbdGhpcy5fZmxvb3JTZXJ2aWNlLmdyb3VuZFBsYW5lXSwge30pO1xyXG4gICAgfVxyXG4gICAgaWYgKGludGVyc2VjdGlvbnMgJiYgaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Rpb25zWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmaWx0ZXIgYnkgbm9ybWFscyB3aWxsIG9ubHkgcmV0dXJuIG9iamVjdHMgZmFjaW5nIHRoZSBjYW1lcmFcclxuICBwcml2YXRlIF9nZXRJbnRlcnNlY3Rpb25zKG1vdXNlUG9zOiBWZWN0b3IyLCBvYmplY3RzOiBPYmplY3QzRFtdLCBvcHRpb25zPyk6IEludGVyc2VjdGlvbltdIHtcclxuICAgIGNvbnN0IG1vdXNlVmVjdG9yID0gdGhpcy5fbW91c2VUb1ZlYzMobW91c2VQb3MpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludGVyc2VjdGlvblNlcnZpY2UuZ2V0SW50ZXJzZWN0aW9ucyhtb3VzZVZlY3Rvciwgb2JqZWN0cywgb3B0aW9ucyk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NldE1vdXNlUG9zaXRpb25Gcm9tVG91Y2hFdmVudChldmVudDogVG91Y2hFdmVudCkge1xyXG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzWzBdO1xyXG4gICAgaWYgKHRvdWNoKSB7XHJcbiAgICAgIGNvbnN0IGNhbnZhczogYW55ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLnNldCh0b3VjaC5wYWdlWCAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0TGVmdCA6IDApLCB0b3VjaC5wYWdlWSAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0VG9wIDogMCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG91Y2hTdGFydEV2ZW50KGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNNb3VzZUV2ZW50QWxsb3dlZChldmVudCkpIHtcclxuXHJcbiAgICAgIGNvbnN0IGxvbmdUb3VjaCA9IG9mKDEpXHJcbiAgICAgICAgLnBpcGUoZGVsYXkodGhpcy5sb25nVG91Y2hEdXJhdGlvbikpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3RvdWNoU3RhcnQpKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl90b3VjaEVuZCkpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3RvdWNoQ2FuY2VsKSk7XHJcbiAgICAgIGxvbmdUb3VjaC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUludGVyc2VjdGlvbnMoKTtcclxuICAgICAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QgJiYgIXRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgIHRoaXMuX2FkZFRvSXRlbUdyb3VwKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0LCB0aGlzLl9wcmV2U2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLl9tb3VzZU1vdmVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX21vdXNlRG93biA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLl9zZXRNb3VzZVBvc2l0aW9uRnJvbVRvdWNoRXZlbnQoZXZlbnQpO1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQ6XHJcbiAgICAgICAgICB0aGlzLl91cGRhdGVJbnRlcnNlY3Rpb25zKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcm90YXRlTW91c2VPdmVyIHx8IHRoaXMucm90YXRlTm9EcmFnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JbnRlcnNlY3Rpb246IGFueSA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbiwgdGhpcy5fc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUludGVyc2VjdGlvbikge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3JvdGF0aW9uU3RhcnRQb2ludCA9IGl0ZW1JbnRlcnNlY3Rpb24ucG9pbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldlNlbGVjdGVkT2JqZWN0ID0gdGhpcy5fc2VsZWN0ZWRPYmplY3Q7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5faW50ZXJzZWN0ZWRPYmplY3QuZml4ZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5ETkQ6XHJcbiAgICAgICAgICB0aGlzLl9vbkRyb3AoZXZlbnQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xlZnRNb3VzZURvd25FdmVudChldmVudD8pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjYW52YXM6IEhUTUxFbGVtZW50ID0gZXZlbnQuY3VycmVudFRhcmdldDtcclxuICAgICAgY29uc3QgbW91c2VQb3M6IFZlY3RvcjIgPSBSZWxhdGl2ZVBvc2l0aW9uVXRpbHMuR2V0Q2xpZW50TW91c2VQb3NpdGlvbihldmVudCk7XHJcbiAgICAgIHRoaXMuX29sZE1vdXNlUG9zaXRpb24uc2V0KG1vdXNlUG9zLnggLSAoY2FudmFzID8gY2FudmFzLm9mZnNldExlZnQgOiAwKSwgbW91c2VQb3MueSAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0VG9wIDogMCkpO1xyXG5cclxuICAgICAgdGhpcy5fbW91c2VNb3ZlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9tb3VzZURvd24gPSB0cnVlO1xyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX3JvdGF0ZU1vdXNlT3Zlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkcpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1JbnRlcnNlY3Rpb246IGFueSA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbiwgdGhpcy5fc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICAgICAgICAgIGlmIChpdGVtSW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGlvblN0YXJ0UG9pbnQgPSBpdGVtSW50ZXJzZWN0aW9uLnBvaW50O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRNZXNoICYmIHRoaXMuX2ludGVyc2VjdGVkTWVzaC5uYW1lICYmIHRoaXMuX2ludGVyc2VjdGVkTWVzaC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnY18nKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lOR0NPTk5FQ1RPUik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdXBpbmdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRvSXRlbUdyb3VwKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0LCB0aGlzLl9zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlc2V0T2JqZWN0c1RvR3JvdXAoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE9iamVjdCh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCwgdGhpcy5faW50ZXJzZWN0ZWRNZXNoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkVG9JdGVtR3JvdXAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QsIHRoaXMuX3NlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRlcnNlY3RlZE9iamVjdC5maXhlZCAmJiAhdGhpcy5yb3RhdGVOb0RyYWcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lORyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEOlxyXG4gICAgICAgICAgY29uc3QgZmxvb3IgPSB0aGlzLl9mbG9vckludGVyc2VjdGlvbih0aGlzLl9tb3VzZVBvc2l0aW9uKTtcclxuICAgICAgICAgIGlmIChmbG9vcikge1xyXG4gICAgICAgICAgICBpZiAoZmxvb3Iub2JqZWN0LnBhcmVudCAmJiBmbG9vci5vYmplY3QucGFyZW50IGluc3RhbmNlb2YgSXRlbSAmJiBmbG9vci5vYmplY3QucGFyZW50LmNvbmZpZ3VyYWJsZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3NldEludGVyc2VjdGVkT2JqZWN0KGZsb29yLm9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlc2V0T2JqZWN0c1RvR3JvdXAoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE9iamVjdCh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCwgdGhpcy5faW50ZXJzZWN0ZWRNZXNoKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRlcnNlY3RlZE9iamVjdC5maXhlZCkge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnJvdGF0ZU5vRHJhZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUludGVyc2VjdGlvbjogYW55ID0gdGhpcy5faXRlbUludGVyc2VjdGlvbih0aGlzLl9tb3VzZVBvc2l0aW9uLCB0aGlzLl9zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbUludGVyc2VjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGlvblN0YXJ0UG9pbnQgPSBpdGVtSW50ZXJzZWN0aW9uLnBvaW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLlJPVEFUSU5HKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLkRSQUdHSU5HKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vdmVycmlkZURlZmF1bHRDdXJzb3JTdHlsZShzdHlsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZWZhdWx0Q3Vyc29yU3R5bGUgPSBzdHlsZTtcclxuICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKHRoaXMuX2RlZmF1bHRDdXJzb3JTdHlsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRHcm91cGluZ01vZGUoZW5hYmxlR3JvdXBpbmc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2dyb3VwaW5nTW9kZSA9IGVuYWJsZUdyb3VwaW5nO1xyXG4gICAgdGhpcy5fYWRkVG9JdGVtR3JvdXAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QsIHRoaXMuX3ByZXZTZWxlY3RlZE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXREcmFnZ2VkRGF0YSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrUHJlc3NlZCh2ZWMyPzogVmVjdG9yMik6IHZvaWQge1xyXG4gICAgY29uc3QgdmVjID0gdmVjMiB8fCB0aGlzLl9tb3VzZVBvc2l0aW9uO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odmVjLCB0aGlzLl9zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb24pIHtcclxuICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZEl0ZW0gPSB0aGlzLl9zZWxlY3RlZE9iamVjdDtcclxuICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2Uuc2V0RHJhZ09mZnNldChpbnRlcnNlY3Rpb24ucG9pbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGlja0Nvbm5lY3RvclByZXNzZWQodmVjMj86IFZlY3RvcjIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZlYyA9IHZlYzIgfHwgdGhpcy5fbW91c2VQb3NpdGlvbjtcclxuICAgIGlmICh0aGlzLl9pbnRlcnNlY3RlZE1lc2gpIHtcclxuICAgICAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IHRoaXMuX2dldEludGVyc2VjdGlvbnModmVjLCBbdGhpcy5faW50ZXJzZWN0ZWRNZXNoLCB0aGlzLl9mbG9vclNlcnZpY2UuZ3JvdW5kUGxhbmVdKTtcclxuICAgICAgaWYgKGludGVyc2VjdGlvbnMgJiYgaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAxICYmIGludGVyc2VjdGlvbnMuZmluZChpID0+IGkub2JqZWN0Lm5hbWUgPT09IHRoaXMuX2ludGVyc2VjdGVkTWVzaC5uYW1lKSkge1xyXG4gICAgICAgIGNvbnN0IGdyb3VuZFBsYW5lID0gaW50ZXJzZWN0aW9ucy5maW5kKGkgPT4gaS5vYmplY3QubmFtZSA9PT0gJ2dyb3VuZC1wbGFuZScpO1xyXG4gICAgICAgIGlmIChncm91bmRQbGFuZSkge1xyXG4gICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLnNldERyYWdPZmZzZXQoZ3JvdW5kUGxhbmUucG9pbnQsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrRHJhZ2dlZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCAmJiAhdGhpcy5fc2VsZWN0ZWRPYmplY3QubG9ja2VkKSB7XHJcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbiwgdGhpcy5fc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUm90YXRpbmcoKSkge1xyXG4gICAgICAgICAgdGhpcy5fcm90YXRpb25TdGFydFBvaW50ID1cclxuICAgICAgICAgICAgdGhpcy5fcm90YXRpb25TZXJ2aWNlLnJvdGF0ZSh0aGlzLl9zZWxlY3RlZE9iamVjdCwgdGhpcy5fcm90YXRpb25TdGFydFBvaW50LCBpbnRlcnNlY3Rpb24ucG9pbnQsICF0aGlzLnJvdGF0ZU5vRHJhZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5jbGlja0RyYWdnZWQoaW50ZXJzZWN0aW9uKTtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ2xpY2tEcmFnZ2VkKTtcclxuICAgICAgICAgIHRoaXMuX2RlYm91bmNlZFNhdmVTdGF0ZS5uZXh0KCdpdGVtIGRyYWdnZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faHVkU2VydmljZS51cGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZHJhZ0Nvbm5lY3RvcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCAmJiAhdGhpcy5fc2VsZWN0ZWRPYmplY3QubG9ja2VkKSB7XHJcbiAgICAgIC8vIGNvbnN0IGludGVyc2VjdGlvbnMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKHRoaXMuX21vdXNlUG9zaXRpb24sIFt0aGlzLl9mbG9vclNlcnZpY2UuZ3JvdW5kUGxhbmVdLCB7fSk7XHJcbiAgICAgIC8vIGlmIChpbnRlcnNlY3Rpb25zICYmIGludGVyc2VjdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdDb25uZWN0b3IodGhpcy5faW50ZXJzZWN0ZWRNZXNoLCBpbnRlcnNlY3Rpb25zWzBdLnBvaW50KTtcclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ0Nvbm5lY3Rvcih0aGlzLl9pbnRlcnNlY3RlZE1lc2gsIHRoaXMuX21vdXNlVG9WZWMzKHRoaXMuX21vdXNlUG9zaXRpb24pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NoZWNrV2FsbHNBbmRGbG9vcnMoZXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQgJiYgdGhpcy5fbW91c2VvdmVyT2JqZWN0ID09IG51bGwpIHtcclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICAgIGlmICh3YWxsKSB7XHJcbiAgICAgICAgY29uc3QgZWRnZSA9IHdhbGwub2JqZWN0LnVzZXJEYXRhLmVkZ2U7XHJcbiAgICAgICAgdGhpcy5fcm9vbVNlcnZpY2Uuc2VsZWN0V2FsbChldmVudCwgZWRnZS53YWxsLCBlZGdlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZsb29yID0gdGhpcy5fZmxvb3JJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICAgIGlmIChmbG9vcikge1xyXG4gICAgICAgIGNvbnN0IHJvb20gPSBmbG9vci5vYmplY3QudXNlckRhdGEucm9vbTtcclxuICAgICAgICB0aGlzLl9yb29tU2VydmljZS5zZWxlY3RGbG9vcihldmVudCwgcm9vbSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF93YWxsSW50ZXJzZWN0aW9uKHZlYzI6IFZlY3RvcjIpOiBJbnRlcnNlY3Rpb24ge1xyXG4gICAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb25zKHZlYzIpO1xyXG4gICAgaWYgKGludGVyc2VjdGlvbnMgJiYgaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Rpb25zWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF93YWxsSW50ZXJzZWN0aW9ucyh2ZWMyOiBWZWN0b3IyKTogSW50ZXJzZWN0aW9uW10ge1xyXG4gICAgY29uc3Qgd2FsbEVkZ2VQbGFuZXMgPSB0aGlzLl9yb29tU2VydmljZS53YWxsRWRnZVBsYW5lcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEludGVyc2VjdGlvbnMoXHJcbiAgICAgIHZlYzIsIHdhbGxFZGdlUGxhbmVzLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9lZGdlSW50ZXJzZWN0aW9ucyh2ZWMyOiBWZWN0b3IyKTogSW50ZXJzZWN0aW9uW10ge1xyXG4gICAgY29uc3QgZWRnZXMgPSB0aGlzLl9yb29tU2VydmljZS5mbG9vclBsYW5lcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEludGVyc2VjdGlvbnMoXHJcbiAgICAgIHZlYzIsIGVkZ2VzLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9ncm91bmRJbnRlcnNlY3Rpb25zKHZlYzI6IFZlY3RvcjIpOiBJbnRlcnNlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCBbdGhpcy5fZmxvb3JTZXJ2aWNlLmdyb3VuZFBsYW5lXSwge2ZpbHRlckJ5Tm9ybWFsczogdHJ1ZX0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfd2FsbEVkZ2VJbnRlcnNlY3RlZChpbnRlcnNlY3RlZFdhbGxzOiBJbnRlcnNlY3Rpb25bXSwgaW50ZXJzZWN0ZWRFZGdlczogSW50ZXJzZWN0aW9uW10pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHdhbGxzID0gaW50ZXJzZWN0ZWRFZGdlcy5tYXAoKGk6IEludGVyc2VjdGlvbikgPT4gaS5vYmplY3QudXNlckRhdGEud2FsbCk7XHJcbiAgICBjb25zdCBmaWx0ZXJlZFdhbGxzID0gaW50ZXJzZWN0ZWRXYWxscy5maWx0ZXIoKGludGVyc2VjdGVkV2FsbDogSW50ZXJzZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhbGwgPSBpbnRlcnNlY3RlZFdhbGwub2JqZWN0LnVzZXJEYXRhLmVkZ2UgJiYgaW50ZXJzZWN0ZWRXYWxsLm9iamVjdC51c2VyRGF0YS5lZGdlLndhbGw7XHJcbiAgICAgIHJldHVybiB3YWxscy5pbmRleE9mKHdhbGwpICE9PSAtMTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkV2FsbHMubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Zsb29ySW50ZXJzZWN0aW9uKHZlYzI6IFZlY3RvcjIpOiBJbnRlcnNlY3Rpb24ge1xyXG4gICAgY29uc3QgZmxvb3JQbGFuZXMgPSB0aGlzLl9yb29tU2VydmljZS5mbG9vclBsYW5lcygpO1xyXG4gICAgY29uc3QgZmxvb3JJbnRlcnNlY3RzID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyhcclxuICAgICAgdmVjMiwgZmxvb3JQbGFuZXMsIHtmaWx0ZXJCeU5vcm1hbHM6IGZhbHNlLCBpbmNsdWRlRmxvb3JzOiB0cnVlfSk7XHJcbiAgICBpZiAoZmxvb3JJbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIGZsb29ySW50ZXJzZWN0c1swXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcG9pbnRPbkZsb29yKHZlYzI6IFZlY3RvcjIpOiBWZWN0b3IzIHtcclxuICAgIGlmICh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCAmJlxyXG4gICAgICAhKGlzT25GbG9vclR5cGUodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QudXNlckRhdGEuaXRlbVR5cGUpIHx8IGlzSW5XYWxsVHlwZSh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdC51c2VyRGF0YS5pdGVtVHlwZSkpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaW50ZXJzZWN0ZWRGbG9vciA9IHRoaXMuX2Zsb29ySW50ZXJzZWN0aW9uKHZlYzIpO1xyXG4gICAgaWYgKCFpbnRlcnNlY3RlZEZsb29yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGludGVyc2VjdGVkV2FsbHMgPSB0aGlzLl93YWxsSW50ZXJzZWN0aW9ucyh2ZWMyKTtcclxuICAgIGlmICghaW50ZXJzZWN0ZWRXYWxscy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGludGVyc2VjdGVkRmxvb3IucG9pbnQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbnRlcnNlY3RlZEVkZ2VzID0gdGhpcy5fZWRnZUludGVyc2VjdGlvbnModmVjMik7XHJcbiAgICBpZiAodGhpcy5fd2FsbEVkZ2VJbnRlcnNlY3RlZChpbnRlcnNlY3RlZFdhbGxzLCBpbnRlcnNlY3RlZEVkZ2VzKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBpbnRlcnNlY3RlZEZsb29yLnBvaW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNNb3VzZUV2ZW50QWxsb3dlZChldmVudD86IEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZXZlbnQgPyAoZXZlbnQudGFyZ2V0ICYmIChldmVudC50YXJnZXQgYXMgRWxlbWVudCkubm9kZU5hbWUgPT09ICdDQU5WQVMnKSA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9tb3VzZU1vdmVFdmVudChldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2NlbmVFdmVudFN0YXRlLkRORCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZHJhZ092ZXJFdmVudC5iaW5kKHRoaXMpKGV2ZW50KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICBjb25zdCBtb3VzZVBvczogVmVjdG9yMiA9IGV2ZW50ID8gUmVsYXRpdmVQb3NpdGlvblV0aWxzLkdldENsaWVudE1vdXNlUG9zaXRpb24oZXZlbnQpIDogdGhpcy5fbW91c2VQb3NpdGlvbjtcclxuICAgICAgbGV0IGNhbnZhczogSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY2FudmFzID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLnNldChtb3VzZVBvcy54IC0gKGNhbnZhcyA/IGNhbnZhcy5vZmZzZXRMZWZ0IDogMCksIG1vdXNlUG9zLnkgLSAoY2FudmFzID8gY2FudmFzLm9mZnNldFRvcCA6IDApKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9vbGRNb3VzZVBvc2l0aW9uLnggIT09IG1vdXNlUG9zLnggJiYgdGhpcy5fb2xkTW91c2VQb3NpdGlvbi55ICE9PSBtb3VzZVBvcy55KSB7XHJcbiAgICAgICAgdGhpcy5fbW91c2VNb3ZlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5fbW91c2VEb3duKSB7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlSW50ZXJzZWN0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5pbnRlcnNlY3RlZFdhbGwgPSB0aGlzLl93YWxsSW50ZXJzZWN0aW9uKHRoaXMuX21vdXNlUG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5pbnRlcnNlY3RlZEZsb29yID0gdGhpcy5fZmxvb3JJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnJvdGF0ZU5vRHJhZykge1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuVU5TRUxFQ1RFRDpcclxuICAgICAgICAgIHRoaXMuX3VwZGF0ZU1vdXNlb3ZlcigpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5fbW91c2VEb3duICYmIHRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faHVkU2VydmljZS5jYW1lcmFSb3RhdGlvbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlTW91c2VvdmVyKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgICAgdGhpcy5faHVkU2VydmljZS5zdG9wRXhwbG9yZSgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX21vdXNlRG93bikge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSgnbW92ZScpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZXhwbG9yZVByZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tb3VzZW92ZXJPYmplY3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVFeHBsb3JlUG9pbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkc6XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkc6XHJcbiAgICAgICAgICB0aGlzLl9jbGlja0RyYWdnZWQoKTtcclxuICAgICAgICAgIHRoaXMuX21hcmtTY2VuZVRvVXBkYXRlKCk7XHJcbiAgICAgICAgICB0aGlzLl9ldmVudFNlcnZpY2Uub2JqZWN0TW92aW5nT3JSb3RhdGluZy5uZXh0KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lOR0NPTk5FQ1RPUjpcclxuICAgICAgICAgIHRoaXMuX2RyYWdDb25uZWN0b3IoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVFeHBsb3JlUG9pbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwb2ludCA9IHRoaXMuX3BvaW50T25GbG9vcih0aGlzLl9tb3VzZVBvc2l0aW9uKTtcclxuICAgIGlmIChwb2ludCkge1xyXG4gICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSgncG9pbnRlcicpO1xyXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKHBvaW50KTtcclxuICAgICAgdGhpcy5faHVkU2VydmljZS5leHBsb3JlRmxvb3JIb3Zlcih0aGlzLl9tb3VzZVBvc2l0aW9uLCBwb2ludCwgZGlzdGFuY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2V0Q3Vyc29yU3R5bGUoJ2Nyb3NzaGFpcicpO1xyXG4gICAgICB0aGlzLl9odWRTZXJ2aWNlLnN0b3BFeHBsb3JlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVFeHBsb3JlSW5kaWNhdG9yKCk6IHZvaWQge1xyXG4gICAgdGhpcy5faHVkU2VydmljZS5zdG9wRXhwbG9yZSgpO1xyXG4gICAgY29uc3QgcG9pbnQgPSB0aGlzLl9wb2ludE9uRmxvb3IodGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICBpZiAocG9pbnQpIHtcclxuICAgICAgdGhpcy5fc2V0Q3Vyc29yU3R5bGUoJ3BvaW50ZXInKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKCdjcm9zc2hhaXInKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FjY2VwdERyb3AoZXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIgJiYgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QpIHtcclxuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZWxlYXNlU3RhdGUoZHJhZ2dlZERhdGEpOiB2b2lkIHtcclxuICAgIGlmIChkcmFnZ2VkRGF0YSAmJiBkcmFnZ2VkRGF0YS5pc0NvcHkpIHtcclxuICAgICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZFRvSXRlbUdyb3VwKG9iamVjdDogSXRlbSwgcHJldlNlbGVjdGVkT2JqZWN0PzogYW55KSB7XHJcbiAgICBjb25zdCBpc0ludGVyc2VjdFdpdGhHcm91cE1lbWJlciA9IG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCB8fCBvYmplY3QucGFyZW50IGluc3RhbmNlb2YgSXRlbUdyb3VwO1xyXG4gICAgaWYgKCFpc0ludGVyc2VjdFdpdGhHcm91cE1lbWJlciAmJiAhb2JqZWN0LmNvbmZpZ3VyaW5nICYmIHRoaXMuX2Nhbkdyb3VwSXRlbXMob2JqZWN0LCBwcmV2U2VsZWN0ZWRPYmplY3QpKSB7XHJcbiAgICAgIGlmIChwcmV2U2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLmFkZElmTm90RXhpc3QocHJldlNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLmFkZE9yUmVtb3ZlSWZFeGlzdChvYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuR3JvdXBGbG9vckl0ZW0oaXRlbTogSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEoaXRlbSBpbnN0YW5jZW9mIFdhbGxJdGVtKSB8fCAoaXRlbSBpbnN0YW5jZW9mIEN1c3RvbVdhbGxGbG9vckl0ZW0gJiYgIShpdGVtIGFzIEN1c3RvbVdhbGxGbG9vckl0ZW0pLmN1cnJlbnRXYWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Nhbkdyb3VwV2FsbEl0ZW0oaXRlbTogSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgoaXRlbSBpbnN0YW5jZW9mIFdhbGxJdGVtICYmICEoaXRlbSBpbnN0YW5jZW9mIEluV2FsbEl0ZW0pKSB8fFxyXG4gICAgICAoaXRlbSBpbnN0YW5jZW9mIEN1c3RvbVdhbGxGbG9vckl0ZW0gJiYgKGl0ZW0gYXMgQ3VzdG9tV2FsbEZsb29ySXRlbSkuY3VycmVudFdhbGwgIT09IHVuZGVmaW5lZCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuR3JvdXBJdGVtcyhuZXdJdGVtOiBJdGVtLCBwcmV2aW91c0l0ZW06IEl0ZW0pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW5Hcm91cFdhbGxJdGVtKG5ld0l0ZW0pICYmIHRoaXMuX2Nhbkdyb3VwV2FsbEl0ZW0ocHJldmlvdXNJdGVtKSAmJlxyXG4gICAgICAobmV3SXRlbSBhcyBXYWxsSXRlbSkuY3VycmVudFdhbGwgPT09IChwcmV2aW91c0l0ZW0gYXMgV2FsbEl0ZW0pLmN1cnJlbnRXYWxsIHx8XHJcbiAgICAgIHRoaXMuX2Nhbkdyb3VwRmxvb3JJdGVtKG5ld0l0ZW0pICYmIHRoaXMuX2Nhbkdyb3VwRmxvb3JJdGVtKHByZXZpb3VzSXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zd2l0Y2hTdGF0ZShuZXdTdGF0ZTogU2NlbmVFdmVudFN0YXRlKTogdm9pZCB7XHJcbiAgICBpZiAobmV3U3RhdGUgIT09IHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgIHRoaXMuX29uRXhpdCh0aGlzLl9zdGF0ZSk7XHJcbiAgICAgIHRoaXMuX29uRW50cnkobmV3U3RhdGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc3RhdGUgPSBuZXdTdGF0ZTtcclxuICAgIHRoaXMuX2h1ZFNlcnZpY2Uuc2V0Um90YXRpbmcodGhpcy5faXNSb3RhdGluZygpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uRW50cnkob25TdGF0ZTogU2NlbmVFdmVudFN0YXRlKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKG9uU3RhdGUpIHtcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuVU5TRUxFQ1RFRDpcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkT2JqZWN0KG51bGwpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRDpcclxuICAgICAgICB0aGlzLl9jb250cm9scy5lbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkc6XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHMuZW5hYmxlZCA9IHRoaXMuX2FwcFNlcnZpY2Uuc2t1O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lORzpcclxuICAgICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSgnbW92ZScpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrUHJlc3NlZCgpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkdDT05ORUNUT1I6XHJcbiAgICAgICAgdGhpcy5fY2xpY2tDb25uZWN0b3JQcmVzc2VkKCk7XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHMuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgIHRoaXMuX292ZXJyaWRlRGVmYXVsdEN1cnNvclN0eWxlKCdwb2ludGVyJyk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE9iamVjdChudWxsKTtcclxuICAgICAgICB0aGlzLl9jYW1lcmFNb3ZlU3ViID0gdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFNb3ZlbWVudENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3VwZGF0ZUV4cGxvcmVJbmRpY2F0b3IoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkV4aXQob25TdGF0ZTogU2NlbmVFdmVudFN0YXRlKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKG9uU3RhdGUpIHtcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuVU5TRUxFQ1RFRDpcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLkRSQUdHSU5HOlxyXG4gICAgICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKHRoaXMuX2RlZmF1bHRDdXJzb3JTdHlsZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlJPVEFUSU5HOlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgIHRoaXMuX292ZXJyaWRlRGVmYXVsdEN1cnNvclN0eWxlKCdhdXRvJyk7XHJcbiAgICAgICAgdGhpcy5faHVkU2VydmljZS5zdG9wRXhwbG9yZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYW1lcmFNb3ZlU3ViKSB7XHJcbiAgICAgICAgICB0aGlzLl9jYW1lcmFNb3ZlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0SW50ZXJzZWN0ZWRPYmplY3QobWVzaDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbnRlcnNlY3RlZE1lc2ggPSBtZXNoO1xyXG4gICAgaWYgKHR5cGVvZiBtZXNoWydnZXRSb290J10gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhpcy5faW50ZXJzZWN0ZWRPYmplY3QgPSBtZXNoLmdldFJvb3QoKTtcclxuICAgIH0gZWxzZSBpZiAobWVzaC5wYXJlbnQpIHtcclxuICAgICAgdGhpcy5fc2V0SW50ZXJzZWN0ZWRPYmplY3QobWVzaC5wYXJlbnQgYXMgSXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZXZlcnRlZCBjaGFuZ2VzIGZyb20gSU9ORS0zMTM5OVxyXG4gIHByaXZhdGUgX21vdXNlVG9WZWMzKHZlYzI6IFZlY3RvcjIpOiBWZWN0b3IzIHtcclxuICAgIGNvbnN0IHJlbmRlcmVyRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XHJcbiAgICBjb25zdCBtUG9zaXRpb24gPSBuZXcgVmVjdG9yMihcclxuICAgICAgKHZlYzIueCAvIHJlbmRlcmVyRWxlbWVudC5jbGllbnRXaWR0aCkgKiAyIC0gMSxcclxuICAgICAgLSh2ZWMyLnkgLyByZW5kZXJlckVsZW1lbnQuY2xpZW50SGVpZ2h0KSAqIDIgKyAxXHJcbiAgICApO1xyXG4gICAgY29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjMobVBvc2l0aW9uLngsIG1Qb3NpdGlvbi55LCAwLjUpO1xyXG4gICAgdmVjdG9yLnVucHJvamVjdCh0aGlzLl9jYW1lcmEpO1xyXG4gICAgcmV0dXJuIHZlY3RvcjtcclxuXHJcbiAgICAvLyBjb25zdCByZW5kZXJlckVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xyXG4gICAgLy8gY29uc3QgbVBvc2l0aW9uID0gbmV3IFZlY3RvcjIoXHJcbiAgICAvLyAgICh2ZWMyLnggLyByZW5kZXJlckVsZW1lbnQuY2xpZW50V2lkdGgpICogMiAtIDEsXHJcbiAgICAvLyAgIC0odmVjMi55IC8gcmVuZGVyZXJFbGVtZW50LmNsaWVudEhlaWdodCkgKiAyICsgMVxyXG4gICAgLy8gKTtcclxuICAgIC8vIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IzKG1Qb3NpdGlvbi54LCBtUG9zaXRpb24ueSwgMC41KTtcclxuICAgIC8vIHZlY3Rvci51bnByb2plY3QodGhpcy5fY2FtZXJhKTtcclxuICAgIC8vIHJldHVybiB2ZWN0b3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRTZWxlY3RPYmplY3Qob2JqZWN0OiBJdGVtIHwgSXRlbUdyb3VwLCBtZXNoPzogTWVzaCk6IHZvaWQge1xyXG4gICAgb2JqZWN0LnNldFNlbGVjdGVkKG1lc2gsIHRoaXMuX21vdXNlVG9WZWMzKHRoaXMuX21vdXNlUG9zaXRpb24pKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkT2JqZWN0ID0gb2JqZWN0O1xyXG4gICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5JdGVtU2VsZWN0ZWQsIG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVNb3VzZW92ZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5fbW91c2VvdmVyT2JqZWN0ICE9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fbW91c2VvdmVyT2JqZWN0ICE9PSB0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgdGhpcy5fc2V0T2JqZWN0TW91c2VPZmYodGhpcy5fbW91c2VvdmVyT2JqZWN0KTtcclxuICAgICAgICAgIHRoaXMuX21vdXNlb3Zlck9iamVjdCA9IHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5fc2V0T2JqZWN0TW91c2VPdmVyKHRoaXMuX21vdXNlb3Zlck9iamVjdCwgdGhpcy5faW50ZXJzZWN0ZWRNZXNoKTtcclxuICAgICAgICAgIHRoaXMuX21hcmtTY2VuZVRvVXBkYXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIG1vdXNlb3ZlciBhbHJlYWR5IHNldFxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9tb3VzZW92ZXJPYmplY3QgPSB0aGlzLl9pbnRlcnNlY3RlZE9iamVjdDtcclxuICAgICAgICB0aGlzLl9zZXRPYmplY3RNb3VzZU92ZXIodGhpcy5fbW91c2VvdmVyT2JqZWN0LCB0aGlzLl9pbnRlcnNlY3RlZE1lc2gpO1xyXG4gICAgICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKCdwb2ludGVyJyk7XHJcbiAgICAgICAgdGhpcy5fbWFya1NjZW5lVG9VcGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9tb3VzZW92ZXJPYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXRPYmplY3RNb3VzZU9mZih0aGlzLl9tb3VzZW92ZXJPYmplY3QpO1xyXG4gICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSh0aGlzLl9kZWZhdWx0Q3Vyc29yU3R5bGUpO1xyXG4gICAgICB0aGlzLl9tb3VzZW92ZXJPYmplY3QgPSBudWxsO1xyXG4gICAgICB0aGlzLl9tYXJrU2NlbmVUb1VwZGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0T2JqZWN0TW91c2VPdmVyKG9iamVjdDogSXRlbUdyb3VwIHwgSXRlbSwgbWVzaDogTWVzaCk6IHZvaWQge1xyXG4gICAgaWYgKG9iamVjdC5wYXJlbnQgJiYgb2JqZWN0LnBhcmVudCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkge1xyXG4gICAgICBvYmplY3QucGFyZW50Lm1vdXNlT3ZlcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb2JqZWN0Lm1vdXNlT3ZlcihtZXNoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE9iamVjdE1vdXNlT2ZmKG9iamVjdDogSXRlbUdyb3VwIHwgSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKG9iamVjdC5wYXJlbnQgJiYgb2JqZWN0LnBhcmVudCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkge1xyXG4gICAgICBvYmplY3QucGFyZW50Lm1vdXNlT2ZmKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmplY3QubW91c2VPZmYoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21hcmtTY2VuZVRvVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEN1cnNvclN0eWxlKHN0eWxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuY3Vyc29yID0gc3R5bGU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|