three-nebula 11.0.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/three-nebula.cjs +109 -0
  3. package/dist/three-nebula.cjs.map +1 -0
  4. package/dist/three-nebula.mjs +2968 -0
  5. package/dist/three-nebula.mjs.map +1 -0
  6. package/dist/three-nebula.umd.js +109 -0
  7. package/dist/three-nebula.umd.js.map +1 -0
  8. package/package.json +23 -47
  9. package/specs/01-emitter-hierarchy.md +200 -0
  10. package/specs/02-determinism-scrubbing.md +188 -0
  11. package/specs/03-sound-renderer.md +183 -0
  12. package/specs/04-schema-versioning.md +140 -0
  13. package/specs/05-content-addressed-assets.md +288 -0
  14. package/specs/README.md +80 -0
  15. package/build/cjs/behaviour/Alpha.js +0 -189
  16. package/build/cjs/behaviour/Attraction.js +0 -189
  17. package/build/cjs/behaviour/Behaviour.js +0 -253
  18. package/build/cjs/behaviour/Collision.js +0 -146
  19. package/build/cjs/behaviour/Color.js +0 -148
  20. package/build/cjs/behaviour/CrossZone.js +0 -141
  21. package/build/cjs/behaviour/Force.js +0 -126
  22. package/build/cjs/behaviour/Gravity.js +0 -78
  23. package/build/cjs/behaviour/RandomDrift.js +0 -153
  24. package/build/cjs/behaviour/Repulsion.js +0 -123
  25. package/build/cjs/behaviour/Rotate.js +0 -265
  26. package/build/cjs/behaviour/Scale.js +0 -177
  27. package/build/cjs/behaviour/Spring.js +0 -133
  28. package/build/cjs/behaviour/constants.js +0 -28
  29. package/build/cjs/behaviour/index.js +0 -112
  30. package/build/cjs/behaviour/types.js +0 -33
  31. package/build/cjs/constants/index.js +0 -61
  32. package/build/cjs/core/Particle.js +0 -390
  33. package/build/cjs/core/Pool.js +0 -203
  34. package/build/cjs/core/System.js +0 -366
  35. package/build/cjs/core/constants.js +0 -163
  36. package/build/cjs/core/fromJSON.js +0 -128
  37. package/build/cjs/core/fromJSONAsync.js +0 -239
  38. package/build/cjs/core/index.js +0 -32
  39. package/build/cjs/core/three/Euler.js +0 -233
  40. package/build/cjs/core/three/Math.js +0 -91
  41. package/build/cjs/core/three/Matrix4.js +0 -745
  42. package/build/cjs/core/three/Quaternion.js +0 -451
  43. package/build/cjs/core/three/Vector3.js +0 -464
  44. package/build/cjs/core/three/constants.js +0 -298
  45. package/build/cjs/core/three/index.js +0 -48
  46. package/build/cjs/core/types.js +0 -13
  47. package/build/cjs/debug/Debug.js +0 -209
  48. package/build/cjs/debug/constants.js +0 -19
  49. package/build/cjs/debug/index.js +0 -24
  50. package/build/cjs/debug/log.js +0 -38
  51. package/build/cjs/ease/index.js +0 -149
  52. package/build/cjs/emitter/Emitter.js +0 -798
  53. package/build/cjs/emitter/FollowEmitter.js +0 -146
  54. package/build/cjs/emitter/constants.js +0 -20
  55. package/build/cjs/emitter/index.js +0 -24
  56. package/build/cjs/emitter/types.js +0 -11
  57. package/build/cjs/events/EventDispatcher.js +0 -105
  58. package/build/cjs/events/constants.js +0 -23
  59. package/build/cjs/events/index.js +0 -27
  60. package/build/cjs/index.js +0 -151
  61. package/build/cjs/initializer/Body.js +0 -122
  62. package/build/cjs/initializer/BodySprite.js +0 -146
  63. package/build/cjs/initializer/Initializer.js +0 -109
  64. package/build/cjs/initializer/InitializerUtil.js +0 -54
  65. package/build/cjs/initializer/Life.js +0 -106
  66. package/build/cjs/initializer/Mass.js +0 -101
  67. package/build/cjs/initializer/Position.js +0 -152
  68. package/build/cjs/initializer/Radius.js +0 -118
  69. package/build/cjs/initializer/Rate.js +0 -150
  70. package/build/cjs/initializer/Rotation.js +0 -95
  71. package/build/cjs/initializer/Texture.js +0 -139
  72. package/build/cjs/initializer/Velocity/PolarVelocity.js +0 -102
  73. package/build/cjs/initializer/Velocity/RadialVelocity.js +0 -111
  74. package/build/cjs/initializer/Velocity/VectorVelocity.js +0 -108
  75. package/build/cjs/initializer/Velocity/Velocity.js +0 -94
  76. package/build/cjs/initializer/Velocity/index.js +0 -32
  77. package/build/cjs/initializer/constants.js +0 -43
  78. package/build/cjs/initializer/index.js +0 -108
  79. package/build/cjs/initializer/types.js +0 -37
  80. package/build/cjs/math/ArraySpan.js +0 -103
  81. package/build/cjs/math/Box.js +0 -46
  82. package/build/cjs/math/ColorSpan.js +0 -113
  83. package/build/cjs/math/MathUtils.js +0 -57
  84. package/build/cjs/math/Polar3D.js +0 -115
  85. package/build/cjs/math/Span.js +0 -88
  86. package/build/cjs/math/Vector3D.js +0 -76
  87. package/build/cjs/math/constants.js +0 -35
  88. package/build/cjs/math/index.js +0 -122
  89. package/build/cjs/math/integration.js +0 -59
  90. package/build/cjs/math/types.js +0 -19
  91. package/build/cjs/renderer/BaseRenderer.js +0 -108
  92. package/build/cjs/renderer/CustomRenderer.js +0 -65
  93. package/build/cjs/renderer/GPURenderer/Desktop/index.js +0 -371
  94. package/build/cjs/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -13
  95. package/build/cjs/renderer/GPURenderer/Desktop/shaders/index.js +0 -22
  96. package/build/cjs/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -17
  97. package/build/cjs/renderer/GPURenderer/Mobile/index.js +0 -385
  98. package/build/cjs/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -13
  99. package/build/cjs/renderer/GPURenderer/Mobile/shaders/index.js +0 -22
  100. package/build/cjs/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -15
  101. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -58
  102. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -93
  103. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -9
  104. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/index.js +0 -221
  105. package/build/cjs/renderer/GPURenderer/common/constants.js +0 -22
  106. package/build/cjs/renderer/GPURenderer/common/index.js +0 -38
  107. package/build/cjs/renderer/GPURenderer/common/shaders/constants.js +0 -9
  108. package/build/cjs/renderer/GPURenderer/common/stores/Target.js +0 -45
  109. package/build/cjs/renderer/GPURenderer/common/stores/UniqueList.js +0 -51
  110. package/build/cjs/renderer/GPURenderer/common/stores/index.js +0 -22
  111. package/build/cjs/renderer/GPURenderer/index.js +0 -97
  112. package/build/cjs/renderer/MeshRenderer.js +0 -136
  113. package/build/cjs/renderer/SpriteRenderer.js +0 -68
  114. package/build/cjs/renderer/index.js +0 -40
  115. package/build/cjs/renderer/types.js +0 -21
  116. package/build/cjs/utils/ColorUtil.js +0 -39
  117. package/build/cjs/utils/PUID.js +0 -26
  118. package/build/cjs/utils/THREEUtil.js +0 -40
  119. package/build/cjs/utils/Util.js +0 -69
  120. package/build/cjs/utils/index.js +0 -61
  121. package/build/cjs/utils/uid.js +0 -12
  122. package/build/cjs/zone/BoxZone.js +0 -178
  123. package/build/cjs/zone/LineZone.js +0 -101
  124. package/build/cjs/zone/MeshZone.js +0 -101
  125. package/build/cjs/zone/PointZone.js +0 -99
  126. package/build/cjs/zone/ScreenZone.js +0 -164
  127. package/build/cjs/zone/SphereZone.js +0 -155
  128. package/build/cjs/zone/Zone.js +0 -172
  129. package/build/cjs/zone/index.js +0 -56
  130. package/build/cjs/zone/types.js +0 -21
  131. package/build/esm/behaviour/Alpha.js +0 -134
  132. package/build/esm/behaviour/Attraction.js +0 -135
  133. package/build/esm/behaviour/Behaviour.js +0 -215
  134. package/build/esm/behaviour/Collision.js +0 -100
  135. package/build/esm/behaviour/Color.js +0 -101
  136. package/build/esm/behaviour/CrossZone.js +0 -82
  137. package/build/esm/behaviour/Force.js +0 -83
  138. package/build/esm/behaviour/Gravity.js +0 -40
  139. package/build/esm/behaviour/RandomDrift.js +0 -97
  140. package/build/esm/behaviour/Repulsion.js +0 -81
  141. package/build/esm/behaviour/Rotate.js +0 -214
  142. package/build/esm/behaviour/Scale.js +0 -131
  143. package/build/esm/behaviour/Spring.js +0 -90
  144. package/build/esm/behaviour/constants.js +0 -11
  145. package/build/esm/behaviour/index.js +0 -14
  146. package/build/esm/behaviour/types.js +0 -14
  147. package/build/esm/constants/index.js +0 -42
  148. package/build/esm/core/Particle.js +0 -357
  149. package/build/esm/core/Pool.js +0 -161
  150. package/build/esm/core/System.js +0 -320
  151. package/build/esm/core/constants.js +0 -127
  152. package/build/esm/core/fromJSON.js +0 -107
  153. package/build/esm/core/fromJSONAsync.js +0 -210
  154. package/build/esm/core/index.js +0 -4
  155. package/build/esm/core/three/Euler.js +0 -224
  156. package/build/esm/core/three/Math.js +0 -84
  157. package/build/esm/core/three/Matrix4.js +0 -739
  158. package/build/esm/core/three/Quaternion.js +0 -445
  159. package/build/esm/core/three/Vector3.js +0 -457
  160. package/build/esm/core/three/constants.js +0 -148
  161. package/build/esm/core/three/index.js +0 -5
  162. package/build/esm/core/types.js +0 -4
  163. package/build/esm/debug/Debug.js +0 -195
  164. package/build/esm/debug/constants.js +0 -7
  165. package/build/esm/debug/index.js +0 -3
  166. package/build/esm/debug/log.js +0 -31
  167. package/build/esm/ease/index.js +0 -113
  168. package/build/esm/emitter/Emitter.js +0 -708
  169. package/build/esm/emitter/FollowEmitter.js +0 -97
  170. package/build/esm/emitter/constants.js +0 -7
  171. package/build/esm/emitter/index.js +0 -3
  172. package/build/esm/emitter/types.js +0 -3
  173. package/build/esm/events/EventDispatcher.js +0 -82
  174. package/build/esm/events/constants.js +0 -9
  175. package/build/esm/events/index.js +0 -4
  176. package/build/esm/index.js +0 -13
  177. package/build/esm/initializer/Body.js +0 -83
  178. package/build/esm/initializer/BodySprite.js +0 -108
  179. package/build/esm/initializer/Initializer.js +0 -84
  180. package/build/esm/initializer/InitializerUtil.js +0 -48
  181. package/build/esm/initializer/Life.js +0 -66
  182. package/build/esm/initializer/Mass.js +0 -60
  183. package/build/esm/initializer/Position.js +0 -98
  184. package/build/esm/initializer/Radius.js +0 -75
  185. package/build/esm/initializer/Rate.js +0 -107
  186. package/build/esm/initializer/Rotation.js +0 -54
  187. package/build/esm/initializer/Texture.js +0 -101
  188. package/build/esm/initializer/Velocity/PolarVelocity.js +0 -63
  189. package/build/esm/initializer/Velocity/RadialVelocity.js +0 -72
  190. package/build/esm/initializer/Velocity/VectorVelocity.js +0 -69
  191. package/build/esm/initializer/Velocity/Velocity.js +0 -52
  192. package/build/esm/initializer/Velocity/index.js +0 -4
  193. package/build/esm/initializer/constants.js +0 -26
  194. package/build/esm/initializer/index.js +0 -12
  195. package/build/esm/initializer/types.js +0 -16
  196. package/build/esm/math/ArraySpan.js +0 -62
  197. package/build/esm/math/Box.js +0 -25
  198. package/build/esm/math/ColorSpan.js +0 -71
  199. package/build/esm/math/MathUtils.js +0 -48
  200. package/build/esm/math/Polar3D.js +0 -81
  201. package/build/esm/math/Span.js +0 -63
  202. package/build/esm/math/Vector3D.js +0 -34
  203. package/build/esm/math/constants.js +0 -24
  204. package/build/esm/math/index.js +0 -10
  205. package/build/esm/math/integration.js +0 -47
  206. package/build/esm/math/types.js +0 -7
  207. package/build/esm/renderer/BaseRenderer.js +0 -78
  208. package/build/esm/renderer/CustomRenderer.js +0 -23
  209. package/build/esm/renderer/GPURenderer/Desktop/index.js +0 -357
  210. package/build/esm/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -30
  211. package/build/esm/renderer/GPURenderer/Desktop/shaders/index.js +0 -3
  212. package/build/esm/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -36
  213. package/build/esm/renderer/GPURenderer/Mobile/index.js +0 -375
  214. package/build/esm/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -27
  215. package/build/esm/renderer/GPURenderer/Mobile/shaders/index.js +0 -3
  216. package/build/esm/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -33
  217. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -30
  218. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -70
  219. package/build/esm/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -2
  220. package/build/esm/renderer/GPURenderer/common/TextureAtlas/index.js +0 -206
  221. package/build/esm/renderer/GPURenderer/common/constants.js +0 -13
  222. package/build/esm/renderer/GPURenderer/common/index.js +0 -4
  223. package/build/esm/renderer/GPURenderer/common/shaders/constants.js +0 -2
  224. package/build/esm/renderer/GPURenderer/common/stores/Target.js +0 -26
  225. package/build/esm/renderer/GPURenderer/common/stores/UniqueList.js +0 -29
  226. package/build/esm/renderer/GPURenderer/common/stores/index.js +0 -3
  227. package/build/esm/renderer/GPURenderer/index.js +0 -57
  228. package/build/esm/renderer/MeshRenderer.js +0 -93
  229. package/build/esm/renderer/SpriteRenderer.js +0 -30
  230. package/build/esm/renderer/index.js +0 -5
  231. package/build/esm/renderer/types.js +0 -8
  232. package/build/esm/utils/ColorUtil.js +0 -32
  233. package/build/esm/utils/PUID.js +0 -19
  234. package/build/esm/utils/THREEUtil.js +0 -31
  235. package/build/esm/utils/Util.js +0 -60
  236. package/build/esm/utils/index.js +0 -13
  237. package/build/esm/utils/uid.js +0 -3
  238. package/build/esm/zone/BoxZone.js +0 -133
  239. package/build/esm/zone/LineZone.js +0 -61
  240. package/build/esm/zone/MeshZone.js +0 -60
  241. package/build/esm/zone/PointZone.js +0 -59
  242. package/build/esm/zone/ScreenZone.js +0 -116
  243. package/build/esm/zone/SphereZone.js +0 -113
  244. package/build/esm/zone/Zone.js +0 -141
  245. package/build/esm/zone/index.js +0 -7
  246. package/build/esm/zone/types.js +0 -8
  247. package/build/three-nebula.js +0 -2
  248. package/build/three-nebula.js.map +0 -1
