angular-three-soba 2.0.0-beta.7 → 2.0.0-beta.8
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/abstractions/billboard/billboard.d.ts +11 -7
- package/abstractions/detailed/detailed.d.ts +26 -0
- package/abstractions/edges/edges.d.ts +23 -11
- package/abstractions/grid/grid.d.ts +41 -50
- package/abstractions/index.d.ts +1 -7
- package/abstractions/text/text.d.ts +10 -4
- package/abstractions/text-3d/text-3d.d.ts +47 -40
- package/cameras/camera/camera-content.d.ts +1 -1
- package/cameras/camera/camera.d.ts +16 -13
- package/cameras/cube-camera/cube-camera.d.ts +50 -23
- package/cameras/index.d.ts +0 -1
- package/cameras/orthographic-camera/orthographic-camera.d.ts +29 -18
- package/cameras/perspective-camera/perspective-camera.d.ts +10 -1
- package/controls/orbit-controls/orbit-controls.d.ts +30 -13
- package/esm2022/abstractions/billboard/billboard.mjs +36 -33
- package/esm2022/abstractions/detailed/detailed.mjs +64 -0
- package/esm2022/abstractions/edges/edges.mjs +58 -63
- package/esm2022/abstractions/grid/grid.mjs +140 -110
- package/esm2022/abstractions/index.mjs +2 -8
- package/esm2022/abstractions/text/text.mjs +123 -122
- package/esm2022/abstractions/text-3d/text-3d.mjs +119 -121
- package/esm2022/cameras/camera/camera-content.mjs +5 -6
- package/esm2022/cameras/camera/camera.mjs +48 -42
- package/esm2022/cameras/cube-camera/cube-camera.mjs +129 -99
- package/esm2022/cameras/index.mjs +1 -2
- package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +78 -75
- package/esm2022/cameras/perspective-camera/perspective-camera.mjs +25 -26
- package/esm2022/controls/orbit-controls/orbit-controls.mjs +94 -90
- package/esm2022/loaders/gltf-loader/gltf-loader.mjs +3 -6
- package/esm2022/loaders/loader/loader.mjs +92 -87
- package/esm2022/loaders/progress/progress.mjs +1 -1
- package/esm2022/loaders/texture-loader/texture-loader.mjs +4 -4
- package/esm2022/materials/index.mjs +2 -1
- package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +60 -51
- package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +239 -255
- package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +99 -97
- package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +167 -146
- package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +44 -42
- package/esm2022/materials/point-material/point-material.mjs +46 -0
- package/esm2022/misc/animations/animations.mjs +20 -16
- package/esm2022/misc/bake-shadows/bake-shadows.mjs +13 -13
- package/esm2022/misc/caustics/caustics.mjs +387 -0
- package/esm2022/misc/decal/decal.mjs +187 -0
- package/esm2022/misc/depth-buffer/depth-buffer.mjs +33 -35
- package/esm2022/misc/example/example.mjs +160 -0
- package/esm2022/misc/fbo/fbo.mjs +35 -35
- package/esm2022/misc/html/html-wrapper.mjs +478 -0
- package/esm2022/misc/html/html.mjs +304 -0
- package/esm2022/misc/index.mjs +10 -1
- package/esm2022/misc/sampler/sampler.mjs +142 -0
- package/esm2022/misc/shadow/shadow.mjs +111 -0
- package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
- package/esm2022/misc/trail/trail.mjs +209 -0
- package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
- package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
- package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
- package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
- package/esm2022/modifiers/index.mjs +2 -0
- package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
- package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
- package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
- package/esm2022/performances/index.mjs +6 -0
- package/esm2022/performances/points/points-input.mjs +64 -0
- package/esm2022/performances/points/points.mjs +329 -0
- package/esm2022/performances/points/position-point.mjs +54 -0
- package/esm2022/performances/segments/segment-object.mjs +9 -0
- package/esm2022/performances/segments/segments.mjs +182 -0
- package/esm2022/shaders/blur-pass/blur-pass.mjs +1 -1
- package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
- package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
- package/esm2022/shaders/convolution-material/convolution-material.mjs +1 -1
- package/esm2022/shaders/discard-material/discard-material.mjs +1 -1
- package/esm2022/shaders/grid-material/grid-material.mjs +29 -14
- package/esm2022/shaders/index.mjs +5 -3
- package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +42 -41
- package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +1 -1
- package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +2 -2
- package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +4 -4
- package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +1 -1
- package/esm2022/shaders/shader-material/shader-material.mjs +1 -1
- package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +17 -25
- package/esm2022/shaders/sparkles-material/sparkles-material.mjs +32 -46
- package/esm2022/shaders/spot-light-material/spot-light-material.mjs +7 -7
- package/esm2022/shaders/star-field-material/star-field-material.mjs +3 -2
- package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
- package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +160 -176
- package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +1 -1
- package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +126 -128
- package/esm2022/staging/backdrop/backdrop.mjs +77 -0
- package/esm2022/staging/bb-anchor/bb-anchor.mjs +70 -0
- package/esm2022/staging/bounds/bounds.mjs +144 -143
- package/esm2022/staging/camera-shake/camera-shake.mjs +86 -80
- package/esm2022/staging/center/center.mjs +106 -91
- package/esm2022/staging/cloud/cloud.mjs +118 -124
- package/esm2022/staging/contact-shadows/contact-shadows.mjs +131 -134
- package/esm2022/staging/environment/assets.mjs +12 -12
- package/esm2022/staging/environment/environment-cube.mjs +28 -30
- package/esm2022/staging/environment/environment-ground.mjs +18 -20
- package/esm2022/staging/environment/environment-input.mjs +97 -84
- package/esm2022/staging/environment/environment-map.mjs +33 -33
- package/esm2022/staging/environment/environment-portal.mjs +75 -97
- package/esm2022/staging/environment/environment.mjs +34 -51
- package/esm2022/staging/environment/utils.mjs +35 -14
- package/esm2022/staging/float/float.mjs +70 -58
- package/esm2022/staging/index.mjs +7 -3
- package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
- package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
- package/esm2022/staging/sky/sky.mjs +85 -80
- package/esm2022/staging/sparkles/sparkles.mjs +108 -105
- package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
- package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
- package/esm2022/staging/spot-light/spot-light-input.mjs +67 -58
- package/esm2022/staging/spot-light/spot-light.mjs +51 -64
- package/esm2022/staging/spot-light/volumetric-mesh.mjs +61 -78
- package/esm2022/staging/stage/stage.mjs +304 -290
- package/esm2022/staging/stars/stars.mjs +101 -102
- package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
- package/esm2022/staging/wireframe/wireframe.mjs +224 -0
- package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
- package/esm2022/utils/content/content.mjs +15 -0
- package/esm2022/utils/index.mjs +2 -0
- package/fesm2022/angular-three-soba-abstractions.mjs +505 -2087
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +302 -259
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +93 -88
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +94 -90
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +655 -590
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +2198 -89
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
- package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
- package/fesm2022/angular-three-soba-performances.mjs +697 -0
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
- package/fesm2022/angular-three-soba-shaders.mjs +501 -264
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +2870 -2555
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-utils.mjs +22 -0
- package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
- package/loaders/gltf-loader/gltf-loader.d.ts +4 -3
- package/loaders/loader/loader.d.ts +19 -17
- package/loaders/progress/progress.d.ts +1 -1
- package/loaders/texture-loader/texture-loader.d.ts +2 -2
- package/materials/index.d.ts +1 -0
- package/materials/mesh-distort-material/mesh-distort-material.d.ts +25 -15
- package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +74 -56
- package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +33 -21
- package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +55 -39
- package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +19 -10
- package/materials/point-material/point-material.d.ts +24 -0
- package/metadata.json +1 -0
- package/misc/animations/animations.d.ts +6 -4
- package/misc/caustics/caustics.d.ts +87 -0
- package/misc/decal/decal.d.ts +49 -0
- package/misc/depth-buffer/depth-buffer.d.ts +2 -2
- package/misc/example/example.d.ts +81 -0
- package/misc/fbo/fbo.d.ts +2 -2
- package/misc/html/html-wrapper.d.ts +559 -0
- package/misc/html/html.d.ts +214 -0
- package/misc/index.d.ts +9 -0
- package/misc/sampler/sampler.d.ts +67 -0
- package/misc/shadow/shadow.d.ts +37 -0
- package/misc/stats-gl/stats-gl.d.ts +24 -0
- package/misc/trail/trail.d.ts +57 -0
- package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
- package/misc/trail-texture/trail-texture.d.ts +50 -0
- package/modifiers/README.md +3 -0
- package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
- package/modifiers/index.d.ts +1 -0
- package/package.json +30 -22
- package/performances/README.md +3 -0
- package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
- package/{performance/adaptive → performances/adaptive-events}/adaptive-events.d.ts +3 -0
- package/performances/index.d.ts +5 -0
- package/performances/points/points-input.d.ts +32 -0
- package/performances/points/points.d.ts +92 -0
- package/{performance/instances/position-mesh.d.ts → performances/points/position-point.d.ts} +4 -3
- package/performances/segments/segment-object.d.ts +7 -0
- package/performances/segments/segments.d.ts +124 -0
- package/shaders/grid-material/grid-material.d.ts +33 -0
- package/shaders/index.d.ts +4 -2
- package/shaders/mesh-distort-material/mesh-distort-material.d.ts +146 -1
- package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
- package/shaders/shader-material/shader-material.d.ts +2 -2
- package/shaders/soft-shadow-material/soft-shadow-material.d.ts +10 -1
- package/shaders/sparkles-material/sparkles-material.d.ts +15 -1
- package/shaders/spot-light-material/spot-light-material.d.ts +11 -2
- package/shaders/star-field-material/star-field-material.d.ts +11 -1
- package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
- package/staging/accumulative-shadows/accumulative-shadows.d.ts +89 -39
- package/staging/accumulative-shadows/randomized-lights.d.ts +40 -27
- package/staging/backdrop/backdrop.d.ts +30 -0
- package/staging/bb-anchor/bb-anchor.d.ts +27 -0
- package/staging/bounds/bounds.d.ts +100 -24
- package/staging/camera-shake/camera-shake.d.ts +30 -19
- package/staging/center/center.d.ts +43 -35
- package/staging/cloud/cloud.d.ts +26 -23
- package/staging/contact-shadows/contact-shadows.d.ts +41 -28
- package/staging/environment/assets.d.ts +9 -9
- package/staging/environment/environment-cube.d.ts +9 -5
- package/staging/environment/environment-ground.d.ts +7 -7
- package/staging/environment/environment-input.d.ts +36 -36
- package/staging/environment/environment-map.d.ts +10 -5
- package/staging/environment/environment-portal.d.ts +10 -5
- package/staging/environment/environment.d.ts +0 -4
- package/staging/environment/utils.d.ts +2 -2
- package/staging/float/float.d.ts +14 -10
- package/staging/index.d.ts +6 -2
- package/staging/matcap-texture/matcap-texture.d.ts +13 -0
- package/staging/normal-texture/normal-texture.d.ts +16 -0
- package/staging/sky/sky.d.ts +28 -21
- package/staging/sparkles/sparkles.d.ts +35 -21
- package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
- package/staging/spot-light/shadow-mesh.d.ts +37 -0
- package/staging/spot-light/spot-light-input.d.ts +25 -25
- package/staging/spot-light/spot-light.d.ts +31 -15
- package/staging/spot-light/volumetric-mesh.d.ts +15 -9
- package/staging/stage/stage.d.ts +88 -63
- package/staging/stars/stars.d.ts +27 -16
- package/staging/wireframe/wireframe-input.d.ts +65 -0
- package/staging/wireframe/wireframe.d.ts +28 -0
- package/utils/README.md +3 -0
- package/utils/content/content.d.ts +8 -0
- package/utils/index.d.ts +1 -0
- package/web-types.json +1 -0
- package/abstractions/catmull-rom-line/catmull-rom-line.d.ts +0 -25
- package/abstractions/cubic-bezier-line/cubic-bezier-line.d.ts +0 -25
- package/abstractions/gizmo-helper/gizmo-helper.d.ts +0 -34
- package/abstractions/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -30
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -32
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -14
- package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -47
- package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -40
- package/abstractions/line/line-input.d.ts +0 -42
- package/abstractions/line/line.d.ts +0 -35
- package/abstractions/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -23
- package/esm2022/abstractions/catmull-rom-line/catmull-rom-line.mjs +0 -131
- package/esm2022/abstractions/cubic-bezier-line/cubic-bezier-line.mjs +0 -113
- package/esm2022/abstractions/gizmo-helper/gizmo-helper.mjs +0 -210
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -95
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -155
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -62
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -80
- package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -206
- package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -273
- package/esm2022/abstractions/line/line-input.mjs +0 -113
- package/esm2022/abstractions/line/line.mjs +0 -165
- package/esm2022/abstractions/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
- package/esm2022/performance/adaptive/adaptive-dpr.mjs +0 -46
- package/esm2022/performance/adaptive/adaptive-events.mjs +0 -31
- package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
- package/esm2022/performance/detailed/detailed.mjs +0 -61
- package/esm2022/performance/index.mjs +0 -7
- package/esm2022/performance/instances/instance.mjs +0 -48
- package/esm2022/performance/instances/instances.mjs +0 -189
- package/esm2022/performance/instances/position-mesh.mjs +0 -52
- package/esm2022/performance/stats/stats.mjs +0 -79
- package/esm2022/shaders/caustics-material/caustics-material.mjs +0 -128
- package/esm2022/shaders/caustics-material/caustics-projection-material.mjs +0 -33
- package/esm2022/staging/caustics/caustisc.mjs +0 -384
- package/esm2022/staging/spot-light/spot-light-shadow-mesh-input.mjs +0 -57
- package/esm2022/staging/spot-light/spot-light-shadow-mesh.mjs +0 -258
- package/fesm2022/angular-three-soba-performance.mjs +0 -487
- package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
- package/performance/README.md +0 -3
- package/performance/adaptive/adaptive-dpr.d.ts +0 -8
- package/performance/detailed/detailed.d.ts +0 -20
- package/performance/index.d.ts +0 -6
- package/performance/instances/instance.d.ts +0 -9
- package/performance/instances/instances.d.ts +0 -35
- package/performance/stats/stats.d.ts +0 -18
- package/plugin/generators.json +0 -19
- package/plugin/libs/plugin/README.md +0 -11
- package/plugin/package.json +0 -9
- package/plugin/src/generators/init/compat.d.ts +0 -2
- package/plugin/src/generators/init/compat.js +0 -6
- package/plugin/src/generators/init/compat.js.map +0 -1
- package/plugin/src/generators/init/init.d.ts +0 -7
- package/plugin/src/generators/init/init.js +0 -28
- package/plugin/src/generators/init/init.js.map +0 -1
- package/plugin/src/generators/init/schema.json +0 -6
- package/plugin/src/index.d.ts +0 -1
- package/plugin/src/index.js +0 -6
- package/plugin/src/index.js.map +0 -1
- package/staging/caustics/caustisc.d.ts +0 -70
- package/staging/spot-light/spot-light-shadow-mesh-input.d.ts +0 -29
- package/staging/spot-light/spot-light-shadow-mesh.d.ts +0 -38
- /package/shaders/{caustics-material → caustics}/caustics-material.d.ts +0 -0
- /package/shaders/{caustics-material → caustics}/caustics-projection-material.d.ts +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { extend, injectBeforeRender, injectNgtRef,
|
|
1
|
+
import { CUSTOM_ELEMENTS_SCHEMA, Component, EventEmitter, Input, Output, computed, effect, forwardRef, untracked, } from '@angular/core';
|
|
2
|
+
import { createInjectionToken, extend, injectBeforeRender, injectNgtRef, injectNgtStore, is, signalStore, } from 'angular-three';
|
|
3
3
|
import * as THREE from 'three';
|
|
4
4
|
import { Group } from 'three';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
-
|
|
6
|
+
extend({ Group });
|
|
7
|
+
const isBox3 = (def) => def && def.isBox3;
|
|
7
8
|
function equals(a, b, eps) {
|
|
8
9
|
return Math.abs(a.x - b.x) < eps && Math.abs(a.y - b.y) < eps && Math.abs(a.z - b.z) < eps;
|
|
9
10
|
}
|
|
@@ -12,70 +13,62 @@ function damp(v, t, lambda, delta) {
|
|
|
12
13
|
v.y = THREE.MathUtils.damp(v.y, t.y, lambda, delta);
|
|
13
14
|
v.z = THREE.MathUtils.damp(v.z, t.z, lambda, delta);
|
|
14
15
|
}
|
|
15
|
-
export const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
export const [injectNgtsBoundsApi, provideNgtsBoundsApi] = createInjectionToken((bounds) => bounds.api, {
|
|
17
|
+
isRoot: false,
|
|
18
|
+
deps: [forwardRef(() => NgtsBounds)],
|
|
19
|
+
});
|
|
20
|
+
export class NgtsBounds {
|
|
21
|
+
set _damping(damping) {
|
|
22
|
+
this.inputs.set({ damping });
|
|
20
23
|
}
|
|
21
|
-
set
|
|
22
|
-
this.set({ fit });
|
|
24
|
+
set _fit(fit) {
|
|
25
|
+
this.inputs.set({ fit });
|
|
23
26
|
}
|
|
24
|
-
set
|
|
25
|
-
this.set({ clip });
|
|
27
|
+
set _clip(clip) {
|
|
28
|
+
this.inputs.set({ clip });
|
|
26
29
|
}
|
|
27
|
-
set
|
|
28
|
-
this.set({ observe });
|
|
30
|
+
set _observe(observe) {
|
|
31
|
+
this.inputs.set({ observe });
|
|
29
32
|
}
|
|
30
|
-
set
|
|
31
|
-
this.set({ margin });
|
|
33
|
+
set _margin(margin) {
|
|
34
|
+
this.inputs.set({ margin });
|
|
32
35
|
}
|
|
33
|
-
set
|
|
34
|
-
this.set({ eps });
|
|
36
|
+
set _eps(eps) {
|
|
37
|
+
this.inputs.set({ eps });
|
|
35
38
|
}
|
|
36
|
-
#store;
|
|
37
|
-
#controls;
|
|
38
|
-
#camera;
|
|
39
|
-
#invalidate;
|
|
40
|
-
#size;
|
|
41
|
-
#current;
|
|
42
|
-
#goal;
|
|
43
|
-
#box;
|
|
44
|
-
#margin;
|
|
45
|
-
#damping;
|
|
46
|
-
#fit;
|
|
47
|
-
#clip;
|
|
48
|
-
#observe;
|
|
49
|
-
#count;
|
|
50
39
|
constructor() {
|
|
51
|
-
|
|
40
|
+
this.inputs = signalStore({
|
|
41
|
+
damping: 6,
|
|
42
|
+
fit: false,
|
|
43
|
+
clip: false,
|
|
44
|
+
observe: false,
|
|
45
|
+
margin: 1.2,
|
|
46
|
+
eps: 0.01,
|
|
47
|
+
});
|
|
52
48
|
this.boundsRef = injectNgtRef();
|
|
53
49
|
this.fitted = new EventEmitter();
|
|
54
|
-
this
|
|
55
|
-
this
|
|
56
|
-
this
|
|
57
|
-
this
|
|
58
|
-
this
|
|
59
|
-
this
|
|
60
|
-
this
|
|
61
|
-
this
|
|
62
|
-
this
|
|
63
|
-
this
|
|
64
|
-
this
|
|
65
|
-
this
|
|
66
|
-
this
|
|
67
|
-
this.#count = 0;
|
|
50
|
+
this.store = injectNgtStore();
|
|
51
|
+
this.controls = this.store.select('controls');
|
|
52
|
+
this.size = this.store.select('size');
|
|
53
|
+
this.camera = this.store.select('camera');
|
|
54
|
+
this.invalidate = this.store.select('invalidate');
|
|
55
|
+
this.fit = this.inputs.select('fit');
|
|
56
|
+
this.clip = this.inputs.select('clip');
|
|
57
|
+
this.observe = this.inputs.select('observe');
|
|
58
|
+
this.margin = this.inputs.select('margin');
|
|
59
|
+
this.damping = this.inputs.select('damping');
|
|
60
|
+
this.current = { animating: false, focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
|
|
61
|
+
this.goal = { focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
|
|
62
|
+
this.box = new THREE.Box3();
|
|
68
63
|
this.api = computed(() => {
|
|
69
|
-
const
|
|
70
|
-
const damping =
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const ref = () => this.boundsRef.untracked;
|
|
78
|
-
const fitted = this.fitted;
|
|
64
|
+
const { box, boundsRef, current, goal, fitted } = this;
|
|
65
|
+
const [camera, margin, controls, invalidate, damping] = [
|
|
66
|
+
this.camera(),
|
|
67
|
+
this.margin(),
|
|
68
|
+
this.controls(),
|
|
69
|
+
this.invalidate(),
|
|
70
|
+
this.damping(),
|
|
71
|
+
];
|
|
79
72
|
function getSize() {
|
|
80
73
|
const size = box.getSize(new THREE.Vector3());
|
|
81
74
|
const center = box.getCenter(new THREE.Vector3());
|
|
@@ -93,11 +86,11 @@ class NgtsBounds extends NgtSignalStore {
|
|
|
93
86
|
if (isBox3(object))
|
|
94
87
|
box.copy(object);
|
|
95
88
|
else {
|
|
96
|
-
const target = object ||
|
|
97
|
-
if (target)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
89
|
+
const target = object || boundsRef.nativeElement;
|
|
90
|
+
if (!target)
|
|
91
|
+
return this;
|
|
92
|
+
target.updateWorldMatrix(true, true);
|
|
93
|
+
box.setFromObject(target);
|
|
101
94
|
}
|
|
102
95
|
if (box.isEmpty()) {
|
|
103
96
|
const max = camera.position.length() || 10;
|
|
@@ -191,32 +184,41 @@ class NgtsBounds extends NgtSignalStore {
|
|
|
191
184
|
controls.update();
|
|
192
185
|
}
|
|
193
186
|
}
|
|
194
|
-
if (fitted.observed)
|
|
187
|
+
if (fitted.observed) {
|
|
195
188
|
fitted.emit(this.getSize());
|
|
189
|
+
}
|
|
196
190
|
invalidate();
|
|
197
191
|
return this;
|
|
198
192
|
},
|
|
199
193
|
};
|
|
200
194
|
});
|
|
201
|
-
this
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
195
|
+
this.preventDragHijacking();
|
|
196
|
+
this.scalePointer();
|
|
197
|
+
this.beforeRender();
|
|
198
|
+
}
|
|
199
|
+
preventDragHijacking() {
|
|
200
|
+
effect((onCleanup) => {
|
|
201
|
+
const controls = this.controls();
|
|
202
|
+
if (controls) {
|
|
203
|
+
const callback = () => (this.current.animating = false);
|
|
204
|
+
controls.addEventListener('start', callback);
|
|
205
|
+
onCleanup(() => controls.removeEventListener('start', callback));
|
|
206
|
+
}
|
|
205
207
|
});
|
|
206
208
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
size: this.#size(),
|
|
210
|
-
fit: this.#fit(),
|
|
211
|
-
clip: this.#clip(),
|
|
212
|
-
observe: this.#observe(),
|
|
213
|
-
camera: this.#camera(),
|
|
214
|
-
controls: this.#controls(),
|
|
215
|
-
}));
|
|
209
|
+
scalePointer() {
|
|
210
|
+
let count = 0;
|
|
216
211
|
effect(() => {
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
212
|
+
const [observe, fit, clip, api] = [
|
|
213
|
+
this.observe(),
|
|
214
|
+
this.fit(),
|
|
215
|
+
this.clip(),
|
|
216
|
+
untracked(this.api),
|
|
217
|
+
this.camera(),
|
|
218
|
+
this.controls(),
|
|
219
|
+
this.size(),
|
|
220
|
+
];
|
|
221
|
+
if (observe || count++ === 0) {
|
|
220
222
|
api.refresh();
|
|
221
223
|
if (fit)
|
|
222
224
|
api.fit();
|
|
@@ -225,83 +227,82 @@ class NgtsBounds extends NgtSignalStore {
|
|
|
225
227
|
}
|
|
226
228
|
});
|
|
227
229
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
camera.
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
effect((onCleanup) => {
|
|
261
|
-
const controls = this.#controls();
|
|
262
|
-
if (controls) {
|
|
263
|
-
const callback = () => (this.#current.animating = false);
|
|
264
|
-
controls.addEventListener('start', callback);
|
|
265
|
-
onCleanup(() => controls.removeEventListener('start', callback));
|
|
230
|
+
beforeRender() {
|
|
231
|
+
injectBeforeRender(({ delta }) => {
|
|
232
|
+
const [{ damping, eps }, camera, controls, invalidate] = [
|
|
233
|
+
this.inputs.get(),
|
|
234
|
+
this.camera(),
|
|
235
|
+
this.controls(),
|
|
236
|
+
this.invalidate(),
|
|
237
|
+
];
|
|
238
|
+
if (this.current.animating) {
|
|
239
|
+
damp(this.current.focus, this.goal.focus, damping, delta);
|
|
240
|
+
damp(this.current.camera, this.goal.camera, damping, delta);
|
|
241
|
+
this.current.zoom = THREE.MathUtils.damp(this.current.zoom, this.goal.zoom, damping, delta);
|
|
242
|
+
camera.position.copy(this.current.camera);
|
|
243
|
+
if (is.orthographicCamera(camera)) {
|
|
244
|
+
camera.zoom = this.current.zoom;
|
|
245
|
+
camera.updateProjectionMatrix();
|
|
246
|
+
}
|
|
247
|
+
if (!controls) {
|
|
248
|
+
camera.lookAt(this.current.focus);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
controls.target.copy(this.current.focus);
|
|
252
|
+
controls.update();
|
|
253
|
+
}
|
|
254
|
+
invalidate();
|
|
255
|
+
if (is.orthographicCamera(camera) && !(Math.abs(this.current.zoom - this.goal.zoom) < eps))
|
|
256
|
+
return;
|
|
257
|
+
if (!is.orthographicCamera(camera) && !equals(this.current.camera, this.goal.camera, eps))
|
|
258
|
+
return;
|
|
259
|
+
if (controls && !equals(this.current.focus, this.goal.focus, eps))
|
|
260
|
+
return;
|
|
261
|
+
this.current.animating = false;
|
|
266
262
|
}
|
|
267
263
|
});
|
|
268
264
|
}
|
|
269
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.
|
|
270
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
265
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsBounds, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
266
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtsBounds, isStandalone: true, selector: "ngts-bounds", inputs: { boundsRef: "boundsRef", _damping: ["damping", "_damping"], _fit: ["fit", "_fit"], _clip: ["clip", "_clip"], _observe: ["observe", "_observe"], _margin: ["margin", "_margin"], _eps: ["eps", "_eps"] }, outputs: { fitted: "fitted" }, providers: [provideNgtsBoundsApi()], ngImport: i0, template: `
|
|
267
|
+
<ngt-group [ref]="boundsRef">
|
|
268
|
+
<ng-content />
|
|
269
|
+
</ngt-group>
|
|
270
|
+
`, isInline: true }); }
|
|
275
271
|
}
|
|
276
|
-
|
|
277
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: NgtsBounds, decorators: [{
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsBounds, decorators: [{
|
|
278
273
|
type: Component,
|
|
279
274
|
args: [{
|
|
280
275
|
selector: 'ngts-bounds',
|
|
281
276
|
standalone: true,
|
|
282
277
|
template: `
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
providers: [
|
|
278
|
+
<ngt-group [ref]="boundsRef">
|
|
279
|
+
<ng-content />
|
|
280
|
+
</ngt-group>
|
|
281
|
+
`,
|
|
282
|
+
providers: [provideNgtsBoundsApi()],
|
|
288
283
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
289
284
|
}]
|
|
290
285
|
}], ctorParameters: function () { return []; }, propDecorators: { boundsRef: [{
|
|
291
286
|
type: Input
|
|
292
|
-
}],
|
|
293
|
-
type: Input
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}],
|
|
299
|
-
type: Input
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
287
|
+
}], _damping: [{
|
|
288
|
+
type: Input,
|
|
289
|
+
args: [{ alias: 'damping' }]
|
|
290
|
+
}], _fit: [{
|
|
291
|
+
type: Input,
|
|
292
|
+
args: [{ alias: 'fit' }]
|
|
293
|
+
}], _clip: [{
|
|
294
|
+
type: Input,
|
|
295
|
+
args: [{ alias: 'clip' }]
|
|
296
|
+
}], _observe: [{
|
|
297
|
+
type: Input,
|
|
298
|
+
args: [{ alias: 'observe' }]
|
|
299
|
+
}], _margin: [{
|
|
300
|
+
type: Input,
|
|
301
|
+
args: [{ alias: 'margin' }]
|
|
302
|
+
}], _eps: [{
|
|
303
|
+
type: Input,
|
|
304
|
+
args: [{ alias: 'eps' }]
|
|
304
305
|
}], fitted: [{
|
|
305
306
|
type: Output
|
|
306
307
|
}] } });
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2JvdW5kcy9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osRUFBRSxFQUNGLGNBQWMsRUFDZCxRQUFRLEVBQ1IsdUNBQXVDLEdBRTFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7O0FBK0I5QixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVksRUFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUssR0FBa0IsQ0FBQyxNQUFNLENBQUM7QUFFeEYsU0FBUyxNQUFNLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLEdBQVc7SUFDM0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMvRixDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFh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QyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3lCQUNyRCxDQUFDO3dCQUNGLHVEQUF1RDt3QkFDdkQsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDL0MsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUU7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STtzQkFBaEIsS0FBSztnQkFJTyxPQUFPO3NCQUFuQixLQUFLO2dCQUlPLE1BQU07c0JBQWxCLEtBQUs7Z0JBSU8sR0FBRztzQkFBZixLQUFLO2dCQUlJLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG4gICAgZWZmZWN0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5qZWN0aW9uVG9rZW4sXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFNpZ25hbCxcbiAgICB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBleHRlbmQsXG4gICAgaW5qZWN0QmVmb3JlUmVuZGVyLFxuICAgIGluamVjdE5ndFJlZixcbiAgICBpcyxcbiAgICBOZ3RTaWduYWxTdG9yZSxcbiAgICBOZ3RTdG9yZSxcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWVJbkluamVjdGlvbkNvbnRleHQsXG4gICAgdHlwZSBOZ3RSZW5kZXJTdGF0ZSxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IHR5cGUgTmd0c0JvdW5kc1NpemUgPSB7XG4gICAgYm94OiBUSFJFRS5Cb3gzO1xuICAgIHNpemU6IFRIUkVFLlZlY3RvcjM7XG4gICAgY2VudGVyOiBUSFJFRS5WZWN0b3IzO1xuICAgIGRpc3RhbmNlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RzQm91bmRzQXBpID0ge1xuICAgIGdldFNpemU6ICgpID0+IE5ndHNCb3VuZHNTaXplO1xuICAgIHJlZnJlc2g6IChvYmplY3Q/OiBUSFJFRS5PYmplY3QzRCB8IFRIUkVFLkJveDMpID0+IE5ndHNCb3VuZHNBcGk7XG4gICAgY2xpcDogKCkgPT4gTmd0c0JvdW5kc0FwaTtcbiAgICBmaXQ6ICgpID0+IE5ndHNCb3VuZHNBcGk7XG4gICAgdG86ICh7XG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICB0YXJnZXQsXG4gICAgfToge1xuICAgICAgICBwb3NpdGlvbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICB0YXJnZXQ/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgfSkgPT4gTmd0c0JvdW5kc0FwaTtcbn07XG5cbnR5cGUgQ29udHJvbHNQcm90byA9IHtcbiAgICB1cGRhdGUoKTogdm9pZDtcbiAgICB0YXJnZXQ6IFRIUkVFLlZlY3RvcjM7XG4gICAgbWF4RGlzdGFuY2U6IG51bWJlcjtcbiAgICBhZGRFdmVudExpc3RlbmVyOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChldmVudDogYW55KSA9PiB2b2lkKSA9PiB2b2lkO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBpc0JveDMgPSAoZGVmOiB1bmtub3duKTogZGVmIGlzIFRIUkVFLkJveDMgPT4gISFkZWYgJiYgKGRlZiBhcyBUSFJFRS5Cb3gzKS5pc0JveDM7XG5cbmZ1bmN0aW9uIGVxdWFscyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBlcHM6IG51bWJlcikge1xuICAgIHJldHVybiBNYXRoLmFicyhhLnggLSBiLngpIDwgZXBzICYmIE1hdGguYWJzKGEueSAtIGIueSkgPCBlcHMgJiYgTWF0aC5hYnMoYS56IC0gYi56KSA8IGVwcztcbn1cblxuZnVuY3Rpb24gZGFtcCh2OiBUSFJFRS5WZWN0b3IzLCB0OiBUSFJFRS5WZWN0b3IzLCBsYW1iZGE6IG51bWJlciwgZGVsdGE6IG51bWJlcikge1xuICAgIHYueCA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHYueCwgdC54LCBsYW1iZGEsIGRlbHRhKTtcbiAgICB2LnkgPSBUSFJFRS5NYXRoVXRpbHMuZGFtcCh2LnksIHQueSwgbGFtYmRhLCBkZWx0YSk7XG4gICAgdi56ID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAodi56LCB0LnosIGxhbWJkYSwgZGVsdGEpO1xufVxuXG5leHBvcnQgY29uc3QgTkdUU19CT1VORFNfQVBJID0gbmV3IEluamVjdGlvblRva2VuPFNpZ25hbDxOZ3RzQm91bmRzQXBpPj4oJ05ndHNCb3VuZHMgQVBJJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0JvdW5kc1N0YXRlIHtcbiAgICBkYW1waW5nOiBudW1iZXI7XG4gICAgZml0OiBib29sZWFuO1xuICAgIGNsaXA6IGJvb2xlYW47XG4gICAgb2JzZXJ2ZTogYm9vbGVhbjtcbiAgICBtYXJnaW46IG51bWJlcjtcbiAgICBlcHM6IG51bWJlcjtcbn1cblxuZXh0ZW5kKHsgR3JvdXAgfSk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cy1ib3VuZHMnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBuZ3RDb21wb3VuZCBbcmVmXT1cImJvdW5kc1JlZlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgPC9uZ3QtZ3JvdXA+XG4gICAgYCxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HVFNfQk9VTkRTX0FQSSwgdXNlRmFjdG9yeTogKGJvdW5kczogTmd0c0JvdW5kcykgPT4gYm91bmRzLmFwaSwgZGVwczogW05ndHNCb3VuZHNdIH1dLFxuICAgIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0JvdW5kcyBleHRlbmRzIE5ndFNpZ25hbFN0b3JlPE5ndHNCb3VuZHNTdGF0ZT4ge1xuICAgIEBJbnB1dCgpIGJvdW5kc1JlZiA9IGluamVjdE5ndFJlZjxHcm91cD4oKTtcblxuICAgIEBJbnB1dCgpIHNldCBkYW1waW5nKGRhbXBpbmc6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGRhbXBpbmcgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGZpdChmaXQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBmaXQgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGNsaXAoY2xpcDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IGNsaXAgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG9ic2VydmUob2JzZXJ2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IG9ic2VydmUgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG1hcmdpbihtYXJnaW46IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG1hcmdpbiB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZXBzKGVwczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZXBzIH0pO1xuICAgIH1cblxuICAgIEBPdXRwdXQoKSBmaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5ndHNCb3VuZHNTaXplPigpO1xuXG4gICAgcmVhZG9ubHkgI3N0b3JlID0gaW5qZWN0KE5ndFN0b3JlKTtcbiAgICByZWFkb25seSAjY29udHJvbHMgPSB0aGlzLiNzdG9yZS5zZWxlY3QoJ2NvbnRyb2xzJyk7XG4gICAgcmVhZG9ubHkgI2NhbWVyYSA9IHRoaXMuI3N0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG4gICAgcmVhZG9ubHkgI2ludmFsaWRhdGUgPSB0aGlzLiNzdG9yZS5zZWxlY3QoJ2ludmFsaWRhdGUnKTtcbiAgICByZWFkb25seSAjc2l6ZSA9IHRoaXMuI3N0b3JlLnNlbGVjdCgnc2l6ZScpO1xuXG4gICAgcmVhZG9ubHkgI2N1cnJlbnQgPSB7IGFuaW1hdGluZzogZmFsc2UsIGZvY3VzOiBuZXcgVEhSRUUuVmVjdG9yMygpLCBjYW1lcmE6IG5ldyBUSFJFRS5WZWN0b3IzKCksIHpvb206IDEgfTtcbiAgICByZWFkb25seSAjZ29hbCA9IHsgZm9jdXM6IG5ldyBUSFJFRS5WZWN0b3IzKCksIGNhbWVyYTogbmV3IFRIUkVFLlZlY3RvcjMoKSwgem9vbTogMSB9O1xuXG4gICAgcmVhZG9ubHkgI2JveCA9IG5ldyBUSFJFRS5Cb3gzKCk7XG5cbiAgICByZWFkb25seSAjbWFyZ2luID0gdGhpcy5zZWxlY3QoJ21hcmdpbicpO1xuICAgIHJlYWRvbmx5ICNkYW1waW5nID0gdGhpcy5zZWxlY3QoJ2RhbXBpbmcnKTtcbiAgICByZWFkb25seSAjZml0ID0gdGhpcy5zZWxlY3QoJ2ZpdCcpO1xuICAgIHJlYWRvbmx5ICNjbGlwID0gdGhpcy5zZWxlY3QoJ2NsaXAnKTtcbiAgICByZWFkb25seSAjb2JzZXJ2ZSA9IHRoaXMuc2VsZWN0KCdvYnNlcnZlJyk7XG5cbiAgICAjY291bnQgPSAwO1xuXG4gICAgcmVhZG9ubHkgYXBpID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJnaW4gPSB0aGlzLiNtYXJnaW4oKTtcbiAgICAgICAgY29uc3QgZGFtcGluZyA9IHRoaXMuI2RhbXBpbmcoKTtcblxuICAgICAgICBjb25zdCBjYW1lcmEgPSB0aGlzLiNjYW1lcmEoKTtcbiAgICAgICAgY29uc3QgY29udHJvbHMgPSB0aGlzLiNjb250cm9scygpIGFzIHVua25vd24gYXMgQ29udHJvbHNQcm90bztcbiAgICAgICAgY29uc3QgaW52YWxpZGF0ZSA9IHRoaXMuI2ludmFsaWRhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy4jY3VycmVudDtcbiAgICAgICAgY29uc3QgZ29hbCA9IHRoaXMuI2dvYWw7XG5cbiAgICAgICAgY29uc3QgYm94ID0gdGhpcy4jYm94O1xuICAgICAgICBjb25zdCByZWYgPSAoKSA9PiB0aGlzLmJvdW5kc1JlZi51bnRyYWNrZWQ7XG4gICAgICAgIGNvbnN0IGZpdHRlZCA9IHRoaXMuZml0dGVkO1xuXG4gICAgICAgIGZ1bmN0aW9uIGdldFNpemUoKSB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBib3guZ2V0Q2VudGVyKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xuICAgICAgICAgICAgY29uc3QgZml0SGVpZ2h0RGlzdGFuY2UgPSBpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKVxuICAgICAgICAgICAgICAgID8gbWF4U2l6ZSAqIDRcbiAgICAgICAgICAgICAgICA6IG1heFNpemUgLyAoMiAqIE1hdGguYXRhbigoTWF0aC5QSSAqIGNhbWVyYS5mb3YpIC8gMzYwKSk7XG4gICAgICAgICAgICBjb25zdCBmaXRXaWR0aERpc3RhbmNlID0gaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkgPyBtYXhTaXplICogNCA6IGZpdEhlaWdodERpc3RhbmNlIC8gY2FtZXJhLmFzcGVjdDtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbWFyZ2luICogTWF0aC5tYXgoZml0SGVpZ2h0RGlzdGFuY2UsIGZpdFdpZHRoRGlzdGFuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHsgYm94LCBzaXplLCBjZW50ZXIsIGRpc3RhbmNlIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0U2l6ZSxcbiAgICAgICAgICAgIHJlZnJlc2gob2JqZWN0PzogVEhSRUUuT2JqZWN0M0QgfCBUSFJFRS5Cb3gzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQm94MyhvYmplY3QpKSBib3guY29weShvYmplY3QpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBvYmplY3QgfHwgcmVmKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveC5zZXRGcm9tT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJveC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4ID0gY2FtZXJhLnBvc2l0aW9uLmxlbmd0aCgpIHx8IDEwO1xuICAgICAgICAgICAgICAgICAgICBib3guc2V0RnJvbUNlbnRlckFuZFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSwgbmV3IFRIUkVFLlZlY3RvcjMobWF4LCBtYXgsIG1heCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb250cm9scz8uY29uc3RydWN0b3IubmFtZSA9PT0gJ09ydGhvZ3JhcGhpY1RyYWNrYmFsbENvbnRyb2xzJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBQdXQgY2FtZXJhIG9uIGEgc3BoZXJlIGFsb25nIHdoaWNoIGl0IHNob3VsZCBtb3ZlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGlzdGFuY2UgfSA9IGdldFNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gY2FtZXJhLnBvc2l0aW9uLmNsb25lKCkuc3ViKGNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQb3MgPSBjb250cm9scy50YXJnZXQuY2xvbmUoKS5hZGQoZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLmNvcHkobmV3UG9zKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNsaXAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9scykgY29udHJvbHMubWF4RGlzdGFuY2UgPSBkaXN0YW5jZSAqIDEwO1xuICAgICAgICAgICAgICAgIGNhbWVyYS5uZWFyID0gZGlzdGFuY2UgLyAxMDA7XG4gICAgICAgICAgICAgICAgY2FtZXJhLmZhciA9IGRpc3RhbmNlICogMTAwO1xuICAgICAgICAgICAgICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xzKSBjb250cm9scy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG8oeyBwb3NpdGlvbiwgdGFyZ2V0IH06IHsgcG9zaXRpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTsgdGFyZ2V0PzogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50LmNhbWVyYS5jb3B5KGNhbWVyYS5wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjZW50ZXIgfSA9IGdldFNpemUoKTtcbiAgICAgICAgICAgICAgICBnb2FsLmNhbWVyYS5zZXQoLi4ucG9zaXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBnb2FsLmZvY3VzLnNldCguLi50YXJnZXQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdvYWwuZm9jdXMuY29weShjZW50ZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkYW1waW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0KC4uLnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaXQoKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5jYW1lcmEuY29weShjYW1lcmEucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9scykgY3VycmVudC5mb2N1cy5jb3B5KGNvbnRyb2xzLnRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IGNlbnRlciwgZGlzdGFuY2UgfSA9IGdldFNpemUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBjZW50ZXIuY2xvbmUoKS5zdWIoY2FtZXJhLnBvc2l0aW9uKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihkaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICBnb2FsLmNhbWVyYS5jb3B5KGNlbnRlcikuc3ViKGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgZ29hbC5mb2N1cy5jb3B5KGNlbnRlcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC56b29tID0gY2FtZXJhLnpvb207XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG1heEhlaWdodCA9IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2VzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1pbi54LCBib3gubWluLnksIGJveC5taW4ueiksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5tYXgueSwgYm94Lm1pbi56KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKGJveC5taW4ueCwgYm94Lm1pbi55LCBib3gubWF4LnopLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1pbi54LCBib3gubWF4LnksIGJveC5tYXgueiksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWF4LngsIGJveC5tYXgueSwgYm94Lm1heC56KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1heC55LCBib3gubWluLnopLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWluLnksIGJveC5tYXgueiksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWF4LngsIGJveC5taW4ueSwgYm94Lm1pbi56KSxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBjZW50ZXIgYW5kIGVhY2ggY29ybmVyIHRvIGNhbWVyYSBzcGFjZVxuICAgICAgICAgICAgICAgICAgICBjZW50ZXIuYXBwbHlNYXRyaXg0KGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmVydGljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuYXBwbHlNYXRyaXg0KGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBNYXRoLmFicyh2LnkgLSBjZW50ZXIueSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgTWF0aC5hYnModi54IC0gY2VudGVyLngpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQgKj0gMjtcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggKj0gMjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgem9vbUZvckhlaWdodCA9IChjYW1lcmEudG9wIC0gY2FtZXJhLmJvdHRvbSkgLyBtYXhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHpvb21Gb3JXaWR0aCA9IChjYW1lcmEucmlnaHQgLSBjYW1lcmEubGVmdCkgLyBtYXhXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgZ29hbC56b29tID0gTWF0aC5taW4oem9vbUZvckhlaWdodCwgem9vbUZvcldpZHRoKSAvIG1hcmdpbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYW1waW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEuem9vbSA9IGdvYWwuem9vbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGFtcGluZykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLmNvcHkoZ29hbC5jYW1lcmEpO1xuICAgICAgICAgICAgICAgICAgICBjYW1lcmEubG9va0F0KGdvYWwuZm9jdXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLnRhcmdldC5jb3B5KGdvYWwuZm9jdXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpdHRlZC5vYnNlcnZlZCkgZml0dGVkLmVtaXQodGhpcy5nZXRTaXplKCkpO1xuICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBkYW1waW5nOiA2LCBmaXQ6IGZhbHNlLCBjbGlwOiBmYWxzZSwgb2JzZXJ2ZTogZmFsc2UsIG1hcmdpbjogMS4yLCBlcHM6IDAuMDEgfSk7XG4gICAgICAgIHRoaXMuI3ByZXZlbnREcmFnSGlqYWNraW5nKCk7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZUluSW5qZWN0aW9uQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNzY2FsZVBvaW50ZXIoKTtcbiAgICAgICAgICAgIGluamVjdEJlZm9yZVJlbmRlcih0aGlzLiNvbkJlZm9yZVJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgI3NjYWxlUG9pbnRlcigpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgICAgICAgICBzaXplOiB0aGlzLiNzaXplKCksXG4gICAgICAgICAgICBmaXQ6IHRoaXMuI2ZpdCgpLFxuICAgICAgICAgICAgY2xpcDogdGhpcy4jY2xpcCgpLFxuICAgICAgICAgICAgb2JzZXJ2ZTogdGhpcy4jb2JzZXJ2ZSgpLFxuICAgICAgICAgICAgY2FtZXJhOiB0aGlzLiNjYW1lcmEoKSxcbiAgICAgICAgICAgIGNvbnRyb2xzOiB0aGlzLiNjb250cm9scygpLFxuICAgICAgICB9KSk7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG9ic2VydmUsIGZpdCwgY2xpcCB9ID0gdHJpZ2dlcigpO1xuICAgICAgICAgICAgY29uc3QgYXBpID0gdW50cmFja2VkKHRoaXMuYXBpKTtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlIHx8IHRoaXMuI2NvdW50KysgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhcGkucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIGlmIChmaXQpIGFwaS5maXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xpcCkgYXBpLmNsaXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgI29uQmVmb3JlUmVuZGVyKHsgZGVsdGEgfTogTmd0UmVuZGVyU3RhdGUpIHtcbiAgICAgICAgY29uc3QgeyBkYW1waW5nLCBlcHMgfSA9IHRoaXMuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGludmFsaWRhdGUgPSB0aGlzLiNpbnZhbGlkYXRlKCk7XG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuI2NhbWVyYSgpO1xuICAgICAgICBjb25zdCBjb250cm9scyA9IHRoaXMuI2NvbnRyb2xzKCkgYXMgdW5rbm93biBhcyBDb250cm9sc1Byb3RvO1xuXG4gICAgICAgIGlmICh0aGlzLiNjdXJyZW50LmFuaW1hdGluZykge1xuICAgICAgICAgICAgZGFtcCh0aGlzLiNjdXJyZW50LmZvY3VzLCB0aGlzLiNnb2FsLmZvY3VzLCBkYW1waW5nLCBkZWx0YSk7XG4gICAgICAgICAgICBkYW1wKHRoaXMuI2N1cnJlbnQuY2FtZXJhLCB0aGlzLiNnb2FsLmNhbWVyYSwgZGFtcGluZywgZGVsdGEpO1xuICAgICAgICAgICAgdGhpcy4jY3VycmVudC56b29tID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAodGhpcy4jY3VycmVudC56b29tLCB0aGlzLiNnb2FsLnpvb20sIGRhbXBpbmcsIGRlbHRhKTtcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi5jb3B5KHRoaXMuI2N1cnJlbnQuY2FtZXJhKTtcblxuICAgICAgICAgICAgaWYgKGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpKSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLnpvb20gPSB0aGlzLiNjdXJyZW50Lnpvb207XG4gICAgICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFjb250cm9scykge1xuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQodGhpcy4jY3VycmVudC5mb2N1cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzLnRhcmdldC5jb3B5KHRoaXMuI2N1cnJlbnQuZm9jdXMpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkgJiYgIShNYXRoLmFicyh0aGlzLiNjdXJyZW50Lnpvb20gLSB0aGlzLiNnb2FsLnpvb20pIDwgZXBzKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJiAhZXF1YWxzKHRoaXMuI2N1cnJlbnQuY2FtZXJhLCB0aGlzLiNnb2FsLmNhbWVyYSwgZXBzKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xzICYmICFlcXVhbHModGhpcy4jY3VycmVudC5mb2N1cywgdGhpcy4jZ29hbC5mb2N1cywgZXBzKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy4jY3VycmVudC5hbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICNwcmV2ZW50RHJhZ0hpamFja2luZygpIHtcbiAgICAgICAgZWZmZWN0KChvbkNsZWFudXApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy4jY29udHJvbHMoKSBhcyB1bmtub3duIGFzIENvbnRyb2xzUHJvdG87XG4gICAgICAgICAgICBpZiAoY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+ICh0aGlzLiNjdXJyZW50LmFuaW1hdGluZyA9IGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdzdGFydCcsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBvbkNsZWFudXAoKCkgPT4gY29udHJvbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhcnQnLCBjYWxsYmFjaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2JvdW5kcy9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHNCQUFzQixFQUN0QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osY0FBYyxFQUNkLEVBQUUsRUFDRixXQUFXLEdBRVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFFOUIsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQWlCbEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFRLEVBQXFCLEVBQUUsQ0FBQyxHQUFHLElBQUssR0FBa0IsQ0FBQyxNQUFNLENBQUM7QUFFbEYsU0FBUyxNQUFNLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLEdBQVc7SUFDOUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM1RixDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsQ0FBZ0IsRUFBRSxDQUFn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QUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUMvQjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0F6UVcsVUFBVTtrR0FBVixVQUFVLDJTQUhYLENBQUMsb0JBQW9CLEVBQUUsQ0FBQywwQkFMekI7Ozs7RUFJVDs7MkZBSVcsVUFBVTtrQkFYdEIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsYUFBYTtvQkFDdkIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7OztFQUlUO29CQUNELFNBQVMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUNqQzswRUFXUyxTQUFTO3NCQUFqQixLQUFLO2dCQUUyQixRQUFRO3NCQUF4QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFJRSxJQUFJO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtnQkFJTyxLQUFLO3NCQUFsQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtnQkFJUyxRQUFRO3NCQUF4QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFJSyxPQUFPO3NCQUF0QyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFJRyxJQUFJO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtnQkFJYixNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRDb21wb25lbnQsXG5cdEV2ZW50RW1pdHRlcixcblx0SW5wdXQsXG5cdE91dHB1dCxcblx0U2lnbmFsLFxuXHRjb21wdXRlZCxcblx0ZWZmZWN0LFxuXHRmb3J3YXJkUmVmLFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Y3JlYXRlSW5qZWN0aW9uVG9rZW4sXG5cdGV4dGVuZCxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3ROZ3RSZWYsXG5cdGluamVjdE5ndFN0b3JlLFxuXHRpcyxcblx0c2lnbmFsU3RvcmUsXG5cdHR5cGUgTmd0R3JvdXAsXG59IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICd0aHJlZSc7XG5cbmV4dGVuZCh7IEdyb3VwIH0pO1xuXG5leHBvcnQgdHlwZSBOZ3RzQm91bmRzU2l6ZSA9IHtcblx0Ym94OiBUSFJFRS5Cb3gzO1xuXHRzaXplOiBUSFJFRS5WZWN0b3IzO1xuXHRjZW50ZXI6IFRIUkVFLlZlY3RvcjM7XG5cdGRpc3RhbmNlOiBudW1iZXI7XG59O1xuXG50eXBlIENvbnRyb2xzUHJvdG8gPSB7XG5cdHVwZGF0ZSgpOiB2b2lkO1xuXHR0YXJnZXQ6IFRIUkVFLlZlY3RvcjM7XG5cdG1heERpc3RhbmNlOiBudW1iZXI7XG5cdGFkZEV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBpc0JveDMgPSAoZGVmOiBhbnkpOiBkZWYgaXMgVEhSRUUuQm94MyA9PiBkZWYgJiYgKGRlZiBhcyBUSFJFRS5Cb3gzKS5pc0JveDM7XG5cbmZ1bmN0aW9uIGVxdWFscyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBlcHM6IG51bWJlcikge1xuXHRyZXR1cm4gTWF0aC5hYnMoYS54IC0gYi54KSA8IGVwcyAmJiBNYXRoLmFicyhhLnkgLSBiLnkpIDwgZXBzICYmIE1hdGguYWJzKGEueiAtIGIueikgPCBlcHM7XG59XG5cbmZ1bmN0aW9uIGRhbXAodjogVEhSRUUuVmVjdG9yMywgdDogVEhSRUUuVmVjdG9yMywgbGFtYmRhOiBudW1iZXIsIGRlbHRhOiBudW1iZXIpIHtcblx0di54ID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAodi54LCB0LngsIGxhbWJkYSwgZGVsdGEpO1xuXHR2LnkgPSBUSFJFRS5NYXRoVXRpbHMuZGFtcCh2LnksIHQueSwgbGFtYmRhLCBkZWx0YSk7XG5cdHYueiA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHYueiwgdC56LCBsYW1iZGEsIGRlbHRhKTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0c0JvdW5kc1N0YXRlID0ge1xuXHRkYW1waW5nOiBudW1iZXI7XG5cdGZpdDogYm9vbGVhbjtcblx0Y2xpcDogYm9vbGVhbjtcblx0b2JzZXJ2ZTogYm9vbGVhbjtcblx0bWFyZ2luOiBudW1iZXI7XG5cdGVwczogbnVtYmVyO1xufTtcblxuZGVjbGFyZSBnbG9iYWwge1xuXHRpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcblx0XHQvKipcblx0XHQgKiBAZXh0ZW5kcyBuZ3QtZ3JvdXBcblx0XHQgKi9cblx0XHQnbmd0cy1ib3VuZHMnOiBOZ3RzQm91bmRzU3RhdGUgJiBOZ3RHcm91cDtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgW2luamVjdE5ndHNCb3VuZHNBcGksIHByb3ZpZGVOZ3RzQm91bmRzQXBpXSA9IGNyZWF0ZUluamVjdGlvblRva2VuKChib3VuZHM6IE5ndHNCb3VuZHMpID0+IGJvdW5kcy5hcGksIHtcblx0aXNSb290OiBmYWxzZSxcblx0ZGVwczogW2ZvcndhcmRSZWYoKCkgPT4gTmd0c0JvdW5kcyldLFxufSk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtYm91bmRzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwIFtyZWZdPVwiYm91bmRzUmVmXCI+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LWdyb3VwPlxuXHRgLFxuXHRwcm92aWRlcnM6IFtwcm92aWRlTmd0c0JvdW5kc0FwaSgpXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQm91bmRzIHtcblx0cHJpdmF0ZSBpbnB1dHMgPSBzaWduYWxTdG9yZTxOZ3RzQm91bmRzU3RhdGU+KHtcblx0XHRkYW1waW5nOiA2LFxuXHRcdGZpdDogZmFsc2UsXG5cdFx0Y2xpcDogZmFsc2UsXG5cdFx0b2JzZXJ2ZTogZmFsc2UsXG5cdFx0bWFyZ2luOiAxLjIsXG5cdFx0ZXBzOiAwLjAxLFxuXHR9KTtcblxuXHRASW5wdXQoKSBib3VuZHNSZWYgPSBpbmplY3ROZ3RSZWY8R3JvdXA+KCk7XG5cblx0QElucHV0KHsgYWxpYXM6ICdkYW1waW5nJyB9KSBzZXQgX2RhbXBpbmcoZGFtcGluZzogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZGFtcGluZyB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnZml0JyB9KSBzZXQgX2ZpdChmaXQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBmaXQgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2NsaXAnIH0pIHNldCBfY2xpcChjbGlwOiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgY2xpcCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnb2JzZXJ2ZScgfSkgc2V0IF9vYnNlcnZlKG9ic2VydmU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBvYnNlcnZlIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdtYXJnaW4nIH0pIHNldCBfbWFyZ2luKG1hcmdpbjogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgbWFyZ2luIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdlcHMnIH0pIHNldCBfZXBzKGVwczogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZXBzIH0pO1xuXHR9XG5cblx0QE91dHB1dCgpIGZpdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd0c0JvdW5kc1NpemU+KCk7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdE5ndFN0b3JlKCk7XG5cdHByaXZhdGUgY29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDxDb250cm9sc1Byb3RvPjtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cblx0cHJpdmF0ZSBmaXQgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2ZpdCcpO1xuXHRwcml2YXRlIGNsaXAgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2NsaXAnKTtcblx0cHJpdmF0ZSBvYnNlcnZlID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdvYnNlcnZlJyk7XG5cdHByaXZhdGUgbWFyZ2luID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdtYXJnaW4nKTtcblx0cHJpdmF0ZSBkYW1waW5nID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdkYW1waW5nJyk7XG5cblx0cHJpdmF0ZSBjdXJyZW50ID0geyBhbmltYXRpbmc6IGZhbHNlLCBmb2N1czogbmV3IFRIUkVFLlZlY3RvcjMoKSwgY2FtZXJhOiBuZXcgVEhSRUUuVmVjdG9yMygpLCB6b29tOiAxIH07XG5cdHByaXZhdGUgZ29hbCA9IHsgZm9jdXM6IG5ldyBUSFJFRS5WZWN0b3IzKCksIGNhbWVyYTogbmV3IFRIUkVFLlZlY3RvcjMoKSwgem9vbTogMSB9O1xuXHRwcml2YXRlIGJveCA9IG5ldyBUSFJFRS5Cb3gzKCk7XG5cblx0YXBpID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHsgYm94LCBib3VuZHNSZWYsIGN1cnJlbnQsIGdvYWwsIGZpdHRlZCB9ID0gdGhpcztcblx0XHRjb25zdCBbY2FtZXJhLCBtYXJnaW4sIGNvbnRyb2xzLCBpbnZhbGlkYXRlLCBkYW1waW5nXSA9IFtcblx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHR0aGlzLm1hcmdpbigpLFxuXHRcdFx0dGhpcy5jb250cm9scygpLFxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHR0aGlzLmRhbXBpbmcoKSxcblx0XHRdO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0U2l6ZSgpIHtcblx0XHRcdGNvbnN0IHNpemUgPSBib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcblx0XHRcdGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG5cdFx0XHRjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoc2l6ZS54LCBzaXplLnksIHNpemUueik7XG5cdFx0XHRjb25zdCBmaXRIZWlnaHREaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpXG5cdFx0XHRcdD8gbWF4U2l6ZSAqIDRcblx0XHRcdFx0OiBtYXhTaXplIC8gKDIgKiBNYXRoLmF0YW4oKE1hdGguUEkgKiBjYW1lcmEuZm92KSAvIDM2MCkpO1xuXHRcdFx0Y29uc3QgZml0V2lkdGhEaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpID8gbWF4U2l6ZSAqIDQgOiBmaXRIZWlnaHREaXN0YW5jZSAvIGNhbWVyYS5hc3BlY3Q7XG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IG1hcmdpbiAqIE1hdGgubWF4KGZpdEhlaWdodERpc3RhbmNlLCBmaXRXaWR0aERpc3RhbmNlKTtcblx0XHRcdHJldHVybiB7IGJveCwgc2l6ZSwgY2VudGVyLCBkaXN0YW5jZSB9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRnZXRTaXplLFxuXHRcdFx0cmVmcmVzaChvYmplY3Q/OiBUSFJFRS5PYmplY3QzRCB8IFRIUkVFLkJveDMpIHtcblx0XHRcdFx0aWYgKGlzQm94MyhvYmplY3QpKSBib3guY29weShvYmplY3QpO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXQgPSBvYmplY3QgfHwgYm91bmRzUmVmLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRcdFx0aWYgKCF0YXJnZXQpIHJldHVybiB0aGlzO1xuXHRcdFx0XHRcdHRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCB0cnVlKTtcblx0XHRcdFx0XHRib3guc2V0RnJvbU9iamVjdCh0YXJnZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChib3guaXNFbXB0eSgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWF4ID0gY2FtZXJhLnBvc2l0aW9uLmxlbmd0aCgpIHx8IDEwO1xuXHRcdFx0XHRcdGJveC5zZXRGcm9tQ2VudGVyQW5kU2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpLCBuZXcgVEhSRUUuVmVjdG9yMyhtYXgsIG1heCwgbWF4KSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29udHJvbHM/LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPcnRob2dyYXBoaWNUcmFja2JhbGxDb250cm9scycpIHtcblx0XHRcdFx0XHQvLyBQdXQgY2FtZXJhIG9uIGEgc3BoZXJlIGFsb25nIHdoaWNoIGl0IHNob3VsZCBtb3ZlXG5cdFx0XHRcdFx0Y29uc3QgeyBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdGlvbiA9IGNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yihjb250cm9scy50YXJnZXQpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcblx0XHRcdFx0XHRjb25zdCBuZXdQb3MgPSBjb250cm9scy50YXJnZXQuY2xvbmUoKS5hZGQoZGlyZWN0aW9uKTtcblx0XHRcdFx0XHRjYW1lcmEucG9zaXRpb24uY29weShuZXdQb3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Y2xpcCgpIHtcblx0XHRcdFx0Y29uc3QgeyBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuXHRcdFx0XHRpZiAoY29udHJvbHMpIGNvbnRyb2xzLm1heERpc3RhbmNlID0gZGlzdGFuY2UgKiAxMDtcblx0XHRcdFx0Y2FtZXJhLm5lYXIgPSBkaXN0YW5jZSAvIDEwMDtcblx0XHRcdFx0Y2FtZXJhLmZhciA9IGRpc3RhbmNlICogMTAwO1xuXHRcdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXHRcdFx0XHRpZiAoY29udHJvbHMpIGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdHRvKHsgcG9zaXRpb24sIHRhcmdldCB9OiB7IHBvc2l0aW9uOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IHRhcmdldD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9KSB7XG5cdFx0XHRcdGN1cnJlbnQuY2FtZXJhLmNvcHkoY2FtZXJhLnBvc2l0aW9uKTtcblx0XHRcdFx0Y29uc3QgeyBjZW50ZXIgfSA9IGdldFNpemUoKTtcblx0XHRcdFx0Z29hbC5jYW1lcmEuc2V0KC4uLnBvc2l0aW9uKTtcblxuXHRcdFx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRcdFx0Z29hbC5mb2N1cy5zZXQoLi4udGFyZ2V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRnb2FsLmZvY3VzLmNvcHkoY2VudGVyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYW1waW5nKSB7XG5cdFx0XHRcdFx0Y3VycmVudC5hbmltYXRpbmcgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNhbWVyYS5wb3NpdGlvbi5zZXQoLi4ucG9zaXRpb24pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Zml0KCkge1xuXHRcdFx0XHRjdXJyZW50LmNhbWVyYS5jb3B5KGNhbWVyYS5wb3NpdGlvbik7XG5cdFx0XHRcdGlmIChjb250cm9scykgY3VycmVudC5mb2N1cy5jb3B5KGNvbnRyb2xzLnRhcmdldCk7XG5cblx0XHRcdFx0Y29uc3QgeyBjZW50ZXIsIGRpc3RhbmNlIH0gPSBnZXRTaXplKCk7XG5cdFx0XHRcdGNvbnN0IGRpcmVjdGlvbiA9IGNlbnRlci5jbG9uZSgpLnN1YihjYW1lcmEucG9zaXRpb24pLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcblxuXHRcdFx0XHRnb2FsLmNhbWVyYS5jb3B5KGNlbnRlcikuc3ViKGRpcmVjdGlvbik7XG5cdFx0XHRcdGdvYWwuZm9jdXMuY29weShjZW50ZXIpO1xuXG5cdFx0XHRcdGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSkge1xuXHRcdFx0XHRcdGN1cnJlbnQuem9vbSA9IGNhbWVyYS56b29tO1xuXG5cdFx0XHRcdFx0bGV0IG1heEhlaWdodCA9IDAsXG5cdFx0XHRcdFx0XHRtYXhXaWR0aCA9IDA7XG5cdFx0XHRcdFx0Y29uc3QgdmVydGljZXMgPSBbXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5taW4ueSwgYm94Lm1pbi56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5taW4ueCwgYm94Lm1heC55LCBib3gubWluLnopLFxuXHRcdFx0XHRcdFx0bmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1pbi54LCBib3gubWluLnksIGJveC5tYXgueiksXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5tYXgueSwgYm94Lm1heC56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1heC55LCBib3gubWF4LnopLFxuXHRcdFx0XHRcdFx0bmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWF4LnksIGJveC5taW4ueiksXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWF4LngsIGJveC5taW4ueSwgYm94Lm1heC56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1pbi55LCBib3gubWluLnopLFxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0Ly8gVHJhbnNmb3JtIHRoZSBjZW50ZXIgYW5kIGVhY2ggY29ybmVyIHRvIGNhbWVyYSBzcGFjZVxuXHRcdFx0XHRcdGNlbnRlci5hcHBseU1hdHJpeDQoY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHZlcnRpY2VzKSB7XG5cdFx0XHRcdFx0XHR2LmFwcGx5TWF0cml4NChjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcblx0XHRcdFx0XHRcdG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgTWF0aC5hYnModi55IC0gY2VudGVyLnkpKTtcblx0XHRcdFx0XHRcdG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIE1hdGguYWJzKHYueCAtIGNlbnRlci54KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1heEhlaWdodCAqPSAyO1xuXHRcdFx0XHRcdG1heFdpZHRoICo9IDI7XG5cdFx0XHRcdFx0Y29uc3Qgem9vbUZvckhlaWdodCA9IChjYW1lcmEudG9wIC0gY2FtZXJhLmJvdHRvbSkgLyBtYXhIZWlnaHQ7XG5cdFx0XHRcdFx0Y29uc3Qgem9vbUZvcldpZHRoID0gKGNhbWVyYS5yaWdodCAtIGNhbWVyYS5sZWZ0KSAvIG1heFdpZHRoO1xuXHRcdFx0XHRcdGdvYWwuem9vbSA9IE1hdGgubWluKHpvb21Gb3JIZWlnaHQsIHpvb21Gb3JXaWR0aCkgLyBtYXJnaW47XG5cdFx0XHRcdFx0aWYgKCFkYW1waW5nKSB7XG5cdFx0XHRcdFx0XHRjYW1lcmEuem9vbSA9IGdvYWwuem9vbTtcblx0XHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhbXBpbmcpIHtcblx0XHRcdFx0XHRjdXJyZW50LmFuaW1hdGluZyA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2FtZXJhLnBvc2l0aW9uLmNvcHkoZ29hbC5jYW1lcmEpO1xuXHRcdFx0XHRcdGNhbWVyYS5sb29rQXQoZ29hbC5mb2N1cyk7XG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRcdFx0XHRjb250cm9scy50YXJnZXQuY29weShnb2FsLmZvY3VzKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChmaXR0ZWQub2JzZXJ2ZWQpIHtcblx0XHRcdFx0XHRmaXR0ZWQuZW1pdCh0aGlzLmdldFNpemUoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0fTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5wcmV2ZW50RHJhZ0hpamFja2luZygpO1xuXHRcdHRoaXMuc2NhbGVQb2ludGVyKCk7XG5cdFx0dGhpcy5iZWZvcmVSZW5kZXIoKTtcblx0fVxuXG5cdHByaXZhdGUgcHJldmVudERyYWdIaWphY2tpbmcoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IGNvbnRyb2xzID0gdGhpcy5jb250cm9scygpO1xuXHRcdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gKCkgPT4gKHRoaXMuY3VycmVudC5hbmltYXRpbmcgPSBmYWxzZSk7XG5cdFx0XHRcdGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgY2FsbGJhY2spO1xuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4gY29udHJvbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhcnQnLCBjYWxsYmFjaykpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzY2FsZVBvaW50ZXIoKSB7XG5cdFx0bGV0IGNvdW50ID0gMDtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW29ic2VydmUsIGZpdCwgY2xpcCwgYXBpXSA9IFtcblx0XHRcdFx0dGhpcy5vYnNlcnZlKCksXG5cdFx0XHRcdHRoaXMuZml0KCksXG5cdFx0XHRcdHRoaXMuY2xpcCgpLFxuXHRcdFx0XHR1bnRyYWNrZWQodGhpcy5hcGkpLFxuXHRcdFx0XHR0aGlzLmNhbWVyYSgpLFxuXHRcdFx0XHR0aGlzLmNvbnRyb2xzKCksXG5cdFx0XHRcdHRoaXMuc2l6ZSgpLFxuXHRcdFx0XTtcblxuXHRcdFx0aWYgKG9ic2VydmUgfHwgY291bnQrKyA9PT0gMCkge1xuXHRcdFx0XHRhcGkucmVmcmVzaCgpO1xuXHRcdFx0XHRpZiAoZml0KSBhcGkuZml0KCk7XG5cdFx0XHRcdGlmIChjbGlwKSBhcGkuY2xpcCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBiZWZvcmVSZW5kZXIoKSB7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGRlbHRhIH0pID0+IHtcblx0XHRcdGNvbnN0IFt7IGRhbXBpbmcsIGVwcyB9LCBjYW1lcmEsIGNvbnRyb2xzLCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdFx0dGhpcy5pbnB1dHMuZ2V0KCksXG5cdFx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHRcdHRoaXMuY29udHJvbHMoKSxcblx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50LmFuaW1hdGluZykge1xuXHRcdFx0XHRkYW1wKHRoaXMuY3VycmVudC5mb2N1cywgdGhpcy5nb2FsLmZvY3VzLCBkYW1waW5nLCBkZWx0YSk7XG5cdFx0XHRcdGRhbXAodGhpcy5jdXJyZW50LmNhbWVyYSwgdGhpcy5nb2FsLmNhbWVyYSwgZGFtcGluZywgZGVsdGEpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnQuem9vbSA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHRoaXMuY3VycmVudC56b29tLCB0aGlzLmdvYWwuem9vbSwgZGFtcGluZywgZGVsdGEpO1xuXHRcdFx0XHRjYW1lcmEucG9zaXRpb24uY29weSh0aGlzLmN1cnJlbnQuY2FtZXJhKTtcblxuXHRcdFx0XHRpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcblx0XHRcdFx0XHRjYW1lcmEuem9vbSA9IHRoaXMuY3VycmVudC56b29tO1xuXHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWNvbnRyb2xzKSB7XG5cdFx0XHRcdFx0Y2FtZXJhLmxvb2tBdCh0aGlzLmN1cnJlbnQuZm9jdXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRyb2xzLnRhcmdldC5jb3B5KHRoaXMuY3VycmVudC5mb2N1cyk7XG5cdFx0XHRcdFx0Y29udHJvbHMudXBkYXRlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHRcdGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJiAhKE1hdGguYWJzKHRoaXMuY3VycmVudC56b29tIC0gdGhpcy5nb2FsLnpvb20pIDwgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoIWlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpICYmICFlcXVhbHModGhpcy5jdXJyZW50LmNhbWVyYSwgdGhpcy5nb2FsLmNhbWVyYSwgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoY29udHJvbHMgJiYgIWVxdWFscyh0aGlzLmN1cnJlbnQuZm9jdXMsIHRoaXMuZ29hbC5mb2N1cywgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnQuYW5pbWF0aW5nID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|