/[suikacvs]/messaging/manakai/lib/Message/Util/ChangeLog
Suika

Diff of /messaging/manakai/lib/Message/Util/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.21 by wakaba, Fri Feb 18 06:13:52 2005 UTC revision 1.91 by wakaba, Wed Feb 8 16:37:35 2006 UTC
# Line 1  Line 1 
1    2006-02-08  Wakaba  <wakaba@suika.fam.cx>
2    
3            * PerlCode.dis (PCReference.stringify): Reference operator |\|
4            was missing.
5            
6    2006-02-08  Wakaba  <wakaba@suika.fam.cx>
7    
8            * PerlCode.dis (getNameListAttrR): Non-|pc:|-namespace elements
9            and their descendants were ignored.
10            (getNameListAttrRM): New variant derived from |getNameListAttrR|,
11            for |getUsePerlModuleNameList| and |getUseCharClassNameList|.
12            (getUsePerlModuleNameList, getUseCharClassNameList): Don't
13            include |pc:package| and their descendants to the target.
14            (PerlFile.stringify): Outputs |use| statements
15            for Perl modules and character classes not part of any package,
16            if any.
17    
18            * DIS.dis: |lang:tdterr|'s |DVNSValue| convertion is supported.
19    
20    2006-02-06  Wakaba  <wakaba@suika.fam.cx>
21    
22            * DIS.dis (loadModule): Loads a "daem" submodule file
23            if exists.
24    
25    2006-01-30  Wakaba  <wakaba@suika.fam.cx>
26    
27            * Makefile: Typo fixed.
28    
29    2006-01-29  Wakaba  <wakaba@suika.fam.cx>
30    
31            * Makefile: Updated to be consist with |../DOM/Makefile|.
32    
33            * DIS.dis (parse): Parameter |input|'s type is
34            changed from |DOMLS:LSInput| to |DISPerl:HASH| to
35            remove dependency on |MDOM:DOMLS| module.
36    
37    2006-01-29  Wakaba  <wakaba@suika.fam.cx>
38    
39            * PerlCode.dis (skipLines): Its code was incorrect.
40            (createPCLiteral): Creates a |undef| keyword node
41            for an |undef| value.  Tests added.
42    
43    2006-01-25  Wakaba  <wakaba@suika.fam.cx>
44    
45            * ManakaiNodeTest.dis: Tests for |mn:subnode2| hash-hash added.
46    
47    2006-01-24  Wakaba  <wakaba@suika.fam.cx>
48    
49            * ManakaiNodeTest.dis: Tests added.
50    
51    2006-01-23  Wakaba  <wakaba@suika.fam.cx>
52    
53            * .cvsignore: |ManakaiNodeTest.pm| added.
54    
55    2006-01-23  Wakaba  <wakaba@suika.fam.cx>
56    
57            * ManakaiNodeTest.dis: New module.
58    
59            * Makefile: |ManakaiNodeTest.dis| added.
60    
61    2006-01-22  Wakaba  <wakaba@suika.fam.cx>
62    
63            * PerlCode.dis: Fixed not |getAttributeNS| to cause
64            uninitialized value warnings.
65    
66    2006-01-19  Wakaba  <wakaba@suika.fam.cx>
67    
68            * PerlCode.dis (PCPackage.stringify): Appends a string
69            representation of non-|pc:*| element children for
70            the stringified value.
71    
72    2006-01-07  Wakaba  <wakaba@suika.fam.cx>
73    
74            * Makefile: |../DOM/XDoctype.dis| added.
75    
76    2005-12-27  Wakaba  <wakaba@suika.fam.cx>
77    
78            * PerlCode.dis (PCReference): New interface.
79    
80    2005-12-24  Wakaba  <wakaba@suika.fam.cx>
81    
82            * PerlCode.dis (PerlSub.clearPerlName): New method.
83            (PCDocument.createPCLiteral): Adopts |PerlCode| node
84            if it is a foreign one.
85    
86            * DIS.dis (underscoreNameToCamelCaseName): A |HYPHEN-MINUS|
87            character is replaced to |UNDERLINE| character.
88    
89    2005-12-21  Wakaba  <wakaba@suika.fam.cx>
90    
91            * Makefile: |dpg.dae| rule merged into |discore.dae| rule.
92    
93    2005-12-20  Wakaba  <wakaba@suika.fam.cx>
94    
95            * DIS.dis: DPG format support added.
96    
97    2005-12-18  Wakaba  <wakaba@suika.fam.cx>
98    
99            * PerlCode.dis (PCDocument.createPerlSub): New method.
100    
101            * Makefile: Rules to make |DIS/DPG.pm| added.
102    
103    2005-12-18  Wakaba  <wakaba@suika.fam.cx>
104    
105            * PerlCode.dis (PCExpression.stringify): More operators supported.
106            (PCDocument.createPCStatement): New method.
107    
108    2005-12-17  Wakaba  <wakaba@suika.fam.cx>
109    
110            * PerlCode.dis (PCWhen): New interface.
111    
112    2005-12-16  Wakaba  <wakaba@suika.fam.cx>
113    
114            * PerlCode.dis (PCNumberLiteral, PCDereference, PCApply): New interfaces.
115            (arrayRefLiteral, hashRefLiteral): Typos in element type names fixed.
116            (PCExpression.stringify): Outputs children other than expression.
117            Inserts space before and after operators if desired.
118    
119    2005-12-15  Wakaba  <wakaba@suika.fam.cx>
120    
121            * PerlCode.dis (PCCondition, PCBlock): New interface.
122            (ManakaiPCBlock): Renamed as |ManakaiPerlCodeBlock| to
123            distingulish new |ManakaiPCBlock| class implementing new |PCBlock|
124            interface.
125    
126    2005-12-14  Wakaba  <wakaba@suika.fam.cx>
127    
128            * PerlCode.dis (PCExpression, PCChoose, PCWhen, PCOtherwise): New
129            interfaces and element types.
130            (getChildElementByType): New code.
131            (PCFunctionCall): New interface and element type.
132    
133    2005-11-24  Wakaba  <wakaba@suika.fam.cx>
134    
135            * DIS.dis (stringify): Returns |DIS:uri| error parameter if available.
136    
137    2005-11-23  Wakaba  <wakaba@suika.fam.cx>
138    
139            * Error.pm (new): Sets |-stacktrace_| property if debug
140            or verbose mode.
141            (stringify): Appends longer trace if debug or verbose mode.
142            ($VERBOSE): New flag.
143    
144            * DIS.dis: Bugs on error depth fixed.
145            
146    2005-11-23  Wakaba  <wakaba@suika.fam.cx>
147    
148            * DIS.dis (text): New attribute implementation.
149    
150            * ManakaiNode.dis (destroyNodeStem): New method.
151    
152    2005-11-20  Wakaba  <wakaba@suika.fam.cx>
153    
154            * Makefile: |../DOM/Tree.dis| added.
155    
156    2005-11-17  Wakaba  <wakaba@suika.fam.cx>
157    
158            * Makefile: |Formatter/Muf2003.dis| added to file list.
159    
160            * DIS.dis (DISModuleLite): Typo in |ISA| property fixed.
161    
162    2005-11-16  Wakaba  <wakaba@suika.fam.cx>
163    
164            * .cvsignore: New file.
165            
166    2005-11-16  Wakaba  <wakaba@suika.fam.cx>
167    
168            * PerlCode.dis: A test code added.  Typos in |ISA|
169            properties fixed.
170            (PerlSub.stringify): Generates prototype specification
171            even if |prototype| attribute value's length is zero
172            in case the |pc:prototype| attribute /is/ found.
173    
174    2005-11-15  Wakaba  <wakaba@suika.fam.cx>
175    
176            * Makefile: Missing rule to make |Message/DOM/core.dae| added.
177    
178    2005-11-15  Wakaba  <wakaba@suika.fam.cx>
179    
180            * Makefile: Rules to make |DIS/Test.pm| added. |DIS/common.dis| rules
181            added.
182    
183            * DIS.dis (DIS:): Removed (moved to |DIS/common.dis|).
184    
185    2005-11-13  Wakaba  <wakaba@suika.fam.cx>
186    
187            * PerlCode.dis (PCList, PCArrayRefLiteral, PCHashRefLiteral):
188            New interfaces.
189            (createPCLiteral, appendNewPCLiteral): New methods.
190            (PCDocument): New interface.
191            (factory methods): Namespace URI and local name of document
192            element arguments added to |createDocument| to obtain
193            an instance of |PCDocument|.
194    
195    2005-10-16  Wakaba  <wakaba@suika.fam.cx>
196    
197            * PerlCode.dis (pc:line): New configuration parameter.
198            (stringify): Don't output "#line" directive
199            unless "pc:line" parameter is set to "true".
200            (pc:split-resolver): New configuration parameter.
201    
202    2005-10-14  Wakaba  <wakaba@suika.fam.cx>
203    
204            * ManakaiNode.dis (anydata0): New property type.
205    
206            * PerlCode.dis (stringify): Prints node id if file name
207            is not available.
208            (perlLiteral): Prints as is if the value is blessed
209            with "manakai::code" package.
210    
211    2005-10-13  Wakaba  <wakaba@suika.fam.cx>
212    
213            * PerlCode.dis (CDATADOMString): Changed to use code
214            fragment defined in DOMCore module directly.
215    
216    2005-10-12  Wakaba  <wakaba@suika.fam.cx>
217    
218            * PerlCode.dis (ForClassCompat): Removed.
219    
220            * ManakaiNode.dis (ManakaiDOMNodeObject, ManakaiDOMNodeReference):
221            Removed.
222            (newNode): New method.
223            (generateUniqueID): Algorithm has changed to save random
224            string generation time.
225    
226            * DIS.dis (AUTOLOAD): "$Error::Level" fixed to "$Error::Depth".
227    
228    2005-10-11  Wakaba  <wakaba@suika.fam.cx>
229    
230            * PerlCode.dis (IfClsDef, IFClsETDef): New version of classes based
231            on DOMCore and element type definitions added.
232            (localName): Renamed to "pcLocalName" to avoid
233            conflict with "Node.localName" attribute.
234    
235    2005-10-10  Wakaba  <wakaba@suika.fam.cx>
236    
237            * DIS.dis (Require): Unused reference to "PerlCode.dis" removed.
238    
239            * Makefile: Rules to make "PerlCode.pm" separated
240            from ones for "DIS.pm".
241    
242            * ManakaiNode.dis (mn:unsetXRefNode): "$referent"
243            parameter is replaced with "$referrer->{$propName}".
244    
245            * PerlCode.dis (Require): References "DOMCore.dis".
246            (DefaultFor): Changed to "ManakaiDOM:ManakaiDOMLatest".
247            (Util: for ManakaiDOM:ManakaiDOM): New.
248    
249    2005-10-09  Wakaba  <wakaba@suika.fam.cx>
250    
251            * ManakaiNode.dis: New "mn:xrefnode0" property type has
252            been introduced and methods are fixed to support it.
253            (mn:setXRefNode, mn:unsetXRefNode): New codes.
254    
255            * DIS.dis (loadResource): Skips a root resource definition
256            if it is an alias and it has "dis:Name" attribute and
257            referenced canonical definition is already read.  (Note
258            that similar case that the resource definition has "dis:QName"
259            attribute is already fixed in the same way.)
260    
261    2005-10-08  Wakaba  <wakaba@suika.fam.cx>
262    
263            * DIS.dis (readProperties): Recognizes hexdecimal
264            in "DISCore:Integer" (prefixed by "0x").
265    
266    2005-10-08  Wakaba  <wakaba@suika.fam.cx>
267    
268            * PerlCode.dis (getExceptionInterfacePackageNameList,
269            addExceptionInterfacePackageName): New methods.
270            (ToString): Sorts hash keys where they result in
271            the order of statements in result code.
272    
273            * Error.pm ($DEBUG): New option variable.
274            (___get_error_def): Calls "___error_def" method in second or later "@ISA"
275            package even if elder package has "___error_def" method.
276    
277            * DIS.dis: Now constant values are only defined
278            in interfaces.
279            (DIS:NO_EXCEPTION_CLASS_ERR): New exception subcode.
280    
281    2005-10-06  Wakaba  <wakaba@suika.fam.cx>
282    
283            * DIS.dis (getAnyResourceURIList, getModuleURIList): New methods.
284    
285    2005-10-02  Wakaba  <wakaba@suika.fam.cx>
286    
287            * DIS.dis (getAnyResource): New method.
288            (isTypeURI): Now it is a method of "DIS:DISAnyResource" interface.
289            (getPropertyResource, getPropertyResourceList): Now
290            they uses "getAnyResource" method.
291            (getPropertyModuleList): Removed.
292    
293    2005-09-30  Wakaba  <wakaba@suika.fam.cx>
294    
295            * DIS.dis (readProperties): Saves property name to values.
296            (getPropertyModuleList): New method.
297    
298    2005-09-29  Wakaba  <wakaba@suika.fam.cx>
299    
300            * DIS.dis: Shares local name, namespace URI and for URI
301            if possible.
302    
303            * PerlCode.dis (stringify): Sorts "require" statements by module
304            name.
305    
306    2005-09-28  Wakaba  <wakaba@suika.fam.cx>
307    
308            * PerlCode.dis (perlLiteral): Sorts output by hash key.
309            
310            * ManakaiNode.dis (new): Sets "mn:groveReferenceCounter"
311            property.
312            (getNewReference): Increments "mn:groveReferenceCounter"
313            property.
314            (ManakaiDOM:ManakaiDOMNodeObject, ManakaiNodeStem): Don't
315            check "defined" to allow "undef" value in "while" condition.
316            (mn:isGroveReferenced): New code.
317            (changeTreeID): New "groveRC" parameter added.
318            (importTree, changeTreeID): Updates "mn:groveReferenceCounter"
319            properties.
320            (destroy): Uses "mn:isGroveReferenced" instead of "isExternallyReferred".
321            (mn:groveReferenceCounter): New property.
322    
323    2005-09-28  Wakaba  <wakaba@suika.fam.cx>
324    
325            * DIS.dis: Use "tag:" URI for internal URIs.
326    
327    2005-09-27  Wakaba  <wakaba@suika.fam.cx>
328    
329            * ManakaiNode.dis (ManakaiNodeStem->new): Don't set "TreeCore:*"
330            properties.
331            (generateUniqueID): Use "tag:" URI.
332    
333            * DIS.dis (targetNamespaceURI): New attribute.
334            (ManakaiDISModuleLite): Extends dx:ManakaiDefaultErrorHandler.
335            (ManakaiDISModuleLite->AUTOLOAD): Don't load module
336            if method name is "DESTROY".
337    
338    2005-09-27  Wakaba  <wakaba@suika.fam.cx>
339    
340            * ManakaiNode.dis (ManakaiNodeStem): Use per-class
341            variable for searching noderel properties instead
342            of per-node properties.
343    
344    2005-09-26  Wakaba  <wakaba@suika.fam.cx>
345    
346            * ManakaiNode.dis (new): New "className" parameter added.
347            (mn:NodeRefRole): New role.
348            (mn:type): New property.
349            (mn:subnode0, mn:subnode1, mn:subnode2, mn:irefnode0,
350            mn:origin0, mn:anydata1, mn:anydata2, mn:noderef): New properties.
351    
352            * Makefile: Rules to make "DIS/DISDump" is separeted
353            from "DIS/DISDoc".
354    
355            * DIS.dis (getFor): Loads database module if unread
356            "for" is referenced.
357            (addResourceList, getResourceList): New method.
358            (ManakaiDISModuleLite): New class.
359    
360    2005-09-25  Wakaba  <wakaba@suika.fam.cx>
361    
362            * DIS.dis (RESOURCE_NOT_DEFINED_ERR): New error code.
363            (getResource): New "dae" and "daem" database format support.
364            (DISResourceList): New type.
365            (uriRef, ownerModuleURI, ownerModuleURIRef): New attributes.
366            (addChildResource, addDynamicChildResource): New methods.
367            (getChildResourceList, getDynamicChildResourceList): New method.
368            (getChildResourceListByType): New method.
369            (parentResource, dynamicParentResource): New attributes.
370    
371            * Makefile (DAC_SUFFIX): Changed to ".dae".
372            (DAEM_SUFFIX): New.
373    
374    
375    2005-09-24  Wakaba  <wakaba@suika.fam.cx>
376    
377            * ManakaiNode.dis: Use "disPerl:H" instead
378            of "disPerl:Q" for hash keys.
379            (NodeStem): Property value "mn:treeID"
380            has changed to scalar reference.
381    
382    2005-09-24  Wakaba  <wakaba@suika.fam.cx>
383    
384            * ManakaiNode.dis (mn:node, mn:nodeID, mn:treeID): New
385            properties.
386            (mn:stemName, mn:refName): New properties.
387    
388            * Makefile (.discore-all.pm): New rule to create dis-related
389            Perl module files at once.
390    
391            * DIS.dis (PERL_HASH_KEY_ALREADY_DEFINED_ERR): New error code.
392            (hashKeyName, hashKeyScope, anotherURI): New error parameters.
393    
394            * ManakaiNode.dis, DIS.dis, PerlCode.dis: Use "disPerl:H" instead
395            of "disPerl:Q" for hash keys.
396    
397    2005-09-23  Wakaba  <wakaba@suika.fam.cx>
398    
399            * DIS.dis (DISParser.new): New method.
400            (hasFeature): Removed.  ManakaiDISAnyResource now
401            extends DOMFeature:ManakaiHasFeatureByGetFeature.
402            (readProperties): Support for property value data
403            types DISLang:MemberRef and dx:XCRef added.
404            (ManakaiDISExceptionTarget): It is now an alias
405            for dx:ManakaiDefaultExceptionHandler.
406    
407    2005-09-22  Wakaba  <wakaba@suika.fam.cx>
408    
409            * Makefile: DAC_SUFFIX changed to ".dad".
410    
411            * DIS.dis (Util:): Added for DIS|ForEmpty and DIS|ForLatest.
412            (disIsNullable): Reimplemented.
413    
414    2005-09-21  Wakaba  <wakaba@suika.fam.cx>
415    
416            * DIS.dis (addNamespaceBinding): New method.
417    
418    2005-09-20  Wakaba  <wakaba@suika.fam.cx>
419    
420            * DIS.dis: Use valueRef and nodeIDRef where possible so
421            that dad file can share text data if possible.
422            For resources, {subOf} and {supOf} is now optional.
423            (sourceNodeIDRef): New attribute.
424    
425    2005-09-19  Wakaba  <wakaba@suika.fam.cx>
426    
427            * DIS.dis: Parameter "databaseArg" added to various
428            methods to support objects that have no associated
429            database.
430            (getNamespaceBindingList, getDefaultNamespaceURIRef): New
431            methods.
432            (NO_RDF_TYPE_ERR): New error type.
433            (loadResource): Throws NO_RDF_TYPE_ERR if no rdf:type
434            attribute specified for a resource definition.
435    
436    2005-09-16  Wakaba  <wakaba@suika.fam.cx>
437    
438            * DIS.dis (DISResourceProp): Methods reimplemented to
439            support DIS/Value values.
440    
441    2005-09-15  Wakaba  <wakaba@suika.fam.cx>
442    
443            * DIS.dis (readProperties): New methods.  Emploies DIS/Value
444            classes for internal data structure.
445    
446    2005-09-14  Wakaba  <wakaba@suika.fam.cx>
447    
448            * DIS.dis: Now references DIS/Value.dis.
449            (DISAnyResource): New interface separeted from DISModule.
450            DISFor and DISResource.
451    
452    2005-09-13  Wakaba  <wakaba@suika.fam.cx>
453    
454            * DIS.dis: Perl-related methods are moved to a separate
455            module "DIS/Perl.dis".
456    
457    2005-09-08  Wakaba  <wakaba@suika.fam.cx>
458    
459            * Makefile: Renewaled.
460    
461            * ManakaiNode.dis (free): New method.
462    
463    2005-09-07  Wakaba  <wakaba@suika.fam.cx>
464    
465            * DIS.dis: Interfaces added.
466            (free): New method.
467    
468            * PerlCode.dis: Interfaces added.
469    
470    2005-09-06  Wakaba  <wakaba@suika.fam.cx>
471    
472            * DIS.dis (plName): Use AppName attribute, if any,
473            for ManakaiDOM:ConstGroup resources.
474    
475    2005-09-05  Wakaba  <wakaba@suika.fam.cx>
476    
477            * DIS.dis (plGeneratePerlModuleFile): Don't generate code for
478            the same class or variable twice whose alias is defined
479            in the same module.
480    
481    2005-09-04  Wakaba  <wakaba@suika.fam.cx>
482    
483            * PerlCode.dis (ManakaiPerlSub.IntClone): Copies pc:localName
484            and pc:prortotype properties.
485    
486            * DIS.dis (plAdditionalISAPackages): New attribute.
487    
488    2005-09-01  Wakaba  <wakaba@suika.fam.cx>
489    
490            * DIS.dis (plCodeFragment): The ManakaiDOM:boolean datatype
491            supported.
492    
493    2005-08-31  Wakaba  <wakaba@suika.fam.cx>
494    
495            * DIS.dis (uris): New attribute.
496    
497    2005-08-30  Wakaba  <wakaba@suika.fam.cx>
498    
499            * DIS.dis (plFilePathStem): New attribute.
500    
501    2005-08-29  Wakaba  <wakaba@suika.fam.cx>
502    
503            * DIS.dis (plFileNameStem): New attribute.
504    
505    2005-08-28  Wakaba  <wakaba@suika.fam.cx>
506    
507            * DIS.dis (plCodeFragment): Type ManakaiDOM:InCase supported.
508    
509    2005-08-26  Wakaba  <wakaba@suika.fam.cx>
510    
511            * DIS.dis: Typo fixed for replacing namespace URI and local name
512            in reflecting code.
513            (mvLocalName, mvNamespaceURI): Use "localName" and "namespaceURI"
514            attribute values as their default.
515            (mvPrefix, qnameValuePrefix): New attributes.
516    
517            * ManakaiNode.dis: Tests whether "defined" rather than true or not
518            in "while" conditions.
519    
520    2005-08-15  Wakaba  <wakaba@suika.fam.cx>
521    
522            * ManakaiNode.dis (Util:): Now Perl package name for interfaces
523            is defined.
524    
525            * DIS.dis (mediaTypeURI): Returns $defaultMediaType
526            parameter value if dis:ContentType attribute is missing.
527    
528            * ManakaiNode.dis (importTree): Use "isa" function
529            to check whether a object is an instance of the manakai
530            node model.
531            (NodeStem, NodeRef): New lightweight variant
532            of ManakaiDOM:ManakaiDOMNodeObject
533            and ManakaiDOM:ManakaiDOMNodeReference.
534    
535    2005-05-29  Wakaba  <wakaba@suika.fam.cx>
536    
537            * DIS.dis (plGeneratePerlModuleFile): Bug fixed so that
538            even if DOMMetaImpl:provideFeature has child nodes but
539            they are not DOMMetaImpl:providedThrough a ImplFeature
540            statement is generated.
541            (plCodeFragment): Bug fixed so that dis:SetProp works correctly.
542    
543    2005-05-26  Wakaba  <wakaba@suika.fam.cx>
544    
545            * Makefile: Rules for DISDoc module added.
546    
547    2005-05-23  Wakaba  <wakaba@suika.fam.cx>
548    
549            * DIS.dis (ManakaiDISResourceDefinition, ManakaiDISForDefinition,
550            ManakaiDISModuleDefinition): "getFeature" method added.
551    
552    2005-03-06  Wakaba  <wakaba@suika.fam.cx>
553    
554            * DIS.dis (Require): Loads PerlCode module.
555    
556    2005-03-05  Wakaba  <wakaba@suika.fam.cx>
557    
558            * PerlCode.dis: Operator overloading is implemented.
559    
560    2005-03-04  Wakaba  <wakaba@suika.fam.cx>
561    
562            * ManakaiNode.dis: Checks type, to support SuikaWikiConfig21
563            module's binding properties.
564    
565    2005-03-03  Wakaba  <wakaba@suika.fam.cx>
566    
567            * PerlCode.dis: New module.
568    
569    2005-02-26  Wakaba  <wakaba@suika.fam.cx>
570    
571            * DIS.dis (DISModuleResolver): New interface.
572    
573    2005-02-21  Wakaba  <wakaba@suika.fam.cx>
574    
575            * DIS.dis: New module.
576    
577            * ManakaiNode.dis: New "subnode0" property category introduced.
578    
579  2005-02-17  Wakaba  <wakaba@suika.fam.cx>  2005-02-17  Wakaba  <wakaba@suika.fam.cx>
580    
581          * ManakaiNode.dis: New module.          * ManakaiNode.dis: New module.

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.91

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24