@esotericsoftware/spine-core 4.2.116 → 4.3.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 (129) hide show
  1. package/dist/Animation.d.ts +426 -274
  2. package/dist/Animation.js +1174 -1210
  3. package/dist/AnimationState.d.ts +246 -201
  4. package/dist/AnimationState.js +508 -471
  5. package/dist/AnimationStateData.d.ts +12 -10
  6. package/dist/AnimationStateData.js +19 -20
  7. package/dist/AssetManagerBase.d.ts +27 -21
  8. package/dist/AssetManagerBase.js +67 -43
  9. package/dist/AtlasAttachmentLoader.d.ts +18 -12
  10. package/dist/AtlasAttachmentLoader.js +28 -39
  11. package/dist/Bone.d.ts +15 -109
  12. package/dist/Bone.js +22 -362
  13. package/dist/BoneData.d.ts +13 -28
  14. package/dist/BoneData.js +20 -29
  15. package/dist/BonePose.d.ts +130 -0
  16. package/dist/BonePose.js +426 -0
  17. package/dist/Constraint.d.ts +41 -0
  18. package/dist/Constraint.js +38 -0
  19. package/dist/ConstraintData.d.ts +7 -5
  20. package/dist/ConstraintData.js +5 -9
  21. package/dist/DrawOrder.d.ts +48 -0
  22. package/dist/DrawOrder.js +64 -0
  23. package/dist/Event.d.ts +11 -6
  24. package/dist/Event.js +10 -5
  25. package/dist/EventData.d.ts +10 -6
  26. package/dist/EventData.js +18 -7
  27. package/dist/IkConstraint.d.ts +22 -28
  28. package/dist/IkConstraint.js +115 -117
  29. package/dist/IkConstraintData.d.ts +23 -18
  30. package/dist/IkConstraintData.js +32 -22
  31. package/dist/IkConstraintPose.d.ts +49 -0
  32. package/dist/IkConstraintPose.js +55 -0
  33. package/dist/PathConstraint.d.ts +18 -22
  34. package/dist/PathConstraint.js +160 -136
  35. package/dist/PathConstraintData.d.ts +11 -14
  36. package/dist/PathConstraintData.js +14 -16
  37. package/dist/PathConstraintPose.d.ts +43 -0
  38. package/dist/PathConstraintPose.js +49 -0
  39. package/dist/Physics.d.ts +39 -0
  40. package/dist/Physics.js +41 -0
  41. package/dist/PhysicsConstraint.d.ts +26 -30
  42. package/dist/PhysicsConstraint.js +102 -94
  43. package/dist/PhysicsConstraintData.d.ts +22 -12
  44. package/dist/PhysicsConstraintData.js +23 -12
  45. package/dist/PhysicsConstraintPose.d.ts +47 -0
  46. package/dist/PhysicsConstraintPose.js +55 -0
  47. package/dist/Pose.d.ts +33 -0
  48. package/dist/Pose.js +30 -0
  49. package/dist/Posed.d.ts +58 -0
  50. package/dist/Posed.js +78 -0
  51. package/dist/PosedActive.d.ts +41 -0
  52. package/dist/{attachments/HasTextureRegion.js → PosedActive.js} +17 -2
  53. package/dist/PosedData.d.ts +40 -0
  54. package/dist/PosedData.js +45 -0
  55. package/dist/Skeleton.d.ts +110 -99
  56. package/dist/Skeleton.js +271 -449
  57. package/dist/SkeletonBinary.d.ts +1 -1
  58. package/dist/SkeletonBinary.js +644 -466
  59. package/dist/SkeletonBounds.d.ts +4 -4
  60. package/dist/SkeletonBounds.js +45 -46
  61. package/dist/SkeletonClipping.d.ts +26 -22
  62. package/dist/SkeletonClipping.js +654 -340
  63. package/dist/SkeletonData.d.ts +18 -35
  64. package/dist/SkeletonData.js +57 -97
  65. package/dist/SkeletonJson.d.ts +8 -6
  66. package/dist/SkeletonJson.js +892 -641
  67. package/dist/SkeletonRendererCore.d.ts +58 -0
  68. package/dist/SkeletonRendererCore.js +310 -0
  69. package/dist/Skin.d.ts +20 -16
  70. package/dist/Skin.js +58 -53
  71. package/dist/Slider.d.ts +46 -0
  72. package/dist/Slider.js +115 -0
  73. package/dist/SliderData.d.ts +58 -0
  74. package/dist/SliderData.js +59 -0
  75. package/dist/SliderPose.d.ts +37 -0
  76. package/dist/SliderPose.js +40 -0
  77. package/dist/Slot.d.ts +16 -38
  78. package/dist/Slot.js +37 -60
  79. package/dist/SlotData.d.ts +5 -12
  80. package/dist/SlotData.js +7 -15
  81. package/dist/SlotPose.d.ts +59 -0
  82. package/dist/SlotPose.js +81 -0
  83. package/dist/Texture.d.ts +1 -0
  84. package/dist/Texture.js +2 -1
  85. package/dist/TextureAtlas.d.ts +3 -3
  86. package/dist/TextureAtlas.js +49 -49
  87. package/dist/TransformConstraint.d.ts +16 -28
  88. package/dist/TransformConstraint.js +72 -209
  89. package/dist/TransformConstraintData.d.ts +108 -20
  90. package/dist/TransformConstraintData.js +274 -24
  91. package/dist/TransformConstraintPose.d.ts +45 -0
  92. package/dist/TransformConstraintPose.js +52 -0
  93. package/dist/Triangulator.d.ts +1 -1
  94. package/dist/Triangulator.js +91 -107
  95. package/dist/{Updatable.d.ts → Update.d.ts} +5 -12
  96. package/dist/Update.js +30 -0
  97. package/dist/Utils.d.ts +12 -3
  98. package/dist/Utils.js +78 -37
  99. package/dist/attachments/Attachment.d.ts +27 -19
  100. package/dist/attachments/Attachment.js +59 -35
  101. package/dist/attachments/AttachmentLoader.d.ts +14 -14
  102. package/dist/attachments/AttachmentLoader.js +1 -1
  103. package/dist/attachments/BoundingBoxAttachment.d.ts +1 -1
  104. package/dist/attachments/BoundingBoxAttachment.js +2 -2
  105. package/dist/attachments/ClippingAttachment.d.ts +10 -3
  106. package/dist/attachments/ClippingAttachment.js +12 -3
  107. package/dist/attachments/{HasTextureRegion.d.ts → HasSequence.d.ts} +11 -14
  108. package/dist/attachments/HasSequence.js +30 -0
  109. package/dist/attachments/MeshAttachment.d.ts +28 -35
  110. package/dist/attachments/MeshAttachment.js +85 -97
  111. package/dist/attachments/PathAttachment.d.ts +3 -3
  112. package/dist/attachments/PathAttachment.js +6 -6
  113. package/dist/attachments/PointAttachment.d.ts +11 -6
  114. package/dist/attachments/PointAttachment.js +8 -3
  115. package/dist/attachments/RegionAttachment.d.ts +25 -27
  116. package/dist/attachments/RegionAttachment.js +101 -113
  117. package/dist/attachments/Sequence.d.ts +31 -6
  118. package/dist/attachments/Sequence.js +79 -13
  119. package/dist/esm/spine-core.min.mjs +2 -2
  120. package/dist/esm/spine-core.mjs +7651 -6090
  121. package/dist/esm/spine-core.mjs.map +4 -4
  122. package/dist/iife/spine-core.js +7651 -6090
  123. package/dist/iife/spine-core.js.map +4 -4
  124. package/dist/iife/spine-core.min.js +2 -2
  125. package/dist/index.d.ts +32 -11
  126. package/dist/index.js +33 -12
  127. package/dist/polyfills.js +4 -5
  128. package/package.json +1 -1
  129. package/dist/Updatable.js +0 -30
package/dist/Skeleton.js CHANGED
@@ -28,125 +28,134 @@
28
28
  *****************************************************************************/
29
29
  import { ClippingAttachment } from "./attachments/ClippingAttachment.js";
30
30
  import { MeshAttachment } from "./attachments/MeshAttachment.js";
31
- import { PathAttachment } from "./attachments/PathAttachment.js";
32
31
  import { RegionAttachment } from "./attachments/RegionAttachment.js";
33
32
  import { Bone } from "./Bone.js";
34
- import { IkConstraint } from "./IkConstraint.js";
35
- import { PathConstraint } from "./PathConstraint.js";
33
+ import { DrawOrder } from "./DrawOrder.js";
36
34
  import { PhysicsConstraint } from "./PhysicsConstraint.js";
37
35
  import { Slot } from "./Slot.js";
38
- import { TransformConstraint } from "./TransformConstraint.js";
39
- import { Color, Utils, MathUtils, Vector2 } from "./Utils.js";
40
- /** Stores the current pose for a skeleton.
36
+ import { Color, Utils, Vector2 } from "./Utils.js";
37
+ /** Stores bones and slots to be posed by animations and application code. Multiple skeleton instances can share the same
38
+ * {@link SkeletonData}, including animations, attachments, and skins.
39
+ *
40
+ * After posing, call {@link updateWorldTransform} to apply constraints and compute world transforms for rendering.
41
41
  *
42
42
  * See [Instance objects](http://esotericsoftware.com/spine-runtime-architecture#Instance-objects) in the Spine Runtimes Guide. */
43
43
  export class Skeleton {
44
44
  static quadTriangles = [0, 1, 2, 2, 3, 0];
45
45
  static yDown = false;
46
+ static get yDir() {
47
+ return Skeleton.yDown ? -1 : 1;
48
+ }
46
49
  /** The skeleton's setup pose data. */
47
50
  data;
48
51
  /** The skeleton's bones, sorted parent first. The root bone is always the first bone. */
49
52
  bones;
50
- /** The skeleton's slots in the setup pose draw order. */
53
+ /** The skeleton's slots. To add a slot, also add it to {@link DrawOrder.pose}. */
51
54
  slots;
52
- /** The skeleton's slots in the order they should be drawn. The returned array may be modified to change the draw order. */
55
+ /** The skeleton's draw order. Use {@link DrawOrder.appliedPose} for rendering and {@link DrawOrder.pose} for changing the draw
56
+ * order. */
53
57
  drawOrder;
54
- /** The skeleton's IK constraints. */
55
- ikConstraints;
56
- /** The skeleton's transform constraints. */
57
- transformConstraints;
58
- /** The skeleton's path constraints. */
59
- pathConstraints;
58
+ /** The skeleton's constraints. */
59
+ // biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
60
+ constraints;
60
61
  /** The skeleton's physics constraints. */
61
- physicsConstraints;
62
- /** The list of bones and constraints, sorted in the order they should be updated, as computed by {@link #updateCache()}. */
63
- _updateCache = new Array();
62
+ physics;
63
+ /** The list of bones and constraints, sorted in the order they should be updated, as computed by {@link updateCache}. */
64
+ // biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
65
+ _updateCache = [];
66
+ // biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
67
+ resetCache = [];
64
68
  /** The skeleton's current skin. May be null. */
65
69
  skin = null;
66
70
  /** The color to tint all the skeleton's attachments. */
67
71
  color;
68
- /** Scales the entire skeleton on the X axis. This affects all bones, even if the bone's transform mode disallows scale
69
- * inheritance. */
72
+ /** Scales the entire skeleton on the X axis.
73
+ *
74
+ * Bones that do not inherit scale are still affected by this property. */
70
75
  scaleX = 1;
71
- /** Scales the entire skeleton on the Y axis. This affects all bones, even if the bone's transform mode disallows scale
72
- * inheritance. */
73
76
  _scaleY = 1;
77
+ /** Scales the entire skeleton on the Y axis.
78
+ *
79
+ * Bones that do not inherit scale are still affected by this property. */
74
80
  get scaleY() {
75
- return Skeleton.yDown ? -this._scaleY : this._scaleY;
81
+ return this._scaleY * Skeleton.yDir;
76
82
  }
77
83
  set scaleY(scaleY) {
78
84
  this._scaleY = scaleY;
79
85
  }
80
- /** Sets the skeleton X position, which is added to the root bone worldX position. */
86
+ /** Sets the skeleton X position, which is added to the root bone worldX position.
87
+ *
88
+ * Bones that do not inherit translation are still affected by this property. */
81
89
  x = 0;
82
- /** Sets the skeleton Y position, which is added to the root bone worldY position. */
90
+ /** Sets the skeleton Y position, which is added to the root bone worldY position.
91
+ *
92
+ * Bones that do not inherit translation are still affected by this property. */
83
93
  y = 0;
84
- /** Returns the skeleton's time. This is used for time-based manipulations, such as {@link PhysicsConstraint}.
85
- * <p>
86
- * See {@link #update(float)}. */
94
+ /** Returns the skeleton's time, is used for time-based manipulations, such as {@link PhysicsConstraint}.
95
+ *
96
+ * See {@link _update}. */
87
97
  time = 0;
98
+ /** The x component of a vector that defines the direction {@link PhysicsConstraintPose.wind} is applied. */
99
+ windX = 1;
100
+ /** The y component of a vector that defines the direction {@link PhysicsConstraintPose.wind} is applied. */
101
+ windY = 0;
102
+ /** The x component of a vector that defines the direction {@link PhysicsConstraintPose.gravity} is applied. */
103
+ gravityX = 0;
104
+ /** The y component of a vector that defines the direction {@link PhysicsConstraintPose.gravity} is applied. */
105
+ gravityY = 1;
106
+ _update = 0;
88
107
  constructor(data) {
89
108
  if (!data)
90
109
  throw new Error("data cannot be null.");
91
110
  this.data = data;
92
- this.bones = new Array();
111
+ this.bones = [];
93
112
  for (let i = 0; i < data.bones.length; i++) {
94
- let boneData = data.bones[i];
113
+ const boneData = data.bones[i];
95
114
  let bone;
96
115
  if (!boneData.parent)
97
- bone = new Bone(boneData, this, null);
116
+ bone = new Bone(boneData, null);
98
117
  else {
99
- let parent = this.bones[boneData.parent.index];
100
- bone = new Bone(boneData, this, parent);
118
+ const parent = this.bones[boneData.parent.index];
119
+ bone = new Bone(boneData, parent);
101
120
  parent.children.push(bone);
102
121
  }
103
122
  this.bones.push(bone);
104
123
  }
105
- this.slots = new Array();
106
- this.drawOrder = new Array();
107
- for (let i = 0; i < data.slots.length; i++) {
108
- let slotData = data.slots[i];
109
- let bone = this.bones[slotData.boneData.index];
110
- let slot = new Slot(slotData, bone);
111
- this.slots.push(slot);
112
- this.drawOrder.push(slot);
113
- }
114
- this.ikConstraints = new Array();
115
- for (let i = 0; i < data.ikConstraints.length; i++) {
116
- let ikConstraintData = data.ikConstraints[i];
117
- this.ikConstraints.push(new IkConstraint(ikConstraintData, this));
118
- }
119
- this.transformConstraints = new Array();
120
- for (let i = 0; i < data.transformConstraints.length; i++) {
121
- let transformConstraintData = data.transformConstraints[i];
122
- this.transformConstraints.push(new TransformConstraint(transformConstraintData, this));
123
- }
124
- this.pathConstraints = new Array();
125
- for (let i = 0; i < data.pathConstraints.length; i++) {
126
- let pathConstraintData = data.pathConstraints[i];
127
- this.pathConstraints.push(new PathConstraint(pathConstraintData, this));
128
- }
129
- this.physicsConstraints = new Array();
130
- for (let i = 0; i < data.physicsConstraints.length; i++) {
131
- let physicsConstraintData = data.physicsConstraints[i];
132
- this.physicsConstraints.push(new PhysicsConstraint(physicsConstraintData, this));
124
+ this.slots = [];
125
+ for (const slotData of this.data.slots)
126
+ this.slots.push(new Slot(slotData, this));
127
+ this.drawOrder = new DrawOrder(this.slots);
128
+ this.physics = [];
129
+ // biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
130
+ this.constraints = [];
131
+ for (const constraintData of this.data.constraints) {
132
+ const constraint = constraintData.create(this);
133
+ if (constraint instanceof PhysicsConstraint)
134
+ this.physics.push(constraint);
135
+ this.constraints.push(constraint);
133
136
  }
134
137
  this.color = new Color(1, 1, 1, 1);
135
138
  this.updateCache();
136
139
  }
137
- /** Caches information about bones and constraints. Must be called if the {@link #getSkin()} is modified or if bones,
138
- * constraints, or weighted path attachments are added or removed. */
140
+ /** Caches information about bones and constraints. Must be called if the {@link skin} is modified or if bones, constraints,
141
+ * or weighted path attachments are added or removed. */
139
142
  updateCache() {
140
- let updateCache = this._updateCache;
141
- updateCache.length = 0;
142
- let bones = this.bones;
143
- for (let i = 0, n = bones.length; i < n; i++) {
144
- let bone = bones[i];
143
+ this._updateCache.length = 0;
144
+ this.resetCache.length = 0;
145
+ this.drawOrder.unconstrained();
146
+ const slots = this.slots;
147
+ for (let i = 0, n = slots.length; i < n; i++)
148
+ slots[i].unconstrained();
149
+ const bones = this.bones;
150
+ const boneCount = bones.length;
151
+ for (let i = 0, n = boneCount; i < n; i++) {
152
+ const bone = bones[i];
145
153
  bone.sorted = bone.data.skinRequired;
146
154
  bone.active = !bone.sorted;
155
+ bone.unconstrained();
147
156
  }
148
157
  if (this.skin) {
149
- let skinBones = this.skin.bones;
158
+ const skinBones = this.skin.bones;
150
159
  for (let i = 0, n = this.skin.bones.length; i < n; i++) {
151
160
  let bone = this.bones[skinBones[i].index];
152
161
  do {
@@ -156,158 +165,38 @@ export class Skeleton {
156
165
  } while (bone);
157
166
  }
158
167
  }
159
- // IK first, lowest hierarchy depth first.
160
- let ikConstraints = this.ikConstraints;
161
- let transformConstraints = this.transformConstraints;
162
- let pathConstraints = this.pathConstraints;
163
- let physicsConstraints = this.physicsConstraints;
164
- let ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length, physicsCount = this.physicsConstraints.length;
165
- let constraintCount = ikCount + transformCount + pathCount + physicsCount;
166
- outer: for (let i = 0; i < constraintCount; i++) {
167
- for (let ii = 0; ii < ikCount; ii++) {
168
- let constraint = ikConstraints[ii];
169
- if (constraint.data.order == i) {
170
- this.sortIkConstraint(constraint);
171
- continue outer;
172
- }
173
- }
174
- for (let ii = 0; ii < transformCount; ii++) {
175
- let constraint = transformConstraints[ii];
176
- if (constraint.data.order == i) {
177
- this.sortTransformConstraint(constraint);
178
- continue outer;
179
- }
180
- }
181
- for (let ii = 0; ii < pathCount; ii++) {
182
- let constraint = pathConstraints[ii];
183
- if (constraint.data.order == i) {
184
- this.sortPathConstraint(constraint);
185
- continue outer;
186
- }
187
- }
188
- for (let ii = 0; ii < physicsCount; ii++) {
189
- const constraint = physicsConstraints[ii];
190
- if (constraint.data.order == i) {
191
- this.sortPhysicsConstraint(constraint);
192
- continue outer;
193
- }
194
- }
168
+ const constraints = this.constraints;
169
+ let n = this.constraints.length;
170
+ for (let i = 0; i < n; i++)
171
+ constraints[i].unconstrained();
172
+ for (let i = 0; i < n; i++) {
173
+ const constraint = constraints[i];
174
+ constraint.active = constraint.isSourceActive()
175
+ // biome-ignore lint/complexity/useOptionalChain: changing to this might return undefined
176
+ && (!constraint.data.skinRequired || (this.skin != null && this.skin.constraints.includes(constraint.data)));
177
+ if (constraint.active)
178
+ constraint.sort(this);
195
179
  }
196
- for (let i = 0, n = bones.length; i < n; i++)
197
- this.sortBone(bones[i]);
198
- }
199
- sortIkConstraint(constraint) {
200
- constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));
201
- if (!constraint.active)
202
- return;
203
- let target = constraint.target;
204
- this.sortBone(target);
205
- let constrained = constraint.bones;
206
- let parent = constrained[0];
207
- this.sortBone(parent);
208
- if (constrained.length == 1) {
209
- this._updateCache.push(constraint);
210
- this.sortReset(parent.children);
211
- }
212
- else {
213
- let child = constrained[constrained.length - 1];
214
- this.sortBone(child);
215
- this._updateCache.push(constraint);
216
- this.sortReset(parent.children);
217
- child.sorted = true;
218
- }
219
- }
220
- sortPathConstraint(constraint) {
221
- constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));
222
- if (!constraint.active)
223
- return;
224
- let slot = constraint.target;
225
- let slotIndex = slot.data.index;
226
- let slotBone = slot.bone;
227
- if (this.skin)
228
- this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone);
229
- if (this.data.defaultSkin && this.data.defaultSkin != this.skin)
230
- this.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone);
231
- for (let i = 0, n = this.data.skins.length; i < n; i++)
232
- this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone);
233
- let attachment = slot.getAttachment();
234
- if (attachment instanceof PathAttachment)
235
- this.sortPathConstraintAttachmentWith(attachment, slotBone);
236
- let constrained = constraint.bones;
237
- let boneCount = constrained.length;
238
- for (let i = 0; i < boneCount; i++)
239
- this.sortBone(constrained[i]);
240
- this._updateCache.push(constraint);
241
180
  for (let i = 0; i < boneCount; i++)
