angular-three-soba 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/abstractions/lib/catmull-rom-line.d.ts +139 -139
  2. package/abstractions/lib/edges.d.ts +164 -164
  3. package/abstractions/lib/grid.d.ts +39 -39
  4. package/abstractions/lib/line.d.ts +8 -7
  5. package/abstractions/lib/prism-geometry.d.ts +4 -4
  6. package/abstractions/lib/rounded-box.d.ts +3 -3
  7. package/abstractions/lib/text-3d.d.ts +46 -46
  8. package/abstractions/lib/text.d.ts +1 -2
  9. package/cameras/lib/cube-camera.d.ts +1 -1
  10. package/cameras/lib/orthographic-camera.d.ts +7 -8
  11. package/cameras/lib/perspective-camera.d.ts +2 -3
  12. package/controls/index.d.ts +9 -1
  13. package/controls/lib/camera-controls.d.ts +1 -1
  14. package/controls/lib/orbit-controls.d.ts +1 -1
  15. package/esm2022/abstractions/lib/billboard.mjs +3 -3
  16. package/esm2022/abstractions/lib/catmull-rom-line.mjs +3 -3
  17. package/esm2022/abstractions/lib/cubic-bezier-line.mjs +3 -3
  18. package/esm2022/abstractions/lib/edges.mjs +30 -34
  19. package/esm2022/abstractions/lib/gradient-texture.mjs +3 -3
  20. package/esm2022/abstractions/lib/grid.mjs +3 -3
  21. package/esm2022/abstractions/lib/helper.mjs +18 -20
  22. package/esm2022/abstractions/lib/line.mjs +25 -28
  23. package/esm2022/abstractions/lib/prism-geometry.mjs +3 -3
  24. package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +3 -3
  25. package/esm2022/abstractions/lib/rounded-box.mjs +11 -17
  26. package/esm2022/abstractions/lib/text-3d.mjs +14 -17
  27. package/esm2022/abstractions/lib/text.mjs +11 -16
  28. package/esm2022/cameras/lib/camera-content.mjs +3 -3
  29. package/esm2022/cameras/lib/cube-camera.mjs +18 -27
  30. package/esm2022/cameras/lib/orthographic-camera.mjs +20 -20
  31. package/esm2022/cameras/lib/perspective-camera.mjs +21 -21
  32. package/esm2022/controls/index.mjs +6 -2
  33. package/esm2022/controls/lib/camera-controls.mjs +3 -3
  34. package/esm2022/controls/lib/orbit-controls.mjs +3 -3
  35. package/esm2022/controls/lib/scroll-controls.mjs +124 -130
  36. package/esm2022/gizmos/angular-three-soba-gizmos.mjs +5 -0
  37. package/esm2022/gizmos/index.mjs +6 -0
  38. package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +187 -0
  39. package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +304 -0
  40. package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +332 -0
  41. package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +265 -0
  42. package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +264 -0
  43. package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +337 -0
  44. package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +266 -0
  45. package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +232 -0
  46. package/esm2022/gizmos/lib/transform-controls.mjs +177 -0
  47. package/esm2022/loaders/lib/loader.mjs +3 -3
  48. package/esm2022/materials/lib/custom-shader-material.mjs +8 -12
  49. package/esm2022/materials/lib/mesh-distort-material.mjs +3 -3
  50. package/esm2022/materials/lib/mesh-reflector-material.mjs +11 -15
  51. package/esm2022/materials/lib/mesh-refraction-material.mjs +26 -30
  52. package/esm2022/materials/lib/mesh-transmission-material.mjs +3 -3
  53. package/esm2022/materials/lib/mesh-wobble-material.mjs +3 -3
  54. package/esm2022/materials/lib/point-material.mjs +3 -3
  55. package/esm2022/misc/lib/bake-shadows.mjs +8 -10
  56. package/esm2022/misc/lib/computed-attribute.mjs +15 -19
  57. package/esm2022/misc/lib/decal.mjs +56 -53
  58. package/esm2022/misc/lib/fbo.mjs +10 -10
  59. package/esm2022/misc/lib/html/html-content.mjs +62 -67
  60. package/esm2022/misc/lib/html/html.mjs +3 -3
  61. package/esm2022/misc/lib/intersect.mjs +6 -9
  62. package/esm2022/misc/lib/sampler.mjs +48 -42
  63. package/esm2022/performances/lib/adaptive-dpr.mjs +29 -35
  64. package/esm2022/performances/lib/adaptive-events.mjs +12 -16
  65. package/esm2022/performances/lib/detailed.mjs +14 -18
  66. package/esm2022/performances/lib/instances/instances.mjs +16 -22
  67. package/esm2022/performances/lib/points/points.mjs +19 -25
  68. package/esm2022/performances/lib/segments/segments.mjs +11 -14
  69. package/esm2022/shaders/lib/mesh-refraction-material.mjs +1 -1
  70. package/esm2022/staging/index.mjs +3 -2
  71. package/esm2022/staging/lib/accumulative-shadows.mjs +19 -21
  72. package/esm2022/staging/lib/backdrop.mjs +19 -23
  73. package/esm2022/staging/lib/bb-anchor.mjs +3 -3
  74. package/esm2022/staging/lib/bounds.mjs +39 -43
  75. package/esm2022/staging/lib/camera-shake.mjs +14 -18
  76. package/esm2022/staging/lib/caustics.mjs +24 -28
  77. package/esm2022/staging/lib/center.mjs +28 -32
  78. package/esm2022/staging/lib/contact-shadows.mjs +3 -3
  79. package/esm2022/staging/lib/environment/environment.mjs +338 -0
  80. package/esm2022/staging/lib/environment/inject-environment.mjs +184 -0
  81. package/esm2022/staging/lib/float.mjs +3 -3
  82. package/esm2022/staging/lib/lightformer.mjs +18 -22
  83. package/esm2022/staging/lib/mask.mjs +8 -12
  84. package/esm2022/staging/lib/matcap-texture.mjs +9 -11
  85. package/esm2022/staging/lib/normal-texture.mjs +9 -11
  86. package/esm2022/staging/lib/randomized-lights.mjs +9 -13
  87. package/esm2022/staging/lib/render-texture.mjs +19 -20
  88. package/esm2022/staging/lib/sky.mjs +3 -3
  89. package/esm2022/staging/lib/spot-light.mjs +32 -40
  90. package/esm2022/staging/lib/stage.mjs +13 -17
  91. package/esm2022/stats/lib/stats.mjs +21 -27
  92. package/fesm2022/angular-three-soba-abstractions.mjs +119 -138
  93. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  94. package/fesm2022/angular-three-soba-cameras.mjs +57 -64
  95. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  96. package/fesm2022/angular-three-soba-controls.mjs +141 -1470
  97. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  98. package/fesm2022/angular-three-soba-gizmos.mjs +2318 -0
  99. package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -0
  100. package/fesm2022/angular-three-soba-loaders.mjs +3 -3
  101. package/fesm2022/angular-three-soba-materials.mjs +52 -62
  102. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  103. package/fesm2022/angular-three-soba-misc.mjs +194 -195
  104. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  105. package/fesm2022/angular-three-soba-performances.mjs +90 -114
  106. package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
  107. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  108. package/fesm2022/angular-three-soba-staging.mjs +427 -430
  109. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  110. package/fesm2022/angular-three-soba-stats.mjs +20 -26
  111. package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
  112. package/gizmos/README.md +3 -0
  113. package/gizmos/index.d.ts +5 -0
  114. package/gizmos/lib/gizmo-helper/gizmo-helper.d.ts +45 -0
  115. package/gizmos/lib/gizmo-helper/gizmo-viewcube.d.ts +74 -0
  116. package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +64 -0
  117. package/{controls → gizmos}/lib/pivot-controls/pivot-controls.d.ts +1 -1
  118. package/gizmos/lib/transform-controls.d.ts +50 -0
  119. package/materials/lib/mesh-transmission-material.d.ts +1 -1
  120. package/misc/lib/computed-attribute.d.ts +2 -2
  121. package/misc/lib/decal.d.ts +4 -4
  122. package/misc/lib/html/html-content.d.ts +6 -6
  123. package/misc/lib/html/html.d.ts +1 -1
  124. package/misc/lib/sampler.d.ts +1 -3
  125. package/package.json +14 -8
  126. package/performances/lib/instances/instances.d.ts +3 -3
  127. package/shaders/lib/mesh-refraction-material.d.ts +2 -5
  128. package/staging/index.d.ts +2 -1
  129. package/staging/lib/camera-shake.d.ts +0 -1
  130. package/staging/lib/caustics.d.ts +1 -1
  131. package/staging/lib/center.d.ts +2 -2
  132. package/staging/lib/contact-shadows.d.ts +1 -1
  133. package/staging/lib/{environment.d.ts → environment/environment.d.ts} +20 -49
  134. package/staging/lib/environment/inject-environment.d.ts +33 -0
  135. package/staging/lib/lightformer.d.ts +1 -1
  136. package/staging/lib/mask.d.ts +1 -1
  137. package/staging/lib/matcap-texture.d.ts +0 -1
  138. package/staging/lib/normal-texture.d.ts +0 -1
  139. package/staging/lib/render-texture.d.ts +1 -1
  140. package/staging/lib/sky.d.ts +1 -1
  141. package/staging/lib/stage.d.ts +3 -2
  142. package/esm2022/controls/lib/pivot-controls/axis-arrow.mjs +0 -263
  143. package/esm2022/controls/lib/pivot-controls/axis-rotator.mjs +0 -264
  144. package/esm2022/controls/lib/pivot-controls/pivot-controls.mjs +0 -340
  145. package/esm2022/controls/lib/pivot-controls/plane-slider.mjs +0 -266
  146. package/esm2022/controls/lib/pivot-controls/scaling-sphere.mjs +0 -232
  147. package/esm2022/staging/lib/environment.mjs +0 -481
  148. /package/{controls → gizmos}/lib/pivot-controls/axis-arrow.d.ts +0 -0
  149. /package/{controls → gizmos}/lib/pivot-controls/axis-rotator.d.ts +0 -0
  150. /package/{controls → gizmos}/lib/pivot-controls/plane-slider.d.ts +0 -0
  151. /package/{controls → gizmos}/lib/pivot-controls/scaling-sphere.d.ts +0 -0