@@ -1,708 +0,0 @@
1
- import { DEFAULT_BIND_EMITTER, DEFAULT_BIND_EMITTER_EVENT, DEFAULT_DAMPING, DEFAULT_EMITTER_INDEX, DEFAULT_EMITTER_RATE } from './constants';
2
- import EventDispatcher, { EMITTER_DEAD, PARTICLE_CREATED, PARTICLE_DEAD, PARTICLE_UPDATE, SYSTEM_UPDATE } from '../events';
3
- import { INTEGRATION_TYPE_EULER, integrate } from '../math';
4
- import { Util, uid } from '../utils';
5
- import { InitializerUtil } from '../initializer';
6
- import Particle from '../core/Particle';
7
- import isNumber from 'lodash/isNumber';
8
- import { EMITTER_TYPE_EMITTER as type } from './types';
9
- /**
10
- * Emitters are the System engine's particle factories. They cause particles to
11
- * be rendered by emitting them, and store all particle initializers and behaviours.
12
- *
13
- */
14
-
15
- export default class Emitter extends Particle {
16
- /**
17
- * Constructs an Emitter instance.
18
- *
19
- * @param {object} properties - The properties to instantiate the emitter with
20
- * @return void
21
- */
22
- constructor(properties) {
23
- super(properties);
24
- /**
25
- * @desc The class type.
26
- * @type {string}
27
- */
28
-
29
- this.type = type;
30
- /**
31
- * @desc The particles emitted by this emitter.
32
- * @type {array}
33
- */
34
-
35
- this.particles = [];
36
- /**
37
- * @desc The initializers for particles emitted by this emitter.
38
- * @type {array}
39
- */
40
-
41
- this.initializers = [];
42
- /**
43
- * @desc The behaviours for particles emitted by this emitter.
44
- * @type {array}
45
- */
46
-
47
- this.behaviours = [];
48
- /**
49
- * @desc The behaviours for the emitter.
50
- * @type {array}
51
- */
52
-
53
- this.emitterBehaviours = [];
54
- /**
55
- * @desc The current emit iteration.
56
- * @type {integer}
57
- */
58
-
59
- this.currentEmitTime = 0;
60
- /**
61
- * @desc The total number of times the emitter should emit particles.
62
- * @type {integer}
63
- */
64
-
65
- this.totalEmitTimes = -1;
66
- /**
67
- * @desc The friction coefficient for all particle to emit by.
68
- * @type {number}
69
- */
70
-
71
- this.damping = DEFAULT_DAMPING;
72
- /**
73
- * @desc Ensures that particles emitted by this emitter are positioned
74
- * according to the emitter's properties.
75
- * @type {boolean}
76
- */
77
-
78
- this.bindEmitter = DEFAULT_BIND_EMITTER;
79
- /**
80
- * @desc Determines if the emitter will dispatch internal events. Defaults
81
- * to false
82
- * @type {boolean}
83
- */
84
-
85
- this.bindEmitterEvent = DEFAULT_BIND_EMITTER_EVENT;
86
- /**
87
- * @desc The number of particles to emit per second (a [particle]/b [s])
88
- * @type {Rate}
89
- */
90
-
91
- this.rate = DEFAULT_EMITTER_RATE;
92
- /**
93
- * @desc Determines if the emitter is emitting particles or not.
94
- * @type {boolean}
95
- */
96
-
97
- this.isEmitting = false;
98
- /**
99
- * @desc The emitter's id.
100
- * @type {string}
101
- */
102
-
103
- this.id = `emitter-${uid()}`;
104
- this.cID = 0;
105
- this.name = 'Emitter';
106
- /**
107
- * @desc The index of the emitter as it is added to the system.
108
- * @type {number|undefined}
109
- */
110
-
111
- this.index = DEFAULT_EMITTER_INDEX;
112
- /**
113
- * @desc The emitter's internal event dispatcher.
114
- * @type {EventDispatcher}
115
- */
116
-
117
- this.eventDispatcher = new EventDispatcher();
118
- }
119
- /**
120
- * Proxy method for the internal event dispatcher's dispatchEvent method.
121
- *
122
- * @param {string} event - The event to dispatch
123
- * @param {object<Particle>} [target=this] - The event target
124
- */
125
-
126
-
127
- dispatch(event, target = this) {
128
- this.eventDispatcher.dispatchEvent(event, target);
129
- }
130
- /**
131
- * Sets the emitter rate.
132
- *
133
- * @param {Rate} rate - a rate initializer object
134
- * @return {Emitter}
135
- */
136
-
137
-
138
- setRate(rate) {
139
- this.rate = rate;
140
- return this;
141
- }
142
- /**
143
- * Sets the position of the emitter.
144
- *
145
- * @param {object} newPosition - an object the new x, y and z props
146
- * @return {Emitter}
147
- */
148
-
149
-
150
- setPosition(newPosition = {}) {
151
- const {
152
- position
153
- } = this;
154
- const {
155
- x = position.x,
156
- y = position.y,
157
- z = position.z
158
- } = newPosition;
159
- this.position.set(x, y, z);
160
- return this;
161
- }
162
- /**
163
- * Sets the rotation of the emitter.
164
- *
165
- * @param {object} newRotation - an object the new x, y and z props
166
- * @return {Emitter}
167
- */
168
-
169
-
170
- setRotation(newRotation = {}) {
171
- const {
172
- rotation
173
- } = this;
174
- const {
175
- x = rotation.x,
176
- y = rotation.y,
177
- z = rotation.z
178
- } = newRotation;
179
- this.rotation.set(x, y, z);
180
- return this;
181
- }
182
- /**
183
- * Sets the total number of times the emitter should emit particles as well as
184
- * the emitter's life. Also intializes the emitter rate.
185
- * This enables the emitter to emit particles.
186
- *
187
- * @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
188
- * @param {number} [life=Infinity] - the life of this emitter in milliseconds
189
- * @return {Emitter}
190
- */
191
-
192
-
193
- emit(totalEmitTimes = Infinity, life = Infinity) {
194
- this.currentEmitTime = 0;
195
- this.totalEmitTimes = isNumber(totalEmitTimes) ? totalEmitTimes : Infinity;
196
-
197
- if (totalEmitTimes === 1) {
198
- this.life = totalEmitTimes;
199
- } else {
200
- this.life = isNumber(life) ? life : Infinity;
201
- }
202
-
203
- this.rate.init();
204
- this.isEmitting = true;
205
- return this;
206
- }
207
- /**
208
- * Experimental emit method that is designed to be called from the System.emit method.
209
- *
210
- * @return {Emitter}
211
- */
212
-
213
-
214
- experimental_emit() {
215
- const {
216
- isEmitting,
217
- totalEmitTimes,
218
- life
219
- } = this;
220
-
221
- if (!isEmitting) {
222
- this.currentEmitTime = 0;
223
-
224
- if (!totalEmitTimes) {
225
- this.setTotalEmitTimes(Infinity);
226
- }
227
-
228
- if (!life) {
229
- this.setLife(Infinity);
230
- }
231
-
232
- this.rate.init();
233
- this.isEmitting = true;
234
- }
235
-
236
- return this;
237
- }
238
- /**
239
- * Sets the total emit times for the emitter.
240
- *
241
- * @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
242
- * @return {Emitter}
243
- */
244
-
245
-
246
- setTotalEmitTimes(totalEmitTimes = Infinity) {
247
- this.totalEmitTimes = isNumber(totalEmitTimes) ? totalEmitTimes : Infinity;
248
- return this;
249
- }
250
- /**
251
- * Sets the life of the emitter.
252
- *
253
- * @param {number} [life=Infinity] - the life of this emitter in milliseconds
254
- * @return {Emitter}
255
- */
256
-
257
-
258
- setLife(life = Infinity) {
259
- if (this.totalEmitTimes === 1) {
260
- this.life = this.totalEmitTimes;
261
- } else {
262
- this.life = isNumber(life) ? life : Infinity;
263
- }
264
-
265
- return this;
266
- }
267
- /**
268
- * Stops the emitter from emitting particles.
269
- *
270
- * @return void
271
- */
272
-
273
-
274
- stopEmit() {
275
- this.totalEmitTimes = -1;
276
- this.currentEmitTime = 0;
277
- this.isEmitting = false;
278
- }
279
- /**
280
- * Kills all of the emitter's particles.
281
- *
282
- * @return void
283
- */
284
-
285
-
286
- removeAllParticles() {
287
- let i = this.particles.length;
288
-
289
- while (i--) {
290
- this.particles[i].dead = true;
291
- }
292
- }
293
- /**
294
- * Adds a particle initializer to the emitter.
295
- * Each initializer is run on each particle when they are created.
296
- *
297
- * @param {Initializer} initializer - The initializer to add
298
- * @return {Emitter}
299
- */
300
-
301
-
302
- addInitializer(initializer) {
303
- this.initializers.push(initializer);
304
- return this;
305
- }
306
- /**
307
- * Adds multiple particle initializers to the emitter.
308
- *
309
- * @param {array<Initializer>} initializers - an array of particle initializers
310
- * @return {Emitter}
311
- */
312
-
313
-
314
- addInitializers(initializers) {
315
- let i = initializers.length;
316
-
317
- while (i--) {
318
- this.addInitializer(initializers[i]);
319
- }
320
-
321
- return this;
322
- }
323
- /**
324
- * Sets the emitter's particle initializers.
325
- *
326
- * @param {array<Initializer>} initializers - an array of particle initializers
327
- * @return {Emitter}
328
- */
329
-
330
-
331
- setInitializers(initializers) {
332
- this.initializers = initializers;
333
- return this;
334
- }
335
- /**
336
- * Removes an initializer from the emitter's initializers array.
337
- *
338
- * @param {Initializer} initializer - The initializer to remove
339
- * @return {Emitter}
340
- */
341
-
342
-
343
- removeInitializer(initializer) {
344
- const index = this.initializers.indexOf(initializer);
345
-
346
- if (index > -1) {
347
- this.initializers.splice(index, 1);
348
- }
349
-
350
- return this;
351
- }
352
- /**
353
- * Removes all initializers.
354
- *
355
- * @return {Emitter}
356
- */
357
-
358
-
359
- removeAllInitializers() {
360
- Util.destroyArray(this.initializers);
361
- return this;
362
- }
363
- /**
364
- * Adds a behaviour to the emitter. All emitter behaviours are added to each particle when
365
- * they are emitted.
366
- *
367
- * @param {Behaviour} behaviour - The behaviour to add to the emitter
368
- * @return {Emitter}
369
- */
370
-
371
-
372
- addBehaviour(behaviour) {
373
- this.behaviours.push(behaviour);
374
- return this;
375
- }
376
- /**
377
- * Adds multiple behaviours to the emitter.
378
- *
379
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
380
- * @return {Emitter}
381
- */
382
-
383
-
384
- addBehaviours(behaviours) {
385
- let i = behaviours.length;
386
-
387
- while (i--) {
388
- this.addBehaviour(behaviours[i]);
389
- }
390
-
391
- return this;
392
- }
393
- /**
394
- * Sets the emitter's behaviours.
395
- *
396
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
397
- * @return {Emitter}
398
- */
399
-
400
-
401
- setBehaviours(behaviours) {
402
- this.behaviours = behaviours;
403
- return this;
404
- }
405
- /**
406
- * Removes the behaviour from the emitter's behaviours array.
407
- *
408
- * @param {Behaviour} behaviour - The behaviour to remove
409
- * @return {Emitter}
410
- */
411
-
412
-
413
- removeBehaviour(behaviour) {
414
- const index = this.behaviours.indexOf(behaviour);
415
-
416
- if (index > -1) {
417
- this.behaviours.splice(index, 1);
418
- }
419
-
420
- return this;
421
- }
422
- /**
423
- * Removes all behaviours from the emitter.
424
- *
425
- * @return {Emitter}
426
- */
427
-
428
-
429
- removeAllBehaviours() {
430
- Util.destroyArray(this.behaviours);
431
- return this;
432
- }
433
- /**
434
- * Adds an emitter behaviour to the emitter.
435
- *
436
- * @param {Behaviour} behaviour - The behaviour to add to the emitter
437
- * @return {Emitter}
438
- */
439
-
440
-
441
- addEmitterBehaviour(behaviour) {
442
- this.emitterBehaviours.push(behaviour);
443
- behaviour.initialize(this);
444
- return this;
445
- }
446
- /**
447
- * Adds multiple behaviours to the emitter.
448
- *
449
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
450
- * @return {Emitter}
451
- */
452
-
453
-
454
- addEmitterBehaviours(behaviours) {
455
- let i = behaviours.length;
456
-
457
- while (i--) {
458
- this.addEmitterBehaviour(behaviours[i]);
459
- }
460
-
461
- return this;
462
- }
463
- /**
464
- * Sets the emitter's behaviours.
465
- *
466
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
467
- * @return {Emitter}
468
- */
469
-
470
-
471
- setEmitterBehaviours(behaviours) {
472
- const length = behaviours.length;
473
- this.emitterBehaviours = behaviours;
474
-
475
- for (let i = 0; i < length; i++) {
476
- this.emitterBehaviours[i].initialize(this);
477
- }
478
-
479
- return this;
480
- }
481
- /**
482
- * Removes the behaviour from the emitter's behaviours array.
483
- *
484
- * @param {Behaviour} behaviour - The behaviour to remove
485
- * @return {Emitter}
486
- */
487
-
488
-
489
- removeEmitterBehaviour(behaviour) {
490
- const index = this.emitterBehaviours.indexOf(behaviour);
491
-
492
- if (index > -1) {
493
- this.emitterBehaviours.splice(index, 1);
494
- }
495
-
496
- return this;
497
- }
498
- /**
499
- * Removes all behaviours from the emitter.
500
- *
501
- * @return {Emitter}
502
- */
503
-
504
-
505
- removeAllEmitterBehaviours() {
506
- Util.destroyArray(this.emitterBehaviours);
507
- return this;
508
- }
509
- /**
510
- * Adds the event listener for the EMITTER_DEAD event.
511
- *
512
- * @param {onEmitterDead} - The function to call when the EMITTER_DEAD is dispatched.
513
- * @return {Emitter}
514
- */
515
-
516
-
517
- addOnEmitterDeadEventListener(onEmitterDead) {
518
- this.eventDispatcher.addEventListener(`${this.id}_${EMITTER_DEAD}`, () => onEmitterDead());
519
- return this;
520
- }
521
- /**
522
- * Creates a particle by retreiving one from the pool and setting it up with
523
- * the supplied initializer and behaviour.
524
- *
525
- * @return {Emitter}
526
- */
527
-
528
-
529
- createParticle() {
530
- const particle = this.parent.pool.get(Particle);
531
- const index = this.particles.length;
532
- this.setupParticle(particle, index);
533
- this.parent && this.parent.dispatch(PARTICLE_CREATED, particle);
534
- this.bindEmitterEvent && this.dispatch(PARTICLE_CREATED, particle);
535
- return particle;
536
- }
537
- /**
538
- * Sets up a particle by running all initializers on it and setting its behaviours.
539
- * Also adds the particle to this.particles.
540
- *
541
- * @param {Particle} particle - The particle to setup
542
- * @return void
543
- */
544
-
545
-
546
- setupParticle(particle, index) {
547
- const {
548
- initializers,
549
- behaviours
550
- } = this;
551
- InitializerUtil.initialize(this, particle, initializers);
552
- particle.addBehaviours(behaviours);
553
- particle.parent = this;
554
- particle.index = index;
555
- this.particles.push(particle);
556
- }
557
- /**
558
- * Updates the emitter according to the time passed by calling the generate
559
- * and integrate methods. The generate method creates particles, the integrate
560
- * method updates existing particles.
561
- *
562
- * If the emitter age is greater than time, the emitter is killed.
563
- *
564
- * This method also indexes/deindexes particles.
565
- *
566
- * @param {number} time - System engine time
567
- * @return void
568
- */
569
-
570
-
571
- update(time) {
572
- if (!this.isEmitting && this.particles.length === 0) {
573
- return;
574
- }
575
-
576
- this.age += time;
577
-
578
- if (this.dead || this.age >= this.life) {
579
- this.destroy();
580
- }
581
-
582
- if (this.isEmitting) {
583
- this.generate(time);
584
- }
585
-
586
- this.integrate(time);
587
- let i = this.particles.length;
588
-
589
- while (i--) {
590
- const particle = this.particles[i];
591
-
592
- if (particle.dead) {
593
- this.parent && this.parent.dispatch(PARTICLE_DEAD, particle);
594
- this.bindEmitterEvent && this.dispatch(PARTICLE_DEAD, particle);
595
- this.parent.pool.expire(particle.reset());
596
- this.particles.splice(i, 1);
597
-
598
- if (this.particles.length === 0) {
599
- this.parent && this.parent.dispatch(SYSTEM_UPDATE);
600
- }
601
- }
602
- }
603
-
604
- this.updateEmitterBehaviours(time);
605
- }
606
- /**
607
- * Updates the emitter's emitter behaviours.
608
- *
609
- * @param {number} time - System engine time
610
- * @return void
611
- */
612
-
613
-
614
- updateEmitterBehaviours(time) {
615
- if (this.sleep) {
616
- return;
617
- }
618
-
619
- const length = this.emitterBehaviours.length;
620
-
621
- for (let i = 0; i < length; i++) {
622
- this.emitterBehaviours[i].applyBehaviour(this, time, i);
623
- }
624
- }
625
- /**
626
- * Runs the integration algorithm on the emitter and all particles.
627
- * Updates the particles with the timstamp passed.
628
- *
629
- * @param {number} time - System engine time
630
- * @return void
631
- */
632
-
633
-
634
- integrate(time) {
635
- const integrationType = this.parent ? this.parent.integrationType : INTEGRATION_TYPE_EULER;
636
- const damping = 1 - this.damping;
637
- integrate(this, time, damping, integrationType);
638
- let index = this.particles.length;
639
-
640
- while (index--) {
641
- const particle = this.particles[index];
642
- particle.update(time, index);
643
- integrate(particle, time, damping, integrationType);
644
- this.parent && this.parent.dispatch(PARTICLE_UPDATE, particle);
645
- this.bindEmitterEvent && this.dispatch(PARTICLE_UPDATE, particle);
646
- }
647
- }
648
- /**
649
- * Generates new particles.
650
- *
651
- * @param {number} time - System engine time
652
- * @return void
653
- */
654
-
655
-
656
- generate(time) {
657
- if (this.totalEmitTimes === 1) {
658
- let i = this.rate.getValue(99999);
659
-
660
- if (i > 0) {
661
- this.cID = i;
662
- }
663
-
664
- while (i--) {
665
- this.createParticle();
666
- }
667
-
668
- this.totalEmitTimes = 0;
669
- return;
670
- }
671
-
672
- this.currentEmitTime += time;
673
-
674
- if (this.currentEmitTime < this.totalEmitTimes) {
675
- let i = this.rate.getValue(time);
676
-
677
- if (i > 0) {
678
- this.cID = i;
679
- }
680
-
681
- while (i--) {
682
- this.createParticle();
683
- }
684
- }
685
- }
686
- /**
687
- * Kills the emitter.
688
- *
689
- * @return void
690
- */
691
-
692
-
693
- destroy() {
694
- this.dead = true;
695
- this.energy = 0;
696
- this.totalEmitTimes = -1;
697
-
698
- if (this.particles.length == 0) {
699
- this.isEmitting = false;
700
- this.removeAllInitializers();
701
- this.removeAllBehaviours();
702
- this.dispatch(`${this.id}_${EMITTER_DEAD}`);
703
- this.parent && this.parent.removeEmitter(this);
704
- }
705
- }
706
-
707
- }
708
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbWl0dGVyL0VtaXR0ZXIuanMiXSwibmFtZXMiOlsiREVGQVVMVF9CSU5EX0VNSVRURVIiLCJERUZBVUxUX0JJTkRfRU1JVFRFUl9FVkVOVCIsIkRFRkFVTFRfREFNUElORyIsIkRFRkFVTFRfRU1JVFRFUl9JTkRFWCIsIkRFRkFVTFRfRU1JVFRFUl9SQVRFIiwiRXZlbnREaXNwYXRjaGVyIiwiRU1JVFRFUl9ERUFEIiwiUEFSVElDTEVfQ1JFQVRFRCIsIlBBUlRJQ0xFX0RFQUQiLCJQQVJUSUNMRV9VUERBVEUiLCJTWVNURU1fVVBEQVRFIiwiSU5URUdSQVRJT05fVFlQRV9FVUxFUiIsImludGVncmF0ZSIsIlV0aWwiLCJ1aWQiLCJJbml0aWFsaXplclV0aWwiLCJQYXJ0aWNsZSIsImlzTnVtYmVyIiwiRU1JVFRFUl9UWVBFX0VNSVRURVIiLCJ0eXBlIiwiRW1pdHRlciIsImNvbnN0cnVjdG9yIiwicHJvcGVydGllcyIsInBhcnRpY2xlcyIsImluaXRpYWxpemVycyIsImJlaGF2aW91cnMiLCJlbWl0dGVyQmVoYXZpb3VycyIsImN1cnJlbnRFbWl0VGltZSIsInRvdGFsRW1pdFRpbWVzIiwiZGFtcGluZyIsImJpbmRFbWl0dGVyIiwiYmluZEVtaXR0ZXJFdmVudCIsInJhdGUiLCJpc0VtaXR0aW5nIiwiaWQiLCJjSUQiLCJuYW1lIiwiaW5kZXgiLCJldmVudERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImV2ZW50IiwidGFyZ2V0IiwiZGlzcGF0Y2hFdmVudCIsInNldFJhdGUiLCJzZXRQb3NpdGlvbiIsIm5ld1Bvc2l0aW9uIiwicG9zaXRpb24iLCJ4IiwieSIsInoiLCJzZXQiLCJzZXRSb3RhdGlvbiIsIm5ld1JvdGF0aW9uIiwicm90YXRpb24iLCJlbWl0IiwiSW5maW5pdHkiLCJsaWZlIiwiaW5pdCIsImV4cGVyaW1lbnRhbF9lbWl0Iiwic2V0VG90YWxFbWl0VGltZXMiLCJzZXRMaWZlIiwic3RvcEVtaXQiLCJyZW1vdmVBbGxQYXJ0aWNsZXMiLCJpIiwibGVuZ3RoIiwiZGVhZCIsImFkZEluaXRpYWxpemVyIiwiaW5pdGlhbGl6ZXIiLCJwdXNoIiwiYWRkSW5pdGlhbGl6ZXJzIiwic2V0SW5pdGlhbGl6ZXJzIiwicmVtb3ZlSW5pdGlhbGl6ZXIiLCJpbmRleE9mIiwic3BsaWNlIiwicmVtb3ZlQWxsSW5pdGlhbGl6ZXJzIiwiZGVzdHJveUFycmF5IiwiYWRkQmVoYXZpb3VyIiwiYmVoYXZpb3VyIiwiYWRkQmVoYXZpb3VycyIsInNldEJlaGF2aW91cnMiLCJyZW1vdmVCZWhhdmlvdXIiLCJyZW1vdmVBbGxCZWhhdmlvdXJzIiwiYWRkRW1pdHRlckJlaGF2aW91ciIsImluaXRpYWxpemUiLCJhZGRFbWl0dGVyQmVoYXZpb3VycyIsInNldEVtaXR0ZXJCZWhhdmlvdXJzIiwicmVtb3ZlRW1pdHRlckJlaGF2aW91ciIsInJlbW92ZUFsbEVtaXR0ZXJCZWhhdmlvdXJzIiwiYWRkT25FbWl0dGVyRGVhZEV2ZW50TGlzdGVuZXIiLCJvbkVtaXR0ZXJEZWFkIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNyZWF0ZVBhcnRpY2xlIiwicGFydGljbGUiLCJwYXJlbnQiLCJwb29sIiwiZ2V0Iiwic2V0dXBQYXJ0aWNsZSIsInVwZGF0ZSIsInRpbWUiLCJhZ2UiLCJkZXN0cm95IiwiZ2VuZXJhdGUiLCJleHBpcmUiLCJyZXNldCIsInVwZGF0ZUVtaXR0ZXJCZWhhdmlvdXJzIiwic2xlZXAiLCJhcHBseUJlaGF2aW91ciIsImludGVncmF0aW9uVHlwZSIsImdldFZhbHVlIiwiZW5lcmd5IiwicmVtb3ZlRW1pdHRlciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDRUEsb0JBREYsRUFFRUMsMEJBRkYsRUFHRUMsZUFIRixFQUlFQyxxQkFKRixFQUtFQyxvQkFMRixRQU1PLGFBTlA7QUFPQSxPQUFPQyxlQUFQLElBQ0VDLFlBREYsRUFFRUMsZ0JBRkYsRUFHRUMsYUFIRixFQUlFQyxlQUpGLEVBS0VDLGFBTEYsUUFNTyxXQU5QO0FBT0EsU0FBU0Msc0JBQVQs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Q0FBVTRFLFFBQVYsQ0FBbUJWLElBQW5CLENBQVI7O0FBRUEsVUFBSW5DLENBQUMsR0FBRyxDQUFSLEVBQVc7QUFDVCxhQUFLNUIsR0FBTCxHQUFXNEIsQ0FBWDtBQUNEOztBQUVELGFBQU9BLENBQUMsRUFBUixFQUFZO0FBQ1YsYUFBSzRCLGNBQUw7QUFDRDtBQUNGO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRVMsRUFBQUEsT0FBTyxHQUFHO0FBQ1IsU0FBS25DLElBQUwsR0FBWSxJQUFaO0FBQ0EsU0FBSzRDLE1BQUwsR0FBYyxDQUFkO0FBQ0EsU0FBS2pGLGNBQUwsR0FBc0IsQ0FBQyxDQUF2Qjs7QUFFQSxRQUFJLEtBQUtMLFNBQUwsQ0FBZXlDLE1BQWYsSUFBeUIsQ0FBN0IsRUFBZ0M7QUFDOUIsV0FBSy9CLFVBQUwsR0FBa0IsS0FBbEI7QUFDQSxXQUFLeUMscUJBQUw7QUFDQSxXQUFLTyxtQkFBTDtBQUNBLFdBQUsxQyxRQUFMLENBQWUsR0FBRSxLQUFLTCxFQUFHLElBQUc1QixZQUFhLEVBQXpDO0FBRUEsV0FBS3VGLE1BQUwsSUFBZSxLQUFLQSxNQUFMLENBQVlpQixhQUFaLENBQTBCLElBQTFCLENBQWY7QUFDRDtBQUNGOztBQWpxQjJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgREVGQVVMVF9CSU5EX0VNSVRURVIsXG4gIERFRkFVTFRfQklORF9FTUlUVEVSX0VWRU5ULFxuICBERUZBVUxUX0RBTVBJTkcsXG4gIERFRkFVTFRfRU1JVFRFUl9JTkRFWCxcbiAgREVGQVVMVF9FTUlUVEVSX1JBVEUsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBFdmVudERpc3BhdGNoZXIsIHtcbiAgRU1JVFRFUl9ERUFELFxuICBQQVJUSUNMRV9DUkVBVEVELFxuICBQQVJUSUNMRV9ERUFELFxuICBQQVJUSUNMRV9VUERBVEUsXG4gIFNZU1RFTV9VUERBVEUsXG59IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgeyBJTlRFR1JBVElPTl9UWVBFX0VVTEVSLCBpbnRlZ3JhdGUgfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IFV0aWwsIHVpZCB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgSW5pdGlhbGl6ZXJVdGlsIH0gZnJvbSAnLi4vaW5pdGlhbGl6ZXInO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4uL2NvcmUvUGFydGljbGUnO1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJ2xvZGFzaC9pc051bWJlcic7XG5pbXBvcnQgeyBFTUlUVEVSX1RZUEVfRU1JVFRFUiBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW1pdHRlcnMgYXJlIHRoZSBTeXN0ZW0gZW5naW5lJ3MgcGFydGljbGUgZmFjdG9yaWVzLiBUaGV5IGNhdXNlIHBhcnRpY2xlcyB0b1xuICogYmUgcmVuZGVyZWQgYnkgZW1pdHRpbmcgdGhlbSwgYW5kIHN0b3JlIGFsbCBwYXJ0aWNsZSBpbml0aWFsaXplcnMgYW5kIGJlaGF2aW91cnMuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbWl0dGVyIGV4dGVuZHMgUGFydGljbGUge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBFbWl0dGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcGVydGllcyAtIFRoZSBwcm9wZXJ0aWVzIHRvIGluc3RhbnRpYXRlIHRoZSBlbWl0dGVyIHdpdGhcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzKSB7XG4gICAgc3VwZXIocHJvcGVydGllcyk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgY2xhc3MgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGVzIGVtaXR0ZWQgYnkgdGhpcyBlbWl0dGVyLlxuICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGluaXRpYWxpemVycyBmb3IgcGFydGljbGVzIGVtaXR0ZWQgYnkgdGhpcyBlbWl0dGVyLlxuICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLmluaXRpYWxpemVycyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGJlaGF2aW91cnMgZm9yIHBhcnRpY2xlcyBlbWl0dGVkIGJ5IHRoaXMgZW1pdHRlci5cbiAgICAgKiBAdHlwZSB7YXJyYXl9XG4gICAgICovXG4gICAgdGhpcy5iZWhhdmlvdXJzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgYmVoYXZpb3VycyBmb3IgdGhlIGVtaXR0ZXIuXG4gICAgICogQHR5cGUge2FycmF5fVxuICAgICAqL1xuICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBjdXJyZW50IGVtaXQgaXRlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxuICAgICAqL1xuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGVtaXR0ZXIgc2hvdWxkIGVtaXQgcGFydGljbGVzLlxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxuICAgICAqL1xuICAgIHRoaXMudG90YWxFbWl0VGltZXMgPSAtMTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBmcmljdGlvbiBjb2VmZmljaWVudCBmb3IgYWxsIHBhcnRpY2xlIHRvIGVtaXQgYnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmRhbXBpbmcgPSBERUZBVUxUX0RBTVBJTkc7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBFbnN1cmVzIHRoYXQgcGFydGljbGVzIGVtaXR0ZWQgYnkgdGhpcyBlbWl0dGVyIGFyZSBwb3NpdGlvbmVkXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBlbWl0dGVyJ3MgcHJvcGVydGllcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmJpbmRFbWl0dGVyID0gREVGQVVMVF9CSU5EX0VNSVRURVI7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIHRoZSBlbWl0dGVyIHdpbGwgZGlzcGF0Y2ggaW50ZXJuYWwgZXZlbnRzLiBEZWZhdWx0c1xuICAgICAqIHRvIGZhbHNlXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5iaW5kRW1pdHRlckV2ZW50ID0gREVGQVVMVF9CSU5EX0VNSVRURVJfRVZFTlQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byBlbWl0IHBlciBzZWNvbmQgKGEgW3BhcnRpY2xlXS9iIFtzXSlcbiAgICAgKiBAdHlwZSB7UmF0ZX1cbiAgICAgKi9cbiAgICB0aGlzLnJhdGUgPSBERUZBVUxUX0VNSVRURVJfUkFURTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIERldGVybWluZXMgaWYgdGhlIGVtaXR0ZXIgaXMgZW1pdHRpbmcgcGFydGljbGVzIG9yIG5vdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmlzRW1pdHRpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBlbWl0dGVyJ3MgaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gYGVtaXR0ZXItJHt1aWQoKX1gO1xuICAgIHRoaXMuY0lEID0gMDtcbiAgICB0aGlzLm5hbWUgPSAnRW1pdHRlcic7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgaW5kZXggb2YgdGhlIGVtaXR0ZXIgYXMgaXQgaXMgYWRkZWQgdG8gdGhlIHN5c3RlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICB0aGlzLmluZGV4ID0gREVGQVVMVF9FTUlUVEVSX0lOREVYO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGVtaXR0ZXIncyBpbnRlcm5hbCBldmVudCBkaXNwYXRjaGVyLlxuICAgICAqIEB0eXBlIHtFdmVudERpc3BhdGNoZXJ9XG4gICAgICovXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJveHkgbWV0aG9kIGZvciB0aGUgaW50ZXJuYWwgZXZlbnQgZGlzcGF0Y2hlcidzIGRpc3BhdGNoRXZlbnQgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICogQHBhcmFtIHtvYmplY3Q8UGFydGljbGU+fSBbdGFyZ2V0PXRoaXNdIC0gVGhlIGV2ZW50IHRhcmdldFxuICAgKi9cbiAgZGlzcGF0Y2goZXZlbnQsIHRhcmdldCA9IHRoaXMpIHtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVtaXR0ZXIgcmF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSYXRlfSByYXRlIC0gYSByYXRlIGluaXRpYWxpemVyIG9iamVjdFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0UmF0ZShyYXRlKSB7XG4gICAgdGhpcy5yYXRlID0gcmF0ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UG9zaXRpb24gLSBhbiBvYmplY3QgdGhlIG5ldyB4LCB5IGFuZCB6IHByb3BzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRQb3NpdGlvbihuZXdQb3NpdGlvbiA9IHt9KSB7XG4gICAgY29uc3QgeyBwb3NpdGlvbiB9ID0gdGhpcztcbiAgICBjb25zdCB7IHggPSBwb3NpdGlvbi54LCB5ID0gcG9zaXRpb24ueSwgeiA9IHBvc2l0aW9uLnogfSA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgdGhpcy5wb3NpdGlvbi5zZXQoeCwgeSwgeik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByb3RhdGlvbiBvZiB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5ld1JvdGF0aW9uIC0gYW4gb2JqZWN0IHRoZSBuZXcgeCwgeSBhbmQgeiBwcm9wc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0Um90YXRpb24obmV3Um90YXRpb24gPSB7fSkge1xuICAgIGNvbnN0IHsgcm90YXRpb24gfSA9IHRoaXM7XG4gICAgY29uc3QgeyB4ID0gcm90YXRpb24ueCwgeSA9IHJvdGF0aW9uLnksIHogPSByb3RhdGlvbi56IH0gPSBuZXdSb3RhdGlvbjtcblxuICAgIHRoaXMucm90YXRpb24uc2V0KHgsIHksIHopO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbWl0dGVyIHNob3VsZCBlbWl0IHBhcnRpY2xlcyBhcyB3ZWxsIGFzXG4gICAqIHRoZSBlbWl0dGVyJ3MgbGlmZS4gQWxzbyBpbnRpYWxpemVzIHRoZSBlbWl0dGVyIHJhdGUuXG4gICAqIFRoaXMgZW5hYmxlcyB0aGUgZW1pdHRlciB0byBlbWl0IHBhcnRpY2xlcy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0b3RhbEVtaXRUaW1lcz1JbmZpbml0eV0gLSB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRvIGVtaXQgcGFydGljbGVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSB0aGUgbGlmZSBvZiB0aGlzIGVtaXR0ZXIgaW4gbWlsbGlzZWNvbmRzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBlbWl0KHRvdGFsRW1pdFRpbWVzID0gSW5maW5pdHksIGxpZmUgPSBJbmZpbml0eSkge1xuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnRvdGFsRW1pdFRpbWVzID0gaXNOdW1iZXIodG90YWxFbWl0VGltZXMpID8gdG90YWxFbWl0VGltZXMgOiBJbmZpbml0eTtcblxuICAgIGlmICh0b3RhbEVtaXRUaW1lcyA9PT0gMSkge1xuICAgICAgdGhpcy5saWZlID0gdG90YWxFbWl0VGltZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGlmZSA9IGlzTnVtYmVyKGxpZmUpID8gbGlmZSA6IEluZmluaXR5O1xuICAgIH1cblxuICAgIHRoaXMucmF0ZS5pbml0KCk7XG4gICAgdGhpcy5pc0VtaXR0aW5nID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVyaW1lbnRhbCBlbWl0IG1ldGhvZCB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBTeXN0ZW0uZW1pdCBtZXRob2QuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBleHBlcmltZW50YWxfZW1pdCgpIHtcbiAgICBjb25zdCB7IGlzRW1pdHRpbmcsIHRvdGFsRW1pdFRpbWVzLCBsaWZlIH0gPSB0aGlzO1xuXG4gICAgaWYgKCFpc0VtaXR0aW5nKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFbWl0VGltZSA9IDA7XG5cbiAgICAgIGlmICghdG90YWxFbWl0VGltZXMpIHtcbiAgICAgICAgdGhpcy5zZXRUb3RhbEVtaXRUaW1lcyhJbmZpbml0eSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGlmZSkge1xuICAgICAgICB0aGlzLnNldExpZmUoSW5maW5pdHkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJhdGUuaW5pdCgpO1xuICAgICAgdGhpcy5pc0VtaXR0aW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0b3RhbCBlbWl0IHRpbWVzIGZvciB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0b3RhbEVtaXRUaW1lcz1JbmZpbml0eV0gLSB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRvIGVtaXQgcGFydGljbGVzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRUb3RhbEVtaXRUaW1lcyh0b3RhbEVtaXRUaW1lcyA9IEluZmluaXR5KSB7XG4gICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IGlzTnVtYmVyKHRvdGFsRW1pdFRpbWVzKSA/IHRvdGFsRW1pdFRpbWVzIDogSW5maW5pdHk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBsaWZlIG9mIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gdGhlIGxpZmUgb2YgdGhpcyBlbWl0dGVyIGluIG1pbGxpc2Vjb25kc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0TGlmZShsaWZlID0gSW5maW5pdHkpIHtcbiAgICBpZiAodGhpcy50b3RhbEVtaXRUaW1lcyA9PT0gMSkge1xuICAgICAgdGhpcy5saWZlID0gdGhpcy50b3RhbEVtaXRUaW1lcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saWZlID0gaXNOdW1iZXIobGlmZSkgPyBsaWZlIDogSW5maW5pdHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIGVtaXR0ZXIgZnJvbSBlbWl0dGluZyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgc3RvcEVtaXQoKSB7XG4gICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IC0xO1xuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lID0gMDtcbiAgICB0aGlzLmlzRW1pdHRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLaWxscyBhbGwgb2YgdGhlIGVtaXR0ZXIncyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgcmVtb3ZlQWxsUGFydGljbGVzKCkge1xuICAgIGxldCBpID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5wYXJ0aWNsZXNbaV0uZGVhZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwYXJ0aWNsZSBpbml0aWFsaXplciB0byB0aGUgZW1pdHRlci5cbiAgICogRWFjaCBpbml0aWFsaXplciBpcyBydW4gb24gZWFjaCBwYXJ0aWNsZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZXJ9IGluaXRpYWxpemVyIC0gVGhlIGluaXRpYWxpemVyIHRvIGFkZFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpIHtcbiAgICB0aGlzLmluaXRpYWxpemVycy5wdXNoKGluaXRpYWxpemVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgcGFydGljbGUgaW5pdGlhbGl6ZXJzIHRvIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PEluaXRpYWxpemVyPn0gaW5pdGlhbGl6ZXJzIC0gYW4gYXJyYXkgb2YgcGFydGljbGUgaW5pdGlhbGl6ZXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBhZGRJbml0aWFsaXplcnMoaW5pdGlhbGl6ZXJzKSB7XG4gICAgbGV0IGkgPSBpbml0aWFsaXplcnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5hZGRJbml0aWFsaXplcihpbml0aWFsaXplcnNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVtaXR0ZXIncyBwYXJ0aWNsZSBpbml0aWFsaXplcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8SW5pdGlhbGl6ZXI+fSBpbml0aWFsaXplcnMgLSBhbiBhcnJheSBvZiBwYXJ0aWNsZSBpbml0aWFsaXplcnNcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHNldEluaXRpYWxpemVycyhpbml0aWFsaXplcnMpIHtcbiAgICB0aGlzLmluaXRpYWxpemVycyA9IGluaXRpYWxpemVycztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gaW5pdGlhbGl6ZXIgZnJvbSB0aGUgZW1pdHRlcidzIGluaXRpYWxpemVycyBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtJbml0aWFsaXplcn0gaW5pdGlhbGl6ZXIgLSBUaGUgaW5pdGlhbGl6ZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVJbml0aWFsaXplcihpbml0aWFsaXplcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbml0aWFsaXplcnMuaW5kZXhPZihpbml0aWFsaXplcik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBpbml0aWFsaXplcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVBbGxJbml0aWFsaXplcnMoKSB7XG4gICAgVXRpbC5kZXN0cm95QXJyYXkodGhpcy5pbml0aWFsaXplcnMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJlaGF2aW91ciB0byB0aGUgZW1pdHRlci4gQWxsIGVtaXR0ZXIgYmVoYXZpb3VycyBhcmUgYWRkZWQgdG8gZWFjaCBwYXJ0aWNsZSB3aGVuXG4gICAqIHRoZXkgYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgLSBUaGUgYmVoYXZpb3VyIHRvIGFkZCB0byB0aGUgZW1pdHRlclxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIHRoaXMuYmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIGJlaGF2aW91cnMgdG8gdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8QmVoYXZpb3VyPn0gYmVoYXZpb3VycyAtIGFuIGFycmF5IG9mIGVtaXR0ZXIgYmVoYXZpb3Vyc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgbGV0IGkgPSBiZWhhdmlvdXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuYWRkQmVoYXZpb3VyKGJlaGF2aW91cnNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVtaXR0ZXIncyBiZWhhdmlvdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PEJlaGF2aW91cj59IGJlaGF2aW91cnMgLSBhbiBhcnJheSBvZiBlbWl0dGVyIGJlaGF2aW91cnNcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHNldEJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IGJlaGF2aW91cnM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBiZWhhdmlvdXIgZnJvbSB0aGUgZW1pdHRlcidzIGJlaGF2aW91cnMgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgLSBUaGUgYmVoYXZpb3VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5iZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBiZWhhdmlvdXJzIGZyb20gdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVBbGxCZWhhdmlvdXJzKCkge1xuICAgIFV0aWwuZGVzdHJveUFycmF5KHRoaXMuYmVoYXZpb3Vycyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVtaXR0ZXIgYmVoYXZpb3VyIHRvIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIC0gVGhlIGJlaGF2aW91ciB0byBhZGQgdG8gdGhlIGVtaXR0ZXJcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIGFkZEVtaXR0ZXJCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgdGhpcy5lbWl0dGVyQmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG5cbiAgICBiZWhhdmlvdXIuaW5pdGlhbGl6ZSh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgYmVoYXZpb3VycyB0byB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxCZWhhdmlvdXI+fSBiZWhhdmlvdXJzIC0gYW4gYXJyYXkgb2YgZW1pdHRlciBiZWhhdmlvdXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBhZGRFbWl0dGVyQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgbGV0IGkgPSBiZWhhdmlvdXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuYWRkRW1pdHRlckJlaGF2aW91cihiZWhhdmlvdXJzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBlbWl0dGVyJ3MgYmVoYXZpb3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxCZWhhdmlvdXI+fSBiZWhhdmlvdXJzIC0gYW4gYXJyYXkgb2YgZW1pdHRlciBiZWhhdmlvdXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRFbWl0dGVyQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYmVoYXZpb3Vycy5sZW5ndGg7XG5cbiAgICB0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzID0gYmVoYXZpb3VycztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnNbaV0uaW5pdGlhbGl6ZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBiZWhhdmlvdXIgZnJvbSB0aGUgZW1pdHRlcidzIGJlaGF2aW91cnMgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgLSBUaGUgYmVoYXZpb3VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlRW1pdHRlckJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZW1pdHRlckJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBiZWhhdmlvdXJzIGZyb20gdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVBbGxFbWl0dGVyQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmRlc3Ryb3lBcnJheSh0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgRU1JVFRFUl9ERUFEIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29uRW1pdHRlckRlYWR9IC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgRU1JVFRFUl9ERUFEIGlzIGRpc3BhdGNoZWQuXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBhZGRPbkVtaXR0ZXJEZWFkRXZlbnRMaXN0ZW5lcihvbkVtaXR0ZXJEZWFkKSB7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcihgJHt0aGlzLmlkfV8ke0VNSVRURVJfREVBRH1gLCAoKSA9PlxuICAgICAgb25FbWl0dGVyRGVhZCgpXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYXJ0aWNsZSBieSByZXRyZWl2aW5nIG9uZSBmcm9tIHRoZSBwb29sIGFuZCBzZXR0aW5nIGl0IHVwIHdpdGhcbiAgICogdGhlIHN1cHBsaWVkIGluaXRpYWxpemVyIGFuZCBiZWhhdmlvdXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBjcmVhdGVQYXJ0aWNsZSgpIHtcbiAgICBjb25zdCBwYXJ0aWNsZSA9IHRoaXMucGFyZW50LnBvb2wuZ2V0KFBhcnRpY2xlKTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcblxuICAgIHRoaXMuc2V0dXBQYXJ0aWNsZShwYXJ0aWNsZSwgaW5kZXgpO1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoKFBBUlRJQ0xFX0NSRUFURUQsIHBhcnRpY2xlKTtcbiAgICB0aGlzLmJpbmRFbWl0dGVyRXZlbnQgJiYgdGhpcy5kaXNwYXRjaChQQVJUSUNMRV9DUkVBVEVELCBwYXJ0aWNsZSk7XG5cbiAgICByZXR1cm4gcGFydGljbGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIHBhcnRpY2xlIGJ5IHJ1bm5pbmcgYWxsIGluaXRpYWxpemVycyBvbiBpdCBhbmQgc2V0dGluZyBpdHMgYmVoYXZpb3Vycy5cbiAgICogQWxzbyBhZGRzIHRoZSBwYXJ0aWNsZSB0byB0aGlzLnBhcnRpY2xlcy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gc2V0dXBcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBzZXR1cFBhcnRpY2xlKHBhcnRpY2xlLCBpbmRleCkge1xuICAgIGNvbnN0IHsgaW5pdGlhbGl6ZXJzLCBiZWhhdmlvdXJzIH0gPSB0aGlzO1xuXG4gICAgSW5pdGlhbGl6ZXJVdGlsLmluaXRpYWxpemUodGhpcywgcGFydGljbGUsIGluaXRpYWxpemVycyk7XG5cbiAgICBwYXJ0aWNsZS5hZGRCZWhhdmlvdXJzKGJlaGF2aW91cnMpO1xuICAgIHBhcnRpY2xlLnBhcmVudCA9IHRoaXM7XG4gICAgcGFydGljbGUuaW5kZXggPSBpbmRleDtcblxuICAgIHRoaXMucGFydGljbGVzLnB1c2gocGFydGljbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVtaXR0ZXIgYWNjb3JkaW5nIHRvIHRoZSB0aW1lIHBhc3NlZCBieSBjYWxsaW5nIHRoZSBnZW5lcmF0ZVxuICAgKiBhbmQgaW50ZWdyYXRlIG1ldGhvZHMuIFRoZSBnZW5lcmF0ZSBtZXRob2QgY3JlYXRlcyBwYXJ0aWNsZXMsIHRoZSBpbnRlZ3JhdGVcbiAgICogbWV0aG9kIHVwZGF0ZXMgZXhpc3RpbmcgcGFydGljbGVzLlxuICAgKlxuICAgKiBJZiB0aGUgZW1pdHRlciBhZ2UgaXMgZ3JlYXRlciB0aGFuIHRpbWUsIHRoZSBlbWl0dGVyIGlzIGtpbGxlZC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWxzbyBpbmRleGVzL2RlaW5kZXhlcyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gU3lzdGVtIGVuZ2luZSB0aW1lXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgdXBkYXRlKHRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNFbWl0dGluZyAmJiB0aGlzLnBhcnRpY2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuZGVhZCB8fCB0aGlzLmFnZSA+PSB0aGlzLmxpZmUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRW1pdHRpbmcpXG4gICAge1xuICAgICAgdGhpcy5nZW5lcmF0ZSh0aW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVncmF0ZSh0aW1lKTtcblxuICAgIGxldCBpID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3QgcGFydGljbGUgPSB0aGlzLnBhcnRpY2xlc1tpXTtcblxuICAgICAgaWYgKHBhcnRpY2xlLmRlYWQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuZGlzcGF0Y2goUEFSVElDTEVfREVBRCwgcGFydGljbGUpO1xuICAgICAgICB0aGlzLmJpbmRFbWl0dGVyRXZlbnQgJiYgdGhpcy5kaXNwYXRjaChQQVJUSUNMRV9ERUFELCBwYXJ0aWNsZSk7XG4gICAgICAgIHRoaXMucGFyZW50LnBvb2wuZXhwaXJlKHBhcnRpY2xlLnJlc2V0KCkpO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGlmKHRoaXMucGFydGljbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoKFNZU1RFTV9VUERBVEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVFbWl0dGVyQmVoYXZpb3Vycyh0aW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBlbWl0dGVyJ3MgZW1pdHRlciBiZWhhdmlvdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFN5c3RlbSBlbmdpbmUgdGltZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHVwZGF0ZUVtaXR0ZXJCZWhhdmlvdXJzKHRpbWUpIHtcbiAgICBpZiAodGhpcy5zbGVlcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuZW1pdHRlckJlaGF2aW91cnMubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbWl0dGVyQmVoYXZpb3Vyc1tpXS5hcHBseUJlaGF2aW91cih0aGlzLCB0aW1lLCBpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgaW50ZWdyYXRpb24gYWxnb3JpdGhtIG9uIHRoZSBlbWl0dGVyIGFuZCBhbGwgcGFydGljbGVzLlxuICAgKiBVcGRhdGVzIHRoZSBwYXJ0aWNsZXMgd2l0aCB0aGUgdGltc3RhbXAgcGFzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFN5c3RlbSBlbmdpbmUgdGltZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGludGVncmF0ZSh0aW1lKSB7XG4gICAgY29uc3QgaW50ZWdyYXRpb25UeXBlID0gdGhpcy5wYXJlbnRcbiAgICAgID8gdGhpcy5wYXJlbnQuaW50ZWdyYXRpb25UeXBlXG4gICAgICA6IElOVEVHUkFUSU9OX1RZUEVfRVVMRVI7XG4gICAgY29uc3QgZGFtcGluZyA9IDEgLSB0aGlzLmRhbXBpbmc7XG5cbiAgICBpbnRlZ3JhdGUodGhpcywgdGltZSwgZGFtcGluZywgaW50ZWdyYXRpb25UeXBlKTtcblxuICAgIGxldCBpbmRleCA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBjb25zdCBwYXJ0aWNsZSA9IHRoaXMucGFydGljbGVzW2luZGV4XTtcblxuICAgICAgcGFydGljbGUudXBkYXRlKHRpbWUsIGluZGV4KTtcbiAgICAgIGludGVncmF0ZShwYXJ0aWNsZSwgdGltZSwgZGFtcGluZywgaW50ZWdyYXRpb25UeXBlKTtcblxuICAgICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuZGlzcGF0Y2goUEFSVElDTEVfVVBEQVRFLCBwYXJ0aWNsZSk7XG4gICAgICB0aGlzLmJpbmRFbWl0dGVyRXZlbnQgJiYgdGhpcy5kaXNwYXRjaChQQVJUSUNMRV9VUERBVEUsIHBhcnRpY2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG5ldyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gU3lzdGVtIGVuZ2luZSB0aW1lXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgZ2VuZXJhdGUodGltZSkge1xuICAgIGlmICh0aGlzLnRvdGFsRW1pdFRpbWVzID09PSAxKSB7XG4gICAgICBsZXQgaSA9IHRoaXMucmF0ZS5nZXRWYWx1ZSg5OTk5OSk7XG5cbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB0aGlzLmNJRCA9IGk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRvdGFsRW1pdFRpbWVzID0gMDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lICs9IHRpbWU7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RW1pdFRpbWUgPCB0aGlzLnRvdGFsRW1pdFRpbWVzKSB7XG4gICAgICBsZXQgaSA9IHRoaXMucmF0ZS5nZXRWYWx1ZSh0aW1lKTtcblxuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIHRoaXMuY0lEID0gaTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICB0aGlzLmNyZWF0ZVBhcnRpY2xlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IC0xO1xuXG4gICAgaWYgKHRoaXMucGFydGljbGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmlzRW1pdHRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsSW5pdGlhbGl6ZXJzKCk7XG4gICAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goYCR7dGhpcy5pZH1fJHtFTUlUVEVSX0RFQUR9YCk7XG5cbiAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnJlbW92ZUVtaXR0ZXIodGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=