242
- this.sortReset(constrained[i].children);
243
- for (let i = 0; i < boneCount; i++)
244
- constrained[i].sorted = true;
245
- }
246
- sortTransformConstraint(constraint) {
247
- constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));
248
- if (!constraint.active)
249
- return;
250
- this.sortBone(constraint.target);
251
- let constrained = constraint.bones;
252
- let boneCount = constrained.length;
253
- if (constraint.data.local) {
254
- for (let i = 0; i < boneCount; i++) {
255
- let child = constrained[i];
256
- this.sortBone(child.parent);
257
- this.sortBone(child);
258
- }
259
- }
260
- else {
261
- for (let i = 0; i < boneCount; i++) {
262
- this.sortBone(constrained[i]);
263
- }
181
+ this.sortBone(bones[i]);
182
+ n = this._updateCache.length;
183
+ for (let i = 0; i < n; i++) {
184
+ const updateable = this._updateCache[i];
185
+ if (updateable instanceof Bone)
186
+ this._updateCache[i] = updateable.appliedPose;
264
187
  }
265
- this._updateCache.push(constraint);
266
- for (let i = 0; i < boneCount; i++)
267
- this.sortReset(constrained[i].children);
268
- for (let i = 0; i < boneCount; i++)
269
- constrained[i].sorted = true;
270
188
  }