@@ -1,30 +1,7 @@
1
- import { ElementRef, Injector, TemplateRef } from '@angular/core';
2
- import { TextureEncoding } from 'angular-three-soba/misc';
3
- import { CubeCamera, CubeTexture, Euler, Loader, Scene, Texture, WebGLCubeRenderTarget } from 'three';
1
+ import { ElementRef, TemplateRef } from '@angular/core';
2
+ import { Euler, Scene, Texture, WebGLCubeRenderTarget } from 'three';
3
+ import { NgtsEnvironmentPresets, NgtsInjectEnvironmentOptions } from './inject-environment';
4
4
  import * as i0 from "@angular/core";
5
- export declare const ENVIRONMENT_PRESETS: {
6
- apartment: string;
7
- city: string;
8
- dawn: string;
9
- forest: string;
10
- lobby: string;
11
- night: string;
12
- park: string;
13
- studio: string;
14
- sunset: string;
15
- warehouse: string;
16
- };
17
- export type NgtsEnvironmentPresets = keyof typeof ENVIRONMENT_PRESETS;
18
- export interface NgtsInjectEnvironmentOptions {
19
- files: string | string[];
20
- path: string;
21
- preset?: NgtsEnvironmentPresets;
22
- extensions?: (loader: Loader) => void;
23
- encoding?: TextureEncoding;
24
- }
25
- export declare function injectEnvironment(options?: () => Partial<NgtsInjectEnvironmentOptions>, { injector }?: {
26
- injector?: Injector;
27
- }): import("@angular/core").Signal<Texture | CubeTexture | null>;
28
5
  export interface NgtsEnvironmentOptions extends Partial<NgtsInjectEnvironmentOptions> {
29
6
  frames?: number;
30
7
  near?: number;
@@ -50,11 +27,6 @@ export interface NgtsEnvironmentOptions extends Partial<NgtsInjectEnvironmentOpt
50
27
  export declare class NgtsEnvironmentMap {
51
28
  options: import("@angular/core").InputSignalWithTransform<NgtsEnvironmentOptions, "" | Partial<NgtsEnvironmentOptions>>;
52
29
  envSet: import("@angular/core").OutputEmitterRef<void>;
53
- private autoEffect;
54
- private store;
55
- private defaultScene;
56
- private envConfig;
57
- private map;
58
30
  constructor();
59
31
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtsEnvironmentMap, never>;
60
32
  static ɵdir: i0.ɵɵDirectiveDeclaration<NgtsEnvironmentMap, "ngts-environment-map", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; }, { "envSet": "envSet"; }, never, never, true, never>;
@@ -62,10 +34,8 @@ export declare class NgtsEnvironmentMap {
62
34
  export declare class NgtsEnvironmentCube {
63
35
  options: import("@angular/core").InputSignalWithTransform<NgtsEnvironmentOptions, "" | Partial<NgtsEnvironmentOptions>>;
64
36
  envSet: import("@angular/core").OutputEmitterRef<void>;
65
- private autoEffect;
66
37
  private store;
67
38
  private defaultScene;
68
- private injector;
69
39
  private envConfig;
70
40
  constructor();
71
41
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtsEnvironmentCube, never>;
@@ -76,34 +46,34 @@ export declare class NgtsEnvironmentPortal {
76
46
  options: import("@angular/core").InputSignalWithTransform<NgtsEnvironmentOptions, "" | Partial<NgtsEnvironmentOptions>>;
77
47
  content: import("@angular/core").InputSignal<TemplateRef<unknown>>;
78
48
  envSet: import("@angular/core").OutputEmitterRef<void>;
79
- private autoEffect;
49
+ private injector;
80
50
  private store;
81
51
  private defaultScene;
82
52
  private gl;
83
- cameraRef: import("@angular/core").Signal<ElementRef<CubeCamera> | undefined>;
84
- map: import("@angular/core").Signal<Texture | undefined>;
85
- files: import("@angular/core").Signal<string | string[] | undefined>;
86
- preset: import("@angular/core").Signal<"apartment" | "city" | "dawn" | "forest" | "lobby" | "night" | "park" | "studio" | "sunset" | "warehouse" | undefined>;
53
+ private cameraRef;
54
+ protected map: import("@angular/core").Signal<Texture | undefined>;
55
+ protected files: import("@angular/core").Signal<string | string[] | undefined>;
56
+ protected preset: import("@angular/core").Signal<"apartment" | "city" | "dawn" | "forest" | "lobby" | "night" | "park" | "studio" | "sunset" | "warehouse" | undefined>;
87
57
  private extensions;
88
58
  private path;
89
- envMapOptions: import("@angular/core").Signal<{
59
+ protected envMapOptions: import("@angular/core").Signal<{
90
60
  background: boolean;
91
61
  map: Texture | undefined;
92
- extensions: ((loader: Loader) => void) | undefined;
62
+ extensions: ((loader: import("three").Loader) => void) | undefined;
93
63
  }>;
94
- envCubeOptions: import("@angular/core").Signal<{
64
+ protected envCubeOptions: import("@angular/core").Signal<{
95
65
  background: boolean;
96
66
  files: string | string[] | undefined;
97
67
  preset: "apartment" | "city" | "dawn" | "forest" | "lobby" | "night" | "park" | "studio" | "sunset" | "warehouse" | undefined;
98
- extensions: ((loader: Loader) => void) | undefined;
68
+ extensions: ((loader: import("three").Loader) => void) | undefined;
99
69
  path: string | undefined;
100
70
  }>;
101
71
  private near;
102
72
  private far;
103
73
  private resolution;
104
74
  private fbo;
105
- cameraArgs: import("@angular/core").Signal<(number | WebGLCubeRenderTarget | undefined)[]>;
106
- virtualScene: import("angular-three").NgtInstanceNode<Scene>;
75
+ protected cameraArgs: import("@angular/core").Signal<(number | WebGLCubeRenderTarget | undefined)[]>;
76
+ protected virtualScene: import("angular-three").NgtInstanceNode<Scene>;
107
77
  private setEnvEffectRef?;
108
78
  constructor();
109
79
  onEnvSet(): void;
@@ -114,11 +84,12 @@ export declare class NgtsEnvironmentPortal {
114
84
  export declare class NgtsEnvironmentGround {
115
85
  options: import("@angular/core").InputSignal<NgtsEnvironmentOptions>;
116
86
  envSet: import("@angular/core").OutputEmitterRef<void>;
117
- args: import("@angular/core").WritableSignal<[Texture | null]>;
118
- height: import("@angular/core").Signal<any>;
119
- radius: import("@angular/core").Signal<any>;
120
- scale: import("@angular/core").Signal<any>;
121
- envMapOptions: import("@angular/core").Signal<NgtsEnvironmentOptions>;
87
+ private defaultTexture;
88
+ protected height: import("@angular/core").Signal<any>;
89
+ protected radius: import("@angular/core").Signal<any>;
90
+ protected scale: import("@angular/core").Signal<any>;
91
+ protected args: import("@angular/core").Signal<(Texture | null)[]>;
92
+ protected envMapOptions: import("@angular/core").Signal<NgtsEnvironmentOptions>;
122
93
  constructor();
123
94
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtsEnvironmentGround, never>;
124
95
  static ɵcmp: i0.ɵɵComponentDeclaration<NgtsEnvironmentGround, "ngts-environment-ground", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; }, { "envSet": "envSet"; }, never, never, true, never>;
@@ -0,0 +1,33 @@
1
+ import { Injector } from '@angular/core';
2
+ import { TextureEncoding } from 'angular-three-soba/misc';
3
+ import { CubeTexture, Loader, Texture } from 'three';
4
+ export declare const ENVIRONMENT_PRESETS: {
5
+ apartment: string;
6
+ city: string;
7
+ dawn: string;
8
+ forest: string;
9
+ lobby: string;
10
+ night: string;
11
+ park: string;
12
+ studio: string;
13
+ sunset: string;
14
+ warehouse: string;
15
+ };
16
+ export type NgtsEnvironmentPresets = keyof typeof ENVIRONMENT_PRESETS;
17
+ export interface NgtsInjectEnvironmentOptions {
18
+ files: string | string[];
19
+ path: string;
20
+ preset?: NgtsEnvironmentPresets;
21
+ extensions?: (loader: Loader) => void;
22
+ encoding?: TextureEncoding;
23
+ }
24
+ export declare function injectEnvironment(options?: () => Partial<NgtsInjectEnvironmentOptions>, { injector }?: {
25
+ injector?: Injector;
26
+ }): import("@angular/core").Signal<Texture | CubeTexture | null>;
27
+ export declare namespace injectEnvironment {
28
+ var preload: (options?: () => Partial<NgtsInjectEnvironmentOptions>) => void;
29
+ var clear: (clearOptions: {
30
+ files?: string | string[];
31
+ preset?: NgtsEnvironmentPresets;
32
+ }) => void;
33
+ }
@@ -293,7 +293,7 @@ export declare class NgtsLightformer {
293
293
  layers: import("angular-three").NgtLayers;
294
294
  dispose: (() => void) | null;
295
295
  raycast: import("three").Object3D["raycast"] | null;
296
- }, "scale">> & NgtsLightformerOptions, "scale" | "color" | "toneMapped" | "map" | "target" | "intensity" | "form">>;
296
+ }, "scale">> & NgtsLightformerOptions, "scale" | "color" | "toneMapped" | "map" | "intensity" | "target" | "form">>;
297
297
  private intensity;
298
298
  private color;
299
299
  private target;
@@ -9,7 +9,7 @@ export interface NgtsMaskOptions extends Partial<NgtMesh> {
9
9
  export declare class NgtsMask {
10
10
  id: import("@angular/core").InputSignalWithTransform<number, unknown>;
11
11
  options: import("@angular/core").InputSignalWithTransform<NgtsMaskOptions, "" | Partial<NgtsMaskOptions>>;
12
- parameters: import("@angular/core").Signal<Omit<NgtsMaskOptions, "colorWrite" | "depthWrite">>;
12
+ parameters: import("@angular/core").Signal<Omit<NgtsMaskOptions, "depthWrite" | "colorWrite">>;
13
13
  meshRef: import("@angular/core").Signal<ElementRef<Mesh<BufferGeometry<import("three").NormalBufferAttributes>, Material, import("three").Object3DEventMap>>>;
14
14
  private colorWrite;
15
15
  private depthWrite;
@@ -17,7 +17,6 @@ export interface NgtsMatcapTextureOptions {
17
17
  export declare class NgtsMatcapTexture {
18
18
  matcapTexture: import("@angular/core").InputSignal<NgtsMatcapTextureOptions | undefined>;
19
19
  matcapTextureLoaded: import("@angular/core").OutputEmitterRef<Texture[]>;
20
- private injector;
21
20
  private template;
22
21
  private vcr;
23
22
  private id;
@@ -21,7 +21,6 @@ export interface NgtsNormalTextureOptions extends NgtsNormalTextureSettings {
21
21
  export declare class NgtsNormalTexture {
22
22
  normalTexture: import("@angular/core").InputSignal<NgtsNormalTextureOptions | undefined>;
23
23
  normalTextureLoaded: import("@angular/core").OutputEmitterRef<Texture[]>;
24
- private injector;
25
24
  private template;
26
25
  private vcr;
27
26
  private id;
@@ -45,7 +45,7 @@ export declare class NgtsRenderTextureContent {
45
45
  export declare class NgtsRenderTexture {
46
46
  attach: import("@angular/core").InputSignal<NgtAttachable>;
47
47
  options: import("@angular/core").InputSignalWithTransform<NgtsRenderTextureOptions, "" | Partial<NgtsRenderTextureOptions>>;
48
- parameters: import("@angular/core").Signal<Omit<NgtsRenderTextureOptions, "frames" | "width" | "height" | "depthBuffer" | "stencilBuffer" | "samples" | "generateMipmaps" | "renderPriority" | "eventPriority" | "compute">>;
48
+ parameters: import("@angular/core").Signal<Omit<NgtsRenderTextureOptions, "frames" | "width" | "height" | "generateMipmaps" | "samples" | "renderPriority" | "eventPriority" | "stencilBuffer" | "depthBuffer" | "compute">>;
49
49
  content: import("@angular/core").Signal<TemplateRef<any>>;
50
50
  private store;
51
51
  private size;
@@ -15,7 +15,7 @@ export interface NgtsSkyOptions extends Partial<Omit<NgtMesh, 'scale'>> {
15
15
  }
16
16
  export declare class NgtsSky {
17
17
  options: import("@angular/core").InputSignalWithTransform<NgtsSkyOptions, "" | Partial<NgtsSkyOptions>>;
18
- parameters: import("@angular/core").Signal<Omit<NgtsSkyOptions, "distance" | "inclination" | "azimuth" | "sunPosition" | "turbidity" | "mieCoefficient" | "mieDirectionalG">>;
18
+ parameters: import("@angular/core").Signal<Omit<NgtsSkyOptions, "distance" | "inclination" | "azimuth" | "mieCoefficient" | "mieDirectionalG" | "turbidity" | "sunPosition">>;
19
19
  distance: import("@angular/core").Signal<number>;
20
20
  turbidity: import("@angular/core").Signal<number>;
21
21
  mieCoefficient: import("@angular/core").Signal<number>;
@@ -3,7 +3,8 @@ import { Group } from 'three';
3
3
  import { NgtsAccumulativeShadowsOptions } from './accumulative-shadows';
4
4
  import { NgtsCenterOptions, NgtsCenterState } from './center';
5
5
  import { NgtsContactShadowsOptions } from './contact-shadows';
6
- import { NgtsEnvironmentOptions, NgtsEnvironmentPresets } from './environment';
6
+ import { NgtsEnvironmentOptions } from './environment/environment';
7
+ import { NgtsEnvironmentPresets } from './environment/inject-environment';
7
8
  import { NgtsRandomizedLightsOptions } from './randomized-lights';
8
9
  import * as i0 from "@angular/core";
9
10
  type NgtsStageShadowsOptions = Partial<NgtsAccumulativeShadowsOptions> & Partial<NgtsRandomizedLightsOptions> & Partial<NgtsContactShadowsOptions> & {
@@ -53,7 +54,7 @@ export declare class NgtsStage {
53
54
  margin: import("@angular/core").Signal<number>;
54
55
  intensity: import("@angular/core").Signal<number>;
55
56
  shadows: import("@angular/core").Signal<boolean | "contact" | "accumulative" | NgtsStageShadowsOptions>;
56
- environment: import("@angular/core").Signal<Partial<NgtsEnvironmentOptions> | "apartment" | "city" | "dawn" | "forest" | "lobby" | "night" | "park" | "studio" | "sunset" | "warehouse" | null>;
57
+ environment: import("@angular/core").Signal<"apartment" | "city" | "dawn" | "forest" | "lobby" | "night" | "park" | "studio" | "sunset" | "warehouse" | Partial<NgtsEnvironmentOptions> | null>;
57
58
  preset: import("@angular/core").Signal<"rembrandt" | "portrait" | "upfront" | "soft" | {
58
59
  main: [x: number, y: number, z: number];
59
60
  fill: [x: number, y: number, z: number];
@@ -1,263 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, ElementRef, inject, input, signal, viewChild, } from '@angular/core';
2
- import { extend, injectStore, NgtArgs } from 'angular-three';
3
- import { NgtsLine } from 'angular-three-soba/abstractions';
4
- import { NgtsHTML, NgtsHTMLContent } from 'angular-three-soba/misc';
5
- import { ConeGeometry, CylinderGeometry, DoubleSide, Group, Matrix4, Mesh, MeshBasicMaterial, Quaternion, Vector3, } from 'three';
6
- import { NgtsPivotControls } from './pivot-controls';
7
- import * as i0 from "@angular/core";
8
- const vec1 = new Vector3();
9
- const vec2 = new Vector3();
10
- export function calculateOffset(clickPoint, normal, rayStart, rayDir) {
11
- const e1 = normal.dot(normal);
12
- const e2 = normal.dot(clickPoint) - normal.dot(rayStart);
13
- const e3 = normal.dot(rayDir);
14
- if (e3 === 0) {
15
- return -e2 / e1;
16
- }
17
- vec1
18
- .copy(rayDir)
19
- .multiplyScalar(e1 / e3)
20
- .sub(normal);
21
- vec2
22
- .copy(rayDir)
23
- .multiplyScalar(e2 / e3)
24
- .add(rayStart)
25
- .sub(clickPoint);
26
- return -vec1.dot(vec2) / vec1.dot(vec1);
27
- }
28
- const upV = new Vector3(0, 1, 0);
29
- const offsetMatrix = new Matrix4();
30
- export class NgtsAxisArrow {
31
- constructor() {
32
- this.DoubleSide = DoubleSide;
33
- this.direction = input.required();
34
- this.axis = input.required();
35
- this.groupRef = viewChild.required('group');
36
- this.annotationRef = viewChild('annotation', { read: ElementRef });
37
- this.pivotControls = inject(NgtsPivotControls);
38
- this.store = injectStore();
39
- this.controls = this.store.select('controls');
40
- this.hovered = signal(false);
41
- this.clickInfo = null;
42
- this.offset0 = 0;
43
- this.color = computed(() => this.hovered() ? this.pivotControls.hoveredColor() : this.pivotControls.axisColors()[this.axis()]);
44
- this.coneWidth = computed(() => this.pivotControls.fixed()
45
- ? (this.pivotControls.lineWidth() / this.pivotControls.scale()) * 1.6
46
- : this.pivotControls.scale() / 20);
47
- this.coneLength = computed(() => (this.pivotControls.fixed() ? 0.2 : this.pivotControls.scale() / 5));
48
- this.cylinderLength = computed(() => this.pivotControls.fixed() ? 1 - this.coneLength() : this.pivotControls.scale() - this.coneLength());
49
- this.matrixL = computed(() => {
50
- const quaternion = new Quaternion().setFromUnitVectors(upV, this.direction().clone().normalize());
51
- return new Matrix4().makeRotationFromQuaternion(quaternion);
52
- });
53
- extend({ Group, Mesh, ConeGeometry, CylinderGeometry, MeshBasicMaterial });
54
- }
55
- onPointerDown(event) {
56
- const [group, direction, axis, controls, annotation] = [
57
- this.groupRef().nativeElement,
58
- this.direction(),
59
- this.axis(),
60
- this.controls(),
61
- this.annotationRef()?.nativeElement,
62
- ];
63
- if (annotation) {
64
- annotation.innerText = `${this.pivotControls.translation[axis].toFixed(2)}`;
65
- annotation.style.display = 'block';
66
- }
67
- event.stopPropagation();
68
- const rotation = new Matrix4().extractRotation(group.matrixWorld);
69
- const origin = new Vector3().setFromMatrixPosition(group.matrixWorld);
70
- const clickPoint = event.point.clone();
71
- const dir = direction.clone().applyMatrix4(rotation).normalize();
72
- this.clickInfo = { clickPoint, dir };
73
- this.offset0 = this.pivotControls.translation[axis];
74
- this.pivotControls.onDragStart({ component: 'Arrow', axis, origin, directions: [dir] });
75
- if (controls) {
76
- controls.enabled = false;
77
- }
78
- // @ts-expect-error - setPointerCapture is not in the type definition
79
- event.target.setPointerCapture(event.pointerId);
80
- }
81
- onPointerUp(event) {
82
- const [annotation, controls] = [this.annotationRef()?.nativeElement, this.controls()];
83
- if (annotation) {
84
- annotation.style.display = 'none';
85
- }
86
- event.stopPropagation();
87
- this.clickInfo = null;
88
- this.pivotControls.onDragEnd();
89
- if (controls) {
90
- controls.enabled = true;
91
- }
92
- // @ts-expect-error - setPointerCapture is not in the type definition
93
- event.target.releasePointerCapture(event.pointerId);
94
- }
95
- onPointerMove(event) {
96
- event.stopPropagation();
97
- if (!this.hovered()) {
98
- this.hovered.set(true);
99
- }
100
- if (this.clickInfo) {
101
- const { clickPoint, dir } = this.clickInfo;
102
- const [translationLimits, annotation, axis] = [
103
- this.pivotControls.translationLimits(),
104
- this.annotationRef()?.nativeElement,
105
- this.axis(),
106
- ];
107
- const [min, max] = translationLimits?.[axis] || [undefined, undefined];
108
- let offset = calculateOffset(clickPoint, dir, event.ray.origin, event.ray.direction);
109
- if (min !== undefined) {
110
- offset = Math.max(offset, min - this.offset0);
111
- }
112
- if (max !== undefined) {
113
- offset = Math.min(offset, max - this.offset0);
114
- }
115
- this.pivotControls.translation[axis] = this.offset0 + offset;
116
- if (annotation) {
117
- annotation.innerText = `${this.pivotControls.translation[axis].toFixed(2)}`;
118
- }
119
- offsetMatrix.makeTranslation(dir.x * offset, dir.y * offset, dir.z * offset);
120
- this.pivotControls.onDrag(offsetMatrix);
121
- }
122
- }
123
- onPointerOut(event) {
124
- event.stopPropagation();
125
- this.hovered.set(false);
126
- }
127
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisArrow, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
128
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsAxisArrow, isStandalone: true, selector: "ngts-axis-arrow", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: true, transformFunction: null }, axis: { classPropertyName: "axis", publicName: "axis", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "annotationRef", first: true, predicate: ["annotation"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
129
- <ngt-group #group>
130
- <ngt-group
131
- [matrix]="matrixL()"
132
- [matrixAutoUpdate]="false"
133
- (pointerdown)="onPointerDown($any($event))"
134
- (pointerup)="onPointerUp($any($event))"
135
- (pointermove)="onPointerMove($any($event))"
136
- (pointerout)="onPointerOut($any($event))"
137
- >
138
- @if (pivotControls.annotations()) {
139
- <ngts-html [options]="{ position: [0, -coneLength(), 0] }">
140
- <div
141
- #annotation
142
- ngtsHTMLContent
143
- style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap;"
144
- [class]="pivotControls.annotationsClass()"
145
- ></div>
146
- </ngts-html>
147
- }
148
- <ngt-mesh
149
- [visible]="false"
150
- [position]="[0, (cylinderLength() + coneLength()) / 2.0, 0]"
151
- [userData]="pivotControls.userData()"
152
- >
153
- <ngt-cylinder-geometry
154
- *args="[coneWidth() * 1.4, coneWidth() * 1.4, cylinderLength() + coneLength(), 8, 1]"
155
- />
156
- </ngt-mesh>
157
-
158
- <ngts-line
159
- [points]="[0, 0, 0, 0, cylinderLength(), 0]"
160
- [options]="{
161
- raycast: null,
162
- side: DoubleSide,
163
- polygonOffset: true,
164
- polygonOffsetFactor: -10,
165
- renderOrder: 1,
166
- fog: false,
167
- transparent: true,
168
- lineWidth: pivotControls.lineWidth(),
169
- color: color(),
170
- opacity: pivotControls.opacity(),
171
- depthTest: pivotControls.depthTest(),
172
- }"
173
- />
174
-
175
- <ngt-mesh [raycast]="null" [position]="[0, cylinderLength() + coneLength() / 2.0, 0]" [renderOrder]="500">
176
- <ngt-cone-geometry *args="[coneWidth(), coneLength(), 24, 1]" />
177
- <ngt-mesh-basic-material
178
- [transparent]="true"
179
- [depthTest]="pivotControls.depthTest()"
180
- [color]="color()"
181
- [opacity]="pivotControls.opacity()"
182
- [polygonOffset]="true"
183
- [polygonOffsetFactor]="-10"
184
- [fog]="false"
185
- />
186
- </ngt-mesh>
187
- </ngt-group>
188
- </ngt-group>
189
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtsLine, selector: "ngts-line", inputs: ["points", "options"] }, { kind: "component", type: NgtsHTML, selector: "ngts-html", inputs: ["options"] }, { kind: "component", type: NgtsHTMLContent, selector: "[ngtsHTMLContent]", inputs: ["ngtsHTMLContent"], outputs: ["occluded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
190
- }
191
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisArrow, decorators: [{
192
- type: Component,
193
- args: [{
194
- selector: 'ngts-axis-arrow',
195
- standalone: true,
196
- template: `
197
- <ngt-group #group>
198
- <ngt-group
199
- [matrix]="matrixL()"
200
- [matrixAutoUpdate]="false"
201
- (pointerdown)="onPointerDown($any($event))"
202
- (pointerup)="onPointerUp($any($event))"
203
- (pointermove)="onPointerMove($any($event))"
204
- (pointerout)="onPointerOut($any($event))"
205
- >
206
- @if (pivotControls.annotations()) {
207
- <ngts-html [options]="{ position: [0, -coneLength(), 0] }">
208
- <div
209
- #annotation
210
- ngtsHTMLContent
211
- style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap;"
212
- [class]="pivotControls.annotationsClass()"
213
- ></div>
214
- </ngts-html>
215
- }
216
- <ngt-mesh
217
- [visible]="false"
218
- [position]="[0, (cylinderLength() + coneLength()) / 2.0, 0]"
219
- [userData]="pivotControls.userData()"
220
- >
221
- <ngt-cylinder-geometry
222
- *args="[coneWidth() * 1.4, coneWidth() * 1.4, cylinderLength() + coneLength(), 8, 1]"
223
- />
224
- </ngt-mesh>
225
-
226
- <ngts-line
227
- [points]="[0, 0, 0, 0, cylinderLength(), 0]"
228
- [options]="{
229
- raycast: null,
230
- side: DoubleSide,
231
- polygonOffset: true,
232
- polygonOffsetFactor: -10,
233
- renderOrder: 1,
234
- fog: false,
235
- transparent: true,
236
- lineWidth: pivotControls.lineWidth(),
237
- color: color(),
238
- opacity: pivotControls.opacity(),
239
- depthTest: pivotControls.depthTest(),
240
- }"
241
- />
242
-
243
- <ngt-mesh [raycast]="null" [position]="[0, cylinderLength() + coneLength() / 2.0, 0]" [renderOrder]="500">
244
- <ngt-cone-geometry *args="[coneWidth(), coneLength(), 24, 1]" />
245
- <ngt-mesh-basic-material
246
- [transparent]="true"
247
- [depthTest]="pivotControls.depthTest()"
248
- [color]="color()"
249
- [opacity]="pivotControls.opacity()"
250
- [polygonOffset]="true"
251
- [polygonOffsetFactor]="-10"
252
- [fog]="false"
253
- />
254
- </ngt-mesh>
255
- </ngt-group>
256
- </ngt-group>
257
- `,
258
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
259
- changeDetection: ChangeDetectionStrategy.OnPush,
260
- imports: [NgtArgs, NgtsLine, NgtsHTML, NgtsHTMLContent],
261
- }]
262
- }], ctorParameters: () => [] });
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy1hcnJvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9jb250cm9scy9zcmMvbGliL3Bpdm90LWNvbnRyb2xzL2F4aXMtYXJyb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUNOLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLEtBQUssRUFDTCxPQUFPLEVBQ1AsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsT0FBTyxHQUNQLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBRXJELE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUUzQixNQUFNLFVBQVUsZUFBZSxDQUFDLFVBQW1CLEVBQUUsTUFBZSxFQUFFLFFBQWlCLEVBQUUsTUFBZTtJQUN2RyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxR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R1MsT0FBTyxnRkFBRSxRQUFRLHFGQUFFLFFBQVEsMkVBQUUsZUFBZTs7MkZBRTFDLGFBQWE7a0JBckV6QixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE2RFQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUM7aUJBQ3ZEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdHNpZ25hbCxcblx0U2lnbmFsLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpbmplY3RTdG9yZSwgTmd0QXJncywgTmd0VGhyZWVFdmVudCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTmd0c0xpbmUgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvYWJzdHJhY3Rpb25zJztcbmltcG9ydCB7IE5ndHNIVE1MLCBOZ3RzSFRNTENvbnRlbnQgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvbWlzYyc7XG5pbXBvcnQge1xuXHRDb25lR2VvbWV0cnksXG5cdEN5bGluZGVyR2VvbWV0cnksXG5cdERvdWJsZVNpZGUsXG5cdEdyb3VwLFxuXHRNYXRyaXg0LFxuXHRNZXNoLFxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcblx0UXVhdGVybmlvbixcblx0VmVjdG9yMyxcbn0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0c1Bpdm90Q29udHJvbHMgfSBmcm9tICcuL3Bpdm90LWNvbnRyb2xzJztcblxuY29uc3QgdmVjMSA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCB2ZWMyID0gbmV3IFZlY3RvcjMoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChjbGlja1BvaW50OiBWZWN0b3IzLCBub3JtYWw6IFZlY3RvcjMsIHJheVN0YXJ0OiBWZWN0b3IzLCByYXlEaXI6IFZlY3RvcjMpIHtcblx0Y29uc3QgZTEgPSBub3JtYWwuZG90KG5vcm1hbCk7XG5cdGNvbnN0IGUyID0gbm9ybWFsLmRvdChjbGlja1BvaW50KSAtIG5vcm1hbC5kb3QocmF5U3RhcnQpO1xuXHRjb25zdCBlMyA9IG5vcm1hbC5kb3QocmF5RGlyKTtcblxuXHRpZiAoZTMgPT09IDApIHtcblx0XHRyZXR1cm4gLWUyIC8gZTE7XG5cdH1cblxuXHR2ZWMxXG5cdFx0LmNvcHkocmF5RGlyKVxuXHRcdC5tdWx0aXBseVNjYWxhcihlMSAvIGUzKVxuXHRcdC5zdWIobm9ybWFsKTtcblx0dmVjMlxuXHRcdC5jb3B5KHJheURpcilcblx0XHQubXVsdGlwbHlTY2FsYXIoZTIgLyBlMylcblx0XHQuYWRkKHJheVN0YXJ0KVxuXHRcdC5zdWIoY2xpY2tQb2ludCk7XG5cblx0cmV0dXJuIC12ZWMxLmRvdCh2ZWMyKSAvIHZlYzEuZG90KHZlYzEpO1xufVxuXG5jb25zdCB1cFYgPSBuZXcgVmVjdG9yMygwLCAxLCAwKTtcbmNvbnN0IG9mZnNldE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtYXhpcy1hcnJvdycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cCAjZ3JvdXA+XG5cdFx0XHQ8bmd0LWdyb3VwXG5cdFx0XHRcdFttYXRyaXhdPVwibWF0cml4TCgpXCJcblx0XHRcdFx0W21hdHJpeEF1dG9VcGRhdGVdPVwiZmFsc2VcIlxuXHRcdFx0XHQocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkYW55KCRldmVudCkpXCJcblx0XHRcdFx0KHBvaW50ZXJ1cCk9XCJvblBvaW50ZXJVcCgkYW55KCRldmVudCkpXCJcblx0XHRcdFx0KHBvaW50ZXJtb3ZlKT1cIm9uUG9pbnRlck1vdmUoJGFueSgkZXZlbnQpKVwiXG5cdFx0XHRcdChwb2ludGVyb3V0KT1cIm9uUG9pbnRlck91dCgkYW55KCRldmVudCkpXCJcblx0XHRcdD5cblx0XHRcdFx0QGlmIChwaXZvdENvbnRyb2xzLmFubm90YXRpb25zKCkpIHtcblx0XHRcdFx0XHQ8bmd0cy1odG1sIFtvcHRpb25zXT1cInsgcG9zaXRpb246IFswLCAtY29uZUxlbmd0aCgpLCAwXSB9XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdCNhbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRcdG5ndHNIVE1MQ29udGVudFxuXHRcdFx0XHRcdFx0XHRzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGJhY2tncm91bmQ6ICMxNTE1MjA7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNnB4IDhweDsgYm9yZGVyLXJhZGl1czogN3B4OyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiXG5cdFx0XHRcdFx0XHRcdFtjbGFzc109XCJwaXZvdENvbnRyb2xzLmFubm90YXRpb25zQ2xhc3MoKVwiXG5cdFx0XHRcdFx0XHQ+PC9kaXY+XG5cdFx0XHRcdFx0PC9uZ3RzLWh0bWw+XG5cdFx0XHRcdH1cblx0XHRcdFx0PG5ndC1tZXNoXG5cdFx0XHRcdFx0W3Zpc2libGVdPVwiZmFsc2VcIlxuXHRcdFx0XHRcdFtwb3NpdGlvbl09XCJbMCwgKGN5bGluZGVyTGVuZ3RoKCkgKyBjb25lTGVuZ3RoKCkpIC8gMi4wLCAwXVwiXG5cdFx0XHRcdFx0W3VzZXJEYXRhXT1cInBpdm90Q29udHJvbHMudXNlckRhdGEoKVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8bmd0LWN5bGluZGVyLWdlb21ldHJ5XG5cdFx0XHRcdFx0XHQqYXJncz1cIltjb25lV2lkdGgoKSAqIDEuNCwgY29uZVdpZHRoKCkgKiAxLjQsIGN5bGluZGVyTGVuZ3RoKCkgKyBjb25lTGVuZ3RoKCksIDgsIDFdXCJcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L25ndC1tZXNoPlxuXG5cdFx0XHRcdDxuZ3RzLWxpbmVcblx0XHRcdFx0XHRbcG9pbnRzXT1cIlswLCAwLCAwLCAwLCBjeWxpbmRlckxlbmd0aCgpLCAwXVwiXG5cdFx0XHRcdFx0W29wdGlvbnNdPVwie1xuXHRcdFx0XHRcdFx0cmF5Y2FzdDogbnVsbCxcblx0XHRcdFx0XHRcdHNpZGU6IERvdWJsZVNpZGUsXG5cdFx0XHRcdFx0XHRwb2x5Z29uT2Zmc2V0OiB0cnVlLFxuXHRcdFx0XHRcdFx0cG9seWdvbk9mZnNldEZhY3RvcjogLTEwLFxuXHRcdFx0XHRcdFx0cmVuZGVyT3JkZXI6IDEsXG5cdFx0XHRcdFx0XHRmb2c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dHJhbnNwYXJlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHRsaW5lV2lkdGg6IHBpdm90Q29udHJvbHMubGluZVdpZHRoKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3IoKSxcblx0XHRcdFx0XHRcdG9wYWNpdHk6IHBpdm90Q29udHJvbHMub3BhY2l0eSgpLFxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiBwaXZvdENvbnRyb2xzLmRlcHRoVGVzdCgpLFxuXHRcdFx0XHRcdH1cIlxuXHRcdFx0XHQvPlxuXG5cdFx0XHRcdDxuZ3QtbWVzaCBbcmF5Y2FzdF09XCJudWxsXCIgW3Bvc2l0aW9uXT1cIlswLCBjeWxpbmRlckxlbmd0aCgpICsgY29uZUxlbmd0aCgpIC8gMi4wLCAwXVwiIFtyZW5kZXJPcmRlcl09XCI1MDBcIj5cblx0XHRcdFx0XHQ8bmd0LWNvbmUtZ2VvbWV0cnkgKmFyZ3M9XCJbY29uZVdpZHRoKCksIGNvbmVMZW5ndGgoKSwgMjQsIDFdXCIgLz5cblx0XHRcdFx0XHQ8bmd0LW1lc2gtYmFzaWMtbWF0ZXJpYWxcblx0XHRcdFx0XHRcdFt0cmFuc3BhcmVudF09XCJ0cnVlXCJcblx0XHRcdFx0XHRcdFtkZXB0aFRlc3RdPVwicGl2b3RDb250cm9scy5kZXB0aFRlc3QoKVwiXG5cdFx0XHRcdFx0XHRbY29sb3JdPVwiY29sb3IoKVwiXG5cdFx0XHRcdFx0XHRbb3BhY2l0eV09XCJwaXZvdENvbnRyb2xzLm9wYWNpdHkoKVwiXG5cdFx0XHRcdFx0XHRbcG9seWdvbk9mZnNldF09XCJ0cnVlXCJcblx0XHRcdFx0XHRcdFtwb2x5Z29uT2Zmc2V0RmFjdG9yXT1cIi0xMFwiXG5cdFx0XHRcdFx0XHRbZm9nXT1cImZhbHNlXCJcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L25ndC1tZXNoPlxuXHRcdFx0PC9uZ3QtZ3JvdXA+XG5cdFx0PC9uZ3QtZ3JvdXA+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzLCBOZ3RzTGluZSwgTmd0c0hUTUwsIE5ndHNIVE1MQ29udGVudF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNBeGlzQXJyb3cge1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgRG91YmxlU2lkZSA9IERvdWJsZVNpZGU7XG5cblx0ZGlyZWN0aW9uID0gaW5wdXQucmVxdWlyZWQ8VmVjdG9yMz4oKTtcblx0YXhpcyA9IGlucHV0LnJlcXVpcmVkPDAgfCAxIHwgMj4oKTtcblxuXHRncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cdGFubm90YXRpb25SZWYgPSB2aWV3Q2hpbGQ8dW5rbm93biwgRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdhbm5vdGF0aW9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuXG5cdHBpdm90Q29udHJvbHMgPSBpbmplY3QoTmd0c1Bpdm90Q29udHJvbHMpO1xuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBjb250cm9scyA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjb250cm9scycpIGFzIHVua25vd24gYXMgU2lnbmFsPHsgZW5hYmxlZDogYm9vbGVhbiB9PjtcblxuXHRwcml2YXRlIGhvdmVyZWQgPSBzaWduYWwoZmFsc2UpO1xuXHRwcml2YXRlIGNsaWNrSW5mbzogeyBjbGlja1BvaW50OiBWZWN0b3IzOyBkaXI6IFZlY3RvcjMgfSB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIG9mZnNldDAgPSAwO1xuXG5cdGNvbG9yID0gY29tcHV0ZWQoKCkgPT5cblx0XHR0aGlzLmhvdmVyZWQoKSA/IHRoaXMucGl2b3RDb250cm9scy5ob3ZlcmVkQ29sb3IoKSA6IHRoaXMucGl2b3RDb250cm9scy5heGlzQ29sb3JzKClbdGhpcy5heGlzKCldLFxuXHQpO1xuXG5cdGNvbmVXaWR0aCA9IGNvbXB1dGVkKCgpID0+XG5cdFx0dGhpcy5waXZvdENvbnRyb2xzLmZpeGVkKClcblx0XHRcdD8gKHRoaXMucGl2b3RDb250cm9scy5saW5lV2lkdGgoKSAvIHRoaXMucGl2b3RDb250cm9scy5zY2FsZSgpKSAqIDEuNlxuXHRcdFx0OiB0aGlzLnBpdm90Q29udHJvbHMuc2NhbGUoKSAvIDIwLFxuXHQpO1xuXHRjb25lTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMucGl2b3RDb250cm9scy5maXhlZCgpID8gMC4yIDogdGhpcy5waXZvdENvbnRyb2xzLnNjYWxlKCkgLyA1KSk7XG5cdGN5bGluZGVyTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT5cblx0XHR0aGlzLnBpdm90Q29udHJvbHMuZml4ZWQoKSA/IDEgLSB0aGlzLmNvbmVMZW5ndGgoKSA6IHRoaXMucGl2b3RDb250cm9scy5zY2FsZSgpIC0gdGhpcy5jb25lTGVuZ3RoKCksXG5cdCk7XG5cdG1hdHJpeEwgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbVVuaXRWZWN0b3JzKHVwViwgdGhpcy5kaXJlY3Rpb24oKS5jbG9uZSgpLm5vcm1hbGl6ZSgpKTtcblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihxdWF0ZXJuaW9uKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAsIE1lc2gsIENvbmVHZW9tZXRyeSwgQ3lsaW5kZXJHZW9tZXRyeSwgTWVzaEJhc2ljTWF0ZXJpYWwgfSk7XG5cdH1cblxuXHRvblBvaW50ZXJEb3duKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRjb25zdCBbZ3JvdXAsIGRpcmVjdGlvbiwgYXhpcywgY29udHJvbHMsIGFubm90YXRpb25dID0gW1xuXHRcdFx0dGhpcy5ncm91cFJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHR0aGlzLmRpcmVjdGlvbigpLFxuXHRcdFx0dGhpcy5heGlzKCksXG5cdFx0XHR0aGlzLmNvbnRyb2xzKCksXG5cdFx0XHR0aGlzLmFubm90YXRpb25SZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRdO1xuXG5cdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdGFubm90YXRpb24uaW5uZXJUZXh0ID0gYCR7dGhpcy5waXZvdENvbnRyb2xzLnRyYW5zbGF0aW9uW2F4aXNdLnRvRml4ZWQoMil9YDtcblx0XHRcdGFubm90YXRpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0fVxuXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCByb3RhdGlvbiA9IG5ldyBNYXRyaXg0KCkuZXh0cmFjdFJvdGF0aW9uKGdyb3VwLm1hdHJpeFdvcmxkKTtcblx0XHRjb25zdCBvcmlnaW4gPSBuZXcgVmVjdG9yMygpLnNldEZyb21NYXRyaXhQb3NpdGlvbihncm91cC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2xpY2tQb2ludCA9IGV2ZW50LnBvaW50LmNsb25lKCk7XG5cdFx0Y29uc3QgZGlyID0gZGlyZWN0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHJvdGF0aW9uKS5ub3JtYWxpemUoKTtcblx0XHR0aGlzLmNsaWNrSW5mbyA9IHsgY2xpY2tQb2ludCwgZGlyIH07XG5cdFx0dGhpcy5vZmZzZXQwID0gdGhpcy5waXZvdENvbnRyb2xzLnRyYW5zbGF0aW9uW2F4aXNdO1xuXHRcdHRoaXMucGl2b3RDb250cm9scy5vbkRyYWdTdGFydCh7IGNvbXBvbmVudDogJ0Fycm93JywgYXhpcywgb3JpZ2luLCBkaXJlY3Rpb25zOiBbZGlyXSB9KTtcblx0XHRpZiAoY29udHJvbHMpIHtcblx0XHRcdGNvbnRyb2xzLmVuYWJsZWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gc2V0UG9pbnRlckNhcHR1cmUgaXMgbm90IGluIHRoZSB0eXBlIGRlZmluaXRpb25cblx0XHRldmVudC50YXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcblx0fVxuXG5cdG9uUG9pbnRlclVwKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRjb25zdCBbYW5ub3RhdGlvbiwgY29udHJvbHNdID0gW3RoaXMuYW5ub3RhdGlvblJlZigpPy5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbnRyb2xzKCldO1xuXG5cdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdGFubm90YXRpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHR9XG5cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLmNsaWNrSW5mbyA9IG51bGw7XG5cdFx0dGhpcy5waXZvdENvbnRyb2xzLm9uRHJhZ0VuZCgpO1xuXHRcdGlmIChjb250cm9scykge1xuXHRcdFx0Y29udHJvbHMuZW5hYmxlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHNldFBvaW50ZXJDYXB0dXJlIGlzIG5vdCBpbiB0aGUgdHlwZSBkZWZpbml0aW9uXG5cdFx0ZXZlbnQudGFyZ2V0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuXHR9XG5cblx0b25Qb2ludGVyTW92ZShldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIXRoaXMuaG92ZXJlZCgpKSB7XG5cdFx0XHR0aGlzLmhvdmVyZWQuc2V0KHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNsaWNrSW5mbykge1xuXHRcdFx0Y29uc3QgeyBjbGlja1BvaW50LCBkaXIgfSA9IHRoaXMuY2xpY2tJbmZvO1xuXHRcdFx0Y29uc3QgW3RyYW5zbGF0aW9uTGltaXRzLCBhbm5vdGF0aW9uLCBheGlzXSA9IFtcblx0XHRcdFx0dGhpcy5waXZvdENvbnRyb2xzLnRyYW5zbGF0aW9uTGltaXRzKCksXG5cdFx0XHRcdHRoaXMuYW5ub3RhdGlvblJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmF4aXMoKSxcblx0XHRcdF07XG5cblx0XHRcdGNvbnN0IFttaW4sIG1heF0gPSB0cmFuc2xhdGlvbkxpbWl0cz8uW2F4aXNdIHx8IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG5cblx0XHRcdGxldCBvZmZzZXQgPSBjYWxjdWxhdGVPZmZzZXQoY2xpY2tQb2ludCwgZGlyLCBldmVudC5yYXkub3JpZ2luLCBldmVudC5yYXkuZGlyZWN0aW9uKTtcblx0XHRcdGlmIChtaW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvZmZzZXQgPSBNYXRoLm1heChvZmZzZXQsIG1pbiAtIHRoaXMub2Zmc2V0MCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtYXggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heCAtIHRoaXMub2Zmc2V0MCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucGl2b3RDb250cm9scy50cmFuc2xhdGlvbltheGlzXSA9IHRoaXMub2Zmc2V0MCArIG9mZnNldDtcblxuXHRcdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdFx0YW5ub3RhdGlvbi5pbm5lclRleHQgPSBgJHt0aGlzLnBpdm90Q29udHJvbHMudHJhbnNsYXRpb25bYXhpc10udG9GaXhlZCgyKX1gO1xuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXRNYXRyaXgubWFrZVRyYW5zbGF0aW9uKGRpci54ICogb2Zmc2V0LCBkaXIueSAqIG9mZnNldCwgZGlyLnogKiBvZmZzZXQpO1xuXHRcdFx0dGhpcy5waXZvdENvbnRyb2xzLm9uRHJhZyhvZmZzZXRNYXRyaXgpO1xuXHRcdH1cblx0fVxuXG5cdG9uUG9pbnRlck91dChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5ob3ZlcmVkLnNldChmYWxzZSk7XG5cdH1cbn1cbiJdfQ==