angular-three 0.0.2 → 0.0.4

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 (400) hide show
  1. package/attributes/README.md +3 -0
  2. package/attributes/index.d.ts +22 -0
  3. package/attributes/lib/buffer-attribute/buffer-attribute.d.ts +8 -0
  4. package/attributes/lib/color-attribute/color-attribute.d.ts +8 -0
  5. package/attributes/lib/float16-buffer-attribute/float16-buffer-attribute.d.ts +8 -0
  6. package/attributes/lib/float32-buffer-attribute/float32-buffer-attribute.d.ts +8 -0
  7. package/attributes/lib/float64-buffer-attribute/float64-buffer-attribute.d.ts +8 -0
  8. package/attributes/lib/fog-attribute/fog-attribute.d.ts +8 -0
  9. package/attributes/lib/fog-exp2-attribute/fog-exp2-attribute.d.ts +8 -0
  10. package/attributes/lib/instanced-buffer-attribute/instanced-buffer-attribute.d.ts +8 -0
  11. package/attributes/lib/int16-buffer-attribute/int16-buffer-attribute.d.ts +8 -0
  12. package/attributes/lib/int32-buffer-attribute/int32-buffer-attribute.d.ts +8 -0
  13. package/attributes/lib/int8-buffer-attribute/int8-buffer-attribute.d.ts +8 -0
  14. package/attributes/lib/interleaved-buffer-attribute/interleaved-buffer-attribute.d.ts +8 -0
  15. package/attributes/lib/matrix3-attribute/matrix3-attribute.d.ts +8 -0
  16. package/attributes/lib/matrix4-attribute/matrix4-attribute.d.ts +8 -0
  17. package/attributes/lib/uint16-buffer-attribute/uint16-buffer-attribute.d.ts +8 -0
  18. package/attributes/lib/uint32-buffer-attribute/uint32-buffer-attribute.d.ts +8 -0
  19. package/attributes/lib/uint8-buffer-attribute/uint8-buffer-attribute.d.ts +8 -0
  20. package/attributes/lib/uint8-clamped-buffer-attribute/uint8-clamped-buffer-attribute.d.ts +8 -0
  21. package/attributes/lib/value-attribute/value-attribute.d.ts +8 -0
  22. package/attributes/lib/vector2-attribute/vector2-attribute.d.ts +8 -0
  23. package/attributes/lib/vector3-attribute/vector3-attribute.d.ts +8 -0
  24. package/attributes/lib/vector4-attribute/vector4-attribute.d.ts +8 -0
  25. package/audios/README.md +3 -0
  26. package/audios/index.d.ts +3 -0
  27. package/audios/lib/audio/audio.d.ts +49 -0
  28. package/audios/lib/audio-listener/audio-listener.d.ts +35 -0
  29. package/audios/lib/positional-audio/positional-audio.d.ts +49 -0
  30. package/cameras/README.md +3 -0
  31. package/cameras/index.d.ts +5 -0
  32. package/cameras/lib/array-camera/array-camera.d.ts +56 -0
  33. package/cameras/lib/cube-camera/cube-camera.d.ts +36 -0
  34. package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +54 -0
  35. package/cameras/lib/perspective-camera/perspective-camera.d.ts +55 -0
  36. package/cameras/lib/stereo-camera/stereo-camera.d.ts +42 -0
  37. package/esm2020/attributes/angular-three-attributes.mjs +5 -0
  38. package/esm2020/attributes/index.mjs +24 -0
  39. package/esm2020/attributes/lib/buffer-attribute/buffer-attribute.mjs +25 -0
  40. package/esm2020/attributes/lib/color-attribute/color-attribute.mjs +25 -0
  41. package/esm2020/attributes/lib/float16-buffer-attribute/float16-buffer-attribute.mjs +25 -0
  42. package/esm2020/attributes/lib/float32-buffer-attribute/float32-buffer-attribute.mjs +25 -0
  43. package/esm2020/attributes/lib/float64-buffer-attribute/float64-buffer-attribute.mjs +25 -0
  44. package/esm2020/attributes/lib/fog-attribute/fog-attribute.mjs +25 -0
  45. package/esm2020/attributes/lib/fog-exp2-attribute/fog-exp2-attribute.mjs +25 -0
  46. package/esm2020/attributes/lib/instanced-buffer-attribute/instanced-buffer-attribute.mjs +25 -0
  47. package/esm2020/attributes/lib/int16-buffer-attribute/int16-buffer-attribute.mjs +25 -0
  48. package/esm2020/attributes/lib/int32-buffer-attribute/int32-buffer-attribute.mjs +25 -0
  49. package/esm2020/attributes/lib/int8-buffer-attribute/int8-buffer-attribute.mjs +25 -0
  50. package/esm2020/attributes/lib/interleaved-buffer-attribute/interleaved-buffer-attribute.mjs +29 -0
  51. package/esm2020/attributes/lib/matrix3-attribute/matrix3-attribute.mjs +25 -0
  52. package/esm2020/attributes/lib/matrix4-attribute/matrix4-attribute.mjs +25 -0
  53. package/esm2020/attributes/lib/uint16-buffer-attribute/uint16-buffer-attribute.mjs +25 -0
  54. package/esm2020/attributes/lib/uint32-buffer-attribute/uint32-buffer-attribute.mjs +25 -0
  55. package/esm2020/attributes/lib/uint8-buffer-attribute/uint8-buffer-attribute.mjs +25 -0
  56. package/esm2020/attributes/lib/uint8-clamped-buffer-attribute/uint8-clamped-buffer-attribute.mjs +25 -0
  57. package/esm2020/attributes/lib/value-attribute/value-attribute.mjs +27 -0
  58. package/esm2020/attributes/lib/vector2-attribute/vector2-attribute.mjs +25 -0
  59. package/esm2020/attributes/lib/vector3-attribute/vector3-attribute.mjs +25 -0
  60. package/esm2020/attributes/lib/vector4-attribute/vector4-attribute.mjs +25 -0
  61. package/esm2020/audios/angular-three-audios.mjs +5 -0
  62. package/esm2020/audios/index.mjs +5 -0
  63. package/esm2020/audios/lib/audio/audio.mjs +68 -0
  64. package/esm2020/audios/lib/audio-listener/audio-listener.mjs +65 -0
  65. package/esm2020/audios/lib/positional-audio/positional-audio.mjs +68 -0
  66. package/esm2020/cameras/angular-three-cameras.mjs +5 -0
  67. package/esm2020/cameras/index.mjs +7 -0
  68. package/esm2020/cameras/lib/array-camera/array-camera.mjs +67 -0
  69. package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +55 -0
  70. package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +65 -0
  71. package/esm2020/cameras/lib/perspective-camera/perspective-camera.mjs +66 -0
  72. package/esm2020/cameras/lib/stereo-camera/stereo-camera.mjs +61 -0
  73. package/esm2020/geometries/angular-three-geometries.mjs +5 -0
  74. package/esm2020/geometries/index.mjs +25 -0
  75. package/esm2020/geometries/lib/box-geometry/box-geometry.mjs +25 -0
  76. package/esm2020/geometries/lib/buffer-geometry/buffer-geometry.mjs +25 -0
  77. package/esm2020/geometries/lib/capsule-geometry/capsule-geometry.mjs +25 -0
  78. package/esm2020/geometries/lib/circle-geometry/circle-geometry.mjs +25 -0
  79. package/esm2020/geometries/lib/cone-geometry/cone-geometry.mjs +25 -0
  80. package/esm2020/geometries/lib/cylinder-geometry/cylinder-geometry.mjs +25 -0
  81. package/esm2020/geometries/lib/dodecahedron-geometry/dodecahedron-geometry.mjs +25 -0
  82. package/esm2020/geometries/lib/edges-geometry/edges-geometry.mjs +25 -0
  83. package/esm2020/geometries/lib/extrude-geometry/extrude-geometry.mjs +25 -0
  84. package/esm2020/geometries/lib/icosahedron-geometry/icosahedron-geometry.mjs +25 -0
  85. package/esm2020/geometries/lib/instanced-buffer-geometry/instanced-buffer-geometry.mjs +25 -0
  86. package/esm2020/geometries/lib/lathe-geometry/lathe-geometry.mjs +25 -0
  87. package/esm2020/geometries/lib/octahedron-geometry/octahedron-geometry.mjs +25 -0
  88. package/esm2020/geometries/lib/plane-geometry/plane-geometry.mjs +25 -0
  89. package/esm2020/geometries/lib/polyhedron-geometry/polyhedron-geometry.mjs +25 -0
  90. package/esm2020/geometries/lib/ring-geometry/ring-geometry.mjs +25 -0
  91. package/esm2020/geometries/lib/shape-geometry/shape-geometry.mjs +25 -0
  92. package/esm2020/geometries/lib/sphere-geometry/sphere-geometry.mjs +25 -0
  93. package/esm2020/geometries/lib/tetrahedron-geometry/tetrahedron-geometry.mjs +25 -0
  94. package/esm2020/geometries/lib/torus-geometry/torus-geometry.mjs +25 -0
  95. package/esm2020/geometries/lib/torus-knot-geometry/torus-knot-geometry.mjs +25 -0
  96. package/esm2020/geometries/lib/tube-geometry/tube-geometry.mjs +25 -0
  97. package/esm2020/geometries/lib/wireframe-geometry/wireframe-geometry.mjs +25 -0
  98. package/esm2020/helpers/angular-three-helpers.mjs +5 -0
  99. package/esm2020/helpers/index.mjs +15 -0
  100. package/esm2020/helpers/lib/arrow-helper/arrow-helper.mjs +25 -0
  101. package/esm2020/helpers/lib/axes-helper/axes-helper.mjs +25 -0
  102. package/esm2020/helpers/lib/box-helper/box-helper.mjs +35 -0
  103. package/esm2020/helpers/lib/box3-helper/box3-helper.mjs +35 -0
  104. package/esm2020/helpers/lib/camera-helper/camera-helper.mjs +35 -0
  105. package/esm2020/helpers/lib/directional-light-helper/directional-light-helper.mjs +35 -0
  106. package/esm2020/helpers/lib/grid-helper/grid-helper.mjs +25 -0
  107. package/esm2020/helpers/lib/hemisphere-light-helper/hemisphere-light-helper.mjs +35 -0
  108. package/esm2020/helpers/lib/plane-helper/plane-helper.mjs +35 -0
  109. package/esm2020/helpers/lib/point-light-helper/point-light-helper.mjs +35 -0
  110. package/esm2020/helpers/lib/polar-grid-helper/polar-grid-helper.mjs +25 -0
  111. package/esm2020/helpers/lib/skeleton-helper/skeleton-helper.mjs +35 -0
  112. package/esm2020/helpers/lib/spot-light-helper/spot-light-helper.mjs +35 -0
  113. package/esm2020/index.mjs +39 -2
  114. package/esm2020/lib/canvas.mjs +229 -0
  115. package/esm2020/lib/di/resize.mjs +19 -0
  116. package/esm2020/lib/di/window.mjs +13 -0
  117. package/esm2020/lib/directives/args.mjs +30 -0
  118. package/esm2020/lib/directives/cursor.mjs +35 -0
  119. package/esm2020/lib/directives/repeat.mjs +20 -0
  120. package/esm2020/lib/events.mjs +53 -0
  121. package/esm2020/lib/instance.mjs +368 -0
  122. package/esm2020/lib/pipes/math.mjs +15 -0
  123. package/esm2020/lib/pipes/pi.mjs +14 -0
  124. package/esm2020/lib/pipes/radian.mjs +14 -0
  125. package/esm2020/lib/pipes/side.mjs +22 -0
  126. package/esm2020/lib/ref.mjs +15 -0
  127. package/esm2020/lib/services/loader.mjs +45 -0
  128. package/esm2020/lib/services/resize.mjs +127 -0
  129. package/esm2020/lib/stores/component-store.mjs +137 -0
  130. package/esm2020/lib/stores/store.mjs +433 -0
  131. package/esm2020/lib/types.mjs +2 -0
  132. package/esm2020/lib/utils/apply-props.mjs +135 -0
  133. package/esm2020/lib/utils/build-graph.mjs +15 -0
  134. package/esm2020/lib/utils/camera.mjs +28 -0
  135. package/esm2020/lib/utils/capitalize.mjs +4 -0
  136. package/esm2020/lib/utils/check-update.mjs +22 -0
  137. package/esm2020/lib/utils/events.mjs +353 -0
  138. package/esm2020/lib/utils/get-instance-local-state.mjs +6 -0
  139. package/esm2020/lib/utils/inject.mjs +18 -0
  140. package/esm2020/lib/utils/instance.mjs +35 -0
  141. package/esm2020/lib/utils/is.mjs +54 -0
  142. package/esm2020/lib/utils/loop.mjs +139 -0
  143. package/esm2020/lib/utils/make.mjs +30 -0
  144. package/esm2020/lib/utils/mutate.mjs +24 -0
  145. package/esm2020/lib/utils/proxy.mjs +99 -0
  146. package/esm2020/lib/utils/renderer.mjs +15 -0
  147. package/esm2020/lights/angular-three-lights.mjs +5 -0
  148. package/esm2020/lights/index.mjs +11 -0
  149. package/esm2020/lights/lib/ambient-light/ambient-light.mjs +58 -0
  150. package/esm2020/lights/lib/ambient-light-probe/ambient-light-probe.mjs +59 -0
  151. package/esm2020/lights/lib/directional-light/directional-light.mjs +59 -0
  152. package/esm2020/lights/lib/hemisphere-light/hemisphere-light.mjs +60 -0
  153. package/esm2020/lights/lib/hemisphere-light-probe/hemisphere-light-probe.mjs +61 -0
  154. package/esm2020/lights/lib/light-probe/light-probe.mjs +59 -0
  155. package/esm2020/lights/lib/point-light/point-light.mjs +61 -0
  156. package/esm2020/lights/lib/rect-area-light/rect-area-light.mjs +61 -0
  157. package/esm2020/lights/lib/spot-light/spot-light.mjs +64 -0
  158. package/esm2020/materials/angular-three-materials.mjs +5 -0
  159. package/esm2020/materials/index.mjs +19 -0
  160. package/esm2020/materials/lib/line-basic-material/line-basic-material.mjs +76 -0
  161. package/esm2020/materials/lib/line-dashed-material/line-dashed-material.mjs +79 -0
  162. package/esm2020/materials/lib/mesh-basic-material/mesh-basic-material.mjs +88 -0
  163. package/esm2020/materials/lib/mesh-depth-material/mesh-depth-material.mjs +79 -0
  164. package/esm2020/materials/lib/mesh-distance-material/mesh-distance-material.mjs +79 -0
  165. package/esm2020/materials/lib/mesh-lambert-material/mesh-lambert-material.mjs +99 -0
  166. package/esm2020/materials/lib/mesh-matcap-material/mesh-matcap-material.mjs +85 -0
  167. package/esm2020/materials/lib/mesh-normal-material/mesh-normal-material.mjs +82 -0
  168. package/esm2020/materials/lib/mesh-phong-material/mesh-phong-material.mjs +102 -0
  169. package/esm2020/materials/lib/mesh-physical-material/mesh-physical-material.mjs +118 -0
  170. package/esm2020/materials/lib/mesh-standard-material/mesh-standard-material.mjs +99 -0
  171. package/esm2020/materials/lib/mesh-toon-material/mesh-toon-material.mjs +95 -0
  172. package/esm2020/materials/lib/points-material/points-material.mjs +77 -0
  173. package/esm2020/materials/lib/raw-shader-material/raw-shader-material.mjs +82 -0
  174. package/esm2020/materials/lib/shader-material/shader-material.mjs +82 -0
  175. package/esm2020/materials/lib/shadow-material/shadow-material.mjs +73 -0
  176. package/esm2020/materials/lib/sprite-material/sprite-material.mjs +77 -0
  177. package/esm2020/objects/angular-three-objects.mjs +5 -0
  178. package/esm2020/objects/index.mjs +14 -0
  179. package/esm2020/objects/lib/bone/bone.mjs +54 -0
  180. package/esm2020/objects/lib/group/group.mjs +54 -0
  181. package/esm2020/objects/lib/instanced-mesh/instanced-mesh.mjs +63 -0
  182. package/esm2020/objects/lib/line/line.mjs +58 -0
  183. package/esm2020/objects/lib/line-loop/line-loop.mjs +58 -0
  184. package/esm2020/objects/lib/line-segments/line-segments.mjs +58 -0
  185. package/esm2020/objects/lib/lod/lod.mjs +56 -0
  186. package/esm2020/objects/lib/mesh/mesh.mjs +58 -0
  187. package/esm2020/objects/lib/points/points.mjs +58 -0
  188. package/esm2020/objects/lib/skeleton/skeleton.mjs +40 -0
  189. package/esm2020/objects/lib/skinned-mesh/skinned-mesh.mjs +62 -0
  190. package/esm2020/objects/lib/sprite/sprite.mjs +57 -0
  191. package/esm2020/primitives/angular-three-primitives.mjs +5 -0
  192. package/esm2020/primitives/index.mjs +3 -0
  193. package/esm2020/primitives/lib/object-primitive/object-primitive.mjs +54 -0
  194. package/esm2020/primitives/lib/primitive/primitive.mjs +37 -0
  195. package/esm2020/stats/angular-three-stats.mjs +5 -0
  196. package/esm2020/stats/index.mjs +2 -0
  197. package/esm2020/stats/lib/stats/stats.mjs +54 -0
  198. package/esm2020/textures/angular-three-textures.mjs +5 -0
  199. package/esm2020/textures/index.mjs +12 -0
  200. package/esm2020/textures/lib/canvas-texture/canvas-texture.mjs +25 -0
  201. package/esm2020/textures/lib/compressed-array-texture/compressed-array-texture.mjs +25 -0
  202. package/esm2020/textures/lib/compressed-texture/compressed-texture.mjs +25 -0
  203. package/esm2020/textures/lib/cube-texture/cube-texture.mjs +25 -0
  204. package/esm2020/textures/lib/data-array-texture/data-array-texture.mjs +25 -0
  205. package/esm2020/textures/lib/data-texture/data-texture.mjs +25 -0
  206. package/esm2020/textures/lib/data3-dtexture/data3-dtexture.mjs +25 -0
  207. package/esm2020/textures/lib/depth-texture/depth-texture.mjs +25 -0
  208. package/esm2020/textures/lib/framebuffer-texture/framebuffer-texture.mjs +25 -0
  209. package/esm2020/textures/lib/video-texture/video-texture.mjs +25 -0
  210. package/fesm2015/angular-three-attributes.mjs +462 -0
  211. package/fesm2015/angular-three-attributes.mjs.map +1 -0
  212. package/fesm2015/angular-three-audios.mjs +201 -0
  213. package/fesm2015/angular-three-audios.mjs.map +1 -0
  214. package/fesm2015/angular-three-cameras.mjs +304 -0
  215. package/fesm2015/angular-three-cameras.mjs.map +1 -0
  216. package/fesm2015/angular-three-geometries.mjs +475 -0
  217. package/fesm2015/angular-three-geometries.mjs.map +1 -0
  218. package/fesm2015/angular-three-helpers.mjs +365 -0
  219. package/fesm2015/angular-three-helpers.mjs.map +1 -0
  220. package/fesm2015/angular-three-lights.mjs +511 -0
  221. package/fesm2015/angular-three-lights.mjs.map +1 -0
  222. package/fesm2015/angular-three-materials.mjs +1402 -0
  223. package/fesm2015/angular-three-materials.mjs.map +1 -0
  224. package/fesm2015/angular-three-objects.mjs +630 -0
  225. package/fesm2015/angular-three-objects.mjs.map +1 -0
  226. package/fesm2015/angular-three-primitives.mjs +95 -0
  227. package/fesm2015/angular-three-primitives.mjs.map +1 -0
  228. package/fesm2015/angular-three-stats.mjs +62 -0
  229. package/fesm2015/angular-three-stats.mjs.map +1 -0
  230. package/fesm2015/angular-three-textures.mjs +215 -0
  231. package/fesm2015/angular-three-textures.mjs.map +1 -0
  232. package/fesm2015/angular-three.mjs +2448 -10
  233. package/fesm2015/angular-three.mjs.map +1 -1
  234. package/fesm2020/angular-three-attributes.mjs +462 -0
  235. package/fesm2020/angular-three-attributes.mjs.map +1 -0
  236. package/fesm2020/angular-three-audios.mjs +201 -0
  237. package/fesm2020/angular-three-audios.mjs.map +1 -0
  238. package/fesm2020/angular-three-cameras.mjs +304 -0
  239. package/fesm2020/angular-three-cameras.mjs.map +1 -0
  240. package/fesm2020/angular-three-geometries.mjs +475 -0
  241. package/fesm2020/angular-three-geometries.mjs.map +1 -0
  242. package/fesm2020/angular-three-helpers.mjs +365 -0
  243. package/fesm2020/angular-three-helpers.mjs.map +1 -0
  244. package/fesm2020/angular-three-lights.mjs +511 -0
  245. package/fesm2020/angular-three-lights.mjs.map +1 -0
  246. package/fesm2020/angular-three-materials.mjs +1402 -0
  247. package/fesm2020/angular-three-materials.mjs.map +1 -0
  248. package/fesm2020/angular-three-objects.mjs +630 -0
  249. package/fesm2020/angular-three-objects.mjs.map +1 -0
  250. package/fesm2020/angular-three-primitives.mjs +95 -0
  251. package/fesm2020/angular-three-primitives.mjs.map +1 -0
  252. package/fesm2020/angular-three-stats.mjs +62 -0
  253. package/fesm2020/angular-three-stats.mjs.map +1 -0
  254. package/fesm2020/angular-three-textures.mjs +215 -0
  255. package/fesm2020/angular-three-textures.mjs.map +1 -0
  256. package/fesm2020/angular-three.mjs +2462 -10
  257. package/fesm2020/angular-three.mjs.map +1 -1
  258. package/geometries/README.md +3 -0
  259. package/geometries/index.d.ts +23 -0
  260. package/geometries/lib/box-geometry/box-geometry.d.ts +8 -0
  261. package/geometries/lib/buffer-geometry/buffer-geometry.d.ts +8 -0
  262. package/geometries/lib/capsule-geometry/capsule-geometry.d.ts +8 -0
  263. package/geometries/lib/circle-geometry/circle-geometry.d.ts +8 -0
  264. package/geometries/lib/cone-geometry/cone-geometry.d.ts +8 -0
  265. package/geometries/lib/cylinder-geometry/cylinder-geometry.d.ts +8 -0
  266. package/geometries/lib/dodecahedron-geometry/dodecahedron-geometry.d.ts +8 -0
  267. package/geometries/lib/edges-geometry/edges-geometry.d.ts +8 -0
  268. package/geometries/lib/extrude-geometry/extrude-geometry.d.ts +8 -0
  269. package/geometries/lib/icosahedron-geometry/icosahedron-geometry.d.ts +8 -0
  270. package/geometries/lib/instanced-buffer-geometry/instanced-buffer-geometry.d.ts +8 -0
  271. package/geometries/lib/lathe-geometry/lathe-geometry.d.ts +8 -0
  272. package/geometries/lib/octahedron-geometry/octahedron-geometry.d.ts +8 -0
  273. package/geometries/lib/plane-geometry/plane-geometry.d.ts +8 -0
  274. package/geometries/lib/polyhedron-geometry/polyhedron-geometry.d.ts +8 -0
  275. package/geometries/lib/ring-geometry/ring-geometry.d.ts +8 -0
  276. package/geometries/lib/shape-geometry/shape-geometry.d.ts +8 -0
  277. package/geometries/lib/sphere-geometry/sphere-geometry.d.ts +8 -0
  278. package/geometries/lib/tetrahedron-geometry/tetrahedron-geometry.d.ts +8 -0
  279. package/geometries/lib/torus-geometry/torus-geometry.d.ts +8 -0
  280. package/geometries/lib/torus-knot-geometry/torus-knot-geometry.d.ts +8 -0
  281. package/geometries/lib/tube-geometry/tube-geometry.d.ts +8 -0
  282. package/geometries/lib/wireframe-geometry/wireframe-geometry.d.ts +8 -0
  283. package/helpers/README.md +3 -0
  284. package/helpers/index.d.ts +13 -0
  285. package/helpers/lib/arrow-helper/arrow-helper.d.ts +8 -0
  286. package/helpers/lib/axes-helper/axes-helper.d.ts +8 -0
  287. package/helpers/lib/box-helper/box-helper.d.ts +8 -0
  288. package/helpers/lib/box3-helper/box3-helper.d.ts +8 -0
  289. package/helpers/lib/camera-helper/camera-helper.d.ts +8 -0
  290. package/helpers/lib/directional-light-helper/directional-light-helper.d.ts +8 -0
  291. package/helpers/lib/grid-helper/grid-helper.d.ts +8 -0
  292. package/helpers/lib/hemisphere-light-helper/hemisphere-light-helper.d.ts +8 -0
  293. package/helpers/lib/plane-helper/plane-helper.d.ts +8 -0
  294. package/helpers/lib/point-light-helper/point-light-helper.d.ts +8 -0
  295. package/helpers/lib/polar-grid-helper/polar-grid-helper.d.ts +8 -0
  296. package/helpers/lib/skeleton-helper/skeleton-helper.d.ts +8 -0
  297. package/helpers/lib/spot-light-helper/spot-light-helper.d.ts +8 -0
  298. package/index.d.ts +38 -1
  299. package/lib/canvas.d.ts +46 -0
  300. package/lib/di/resize.d.ts +12 -0
  301. package/lib/di/window.d.ts +1 -0
  302. package/lib/directives/args.d.ts +19 -0
  303. package/lib/directives/cursor.d.ts +7 -0
  304. package/lib/directives/repeat.d.ts +7 -0
  305. package/lib/events.d.ts +2 -0
  306. package/lib/instance.d.ts +81 -0
  307. package/lib/pipes/math.d.ts +7 -0
  308. package/lib/pipes/pi.d.ts +7 -0
  309. package/lib/pipes/radian.d.ts +7 -0
  310. package/lib/pipes/side.d.ts +8 -0
  311. package/lib/ref.d.ts +5 -0
  312. package/lib/services/loader.d.ts +11 -0
  313. package/lib/services/resize.d.ts +19 -0
  314. package/lib/stores/component-store.d.ts +69 -0
  315. package/lib/stores/store.d.ts +32 -0
  316. package/lib/types.d.ts +358 -0
  317. package/lib/utils/apply-props.d.ts +6 -0
  318. package/lib/utils/build-graph.d.ts +3 -0
  319. package/lib/utils/camera.d.ts +4 -0
  320. package/lib/utils/capitalize.d.ts +1 -0
  321. package/lib/utils/check-update.d.ts +2 -0
  322. package/lib/utils/events.d.ts +6 -0
  323. package/lib/utils/get-instance-local-state.d.ts +2 -0
  324. package/lib/utils/inject.d.ts +9 -0
  325. package/lib/utils/instance.d.ts +4 -0
  326. package/lib/utils/is.d.ts +21 -0
  327. package/lib/utils/loop.d.ts +32 -0
  328. package/lib/utils/make.d.ts +4 -0
  329. package/lib/utils/mutate.d.ts +2 -0
  330. package/lib/utils/proxy.d.ts +7 -0
  331. package/lib/utils/renderer.d.ts +3 -0
  332. package/lights/README.md +3 -0
  333. package/lights/index.d.ts +9 -0
  334. package/lights/lib/ambient-light/ambient-light.d.ts +39 -0
  335. package/lights/lib/ambient-light-probe/ambient-light-probe.d.ts +40 -0
  336. package/lights/lib/directional-light/directional-light.d.ts +40 -0
  337. package/lights/lib/hemisphere-light/hemisphere-light.d.ts +41 -0
  338. package/lights/lib/hemisphere-light-probe/hemisphere-light-probe.d.ts +42 -0
  339. package/lights/lib/light-probe/light-probe.d.ts +40 -0
  340. package/lights/lib/point-light/point-light.d.ts +42 -0
  341. package/lights/lib/rect-area-light/rect-area-light.d.ts +42 -0
  342. package/lights/lib/spot-light/spot-light.d.ts +45 -0
  343. package/materials/README.md +3 -0
  344. package/materials/index.d.ts +17 -0
  345. package/materials/lib/line-basic-material/line-basic-material.d.ts +55 -0
  346. package/materials/lib/line-dashed-material/line-dashed-material.d.ts +58 -0
  347. package/materials/lib/mesh-basic-material/mesh-basic-material.d.ts +67 -0
  348. package/materials/lib/mesh-depth-material/mesh-depth-material.d.ts +58 -0
  349. package/materials/lib/mesh-distance-material/mesh-distance-material.d.ts +58 -0
  350. package/materials/lib/mesh-lambert-material/mesh-lambert-material.d.ts +78 -0
  351. package/materials/lib/mesh-matcap-material/mesh-matcap-material.d.ts +64 -0
  352. package/materials/lib/mesh-normal-material/mesh-normal-material.d.ts +61 -0
  353. package/materials/lib/mesh-phong-material/mesh-phong-material.d.ts +81 -0
  354. package/materials/lib/mesh-physical-material/mesh-physical-material.d.ts +97 -0
  355. package/materials/lib/mesh-standard-material/mesh-standard-material.d.ts +78 -0
  356. package/materials/lib/mesh-toon-material/mesh-toon-material.d.ts +74 -0
  357. package/materials/lib/points-material/points-material.d.ts +56 -0
  358. package/materials/lib/raw-shader-material/raw-shader-material.d.ts +68 -0
  359. package/materials/lib/shader-material/shader-material.d.ts +68 -0
  360. package/materials/lib/shadow-material/shadow-material.d.ts +52 -0
  361. package/materials/lib/sprite-material/sprite-material.d.ts +56 -0
  362. package/objects/README.md +3 -0
  363. package/objects/index.d.ts +12 -0
  364. package/objects/lib/bone/bone.d.ts +35 -0
  365. package/objects/lib/group/group.d.ts +35 -0
  366. package/objects/lib/instanced-mesh/instanced-mesh.d.ts +44 -0
  367. package/objects/lib/line/line.d.ts +41 -0
  368. package/objects/lib/line-loop/line-loop.d.ts +41 -0
  369. package/objects/lib/line-segments/line-segments.d.ts +41 -0
  370. package/objects/lib/lod/lod.d.ts +40 -0
  371. package/objects/lib/mesh/mesh.d.ts +41 -0
  372. package/objects/lib/points/points.d.ts +41 -0
  373. package/objects/lib/skeleton/skeleton.d.ts +16 -0
  374. package/objects/lib/skinned-mesh/skinned-mesh.d.ts +45 -0
  375. package/objects/lib/sprite/sprite.d.ts +38 -0
  376. package/package.json +93 -2
  377. package/primitives/README.md +3 -0
  378. package/primitives/index.d.ts +2 -0
  379. package/primitives/lib/object-primitive/object-primitive.d.ts +35 -0
  380. package/primitives/lib/primitive/primitive.d.ts +10 -0
  381. package/schematics/src/generators/init/generator.d.ts +1 -1
  382. package/schematics/src/generators/init/generator.js +4 -4
  383. package/schematics/src/generators/init/generator.js.map +1 -1
  384. package/stats/README.md +3 -0
  385. package/stats/index.d.ts +1 -0
  386. package/stats/lib/stats/stats.d.ts +16 -0
  387. package/textures/README.md +3 -0
  388. package/textures/index.d.ts +10 -0
  389. package/textures/lib/canvas-texture/canvas-texture.d.ts +8 -0
  390. package/textures/lib/compressed-array-texture/compressed-array-texture.d.ts +8 -0
  391. package/textures/lib/compressed-texture/compressed-texture.d.ts +8 -0
  392. package/textures/lib/cube-texture/cube-texture.d.ts +8 -0
  393. package/textures/lib/data-array-texture/data-array-texture.d.ts +8 -0
  394. package/textures/lib/data-texture/data-texture.d.ts +8 -0
  395. package/textures/lib/data3-dtexture/data3-dtexture.d.ts +8 -0
  396. package/textures/lib/depth-texture/depth-texture.d.ts +8 -0
  397. package/textures/lib/framebuffer-texture/framebuffer-texture.d.ts +8 -0
  398. package/textures/lib/video-texture/video-texture.d.ts +8 -0
  399. package/esm2020/lib/angular-three.module.mjs +0 -15
  400. package/lib/angular-three.module.d.ts +0 -7