271
- sortPathConstraintAttachment(skin, slotIndex, slotBone) {
272
- let attachments = skin.attachments[slotIndex];
273
- if (!attachments)
274
- return;
275
- for (let key in attachments) {
276
- this.sortPathConstraintAttachmentWith(attachments[key], slotBone);
189
+ // biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
190
+ constrained(object) {
191
+ if (object.pose === object.appliedPose) {
192
+ object.constrained();
193
+ this.resetCache.push(object);
277
194
  }
278
195
  }
279
- sortPathConstraintAttachmentWith(attachment, slotBone) {
280
- if (!(attachment instanceof PathAttachment))
281
- return;
282
- let pathBones = attachment.bones;
283
- if (!pathBones)
284
- this.sortBone(slotBone);
285
- else {
286
- let bones = this.bones;
287
- for (let i = 0, n = pathBones.length; i < n;) {
288
- let nn = pathBones[i++];
289
- nn += i;
290
- while (i < nn)
291
- this.sortBone(bones[pathBones[i++]]);
292
- }
293
- }
294
- }
295
- sortPhysicsConstraint(constraint) {
296
- const bone = constraint.bone;
297
- constraint.active = bone.active && (!constraint.data.skinRequired || (this.skin != null && Utils.contains(this.skin.constraints, constraint.data, true)));
298
- if (!constraint.active)
299
- return;
300
- this.sortBone(bone);
301
- this._updateCache.push(constraint);
302
- this.sortReset(bone.children);
303
- bone.sorted = true;
304
- }
305
196
  sortBone(bone) {
306
- if (!bone)
197
+ if (bone.sorted || !bone.active)
307
198
  return;
308
- if (bone.sorted)
309
- return;
310
- let parent = bone.parent;
199
+ const parent = bone.parent;
311
200
  if (parent)
312
201
  this.sortBone(parent);
313
202
  bone.sorted = true;
@@ -315,166 +204,106 @@ export class Skeleton {
315
204
  }
316
205
  sortReset(bones) {
317
206
  for (let i = 0, n = bones.length; i < n; i++) {
318
- let bone = bones[i];
319
- if (!bone.active)
320
- continue;
321
- if (bone.sorted)
322
- this.sortReset(bone.children);
323
- bone.sorted = false;
207
+ const bone = bones[i];
208
+ if (bone.active) {
209
+ if (bone.sorted)
210
+ this.sortReset(bone.children);
211
+ bone.sorted = false;
212
+ }
324
213
  }
325
214
  }
326
215
  /** Updates the world transform for each bone and applies all constraints.
327
216
  *
328
- * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine
217
+ * See <a href="https://esotericsoftware.com/spine-runtime-skeletons#World-transforms">World transforms</a> in the Spine
329
218
  * Runtimes Guide. */
330
219
  updateWorldTransform(physics) {
331
- if (physics === undefined || physics === null)
332
- throw new Error("physics is undefined");
333
- let bones = this.bones;
334
- for (let i = 0, n = bones.length; i < n; i++) {
335
- let bone = bones[i];
336
- bone.ax = bone.x;
337
- bone.ay = bone.y;
338
- bone.arotation = bone.rotation;
339
- bone.ascaleX = bone.scaleX;
340
- bone.ascaleY = bone.scaleY;
341
- bone.ashearX = bone.shearX;
342
- bone.ashearY = bone.shearY;
343
- }
344
- let updateCache = this._updateCache;
345
- for (let i = 0, n = updateCache.length; i < n; i++)
346
- updateCache[i].update(physics);
347
- }
348
- updateWorldTransformWith(physics, parent) {
349
- if (!parent)
350
- throw new Error("parent cannot be null.");
351
- let bones = this.bones;
352
- for (let i = 1, n = bones.length; i < n; i++) { // Skip root bone.
353
- let bone = bones[i];
354
- bone.ax = bone.x;
355
- bone.ay = bone.y;
356
- bone.arotation = bone.rotation;
357
- bone.ascaleX = bone.scaleX;
358
- bone.ascaleY = bone.scaleY;
359
- bone.ashearX = bone.shearX;
360
- bone.ashearY = bone.shearY;
361
- }
362
- // Apply the parent bone transform to the root bone. The root bone always inherits scale, rotation and reflection.
363
- let rootBone = this.getRootBone();
364
- if (!rootBone)
365
- throw new Error("Root bone must not be null.");
366
- let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
367
- rootBone.worldX = pa * this.x + pb * this.y + parent.worldX;
368
- rootBone.worldY = pc * this.x + pd * this.y + parent.worldY;
369
- const rx = (rootBone.rotation + rootBone.shearX) * MathUtils.degRad;
370
- const ry = (rootBone.rotation + 90 + rootBone.shearY) * MathUtils.degRad;
371
- const la = Math.cos(rx) * rootBone.scaleX;
372
- const lb = Math.cos(ry) * rootBone.scaleY;
373
- const lc = Math.sin(rx) * rootBone.scaleX;
374
- const ld = Math.sin(ry) * rootBone.scaleY;
375
- rootBone.a = (pa * la + pb * lc) * this.scaleX;
376
- rootBone.b = (pa * lb + pb * ld) * this.scaleX;
377
- rootBone.c = (pc * la + pd * lc) * this.scaleY;
378
- rootBone.d = (pc * lb + pd * ld) * this.scaleY;
379
- // Update everything except root bone.
380
- let updateCache = this._updateCache;
381
- for (let i = 0, n = updateCache.length; i < n; i++) {
382
- let updatable = updateCache[i];
383
- if (updatable != rootBone)
384
- updatable.update(physics);
385
- }
220
+ this._update++;
221
+ if (this.drawOrder.appliedPose === this.drawOrder.constrainedPose)
222
+ this.drawOrder.resetConstrained();
223
+ const resetCache = this.resetCache;
224
+ for (let i = 0, n = this.resetCache.length; i < n; i++)
225
+ resetCache[i].resetConstrained();
226
+ const updateCache = this._updateCache;
227
+ for (let i = 0, n = this._updateCache.length; i < n; i++)
228
+ updateCache[i].update(this, physics);
386
229
  }
387
230
  /** Sets the bones, constraints, and slots to their setup pose values. */
388
- setToSetupPose() {
389
- this.setBonesToSetupPose();
390
- this.setSlotsToSetupPose();
231
+ setupPose() {
232
+ this.setupPoseBones();
233
+ this.setupPoseSlots();
391
234
  }
392
235
  /** Sets the bones and constraints to their setup pose values. */
393
- setBonesToSetupPose() {
394
- for (const bone of this.bones)
395
- bone.setToSetupPose();
396
- for (const constraint of this.ikConstraints)
397
- constraint.setToSetupPose();
398
- for (const constraint of this.transformConstraints)
399
- constraint.setToSetupPose();
400
- for (const constraint of this.pathConstraints)
401
- constraint.setToSetupPose();
402
- for (const constraint of this.physicsConstraints)
403
- constraint.setToSetupPose();
236
+ setupPoseBones() {
237
+ const bones = this.bones;
238
+ for (let i = 0, n = bones.length; i < n; i++)
239
+ bones[i].setupPose();
240
+ const constraints = this.constraints;
241
+ for (let i = 0, n = constraints.length; i < n; i++)
242
+ constraints[i].setupPose();
404
243
  }
405
244
  /** Sets the slots and draw order to their setup pose values. */
406
- setSlotsToSetupPose() {
407
- let slots = this.slots;
408
- Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length);
245
+ setupPoseSlots() {
246
+ this.drawOrder.setupPose();
247
+ const slots = this.slots;
409
248
  for (let i = 0, n = slots.length; i < n; i++)
410
- slots[i].setToSetupPose();
249
+ slots[i].setupPose();
411
250
  }
412
- /** @returns May return null. */
251
+ /** Returns the root bone, or null if the skeleton has no bones. */
413
252
  getRootBone() {
414
- if (this.bones.length == 0)
253
+ if (this.bones.length === 0)
415
254
  return null;
416
255
  return this.bones[0];
417
256
  }
418
- /** @returns May be null. */
257
+ /** Finds a bone by comparing each bone's name. It is more efficient to cache the results of this method than to call it
258
+ * repeatedly. */
419
259
  findBone(boneName) {
420
260
  if (!boneName)
421
261
  throw new Error("boneName cannot be null.");
422
- let bones = this.bones;
423
- for (let i = 0, n = bones.length; i < n; i++) {
424
- let bone = bones[i];
425
- if (bone.data.name == boneName)
426
- return bone;
427
- }
262
+ const bones = this.bones;
263
+ for (let i = 0, n = bones.length; i < n; i++)
264
+ if (bones[i].data.name === boneName)
265
+ return bones[i];
428
266
  return null;
429
267
  }
430
268
  /** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it
431
- * repeatedly.
432
- * @returns May be null. */
269
+ * repeatedly. */
433
270
  findSlot(slotName) {
434
271
  if (!slotName)
435
272
  throw new Error("slotName cannot be null.");
436
- let slots = this.slots;
437
- for (let i = 0, n = slots.length; i < n; i++) {
438
- let slot = slots[i];
439
- if (slot.data.name == slotName)
440
- return slot;
441
- }
273
+ const slots = this.slots;
274
+ for (let i = 0, n = slots.length; i < n; i++)
275
+ if (slots[i].data.name === slotName)
276
+ return slots[i];
442
277
  return null;
443
278
  }
444
- /** Sets a skin by name.
445
- *
446
- * See {@link #setSkin()}. */
279
+ setSkin(newSkin) {
280
+ if (typeof newSkin === "string")
281
+ this.setSkinByName(newSkin);
282
+ else
283
+ this.setSkinBySkin(newSkin);
284
+ }
285
+ ;
447
286
  setSkinByName(skinName) {
448
- let skin = this.data.findSkin(skinName);
287
+ const skin = this.data.findSkin(skinName);
449
288
  if (!skin)
450
- throw new Error("Skin not found: " + skinName);
289
+ throw new Error(`Skin not found: ${skinName}`);
451
290
  this.setSkin(skin);
452
291
  }
453
- /** Sets the skin used to look up attachments before looking in the {@link SkeletonData#defaultSkin default skin}. If the
454
- * skin is changed, {@link #updateCache()} is called.
455
- *
456
- * Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. If there was no
457
- * old skin, each slot's setup mode attachment is attached from the new skin.
458
- *
459
- * After changing the skin, the visible attachments can be reset to those attached in the setup pose by calling
460
- * {@link #setSlotsToSetupPose()}. Also, often {@link AnimationState#apply()} is called before the next time the
461
- * skeleton is rendered to allow any attachment keys in the current animation(s) to hide or show attachments from the new skin.
462
- * @param newSkin May be null. */
463
- setSkin(newSkin) {
464
- if (newSkin == this.skin)
292
+ setSkinBySkin(newSkin) {
293
+ if (newSkin === this.skin)
465
294
  return;
466
295
  if (newSkin) {
467
296
  if (this.skin)
468
297
  newSkin.attachAll(this, this.skin);
469
298
  else {
470
- let slots = this.slots;
299
+ const slots = this.slots;
471
300
  for (let i = 0, n = slots.length; i < n; i++) {
472
- let slot = slots[i];
473
- let name = slot.data.attachmentName;
301
+ const slot = slots[i];
302
+ const name = slot.data.attachmentName;
474
303
  if (name) {
475
- let attachment = newSkin.getAttachment(i, name);
304
+ const attachment = newSkin.getAttachment(i, name);
476
305
  if (attachment)
477
- slot.setAttachment(attachment);
306
+ slot.pose.setAttachment(attachment);
478
307
  }
479
308
  }
480
309
  }
@@ -482,180 +311,173 @@ export class Skeleton {
482
311
  this.skin = newSkin;
483
312
  this.updateCache();
484
313
  }
485
- /** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot name and attachment
314
+ getAttachment(slotNameOrIndex, placeholder) {
315
+ if (typeof slotNameOrIndex === 'string')
316
+ return this.getAttachmentByName(slotNameOrIndex, placeholder);
317
+ return this.getAttachmentByIndex(slotNameOrIndex, placeholder);
318
+ }
319
+ /** Finds an attachment by looking in the {@link skin} and {@link SkeletonData.defaultSkin} using the slot name and attachment
486
320
  * name.
487
321
  *
488
- * See {@link #getAttachment()}.
322
+ * See {@link getAttachment}.
489
323
  * @returns May be null. */
490
- getAttachmentByName(slotName, attachmentName) {
491
- let slot = this.data.findSlot(slotName);
324
+ getAttachmentByName(slotName, placeholder) {
325
+ const slot = this.data.findSlot(slotName);
492
326
  if (!slot)
493
327
  throw new Error(`Can't find slot with name ${slotName}`);
494
- return this.getAttachment(slot.index, attachmentName);
328
+ return this.getAttachment(slot.index, placeholder);
495
329
  }
496
- /** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot index and
330
+ /** Finds an attachment by looking in the {@link skin} and {@link SkeletonData.defaultSkin} using the slot index and
497
331
  * attachment name. First the skin is checked and if the attachment was not found, the default skin is checked.
498
332
  *
499
333
  * See [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide.
500
334
  * @returns May be null. */
501
- getAttachment(slotIndex, attachmentName) {
502
- if (!attachmentName)
503
- throw new Error("attachmentName cannot be null.");
335
+ getAttachmentByIndex(slotIndex, placeholder) {
336
+ if (!placeholder)
337
+ throw new Error("placeholder cannot be null.");
504
338
  if (this.skin) {
505
- let attachment = this.skin.getAttachment(slotIndex, attachmentName);
339
+ const attachment = this.skin.getAttachment(slotIndex, placeholder);
506
340
  if (attachment)
507
341
  return attachment;
508
342
  }
509
343
  if (this.data.defaultSkin)
510
- return this.data.defaultSkin.getAttachment(slotIndex, attachmentName);
344
+ return this.data.defaultSkin.getAttachment(slotIndex, placeholder);
511
345
  return null;
512
346
  }
513
- /** A convenience method to set an attachment by finding the slot with {@link #findSlot()}, finding the attachment with
514
- * {@link #getAttachment()}, then setting the slot's {@link Slot#attachment}.
515
- * @param attachmentName May be null to clear the slot's attachment. */
516
- setAttachment(slotName, attachmentName) {
347
+ /** A convenience method to set an attachment by finding the slot with {@link findSlot}, finding the attachment with
348
+ * {@link getAttachment}, then setting the slot's {@link Slot.attachment}.
349
+ * @param placeholder May be null to clear the slot's attachment. */
350
+ setAttachment(slotName, placeholder) {
517
351
  if (!slotName)
518
352
  throw new Error("slotName cannot be null.");
519
- let slots = this.slots;
520
- for (let i = 0, n = slots.length; i < n; i++) {
521
- let slot = slots[i];
522
- if (slot.data.name == slotName) {
523
- let attachment = null;
524
- if (attachmentName) {
525
- attachment = this.getAttachment(i, attachmentName);
526
- if (!attachment)
527
- throw new Error("Attachment not found: " + attachmentName + ", for slot: " + slotName);
528
- }
529
- slot.setAttachment(attachment);
530
- return;
531
- }
353
+ const slot = this.findSlot(slotName);
354
+ if (!slot)
355
+ throw new Error(`Slot not found: ${slotName}`);
356
+ let attachment = null;
357
+ if (placeholder) {
358
+ attachment = this.getAttachment(slot.data.index, placeholder);
359
+ if (!attachment)
360
+ throw new Error(`Attachment not found: ${placeholder}, for slot: ${slotName}`);
532
361
  }
533
- throw new Error("Slot not found: " + slotName);
534
- }
535
- /** Finds an IK constraint by comparing each IK constraint's name. It is more efficient to cache the results of this method
536
- * than to call it repeatedly.
537
- * @return May be null. */
538
- findIkConstraint(constraintName) {
539
- if (!constraintName)
540
- throw new Error("constraintName cannot be null.");
541
- return this.ikConstraints.find((constraint) => constraint.data.name == constraintName) ?? null;
542
- }
543
- /** Finds a transform constraint by comparing each transform constraint's name. It is more efficient to cache the results of
544
- * this method than to call it repeatedly.
545
- * @return May be null. */
546
- findTransformConstraint(constraintName) {
547
- if (!constraintName)
548
- throw new Error("constraintName cannot be null.");
549
- return this.transformConstraints.find((constraint) => constraint.data.name == constraintName) ?? null;
550
- }
551
- /** Finds a path constraint by comparing each path constraint's name. It is more efficient to cache the results of this method
552
- * than to call it repeatedly.
553
- * @return May be null. */
554
- findPathConstraint(constraintName) {
555
- if (!constraintName)
556
- throw new Error("constraintName cannot be null.");
557
- return this.pathConstraints.find((constraint) => constraint.data.name == constraintName) ?? null;
362
+ slot.pose.setAttachment(attachment);
558
363
  }
559
- /** Finds a physics constraint by comparing each physics constraint's name. It is more efficient to cache the results of this
560
- * method than to call it repeatedly. */
561
- findPhysicsConstraint(constraintName) {
364
+ /** Finds a constraint of the specified type by comparing each constraints's name. It is more efficient to cache the results of
365
+ * this method than to call it multiple times. */
366
+ // biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
367
+ findConstraint(constraintName, type) {
562
368
  if (constraintName == null)
563
369
  throw new Error("constraintName cannot be null.");
564
- return this.physicsConstraints.find((constraint) => constraint.data.name == constraintName) ?? null;
370
+ if (type == null)
371
+ throw new Error("type cannot be null.");
372
+ const constraints = this.constraints;
373
+ for (let i = 0, n = constraints.length; i < n; i++) {
374
+ const constraint = constraints[i];
375
+ if (constraint instanceof type && constraint.data.name === constraintName)
376
+ return constraint;
377
+ }
378
+ return null;
565
379
  }
566
- /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose as `{ x: number, y: number, width: number, height: number }`.
567
- * Note that this method will create temporary objects which can add to garbage collection pressure. Use `getBounds()` if garbage collection is a concern. */
380
+ /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the applied pose.
381
+ * @param offset An output value, the distance from the skeleton origin to the bottom left corner of the AABB.
382
+ * @param size An output value, the width and height of the AABB.
383
+ * @param temp Working memory to temporarily store attachments' computed world vertices. */
568
384
  getBoundsRect(clipper) {
569
- let offset = new Vector2();
570
- let size = new Vector2();
385
+ const offset = new Vector2();
386
+ const size = new Vector2();
571
387
  this.getBounds(offset, size, undefined, clipper);
572
388
  return { x: offset.x, y: offset.y, width: size.x, height: size.y };
573
389
  }
574
- /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose.
390
+ /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the applied pose. Optionally applies
391
+ * clipping.
575
392
  * @param offset An output value, the distance from the skeleton origin to the bottom left corner of the AABB.
576
393
  * @param size An output value, the width and height of the AABB.
577
394
  * @param temp Working memory to temporarily store attachments' computed world vertices.
578
- * @param clipper {@link SkeletonClipping} to use. If <code>null</code>, no clipping is applied. */
395
+ * @param clipper {@link SkeletonClipping} to use. If `null`, no clipping is applied. */
579
396
  getBounds(offset, size, temp = new Array(2), clipper = null) {
580
397
  if (!offset)
581
398
  throw new Error("offset cannot be null.");
582
399
  if (!size)
583
400
  throw new Error("size cannot be null.");
584
- let drawOrder = this.drawOrder;
401
+ const drawOrder = this.drawOrder.appliedPose;
402
+ const slots = drawOrder;
585
403
  let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
586
404
  for (let i = 0, n = drawOrder.length; i < n; i++) {
587
- let slot = drawOrder[i];
405
+ const slot = slots[i];
588
406
  if (!slot.bone.active)
589
407
  continue;
590
408
  let verticesLength = 0;
591
409
  let vertices = null;
592
410
  let triangles = null;
593
- let attachment = slot.getAttachment();
594
- if (attachment instanceof RegionAttachment) {
595
- verticesLength = 8;
596
- vertices = Utils.setArraySize(temp, verticesLength, 0);
597
- attachment.computeWorldVertices(slot, vertices, 0, 2);
598
- triangles = Skeleton.quadTriangles;
599
- }
600
- else if (attachment instanceof MeshAttachment) {
601
- let mesh = attachment;
602
- verticesLength = mesh.worldVerticesLength;
603
- vertices = Utils.setArraySize(temp, verticesLength, 0);
604
- mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2);
605
- triangles = mesh.triangles;
606
- }
607
- else if (attachment instanceof ClippingAttachment && clipper != null) {
608
- clipper.clipStart(slot, attachment);
609
- continue;
610
- }
611
- if (vertices && triangles) {
612
- if (clipper != null && clipper.isClipping()) {
613
- clipper.clipTriangles(vertices, triangles, triangles.length);
614
- vertices = clipper.clippedVertices;
615
- verticesLength = clipper.clippedVertices.length;
411
+ const attachment = slot.appliedPose.attachment;
412
+ if (attachment) {
413
+ if (attachment instanceof RegionAttachment) {
414
+ verticesLength = 8;
415
+ vertices = Utils.setArraySize(temp, verticesLength, 0);
416
+ attachment.computeWorldVertices(slot, attachment.getOffsets(slot.appliedPose), vertices, 0, 2);
417
+ triangles = Skeleton.quadTriangles;
616
418
  }
617
- for (let ii = 0, nn = vertices.length; ii < nn; ii += 2) {
618
- let x = vertices[ii], y = vertices[ii + 1];
619
- minX = Math.min(minX, x);
620
- minY = Math.min(minY, y);
621
- maxX = Math.max(maxX, x);
622
- maxY = Math.max(maxY, y);
419
+ else if (attachment instanceof MeshAttachment) {
420
+ verticesLength = attachment.worldVerticesLength;
421
+ vertices = Utils.setArraySize(temp, verticesLength, 0);
422
+ attachment.computeWorldVertices(this, slot, 0, verticesLength, vertices, 0, 2);
423
+ triangles = attachment.triangles;
424
+ }
425
+ else if (attachment instanceof ClippingAttachment && clipper) {
426
+ clipper.clipEnd(slot);
427
+ clipper.clipStart(this, slot, attachment);
428
+ continue;
429
+ }
430
+ if (vertices && triangles) {
431
+ if (clipper?.isClipping() && clipper.clipTriangles(vertices, triangles, triangles.length)) {
432
+ vertices = clipper.clippedVertices;
433
+ verticesLength = clipper.clippedVertices.length;
434
+ }
435
+ for (let ii = 0, nn = vertices.length; ii < nn; ii += 2) {
436
+ const x = vertices[ii], y = vertices[ii + 1];
437
+ minX = Math.min(minX, x);
438
+ minY = Math.min(minY, y);
439
+ maxX = Math.max(maxX, x);
440
+ maxY = Math.max(maxY, y);
441
+ }
623
442
  }
624
443
  }
625
- if (clipper != null)
626
- clipper.clipEndWithSlot(slot);
444
+ if (clipper)
445
+ clipper.clipEnd(slot);
627
446
  }
628
- if (clipper != null)
447
+ if (clipper)
629
448
  clipper.clipEnd();
630
449
  offset.set(minX, minY);
631
450
  size.set(maxX - minX, maxY - minY);
632
451
  }
633
- /** Increments the skeleton's {@link #time}. */
452
+ /** Scales the entire skeleton on the X and Y axes.
453
+ *
454
+ * Bones that do not inherit scale are still affected by this property. */
455
+ setScale(scaleX, scaleY) {
456
+ this.scaleX = scaleX;
457
+ this.scaleY = scaleY;
458
+ }
459
+ /** Sets the skeleton X and Y position, which is added to the root bone worldX and worldY position.
460
+ *
461
+ * Bones that do not inherit translation are still affected by this property. */
462
+ setPosition(x, y) {
463
+ this.x = x;
464
+ this.y = y;
465
+ }
466
+ /** Increments the skeleton's {@link time}. */
634
467
  update(delta) {
635
468
  this.time += delta;
636
469
  }
470
+ /** Calls {@link PhysicsConstraint.translate} for each physics constraint. */
637
471
  physicsTranslate(x, y) {
638
- const physicsConstraints = this.physicsConstraints;
639
- for (let i = 0, n = physicsConstraints.length; i < n; i++)
640
- physicsConstraints[i].translate(x, y);
472
+ const constraints = this.physics;
473
+ for (let i = 0, n = constraints.length; i < n; i++)
474
+ constraints[i].translate(x, y);
641
475
  }
642
- /** Calls {@link PhysicsConstraint#rotate(float, float, float)} for each physics constraint. */
476
+ /** Calls {@link PhysicsConstraint.rotate} for each physics constraint. */
643
477
  physicsRotate(x, y, degrees) {
644
- const physicsConstraints = this.physicsConstraints;
645
- for (let i = 0, n = physicsConstraints.length; i < n; i++)
646
- physicsConstraints[i].rotate(x, y, degrees);
478
+ const constraints = this.physics;
479
+ for (let i = 0, n = constraints.length; i < n; i++)
480
+ constraints[i].rotate(x, y, degrees);
647
481
  }
648
482
  }
649
- /** Determines how physics and other non-deterministic updates are applied. */
650
- export var Physics;
651
- (function (Physics) {
652
- /** Physics are not updated or applied. */
653
- Physics[Physics["none"] = 0] = "none";
654
- /** Physics are reset to the current pose. */
655
- Physics[Physics["reset"] = 1] = "reset";
656
- /** Physics are updated and the pose from physics is applied. */
657
- Physics[Physics["update"] = 2] = "update";
658
- /** Physics are not updated but the pose from physics is applied. */
659
- Physics[Physics["pose"] = 3] = "pose";
660
- })(Physics || (Physics = {}));
661
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU2tlbGV0b24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTNELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0QsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBbUIsTUFBTSxZQUFZLENBQUM7QUFFL0U7O2tJQUVrSTtBQUNsSSxNQUFNLE9BQU8sUUFBUTtJQUNaLE1BQU0sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBRXJCLHNDQUFzQztJQUN0QyxJQUFJLENBQWU7SUFFbkIseUZBQXlGO0lBQ3pGLEtBQUssQ0FBYztJQUVuQix5REFBeUQ7SUFDekQsS0FBSyxD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LEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN6RSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDMUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0MsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0MsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0MsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFL0Msc0NBQXNDO1FBQ3RDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BELElBQUksU0FBUyxHQUFHLFdBQVcs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Q0FBQyxrQkFBa0IsQ0FBQztRQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3hELGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELCtGQUErRjtJQUMvRixhQUFhLENBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxPQUFlO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDeEQsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7QUFHRiw4RUFBOEU7QUFDOUUsTUFBTSxDQUFOLElBQVksT0FZWDtBQVpELFdBQVksT0FBTztJQUNsQiwwQ0FBMEM7SUFDMUMscUNBQUksQ0FBQTtJQUVKLDZDQUE2QztJQUM3Qyx1Q0FBSyxDQUFBO0lBRUwsZ0VBQWdFO0lBQ2hFLHlDQUFNLENBQUE7SUFFTixvRUFBb0U7SUFDcEUscUNBQUksQ0FBQTtBQUNMLENBQUMsRUFaVyxPQUFPLEtBQVAsT0FBTyxRQVlsQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IENsaXBwaW5nQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0NsaXBwaW5nQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgTWVzaEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9NZXNoQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgUGF0aEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9QYXRoQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgUmVnaW9uQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL1JlZ2lvbkF0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IEJvbmUgfSBmcm9tIFwiLi9Cb25lLmpzXCI7XG5pbXBvcnQgeyBJa0NvbnN0cmFpbnQgfSBmcm9tIFwiLi9Ja0NvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IFBhdGhDb25zdHJhaW50IH0gZnJvbSBcIi4vUGF0aENvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IFBoeXNpY3NDb25zdHJhaW50IH0gZnJvbSBcIi4vUGh5c2ljc0NvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IFNrZWxldG9uQ2xpcHBpbmcgfSBmcm9tIFwiLi9Ta2VsZXRvbkNsaXBwaW5nLmpzXCI7XG5pbXBvcnQgeyBTa2VsZXRvbkRhdGEgfSBmcm9tIFwiLi9Ta2VsZXRvbkRhdGEuanNcIjtcbmltcG9ydCB7IFNraW4gfSBmcm9tIFwiLi9Ta2luLmpzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIi4vU2xvdC5qc1wiO1xuaW1wb3J0IHsgVHJhbnNmb3JtQ29uc3RyYWludCB9IGZyb20gXCIuL1RyYW5zZm9ybUNvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IFVwZGF0YWJsZSB9IGZyb20gXCIuL1VwZGF0YWJsZS5qc1wiO1xuaW1wb3J0IHsgQ29sb3IsIFV0aWxzLCBNYXRoVXRpbHMsIFZlY3RvcjIsIE51bWJlckFycmF5TGlrZSB9IGZyb20gXCIuL1V0aWxzLmpzXCI7XG5cbi8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgcG9zZSBmb3IgYSBza2VsZXRvbi5cbiAqXG4gKiBTZWUgW0luc3RhbmNlIG9iamVjdHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1ydW50aW1lLWFyY2hpdGVjdHVyZSNJbnN0YW5jZS1vYmplY3RzKSBpbiB0aGUgU3BpbmUgUnVudGltZXMgR3VpZGUuICovXG5leHBvcnQgY2xhc3MgU2tlbGV0b24ge1xuXHRwcml2YXRlIHN0YXRpYyBxdWFkVHJpYW5nbGVzID0gWzAsIDEsIDIsIDIsIDMsIDBdO1xuXHRzdGF0aWMgeURvd24gPSBmYWxzZTtcblxuXHQvKiogVGhlIHNrZWxldG9uJ3Mgc2V0dXAgcG9zZSBkYXRhLiAqL1xuXHRkYXRhOiBTa2VsZXRvbkRhdGE7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGJvbmVzLCBzb3J0ZWQgcGFyZW50IGZpcnN0LiBUaGUgcm9vdCBib25lIGlzIGFsd2F5cyB0aGUgZmlyc3QgYm9uZS4gKi9cblx0Ym9uZXM6IEFycmF5PEJvbmU+O1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBzbG90cyBpbiB0aGUgc2V0dXAgcG9zZSBkcmF3IG9yZGVyLiAqL1xuXHRzbG90czogQXJyYXk8U2xvdD47XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIHNsb3RzIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSBkcmF3bi4gVGhlIHJldHVybmVkIGFycmF5IG1heSBiZSBtb2RpZmllZCB0byBjaGFuZ2UgdGhlIGRyYXcgb3JkZXIuICovXG5cdGRyYXdPcmRlcjogQXJyYXk8U2xvdD47XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIElLIGNvbnN0cmFpbnRzLiAqL1xuXHRpa0NvbnN0cmFpbnRzOiBBcnJheTxJa0NvbnN0cmFpbnQ+O1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyB0cmFuc2Zvcm0gY29uc3RyYWludHMuICovXG5cdHRyYW5zZm9ybUNvbnN0cmFpbnRzOiBBcnJheTxUcmFuc2Zvcm1Db25zdHJhaW50PjtcblxuXHQvKiogVGhlIHNrZWxldG9uJ3MgcGF0aCBjb25zdHJhaW50cy4gKi9cblx0cGF0aENvbnN0cmFpbnRzOiBBcnJheTxQYXRoQ29uc3RyYWludD47XG5cblxuXHQvKiogVGhlIHNrZWxldG9uJ3MgcGh5c2ljcyBjb25zdHJhaW50cy4gKi9cblx0cGh5c2ljc0NvbnN0cmFpbnRzOiBBcnJheTxQaHlzaWNzQ29uc3RyYWludD47XG5cblx0LyoqIFRoZSBsaXN0IG9mIGJvbmVzIGFuZCBjb25zdHJhaW50cywgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSB1cGRhdGVkLCBhcyBjb21wdXRlZCBieSB7QGxpbmsgI3VwZGF0ZUNhY2hlKCl9LiAqL1xuXHRfdXBkYXRlQ2FjaGUgPSBuZXcgQXJyYXk8VXBkYXRhYmxlPigpO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBjdXJyZW50IHNraW4uIE1heSBiZSBudWxsLiAqL1xuXHRza2luOiBTa2luIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSBjb2xvciB0byB0aW50IGFsbCB0aGUgc2tlbGV0b24ncyBhdHRhY2htZW50cy4gKi9cblx0Y29sb3I6IENvbG9yO1xuXG5cdC8qKiBTY2FsZXMgdGhlIGVudGlyZSBza2VsZXRvbiBvbiB0aGUgWCBheGlzLiBUaGlzIGFmZmVjdHMgYWxsIGJvbmVzLCBldmVuIGlmIHRoZSBib25lJ3MgdHJhbnNmb3JtIG1vZGUgZGlzYWxsb3dzIHNjYWxlXG5cdCAgKiBpbmhlcml0YW5jZS4gKi9cblx0c2NhbGVYID0gMTtcblxuXHQvKiogU2NhbGVzIHRoZSBlbnRpcmUgc2tlbGV0b24gb24gdGhlIFkgYXhpcy4gVGhpcyBhZmZlY3RzIGFsbCBib25lcywgZXZlbiBpZiB0aGUgYm9uZSdzIHRyYW5zZm9ybSBtb2RlIGRpc2FsbG93cyBzY2FsZVxuXHQgICogaW5oZXJpdGFuY2UuICovXG5cdHByaXZhdGUgX3NjYWxlWSA9IDE7XG5cblx0cHVibGljIGdldCBzY2FsZVkgKCkge1xuXHRcdHJldHVybiBTa2VsZXRvbi55RG93biA/IC10aGlzLl9zY2FsZVkgOiB0aGlzLl9zY2FsZVk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHNjYWxlWSAoc2NhbGVZOiBudW1iZXIpIHtcblx0XHR0aGlzLl9zY2FsZVkgPSBzY2FsZVk7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgc2tlbGV0b24gWCBwb3NpdGlvbiwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIHJvb3QgYm9uZSB3b3JsZFggcG9zaXRpb24uICovXG5cdHggPSAwO1xuXG5cdC8qKiBTZXRzIHRoZSBza2VsZXRvbiBZIHBvc2l0aW9uLCB3aGljaCBpcyBhZGRlZCB0byB0aGUgcm9vdCBib25lIHdvcmxkWSBwb3NpdGlvbi4gKi9cblx0eSA9IDA7XG5cblx0LyoqIFJldHVybnMgdGhlIHNrZWxldG9uJ3MgdGltZS4gVGhpcyBpcyB1c2VkIGZvciB0aW1lLWJhc2VkIG1hbmlwdWxhdGlvbnMsIHN1Y2ggYXMge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50fS5cblx0ICogPHA+XG5cdCAqIFNlZSB7QGxpbmsgI3VwZGF0ZShmbG9hdCl9LiAqL1xuXHR0aW1lID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZGF0YTogU2tlbGV0b25EYXRhKSB7XG5cdFx0aWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJkYXRhIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXG5cdFx0dGhpcy5ib25lcyA9IG5ldyBBcnJheTxCb25lPigpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ib25lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IGJvbmVEYXRhID0gZGF0YS5ib25lc1tpXTtcblx0XHRcdGxldCBib25lOiBCb25lO1xuXHRcdFx0aWYgKCFib25lRGF0YS5wYXJlbnQpXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZShib25lRGF0YSwgdGhpcywgbnVsbCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bGV0IHBhcmVudCA9IHRoaXMuYm9uZXNbYm9uZURhdGEucGFyZW50LmluZGV4XTtcblx0XHRcdFx0Ym9uZSA9IG5ldyBCb25lKGJvbmVEYXRhLCB0aGlzLCBwYXJlbnQpO1xuXHRcdFx0XHRwYXJlbnQuY2hpbGRyZW4ucHVzaChib25lKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYm9uZXMucHVzaChib25lKTtcblx0XHR9XG5cblx0XHR0aGlzLnNsb3RzID0gbmV3IEFycmF5PFNsb3Q+KCk7XG5cdFx0dGhpcy5kcmF3T3JkZXIgPSBuZXcgQXJyYXk8U2xvdD4oKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEuc2xvdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBzbG90RGF0YSA9IGRhdGEuc2xvdHNbaV07XG5cdFx0XHRsZXQgYm9uZSA9IHRoaXMuYm9uZXNbc2xvdERhdGEuYm9uZURhdGEuaW5kZXhdO1xuXHRcdFx0bGV0IHNsb3QgPSBuZXcgU2xvdChzbG90RGF0YSwgYm9uZSk7XG5cdFx0XHR0aGlzLnNsb3RzLnB1c2goc2xvdCk7XG5cdFx0XHR0aGlzLmRyYXdPcmRlci5wdXNoKHNsb3QpO1xuXHRcdH1cblxuXHRcdHRoaXMuaWtDb25zdHJhaW50cyA9IG5ldyBBcnJheTxJa0NvbnN0cmFpbnQ+KCk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmlrQ29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBpa0NvbnN0cmFpbnREYXRhID0gZGF0YS5pa0NvbnN0cmFpbnRzW2ldO1xuXHRcdFx0dGhpcy5pa0NvbnN0cmFpbnRzLnB1c2gobmV3IElrQ29uc3RyYWludChpa0NvbnN0cmFpbnREYXRhLCB0aGlzKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc2Zvcm1Db25zdHJhaW50cyA9IG5ldyBBcnJheTxUcmFuc2Zvcm1Db25zdHJhaW50PigpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS50cmFuc2Zvcm1Db25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IHRyYW5zZm9ybUNvbnN0cmFpbnREYXRhID0gZGF0YS50cmFuc2Zvcm1Db25zdHJhaW50c1tpXTtcblx0XHRcdHRoaXMudHJhbnNmb3JtQ29uc3RyYWludHMucHVzaChuZXcgVHJhbnNmb3JtQ29uc3RyYWludCh0cmFuc2Zvcm1Db25zdHJhaW50RGF0YSwgdGhpcykpO1xuXHRcdH1cblxuXHRcdHRoaXMucGF0aENvbnN0cmFpbnRzID0gbmV3IEFycmF5PFBhdGhDb25zdHJhaW50PigpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5wYXRoQ29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBwYXRoQ29uc3RyYWludERhdGEgPSBkYXRhLnBhdGhDb25zdHJhaW50c1tpXTtcblx0XHRcdHRoaXMucGF0aENvbnN0cmFpbnRzLnB1c2gobmV3IFBhdGhDb25zdHJhaW50KHBhdGhDb25zdHJhaW50RGF0YSwgdGhpcykpO1xuXHRcdH1cblxuXHRcdHRoaXMucGh5c2ljc0NvbnN0cmFpbnRzID0gbmV3IEFycmF5PFBoeXNpY3NDb25zdHJhaW50PigpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5waHlzaWNzQ29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBwaHlzaWNzQ29uc3RyYWludERhdGEgPSBkYXRhLnBoeXNpY3NDb25zdHJhaW50c1tpXTtcblx0XHRcdHRoaXMucGh5c2ljc0NvbnN0cmFpbnRzLnB1c2gobmV3IFBoeXNpY3NDb25zdHJhaW50KHBoeXNpY3NDb25zdHJhaW50RGF0YSwgdGhpcykpO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSk7XG5cdFx0dGhpcy51cGRhdGVDYWNoZSgpO1xuXHR9XG5cblx0LyoqIENhY2hlcyBpbmZvcm1hdGlvbiBhYm91dCBib25lcyBhbmQgY29uc3RyYWludHMuIE11c3QgYmUgY2FsbGVkIGlmIHRoZSB7QGxpbmsgI2dldFNraW4oKX0gaXMgbW9kaWZpZWQgb3IgaWYgYm9uZXMsXG5cdCAqIGNvbnN0cmFpbnRzLCBvciB3ZWlnaHRlZCBwYXRoIGF0dGFjaG1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLiAqL1xuXHR1cGRhdGVDYWNoZSAoKSB7XG5cdFx0bGV0IHVwZGF0ZUNhY2hlID0gdGhpcy5fdXBkYXRlQ2FjaGU7XG5cdFx0dXBkYXRlQ2FjaGUubGVuZ3RoID0gMDtcblxuXHRcdGxldCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRib25lLnNvcnRlZCA9IGJvbmUuZGF0YS5za2luUmVxdWlyZWQ7XG5cdFx0XHRib25lLmFjdGl2ZSA9ICFib25lLnNvcnRlZDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5za2luKSB7XG5cdFx0XHRsZXQgc2tpbkJvbmVzID0gdGhpcy5za2luLmJvbmVzO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLnNraW4uYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRcdGxldCBib25lOiBCb25lIHwgbnVsbCA9IHRoaXMuYm9uZXNbc2tpbkJvbmVzW2ldLmluZGV4XTtcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGJvbmUuc29ydGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0Ym9uZS5hY3RpdmUgPSB0cnVlO1xuXHRcdFx0XHRcdGJvbmUgPSBib25lLnBhcmVudDtcblx0XHRcdFx0fSB3aGlsZSAoYm9uZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSUsgZmlyc3QsIGxvd2VzdCBoaWVyYXJjaHkgZGVwdGggZmlyc3QuXG5cdFx0bGV0IGlrQ29uc3RyYWludHMgPSB0aGlzLmlrQ29uc3RyYWludHM7XG5cdFx0bGV0IHRyYW5zZm9ybUNvbnN0cmFpbnRzID0gdGhpcy50cmFuc2Zvcm1Db25zdHJhaW50cztcblx0XHRsZXQgcGF0aENvbnN0cmFpbnRzID0gdGhpcy5wYXRoQ29uc3RyYWludHM7XG5cdFx0bGV0IHBoeXNpY3NDb25zdHJhaW50cyA9IHRoaXMucGh5c2ljc0NvbnN0cmFpbnRzO1xuXHRcdGxldCBpa0NvdW50ID0gaWtDb25zdHJhaW50cy5sZW5ndGgsIHRyYW5zZm9ybUNvdW50ID0gdHJhbnNmb3JtQ29uc3RyYWludHMubGVuZ3RoLCBwYXRoQ291bnQgPSBwYXRoQ29uc3RyYWludHMubGVuZ3RoLCBwaHlzaWNzQ291bnQgPSB0aGlzLnBoeXNpY3NDb25zdHJhaW50cy5sZW5ndGg7XG5cdFx0bGV0IGNvbnN0cmFpbnRDb3VudCA9IGlrQ291bnQgKyB0cmFuc2Zvcm1Db3VudCArIHBhdGhDb3VudCArIHBoeXNpY3NDb3VudDtcblxuXHRcdG91dGVyOlxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY29uc3RyYWludENvdW50OyBpKyspIHtcblx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBpa0NvdW50OyBpaSsrKSB7XG5cdFx0XHRcdGxldCBjb25zdHJhaW50ID0gaWtDb25zdHJhaW50c1tpaV07XG5cdFx0XHRcdGlmIChjb25zdHJhaW50LmRhdGEub3JkZXIgPT0gaSkge1xuXHRcdFx0XHRcdHRoaXMuc29ydElrQ29uc3RyYWludChjb25zdHJhaW50KTtcblx0XHRcdFx0XHRjb250aW51ZSBvdXRlcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHRyYW5zZm9ybUNvdW50OyBpaSsrKSB7XG5cdFx0XHRcdGxldCBjb25zdHJhaW50ID0gdHJhbnNmb3JtQ29uc3RyYWludHNbaWldO1xuXHRcdFx0XHRpZiAoY29uc3RyYWludC5kYXRhLm9yZGVyID09IGkpIHtcblx0XHRcdFx0XHR0aGlzLnNvcnRUcmFuc2Zvcm1Db25zdHJhaW50KGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRcdGNvbnRpbnVlIG91dGVyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGF0aENvdW50OyBpaSsrKSB7XG5cdFx0XHRcdGxldCBjb25zdHJhaW50ID0gcGF0aENvbnN0cmFpbnRzW2lpXTtcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnQuZGF0YS5vcmRlciA9PSBpKSB7XG5cdFx0XHRcdFx0dGhpcy5zb3J0UGF0aENvbnN0cmFpbnQoY29uc3RyYWludCk7XG5cdFx0XHRcdFx0Y29udGludWUgb3V0ZXI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBwaHlzaWNzQ291bnQ7IGlpKyspIHtcblx0XHRcdFx0Y29uc3QgY29uc3RyYWludCA9IHBoeXNpY3NDb25zdHJhaW50c1tpaV07XG5cdFx0XHRcdGlmIChjb25zdHJhaW50LmRhdGEub3JkZXIgPT0gaSkge1xuXHRcdFx0XHRcdHRoaXMuc29ydFBoeXNpY3NDb25zdHJhaW50KGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRcdGNvbnRpbnVlIG91dGVyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHR0aGlzLnNvcnRCb25lKGJvbmVzW2ldKTtcblx0fVxuXG5cdHNvcnRJa0NvbnN0cmFpbnQgKGNvbnN0cmFpbnQ6IElrQ29uc3RyYWludCkge1xuXHRcdGNvbnN0cmFpbnQuYWN0aXZlID0gY29uc3RyYWludC50YXJnZXQuaXNBY3RpdmUoKSAmJiAoIWNvbnN0cmFpbnQuZGF0YS5za2luUmVxdWlyZWQgfHwgKHRoaXMuc2tpbiAmJiBVdGlscy5jb250YWlucyh0aGlzLnNraW4uY29uc3RyYWludHMsIGNvbnN0cmFpbnQuZGF0YSwgdHJ1ZSkpKSE7XG5cdFx0aWYgKCFjb25zdHJhaW50LmFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0bGV0IHRhcmdldCA9IGNvbnN0cmFpbnQudGFyZ2V0O1xuXHRcdHRoaXMuc29ydEJvbmUodGFyZ2V0KTtcblxuXHRcdGxldCBjb25zdHJhaW5lZCA9IGNvbnN0cmFpbnQuYm9uZXM7XG5cdFx0bGV0IHBhcmVudCA9IGNvbnN0cmFpbmVkWzBdO1xuXHRcdHRoaXMuc29ydEJvbmUocGFyZW50KTtcblxuXHRcdGlmIChjb25zdHJhaW5lZC5sZW5ndGggPT0gMSkge1xuXHRcdFx0dGhpcy5fdXBkYXRlQ2FjaGUucHVzaChjb25zdHJhaW50KTtcblx0XHRcdHRoaXMuc29ydFJlc2V0KHBhcmVudC5jaGlsZHJlbik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxldCBjaGlsZCA9IGNvbnN0cmFpbmVkW2NvbnN0cmFpbmVkLmxlbmd0aCAtIDFdO1xuXHRcdFx0dGhpcy5zb3J0Qm9uZShjaGlsZCk7XG5cblx0XHRcdHRoaXMuX3VwZGF0ZUNhY2hlLnB1c2goY29uc3RyYWludCk7XG5cblx0XHRcdHRoaXMuc29ydFJlc2V0KHBhcmVudC5jaGlsZHJlbik7XG5cdFx0XHRjaGlsZC5zb3J0ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHNvcnRQYXRoQ29uc3RyYWludCAoY29uc3RyYWludDogUGF0aENvbnN0cmFpbnQpIHtcblx0XHRjb25zdHJhaW50LmFjdGl2ZSA9IGNvbnN0cmFpbnQudGFyZ2V0LmJvbmUuaXNBY3RpdmUoKSAmJiAoIWNvbnN0cmFpbnQuZGF0YS5za2luUmVxdWlyZWQgfHwgKHRoaXMuc2tpbiAmJiBVdGlscy5jb250YWlucyh0aGlzLnNraW4uY29uc3RyYWludHMsIGNvbnN0cmFpbnQuZGF0YSwgdHJ1ZSkpKSE7XG5cdFx0aWYgKCFjb25zdHJhaW50LmFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0bGV0IHNsb3QgPSBjb25zdHJhaW50LnRhcmdldDtcblx0XHRsZXQgc2xvdEluZGV4ID0gc2xvdC5kYXRhLmluZGV4O1xuXHRcdGxldCBzbG90Qm9uZSA9IHNsb3QuYm9uZTtcblx0XHRpZiAodGhpcy5za2luKSB0aGlzLnNvcnRQYXRoQ29uc3RyYWludEF0dGFjaG1lbnQodGhpcy5za2luLCBzbG90SW5kZXgsIHNsb3RCb25lKTtcblx0XHRpZiAodGhpcy5kYXRhLmRlZmF1bHRTa2luICYmIHRoaXMuZGF0YS5kZWZhdWx0U2tpbiAhPSB0aGlzLnNraW4pXG5cdFx0XHR0aGlzLnNvcnRQYXRoQ29uc3RyYWludEF0dGFjaG1lbnQodGhpcy5kYXRhLmRlZmF1bHRTa2luLCBzbG90SW5kZXgsIHNsb3RCb25lKTtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRoaXMuZGF0YS5za2lucy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHR0aGlzLnNvcnRQYXRoQ29uc3RyYWludEF0dGFjaG1lbnQodGhpcy5kYXRhLnNraW5zW2ldLCBzbG90SW5kZXgsIHNsb3RCb25lKTtcblxuXHRcdGxldCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cdFx0aWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBQYXRoQXR0YWNobWVudCkgdGhpcy5zb3J0UGF0aENvbnN0cmFpbnRBdHRhY2htZW50V2l0aChhdHRhY2htZW50LCBzbG90Qm9uZSk7XG5cblx0XHRsZXQgY29uc3RyYWluZWQgPSBjb25zdHJhaW50LmJvbmVzO1xuXHRcdGxldCBib25lQ291bnQgPSBjb25zdHJhaW5lZC5sZW5ndGg7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBib25lQ291bnQ7IGkrKylcblx0XHRcdHRoaXMuc29ydEJvbmUoY29uc3RyYWluZWRbaV0pO1xuXG5cdFx0dGhpcy5fdXBkYXRlQ2FjaGUucHVzaChjb25zdHJhaW50KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYm9uZUNvdW50OyBpKyspXG5cdFx0XHR0aGlzLnNvcnRSZXNldChjb25zdHJhaW5lZFtpXS5jaGlsZHJlbik7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBib25lQ291bnQ7IGkrKylcblx0XHRcdGNvbnN0cmFpbmVkW2ldLnNvcnRlZCA9IHRydWU7XG5cdH1cblxuXHRzb3J0VHJhbnNmb3JtQ29uc3RyYWludCAoY29uc3RyYWludDogVHJhbnNmb3JtQ29uc3RyYWludCkge1xuXHRcdGNvbnN0cmFpbnQuYWN0aXZlID0gY29uc3RyYWludC50YXJnZXQuaXNBY3RpdmUoKSAmJiAoIWNvbnN0cmFpbnQuZGF0YS5za2luUmVxdWlyZWQgfHwgKHRoaXMuc2tpbiAmJiBVdGlscy5jb250YWlucyh0aGlzLnNraW4uY29uc3RyYWludHMsIGNvbnN0cmFpbnQuZGF0YSwgdHJ1ZSkpKSE7XG5cdFx0aWYgKCFjb25zdHJhaW50LmFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0dGhpcy5zb3J0Qm9uZShjb25zdHJhaW50LnRhcmdldCk7XG5cblx0XHRsZXQgY29uc3RyYWluZWQgPSBjb25zdHJhaW50LmJvbmVzO1xuXHRcdGxldCBib25lQ291bnQgPSBjb25zdHJhaW5lZC5sZW5ndGg7XG5cdFx0aWYgKGNvbnN0cmFpbnQuZGF0YS5sb2NhbCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBib25lQ291bnQ7IGkrKykge1xuXHRcdFx0XHRsZXQgY2hpbGQgPSBjb25zdHJhaW5lZFtpXTtcblx0XHRcdFx0dGhpcy5zb3J0Qm9uZShjaGlsZC5wYXJlbnQhKTtcblx0XHRcdFx0dGhpcy5zb3J0Qm9uZShjaGlsZCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYm9uZUNvdW50OyBpKyspIHtcblx0XHRcdFx0dGhpcy5zb3J0Qm9uZShjb25zdHJhaW5lZFtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fdXBkYXRlQ2FjaGUucHVzaChjb25zdHJhaW50KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYm9uZUNvdW50OyBpKyspXG5cdFx0XHR0aGlzLnNvcnRSZXNldChjb25zdHJhaW5lZFtpXS5jaGlsZHJlbik7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBib25lQ291bnQ7IGkrKylcblx0XHRcdGNvbnN0cmFpbmVkW2ldLnNvcnRlZCA9IHRydWU7XG5cdH1cblxuXHRzb3J0UGF0aENvbnN0cmFpbnRBdHRhY2htZW50IChza2luOiBTa2luLCBzbG90SW5kZXg6IG51bWJlciwgc2xvdEJvbmU6IEJvbmUpIHtcblx0XHRsZXQgYXR0YWNobWVudHMgPSBza2luLmF0dGFjaG1lbnRzW3Nsb3RJbmRleF07XG5cdFx0aWYgKCFhdHRhY2htZW50cykgcmV0dXJuO1xuXHRcdGZvciAobGV0IGtleSBpbiBhdHRhY2htZW50cykge1xuXHRcdFx0dGhpcy5zb3J0UGF0aENvbnN0cmFpbnRBdHRhY2htZW50V2l0aChhdHRhY2htZW50c1trZXldLCBzbG90Qm9uZSk7XG5cdFx0fVxuXHR9XG5cblx0c29ydFBhdGhDb25zdHJhaW50QXR0YWNobWVudFdpdGggKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQsIHNsb3RCb25lOiBCb25lKSB7XG5cdFx0aWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIFBhdGhBdHRhY2htZW50KSkgcmV0dXJuO1xuXHRcdGxldCBwYXRoQm9uZXMgPSAoPFBhdGhBdHRhY2htZW50PmF0dGFjaG1lbnQpLmJvbmVzO1xuXHRcdGlmICghcGF0aEJvbmVzKVxuXHRcdFx0dGhpcy5zb3J0Qm9uZShzbG90Qm9uZSk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBwYXRoQm9uZXMubGVuZ3RoOyBpIDwgbjspIHtcblx0XHRcdFx0bGV0IG5uID0gcGF0aEJvbmVzW2krK107XG5cdFx0XHRcdG5uICs9IGk7XG5cdFx0XHRcdHdoaWxlIChpIDwgbm4pXG5cdFx0XHRcdFx0dGhpcy5zb3J0Qm9uZShib25lc1twYXRoQm9uZXNbaSsrXV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHNvcnRQaHlzaWNzQ29uc3RyYWludCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnQpIHtcblx0XHRjb25zdCBib25lID0gY29uc3RyYWludC5ib25lO1xuXHRcdGNvbnN0cmFpbnQuYWN0aXZlID0gYm9uZS5hY3RpdmUgJiYgKCFjb25zdHJhaW50LmRhdGEuc2tpblJlcXVpcmVkIHx8ICh0aGlzLnNraW4gIT0gbnVsbCAmJiBVdGlscy5jb250YWlucyh0aGlzLnNraW4uY29uc3RyYWludHMsIGNvbnN0cmFpbnQuZGF0YSwgdHJ1ZSkpKTtcblx0XHRpZiAoIWNvbnN0cmFpbnQuYWN0aXZlKSByZXR1cm47XG5cblx0XHR0aGlzLnNvcnRCb25lKGJvbmUpO1xuXG5cdFx0dGhpcy5fdXBkYXRlQ2FjaGUucHVzaChjb25zdHJhaW50KTtcblxuXHRcdHRoaXMuc29ydFJlc2V0KGJvbmUuY2hpbGRyZW4pO1xuXHRcdGJvbmUuc29ydGVkID0gdHJ1ZTtcblx0fVxuXG5cdHNvcnRCb25lIChib25lOiBCb25lKSB7XG5cdFx0aWYgKCFib25lKSByZXR1cm47XG5cdFx0aWYgKGJvbmUuc29ydGVkKSByZXR1cm47XG5cdFx0bGV0IHBhcmVudCA9IGJvbmUucGFyZW50O1xuXHRcdGlmIChwYXJlbnQpIHRoaXMuc29ydEJvbmUocGFyZW50KTtcblx0XHRib25lLnNvcnRlZCA9IHRydWU7XG5cdFx0dGhpcy5fdXBkYXRlQ2FjaGUucHVzaChib25lKTtcblx0fVxuXG5cdHNvcnRSZXNldCAoYm9uZXM6IEFycmF5PEJvbmU+KSB7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRpZiAoIWJvbmUuYWN0aXZlKSBjb250aW51ZTtcblx0XHRcdGlmIChib25lLnNvcnRlZCkgdGhpcy5zb3J0UmVzZXQoYm9uZS5jaGlsZHJlbik7XG5cdFx0XHRib25lLnNvcnRlZCA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBVcGRhdGVzIHRoZSB3b3JsZCB0cmFuc2Zvcm0gZm9yIGVhY2ggYm9uZSBhbmQgYXBwbGllcyBhbGwgY29uc3RyYWludHMuXG5cdCAqXG5cdCAqIFNlZSBbV29ybGQgdHJhbnNmb3Jtc10oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtc2tlbGV0b25zI1dvcmxkLXRyYW5zZm9ybXMpIGluIHRoZSBTcGluZVxuXHQgKiBSdW50aW1lcyBHdWlkZS4gKi9cblx0dXBkYXRlV29ybGRUcmFuc2Zvcm0gKHBoeXNpY3M6IFBoeXNpY3MpIHtcblx0XHRpZiAocGh5c2ljcyA9PT0gdW5kZWZpbmVkIHx8IHBoeXNpY3MgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInBoeXNpY3MgaXMgdW5kZWZpbmVkXCIpO1xuXHRcdGxldCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRib25lLmF4ID0gYm9uZS54O1xuXHRcdFx0Ym9uZS5heSA9IGJvbmUueTtcblx0XHRcdGJvbmUuYXJvdGF0aW9uID0gYm9uZS5yb3RhdGlvbjtcblx0XHRcdGJvbmUuYXNjYWxlWCA9IGJvbmUuc2NhbGVYO1xuXHRcdFx0Ym9uZS5hc2NhbGVZID0gYm9uZS5zY2FsZVk7XG5cdFx0XHRib25lLmFzaGVhclggPSBib25lLnNoZWFyWDtcblx0XHRcdGJvbmUuYXNoZWFyWSA9IGJvbmUuc2hlYXJZO1xuXHRcdH1cblxuXHRcdGxldCB1cGRhdGVDYWNoZSA9IHRoaXMuX3VwZGF0ZUNhY2hlO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdXBkYXRlQ2FjaGUubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0dXBkYXRlQ2FjaGVbaV0udXBkYXRlKHBoeXNpY3MpO1xuXHR9XG5cblx0dXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoIChwaHlzaWNzOiBQaHlzaWNzLCBwYXJlbnQ6IEJvbmUpIHtcblx0XHRpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKFwicGFyZW50IGNhbm5vdCBiZSBudWxsLlwiKTtcblxuXHRcdGxldCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Zm9yIChsZXQgaSA9IDEsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHsgLy8gU2tpcCByb290IGJvbmUuXG5cdFx0XHRsZXQgYm9uZSA9IGJvbmVzW2ldO1xuXHRcdFx0Ym9uZS5heCA9IGJvbmUueDtcblx0XHRcdGJvbmUuYXkgPSBib25lLnk7XG5cdFx0XHRib25lLmFyb3RhdGlvbiA9IGJvbmUucm90YXRpb247XG5cdFx0XHRib25lLmFzY2FsZVggPSBib25lLnNjYWxlWDtcblx0XHRcdGJvbmUuYXNjYWxlWSA9IGJvbmUuc2NhbGVZO1xuXHRcdFx0Ym9uZS5hc2hlYXJYID0gYm9uZS5zaGVhclg7XG5cdFx0XHRib25lLmFzaGVhclkgPSBib25lLnNoZWFyWTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSB0aGUgcGFyZW50IGJvbmUgdHJhbnNmb3JtIHRvIHRoZSByb290IGJvbmUuIFRoZSByb290IGJvbmUgYWx3YXlzIGluaGVyaXRzIHNjYWxlLCByb3RhdGlvbiBhbmQgcmVmbGVjdGlvbi5cblx0XHRsZXQgcm9vdEJvbmUgPSB0aGlzLmdldFJvb3RCb25lKCk7XG5cdFx0aWYgKCFyb290Qm9uZSkgdGhyb3cgbmV3IEVycm9yKFwiUm9vdCBib25lIG11c3Qgbm90IGJlIG51bGwuXCIpO1xuXHRcdGxldCBwYSA9IHBhcmVudC5hLCBwYiA9IHBhcmVudC5iLCBwYyA9IHBhcmVudC5jLCBwZCA9IHBhcmVudC5kO1xuXHRcdHJvb3RCb25lLndvcmxkWCA9IHBhICogdGhpcy54ICsgcGIgKiB0aGlzLnkgKyBwYXJlbnQud29ybGRYO1xuXHRcdHJvb3RCb25lLndvcmxkWSA9IHBjICogdGhpcy54ICsgcGQgKiB0aGlzLnkgKyBwYXJlbnQud29ybGRZO1xuXG5cdFx0Y29uc3QgcnggPSAocm9vdEJvbmUucm90YXRpb24gKyByb290Qm9uZS5zaGVhclgpICogTWF0aFV0aWxzLmRlZ1JhZDtcblx0XHRjb25zdCByeSA9IChyb290Qm9uZS5yb3RhdGlvbiArIDkwICsgcm9vdEJvbmUuc2hlYXJZKSAqIE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0Y29uc3QgbGEgPSBNYXRoLmNvcyhyeCkgKiByb290Qm9uZS5zY2FsZVg7XG5cdFx0Y29uc3QgbGIgPSBNYXRoLmNvcyhyeSkgKiByb290Qm9uZS5zY2FsZVk7XG5cdFx0Y29uc3QgbGMgPSBNYXRoLnNpbihyeCkgKiByb290Qm9uZS5zY2FsZVg7XG5cdFx0Y29uc3QgbGQgPSBNYXRoLnNpbihyeSkgKiByb290Qm9uZS5zY2FsZVk7XG5cdFx0cm9vdEJvbmUuYSA9IChwYSAqIGxhICsgcGIgKiBsYykgKiB0aGlzLnNjYWxlWDtcblx0XHRyb290Qm9uZS5iID0gKHBhICogbGIgKyBwYiAqIGxkKSAqIHRoaXMuc2NhbGVYO1xuXHRcdHJvb3RCb25lLmMgPSAocGMgKiBsYSArIHBkICogbGMpICogdGhpcy5zY2FsZVk7XG5cdFx0cm9vdEJvbmUuZCA9IChwYyAqIGxiICsgcGQgKiBsZCkgKiB0aGlzLnNjYWxlWTtcblxuXHRcdC8vIFVwZGF0ZSBldmVyeXRoaW5nIGV4Y2VwdCByb290IGJvbmUuXG5cdFx0bGV0IHVwZGF0ZUNhY2hlID0gdGhpcy5fdXBkYXRlQ2FjaGU7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB1cGRhdGVDYWNoZS5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCB1cGRhdGFibGUgPSB1cGRhdGVDYWNoZVtpXTtcblx0XHRcdGlmICh1cGRhdGFibGUgIT0gcm9vdEJvbmUpIHVwZGF0YWJsZS51cGRhdGUocGh5c2ljcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFNldHMgdGhlIGJvbmVzLCBjb25zdHJhaW50cywgYW5kIHNsb3RzIHRvIHRoZWlyIHNldHVwIHBvc2UgdmFsdWVzLiAqL1xuXHRzZXRUb1NldHVwUG9zZSAoKSB7XG5cdFx0dGhpcy5zZXRCb25lc1RvU2V0dXBQb3NlKCk7XG5cdFx0dGhpcy5zZXRTbG90c1RvU2V0dXBQb3NlKCk7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgYm9uZXMgYW5kIGNvbnN0cmFpbnRzIHRvIHRoZWlyIHNldHVwIHBvc2UgdmFsdWVzLiAqL1xuXHRzZXRCb25lc1RvU2V0dXBQb3NlICgpIHtcblx0XHRmb3IgKGNvbnN0IGJvbmUgb2YgdGhpcy5ib25lcykgYm9uZS5zZXRUb1NldHVwUG9zZSgpO1xuXHRcdGZvciAoY29uc3QgY29uc3RyYWludCBvZiB0aGlzLmlrQ29uc3RyYWludHMpIGNvbnN0cmFpbnQuc2V0VG9TZXR1cFBvc2UoKTtcblx0XHRmb3IgKGNvbnN0IGNvbnN0cmFpbnQgb2YgdGhpcy50cmFuc2Zvcm1Db25zdHJhaW50cykgY29uc3RyYWludC5zZXRUb1NldHVwUG9zZSgpO1xuXHRcdGZvciAoY29uc3QgY29uc3RyYWludCBvZiB0aGlzLnBhdGhDb25zdHJhaW50cykgY29uc3RyYWludC5zZXRUb1NldHVwUG9zZSgpO1xuXHRcdGZvciAoY29uc3QgY29uc3RyYWludCBvZiB0aGlzLnBoeXNpY3NDb25zdHJhaW50cykgY29uc3RyYWludC5zZXRUb1NldHVwUG9zZSgpO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHNsb3RzIGFuZCBkcmF3IG9yZGVyIHRvIHRoZWlyIHNldHVwIHBvc2UgdmFsdWVzLiAqL1xuXHRzZXRTbG90c1RvU2V0dXBQb3NlICgpIHtcblx0XHRsZXQgc2xvdHMgPSB0aGlzLnNsb3RzO1xuXHRcdFV0aWxzLmFycmF5Q29weShzbG90cywgMCwgdGhpcy5kcmF3T3JkZXIsIDAsIHNsb3RzLmxlbmd0aCk7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRzbG90c1tpXS5zZXRUb1NldHVwUG9zZSgpO1xuXHR9XG5cblx0LyoqIEByZXR1cm5zIE1heSByZXR1cm4gbnVsbC4gKi9cblx0Z2V0Um9vdEJvbmUgKCkge1xuXHRcdGlmICh0aGlzLmJvbmVzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcblx0XHRyZXR1cm4gdGhpcy5ib25lc1swXTtcblx0fVxuXG5cdC8qKiBAcmV0dXJucyBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZEJvbmUgKGJvbmVOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIWJvbmVOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJib25lTmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0bGV0IGJvbmVzID0gdGhpcy5ib25lcztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0bGV0IGJvbmUgPSBib25lc1tpXTtcblx0XHRcdGlmIChib25lLmRhdGEubmFtZSA9PSBib25lTmFtZSkgcmV0dXJuIGJvbmU7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqIEZpbmRzIGEgc2xvdCBieSBjb21wYXJpbmcgZWFjaCBzbG90J3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0byBjYWxsIGl0XG5cdCAqIHJlcGVhdGVkbHkuXG5cdCAqIEByZXR1cm5zIE1heSBiZSBudWxsLiAqL1xuXHRmaW5kU2xvdCAoc2xvdE5hbWU6IHN0cmluZykge1xuXHRcdGlmICghc2xvdE5hbWUpIHRocm93IG5ldyBFcnJvcihcInNsb3ROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRsZXQgc2xvdHMgPSB0aGlzLnNsb3RzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRsZXQgc2xvdCA9IHNsb3RzW2ldO1xuXHRcdFx0aWYgKHNsb3QuZGF0YS5uYW1lID09IHNsb3ROYW1lKSByZXR1cm4gc2xvdDtcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogU2V0cyBhIHNraW4gYnkgbmFtZS5cblx0ICpcblx0ICogU2VlIHtAbGluayAjc2V0U2tpbigpfS4gKi9cblx0c2V0U2tpbkJ5TmFtZSAoc2tpbk5hbWU6IHN0cmluZykge1xuXHRcdGxldCBza2luID0gdGhpcy5kYXRhLmZpbmRTa2luKHNraW5OYW1lKTtcblx0XHRpZiAoIXNraW4pIHRocm93IG5ldyBFcnJvcihcIlNraW4gbm90IGZvdW5kOiBcIiArIHNraW5OYW1lKTtcblx0XHR0aGlzLnNldFNraW4oc2tpbik7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgc2tpbiB1c2VkIHRvIGxvb2sgdXAgYXR0YWNobWVudHMgYmVmb3JlIGxvb2tpbmcgaW4gdGhlIHtAbGluayBTa2VsZXRvbkRhdGEjZGVmYXVsdFNraW4gZGVmYXVsdCBza2lufS4gSWYgdGhlXG5cdCAqIHNraW4gaXMgY2hhbmdlZCwge0BsaW5rICN1cGRhdGVDYWNoZSgpfSBpcyBjYWxsZWQuXG5cdCAqXG5cdCAqIEF0dGFjaG1lbnRzIGZyb20gdGhlIG5ldyBza2luIGFyZSBhdHRhY2hlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGZyb20gdGhlIG9sZCBza2luIHdhcyBhdHRhY2hlZC4gSWYgdGhlcmUgd2FzIG5vXG5cdCAqIG9sZCBza2luLCBlYWNoIHNsb3QncyBzZXR1cCBtb2RlIGF0dGFjaG1lbnQgaXMgYXR0YWNoZWQgZnJvbSB0aGUgbmV3IHNraW4uXG5cdCAqXG5cdCAqIEFmdGVyIGNoYW5naW5nIHRoZSBza2luLCB0aGUgdmlzaWJsZSBhdHRhY2htZW50cyBjYW4gYmUgcmVzZXQgdG8gdGhvc2UgYXR0YWNoZWQgaW4gdGhlIHNldHVwIHBvc2UgYnkgY2FsbGluZ1xuXHQgKiB7QGxpbmsgI3NldFNsb3RzVG9TZXR1cFBvc2UoKX0uIEFsc28sIG9mdGVuIHtAbGluayBBbmltYXRpb25TdGF0ZSNhcHBseSgpfSBpcyBjYWxsZWQgYmVmb3JlIHRoZSBuZXh0IHRpbWUgdGhlXG5cdCAqIHNrZWxldG9uIGlzIHJlbmRlcmVkIHRvIGFsbG93IGFueSBhdHRhY2htZW50IGtleXMgaW4gdGhlIGN1cnJlbnQgYW5pbWF0aW9uKHMpIHRvIGhpZGUgb3Igc2hvdyBhdHRhY2htZW50cyBmcm9tIHRoZSBuZXcgc2tpbi5cblx0ICogQHBhcmFtIG5ld1NraW4gTWF5IGJlIG51bGwuICovXG5cdHNldFNraW4gKG5ld1NraW46IFNraW4gfCBudWxsKSB7XG5cdFx0aWYgKG5ld1NraW4gPT0gdGhpcy5za2luKSByZXR1cm47XG5cdFx0aWYgKG5ld1NraW4pIHtcblx0XHRcdGlmICh0aGlzLnNraW4pXG5cdFx0XHRcdG5ld1NraW4uYXR0YWNoQWxsKHRoaXMsIHRoaXMuc2tpbik7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bGV0IHNsb3RzID0gdGhpcy5zbG90cztcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdFx0XHRsZXQgc2xvdCA9IHNsb3RzW2ldO1xuXHRcdFx0XHRcdGxldCBuYW1lID0gc2xvdC5kYXRhLmF0dGFjaG1lbnROYW1lO1xuXHRcdFx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdFx0XHRsZXQgYXR0YWNobWVudCA9IG5ld1NraW4uZ2V0QXR0YWNobWVudChpLCBuYW1lKTtcblx0XHRcdFx0XHRcdGlmIChhdHRhY2htZW50KSBzbG90LnNldEF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuc2tpbiA9IG5ld1NraW47XG5cdFx0dGhpcy51cGRhdGVDYWNoZSgpO1xuXHR9XG5cblxuXHQvKiogRmluZHMgYW4gYXR0YWNobWVudCBieSBsb29raW5nIGluIHRoZSB7QGxpbmsgI3NraW59IGFuZCB7QGxpbmsgU2tlbGV0b25EYXRhI2RlZmF1bHRTa2lufSB1c2luZyB0aGUgc2xvdCBuYW1lIGFuZCBhdHRhY2htZW50XG5cdCAqIG5hbWUuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgI2dldEF0dGFjaG1lbnQoKX0uXG5cdCAqIEByZXR1cm5zIE1heSBiZSBudWxsLiAqL1xuXHRnZXRBdHRhY2htZW50QnlOYW1lIChzbG90TmFtZTogc3RyaW5nLCBhdHRhY2htZW50TmFtZTogc3RyaW5nKTogQXR0YWNobWVudCB8IG51bGwge1xuXHRcdGxldCBzbG90ID0gdGhpcy5kYXRhLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgZmluZCBzbG90IHdpdGggbmFtZSAke3Nsb3ROYW1lfWApO1xuXHRcdHJldHVybiB0aGlzLmdldEF0dGFjaG1lbnQoc2xvdC5pbmRleCwgYXR0YWNobWVudE5hbWUpO1xuXHR9XG5cblx0LyoqIEZpbmRzIGFuIGF0dGFjaG1lbnQgYnkgbG9va2luZyBpbiB0aGUge0BsaW5rICNza2lufSBhbmQge0BsaW5rIFNrZWxldG9uRGF0YSNkZWZhdWx0U2tpbn0gdXNpbmcgdGhlIHNsb3QgaW5kZXggYW5kXG5cdCAqIGF0dGFjaG1lbnQgbmFtZS4gRmlyc3QgdGhlIHNraW4gaXMgY2hlY2tlZCBhbmQgaWYgdGhlIGF0dGFjaG1lbnQgd2FzIG5vdCBmb3VuZCwgdGhlIGRlZmF1bHQgc2tpbiBpcyBjaGVja2VkLlxuXHQgKlxuXHQgKiBTZWUgW1J1bnRpbWUgc2tpbnNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1ydW50aW1lLXNraW5zKSBpbiB0aGUgU3BpbmUgUnVudGltZXMgR3VpZGUuXG5cdCAqIEByZXR1cm5zIE1heSBiZSBudWxsLiAqL1xuXHRnZXRBdHRhY2htZW50IChzbG90SW5kZXg6IG51bWJlciwgYXR0YWNobWVudE5hbWU6IHN0cmluZyk6IEF0dGFjaG1lbnQgfCBudWxsIHtcblx0XHRpZiAoIWF0dGFjaG1lbnROYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJhdHRhY2htZW50TmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0aWYgKHRoaXMuc2tpbikge1xuXHRcdFx0bGV0IGF0dGFjaG1lbnQgPSB0aGlzLnNraW4uZ2V0QXR0YWNobWVudChzbG90SW5kZXgsIGF0dGFjaG1lbnROYW1lKTtcblx0XHRcdGlmIChhdHRhY2htZW50KSByZXR1cm4gYXR0YWNobWVudDtcblx0XHR9XG5cdFx0aWYgKHRoaXMuZGF0YS5kZWZhdWx0U2tpbikgcmV0dXJuIHRoaXMuZGF0YS5kZWZhdWx0U2tpbi5nZXRBdHRhY2htZW50KHNsb3RJbmRleCwgYXR0YWNobWVudE5hbWUpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqIEEgY29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBhbiBhdHRhY2htZW50IGJ5IGZpbmRpbmcgdGhlIHNsb3Qgd2l0aCB7QGxpbmsgI2ZpbmRTbG90KCl9LCBmaW5kaW5nIHRoZSBhdHRhY2htZW50IHdpdGhcblx0ICoge0BsaW5rICNnZXRBdHRhY2htZW50KCl9LCB0aGVuIHNldHRpbmcgdGhlIHNsb3QncyB7QGxpbmsgU2xvdCNhdHRhY2htZW50fS5cblx0ICogQHBhcmFtIGF0dGFjaG1lbnROYW1lIE1heSBiZSBudWxsIHRvIGNsZWFyIHRoZSBzbG90J3MgYXR0YWNobWVudC4gKi9cblx0c2V0QXR0YWNobWVudCAoc2xvdE5hbWU6IHN0cmluZywgYXR0YWNobWVudE5hbWU6IHN0cmluZykge1xuXHRcdGlmICghc2xvdE5hbWUpIHRocm93IG5ldyBFcnJvcihcInNsb3ROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRsZXQgc2xvdHMgPSB0aGlzLnNsb3RzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRsZXQgc2xvdCA9IHNsb3RzW2ldO1xuXHRcdFx0aWYgKHNsb3QuZGF0YS5uYW1lID09IHNsb3ROYW1lKSB7XG5cdFx0XHRcdGxldCBhdHRhY2htZW50OiBBdHRhY2htZW50IHwgbnVsbCA9IG51bGw7XG5cdFx0XHRcdGlmIChhdHRhY2htZW50TmFtZSkge1xuXHRcdFx0XHRcdGF0dGFjaG1lbnQgPSB0aGlzLmdldEF0dGFjaG1lbnQoaSwgYXR0YWNobWVudE5hbWUpO1xuXHRcdFx0XHRcdGlmICghYXR0YWNobWVudCkgdGhyb3cgbmV3IEVycm9yKFwiQXR0YWNobWVudCBub3QgZm91bmQ6IFwiICsgYXR0YWNobWVudE5hbWUgKyBcIiwgZm9yIHNsb3Q6IFwiICsgc2xvdE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNsb3Quc2V0QXR0YWNobWVudChhdHRhY2htZW50KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTbG90IG5vdCBmb3VuZDogXCIgKyBzbG90TmFtZSk7XG5cdH1cblxuXG5cdC8qKiBGaW5kcyBhbiBJSyBjb25zdHJhaW50IGJ5IGNvbXBhcmluZyBlYWNoIElLIGNvbnN0cmFpbnQncyBuYW1lLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBjYWNoZSB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZFxuXHQgKiB0aGFuIHRvIGNhbGwgaXQgcmVwZWF0ZWRseS5cblx0ICogQHJldHVybiBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZElrQ29uc3RyYWludCAoY29uc3RyYWludE5hbWU6IHN0cmluZykge1xuXHRcdGlmICghY29uc3RyYWludE5hbWUpIHRocm93IG5ldyBFcnJvcihcImNvbnN0cmFpbnROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRyZXR1cm4gdGhpcy5pa0NvbnN0cmFpbnRzLmZpbmQoKGNvbnN0cmFpbnQpID0+IGNvbnN0cmFpbnQuZGF0YS5uYW1lID09IGNvbnN0cmFpbnROYW1lKSA/PyBudWxsO1xuXHR9XG5cblx0LyoqIEZpbmRzIGEgdHJhbnNmb3JtIGNvbnN0cmFpbnQgYnkgY29tcGFyaW5nIGVhY2ggdHJhbnNmb3JtIGNvbnN0cmFpbnQncyBuYW1lLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBjYWNoZSB0aGUgcmVzdWx0cyBvZlxuXHQgKiB0aGlzIG1ldGhvZCB0aGFuIHRvIGNhbGwgaXQgcmVwZWF0ZWRseS5cblx0ICogQHJldHVybiBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZFRyYW5zZm9ybUNvbnN0cmFpbnQgKGNvbnN0cmFpbnROYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIWNvbnN0cmFpbnROYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJjb25zdHJhaW50TmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNmb3JtQ29uc3RyYWludHMuZmluZCgoY29uc3RyYWludCkgPT4gY29uc3RyYWludC5kYXRhLm5hbWUgPT0gY29uc3RyYWludE5hbWUpID8/IG51bGw7XG5cdH1cblxuXHQvKiogRmluZHMgYSBwYXRoIGNvbnN0cmFpbnQgYnkgY29tcGFyaW5nIGVhY2ggcGF0aCBjb25zdHJhaW50J3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2Rcblx0ICogdGhhbiB0byBjYWxsIGl0IHJlcGVhdGVkbHkuXG5cdCAqIEByZXR1cm4gTWF5IGJlIG51bGwuICovXG5cdGZpbmRQYXRoQ29uc3RyYWludCAoY29uc3RyYWludE5hbWU6IHN0cmluZykge1xuXHRcdGlmICghY29uc3RyYWludE5hbWUpIHRocm93IG5ldyBFcnJvcihcImNvbnN0cmFpbnROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRyZXR1cm4gdGhpcy5wYXRoQ29uc3RyYWludHMuZmluZCgoY29uc3RyYWludCkgPT4gY29uc3RyYWludC5kYXRhLm5hbWUgPT0gY29uc3RyYWludE5hbWUpID8/IG51bGw7XG5cdH1cblxuXHQvKiogRmluZHMgYSBwaHlzaWNzIGNvbnN0cmFpbnQgYnkgY29tcGFyaW5nIGVhY2ggcGh5c2ljcyBjb25zdHJhaW50J3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpc1xuXHQgKiBtZXRob2QgdGhhbiB0byBjYWxsIGl0IHJlcGVhdGVkbHkuICovXG5cdGZpbmRQaHlzaWNzQ29uc3RyYWludCAoY29uc3RyYWludE5hbWU6IHN0cmluZykge1xuXHRcdGlmIChjb25zdHJhaW50TmFtZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJjb25zdHJhaW50TmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0cmV0dXJuIHRoaXMucGh5c2ljc0NvbnN0cmFpbnRzLmZpbmQoKGNvbnN0cmFpbnQpID0+IGNvbnN0cmFpbnQuZGF0YS5uYW1lID09IGNvbnN0cmFpbnROYW1lKSA/PyBudWxsO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIGF4aXMgYWxpZ25lZCBib3VuZGluZyBib3ggKEFBQkIpIG9mIHRoZSByZWdpb24gYW5kIG1lc2ggYXR0YWNobWVudHMgZm9yIHRoZSBjdXJyZW50IHBvc2UgYXMgYHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH1gLlxuXHQgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5IG9iamVjdHMgd2hpY2ggY2FuIGFkZCB0byBnYXJiYWdlIGNvbGxlY3Rpb24gcHJlc3N1cmUuIFVzZSBgZ2V0Qm91bmRzKClgIGlmIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBhIGNvbmNlcm4uICovXG5cdGdldEJvdW5kc1JlY3QgKGNsaXBwZXI/OiBTa2VsZXRvbkNsaXBwaW5nKSB7XG5cdFx0bGV0IG9mZnNldCA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0bGV0IHNpemUgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHRoaXMuZ2V0Qm91bmRzKG9mZnNldCwgc2l6ZSwgdW5kZWZpbmVkLCBjbGlwcGVyKTtcblx0XHRyZXR1cm4geyB4OiBvZmZzZXQueCwgeTogb2Zmc2V0LnksIHdpZHRoOiBzaXplLngsIGhlaWdodDogc2l6ZS55IH07XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUgYXhpcyBhbGlnbmVkIGJvdW5kaW5nIGJveCAoQUFCQikgb2YgdGhlIHJlZ2lvbiBhbmQgbWVzaCBhdHRhY2htZW50cyBmb3IgdGhlIGN1cnJlbnQgcG9zZS5cblx0ICogQHBhcmFtIG9mZnNldCBBbiBvdXRwdXQgdmFsdWUsIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBza2VsZXRvbiBvcmlnaW4gdG8gdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBvZiB0aGUgQUFCQi5cblx0ICogQHBhcmFtIHNpemUgQW4gb3V0cHV0IHZhbHVlLCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgQUFCQi5cblx0ICogQHBhcmFtIHRlbXAgV29ya2luZyBtZW1vcnkgdG8gdGVtcG9yYXJpbHkgc3RvcmUgYXR0YWNobWVudHMnIGNvbXB1dGVkIHdvcmxkIHZlcnRpY2VzLlxuXHQgKiBAcGFyYW0gY2xpcHBlciB7QGxpbmsgU2tlbGV0b25DbGlwcGluZ30gdG8gdXNlLiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgbm8gY2xpcHBpbmcgaXMgYXBwbGllZC4gKi9cblx0Z2V0Qm91bmRzIChvZmZzZXQ6IFZlY3RvcjIsIHNpemU6IFZlY3RvcjIsIHRlbXA6IEFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPigyKSwgY2xpcHBlcjogU2tlbGV0b25DbGlwcGluZyB8IG51bGwgPSBudWxsKSB7XG5cdFx0aWYgKCFvZmZzZXQpIHRocm93IG5ldyBFcnJvcihcIm9mZnNldCBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0aWYgKCFzaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJzaXplIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRsZXQgZHJhd09yZGVyID0gdGhpcy5kcmF3T3JkZXI7XG5cdFx0bGV0IG1pblggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1pblkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1heFggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIG1heFkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBkcmF3T3JkZXIubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRsZXQgc2xvdCA9IGRyYXdPcmRlcltpXTtcblx0XHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgY29udGludWU7XG5cdFx0XHRsZXQgdmVydGljZXNMZW5ndGggPSAwO1xuXHRcdFx0bGV0IHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UgfCBudWxsID0gbnVsbDtcblx0XHRcdGxldCB0cmlhbmdsZXM6IE51bWJlckFycmF5TGlrZSB8IG51bGwgPSBudWxsO1xuXHRcdFx0bGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xuXHRcdFx0XHR2ZXJ0aWNlc0xlbmd0aCA9IDg7XG5cdFx0XHRcdHZlcnRpY2VzID0gVXRpbHMuc2V0QXJyYXlTaXplKHRlbXAsIHZlcnRpY2VzTGVuZ3RoLCAwKTtcblx0XHRcdFx0YXR0YWNobWVudC5jb21wdXRlV29ybGRWZXJ0aWNlcyhzbG90LCB2ZXJ0aWNlcywgMCwgMik7XG5cdFx0XHRcdHRyaWFuZ2xlcyA9IFNrZWxldG9uLnF1YWRUcmlhbmdsZXM7XG5cdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCkge1xuXHRcdFx0XHRsZXQgbWVzaCA9ICg8TWVzaEF0dGFjaG1lbnQ+YXR0YWNobWVudCk7XG5cdFx0XHRcdHZlcnRpY2VzTGVuZ3RoID0gbWVzaC53b3JsZFZlcnRpY2VzTGVuZ3RoO1xuXHRcdFx0XHR2ZXJ0aWNlcyA9IFV0aWxzLnNldEFycmF5U2l6ZSh0ZW1wLCB2ZXJ0aWNlc0xlbmd0aCwgMCk7XG5cdFx0XHRcdG1lc2guY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgdmVydGljZXNMZW5ndGgsIHZlcnRpY2VzLCAwLCAyKTtcblx0XHRcdFx0dHJpYW5nbGVzID0gbWVzaC50cmlhbmdsZXM7XG5cdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQgJiYgY2xpcHBlciAhPSBudWxsKSB7XG5cdFx0XHRcdGNsaXBwZXIuY2xpcFN0YXJ0KHNsb3QsIGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICh2ZXJ0aWNlcyAmJiB0cmlhbmdsZXMpIHtcblx0XHRcdFx0aWYgKGNsaXBwZXIgIT0gbnVsbCAmJiBjbGlwcGVyLmlzQ2xpcHBpbmcoKSkge1xuXHRcdFx0XHRcdGNsaXBwZXIuY2xpcFRyaWFuZ2xlcyh2ZXJ0aWNlcywgdHJpYW5nbGVzLCB0cmlhbmdsZXMubGVuZ3RoKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcyA9IGNsaXBwZXIuY2xpcHBlZFZlcnRpY2VzO1xuXHRcdFx0XHRcdHZlcnRpY2VzTGVuZ3RoID0gY2xpcHBlci5jbGlwcGVkVmVydGljZXMubGVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAobGV0IGlpID0gMCwgbm4gPSB2ZXJ0aWNlcy5sZW5ndGg7IGlpIDwgbm47IGlpICs9IDIpIHtcblx0XHRcdFx0XHRsZXQgeCA9IHZlcnRpY2VzW2lpXSwgeSA9IHZlcnRpY2VzW2lpICsgMV07XG5cdFx0XHRcdFx0bWluWCA9IE1hdGgubWluKG1pblgsIHgpO1xuXHRcdFx0XHRcdG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcblx0XHRcdFx0XHRtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG5cdFx0XHRcdFx0bWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2xpcHBlciAhPSBudWxsKSBjbGlwcGVyLmNsaXBFbmRXaXRoU2xvdChzbG90KTtcblx0XHR9XG5cdFx0aWYgKGNsaXBwZXIgIT0gbnVsbCkgY2xpcHBlci5jbGlwRW5kKCk7XG5cdFx0b2Zmc2V0LnNldChtaW5YLCBtaW5ZKTtcblx0XHRzaXplLnNldChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xuXHR9XG5cblx0LyoqIEluY3JlbWVudHMgdGhlIHNrZWxldG9uJ3Mge0BsaW5rICN0aW1lfS4gKi9cblx0dXBkYXRlIChkZWx0YTogbnVtYmVyKSB7XG5cdFx0dGhpcy50aW1lICs9IGRlbHRhO1xuXHR9XG5cblx0cGh5c2ljc1RyYW5zbGF0ZSAoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcblx0XHRjb25zdCBwaHlzaWNzQ29uc3RyYWludHMgPSB0aGlzLnBoeXNpY3NDb25zdHJhaW50cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHBoeXNpY3NDb25zdHJhaW50cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRwaHlzaWNzQ29uc3RyYWludHNbaV0udHJhbnNsYXRlKHgsIHkpO1xuXHR9XG5cblx0LyoqIENhbGxzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludCNyb3RhdGUoZmxvYXQsIGZsb2F0LCBmbG9hdCl9IGZvciBlYWNoIHBoeXNpY3MgY29uc3RyYWludC4gKi9cblx0cGh5c2ljc1JvdGF0ZSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRlZ3JlZXM6IG51bWJlcikge1xuXHRcdGNvbnN0IHBoeXNpY3NDb25zdHJhaW50cyA9IHRoaXMucGh5c2ljc0NvbnN0cmFpbnRzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gcGh5c2ljc0NvbnN0cmFpbnRzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdHBoeXNpY3NDb25zdHJhaW50c1tpXS5yb3RhdGUoeCwgeSwgZGVncmVlcyk7XG5cdH1cbn1cblxuLyoqIERldGVybWluZXMgaG93IHBoeXNpY3MgYW5kIG90aGVyIG5vbi1kZXRlcm1pbmlzdGljIHVwZGF0ZXMgYXJlIGFwcGxpZWQuICovXG5leHBvcnQgZW51bSBQaHlzaWNzIHtcblx0LyoqIFBoeXNpY3MgYXJlIG5vdCB1cGRhdGVkIG9yIGFwcGxpZWQuICovXG5cdG5vbmUsXG5cblx0LyoqIFBoeXNpY3MgYXJlIHJlc2V0IHRvIHRoZSBjdXJyZW50IHBvc2UuICovXG5cdHJlc2V0LFxuXG5cdC8qKiBQaHlzaWNzIGFyZSB1cGRhdGVkIGFuZCB0aGUgcG9zZSBmcm9tIHBoeXNpY3MgaXMgYXBwbGllZC4gKi9cblx0dXBkYXRlLFxuXG5cdC8qKiBQaHlzaWNzIGFyZSBub3QgdXBkYXRlZCBidXQgdGhlIHBvc2UgZnJvbSBwaHlzaWNzIGlzIGFwcGxpZWQuICovXG5cdHBvc2Vcbn1cbiJdfQ==
483
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU2tlbGV0b24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBSS9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU0zRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxLQUFLLEVBQXdCLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekU7Ozs7O2tJQUtrSTtBQUNsSSxNQUFNLE9BQU8sUUFBUTtJQUNaLE1BQU0sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sS0FBSyxJQUFJO1FBQ2QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxzQ0FBc0M7SUFDN0IsSUFBSSxDQUFlO0lBRTVCLHlGQUF5RjtJQUNoRixLQUFLLENBQWM7SUFFNUIsa0ZBQWtGO0lBQ3pFLEtBQUssQ0FBYztJQUU1QjtnQkFDWTtJQUNILFNBQVMsQ0FBWTtJQUU5QixrQ0FBa0M7SUFDbEMsb0dBQW9HO0lBQzNGLFdBQVcsQ0FBbUM7SUFFdkQsMENBQTBDO0lBQ2pDLE9BQU8sQ0FBMkI7SUFFM0MseUhBQXlIO0lBQ3pILG9HQUFvRztJQUMzRixZQUFZLEdBQUcsRUFBVyxDQUFDO0lBRXBDLG9HQUFvRztJQUMzRixVQUFVLEdBQTJCLEVBQUUsQ0FBQztJQUVqRCxnREFBZ0Q7SUFDaEQsSUFBSSxHQUFnQixJQUFJLENBQUM7SUFFekIsd0RBQXdEO0lBQy9DLEtBQUssQ0FBUTtJQUV0Qjs7OEVBRTBFO0lBQzFFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFSCxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRXBCOzs4RUFFMEU7SUFDMUUsSUFBVyxNQUFNO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLE1BQU0sQ0FBRSxNQUFjO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7b0ZBRWdGO0lBQ2hGLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFTjs7b0ZBRWdGO0lBQ2hGLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFTjs7OEJBRTBCO0lBQzFCLElBQUksR0FBRyxDQUFDLENBQUM7SUFFVCw0R0FBNEc7SUFDNUcsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVWLDRHQUE0RztJQUM1RyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRVYsK0dBQStHO0lBQy9HLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFYiwrR0FBK0c7SUFDL0csUUFBUSxHQUFHLENBQUMsQ0FBQztJQUViLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFWixZQUFhLElBQWtCO1FBQzlCLElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBWSxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxJQUFVLENBQUM7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07Z0JBQ25CLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzVCLENBQUM7Z0JBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBWSxDQUFDO1FBQzFCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBeUIsQ0FBQztRQUN6QyxvR0FBb0c7UUFDcEcsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFpQyxDQUFDO1FBQ3JELEtBQUssTUFBTSxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksVUFBVSxZQUFZLGlCQUFpQjtnQkFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEOzREQUN3RDtJQUN4RCxXQUFXO1FBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUUzQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDM0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3hELElBQUksSUFBSSxHQUFnQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkQsR0FBRyxDQUFDO29CQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbkIsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3BCLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFDaEIsQ0FBQztRQUNGLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3pCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRTtnQkFDOUMseUZBQXlGO21CQUN0RixDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RyxJQUFJLFVBQVUsQ0FBQyxNQUFNO2dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksVUFBVSxZQUFZLElBQUk7Z0JBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQy9FLENBQUM7SUFFRixDQUFDO0lBRUQsb0dBQW9HO0lBQ3BHLFdBQVcsQ0FBRSxNQUF1QjtRQUNuQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0YsQ0FBQztJQUVELFFBQVEsQ0FBRSxJQUFVO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFNBQVMsQ0FBRSxLQUFrQjtRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixJQUFJLElBQUksQ0FBQyxNQUFNO29CQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNyQixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7SUFFRDs7O3lCQUdxQjtJQUNyQixvQkFBb0IsQ0FBRSxPQUFnQjtRQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZTtZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNyRCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN2RCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLFNBQVM7UUFDUixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsY0FBYztRQUNiLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDM0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXRCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDakQsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsY0FBYztRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMzQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxXQUFXO1FBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDtxQkFDaUI7SUFDakIsUUFBUSxDQUFFLFFBQWdCO1FBQ3pCLElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDM0MsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVEO3FCQUNpQjtJQUNqQixRQUFRLENBQUUsUUFBZ0I7UUFDekIsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMzQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBa0JELE9BQU8sQ0FBRSxPQUE2QjtRQUNyQyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7WUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7WUFFNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQUEsQ0FBQztJQUVNLGFBQWEsQ0FBRSxRQUFnQjtRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRU8sYUFBYSxDQUFFLE9BQW9CO1FBQzFDLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2IsSUFBSSxJQUFJLENBQUMsSUFBSTtnQkFDWixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQy9CLENBQUM7Z0JBQ0wsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM5QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO29CQUN0QyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNWLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUNsRCxJQUFJLFVBQVU7NEJBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3JELENBQUM7Z0JBQ0YsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFjRCxhQUFhLENBQUUsZUFBZ0MsRUFBRSxXQUFtQjtRQUNuRSxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVE7WUFDdEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7K0JBSTJCO0lBQ25CLG1CQUFtQixDQUFFLFFBQWdCLEVBQUUsV0FBbUI7UUFDakUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OzsrQkFJMkI7SUFDbkIsb0JBQW9CLENBQUUsU0FBaUIsRUFBRSxXQUFtQjtRQUNuRSxJQUFJLENBQUMsV0FBVztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNuRSxJQUFJLFVBQVU7Z0JBQUUsT0FBTyxVQUFVLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVEOzt3RUFFb0U7SUFDcEUsYUFBYSxDQUFFLFFBQWdCLEVBQUUsV0FBMEI7UUFDMUQsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxVQUFVLEdBQXNCLElBQUksQ0FBQztRQUN6QyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxVQUFVO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFdBQVcsZUFBZSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7cURBQ2lEO0lBQ2pELG9HQUFvRztJQUNwRyxjQUFjLENBQXVDLGNBQXNCLEVBQUUsSUFBaUI7UUFDN0YsSUFBSSxjQUFjLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUM5RSxJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFJLFVBQVUsWUFBWSxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYztnQkFBRSxPQUFPLFVBQWUsQ0FBQztRQUNuRyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQ7OzsrRkFHMkY7SUFDM0YsYUFBYSxDQUFFLE9BQTBCO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7NEZBS3dGO0lBQ3hGLFNBQVMsQ0FBRSxNQUFlLEVBQUUsSUFBYSxFQUFFLE9BQXNCLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxFQUFFLFVBQW1DLElBQUk7UUFDN0gsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN2SSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsU0FBUztZQUNoQyxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxRQUFRLEdBQTJCLElBQUksQ0FBQztZQUM1QyxJQUFJLFNBQVMsR0FBMkIsSUFBSSxDQUFDO1lBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1lBQy9DLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksVUFBVSxZQUFZLGdCQUFnQixFQUFFLENBQUM7b0JBQzVDLGNBQWMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLFFBQVEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDL0YsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7Z0JBQ3BDLENBQUM7cUJBQU0sSUFBSSxVQUFVLFlBQVksY0FBYyxFQUFFLENBQUM7b0JBQ2pELGNBQWMsR0FBRyxVQUFVLENBQUMsbUJBQW1CLENBQUM7b0JBQ2hELFFBQVEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDL0UsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xDLENBQUM7cUJBQU0sSUFBSSxVQUFVLFlBQVksa0JBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ2hFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDMUMsU0FBUztnQkFDVixDQUFDO2dCQUNELElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUMzQixJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7d0JBQzNGLFFBQVEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO3dCQUNuQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7b0JBQ2pELENBQUM7b0JBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQ3pELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3pCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDekIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxQixDQUFDO2dCQUNGLENBQUM7WUFDRixDQUFDO1lBQ0QsSUFBSSxPQUFPO2dCQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksT0FBTztZQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OEVBRTBFO0lBQ25FLFFBQVEsQ0FBRSxNQUFjLEVBQUUsTUFBYztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN0QixDQUFDO0lBRUQ7O29GQUVnRjtJQUN6RSxXQUFXLENBQUUsQ0FBUyxFQUFFLENBQVM7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsTUFBTSxDQUFFLEtBQWE7UUFDcEIsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxnQkFBZ0IsQ0FBRSxDQUFTLEVBQUUsQ0FBUztRQUNyQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2pELFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsYUFBYSxDQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsT0FBZTtRQUNuRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2pELFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IEFuaW1hdGlvblN0YXRlIH0gZnJvbSBcIi4vQW5pbWF0aW9uU3RhdGUuanNcIjtcbmltcG9ydCB0eXBlIHsgQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IENsaXBwaW5nQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0NsaXBwaW5nQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgTWVzaEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9NZXNoQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgUmVnaW9uQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL1JlZ2lvbkF0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IEJvbmUgfSBmcm9tIFwiLi9Cb25lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnN0cmFpbnQgfSBmcm9tIFwiLi9Db25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBEcmF3T3JkZXIgfSBmcm9tIFwiLi9EcmF3T3JkZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUGh5c2ljcyB9IGZyb20gXCIuL1BoeXNpY3MuanNcIjtcbmltcG9ydCB7IFBoeXNpY3NDb25zdHJhaW50IH0gZnJvbSBcIi4vUGh5c2ljc0NvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlIH0gZnJvbSBcIi4vUGh5c2ljc0NvbnN0cmFpbnRQb3NlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2VkIH0gZnJvbSBcIi4vUG9zZWQuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tlbGV0b25DbGlwcGluZyB9IGZyb20gXCIuL1NrZWxldG9uQ2xpcHBpbmcuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tlbGV0b25EYXRhIH0gZnJvbSBcIi4vU2tlbGV0b25EYXRhLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNraW4gfSBmcm9tIFwiLi9Ta2luLmpzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIi4vU2xvdC5qc1wiO1xuaW1wb3J0IHsgQ29sb3IsIHR5cGUgTnVtYmVyQXJyYXlMaWtlLCBVdGlscywgVmVjdG9yMiB9IGZyb20gXCIuL1V0aWxzLmpzXCI7XG5cbi8qKiBTdG9yZXMgYm9uZXMgYW5kIHNsb3RzIHRvIGJlIHBvc2VkIGJ5IGFuaW1hdGlvbnMgYW5kIGFwcGxpY2F0aW9uIGNvZGUuIE11bHRpcGxlIHNrZWxldG9uIGluc3RhbmNlcyBjYW4gc2hhcmUgdGhlIHNhbWVcbiAqIHtAbGluayBTa2VsZXRvbkRhdGF9LCBpbmNsdWRpbmcgYW5pbWF0aW9ucywgYXR0YWNobWVudHMsIGFuZCBza2lucy5cbiAqXG4gKiBBZnRlciBwb3NpbmcsIGNhbGwge0BsaW5rIHVwZGF0ZVdvcmxkVHJhbnNmb3JtfSB0byBhcHBseSBjb25zdHJhaW50cyBhbmQgY29tcHV0ZSB3b3JsZCB0cmFuc2Zvcm1zIGZvciByZW5kZXJpbmcuXG4gKlxuICogU2VlIFtJbnN0YW5jZSBvYmplY3RzXShodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtcnVudGltZS1hcmNoaXRlY3R1cmUjSW5zdGFuY2Utb2JqZWN0cykgaW4gdGhlIFNwaW5lIFJ1bnRpbWVzIEd1aWRlLiAqL1xuZXhwb3J0IGNsYXNzIFNrZWxldG9uIHtcblx0cHJpdmF0ZSBzdGF0aWMgcXVhZFRyaWFuZ2xlcyA9IFswLCAxLCAyLCAyLCAzLCAwXTtcblx0c3RhdGljIHlEb3duID0gZmFsc2U7XG5cdHN0YXRpYyBnZXQgeURpciAoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gU2tlbGV0b24ueURvd24gPyAtMSA6IDE7XG5cdH1cblxuXHQvKiogVGhlIHNrZWxldG9uJ3Mgc2V0dXAgcG9zZSBkYXRhLiAqL1xuXHRyZWFkb25seSBkYXRhOiBTa2VsZXRvbkRhdGE7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGJvbmVzLCBzb3J0ZWQgcGFyZW50IGZpcnN0LiBUaGUgcm9vdCBib25lIGlzIGFsd2F5cyB0aGUgZmlyc3QgYm9uZS4gKi9cblx0cmVhZG9ubHkgYm9uZXM6IEFycmF5PEJvbmU+O1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBzbG90cy4gVG8gYWRkIGEgc2xvdCwgYWxzbyBhZGQgaXQgdG8ge0BsaW5rIERyYXdPcmRlci5wb3NlfS4gKi9cblx0cmVhZG9ubHkgc2xvdHM6IEFycmF5PFNsb3Q+O1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBkcmF3IG9yZGVyLiBVc2Uge0BsaW5rIERyYXdPcmRlci5hcHBsaWVkUG9zZX0gZm9yIHJlbmRlcmluZyBhbmQge0BsaW5rIERyYXdPcmRlci5wb3NlfSBmb3IgY2hhbmdpbmcgdGhlIGRyYXdcblx0ICogb3JkZXIuICovXG5cdHJlYWRvbmx5IGRyYXdPcmRlcjogRHJhd09yZGVyO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBjb25zdHJhaW50cy4gKi9cblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiByZWZlcmVuY2UgcnVudGltZSBkb2VzIG5vdCByZXN0cmljdCB0byBzcGVjaWZpYyB0eXBlc1xuXHRyZWFkb25seSBjb25zdHJhaW50czogQXJyYXk8Q29uc3RyYWludDxhbnksIGFueSwgYW55Pj47XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIHBoeXNpY3MgY29uc3RyYWludHMuICovXG5cdHJlYWRvbmx5IHBoeXNpY3M6IEFycmF5PFBoeXNpY3NDb25zdHJhaW50PjtcblxuXHQvKiogVGhlIGxpc3Qgb2YgYm9uZXMgYW5kIGNvbnN0cmFpbnRzLCBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgc2hvdWxkIGJlIHVwZGF0ZWQsIGFzIGNvbXB1dGVkIGJ5IHtAbGluayB1cGRhdGVDYWNoZX0uICovXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcmVmZXJlbmNlIHJ1bnRpbWUgZG9lcyBub3QgcmVzdHJpY3QgdG8gc3BlY2lmaWMgdHlwZXNcblx0cmVhZG9ubHkgX3VwZGF0ZUNhY2hlID0gW10gYXMgYW55W107XG5cblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiByZWZlcmVuY2UgcnVudGltZSBkb2VzIG5vdCByZXN0cmljdCB0byBzcGVjaWZpYyB0eXBlc1xuXHRyZWFkb25seSByZXNldENhY2hlOiBBcnJheTxQb3NlZDxhbnksIGFueT4+ID0gW107XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGN1cnJlbnQgc2tpbi4gTWF5IGJlIG51bGwuICovXG5cdHNraW46IFNraW4gfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIGNvbG9yIHRvIHRpbnQgYWxsIHRoZSBza2VsZXRvbidzIGF0dGFjaG1lbnRzLiAqL1xuXHRyZWFkb25seSBjb2xvcjogQ29sb3I7XG5cblx0LyoqIFNjYWxlcyB0aGUgZW50aXJlIHNrZWxldG9uIG9uIHRoZSBYIGF4aXMuXG5cdCAqXG5cdCAqIEJvbmVzIHRoYXQgZG8gbm90IGluaGVyaXQgc2NhbGUgYXJlIHN0aWxsIGFmZmVjdGVkIGJ5IHRoaXMgcHJvcGVydHkuICovXG5cdHNjYWxlWCA9IDE7XG5cblx0cHJpdmF0ZSBfc2NhbGVZID0gMTtcblxuXHQvKiogU2NhbGVzIHRoZSBlbnRpcmUgc2tlbGV0b24gb24gdGhlIFkgYXhpcy5cblx0ICpcblx0ICogQm9uZXMgdGhhdCBkbyBub3QgaW5oZXJpdCBzY2FsZSBhcmUgc3RpbGwgYWZmZWN0ZWQgYnkgdGhpcyBwcm9wZXJ0eS4gKi9cblx0cHVibGljIGdldCBzY2FsZVkgKCkge1xuXHRcdHJldHVybiB0aGlzLl9zY2FsZVkgKiBTa2VsZXRvbi55RGlyO1xuXHR9XG5cblx0cHVibGljIHNldCBzY2FsZVkgKHNjYWxlWTogbnVtYmVyKSB7XG5cdFx0dGhpcy5fc2NhbGVZID0gc2NhbGVZO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHNrZWxldG9uIFggcG9zaXRpb24sIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSByb290IGJvbmUgd29ybGRYIHBvc2l0aW9uLlxuXHQgKlxuXHQgKiBCb25lcyB0aGF0IGRvIG5vdCBpbmhlcml0IHRyYW5zbGF0aW9uIGFyZSBzdGlsbCBhZmZlY3RlZCBieSB0aGlzIHByb3BlcnR5LiAqL1xuXHR4ID0gMDtcblxuXHQvKiogU2V0cyB0aGUgc2tlbGV0b24gWSBwb3NpdGlvbiwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIHJvb3QgYm9uZSB3b3JsZFkgcG9zaXRpb24uXG5cdCAqXG5cdCAqIEJvbmVzIHRoYXQgZG8gbm90IGluaGVyaXQgdHJhbnNsYXRpb24gYXJlIHN0aWxsIGFmZmVjdGVkIGJ5IHRoaXMgcHJvcGVydHkuICovXG5cdHkgPSAwO1xuXG5cdC8qKiBSZXR1cm5zIHRoZSBza2VsZXRvbidzIHRpbWUsIGlzIHVzZWQgZm9yIHRpbWUtYmFzZWQgbWFuaXB1bGF0aW9ucywgc3VjaCBhcyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnR9LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIF91cGRhdGV9LiAqL1xuXHR0aW1lID0gMDtcblxuXHQvKiogVGhlIHggY29tcG9uZW50IG9mIGEgdmVjdG9yIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIHtAbGluayBQaHlzaWNzQ29uc3RyYWludFBvc2Uud2luZH0gaXMgYXBwbGllZC4gKi9cblx0d2luZFggPSAxO1xuXG5cdC8qKiBUaGUgeSBjb21wb25lbnQgb2YgYSB2ZWN0b3IgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24ge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50UG9zZS53aW5kfSBpcyBhcHBsaWVkLiAqL1xuXHR3aW5kWSA9IDA7XG5cblx0LyoqIFRoZSB4IGNvbXBvbmVudCBvZiBhIHZlY3RvciB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlLmdyYXZpdHl9IGlzIGFwcGxpZWQuICovXG5cdGdyYXZpdHlYID0gMDtcblxuXHQvKiogVGhlIHkgY29tcG9uZW50IG9mIGEgdmVjdG9yIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIHtAbGluayBQaHlzaWNzQ29uc3RyYWludFBvc2UuZ3Jhdml0eX0gaXMgYXBwbGllZC4gKi9cblx0Z3Jhdml0eVkgPSAxO1xuXG5cdF91cGRhdGUgPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChkYXRhOiBTa2VsZXRvbkRhdGEpIHtcblx0XHRpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihcImRhdGEgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdHRoaXMuZGF0YSA9IGRhdGE7XG5cblx0XHR0aGlzLmJvbmVzID0gW10gYXMgQm9uZVtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ib25lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgYm9uZURhdGEgPSBkYXRhLmJvbmVzW2ldO1xuXHRcdFx0bGV0IGJvbmU6IEJvbmU7XG5cdFx0XHRpZiAoIWJvbmVEYXRhLnBhcmVudClcblx0XHRcdFx0Ym9uZSA9IG5ldyBCb25lKGJvbmVEYXRhLCBudWxsKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLmJvbmVzW2JvbmVEYXRhLnBhcmVudC5pbmRleF07XG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZShib25lRGF0YSwgcGFyZW50KTtcblx0XHRcdFx0cGFyZW50LmNoaWxkcmVuLnB1c2goYm9uZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJvbmVzLnB1c2goYm9uZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zbG90cyA9IFtdIGFzIFNsb3RbXTtcblx0XHRmb3IgKGNvbnN0IHNsb3REYXRhIG9mIHRoaXMuZGF0YS5zbG90cylcblx0XHRcdHRoaXMuc2xvdHMucHVzaChuZXcgU2xvdChzbG90RGF0YSwgdGhpcykpO1xuXHRcdHRoaXMuZHJhd09yZGVyID0gbmV3IERyYXdPcmRlcih0aGlzLnNsb3RzKTtcblxuXHRcdHRoaXMucGh5c2ljcyA9IFtdIGFzIFBoeXNpY3NDb25zdHJhaW50W107XG5cdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiByZWZlcmVuY2UgcnVudGltZSBkb2VzIG5vdCByZXN0cmljdCB0byBzcGVjaWZpYyB0eXBlc1xuXHRcdHRoaXMuY29uc3RyYWludHMgPSBbXSBhcyBDb25zdHJhaW50PGFueSwgYW55LCBhbnk+W107XG5cdFx0Zm9yIChjb25zdCBjb25zdHJhaW50RGF0YSBvZiB0aGlzLmRhdGEuY29uc3RyYWludHMpIHtcblx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBjb25zdHJhaW50RGF0YS5jcmVhdGUodGhpcyk7XG5cdFx0XHRpZiAoY29uc3RyYWludCBpbnN0YW5jZW9mIFBoeXNpY3NDb25zdHJhaW50KSB0aGlzLnBoeXNpY3MucHVzaChjb25zdHJhaW50KTtcblx0XHRcdHRoaXMuY29uc3RyYWludHMucHVzaChjb25zdHJhaW50KTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuXG5cdFx0dGhpcy51cGRhdGVDYWNoZSgpO1xuXHR9XG5cblx0LyoqIENhY2hlcyBpbmZvcm1hdGlvbiBhYm91dCBib25lcyBhbmQgY29uc3RyYWludHMuIE11c3QgYmUgY2FsbGVkIGlmIHRoZSB7QGxpbmsgc2tpbn0gaXMgbW9kaWZpZWQgb3IgaWYgYm9uZXMsIGNvbnN0cmFpbnRzLFxuXHQgKiBvciB3ZWlnaHRlZCBwYXRoIGF0dGFjaG1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLiAqL1xuXHR1cGRhdGVDYWNoZSAoKSB7XG5cdFx0dGhpcy5fdXBkYXRlQ2FjaGUubGVuZ3RoID0gMDtcblx0XHR0aGlzLnJlc2V0Q2FjaGUubGVuZ3RoID0gMDtcblxuXHRcdHRoaXMuZHJhd09yZGVyLnVuY29uc3RyYWluZWQoKTtcblx0XHRjb25zdCBzbG90cyA9IHRoaXMuc2xvdHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRzbG90c1tpXS51bmNvbnN0cmFpbmVkKCk7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Y29uc3QgYm9uZUNvdW50ID0gYm9uZXMubGVuZ3RoO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYm9uZUNvdW50OyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRib25lLnNvcnRlZCA9IGJvbmUuZGF0YS5za2luUmVxdWlyZWQ7XG5cdFx0XHRib25lLmFjdGl2ZSA9ICFib25lLnNvcnRlZDtcblx0XHRcdGJvbmUudW5jb25zdHJhaW5lZCgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5za2luKSB7XG5cdFx0XHRjb25zdCBza2luQm9uZXMgPSB0aGlzLnNraW4uYm9uZXM7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRoaXMuc2tpbi5ib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdFx0bGV0IGJvbmU6IEJvbmUgfCBudWxsID0gdGhpcy5ib25lc1tza2luQm9uZXNbaV0uaW5kZXhdO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0Ym9uZS5zb3J0ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRib25lLmFjdGl2ZSA9IHRydWU7XG5cdFx0XHRcdFx0Ym9uZSA9IGJvbmUucGFyZW50O1xuXHRcdFx0XHR9IHdoaWxlIChib25lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHRoaXMuY29uc3RyYWludHM7XG5cdFx0bGV0IG4gPSB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKylcblx0XHRcdGNvbnN0cmFpbnRzW2ldLnVuY29uc3RyYWluZWQoKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW2ldO1xuXHRcdFx0Y29uc3RyYWludC5hY3RpdmUgPSBjb25zdHJhaW50LmlzU291cmNlQWN0aXZlKClcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VPcHRpb25hbENoYWluOiBjaGFuZ2luZyB0byB0aGlzIG1pZ2h0IHJldHVybiB1bmRlZmluZWRcblx0XHRcdFx0JiYgKCFjb25zdHJhaW50LmRhdGEuc2tpblJlcXVpcmVkIHx8ICh0aGlzLnNraW4gIT0gbnVsbCAmJiB0aGlzLnNraW4uY29uc3RyYWludHMuaW5jbHVkZXMoY29uc3RyYWludC5kYXRhKSkpO1xuXHRcdFx0aWYgKGNvbnN0cmFpbnQuYWN0aXZlKSBjb25zdHJhaW50LnNvcnQodGhpcyk7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBib25lQ291bnQ7IGkrKylcblx0XHRcdHRoaXMuc29ydEJvbmUoYm9uZXNbaV0pO1xuXG5cdFx0biA9IHRoaXMuX3VwZGF0ZUNhY2hlLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgdXBkYXRlYWJsZSA9IHRoaXMuX3VwZGF0ZUNhY2hlW2ldO1xuXHRcdFx0aWYgKHVwZGF0ZWFibGUgaW5zdGFuY2VvZiBCb25lKSB0aGlzLl91cGRhdGVDYWNoZVtpXSA9IHVwZGF0ZWFibGUuYXBwbGllZFBvc2U7XG5cdFx0fVxuXG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHJlZmVyZW5jZSBydW50aW1lIGRvZXMgbm90IHJlc3RyaWN0IHRvIHNwZWNpZmljIHR5cGVzXG5cdGNvbnN0cmFpbmVkIChvYmplY3Q6IFBvc2VkPGFueSwgYW55Pikge1xuXHRcdGlmIChvYmplY3QucG9zZSA9PT0gb2JqZWN0LmFwcGxpZWRQb3NlKSB7XG5cdFx0XHRvYmplY3QuY29uc3RyYWluZWQoKTtcblx0XHRcdHRoaXMucmVzZXRDYWNoZS5wdXNoKG9iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0c29ydEJvbmUgKGJvbmU6IEJvbmUpIHtcblx0XHRpZiAoYm9uZS5zb3J0ZWQgfHwgIWJvbmUuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcGFyZW50ID0gYm9uZS5wYXJlbnQ7XG5cdFx0aWYgKHBhcmVudCkgdGhpcy5zb3J0Qm9uZShwYXJlbnQpO1xuXHRcdGJvbmUuc29ydGVkID0gdHJ1ZTtcblx0XHR0aGlzLl91cGRhdGVDYWNoZS5wdXNoKGJvbmUpO1xuXHR9XG5cblx0c29ydFJlc2V0IChib25lczogQXJyYXk8Qm9uZT4pIHtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzW2ldO1xuXHRcdFx0aWYgKGJvbmUuYWN0aXZlKSB7XG5cdFx0XHRcdGlmIChib25lLnNvcnRlZCkgdGhpcy5zb3J0UmVzZXQoYm9uZS5jaGlsZHJlbik7XG5cdFx0XHRcdGJvbmUuc29ydGVkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZXMgdGhlIHdvcmxkIHRyYW5zZm9ybSBmb3IgZWFjaCBib25lIGFuZCBhcHBsaWVzIGFsbCBjb25zdHJhaW50cy5cblx0ICpcblx0ICogU2VlIDxhIGhyZWY9XCJodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtc2tlbGV0b25zI1dvcmxkLXRyYW5zZm9ybXNcIj5Xb3JsZCB0cmFuc2Zvcm1zPC9hPiBpbiB0aGUgU3BpbmVcblx0ICogUnVudGltZXMgR3VpZGUuICovXG5cdHVwZGF0ZVdvcmxkVHJhbnNmb3JtIChwaHlzaWNzOiBQaHlzaWNzKTogdm9pZCB7XG5cdFx0dGhpcy5fdXBkYXRlKys7XG5cblx0XHRpZiAodGhpcy5kcmF3T3JkZXIuYXBwbGllZFBvc2UgPT09IHRoaXMuZHJhd09yZGVyLmNvbnN0cmFpbmVkUG9zZSkgdGhpcy5kcmF3T3JkZXIucmVzZXRDb25zdHJhaW5lZCgpO1xuXHRcdGNvbnN0IHJlc2V0Q2FjaGUgPSB0aGlzLnJlc2V0Q2FjaGU7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLnJlc2V0Q2FjaGUubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0cmVzZXRDYWNoZVtpXS5yZXNldENvbnN0cmFpbmVkKCk7XG5cblx0XHRjb25zdCB1cGRhdGVDYWNoZSA9IHRoaXMuX3VwZGF0ZUNhY2hlO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5fdXBkYXRlQ2FjaGUubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0dXBkYXRlQ2FjaGVbaV0udXBkYXRlKHRoaXMsIHBoeXNpY3MpO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIGJvbmVzLCBjb25zdHJhaW50cywgYW5kIHNsb3RzIHRvIHRoZWlyIHNldHVwIHBvc2UgdmFsdWVzLiAqL1xuXHRzZXR1cFBvc2UgKCkge1xuXHRcdHRoaXMuc2V0dXBQb3NlQm9uZXMoKTtcblx0XHR0aGlzLnNldHVwUG9zZVNsb3RzKCk7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgYm9uZXMgYW5kIGNvbnN0cmFpbnRzIHRvIHRoZWlyIHNldHVwIHBvc2UgdmFsdWVzLiAqL1xuXHRzZXR1cFBvc2VCb25lcyAoKSB7XG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0Ym9uZXNbaV0uc2V0dXBQb3NlKCk7XG5cblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHRoaXMuY29uc3RyYWludHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBjb25zdHJhaW50cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRjb25zdHJhaW50c1tpXS5zZXR1cFBvc2UoKTtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSBzbG90cyBhbmQgZHJhdyBvcmRlciB0byB0aGVpciBzZXR1cCBwb3NlIHZhbHVlcy4gKi9cblx0c2V0dXBQb3NlU2xvdHMgKCkge1xuXHRcdHRoaXMuZHJhd09yZGVyLnNldHVwUG9zZSgpO1xuXHRcdGNvbnN0IHNsb3RzID0gdGhpcy5zbG90cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdHNsb3RzW2ldLnNldHVwUG9zZSgpO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIHJvb3QgYm9uZSwgb3IgbnVsbCBpZiB0aGUgc2tlbGV0b24gaGFzIG5vIGJvbmVzLiAqL1xuXHRnZXRSb290Qm9uZSAoKSB7XG5cdFx0aWYgKHRoaXMuYm9uZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblx0XHRyZXR1cm4gdGhpcy5ib25lc1swXTtcblx0fVxuXG5cdC8qKiBGaW5kcyBhIGJvbmUgYnkgY29tcGFyaW5nIGVhY2ggYm9uZSdzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdFxuXHQgKiByZXBlYXRlZGx5LiAqL1xuXHRmaW5kQm9uZSAoYm9uZU5hbWU6IHN0cmluZykge1xuXHRcdGlmICghYm9uZU5hbWUpIHRocm93IG5ldyBFcnJvcihcImJvbmVOYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoYm9uZXNbaV0uZGF0YS5uYW1lID09PSBib25lTmFtZSkgcmV0dXJuIGJvbmVzW2ldO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqIEZpbmRzIGEgc2xvdCBieSBjb21wYXJpbmcgZWFjaCBzbG90J3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0byBjYWxsIGl0XG5cdCAqIHJlcGVhdGVkbHkuICovXG5cdGZpbmRTbG90IChzbG90TmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFzbG90TmFtZSkgdGhyb3cgbmV3IEVycm9yKFwic2xvdE5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGNvbnN0IHNsb3RzID0gdGhpcy5zbG90cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGlmIChzbG90c1tpXS5kYXRhLm5hbWUgPT09IHNsb3ROYW1lKSByZXR1cm4gc2xvdHNbaV07XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogU2V0cyBhIHNraW4gYnkgbmFtZS5cblx0ICpcblx0ICogU2VlIHtAbGluayBzZXRTa2lufS4gKi9cblx0c2V0U2tpbiAoc2tpbk5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgdGhlIHNraW4gdXNlZCB0byBsb29rIHVwIGF0dGFjaG1lbnRzIGJlZm9yZSBsb29raW5nIGluIHtAbGluayBTa2VsZXRvbkRhdGEuZGVmYXVsdFNraW59LiBJZiB0aGUgc2tpbiBpcyBjaGFuZ2VkLFxuXHQgKiB7QGxpbmsgdXBkYXRlQ2FjaGV9IGlzIGNhbGxlZC5cblx0ICpcblx0ICogQXR0YWNobWVudHMgZnJvbSB0aGUgbmV3IHNraW4gYXJlIGF0dGFjaGVkIGlmIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgZnJvbSB0aGUgb2xkIHNraW4gd2FzIGF0dGFjaGVkLiBJZiB0aGVyZSB3YXMgbm9cblx0ICogb2xkIHNraW4sIGVhY2ggc2xvdCdzIHNldHVwIG1vZGUgYXR0YWNobWVudCBpcyBhdHRhY2hlZCBmcm9tIHRoZSBuZXcgc2tpbi5cblx0ICpcblx0ICogQWZ0ZXIgY2hhbmdpbmcgdGhlIHNraW4sIHRoZSB2aXNpYmxlIGF0dGFjaG1lbnRzIGNhbiBiZSByZXNldCB0byB0aG9zZSBhdHRhY2hlZCBpbiB0aGUgc2V0dXAgcG9zZSBieSBjYWxsaW5nXG5cdCAqIHtAbGluayBzZXR1cFBvc2VTbG90c30uIEFsc28sIG9mdGVuIHtAbGluayBBbmltYXRpb25TdGF0ZS5hcHBseX0gaXMgY2FsbGVkIGJlZm9yZSB0aGUgbmV4dCB0aW1lIHRoZSBza2VsZXRvbiBpc1xuXHQgKiByZW5kZXJlZCB0byBhbGxvdyBhbnkgYXR0YWNobWVudCBrZXlzIGluIHRoZSBjdXJyZW50IGFuaW1hdGlvbihzKSB0byBoaWRlIG9yIHNob3cgYXR0YWNobWVudHMgZnJvbSB0aGUgbmV3IHNraW4uICovXG5cdHNldFNraW4gKG5ld1NraW46IFNraW4gfCBudWxsKTogdm9pZDtcblxuXHRzZXRTa2luIChuZXdTa2luOiBTa2luIHwgbnVsbCB8IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICh0eXBlb2YgbmV3U2tpbiA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHRoaXMuc2V0U2tpbkJ5TmFtZShuZXdTa2luKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnNldFNraW5CeVNraW4obmV3U2tpbik7XG5cdH07XG5cblx0cHJpdmF0ZSBzZXRTa2luQnlOYW1lIChza2luTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc2tpbiA9IHRoaXMuZGF0YS5maW5kU2tpbihza2luTmFtZSk7XG5cdFx0aWYgKCFza2luKSB0aHJvdyBuZXcgRXJyb3IoYFNraW4gbm90IGZvdW5kOiAke3NraW5OYW1lfWApO1xuXHRcdHRoaXMuc2V0U2tpbihza2luKTtcblx0fVxuXG5cdHByaXZhdGUgc2V0U2tpbkJ5U2tpbiAobmV3U2tpbjogU2tpbiB8IG51bGwpIHtcblx0XHRpZiAobmV3U2tpbiA9PT0gdGhpcy5za2luKSByZXR1cm47XG5cdFx0aWYgKG5ld1NraW4pIHtcblx0XHRcdGlmICh0aGlzLnNraW4pXG5cdFx0XHRcdG5ld1NraW4uYXR0YWNoQWxsKHRoaXMsIHRoaXMuc2tpbik7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2xvdHMgPSB0aGlzLnNsb3RzO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IHNsb3QgPSBzbG90c1tpXTtcblx0XHRcdFx0XHRjb25zdCBuYW1lID0gc2xvdC5kYXRhLmF0dGFjaG1lbnROYW1lO1xuXHRcdFx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhdHRhY2htZW50ID0gbmV3U2tpbi5nZXRBdHRhY2htZW50KGksIG5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKGF0dGFjaG1lbnQpIHNsb3QucG9zZS5zZXRBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLnNraW4gPSBuZXdTa2luO1xuXHRcdHRoaXMudXBkYXRlQ2FjaGUoKTtcblx0fVxuXG5cdC8qKiBGaW5kcyBhbiBhdHRhY2htZW50IGJ5IGxvb2tpbmcgaW4gdGhlIHtAbGluayBza2lufSBhbmQge0BsaW5rIFNrZWxldG9uRGF0YS5kZWZhdWx0U2tpbn0gdXNpbmcgdGhlIHNsb3QgbmFtZSBhbmQgYXR0YWNobWVudFxuXHQgKiBuYW1lLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIGdldEF0dGFjaG1lbnR9LiAqL1xuXHRnZXRBdHRhY2htZW50IChzbG90TmFtZTogc3RyaW5nLCBwbGFjZWhvbGRlcjogc3RyaW5nKTogQXR0YWNobWVudCB8IG51bGw7XG5cblx0LyoqIEZpbmRzIGFuIGF0dGFjaG1lbnQgYnkgbG9va2luZyBpbiB0aGUge0BsaW5rIHNraW59IGFuZCB7QGxpbmsgU2tlbGV0b25EYXRhLmRlZmF1bHRTa2lufSB1c2luZyB0aGUgc2xvdCBpbmRleCBhbmRcblx0ICogYXR0YWNobWVudCBuYW1lLiBGaXJzdCB0aGUgc2tpbiBpcyBjaGVja2VkIGFuZCBpZiB0aGUgYXR0YWNobWVudCB3YXMgbm90IGZvdW5kLCB0aGUgZGVmYXVsdCBza2luIGlzIGNoZWNrZWQuXG5cdCAqXG5cdCAqIFNlZSA8YSBocmVmPVwiaHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1ydW50aW1lLXNraW5zXCI+UnVudGltZSBza2luczwvYT4gaW4gdGhlIFNwaW5lIFJ1bnRpbWVzIEd1aWRlLiAqL1xuXHRnZXRBdHRhY2htZW50IChzbG90SW5kZXg6IG51bWJlciwgcGxhY2Vob2xkZXI6IHN0cmluZyk6IEF0dGFjaG1lbnQgfCBudWxsO1xuXG5cdGdldEF0dGFjaG1lbnQgKHNsb3ROYW1lT3JJbmRleDogc3RyaW5nIHwgbnVtYmVyLCBwbGFjZWhvbGRlcjogc3RyaW5nKTogQXR0YWNobWVudCB8IG51bGwge1xuXHRcdGlmICh0eXBlb2Ygc2xvdE5hbWVPckluZGV4ID09PSAnc3RyaW5nJylcblx0XHRcdHJldHVybiB0aGlzLmdldEF0dGFjaG1lbnRCeU5hbWUoc2xvdE5hbWVPckluZGV4LCBwbGFjZWhvbGRlcik7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0YWNobWVudEJ5SW5kZXgoc2xvdE5hbWVPckluZGV4LCBwbGFjZWhvbGRlcik7XG5cdH1cblxuXHQvKiogRmluZHMgYW4gYXR0YWNobWVudCBieSBsb29raW5nIGluIHRoZSB7QGxpbmsgc2tpbn0gYW5kIHtAbGluayBTa2VsZXRvbkRhdGEuZGVmYXVsdFNraW59IHVzaW5nIHRoZSBzbG90IG5hbWUgYW5kIGF0dGFjaG1lbnRcblx0ICogbmFtZS5cblx0ICpcblx0ICogU2VlIHtAbGluayBnZXRBdHRhY2htZW50fS5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdHByaXZhdGUgZ2V0QXR0YWNobWVudEJ5TmFtZSAoc2xvdE5hbWU6IHN0cmluZywgcGxhY2Vob2xkZXI6IHN0cmluZyk6IEF0dGFjaG1lbnQgfCBudWxsIHtcblx0XHRjb25zdCBzbG90ID0gdGhpcy5kYXRhLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgZmluZCBzbG90IHdpdGggbmFtZSAke3Nsb3ROYW1lfWApO1xuXHRcdHJldHVybiB0aGlzLmdldEF0dGFjaG1lbnQoc2xvdC5pbmRleCwgcGxhY2Vob2xkZXIpO1xuXHR9XG5cblx0LyoqIEZpbmRzIGFuIGF0dGFjaG1lbnQgYnkgbG9va2luZyBpbiB0aGUge0BsaW5rIHNraW59IGFuZCB7QGxpbmsgU2tlbGV0b25EYXRhLmRlZmF1bHRTa2lufSB1c2luZyB0aGUgc2xvdCBpbmRleCBhbmRcblx0ICogYXR0YWNobWVudCBuYW1lLiBGaXJzdCB0aGUgc2tpbiBpcyBjaGVja2VkIGFuZCBpZiB0aGUgYXR0YWNobWVudCB3YXMgbm90IGZvdW5kLCB0aGUgZGVmYXVsdCBza2luIGlzIGNoZWNrZWQuXG5cdCAqXG5cdCAqIFNlZSBbUnVudGltZSBza2luc10oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtc2tpbnMpIGluIHRoZSBTcGluZSBSdW50aW1lcyBHdWlkZS5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdHByaXZhdGUgZ2V0QXR0YWNobWVudEJ5SW5kZXggKHNsb3RJbmRleDogbnVtYmVyLCBwbGFjZWhvbGRlcjogc3RyaW5nKTogQXR0YWNobWVudCB8IG51bGwge1xuXHRcdGlmICghcGxhY2Vob2xkZXIpIHRocm93IG5ldyBFcnJvcihcInBsYWNlaG9sZGVyIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRpZiAodGhpcy5za2luKSB7XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gdGhpcy5za2luLmdldEF0dGFjaG1lbnQoc2xvdEluZGV4LCBwbGFjZWhvbGRlcik7XG5cdFx0XHRpZiAoYXR0YWNobWVudCkgcmV0dXJuIGF0dGFjaG1lbnQ7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmRhdGEuZGVmYXVsdFNraW4pIHJldHVybiB0aGlzLmRhdGEuZGVmYXVsdFNraW4uZ2V0QXR0YWNobWVudChzbG90SW5kZXgsIHBsYWNlaG9sZGVyKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byBzZXQgYW4gYXR0YWNobWVudCBieSBmaW5kaW5nIHRoZSBzbG90IHdpdGgge0BsaW5rIGZpbmRTbG90fSwgZmluZGluZyB0aGUgYXR0YWNobWVudCB3aXRoXG5cdCAqIHtAbGluayBnZXRBdHRhY2htZW50fSwgdGhlbiBzZXR0aW5nIHRoZSBzbG90J3Mge0BsaW5rIFNsb3QuYXR0YWNobWVudH0uXG5cdCAqIEBwYXJhbSBwbGFjZWhvbGRlciBNYXkgYmUgbnVsbCB0byBjbGVhciB0aGUgc2xvdCdzIGF0dGFjaG1lbnQuICovXG5cdHNldEF0dGFjaG1lbnQgKHNsb3ROYW1lOiBzdHJpbmcsIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsKSB7XG5cdFx0aWYgKCFzbG90TmFtZSkgdGhyb3cgbmV3IEVycm9yKFwic2xvdE5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGNvbnN0IHNsb3QgPSB0aGlzLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgU2xvdCBub3QgZm91bmQ6ICR7c2xvdE5hbWV9YCk7XG5cdFx0bGV0IGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQgfCBudWxsID0gbnVsbDtcblx0XHRpZiAocGxhY2Vob2xkZXIpIHtcblx0XHRcdGF0dGFjaG1lbnQgPSB0aGlzLmdldEF0dGFjaG1lbnQoc2xvdC5kYXRhLmluZGV4LCBwbGFjZWhvbGRlcik7XG5cdFx0XHRpZiAoIWF0dGFjaG1lbnQpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQXR0YWNobWVudCBub3QgZm91bmQ6ICR7cGxhY2Vob2xkZXJ9LCBmb3Igc2xvdDogJHtzbG90TmFtZX1gKTtcblx0XHR9XG5cdFx0c2xvdC5wb3NlLnNldEF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG5cdH1cblxuXHQvKiogRmluZHMgYSBjb25zdHJhaW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBieSBjb21wYXJpbmcgZWFjaCBjb25zdHJhaW50cydzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mXG5cdCAqIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdCBtdWx0aXBsZSB0aW1lcy4gKi9cblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiByZWZlcmVuY2UgcnVudGltZSBkb2VzIG5vdCByZXN0cmljdCB0byBzcGVjaWZpYyB0eXBlc1xuXHRmaW5kQ29uc3RyYWludDxUIGV4dGVuZHMgQ29uc3RyYWludDxhbnksIGFueSwgYW55Pj4gKGNvbnN0cmFpbnROYW1lOiBzdHJpbmcsIHR5cGU6IG5ldyAoKSA9PiBUKTogVCB8IG51bGwge1xuXHRcdGlmIChjb25zdHJhaW50TmFtZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJjb25zdHJhaW50TmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0aWYgKHR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSB0aGlzLmNvbnN0cmFpbnRzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gY29uc3RyYWludHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBjb25zdHJhaW50ID0gY29uc3RyYWludHNbaV07XG5cdFx0XHRpZiAoY29uc3RyYWludCBpbnN0YW5jZW9mIHR5cGUgJiYgY29uc3RyYWludC5kYXRhLm5hbWUgPT09IGNvbnN0cmFpbnROYW1lKSByZXR1cm4gY29uc3RyYWludCBhcyBUO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IChBQUJCKSBvZiB0aGUgcmVnaW9uIGFuZCBtZXNoIGF0dGFjaG1lbnRzIGZvciB0aGUgYXBwbGllZCBwb3NlLlxuXHQgKiBAcGFyYW0gb2Zmc2V0IEFuIG91dHB1dCB2YWx1ZSwgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHNrZWxldG9uIG9yaWdpbiB0byB0aGUgYm90dG9tIGxlZnQgY29ybmVyIG9mIHRoZSBBQUJCLlxuXHQgKiBAcGFyYW0gc2l6ZSBBbiBvdXRwdXQgdmFsdWUsIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBBQUJCLlxuXHQgKiBAcGFyYW0gdGVtcCBXb3JraW5nIG1lbW9yeSB0byB0ZW1wb3JhcmlseSBzdG9yZSBhdHRhY2htZW50cycgY29tcHV0ZWQgd29ybGQgdmVydGljZXMuICovXG5cdGdldEJvdW5kc1JlY3QgKGNsaXBwZXI/OiBTa2VsZXRvbkNsaXBwaW5nKSB7XG5cdFx0Y29uc3Qgb2Zmc2V0ID0gbmV3IFZlY3RvcjIoKTtcblx0XHRjb25zdCBzaXplID0gbmV3IFZlY3RvcjIoKTtcblx0XHR0aGlzLmdldEJvdW5kcyhvZmZzZXQsIHNpemUsIHVuZGVmaW5lZCwgY2xpcHBlcik7XG5cdFx0cmV0dXJuIHsgeDogb2Zmc2V0LngsIHk6IG9mZnNldC55LCB3aWR0aDogc2l6ZS54LCBoZWlnaHQ6IHNpemUueSB9O1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIGF4aXMgYWxpZ25lZCBib3VuZGluZyBib3ggKEFBQkIpIG9mIHRoZSByZWdpb24gYW5kIG1lc2ggYXR0YWNobWVudHMgZm9yIHRoZSBhcHBsaWVkIHBvc2UuIE9wdGlvbmFsbHkgYXBwbGllc1xuXHQgKiBjbGlwcGluZy5cblx0ICogQHBhcmFtIG9mZnNldCBBbiBvdXRwdXQgdmFsdWUsIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBza2VsZXRvbiBvcmlnaW4gdG8gdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBvZiB0aGUgQUFCQi5cblx0ICogQHBhcmFtIHNpemUgQW4gb3V0cHV0IHZhbHVlLCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgQUFCQi5cblx0ICogQHBhcmFtIHRlbXAgV29ya2luZyBtZW1vcnkgdG8gdGVtcG9yYXJpbHkgc3RvcmUgYXR0YWNobWVudHMnIGNvbXB1dGVkIHdvcmxkIHZlcnRpY2VzLlxuXHQgKiBAcGFyYW0gY2xpcHBlciB7QGxpbmsgU2tlbGV0b25DbGlwcGluZ30gdG8gdXNlLiBJZiBgbnVsbGAsIG5vIGNsaXBwaW5nIGlzIGFwcGxpZWQuICovXG5cdGdldEJvdW5kcyAob2Zmc2V0OiBWZWN0b3IyLCBzaXplOiBWZWN0b3IyLCB0ZW1wOiBBcnJheTxudW1iZXI+ID0gbmV3IEFycmF5PG51bWJlcj4oMiksIGNsaXBwZXI6IFNrZWxldG9uQ2xpcHBpbmcgfCBudWxsID0gbnVsbCkge1xuXHRcdGlmICghb2Zmc2V0KSB0aHJvdyBuZXcgRXJyb3IoXCJvZmZzZXQgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGlmICghc2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwic2l6ZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0Y29uc3QgZHJhd09yZGVyID0gdGhpcy5kcmF3T3JkZXIuYXBwbGllZFBvc2U7XG5cdFx0Y29uc3Qgc2xvdHMgPSBkcmF3T3JkZXI7XG5cdFx0bGV0IG1pblggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1pblkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1heFggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIG1heFkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBkcmF3T3JkZXIubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gc2xvdHNbaV07XG5cdFx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIGNvbnRpbnVlO1xuXHRcdFx0bGV0IHZlcnRpY2VzTGVuZ3RoID0gMDtcblx0XHRcdGxldCB2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlIHwgbnVsbCA9IG51bGw7XG5cdFx0XHRsZXQgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UgfCBudWxsID0gbnVsbDtcblx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmFwcGxpZWRQb3NlLmF0dGFjaG1lbnQ7XG5cdFx0XHRpZiAoYXR0YWNobWVudCkge1xuXHRcdFx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcblx0XHRcdFx0XHR2ZXJ0aWNlc0xlbmd0aCA9IDg7XG5cdFx0XHRcdFx0dmVydGljZXMgPSBVdGlscy5zZXRBcnJheVNpemUodGVtcCwgdmVydGljZXNMZW5ndGgsIDApO1xuXHRcdFx0XHRcdGF0dGFjaG1lbnQuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgYXR0YWNobWVudC5nZXRPZmZzZXRzKHNsb3QuYXBwbGllZFBvc2UpLCB2ZXJ0aWNlcywgMCwgMik7XG5cdFx0XHRcdFx0dHJpYW5nbGVzID0gU2tlbGV0b24ucXVhZFRyaWFuZ2xlcztcblx0XHRcdFx0fSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0XHR2ZXJ0aWNlc0xlbmd0aCA9IGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aDtcblx0XHRcdFx0XHR2ZXJ0aWNlcyA9IFV0aWxzLnNldEFycmF5U2l6ZSh0ZW1wLCB2ZXJ0aWNlc0xlbmd0aCwgMCk7XG5cdFx0XHRcdFx0YXR0YWNobWVudC5jb21wdXRlV29ybGRWZXJ0aWNlcyh0aGlzLCBzbG90LCAwLCB2ZXJ0aWNlc0xlbmd0aCwgdmVydGljZXMsIDAsIDIpO1xuXHRcdFx0XHRcdHRyaWFuZ2xlcyA9IGF0dGFjaG1lbnQudHJpYW5nbGVzO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQgJiYgY2xpcHBlcikge1xuXHRcdFx0XHRcdGNsaXBwZXIuY2xpcEVuZChzbG90KTtcblx0XHRcdFx0XHRjbGlwcGVyLmNsaXBTdGFydCh0aGlzLCBzbG90LCBhdHRhY2htZW50KTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodmVydGljZXMgJiYgdHJpYW5nbGVzKSB7XG5cdFx0XHRcdFx0aWYgKGNsaXBwZXI/LmlzQ2xpcHBpbmcoKSAmJiBjbGlwcGVyLmNsaXBUcmlhbmdsZXModmVydGljZXMsIHRyaWFuZ2xlcywgdHJpYW5nbGVzLmxlbmd0aCkpIHtcblx0XHRcdFx0XHRcdHZlcnRpY2VzID0gY2xpcHBlci5jbGlwcGVkVmVydGljZXM7XG5cdFx0XHRcdFx0XHR2ZXJ0aWNlc0xlbmd0aCA9IGNsaXBwZXIuY2xpcHBlZFZlcnRpY2VzLmxlbmd0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwLCBubiA9IHZlcnRpY2VzLmxlbmd0aDsgaWkgPCBubjsgaWkgKz0gMikge1xuXHRcdFx0XHRcdFx0Y29uc3QgeCA9IHZlcnRpY2VzW2lpXSwgeSA9IHZlcnRpY2VzW2lpICsgMV07XG5cdFx0XHRcdFx0XHRtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG5cdFx0XHRcdFx0XHRtaW5ZID0gTWF0aC5taW4obWluWSwgeSk7XG5cdFx0XHRcdFx0XHRtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG5cdFx0XHRcdFx0XHRtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2xpcHBlcikgY2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdH1cblx0XHRpZiAoY2xpcHBlcikgY2xpcHBlci5jbGlwRW5kKCk7XG5cdFx0b2Zmc2V0LnNldChtaW5YLCBtaW5ZKTtcblx0XHRzaXplLnNldChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xuXHR9XG5cblx0LyoqIFNjYWxlcyB0aGUgZW50aXJlIHNrZWxldG9uIG9uIHRoZSBYIGFuZCBZIGF4ZXMuXG5cdCAqXG5cdCAqIEJvbmVzIHRoYXQgZG8gbm90IGluaGVyaXQgc2NhbGUgYXJlIHN0aWxsIGFmZmVjdGVkIGJ5IHRoaXMgcHJvcGVydHkuICovXG5cdHB1YmxpYyBzZXRTY2FsZSAoc2NhbGVYOiBudW1iZXIsIHNjYWxlWTogbnVtYmVyKSB7XG5cdFx0dGhpcy5zY2FsZVggPSBzY2FsZVg7XG5cdFx0dGhpcy5zY2FsZVkgPSBzY2FsZVk7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgc2tlbGV0b24gWCBhbmQgWSBwb3NpdGlvbiwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIHJvb3QgYm9uZSB3b3JsZFggYW5kIHdvcmxkWSBwb3NpdGlvbi5cblx0ICpcblx0ICogQm9uZXMgdGhhdCBkbyBub3QgaW5oZXJpdCB0cmFuc2xhdGlvbiBhcmUgc3RpbGwgYWZmZWN0ZWQgYnkgdGhpcyBwcm9wZXJ0eS4gKi9cblx0cHVibGljIHNldFBvc2l0aW9uICh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0fVxuXG5cdC8qKiBJbmNyZW1lbnRzIHRoZSBza2VsZXRvbidzIHtAbGluayB0aW1lfS4gKi9cblx0dXBkYXRlIChkZWx0YTogbnVtYmVyKSB7XG5cdFx0dGhpcy50aW1lICs9IGRlbHRhO1xuXHR9XG5cblx0LyoqIENhbGxzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludC50cmFuc2xhdGV9IGZvciBlYWNoIHBoeXNpY3MgY29uc3RyYWludC4gKi9cblx0cGh5c2ljc1RyYW5zbGF0ZSAoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHRoaXMucGh5c2ljcztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGNvbnN0cmFpbnRzW2ldLnRyYW5zbGF0ZSh4LCB5KTtcblx0fVxuXG5cdC8qKiBDYWxscyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnQucm90YXRlfSBmb3IgZWFjaCBwaHlzaWNzIGNvbnN0cmFpbnQuICovXG5cdHBoeXNpY3NSb3RhdGUgKHg6IG51bWJlciwgeTogbnVtYmVyLCBkZWdyZWVzOiBudW1iZXIpIHtcblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHRoaXMucGh5c2ljcztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGNvbnN0cmFpbnRzW2ldLnJvdGF0ZSh4LCB5LCBkZWdyZWVzKTtcblx0fVxufVxuIl19