@colijnit/configurator 261.1.0 → 261.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/bundles/colijnit-configurator.umd.js +18012 -1838
- package/bundles/colijnit-configurator.umd.js.map +1 -1
- package/colijnit-configurator.d.ts +2 -6
- package/esm2015/colijnit-configurator.js +2 -7
- package/esm2015/lib/builder.js +795 -0
- package/esm2015/lib/components/answer-card/answer-card.component.js +313 -0
- package/esm2015/lib/components/answer-card/answer-card.module.js +50 -0
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +182 -0
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +34 -0
- package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +490 -0
- package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +61 -0
- package/esm2015/lib/components/color-filter/color-filter.component.js +59 -0
- package/esm2015/lib/components/color-filter/color-filter.module.js +26 -0
- package/esm2015/lib/components/configurator/configurator.component.js +133 -0
- package/esm2015/lib/components/configurator/configurator.module.js +42 -0
- package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +222 -0
- package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +48 -0
- package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +82 -0
- package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +163 -0
- package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +49 -0
- package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +33 -0
- package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +60 -0
- package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +17 -0
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +46 -0
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +26 -0
- package/esm2015/lib/components/element-buttons/element-buttons.component.js +168 -0
- package/esm2015/lib/components/element-buttons/element-buttons.module.js +30 -0
- package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +186 -0
- package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +34 -0
- package/esm2015/lib/components/image-zoom/image-zoom.component.js +61 -0
- package/esm2015/lib/components/image-zoom/image-zoom.module.js +30 -0
- package/esm2015/lib/components/lite-selector/lite-selector.component.js +206 -0
- package/esm2015/lib/components/lite-selector/lite-selector.module.js +34 -0
- package/esm2015/lib/components/product-configurator/product-configurator.component.js +184 -0
- package/esm2015/lib/components/product-configurator/product-configurator.module.js +72 -0
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +237 -0
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +38 -0
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +284 -0
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +42 -0
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +72 -0
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +34 -0
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +82 -0
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +30 -0
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +80 -0
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +34 -0
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +93 -0
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +34 -0
- package/esm2015/lib/components/progress-bar/progress-bar.component.js +55 -0
- package/esm2015/lib/components/progress-bar/progress-bar.module.js +29 -0
- package/esm2015/lib/components/scene-options/scene-options.component.js +164 -0
- package/esm2015/lib/components/scene-options/scene-options.module.js +38 -0
- package/esm2015/lib/components/selections-summary/selections-summary.component.js +163 -0
- package/esm2015/lib/components/selections-summary/selections-summary.module.js +45 -0
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +171 -0
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +34 -0
- package/esm2015/lib/components/slideout/slideout.component.js +83 -0
- package/esm2015/lib/components/slideout/slideout.module.js +17 -0
- package/esm2015/lib/components/summary-line/summary-line.component.js +273 -0
- package/esm2015/lib/components/summary-line/summary-line.module.js +44 -0
- package/esm2015/lib/components/tag-filter/tag-filter.component.js +39 -0
- package/esm2015/lib/components/tag-filter/tag-filter.module.js +21 -0
- package/esm2015/lib/components/threedselector/threedselector.component.js +155 -0
- package/esm2015/lib/components/threedselector/threedselector.module.js +34 -0
- package/esm2015/lib/core/helper/variation-helper.js +553 -0
- package/esm2015/lib/core/shader/floor-fade.shader.js +33 -0
- package/esm2015/lib/core/textures/depth-data-texture.js +19 -0
- package/esm2015/lib/directives/directives.module.js +26 -0
- package/esm2015/lib/directives/visibility-observer-master.directive.js +53 -0
- package/esm2015/lib/directives/visibility-observer.directive.js +54 -0
- package/esm2015/lib/enum/ar-feature.enum.js +14 -0
- package/esm2015/lib/enum/configuration-key.enum.js +41 -0
- package/esm2015/lib/enum/configuration-template.enum.js +6 -0
- package/esm2015/lib/enum/device-size-type.js +7 -0
- package/esm2015/lib/enum/device-tier.enum.js +7 -0
- package/esm2015/lib/enum/icon.enum.js +113 -0
- package/esm2015/lib/enum/item-type.enum.js +23 -0
- package/esm2015/lib/enum/light.enum.js +9 -0
- package/esm2015/lib/enum/navigator-type.enum.js +6 -0
- package/esm2015/lib/enum/output-encoding.enum.js +9 -0
- package/esm2015/lib/enum/result-type.enum.js +21 -0
- package/esm2015/lib/enum/scene-event.enum.js +12 -0
- package/esm2015/lib/enum/shadow-map-type.enum.js +8 -0
- package/esm2015/lib/enum/texture-type.js +9 -0
- package/esm2015/lib/enum/tone-mapping-local.enum.js +12 -0
- package/esm2015/lib/enum/view-mode.enum.js +7 -0
- package/esm2015/lib/enum/xr-mode.enum.js +6 -0
- package/esm2015/lib/environments/environment.js +8 -0
- package/esm2015/lib/interfaces/aa-options.interface.js +2 -0
- package/esm2015/lib/interfaces/adjustable-element.interface.js +2 -0
- package/esm2015/lib/interfaces/ao-options.interface.js +2 -0
- package/esm2015/lib/interfaces/changes.interface.js +2 -0
- package/esm2015/lib/interfaces/configuration-data.interface.js +2 -0
- package/esm2015/lib/interfaces/light-preset.interface.js +2 -0
- package/esm2015/lib/interfaces/post-processing-setting.interface.js +2 -0
- package/esm2015/lib/interfaces/scene-option-button.interface.js +6 -0
- package/esm2015/lib/interfaces/screen-size-info.js +2 -0
- package/esm2015/lib/interfaces/setting.interface.js +2 -0
- package/esm2015/lib/interfaces/texture.interface.js +2 -0
- package/esm2015/lib/interfaces/vignette-options.interface.js +2 -0
- package/esm2015/lib/model/ar-position-indicator.js +18 -0
- package/esm2015/lib/model/camera-settings.js +14 -0
- package/esm2015/lib/model/configuration-result-object.js +6 -0
- package/esm2015/lib/model/configurator-error-message.js +9 -0
- package/esm2015/lib/model/configurator-settings.js +25 -0
- package/esm2015/lib/model/custom-button.js +16 -0
- package/esm2015/lib/model/factory.js +28 -0
- package/esm2015/lib/model/icon.js +112 -0
- package/esm2015/lib/model/intersected-objects.js +7 -0
- package/esm2015/lib/model/light-preset.js +73 -0
- package/esm2015/lib/model/light-properties.js +45 -0
- package/esm2015/lib/model/material.js +11 -0
- package/esm2015/lib/model/metadata.js +2 -0
- package/esm2015/lib/model/render-parameters.js +16 -0
- package/esm2015/lib/model/setting-options.js +71 -0
- package/esm2015/lib/model/settings.js +16 -0
- package/esm2015/lib/model/shadow-properties.js +10 -0
- package/esm2015/lib/model/skin.js +3 -0
- package/esm2015/lib/model/texture.js +76 -0
- package/esm2015/lib/model/variation-settings.js +54 -0
- package/esm2015/lib/model/variation.js +3 -0
- package/esm2015/lib/model/xr-reticle.js +79 -0
- package/esm2015/lib/modules/render/enum/scene-type.enum.js +6 -0
- package/esm2015/lib/modules/render/model/ar-parameters.js +12 -0
- package/esm2015/lib/modules/render/model/scene-setting.js +6 -0
- package/esm2015/lib/modules/render/model/scene-settings.js +3 -0
- package/esm2015/lib/pipes/append.pipe.js +21 -0
- package/esm2015/lib/pipes/google-translate.pipe.js +21 -0
- package/esm2015/lib/pipes/localize.pipe.js +28 -0
- package/esm2015/lib/pipes/pipes.module.js +41 -0
- package/esm2015/lib/pipes/prepend.pipe.js +21 -0
- package/esm2015/lib/pipes/strip-html.pipe.js +17 -0
- package/esm2015/lib/services/app-event.service.js +36 -0
- package/esm2015/lib/services/app-initializer.service.js +27 -0
- package/esm2015/lib/services/ar.service.js +844 -0
- package/esm2015/lib/services/build-furniture-base.service.js +1181 -0
- package/esm2015/lib/services/build-furniture-without-scene.service.js +86 -0
- package/esm2015/lib/services/build-furniture.service.js +169 -0
- package/esm2015/lib/services/bundle-initialzer.service.js +113 -0
- package/esm2015/lib/services/camera.service.js +123 -0
- package/esm2015/lib/services/configuration.service.js +79 -0
- package/esm2015/lib/services/configurator-connector.service.js +830 -0
- package/esm2015/lib/services/configurator.service.js +285 -0
- package/esm2015/lib/services/configuring.service.js +119 -0
- package/esm2015/lib/services/controls.js +799 -0
- package/esm2015/lib/services/debug.service.js +43 -0
- package/esm2015/lib/services/dictionary.service.js +65 -0
- package/esm2015/lib/services/dynamic-camera.service.js +96 -0
- package/esm2015/lib/services/floor-plane.service.js +252 -0
- package/esm2015/lib/services/font.service.js +27 -0
- package/esm2015/lib/services/google-translate.service.js +79 -0
- package/esm2015/lib/services/icon-cache.service.js +44 -0
- package/esm2015/lib/services/intersection.service.js +47 -0
- package/esm2015/lib/services/item.service.js +75 -0
- package/esm2015/lib/services/json-utils.service.js +48 -0
- package/esm2015/lib/services/light-creation.service.js +35 -0
- package/esm2015/lib/services/light-presets.service.js +157 -0
- package/esm2015/lib/services/lights.service.js +146 -0
- package/esm2015/lib/services/load-furniture-base.service.js +164 -0
- package/esm2015/lib/services/load-furniture-without-scene.service.js +45 -0
- package/esm2015/lib/services/load-furniture.service.js +72 -0
- package/esm2015/lib/services/loader.service.js +32 -0
- package/esm2015/lib/services/locator.service.js +11 -0
- package/esm2015/lib/services/message-board.service.js +50 -0
- package/esm2015/lib/services/post-processing.service.js +378 -0
- package/esm2015/lib/services/product-configurator.service.js +16 -0
- package/esm2015/lib/services/progress.service.js +20 -0
- package/esm2015/lib/services/scene-event.service.js +246 -0
- package/esm2015/lib/services/scene-options.service.js +24 -0
- package/esm2015/lib/services/scene.service.js +313 -0
- package/esm2015/lib/services/screen-size-analysis.service.js +97 -0
- package/esm2015/lib/services/settings.service.js +142 -0
- package/esm2015/lib/services/switch-build-furniture.service.js +37 -0
- package/esm2015/lib/services/switch-load-furniture.service.js +35 -0
- package/esm2015/lib/services/threedselector.service.js +72 -0
- package/esm2015/lib/services/utils.service.js +207 -0
- package/esm2015/lib/services/variation-cache.service.js +143 -0
- package/esm2015/lib/services/variation.service.js +490 -0
- package/esm2015/lib/services/view-mode.service.js +37 -0
- package/esm2015/lib/services/vr.service.js +191 -0
- package/esm2015/lib/services/xr.service.js +294 -0
- package/esm2015/lib/utils/asset.utils.js +120 -0
- package/esm2015/lib/utils/base-utils.js +9 -0
- package/esm2015/lib/utils/color.utils.js +30 -0
- package/esm2015/lib/utils/debug.utils.js +9 -0
- package/esm2015/lib/utils/device.utils.js +25 -0
- package/esm2015/lib/utils/file.utils.js +167 -0
- package/esm2015/lib/utils/image.utils.js +61 -0
- package/esm2015/lib/utils/json-parser.utils.js +180 -0
- package/esm2015/lib/utils/material.utils.js +433 -0
- package/esm2015/lib/utils/object.utils.js +360 -0
- package/esm2015/lib/utils/relative-position.utils.js +75 -0
- package/esm2015/lib/utils/rotation-helper.utils.js +15 -0
- package/esm2015/lib/utils/scene-3d.utils.js +213 -0
- package/esm2015/lib/utils/scene-utils.js +191 -0
- package/esm2015/lib/utils/text-utils.js +68 -0
- package/esm2015/lib/utils/threed.utils.js +281 -0
- package/esm2015/lib/utils/variation-utils.js +459 -0
- package/esm2015/public-api.js +65 -0
- package/fesm2015/colijnit-configurator.js +17512 -1451
- package/fesm2015/colijnit-configurator.js.map +1 -1
- package/{app → lib}/builder.d.ts +9 -1
- package/lib/components/answer-card/answer-card.component.d.ts +58 -0
- package/lib/components/answer-card/answer-card.module.d.ts +11 -0
- package/lib/components/answer-card/style/_layout.scss +88 -0
- package/lib/components/answer-card/style/_material-definition.scss +3 -0
- package/lib/components/answer-card/style/_theme.scss +67 -0
- package/lib/components/answer-card/style/material.scss +2 -0
- package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +38 -0
- package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +10 -0
- package/lib/components/answer-info-dialog/style/_layout.scss +88 -0
- package/lib/components/answer-info-dialog/style/_material-definition.scss +3 -0
- package/lib/components/answer-info-dialog/style/_theme.scss +44 -0
- package/lib/components/answer-info-dialog/style/material.scss +3 -0
- package/lib/components/answers-slideout/answers-slideout.component.d.ts +86 -0
- package/lib/components/answers-slideout/answers-slideout.module.d.ts +16 -0
- package/lib/components/answers-slideout/style/_layout.scss +198 -0
- package/lib/components/answers-slideout/style/_material-definition.scss +3 -0
- package/lib/components/answers-slideout/style/_theme.scss +54 -0
- package/lib/components/answers-slideout/style/material.scss +3 -0
- package/lib/components/color-filter/color-filter.component.d.ts +20 -0
- package/lib/components/color-filter/color-filter.module.d.ts +8 -0
- package/lib/components/color-filter/style/_layout.scss +41 -0
- package/lib/components/color-filter/style/_material-definition.scss +3 -0
- package/lib/components/color-filter/style/_theme.scss +7 -0
- package/lib/components/color-filter/style/material.scss +3 -0
- package/lib/components/configurator/configurator.component.d.ts +37 -0
- package/lib/components/configurator/configurator.module.d.ts +12 -0
- package/lib/components/configurator/style/_layout.scss +7 -0
- package/lib/components/configurator/style/_material-definition.scss +3 -0
- package/lib/components/configurator/style/_theme.scss +7 -0
- package/lib/components/configurator/style/material.scss +3 -0
- package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +30 -0
- package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +13 -0
- package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +16 -0
- package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +26 -0
- package/lib/components/configurator-dialog/style/_layout.scss +129 -0
- package/lib/components/configurator-dialog/style/_material-definition.scss +4 -0
- package/lib/components/configurator-dialog/style/_theme.scss +89 -0
- package/lib/components/configurator-dialog/style/material.scss +3 -0
- package/lib/components/configurator-loader/configurator-loader.component.d.ts +7 -0
- package/lib/components/configurator-loader/configurator-loader.module.d.ts +9 -0
- package/lib/components/configurator-loader/style/_layout.scss +72 -0
- package/lib/components/configurator-loader/style/_material-definition.scss +5 -0
- package/lib/components/configurator-loader/style/_theme.scss +26 -0
- package/lib/components/configurator-loader/style/material.scss +14 -0
- package/lib/components/configurator-scene/configurator-scene.component.d.ts +24 -0
- package/lib/components/configurator-scene/configurator-scene.module.d.ts +7 -0
- package/lib/components/configurator-scene/style/_layout.scss +22 -0
- package/lib/components/configurator-scene/style/_material-definition.scss +3 -0
- package/lib/components/configurator-scene/style/_theme.scss +7 -0
- package/lib/components/configurator-scene/style/material.scss +3 -0
- package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +7 -0
- package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +8 -0
- package/lib/components/configurator-scene-loader/style/_layout.scss +72 -0
- package/lib/components/configurator-scene-loader/style/_material-definition.scss +5 -0
- package/lib/components/configurator-scene-loader/style/_theme.scss +26 -0
- package/lib/components/configurator-scene-loader/style/material.scss +14 -0
- package/lib/components/element-buttons/element-buttons.component.d.ts +32 -0
- package/lib/components/element-buttons/element-buttons.module.d.ts +9 -0
- package/lib/components/element-buttons/style/_layout.scss +52 -0
- package/lib/components/element-buttons/style/_material-definition.scss +3 -0
- package/lib/components/element-buttons/style/_theme.scss +23 -0
- package/lib/components/element-buttons/style/material.scss +3 -0
- package/lib/components/element-toolbar/element-toolbar.component.d.ts +27 -0
- package/lib/components/element-toolbar/element-toolbar.component.scss +59 -0
- package/lib/components/element-toolbar/element-toolbar.module.d.ts +10 -0
- package/lib/components/element-toolbar/style/_layout.scss +107 -0
- package/lib/components/element-toolbar/style/_material-definition.scss +3 -0
- package/lib/components/element-toolbar/style/_theme.scss +47 -0
- package/lib/components/element-toolbar/style/material.scss +3 -0
- package/lib/components/image-zoom/image-zoom.component.d.ts +15 -0
- package/lib/components/image-zoom/image-zoom.module.d.ts +9 -0
- package/lib/components/image-zoom/style/_layout.scss +51 -0
- package/lib/components/image-zoom/style/_material-definition.scss +3 -0
- package/lib/components/image-zoom/style/_theme.scss +17 -0
- package/lib/components/image-zoom/style/material.scss +3 -0
- package/lib/components/lite-selector/lite-selector.component.d.ts +40 -0
- package/lib/components/lite-selector/lite-selector.module.d.ts +10 -0
- package/lib/components/lite-selector/style/_layout.scss +21 -0
- package/lib/components/lite-selector/style/_material-definition.scss +3 -0
- package/lib/components/lite-selector/style/_theme.scss +7 -0
- package/lib/components/lite-selector/style/material.scss +3 -0
- package/lib/components/product-configurator/product-configurator.component.d.ts +50 -0
- package/lib/components/product-configurator/product-configurator.module.d.ts +15 -0
- package/lib/components/product-configurator/style/_layout.scss +46 -0
- package/lib/components/product-configurator/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator/style/_theme.scss +22 -0
- package/lib/components/product-configurator/style/material.scss +3 -0
- package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +35 -0
- package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +11 -0
- package/lib/components/product-configurator-selector/style/_layout.scss +145 -0
- package/lib/components/product-configurator-selector/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector/style/_theme.scss +57 -0
- package/lib/components/product-configurator-selector/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +31 -0
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +13 -0
- package/lib/components/product-configurator-selector-option/style/_layout.scss +7 -0
- package/lib/components/product-configurator-selector-option/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option/style/_theme.scss +7 -0
- package/lib/components/product-configurator-selector-option/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +20 -0
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-button/style/_layout.scss +28 -0
- package/lib/components/product-configurator-selector-option-button/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-button/style/_theme.scss +33 -0
- package/lib/components/product-configurator-selector-option-button/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +20 -0
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_layout.scss +28 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +27 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +21 -0
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_layout.scss +34 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_theme.scss +28 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +21 -0
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +58 -0
- package/lib/components/product-configurator-selector-option-tile/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +56 -0
- package/lib/components/product-configurator-selector-option-tile/style/material.scss +3 -0
- package/lib/components/progress-bar/progress-bar.component.d.ts +10 -0
- package/lib/components/progress-bar/progress-bar.component.scss +14 -0
- package/lib/components/progress-bar/progress-bar.module.d.ts +8 -0
- package/lib/components/progress-bar/style/_layout.scss +18 -0
- package/lib/components/progress-bar/style/_material-definition.scss +3 -0
- package/lib/components/progress-bar/style/_theme.scss +10 -0
- package/lib/components/progress-bar/style/material.scss +3 -0
- package/lib/components/scene-options/scene-options.component.d.ts +24 -0
- package/lib/components/scene-options/scene-options.module.d.ts +11 -0
- package/lib/components/scene-options/style/_layout.scss +52 -0
- package/lib/components/scene-options/style/_material-definition.scss +3 -0
- package/lib/components/scene-options/style/_theme.scss +7 -0
- package/lib/components/scene-options/style/material.scss +3 -0
- package/lib/components/selections-summary/selections-summary.component.d.ts +38 -0
- package/lib/components/selections-summary/selections-summary.module.d.ts +12 -0
- package/lib/components/selections-summary/style/_layout.scss +87 -0
- package/lib/components/selections-summary/style/_material-definition.scss +5 -0
- package/lib/components/selections-summary/style/_theme.scss +13 -0
- package/lib/components/selections-summary/style/material.scss +3 -0
- package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +27 -0
- package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +10 -0
- package/lib/components/selections-summary-line/style/_layout.scss +12 -0
- package/lib/components/selections-summary-line/style/_material-definition.scss +4 -0
- package/lib/components/selections-summary-line/style/_theme.scss +12 -0
- package/lib/components/selections-summary-line/style/material.scss +3 -0
- package/lib/components/slideout/slideout.component.d.ts +22 -0
- package/lib/components/slideout/slideout.module.d.ts +7 -0
- package/lib/components/slideout/style/_layout.scss +27 -0
- package/lib/components/slideout/style/_material-definition.scss +3 -0
- package/lib/components/slideout/style/_theme.scss +5 -0
- package/lib/components/slideout/style/material.scss +3 -0
- package/lib/components/summary-line/style/_layout.scss +137 -0
- package/lib/components/summary-line/style/_material-definition.scss +4 -0
- package/lib/components/summary-line/style/_theme.scss +56 -0
- package/lib/components/summary-line/style/material.scss +3 -0
- package/lib/components/summary-line/summary-line.component.d.ts +50 -0
- package/lib/components/summary-line/summary-line.module.d.ts +11 -0
- package/lib/components/tag-filter/style/_layout.scss +14 -0
- package/lib/components/tag-filter/style/_material-definition.scss +3 -0
- package/lib/components/tag-filter/style/_theme.scss +7 -0
- package/lib/components/tag-filter/style/material.scss +3 -0
- package/lib/components/tag-filter/tag-filter.component.d.ts +9 -0
- package/lib/components/tag-filter/tag-filter.module.d.ts +7 -0
- package/lib/components/threedselector/style/_layout.scss +32 -0
- package/lib/components/threedselector/style/_material-definition.scss +3 -0
- package/lib/components/threedselector/style/_theme.scss +7 -0
- package/lib/components/threedselector/style/material.scss +9 -0
- package/lib/components/threedselector/threedselector.component.d.ts +38 -0
- package/lib/components/threedselector/threedselector.module.d.ts +10 -0
- package/{helper → lib/core/helper}/variation-helper.d.ts +2 -2
- package/lib/core/shader/floor-fade.shader.d.ts +5 -0
- package/lib/core/textures/depth-data-texture.d.ts +5 -0
- package/lib/directives/directives.module.d.ts +8 -0
- package/{app → lib}/directives/visibility-observer-master.directive.d.ts +3 -0
- package/{app → lib}/directives/visibility-observer.directive.d.ts +3 -0
- package/lib/enum/ar-feature.enum.d.ts +12 -0
- package/lib/enum/configuration-key.enum.d.ts +39 -0
- package/lib/enum/configuration-template.enum.d.ts +4 -0
- package/lib/enum/device-size-type.d.ts +5 -0
- package/lib/enum/device-tier.enum.d.ts +5 -0
- package/lib/enum/icon.enum.d.ts +111 -0
- package/lib/enum/item-type.enum.d.ts +21 -0
- package/lib/enum/light.enum.d.ts +7 -0
- package/lib/enum/navigator-type.enum.d.ts +4 -0
- package/lib/enum/output-encoding.enum.d.ts +7 -0
- package/lib/enum/result-type.enum.d.ts +19 -0
- package/lib/enum/scene-event.enum.d.ts +10 -0
- package/lib/enum/shadow-map-type.enum.d.ts +6 -0
- package/lib/enum/texture-type.d.ts +7 -0
- package/lib/enum/tone-mapping-local.enum.d.ts +10 -0
- package/lib/enum/view-mode.enum.d.ts +5 -0
- package/lib/enum/xr-mode.enum.d.ts +4 -0
- package/lib/environments/environment.d.ts +4 -0
- package/lib/interfaces/aa-options.interface.d.ts +4 -0
- package/lib/interfaces/adjustable-element.interface.d.ts +5 -0
- package/lib/interfaces/ao-options.interface.d.ts +18 -0
- package/lib/interfaces/changes.interface.d.ts +9 -0
- package/lib/interfaces/configuration-data.interface.d.ts +40 -0
- package/lib/interfaces/light-preset.interface.d.ts +22 -0
- package/lib/interfaces/post-processing-setting.interface.d.ts +11 -0
- package/lib/interfaces/scene-option-button.interface.d.ts +19 -0
- package/lib/interfaces/screen-size-info.d.ts +10 -0
- package/lib/interfaces/setting.interface.d.ts +8 -0
- package/lib/interfaces/texture.interface.d.ts +44 -0
- package/lib/interfaces/vignette-options.interface.d.ts +4 -0
- package/lib/model/ar-position-indicator.d.ts +4 -0
- package/lib/model/camera-settings.d.ts +12 -0
- package/lib/model/configuration-result-object.d.ts +30 -0
- package/lib/model/configurator-error-message.d.ts +8 -0
- package/lib/model/configurator-settings.d.ts +62 -0
- package/lib/model/custom-button.d.ts +10 -0
- package/lib/model/factory.d.ts +5 -0
- package/lib/model/icon.d.ts +4 -0
- package/lib/model/intersected-objects.d.ts +6 -0
- package/lib/model/light-preset.d.ts +33 -0
- package/lib/model/light-properties.d.ts +25 -0
- package/lib/model/material.d.ts +41 -0
- package/lib/model/metadata.d.ts +78 -0
- package/lib/model/render-parameters.d.ts +12 -0
- package/lib/model/setting-options.d.ts +67 -0
- package/lib/model/settings.d.ts +10 -0
- package/lib/model/shadow-properties.d.ts +7 -0
- package/lib/model/skin.d.ts +15 -0
- package/lib/model/texture.d.ts +52 -0
- package/{model → lib/model}/variation-settings.d.ts +9 -8
- package/{model → lib/model}/variation.d.ts +2 -1
- package/lib/model/xr-reticle.d.ts +17 -0
- package/lib/modules/render/enum/scene-type.enum.d.ts +4 -0
- package/lib/modules/render/model/ar-parameters.d.ts +9 -0
- package/lib/modules/render/model/scene-setting.d.ts +13 -0
- package/lib/modules/render/model/scene-settings.d.ts +4 -0
- package/lib/pipes/append.pipe.d.ts +7 -0
- package/lib/pipes/google-translate.pipe.d.ts +11 -0
- package/lib/pipes/localize.pipe.d.ts +10 -0
- package/lib/pipes/pipes.module.d.ts +11 -0
- package/lib/pipes/prepend.pipe.d.ts +7 -0
- package/lib/pipes/strip-html.pipe.d.ts +7 -0
- package/lib/services/app-event.service.d.ts +32 -0
- package/lib/services/app-initializer.service.d.ts +14 -0
- package/lib/services/ar.service.d.ts +120 -0
- package/lib/services/build-furniture-base.service.d.ts +117 -0
- package/lib/services/build-furniture-without-scene.service.d.ts +14 -0
- package/lib/services/build-furniture.service.d.ts +14 -0
- package/lib/services/bundle-initialzer.service.d.ts +45 -0
- package/lib/services/camera.service.d.ts +44 -0
- package/lib/services/configuration.service.d.ts +18 -0
- package/lib/services/configurator-connector.service.d.ts +140 -0
- package/lib/services/configurator.service.d.ts +62 -0
- package/lib/services/configuring.service.d.ts +46 -0
- package/lib/services/controls.d.ts +11 -0
- package/lib/services/debug.service.d.ts +16 -0
- package/lib/services/dictionary.service.d.ts +15 -0
- package/lib/services/dynamic-camera.service.d.ts +21 -0
- package/lib/services/floor-plane.service.d.ts +47 -0
- package/lib/services/font.service.d.ts +10 -0
- package/lib/services/google-translate.service.d.ts +26 -0
- package/lib/services/icon-cache.service.d.ts +21 -0
- package/lib/services/intersection.service.d.ts +11 -0
- package/lib/services/item.service.d.ts +18 -0
- package/lib/services/json-utils.service.d.ts +7 -0
- package/lib/services/light-creation.service.d.ts +9 -0
- package/lib/services/light-presets.service.d.ts +34 -0
- package/lib/services/lights.service.d.ts +34 -0
- package/lib/services/load-furniture-base.service.d.ts +37 -0
- package/lib/services/load-furniture-without-scene.service.d.ts +9 -0
- package/lib/services/load-furniture.service.d.ts +9 -0
- package/lib/services/loader.service.d.ts +11 -0
- package/lib/services/locator.service.d.ts +7 -0
- package/lib/services/message-board.service.d.ts +18 -0
- package/lib/services/post-processing.service.d.ts +74 -0
- package/lib/services/product-configurator.service.d.ts +11 -0
- package/lib/services/progress.service.d.ts +9 -0
- package/lib/services/scene-event.service.d.ts +72 -0
- package/lib/services/scene-options.service.d.ts +11 -0
- package/lib/services/scene.service.d.ts +71 -0
- package/lib/services/screen-size-analysis.service.d.ts +32 -0
- package/lib/services/settings.service.d.ts +24 -0
- package/lib/services/switch-build-furniture.service.d.ts +21 -0
- package/lib/services/switch-load-furniture.service.d.ts +21 -0
- package/lib/services/threedselector.service.d.ts +17 -0
- package/lib/services/utils.service.d.ts +24 -0
- package/lib/services/variation-cache.service.d.ts +23 -0
- package/lib/services/variation.service.d.ts +26 -0
- package/lib/services/view-mode.service.d.ts +17 -0
- package/lib/services/vr.service.d.ts +42 -0
- package/lib/services/xr.service.d.ts +56 -0
- package/lib/style/_mixin.scss +9 -0
- package/lib/style/configurator-globals.scss +21 -0
- package/lib/style/template_variables.scss +37 -0
- package/lib/utils/color.utils.d.ts +8 -0
- package/lib/utils/debug.utils.d.ts +3 -0
- package/lib/utils/device.utils.d.ts +7 -0
- package/{utils → lib/utils}/file.utils.d.ts +3 -0
- package/{utils → lib/utils}/image.utils.d.ts +2 -3
- package/lib/utils/json-parser.utils.d.ts +9 -0
- package/lib/utils/material.utils.d.ts +34 -0
- package/lib/utils/object.utils.d.ts +32 -0
- package/lib/utils/relative-position.utils.d.ts +12 -0
- package/lib/utils/rotation-helper.utils.d.ts +6 -0
- package/lib/utils/scene-3d.utils.d.ts +8 -0
- package/lib/utils/text-utils.d.ts +4 -0
- package/{utils → lib/utils}/threed.utils.d.ts +7 -3
- package/{utils → lib/utils}/variation-utils.d.ts +4 -2
- package/package.json +17 -30
- package/public-api.d.ts +60 -0
- package/README.md +0 -28
- package/app/components/answers/answer/answer.component.d.ts +0 -11
- package/app/components/answers/answers.component.d.ts +0 -8
- package/app/components/answers/answers.module.d.ts +0 -2
- package/app/components/selections/selections.component.d.ts +0 -21
- package/app/components/selections/selections.module.d.ts +0 -2
- package/app/components/shared/loader/loader.component.d.ts +0 -2
- package/app/components/shared/shared.module.d.ts +0 -2
- package/app/services/configurator.service.d.ts +0 -19
- package/app/services/image-cache.service.d.ts +0 -10
- package/app/utils/object.utils.d.ts +0 -7
- package/colijnit-configurator.metadata.json +0 -1
- package/esm2015/app/builder.js +0 -710
- package/esm2015/app/components/answers/answer/answer.component.js +0 -66
- package/esm2015/app/components/answers/answers.component.js +0 -38
- package/esm2015/app/components/answers/answers.module.js +0 -27
- package/esm2015/app/components/selections/selections.component.js +0 -129
- package/esm2015/app/components/selections/selections.module.js +0 -21
- package/esm2015/app/components/shared/loader/loader.component.js +0 -22
- package/esm2015/app/components/shared/shared.module.js +0 -19
- package/esm2015/app/directives/visibility-observer-master.directive.js +0 -50
- package/esm2015/app/directives/visibility-observer.directive.js +0 -55
- package/esm2015/app/services/configurator.service.js +0 -79
- package/esm2015/app/services/image-cache.service.js +0 -63
- package/esm2015/app/utils/object.utils.js +0 -51
- package/esm2015/helper/variation-helper.js +0 -549
- package/esm2015/model/material.js +0 -11
- package/esm2015/model/variation-settings.js +0 -54
- package/esm2015/model/variation.js +0 -3
- package/esm2015/public_api.js +0 -7
- package/esm2015/utils/asset.utils.js +0 -124
- package/esm2015/utils/base-utils.js +0 -9
- package/esm2015/utils/file.utils.js +0 -142
- package/esm2015/utils/image.utils.js +0 -66
- package/esm2015/utils/object.utils.js +0 -49
- package/esm2015/utils/scene-utils.js +0 -187
- package/esm2015/utils/threed.utils.js +0 -226
- package/esm2015/utils/variation-utils.js +0 -388
- package/model/material.d.ts +0 -40
- package/public_api.d.ts +0 -6
- package/utils/object.utils.d.ts +0 -7
- /package/{utils → lib/utils}/asset.utils.d.ts +0 -0
- /package/{utils → lib/utils}/base-utils.d.ts +0 -0
- /package/{utils → lib/utils}/scene-utils.d.ts +0 -0
|
@@ -1,549 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
|
|
3
|
-
import { VariationSettings } from '../model/variation-settings';
|
|
4
|
-
import { AssetUtils } from '../utils/asset.utils';
|
|
5
|
-
import { Variation } from '../model/variation';
|
|
6
|
-
import { VariationUtils } from '../utils/variation-utils';
|
|
7
|
-
import { ImageUtils } from '../utils/image.utils';
|
|
8
|
-
import { Color, DoubleSide, EquirectangularReflectionMapping, Mesh, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, NearestFilter } from 'three';
|
|
9
|
-
import { filter, take } from 'rxjs/operators';
|
|
10
|
-
import { Material } from '../model/material';
|
|
11
|
-
import { BaseUtils } from '../utils/base-utils';
|
|
12
|
-
export class VariationHelper extends BaseUtils {
|
|
13
|
-
constructor() {
|
|
14
|
-
super(...arguments);
|
|
15
|
-
this._variations = [];
|
|
16
|
-
this._lastKnownVariations = new Map();
|
|
17
|
-
}
|
|
18
|
-
clearCache() {
|
|
19
|
-
const variationMap = Array.from(this._lastKnownVariations.values());
|
|
20
|
-
variationMap.forEach((variations) => {
|
|
21
|
-
variations.forEach((variation) => {
|
|
22
|
-
try {
|
|
23
|
-
if (variation.material) {
|
|
24
|
-
if (variation.material.texture) {
|
|
25
|
-
variation.material.texture.dispose();
|
|
26
|
-
}
|
|
27
|
-
if (variation.material.normal) {
|
|
28
|
-
variation.material.normal.dispose();
|
|
29
|
-
}
|
|
30
|
-
if (variation.material.metalness) {
|
|
31
|
-
variation.material.metalness.dispose();
|
|
32
|
-
}
|
|
33
|
-
if (variation.material.roughness) {
|
|
34
|
-
variation.material.roughness.dispose();
|
|
35
|
-
}
|
|
36
|
-
if (variation.material.ao) {
|
|
37
|
-
variation.material.ao.dispose();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
catch (e) {
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
VariationUtils.ClearCache();
|
|
46
|
-
ImageUtils.ClearCache();
|
|
47
|
-
}
|
|
48
|
-
loadPart(obj, parts, usePbr = false) {
|
|
49
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
try {
|
|
51
|
-
const len = parts.length;
|
|
52
|
-
for (let i = 0; i < len; i++) {
|
|
53
|
-
let partSettings;
|
|
54
|
-
if (parts[i].decoNode && parts[i].decoNode.materialUrl && parts[i].decoNode.type === DecoNodeType.Part) {
|
|
55
|
-
partSettings = yield VariationUtils.LoadVariationByUrl(parts[i].decoNode.materialCode, parts[i].decoNode.materialUrl);
|
|
56
|
-
}
|
|
57
|
-
if (parts[i].decoNode && parts[i].decoNode.gameObjectName && parts[i].decoNode.type === DecoNodeType.Part) {
|
|
58
|
-
partSettings = yield VariationUtils.LoadVariation(this.assetPath, parts[i].decoNode.gameObjectName || parts[i].decoId);
|
|
59
|
-
}
|
|
60
|
-
if (partSettings) {
|
|
61
|
-
const partVariation = new Variation();
|
|
62
|
-
partVariation.decoId = parseFloat(parts[i].decoNode.id);
|
|
63
|
-
partVariation.brandId = parts[i].decoNode.brandId;
|
|
64
|
-
partVariation.gameObjectName = parts[i].decoNode.gameObjectName;
|
|
65
|
-
partVariation.material = yield AssetUtils.CreateMaterialFromAsset(partSettings);
|
|
66
|
-
this._applyMaterialPart(obj, partVariation, parts[i].node, usePbr);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch (e) {
|
|
71
|
-
console.error(e);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
loadVariation(obj, parts, usePbr = false) {
|
|
76
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
-
try {
|
|
78
|
-
const len = parts.length;
|
|
79
|
-
for (let i = 0; i < len; i++) {
|
|
80
|
-
const variations = parts[i].variations;
|
|
81
|
-
if (!variations || variations.length === 0) {
|
|
82
|
-
if (this._getLastKnownVariations(parts[i].nodeId)) {
|
|
83
|
-
parts[i].variations = this._getLastKnownVariations(parts[i].nodeId);
|
|
84
|
-
this._applyVariations(obj, parts[i], usePbr);
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const lastKnownVariations = [];
|
|
92
|
-
const variationPromise = [];
|
|
93
|
-
for (let j = 0; j < variations.length; j++) {
|
|
94
|
-
let variationsName = '';
|
|
95
|
-
if (variations[j].materialCode && variations[j].materialUrl) {
|
|
96
|
-
variationsName = variations[j].materialCode;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
variationsName = variations[j].gameObjectName || parts[i].decoId;
|
|
100
|
-
}
|
|
101
|
-
variationPromise.push(this.loadTheVariation(variationsName).then((variationSettings) => {
|
|
102
|
-
const newVariation = new Variation();
|
|
103
|
-
newVariation.decoId = variations[j].constructor.name === 'Variation' ? variations[j].decoId : parseFloat(variations[j].id);
|
|
104
|
-
newVariation.node = variations[j].constructor.name === 'Variation' ? variations[j].node : variations[j].nodeId;
|
|
105
|
-
newVariation.brandId = variations[j].brandId;
|
|
106
|
-
newVariation.optionText = variations[j].optionText;
|
|
107
|
-
newVariation.gameObjectName = variations[j].gameObjectName;
|
|
108
|
-
newVariation.supplierArticleNr = variations[j].supplierArticleNr;
|
|
109
|
-
newVariation.materialId = variations[j].materialId;
|
|
110
|
-
newVariation.material = variationSettings ? variationSettings.material : null;
|
|
111
|
-
lastKnownVariations.push(newVariation);
|
|
112
|
-
}));
|
|
113
|
-
}
|
|
114
|
-
yield Promise.all(variationPromise);
|
|
115
|
-
this._setLastKnownVariations(`${parts[i].nodeId}_${parts[i].node}`, lastKnownVariations);
|
|
116
|
-
parts[i].variations = lastKnownVariations;
|
|
117
|
-
this._applyVariations(obj, parts[i], usePbr);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
catch (e) {
|
|
121
|
-
this.log(e.message);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
get(id) {
|
|
126
|
-
const len = this._variations.length;
|
|
127
|
-
for (let i = 0; i < len; i++) {
|
|
128
|
-
if (this._variations[i].id && this._variations[i].id === id) {
|
|
129
|
-
return this._variations[i];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
set(variations) {
|
|
134
|
-
const idx = this._variations.findIndex(v => v.id === variations.id);
|
|
135
|
-
if (idx > -1) {
|
|
136
|
-
this._variations[idx] = variations;
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
this._variations.push(variations);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
preloadVariations(fileNames) {
|
|
143
|
-
fileNames.forEach((node) => {
|
|
144
|
-
if (node.materialUrl) {
|
|
145
|
-
if (node.materialCode && !this.get(node.materialCode)) {
|
|
146
|
-
const settings = new VariationSettings();
|
|
147
|
-
settings.id = node.materialCode;
|
|
148
|
-
settings.loading = true;
|
|
149
|
-
this._variations.push(settings);
|
|
150
|
-
VariationUtils.LoadVariationByUrl(node.materialCode, node.materialUrl).then((variationSettings) => {
|
|
151
|
-
settings.loading = false;
|
|
152
|
-
if (variationSettings) {
|
|
153
|
-
settings.copyFrom(variationSettings);
|
|
154
|
-
}
|
|
155
|
-
settings.loaded.next(settings);
|
|
156
|
-
}).catch((err) => {
|
|
157
|
-
console.error(`Error loading variation ${node.materialCode}:`, err);
|
|
158
|
-
settings.loading = false;
|
|
159
|
-
settings.loaded.next(null);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
else if (node.gameObjectName) {
|
|
164
|
-
if (!this.get(node.gameObjectName)) {
|
|
165
|
-
const settings = new VariationSettings();
|
|
166
|
-
settings.id = node.gameObjectName;
|
|
167
|
-
settings.loading = true;
|
|
168
|
-
this._variations.push(settings);
|
|
169
|
-
VariationUtils.LoadVariation(this.assetPath, node.gameObjectName).then((variationSettings) => {
|
|
170
|
-
settings.loading = false;
|
|
171
|
-
if (variationSettings) {
|
|
172
|
-
settings.copyFrom(variationSettings);
|
|
173
|
-
}
|
|
174
|
-
settings.loaded.next(settings);
|
|
175
|
-
}).catch((err) => {
|
|
176
|
-
console.error(`Error loading variation ${node.gameObjectName}:`, err);
|
|
177
|
-
settings.loading = false;
|
|
178
|
-
settings.loaded.next(null);
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
loadTheVariation(fileName) {
|
|
185
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
-
if (!fileName) {
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
|
-
const settings = this.get(fileName);
|
|
190
|
-
if (!settings) {
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
if (settings.loading) {
|
|
194
|
-
const sett = yield this._waitForVariationToLoad(settings);
|
|
195
|
-
yield this._loadMaterialFromSettings(sett);
|
|
196
|
-
return sett;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
yield this._loadMaterialFromSettings(settings);
|
|
200
|
-
return settings;
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
_loadMaterialFromSettings(settings) {
|
|
205
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
206
|
-
if (settings) {
|
|
207
|
-
if (!settings.material) {
|
|
208
|
-
settings.material = yield AssetUtils.CreateMaterialFromAsset(settings);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
_waitForVariationToLoad(settings) {
|
|
214
|
-
return new Promise((resolve) => {
|
|
215
|
-
settings.loaded.pipe(filter((value) => value !== undefined), take(1)).subscribe((value) => {
|
|
216
|
-
resolve(value);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
_getChildrenFilterByProp(obj, userDataObjectProp, prop, value) {
|
|
221
|
-
return obj.children.filter((child) => {
|
|
222
|
-
return child.userData &&
|
|
223
|
-
child.userData.hasOwnProperty(userDataObjectProp) &&
|
|
224
|
-
child.userData[userDataObjectProp].hasOwnProperty(prop) &&
|
|
225
|
-
child.userData[userDataObjectProp][prop] === value;
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
_applyMaterialPart(obj, partMaterial, nodeId, usePbr = false) {
|
|
229
|
-
const children = this._getChildrenFilterByProp(obj, 'selection', 'node', nodeId);
|
|
230
|
-
const len = children.length;
|
|
231
|
-
for (let i = 0; i < len; i++) {
|
|
232
|
-
const child = children[i];
|
|
233
|
-
if (child !== null && child !== undefined) {
|
|
234
|
-
child.traverse((mesh) => {
|
|
235
|
-
if ((mesh instanceof Mesh || mesh.constructor.name === 'Mesh') && partMaterial) {
|
|
236
|
-
if (Array.isArray(mesh.material)) { // multimaterial support
|
|
237
|
-
for (let j = 0, jlen = mesh.material.length; j < jlen; j++) {
|
|
238
|
-
if (mesh.material[j].name.toLowerCase().indexOf('fixed_frame') !== -1) {
|
|
239
|
-
mesh.material[j] = this._setMeshMaterialFromVariation(mesh.material[j].name, partMaterial, usePbr);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
if (mesh.material.name && mesh.material.name.toLowerCase().indexOf('fixed_frame') !== -1) {
|
|
245
|
-
mesh.material = this._setMeshMaterialFromVariation(mesh.material.name, partMaterial, usePbr);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
_applyVariations(obj, part, usePbr = false) {
|
|
254
|
-
const children = this._getChildrenFilterByProp(obj, 'selection', 'node', part.node);
|
|
255
|
-
const len = children.length;
|
|
256
|
-
for (let i = 0; i < len; i++) {
|
|
257
|
-
const child = children[i];
|
|
258
|
-
if (child !== null && child !== undefined) {
|
|
259
|
-
child.traverse((mesh) => {
|
|
260
|
-
if ((mesh instanceof Mesh || mesh.constructor.name === 'Mesh') && part.variations && part.variations.length > 0 && mesh.name.toLowerCase().indexOf('c_')) {
|
|
261
|
-
for (let j = 0; j < part.variations.length; j++) {
|
|
262
|
-
const variation = part.variations[j];
|
|
263
|
-
if (variation.material) {
|
|
264
|
-
const materialToSearch = !!variation.materialId ? variation.materialId.toLowerCase() : 'default';
|
|
265
|
-
if (Array.isArray(mesh.material)) { // multimaterial support
|
|
266
|
-
for (let m = 0, mlen = mesh.material.length; m < mlen; m++) {
|
|
267
|
-
if (mesh.material[m].name.toLowerCase().indexOf(materialToSearch) !== -1) {
|
|
268
|
-
if ((variation.material instanceof Material || variation.material.constructor.name === 'Material') && variation.material.isMaterial) {
|
|
269
|
-
// it's a THREE.Material
|
|
270
|
-
mesh.material[m] = variation.material;
|
|
271
|
-
if (mesh.material[m].name && (mesh.material[m].name === 'Fixed_Glass' || mesh.material[m].name === 'Default_Glass')) {
|
|
272
|
-
mesh.castShadow = false;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
mesh.material[m] = this._setMeshMaterialFromVariation(mesh.material[m].name, variation, usePbr);
|
|
277
|
-
if (mesh.material[m].name && (mesh.material[m].name === 'Fixed_Glass' || mesh.material[m].name === 'Default_Glass')) {
|
|
278
|
-
mesh.castShadow = false;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
if (mesh.material.name && mesh.material.name.toLowerCase().indexOf(materialToSearch) !== -1) {
|
|
286
|
-
if ((variation.material instanceof Material || variation.material.constructor.name === 'Material') && variation.material.isMaterial) {
|
|
287
|
-
// it's a THREE.Material
|
|
288
|
-
mesh.material = variation.material;
|
|
289
|
-
if (mesh.material.name === 'Fixed_Glass' || mesh.material.name === 'Default_Glass') {
|
|
290
|
-
mesh.castShadow = false;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
mesh.material = this._setMeshMaterialFromVariation(mesh.material.name, variation, usePbr);
|
|
295
|
-
if (mesh.material.name === 'Fixed_Glass' || mesh.material.name === 'Default_Glass') {
|
|
296
|
-
mesh.castShadow = false;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
_setMeshMaterialFromVariation(name, variation, usePbr = false) {
|
|
309
|
-
const material = variation.material;
|
|
310
|
-
if (material.texture) {
|
|
311
|
-
material.texture.needsUpdate = true;
|
|
312
|
-
material.texture.mapping = EquirectangularReflectionMapping;
|
|
313
|
-
}
|
|
314
|
-
if (!usePbr) {
|
|
315
|
-
const newMaterial = new MeshPhongMaterial({
|
|
316
|
-
name: name,
|
|
317
|
-
shininess: material.shininess,
|
|
318
|
-
specular: material.specular,
|
|
319
|
-
map: material.texture,
|
|
320
|
-
normalMap: material.normal
|
|
321
|
-
});
|
|
322
|
-
newMaterial.color.setRGB(0.8, 0.8, 0.8);
|
|
323
|
-
newMaterial.needsUpdate = true;
|
|
324
|
-
return newMaterial;
|
|
325
|
-
}
|
|
326
|
-
if (material.sheen || material.sheenColor || material.reflectivity || material.transmission) { // TODO: Proper check for all unique physical material properties
|
|
327
|
-
const params = {
|
|
328
|
-
// side: material.side ? material.side : FrontSide,
|
|
329
|
-
name: name,
|
|
330
|
-
roughness: material.roughnessValue !== undefined && material.roughnessValue !== null ? material.roughnessValue : 1,
|
|
331
|
-
metalness: material.metalnessValue !== undefined && material.metalnessValue !== null ? material.metalnessValue : 0,
|
|
332
|
-
envMapIntensity: material.envMapIntensity ? material.envMapIntensity : 0.01,
|
|
333
|
-
clearcoatMap: material.clearcoatMap ? material.clearcoatMap : null,
|
|
334
|
-
clearcoatRoughnessMap: material.clearcoatRoughnessMap ? material.clearcoatRoughnessMap : null,
|
|
335
|
-
attenuationDistance: Infinity
|
|
336
|
-
// wireframe: true,
|
|
337
|
-
// opacity: 0.3,
|
|
338
|
-
// transparent: true,
|
|
339
|
-
};
|
|
340
|
-
if (material.displacementValue) {
|
|
341
|
-
params.displacementScale = material.displacementValue;
|
|
342
|
-
}
|
|
343
|
-
if (material.opacity) {
|
|
344
|
-
params.opacity = material.opacity;
|
|
345
|
-
}
|
|
346
|
-
if (material.transparent) {
|
|
347
|
-
params.transparent = material.transparent;
|
|
348
|
-
}
|
|
349
|
-
if (material.emissiveValue) {
|
|
350
|
-
params.emissive = material.emissiveValue;
|
|
351
|
-
}
|
|
352
|
-
if (material.emissiveIntensityValue) {
|
|
353
|
-
params.emissiveIntensity = material.emissiveIntensityValue;
|
|
354
|
-
}
|
|
355
|
-
if (material.texture) {
|
|
356
|
-
params.map = material.texture;
|
|
357
|
-
params.map.needsUpdate = true;
|
|
358
|
-
}
|
|
359
|
-
if (material.ao) {
|
|
360
|
-
params.aoMap = material.ao;
|
|
361
|
-
params.aoMap.needsUpdate = true;
|
|
362
|
-
}
|
|
363
|
-
if (material.roughness) {
|
|
364
|
-
params.roughnessMap = material.roughness;
|
|
365
|
-
params.roughnessMap.needsUpdate = true;
|
|
366
|
-
// material.roughness.magFilter = NearestFilter;
|
|
367
|
-
}
|
|
368
|
-
if (material.metalness) {
|
|
369
|
-
params.metalnessMap = material.metalness;
|
|
370
|
-
params.metalnessMap.needsUpdate = true;
|
|
371
|
-
}
|
|
372
|
-
if (material.normal) {
|
|
373
|
-
params.normalMap = material.normal;
|
|
374
|
-
params.normalMap.needsUpdate = true;
|
|
375
|
-
}
|
|
376
|
-
if (material.displacement) {
|
|
377
|
-
params.displacementMap = material.displacement;
|
|
378
|
-
params.displacementMap.needsUpdate = true;
|
|
379
|
-
}
|
|
380
|
-
if (material.emissive) {
|
|
381
|
-
params.emissiveMap = material.emissive;
|
|
382
|
-
params.emissiveMap.needsUpdate = true;
|
|
383
|
-
}
|
|
384
|
-
if (material.envMap) {
|
|
385
|
-
if (material.envMapIntensity != null || 0) {
|
|
386
|
-
params.envMap = material.envMap;
|
|
387
|
-
params.envMap.needsUpdate = true;
|
|
388
|
-
material.envMap.mapping = EquirectangularReflectionMapping;
|
|
389
|
-
material.envMap.minFilter = NearestFilter;
|
|
390
|
-
material.envMap.magFilter = NearestFilter;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
if (material.reflectivity) {
|
|
394
|
-
params.reflectivity = material.reflectivity;
|
|
395
|
-
}
|
|
396
|
-
if (material.side) {
|
|
397
|
-
params.side = material.side;
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
params.side = DoubleSide;
|
|
401
|
-
}
|
|
402
|
-
const newMaterial = new MeshPhysicalMaterial(params);
|
|
403
|
-
newMaterial.color.setRGB(1, 1, 1);
|
|
404
|
-
if (material.sheen) {
|
|
405
|
-
newMaterial.sheen = material.sheen;
|
|
406
|
-
}
|
|
407
|
-
if (material.sheenColor) {
|
|
408
|
-
newMaterial.sheenColor = this._createValidColor(material.sheenColor);
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
// Add fallback for blender render
|
|
412
|
-
newMaterial.sheenColor = new Color(1, 1, 1);
|
|
413
|
-
}
|
|
414
|
-
if (material.sheenRoughness) {
|
|
415
|
-
newMaterial.sheenRoughness = material.sheenRoughness;
|
|
416
|
-
}
|
|
417
|
-
if (material.sheenColorMap) {
|
|
418
|
-
newMaterial.sheenColorMap = material.sheenColorMap;
|
|
419
|
-
newMaterial.sheenColorMap.needsUpdate = true;
|
|
420
|
-
}
|
|
421
|
-
if (material.sheenRoughnessMap) {
|
|
422
|
-
newMaterial.sheenRoughnessMap = material.sheenRoughnessMap;
|
|
423
|
-
newMaterial.sheenRoughnessMap.needsUpdate = true;
|
|
424
|
-
}
|
|
425
|
-
if (material.transmission) {
|
|
426
|
-
newMaterial.transmission = material.transmission;
|
|
427
|
-
}
|
|
428
|
-
if (material.ior !== undefined && material.ior !== null) {
|
|
429
|
-
newMaterial.ior = material.ior;
|
|
430
|
-
}
|
|
431
|
-
if (material.thickness !== undefined && material.thickness !== null) {
|
|
432
|
-
newMaterial.thickness = material.thickness;
|
|
433
|
-
}
|
|
434
|
-
if (material.specularIntensity !== undefined && material.specularIntensity !== null) {
|
|
435
|
-
newMaterial.specularIntensity = material.specularIntensity;
|
|
436
|
-
}
|
|
437
|
-
if (material.transmissionMap) {
|
|
438
|
-
newMaterial.transmissionMap = material.transmissionMap;
|
|
439
|
-
newMaterial.transmissionMap.needsUpdate = true;
|
|
440
|
-
}
|
|
441
|
-
newMaterial.needsUpdate = true;
|
|
442
|
-
return newMaterial;
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
const params = {
|
|
446
|
-
// side: material.side ? material.side : FrontSide,
|
|
447
|
-
name: name,
|
|
448
|
-
roughness: material.roughnessValue !== undefined && material.roughnessValue !== null ? material.roughnessValue : 1,
|
|
449
|
-
metalness: material.metalnessValue !== undefined && material.metalnessValue !== null ? material.metalnessValue : 0,
|
|
450
|
-
envMapIntensity: material.envMapIntensity ? material.envMapIntensity : 0.01
|
|
451
|
-
// wireframe: true,
|
|
452
|
-
// opacity: 0.3,
|
|
453
|
-
// transparent: true,
|
|
454
|
-
};
|
|
455
|
-
if (material.displacementValue) {
|
|
456
|
-
params.displacementScale = material.displacementValue;
|
|
457
|
-
}
|
|
458
|
-
if (material.opacity) {
|
|
459
|
-
params.opacity = material.opacity;
|
|
460
|
-
}
|
|
461
|
-
if (material.transparent) {
|
|
462
|
-
params.transparent = material.transparent;
|
|
463
|
-
}
|
|
464
|
-
if (material.emissiveValue) {
|
|
465
|
-
params.emissive = material.emissiveValue;
|
|
466
|
-
}
|
|
467
|
-
if (material.emissiveIntensityValue) {
|
|
468
|
-
params.emissiveIntensity = material.emissiveIntensityValue;
|
|
469
|
-
}
|
|
470
|
-
if (material.texture) {
|
|
471
|
-
params.map = material.texture;
|
|
472
|
-
params.map.needsUpdate = true;
|
|
473
|
-
}
|
|
474
|
-
if (material.ao) {
|
|
475
|
-
params.aoMap = material.ao;
|
|
476
|
-
params.aoMap.needsUpdate = true;
|
|
477
|
-
}
|
|
478
|
-
if (material.roughness) {
|
|
479
|
-
params.roughnessMap = material.roughness;
|
|
480
|
-
params.roughnessMap.needsUpdate = true;
|
|
481
|
-
// material.roughness.magFilter = NearestFilter;
|
|
482
|
-
}
|
|
483
|
-
if (material.metalness) {
|
|
484
|
-
params.metalnessMap = material.metalness;
|
|
485
|
-
params.metalnessMap.needsUpdate = true;
|
|
486
|
-
}
|
|
487
|
-
if (material.normal) {
|
|
488
|
-
params.normalMap = material.normal;
|
|
489
|
-
params.normalMap.needsUpdate = true;
|
|
490
|
-
}
|
|
491
|
-
if (material.displacement) {
|
|
492
|
-
params.displacementMap = material.displacement;
|
|
493
|
-
params.displacementMap.needsUpdate = true;
|
|
494
|
-
}
|
|
495
|
-
if (material.emissive) {
|
|
496
|
-
params.emissiveMap = material.emissive;
|
|
497
|
-
params.emissiveMap.needsUpdate = true;
|
|
498
|
-
}
|
|
499
|
-
if (material.envMap) {
|
|
500
|
-
if (material.envMapIntensity != null || 0) {
|
|
501
|
-
params.envMap = material.envMap;
|
|
502
|
-
params.envMap.needsUpdate = true;
|
|
503
|
-
material.envMap.mapping = EquirectangularReflectionMapping;
|
|
504
|
-
material.envMap.minFilter = NearestFilter;
|
|
505
|
-
material.envMap.magFilter = NearestFilter;
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
if (material.side) {
|
|
509
|
-
params.side = material.side;
|
|
510
|
-
}
|
|
511
|
-
else {
|
|
512
|
-
params.side = DoubleSide;
|
|
513
|
-
}
|
|
514
|
-
const newMaterial = new MeshStandardMaterial(params);
|
|
515
|
-
newMaterial.color.setRGB(1, 1, 1);
|
|
516
|
-
newMaterial.needsUpdate = true;
|
|
517
|
-
return newMaterial;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
_setLastKnownVariations(id, variation) {
|
|
521
|
-
this._lastKnownVariations.set(id, variation);
|
|
522
|
-
}
|
|
523
|
-
_getLastKnownVariations(id) {
|
|
524
|
-
if (this._lastKnownVariations.has(id)) {
|
|
525
|
-
return this._lastKnownVariations.get(id);
|
|
526
|
-
}
|
|
527
|
-
return null;
|
|
528
|
-
}
|
|
529
|
-
_createValidColor(color) {
|
|
530
|
-
if (typeof color === 'string') {
|
|
531
|
-
if (/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color)) {
|
|
532
|
-
return new Color(`#${color.replace('#', '')}`);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
else if (color instanceof Color || color.constructor.name === 'Color') {
|
|
536
|
-
return color;
|
|
537
|
-
}
|
|
538
|
-
else {
|
|
539
|
-
try {
|
|
540
|
-
return new Color(color);
|
|
541
|
-
}
|
|
542
|
-
catch (e) {
|
|
543
|
-
return new Color();
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
return new Color();
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWF0aW9uLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oZWxwZXIvdmFyaWF0aW9uLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxnQ0FBZ0MsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQWtDLG9CQUFvQixFQUFrQyxhQUFhLEVBQVcsTUFBTSxPQUFPLENBQUM7QUFDeE8sT0FBTyxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sT0FBTyxlQUFnQixTQUFRLFNBQVM7SUFBOUM7O1FBSVUsZ0JBQVcsR0FBd0IsRUFBRSxDQUFDO1FBRXRDLHlCQUFvQixHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBaWhCckUsQ0FBQztJQS9nQlEsVUFBVTtRQUNmLE1BQU0sWUFBWSxHQUFrQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxV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QUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtZQUN2RSxPQUFPLEtBQWMsQ0FBQztTQUN2QjthQUFNO1lBQ0wsSUFBSTtnQkFDRixPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3pCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO2FBQ3BCO1NBQ0Y7UUFFRCxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZWNvTm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtWYXJpYXRpb25TZXR0aW5nc30gZnJvbSAnLi4vbW9kZWwvdmFyaWF0aW9uLXNldHRpbmdzJztcclxuaW1wb3J0IHtBc3NldFV0aWxzfSBmcm9tICcuLi91dGlscy9hc3NldC51dGlscyc7XHJcbmltcG9ydCB7RGVjb05vZGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZGVjby1ub2RlJztcclxuaW1wb3J0IHtWYXJpYXRpb259IGZyb20gJy4uL21vZGVsL3ZhcmlhdGlvbic7XHJcbmltcG9ydCB7VmFyaWF0aW9uVXRpbHN9IGZyb20gJy4uL3V0aWxzL3ZhcmlhdGlvbi11dGlscyc7XHJcbmltcG9ydCB7SW1hZ2VVdGlsc30gZnJvbSAnLi4vdXRpbHMvaW1hZ2UudXRpbHMnO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7Q29sb3IsIERvdWJsZVNpZGUsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBNZXNoLCBNZXNoUGhvbmdNYXRlcmlhbCwgTWVzaFBoeXNpY2FsTWF0ZXJpYWwsIE1lc2hQaHlzaWNhbE1hdGVyaWFsUGFyYW1ldGVycywgTWVzaFN0YW5kYXJkTWF0ZXJpYWwsIE1lc2hTdGFuZGFyZE1hdGVyaWFsUGFyYW1ldGVycywgTmVhcmVzdEZpbHRlciwgT2JqZWN0M0R9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtmaWx0ZXIsIHRha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtNYXRlcmlhbH0gZnJvbSAnLi4vbW9kZWwvbWF0ZXJpYWwnO1xyXG5pbXBvcnQge0Jhc2VVdGlsc30gZnJvbSAnLi4vdXRpbHMvYmFzZS11dGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVmFyaWF0aW9uSGVscGVyIGV4dGVuZHMgQmFzZVV0aWxzIHtcclxuXHJcbiAgcHVibGljIGFzc2V0UGF0aDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIF92YXJpYXRpb25zOiBWYXJpYXRpb25TZXR0aW5nc1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgX2xhc3RLbm93blZhcmlhdGlvbnM6IE1hcDxzdHJpbmcsIFZhcmlhdGlvbltdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YXJpYXRpb25NYXA6IFZhcmlhdGlvbltdW10gPSBBcnJheS5mcm9tKHRoaXMuX2xhc3RLbm93blZhcmlhdGlvbnMudmFsdWVzKCkpO1xyXG4gICAgdmFyaWF0aW9uTWFwLmZvckVhY2goKHZhcmlhdGlvbnMpID0+IHtcclxuICAgICAgdmFyaWF0aW9ucy5mb3JFYWNoKCh2YXJpYXRpb24pID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbCkge1xyXG4gICAgICAgICAgICBpZiAodmFyaWF0aW9uLm1hdGVyaWFsLnRleHR1cmUpIHtcclxuICAgICAgICAgICAgICB2YXJpYXRpb24ubWF0ZXJpYWwudGV4dHVyZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbC5ub3JtYWwpIHtcclxuICAgICAgICAgICAgICB2YXJpYXRpb24ubWF0ZXJpYWwubm9ybWFsLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFyaWF0aW9uLm1hdGVyaWFsLm1ldGFsbmVzcykge1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvbi5tYXRlcmlhbC5tZXRhbG5lc3MuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YXJpYXRpb24ubWF0ZXJpYWwucm91Z2huZXNzKSB7XHJcbiAgICAgICAgICAgICAgdmFyaWF0aW9uLm1hdGVyaWFsLnJvdWdobmVzcy5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbC5hbykge1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvbi5tYXRlcmlhbC5hby5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgVmFyaWF0aW9uVXRpbHMuQ2xlYXJDYWNoZSgpO1xyXG4gICAgSW1hZ2VVdGlscy5DbGVhckNhY2hlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZFBhcnQob2JqOiBPYmplY3QzRCwgcGFydHM6IGFueVtdLCB1c2VQYnI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBwYXJ0cy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBsZXQgcGFydFNldHRpbmdzOiBWYXJpYXRpb25TZXR0aW5ncztcclxuICAgICAgICBpZiAocGFydHNbaV0uZGVjb05vZGUgJiYgcGFydHNbaV0uZGVjb05vZGUubWF0ZXJpYWxVcmwgJiYgcGFydHNbaV0uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQpIHtcclxuICAgICAgICAgIHBhcnRTZXR0aW5ncyA9IGF3YWl0IFZhcmlhdGlvblV0aWxzLkxvYWRWYXJpYXRpb25CeVVybChwYXJ0c1tpXS5kZWNvTm9kZS5tYXRlcmlhbENvZGUsIHBhcnRzW2ldLmRlY29Ob2RlLm1hdGVyaWFsVXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcnRzW2ldLmRlY29Ob2RlICYmIHBhcnRzW2ldLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lICYmIHBhcnRzW2ldLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0KSB7XHJcbiAgICAgICAgIHBhcnRTZXR0aW5ncyA9IGF3YWl0IFZhcmlhdGlvblV0aWxzLkxvYWRWYXJpYXRpb24odGhpcy5hc3NldFBhdGgsIHBhcnRzW2ldLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IHBhcnRzW2ldLmRlY29JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJ0U2V0dGluZ3MpIHtcclxuICAgICAgICAgIGNvbnN0IHBhcnRWYXJpYXRpb246IFZhcmlhdGlvbiA9IG5ldyBWYXJpYXRpb24oKTtcclxuICAgICAgICAgIHBhcnRWYXJpYXRpb24uZGVjb0lkID0gcGFyc2VGbG9hdChwYXJ0c1tpXS5kZWNvTm9kZS5pZCk7XHJcbiAgICAgICAgICBwYXJ0VmFyaWF0aW9uLmJyYW5kSWQgPSBwYXJ0c1tpXS5kZWNvTm9kZS5icmFuZElkO1xyXG4gICAgICAgICAgcGFydFZhcmlhdGlvbi5nYW1lT2JqZWN0TmFtZSA9IHBhcnRzW2ldLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgcGFydFZhcmlhdGlvbi5tYXRlcmlhbCA9IGF3YWl0IEFzc2V0VXRpbHMuQ3JlYXRlTWF0ZXJpYWxGcm9tQXNzZXQocGFydFNldHRpbmdzKTtcclxuICAgICAgICAgIHRoaXMuX2FwcGx5TWF0ZXJpYWxQYXJ0KG9iaiwgcGFydFZhcmlhdGlvbiwgcGFydHNbaV0ubm9kZSwgdXNlUGJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkVmFyaWF0aW9uKG9iajogT2JqZWN0M0QsIHBhcnRzOiBhbnlbXSwgdXNlUGJyOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gcGFydHMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdmFyaWF0aW9uczogRGVjb05vZGVbXSA9IHBhcnRzW2ldLnZhcmlhdGlvbnM7XHJcbiAgICAgICAgaWYgKCF2YXJpYXRpb25zIHx8IHZhcmlhdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fZ2V0TGFzdEtub3duVmFyaWF0aW9ucyhwYXJ0c1tpXS5ub2RlSWQpKSB7XHJcbiAgICAgICAgICAgIHBhcnRzW2ldLnZhcmlhdGlvbnMgPSB0aGlzLl9nZXRMYXN0S25vd25WYXJpYXRpb25zKHBhcnRzW2ldLm5vZGVJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmFyaWF0aW9ucyhvYmosIHBhcnRzW2ldLCB1c2VQYnIpO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsYXN0S25vd25WYXJpYXRpb25zOiBWYXJpYXRpb25bXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvblByb21pc2U6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YXJpYXRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICBsZXQgdmFyaWF0aW9uc05hbWU6IHN0cmluZyA9ICcnO1xyXG4gICAgICAgICAgaWYgKHZhcmlhdGlvbnNbal0ubWF0ZXJpYWxDb2RlICYmIHZhcmlhdGlvbnNbal0ubWF0ZXJpYWxVcmwpIHtcclxuICAgICAgICAgICAgdmFyaWF0aW9uc05hbWUgPSB2YXJpYXRpb25zW2pdLm1hdGVyaWFsQ29kZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvbnNOYW1lID0gdmFyaWF0aW9uc1tqXS5nYW1lT2JqZWN0TmFtZSB8fCBwYXJ0c1tpXS5kZWNvSWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2YXJpYXRpb25Qcm9taXNlLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMubG9hZFRoZVZhcmlhdGlvbih2YXJpYXRpb25zTmFtZSkudGhlbigodmFyaWF0aW9uU2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3VmFyaWF0aW9uOiBWYXJpYXRpb24gPSBuZXcgVmFyaWF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgbmV3VmFyaWF0aW9uLmRlY29JZCA9IHZhcmlhdGlvbnNbal0uY29uc3RydWN0b3IubmFtZSA9PT0gJ1ZhcmlhdGlvbicgPyAodmFyaWF0aW9uc1tqXSBhcyB1bmtub3duIGFzIFZhcmlhdGlvbikuZGVjb0lkIDogcGFyc2VGbG9hdCh2YXJpYXRpb25zW2pdLmlkKTtcclxuICAgICAgICAgICAgICBuZXdWYXJpYXRpb24ubm9kZSA9IHZhcmlhdGlvbnNbal0uY29uc3RydWN0b3IubmFtZSA9PT0gJ1ZhcmlhdGlvbicgPyAodmFyaWF0aW9uc1tqXSBhcyB1bmtub3duIGFzIFZhcmlhdGlvbikubm9kZSA6IHZhcmlhdGlvbnNbal0ubm9kZUlkO1xyXG4gICAgICAgICAgICAgIG5ld1ZhcmlhdGlvbi5icmFuZElkID0gdmFyaWF0aW9uc1tqXS5icmFuZElkO1xyXG4gICAgICAgICAgICAgIG5ld1ZhcmlhdGlvbi5vcHRpb25UZXh0ID0gKHZhcmlhdGlvbnNbal0gYXMgYW55KS5vcHRpb25UZXh0O1xyXG4gICAgICAgICAgICAgIG5ld1ZhcmlhdGlvbi5nYW1lT2JqZWN0TmFtZSA9IHZhcmlhdGlvbnNbal0uZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICAgICAgbmV3VmFyaWF0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yID0gKHZhcmlhdGlvbnNbal0gYXMgYW55KS5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICBuZXdWYXJpYXRpb24ubWF0ZXJpYWxJZCA9ICh2YXJpYXRpb25zW2pdIGFzIGFueSkubWF0ZXJpYWxJZDtcclxuICAgICAgICAgICAgICBuZXdWYXJpYXRpb24ubWF0ZXJpYWwgPSB2YXJpYXRpb25TZXR0aW5ncyA/IHZhcmlhdGlvblNldHRpbmdzLm1hdGVyaWFsIDogbnVsbDtcclxuICAgICAgICAgICAgICBsYXN0S25vd25WYXJpYXRpb25zLnB1c2gobmV3VmFyaWF0aW9uKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhcmlhdGlvblByb21pc2UpO1xyXG4gICAgICAgIHRoaXMuX3NldExhc3RLbm93blZhcmlhdGlvbnMoYCR7cGFydHNbaV0ubm9kZUlkfV8ke3BhcnRzW2ldLm5vZGV9YCwgbGFzdEtub3duVmFyaWF0aW9ucyk7XHJcbiAgICAgICAgcGFydHNbaV0udmFyaWF0aW9ucyA9IGxhc3RLbm93blZhcmlhdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fYXBwbHlWYXJpYXRpb25zKG9iaiwgcGFydHNbaV0sIHVzZVBicik7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5sb2coZS5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQoaWQ6IHN0cmluZyk6IFZhcmlhdGlvblNldHRpbmdzIHtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5fdmFyaWF0aW9ucy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLl92YXJpYXRpb25zW2ldLmlkICYmIHRoaXMuX3ZhcmlhdGlvbnNbaV0uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhcmlhdGlvbnNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQodmFyaWF0aW9uczogVmFyaWF0aW9uU2V0dGluZ3MpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkeDogbnVtYmVyID0gdGhpcy5fdmFyaWF0aW9ucy5maW5kSW5kZXgodiA9PiB2LmlkID09PSB2YXJpYXRpb25zLmlkKTtcclxuICAgIGlmIChpZHggPiAtMSkge1xyXG4gICAgICB0aGlzLl92YXJpYXRpb25zW2lkeF0gPSB2YXJpYXRpb25zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdmFyaWF0aW9ucy5wdXNoKHZhcmlhdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHByZWxvYWRWYXJpYXRpb25zKGZpbGVOYW1lczogRGVjb05vZGVbXSk6IHZvaWQge1xyXG4gICAgZmlsZU5hbWVzLmZvckVhY2goKG5vZGU6IERlY29Ob2RlKSA9PiB7XHJcbiAgICAgIGlmIChub2RlLm1hdGVyaWFsVXJsKSB7XHJcbiAgICAgICAgaWYgKG5vZGUubWF0ZXJpYWxDb2RlICYmICF0aGlzLmdldChub2RlLm1hdGVyaWFsQ29kZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdzOiBWYXJpYXRpb25TZXR0aW5ncyA9IG5ldyBWYXJpYXRpb25TZXR0aW5ncygpO1xyXG4gICAgICAgICAgc2V0dGluZ3MuaWQgPSBub2RlLm1hdGVyaWFsQ29kZTtcclxuICAgICAgICAgIHNldHRpbmdzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5fdmFyaWF0aW9ucy5wdXNoKHNldHRpbmdzKTtcclxuICAgICAgICAgIFZhcmlhdGlvblV0aWxzLkxvYWRWYXJpYXRpb25CeVVybChub2RlLm1hdGVyaWFsQ29kZSwgbm9kZS5tYXRlcmlhbFVybCkudGhlbigodmFyaWF0aW9uU2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHZhcmlhdGlvblNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgICAgc2V0dGluZ3MuY29weUZyb20odmFyaWF0aW9uU2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWRlZC5uZXh0KHNldHRpbmdzKTtcclxuICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyB2YXJpYXRpb24gJHtub2RlLm1hdGVyaWFsQ29kZX06YCwgZXJyKTtcclxuICAgICAgICAgICAgc2V0dGluZ3MubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5sb2FkZWQubmV4dChudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChub2RlLmdhbWVPYmplY3ROYW1lKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdldChub2RlLmdhbWVPYmplY3ROYW1lKSkge1xyXG4gICAgICAgICAgY29uc3Qgc2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzID0gbmV3IFZhcmlhdGlvblNldHRpbmdzKCk7XHJcbiAgICAgICAgICBzZXR0aW5ncy5pZCA9IG5vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICBzZXR0aW5ncy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX3ZhcmlhdGlvbnMucHVzaChzZXR0aW5ncyk7XHJcbiAgICAgICAgICBWYXJpYXRpb25VdGlscy5Mb2FkVmFyaWF0aW9uKHRoaXMuYXNzZXRQYXRoLCBub2RlLmdhbWVPYmplY3ROYW1lKS50aGVuKCh2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MpID0+IHtcclxuICAgICAgICAgICAgc2V0dGluZ3MubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodmFyaWF0aW9uU2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgICBzZXR0aW5ncy5jb3B5RnJvbSh2YXJpYXRpb25TZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0dGluZ3MubG9hZGVkLm5leHQoc2V0dGluZ3MpO1xyXG4gICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBsb2FkaW5nIHZhcmlhdGlvbiAke25vZGUuZ2FtZU9iamVjdE5hbWV9OmAsIGVycik7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0dGluZ3MubG9hZGVkLm5leHQobnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRUaGVWYXJpYXRpb24oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8VmFyaWF0aW9uU2V0dGluZ3M+IHtcclxuICAgIGlmICghZmlsZU5hbWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MgPSB0aGlzLmdldChmaWxlTmFtZSk7XHJcbiAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHNldHRpbmdzLmxvYWRpbmcpIHtcclxuICAgICAgY29uc3Qgc2V0dCA9IGF3YWl0IHRoaXMuX3dhaXRGb3JWYXJpYXRpb25Ub0xvYWQoc2V0dGluZ3MpO1xyXG4gICAgICBhd2FpdCB0aGlzLl9sb2FkTWF0ZXJpYWxGcm9tU2V0dGluZ3Moc2V0dCk7XHJcbiAgICAgIHJldHVybiBzZXR0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5fbG9hZE1hdGVyaWFsRnJvbVNldHRpbmdzKHNldHRpbmdzKTtcclxuICAgICAgcmV0dXJuIHNldHRpbmdzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfbG9hZE1hdGVyaWFsRnJvbVNldHRpbmdzKHNldHRpbmdzOiBWYXJpYXRpb25TZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHNldHRpbmdzKSB7XHJcbiAgICAgIGlmICghc2V0dGluZ3MubWF0ZXJpYWwpIHtcclxuICAgICAgICBzZXR0aW5ncy5tYXRlcmlhbCA9IGF3YWl0IEFzc2V0VXRpbHMuQ3JlYXRlTWF0ZXJpYWxGcm9tQXNzZXQoc2V0dGluZ3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF93YWl0Rm9yVmFyaWF0aW9uVG9Mb2FkKHNldHRpbmdzOiBWYXJpYXRpb25TZXR0aW5ncyk6IFByb21pc2U8VmFyaWF0aW9uU2V0dGluZ3M+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24pID0+IHtcclxuICAgICAgc2V0dGluZ3MubG9hZGVkLnBpcGUoZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIFZhcmlhdGlvblNldHRpbmdzID0+IHZhbHVlICE9PSB1bmRlZmluZWQpLCB0YWtlKDEpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRDaGlsZHJlbkZpbHRlckJ5UHJvcChvYmo6IE9iamVjdDNELCB1c2VyRGF0YU9iamVjdFByb3A6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KTogT2JqZWN0M0RbXSB7XHJcbiAgICByZXR1cm4gb2JqLmNoaWxkcmVuLmZpbHRlcigoY2hpbGQpID0+IHtcclxuICAgICAgcmV0dXJuIGNoaWxkLnVzZXJEYXRhICYmXHJcbiAgICAgICAgY2hpbGQudXNlckRhdGEuaGFzT3duUHJvcGVydHkodXNlckRhdGFPYmplY3RQcm9wKSAmJlxyXG4gICAgICAgIGNoaWxkLnVzZXJEYXRhW3VzZXJEYXRhT2JqZWN0UHJvcF0uaGFzT3duUHJvcGVydHkocHJvcCkgJiZcclxuICAgICAgICBjaGlsZC51c2VyRGF0YVt1c2VyRGF0YU9iamVjdFByb3BdW3Byb3BdID09PSB2YWx1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXBwbHlNYXRlcmlhbFBhcnQob2JqOiBPYmplY3QzRCwgcGFydE1hdGVyaWFsOiBhbnksIG5vZGVJZDogYW55LCB1c2VQYnI6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDaGlsZHJlbkZpbHRlckJ5UHJvcChvYmosICdzZWxlY3Rpb24nLCAnbm9kZScsIG5vZGVJZCk7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IGNoaWxkcmVuLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgY2hpbGQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNoaWxkLnRyYXZlcnNlKChtZXNoOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICgobWVzaCBpbnN0YW5jZW9mIE1lc2ggfHwgbWVzaC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcpICYmIHBhcnRNYXRlcmlhbCkge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSkgeyAvLyBtdWx0aW1hdGVyaWFsIHN1cHBvcnRcclxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamxlbjogbnVtYmVyID0gbWVzaC5tYXRlcmlhbC5sZW5ndGg7IGogPCBqbGVuOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZXNoLm1hdGVyaWFsW2pdLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXhlZF9mcmFtZScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsW2pdID0gdGhpcy5fc2V0TWVzaE1hdGVyaWFsRnJvbVZhcmlhdGlvbihtZXNoLm1hdGVyaWFsW2pdLm5hbWUsIHBhcnRNYXRlcmlhbCwgdXNlUGJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKG1lc2gubWF0ZXJpYWwubmFtZSAmJiBtZXNoLm1hdGVyaWFsLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXhlZF9mcmFtZScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbCA9IHRoaXMuX3NldE1lc2hNYXRlcmlhbEZyb21WYXJpYXRpb24obWVzaC5tYXRlcmlhbC5uYW1lLCBwYXJ0TWF0ZXJpYWwsIHVzZVBicik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FwcGx5VmFyaWF0aW9ucyhvYmo6IE9iamVjdDNELCBwYXJ0OiBhbnksIHVzZVBicjogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuRmlsdGVyQnlQcm9wKG9iaiwgJ3NlbGVjdGlvbicsICdub2RlJywgcGFydC5ub2RlKTtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiBjaGlsZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY2hpbGQudHJhdmVyc2UoKG1lc2g6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKChtZXNoIGluc3RhbmNlb2YgTWVzaCB8fCBtZXNoLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJykgJiYgcGFydC52YXJpYXRpb25zICYmIHBhcnQudmFyaWF0aW9ucy5sZW5ndGggPiAwICYmIG1lc2gubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2NfJykpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXJ0LnZhcmlhdGlvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCB2YXJpYXRpb246IFZhcmlhdGlvbiA9IHBhcnQudmFyaWF0aW9uc1tqXTtcclxuICAgICAgICAgICAgICBpZiAodmFyaWF0aW9uLm1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRlcmlhbFRvU2VhcmNoOiBzdHJpbmcgPSAhIXZhcmlhdGlvbi5tYXRlcmlhbElkID8gdmFyaWF0aW9uLm1hdGVyaWFsSWQudG9Mb3dlckNhc2UoKSA6ICdkZWZhdWx0JztcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpKSB7IC8vIG11bHRpbWF0ZXJpYWwgc3VwcG9ydFxyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gMCwgbWxlbjogbnVtYmVyID0gbWVzaC5tYXRlcmlhbC5sZW5ndGg7IG0gPCBtbGVuOyBtKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbFttXS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihtYXRlcmlhbFRvU2VhcmNoKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFyaWF0aW9uLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwgfHwgdmFyaWF0aW9uLm1hdGVyaWFsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNYXRlcmlhbCcpICYmIHZhcmlhdGlvbi5tYXRlcmlhbC5pc01hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBUSFJFRS5NYXRlcmlhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsW21dID0gdmFyaWF0aW9uLm1hdGVyaWFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbFttXS5uYW1lICYmIChtZXNoLm1hdGVyaWFsW21dLm5hbWUgPT09ICdGaXhlZF9HbGFzcycgfHwgbWVzaC5tYXRlcmlhbFttXS5uYW1lID09PSAnRGVmYXVsdF9HbGFzcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWxbbV0gPSB0aGlzLl9zZXRNZXNoTWF0ZXJpYWxGcm9tVmFyaWF0aW9uKG1lc2gubWF0ZXJpYWxbbV0ubmFtZSwgdmFyaWF0aW9uLCB1c2VQYnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbFttXS5uYW1lICYmIChtZXNoLm1hdGVyaWFsW21dLm5hbWUgPT09ICdGaXhlZF9HbGFzcycgfHwgbWVzaC5tYXRlcmlhbFttXS5uYW1lID09PSAnRGVmYXVsdF9HbGFzcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChtZXNoLm1hdGVyaWFsLm5hbWUgJiYgbWVzaC5tYXRlcmlhbC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihtYXRlcmlhbFRvU2VhcmNoKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHZhcmlhdGlvbi5tYXRlcmlhbCBpbnN0YW5jZW9mIE1hdGVyaWFsIHx8IHZhcmlhdGlvbi5tYXRlcmlhbC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWF0ZXJpYWwnKSAmJiB2YXJpYXRpb24ubWF0ZXJpYWwuaXNNYXRlcmlhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBhIFRIUkVFLk1hdGVyaWFsXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsID0gdmFyaWF0aW9uLm1hdGVyaWFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2gubWF0ZXJpYWwubmFtZSA9PT0gJ0ZpeGVkX0dsYXNzJyB8fCBtZXNoLm1hdGVyaWFsLm5hbWUgPT09ICdEZWZhdWx0X0dsYXNzJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbCA9IHRoaXMuX3NldE1lc2hNYXRlcmlhbEZyb21WYXJpYXRpb24obWVzaC5tYXRlcmlhbC5uYW1lLCB2YXJpYXRpb24sIHVzZVBicik7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbC5uYW1lID09PSAnRml4ZWRfR2xhc3MnIHx8IG1lc2gubWF0ZXJpYWwubmFtZSA9PT0gJ0RlZmF1bHRfR2xhc3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRNZXNoTWF0ZXJpYWxGcm9tVmFyaWF0aW9uKG5hbWU6IHN0cmluZywgdmFyaWF0aW9uOiBWYXJpYXRpb24sIHVzZVBicjogYm9vbGVhbiA9IGZhbHNlKTogVEhSRUUuTWF0ZXJpYWwge1xyXG4gICAgY29uc3QgbWF0ZXJpYWwgPSB2YXJpYXRpb24ubWF0ZXJpYWw7XHJcbiAgICBpZiAobWF0ZXJpYWwudGV4dHVyZSkge1xyXG4gICAgICBtYXRlcmlhbC50ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgbWF0ZXJpYWwudGV4dHVyZS5tYXBwaW5nID0gRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc7XHJcbiAgICB9XHJcbiAgICBpZiAoIXVzZVBicikge1xyXG4gICAgICBjb25zdCBuZXdNYXRlcmlhbDogTWVzaFBob25nTWF0ZXJpYWwgPSBuZXcgTWVzaFBob25nTWF0ZXJpYWwoe1xyXG4gICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgc2hpbmluZXNzOiBtYXRlcmlhbC5zaGluaW5lc3MsXHJcbiAgICAgICAgc3BlY3VsYXI6IG1hdGVyaWFsLnNwZWN1bGFyLFxyXG4gICAgICAgIG1hcDogbWF0ZXJpYWwudGV4dHVyZSxcclxuICAgICAgICBub3JtYWxNYXA6IG1hdGVyaWFsLm5vcm1hbFxyXG4gICAgICB9KTtcclxuICAgICAgbmV3TWF0ZXJpYWwuY29sb3Iuc2V0UkdCKDAuOCwgMC44LCAwLjgpO1xyXG4gICAgICBuZXdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIHJldHVybiBuZXdNYXRlcmlhbDtcclxuICAgIH1cclxuICAgIGlmIChtYXRlcmlhbC5zaGVlbiB8fCBtYXRlcmlhbC5zaGVlbkNvbG9yIHx8IG1hdGVyaWFsLnJlZmxlY3Rpdml0eSB8fCBtYXRlcmlhbC50cmFuc21pc3Npb24pIHsgLy8gVE9ETzogUHJvcGVyIGNoZWNrIGZvciBhbGwgdW5pcXVlIHBoeXNpY2FsIG1hdGVyaWFsIHByb3BlcnRpZXNcclxuICAgICAgY29uc3QgcGFyYW1zOiBNZXNoUGh5c2ljYWxNYXRlcmlhbFBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgLy8gc2lkZTogbWF0ZXJpYWwuc2lkZSA/IG1hdGVyaWFsLnNpZGUgOiBGcm9udFNpZGUsXHJcbiAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICByb3VnaG5lc3M6IG1hdGVyaWFsLnJvdWdobmVzc1ZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwucm91Z2huZXNzVmFsdWUgIT09IG51bGwgPyBtYXRlcmlhbC5yb3VnaG5lc3NWYWx1ZSA6IDEsXHJcbiAgICAgICAgbWV0YWxuZXNzOiBtYXRlcmlhbC5tZXRhbG5lc3NWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLm1ldGFsbmVzc1ZhbHVlICE9PSBudWxsID8gbWF0ZXJpYWwubWV0YWxuZXNzVmFsdWUgOiAwLFxyXG4gICAgICAgIGVudk1hcEludGVuc2l0eTogbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5ID8gbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5IDogMC4wMSxcclxuICAgICAgICBjbGVhcmNvYXRNYXA6IG1hdGVyaWFsLmNsZWFyY29hdE1hcCA/IG1hdGVyaWFsLmNsZWFyY29hdE1hcCA6IG51bGwsXHJcbiAgICAgICAgY2xlYXJjb2F0Um91Z2huZXNzTWFwOiBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPyBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgOiBudWxsLFxyXG4gICAgICAgIGF0dGVudWF0aW9uRGlzdGFuY2U6IEluZmluaXR5XHJcbiAgICAgICAgLy8gd2lyZWZyYW1lOiB0cnVlLFxyXG4gICAgICAgIC8vIG9wYWNpdHk6IDAuMyxcclxuICAgICAgICAvLyB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgaWYgKG1hdGVyaWFsLmRpc3BsYWNlbWVudFZhbHVlKSB7XHJcbiAgICAgICAgcGFyYW1zLmRpc3BsYWNlbWVudFNjYWxlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50VmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLm9wYWNpdHkpIHtcclxuICAgICAgICBwYXJhbXMub3BhY2l0eSA9IG1hdGVyaWFsLm9wYWNpdHk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLnRyYW5zcGFyZW50KSB7XHJcbiAgICAgICAgcGFyYW1zLnRyYW5zcGFyZW50ID0gbWF0ZXJpYWwudHJhbnNwYXJlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmVtaXNzaXZlVmFsdWUpIHtcclxuICAgICAgICBwYXJhbXMuZW1pc3NpdmUgPSBtYXRlcmlhbC5lbWlzc2l2ZVZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eVZhbHVlKSB7XHJcbiAgICAgICAgcGFyYW1zLmVtaXNzaXZlSW50ZW5zaXR5ID0gbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHlWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwudGV4dHVyZSkge1xyXG4gICAgICAgIHBhcmFtcy5tYXAgPSBtYXRlcmlhbC50ZXh0dXJlO1xyXG4gICAgICAgIHBhcmFtcy5tYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5hbykge1xyXG4gICAgICAgIHBhcmFtcy5hb01hcCA9IG1hdGVyaWFsLmFvO1xyXG4gICAgICAgIHBhcmFtcy5hb01hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLnJvdWdobmVzcykge1xyXG4gICAgICAgIHBhcmFtcy5yb3VnaG5lc3NNYXAgPSBtYXRlcmlhbC5yb3VnaG5lc3M7XHJcbiAgICAgICAgcGFyYW1zLnJvdWdobmVzc01hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgLy8gbWF0ZXJpYWwucm91Z2huZXNzLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLm1ldGFsbmVzcykge1xyXG4gICAgICAgIHBhcmFtcy5tZXRhbG5lc3NNYXAgPSBtYXRlcmlhbC5tZXRhbG5lc3M7XHJcbiAgICAgICAgcGFyYW1zLm1ldGFsbmVzc01hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLm5vcm1hbCkge1xyXG4gICAgICAgIHBhcmFtcy5ub3JtYWxNYXAgPSBtYXRlcmlhbC5ub3JtYWw7XHJcbiAgICAgICAgcGFyYW1zLm5vcm1hbE1hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmRpc3BsYWNlbWVudCkge1xyXG4gICAgICAgIHBhcmFtcy5kaXNwbGFjZW1lbnRNYXAgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnQ7XHJcbiAgICAgICAgcGFyYW1zLmRpc3BsYWNlbWVudE1hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmVtaXNzaXZlKSB7XHJcbiAgICAgICAgcGFyYW1zLmVtaXNzaXZlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmU7XHJcbiAgICAgICAgcGFyYW1zLmVtaXNzaXZlTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZW52TWFwKSB7XHJcbiAgICAgICAgaWYgKG1hdGVyaWFsLmVudk1hcEludGVuc2l0eSAhPSBudWxsIHx8IDApIHtcclxuICAgICAgICAgIHBhcmFtcy5lbnZNYXAgPSBtYXRlcmlhbC5lbnZNYXA7XHJcbiAgICAgICAgICBwYXJhbXMuZW52TWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID0gRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc7XHJcbiAgICAgICAgICBtYXRlcmlhbC5lbnZNYXAubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuICAgICAgICAgIG1hdGVyaWFsLmVudk1hcC5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwucmVmbGVjdGl2aXR5KSB7XHJcbiAgICAgICAgcGFyYW1zLnJlZmxlY3Rpdml0eSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuc2lkZSkge1xyXG4gICAgICAgIHBhcmFtcy5zaWRlID0gbWF0ZXJpYWwuc2lkZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhbXMuc2lkZSA9IERvdWJsZVNpZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5ld01hdGVyaWFsOiBNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IG5ldyBNZXNoUGh5c2ljYWxNYXRlcmlhbChwYXJhbXMpO1xyXG4gICAgICBuZXdNYXRlcmlhbC5jb2xvci5zZXRSR0IoMSwgMSwgMSk7XHJcbiAgICAgIGlmIChtYXRlcmlhbC5zaGVlbikge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnNoZWVuID0gbWF0ZXJpYWwuc2hlZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRlcmlhbC5zaGVlbkNvbG9yKSB7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwuc2hlZW5Db2xvciA9IHRoaXMuX2NyZWF0ZVZhbGlkQ29sb3IobWF0ZXJpYWwuc2hlZW5Db2xvcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQWRkIGZhbGxiYWNrIGZvciBibGVuZGVyIHJlbmRlclxyXG4gICAgICAgIG5ld01hdGVyaWFsLnNoZWVuQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRlcmlhbC5zaGVlblJvdWdobmVzcykge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0gbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3M7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLnNoZWVuQ29sb3JNYXApIHtcclxuICAgICAgICBuZXdNYXRlcmlhbC5zaGVlbkNvbG9yTWFwID0gbWF0ZXJpYWwuc2hlZW5Db2xvck1hcDtcclxuICAgICAgICBuZXdNYXRlcmlhbC5zaGVlbkNvbG9yTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXApIHtcclxuICAgICAgICBuZXdNYXRlcmlhbC5zaGVlblJvdWdobmVzc01hcCA9IG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwO1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwudHJhbnNtaXNzaW9uKSB7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5pb3IgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5pb3IgIT09IG51bGwpIHtcclxuICAgICAgICBuZXdNYXRlcmlhbC5pb3IgPSBtYXRlcmlhbC5pb3I7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLnRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLnRoaWNrbmVzcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnRoaWNrbmVzcyA9IG1hdGVyaWFsLnRoaWNrbmVzcztcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eSAhPT0gbnVsbCkge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5ID0gbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCkge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcDtcclxuICAgICAgICBuZXdNYXRlcmlhbC50cmFuc21pc3Npb25NYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZXdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIHJldHVybiBuZXdNYXRlcmlhbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtczogTWVzaFN0YW5kYXJkTWF0ZXJpYWxQYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgIC8vIHNpZGU6IG1hdGVyaWFsLnNpZGUgPyBtYXRlcmlhbC5zaWRlIDogRnJvbnRTaWRlLFxyXG4gICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgcm91Z2huZXNzOiBtYXRlcmlhbC5yb3VnaG5lc3NWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLnJvdWdobmVzc1ZhbHVlICE9PSBudWxsID8gbWF0ZXJpYWwucm91Z2huZXNzVmFsdWUgOiAxLFxyXG4gICAgICAgIG1ldGFsbmVzczogbWF0ZXJpYWwubWV0YWxuZXNzVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5tZXRhbG5lc3NWYWx1ZSAhPT0gbnVsbCA/IG1hdGVyaWFsLm1ldGFsbmVzc1ZhbHVlIDogMCxcclxuICAgICAgICBlbnZNYXBJbnRlbnNpdHk6IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eSA/IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eSA6IDAuMDFcclxuICAgICAgICAvLyB3aXJlZnJhbWU6IHRydWUsXHJcbiAgICAgICAgLy8gb3BhY2l0eTogMC4zLFxyXG4gICAgICAgIC8vIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICB9O1xyXG4gICAgICBpZiAobWF0ZXJpYWwuZGlzcGxhY2VtZW50VmFsdWUpIHtcclxuICAgICAgICBwYXJhbXMuZGlzcGxhY2VtZW50U2NhbGUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwub3BhY2l0eSkge1xyXG4gICAgICAgIHBhcmFtcy5vcGFjaXR5ID0gbWF0ZXJpYWwub3BhY2l0eTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwudHJhbnNwYXJlbnQpIHtcclxuICAgICAgICBwYXJhbXMudHJhbnNwYXJlbnQgPSBtYXRlcmlhbC50cmFuc3BhcmVudDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZW1pc3NpdmVWYWx1ZSkge1xyXG4gICAgICAgIHBhcmFtcy5lbWlzc2l2ZSA9IG1hdGVyaWFsLmVtaXNzaXZlVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5VmFsdWUpIHtcclxuICAgICAgICBwYXJhbXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eVZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC50ZXh0dXJlKSB7XHJcbiAgICAgICAgcGFyYW1zLm1hcCA9IG1hdGVyaWFsLnRleHR1cmU7XHJcbiAgICAgICAgcGFyYW1zLm1hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmFvKSB7XHJcbiAgICAgICAgcGFyYW1zLmFvTWFwID0gbWF0ZXJpYWwuYW87XHJcbiAgICAgICAgcGFyYW1zLmFvTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwucm91Z2huZXNzKSB7XHJcbiAgICAgICAgcGFyYW1zLnJvdWdobmVzc01hcCA9IG1hdGVyaWFsLnJvdWdobmVzcztcclxuICAgICAgICBwYXJhbXMucm91Z2huZXNzTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAvLyBtYXRlcmlhbC5yb3VnaG5lc3MubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwubWV0YWxuZXNzKSB7XHJcbiAgICAgICAgcGFyYW1zLm1ldGFsbmVzc01hcCA9IG1hdGVyaWFsLm1ldGFsbmVzcztcclxuICAgICAgICBwYXJhbXMubWV0YWxuZXNzTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwubm9ybWFsKSB7XHJcbiAgICAgICAgcGFyYW1zLm5vcm1hbE1hcCA9IG1hdGVyaWFsLm5vcm1hbDtcclxuICAgICAgICBwYXJhbXMubm9ybWFsTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZGlzcGxhY2VtZW50KSB7XHJcbiAgICAgICAgcGFyYW1zLmRpc3BsYWNlbWVudE1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudDtcclxuICAgICAgICBwYXJhbXMuZGlzcGxhY2VtZW50TWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZW1pc3NpdmUpIHtcclxuICAgICAgICBwYXJhbXMuZW1pc3NpdmVNYXAgPSBtYXRlcmlhbC5lbWlzc2l2ZTtcclxuICAgICAgICBwYXJhbXMuZW1pc3NpdmVNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5lbnZNYXApIHtcclxuICAgICAgICBpZiAobWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5ICE9IG51bGwgfHwgMCkge1xyXG4gICAgICAgICAgcGFyYW1zLmVudk1hcCA9IG1hdGVyaWFsLmVudk1hcDtcclxuICAgICAgICAgIHBhcmFtcy5lbnZNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZztcclxuICAgICAgICAgIG1hdGVyaWFsLmVudk1hcC5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG4gICAgICAgICAgbWF0ZXJpYWwuZW52TWFwLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5zaWRlKSB7XHJcbiAgICAgICAgcGFyYW1zLnNpZGUgPSBtYXRlcmlhbC5zaWRlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtcy5zaWRlID0gRG91YmxlU2lkZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbmV3TWF0ZXJpYWw6IE1lc2hTdGFuZGFyZE1hdGVyaWFsID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKHBhcmFtcyk7XHJcbiAgICAgIG5ld01hdGVyaWFsLmNvbG9yLnNldFJHQigxLCAxLCAxKTtcclxuICAgICAgbmV3TWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgcmV0dXJuIG5ld01hdGVyaWFsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0TGFzdEtub3duVmFyaWF0aW9ucyhpZDogc3RyaW5nLCB2YXJpYXRpb246IFZhcmlhdGlvbltdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sYXN0S25vd25WYXJpYXRpb25zLnNldChpZCwgdmFyaWF0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldExhc3RLbm93blZhcmlhdGlvbnMoaWQ6IHN0cmluZyk6IFZhcmlhdGlvbltdIHtcclxuICAgIGlmICh0aGlzLl9sYXN0S25vd25WYXJpYXRpb25zLmhhcyhpZCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RLbm93blZhcmlhdGlvbnMuZ2V0KGlkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlVmFsaWRDb2xvcihjb2xvcjogQ29sb3IgfCBzdHJpbmcgfCBudW1iZXIpOiBDb2xvciB7XHJcbiAgICBpZiAodHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAoL14jPyhbMC05YS1mQS1GXXszfXxbMC05YS1mQS1GXXs2fSkkLy50ZXN0KGNvbG9yKSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoYCMke2NvbG9yLnJlcGxhY2UoJyMnLCAnJyl9YCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoY29sb3IgaW5zdGFuY2VvZiBDb2xvciB8fCBjb2xvci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQ29sb3InKSB7XHJcbiAgICAgIHJldHVybiBjb2xvciBhcyBDb2xvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihjb2xvcik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IENvbG9yKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IENvbG9yKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|