@@ -0,0 +1,353 @@
1
+ import * as THREE from 'three';
2
+ import { getInstanceLocalState } from './get-instance-local-state';
3
+ import { makeId } from './make';
4
+ /**
5
+ * Release pointer captures.
6
+ * This is called by releasePointerCapture in the API, and when an object is removed.
7
+ */
8
+ function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
9
+ const captureData = captures.get(obj);
10
+ if (captureData) {
11
+ captures.delete(obj);
12
+ // If this was the last capturing object for this pointer
13
+ if (captures.size === 0) {
14
+ capturedMap.delete(pointerId);
15
+ captureData.target.releasePointerCapture(pointerId);
16
+ }
17
+ }
18
+ }
19
+ export function removeInteractivity(stateFactory, object) {
20
+ const { internal } = stateFactory();
21
+ // Removes every trace of an object from the data store
22
+ internal.interaction = internal.interaction.filter((o) => o !== object);
23
+ internal.initialHits = internal.initialHits.filter((o) => o !== object);
24
+ internal.hovered.forEach((value, key) => {
25
+ if (value.eventObject === object || value.object === object) {
26
+ // Clear out intersects, they are outdated by now
27
+ internal.hovered.delete(key);
28
+ }
29
+ });
30
+ internal.capturedMap.forEach((captures, pointerId) => {
31
+ releaseInternalPointerCapture(internal.capturedMap, object, captures, pointerId);
32
+ });
33
+ }
34
+ export function createEvents(stateFactory) {
35
+ /** Calculates delta */
36
+ function calculateDistance(event) {
37
+ const { internal } = stateFactory();
38
+ const dx = event.offsetX - internal.initialClick[0];
39
+ const dy = event.offsetY - internal.initialClick[1];
40
+ return Math.round(Math.sqrt(dx * dx + dy * dy));
41
+ }
42
+ /** Returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc */
43
+ function filterPointerEvents(objects) {
44
+ return objects.filter((obj) => ['move', 'over', 'enter', 'out', 'leave'].some((name) => {
45
+ const eventName = ('pointer' + name);
46
+ return getInstanceLocalState(obj)?.handlers[eventName];
47
+ }));
48
+ }
49
+ function intersect(event, filter) {
50
+ const state = stateFactory();
51
+ const duplicates = new Set();
52
+ const intersections = [];
53
+ // Allow callers to eliminate event objects
54
+ const eventsObjects = filter ? filter(state.internal.interaction) : state.internal.interaction;
55
+ // Reset all raycaster cameras to undefined
56
+ for (let i = 0; i < eventsObjects.length; i++) {
57
+ const instanceState = getInstanceLocalState(eventsObjects[i])?.stateFactory();
58
+ if (instanceState) {
59
+ instanceState.raycaster.camera = undefined;
60
+ }
61
+ }
62
+ if (!state.previousStateFactory) {
63
+ // Make sure root-level pointer and ray are set up
64
+ state.events.compute?.(event, () => state);
65
+ }
66
+ function handleRaycast(obj) {
67
+ const state = getInstanceLocalState(obj)?.stateFactory();
68
+ // Skip event handling when noEvents is set, or when the raycasters camera is null
69
+ if (!state || !state.events.enabled || state.raycaster.camera === null)
70
+ return [];
71
+ // When the camera is undefined we have to call the event layers update function
72
+ if (state.raycaster.camera === undefined) {
73
+ state.events.compute?.(event, () => state, state.previousStateFactory);
74
+ // If the camera is still undefined we have to skip this layer entirely
75
+ if (state.raycaster.camera === undefined)
76
+ state.raycaster.camera = null;
77
+ }
78
+ // Intersect object by object
79
+ return state.raycaster.camera ? state.raycaster.intersectObject(obj, true) : [];
80
+ }
81
+ // Collect events
82
+ let hits = eventsObjects
83
+ // Intersect objects
84
+ .flatMap(handleRaycast)
85
+ // Sort by event priority and distance
86
+ .sort((a, b) => {
87
+ const aState = getInstanceLocalState(a.object)?.stateFactory();
88
+ const bState = getInstanceLocalState(b.object)?.stateFactory();
89
+ if (!aState || !bState)
90
+ return 0;
91
+ return bState.events.priority - aState.events.priority || a.distance - b.distance;
92
+ })
93
+ // Filter out duplicates
94
+ .filter((item) => {
95
+ const id = makeId(item);
96
+ if (duplicates.has(id))
97
+ return false;
98
+ duplicates.add(id);
99
+ return true;
100
+ });
101
+ // https://github.com/mrdoob/three.js/issues/16031
102
+ // Allow custom userland intersect sort order, this likely only makes sense on the root filter
103
+ if (state.events.filter)
104
+ hits = state.events.filter(hits, () => state);
105
+ // Bubble up the events, find the event source (eventObject)
106
+ for (const hit of hits) {
107
+ let eventObject = hit.object;
108
+ // Bubble event up
109
+ while (eventObject) {
110
+ if (getInstanceLocalState(eventObject)?.eventCount)
111
+ intersections.push({ ...hit, eventObject });
112
+ eventObject = eventObject.parent;
113
+ }
114
+ }
115
+ // If the interaction is captured, make all capturing targets part of the intersect.
116
+ if ('pointerId' in event && state.internal.capturedMap.has(event.pointerId)) {
117
+ for (const captureData of state.internal.capturedMap.get(event.pointerId).values()) {
118
+ intersections.push(captureData.intersection);
119
+ }
120
+ }
121
+ return intersections;
122
+ }
123
+ /** Handles intersections by forwarding them to handlers */
124
+ function handleIntersects(intersections, event, delta, callback) {
125
+ const rootState = stateFactory();
126
+ // If anything has been found, forward it to the event listeners
127
+ if (intersections.length) {
128
+ const localState = { stopped: false };
129
+ for (const hit of intersections) {
130
+ const state = getInstanceLocalState(hit.object)?.stateFactory() || rootState;
131
+ const { raycaster, pointer, camera, internal } = state;
132
+ const unprojectedPoint = new THREE.Vector3(pointer.x, pointer.y, 0).unproject(camera);
133
+ const hasPointerCapture = (id) => internal.capturedMap.get(id)?.has(hit.eventObject) ?? false;
134
+ const setPointerCapture = (id) => {
135
+ const captureData = {
136
+ intersection: hit,
137
+ target: event.target,
138
+ };
139
+ if (internal.capturedMap.has(id)) {
140
+ // if the pointerId was previously captured, we add the hit to the
141
+ // event capturedMap.
142
+ internal.capturedMap.get(id).set(hit.eventObject, captureData);
143
+ }
144
+ else {
145
+ // if the pointerId was not previously captured, we create a map
146
+ // containing the hitObject, and the hit. hitObject is used for
147
+ // faster access.
148
+ internal.capturedMap.set(id, new Map([[hit.eventObject, captureData]]));
149
+ }
150
+ // Call the original event now
151
+ event.target.setPointerCapture(id);
152
+ };
153
+ const releasePointerCapture = (id) => {
154
+ const captures = internal.capturedMap.get(id);
155
+ if (captures) {
156
+ releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
157
+ }
158
+ };
159
+ // Add native event props
160
+ const extractEventProps = {};
161
+ // This iterates over the event's properties including the inherited ones. Native PointerEvents have most of their props as getters which are inherited, but polyfilled PointerEvents have them all as their own properties (i.e. not inherited). We can't use Object.keys() or Object.entries() as they only return "own" properties; nor Object.getPrototypeOf(event) as that *doesn't* return "own" properties, only inherited ones.
162
+ for (const prop in event) {
163
+ const property = event[prop];
164
+ // Only copy over atomics, leave functions alone as these should be
165
+ // called as event.nativeEvent.fn()
166
+ if (typeof property !== 'function')
167
+ extractEventProps[prop] = property;
168
+ }
169
+ const raycastEvent = {
170
+ ...hit,
171
+ ...extractEventProps,
172
+ pointer,
173
+ intersections,
174
+ stopped: localState.stopped,
175
+ delta,
176
+ unprojectedPoint,
177
+ ray: raycaster.ray,
178
+ camera: camera,
179
+ // Hijack stopPropagation, which just sets a flag
180
+ stopPropagation() {
181
+ // https://github.com/pmndrs/react-three-fiber/issues/596
182
+ // Events are not allowed to stop propagation if the pointer has been captured
183
+ const capturesForPointer = 'pointerId' in event && internal.capturedMap.get(event.pointerId);
184
+ // We only authorize stopPropagation...
185
+ if (
186
+ // ...if this pointer hasn't been captured
187
+ !capturesForPointer ||
188
+ // ... or if the hit object is capturing the pointer
189
+ capturesForPointer.has(hit.eventObject)) {
190
+ raycastEvent.stopped = localState.stopped = true;
191
+ // Propagation is stopped, remove all other hover records
192
+ // An event handler is only allowed to flush other handlers if it is hovered itself
193
+ if (internal.hovered.size &&
194
+ Array.from(internal.hovered.values()).find((i) => i.eventObject === hit.eventObject)) {
195
+ // Objects cannot flush out higher up objects that have already caught the event
196
+ const higher = intersections.slice(0, intersections.indexOf(hit));
197
+ cancelPointer([...higher, hit]);
198
+ }
199
+ }
200
+ },
201
+ // there should be a distinction between target and currentTarget
202
+ target: {
203
+ hasPointerCapture,
204
+ setPointerCapture,
205
+ releasePointerCapture,
206
+ },
207
+ currentTarget: {
208
+ hasPointerCapture,
209
+ setPointerCapture,
210
+ releasePointerCapture,
211
+ },
212
+ nativeEvent: event,
213
+ };
214
+ // Call subscribers
215
+ callback(raycastEvent);
216
+ // Event bubbling may be interrupted by stopPropagation
217
+ if (localState.stopped === true)
218
+ break;
219
+ }
220
+ }
221
+ return intersections;
222
+ }
223
+ function cancelPointer(intersections) {
224
+ const { internal } = stateFactory();
225
+ for (const hoveredObj of internal.hovered.values()) {
226
+ // When no objects were hit or the hovered object wasn't found underneath the cursor
227
+ // we call onPointerOut and delete the object from the hovered-elements map
228
+ if (!intersections.length ||
229
+ !intersections.find((hit) => hit.object === hoveredObj.object &&
230
+ hit.index === hoveredObj.index &&
231
+ hit.instanceId === hoveredObj.instanceId)) {
232
+ const eventObject = hoveredObj.eventObject;
233
+ const instance = getInstanceLocalState(eventObject);
234
+ const handlers = instance?.handlers;
235
+ internal.hovered.delete(makeId(hoveredObj));
236
+ if (instance?.eventCount) {
237
+ // Clear out intersects, they are outdated by now
238
+ const data = { ...hoveredObj, intersections };
239
+ handlers?.pointerout?.(data);
240
+ handlers?.pointerleave?.(data);
241
+ }
242
+ }
243
+ }
244
+ }
245
+ function pointerMissed(event, objects) {
246
+ for (let i = 0; i < objects.length; i++) {
247
+ const instance = getInstanceLocalState(objects[i]);
248
+ instance?.handlers.pointermissed?.(event);
249
+ }
250
+ }
251
+ function handlePointer(name) {
252
+ // Deal with cancelation
253
+ switch (name) {
254
+ case 'pointerleave':
255
+ case 'pointercancel':
256
+ return () => cancelPointer([]);
257
+ case 'lostpointercapture':
258
+ return (event) => {
259
+ const { internal } = stateFactory();
260
+ if ('pointerId' in event && !internal.capturedMap.has(event.pointerId)) {
261
+ // If the object event interface had onLostPointerCapture, we'd call it here on every
262
+ // object that's getting removed.
263
+ internal.capturedMap.delete(event.pointerId);
264
+ cancelPointer([]);
265
+ }
266
+ };
267
+ }
268
+ // Any other pointer goes here ...
269
+ return function handleEvent(event) {
270
+ const { onPointerMissed, internal } = stateFactory();
271
+ // prepareRay(event)
272
+ internal.lastEvent = event;
273
+ // Get fresh intersects
274
+ const isPointerMove = name === 'pointermove';
275
+ const isClickEvent = name === 'click' || name === 'contextmenu' || name === 'dblclick';
276
+ const filter = isPointerMove ? filterPointerEvents : undefined;
277
+ // const hits = patchIntersects(intersect(filter), event)
278
+ const hits = intersect(event, filter);
279
+ const delta = isClickEvent ? calculateDistance(event) : 0;
280
+ // Save initial coordinates on pointer-down
281
+ if (name === 'pointerdown') {
282
+ internal.initialClick = [event.offsetX, event.offsetY];
283
+ internal.initialHits = hits.map((hit) => hit.eventObject);
284
+ }
285
+ // If a click yields no results, pass it back to the user as a miss
286
+ // Missed events have to come first in order to establish user-land side-effect clean up
287
+ if (isClickEvent && !hits.length) {
288
+ if (delta <= 2) {
289
+ pointerMissed(event, internal.interaction);
290
+ if (onPointerMissed)
291
+ onPointerMissed(event);
292
+ }
293
+ }
294
+ // Take care of unhover
295
+ if (isPointerMove)
296
+ cancelPointer(hits);
297
+ function onIntersect(data) {
298
+ const eventObject = data.eventObject;
299
+ const instance = getInstanceLocalState(eventObject);
300
+ const handlers = instance?.handlers;
301
+ // Check presence of handlers
302
+ if (!instance?.eventCount)
303
+ return;
304
+ if (isPointerMove) {
305
+ // Move event ...
306
+ if (handlers?.pointerover ||
307
+ handlers?.pointerenter ||
308
+ handlers?.pointerout ||
309
+ handlers?.pointerleave) {
310
+ // When enter or out is present take care of hover-state
311
+ const id = makeId(data);
312
+ const hoveredItem = internal.hovered.get(id);
313
+ if (!hoveredItem) {
314
+ // If the object wasn't previously hovered, book it and call its handler
315
+ internal.hovered.set(id, data);
316
+ handlers.pointerover?.(data);
317
+ handlers.pointerenter?.(data);
318
+ }
319
+ else if (hoveredItem.stopped) {
320
+ // If the object was previously hovered and stopped, we shouldn't allow other items to proceed
321
+ data.stopPropagation();
322
+ }
323
+ }
324
+ // Call mouse move
325
+ handlers?.pointermove?.(data);
326
+ }
327
+ else {
328
+ // All other events ...
329
+ const handler = handlers[name];
330
+ if (handler) {
331
+ // Forward all events back to their respective handlers with the exception of click events,
332
+ // which must use the initial target
333
+ if (!isClickEvent || internal.initialHits.includes(eventObject)) {
334
+ // Missed events have to come first
335
+ pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
336
+ // Now call the handler
337
+ handler(data);
338
+ }
339
+ }
340
+ else {
341
+ // Trigger onPointerMissed on all elements that have pointer over/out handlers, but not click and weren't hit
342
+ if (isClickEvent && internal.initialHits.includes(eventObject)) {
343
+ pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
344
+ }
345
+ }
346
+ }
347
+ }
348
+ handleIntersects(hits, event, delta, onIntersect);
349
+ };
350
+ }
351
+ return { handlePointer };
352
+ }
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci10aHJlZS9zcmMvbGliL3V0aWxzL2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQVMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDOzs7R0FHRztBQUNILFNBQVMsNkJBQTZCLENBQ2xDLFdBQXNFLEVBQ3RFLEdBQW1CLEVBQ25CLFFBQXNELEVBQ3RELFNBQWlCO0lBRWpCLE1BQU0sV0FBVyxHQUF3QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLElBQUksV0FBVyxFQUFFO1FBQ2IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQix5REFBeUQ7UUFDekQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyQixXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkQ7S0FDSjtBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsWUFBNkIsRUFBRSxNQUFzQjtJQUNyRixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDcEMsdURBQXVEO0lBQ3ZELFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUN4RSxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFD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OzRCQUM1RCxhQUFhLENBQ1QsS0FBSyxFQUNMLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ2xGLENBQUM7eUJBQ0w7cUJBQ0o7aUJBQ0o7WUFDTCxDQUFDO1lBRUQsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUge1xuICAgIE5ndERvbUV2ZW50LFxuICAgIE5ndEV2ZW50SGFuZGxlcnMsXG4gICAgTmd0SW50ZXJzZWN0aW9uLFxuICAgIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0LFxuICAgIE5ndFN0YXRlRmFjdG9yeSxcbiAgICBOZ3RUaHJlZUV2ZW50LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRJbnN0YW5jZUxvY2FsU3RhdGUgfSBmcm9tICcuL2dldC1pbnN0YW5jZS1sb2NhbC1zdGF0ZSc7XG5pbXBvcnQgeyBtYWtlSWQgfSBmcm9tICcuL21ha2UnO1xuXG4vKipcbiAqIFJlbGVhc2UgcG9pbnRlciBjYXB0dXJlcy5cbiAqIFRoaXMgaXMgY2FsbGVkIGJ5IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSBpbiB0aGUgQVBJLCBhbmQgd2hlbiBhbiBvYmplY3QgaXMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoXG4gICAgY2FwdHVyZWRNYXA6IE1hcDxudW1iZXIsIE1hcDxUSFJFRS5PYmplY3QzRCwgTmd0UG9pbnRlckNhcHR1cmVUYXJnZXQ+PixcbiAgICBvYmo6IFRIUkVFLk9iamVjdDNELFxuICAgIGNhcHR1cmVzOiBNYXA8VEhSRUUuT2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0PixcbiAgICBwb2ludGVySWQ6IG51bWJlclxuKTogdm9pZCB7XG4gICAgY29uc3QgY2FwdHVyZURhdGE6IE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0IHwgdW5kZWZpbmVkID0gY2FwdHVyZXMuZ2V0KG9iaik7XG4gICAgaWYgKGNhcHR1cmVEYXRhKSB7XG4gICAgICAgIGNhcHR1cmVzLmRlbGV0ZShvYmopO1xuICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjYXB0dXJpbmcgb2JqZWN0IGZvciB0aGlzIHBvaW50ZXJcbiAgICAgICAgaWYgKGNhcHR1cmVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGNhcHR1cmVkTWFwLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICAgICAgY2FwdHVyZURhdGEudGFyZ2V0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW50ZXJhY3Rpdml0eShzdGF0ZUZhY3Rvcnk6IE5ndFN0YXRlRmFjdG9yeSwgb2JqZWN0OiBUSFJFRS5PYmplY3QzRCkge1xuICAgIGNvbnN0IHsgaW50ZXJuYWwgfSA9IHN0YXRlRmFjdG9yeSgpO1xuICAgIC8vIFJlbW92ZXMgZXZlcnkgdHJhY2Ugb2YgYW4gb2JqZWN0IGZyb20gdGhlIGRhdGEgc3RvcmVcbiAgICBpbnRlcm5hbC5pbnRlcmFjdGlvbiA9IGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcbiAgICBpbnRlcm5hbC5pbml0aWFsSGl0cyA9IGludGVybmFsLmluaXRpYWxIaXRzLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcbiAgICBpbnRlcm5hbC5ob3ZlcmVkLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmV2ZW50T2JqZWN0ID09PSBvYmplY3QgfHwgdmFsdWUub2JqZWN0ID09PSBvYmplY3QpIHtcbiAgICAgICAgICAgIC8vIENsZWFyIG91dCBpbnRlcnNlY3RzLCB0aGV5IGFyZSBvdXRkYXRlZCBieSBub3dcbiAgICAgICAgICAgIGludGVybmFsLmhvdmVyZWQuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5mb3JFYWNoKChjYXB0dXJlcywgcG9pbnRlcklkKSA9PiB7XG4gICAgICAgIHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBvYmplY3QsIGNhcHR1cmVzLCBwb2ludGVySWQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzKHN0YXRlRmFjdG9yeTogTmd0U3RhdGVGYWN0b3J5KSB7XG4gICAgLyoqIENhbGN1bGF0ZXMgZGVsdGEgKi9cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbCB9ID0gc3RhdGVGYWN0b3J5KCk7XG4gICAgICAgIGNvbnN0IGR4ID0gZXZlbnQub2Zmc2V0WCAtIGludGVybmFsLmluaXRpYWxDbGlja1swXTtcbiAgICAgICAgY29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyB0cnVlIGlmIGFuIGluc3RhbmNlIGhhcyBhIHZhbGlkIHBvaW50ZXItZXZlbnQgcmVnaXN0ZXJlZCwgdGhpcyBleGNsdWRlcyBzY3JvbGwsIGNsaWNrcyBldGMgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXJQb2ludGVyRXZlbnRzKG9iamVjdHM6IFRIUkVFLk9iamVjdDNEW10pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKChvYmopID0+XG4gICAgICAgICAgICBbJ21vdmUnLCAnb3ZlcicsICdlbnRlcicsICdvdXQnLCAnbGVhdmUnXS5zb21lKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gKCdwb2ludGVyJyArIG5hbWUpIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlTG9jYWxTdGF0ZShvYmopPy5oYW5kbGVyc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnRlcnNlY3QoZXZlbnQ6IE5ndERvbUV2ZW50LCBmaWx0ZXI/OiAob2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSkgPT4gVEhSRUUuT2JqZWN0M0RbXSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0YXRlRmFjdG9yeSgpO1xuICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IGludGVyc2VjdGlvbnM6IE5ndEludGVyc2VjdGlvbltdID0gW107XG4gICAgICAgIC8vIEFsbG93IGNhbGxlcnMgdG8gZWxpbWluYXRlIGV2ZW50IG9iamVjdHNcbiAgICAgICAgY29uc3QgZXZlbnRzT2JqZWN0cyA9IGZpbHRlciA/IGZpbHRlcihzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbikgOiBzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbjtcbiAgICAgICAgLy8gUmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50c09iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlU3RhdGUgPSBnZXRJbnN0YW5jZUxvY2FsU3RhdGUoZXZlbnRzT2JqZWN0c1tpXSk/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPSB1bmRlZmluZWQhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5wcmV2aW91c1N0YXRlRmFjdG9yeSkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJvb3QtbGV2ZWwgcG9pbnRlciBhbmQgcmF5IGFyZSBzZXQgdXBcbiAgICAgICAgICAgIHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsICgpID0+IHN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJheWNhc3Qob2JqOiBUSFJFRS5PYmplY3QzRDxUSFJFRS5FdmVudD4pIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFuY2VMb2NhbFN0YXRlKG9iaik/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgLy8gU2tpcCBldmVudCBoYW5kbGluZyB3aGVuIG5vRXZlbnRzIGlzIHNldCwgb3Igd2hlbiB0aGUgcmF5Y2FzdGVycyBjYW1lcmEgaXMgbnVsbFxuICAgICAgICAgICAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuZXZlbnRzLmVuYWJsZWQgfHwgc3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBjYW1lcmEgaXMgdW5kZWZpbmVkIHdlIGhhdmUgdG8gY2FsbCB0aGUgZXZlbnQgbGF5ZXJzIHVwZGF0ZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKHN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsICgpID0+IHN0YXRlLCBzdGF0ZS5wcmV2aW91c1N0YXRlRmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbWVyYSBpcyBzdGlsbCB1bmRlZmluZWQgd2UgaGF2ZSB0byBza2lwIHRoaXMgbGF5ZXIgZW50aXJlbHlcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gdW5kZWZpbmVkKSBzdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID0gbnVsbCE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEludGVyc2VjdCBvYmplY3QgYnkgb2JqZWN0XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA/IHN0YXRlLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3Qob2JqLCB0cnVlKSA6IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29sbGVjdCBldmVudHNcbiAgICAgICAgbGV0IGhpdHM6IFRIUkVFLkludGVyc2VjdGlvbjxUSFJFRS5PYmplY3QzRDxUSFJFRS5FdmVudD4+W10gPSBldmVudHNPYmplY3RzXG4gICAgICAgICAgICAvLyBJbnRlcnNlY3Qgb2JqZWN0c1xuICAgICAgICAgICAgLmZsYXRNYXAoaGFuZGxlUmF5Y2FzdClcbiAgICAgICAgICAgIC8vIFNvcnQgYnkgZXZlbnQgcHJpb3JpdHkgYW5kIGRpc3RhbmNlXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFTdGF0ZSA9IGdldEluc3RhbmNlTG9jYWxTdGF0ZShhLm9iamVjdCk/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJTdGF0ZSA9IGdldEluc3RhbmNlTG9jYWxTdGF0ZShiLm9iamVjdCk/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgIGlmICghYVN0YXRlIHx8ICFiU3RhdGUpIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBiU3RhdGUuZXZlbnRzLnByaW9yaXR5IC0gYVN0YXRlLmV2ZW50cy5wcmlvcml0eSB8fCBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG1ha2VJZChpdGVtIGFzIE5ndEludGVyc2VjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZXMuaGFzKGlkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvaXNzdWVzLzE2MDMxXG4gICAgICAgIC8vIEFsbG93IGN1c3RvbSB1c2VybGFuZCBpbnRlcnNlY3Qgc29ydCBvcmRlciwgdGhpcyBsaWtlbHkgb25seSBtYWtlcyBzZW5zZSBvbiB0aGUgcm9vdCBmaWx0ZXJcbiAgICAgICAgaWYgKHN0YXRlLmV2ZW50cy5maWx0ZXIpIGhpdHMgPSBzdGF0ZS5ldmVudHMuZmlsdGVyKGhpdHMsICgpID0+IHN0YXRlKTtcblxuICAgICAgICAvLyBCdWJibGUgdXAgdGhlIGV2ZW50cywgZmluZCB0aGUgZXZlbnQgc291cmNlIChldmVudE9iamVjdClcbiAgICAgICAgZm9yIChjb25zdCBoaXQgb2YgaGl0cykge1xuICAgICAgICAgICAgbGV0IGV2ZW50T2JqZWN0OiBUSFJFRS5PYmplY3QzRCB8IG51bGwgPSBoaXQub2JqZWN0O1xuICAgICAgICAgICAgLy8gQnViYmxlIGV2ZW50IHVwXG4gICAgICAgICAgICB3aGlsZSAoZXZlbnRPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0SW5zdGFuY2VMb2NhbFN0YXRlKGV2ZW50T2JqZWN0KT8uZXZlbnRDb3VudCkgaW50ZXJzZWN0aW9ucy5wdXNoKHsgLi4uaGl0LCBldmVudE9iamVjdCB9KTtcbiAgICAgICAgICAgICAgICBldmVudE9iamVjdCA9IGV2ZW50T2JqZWN0LnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBpbnRlcmFjdGlvbiBpcyBjYXB0dXJlZCwgbWFrZSBhbGwgY2FwdHVyaW5nIHRhcmdldHMgcGFydCBvZiB0aGUgaW50ZXJzZWN0LlxuICAgICAgICBpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2FwdHVyZURhdGEgb2Ygc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCkhLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGNhcHR1cmVEYXRhLmludGVyc2VjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqICBIYW5kbGVzIGludGVyc2VjdGlvbnMgYnkgZm9yd2FyZGluZyB0aGVtIHRvIGhhbmRsZXJzICovXG4gICAgZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0cyhcbiAgICAgICAgaW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10sXG4gICAgICAgIGV2ZW50OiBOZ3REb21FdmVudCxcbiAgICAgICAgZGVsdGE6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChldmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3Qgcm9vdFN0YXRlID0gc3RhdGVGYWN0b3J5KCk7XG4gICAgICAgIC8vIElmIGFueXRoaW5nIGhhcyBiZWVuIGZvdW5kLCBmb3J3YXJkIGl0IHRvIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0geyBzdG9wcGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBoaXQgb2YgaW50ZXJzZWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFuY2VMb2NhbFN0YXRlKGhpdC5vYmplY3QpPy5zdGF0ZUZhY3RvcnkoKSB8fCByb290U3RhdGU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByYXljYXN0ZXIsIHBvaW50ZXIsIGNhbWVyYSwgaW50ZXJuYWwgfSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJvamVjdGVkUG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMyhwb2ludGVyLngsIHBvaW50ZXIueSwgMCkudW5wcm9qZWN0KGNhbWVyYSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzUG9pbnRlckNhcHR1cmUgPSAoaWQ6IG51bWJlcikgPT4gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKT8uaGFzKGhpdC5ldmVudE9iamVjdCkgPz8gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZXRQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcHR1cmVEYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uOiBoaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBvaW50ZXJJZCB3YXMgcHJldmlvdXNseSBjYXB0dXJlZCwgd2UgYWRkIHRoZSBoaXQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBjYXB0dXJlZE1hcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmNhcHR1cmVkTWFwLmdldChpZCkhLnNldChoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIG5vdCBwcmV2aW91c2x5IGNhcHR1cmVkLCB3ZSBjcmVhdGUgYSBtYXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGhpdE9iamVjdCwgYW5kIHRoZSBoaXQuIGhpdE9iamVjdCBpcyB1c2VkIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFzdGVyIGFjY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmNhcHR1cmVkTWFwLnNldChpZCwgbmV3IE1hcChbW2hpdC5ldmVudE9iamVjdCwgY2FwdHVyZURhdGFdXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGV2ZW50IG5vd1xuICAgICAgICAgICAgICAgICAgICAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGlkKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsZWFzZVBvaW50ZXJDYXB0dXJlID0gKGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZXMgPSBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVzLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIG5hdGl2ZSBldmVudCBwcm9wc1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RFdmVudFByb3BzOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIGV2ZW50J3MgcHJvcGVydGllcyBpbmNsdWRpbmcgdGhlIGluaGVyaXRlZCBvbmVzLiBOYXRpdmUgUG9pbnRlckV2ZW50cyBoYXZlIG1vc3Qgb2YgdGhlaXIgcHJvcHMgYXMgZ2V0dGVycyB3aGljaCBhcmUgaW5oZXJpdGVkLCBidXQgcG9seWZpbGxlZCBQb2ludGVyRXZlbnRzIGhhdmUgdGhlbSBhbGwgYXMgdGhlaXIgb3duIHByb3BlcnRpZXMgKGkuZS4gbm90IGluaGVyaXRlZCkuIFdlIGNhbid0IHVzZSBPYmplY3Qua2V5cygpIG9yIE9iamVjdC5lbnRyaWVzKCkgYXMgdGhleSBvbmx5IHJldHVybiBcIm93blwiIHByb3BlcnRpZXM7IG5vciBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXZlbnQpIGFzIHRoYXQgKmRvZXNuJ3QqIHJldHVybiBcIm93blwiIHByb3BlcnRpZXMsIG9ubHkgaW5oZXJpdGVkIG9uZXMuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZXZlbnRbcHJvcCBhcyBrZXlvZiBOZ3REb21FdmVudF07XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY29weSBvdmVyIGF0b21pY3MsIGxlYXZlIGZ1bmN0aW9ucyBhbG9uZSBhcyB0aGVzZSBzaG91bGQgYmVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGFzIGV2ZW50Lm5hdGl2ZUV2ZW50LmZuKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ2Z1bmN0aW9uJykgZXh0cmFjdEV2ZW50UHJvcHNbcHJvcF0gPSBwcm9wZXJ0eTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByYXljYXN0RXZlbnQ6IE5ndFRocmVlRXZlbnQ8Tmd0RG9tRXZlbnQ+ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5oaXQsXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4dHJhY3RFdmVudFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkOiBsb2NhbFN0YXRlLnN0b3BwZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhLFxuICAgICAgICAgICAgICAgICAgICB1bnByb2plY3RlZFBvaW50LFxuICAgICAgICAgICAgICAgICAgICByYXk6IHJheWNhc3Rlci5yYXksXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYTogY2FtZXJhLFxuICAgICAgICAgICAgICAgICAgICAvLyBIaWphY2sgc3RvcFByb3BhZ2F0aW9uLCB3aGljaCBqdXN0IHNldHMgYSBmbGFnXG4gICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW5kcnMvcmVhY3QtdGhyZWUtZmliZXIvaXNzdWVzLzU5NlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnRzIGFyZSBub3QgYWxsb3dlZCB0byBzdG9wIHByb3BhZ2F0aW9uIGlmIHRoZSBwb2ludGVyIGhhcyBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlc0ZvclBvaW50ZXIgPSAncG9pbnRlcklkJyBpbiBldmVudCAmJiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoZXZlbnQucG9pbnRlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhdXRob3JpemUgc3RvcFByb3BhZ2F0aW9uLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uaWYgdGhpcyBwb2ludGVyIGhhc24ndCBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhcHR1cmVzRm9yUG9pbnRlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBvciBpZiB0aGUgaGl0IG9iamVjdCBpcyBjYXB0dXJpbmcgdGhlIHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlc0ZvclBvaW50ZXIuaGFzKGhpdC5ldmVudE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWNhc3RFdmVudC5zdG9wcGVkID0gbG9jYWxTdGF0ZS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGlvbiBpcyBzdG9wcGVkLCByZW1vdmUgYWxsIG90aGVyIGhvdmVyIHJlY29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBldmVudCBoYW5kbGVyIGlzIG9ubHkgYWxsb3dlZCB0byBmbHVzaCBvdGhlciBoYW5kbGVycyBpZiBpdCBpcyBob3ZlcmVkIGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5zaXplICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20oaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkuZmluZCgoaSkgPT4gaS5ldmVudE9iamVjdCA9PT0gaGl0LmV2ZW50T2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3RzIGNhbm5vdCBmbHVzaCBvdXQgaGlnaGVyIHVwIG9iamVjdHMgdGhhdCBoYXZlIGFscmVhZHkgY2F1Z2h0IHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdoZXIgPSBpbnRlcnNlY3Rpb25zLnNsaWNlKDAsIGludGVyc2VjdGlvbnMuaW5kZXhPZihoaXQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUG9pbnRlcihbLi4uaGlnaGVyLCBoaXRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGFyZ2V0IGFuZCBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUG9pbnRlckNhcHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUG9pbnRlckNhcHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxsIHN1YnNjcmliZXJzXG4gICAgICAgICAgICAgICAgY2FsbGJhY2socmF5Y2FzdEV2ZW50KTtcbiAgICAgICAgICAgICAgICAvLyBFdmVudCBidWJibGluZyBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgc3RvcFByb3BhZ2F0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUuc3RvcHBlZCA9PT0gdHJ1ZSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuY2VsUG9pbnRlcihpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSkge1xuICAgICAgICBjb25zdCB7IGludGVybmFsIH0gPSBzdGF0ZUZhY3RvcnkoKTtcbiAgICAgICAgZm9yIChjb25zdCBob3ZlcmVkT2JqIG9mIGludGVybmFsLmhvdmVyZWQudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gbm8gb2JqZWN0cyB3ZXJlIGhpdCBvciB0aGUgaG92ZXJlZCBvYmplY3Qgd2Fzbid0IGZvdW5kIHVuZGVybmVhdGggdGhlIGN1cnNvclxuICAgICAgICAgICAgLy8gd2UgY2FsbCBvblBvaW50ZXJPdXQgYW5kIGRlbGV0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGhvdmVyZWQtZWxlbWVudHMgbWFwXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGhpdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5vYmplY3QgPT09IGhvdmVyZWRPYmoub2JqZWN0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQuaW5kZXggPT09IGhvdmVyZWRPYmouaW5kZXggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5pbnN0YW5jZUlkID09PSBob3ZlcmVkT2JqLmluc3RhbmNlSWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE9iamVjdCA9IGhvdmVyZWRPYmouZXZlbnRPYmplY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZUxvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gaW5zdGFuY2U/LmhhbmRsZXJzO1xuICAgICAgICAgICAgICAgIGludGVybmFsLmhvdmVyZWQuZGVsZXRlKG1ha2VJZChob3ZlcmVkT2JqKSk7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlPy5ldmVudENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIG91dCBpbnRlcnNlY3RzLCB0aGV5IGFyZSBvdXRkYXRlZCBieSBub3dcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHsgLi4uaG92ZXJlZE9iaiwgaW50ZXJzZWN0aW9ucyB9O1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm91dD8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnM/LnBvaW50ZXJsZWF2ZT8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2ludGVyTWlzc2VkKGV2ZW50OiBNb3VzZUV2ZW50LCBvYmplY3RzOiBUSFJFRS5PYmplY3QzRFtdKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZUxvY2FsU3RhdGUob2JqZWN0c1tpXSk7XG4gICAgICAgICAgICBpbnN0YW5jZT8uaGFuZGxlcnMucG9pbnRlcm1pc3NlZD8uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVBvaW50ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIERlYWwgd2l0aCBjYW5jZWxhdGlvblxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG4gICAgICAgICAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUG9pbnRlcihbXSk7XG4gICAgICAgICAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQ6IE5ndERvbUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaW50ZXJuYWwgfSA9IHN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgIWludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGV2ZW50IGludGVyZmFjZSBoYWQgb25Mb3N0UG9pbnRlckNhcHR1cmUsIHdlJ2QgY2FsbCBpdCBoZXJlIG9uIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QgdGhhdCdzIGdldHRpbmcgcmVtb3ZlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmNhcHR1cmVkTWFwLmRlbGV0ZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUG9pbnRlcihbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW55IG90aGVyIHBvaW50ZXIgZ29lcyBoZXJlIC4uLlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQ6IE5ndERvbUV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9uUG9pbnRlck1pc3NlZCwgaW50ZXJuYWwgfSA9IHN0YXRlRmFjdG9yeSgpO1xuXG4gICAgICAgICAgICAvLyBwcmVwYXJlUmF5KGV2ZW50KVxuICAgICAgICAgICAgaW50ZXJuYWwubGFzdEV2ZW50ID0gZXZlbnQ7XG5cbiAgICAgICAgICAgIC8vIEdldCBmcmVzaCBpbnRlcnNlY3RzXG4gICAgICAgICAgICBjb25zdCBpc1BvaW50ZXJNb3ZlID0gbmFtZSA9PT0gJ3BvaW50ZXJtb3ZlJztcbiAgICAgICAgICAgIGNvbnN0IGlzQ2xpY2tFdmVudCA9IG5hbWUgPT09ICdjbGljaycgfHwgbmFtZSA9PT0gJ2NvbnRleHRtZW51JyB8fCBuYW1lID09PSAnZGJsY2xpY2snO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gaXNQb2ludGVyTW92ZSA/IGZpbHRlclBvaW50ZXJFdmVudHMgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBjb25zdCBoaXRzID0gcGF0Y2hJbnRlcnNlY3RzKGludGVyc2VjdChmaWx0ZXIpLCBldmVudClcbiAgICAgICAgICAgIGNvbnN0IGhpdHMgPSBpbnRlcnNlY3QoZXZlbnQsIGZpbHRlcik7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGlzQ2xpY2tFdmVudCA/IGNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSA6IDA7XG5cbiAgICAgICAgICAgIC8vIFNhdmUgaW5pdGlhbCBjb29yZGluYXRlcyBvbiBwb2ludGVyLWRvd25cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAncG9pbnRlcmRvd24nKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWwuaW5pdGlhbENsaWNrID0gW2V2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFldO1xuICAgICAgICAgICAgICAgIGludGVybmFsLmluaXRpYWxIaXRzID0gaGl0cy5tYXAoKGhpdCkgPT4gaGl0LmV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgYSBjbGljayB5aWVsZHMgbm8gcmVzdWx0cywgcGFzcyBpdCBiYWNrIHRvIHRoZSB1c2VyIGFzIGEgbWlzc1xuICAgICAgICAgICAgLy8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3QgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIHVzZXItbGFuZCBzaWRlLWVmZmVjdCBjbGVhbiB1cFxuICAgICAgICAgICAgaWYgKGlzQ2xpY2tFdmVudCAmJiAhaGl0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPD0gMikge1xuICAgICAgICAgICAgICAgICAgICBwb2ludGVyTWlzc2VkKGV2ZW50LCBpbnRlcm5hbC5pbnRlcmFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvblBvaW50ZXJNaXNzZWQpIG9uUG9pbnRlck1pc3NlZChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGFrZSBjYXJlIG9mIHVuaG92ZXJcbiAgICAgICAgICAgIGlmIChpc1BvaW50ZXJNb3ZlKSBjYW5jZWxQb2ludGVyKGhpdHMpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBvbkludGVyc2VjdChkYXRhOiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50Pikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50T2JqZWN0ID0gZGF0YS5ldmVudE9iamVjdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEluc3RhbmNlTG9jYWxTdGF0ZShldmVudE9iamVjdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBpbnN0YW5jZT8uaGFuZGxlcnM7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgcHJlc2VuY2Ugb2YgaGFuZGxlcnNcbiAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlPy5ldmVudENvdW50KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIGV2ZW50IC4uLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm92ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVyZW50ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVyb3V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcmxlYXZlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBlbnRlciBvciBvdXQgaXMgcHJlc2VudCB0YWtlIGNhcmUgb2YgaG92ZXItc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gbWFrZUlkKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG92ZXJlZEl0ZW0gPSBpbnRlcm5hbC5ob3ZlcmVkLmdldChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhvdmVyZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCB3YXNuJ3QgcHJldmlvdXNseSBob3ZlcmVkLCBib29rIGl0IGFuZCBjYWxsIGl0cyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5zZXQoaWQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnBvaW50ZXJvdmVyPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnBvaW50ZXJlbnRlcj8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG92ZXJlZEl0ZW0uc3RvcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3Qgd2FzIHByZXZpb3VzbHkgaG92ZXJlZCBhbmQgc3RvcHBlZCwgd2Ugc2hvdWxkbid0IGFsbG93IG90aGVyIGl0ZW1zIHRvIHByb2NlZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgbW91c2UgbW92ZVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm1vdmU/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG90aGVyIGV2ZW50cyAuLi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzIVtuYW1lIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnNdIGFzIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD5cbiAgICAgICAgICAgICAgICAgICAgKSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yd2FyZCBhbGwgZXZlbnRzIGJhY2sgdG8gdGhlaXIgcmVzcGVjdGl2ZSBoYW5kbGVycyB3aXRoIHRoZSBleGNlcHRpb24gb2YgY2xpY2sgZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbXVzdCB1c2UgdGhlIGluaXRpYWwgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2xpY2tFdmVudCB8fCBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXNzZWQgZXZlbnRzIGhhdmUgdG8gY29tZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJNaXNzZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgY2FsbCB0aGUgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBvblBvaW50ZXJNaXNzZWQgb24gYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBwb2ludGVyIG92ZXIvb3V0IGhhbmRsZXJzLCBidXQgbm90IGNsaWNrIGFuZCB3ZXJlbid0IGhpdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2xpY2tFdmVudCAmJiBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyTWlzc2VkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaW50ZXJhY3Rpb24uZmlsdGVyKChvYmplY3QpID0+ICFpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhvYmplY3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhhbmRsZUludGVyc2VjdHMoaGl0cywgZXZlbnQsIGRlbHRhLCBvbkludGVyc2VjdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaGFuZGxlUG9pbnRlciB9O1xufVxuIl19
@@ -0,0 +1,6 @@
1
+ export function getInstanceLocalState(obj) {
2
+ if (!obj)
3
+ return undefined;
4
+ return obj['__ngt__'];
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWluc3RhbmNlLWxvY2FsLXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci10aHJlZS9zcmMvbGliL3V0aWxzL2dldC1pbnN0YW5jZS1sb2NhbC1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLEdBQTBCO0lBRTFCLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsT0FBUSxHQUFvQixDQUFDLFNBQVMsQ0FBMEIsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEluc3RhbmNlTG9jYWxTdGF0ZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbmNlTG9jYWxTdGF0ZTxUSW5zdGFuY2UgZXh0ZW5kcyBvYmplY3QgPSBOZ3RBbnlSZWNvcmQ+KFxuICAgIG9iajogVEluc3RhbmNlIHwgdW5kZWZpbmVkXG4pOiBOZ3RJbnN0YW5jZUxvY2FsU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghb2JqKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiAob2JqIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X18nXSBhcyBOZ3RJbnN0YW5jZUxvY2FsU3RhdGU7XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { inject, InjectionToken } from '@angular/core';
2
+ export function createInjection(description, { defaultValueOrFactory, provideValueFactory, } = {}) {
3
+ const factory = (defaultValueOrFactory && typeof defaultValueOrFactory === 'function'
4
+ ? defaultValueOrFactory
5
+ : () => defaultValueOrFactory);
6
+ const injectionToken = new InjectionToken(description, { factory });
7
+ function injectFn(options = {}) {
8
+ return inject(injectionToken, options);
9
+ }
10
+ function provideFn(value) {
11
+ return {
12
+ provide: injectionToken,
13
+ useValue: provideValueFactory ? provideValueFactory(value) : value,
14
+ };
15
+ }
16
+ return [injectFn, provideFn, injectionToken];
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci10aHJlZS9zcmMvbGliL3V0aWxzL2luamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBMkIsTUFBTSxlQUFlLENBQUM7QUFFaEYsTUFBTSxVQUFVLGVBQWUsQ0FJM0IsV0FBbUIsRUFDbkIsRUFDSSxxQkFBcUIsRUFDckIsbUJBQW1CLE1BSW5CLEVBQUU7SUFNTixNQUFNLE9BQU8sR0FBRyxDQUNaLHFCQUFxQixJQUFJLE9BQU8scUJBQXFCLEtBQUssVUFBVTtRQUNoRSxDQUFDLENBQUMscUJBQXFCO1FBQ3ZCLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FDZixDQUFDO0lBQ3ZCLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFcEUsU0FBUyxRQUFRLENBQUMsVUFBeUIsRUFBRTtRQUN6QyxPQUFPLE1BQU0sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFnQixDQUFDO0lBQzFELENBQUM7SUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFvQjtRQUNuQyxPQUFPO1lBQ0gsT0FBTyxFQUFFLGNBQWM7WUFDdkIsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztTQUNyRSxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGlvblRva2VuLCBJbmplY3RPcHRpb25zLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5qZWN0aW9uPFxuICAgIFRUb2tlblZhbHVlLFxuICAgIFRQcm92aWRlVmFsdWUgPSBUVG9rZW5WYWx1ZSBleHRlbmRzIG9iamVjdCA/IFBhcnRpYWw8VFRva2VuVmFsdWU+IDogVFRva2VuVmFsdWVcbj4oXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZU9yRmFjdG9yeSxcbiAgICAgICAgcHJvdmlkZVZhbHVlRmFjdG9yeSxcbiAgICB9OiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZU9yRmFjdG9yeT86IFRUb2tlblZhbHVlIHwgKCgpID0+IFRUb2tlblZhbHVlKTtcbiAgICAgICAgcHJvdmlkZVZhbHVlRmFjdG9yeT86ICh2YWx1ZTogVFByb3ZpZGVWYWx1ZSkgPT4gVFRva2VuVmFsdWU7XG4gICAgfSA9IHt9XG4pOiBbXG4gICAgaW5qZWN0Rm46IChvcHRpb25zPzogSW5qZWN0T3B0aW9ucykgPT4gVFRva2VuVmFsdWUsXG4gICAgcHJvdmlkZUZuOiAodmFsdWU6IFRQcm92aWRlVmFsdWUpID0+IFByb3ZpZGVyLFxuICAgIHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUVG9rZW5WYWx1ZT5cbl0ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSAoXG4gICAgICAgIGRlZmF1bHRWYWx1ZU9yRmFjdG9yeSAmJiB0eXBlb2YgZGVmYXVsdFZhbHVlT3JGYWN0b3J5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZU9yRmFjdG9yeVxuICAgICAgICAgICAgOiAoKSA9PiBkZWZhdWx0VmFsdWVPckZhY3RvcnlcbiAgICApIGFzICgpID0+IFRUb2tlblZhbHVlO1xuICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gbmV3IEluamVjdGlvblRva2VuKGRlc2NyaXB0aW9uLCB7IGZhY3RvcnkgfSk7XG5cbiAgICBmdW5jdGlvbiBpbmplY3RGbihvcHRpb25zOiBJbmplY3RPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGluamVjdChpbmplY3Rpb25Ub2tlbiwgb3B0aW9ucykgYXMgVFRva2VuVmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvdmlkZUZuKHZhbHVlOiBUUHJvdmlkZVZhbHVlKTogUHJvdmlkZXIge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvdmlkZTogaW5qZWN0aW9uVG9rZW4sXG4gICAgICAgICAgICB1c2VWYWx1ZTogcHJvdmlkZVZhbHVlRmFjdG9yeSA/IHByb3ZpZGVWYWx1ZUZhY3RvcnkodmFsdWUpIDogdmFsdWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtpbmplY3RGbiwgcHJvdmlkZUZuLCBpbmplY3Rpb25Ub2tlbl07XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { NgtRef } from '../ref';
2
+ import { applyProps } from './apply-props';
3
+ import { checkUpdate } from './check-update';
4
+ import { getInstanceLocalState } from './get-instance-local-state';
5
+ import { is } from './is';
6
+ export function invalidateInstance(instance) {
7
+ const state = getInstanceLocalState(instance)?.stateFactory();
8
+ if (state && state.internal.frames === 0)
9
+ state.invalidate();
10
+ checkUpdate(instance);
11
+ }
12
+ export function prepare(instance, parentStateFactory, rootStateFactory, parentInstance, previousInstance, isPrimitive = false) {
13
+ const previousInstanceInternal = getInstanceLocalState(previousInstance?.value);
14
+ const parent = parentInstance
15
+ ? parentInstance
16
+ : previousInstanceInternal
17
+ ? previousInstanceInternal.parentRef
18
+ : undefined;
19
+ if (is.scene(instance)) {
20
+ applyProps(instance, { dispose: null });
21
+ }
22
+ return Object.assign(instance, {
23
+ __ngt__: {
24
+ stateFactory: parentStateFactory,
25
+ rootFactory: rootStateFactory,
26
+ isPrimitive: !isPrimitive ? previousInstanceInternal?.isPrimitive : isPrimitive,
27
+ eventCount: previousInstanceInternal?.eventCount ?? 0,
28
+ handlers: previousInstanceInternal?.handlers ?? {},
29
+ instancesRefs: previousInstanceInternal?.instancesRefs ?? new NgtRef([]),
30
+ objectsRefs: previousInstanceInternal?.objectsRefs ?? new NgtRef([]),
31
+ parentRef: parent ? (parent === instance || parent.value === instance ? null : parent) : null,
32
+ },
33
+ });
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXRocmVlL3NyYy9saWIvdXRpbHMvaW5zdGFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFCLE1BQU0sVUFBVSxrQkFBa0IsQ0FBMkIsUUFBbUI7SUFDNUUsTUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDOUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3RCxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQ25CLFFBQW1CLEVBQ25CLGtCQUFtQyxFQUNuQyxnQkFBaUMsRUFDakMsY0FBdUIsRUFDdkIsZ0JBQXlCLEVBQ3pCLFdBQVcsR0FBRyxLQUFLO0lBRW5CLE1BQU0sd0JBQXdCLEdBQUcscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFaEYsTUFBTSxNQUFNLEdBQUcsY0FBYztRQUN6QixDQUFDLENBQUMsY0FBYztRQUNoQixDQUFDLENBQUMsd0JBQXdCO1lBQzFCLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTO1lBQ3BDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFaEIsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3BCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUMzQztJQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDM0IsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLGtCQUFrQjtZQUNoQyxXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXO1lBQy9FLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLElBQUksQ0FBQztZQUNyRCxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxJQUFJLEVBQUU7WUFDbEQsYUFBYSxFQUFFLHdCQUF3QixFQUFFLGFBQWEsSUFBSSxJQUFJLE1BQU0sQ0FBQyxFQUFjLENBQUM7WUFDcEYsV0FBVyxFQUFFLHdCQUF3QixFQUFFLFdBQVcsSUFBSSxJQUFJLE1BQU0sQ0FBQyxFQUFjLENBQUM7WUFDaEYsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQ2hHO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5ndFJlZiB9IGZyb20gJy4uL3JlZic7XG5pbXBvcnQgdHlwZSB7IE5ndEFueVJlY29yZCwgTmd0SW5zdGFuY2VOb2RlLCBOZ3RTdGF0ZUZhY3RvcnkgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi9hcHBseS1wcm9wcyc7XG5pbXBvcnQgeyBjaGVja1VwZGF0ZSB9IGZyb20gJy4vY2hlY2stdXBkYXRlJztcbmltcG9ydCB7IGdldEluc3RhbmNlTG9jYWxTdGF0ZSB9IGZyb20gJy4vZ2V0LWluc3RhbmNlLWxvY2FsLXN0YXRlJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi9pcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlSW5zdGFuY2U8VEluc3RhbmNlIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YW5jZUxvY2FsU3RhdGUoaW5zdGFuY2UpPy5zdGF0ZUZhY3RvcnkoKTtcbiAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaW50ZXJuYWwuZnJhbWVzID09PSAwKSBzdGF0ZS5pbnZhbGlkYXRlKCk7XG4gICAgY2hlY2tVcGRhdGUoaW5zdGFuY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZTxUSW5zdGFuY2UgZXh0ZW5kcyBvYmplY3QgPSBOZ3RBbnlSZWNvcmQ+KFxuICAgIGluc3RhbmNlOiBUSW5zdGFuY2UsXG4gICAgcGFyZW50U3RhdGVGYWN0b3J5OiBOZ3RTdGF0ZUZhY3RvcnksXG4gICAgcm9vdFN0YXRlRmFjdG9yeTogTmd0U3RhdGVGYWN0b3J5LFxuICAgIHBhcmVudEluc3RhbmNlPzogTmd0UmVmLFxuICAgIHByZXZpb3VzSW5zdGFuY2U/OiBOZ3RSZWYsXG4gICAgaXNQcmltaXRpdmUgPSBmYWxzZVxuKTogTmd0SW5zdGFuY2VOb2RlPFRJbnN0YW5jZT4ge1xuICAgIGNvbnN0IHByZXZpb3VzSW5zdGFuY2VJbnRlcm5hbCA9IGdldEluc3RhbmNlTG9jYWxTdGF0ZShwcmV2aW91c0luc3RhbmNlPy52YWx1ZSk7XG5cbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRJbnN0YW5jZVxuICAgICAgICA/IHBhcmVudEluc3RhbmNlXG4gICAgICAgIDogcHJldmlvdXNJbnN0YW5jZUludGVybmFsXG4gICAgICAgID8gcHJldmlvdXNJbnN0YW5jZUludGVybmFsLnBhcmVudFJlZlxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChpcy5zY2VuZShpbnN0YW5jZSkpIHtcbiAgICAgICAgYXBwbHlQcm9wcyhpbnN0YW5jZSwgeyBkaXNwb3NlOiBudWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICAgIF9fbmd0X186IHtcbiAgICAgICAgICAgIHN0YXRlRmFjdG9yeTogcGFyZW50U3RhdGVGYWN0b3J5LFxuICAgICAgICAgICAgcm9vdEZhY3Rvcnk6IHJvb3RTdGF0ZUZhY3RvcnksXG4gICAgICAgICAgICBpc1ByaW1pdGl2ZTogIWlzUHJpbWl0aXZlID8gcHJldmlvdXNJbnN0YW5jZUludGVybmFsPy5pc1ByaW1pdGl2ZSA6IGlzUHJpbWl0aXZlLFxuICAgICAgICAgICAgZXZlbnRDb3VudDogcHJldmlvdXNJbnN0YW5jZUludGVybmFsPy5ldmVudENvdW50ID8/IDAsXG4gICAgICAgICAgICBoYW5kbGVyczogcHJldmlvdXNJbnN0YW5jZUludGVybmFsPy5oYW5kbGVycyA/PyB7fSxcbiAgICAgICAgICAgIGluc3RhbmNlc1JlZnM6IHByZXZpb3VzSW5zdGFuY2VJbnRlcm5hbD8uaW5zdGFuY2VzUmVmcyA/PyBuZXcgTmd0UmVmKFtdIGFzIE5ndFJlZltdKSxcbiAgICAgICAgICAgIG9iamVjdHNSZWZzOiBwcmV2aW91c0luc3RhbmNlSW50ZXJuYWw/Lm9iamVjdHNSZWZzID8/IG5ldyBOZ3RSZWYoW10gYXMgTmd0UmVmW10pLFxuICAgICAgICAgICAgcGFyZW50UmVmOiBwYXJlbnQgPyAocGFyZW50ID09PSBpbnN0YW5jZSB8fCBwYXJlbnQudmFsdWUgPT09IGluc3RhbmNlID8gbnVsbCA6IHBhcmVudCkgOiBudWxsLFxuICAgICAgICB9LFxuICAgIH0pO1xufVxuIl19
@@ -0,0 +1,54 @@
1
+ import * as THREE from 'three';
2
+ import { NgtRef } from '../ref';
3
+ export const is = {
4
+ obj: (a) => a === Object(a) && !Array.isArray(a) && typeof a !== 'function',
5
+ material: (a) => !!a && a.isMaterial,
6
+ geometry: (a) => !!a && a.isBufferGeometry,
7
+ mesh: (a) => !!a && a.isMesh,
8
+ color: (a) => !!a && a.isColor,
9
+ orthographic: (a) => !!a && a.isOrthographicCamera,
10
+ perspective: (a) => !!a && a.isPerspectiveCamera,
11
+ camera: (a) => !!a && a.isCamera,
12
+ glRenderer: (a) => !!a && a instanceof THREE.WebGLRenderer,
13
+ scene: (a) => !!a && a.isScene,
14
+ object3d: (a) => !!a && a.isObject3D,
15
+ instance: (a) => !!a && !!a['__ngt__'],
16
+ ref: (a) => !!a && a instanceof NgtRef,
17
+ supportColorManagement: () => 'ColorManagement' in THREE,
18
+ canvas: (a) => a instanceof HTMLCanvasElement,
19
+ equ(a, b, { arrays = 'shallow', objects = 'reference', strict = true } = {}) {
20
+ // Wrong type or one of the two undefined, doesn't match
21
+ if (typeof a !== typeof b || !!a !== !!b)
22
+ return false;
23
+ // Atomic, just compare a against b
24
+ if (typeof a === 'string' || typeof a === 'number')
25
+ return a === b;
26
+ const isObj = is.obj(a);
27
+ if (isObj && objects === 'reference')
28
+ return a === b;
29
+ const isArr = Array.isArray(a);
30
+ if (isArr && arrays === 'reference')
31
+ return a === b;
32
+ // Array or Object, shallow compare first to see if it's a match
33
+ if ((isArr || isObj) && a === b)
34
+ return true;
35
+ // Last resort, go through keys
36
+ let i;
37
+ for (i in a)
38
+ if (!(i in b))
39
+ return false;
40
+ for (i in strict ? b : a)
41
+ if (a[i] !== b[i])
42
+ return false;
43
+ if (i === void 0) {
44
+ if (isArr && a.length === 0 && b.length === 0)
45
+ return true;
46
+ if (isObj && Object.keys(a).length === 0 && Object.keys(b).length === 0)
47
+ return true;
48
+ if (a !== b)
49
+ return false;
50
+ }
51
+ return true;
52
+ },
53
+ };
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXRocmVlL3NyYy9saWIvdXRpbHMvaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUdoQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUc7SUFDZCxHQUFHLEVBQUUsQ0FBQyxDQUFVLEVBQWUsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVU7SUFDakcsUUFBUSxFQUFFLENBQUMsQ0FBVSxFQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUFvQixDQUFDLFVBQVU7SUFDdEYsUUFBUSxFQUFFLENBQUMsQ0FBVSxFQUE2QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUEwQixDQUFDLGdCQUFnQjtJQUN4RyxJQUFJLEVBQUUsQ0FBQyxDQUFVLEVBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQWdCLENBQUMsTUFBTTtJQUN0RSxLQUFLLEVBQUUsQ0FBQyxDQUFVLEVBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQWlCLENBQUMsT0FBTztJQUMxRSxZQUFZLEVBQUUsQ0FBQyxDQUFVLEVBQWlDLEVBQUUsQ0FDeEQsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUE4QixDQUFDLG9CQUFvQjtJQUMvRCxXQUFXLEVBQUUsQ0FBQyxDQUFVLEVBQWdDLEVBQUUsQ0FDdEQsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUE2QixDQUFDLG1CQUFtQjtJQUM3RCxNQUFNLEVBQUUsQ0FBQyxDQUFVLEVBQXFCLEVBQUUsQ0FB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O1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBOZ3RSZWYgfSBmcm9tICcuLi9yZWYnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEVxdUNvbmZpZywgTmd0SW5zdGFuY2VOb2RlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXMgPSB7XG4gICAgb2JqOiAoYTogdW5rbm93bik6IGEgaXMgb2JqZWN0ID0+IGEgPT09IE9iamVjdChhKSAmJiAhQXJyYXkuaXNBcnJheShhKSAmJiB0eXBlb2YgYSAhPT0gJ2Z1bmN0aW9uJyxcbiAgICBtYXRlcmlhbDogKGE6IHVua25vd24pOiBhIGlzIFRIUkVFLk1hdGVyaWFsID0+ICEhYSAmJiAoYSBhcyBUSFJFRS5NYXRlcmlhbCkuaXNNYXRlcmlhbCxcbiAgICBnZW9tZXRyeTogKGE6IHVua25vd24pOiBhIGlzIFRIUkVFLkJ1ZmZlckdlb21ldHJ5ID0+ICEhYSAmJiAoYSBhcyBUSFJFRS5CdWZmZXJHZW9tZXRyeSkuaXNCdWZmZXJHZW9tZXRyeSxcbiAgICBtZXNoOiAoYTogdW5rbm93bik6IGEgaXMgVEhSRUUuTWVzaCA9PiAhIWEgJiYgKGEgYXMgVEhSRUUuTWVzaCkuaXNNZXNoLFxuICAgIGNvbG9yOiAoYTogdW5rbm93bik6IGEgaXMgVEhSRUUuQ29sb3IgPT4gISFhICYmIChhIGFzIFRIUkVFLkNvbG9yKS5pc0NvbG9yLFxuICAgIG9ydGhvZ3JhcGhpYzogKGE6IHVua25vd24pOiBhIGlzIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSA9PlxuICAgICAgICAhIWEgJiYgKGEgYXMgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKS5pc09ydGhvZ3JhcGhpY0NhbWVyYSxcbiAgICBwZXJzcGVjdGl2ZTogKGE6IHVua25vd24pOiBhIGlzIFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhID0+XG4gICAgICAgICEhYSAmJiAoYSBhcyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSkuaXNQZXJzcGVjdGl2ZUNhbWVyYSxcbiAgICBjYW1lcmE6IChhOiB1bmtub3duKTogYSBpcyBUSFJFRS5DYW1lcmEgPT4gISFhICYmIChhIGFzIFRIUkVFLkNhbWVyYSkuaXNDYW1lcmEsXG4gICAgZ2xSZW5kZXJlcjogKGE6IHVua25vd24pOiBhIGlzIFRIUkVFLldlYkdMUmVuZGVyZXIgPT4gISFhICYmIGEgaW5zdGFuY2VvZiBUSFJFRS5XZWJHTFJlbmRlcmVyLFxuICAgIHNjZW5lOiAoYTogdW5rbm93bik6IGEgaXMgVEhSRUUuU2NlbmUgPT4gISFhICYmIChhIGFzIFRIUkVFLlNjZW5lKS5pc1NjZW5lLFxuICAgIG9iamVjdDNkOiAoYTogdW5rbm93bik6IGEgaXMgVEhSRUUuT2JqZWN0M0QgPT4gISFhICYmIChhIGFzIFRIUkVFLk9iamVjdDNEKS5pc09iamVjdDNELFxuICAgIGluc3RhbmNlOiAoYTogdW5rbm93bik6IGEgaXMgTmd0SW5zdGFuY2VOb2RlID0+ICEhYSAmJiAhIShhIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X18nXSxcbiAgICByZWY6IChhOiB1bmtub3duKTogYSBpcyBOZ3RSZWYgPT4gISFhICYmIGEgaW5zdGFuY2VvZiBOZ3RSZWYsXG4gICAgc3VwcG9ydENvbG9yTWFuYWdlbWVudDogKCk6IGJvb2xlYW4gPT4gJ0NvbG9yTWFuYWdlbWVudCcgaW4gVEhSRUUsXG4gICAgY2FudmFzOiAoYTogdW5rbm93bik6IGEgaXMgSFRNTENhbnZhc0VsZW1lbnQgPT4gYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50LFxuICAgIGVxdShhOiBhbnksIGI6IGFueSwgeyBhcnJheXMgPSAnc2hhbGxvdycsIG9iamVjdHMgPSAncmVmZXJlbmNlJywgc3RyaWN0ID0gdHJ1ZSB9OiBOZ3RFcXVDb25maWcgPSB7fSkge1xuICAgICAgICAvLyBXcm9uZyB0eXBlIG9yIG9uZSBvZiB0aGUgdHdvIHVuZGVmaW5lZCwgZG9lc24ndCBtYXRjaFxuICAgICAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiIHx8ICEhYSAhPT0gISFiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIEF0b21pYywganVzdCBjb21wYXJlIGEgYWdhaW5zdCBiXG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGEgPT09ICdudW1iZXInKSByZXR1cm4gYSA9PT0gYjtcbiAgICAgICAgY29uc3QgaXNPYmogPSBpcy5vYmooYSk7XG4gICAgICAgIGlmIChpc09iaiAmJiBvYmplY3RzID09PSAncmVmZXJlbmNlJykgcmV0dXJuIGEgPT09IGI7XG4gICAgICAgIGNvbnN0IGlzQXJyID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICAgICAgaWYgKGlzQXJyICYmIGFycmF5cyA9PT0gJ3JlZmVyZW5jZScpIHJldHVybiBhID09PSBiO1xuICAgICAgICAvLyBBcnJheSBvciBPYmplY3QsIHNoYWxsb3cgY29tcGFyZSBmaXJzdCB0byBzZWUgaWYgaXQncyBhIG1hdGNoXG4gICAgICAgIGlmICgoaXNBcnIgfHwgaXNPYmopICYmIGEgPT09IGIpIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBMYXN0IHJlc29ydCwgZ28gdGhyb3VnaCBrZXlzXG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgaW4gYSkgaWYgKCEoaSBpbiBiKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGkgaW4gc3RyaWN0ID8gYiA6IGEpIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChpID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmIChpc0FyciAmJiBhLmxlbmd0aCA9PT0gMCAmJiBiLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoaXNPYmogJiYgT2JqZWN0LmtleXMoYSkubGVuZ3RoID09PSAwICYmIE9iamVjdC5rZXlzKGIpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoYSAhPT0gYikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59O1xuIl19