Index | index by Group | index by Distribution | index by Vendor | index by creation date | index by Name | Mirrors | Help | Search |
Name: ruby3.3-rubygem-regexp_parser | Distribution: openSUSE Tumbleweed |
Version: 2.9.2 | Vendor: openSUSE |
Release: 1.1 | Build date: Fri Jun 21 12:33:55 2024 |
Group: Development/Languages/Ruby | Build host: reproducible |
Size: 284049 | Source RPM: rubygem-regexp_parser-2.9.2-1.1.src.rpm |
Packager: http://bugs.opensuse.org | |
Url: https://github.com/ammar/regexp_parser | |
Summary: Scanner, lexer, parser for ruby's regular expressions |
A library for tokenizing, lexing, and parsing Ruby regular expressions.
MIT
* Fri Jun 21 2024 Dan Čermák <dan.cermak@posteo.net> - New upstream release 2.9.2, no changelog found * Mon Jan 29 2024 Dan Čermák <dan.cermak@posteo.net> - New upstream release 2.9.0, no changelog found * Tue Nov 14 2023 Dan Čermák <dan.cermak@posteo.net> - New upstream release 2.8.2, no changelog found * Wed Dec 07 2022 Stephan Kulow <coolo@suse.com> updated to version 2.6.1 see installed CHANGELOG.md [#]# [2.6.1] - 2022-11-16 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Fixed - fixed scanning of two negative lookbehind edge cases * `(?<!x)y>` used to raise a ScannerError * `(?<!x>)y` used to be misinterpreted as a named group * thanks to [Sergio Medina](https://github.com/serch) for the report * Mon Oct 10 2022 Stephan Kulow <coolo@suse.com> updated to version 2.6.0 see installed CHANGELOG.md [#] Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). * Mon Jun 13 2022 Manuel Schnitzer <mschnitzer@suse.com> - updated to version 2.5.0 [#]## Added - `Regexp::Expression::Base.construct` and `.token_class` methods * see the [wiki](https://github.com/ammar/regexp_parser/wiki) for details * Mon May 16 2022 Manuel Schnitzer <mschnitzer@suse.com> - updated to version 2.4.0 [#]## Fixed - fixed interpretation of `+` and `?` after interval quantifiers (`{n,n}`) - they used to be treated as reluctant or possessive mode indicators - however, Ruby does not support these modes for interval quantifiers - they are now treated as chained quantifiers instead, as Ruby does it - c.f. [#3](https://github.com/ammar/regexp_parser/issues/3) - fixed `Expression::Base#nesting_level` for some tree rewrite cases - e.g. the alternatives in `/a|[b]/` had an inconsistent nesting_level - fixed `Scanner` accepting invalid posix classes, e.g. `[[:foo:]]` - they raise a `SyntaxError` when used in a Regexp, so could only be passed as String - they now raise a `Regexp::Scanner::ValidationError` in the `Scanner` [#]## Added - added `Expression::Base#==` for (deep) comparison of expressions - added `Expression::Base#parts` - returns the text elements and subexpressions of an expression - e.g. `parse(/(a)/)[0].parts # => ["(", #<Literal @text="a"...>, ")"]` - added `Expression::Base#te` (a.k.a. token end index) - `Expression::Subexpression` always had `#te`, only terminal nodes lacked it so far - made some `Expression::Base` methods available on `Quantifier` instances, too - `#type`, `#type?`, `#is?`, `#one_of?`, `#options`, `#terminal?` - `#base_length`, `#full_length`, `#starts_at`, `#te`, `#ts`, `#offset` - `#conditional_level`, `#level`, `#nesting_level` , `#set_level` - this allows a more unified handling with `Expression::Base` instances - allowed `Quantifier#initialize` to take a token and options Hash like other nodes - added a deprecation warning for initializing Quantifiers with 4+ arguments: Calling `Expression::Base#quantify` or `Quantifier.new` with 4+ arguments is deprecated. It will no longer be supported in regexp_parser v3.0.0. Please pass a Regexp::Token instead, e.g. replace `type, text, min, max, mode` with `::Regexp::Token.new(:quantifier, type, text)`. min, max, and mode will be derived automatically. This is consistent with how Expression::Base instances are created. * Thu Apr 28 2022 Stephan Kulow <coolo@suse.com> updated to version 2.3.1 see installed CHANGELOG.md [#]# [Unreleased] [#]# [2.3.1] - 2022-04-24 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Fixed - removed five inexistent unicode properties from `Syntax#features` - these were never supported by Ruby but incorrectly accepted by the parser - thanks to [Markus Schirp](https://github.com/mbj) for the report [#]# [2.3.0] - 2022-04-08 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Added - improved parsing performance through `Syntax` refactoring - instead of fresh `Syntax` instances, pre-loaded constants are now re-used - this approximately doubles the parsing speed for simple regexps - added methods to `Syntax` classes to show relative feature sets - e.g. `Regexp::Syntax::V3_2_0.added_features` - support for new unicode properties of Ruby 3.2 / Unicode 14.0 * Tue Feb 15 2022 Stephan Kulow <coolo@suse.com> updated to version 2.2.1 see installed CHANGELOG.md * Sat Dec 25 2021 Manuel Schnitzer <mschnitzer@suse.com> - updated to version 2.2.0 [#]## Added - Added support for 13 new unicode properties introduced in Ruby 3.1.0-dev * Tue Mar 16 2021 Manuel Schnitzer <mschnitzer@suse.com> - updated to version 2.1.1 [#]# [2.1.1] - 2021-02-23 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Fixed - fixed `NameError` when requiring only `'regexp_parser/scanner'` in v2.1.0 * thanks to [Jared White and Sam Ruby](https://github.com/ruby2js/ruby2js) for the report [#]# [2.1.0] - 2021-02-22 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Added - common ancestor for all scanning/parsing/lexing errors * `Regexp::Parser::Error` can now be rescued as a catch-all * the following errors (and their many descendants) now inherit from it: - `Regexp::Expression::Conditional::TooManyBranches` - `Regexp::Parser::ParserError` - `Regexp::Scanner::ScannerError` - `Regexp::Scanner::ValidationError` - `Regexp::Syntax::SyntaxError` * it replaces `ArgumentError` in some rare cases (`Regexp::Parser.parse('?')`) * thanks to [sandstrom](https://github.com/sandstrom) for the cue [#]## Fixed - fixed scanning of whole-pattern recursion calls `\g<0>` and `\g'0'` * a regression in v2.0.1 had caused them to be scanned as literals - fixed scanning of some backreference and subexpression call edge cases * e.g. `\k<+1>`, `\g<x-1>` - fixed tokenization of some escapes in character sets * `.`, `|`, `{`, `}`, `(`, `)`, `^`, `$`, `?`, `+`, `*` * all of these correctly emitted `#type` `:literal` and `#token` `:literal` if *not* escaped * if escaped, they emitted e.g. `#type` `:escape` and `#token` `:group_open` for `[\(]` * the escaped versions now correctly emit `#type` `:escape` and `#token` `:literal` - fixed handling of control/metacontrol escapes in character sets * e.g. `[\cX]`, `[\M-\C-X]` * they were misread as bunch of individual literals, escapes, and ranges - fixed some cases where calling `#dup`/`#clone` on expressions led to shared state * Wed Jan 20 2021 Stephan Kulow <coolo@suse.com> updated to version 2.0.3 see installed CHANGELOG.md [#]# [2.0.3] - 2020-12-28 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Fixed - fixed error when scanning some unlikely and redundant but valid charset patterns - e.g. `/[[.a-b.]]/`, `/[[=e=]]/`, - fixed ancestry of some error classes related to syntax version lookup - `NotImplementedError`, `InvalidVersionNameError`, `UnknownSyntaxNameError` - they now correctly inherit from `Regexp::Syntax::SyntaxError` instead of Rubys `::SyntaxError` [#]# [2.0.2] - 2020-12-25 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Fixed - fixed `FrozenError` when calling `#to_s` on a frozen `Group::Passive` * thanks to [Daniel Gollahon](https://github.com/dgollahon) [#]# [2.0.1] - 2020-12-20 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Fixed - fixed error when scanning some group names * this affected names containing hyphens, digits or multibyte chars, e.g. `/(?<a1>a)/` * thanks to [Daniel Gollahon](https://github.com/dgollahon) for the report - fixed error when scanning hex escapes with just one hex digit * e.g. `/\x0A/` was scanned correctly, but the equivalent `/\xA/` was not * thanks to [Daniel Gollahon](https://github.com/dgollahon) for the report [#]# [2.0.0] - 2020-11-25 - [Janosch Müller](mailto:janosch84@gmail.com) [#]## Changed - some methods that used to return byte-based indices now return char-based indices * the returned values have only changed for Regexps that contain multibyte chars * this is only a breaking change if you used such methods directly AND relied on them pointing to bytes * affected methods: * `Regexp::Token` `#length`, `#offset`, `#te`, `#ts` * `Regexp::Expression::Base` `#full_length`, `#offset`, `#starts_at`, `#te`, `#ts` * thanks to [Akinori MUSHA](https://github.com/knu) for the report - removed some deprecated methods/signatures * these are rarely used and have been showing deprecation warnings for a long time * `Regexp::Expression::Subexpression.new` with 3 arguments * `Regexp::Expression::Root.new` without a token argument * `Regexp::Expression.parsed` [#]## Added - `Regexp::Expression::Base#base_length` * returns the character count of an expression body, ignoring any quantifier - pragmatic, experimental support for chained quantifiers * e.g.: `/^a{10}{4,6}$/` matches exactly 40, 50 or 60 `a`s * successive quantifiers used to be silently dropped by the parser * they are now wrapped with passive groups as if they were written `(?:a{10}){4,6}` * thanks to [calfeld](https://github.com/calfeld) for reporting this a while back [#]## Fixed - incorrect encoding output for non-ascii comments * this led to a crash when calling `#to_s` on parse results containing such comments * thanks to [Michael Glass](https://github.com/michaelglass) for the report - some crashes when scanning contrived patterns such as `'\😋'`
/usr/lib64/ruby/gems/3.3.0/build_info /usr/lib64/ruby/gems/3.3.0/cache/regexp_parser-2.9.2.gem /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2 /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/Gemfile /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/LICENSE /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/Rakefile /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/error.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/base.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/alternation.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/anchor.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/backreference.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/character_set /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/character_set.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/character_set/intersection.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/character_set/range.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/character_type.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/conditional.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/escape_sequence.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/free_space.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/group.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/keep.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/literal.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/posix_class.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/root.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/classes/unicode_property.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/construct.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/human_name.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/match.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/match_length.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/negative.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/options.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/parts.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/printing.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/strfregexp.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/tests.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/methods/traverse.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/quantifier.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/sequence.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/sequence_operation.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/shared.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/expression/subexpression.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/lexer.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/parser.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/char_type.rl /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/errors /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/errors/premature_end_error.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/errors/scanner_error.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/errors/validation_error.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/properties /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/properties/long.csv /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/properties/short.csv /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/property.rl /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/scanner/scanner.rl /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/any.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/base.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/anchor.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/assertion.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/backreference.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/character_set.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/character_type.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/conditional.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/escape.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/group.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/keep.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/meta.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/posix_class.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/quantifier.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/unicode_property.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/token/virtual.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/version_lookup.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/1.8.6.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/1.9.1.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/1.9.3.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.0.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.2.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.3.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.4.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.4.1.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.5.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.6.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.6.2.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/2.6.3.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/3.1.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/syntax/versions/3.2.0.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/token.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/lib/regexp_parser/version.rb /usr/lib64/ruby/gems/3.3.0/gems/regexp_parser-2.9.2/regexp_parser.gemspec /usr/lib64/ruby/gems/3.3.0/specifications/regexp_parser-2.9.2.gemspec /usr/share/doc/packages/ruby3.3-rubygem-regexp_parser /usr/share/doc/packages/ruby3.3-rubygem-regexp_parser/LICENSE
Generated by rpm2html 1.8.1
Fabrice Bellet, Fri Oct 18 00:12:25 2024