crocoddyl  1.8.1
Contact RObot COntrol by Differential DYnamic programming Library (Crocoddyl)
fwd.hpp
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2021, LAAS-CNRS, University of Edinburgh, INRIA
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #ifndef CROCODDYL_MULTIBODY_FWD_HPP_
10 #define CROCODDYL_MULTIBODY_FWD_HPP_
11 
12 #include "crocoddyl/core/utils/deprecate.hpp"
13 #include "crocoddyl/core/costs/residual.hpp"
14 
15 namespace crocoddyl {
16 
17 // actuation
18 template <typename Scalar>
19 class ActuationModelFloatingBaseTpl;
20 
21 template <typename Scalar>
22 class ActuationModelFullTpl;
23 
24 template <typename Scalar>
25 class ActuationModelMultiCopterBaseTpl;
26 
27 // force
28 template <typename Scala>
29 struct ForceDataAbstractTpl;
30 
31 // contact
32 template <typename Scalar>
33 class ContactModelAbstractTpl;
34 template <typename Scalar>
35 struct ContactDataAbstractTpl;
36 
37 // action
38 template <typename Scalar>
39 class ActionModelImpulseFwdDynamicsTpl;
40 template <typename Scalar>
41 struct ActionDataImpulseFwdDynamicsTpl;
42 
43 // differential action
44 template <typename Scalar>
45 class DifferentialActionModelFreeFwdDynamicsTpl;
46 template <typename Scalar>
47 struct DifferentialActionDataFreeFwdDynamicsTpl;
48 
49 template <typename Scalar>
50 class DifferentialActionModelContactFwdDynamicsTpl;
51 template <typename Scalar>
52 struct DifferentialActionDataContactFwdDynamicsTpl;
53 
54 // numdiff
55 template <typename Scalar>
56 class CostModelNumDiffTpl;
57 template <typename Scalar>
58 struct CostDataNumDiffTpl;
59 
60 template <typename Scalar>
62 template <typename Scalar>
64 
65 // frame
66 template <typename Scalar>
67 struct FrameTranslationTpl;
68 
69 template <typename Scalar>
70 struct FrameRotationTpl;
71 
72 template <typename Scalar>
73 struct FramePlacementTpl;
74 
75 template <typename Scalar>
76 struct FrameMotionTpl;
77 
78 template <typename Scalar>
79 struct FrameForceTpl;
80 
81 template <typename Scalar>
83 
84 template <typename Scalar>
85 struct FrameWrenchConeTpl;
86 
87 template <typename Scalar>
88 struct FrameCoPSupportTpl;
89 
90 // residual
91 template <typename Scalar>
93 template <typename Scalar>
95 
96 template <typename Scalar>
98 template <typename Scalar>
100 
101 template <typename Scalar>
103 template <typename Scalar>
105 
106 template <typename Scalar>
108 template <typename Scalar>
110 
111 template <typename Scalar>
113 template <typename Scalar>
115 
116 template <typename Scalar>
118 template <typename Scalar>
120 
121 template <typename Scalar>
123 template <typename Scalar>
125 
126 template <typename Scalar>
128 template <typename Scalar>
130 
131 template <typename Scalar>
133 template <typename Scalar>
135 
136 template <typename Scalar>
138 template <typename Scalar>
140 
141 template <typename Scalar>
143 template <typename Scalar>
145 
146 template <typename Scalar>
148 template <typename Scalar>
150 
151 template <typename Scalar>
153 template <typename Scalar>
155 
156 template <typename Scalar>
158 template <typename Scalar>
160 
161 #ifdef PINOCCHIO_WITH_HPP_FCL
162 template <typename Scalar>
163 class ResidualModelPairCollisionTpl;
164 template <typename Scalar>
165 struct ResidualDataPairCollisionTpl;
166 #endif
167 // cost
168 template <typename Scalar>
170 
171 template <typename Scalar>
173 
174 template <typename Scalar>
176 template <typename Scalar>
178 
179 template <typename Scalar>
181 template <typename Scalar>
183 
184 template <typename Scalar>
186 template <typename Scalar>
188 
189 template <typename Scalar>
191 template <typename Scalar>
193 
194 template <typename Scalar>
195 class CostModelStateTpl;
196 template <typename Scalar>
198 
199 template <typename Scalar>
201 template <typename Scalar>
203 
204 template <typename Scalar>
206 template <typename Scalar>
208 
209 template <typename Scalar>
211 template <typename Scalar>
213 
214 template <typename Scalar>
216 template <typename Scalar>
218 
219 template <typename Scalar>
221 template <typename Scalar>
223 
224 template <typename Scalar>
226 template <typename Scalar>
228 
229 template <typename Scalar>
231 template <typename Scalar>
233 
234 template <typename Scalar>
236 template <typename Scalar>
238 
239 template <typename Scalar>
241 template <typename Scalar>
243 
244 template <typename Scalar>
246 template <typename Scalar>
248 
249 template <typename Scalar>
251 template <typename Scalar>
253 
254 template <typename Scalar>
256 template <typename Scalar>
258 
259 // impulse
260 template <typename Scalar>
262 template <typename Scalar>
264 
265 // contact
266 template <typename Scalar>
267 struct ContactItemTpl;
268 template <typename Scalar>
270 template <typename Scalar>
272 
273 template <typename Scalar>
274 class ContactModel2DTpl;
275 template <typename Scalar>
276 struct ContactData2DTpl;
277 
278 template <typename Scalar>
279 class ContactModel3DTpl;
280 template <typename Scalar>
281 struct ContactData3DTpl;
282 
283 template <typename Scalar>
284 class ContactModel6DTpl;
285 template <typename Scalar>
286 struct ContactData6DTpl;
287 
288 // friction
289 template <typename Scalar>
290 class FrictionConeTpl;
291 template <typename Scalar>
293 
294 // cop support
295 template <typename Scalar>
296 class CoPSupportTpl;
297 
298 // state
299 template <typename Scalar>
301 
302 // data collector
303 template <typename Scalar>
305 
306 template <typename Scalar>
308 
309 template <typename Scalar>
311 
312 template <typename Scalar>
314 
315 template <typename Scalar>
317 
318 template <typename Scalar>
320 
321 template <typename Scalar>
323 
324 // impulse
325 template <typename Scalar>
327 template <typename Scalar>
329 
330 template <typename Scalar>
332 template <typename Scalar>
334 
335 template <typename Scalar>
337 template <typename Scalar>
339 template <typename Scalar>
341 
342 /*******************************Template Instantiation**************************/
343 
347 
349 
352 
355 
360 
365 
369 
370 DEPRECATED("Do not use FrameTranslation", typedef FrameTranslationTpl<double> FrameTranslation;)
371 DEPRECATED("Do not use FrameTranslation", typedef FrameRotationTpl<double> FrameRotation;)
372 DEPRECATED("Do not use FramePlacement", typedef FramePlacementTpl<double> FramePlacement;)
373 DEPRECATED("Do not use FrameMotion", typedef FrameMotionTpl<double> FrameMotion;)
374 DEPRECATED("Do not use FrameForce", typedef FrameForceTpl<double> FrameForce;)
375 DEPRECATED("Do not use FrameFrictionCone", typedef FrameFrictionConeTpl<double> FrameFrictionCone;)
376 DEPRECATED("Do not use FrameWrenchCone", typedef FrameWrenchConeTpl<double> FrameWrenchCone;)
377 DEPRECATED("Do not use FrameCopSupport", typedef FrameCoPSupportTpl<double> FrameCoPSupport;)
378 
407 
408 #ifdef PINOCCHIO_WITH_HPP_FCL
409 typedef ResidualModelPairCollisionTpl<double> ResidualModelPairCollision;
410 typedef ResidualDataPairCollisionTpl<double> ResidualDataPairCollision;
411 #endif
412 
413 DEPRECATED("Use ResidualModelFrameTranslation with CostModelResidual",
414  typedef CostModelFrameTranslationTpl<double> CostModelFrameTranslation;)
415 DEPRECATED("Use ResidualDataFrameTranslation", typedef CostDataResidualTpl<double> CostDataFrameTranslation;)
416 DEPRECATED("Use ResidualModelCentroidalMomentum with CostModelResidual",
418 DEPRECATED("Use ResidualDataCentroidalMomentum", typedef CostDataResidualTpl<double> CostDataCentroidalMomentum;)
419 DEPRECATED("Use ResidualModelCoMPosition with CostModelResidual",
420  typedef CostModelCoMPositionTpl<double> CostModelCoMPosition;)
421 DEPRECATED("Use ResidualDataCoMPosition", typedef CostDataResidualTpl<double> CostDataCoMPosition;)
422 DEPRECATED("Use ResidualModelFramePlacement with CostModelResidual",
424 DEPRECATED("Use ResidualDataFramePlacement", typedef CostDataResidualTpl<double> CostDataFramePlacement;)
425 DEPRECATED("Use ResidualModelImpulseCoM with CostModelResidual",
426  typedef CostModelImpulseCoMTpl<double> CostModelImpulseCoM;)
427 DEPRECATED("Use ResidualDataImpulseCoM", typedef CostDataResidualTpl<double> CostDataImpulseCoM;)
428 DEPRECATED("Use ResidualModelState with CostModelResidual", typedef CostModelStateTpl<double> CostModelState;)
429 DEPRECATED("Use ResidualDataState", typedef CostDataResidualTpl<double> CostDataState;)
430 DEPRECATED("Use ResidualModelControlGrav with CostModelResidual",
432 DEPRECATED("Use ResidualDataControlGrav", typedef CostDataResidualTpl<double> CostDataControlGrav;)
433 DEPRECATED("Use ResidualModelContactControlGrav with CostModelResidual",
434  typedef CostModelControlGravContactTpl<double> CostModelControlGravContact;)
435 DEPRECATED("Use ResidualDataContactControlGrav", typedef CostDataResidualTpl<double> CostDataControlGravContact;)
436 DEPRECATED("Use ResidualModelFrameVelocity with CostModelResidual",
438 DEPRECATED("Use ResidualDataFrameVelocity", typedef CostDataResidualTpl<double> CostDataFrameVelocity;)
439 DEPRECATED("Use ResidualModelFrameRotation with CostModelResidual",
440  typedef CostModelFrameRotationTpl<double> CostModelFrameRotation;)
441 DEPRECATED("Use ResidualDataFrameRotation", typedef CostDataResidualTpl<double> CostDataFrameRotation;)
442 DEPRECATED("Use ResidualModelCoPPosition with CostModelResidual",
444 DEPRECATED("Use ResidualDataCoPPosition", typedef CostDataResidualTpl<double> CostDataContactCoPPosition;)
445 DEPRECATED("Use ResidualModelContactFrictionCone with CostModelResidual",
446  typedef CostModelContactFrictionConeTpl<double> CostModelContactFrictionCone;)
447 DEPRECATED("Use ResidualDataContactFrictionCone", typedef CostDataResidualTpl<double> CostDataContactFrictionCone;)
448 DEPRECATED("Use ResidualModelContactWrenchCone with CostModelResidual",
450 DEPRECATED("Use ResidualDataContactWrenchCone", typedef CostDataResidualTpl<double> CostDataContactWrenchCone;)
451 DEPRECATED("Use ResidualModelContactForce with CostModelResidual",
452  typedef CostModelContactForceTpl<double> CostModelContactForce;)
453 DEPRECATED("Use ResidualDataContactForce", typedef CostDataResidualTpl<double> CostDataContactForce;)
454 DEPRECATED("Use ResidualModelContactForce with CostModelResidual",
456 DEPRECATED("Use ResidualDataContactForce", typedef CostDataResidualTpl<double> CostDataContactImpulse;)
457 DEPRECATED("Use ResidualModelFrictionCone with CostModelResidual",
458  typedef CostModelImpulseFrictionConeTpl<double> CostModelImpulseFrictionCone;)
459 DEPRECATED("Use ResidualDataContactFrictionCone", typedef CostDataResidualTpl<double> CostDataImpulseFrictionCone;)
460 DEPRECATED("Use ResidualModelContactCoPPosition with CostModelResidual",
462 DEPRECATED("Use ResidualDataContactCoPPosition", typedef CostDataResidualTpl<double> CostDataImpulseCoPPosition;)
463 DEPRECATED("Use ResidualModelContactWrenchCone with CostModelResidual",
464  typedef CostModelImpulseWrenchConeTpl<double> CostModelImpulseWrenchCone;)
465 DEPRECATED("Use ResidualDataContactWrenchCone", typedef CostDataResidualTpl<double> CostDataImpulseWrenchCone;)
466 
467 typedef ImpulseModelAbstractTpl<double> ImpulseModelAbstract;
469 
470 enum ContactType { Contact2D, Contact3D, Contact6D, ContactUndefined };
471 enum ImpulseType { Impulse3D, Impulse6D, ImpulseUndefined };
472 
473 typedef ContactItemTpl<double> ContactItem;
474 typedef ContactModelMultipleTpl<double> ContactModelMultiple;
475 typedef ContactDataMultipleTpl<double> ContactDataMultiple;
476 typedef ContactModel2DTpl<double> ContactModel2D;
477 typedef ContactData2DTpl<double> ContactData2D;
478 typedef ContactModel3DTpl<double> ContactModel3D;
479 typedef ContactData3DTpl<double> ContactData3D;
480 typedef ContactModel6DTpl<double> ContactModel6D;
481 typedef ContactData6DTpl<double> ContactData6D;
482 
483 typedef StateMultibodyTpl<double> StateMultibody;
484 
485 typedef DataCollectorMultibodyTpl<double> DataCollectorMultibody;
486 typedef DataCollectorActMultibodyTpl<double> DataCollectorActMultibody;
487 typedef DataCollectorContactTpl<double> DataCollectorContact;
488 typedef DataCollectorMultibodyInContactTpl<double> DataCollectorMultibodyInContact;
489 typedef DataCollectorActMultibodyInContactTpl<double> DataCollectorActMultibodyInContact;
490 typedef DataCollectorImpulseTpl<double> DataCollectorImpulse;
491 typedef DataCollectorMultibodyInImpulseTpl<double> DataCollectorMultibodyInImpulse;
492 
493 typedef ImpulseModel6DTpl<double> ImpulseModel6D;
494 typedef ImpulseData6DTpl<double> ImpulseData6D;
495 typedef ImpulseModel3DTpl<double> ImpulseModel3D;
496 typedef ImpulseData3DTpl<double> ImpulseData3D;
497 typedef ImpulseItemTpl<double> ImpulseItem;
498 typedef ImpulseModelMultipleTpl<double> ImpulseModelMultiple;
499 typedef ImpulseDataMultipleTpl<double> ImpulseDataMultiple;
500 
501 } // namespace crocoddyl
502 
503 #endif // CROCODDYL_MULTIBODY_FWD_HPP_
crocoddyl::CostModelContactFrictionConeTpl
Contact friction cone cost.
Definition: contact-friction-cone.hpp:48
crocoddyl::ResidualDataContactFrictionConeTpl
Definition: fwd.hpp:109
crocoddyl::ResidualModelFrameRotationTpl
Frame rotation residual.
Definition: fwd.hpp:137
crocoddyl::ActionModelImpulseFwdDynamicsTpl
Definition: impulse-fwddyn.hpp:34
crocoddyl::ImpulseDataAbstractTpl
Definition: fwd.hpp:263
crocoddyl::ForceDataAbstractTpl
Definition: force-base.hpp:21
crocoddyl::CostModelNumDiffTpl
Definition: cost.hpp:20
crocoddyl::ResidualModelContactCoPPositionTpl
Center of pressure residual function.
Definition: fwd.hpp:112
crocoddyl::DataCollectorImpulseTpl
Definition: impulses.hpp:21
crocoddyl::ResidualModelControlGravTpl
Control gravity residual.
Definition: fwd.hpp:127
crocoddyl::ResidualDataCoMPositionTpl
Definition: fwd.hpp:99
crocoddyl::FrameCoPSupportTpl
Definition: frames-deprecated.hpp:267
crocoddyl::CostModelFramePlacementTpl
Frame placement cost.
Definition: frame-placement.hpp:41
crocoddyl::DifferentialActionDataContactFwdDynamicsTpl
Definition: contact-fwddyn.hpp:92
crocoddyl::ResidualDataFrameVelocityTpl
Definition: fwd.hpp:149
crocoddyl::CostModelStateTpl
State cost.
Definition: state.hpp:37
crocoddyl::ContactModelNumDiffTpl
Definition: fwd.hpp:61
crocoddyl::CostModelFrameRotationTpl
Frame rotation cost.
Definition: frame-rotation.hpp:42
crocoddyl::ResidualModelContactWrenchConeTpl
Contact wrench cone residual function.
Definition: fwd.hpp:117
crocoddyl::ResidualModelContactControlGravTpl
Control gravity residual under contact.
Definition: fwd.hpp:122
crocoddyl::ResidualModelFramePlacementTpl
Frame placement residual.
Definition: fwd.hpp:132
crocoddyl::DataCollectorContactTpl
Definition: contacts.hpp:21
crocoddyl::ImpulseModel3DTpl
Definition: fwd.hpp:331
crocoddyl::ResidualDataCentroidalMomentumTpl
Definition: fwd.hpp:94
crocoddyl::ResidualModelCentroidalMomentumTpl
Centroidal momentum residual.
Definition: fwd.hpp:92
crocoddyl::ActuationModelMultiCopterBaseTpl
Multicopter actuation model.
Definition: multicopter-base.hpp:39
crocoddyl::CostModelFrameTranslationTpl
Frame translation cost.
Definition: frame-translation.hpp:42
crocoddyl::CostDataNumDiffTpl
Definition: cost.hpp:128
crocoddyl::FrameTranslationTpl
Definition: frames-deprecated.hpp:29
crocoddyl::ContactData2DTpl
Definition: contact-2d.hpp:141
crocoddyl::ContactItemTpl
Definition: multiple-contacts.hpp:23
crocoddyl::ContactModelAbstractTpl
Definition: contact-base.hpp:21
crocoddyl::ContactModel2DTpl
Definition: contact-2d.hpp:27
crocoddyl::CostModelContactImpulseTpl
Define a contact impulse cost function.
Definition: contact-impulse.hpp:44
crocoddyl::CostModelContactForceTpl
Define a contact force cost function.
Definition: contact-force.hpp:43
crocoddyl::ResidualModelFrameVelocityTpl
Frame velocity residual.
Definition: fwd.hpp:147
crocoddyl::ImpulseDataMultipleTpl
Define the multi-impulse data.
Definition: fwd.hpp:340
crocoddyl::FrameRotationTpl
Definition: frames-deprecated.hpp:64
crocoddyl::ImpulseModelMultipleTpl
Define a stack of impulse models.
Definition: fwd.hpp:338
crocoddyl::ResidualDataFrameTranslationTpl
Definition: fwd.hpp:144
crocoddyl::FramePlacementTpl
Definition: frames-deprecated.hpp:97
crocoddyl::CostModelImpulseCoPPositionTpl
Define a center of pressure cost function.
Definition: impulse-cop-position.hpp:59
crocoddyl::ResidualModelCoMPositionTpl
CoM position residual.
Definition: fwd.hpp:97
crocoddyl::ContactData6DTpl
Definition: contact-6d.hpp:137
crocoddyl::ImpulseData6DTpl
Definition: fwd.hpp:328
crocoddyl::ResidualModelFrameTranslationTpl
Frame translation residual.
Definition: fwd.hpp:142
crocoddyl::DifferentialActionModelContactFwdDynamicsTpl
Definition: contact-fwddyn.hpp:25
crocoddyl::DataCollectorMultibodyInImpulseTpl
Definition: impulses.hpp:32
crocoddyl::CostModelControlGravTpl
Control gravity cost.
Definition: control-gravity.hpp:36
crocoddyl::CostModelFrameVelocityTpl
Frame velocity cost.
Definition: frame-velocity.hpp:43
crocoddyl::StateMultibodyTpl
State multibody representation.
Definition: fwd.hpp:300
crocoddyl::ResidualDataStateTpl
Definition: fwd.hpp:159
crocoddyl::DifferentialActionModelFreeFwdDynamicsTpl
Definition: free-fwddyn.hpp:29
crocoddyl::CostModelImpulseWrenchConeTpl
Definition: impulse-wrench-cone.hpp:26
crocoddyl::ActionDataImpulseFwdDynamicsTpl
Definition: impulse-fwddyn.hpp:96
crocoddyl::CostModelCoMPositionTpl
CoM position cost.
Definition: com-position.hpp:37
crocoddyl::FrictionConeTpl
This class encapsulates a friction cone.
Definition: friction-cone.hpp:27
crocoddyl::ContactDataAbstractTpl
Definition: contact-base.hpp:82
crocoddyl::ResidualDataContactControlGravTpl
Definition: fwd.hpp:124
crocoddyl::ContactDataMultipleTpl
Define the multi-contact data.
Definition: multiple-contacts.hpp:242
crocoddyl::WrenchConeTpl
This class encapsulates a wrench cone.
Definition: fwd.hpp:292
crocoddyl::ResidualDataContactCoPPositionTpl
Definition: fwd.hpp:114
crocoddyl::ContactDataNumDiffTpl
Definition: fwd.hpp:63
crocoddyl::CostModelImpulseFrictionConeTpl
Impulse friction cone cost.
Definition: impulse-friction-cone.hpp:48
crocoddyl::DataCollectorMultibodyInContactTpl
Definition: contacts.hpp:32
crocoddyl::CoPSupportTpl
This class encapsulates a center of pressure support of a 6d contact.
Definition: cop-support.hpp:25
crocoddyl::ResidualModelContactFrictionConeTpl
Contact friction cone residual.
Definition: fwd.hpp:107
crocoddyl::ResidualDataContactForceTpl
Definition: fwd.hpp:104
crocoddyl::DifferentialActionDataFreeFwdDynamicsTpl
Definition: free-fwddyn.hpp:86
crocoddyl::CostModelContactCoPPositionTpl
Define a center of pressure cost function.
Definition: contact-cop-position.hpp:57
crocoddyl::ResidualModelImpulseCoMTpl
Impulse CoM residual.
Definition: fwd.hpp:152
crocoddyl::CostModelCentroidalMomentumTpl
Centroidal momentum cost.
Definition: centroidal-momentum.hpp:37
crocoddyl::ResidualDataFrameRotationTpl
Definition: fwd.hpp:139
crocoddyl::CostDataResidualTpl
Definition: residual.hpp:114
crocoddyl::ResidualModelStateTpl
State residual.
Definition: fwd.hpp:157
crocoddyl::ActuationModelFullTpl
Full actuation model.
Definition: full.hpp:28
crocoddyl::ImpulseItemTpl
Definition: fwd.hpp:336
crocoddyl::ImpulseData3DTpl
Definition: fwd.hpp:333
crocoddyl::CostModelContactWrenchConeTpl
Definition: contact-wrench-cone.hpp:26
crocoddyl::ImpulseModel6DTpl
Definition: fwd.hpp:326
crocoddyl::ResidualModelContactForceTpl
Define a contact force residual function.
Definition: fwd.hpp:102
crocoddyl::ResidualDataFramePlacementTpl
Definition: fwd.hpp:134
crocoddyl::ActuationModelFloatingBaseTpl
Definition: floating-base.hpp:19
crocoddyl::ResidualDataControlGravTpl
Definition: fwd.hpp:129
crocoddyl::CostModelImpulseCoMTpl
Impulse CoM cost.
Definition: impulse-com.hpp:39
crocoddyl::FrameFrictionConeTpl
Definition: frames-deprecated.hpp:211
crocoddyl::ContactData3DTpl
Definition: contact-3d.hpp:140
crocoddyl::FrameForceTpl
Definition: frames-deprecated.hpp:178
crocoddyl::ContactModel3DTpl
Definition: contact-3d.hpp:27
crocoddyl::ContactModelMultipleTpl
Define a stack of contact models.
Definition: multiple-contacts.hpp:54
crocoddyl::FrameMotionTpl
Definition: frames-deprecated.hpp:130
crocoddyl::CostModelControlGravContactTpl
Control gravity cost.
Definition: control-gravity-contact.hpp:38
crocoddyl::DataCollectorActMultibodyTpl
Definition: multibody.hpp:31
crocoddyl::FrameWrenchConeTpl
Definition: frames-deprecated.hpp:239
crocoddyl::DataCollectorMultibodyTpl
Definition: multibody.hpp:21
crocoddyl::DataCollectorActMultibodyInContactTpl
Definition: contacts.hpp:42
crocoddyl::ImpulseModelAbstractTpl
Definition: fwd.hpp:261
crocoddyl::ResidualDataImpulseCoMTpl
Definition: fwd.hpp:154
crocoddyl::ResidualDataContactWrenchConeTpl
Definition: fwd.hpp:119
crocoddyl::ContactModel6DTpl
Definition: contact-6d.hpp:24