angular-three-soba 2.0.0-beta.9 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -4
- package/abstractions/README.md +279 -2
- package/abstractions/index.d.ts +13 -6
- package/abstractions/lib/billboard.d.ts +19 -0
- package/abstractions/lib/catmull-rom-line.d.ts +617 -0
- package/abstractions/lib/cubic-bezier-line.d.ts +19 -0
- package/abstractions/lib/edges.d.ts +800 -0
- package/abstractions/lib/gradient-texture.d.ts +24 -0
- package/abstractions/lib/grid.d.ts +315 -0
- package/abstractions/lib/helper.d.ts +25 -0
- package/abstractions/lib/line.d.ts +41 -0
- package/abstractions/lib/prism-geometry.d.ts +32 -0
- package/abstractions/lib/quadratic-bezier-line.d.ts +21 -0
- package/abstractions/lib/rounded-box.d.ts +41 -0
- package/abstractions/lib/text-3d.d.ts +314 -0
- package/abstractions/lib/text.d.ts +54 -0
- package/cameras/README.md +91 -2
- package/cameras/index.d.ts +4 -4
- package/cameras/lib/camera-content.d.ts +10 -0
- package/cameras/lib/cube-camera.d.ts +38 -0
- package/cameras/lib/orthographic-camera.d.ts +40 -0
- package/cameras/lib/perspective-camera.d.ts +36 -0
- package/controls/README.md +96 -2
- package/controls/index.d.ts +4 -1
- package/controls/lib/camera-controls.d.ts +31 -0
- package/controls/lib/orbit-controls.d.ts +38 -0
- package/controls/lib/pivot-controls/axis-arrow.d.ts +31 -0
- package/controls/lib/pivot-controls/axis-rotator.d.ts +30 -0
- package/controls/lib/pivot-controls/pivot-controls.d.ts +110 -0
- package/controls/lib/pivot-controls/plane-slider.d.ts +32 -0
- package/controls/lib/pivot-controls/scaling-sphere.d.ts +32 -0
- package/controls/lib/scroll-controls.d.ts +78 -0
- package/esm2022/abstractions/index.mjs +14 -7
- package/esm2022/abstractions/lib/billboard.mjs +69 -0
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +76 -0
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +51 -0
- package/esm2022/abstractions/lib/edges.mjs +70 -0
- package/esm2022/abstractions/lib/gradient-texture.mjs +91 -0
- package/esm2022/abstractions/lib/grid.mjs +103 -0
- package/esm2022/abstractions/lib/helper.mjs +76 -0
- package/esm2022/abstractions/lib/line.mjs +126 -0
- package/esm2022/abstractions/lib/prism-geometry.mjs +46 -0
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +73 -0
- package/esm2022/abstractions/lib/rounded-box.mjs +111 -0
- package/esm2022/abstractions/lib/text-3d.mjs +98 -0
- package/esm2022/abstractions/lib/text.mjs +91 -0
- package/esm2022/cameras/index.mjs +5 -5
- package/esm2022/cameras/lib/camera-content.mjs +14 -0
- package/esm2022/cameras/lib/cube-camera.mjs +111 -0
- package/esm2022/cameras/lib/orthographic-camera.mjs +131 -0
- package/esm2022/cameras/lib/perspective-camera.mjs +104 -0
- package/esm2022/controls/index.mjs +5 -2
- package/esm2022/controls/lib/camera-controls.mjs +127 -0
- package/esm2022/controls/lib/orbit-controls.mjs +132 -0
- package/esm2022/controls/lib/pivot-controls/axis-arrow.mjs +263 -0
- package/esm2022/controls/lib/pivot-controls/axis-rotator.mjs +264 -0
- package/esm2022/controls/lib/pivot-controls/pivot-controls.mjs +340 -0
- package/esm2022/controls/lib/pivot-controls/plane-slider.mjs +266 -0
- package/esm2022/controls/lib/pivot-controls/scaling-sphere.mjs +232 -0
- package/esm2022/controls/lib/scroll-controls.mjs +268 -0
- package/esm2022/loaders/index.mjs +6 -5
- package/esm2022/loaders/lib/font-loader.mjs +49 -0
- package/esm2022/loaders/lib/gltf-loader.mjs +51 -0
- package/esm2022/loaders/lib/loader.mjs +109 -0
- package/esm2022/loaders/lib/progress.mjs +51 -0
- package/esm2022/loaders/lib/texture-loader.mjs +32 -0
- package/esm2022/materials/index.mjs +8 -7
- package/esm2022/materials/lib/custom-shader-material.mjs +71 -0
- package/esm2022/materials/lib/mesh-distort-material.mjs +42 -0
- package/esm2022/materials/lib/mesh-reflector-material.mjs +278 -0
- package/esm2022/materials/lib/mesh-refraction-material.mjs +144 -0
- package/esm2022/materials/lib/mesh-transmission-material.mjs +188 -0
- package/esm2022/materials/lib/mesh-wobble-material.mjs +42 -0
- package/esm2022/materials/lib/point-material.mjs +33 -0
- package/esm2022/misc/index.mjs +14 -14
- package/esm2022/misc/lib/animations.mjs +71 -0
- package/esm2022/misc/lib/bake-shadows.mjs +26 -0
- package/esm2022/misc/lib/computed-attribute.mjs +55 -0
- package/esm2022/misc/lib/constants.mjs +5 -0
- package/esm2022/misc/lib/decal.mjs +139 -0
- package/esm2022/misc/lib/deprecated.mjs +15 -0
- package/esm2022/misc/lib/depth-buffer.mjs +39 -0
- package/esm2022/misc/lib/fbo.mjs +86 -0
- package/esm2022/misc/lib/html/html-content.mjs +327 -0
- package/esm2022/misc/lib/html/html.mjs +129 -0
- package/esm2022/misc/lib/html/utils.mjs +74 -0
- package/esm2022/misc/lib/intersect.mjs +52 -0
- package/esm2022/misc/lib/sampler.mjs +122 -0
- package/esm2022/misc/lib/scale-factor.mjs +29 -0
- package/esm2022/performances/index.mjs +7 -6
- package/esm2022/performances/lib/adaptive-dpr.mjs +52 -0
- package/esm2022/performances/lib/adaptive-events.mjs +28 -0
- package/esm2022/performances/lib/detailed.mjs +57 -0
- package/esm2022/performances/lib/instances/instances.mjs +183 -0
- package/esm2022/performances/lib/instances/position-mesh.mjs +51 -0
- package/esm2022/performances/lib/points/points.mjs +278 -0
- package/esm2022/performances/lib/points/position-point.mjs +53 -0
- package/esm2022/performances/lib/segments/segment-object.mjs +9 -0
- package/esm2022/performances/lib/segments/segments.mjs +129 -0
- package/esm2022/shaders/index.mjs +4 -18
- package/esm2022/shaders/lib/grid-material.mjs +81 -0
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +163 -0
- package/esm2022/shaders/lib/point-material.mjs +24 -0
- package/esm2022/staging/index.mjs +19 -22
- package/esm2022/staging/lib/accumulative-shadows.mjs +182 -0
- package/esm2022/staging/lib/backdrop.mjs +73 -0
- package/esm2022/staging/lib/bb-anchor.mjs +58 -0
- package/esm2022/staging/lib/bounds.mjs +286 -0
- package/esm2022/staging/lib/camera-shake.mjs +69 -0
- package/esm2022/staging/lib/caustics.mjs +188 -0
- package/esm2022/staging/lib/center.mjs +118 -0
- package/esm2022/staging/lib/contact-shadows.mjs +214 -0
- package/esm2022/staging/lib/environment.mjs +481 -0
- package/esm2022/staging/lib/float.mjs +70 -0
- package/esm2022/staging/lib/lightformer.mjs +107 -0
- package/esm2022/staging/lib/matcap-texture.mjs +81 -0
- package/esm2022/staging/lib/normal-texture.mjs +81 -0
- package/esm2022/staging/lib/randomized-lights.mjs +104 -0
- package/esm2022/staging/lib/render-texture.mjs +203 -0
- package/esm2022/staging/lib/sky.mjs +86 -0
- package/esm2022/staging/lib/spot-light.mjs +453 -0
- package/esm2022/staging/lib/stage.mjs +236 -0
- package/esm2022/{utils/angular-three-soba-utils.mjs → stats/angular-three-soba-stats.mjs} +1 -1
- package/esm2022/stats/index.mjs +2 -0
- package/esm2022/stats/lib/stats.mjs +63 -0
- package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +5 -0
- package/esm2022/vanilla-exports/index.mjs +3 -0
- package/fesm2022/angular-three-soba-abstractions.mjs +884 -697
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +261 -308
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +1776 -109
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +191 -145
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +527 -748
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +783 -1935
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +591 -475
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs +51 -1369
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +2350 -3521
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +70 -0
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -0
- package/fesm2022/angular-three-soba-vanilla-exports.mjs +6 -0
- package/fesm2022/angular-three-soba-vanilla-exports.mjs.map +1 -0
- package/loaders/README.md +130 -2
- package/loaders/index.d.ts +5 -4
- package/loaders/lib/font-loader.d.ts +27 -0
- package/loaders/lib/gltf-loader.d.ts +24 -0
- package/loaders/lib/loader.d.ts +29 -0
- package/loaders/lib/progress.d.ts +9 -0
- package/loaders/lib/texture-loader.d.ts +13 -0
- package/materials/README.md +160 -2
- package/materials/index.d.ts +7 -6
- package/materials/lib/custom-shader-material.d.ts +20 -0
- package/materials/lib/mesh-distort-material.d.ts +17 -0
- package/materials/lib/mesh-reflector-material.d.ts +51 -0
- package/materials/lib/mesh-refraction-material.d.ts +42 -0
- package/materials/lib/mesh-transmission-material.d.ts +77 -0
- package/materials/lib/mesh-wobble-material.d.ts +15 -0
- package/materials/lib/point-material.d.ts +11 -0
- package/metadata.json +1 -1
- package/misc/README.md +217 -2
- package/misc/index.d.ts +13 -13
- package/misc/lib/animations.d.ts +17 -0
- package/misc/lib/computed-attribute.d.ts +64 -0
- package/misc/lib/constants.d.ts +1 -0
- package/misc/lib/decal.d.ts +27 -0
- package/misc/lib/deprecated.d.ts +14 -0
- package/misc/lib/depth-buffer.d.ts +8 -0
- package/misc/lib/fbo.d.ts +46 -0
- package/misc/lib/html/html-content.d.ts +47 -0
- package/misc/lib/html/html.d.ts +30 -0
- package/misc/lib/html/utils.d.ts +14 -0
- package/misc/lib/intersect.d.ts +13 -0
- package/misc/lib/sampler.d.ts +73 -0
- package/misc/lib/scale-factor.d.ts +3 -0
- package/package.json +89 -49
- package/performances/index.d.ts +6 -5
- package/performances/lib/adaptive-dpr.d.ts +7 -0
- package/performances/{adaptive-events → lib}/adaptive-events.d.ts +0 -3
- package/performances/lib/detailed.d.ts +17 -0
- package/performances/lib/instances/instances.d.ts +122 -0
- package/performances/lib/instances/position-mesh.d.ts +20 -0
- package/performances/lib/points/points.d.ts +224 -0
- package/performances/lib/points/position-point.d.ts +21 -0
- package/performances/lib/segments/segment-object.d.ts +17 -0
- package/performances/lib/segments/segments.d.ts +97 -0
- package/shaders/index.d.ts +3 -17
- package/shaders/lib/grid-material.d.ts +69 -0
- package/shaders/lib/mesh-refraction-material.d.ts +11 -0
- package/shaders/lib/point-material.d.ts +14 -0
- package/staging/README.md +473 -2
- package/staging/index.d.ts +18 -21
- package/staging/lib/accumulative-shadows.d.ts +75 -0
- package/staging/lib/backdrop.d.ts +22 -0
- package/staging/lib/bb-anchor.d.ts +17 -0
- package/staging/lib/bounds.d.ts +47 -0
- package/staging/lib/camera-shake.d.ts +29 -0
- package/staging/lib/caustics.d.ts +53 -0
- package/staging/lib/center.d.ts +390 -0
- package/staging/lib/contact-shadows.d.ts +55 -0
- package/staging/lib/environment.d.ts +132 -0
- package/staging/lib/float.d.ts +20 -0
- package/staging/lib/lightformer.d.ts +310 -0
- package/staging/lib/matcap-texture.d.ts +32 -0
- package/staging/lib/normal-texture.d.ts +37 -0
- package/staging/lib/randomized-lights.d.ts +54 -0
- package/staging/lib/render-texture.d.ts +64 -0
- package/staging/lib/sky.d.ts +32 -0
- package/staging/lib/spot-light.d.ts +119 -0
- package/staging/lib/stage.d.ts +352 -0
- package/stats/README.md +3 -0
- package/stats/index.d.ts +1 -0
- package/stats/lib/stats.d.ts +14 -0
- package/vanilla-exports/README.md +3 -0
- package/vanilla-exports/index.d.ts +27 -0
- package/web-types.json +1 -1
- package/abstractions/billboard/billboard.d.ts +0 -28
- package/abstractions/detailed/detailed.d.ts +0 -26
- package/abstractions/edges/edges.d.ts +0 -34
- package/abstractions/grid/grid.d.ts +0 -50
- package/abstractions/text/text.d.ts +0 -82
- package/abstractions/text-3d/text-3d.d.ts +0 -81
- package/assets/distort.vert.glsl +0 -1
- package/cameras/camera/camera-content.d.ts +0 -13
- package/cameras/camera/camera.d.ts +0 -26
- package/cameras/cube-camera/cube-camera.d.ts +0 -69
- package/cameras/orthographic-camera/orthographic-camera.d.ts +0 -37
- package/cameras/perspective-camera/perspective-camera.d.ts +0 -18
- package/controls/orbit-controls/orbit-controls.d.ts +0 -54
- package/esm2022/abstractions/billboard/billboard.mjs +0 -74
- package/esm2022/abstractions/detailed/detailed.mjs +0 -64
- package/esm2022/abstractions/edges/edges.mjs +0 -88
- package/esm2022/abstractions/grid/grid.mjs +0 -180
- package/esm2022/abstractions/text/text.mjs +0 -274
- package/esm2022/abstractions/text-3d/text-3d.mjs +0 -165
- package/esm2022/cameras/camera/camera-content.mjs +0 -20
- package/esm2022/cameras/camera/camera.mjs +0 -77
- package/esm2022/cameras/cube-camera/cube-camera.mjs +0 -161
- package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +0 -102
- package/esm2022/cameras/perspective-camera/perspective-camera.mjs +0 -46
- package/esm2022/controls/orbit-controls/orbit-controls.mjs +0 -181
- package/esm2022/loaders/gltf-loader/gltf-loader.mjs +0 -30
- package/esm2022/loaders/loader/loader.mjs +0 -138
- package/esm2022/loaders/progress/progress.mjs +0 -45
- package/esm2022/loaders/texture-loader/texture-loader.mjs +0 -28
- package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +0 -82
- package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +0 -367
- package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +0 -171
- package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +0 -278
- package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
- package/esm2022/materials/point-material/point-material.mjs +0 -46
- package/esm2022/misc/animations/animations.mjs +0 -59
- package/esm2022/misc/bake-shadows/bake-shadows.mjs +0 -24
- package/esm2022/misc/caustics/caustics.mjs +0 -387
- package/esm2022/misc/decal/decal.mjs +0 -187
- package/esm2022/misc/depth-buffer/depth-buffer.mjs +0 -44
- package/esm2022/misc/example/example.mjs +0 -160
- package/esm2022/misc/fbo/fbo.mjs +0 -47
- package/esm2022/misc/html/html-wrapper.mjs +0 -478
- package/esm2022/misc/html/html.mjs +0 -304
- package/esm2022/misc/sampler/sampler.mjs +0 -142
- package/esm2022/misc/shadow/shadow.mjs +0 -111
- package/esm2022/misc/stats-gl/stats-gl.mjs +0 -61
- package/esm2022/misc/trail/trail.mjs +0 -209
- package/esm2022/misc/trail-texture/inject-trail-texture.mjs +0 -17
- package/esm2022/misc/trail-texture/trail-texture.mjs +0 -106
- package/esm2022/modifiers/angular-three-soba-modifiers.mjs +0 -5
- package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +0 -64
- package/esm2022/modifiers/index.mjs +0 -2
- package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +0 -44
- package/esm2022/performances/adaptive-events/adaptive-events.mjs +0 -27
- package/esm2022/performances/points/points-input.mjs +0 -64
- package/esm2022/performances/points/points.mjs +0 -329
- package/esm2022/performances/points/position-point.mjs +0 -54
- package/esm2022/performances/segments/segment-object.mjs +0 -9
- package/esm2022/performances/segments/segments.mjs +0 -182
- package/esm2022/shaders/blur-pass/blur-pass.mjs +0 -61
- package/esm2022/shaders/caustics/caustics-material.mjs +0 -130
- package/esm2022/shaders/caustics/caustics-projection-material.mjs +0 -31
- package/esm2022/shaders/convolution-material/convolution-material.mjs +0 -94
- package/esm2022/shaders/discard-material/discard-material.mjs +0 -3
- package/esm2022/shaders/grid-material/grid-material.mjs +0 -77
- package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +0 -56
- package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
- package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +0 -170
- package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
- package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
- package/esm2022/shaders/shader-material/shader-material.mjs +0 -34
- package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +0 -25
- package/esm2022/shaders/sparkles-material/sparkles-material.mjs +0 -33
- package/esm2022/shaders/spot-light-material/spot-light-material.mjs +0 -86
- package/esm2022/shaders/star-field-material/star-field-material.mjs +0 -33
- package/esm2022/shaders/wireframe-material/wireframe-material.mjs +0 -247
- package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +0 -267
- package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +0 -108
- package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +0 -206
- package/esm2022/staging/backdrop/backdrop.mjs +0 -77
- package/esm2022/staging/bb-anchor/bb-anchor.mjs +0 -70
- package/esm2022/staging/bounds/bounds.mjs +0 -308
- package/esm2022/staging/camera-shake/camera-shake.mjs +0 -123
- package/esm2022/staging/center/center.mjs +0 -163
- package/esm2022/staging/cloud/cloud.mjs +0 -158
- package/esm2022/staging/contact-shadows/contact-shadows.mjs +0 -246
- package/esm2022/staging/environment/assets.mjs +0 -13
- package/esm2022/staging/environment/environment-cube.mjs +0 -47
- package/esm2022/staging/environment/environment-ground.mjs +0 -41
- package/esm2022/staging/environment/environment-input.mjs +0 -119
- package/esm2022/staging/environment/environment-map.mjs +0 -53
- package/esm2022/staging/environment/environment-portal.mjs +0 -113
- package/esm2022/staging/environment/environment.mjs +0 -61
- package/esm2022/staging/environment/utils.mjs +0 -105
- package/esm2022/staging/float/float.mjs +0 -94
- package/esm2022/staging/matcap-texture/matcap-texture.mjs +0 -64
- package/esm2022/staging/normal-texture/normal-texture.mjs +0 -53
- package/esm2022/staging/sky/sky.mjs +0 -119
- package/esm2022/staging/sparkles/sparkles.mjs +0 -164
- package/esm2022/staging/spot-light/shadow-mesh-input.mjs +0 -63
- package/esm2022/staging/spot-light/shadow-mesh.mjs +0 -266
- package/esm2022/staging/spot-light/spot-light-input.mjs +0 -84
- package/esm2022/staging/spot-light/spot-light.mjs +0 -81
- package/esm2022/staging/spot-light/volumetric-mesh.mjs +0 -98
- package/esm2022/staging/stage/stage.mjs +0 -388
- package/esm2022/staging/stars/stars.mjs +0 -147
- package/esm2022/staging/wireframe/wireframe-input.mjs +0 -191
- package/esm2022/staging/wireframe/wireframe.mjs +0 -224
- package/esm2022/utils/content/content.mjs +0 -15
- package/esm2022/utils/index.mjs +0 -2
- package/fesm2022/angular-three-soba-modifiers.mjs +0 -71
- package/fesm2022/angular-three-soba-modifiers.mjs.map +0 -1
- package/fesm2022/angular-three-soba-utils.mjs +0 -22
- package/fesm2022/angular-three-soba-utils.mjs.map +0 -1
- package/loaders/gltf-loader/gltf-loader.d.ts +0 -10
- package/loaders/loader/loader.d.ts +0 -33
- package/loaders/progress/progress.d.ts +0 -9
- package/loaders/texture-loader/texture-loader.d.ts +0 -7
- package/materials/mesh-distort-material/mesh-distort-material.d.ts +0 -40
- package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +0 -99
- package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +0 -62
- package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +0 -107
- package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +0 -29
- package/materials/point-material/point-material.d.ts +0 -24
- package/misc/animations/animations.d.ts +0 -15
- package/misc/caustics/caustics.d.ts +0 -87
- package/misc/decal/decal.d.ts +0 -49
- package/misc/depth-buffer/depth-buffer.d.ts +0 -9
- package/misc/example/example.d.ts +0 -81
- package/misc/fbo/fbo.d.ts +0 -17
- package/misc/html/html-wrapper.d.ts +0 -559
- package/misc/html/html.d.ts +0 -214
- package/misc/sampler/sampler.d.ts +0 -67
- package/misc/shadow/shadow.d.ts +0 -37
- package/misc/stats-gl/stats-gl.d.ts +0 -24
- package/misc/trail/trail.d.ts +0 -57
- package/misc/trail-texture/inject-trail-texture.d.ts +0 -9
- package/misc/trail-texture/trail-texture.d.ts +0 -50
- package/modifiers/README.md +0 -3
- package/modifiers/curve-modifier/curve-modifier.d.ts +0 -23
- package/modifiers/index.d.ts +0 -1
- package/performances/adaptive-dpr/adaptive-dpr.d.ts +0 -14
- package/performances/points/points-input.d.ts +0 -32
- package/performances/points/points.d.ts +0 -92
- package/performances/points/position-point.d.ts +0 -11
- package/performances/segments/segment-object.d.ts +0 -7
- package/performances/segments/segments.d.ts +0 -124
- package/shaders/blur-pass/blur-pass.d.ts +0 -23
- package/shaders/caustics/caustics-material.d.ts +0 -4
- package/shaders/caustics/caustics-projection-material.d.ts +0 -4
- package/shaders/convolution-material/convolution-material.d.ts +0 -7
- package/shaders/discard-material/discard-material.d.ts +0 -3
- package/shaders/grid-material/grid-material.d.ts +0 -37
- package/shaders/mesh-distort-material/mesh-distort-material.d.ts +0 -295
- package/shaders/mesh-reflector-material/mesh-reflector-material.d.ts +0 -50
- package/shaders/mesh-refraction-material/mesh-refraction-material.d.ts +0 -4
- package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +0 -25
- package/shaders/mesh-wobble-material/mesh-wobble-material.d.ts +0 -16
- package/shaders/shader-material/shader-material.d.ts +0 -6
- package/shaders/soft-shadow-material/soft-shadow-material.d.ts +0 -19
- package/shaders/sparkles-material/sparkles-material.d.ts +0 -17
- package/shaders/spot-light-material/spot-light-material.d.ts +0 -13
- package/shaders/star-field-material/star-field-material.d.ts +0 -13
- package/shaders/wireframe-material/wireframe-material.d.ts +0 -58
- package/staging/accumulative-shadows/accumulative-shadows.d.ts +0 -146
- package/staging/accumulative-shadows/progressive-light-map.d.ts +0 -34
- package/staging/accumulative-shadows/randomized-lights.d.ts +0 -90
- package/staging/backdrop/backdrop.d.ts +0 -30
- package/staging/bb-anchor/bb-anchor.d.ts +0 -27
- package/staging/bounds/bounds.d.ts +0 -134
- package/staging/camera-shake/camera-shake.d.ts +0 -43
- package/staging/center/center.d.ts +0 -70
- package/staging/cloud/cloud.d.ts +0 -51
- package/staging/contact-shadows/contact-shadows.d.ts +0 -70
- package/staging/environment/assets.d.ts +0 -13
- package/staging/environment/environment-cube.d.ts +0 -15
- package/staging/environment/environment-ground.d.ts +0 -13
- package/staging/environment/environment-input.d.ts +0 -68
- package/staging/environment/environment-map.d.ts +0 -16
- package/staging/environment/environment-portal.d.ts +0 -18
- package/staging/environment/environment.d.ts +0 -8
- package/staging/environment/utils.d.ts +0 -7
- package/staging/float/float.d.ts +0 -31
- package/staging/matcap-texture/matcap-texture.d.ts +0 -13
- package/staging/normal-texture/normal-texture.d.ts +0 -16
- package/staging/sky/sky.d.ts +0 -48
- package/staging/sparkles/sparkles.d.ts +0 -63
- package/staging/spot-light/shadow-mesh-input.d.ts +0 -29
- package/staging/spot-light/shadow-mesh.d.ts +0 -37
- package/staging/spot-light/spot-light-input.d.ts +0 -38
- package/staging/spot-light/spot-light.d.ts +0 -39
- package/staging/spot-light/volumetric-mesh.d.ts +0 -24
- package/staging/stage/stage.d.ts +0 -130
- package/staging/stars/stars.d.ts +0 -45
- package/staging/wireframe/wireframe-input.d.ts +0 -65
- package/staging/wireframe/wireframe.d.ts +0 -28
- package/utils/README.md +0 -3
- package/utils/content/content.d.ts +0 -8
- package/utils/index.d.ts +0 -1
- /package/misc/{bake-shadows → lib}/bake-shadows.d.ts +0 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { afterNextRender, ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, input, untracked, viewChild, } from '@angular/core';
|
|
2
|
+
import { extend, injectBeforeRender, injectStore, is, pick } from 'angular-three';
|
|
3
|
+
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
4
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
5
|
+
import { Box3, Group, Matrix4, Quaternion, Vector3 } from 'three';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
var AnimationState;
|
|
8
|
+
(function (AnimationState) {
|
|
9
|
+
AnimationState[AnimationState["NONE"] = 0] = "NONE";
|
|
10
|
+
AnimationState[AnimationState["START"] = 1] = "START";
|
|
11
|
+
AnimationState[AnimationState["ACTIVE"] = 2] = "ACTIVE";
|
|
12
|
+
})(AnimationState || (AnimationState = {}));
|
|
13
|
+
function isBox3(def) {
|
|
14
|
+
return !!def && def.isBox3;
|
|
15
|
+
}
|
|
16
|
+
function interpolateFuncDefault(t) {
|
|
17
|
+
// Imitates the previously used THREE.MathUtils.damp
|
|
18
|
+
return 1 - Math.exp(-5 * t) + 0.007 * t;
|
|
19
|
+
}
|
|
20
|
+
const defaultOptions = {
|
|
21
|
+
maxDuration: 1.0,
|
|
22
|
+
margin: 1.2,
|
|
23
|
+
interpolateFunc: interpolateFuncDefault,
|
|
24
|
+
clip: false,
|
|
25
|
+
fit: false,
|
|
26
|
+
observe: false,
|
|
27
|
+
};
|
|
28
|
+
export class NgtsBounds {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
31
|
+
this.groupRef = viewChild.required('group');
|
|
32
|
+
this.store = injectStore();
|
|
33
|
+
this.camera = this.store.select('camera');
|
|
34
|
+
this.invalidate = this.store.select('invalidate');
|
|
35
|
+
this.size = this.store.select('size');
|
|
36
|
+
this.controls = this.store.select('controls');
|
|
37
|
+
this.clipOption = pick(this.options, 'clip');
|
|
38
|
+
this.fitOption = pick(this.options, 'fit');
|
|
39
|
+
this.observe = pick(this.options, 'observe');
|
|
40
|
+
this.origin = {
|
|
41
|
+
camPos: new Vector3(),
|
|
42
|
+
camRot: new Quaternion(),
|
|
43
|
+
camZoom: 1,
|
|
44
|
+
};
|
|
45
|
+
this.goal = {
|
|
46
|
+
camPos: undefined,
|
|
47
|
+
camRot: undefined,
|
|
48
|
+
camZoom: undefined,
|
|
49
|
+
camUp: undefined,
|
|
50
|
+
target: undefined,
|
|
51
|
+
};
|
|
52
|
+
this.animationState = AnimationState.NONE;
|
|
53
|
+
// represent animation state from 0 to 1
|
|
54
|
+
this.t = 0;
|
|
55
|
+
this.box = new Box3();
|
|
56
|
+
extend({ Group });
|
|
57
|
+
const autoEffect = injectAutoEffect();
|
|
58
|
+
afterNextRender(() => {
|
|
59
|
+
autoEffect(() => {
|
|
60
|
+
const [controls, camera] = [this.controls(), untracked(this.camera)];
|
|
61
|
+
if (!controls)
|
|
62
|
+
return;
|
|
63
|
+
const callback = () => {
|
|
64
|
+
if (controls && this.goal.target && this.animationState !== AnimationState.NONE) {
|
|
65
|
+
const front = new Vector3().setFromMatrixColumn(camera.matrix, 2);
|
|
66
|
+
const d0 = this.origin.camPos.distanceTo(controls.target);
|
|
67
|
+
const d1 = (this.goal.camPos || this.origin.camPos).distanceTo(this.goal.target);
|
|
68
|
+
const d = (1 - this.t) * d0 + this.t * d1;
|
|
69
|
+
controls.target.copy(camera.position).addScaledVector(front, -d);
|
|
70
|
+
controls.update();
|
|
71
|
+
}
|
|
72
|
+
this.animationState = AnimationState.NONE;
|
|
73
|
+
};
|
|
74
|
+
controls.addEventListener('start', callback);
|
|
75
|
+
return () => controls.removeEventListener('start', callback);
|
|
76
|
+
});
|
|
77
|
+
let count = 0;
|
|
78
|
+
autoEffect(() => {
|
|
79
|
+
const [clip, fit, observe] = [
|
|
80
|
+
this.clipOption(),
|
|
81
|
+
this.fitOption(),
|
|
82
|
+
this.observe(),
|
|
83
|
+
this.size(),
|
|
84
|
+
this.camera(),
|
|
85
|
+
this.controls(),
|
|
86
|
+
];
|
|
87
|
+
if (observe || count++ === 0) {
|
|
88
|
+
this.refresh();
|
|
89
|
+
if (fit)
|
|
90
|
+
this.reset().fit();
|
|
91
|
+
if (clip)
|
|
92
|
+
this.clip();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
injectBeforeRender(({ delta }) => {
|
|
97
|
+
// This [additional animation step START] is needed to guarantee that delta used in animation isn't absurdly high (2-3 seconds) which is actually possible if rendering happens on demand...
|
|
98
|
+
if (this.animationState === AnimationState.START) {
|
|
99
|
+
this.animationState = AnimationState.ACTIVE;
|
|
100
|
+
this.invalidate();
|
|
101
|
+
}
|
|
102
|
+
else if (this.animationState === AnimationState.ACTIVE) {
|
|
103
|
+
const [{ maxDuration, interpolateFunc }, camera, controls, invalidate] = [
|
|
104
|
+
this.options(),
|
|
105
|
+
this.camera(),
|
|
106
|
+
this.controls(),
|
|
107
|
+
this.invalidate(),
|
|
108
|
+
];
|
|
109
|
+
this.t += delta / maxDuration;
|
|
110
|
+
if (this.t >= 1) {
|
|
111
|
+
this.goal.camPos && camera.position.copy(this.goal.camPos);
|
|
112
|
+
this.goal.camRot && camera.quaternion.copy(this.goal.camRot);
|
|
113
|
+
this.goal.camUp && camera.up.copy(this.goal.camUp);
|
|
114
|
+
this.goal.camZoom && is.orthographicCamera(camera) && (camera.zoom = this.goal.camZoom);
|
|
115
|
+
camera.updateMatrixWorld();
|
|
116
|
+
camera.updateProjectionMatrix();
|
|
117
|
+
if (controls && this.goal.target) {
|
|
118
|
+
controls.target.copy(this.goal.target);
|
|
119
|
+
controls.update();
|
|
120
|
+
}
|
|
121
|
+
this.animationState = AnimationState.NONE;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const k = interpolateFunc(this.t);
|
|
125
|
+
this.goal.camPos && camera.position.lerpVectors(this.origin.camPos, this.goal.camPos, k);
|
|
126
|
+
this.goal.camRot && camera.quaternion.slerpQuaternions(this.origin.camRot, this.goal.camRot, k);
|
|
127
|
+
this.goal.camUp && camera.up.set(0, 1, 0).applyQuaternion(camera.quaternion);
|
|
128
|
+
this.goal.camZoom &&
|
|
129
|
+
is.orthographicCamera(camera) &&
|
|
130
|
+
(camera.zoom = (1 - k) * this.origin.camZoom + k * this.goal.camZoom);
|
|
131
|
+
camera.updateMatrixWorld();
|
|
132
|
+
camera.updateProjectionMatrix();
|
|
133
|
+
}
|
|
134
|
+
invalidate();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
getSize() {
|
|
139
|
+
const [camera, { margin }] = [untracked(this.camera), untracked(this.options)];
|
|
140
|
+
const boxSize = this.box.getSize(new Vector3());
|
|
141
|
+
const center = this.box.getCenter(new Vector3());
|
|
142
|
+
const maxSize = Math.max(boxSize.x, boxSize.y, boxSize.z);
|
|
143
|
+
const fitHeightDistance = is.orthographicCamera(camera)
|
|
144
|
+
? maxSize * 4
|
|
145
|
+
: maxSize / (2 * Math.atan((Math.PI * camera.fov) / 360));
|
|
146
|
+
const fitWidthDistance = is.orthographicCamera(camera) ? maxSize * 4 : fitHeightDistance / camera.aspect;
|
|
147
|
+
const distance = margin * Math.max(fitHeightDistance, fitWidthDistance);
|
|
148
|
+
return { box: this.box, size: boxSize, center, distance };
|
|
149
|
+
}
|
|
150
|
+
refresh(object) {
|
|
151
|
+
const [group, camera] = [untracked(this.groupRef).nativeElement, untracked(this.camera)];
|
|
152
|
+
if (isBox3(object))
|
|
153
|
+
this.box.copy(object);
|
|
154
|
+
else {
|
|
155
|
+
const target = object || group;
|
|
156
|
+
if (!target)
|
|
157
|
+
return this;
|
|
158
|
+
target.updateWorldMatrix(true, true);
|
|
159
|
+
this.box.setFromObject(target);
|
|
160
|
+
}
|
|
161
|
+
if (this.box.isEmpty()) {
|
|
162
|
+
const max = camera.position.length() || 10;
|
|
163
|
+
this.box.setFromCenterAndSize(new Vector3(), new Vector3(max, max, max));
|
|
164
|
+
}
|
|
165
|
+
this.origin.camPos.copy(camera.position);
|
|
166
|
+
this.origin.camRot.copy(camera.quaternion);
|
|
167
|
+
is.orthographicCamera(camera) && (this.origin.camZoom = camera.zoom);
|
|
168
|
+
this.goal.camPos = undefined;
|
|
169
|
+
this.goal.camRot = undefined;
|
|
170
|
+
this.goal.camZoom = undefined;
|
|
171
|
+
this.goal.camUp = undefined;
|
|
172
|
+
this.goal.target = undefined;
|
|
173
|
+
return this;
|
|
174
|
+
}
|
|
175
|
+
reset() {
|
|
176
|
+
const [camera] = [untracked(this.camera)];
|
|
177
|
+
const { center, distance } = this.getSize();
|
|
178
|
+
const direction = camera.position.clone().sub(center).normalize();
|
|
179
|
+
this.goal.camPos = center.clone().addScaledVector(direction, distance);
|
|
180
|
+
this.goal.target = center.clone();
|
|
181
|
+
const mCamRot = new Matrix4().lookAt(this.goal.camPos, this.goal.target, camera.up);
|
|
182
|
+
this.goal.camRot = new Quaternion().setFromRotationMatrix(mCamRot);
|
|
183
|
+
this.animationState = AnimationState.START;
|
|
184
|
+
this.t = 0;
|
|
185
|
+
return this;
|
|
186
|
+
}
|
|
187
|
+
moveTo(position) {
|
|
188
|
+
this.goal.camPos = Array.isArray(position) ? new Vector3(...position) : position.clone();
|
|
189
|
+
this.animationState = AnimationState.START;
|
|
190
|
+
this.t = 0;
|
|
191
|
+
return this;
|
|
192
|
+
}
|
|
193
|
+
lookAt({ target, up }) {
|
|
194
|
+
const [camera] = [untracked(this.camera)];
|
|
195
|
+
this.goal.target = Array.isArray(target) ? new Vector3(...target) : target.clone();
|
|
196
|
+
if (up) {
|
|
197
|
+
this.goal.camUp = Array.isArray(up) ? new Vector3(...up) : up.clone();
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
this.goal.camUp = camera.up.clone();
|
|
201
|
+
}
|
|
202
|
+
const mCamRot = new Matrix4().lookAt(this.goal.camPos || camera.position, this.goal.target, this.goal.camUp);
|
|
203
|
+
this.goal.camRot = new Quaternion().setFromRotationMatrix(mCamRot);
|
|
204
|
+
this.animationState = AnimationState.START;
|
|
205
|
+
this.t = 0;
|
|
206
|
+
return this;
|
|
207
|
+
}
|
|
208
|
+
fit() {
|
|
209
|
+
const [camera, controls, { margin }] = [untracked(this.camera), untracked(this.controls), untracked(this.options)];
|
|
210
|
+
if (!is.orthographicCamera(camera)) {
|
|
211
|
+
// For non-orthographic cameras, fit should behave exactly like reset
|
|
212
|
+
return this.reset();
|
|
213
|
+
}
|
|
214
|
+
// For orthographic cameras, fit should only modify the zoom value
|
|
215
|
+
let maxHeight = 0;
|
|
216
|
+
let maxWidth = 0;
|
|
217
|
+
const vertices = [
|
|
218
|
+
new Vector3(this.box.min.x, this.box.min.y, this.box.min.z),
|
|
219
|
+
new Vector3(this.box.min.x, this.box.max.y, this.box.min.z),
|
|
220
|
+
new Vector3(this.box.min.x, this.box.min.y, this.box.max.z),
|
|
221
|
+
new Vector3(this.box.min.x, this.box.max.y, this.box.max.z),
|
|
222
|
+
new Vector3(this.box.max.x, this.box.max.y, this.box.max.z),
|
|
223
|
+
new Vector3(this.box.max.x, this.box.max.y, this.box.min.z),
|
|
224
|
+
new Vector3(this.box.max.x, this.box.min.y, this.box.max.z),
|
|
225
|
+
new Vector3(this.box.max.x, this.box.min.y, this.box.min.z),
|
|
226
|
+
];
|
|
227
|
+
// Transform the center and each corner to camera space
|
|
228
|
+
const pos = this.goal.camPos || camera.position;
|
|
229
|
+
const target = this.goal.target || controls.target;
|
|
230
|
+
const up = this.goal.camUp || camera.up;
|
|
231
|
+
const mCamWInv = target
|
|
232
|
+
? new Matrix4().lookAt(pos, target, up).setPosition(pos).invert()
|
|
233
|
+
: camera.matrixWorldInverse;
|
|
234
|
+
for (const v of vertices) {
|
|
235
|
+
v.applyMatrix4(mCamWInv);
|
|
236
|
+
maxHeight = Math.max(maxHeight, Math.abs(v.y));
|
|
237
|
+
maxWidth = Math.max(maxWidth, Math.abs(v.x));
|
|
238
|
+
}
|
|
239
|
+
maxHeight *= 2;
|
|
240
|
+
maxWidth *= 2;
|
|
241
|
+
const zoomForHeight = (camera.top - camera.bottom) / maxHeight;
|
|
242
|
+
const zoomForWidth = (camera.right - camera.left) / maxWidth;
|
|
243
|
+
this.goal.camZoom = Math.min(zoomForHeight, zoomForWidth) / margin;
|
|
244
|
+
this.animationState = AnimationState.START;
|
|
245
|
+
this.t = 0;
|
|
246
|
+
return this;
|
|
247
|
+
}
|
|
248
|
+
clip() {
|
|
249
|
+
const [camera, controls, invalidate] = [
|
|
250
|
+
untracked(this.camera),
|
|
251
|
+
untracked(this.controls),
|
|
252
|
+
untracked(this.invalidate),
|
|
253
|
+
];
|
|
254
|
+
const { distance } = this.getSize();
|
|
255
|
+
camera.near = distance / 100;
|
|
256
|
+
camera.far = distance * 100;
|
|
257
|
+
camera.updateProjectionMatrix();
|
|
258
|
+
if (controls) {
|
|
259
|
+
controls.maxDistance = distance * 10;
|
|
260
|
+
controls.update();
|
|
261
|
+
}
|
|
262
|
+
invalidate();
|
|
263
|
+
return this;
|
|
264
|
+
}
|
|
265
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsBounds, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
266
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.0", type: NgtsBounds, isStandalone: true, selector: "ngts-bounds", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
267
|
+
<ngt-group #group>
|
|
268
|
+
<ng-content />
|
|
269
|
+
</ngt-group>
|
|
270
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
271
|
+
}
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsBounds, decorators: [{
|
|
273
|
+
type: Component,
|
|
274
|
+
args: [{
|
|
275
|
+
selector: 'ngts-bounds',
|
|
276
|
+
standalone: true,
|
|
277
|
+
template: `
|
|
278
|
+
<ngt-group #group>
|
|
279
|
+
<ng-content />
|
|
280
|
+
</ngt-group>
|
|
281
|
+
`,
|
|
282
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
283
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
284
|
+
}]
|
|
285
|
+
}], ctorParameters: () => [] });
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULHNCQUFzQixFQUV0QixLQUFLLEVBRUwsU0FBUyxFQUNULFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQVksSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQVksVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFXNUUsSUFBSyxjQUlKO0FBSkQsV0FBSyxjQUFjO0lBQ2xCLG1EQUFRLENBQUE7SUFDUixxREFBUyxDQUFBO0lBQ1QsdURBQVUsQ0FBQTtBQUNYLENBQUMsRUFKSSxjQUFjLEtBQWQsY0FBYyxRQUlsQjtBQUVELFNBQVMsTUFBTSxDQUFDLEdBQVk7SUFDM0IsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFLLEdBQVksQ0FBQyxNQUFNLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsQ0FBUztJQUN4QyxvREFBb0Q7SUFDcEQsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFXRCxNQUFNLGNBQWMsR0FBc0I7SUFDekMsV0FBVyxFQUFFLEdBQUc7SUFDaEIsTUFBTSxFQUFF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QyxDQUFDO1lBQzNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzNELENBQUM7UUFFRix1REFBdUQ7UUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ25ELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTTtZQUN0QixDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ2pFLENBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7UUFDN0IsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pCLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQ2YsUUFBUSxJQUFJLENBQUMsQ0FBQztRQUNkLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQy9ELE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBRTdELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUVuRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFWCxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRCxJQUFJO1FBQ0gsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUc7WUFDdEMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDeEIsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDMUIsQ0FBQztRQUNGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFcEMsTUFBTSxDQUFDLElBQUksR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUM1QixNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVoQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2QsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ3JDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBRUQsVUFBVSxFQUFFLENBQUM7UUFFYixPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7OEdBdFJXLFVBQVU7a0dBQVYsVUFBVSxvVUFSWjs7OztFQUlUOzsyRkFJVyxVQUFVO2tCQVh0QixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxhQUFhO29CQUN2QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RWxlbWVudFJlZixcblx0aW5wdXQsXG5cdFNpZ25hbCxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpbmplY3RCZWZvcmVSZW5kZXIsIGluamVjdFN0b3JlLCBpcywgTmd0R3JvdXAsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IEJveDMsIEdyb3VwLCBNYXRyaXg0LCBPYmplY3QzRCwgUXVhdGVybmlvbiwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcblxuaW50ZXJmYWNlIENvbnRyb2xzUHJvdG8ge1xuXHR1cGRhdGUoKTogdm9pZDtcblxuXHR0YXJnZXQ6IFZlY3RvcjM7XG5cdG1heERpc3RhbmNlOiBudW1iZXI7XG5cdGFkZEV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG59XG5cbmVudW0gQW5pbWF0aW9uU3RhdGUge1xuXHROT05FID0gMCxcblx0U1RBUlQgPSAxLFxuXHRBQ1RJVkUgPSAyLFxufVxuXG5mdW5jdGlvbiBpc0JveDMoZGVmOiB1bmtub3duKTogZGVmIGlzIEJveDMge1xuXHRyZXR1cm4gISFkZWYgJiYgKGRlZiBhcyBCb3gzKS5pc0JveDM7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlRnVuY0RlZmF1bHQodDogbnVtYmVyKSB7XG5cdC8vIEltaXRhdGVzIHRoZSBwcmV2aW91c2x5IHVzZWQgVEhSRUUuTWF0aFV0aWxzLmRhbXBcblx0cmV0dXJuIDEgLSBNYXRoLmV4cCgtNSAqIHQpICsgMC4wMDcgKiB0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNCb3VuZHNPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxOZ3RHcm91cD4ge1xuXHRtYXhEdXJhdGlvbjogbnVtYmVyO1xuXHRtYXJnaW46IG51bWJlcjtcblx0b2JzZXJ2ZTogYm9vbGVhbjtcblx0Zml0OiBib29sZWFuO1xuXHRjbGlwOiBib29sZWFuO1xuXHRpbnRlcnBvbGF0ZUZ1bmM6ICh0OiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHNCb3VuZHNPcHRpb25zID0ge1xuXHRtYXhEdXJhdGlvbjogMS4wLFxuXHRtYXJnaW46IDEuMixcblx0aW50ZXJwb2xhdGVGdW5jOiBpbnRlcnBvbGF0ZUZ1bmNEZWZhdWx0LFxuXHRjbGlwOiBmYWxzZSxcblx0Zml0OiBmYWxzZSxcblx0b2JzZXJ2ZTogZmFsc2UsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWJvdW5kcycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cCAjZ3JvdXA+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LWdyb3VwPlxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQm91bmRzIHtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRPcHRpb25zLCB7IHRyYW5zZm9ybTogbWVyZ2VJbnB1dHMoZGVmYXVsdE9wdGlvbnMpIH0pO1xuXG5cdGdyb3VwUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8R3JvdXA+PignZ3JvdXAnKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cdHByaXZhdGUgc2l6ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzaXplJyk7XG5cdHByaXZhdGUgY29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDxDb250cm9sc1Byb3RvPjtcblxuXHRwcml2YXRlIGNsaXBPcHRpb24gPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NsaXAnKTtcblx0cHJpdmF0ZSBmaXRPcHRpb24gPSBwaWNrKHRoaXMub3B0aW9ucywgJ2ZpdCcpO1xuXHRwcml2YXRlIG9ic2VydmUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ29ic2VydmUnKTtcblxuXHRwcml2YXRlIG9yaWdpbiA9IHtcblx0XHRjYW1Qb3M6IG5ldyBWZWN0b3IzKCksXG5cdFx0Y2FtUm90OiBuZXcgUXVhdGVybmlvbigpLFxuXHRcdGNhbVpvb206IDEsXG5cdH07XG5cdHByaXZhdGUgZ29hbCA9IHtcblx0XHRjYW1Qb3M6IHVuZGVmaW5lZCBhcyBWZWN0b3IzIHwgdW5kZWZpbmVkLFxuXHRcdGNhbVJvdDogdW5kZWZpbmVkIGFzIFF1YXRlcm5pb24gfCB1bmRlZmluZWQsXG5cdFx0Y2FtWm9vbTogdW5kZWZpbmVkIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcblx0XHRjYW1VcDogdW5kZWZpbmVkIGFzIFZlY3RvcjMgfCB1bmRlZmluZWQsXG5cdFx0dGFyZ2V0OiB1bmRlZmluZWQgYXMgVmVjdG9yMyB8IHVuZGVmaW5lZCxcblx0fTtcblx0cHJpdmF0ZSBhbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLk5PTkU7XG5cblx0Ly8gcmVwcmVzZW50IGFuaW1hdGlvbiBzdGF0ZSBmcm9tIDAgdG8gMVxuXHRwcml2YXRlIHQgPSAwO1xuXHRwcml2YXRlIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAgfSk7XG5cblx0XHRjb25zdCBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW2NvbnRyb2xzLCBjYW1lcmFdID0gW3RoaXMuY29udHJvbHMoKSwgdW50cmFja2VkKHRoaXMuY2FtZXJhKV07XG5cdFx0XHRcdGlmICghY29udHJvbHMpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xzICYmIHRoaXMuZ29hbC50YXJnZXQgJiYgdGhpcy5hbmltYXRpb25TdGF0ZSAhPT0gQW5pbWF0aW9uU3RhdGUuTk9ORSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZnJvbnQgPSBuZXcgVmVjdG9yMygpLnNldEZyb21NYXRyaXhDb2x1bW4oY2FtZXJhLm1hdHJpeCwgMik7XG5cdFx0XHRcdFx0XHRjb25zdCBkMCA9IHRoaXMub3JpZ2luLmNhbVBvcy5kaXN0YW5jZVRvKGNvbnRyb2xzLnRhcmdldCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkMSA9ICh0aGlzLmdvYWwuY2FtUG9zIHx8IHRoaXMub3JpZ2luLmNhbVBvcykuZGlzdGFuY2VUbyh0aGlzLmdvYWwudGFyZ2V0KTtcblx0XHRcdFx0XHRcdGNvbnN0IGQgPSAoMSAtIHRoaXMudCkgKiBkMCArIHRoaXMudCAqIGQxO1xuXG5cdFx0XHRcdFx0XHRjb250cm9scy50YXJnZXQuY29weShjYW1lcmEucG9zaXRpb24pLmFkZFNjYWxlZFZlY3Rvcihmcm9udCwgLWQpO1xuXHRcdFx0XHRcdFx0Y29udHJvbHMudXBkYXRlKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLk5PTkU7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignc3RhcnQnLCBjYWxsYmFjayk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiBjb250cm9scy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGFydCcsIGNhbGxiYWNrKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgY291bnQgPSAwO1xuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IFtjbGlwLCBmaXQsIG9ic2VydmVdID0gW1xuXHRcdFx0XHRcdHRoaXMuY2xpcE9wdGlvbigpLFxuXHRcdFx0XHRcdHRoaXMuZml0T3B0aW9uKCksXG5cdFx0XHRcdFx0dGhpcy5vYnNlcnZlKCksXG5cdFx0XHRcdFx0dGhpcy5zaXplKCksXG5cdFx0XHRcdFx0dGhpcy5jYW1lcmEoKSxcblx0XHRcdFx0XHR0aGlzLmNvbnRyb2xzKCksXG5cdFx0XHRcdF07XG5cdFx0XHRcdGlmIChvYnNlcnZlIHx8IGNvdW50KysgPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHRcdFx0XHRpZiAoZml0KSB0aGlzLnJlc2V0KCkuZml0KCk7XG5cdFx0XHRcdFx0aWYgKGNsaXApIHRoaXMuY2xpcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBkZWx0YSB9KSA9PiB7XG5cdFx0XHQvLyBUaGlzIFthZGRpdGlvbmFsIGFuaW1hdGlvbiBzdGVwIFNUQVJUXSBpcyBuZWVkZWQgdG8gZ3VhcmFudGVlIHRoYXQgZGVsdGEgdXNlZCBpbiBhbmltYXRpb24gaXNuJ3QgYWJzdXJkbHkgaGlnaCAoMi0zIHNlY29uZHMpIHdoaWNoIGlzIGFjdHVhbGx5IHBvc3NpYmxlIGlmIHJlbmRlcmluZyBoYXBwZW5zIG9uIGRlbWFuZC4uLlxuXHRcdFx0aWYgKHRoaXMuYW5pbWF0aW9uU3RhdGUgPT09IEFuaW1hdGlvblN0YXRlLlNUQVJUKSB7XG5cdFx0XHRcdHRoaXMuYW5pbWF0aW9uU3RhdGUgPSBBbmltYXRpb25TdGF0ZS5BQ1RJVkU7XG5cdFx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvblN0YXRlID09PSBBbmltYXRpb25TdGF0ZS5BQ1RJVkUpIHtcblx0XHRcdFx0Y29uc3QgW3sgbWF4RHVyYXRpb24sIGludGVycG9sYXRlRnVuYyB9LCBjYW1lcmEsIGNvbnRyb2xzLCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0XHR0aGlzLmNhbWVyYSgpLFxuXHRcdFx0XHRcdHRoaXMuY29udHJvbHMoKSxcblx0XHRcdFx0XHR0aGlzLmludmFsaWRhdGUoKSxcblx0XHRcdFx0XTtcblx0XHRcdFx0dGhpcy50ICs9IGRlbHRhIC8gbWF4RHVyYXRpb247XG5cblx0XHRcdFx0aWYgKHRoaXMudCA+PSAxKSB7XG5cdFx0XHRcdFx0dGhpcy5nb2FsLmNhbVBvcyAmJiBjYW1lcmEucG9zaXRpb24uY29weSh0aGlzLmdvYWwuY2FtUG9zKTtcblx0XHRcdFx0XHR0aGlzLmdvYWwuY2FtUm90ICYmIGNhbWVyYS5xdWF0ZXJuaW9uLmNvcHkodGhpcy5nb2FsLmNhbVJvdCk7XG5cdFx0XHRcdFx0dGhpcy5nb2FsLmNhbVVwICYmIGNhbWVyYS51cC5jb3B5KHRoaXMuZ29hbC5jYW1VcCk7XG5cdFx0XHRcdFx0dGhpcy5nb2FsLmNhbVpvb20gJiYgaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkgJiYgKGNhbWVyYS56b29tID0gdGhpcy5nb2FsLmNhbVpvb20pO1xuXG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdFx0XHRcdGlmIChjb250cm9scyAmJiB0aGlzLmdvYWwudGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRjb250cm9scy50YXJnZXQuY29weSh0aGlzLmdvYWwudGFyZ2V0KTtcblx0XHRcdFx0XHRcdGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuYW5pbWF0aW9uU3RhdGUgPSBBbmltYXRpb25TdGF0ZS5OT05FO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGsgPSBpbnRlcnBvbGF0ZUZ1bmModGhpcy50KTtcblxuXHRcdFx0XHRcdHRoaXMuZ29hbC5jYW1Qb3MgJiYgY2FtZXJhLnBvc2l0aW9uLmxlcnBWZWN0b3JzKHRoaXMub3JpZ2luLmNhbVBvcywgdGhpcy5nb2FsLmNhbVBvcywgayk7XG5cdFx0XHRcdFx0dGhpcy5nb2FsLmNhbVJvdCAmJiBjYW1lcmEucXVhdGVybmlvbi5zbGVycFF1YXRlcm5pb25zKHRoaXMub3JpZ2luLmNhbVJvdCwgdGhpcy5nb2FsLmNhbVJvdCwgayk7XG5cdFx0XHRcdFx0dGhpcy5nb2FsLmNhbVVwICYmIGNhbWVyYS51cC5zZXQoMCwgMSwgMCkuYXBwbHlRdWF0ZXJuaW9uKGNhbWVyYS5xdWF0ZXJuaW9uKTtcblx0XHRcdFx0XHR0aGlzLmdvYWwuY2FtWm9vbSAmJlxuXHRcdFx0XHRcdFx0aXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkgJiZcblx0XHRcdFx0XHRcdChjYW1lcmEuem9vbSA9ICgxIC0gaykgKiB0aGlzLm9yaWdpbi5jYW1ab29tICsgayAqIHRoaXMuZ29hbC5jYW1ab29tKTtcblxuXHRcdFx0XHRcdGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRTaXplKCkge1xuXHRcdGNvbnN0IFtjYW1lcmEsIHsgbWFyZ2luIH1dID0gW3VudHJhY2tlZCh0aGlzLmNhbWVyYSksIHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpXTtcblxuXHRcdGNvbnN0IGJveFNpemUgPSB0aGlzLmJveC5nZXRTaXplKG5ldyBWZWN0b3IzKCkpO1xuXHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuYm94LmdldENlbnRlcihuZXcgVmVjdG9yMygpKTtcblx0XHRjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoYm94U2l6ZS54LCBib3hTaXplLnksIGJveFNpemUueik7XG5cdFx0Y29uc3QgZml0SGVpZ2h0RGlzdGFuY2UgPSBpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKVxuXHRcdFx0PyBtYXhTaXplICogNFxuXHRcdFx0OiBtYXhTaXplIC8gKDIgKiBNYXRoLmF0YW4oKE1hdGguUEkgKiBjYW1lcmEuZm92KSAvIDM2MCkpO1xuXHRcdGNvbnN0IGZpdFdpZHRoRGlzdGFuY2UgPSBpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSA/IG1heFNpemUgKiA0IDogZml0SGVpZ2h0RGlzdGFuY2UgLyBjYW1lcmEuYXNwZWN0O1xuXHRcdGNvbnN0IGRpc3RhbmNlID0gbWFyZ2luICogTWF0aC5tYXgoZml0SGVpZ2h0RGlzdGFuY2UsIGZpdFdpZHRoRGlzdGFuY2UpO1xuXG5cdFx0cmV0dXJuIHsgYm94OiB0aGlzLmJveCwgc2l6ZTogYm94U2l6ZSwgY2VudGVyLCBkaXN0YW5jZSB9O1xuXHR9XG5cblx0cmVmcmVzaChvYmplY3Q/OiBPYmplY3QzRCB8IEJveDMpIHtcblx0XHRjb25zdCBbZ3JvdXAsIGNhbWVyYV0gPSBbdW50cmFja2VkKHRoaXMuZ3JvdXBSZWYpLm5hdGl2ZUVsZW1lbnQsIHVudHJhY2tlZCh0aGlzLmNhbWVyYSldO1xuXG5cdFx0aWYgKGlzQm94MyhvYmplY3QpKSB0aGlzLmJveC5jb3B5KG9iamVjdCk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCB0YXJnZXQgPSBvYmplY3QgfHwgZ3JvdXA7XG5cdFx0XHRpZiAoIXRhcmdldCkgcmV0dXJuIHRoaXM7XG5cdFx0XHR0YXJnZXQudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgdHJ1ZSk7XG5cdFx0XHR0aGlzLmJveC5zZXRGcm9tT2JqZWN0KHRhcmdldCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmJveC5pc0VtcHR5KCkpIHtcblx0XHRcdGNvbnN0IG1heCA9IGNhbWVyYS5wb3NpdGlvbi5sZW5ndGgoKSB8fCAxMDtcblx0XHRcdHRoaXMuYm94LnNldEZyb21DZW50ZXJBbmRTaXplKG5ldyBWZWN0b3IzKCksIG5ldyBWZWN0b3IzKG1heCwgbWF4LCBtYXgpKTtcblx0XHR9XG5cblx0XHR0aGlzLm9yaWdpbi5jYW1Qb3MuY29weShjYW1lcmEucG9zaXRpb24pO1xuXHRcdHRoaXMub3JpZ2luLmNhbVJvdC5jb3B5KGNhbWVyYS5xdWF0ZXJuaW9uKTtcblx0XHRpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJiAodGhpcy5vcmlnaW4uY2FtWm9vbSA9IGNhbWVyYS56b29tKTtcblxuXHRcdHRoaXMuZ29hbC5jYW1Qb3MgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5nb2FsLmNhbVJvdCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLmdvYWwuY2FtWm9vbSA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLmdvYWwuY2FtVXAgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5nb2FsLnRhcmdldCA9IHVuZGVmaW5lZDtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cmVzZXQoKSB7XG5cdFx0Y29uc3QgW2NhbWVyYV0gPSBbdW50cmFja2VkKHRoaXMuY2FtZXJhKV07XG5cdFx0Y29uc3QgeyBjZW50ZXIsIGRpc3RhbmNlIH0gPSB0aGlzLmdldFNpemUoKTtcblxuXHRcdGNvbnN0IGRpcmVjdGlvbiA9IGNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1YihjZW50ZXIpLm5vcm1hbGl6ZSgpO1xuXHRcdHRoaXMuZ29hbC5jYW1Qb3MgPSBjZW50ZXIuY2xvbmUoKS5hZGRTY2FsZWRWZWN0b3IoZGlyZWN0aW9uLCBkaXN0YW5jZSk7XG5cdFx0dGhpcy5nb2FsLnRhcmdldCA9IGNlbnRlci5jbG9uZSgpO1xuXHRcdGNvbnN0IG1DYW1Sb3QgPSBuZXcgTWF0cml4NCgpLmxvb2tBdCh0aGlzLmdvYWwuY2FtUG9zLCB0aGlzLmdvYWwudGFyZ2V0LCBjYW1lcmEudXApO1xuXHRcdHRoaXMuZ29hbC5jYW1Sb3QgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Sb3RhdGlvbk1hdHJpeChtQ2FtUm90KTtcblxuXHRcdHRoaXMuYW5pbWF0aW9uU3RhdGUgPSBBbmltYXRpb25TdGF0ZS5TVEFSVDtcblx0XHR0aGlzLnQgPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRtb3ZlVG8ocG9zaXRpb246IFZlY3RvcjMgfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcblx0XHR0aGlzLmdvYWwuY2FtUG9zID0gQXJyYXkuaXNBcnJheShwb3NpdGlvbikgPyBuZXcgVmVjdG9yMyguLi5wb3NpdGlvbikgOiBwb3NpdGlvbi5jbG9uZSgpO1xuXG5cdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLlNUQVJUO1xuXHRcdHRoaXMudCA9IDA7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGxvb2tBdCh7IHRhcmdldCwgdXAgfTogeyB0YXJnZXQ6IFZlY3RvcjMgfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IHVwPzogVmVjdG9yMyB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9KSB7XG5cdFx0Y29uc3QgW2NhbWVyYV0gPSBbdW50cmFja2VkKHRoaXMuY2FtZXJhKV07XG5cblx0XHR0aGlzLmdvYWwudGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gbmV3IFZlY3RvcjMoLi4udGFyZ2V0KSA6IHRhcmdldC5jbG9uZSgpO1xuXHRcdGlmICh1cCkge1xuXHRcdFx0dGhpcy5nb2FsLmNhbVVwID0gQXJyYXkuaXNBcnJheSh1cCkgPyBuZXcgVmVjdG9yMyguLi51cCkgOiB1cC5jbG9uZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmdvYWwuY2FtVXAgPSBjYW1lcmEudXAuY2xvbmUoKTtcblx0XHR9XG5cdFx0Y29uc3QgbUNhbVJvdCA9IG5ldyBNYXRyaXg0KCkubG9va0F0KHRoaXMuZ29hbC5jYW1Qb3MgfHwgY2FtZXJhLnBvc2l0aW9uLCB0aGlzLmdvYWwudGFyZ2V0LCB0aGlzLmdvYWwuY2FtVXApO1xuXHRcdHRoaXMuZ29hbC5jYW1Sb3QgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Sb3RhdGlvbk1hdHJpeChtQ2FtUm90KTtcblxuXHRcdHRoaXMuYW5pbWF0aW9uU3RhdGUgPSBBbmltYXRpb25TdGF0ZS5TVEFSVDtcblx0XHR0aGlzLnQgPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRmaXQoKSB7XG5cdFx0Y29uc3QgW2NhbWVyYSwgY29udHJvbHMsIHsgbWFyZ2luIH1dID0gW3VudHJhY2tlZCh0aGlzLmNhbWVyYSksIHVudHJhY2tlZCh0aGlzLmNvbnRyb2xzKSwgdW50cmFja2VkKHRoaXMub3B0aW9ucyldO1xuXG5cdFx0aWYgKCFpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSkge1xuXHRcdFx0Ly8gRm9yIG5vbi1vcnRob2dyYXBoaWMgY2FtZXJhcywgZml0IHNob3VsZCBiZWhhdmUgZXhhY3RseSBsaWtlIHJlc2V0XG5cdFx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXHRcdH1cblxuXHRcdC8vIEZvciBvcnRob2dyYXBoaWMgY2FtZXJhcywgZml0IHNob3VsZCBvbmx5IG1vZGlmeSB0aGUgem9vbSB2YWx1ZVxuXHRcdGxldCBtYXhIZWlnaHQgPSAwO1xuXHRcdGxldCBtYXhXaWR0aCA9IDA7XG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXG5cdFx0XHRuZXcgVmVjdG9yMyh0aGlzLmJveC5taW4ueCwgdGhpcy5ib3gubWluLnksIHRoaXMuYm94Lm1pbi56KSxcblx0XHRcdG5ldyBWZWN0b3IzKHRoaXMuYm94Lm1pbi54LCB0aGlzLmJveC5tYXgueSwgdGhpcy5ib3gubWluLnopLFxuXHRcdFx0bmV3IFZlY3RvcjModGhpcy5ib3gubWluLngsIHRoaXMuYm94Lm1pbi55LCB0aGlzLmJveC5tYXgueiksXG5cdFx0XHRuZXcgVmVjdG9yMyh0aGlzLmJveC5taW4ueCwgdGhpcy5ib3gubWF4LnksIHRoaXMuYm94Lm1heC56KSxcblx0XHRcdG5ldyBWZWN0b3IzKHRoaXMuYm94Lm1heC54LCB0aGlzLmJveC5tYXgueSwgdGhpcy5ib3gubWF4LnopLFxuXHRcdFx0bmV3IFZlY3RvcjModGhpcy5ib3gubWF4LngsIHRoaXMuYm94Lm1heC55LCB0aGlzLmJveC5taW4ueiksXG5cdFx0XHRuZXcgVmVjdG9yMyh0aGlzLmJveC5tYXgueCwgdGhpcy5ib3gubWluLnksIHRoaXMuYm94Lm1heC56KSxcblx0XHRcdG5ldyBWZWN0b3IzKHRoaXMuYm94Lm1heC54LCB0aGlzLmJveC5taW4ueSwgdGhpcy5ib3gubWluLnopLFxuXHRcdF07XG5cblx0XHQvLyBUcmFuc2Zvcm0gdGhlIGNlbnRlciBhbmQgZWFjaCBjb3JuZXIgdG8gY2FtZXJhIHNwYWNlXG5cdFx0Y29uc3QgcG9zID0gdGhpcy5nb2FsLmNhbVBvcyB8fCBjYW1lcmEucG9zaXRpb247XG5cdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy5nb2FsLnRhcmdldCB8fCBjb250cm9scy50YXJnZXQ7XG5cdFx0Y29uc3QgdXAgPSB0aGlzLmdvYWwuY2FtVXAgfHwgY2FtZXJhLnVwO1xuXHRcdGNvbnN0IG1DYW1XSW52ID0gdGFyZ2V0XG5cdFx0XHQ/IG5ldyBNYXRyaXg0KCkubG9va0F0KHBvcywgdGFyZ2V0LCB1cCkuc2V0UG9zaXRpb24ocG9zKS5pbnZlcnQoKVxuXHRcdFx0OiBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xuXHRcdGZvciAoY29uc3QgdiBvZiB2ZXJ0aWNlcykge1xuXHRcdFx0di5hcHBseU1hdHJpeDQobUNhbVdJbnYpO1xuXHRcdFx0bWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBNYXRoLmFicyh2LnkpKTtcblx0XHRcdG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIE1hdGguYWJzKHYueCkpO1xuXHRcdH1cblx0XHRtYXhIZWlnaHQgKj0gMjtcblx0XHRtYXhXaWR0aCAqPSAyO1xuXHRcdGNvbnN0IHpvb21Gb3JIZWlnaHQgPSAoY2FtZXJhLnRvcCAtIGNhbWVyYS5ib3R0b20pIC8gbWF4SGVpZ2h0O1xuXHRcdGNvbnN0IHpvb21Gb3JXaWR0aCA9IChjYW1lcmEucmlnaHQgLSBjYW1lcmEubGVmdCkgLyBtYXhXaWR0aDtcblxuXHRcdHRoaXMuZ29hbC5jYW1ab29tID0gTWF0aC5taW4oem9vbUZvckhlaWdodCwgem9vbUZvcldpZHRoKSAvIG1hcmdpbjtcblxuXHRcdHRoaXMuYW5pbWF0aW9uU3RhdGUgPSBBbmltYXRpb25TdGF0ZS5TVEFSVDtcblx0XHR0aGlzLnQgPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRjbGlwKCkge1xuXHRcdGNvbnN0IFtjYW1lcmEsIGNvbnRyb2xzLCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdHVudHJhY2tlZCh0aGlzLmNhbWVyYSksXG5cdFx0XHR1bnRyYWNrZWQodGhpcy5jb250cm9scyksXG5cdFx0XHR1bnRyYWNrZWQodGhpcy5pbnZhbGlkYXRlKSxcblx0XHRdO1xuXHRcdGNvbnN0IHsgZGlzdGFuY2UgfSA9IHRoaXMuZ2V0U2l6ZSgpO1xuXG5cdFx0Y2FtZXJhLm5lYXIgPSBkaXN0YW5jZSAvIDEwMDtcblx0XHRjYW1lcmEuZmFyID0gZGlzdGFuY2UgKiAxMDA7XG5cdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdGlmIChjb250cm9scykge1xuXHRcdFx0Y29udHJvbHMubWF4RGlzdGFuY2UgPSBkaXN0YW5jZSAqIDEwO1xuXHRcdFx0Y29udHJvbHMudXBkYXRlKCk7XG5cdFx0fVxuXG5cdFx0aW52YWxpZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Directive, afterNextRender, input, untracked } from '@angular/core';
|
|
2
|
+
import { injectBeforeRender, injectStore } from 'angular-three';
|
|
3
|
+
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
4
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
5
|
+
import { SimplexNoise } from 'three-stdlib';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
const defaultOptions = {
|
|
8
|
+
intensity: 1,
|
|
9
|
+
decayRate: 0.65,
|
|
10
|
+
maxYaw: 0.1,
|
|
11
|
+
maxPitch: 0.1,
|
|
12
|
+
maxRoll: 0.1,
|
|
13
|
+
yawFrequency: 0.1,
|
|
14
|
+
pitchFrequency: 0.1,
|
|
15
|
+
rollFrequency: 0.1,
|
|
16
|
+
};
|
|
17
|
+
export class NgtsCameraShake {
|
|
18
|
+
get intensity() {
|
|
19
|
+
return this.intensityOption;
|
|
20
|
+
}
|
|
21
|
+
set intensity(val) {
|
|
22
|
+
this.intensityOption = Math.min(1, Math.max(0, val));
|
|
23
|
+
}
|
|
24
|
+
constructor() {
|
|
25
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
26
|
+
this.autoEffect = injectAutoEffect();
|
|
27
|
+
this.store = injectStore();
|
|
28
|
+
this.camera = this.store.select('camera');
|
|
29
|
+
this.defaultControls = this.store.select('controls');
|
|
30
|
+
this.initialRotation = untracked(this.camera).rotation.clone();
|
|
31
|
+
this.intensityOption = untracked(this.options).intensity;
|
|
32
|
+
this.yawNoise = new SimplexNoise();
|
|
33
|
+
this.pitchNoise = new SimplexNoise();
|
|
34
|
+
this.rollNoise = new SimplexNoise();
|
|
35
|
+
afterNextRender(() => {
|
|
36
|
+
this.autoEffect(() => {
|
|
37
|
+
const defaultControls = this.defaultControls();
|
|
38
|
+
if (!defaultControls)
|
|
39
|
+
return;
|
|
40
|
+
const camera = this.camera();
|
|
41
|
+
const callback = () => void (this.initialRotation = camera.rotation.clone());
|
|
42
|
+
defaultControls.addEventListener('change', callback);
|
|
43
|
+
callback();
|
|
44
|
+
return () => void defaultControls.removeEventListener('change', callback);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
injectBeforeRender(({ delta, clock }) => {
|
|
48
|
+
const [{ maxYaw, yawFrequency, maxPitch, pitchFrequency, maxRoll, rollFrequency, decay, decayRate }, camera] = [
|
|
49
|
+
this.options(),
|
|
50
|
+
this.camera(),
|
|
51
|
+
];
|
|
52
|
+
const shake = Math.pow(this.intensity, 2);
|
|
53
|
+
const yaw = maxYaw * shake * this.yawNoise.noise(clock.elapsedTime * yawFrequency, 1);
|
|
54
|
+
const pitch = maxPitch * shake * this.pitchNoise.noise(clock.elapsedTime * pitchFrequency, 1);
|
|
55
|
+
const roll = maxRoll * shake * this.rollNoise.noise(clock.elapsedTime * rollFrequency, 1);
|
|
56
|
+
camera.rotation.set(this.initialRotation.x + pitch, this.initialRotation.y + yaw, this.initialRotation.z + roll);
|
|
57
|
+
if (decay && this.intensity > 0) {
|
|
58
|
+
this.intensity -= decayRate * delta;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsCameraShake, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
63
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgtsCameraShake, isStandalone: true, selector: "ngts-camera-shake", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
64
|
+
}
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsCameraShake, decorators: [{
|
|
66
|
+
type: Directive,
|
|
67
|
+
args: [{ selector: 'ngts-camera-shake', standalone: true }]
|
|
68
|
+
}], ctorParameters: () => [] });
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLXNoYWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9jYW1lcmEtc2hha2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQXFCNUMsTUFBTSxjQUFjLEdBQTJCO0lBQzlDLFNBQVMsRUFBRSxDQUFDO0lBQ1osU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsR0FBRztJQUNYLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixZQUFZLEVBQUUsR0FBRztJQUNqQixjQUFjLEVBQUUsR0FBRztJQUNuQixhQUFhLEVBQUUsR0FBRztDQUNsQixDQUFDO0FBR0YsTUFBTSxPQUFPLGVBQWU7SUFXM0IsSUFBSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxHQUFXO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBTUQ7UUF0QkEsWUFBTyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFF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QUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNyQyxDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQXJEVyxlQUFlO2tHQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBRDNCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgU2lnbmFsLCBhZnRlck5leHRSZW5kZXIsIGlucHV0LCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBTaW1wbGV4Tm9pc2UgfSBmcm9tICd0aHJlZS1zdGRsaWInO1xuXG5pbnRlcmZhY2UgQ29udHJvbHNQcm90byB7XG5cdHVwZGF0ZSgpOiB2b2lkO1xuXHR0YXJnZXQ6IFZlY3RvcjM7XG5cdGFkZEV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0NhbWVyYVNoYWtlT3B0aW9ucyB7XG5cdGludGVuc2l0eTogbnVtYmVyO1xuXHRkZWNheT86IGJvb2xlYW47XG5cdGRlY2F5UmF0ZTogbnVtYmVyO1xuXHRtYXhZYXc6IG51bWJlcjtcblx0bWF4UGl0Y2g6IG51bWJlcjtcblx0bWF4Um9sbDogbnVtYmVyO1xuXHR5YXdGcmVxdWVuY3k6IG51bWJlcjtcblx0cGl0Y2hGcmVxdWVuY3k6IG51bWJlcjtcblx0cm9sbEZyZXF1ZW5jeTogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0c0NhbWVyYVNoYWtlT3B0aW9ucyA9IHtcblx0aW50ZW5zaXR5OiAxLFxuXHRkZWNheVJhdGU6IDAuNjUsXG5cdG1heFlhdzogMC4xLFxuXHRtYXhQaXRjaDogMC4xLFxuXHRtYXhSb2xsOiAwLjEsXG5cdHlhd0ZyZXF1ZW5jeTogMC4xLFxuXHRwaXRjaEZyZXF1ZW5jeTogMC4xLFxuXHRyb2xsRnJlcXVlbmN5OiAwLjEsXG59O1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICduZ3RzLWNhbWVyYS1zaGFrZScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RzQ2FtZXJhU2hha2Uge1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0cHJpdmF0ZSBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgZGVmYXVsdENvbnRyb2xzID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2NvbnRyb2xzJykgYXMgdW5rbm93biBhcyBTaWduYWw8Q29udHJvbHNQcm90bz47XG5cblx0cHJpdmF0ZSBpbml0aWFsUm90YXRpb24gPSB1bnRyYWNrZWQodGhpcy5jYW1lcmEpLnJvdGF0aW9uLmNsb25lKCk7XG5cdHByaXZhdGUgaW50ZW5zaXR5T3B0aW9uID0gdW50cmFja2VkKHRoaXMub3B0aW9ucykuaW50ZW5zaXR5O1xuXG5cdGdldCBpbnRlbnNpdHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5T3B0aW9uO1xuXHR9XG5cblx0c2V0IGludGVuc2l0eSh2YWw6IG51bWJlcikge1xuXHRcdHRoaXMuaW50ZW5zaXR5T3B0aW9uID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgdmFsKSk7XG5cdH1cblxuXHRwcml2YXRlIHlhd05vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSgpO1xuXHRwcml2YXRlIHBpdGNoTm9pc2UgPSBuZXcgU2ltcGxleE5vaXNlKCk7XG5cdHByaXZhdGUgcm9sbE5vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSgpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLmF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBkZWZhdWx0Q29udHJvbHMgPSB0aGlzLmRlZmF1bHRDb250cm9scygpO1xuXHRcdFx0XHRpZiAoIWRlZmF1bHRDb250cm9scykgcmV0dXJuO1xuXHRcdFx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYSgpO1xuXG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gKCkgPT4gdm9pZCAodGhpcy5pbml0aWFsUm90YXRpb24gPSBjYW1lcmEucm90YXRpb24uY2xvbmUoKSk7XG5cdFx0XHRcdGRlZmF1bHRDb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjYWxsYmFjayk7XG5cdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiB2b2lkIGRlZmF1bHRDb250cm9scy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjYWxsYmFjayk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBkZWx0YSwgY2xvY2sgfSkgPT4ge1xuXHRcdFx0Y29uc3QgW3sgbWF4WWF3LCB5YXdGcmVxdWVuY3ksIG1heFBpdGNoLCBwaXRjaEZyZXF1ZW5jeSwgbWF4Um9sbCwgcm9sbEZyZXF1ZW5jeSwgZGVjYXksIGRlY2F5UmF0ZSB9LCBjYW1lcmFdID0gW1xuXHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0dGhpcy5jYW1lcmEoKSxcblx0XHRcdF07XG5cdFx0XHRjb25zdCBzaGFrZSA9IE1hdGgucG93KHRoaXMuaW50ZW5zaXR5LCAyKTtcblx0XHRcdGNvbnN0IHlhdyA9IG1heFlhdyAqIHNoYWtlICogdGhpcy55YXdOb2lzZS5ub2lzZShjbG9jay5lbGFwc2VkVGltZSAqIHlhd0ZyZXF1ZW5jeSwgMSk7XG5cdFx0XHRjb25zdCBwaXRjaCA9IG1heFBpdGNoICogc2hha2UgKiB0aGlzLnBpdGNoTm9pc2Uubm9pc2UoY2xvY2suZWxhcHNlZFRpbWUgKiBwaXRjaEZyZXF1ZW5jeSwgMSk7XG5cdFx0XHRjb25zdCByb2xsID0gbWF4Um9sbCAqIHNoYWtlICogdGhpcy5yb2xsTm9pc2Uubm9pc2UoY2xvY2suZWxhcHNlZFRpbWUgKiByb2xsRnJlcXVlbmN5LCAxKTtcblxuXHRcdFx0Y2FtZXJhLnJvdGF0aW9uLnNldCh0aGlzLmluaXRpYWxSb3RhdGlvbi54ICsgcGl0Y2gsIHRoaXMuaW5pdGlhbFJvdGF0aW9uLnkgKyB5YXcsIHRoaXMuaW5pdGlhbFJvdGF0aW9uLnogKyByb2xsKTtcblxuXHRcdFx0aWYgKGRlY2F5ICYmIHRoaXMuaW50ZW5zaXR5ID4gMCkge1xuXHRcdFx0XHR0aGlzLmludGVuc2l0eSAtPSBkZWNheVJhdGUgKiBkZWx0YTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuIl19
|