regex-2014.02.16/0000777000000000000000000000000012300214543011345 5ustar 00000000000000regex-2014.02.16/docs/0000777000000000000000000000000012300214544012276 5ustar 00000000000000regex-2014.02.16/docs/Features.html0000666000000000000000000015057412272541113014761 0ustar 00000000000000

Introduction

This new regex implementation is intended eventually to replace Python's current re module implementation.

For testing and comparison with the current 're' module the new implementation is in the form of a module called 'regex'.

Also included are the compiled binary .pyd files for Python 2.5-2.7 and Python 3.1-3.4 on 32-bit Windows.

Change in behaviour

This module now behaves more like the re module with respect to zero-width matches when using version 0 behaviour. See Hg issue 106 below.

Old vs new behaviour

This module has 2 behaviours:

Version 0 behaviour (old behaviour, compatible with the current re module):

Indicated by the VERSION0 or V0 flag, or (?V0) in the pattern.

.split won't split a string at a zero-width match.

Zero-width matches are handled like in the re module.

Inline flags apply to the entire pattern, and they can't be turned off.

Only simple sets are supported.

Case-insensitive matches in Unicode use simple case-folding by default.

Version 1 behaviour (new behaviour, different from the current re module):

Indicated by the VERSION1 or V1 flag, or (?V1) in the pattern.

.split will split a string at a zero-width match.

Zero-width matches are handled like in Perl and PCRE.

Inline flags apply to the end of the group or pattern, and they can be turned off.

Nested sets and set operations are supported.

Case-insensitive matches in Unicode use full case-folding by default.

If no version is specified, the regex module will default to regex.DEFAULT_VERSION. In the short term this will be VERSION0, but in the longer term it will be VERSION1.

Case-insensitive matches in Unicode

The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the FULLCASE or F flag, or (?f) in the pattern. Please note that this flag affects how the IGNORECASE flag works; the FULLCASE flag itself does not turn on case-insensitive matching.

In the version 0 behaviour, the flag is off by default.

In the version 1 behaviour, the flag is on by default.

Nested sets and set operations

It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped "[" in a set.

For example, the pattern [[a-z]--[aeiou]] is treated in the version 0 behaviour (simple sets, compatible with the re module) as:

Set containing "[" and the letters "a" to "z"

Literal "--"

Set containing letters "a", "e", "i", "o", "u"

but in the version 1 behaviour (nested sets, enhanced behaviour) as:

Set which is:

Set containing the letters "a" to "z"

but excluding:

Set containing the letters "a", "e", "i", "o", "u"

Version 0 behaviour: only simple sets are supported.

Version 1 behaviour: nested sets and set operations are supported.

Flags

There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on.

The scoped flags are: FULLCASE, IGNORECASE, MULTILINE, DOTALL, VERBOSE, WORD.

The global flags are: ASCII, BESTMATCH, ENHANCEMATCH, LOCALE, REVERSE, UNICODE, VERSION0, VERSION1.

If neither the ASCII, LOCALE nor UNICODE flag is specified, it will default to UNICODE if the regex pattern is a Unicode string and ASCII if it's a bytestring.

The ENHANCEMATCH flag makes fuzzy matching attempt to improve the fit of the next match that it finds.

The BESTMATCH flag makes fuzzy matching search for the best match instead of the next match.

Notes on named capture groups

All capture groups have a group number, starting from 1.

Groups with the same group name will have the same group number, and groups with a different group name will have a different group number.

The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the captures method of the match object.

Group numbers will be reused across different branches of a branch reset, eg. (?|(first)|(second)) has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. (?|(?P<foo>first)|(?P<bar>second)) has group 1 ("foo") and group 2 ("bar").

In the regex (\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?<foo>[0-9]+) there are 2 groups:

  1. (\s+) is group 1.
  2. (?P<foo>[A-Z]+) is group 2, also called "foo".
  3. (\w+) is group 2 because of the branch reset.
  4. (?<foo>[0-9]+) is group 2 because it's called "foo".

If you want to prevent (\w+) from being group 2, you need to name it (different name, different group number).

Multithreading

The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument concurrent=True. The behaviour is undefined if the string changes during matching, so use it only when it is guaranteed that that won't happen.

Building for 64-bits

If the source files are built for a 64-bit target then the string positions will also be 64-bit.

Unicode

This module supports Unicode 6.3.

Full Unicode case-folding is supported.

Additional features

The issue numbers relate to the Python bug tracker, except where listed as "Hg issue".

regex-2014.02.16/docs/Features.rst0000666000000000000000000007441412272541111014621 0ustar 00000000000000Introduction ------------ This new regex implementation is intended eventually to replace Python's current re module implementation. For testing and comparison with the current 're' module the new implementation is in the form of a module called 'regex'. Also included are the compiled binary .pyd files for Python 2.5-2.7 and Python 3.1-3.4 on 32-bit Windows. Change in behaviour ------------------- This module now behaves more like the re module with respect to zero-width matches when using version 0 behaviour. See Hg issue 106 below. Old vs new behaviour -------------------- This module has 2 behaviours: **Version 0** behaviour (old behaviour, compatible with the current re module): Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern. ``.split`` won't split a string at a zero-width match. Zero-width matches are handled like in the re module. Inline flags apply to the entire pattern, and they can't be turned off. Only simple sets are supported. Case-insensitive matches in Unicode use simple case-folding by default. **Version 1** behaviour (new behaviour, different from the current re module): Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern. ``.split`` will split a string at a zero-width match. Zero-width matches are handled like in Perl and PCRE. Inline flags apply to the end of the group or pattern, and they can be turned off. Nested sets and set operations are supported. Case-insensitive matches in Unicode use full case-folding by default. If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``. In the short term this will be ``VERSION0``, but in the longer term it will be ``VERSION1``. Case-insensitive matches in Unicode ----------------------------------- The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching. In the version 0 behaviour, the flag is off by default. In the version 1 behaviour, the flag is on by default. Nested sets and set operations ------------------------------ It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set. For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as: Set containing "[" and the letters "a" to "z" Literal "--" Set containing letters "a", "e", "i", "o", "u" but in the version 1 behaviour (nested sets, enhanced behaviour) as: Set which is: Set containing the letters "a" to "z" but excluding: Set containing the letters "a", "e", "i", "o", "u" Version 0 behaviour: only simple sets are supported. Version 1 behaviour: nested sets and set operations are supported. Flags ----- There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on. The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``. The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``. If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring. The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds. The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match. Notes on named capture groups ----------------------------- All capture groups have a group number, starting from 1. Groups with the same group name will have the same group number, and groups with a different group name will have a different group number. The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object. Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?Pfirst)|(?Psecond))`` has group 1 ("foo") and group 2 ("bar"). In the regex ``(\s+)(?|(?P[A-Z]+)|(\w+) (?[0-9]+)`` there are 2 groups: 1. ``(\s+)`` is group 1. 2. ``(?P[A-Z]+)`` is group 2, also called "foo". 3. ``(\w+)`` is group 2 because of the branch reset. 4. ``(?[0-9]+)`` is group 2 because it's called "foo". If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number). Multithreading -------------- The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen. Building for 64-bits -------------------- If the source files are built for a 64-bit target then the string positions will also be 64-bit. Unicode ------- This module supports Unicode 6.3. Full Unicode case-folding is supported. Additional features ------------------- The issue numbers relate to the Python bug tracker, except where listed as "Hg issue". * ``*`` operator not working correctly with sub() (Hg issue 106) Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? Most regex implementations follow the lead of Perl (PCRE), but the re module sometimes doesn't. The Perl behaviour appears to be the most common (and the re module is sometimes definitely wrong), so in version 1 the regex module follows the Perl behaviour, whereas in version 0 it follows the legacy re behaviour. Examples:: # Version 0 behaviour (like re) >>> regex.sub('(?V0).*', 'x', 'test') 'x' >>> regex.sub('(?V0).*?', '|', 'test') '|t|e|s|t|' # Version 1 behaviour (like Perl) >>> regex.sub('(?V1).*', 'x', 'test') 'xx' >>> regex.sub('(?V1).*?', '|', 'test') '|||||||||' * re.group() should never return a bytearray (issue #18468) For compatibility with the re module, the regex module returns all matching bytestrings as ``bytes``, starting from Python 3.4. Examples:: >>> # Python 3.4 and later >>> import regex >>> regex.match(b'.', bytearray(b'a')).group() b'a' >>> # Python 3.1-3.3 >>> import regex >>> regex.match(b'.', bytearray(b'a')).group() bytearray(b'a') * Added ``capturesdict`` (Hg issue 86) ``capturesdict`` is a combination of ``groupdict`` and ``captures``: ``groupdict`` returns a dict of the named groups and the last capture of those groups. ``captures`` returns a list of all the captures of a group ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. Examples:: >>> import regex >>> m = regex.match(r"(?:(?P\w+) (?P\d+)\n)+", "one 1\ntwo 2\nthree 3\n") >>> m.groupdict() {'word': 'three', 'digits': '3'} >>> m.captures("word") ['one', 'two', 'three'] >>> m.captures("digits") ['1', '2', '3'] >>> m.capturesdict() {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} * Allow duplicate names of groups (Hg issue 87) Group names can now be duplicated. Examples:: >>> import regex >>> >>> # With optional groups: >>> >>> # Both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w+)? or (?P\w+)?", "first or second") >>> m.group("item") 'second' >>> m.captures("item") ['first', 'second'] >>> # Only the second group captures. >>> m = regex.match(r"(?P\w+)? or (?P\w+)?", " or second") >>> m.group("item") 'second' >>> m.captures("item") ['second'] >>> # Only the first group captures. >>> m = regex.match(r"(?P\w+)? or (?P\w+)?", "first or ") >>> m.group("item") 'first' >>> m.captures("item") ['first'] >>> >>> # With mandatory groups: >>> >>> # Both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w*) or (?P\w*)?", "first or second") >>> m.group("item") 'second' >>> m.captures("item") ['first', 'second'] >>> # Again, both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w*) or (?P\w*)", " or second") >>> m.group("item") 'second' >>> m.captures("item") ['', 'second'] >>> # And yet again, both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w*) or (?P\w*)", "first or ") >>> m.group("item") '' >>> m.captures("item") ['first', ''] * Added ``fullmatch`` (issue #16203) ``fullmatch`` behaves like ``match``, except that it must match all of the string. Examples:: >>> import regex >>> print(regex.fullmatch(r"abc", "abc").span()) (0, 3) >>> print(regex.fullmatch(r"abc", "abcx")) None >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) (0, 3) >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) (1, 4) >>> >>> regex.match(r"a.*?", "abcd").group(0) 'a' >>> regex.fullmatch(r"a.*?", "abcd").group(0) 'abcd' * Added ``subf`` and ``subfn`` **(Python 2.6 and above)** ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. Examples:: >>> import regex >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") 'foo bar => bar foo' >>> regex.subf(r"(?P\w+) (?P\w+)", "{word2} {word1}", "foo bar") 'bar foo' * Added ``expandf`` to match object **(Python 2.6 and above)** ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. Examples:: >>> import regex >>> m = regex.match(r"(\w+) (\w+)", "foo bar") >>> m.expandf("{0} => {2} {1}") 'foo bar => bar foo' >>> >>> m = regex.match(r"(?P\w+) (?P\w+)", "foo bar") >>> m.expandf("{word2} {word1}") 'bar foo' * Detach searched string A match object contains a reference to the string that was searched, via its ``string`` attribute. The match object now has a ``detach_string`` method that will 'detach' that string, making it available for garbage collection (this might save valuable memory if that string is very large). Example:: >>> import regex >>> m = regex.search(r"\w+", "Hello world") >>> print(m.group()) Hello >>> print(m.string) Hello world >>> m.detach_string() >>> print(m.group()) Hello >>> print(m.string) None * Characters in a group name (issue #14462) A group name can now contain the same characters as an identifier. These are different in Python 2 and Python 3. * Recursive patterns (Hg issue 27) Recursive and repeated patterns are supported. ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. ``(?&name)`` tries to match the named capture group. Examples:: >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() ('Tarzan',) >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() ('Jane',) >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") >>> m.group(0, 1, 2) ('kayak', 'k', None) The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. It's possible to backtrack into a recursed or repeated group. You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). For example, ``(?P\w+) (?P\w+) (?&foo)?`` has 2 groups called "foo" (both group 1) and ``(?|([A-Z]+)|([0-9]+)) (?1)?`` has 2 groups with group number 1. The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. * repr(regex) doesn't include actual regex (issue #13592) The repr of a compiled regex is now in the form of a eval-able string. For example:: >>> r = regex.compile("foo", regex.I) >>> repr(r) "regex.Regex('foo', flags=regex.I | regex.V0)" >>> r regex.Regex('foo', flags=regex.I | regex.V0) The regex module has Regex as an alias for the 'compile' function. * Improve the repr for regular expression match objects (issue #17087) The repr of a match object is now a more useful form. For example:: >>> regex.search(r"\d+", "abc012def") * Python lib re cannot handle Unicode properly due to narrow/wide bug (issue #12729) The source code of the regex module has been updated to support PEP 393 ("Flexible String Representation"), which is new in Python 3.3. * Full Unicode case-folding is supported. In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. Examples (in Python 3): >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() (0, 6) >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() (0, 7) In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. * Approximate "fuzzy" matching (Hg issue 12, Hg issue 41) Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) The 3 types of error are: * Insertion, indicated by "i" * Deletion, indicated by "d" * Substitution, indicated by "s" In addition, "e" indicates any type of error. The fuzziness of a regex item is specified between "{" and "}" after the item. Examples: ``foo`` match "foo" exactly ``(?:foo){i}`` match "foo", permitting insertions ``(?:foo){d}`` match "foo", permitting deletions ``(?:foo){s}`` match "foo", permitting substitutions ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions ``(?:foo){e}`` match "foo", permitting errors If a certain type of error is specified, then any type not specified will **not** be permitted. In the following examples I'll omit the item and write only the fuzziness. ``{i<=3}`` permit at most 3 insertions, but no other types ``{d<=3}`` permit at most 3 deletions, but no other types ``{s<=3}`` permit at most 3 substitutions, but no other types ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions ``{e<=3}`` permit at most 3 errors ``{1<=e<=3}`` permit at least 1 and at most 3 errors ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions It's also possible to state the costs of each type of error and the maximum permitted total cost. Examples: ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 You can also use "<" instead of "<=" if you want an exclusive minimum or maximum: ``{e<=3}`` permit up to 3 errors ``{e<4}`` permit fewer than 4 errors ``{0`` There are occasions where you may want to include a list (actually, a set) of options in a regex. One way is to build the pattern like this:: p = regex.compile(r"first|second|third|fourth|fifth") but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped if they contain any character that has a special meaning in a regex, and that if there is a shorter string that occurs initially in a longer string that the longer string is listed before the shorter one, for example, "cats" before "cat". The new alternative is to use a named list:: option_set = ["first", "second", "third", "fourth", "fifth"] p = regex.compile(r"\L", options=option_set) The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :: >>> print(p.named_lists) {'options': frozenset({'second', 'fifth', 'fourth', 'third', 'first'})} * Start and end of word ``\m`` matches at the start of a word. ``\M`` matches at the end of a word. Compare with ``\b``, which matches at the start or end of a word. * Unicode line separators Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are the pair ``\x0D\x0A``, and ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). * Set operators **Version 1 behaviour only** Set operators have been added, and a set ``[...]`` can include nested sets. The operators, in order of increasing precedence, are: ``||`` for union ("x||y" means "x or y") ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") ``&&`` for intersection ("x&&y" means "x and y") ``--`` (double dash) for difference ("x--y" means "x but not y") Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. Examples: ``[ab]`` # Set containing 'a' and 'b' ``[a-z]`` # Set containing 'a' .. 'z' ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' ``[a-z--qw]`` # Same as above ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter * regex.escape (issue #2650) regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. Examples: >>> regex.escape("foo!?") 'foo\\!\\?' >>> regex.escape("foo!?", special_only=True) 'foo!\\?' * Repeated captures (issue #7132) A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: ``matchobject.captures([group1, ...])`` Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. ``matchobject.starts([group])`` Returns a list of the start positions. Compare with ``matchobject.start([group])``. ``matchobject.ends([group])`` Returns a list of the end positions. Compare with ``matchobject.end([group])``. ``matchobject.spans([group])`` Returns a list of the spans. Compare with ``matchobject.span([group])``. Examples: >>> m = regex.search(r"(\w{3})+", "123456789") >>> m.group(1) '789' >>> m.captures(1) ['123', '456', '789'] >>> m.start(1) 6 >>> m.starts(1) [0, 3, 6] >>> m.end(1) 9 >>> m.ends(1) [3, 6, 9] >>> m.span(1) (6, 9) >>> m.spans(1) [(0, 3), (3, 6), (6, 9)] * Atomic grouping (issue #433030) ``(?>...)`` If the following pattern subsequently fails, then the subpattern as a whole will fail. * Possessive quantifiers. ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. * Scoped flags (issue #433028) ``(?flags-flags:...)`` The flags will apply only to the subpattern. Flags can be turned on or off. * Inline flags (issue #433024, issue #433027) ``(?flags-flags)`` Version 0 behaviour: the flags apply to the entire pattern, and they can't be turned off. Version 1 behaviour: the flags apply to the end of the group or pattern, and they can be turned on or off. * Repeated repeats (issue #2537) A regex like ``((x|y+)*)*`` will be accepted and will work correctly, but should complete more quickly. * Definition of 'word' character (issue #1693050) The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. This applies to ``\w``, ``\W``, ``\b`` and ``\B``. * Groups in lookahead and lookbehind (issue #814253) Groups and group references are permitted in both lookahead and lookbehind. * Variable-length lookbehind A lookbehind can match a variable-length string. * Correct handling of charset with ignore case flag (issue #3511) Ranges within charsets are handled correctly when the ignore-case flag is turned on. * Unmatched group in replacement (issue #1519638) An unmatched group is treated as an empty string in a replacement template. * 'Pathological' patterns (issue #1566086, issue #1662581, issue #1448325, issue #1721518, issue #1297193) 'Pathological' patterns should complete more quickly. * Flags argument for regex.split, regex.sub and regex.subn (issue #3482) ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. * Pos and endpos arguments for regex.sub and regex.subn ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. * 'Overlapped' argument for regex.findall and regex.finditer ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. * Unicode escapes (issue #3665) The Unicode escapes ``\uxxxx`` and ``\Uxxxxxxxx`` are supported. * Large patterns (issue #1160) Patterns can be much larger. * Zero-width match with regex.finditer (issue #1647489) ``regex.finditer`` behaves correctly when it splits at a zero-width match. * Zero-width split with regex.split (issue #3262) Version 0 behaviour: a string won't be split at a zero-width match. Version 1 behaviour: a string will be split at a zero-width match. * Splititer ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. * Subscripting for groups A match object accepts access to the captured groups via subscripting and slicing: >>> m = regex.search(r"(?P.*?)(?P\d+)(?P.*)", "pqr123stu") >>> print m["before"] pqr >>> print m["num"] 123 >>> print m["after"] stu >>> print len(m) 4 >>> print m[:] ('pqr123stu', 'pqr', '123', 'stu') * Named groups Groups can be named with ``(?...)`` as well as the current ``(?P...)``. * Group references Groups can be referenced within a pattern with ``\g``. This also allows there to be more than 99 groups. * Named characters ``\N{name}`` Named characters are supported. (Note: only those known by Python's Unicode database are supported.) * Unicode codepoint properties, including scripts and blocks ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: 1. ``Latin``, the 'Latin' script (``Script=Latin``). 2. ``Cyrillic``, the 'Cyrillic' script (``Script=Cyrillic``). 3. ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). 4. ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). A short form starting with ``Is`` indicates a script or binary property: 1. ``IsLatin``, the 'Latin' script (``Script=Latin``). 2. ``IsCyrillic``, the 'Cyrillic' script (``Script=Cyrillic``). 3. ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). A short form starting with ``In`` indicates a block property: 1. ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). 2. ``InCyrillic``, the 'Cyrillic' block (``Block=Cyrillic``). * POSIX character classes ``[[:alpha:]]``; ``[[:^alpha:]]`` POSIX character classes are supported. This is actually treated as an alternative form of ``\p{...}``. * Search anchor ``\G`` A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: >>> regex.findall(r"\w{2}", "abcd ef") ['ab', 'cd', 'ef'] >>> regex.findall(r"\G\w{2}", "abcd ef") ['ab', 'cd'] 1. The search starts at position 0 and matches 2 letters 'ab'. 2. The search continues at position 2 and matches 2 letters 'cd'. 3. The search continues at position 4 and fails to match any letters. 4. The anchor stops the search start position from being advanced, so there are no more results. * Reverse searching Searches can now work backwards: >>> regex.findall(r".", "abc") ['a', 'b', 'c'] >>> regex.findall(r"(?r).", "abc") ['c', 'b', 'a'] Note: the result of a reverse search is not necessarily the reverse of a forward search: >>> regex.findall(r"..", "abcde") ['ab', 'cd'] >>> regex.findall(r"(?r)..", "abcde") ['de', 'bc'] * Matching a single grapheme ``\X`` The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. * Branch reset (?|...|...) Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. Examples:: >>> import regex >>> regex.match(r"(?|(first)|(second))", "first").groups() ('first',) >>> regex.match(r"(?|(first)|(second))", "second").groups() ('second',) Note that there is only one group. * Default Unicode word boundary The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. * SRE engine do not release the GIL (issue #1366311) The regex module can release the GIL during matching (see the above section on multithreading). Iterators can be safely shared across threads. regex-2014.02.16/docs/UnicodeProperties.txt0000666000000000000000000004616512300206515016515 0ustar 00000000000000The following is a list of the 79 properties which are supported by this module: ASCII No [F, False, N] Yes [T, True, Y] ASCII_Hex_Digit [AHex] No [F, False, N] Yes [T, True, Y] Alphabetic [Alpha] No [F, False, N] Yes [T, True, Y] Alphanumeric [AlNum] No [F, False, N] Yes [T, True, Y] Any No [F, False, N] Yes [T, True, Y] Assigned No [F, False, N] Yes [T, True, Y] Bidi_Class [bc] Arabic_Letter [AL] Arabic_Number [AN] Boundary_Neutral [BN] Common_Separator [CS] European_Number [EN] European_Separator [ES] European_Terminator [ET] First_Strong_Isolate [FSI] Left_To_Right [L] Left_To_Right_Embedding [LRE] Left_To_Right_Isolate [LRI] Left_To_Right_Override [LRO] Nonspacing_Mark [NSM] Other_Neutral [ON] Paragraph_Separator [B] Pop_Directional_Format [PDF] Pop_Directional_Isolate [PDI] Right_To_Left [R] Right_To_Left_Embedding [RLE] Right_To_Left_Isolate [RLI] Right_To_Left_Override [RLO] Segment_Separator [S] White_Space [WS] Bidi_Control [Bidi_C] No [F, False, N] Yes [T, True, Y] Bidi_Mirrored [Bidi_M] No [F, False, N] Yes [T, True, Y] Blank No [F, False, N] Yes [T, True, Y] Block [blk] Aegean_Numbers Alchemical_Symbols [Alchemical] Alphabetic_Presentation_Forms [Alphabetic_PF] Ancient_Greek_Musical_Notation [Ancient_Greek_Music] Ancient_Greek_Numbers Ancient_Symbols Arabic Arabic_Extended_A [Arabic_Ext_A] Arabic_Mathematical_Alphabetic_Symbols [Arabic_Math] Arabic_Presentation_Forms_A [Arabic_PF_A] Arabic_Presentation_Forms_B [Arabic_PF_B] Arabic_Supplement [Arabic_Sup] Armenian Arrows Avestan Balinese Bamum Bamum_Supplement [Bamum_Sup] Basic_Latin [ASCII] Batak Bengali Block_Elements Bopomofo Bopomofo_Extended [Bopomofo_Ext] Box_Drawing Brahmi Braille_Patterns [Braille] Buginese Buhid Byzantine_Musical_Symbols [Byzantine_Music] CJK_Compatibility [CJK_Compat] CJK_Compatibility_Forms [CJK_Compat_Forms] CJK_Compatibility_Ideographs [CJK_Compat_Ideographs] CJK_Compatibility_Ideographs_Supplement [CJK_Compat_Ideographs_Sup] CJK_Radicals_Supplement [CJK_Radicals_Sup] CJK_Strokes CJK_Symbols_And_Punctuation [CJK_Symbols] CJK_Unified_Ideographs [CJK] CJK_Unified_Ideographs_Extension_A [CJK_Ext_A] CJK_Unified_Ideographs_Extension_B [CJK_Ext_B] CJK_Unified_Ideographs_Extension_C [CJK_Ext_C] CJK_Unified_Ideographs_Extension_D [CJK_Ext_D] Carian Chakma Cham Cherokee Combining_Diacritical_Marks [Diacriticals] Combining_Diacritical_Marks_For_Symbols [Combining_Marks_For_Symbols, Diacriticals_For_Symbols] Combining_Diacritical_Marks_Supplement [Diacriticals_Sup] Combining_Half_Marks [Half_Marks] Common_Indic_Number_Forms [Indic_Number_Forms] Control_Pictures Coptic Counting_Rod_Numerals [Counting_Rod] Cuneiform Cuneiform_Numbers_And_Punctuation [Cuneiform_Numbers] Currency_Symbols Cypriot_Syllabary Cyrillic Cyrillic_Extended_A [Cyrillic_Ext_A] Cyrillic_Extended_B [Cyrillic_Ext_B] Cyrillic_Supplement [Cyrillic_Sup, Cyrillic_Supplementary] Deseret Devanagari Devanagari_Extended [Devanagari_Ext] Dingbats Domino_Tiles [Domino] Egyptian_Hieroglyphs Emoticons Enclosed_Alphanumeric_Supplement [Enclosed_Alphanum_Sup] Enclosed_Alphanumerics [Enclosed_Alphanum] Enclosed_CJK_Letters_And_Months [Enclosed_CJK] Enclosed_Ideographic_Supplement [Enclosed_Ideographic_Sup] Ethiopic Ethiopic_Extended [Ethiopic_Ext] Ethiopic_Extended_A [Ethiopic_Ext_A] Ethiopic_Supplement [Ethiopic_Sup] General_Punctuation [Punctuation] Geometric_Shapes Georgian Georgian_Supplement [Georgian_Sup] Glagolitic Gothic Greek_And_Coptic [Greek] Greek_Extended [Greek_Ext] Gujarati Gurmukhi Halfwidth_And_Fullwidth_Forms [Half_And_Full_Forms] Hangul_Compatibility_Jamo [Compat_Jamo] Hangul_Jamo [Jamo] Hangul_Jamo_Extended_A [Jamo_Ext_A] Hangul_Jamo_Extended_B [Jamo_Ext_B] Hangul_Syllables [Hangul] Hanunoo Hebrew High_Private_Use_Surrogates [High_PU_Surrogates] High_Surrogates Hiragana IPA_Extensions [IPA_Ext] Ideographic_Description_Characters [IDC] Imperial_Aramaic Inscriptional_Pahlavi Inscriptional_Parthian Javanese Kaithi Kana_Supplement [Kana_Sup] Kanbun Kangxi_Radicals [Kangxi] Kannada Katakana Katakana_Phonetic_Extensions [Katakana_Ext] Kayah_Li Kharoshthi Khmer Khmer_Symbols Lao Latin_1_Supplement [Latin_1, Latin_1_Sup] Latin_Extended_A [Latin_Ext_A] Latin_Extended_Additional [Latin_Ext_Additional] Latin_Extended_B [Latin_Ext_B] Latin_Extended_C [Latin_Ext_C] Latin_Extended_D [Latin_Ext_D] Lepcha Letterlike_Symbols Limbu Linear_B_Ideograms Linear_B_Syllabary Lisu Low_Surrogates Lycian Lydian Mahjong_Tiles [Mahjong] Malayalam Mandaic Mathematical_Alphanumeric_Symbols [Math_Alphanum] Mathematical_Operators [Math_Operators] Meetei_Mayek Meetei_Mayek_Extensions [Meetei_Mayek_Ext] Meroitic_Cursive Meroitic_Hieroglyphs Miao Miscellaneous_Mathematical_Symbols_A [Misc_Math_Symbols_A] Miscellaneous_Mathematical_Symbols_B [Misc_Math_Symbols_B] Miscellaneous_Symbols [Misc_Symbols] Miscellaneous_Symbols_And_Arrows [Misc_Arrows] Miscellaneous_Symbols_And_Pictographs [Misc_Pictographs] Miscellaneous_Technical [Misc_Technical] Modifier_Tone_Letters Mongolian Musical_Symbols [Music] Myanmar Myanmar_Extended_A [Myanmar_Ext_A] NKo New_Tai_Lue No_Block [NB] Number_Forms Ogham Ol_Chiki Old_Italic Old_Persian Old_South_Arabian Old_Turkic Optical_Character_Recognition [OCR] Oriya Osmanya Phags_Pa Phaistos_Disc [Phaistos] Phoenician Phonetic_Extensions [Phonetic_Ext] Phonetic_Extensions_Supplement [Phonetic_Ext_Sup] Playing_Cards Private_Use_Area [PUA, Private_Use] Rejang Rumi_Numeral_Symbols [Rumi] Runic Samaritan Saurashtra Sharada Shavian Sinhala Small_Form_Variants [Small_Forms] Sora_Sompeng Spacing_Modifier_Letters [Modifier_Letters] Specials Sundanese Sundanese_Supplement [Sundanese_Sup] Superscripts_And_Subscripts [Super_And_Sub] Supplemental_Arrows_A [Sup_Arrows_A] Supplemental_Arrows_B [Sup_Arrows_B] Supplemental_Mathematical_Operators [Sup_Math_Operators] Supplemental_Punctuation [Sup_Punctuation] Supplementary_Private_Use_Area_A [Sup_PUA_A] Supplementary_Private_Use_Area_B [Sup_PUA_B] Syloti_Nagri Syriac Tagalog Tagbanwa Tags Tai_Le Tai_Tham Tai_Viet Tai_Xuan_Jing_Symbols [Tai_Xuan_Jing] Takri Tamil Telugu Thaana Thai Tibetan Tifinagh Transport_And_Map_Symbols [Transport_And_Map] Ugaritic Unified_Canadian_Aboriginal_Syllabics [Canadian_Syllabics, UCAS] Unified_Canadian_Aboriginal_Syllabics_Extended [UCAS_Ext] Vai Variation_Selectors [VS] Variation_Selectors_Supplement [VS_Sup] Vedic_Extensions [Vedic_Ext] Vertical_Forms Yi_Radicals Yi_Syllables Yijing_Hexagram_Symbols [Yijing] Canonical_Combining_Class [ccc] Above [230, A] Above_Left [228, AL] Above_Right [232, AR] Attached_Above [214, ATA] Attached_Above_Right [216, ATAR] Attached_Below [202, ATB] Attached_Below_Left Below [220, B] Below_Left [218, BL] Below_Right [222, BR] CCC10 [10] CCC103 [103] CCC107 [107] CCC11 [11] CCC118 [118] CCC12 [12] CCC122 [122] CCC129 [129] CCC13 [13] CCC130 [130] CCC132 [132] CCC133 CCC14 [14] CCC15 [15] CCC16 [16] CCC17 [17] CCC18 [18] CCC19 [19] CCC20 [20] CCC21 [21] CCC22 [22] CCC23 [23] CCC24 [24] CCC25 [25] CCC26 [26] CCC27 [27] CCC28 [28] CCC29 [29] CCC30 [30] CCC31 [31] CCC32 [32] CCC33 [33] CCC34 [34] CCC35 [35] CCC36 [36] CCC84 [84] CCC91 [91] Double_Above [234, DA] Double_Below [233, DB] Iota_Subscript [240, IS] Kana_Voicing [8, KV] Left [224, L] Not_Reordered [0, NR] Nukta [7, NK] Overlay [1, OV] Right [226, R] Virama [9, VR] Case_Ignorable [CI] No [F, False, N] Yes [T, True, Y] Cased No [F, False, N] Yes [T, True, Y] Changes_When_Casefolded [CWCF] No [F, False, N] Yes [T, True, Y] Changes_When_Casemapped [CWCM] No [F, False, N] Yes [T, True, Y] Changes_When_Lowercased [CWL] No [F, False, N] Yes [T, True, Y] Changes_When_Titlecased [CWT] No [F, False, N] Yes [T, True, Y] Changes_When_Uppercased [CWU] No [F, False, N] Yes [T, True, Y] Dash No [F, False, N] Yes [T, True, Y] Decomposition_Type [dt] Canonical [Can] Circle [Enc] Compat [Com] Final [Fin] Font Fraction [Fra] Initial [Init] Isolated [Iso] Medial [Med] Narrow [Nar] Nobreak [Nb] None Small [Sml] Square [Sqr] Sub Super [Sup] Vertical [Vert] Wide Default_Ignorable_Code_Point [DI] No [F, False, N] Yes [T, True, Y] Deprecated [Dep] No [F, False, N] Yes [T, True, Y] Diacritic [Dia] No [F, False, N] Yes [T, True, Y] East_Asian_Width [ea] Ambiguous [A] Fullwidth [F] Halfwidth [H] Narrow [Na] Neutral [N] Wide [W] Extender [Ext] No [F, False, N] Yes [T, True, Y] General_Category [gc] Cased_Letter Close_Punctuation [Pe] Connector_Punctuation [Pc] Control [Cc, cntrl] Currency_Symbol [Sc] Dash_Punctuation [Pd] Decimal_Number [Nd, digit] Enclosing_Mark [Me] Final_Punctuation [Pf] Format [Cf] Initial_Punctuation [Pi] Letter [L, L&] Letter_Number [Nl] Line_Separator [Zl] Lowercase_Letter [Ll] Mark [Combining_Mark, M, M&] Math_Symbol [Sm] Modifier_Letter [Lm] Modifier_Symbol [Sk] Nonspacing_Mark [Mn] Number [N, N&] Open_Punctuation [Ps] Other [C, C&] Other_Letter [Lo] Other_Number [No] Other_Punctuation [Po] Other_Symbol [So] Paragraph_Separator [Zp] Private_Use [Co] Punctuation [P, P&, punct] Separator [Z, Z&] Space_Separator [Zs] Spacing_Mark [Mc] Surrogate [Cs] Symbol [S, S&] Titlecase_Letter [Lt] Unassigned [Cn] Uppercase_Letter [Lu] Graph No [F, False, N] Yes [T, True, Y] Grapheme_Base [Gr_Base] No [F, False, N] Yes [T, True, Y] Grapheme_Cluster_Break [GCB] CR Control [CN] Extend [EX] L LF LV LVT Other [XX] Prepend Regional_Indicator [RI] SpacingMark [SM] T V Grapheme_Extend [Gr_Ext] No [F, False, N] Yes [T, True, Y] Grapheme_Link [Gr_Link] No [F, False, N] Yes [T, True, Y] Hangul_Syllable_Type [hst] LVT_Syllable [LVT] LV_Syllable [LV] Leading_Jamo [L] Not_Applicable [NA] Trailing_Jamo [T] Vowel_Jamo [V] Hex_Digit [Hex] No [F, False, N] Yes [T, True, Y] Hyphen No [F, False, N] Yes [T, True, Y] IDS_Binary_Operator [IDSB] No [F, False, N] Yes [T, True, Y] IDS_Trinary_Operator [IDST] No [F, False, N] Yes [T, True, Y] ID_Continue [IDC] No [F, False, N] Yes [T, True, Y] ID_Start [IDS] No [F, False, N] Yes [T, True, Y] Ideographic [Ideo] No [F, False, N] Yes [T, True, Y] Indic_Matra_Category [InMC] Bottom Bottom_And_Right Invisible Left Left_And_Right NA Overstruck Right Top Top_And_Bottom Top_And_Bottom_And_Right Top_And_Left Top_And_Left_And_Right Top_And_Right Visual_Order_Left Indic_Syllabic_Category [InSC] Avagraha Bindu Consonant Consonant_Dead Consonant_Final Consonant_Head_Letter Consonant_Medial Consonant_Placeholder Consonant_Repha Consonant_Subjoined Modifying_Letter Nukta Other Register_Shifter Tone_Letter Tone_Mark Virama Visarga Vowel Vowel_Dependent Vowel_Independent Join_Control [Join_C] No [F, False, N] Yes [T, True, Y] Joining_Group [jg] Ain Alaph Alef Beh Beth Burushaski_Yeh_Barree Dal Dalath_Rish E Farsi_Yeh Fe Feh Final_Semkath Gaf Gamal Hah Hamza_On_Heh_Goal [Teh_Marbuta_Goal] He Heh Heh_Goal Heth Kaf Kaph Khaph Knotted_Heh Lam Lamadh Meem Mim No_Joining_Group Noon Nun Nya Pe Qaf Qaph Reh Reversed_Pe Rohingya_Yeh Sad Sadhe Seen Semkath Shin Swash_Kaf Syriac_Waw Tah Taw Teh_Marbuta Teth Waw Yeh Yeh_Barree Yeh_With_Tail Yudh Yudh_He Zain Zhain Joining_Type [jt] Dual_Joining [D] Join_Causing [C] Left_Joining [L] Non_Joining [U] Right_Joining [R] Transparent [T] Line_Break [lb] Alphabetic [AL] Ambiguous [AI] Break_After [BA] Break_Before [BB] Break_Both [B2] Break_Symbols [SY] Carriage_Return [CR] Close_Parenthesis [CP] Close_Punctuation [CL] Combining_Mark [CM] Complex_Context [SA] Conditional_Japanese_Starter [CJ] Contingent_Break [CB] Exclamation [EX] Glue [GL] H2 H3 Hebrew_Letter [HL] Hyphen [HY] Ideographic [ID] Infix_Numeric [IS] Inseparable [IN, Inseperable] JL JT JV Line_Feed [LF] Mandatory_Break [BK] Next_Line [NL] Nonstarter [NS] Numeric [NU] Open_Punctuation [OP] Postfix_Numeric [PO] Prefix_Numeric [PR] Quotation [QU] Regional_Indicator [RI] Space [SP] Surrogate [SG] Unknown [XX] Word_Joiner [WJ] ZWSpace [ZW] Logical_Order_Exception [LOE] No [F, False, N] Yes [T, True, Y] Lowercase [Lower] No [F, False, N] Yes [T, True, Y] Math No [F, False, N] Yes [T, True, Y] Noncharacter_Code_Point [NChar] No [F, False, N] Yes [T, True, Y] Numeric_Type [nt] Decimal [De] Digit [Di] None Numeric [Nu] Numeric_Value [nv] -1/2 0 1 1/10 1/16 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9 10 100 1000 10000 100000 100000000 1000000000000 11 11/2 12 13 13/2 14 15 15/2 16 17 17/2 18 19 2 2/3 2/5 20 200 2000 20000 21 216000 22 23 24 25 26 27 28 29 3 3/16 3/2 3/4 3/5 3/8 30 300 3000 30000 31 32 33 34 35 36 37 38 39 4 4/5 40 400 4000 40000 41 42 43 432000 44 45 46 47 48 49 5 5/2 5/6 5/8 50 500 5000 50000 6 60 600 6000 60000 7 7/2 7/8 70 700 7000 70000 8 80 800 8000 80000 9 9/2 90 900 9000 90000 NaN Other_Alphabetic [OAlpha] No [F, False, N] Yes [T, True, Y] Other_Default_Ignorable_Code_Point [ODI] No [F, False, N] Yes [T, True, Y] Other_Grapheme_Extend [OGr_Ext] No [F, False, N] Yes [T, True, Y] Other_ID_Continue [OIDC] No [F, False, N] Yes [T, True, Y] Other_ID_Start [OIDS] No [F, False, N] Yes [T, True, Y] Other_Lowercase [OLower] No [F, False, N] Yes [T, True, Y] Other_Math [OMath] No [F, False, N] Yes [T, True, Y] Other_Uppercase [OUpper] No [F, False, N] Yes [T, True, Y] Pattern_Syntax [Pat_Syn] No [F, False, N] Yes [T, True, Y] Pattern_White_Space [Pat_WS] No [F, False, N] Yes [T, True, Y] Print No [F, False, N] Yes [T, True, Y] Quotation_Mark [QMark] No [F, False, N] Yes [T, True, Y] Radical No [F, False, N] Yes [T, True, Y] STerm No [F, False, N] Yes [T, True, Y] Script [sc] Arabic [Arab] Armenian [Armn] Avestan [Avst] Balinese [Bali] Bamum [Bamu] Batak [Batk] Bengali [Beng] Bopomofo [Bopo] Brahmi [Brah] Braille [Brai] Buginese [Bugi] Buhid [Buhd] Canadian_Aboriginal [Cans] Carian [Cari] Chakma [Cakm] Cham Cherokee [Cher] Common [Zyyy] Coptic [Copt, Qaac] Cuneiform [Xsux] Cypriot [Cprt] Cyrillic [Cyrl] Deseret [Dsrt] Devanagari [Deva] Egyptian_Hieroglyphs [Egyp] Ethiopic [Ethi] Georgian [Geor] Glagolitic [Glag] Gothic [Goth] Greek [Grek] Gujarati [Gujr] Gurmukhi [Guru] Han [Hani] Hangul [Hang] Hanunoo [Hano] Hebrew [Hebr] Hiragana [Hira] Imperial_Aramaic [Armi] Inherited [Qaai, Zinh] Inscriptional_Pahlavi [Phli] Inscriptional_Parthian [Prti] Javanese [Java] Kaithi [Kthi] Kannada [Knda] Katakana [Kana] Katakana_Or_Hiragana Kayah_Li [Kali] Kharoshthi [Khar] Khmer [Khmr] Lao [Laoo] Latin [Latn] Lepcha [Lepc] Limbu [Limb] Linear_B [Linb] Lisu Lycian [Lyci] Lydian [Lydi] Malayalam [Mlym] Mandaic [Mand] Meetei_Mayek [Mtei] Meroitic_Cursive [Merc] Meroitic_Hieroglyphs [Mero] Miao [Plrd] Mongolian [Mong] Myanmar [Mymr] New_Tai_Lue [Talu] Nko [Nkoo] Ogham [Ogam] Ol_Chiki [Olck] Old_Italic [Ital] Old_Persian [Xpeo] Old_South_Arabian [Sarb] Old_Turkic [Orkh] Oriya [Orya] Osmanya [Osma] Phags_Pa [Phag] Phoenician [Phnx] Rejang [Rjng] Runic [Runr] Samaritan [Samr] Saurashtra [Saur] Sharada [Shrd] Shavian [Shaw] Sinhala [Sinh] Sora_Sompeng [Sora] Sundanese [Sund] Syloti_Nagri [Sylo] Syriac [Syrc] Tagalog [Tglg] Tagbanwa [Tagb] Tai_Le [Tale] Tai_Tham [Lana] Tai_Viet [Tavt] Takri [Takr] Tamil [Taml] Telugu [Telu] Thaana [Thaa] Thai Tibetan [Tibt] Tifinagh [Tfng] Ugaritic [Ugar] Unknown [Zzzz] Vai [Vaii] Yi [Yiii] Sentence_Break [SB] ATerm [AT] CR Close [CL] Extend [EX] Format [FO] LF Lower [LO] Numeric [NU] OLetter [LE] Other [XX] SContinue [SC] STerm [ST] Sep [SE] Sp Upper [UP] Soft_Dotted [SD] No [F, False, N] Yes [T, True, Y] Terminal_Punctuation [Term] No [F, False, N] Yes [T, True, Y] Unified_Ideograph [UIdeo] No [F, False, N] Yes [T, True, Y] Uppercase [Upper] No [F, False, N] Yes [T, True, Y] Variation_Selector [VS] No [F, False, N] Yes [T, True, Y] White_Space [WSpace, space] No [F, False, N] Yes [T, True, Y] Word No [F, False, N] Yes [T, True, Y] Word_Break [WB] ALetter [LE] CR Double_Quote [DQ] Extend ExtendNumLet [EX] Format [FO] Hebrew_Letter [HL] Katakana [KA] LF MidLetter [ML] MidNum [MN] MidNumLet [MB] Newline [NL] Numeric [NU] Other [XX] Regional_Indicator [RI] Single_Quote [SQ] XDigit No [F, False, N] Yes [T, True, Y] XID_Continue [XIDC] No [F, False, N] Yes [T, True, Y] XID_Start [XIDS] No [F, False, N] Yes [T, True, Y] regex-2014.02.16/PKG-INFO0000666000000000000000000011327212300214544012451 0ustar 00000000000000Metadata-Version: 1.0 Name: regex Version: 2014.02.16 Summary: Alternative regular expression module, to replace re. Home-page: https://code.google.com/p/mrab-regex-hg/ Author: Matthew Barnett Author-email: regex@mrabarnett.plus.com License: Python Software Foundation License Description: Introduction ------------ This new regex implementation is intended eventually to replace Python's current re module implementation. For testing and comparison with the current 're' module the new implementation is in the form of a module called 'regex'. Also included are the compiled binary .pyd files for Python 2.5-2.7 and Python 3.1-3.4 on 32-bit Windows. Change in behaviour ------------------- This module now behaves more like the re module with respect to zero-width matches when using version 0 behaviour. See Hg issue 106 below. Old vs new behaviour -------------------- This module has 2 behaviours: **Version 0** behaviour (old behaviour, compatible with the current re module): Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern. ``.split`` won't split a string at a zero-width match. Zero-width matches are handled like in the re module. Inline flags apply to the entire pattern, and they can't be turned off. Only simple sets are supported. Case-insensitive matches in Unicode use simple case-folding by default. **Version 1** behaviour (new behaviour, different from the current re module): Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern. ``.split`` will split a string at a zero-width match. Zero-width matches are handled like in Perl and PCRE. Inline flags apply to the end of the group or pattern, and they can be turned off. Nested sets and set operations are supported. Case-insensitive matches in Unicode use full case-folding by default. If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``. In the short term this will be ``VERSION0``, but in the longer term it will be ``VERSION1``. Case-insensitive matches in Unicode ----------------------------------- The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching. In the version 0 behaviour, the flag is off by default. In the version 1 behaviour, the flag is on by default. Nested sets and set operations ------------------------------ It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set. For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as: Set containing "[" and the letters "a" to "z" Literal "--" Set containing letters "a", "e", "i", "o", "u" but in the version 1 behaviour (nested sets, enhanced behaviour) as: Set which is: Set containing the letters "a" to "z" but excluding: Set containing the letters "a", "e", "i", "o", "u" Version 0 behaviour: only simple sets are supported. Version 1 behaviour: nested sets and set operations are supported. Flags ----- There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on. The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``. The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``. If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring. The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds. The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match. Notes on named capture groups ----------------------------- All capture groups have a group number, starting from 1. Groups with the same group name will have the same group number, and groups with a different group name will have a different group number. The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object. Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?Pfirst)|(?Psecond))`` has group 1 ("foo") and group 2 ("bar"). In the regex ``(\s+)(?|(?P[A-Z]+)|(\w+) (?[0-9]+)`` there are 2 groups: 1. ``(\s+)`` is group 1. 2. ``(?P[A-Z]+)`` is group 2, also called "foo". 3. ``(\w+)`` is group 2 because of the branch reset. 4. ``(?[0-9]+)`` is group 2 because it's called "foo". If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number). Multithreading -------------- The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen. Building for 64-bits -------------------- If the source files are built for a 64-bit target then the string positions will also be 64-bit. Unicode ------- This module supports Unicode 6.3. Full Unicode case-folding is supported. Additional features ------------------- The issue numbers relate to the Python bug tracker, except where listed as "Hg issue". * ``*`` operator not working correctly with sub() (Hg issue 106) Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? Most regex implementations follow the lead of Perl (PCRE), but the re module sometimes doesn't. The Perl behaviour appears to be the most common (and the re module is sometimes definitely wrong), so in version 1 the regex module follows the Perl behaviour, whereas in version 0 it follows the legacy re behaviour. Examples:: # Version 0 behaviour (like re) >>> regex.sub('(?V0).*', 'x', 'test') 'x' >>> regex.sub('(?V0).*?', '|', 'test') '|t|e|s|t|' # Version 1 behaviour (like Perl) >>> regex.sub('(?V1).*', 'x', 'test') 'xx' >>> regex.sub('(?V1).*?', '|', 'test') '|||||||||' * re.group() should never return a bytearray (issue #18468) For compatibility with the re module, the regex module returns all matching bytestrings as ``bytes``, starting from Python 3.4. Examples:: >>> # Python 3.4 and later >>> import regex >>> regex.match(b'.', bytearray(b'a')).group() b'a' >>> # Python 3.1-3.3 >>> import regex >>> regex.match(b'.', bytearray(b'a')).group() bytearray(b'a') * Added ``capturesdict`` (Hg issue 86) ``capturesdict`` is a combination of ``groupdict`` and ``captures``: ``groupdict`` returns a dict of the named groups and the last capture of those groups. ``captures`` returns a list of all the captures of a group ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. Examples:: >>> import regex >>> m = regex.match(r"(?:(?P\w+) (?P\d+)\n)+", "one 1\ntwo 2\nthree 3\n") >>> m.groupdict() {'word': 'three', 'digits': '3'} >>> m.captures("word") ['one', 'two', 'three'] >>> m.captures("digits") ['1', '2', '3'] >>> m.capturesdict() {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} * Allow duplicate names of groups (Hg issue 87) Group names can now be duplicated. Examples:: >>> import regex >>> >>> # With optional groups: >>> >>> # Both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w+)? or (?P\w+)?", "first or second") >>> m.group("item") 'second' >>> m.captures("item") ['first', 'second'] >>> # Only the second group captures. >>> m = regex.match(r"(?P\w+)? or (?P\w+)?", " or second") >>> m.group("item") 'second' >>> m.captures("item") ['second'] >>> # Only the first group captures. >>> m = regex.match(r"(?P\w+)? or (?P\w+)?", "first or ") >>> m.group("item") 'first' >>> m.captures("item") ['first'] >>> >>> # With mandatory groups: >>> >>> # Both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w*) or (?P\w*)?", "first or second") >>> m.group("item") 'second' >>> m.captures("item") ['first', 'second'] >>> # Again, both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w*) or (?P\w*)", " or second") >>> m.group("item") 'second' >>> m.captures("item") ['', 'second'] >>> # And yet again, both groups capture, the second capture 'overwriting' the first. >>> m = regex.match(r"(?P\w*) or (?P\w*)", "first or ") >>> m.group("item") '' >>> m.captures("item") ['first', ''] * Added ``fullmatch`` (issue #16203) ``fullmatch`` behaves like ``match``, except that it must match all of the string. Examples:: >>> import regex >>> print(regex.fullmatch(r"abc", "abc").span()) (0, 3) >>> print(regex.fullmatch(r"abc", "abcx")) None >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) (0, 3) >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) (1, 4) >>> >>> regex.match(r"a.*?", "abcd").group(0) 'a' >>> regex.fullmatch(r"a.*?", "abcd").group(0) 'abcd' * Added ``subf`` and ``subfn`` **(Python 2.6 and above)** ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. Examples:: >>> import regex >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") 'foo bar => bar foo' >>> regex.subf(r"(?P\w+) (?P\w+)", "{word2} {word1}", "foo bar") 'bar foo' * Added ``expandf`` to match object **(Python 2.6 and above)** ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. Examples:: >>> import regex >>> m = regex.match(r"(\w+) (\w+)", "foo bar") >>> m.expandf("{0} => {2} {1}") 'foo bar => bar foo' >>> >>> m = regex.match(r"(?P\w+) (?P\w+)", "foo bar") >>> m.expandf("{word2} {word1}") 'bar foo' * Detach searched string A match object contains a reference to the string that was searched, via its ``string`` attribute. The match object now has a ``detach_string`` method that will 'detach' that string, making it available for garbage collection (this might save valuable memory if that string is very large). Example:: >>> import regex >>> m = regex.search(r"\w+", "Hello world") >>> print(m.group()) Hello >>> print(m.string) Hello world >>> m.detach_string() >>> print(m.group()) Hello >>> print(m.string) None * Characters in a group name (issue #14462) A group name can now contain the same characters as an identifier. These are different in Python 2 and Python 3. * Recursive patterns (Hg issue 27) Recursive and repeated patterns are supported. ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. ``(?&name)`` tries to match the named capture group. Examples:: >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() ('Tarzan',) >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() ('Jane',) >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") >>> m.group(0, 1, 2) ('kayak', 'k', None) The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. It's possible to backtrack into a recursed or repeated group. You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). For example, ``(?P\w+) (?P\w+) (?&foo)?`` has 2 groups called "foo" (both group 1) and ``(?|([A-Z]+)|([0-9]+)) (?1)?`` has 2 groups with group number 1. The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. * repr(regex) doesn't include actual regex (issue #13592) The repr of a compiled regex is now in the form of a eval-able string. For example:: >>> r = regex.compile("foo", regex.I) >>> repr(r) "regex.Regex('foo', flags=regex.I | regex.V0)" >>> r regex.Regex('foo', flags=regex.I | regex.V0) The regex module has Regex as an alias for the 'compile' function. * Improve the repr for regular expression match objects (issue #17087) The repr of a match object is now a more useful form. For example:: >>> regex.search(r"\d+", "abc012def") * Python lib re cannot handle Unicode properly due to narrow/wide bug (issue #12729) The source code of the regex module has been updated to support PEP 393 ("Flexible String Representation"), which is new in Python 3.3. * Full Unicode case-folding is supported. In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. Examples (in Python 3): >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() (0, 6) >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() (0, 7) In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. * Approximate "fuzzy" matching (Hg issue 12, Hg issue 41) Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) The 3 types of error are: * Insertion, indicated by "i" * Deletion, indicated by "d" * Substitution, indicated by "s" In addition, "e" indicates any type of error. The fuzziness of a regex item is specified between "{" and "}" after the item. Examples: ``foo`` match "foo" exactly ``(?:foo){i}`` match "foo", permitting insertions ``(?:foo){d}`` match "foo", permitting deletions ``(?:foo){s}`` match "foo", permitting substitutions ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions ``(?:foo){e}`` match "foo", permitting errors If a certain type of error is specified, then any type not specified will **not** be permitted. In the following examples I'll omit the item and write only the fuzziness. ``{i<=3}`` permit at most 3 insertions, but no other types ``{d<=3}`` permit at most 3 deletions, but no other types ``{s<=3}`` permit at most 3 substitutions, but no other types ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions ``{e<=3}`` permit at most 3 errors ``{1<=e<=3}`` permit at least 1 and at most 3 errors ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions It's also possible to state the costs of each type of error and the maximum permitted total cost. Examples: ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 You can also use "<" instead of "<=" if you want an exclusive minimum or maximum: ``{e<=3}`` permit up to 3 errors ``{e<4}`` permit fewer than 4 errors ``{0`` There are occasions where you may want to include a list (actually, a set) of options in a regex. One way is to build the pattern like this:: p = regex.compile(r"first|second|third|fourth|fifth") but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped if they contain any character that has a special meaning in a regex, and that if there is a shorter string that occurs initially in a longer string that the longer string is listed before the shorter one, for example, "cats" before "cat". The new alternative is to use a named list:: option_set = ["first", "second", "third", "fourth", "fifth"] p = regex.compile(r"\L", options=option_set) The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :: >>> print(p.named_lists) {'options': frozenset({'second', 'fifth', 'fourth', 'third', 'first'})} * Start and end of word ``\m`` matches at the start of a word. ``\M`` matches at the end of a word. Compare with ``\b``, which matches at the start or end of a word. * Unicode line separators Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are the pair ``\x0D\x0A``, and ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). * Set operators **Version 1 behaviour only** Set operators have been added, and a set ``[...]`` can include nested sets. The operators, in order of increasing precedence, are: ``||`` for union ("x||y" means "x or y") ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") ``&&`` for intersection ("x&&y" means "x and y") ``--`` (double dash) for difference ("x--y" means "x but not y") Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. Examples: ``[ab]`` # Set containing 'a' and 'b' ``[a-z]`` # Set containing 'a' .. 'z' ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' ``[a-z--qw]`` # Same as above ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter * regex.escape (issue #2650) regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. Examples: >>> regex.escape("foo!?") 'foo\\!\\?' >>> regex.escape("foo!?", special_only=True) 'foo!\\?' * Repeated captures (issue #7132) A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: ``matchobject.captures([group1, ...])`` Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. ``matchobject.starts([group])`` Returns a list of the start positions. Compare with ``matchobject.start([group])``. ``matchobject.ends([group])`` Returns a list of the end positions. Compare with ``matchobject.end([group])``. ``matchobject.spans([group])`` Returns a list of the spans. Compare with ``matchobject.span([group])``. Examples: >>> m = regex.search(r"(\w{3})+", "123456789") >>> m.group(1) '789' >>> m.captures(1) ['123', '456', '789'] >>> m.start(1) 6 >>> m.starts(1) [0, 3, 6] >>> m.end(1) 9 >>> m.ends(1) [3, 6, 9] >>> m.span(1) (6, 9) >>> m.spans(1) [(0, 3), (3, 6), (6, 9)] * Atomic grouping (issue #433030) ``(?>...)`` If the following pattern subsequently fails, then the subpattern as a whole will fail. * Possessive quantifiers. ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. * Scoped flags (issue #433028) ``(?flags-flags:...)`` The flags will apply only to the subpattern. Flags can be turned on or off. * Inline flags (issue #433024, issue #433027) ``(?flags-flags)`` Version 0 behaviour: the flags apply to the entire pattern, and they can't be turned off. Version 1 behaviour: the flags apply to the end of the group or pattern, and they can be turned on or off. * Repeated repeats (issue #2537) A regex like ``((x|y+)*)*`` will be accepted and will work correctly, but should complete more quickly. * Definition of 'word' character (issue #1693050) The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. This applies to ``\w``, ``\W``, ``\b`` and ``\B``. * Groups in lookahead and lookbehind (issue #814253) Groups and group references are permitted in both lookahead and lookbehind. * Variable-length lookbehind A lookbehind can match a variable-length string. * Correct handling of charset with ignore case flag (issue #3511) Ranges within charsets are handled correctly when the ignore-case flag is turned on. * Unmatched group in replacement (issue #1519638) An unmatched group is treated as an empty string in a replacement template. * 'Pathological' patterns (issue #1566086, issue #1662581, issue #1448325, issue #1721518, issue #1297193) 'Pathological' patterns should complete more quickly. * Flags argument for regex.split, regex.sub and regex.subn (issue #3482) ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. * Pos and endpos arguments for regex.sub and regex.subn ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. * 'Overlapped' argument for regex.findall and regex.finditer ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. * Unicode escapes (issue #3665) The Unicode escapes ``\uxxxx`` and ``\Uxxxxxxxx`` are supported. * Large patterns (issue #1160) Patterns can be much larger. * Zero-width match with regex.finditer (issue #1647489) ``regex.finditer`` behaves correctly when it splits at a zero-width match. * Zero-width split with regex.split (issue #3262) Version 0 behaviour: a string won't be split at a zero-width match. Version 1 behaviour: a string will be split at a zero-width match. * Splititer ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. * Subscripting for groups A match object accepts access to the captured groups via subscripting and slicing: >>> m = regex.search(r"(?P.*?)(?P\d+)(?P.*)", "pqr123stu") >>> print m["before"] pqr >>> print m["num"] 123 >>> print m["after"] stu >>> print len(m) 4 >>> print m[:] ('pqr123stu', 'pqr', '123', 'stu') * Named groups Groups can be named with ``(?...)`` as well as the current ``(?P...)``. * Group references Groups can be referenced within a pattern with ``\g``. This also allows there to be more than 99 groups. * Named characters ``\N{name}`` Named characters are supported. (Note: only those known by Python's Unicode database are supported.) * Unicode codepoint properties, including scripts and blocks ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: 1. ``Latin``, the 'Latin' script (``Script=Latin``). 2. ``Cyrillic``, the 'Cyrillic' script (``Script=Cyrillic``). 3. ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). 4. ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). A short form starting with ``Is`` indicates a script or binary property: 1. ``IsLatin``, the 'Latin' script (``Script=Latin``). 2. ``IsCyrillic``, the 'Cyrillic' script (``Script=Cyrillic``). 3. ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). A short form starting with ``In`` indicates a block property: 1. ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). 2. ``InCyrillic``, the 'Cyrillic' block (``Block=Cyrillic``). * POSIX character classes ``[[:alpha:]]``; ``[[:^alpha:]]`` POSIX character classes are supported. This is actually treated as an alternative form of ``\p{...}``. * Search anchor ``\G`` A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: >>> regex.findall(r"\w{2}", "abcd ef") ['ab', 'cd', 'ef'] >>> regex.findall(r"\G\w{2}", "abcd ef") ['ab', 'cd'] 1. The search starts at position 0 and matches 2 letters 'ab'. 2. The search continues at position 2 and matches 2 letters 'cd'. 3. The search continues at position 4 and fails to match any letters. 4. The anchor stops the search start position from being advanced, so there are no more results. * Reverse searching Searches can now work backwards: >>> regex.findall(r".", "abc") ['a', 'b', 'c'] >>> regex.findall(r"(?r).", "abc") ['c', 'b', 'a'] Note: the result of a reverse search is not necessarily the reverse of a forward search: >>> regex.findall(r"..", "abcde") ['ab', 'cd'] >>> regex.findall(r"(?r)..", "abcde") ['de', 'bc'] * Matching a single grapheme ``\X`` The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. * Branch reset (?|...|...) Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. Examples:: >>> import regex >>> regex.match(r"(?|(first)|(second))", "first").groups() ('first',) >>> regex.match(r"(?|(first)|(second))", "second").groups() ('second',) Note that there is only one group. * Default Unicode word boundary The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. * SRE engine do not release the GIL (issue #1366311) The regex module can release the GIL during matching (see the above section on multithreading). Iterators can be safely shared across threads. Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Python Software Foundation License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.1 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Topic :: Scientific/Engineering :: Information Analysis Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing Classifier: Topic :: Text Processing :: General regex-2014.02.16/Python2/0000777000000000000000000000000012300214544012711 5ustar 00000000000000regex-2014.02.16/Python2/Python25/0000777000000000000000000000000012300214544014341 5ustar 00000000000000regex-2014.02.16/Python2/Python25/_regex.pyd0000666000000000000000000105500012300213543016327 0ustar 00000000000000MZÿÿ¸@€º´ Í!¸LÍ!This program cannot be run in DOS mode. $PEL cSà# ¨VXÀ`aИç `Hpì  8" r¨.textˆ§¨`0`.dataˆ^À`¬@`À.rdataÓ Ô @`@.eh_framüABà@0@.bssxP€0À.edataH`"@0@.idataì p$@0À.CRT€2@0À.tls 4@0À.reloc8" $6@0BU‰åSƒì‹Pda…Òt4‹Pdaƒë9Úw‹…ÀtóÿЋPdaƒë9Úvë‰$è ÇPdaÇ$è ƒÄ[ÉÃU‰åWVSƒì,‹u‹] ‹}ƒût=‰|$‰\$‰4$èÝ ƒì …Ûu‹Pda…Ò„„‰Eäèdÿÿÿ‹Eäeô[^_É vÇ$€è°Ÿ£Pda…ÀtcÇ£Pda¡àòca…Àt‰|$ÇD$‰4$ÿЃì 誡èí£‰|$ÇD$‰4$èU ƒì …Àt†eô[^_É 1Àeô[^_É èGŸÇ 1ÀéiÿÿÿfU‰åƒìÇD$PdaÇD$Pda‹E‰$蟃øÀÉÃU‰åƒìÇD$PdaÇD$Pda‹E‰$è÷žÉÃU‰åƒìÇ$ baèr¥R…ÀteÇD$ ba‰$èe¥ƒì…ÀtÇD$PdaÇ$daÿЋ „ba…Ét1Ç$) baè/¥R…Àt*ÇD$7 ba‰$è"¥ƒì…Àt Ç$„baÿÐÉø맸ëâU‰åƒìÇ$ baèæ¤Q…Àt%ÇD$K ba‰$èÙ¤ƒì…Àt Ç$daÿÐÉÃv¸ëç‹D$‹T$¶Ãv‹L$ ‹D$‹T$ˆ ËD$D$Ãv‹T$‹D$·PÃv‹L$ ‹T$‹D$f‰ PÃv‹D$‹T$BËT$‹D$‹ËL$ ‹T$‹D$‰ ËD$‹L$ðËD$ƒè ƒø–ÀÃf1ÀËD$‹T$‰H¿ƒùwƒð ‰B¸ÃfHŸƒùvê¸Ãf‹D$P¿ƒúwƒð ËD$‹T$H¿ƒùv‰¸Ã𠉸ËD$‹T$‰ƒøIt!ÇBIƒøit)¸¹Ç iÃv¸¹Ç iÃf¸ÃfVSƒì‹t$ ‰óÁëƒûNv 1ÀƒÄ[^Ãæÿÿ‹D$$‰$ÿ çaa9ðt…ÛuÛƒîƒþwÓÿ$µ€ ba°ëɺˆÁÓúˆÐƒà빺ø0ˆÁÓúˆÐƒà멺ˆÁÓúˆÐƒà뙺ÀˆÁÓúˆÐƒà뉺>ˆÁÓúˆÐƒàévÿÿÿº€ˆÁÓúˆÐƒàébÿÿÿºpˆÁÓúˆÐƒàéNÿÿÿ‹T$‹D$ƒøvf…Ò”ÀÉD$‰T$éÿÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F ‰$ÿ–t ‰D$Ç$Mè¨ÿÿÿ„À•Â;^|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^}ã‰\$‹F ‰$ˆT$ÿ–t ‰D$Ç$Mè]ÿÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F ‰$ÿ–t ‰D$Ç$Mèÿÿÿ„À•Â;^|1À„Òt1ÀƒÄ$[^Ã1Ò;^}ë‰\$‹F ‰$ˆT$ÿ–t ‰D$Ç$MèÙþÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F ‰$ÿ–t ‰D$Ç$Mè—þÿÿ„À•À‰Ç;^|1À1øƒÄ[^_Ã1ÿ;^}î‰\$‹F ‰$ÿ–t ‰D$Ç$MèYþÿÿ„À•À1øƒÄ[^_ÃvWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F ‰$ÿ–t ‰D$Ç$MèKýÿÿ„À•À‰Ç;^|1À1øƒÄ[^_Ã1ÿ;^}î‰\$‹F ‰$ÿ–t ‰D$Ç$Mè ýÿÿ„À•À1øƒÄ[^_ÃvVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F ‰$ÿ–t ‰D$Ç$MèÈüÿÿ„À•Â;^|1À„Òt1ÀƒÄ$[^Ã1Ò;^}ë‰\$‹F ‰$ˆT$ÿ–t ‰D$Ç$Mè…üÿÿ„À•ÀŠT$ë¾fVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F ‰$ÿ–t ‰D$Ç$MèDüÿÿ„À•Â;^|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^}ã‰\$‹F ‰$ˆT$ÿ–t ‰D$Ç$Mèùûÿÿ„À•ÀŠT$ë¶f‹D$Pöƒúv=…t=( t=) ”ÀððËD$ƒøItƒøit=0t=1”ÀÃf°ðËD$‹T$‰ƒøItIÇBIƒøit!ÇBi=0uS¸¹ Ç 1ÃÇB0¸¹ Ç 1ÃvÇBiÇB0¸ …@Ç 1ÃÇB 0=1¸uÜÊH.Q÷€úTv ‹P …Òt>öÒÿ$•œ baf‹P(‹R…Òtè‹ëÒf‹ŠJ.ƒéF€ùwÕ‰ÐËP(‹J…ÉtÈ‹@Ãf€ùAw½¶Éÿ$ð!ba‹ŠQ.€út€úDu£‰ÈÃfUWVSƒì,Š\$@ˆ\$‹˜p ‹s ‹x ‹@ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ërëC9ët¶‰$ÿÖ:D$uí‰Ú)ú‰ÐƒÄ,[^_]Ãv—,9ër ëƒÃ9Ýv ‹‰$ÿÖ:D$uì‰Ú)úÁú‰ÐƒÄ,[^_]ÃvW,O9ër ëƒÃ9Ýv·‰$ÿÖ:D$uë‰Ú)úÑú‰ÐƒÄ,[^_]ÃvUWVSƒì,Š\$@ˆ\$‹˜p ‹s ‹x ‹@ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ëwëK9ët¶Cÿ‰$ÿÖ:D$uì‰Ú)ú‰ÐƒÄ,[^_]Ãf—,9ëw ëƒë9Ýs‹Cü‰$ÿÖ:D$uë‰Ú)úÁú‰ÐƒÄ,[^_]ÃfW,O9ëw ëƒë9Ýs·Cþ‰$ÿÖ:D$uê‰Ú)úÑú‰ÐƒÄ,[^_]Ãf‹D$ 9D$”ÀÃUWVSƒì‹‹R‰$ƒút?‹` ‰T$~'‹r‹Z ‹H1Ò‹<Ö‹lÖ‰9‰i‹<“‰yBƒÁ;$uå‹L$‹‰` ƒÄ[^_]ÃWVS‹‹s$…Òtx‹ …Étm¹ë0v<[»‹x(ŸÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 r6‹Š9ÞÌ)󛋸œ ßÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 sÊ[^_Ã…ö~+‹P(ƒÂ1ÉÇÇBÿÿÿÿÇBÇBÿÿÿÿAƒÂ49ñuÝ‹Kx…É~Å‹€œ ƒÀ1ÒvÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿBƒÀ(9ÊuÝ[^_ÃVS‹ˆ„ ‹I(‹\‘‹°˜ Þ;q w ‹t‘9´ˆ r1À[^Ãf˜¤ ;˜¨ –À[^Ãf‹D$‹@0@Ãv‹D$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿÃUWVSƒì‰Æ‰Ó1ÿ‹C,¨ …4€{.Zv‹ëëf¶S.ÿ$•ø"ba‹‰ðèÇÿÿÿ‰Å‹S‰ðè»ÿÿÿf9ïs‰ïf9øv‰Ç‰øƒÈ f‰C,‰øƒÄ[^_]Ãf‹C(ƒxÿ•D$„Ž‹S‰ðè|ÿÿÿ‹S(‹‹ndTU½fƒ fƒøtfƒ €|$„fƒÿ‚Df9ïs‰ïf9øv‰Ç‹C, øƒÈ f‰C,‰øƒÄ[^_]Ë¿é%ÿÿÿ‹‰ðèÿÿÿ‰Å‹S‰ðèÿÿÿf9ïs‰ï·×·È‰Ö9Ê}‰Îƒþ޽9ʌ͉úƒÊ éµv‹C(‹h‹‰ðèÁþÿÿ‹S(‹‹NdQf‹ ‰ÎƒÎf‰2fƒøtƒÉf‰ E„Ðfƒÿs¿f9øw8‰øfƒÿs0¸ë)‹S‰ðènþÿÿ‰Å‹‰ðècþÿÿ‰Â‰øf9ïs‰èf9Âv‰Ð‰ÂƒÊ f‰S,ƒÄ[^_]Ãvfƒÿƒêþÿÿ¿éàþÿÿº0¿f‰S,‰øƒÄ[^_]Ã‰ÂƒÊ ‰Çëév¿é²þÿÿf‹‰ðèïýÿÿ‰Å‹S‰ðèãýÿÿ‹S(‹‹NdQfƒý„gþÿÿé^þÿÿfƒÿƒ1ÿÿÿ¿é'ÿÿÿƒàé þÿÿSƒì‰Ã…Àu ë&€Ìf‰C,öÄu ‹C…ÀtèÜÿÿÿ‹…Ût‹C,öÄtÚƒÄ[ÃS‹‰X‰XÇ@ …Ût‰ÚfŠJ.€ùVt€ù]u‹ëïv‰P9Ót[Ãv€{.Kwõ¶S.ÿ$•d$ba‹‰P‹S ‰P [Ãf¡$PdaÿÃì,D$‰D$ D$‰D$ÇD$”%ba‹D$4‰$ÿ„rda…Àt4‹D$‰D$‹D$‰$èàóÿÿ„À•À¶À‰D$Ç$ª%baÿ˜sdaƒÄ,Ãv1ÀƒÄ,ÃfÇD$ÇD$ª%ba¡˜sdaÿàUWVSƒì\D$L‰D$ D$H‰D$ÇD$¬%ba‹D$t‰$ÿ„rda…À„„‹D$H¨ …„¨„ÈÇD$àÊaal$,‰l$‹D$L‰$‹T$ÿR0‰Ç‰$ÿørda‰Æ…ÀtC…ÿ~U1Ûë‰D$‰\$‰4$ÿsdaC9ût:‹D‰D$Ç$ª%baÿ˜sda…ÀuÑ‹H‰…Àth1ö‰ðƒÄ\[^_]ÃÇD$ Êaaë‚f‹D$H%"@="@uÚD$<‰D$‹D$L‰$‹T$ÿR8H~Á¡¨sda‰D$‰4$ÿôrdaë­vÇD$ Ëaaé3ÿÿÿv‹F‰4$ÿP1ö‰ðƒÄ\[^_]ÃvVSƒì$‰Ã‰T$Ç$½%baÿ˜sda‰Æ…Àt6‰D$‰$ÿôrda‹J‰…Òt ÷ÐÁèƒÄ$[^ËV‰4$‰D$ÿR‹D$ëá1ÀƒÄ$[^ÃWVSƒì‹\$ ‹|$$‰ƒûItcÇGIƒûitO¾¸ÇiÇ$i讎9Øt ƒøIt‰·FÇ$IèŽ9Øt ƒøit‰·F‰ðƒÄ[^_Ãv¾뻾¸ë§Sƒì‹D$ ‹\$$=ÿv ‰¸ƒÄ[É$èHމ¸ƒÄ[ËD$=ÿwé,ŽÃvWVSƒì‹\$ ‹|$$‰‰$èŽ9Øt$¾‰G‰$èü9Øt‰·F‰ðƒÄ[^_Ãv‹G¾ë×fSƒì‹\$ ‰$èăøIt‰$迃øi”ÀƒÄ[ðƒÄ[ÃSƒì‹D$ ‹T$$·Øúÿw ‰ÁÁéƒùNv …Û”ÀƒÄ[Ãÿ$À%baK”Àëìf¡ýÿÿƒ|$(„Yýÿÿ‹D$ ‰D$Ç$Mè èÿÿˆÃ‹D$$‰D$Ç$Mèóçÿÿ‰ê8Ó„%ýÿÿ8”ÀƒÄL[^_]Ã|$(„ ýÿÿƒ|$0…ÿÿÿƒ|$( …øþÿÿ1Àéòüÿÿƒ|$( …(þÿÿ1Àéàüÿÿƒ|$0 t ƒ|$0…·þÿÿƒ|$( „Áüÿÿ¸ é¢þÿÿ‹D$0ƒè ƒø‡±þÿÿƒ|$(…¼þÿÿ1Àé—üÿÿ‹D$(ƒè ƒø‡¯þÿÿƒ|$8…¤þÿÿ1Àétüÿÿfƒ|$( …þÿÿ1Àé`üÿÿƒ|$0„~þÿÿƒ|$0 „sþÿÿƒ|$0…›þÿÿécþÿÿ‹D$$‰T$è#ûÿÿ„À‹T$„uýÿÿ°éòûÿÿÇD$0éaýÿÿ1ÀéïýÿÿÇD$8éýÿÿv1É‹T$‹D$éiûÿÿ¹‹T$‹D$éVûÿÿfUWVSƒì,‹|$@‹G0@‰$ÿpsda‰Å…Àtq‹G$‰D$‹G ‰D$Ç$ˆ'ba¡˜sda‰D$ÿÐ…Àt@‰E ‹G0…À~P1ö1ÛëfC‰D ƒÆ9_0~;‹G4ð‹P‰T$‹‰D$Ç$ˆ'baÿT$…ÀuÒ‹EH‰E…Àt1í‰èƒÄ,[^_]ÃvÿE‰o8‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]ÃvUWVSƒì,Ç$hÿpsda‰Æ…ÀtN1Ûl$‹=Œsdaë‰D$‰\$‰4$ÿxsdaCƒûht)f‹„àèaaf‰D$ÇD$‰,$ÿ×…ÀuË‹H‰…Àt1ö‰ðƒÄ,[^_]Ãf‹F‰4$ÿP1ö‰ðƒÄ,[^_]ÃvVSƒì$‰Ö‰$ÿärda‰Ã…Àt.‰t$‰$ÿ0sda‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ã1ÀëõVSƒì‰Ã‰Ö¡ Pda…À„†ƒÃƒûv"ÇD$ð(ba¡Ôrda‹‰$ÿÄrdafƒÄ[^Ãfÿ$)baÇD$2(ba¡Ôrda‹‰$ÿÄrdaëÖf‹F‹@ ‰D$ÇD$¤(ba¡Ürda‹‰$ÿ´rdaë°‹F‹@ ‰D$ÇD$|(ba¡Ürda‹‰$ÿ´rdaëŒÇD$'ba¡ Pda‰$ÿÄrdaéqÿÿÿÇD$D(ba¡Ürda‹‰$ÿÄrdaéSÿÿÿvÇD$Ì(ba¡Ðrda‹‰$ÿÄrdaé3ÿÿÿv…ö„¨‹F‹@ ‰D$ÇD$Ð'ba¡Ürda‹‰$ÿ´rdaéÿÿÿÇD$d(ba¡ Pda‰$ÿÄrdaéåþÿÿÇD$Ú(ba¡ Pda‰$ÿÄrdaéÉþÿÿ¡¸rdaƒÄ[^ÿàÇD$³'ba¡àrda‹‰$ÿÄrdaéŸþÿÿvº‹'ba¸‘'baè þÿÿ£ PdaéaþÿÿvÇD$(ba¡Ürda‹‰$ÿ´rdaécþÿÿvUWVSƒì‹\$0‹D$4…ÀˆÕ;C0Ì…À„€t@ý‹C44ð‹F‰$ÿørda‰Ç…À„—‹F…À„Œ1Û‹-˜sdaëv‹W ‰šC9^vsÝF‹P‰T$‹‰D$Ç$ˆ'baÿÕ…ÀuЋH‰…Àtk1ÿ‰øƒÄ[^_]ÃvÇ$ÿørda‰Ç…Àt$‹C$‰D$‹C ‰D$Ç$ˆ'baÿ˜sda…Àt¶‹W ‰‰øƒÄ[^_]Ãv1Ò¸òÿÿÿè0ýÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÎvUWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpt@ý‹K44ñ‹F‰$ÿørda‰Ç…À„€‹V…Òty1Û‹-˜sdaëv‹W ‰šC9^v`‹F‹D؉D$Ç$ª%baÿÕ…ÀuÜ‹H‰…Àtc1ÿ‰øƒÄ[^_]ÃvÇ$ÿørda‰Ç…Àt‹C$‰D$Ç$ª%baÿ˜sda…Àt½‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿè8üÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì‹\$0‹D$4…Àˆ±;C0¨…Àtht@ý‹{44÷‹F‰$ÿørda‰Ç…Àt|‹^…Ûtu1Û‹-˜sdaëv‹W ‰šC9^v\‹F‹؉D$Ç$ª%baÿÕ…ÀuÝ‹H‰…Àt`1ÿ‰øƒÄ[^_]ÃÇ$ÿørda‰Ç…Àt‹C ‰D$Ç$ª%baÿ˜sda…ÀtÀ‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿèHûÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì,‰Ã‰Õ…Àt*…Òt.‰Ç1ö¡sda‰D$‹G‰$ÿT$FƒÇ9îuî‰$ÿT$ƒÄ,[^_]ásda‰D$ëæUWVSƒì,‰Ã‰T$…Àt.…Ò~2‰Æ1ÿ‹-sda‹F‰$ÿÕ‹F‰$ÿÕGƒÆ4;|$uæ‰$ÿÕƒÄ,[^_]Ë-sdaëëSƒì‰Ã‹€¸ t ÿÌrda‰CƒÄ[Ãì‹€º t ‹@‰$ÿÈrdaƒÄÃfVSƒì‰Ã‰ÖèÒÿÿÿ‰4$ÿsda‰ØƒÄ[^ë Sƒì(‰ÓÁë= Êaa„¤= ËaaBÿ„¶ƒøwI‹Kt[^_ÃvÐÖ9ðs%1Û€8 •Ãçÿ9ûtë1É€8 •Á9Ùu@9ðuï)Ð[^_ʲ9Øs)1Ƀ8 •Á‰Îçÿ9þtë1Ƀ8 •Á9ñuƒÀ9Ãwí)ÐÁø[^_ÃJr9Øs.1Éfƒ8 •Á‰Îçÿ9þtëv1Éfƒ8 •Á9ñuƒÀ9Ãwì)ÐÑø[^_ÃWVS‰Ã‰È‹t$¶|$ƒû„‹ƒûtBKt[^_ÃvÐÖ9ðv*1Û€xÿ •Ãçÿ9ûtëv1É€xÿ •Á9ÙuH9ðuî)Ð[^_ʲ9Øv.1Ƀxü •Á‰Îçÿ9þtëv1Ƀxü •Á9ñuƒè9Ãrì)ÐÁø[^_ÃvJr9Øv/1Éfƒxþ •Á‰Îçÿ9þtëf1Éfƒxþ •Á9ñuƒè9Ãrë)ÐÑø[^_ÃvWVSS‰Ã‰Ï‹D$‹t$ŠL$8L$ ”D$‹ƒû„ˆƒûtGKtZ[^_ÃvÐÖ9ðs,¶9ٔöۉ߶\$9ßtë¶9ٔöÛ9ûu@9ðuì)ÐZ[^_Â4²9ðs(1Û;”Éß¶\$9ßtëf1Û;”Ã9ûuƒÀ9Æwî)ÐÁøZ[^_ÃB4r9ðs0·9ٔöۉ߶\$9ßtëf·9ٔöÛ9ûuƒÀ9Æwê)ÐÑøZ[^_ÃUWVSƒì<‰Ã‹|$P‹l$T‹@ ‰D$8L$X”Á‹ƒp t$ ‰t$‹‰$ˆL$ÿP0‹SƒúŠL$„·ƒút^Jt ‰øƒÄ<[^_]Ã|$l$9ïs2‹T$ ‰T$Š…À~¶Û;\$t)1Òë;–tB9Âuö1Ò8ÑuG9ïu×+|$‰øƒÄ<[^_]òëä‹T$<º,ª9ïs1‹T$ ‰T$f‹…À~;\$t,1Òë;–t#B9Âuö1Ò8ÑuƒÇ9ýwÙ+|$Áÿ‰øƒÄ<[^_]òëà‹T$¯ÿÿ„ÀtBƒþt%ƒþt@…öu4‹C‰ÂSx*;S%‰SC °ëv‹S‹C€{(t Ðx;C~v1À[^Ãv‹CC °[^ÉC°ëçVS‰Ó‹r$‰òèήÿÿ„ÀtBƒþt%ƒþt@…öu4‹C‰ÂSx*;S%‰SC°ëv‹S‹C€{(t Ðx;C~v1À[^Ãv‹CC°[^ÉC°ëç‹D$‹@…ÀtÿÃf¡¨sdaÿÃì‹D$ ‹@(…Ày¡¨sdaÿƒÄÃv‰D$Ç$ª%baÿ˜sdaƒÄÃv‹D$ƒøItƒøit=0t=1tégAvÃvUWVSƒì‹D$0‹\$4…Û~;X| °ƒÄ[^_]Ãf‹¸t ‹h ‰\$‰,$ÿ׉$è%‰ÆK‰\$‰,$ÿ׉$èò$ƒøtMƒøt¼ƒøt·ƒþt²ƒþt­ƒþt¨ƒøtWƒø t6ƒøt1ƒø t<ƒø t7ƒøtZƒþt%ƒþt ƒø •Àéwÿÿÿƒþ•ÀékÿÿÿVøƒúwÇ1Àé[ÿÿÿƒþ uÄ1ÀéNÿÿÿVùƒúväƒþ t߃þ u°1Àé5ÿÿÿvƒþu¡1Àé&ÿÿÿUWVSƒì<‹|$P‹t$T…ö~ ‹D$T;G| °ƒÄ<[^_]Ãf‹‡t ‰D$ ‹_ ‹D$T‰D$‰$ÿT$ ‰$è¬#‰D$‹t$TN‰t$‰$ÿT$ ‰$è#ƒø„׃øt¦ƒøt¡ƒ|$tšƒ|$t“ƒ|$tŒ…öˆ‹l$ ‰t$‰$ÿÕ‰$èK#ƒøt ƒø …ýNƒþÿuÛ‰D$$ÇD$(‹G‹l$T9D$T}=‰t$‰Þ‹\$ ‰l$‰4$ÿÓ‰$è#ƒøt ƒø …¡E‹W9Õ|Ù‰ó‹t$‰D$‰ÐE9Åy‰t$,‰þ‹|$ f‰l$‰$ÿ׉$è»"ƒøtƒø uE;n|ß‹t$,‰Âƒ|$$ „*ƒ|$$„…öx‰t$‰$‰T$ÿT$ ƒø'‹T$„ëƒ|$$ „ă|$$„¹ƒ|$( „^ƒ|$(„Sƒ|$$„€ƒ|$(„ƒ|$$„²ƒ|$$ tƒ|$$u ƒ|$„‘ƒ|$(„çƒ|$$„ƒ|$$ „$ƒ|$$ …•ƒ|$t^ƒ|$$„ƒ|$$…äýÿÿƒ|$•ÀéÙýÿÿvƒ|$•ÀéÉýÿÿvƒ|$ tƒ|$t ƒ|$….ÿÿÿƒú t ƒú… ÿÿÿ1Àé—ýÿÿƒ|$ tñƒ|$…Ïþÿÿ1Àé}ýÿÿv‰ó‹t$‰D$‹Géaþÿÿf‰D$$‰õMˆè‰|$,‰÷‰Þ‹\$ v‰l$‰4$ÿÓ‰$è!ƒøtƒø uMƒýÿu߉ó‰þ‰D$(‹|$,éÇýÿÿfƒ|$$ tƒ|$$t ƒ|$$…”þÿÿƒ|$ „Tÿÿÿƒ|$…~þÿÿ1Àéàüÿÿfƒ|$„5ÿÿÿƒ|$…jþÿÿƒú…aþÿÿ1Àé¸üÿÿfƒ|$$…Xþÿÿƒ|$…žüÿÿ1Àé™üÿÿvƒ|$„íþÿÿƒ|$ „âþÿÿƒ|$…Fþÿÿ1Àénüÿÿƒ|$$„`þÿÿƒ|$$„Uþÿÿƒ|$$ „Jþÿÿƒ|$$…Qþÿÿé:þÿÿ‹D$$ƒè ƒøv ƒ|$$…þÿÿƒ|$…÷ýÿÿ1Àéüÿÿf‹D$ƒè ƒøv ƒ|$…øýÿÿƒú…ïýÿÿ1Àéëûÿÿƒ|$ …Üýÿÿ1ÀéØûÿÿƒ|$ „/þÿÿƒ|$„$þÿÿƒ|$„þÿÿƒ|$ •Àéªûÿÿ‹D$T‰D$‰$ÿT$ èL´ÿÿ„À‹T$„õüÿÿéƒûÿÿ1Òé³üÿÿÇD$$éþÿÿÇD$(éüÿÿfUWVSƒì,‰Ã‰Ö‹@‹”sda9Ðt\‰T$‰$‹-€sdaÿÕ…ÀuI‹C‹xP…ÿt‹…Àt‹G…ÀtÇD$‰$ÿÐHtFÇD$@.ba¡Ürda‹‰$ÿÄrda1ÀƒÄ,[^_]ËC ‰‹C‰FÇFÆF ÆF °ƒÄ,[^_]ÃÆF ‰t$ÇD$‰$ÿ‰Ç…ÀxU‰$ÿDsda‰Â‹C‹ \sda9Èt)‰L$‰$‰T$ÿÕ…À‹T$u9×tÇD$s.baéiÿÿÿvÇF‰VÆF °ëŠfÇD$Z.baéEÿÿÿvSƒì‰$ÿsda‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿ訹ÿÿ‰ØƒÄ[ÃUWVSƒìL‰D$‰T$$ˆL$‹r$ƒþ °ƒÄL[^_]Ëz(¸èžÿÿÿ‰D$,µèŽÿÿÿ‰D$ ‹T$,…Ò„°…À„¨1À‹T$,‰4‚@=uõ»l$0‰t$‰|$‹|$,ëf%ÿ‰4‡C;\$tB‹t$)Þ‹T$‹Dšü€|$t܉l$‰$‹T$ÿR0…À~Ò1Ò‹L•áÿ‰4B9ÂuîC;\$u¾‹t$‹|$€|$…±ÇD$¬`anþƒî‰t$(ÆD$ÇD$»‰ðØx$T‹—‰T$‹‡‰D$‹D$‰$ÿT$„ÀtuKuÖ­…öxs‹‰D$‹·‰D$‹D$‰$ÿT$„ÀtVN€|$…މt$(ÆD$‹\$K…íy‹D$,‹T$$‰B‹D$ ‰B°ƒÄL[^_]ÃÇD$(E`aéJÿÿÿfN‹\$KéYÿÿÿ‰è)ð‹T$ ‰M€|$uN…öxÿD$ÆD$ë‹t$(…öyì…íx™‹T$ ‰è)ð‰ªMNƒýÿuòë…ÆD$érÿÿÿ‹D$,‰$‹sdaÿÓ‹D$ ‰$ÿÓ1ÀéüýÿÿvUWVSƒì<‰Æ‰Ó‰L$‹(‹R$‰ÈÐ;D$PXöC,€„Ü‹{…ÿtU‹E ‰D$ ‹K(‹[‰\$rÿµ‹‰D$‹D$P)Љ$‹Eƒø„¾ƒø„ÍH„†¸ÿÿÿÿƒÄ<[^_]Ëu ‰t$‹K(‹‹D$P)Ћuƒþ„Vƒþ„NuÈ‹t$t$‹l$Å9îv ë´fF9õr­¶9Ãuôƒúv!¶F;Auæ¸ë v¶<;Gba‰Í¯î‰ù¶Ñ‰t$‰,$1Éè^ûÿÿ…ÀtfH,…ö~‹x(1Òv‹ “‰ —B9òuõƒÄ[^_]Ã1íë¿UWVSƒì‰Ã…Àtk‹@(4•,0‹}B‰T$ …ÿt9 tM1Òë9L•tBB9úuõ‹S$•‰L$è®úÿÿ…À‹L$t,ÿC$‰C(Æ‹‹T$ Ú‰ C‰°ƒÄ[^_]Ãf°ƒÄ[^_]Ã1ÀëôfUWVSƒì‰Å‰×‰Î‹\$0…Ût;‹C,¨@u4ƒÈ@f‰C,ŠC.ƒèGba‰4$èèÿÿ…À„Ýþÿÿƒ‹S‹*…í„å‰B‰CÿC ‹é¸òÿÿ‹CÇD$Ç$1ɺè:èÿÿ…À„–þÿÿƒ‹S‹:…ÿ…ýòÿÿ‰éùòÿÿvƒ|$$… øÿÿƒ|$(…øÿÿ‹|$ ‰Þ¹ ó¥ÆD$jÆD$kD$Lè òÿÿƒø…Qòÿÿ‹D$Lƒ8…Kûÿÿ‹T$X‰S ŠT$jSŠT$kSƒÀ‰‹T$\‹C‹…É„â‰P‹D$`‰C‹ésòÿÿƒù…ûÿÿB‰{ éÙñÿÿf‰Eéýÿÿ‹H¶Ò‹CÇD$Ç$èSçÿÿ…À„¯ýÿÿƒ‹S‹2…ö„ljBéñûÿÿv‰ê‰ðèÛðÿÿ„À…öÿÿ¸÷ÿÿÿéñÿÿ‰ê‰øèWðÿÿ„À…õÿÿ¸÷ÿÿÿéqñÿÿ‰ò‰èè£ðÿÿ„À…Tòÿÿ¸÷ÿÿÿéUñÿÿ‰(é üÿÿf‰ÂÑâ‹Edè”æÿÿ‰D$<…À„ ýÿÿ‹L$0)ùÑáx1À‰×óª‹D$<‰Ed‹T$0‰U`éøöÿÿ‰8éòÿÿ‰0é¸ôÿÿ‰Â‰ðèÍïÿÿ„À„Ýüÿÿéâúÿÿ‰é+ûÿÿ‹CÇD$Ç$1ɺ èOæÿÿ‰Å‹CÇD$Ç$1ɺ è/æÿÿ‰Â…턉üÿÿ…À„üÿÿ‹|$ ‰Þ¹ ó¥ÆD$jÆD$kD$L‰T$è!ðÿÿƒø‹T$…dðÿÿ‹D$Lƒ8…^ùÿÿŠL$jKŠL$kKƒÀ‰€|$7„Æ‹D$\‹M…É„ú‰U‹D$`‹8…ÿ„ÉP‹C‹0…ö„¬‰h‰S‹égðÿÿ‰éýÿÿ‰é óÿÿ‰Eéòòÿÿ‰(éÙòÿÿ‰é´øÿÿ‹t$$‰0éøÿÿƒÀ‰‰D$LÇD$XÆD$jÆD$kD$L‰T$èUïÿÿƒø‹T$…˜ïÿÿ‹D$L‰ŠD$jCŠD$kC‹D$X9ðv‰ð‹L$\‹}…ÿ„,‰M‹L$`‹1…ö„‰QéŠòÿÿ‹L$(‰é‚ôÿÿ‰(é-øÿÿ‰é_ôÿÿ‹T$$‰é;ôÿÿ‰U1Àé\òÿÿ‰(é8ùÿÿ‹T$$‰éTùÿÿ‰Eé7ùÿÿö@- …Çõÿÿ€úA‡¾õÿÿ¶Òÿ$•2ba€|$7ÀƒàƒÀX‹L$,ˆA.‹C‹0…öt%‹t$,‰p‹D$\‹T$,‰Bé³þÿÿ‰éSûÿÿ‰é½ðÿÿ‹L$,‰ëÚ‰…Ò…(öÿÿ‰éøîÿÿ‰2é öÿÿ‰…Ò…êõÿÿ‰éêõÿÿ‰ éÊõÿÿ‹E…Àt‰U‹D$\‰Eé6þÿÿ‰(éPþÿÿ‰é9þÿÿ‰U‹D$\ëá‰éwñÿÿ‰MéÏþÿÿ‰éüÿÿ‰E…À…ûýÿÿ‰UéöýÿÿUWVSì¼Ç„$ˆ„$¬‰D$0„$¨‰D$,„$¤‰D$(„$ ‰D$$„$œ‰D$ „$˜‰D$„$”‰D$„$‰D$„$Œ‰D$„$ˆ‰D$ „$„‰D$ÇD$ 3ba‹„$Ô‰$ÿ„rda…À„’‹„$Œ‹h­‰T$P‰ÐèÚ²ÿÿ‰Æ…À„l…í~n1Û‹sda‰D$L‰î‰Õëf‹D$L‰<˜C9ótL‹„$Œ‹@ ‹˜‰$ÿՉǃøÿuÛÿ¼rda…ÀtÑ‹t$L‰4$ÿsda1Ò¸ÿÿÿÿè@lÿÿ1Û‰ØÄ¼[^_]ÉƋ¬$¤‹U‰T$L…Ò~‹¼rda‰T$XÿÒ…À„›ÿ°rdaÇD$\ÇD$L‹-sda‰l$X¡Áaa‰$ÿùÿÿÇC@éÈýÿÿWVSƒì‰Ó‹2‹–€ …ÒtÿÇD$‰$‹=`sdaÿ×…ÀtƒÄ[^_ÉØè¥jÿÿÇD$‹†€ ‰$ÿ׉؃Ä[^_é¥jÿÿUWVSƒì,‰Æ‰Ó‹)9*sg…Àtk‰*‹z‰L$èjÿÿTmÁâ‰øèßÚÿÿ‰Ç‰ðèJjÿÿ…ÿ‹L$t>‰{‹)‰kDmÁà‰D$‹D$@‹‰D$‰<$è¡æÇC ÿÿÿÿ°ƒÄ,[^_]ËzëÊv1ÀƒÄ,[^_]ÃfWVSƒì‰Ç‰Ö‰ËIC‰$‰øèXÿÿÿ„Àt4KVC‰$‰øèAÿÿÿ„Àt‹C(‰F(‹C,‰F,‹C0‰F0°ƒÄ[^_Ãf‹V‰øèÚiÿÿ‹V‰øèÐiÿÿ1ÀƒÄ[^_ÃvUWVSƒì‰Å‹¸° ‹G‰D$…Àt~‹E‰D$‹@‰$…À~4‹]‹O 1À1Ò‰|$ v‹4‹|‰4‰|‹t‰tBƒÀ;$uá‹|$ ‹D$‹P$…Ò~.1Û1ö‰$‰Ã‹ $O‹$U(1ÀèÿÿÿFƒ$49s$ã‹G‰D$‹‰…° ‹D$ƒÄ[^_]ÃUWVSƒì‰D$‰Ó‹‰$‹‰T$ ‹€° …À„ª‹h…턳‰]…Û„€‹D$ ‹@‰D$…À~-‹] ‹$‹J1À1Ò‹4‹|‰4‰|‹t‰tBƒÀ;T$uà‹L$ ‹Y$…Û~91Û1ö‰Ïë FƒÃ49w$~'‰Ù‹$H(‹UÚ‹D$è5þÿÿ„ÀuÝ1ÀƒÄ[^_]Ãv‹$‰ª° °ƒÄ[^_]Ë$‹¨¬ …í…Pÿÿÿvº‹D$èfÁÿÿ‰Å…Àt·‹T$ ‹B@Áâ‹D$èJÁÿÿ‰E ‹L$ ‹A$@Áâ‹D$è.Áÿÿ‰E‹U …ÒtQ…ÀtM‹L$ ‹A @Áá1ö‰×‰ðóª‹T$ ‹B$@ Áá‹U‰×‰ðóª‹$‹‚° ‰EÇE…Àt/‰hé¬þÿÿ‹D$èŠgÿÿ‹U‹D$è~gÿÿ‰ê‹D$èsgÿÿ1Àéÿÿÿ‹ $‰©¬ éwþÿÿfUWVSƒì‰Å‹D$0‹] ‰\$ 8L$8”D$ ‹½p ‹2‹Uƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ërëC9ët¶ ‰ò‰øègÿÿ8D$ t鉨+D$ ƒÄ[^_]Ãv‹T$ ‚‹D$4,‚9ër ëƒÃ9Ýv‹ ‰ò‰øèÚfÿÿ8D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹T$ B‹D$4,B9ër ëƒÃ9Ýv· ‰ò‰øè™fÿÿ8D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‹D$0‹] ‰\$ 8L$8”D$ ‹½p ‹2‹Uƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ëwëK9ët¶Kÿ‰ò‰øèfÿÿ8D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹T$ ‚‹D$4,‚9ëw ëƒë9Ýs‹Kü‰ò‰øèÝeÿÿ8D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹T$ B‹D$4,B9ëw ëƒë9Ýs·Kþ‰ò‰øèœeÿÿ8D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰D$‰Ë‹|$@€z.Av 1ÀvƒÄ,[^_]öJ.ÿ$83baÇD$‰Ù‹D$+H9ùv‰ù‰ß)ω<$‰Ù‹D$è›}ÿÿ)ÉØë½ÇD$‰Ù‹D$+H9ùv‰ù‰ß)ω<$‰Ù‹D$è'{ÿÿ)ÉØëÇD$‹D$‹H)Ù9ùv‰ùÙ‰ $‰Ù‹D$èýyÿÿ)Øé^ÿÿÿfÇD$‹D$‹H)Ù9ùv‰ùÙ‰ $‰Ù‹D$è|ÿÿ)Øé.ÿÿÿf‹J(‰L$‹D$‹p ‹hÇD$ ‰Ù+H‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èè—ÿÿ)ÉØéØþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p9þv‰þ‰ß)÷‰|$‰$‹D$è3•ÿÿ)ÉØéžþÿÿfŠJ/‹R(ÇD$‹D$‹p)Þ9þv‰þÞ‰t$‰$‹D$èe“ÿÿ)Øéfþÿÿf‹J(‰L$‹D$‹p ‹hÇD$ ‹@)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèO’ÿÿ)ØéþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p9þv‰þ‰ß)÷‰|$‰$‹D$è‘ÿÿ)ÉØéâýÿÿfŠJ/‹R(ÇD$‰Þ‹D$+p9þv‰þ‰ß)÷‰|$‰$‹D$è—üÿÿ)ÉØé¦ýÿÿfŠJ/‹R(ÇD$‹D$‹p)Þ9þv‰þÞ‰t$‰$‹D$èaûÿÿ)ØénýÿÿfŠJ/‹R(ÇD$‹D$‹p)Þ9þv‰þÞ‰t$‰$‹D$èyÿÿ)Øé6ýÿÿf‹J(‰L$‹D$‹p ‹hÇD$ ‰Ù+H‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èè)Žÿÿ)ÉØéàüÿÿŠJ/‹R(ÇD$‰Þ‹D$+p9þv‰þ‰ß)÷‰|$‰$‹D$èŒÿÿ)ÉØé¦üÿÿfŠJ/‹R(ÇD$‹D$‹p)Þ9þv‰þÞ‰t$‰$‹D$èýŠÿÿ)Øénüÿÿf‹J(‰L$‹D$‹p ‹hÇD$ ‹@)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰è迉ÿÿ)Øé$üÿÿ‰Ú‹D$+P9úv‰ú‰Ù)ÑÇ$‰Ú‹D$èÏFÿÿ)ÉØéöûÿÿf‹D$‹H)Ù9ùv‰ùÙÇ$‰Ú‹D$èÑEÿÿ)ØéÊûÿÿf‹D$‹P ‹pÇD$‰Ø‹L$+A9øv‰ø‰ß)lj<$‰Ù‰ðèCˆÿÿ)ÉØéŽûÿÿf‰Ø‹L$+A9ø†{ûÿÿ‰øétûÿÿ‹T$‹B)Ø9ø†cûÿÿëæ‹D$‹P ‹pÇD$‹@)Ø9øv‰ø؉$‰Ù‰ðè ‡ÿÿ)Øé.ûÿÿfUWVSƒì\‰D$LˆL$;‹*‹B‰D$4‹Z‹D$L‹‰D$,„Ét‹P4‰T$<‰×+x9|$4~'1í‰èƒÄ\[^_]ËD$,‹@4‰D$<‹T$,‹z)Ç9|$4Ù‹D$,‹€t ‰D$ ‹T$,‹r ‹‚p ‹@4‰D$$‹D$LèÇ_ÿÿ‹D$,‹@‰D$@ƒø„2ƒø„þHuŽÇD$(d`a9ß~‰ß‹D$@¯Çè- ÿÿ‰Ã…À„‹T$,‹‹@8‹@ ‹¨‰D$H…À„ø9|$4ê‰ú÷Ú‰T$0f€|$;„­‹D$0‰D$D…ÿ~91í‹T$<ЉD$‹D$è‰D$‰4$ÿT$ ‰$ÿT$$‰D$‰l$‰$ÿT$(E9ýuÔ‹D$@‰D$‰|$Ç$‰Ù‹T$H‹D$,è¶ÍÿÿƒøtM…ÀuOÿD$09|$4Žvÿÿÿ‰Å‰$ÿsda‹D$Lè–^ÿÿ‰èƒÄ\[^_]ÃÇD$(¼`aéÿÿÿv‰|$D1ÀéPÿÿÿ‰Å‹D$D‹T$,B4ë¹ÇD$(`aéÕþÿÿ1í먉$ÿsda‹D$Lè>^ÿÿ½þÿÿÿé=þÿÿWVSƒì‰Æ‰ÓƒùŽ¥¡Äaa‰$ÿÿÿÿf¹1`a‹T$‹D$é*ÿÿÿf¹ˆ2`a‹T$‹D$éÿÿÿf¹œ6`a‹T$‹D$éÿÿÿf¹Üž`a‹T$‹D$éîþÿÿf¹PŸ`a‹T$‹D$éÚþÿÿf¹¨Ÿ`a‹T$‹D$éÆþÿÿfUWVSƒì,‰Ã‰Ö‰Í¶|$@‹B‹ðrda9Ðtm‰T$‰$¡€sda‰D$ÿÐ…ÀuW‹F‹ sda9ÐtJ‰T$‰$ÿT$…Àu;‹F‹”sda9Ðt.‰T$‰$ÿT$…Àu‹F‹\sda9Ðt‰T$‰$ÿT$…Àt+vS0Cçÿ‰<$‰ñèžüÿÿ‰é‰Â‰ØƒÄ,[^_]éHúÿÿ‰ò¸óÿÿÿèˆQÿÿ1ÀƒÄ,[^_]ÃfUWVSƒì,‹D$@‰D$‹t$D‹n…íu‹ ¨sda1Ò‹D$ƒÄ,[^_]éþùÿÿfƒýtS‰,$ÿpsda‰Ç…Àt:…í~61Ûë ‰DŸ C9ët)‹Tž Ç$‹ ¨sda‹D$èÁþÿÿ…ÀuÙ‹H‰…Àt01ÿ‰øƒÄ,[^_]ËV ÇD$@‹ ¨sda‹D$ƒÄ,[^_]é‡þÿÿv‹G‰<$ÿP1ÿëÅvUWVSƒìL¡¨sda‰D$Jÿÿ„Ût½»öÿÿÿénÿÿÿÆ„$Š‹u ‰t$|‹t ‰\$t‹t$h‹6‰´$ÇD$`ÿÿÿÿétüÿÿ€½ „@üÿÿ;œ$Œt¶1Û‰ØÄ,[^_]Ãv‰ÐèQ.ÿÿ‰D$xé±ûÿÿ‹T$@‰”$‰„$Š• ‰Á‹t$`‹|$p‹\$@f„Òt49D$XeX‰E0€{.…… 9E,tD€½ u‰E4»é¤þÿÿf9Ç}Ò1Ûé—þÿÿ€¼$‰uÛ„Òt9D$X”Á„ÉuÌð‰Á뀽 uðë±9Ç”Áëâ‹D$D‹‹3ǃô ÿÿÿÿ‹–€…Òt ŠB.ƒèF<v‹C4…À‰éûÿÿ1Ûé*þÿÿ¶Àÿ$…$7baffƒ,y ;³ô „Yýÿÿ‰,$‰ñ‰ú‹D$DèÙ˜ÿÿ‰Æ…À‰?ýÿÿ1Ûéêýÿÿfƒ,y ;³ô „%ýÿÿ‰,$‰ñ‰ú‹D$Dèýÿÿ‰Æ…À‰ ýÿÿ1Ûé¶ýÿÿfƒ,ˆ= ‹O(‹W$„$‰D$‹C‰D$‰4$‹t$D‹è}ÿÿ‰Æ…öˆ#w9|$@„æ`‰ñ‹T$@‰”$ø‰´$ü‰Ð‰K0‹S4‹\$L‰‰KéØûÿÿ„À‹C,„e9ÆŒo8‰Æézüÿÿf‹O(‹S ‹C‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èØzÿÿ‰Æ9ÅŒBüÿÿ1Ûéíüÿÿvfƒ,y ;³ô „%üÿÿ‰,$‰ñ‰ú‹D$DèŠÿÿ‰Æ…À‰ üÿÿ1Ûé¶üÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒp ‹@‰|$P‰Çë 9õ„ìt$8‰t$‰$ÿ×8D$Huå‹|$Pé»ûÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒp ‹@‰|$P‰Çë 9õ„¨t$8‰t$‰$ÿ×8D$Huåë³v‹O(‹S ‹C‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èôrÿÿ‰Æ9ÅŒ>ûÿÿ1Ûééûÿÿvfƒ,ˆM‹O(‹W$„$‰D$‹C‰D$‰4$‹t$D‹è[zÿÿ‰Æ…öˆ(v9|$@…0þÿÿ‹T$@‹…À„…wŒ$ø‰ $‹Œ$‰Øè cÿÿ„À…ewFŠƒ „À„Yl;sqùÿÿ1ÛéTûÿÿfÇD$‰,$‰ñ‰ú‰ØèÎ^ÿÿ‰Æ9ÅŒ€úÿÿ1Ûé+ûÿÿ‹“t ‰T$l‹S <ÀƒàHMÿ‰L$8NxA‰|$H‰\$P‰l$\‹|$l‰Õ‰Ãëv9t$8„qZÞx‰t$‰,$ÿ׃ø uä‹|$H‹\$P‹l$\FéúÿÿfÇD$‰,$‰ñ‰ú‰ØèþZÿÿ‰Æ9Åðùÿÿ1Ûé›úÿÿÇD$‰,$‰ñ‰ú‰Øè]ÿÿ‰Æ9ÅÈùÿÿ1ÛésúÿÿÇD$‰,$‰ñ‰ú‰Øèª[ÿÿ‰Æ9ÅŒ ùÿÿ1ÛéKúÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè$rÿÿ‰Æ9Årùÿÿ1ÛéúÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒp ‹@‰|$P‰Çë 9õ„@t$8‰t$‰$ÿ×8D$Huåé`ýÿÿŠO/ˆL$H<ÒƒâJ‰T$8‹ƒp ‹@ ‰|$P‰Çë 9õ„t$8‰t$‰$ÿ×8D$Huåéýÿÿ„À„ˆ‹C9Æý‹C89Æò1Ûémùÿÿv„À„<;s„§øÿÿ1ÛéRùÿÿ‹‹t ‹S <ÀƒàH‰D$8;s„‚øÿÿ‰|$P‰\$H‰Ï‰Óë9õ„ Xt$8‹T$H;r„X‰t$‰$ÿ׃ø uÙ‹|$P‹\$Hé@øÿÿ‹S ‹CÇD$‰,$‰ñè@kÿÿ‰Æ9ÅŒøÿÿ1ÛéÉøÿÿvfƒ,y ;³ô „øÿÿ‰,$‰ñ‰ú‹D$Dèy™ÿÿ‰Æ…À‰ç÷ÿÿ1Ûé’øÿÿ‹S ‹CÇD$‰,$‰ñè jÿÿ‰Æ9ž÷ÿÿ1Ûéiøÿÿv‹O(‹S ‹C‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èˆkÿÿ‰Æ9Å~÷ÿÿ1Ûé)øÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒp ‹@‰|$P‰Çë 9õ„Dt$8‰t$‰$ÿ×8D$HuåélûÿÿÇ$‰é‰ò‰ØèZ(ÿÿ‰Æ9ÅŒ÷ÿÿ1Ûé¿÷ÿÿ‹O(‹S ‹C‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èxqÿÿ‰Æ9ÅÖöÿÿ1Ûé÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèPpÿÿ‰Æ9ÅŒ¦öÿÿ1ÛéQ÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèÔÛÿÿ‰Æ9ÅŒvöÿÿ1Ûé!÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè¨Úÿÿ‰Æ9ÅFöÿÿ1ÛéñöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øèsÿÿ‰Æ9ÅŒöÿÿ1ÛéÁöÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèTqÿÿ‰Æ9Åæõÿÿ1Ûé‘öÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒp ‹@‰|$P‰Çë 9õ„¤t$8‰t$‰$ÿ×8D$HuåéÔùÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒp ‹@‰|$P‰Çë 9õ„Xt$8‰t$‰$ÿ×8D$HuåéùÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè„kÿÿ‰Æ9ÅŒ.õÿÿ1ÛéÙõÿÿvÇ$‰é‰ò‰Øè~%ÿÿ‰Æ9Åõÿÿ1Ûé³õÿÿŠO/‹W(ÇD$‰l$‰4$‰ØèØiÿÿ‰Æ9ÅÚôÿÿ1Ûé…õÿÿv‰Æ9CŽÅôÿÿ1Ûépõÿÿf‹„$ø‰ñ‹´$üéþ÷ÿÿv‹l$4‰u4»‰ØÄ,[^_]Ãv‰Œ$é`õÿÿ1Ûé'õÿÿ‹s9s„hôÿÿ1Ûéõÿÿ…ö„Xôÿÿ1Ûéõÿÿ‹C89Æ~‹C9Æ~ 1Ûéíôÿÿv‰Æ9C-ôÿÿ1ÛéØôÿÿf9ÆŽ›÷ÿÿ1ÛéÇôÿÿ1Ûé¿ôÿÿ1Ûé·ôÿÿ1Ûé¯ôÿÿ1Ûé§ôÿÿ1ÛéŸôÿÿ1Ûé—ôÿÿ1Ûéôÿÿ;³ô …§øÿÿ‹ƒø ‰„$é½øÿÿf;³ô …·öÿÿ‹ƒø ‰„$éÍöÿÿ‹K4‹C‰$‹D$Dèÿÿ…Àˆ›q‰ƒô ‹–€‰Á+J$‰‹ø ‹V|…ÒˆØõÿÿ‹C49ÂÎõÿÿ‰Ðé¸ñÿÿ‹K4‹C‰$‹D$Dè$†ÿÿ‰Â…ÀˆBq‰“ô ‹†€‹@$Љƒø ‹F|…Àˆ†õÿÿ)‹C49ÂŒ|õÿÿ‰Ðéuõÿÿ‹J(‹R$„$‰D$‹C‰D$‹C4‰$‰Øè“sÿÿ…Àˆíp‰ƒô ‹”$‰“ø ‹V|…Ò‰Oÿÿÿé"õÿÿ‹J(‹R$¼$‰|$‹C‰D$‹C4‰$‰Øèßqÿÿ…Àˆˆp‰ƒô ‹”$‰“ø ‹V|…Òˆ×ôÿÿ)Љ‹C49ÂŒËôÿÿ‰ÐéÄôÿÿ‹K4‹C‰$‹D$DèÁ€ÿÿ‰Â…À‰ýþÿÿ1ÛéÚòÿÿ‹K4‹C‰$‹D$Dèž“ÿÿ…Àˆo‰ƒô ‹–€‰Ç+z$‰»ø ‹V|…Ò‰Šþÿÿé]ôÿÿ‹„$9D$XŒè\öA- …#c‹…ü @f‰…ü f…À„‰<‹•P ‹‚ H ÀЉX €{ ]†Š-»ÿÿÿÿ‰ØÄ,[^_]Ë„$‰D$‰,$‹\$hÿS‹”$:B/„§`öB- t‰Œ$„$‰$‹T$d‹D$Dèšÿÿ„À„aq‹„$…À…òÿÿéOÿÿÿv‹„$9D$p{[öA- „1ÿÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèo˜ÿÿ„À„o‹„$…À…¤ñÿÿéïþÿÿv‹„$9D$XŒI\öA- „ÑþÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè˜ÿÿ„À„ûp‹„$…À…Dñÿÿéþÿÿv‹„$‰D$‰,$‹t$hÿV‹”$:B/„G`öB- „]þÿÿŒ$„$‰$‹T$d‹D$Dèç˜ÿÿ„À„Sp‹„$…À…Øðÿÿé#þÿÿv‹„$‰D$‰,$‹\$hÿS‹”$:B/„aöB- „ñýÿÿŒ$„$‰$‹T$d‹D$Dè{˜ÿÿ„À„ÿm‹„$…À…lðÿÿé·ýÿÿv‹„$‰E4‹S(¹‹D$Dè¥ÚÿÿƒøŒÕl„Šýÿÿ‹E4‰„$‹„$‹‰„$éðÿÿ‹„$‰E4‹C(‹8‹X‰\$4‹H‹D$D‹‹s4‰ò+S9T$4:ýÿÿ‹ƒ| ‰D$L‹C ‰D$8‹D$D‰T$0‰L$,èx:ÿÿ‹‹@8‹@ ‹¸‰D$<…À‹T$0‹L$,„Og‰Ï9Ñ~‰×9|$4/g)þ‰l$Hëfv‰t$‹l$8‰,$ÿT$L‰|$‰$ÿŒsda‰Å…í„ g‰l$‹T$<‰$ÿLsda‹MI‰M…É„ÅNƒø„ÒN…À…"nOF9|$4½f€»þ u”‹k‰t$‹D$8‰$ÿT$L‰é‰úè¥ÿÿ‰Å듺‹D$Dè'“ÿÿ„À„bk‹X ÇD$…„ ‰D$‰$èßµ‹„$‹@(‹‰C‹„$‰C•ˆ ¹1À‰×óªÇ…˜ ‹„$‰…„ ‹‰„$é|îÿÿ‹„$‰D$‰,$‹t$hÿV‹”$:B/„ _öB- „ûÿÿŒ$„$‰$‹T$d‹D$Dè'–ÿÿ„À„gl‹„$…À…îÿÿécûÿÿv‹C(‹0‹](º‹D$Dè.’ÿÿ„À„}jv†ƒ‹…X ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹…ð ‰C0‹”$‹B(‹x…ÿ…(1ÿ‹@…À„}T1À‰ú„Ò„ÏR„À…¢e‹„$ø‰„$‹„$ü‰„$éZíÿÿ‹C(‹0‹‹D$DèÏÿÿ„À„Þi‹]‹K…É~$‹E1ÒvÇÿÿÿÿÇ@ÿÿÿÿÇ@ÿÿÿÿBƒÀ9Êuä‹K$…É~)‹E(1ÒÇ@Ç@ ÿÿÿÿÇ@Ç@ ÿÿÿÿBƒÀ49ÊuÜ‹\$T‹CX‹ð‹‰„$º‹D$Dè÷ÿÿ„À…»ìÿÿ»ðÿÿÿéìÿÿ‹„$9D$XŒ›YöA- „åùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè#“ÿÿ„À„k‹„$…À…Xìÿÿé£ùÿÿv‹„$9D$XŒ³VöA- „…ùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèÃ’ÿÿ„À„³i‹„$…À…øëÿÿéCùÿÿv‹´$Œ9´$„%\öC- „"ùÿÿŒ$„$‰$‹T$d‹D$D謓ÿÿ„À„&i‹„$…À…ëÿÿéèøÿÿ‹„$;„$Œ„Q;E8„ QöC- „ÁøÿÿŒ$„$‰$‹T$d‹D$DèK“ÿÿ„À„wi‹„$…À…<ëÿÿ釸ÿÿv‹„$9D$XŒ0VöA- „iøÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè§‘ÿÿ„À„j‹œ$…Û…Üêÿÿé'øÿÿvº‹D$DèúŽÿÿ„À„ug‹…X Š• ˆP‹…X ‹•𠉋D$Dèð–ÿÿ„À„=g‹P ‹» ‰|$4‹µ` ‰t$<Š… ˆD$L‹½° ‹„$‰E4Æ… ‹„$‹PÇ$1É‹D$DèAæÿÿ‰Æ…Àˆzg‹„$‹P(‰èè®ÿÿ‰½° ŠT$Lˆ• ‹|$<‰½` ‹|$4‰» ‰P N…=÷ÿÿ‹„$‹‰„$‹E4‰„$éÎéÿÿ‹C(‹D@ý‹U‹H…ɈîY‹‰„$é¦éÿÿ‹D$Dèõ•ÿÿ„À„ôe‹µð ‰t$8‹P ‹» ‰|$4‹µ` Š… ˆD$<‹½° ‰|$LÇE‹„$Œ‰E‹„$‰E4Æ… Š• ˆT$H‹„$‹PÇ$1É‹D$Dè!åÿÿ‰Ç…Àˆge‹„$‹P(ƒÂ‰èè‹ÿÿ‹L$p‰M‹D$X‰E‹T$L‰•° ŠL$<ˆ ‰µ` ‹D$4‰ƒ ‰P ‹„$€x/„×MO„æc‹E‹X…Û„íõÿÿ‹‰…` éàõÿÿ‹„$9D$p’OöA- „ÅõÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèÿÿ„À„g‹”$…Ò…8èÿÿéƒõÿÿv‹C(‹D@ý‹U‹x…ÿˆfõÿÿ‹p<þ‹\$h‹[8‰\$4‹„$ …ÀˆN‹„$‰D$‹t$|‰4$ÿT$t”$܉T$‰$ÿT$4‰Ã‹„$ ‰D$‰4$ÿT$t”$ì‰T$‰$ÿT$4‰Æ‹”$ ‹„$9WŽ 9Ë„$9D$pè@1ÛÇ„$;´$ŽD7‹„$9Ã~‹”$‹Œ”ì9Œ„Ü„Ð@‹„$ö@- „ÓZŒ$ÇD$”$‰T$‰t$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$Dè‹ÿÿ„À„nZ€¼$„¤Z‹„$9à …Û~ÿ„$‹”$ ;´$þþÿÿB‰”$ 9WöþÿÿÇ„$ ÿÿÿÿ9ØŒÂóÿÿ9´$Œµóÿÿ‹„$‹‰„$éPæÿÿ‹C(‹D@ý‹]Ëp…öˆ†óÿÿ‹P4ò‹\$h‹[8‰\$4‹Œ$ …ɈoL‹„$H‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰Ã‹„$ H‰D$‹|$|‰<$ÿT$t”$܉T$‰$ÿT$4‰Ç‹”$ ‹„$f;Ž£W…ÀŽÀ5‹„$…ÀŽŒÿÿ„À„ÜU€¼$„¾U‹„$ …Àˆ‹œ$Ç„$ ÿÿÿÿ‹‰„$éýàÿÿ‹C,‹Œ$f…ÀˆãP‹S$+L$X9Ê~ öÄ „&îÿÿ‹„$ …Àˆ)T‹[(ëef‹„$ö@- „½TÇD$ ÿÿÿÿ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$Dèz‹ÿÿ„À„vT€¼$„XT‹„$ …ÀŽ«S‹„$9D$X}ˆH‰D$‹t$|‰4$ÿT$t‹”$ J;“…gÿÿÿ‰Ð‰”$ ÿŒ$븋„$;„$Œ„„E;E<„{EöC- „>íÿÿŒ$„$‰$‹T$d‹D$Dèȇÿÿ„À„œ]‹„$…À…¹ßÿÿéíÿÿ‹„$‰D$‰,$‹\$hÿS ‹”$:B/„çNöB- „ÕìÿÿŒ$„$‰$‹T$d‹D$Dè_‡ÿÿ„À„C_‹„$…À…Pßÿÿé›ìÿÿv1Ò‹D$DèõÀÿÿ„À„2\º ‹D$Dè[ƒÿÿ„À„\‹„$‹‰„$é ßÿÿ‹„$9D$p°KöA- „?ìÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè}…ÿÿ„À„g]‹”$…Ò…²Þÿÿéýëÿÿ‹„$9D$pGöA- „áëÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè…ÿÿ„À„×\‹„$…À…TÞÿÿéŸëÿÿv‹„$9D$XŒ2FöA- „ëÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè¿„ÿÿ„À„¿]‹„$…À…ôÝÿÿé?ëÿÿv‹C(‹‰T$8‹@‰D$4‹uºV‹D$Dèÿÿÿ„À„¢Z‹T$8|Rýþ‹…X ‹L$8‰H‹L$4‰H ‹J‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9Btÿ…ð ‰B‹A(‹X…Û…UF‹‰„$éFÝÿÿ‹C(‹0v†‹M(™‹K,ÇD$Ç$‰ò‹D$DèTŸÿÿ„À„+Z‹C(@‰C(‹½ð ‹”$9{0„iK‹J(‹y9ø‚»G„´1ÿ‹A9C(‚ Y‹Œ$ƒÂ„$ø‰$‰èèDÿÿ„À•Á‰ú„Ò…4>„É…,>ÿK(éæéÿÿ‹¼$…ÿ…v@‹‰„$éyÜÿÿ‹„$‰D$‰,$‹\$hÿS‹”$:B/„?LöB- „šéÿÿŒ$„$‰$‹T$d‹D$Dè$„ÿÿ„À„¼Y‹œ$…Û…Üÿÿé`éÿÿ‹C,‹”$f…ÀˆqK‹s$‹|$p)×9þ~ öÄ „7éÿÿ‹„$ …ÀˆO‹[(ëfv‹„$ö@- „EPÇD$ ”$‰T$”$ ‰T$‰$Œ$‹T$d‹D$D芆ÿÿ„À„þO€¼$„àO‹„$ 9ÆŽN‹„$9D$p~ˆ‰D$‹D$|‰$ÿT$t‹”$ ;“…iÿÿÿB‰„$ ÿ„$빋s,‹¼$‰|$‰´$9D$H‡B‹S‹t$<‰V,‹S ‰V(‹•P ‹Š I‰Š …Éu‹’ …Òt‰•P 9D$H‚¢Ïÿÿ‹„$‹‰„$é=Âÿÿ‹3‰ò‹D$Dèç£ÿÿ…ötN‰èèXóþÿ‹C‰…ð ‹E‹@$‰D$4ƒøt/‹½h ~1Û1ö‹OÙ‹U(Ú1À臢ÿÿFƒÃ4;t$4u勉…h ‹…P ‹ J‰ …Ò…Ïÿÿ‹€ …À„Ïÿÿ‰…P éùÎÿÿ‹‰„$‹S R ŠÁá‹u(ñ‰L$4‹y,‰¼$‹q(‰t$<‹p ‰t$8‹t$<¯t$8þ‹@(‹@‰D$LÇD$Ç$‰ñ‹D$Dèƒÿÿ„À„ 9‹”$‹B(‹L$<9H„d‹L$L¯L$8ù‰L$<‹zŠO/ˆL$H‹‰D$LöG- „O‹|$8÷߉|$H‰÷+|$8´$ø‰l$\‰\$P‰óë9|$<„¢‹”$|$H‰þ‰$‰ù‹D$\è(ÿÿ„Àt×Ç$‰ù‹T$L‹l$D‹Eè Bÿÿ„Àuº‹l$\‹\$P‰ò+”$ˆl6‹¼$‰|$8‹G(;P‡Í<‹K‹|$4‰O,‹[ ‰_(‹P ‹» O‰» …ÿu‹› …Ût ‰P ‹\$8‹C(;P‚mÍÿÿ‹L$8‹‰„$‰´$éÀÿÿ‹M‹CH@Ñ€{t‹s tvý ñ‹q…ötN‰q@Áà‹t$TFL€x‹t 9Btÿ𠋉B‹C‰B‹…P ‹ J‰ …Ò…æÌÿÿ‹€ …À„ØÌÿÿ‰…P éÍÌÿÿ‹D$D‹‹ƒ„ ‹x(‹³X ‹N‰L$4‹öA-@„ ‹C‰D$<ÇD$Lÿÿÿÿº‰Ø‰L$,èµñþÿ„À‹L$,„Y ‹D$<9D$4„K ÿF‹“Œ B‰“Œ ‹ƒ” @‰D$<‰ƒ” ‹Gƒ˜ ÿƒ  ‹Gƒ¤ ŠFˆƒ ‹F ‹@(‹x 9» r;Pr‹P9“ˆ r ‹|$<;xs vƃ ‹D$L¯FD$4‰„$‰Œ$€½ „! Æ… éÂËÿÿf‹K‹SÇD$Ç$‹D$D莀ÿÿ„À„ 6‹…P ‹ J‰ …Ò…Ëÿÿ‹€ …À„qËÿÿ‰…P éfËÿÿf‹K4I ±‹u( Ž‹s ‰q(‹s‰q,‹[‰Y0‰‚ …À…5Ëÿÿ‹‚ …À„'Ëÿÿ‰…P éËÿÿ‰èèÑžÿÿ‹…P ‹ J‰ …Ò…úÊÿÿ‹€ …À„ìÊÿÿ‰…P éáÊÿÿ‹ ‰Œ$‹K‰Œ$‰‚ …À…o½ÿÿ‹‚ …À„a½ÿÿ‰…P éV½ÿÿf‹D$D‹‹ƒ„ ‹x(‹³X ‹F‰„$´‹‰”$°¾F‰„$ÔöB-@„¿ Ç„$Àÿÿÿÿ‹S‰”$¸…Àx'ÿŒƒˆ ÿ‹” T‡‹ )‹˜ ÿ‹  ‹)“¤ €¼$Š„Ñ‹S,9”$´•ˆ”$Øë v”$°‰Øè?ÿÿ„À‹„$Ô…ÿ @‰„$Ôƒø~Ö‹ƒP ‹ J‰ …Òu‹€ …Àt‰ƒP Ç„$éŸÉÿÿv‰èèyíþÿŠCˆ… ‹‰…ð ‹…P ‹ J‰ …Ò…iÉÿÿ‹€ …À„[Éÿÿ‰…P éPÉÿÿ‹D$D‹‹ƒ„ ‹x(‹³X ‹V‰T$4‰”$´‹‰„$°¾F‰„$Ô¾V ‰”$ÀÿŒƒˆ ÿ‹” T‡‹ )‹˜ ÿ‹  ‹)“¤ €¼$Š„)‹T$4;S,•ˆ”$Øëf”$°‰Øèf=ÿÿ„À‹„$Ô…o @‰„$Ôƒø~Ö‹ƒP ‹ J‰ …Òu‹€ …Àt‰ƒP Ç„$écÈÿÿv€¼$Š„Ì2‹M0‰Œ$€½ „Ë‹D$X9È„˜2‹T$@ŠB.‰|$8‹F‰„$¼¾F‰D$P‰„$ľF‰„$ȾF‰„$Ô¾N‰Œ$ÀÿŒƒˆ ÿ‹” ‹T$4|‚‹)“˜ ÿ‹  ‹?)»¤ €¼$Š„S‹|$L;{,•D$HŠT$HˆT$<ŠT$Hˆ”$Ø…ÉŽ ‹T$P…Ò• T$<ˆ”$Øëf”$°‰Øèª9ÿÿ„À‹„$Ô…S@‰„$Ôƒø~Ö‹ƒP ‹ J‰ …Òu‹€ …Àt‰ƒP Ç„$ ÿÿÿÿésÃÿÿ¾V9T$4•ÂéOýÿÿv‹D$Dè·ÿÿÿ¬rda‰Ã‹D$Dè†ÿÿ„Û„UÃÿÿ»öÿÿÿé²µÿÿ‹„$ö@- „ü+Œ$ÇD$ÿÿÿÿ”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dèï^ÿÿ„À„¦+€¼$„²+‹„$…ÀŽÅ‹”$ é*Óÿÿf‹„$ö@- „6-Œ$ÇD$”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dèg^ÿÿ„À„-€¼$„þ,‹„$9Æÿ„$‹”$ é_Úÿÿv‹F)ƒŒ )ƒ” ‹W¯Ð)“˜ )ƒ  ¯G)ƒ¤ ŠFˆƒ ‹ƒP ‹ J‰ …Òu‹€ …Àt‰ƒP Ç„$€½ …ßõÿÿ‹„$…À„žÁÿÿ‹‰„$é@´ÿÿ‹\$8‹C‹t$<‰F,‹C ‰F(‹…P ‹ J‰ …Ò…aÁÿÿ‹€ …À„SÁÿÿ‰…P éHÁÿÿ²é5÷ÿÿ‹T$8ŠB.ƒè œÿÿ1ÒéòÓÿÿ»ðÿÿÿé-œÿÿö@- „¥©ÿÿŒ$„$‰$‹T$d‹D$Dè/Dÿÿ„À„ù‹„$…À… œÿÿék©ÿÿv1Òé¢ÐÿÿöC- „W©ÿÿŒ$„$‰$‹T$d‹D$DèáCÿÿ„À„=‹´$…ö…Ò›ÿÿé©ÿÿö@- „©ÿÿŒ$„$‰$‹T$d‹D$DèœCÿÿ„À„‹„$…À…›ÿÿ騍ÿÿöC- „ΨÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè Bÿÿ„À„Ћ„$…À…A›ÿÿ錨ÿÿöC- „‚¨ÿÿŒ$ÇD$„$‰$‹T$d‹D$DèÀAÿÿ„À„n‹„$…À…õšÿÿé@¨ÿÿ‹„$‹‰„$éÛšÿÿO„ï‹U‹J…Ét‹‰•` ‹‰„$é´šÿÿ„À„ü§ÿÿ‹„$‰„$‹„$‰„$鋚ÿÿ1Ò騷ÿÿ1Òé•¿ÿÿ‹‰„$éošÿÿ‹‰„$éašÿÿ„À„©§ÿÿ‹„$ø‰„$‹„$ü‰„$é8šÿÿ‹l$H‹\$<é¡Ùÿÿ‹\$Léo×ÿÿ9D$p…h§ÿÿéµÅÿÿv‹¬$„1öéíÒÿÿ‹¼$˜ÇD$<éÐÿÿ‹‰”$ Ç„$Ç„$1À1ö1Ûé,²ÿÿ‰Ú‰œ$ Ç„$1À1öéh·ÿÿ‹V‰”$ Ç„$Ç„$1À1ÿ1Ûé̳ÿÿÇ„$ Ç„$1À1Ò1öéá¾ÿÿ‹„$ø‰„$‹„$ü‰„$é:™ÿÿ‹„$‰„$‹„$‰„$é™ÿÿ1Ûéà˜ÿÿƒÂ„$‰$‹Œ$‰èèSÿÿ„À•Àé`«ÿÿ‰D$‹\$|‰$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…5°ÿÿ‹A „$‹‰„$霘ÿÿH‰D$‹t$|‰4$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…}Ãÿÿ‹A „$‹‰„$éJ˜ÿÿ‹•p ‹Z ‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À… ÿ„$‹„$‹‰„$é ˜ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~B1Év‹4Š9ów19÷r-°‹Œ$8A/…l¹ÿÿ‹A „$‹‰„$é—ÿÿvA9ÁuÃ1Àë̉D$‹t$|‰4$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~A1Éf‹4Š9ów19÷r-°‹Œ$8A/…ˆ¸ÿÿ‹A „$‹‰„$é —ÿÿvA9ÁuÃ1ÀëÌ‹B‰B‹L$4‹T$8‹D$DèdXÿÿ„À„n‹Œ$逹ÿÿH‰D$‹\$|‰$ÿT$tƒø „ú‹„$ö@- „ú£ÿÿŒ$„$‰$‹T$d‹D$Dè„>ÿÿ„À„‹„$…À…u–ÿÿéÀ£ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‰Á‹‹D$hè:áþÿ‹Œ$:A/…O¤ÿÿ‹A „$‹‰„$é"–ÿÿ‹S(‹‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$èžñþÿ‹Œ$:A/…ó¼ÿÿ‹A „$‹‰„$éÒ•ÿÿH‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…ê¢ÿÿ‹A „$‹‰„$錕ÿÿH‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè‚÷þÿ‹Œ$:A/…©ÿÿ‹A „$‹‰„$éB•ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‰Á‹‹D$hè àþÿ‹Œ$:A/…€£ÿÿ‹A „$‹‰„$éó”ÿÿ‹•p ‹Z H‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…¬ ÿŒ$‹„$‹‰„$é±”ÿÿ‹S(‹H‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è,ðþÿ‹Œ$:A/…á»ÿÿ‹A „$‹‰„$é`”ÿÿƒÂ„$ø‰$‹Œ$‰èè¡ûþÿ„À•Àé ±ÿÿ‹B‰B‹L$4‹T$8‹D$Dè Uÿÿ„À„‹Œ$é­Äÿÿ‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè÷òþÿ‹Œ$:A/…¼Çÿÿ‹A „$‹‰„$éÇ“ÿÿH‰D$‹t$|‰4$ÿT$tƒø „½ÿŒ$‹„$‹‰„$é’“ÿÿ‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hè‰õþÿ‹Œ$:A/…ÞÆÿÿ‹A „$‹‰„$éI“ÿÿ‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…#´ÿÿ‹A „$‹‰„$é“ÿÿH‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèêñþÿ‹Œ$:A/…3¦ÿÿ‹A „$‹‰„$麒ÿÿ‰D$‹\$|‰$ÿT$tƒø „¥ ÿ„$‹„$‹‰„$醒ÿÿ‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚:9Ø–À:A/…,Éÿÿ‹A „$‹‰„$é<’ÿÿº ‹D$Dèb6ÿÿ„À„‹…X ‹”$‹R‰‹…X ‹”$‰P‹„$ø‰„$‹„$ü‰„$éã‘ÿÿH‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚©9Ø–À:A/…ÐÄÿÿ‹A „$‹‰„$阑ÿÿ‹‰„$銑ÿÿ‹K,;Œ$…‡´ÿÿ1ÿ骴ÿÿ‹œ$öC- „Z‰l$4‰Ú…ÀŽÔ œ$¼$ ¬$ë‹”$ÇD$ÿÿÿÿŒ$‰L$‰t$ ‰l$‰|$‰$‰Ù‹T$d‹D$Dèd:ÿÿ„À„r €¼$„ ‹„$…À§ÿŒ$‹”$étÿÿÿ‹‰„$éÂÿÿ‹Œ$9K,…€ÂÿÿÆD$4é¦Âÿÿ‹‰„$éšÿÿ‹‰„$éŒÿÿ9•ô …ƒ´ÿÿ‹Œ$ …ɉt´ÿÿ‹…ø ‰„$Ç„$ ÿÿÿÿ‹‰„$éKÿÿ9½ô …0µÿÿ‹„$ …À‰!µÿÿ‹…ø ‰„$‹‰„$éÿÿ‹‰„$éÿÿ9ô …¯ÿÿ‹”$ …Ò‰¯ÿÿ‹…ø ‰„$Ç„$ ÿÿÿÿ‹‰„$éÆÿÿ‹C‰„$é·ÿÿ‹‰„$é©ÿÿ‹‰„$é›ÿÿ‹‰„$éÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè6ÿÿ„À„© ‹„$…À…Pÿÿ雜ÿÿ‹‰„$é=ÿÿ;sŽÿÿ1ÛéûŽÿÿ9ô …a­ÿÿ‹´$ …ö‰R­ÿÿ‹…ø ‰„$éé­ÿÿv9½ô …¬ÿÿ‹„$ …À‰ ¬ÿÿ‹…ø ‰„$‹‰„$éÆŽÿÿ€½ … œÿÿé,ºÿÿ9•ô …f¿ÿÿ‹¼$ …ÿ‰W¿ÿÿ‹…ø ‰„$éð¿ÿÿv;sŽ_Œÿÿ1ÛéBŽÿÿº龫ÿÿºééÅÿÿºéçÂÿÿºéd³ÿÿÇ$‹Œ$‰ò‹|$D‹è¥ÿÿ„À„ñ‹„$‹P(ÆD$4éÀÿÿ‹\$HéèÞÿÿ‰ÆéyâÿÿÇ„$ ÿÿÿÿ…ÀB›ÿÿ‹Œ$…É3›ÿÿ‹„$‹‰„$éÎÿÿf‹\$8éŸÞÿÿ‰è‹¬$ ‹œ$”‰C4‰<$ÿsda‹D$Dè.Øþÿ‹E4‰„$‹„$‹‰„$éÿÿ‰ÆéØãÿÿ‰Æé…âÿÿ‰Æé>áÿÿ‰Æé#ãÿÿ‰ÆéŒàÿÿ‹¬$¬‹œ$œ‰{4‰4$ÿsda‹D$DèÉ×þÿ‹E4‰„$‹„$‹‰„$éÿÿ‹l$8‹|$<‹\$L‰»h éíÿÿ‹„$9D$pŽBšÿÿ@‰„$Ç„$‹Œ$‹”$ 1À1öéN²ÿÿ‹œ$éXüÿÿÇ„$ 1ÀéÒ°ÿÿ‹œ$é¿üÿÿ‰”$ ‰ÐéÉ«ÿÿ‰”$ ‰ÐéæªÿÿÇ„$ 1ÀéS½ÿÿÇ„$ ÿÿÿÿé°™ÿÿ»ðÿÿÿé$ŒÿÿÇ„$ ÿÿÿÿé–™ÿÿÇ„$ ÿÿÿÿ醙ÿÿÇ„$ ÿÿÿÿév™ÿÿ»ðÿÿÿéê‹ÿÿÇ„$ ÿÿÿÿé\™ÿÿÇ„$ ÿÿÿÿéL™ÿÿ»ðÿÿÿéÀ‹ÿÿÇ„$ ÿÿÿÿé2™ÿÿÇ„$ ÿÿÿÿé"™ÿÿ»ðÿÿÿé–‹ÿÿ‹Œ$ÇD$Ç$‰ò‹D$DèãMÿÿ„À…ï˜ÿÿ»÷ÿÿÿéc‹ÿÿÇ„$ ÿÿÿÿéÔ˜ÿÿ»ðÿÿÿéH‹ÿÿÇ„$ ÿÿÿÿ麘ÿÿÇ„$ ÿÿÿÿ骘ÿÿ»ðÿÿÿé‹ÿÿÇD$<¼`aé2ÃÿÿÇD$<`aé%Ãÿÿ‹‰„$ éÅÿÿ1ÀéÄøÿÿ‹Œ$éòŸÿÿ1ÀéUùÿÿÇ„$¨Ì`aÇD$L¼`aéû¿ÿÿÇ„$¨¤`aÇD$L`aéã¿ÿÿºS‹D$Dè/ÿÿ„À„¦‹…X ‰p‹”$‰P‹…ð ‰C0‰S,‹„$‰„$‹„$‰„$鈊ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éhŠÿÿ‹F‰„$ é¹ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$é9ŠÿÿÇ„$ ÿÿÿÿéy—ÿÿ‹‰„$ éÝ·ÿÿ‹Œ$éȹÿÿ÷ÚéÉÿÿÇ„$ ÿÿÿÿ…ÀE—ÿÿéûÿÿ‹F‰„$ éé±ÿÿ»ðÿÿÿ饉ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé÷–ÿÿ»ðÿÿÿék‰ÿÿÇ„$ ÿÿÿÿéÝ–ÿÿÇ„$ ÿÿÿÿéÍ–ÿÿÇ„$ ÿÿÿÿé½–ÿÿ»ðÿÿÿé1‰ÿÿ‹D$DèêÓþÿ»þÿÿÿé‰ÿÿ»ðÿÿÿé‰ÿÿÇ„$ ÿÿÿÿ醖ÿÿ‹D$8‰$‰Ú‰èè’nÿÿ‰Ã‹„$‹P(‹Œ$éĵÿÿÇ„$ ÿÿÿÿéN–ÿÿÇ„$ ÿÿÿÿé>–ÿÿ»ðÿÿÿ鲈ÿÿÇ„$ ÿÿÿÿ9ðŒ!–ÿÿ驸ÿÿ»÷ÿÿÿéˆÿÿ‰$‰ú‰èè"nÿÿ‰Ç‹œ$‹C(9x†Ø¤ÿÿÇD$Ç$‹Œ$‰ò‹D$Dè¼Jÿÿ„À…È•ÿÿ»÷ÿÿÿé<ˆÿÿf‹l$H‹D$DèïÒþÿ骕ÿÿ‹D$DèáÒþÿ»þÿÿÿéˆÿÿ1Ûéˆÿÿ»÷ÿÿÿéˆÿÿ1Ûéý‡ÿÿ»÷ÿÿÿéó‡ÿÿÇ„$ ÿÿÿÿée•ÿÿÇ„$ ÿÿÿÿéU•ÿÿ‹l$H‹D$DèˆÒþÿéC•ÿÿÇ„$ ÿÿÿÿé3•ÿÿ»ðÿÿÿ駇ÿÿº\‹D$Dèÿ+ÿÿ„À„ù‹…X ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰Pé šÿÿº[‹D$Dè¬+ÿÿ„À„Ò‹…X ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$é‡ÿÿ‹](ºZ‹D$Dè:+ÿÿ„À„^v†ƒ‹•X ‹œ$‰‰r‹H,‰J‹H(‰J ‹”$‰P,‰x(é £ÿÿ‹„$9D$X”ÿÿH‰„$Ç„$‹Œ$‹”$ 1À1öéK¤ÿÿ1ÛéQ†ÿÿ‹\$L‹›d ‰\$<…Û….¹ÿÿº ‹D$Dèo*ÿÿ‰D$<…À„†¹ ‰Ç1Àóª‹\$4[ƒÁã‰Ú‹D$Dè@*ÿÿ‹|$<‰G…À„ۉljÙ1Àóª‹|$<‰7ÇG…ö„‰~齸ÿÿ„$ø‰$‹Œ$‹”$‰èè9íþÿ‹”$„À‹B(„/˜ÿÿ¿é'˜ÿÿ‹Œ$éÔ±ÿÿ1Ûé|…ÿÿ„$‰$‹Œ$‹”$‰èèëìþÿ‹”$‹J(„À„Ÿ¨ÿÿ¿é—¨ÿÿ„$‰$‹Œ$‹”$‰èè°ìþÿ‹”$„À‹B(„¢ÿÿ¿é¢ÿÿ„$ø‰$‹Œ$‹”$‰èèuìþÿ„À‹„$‹P(„ñ¶ÿÿÆD$4éì¶ÿÿ‹Œ$é²°ÿÿ‹Œ$é@´ÿÿ‰èè¶þÿŠ\$Hˆ ‹t$8‰µð é’ÿÿº!‹D$Dèë(ÿÿ„À„%‹…X Š\$HˆX‹…X ‹t$8‰0‹„$éÈéÿÿ»ðÿÿÿéN„ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé–õÿÿ‹¬$¬‰Ç‰4$ÿsda‹D$DèßÎþÿ…ÿ‰÷ÿÿ‰ûé„ÿÿ‰s0‹„$ø‹´$ü鉂ÿÿ1Ûéñƒÿÿ»ðÿÿÿéçƒÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿéàóÿÿ‹l$4Ç„$ ÿÿÿÿé?‘ÿÿ÷ØéDÁÿÿ‹l$4Ç„$ ÿÿÿÿé$‘ÿÿ1Û雃ÿÿ»÷ÿÿÿ鑃ÿÿ1Éé §ÿÿ»÷ÿÿÿ逃ÿÿ»ðÿÿÿévƒÿÿ‰Ãéoƒÿÿ»÷ÿÿÿéeƒÿÿ‰ù‹|$4‰W(épÃÿÿ»ðÿÿÿéMƒÿÿ»÷ÿÿÿéCƒÿÿ»ðÿÿÿé9ƒÿÿ‰Ãé2ƒÿÿ»÷ÿÿÿé(ƒÿÿ‰Ãé!ƒÿÿ»÷ÿÿÿéƒÿÿ»ðÿÿÿé ƒÿÿ1ÀÇD$8éÝßÿÿ1ÀÇD$8éæÞÿÿ»ðÿÿÿéå‚ÿÿ»ðÿÿÿéÛ‚ÿÿ»ðÿÿÿéÑ‚ÿÿ»÷ÿÿÿéÇ‚ÿÿ»ðÿÿÿ齂ÿÿ»ðÿÿÿ鳂ÿÿ»÷ÿÿÿé©‚ÿÿ1Û颂ÿÿ1Û雂ÿÿ1Û锂ÿÿ1Ûé‚ÿÿ»ðÿÿÿ郂ÿÿ‰Ãé|‚ÿÿ»ðÿÿÿér‚ÿÿ»ðÿÿÿéh‚ÿÿ»ðÿÿÿé^‚ÿÿ»ðÿÿÿéT‚ÿÿ»ðÿÿÿéJ‚ÿÿ»ðÿÿÿé@‚ÿÿ»÷ÿÿÿé6‚ÿÿ»ðÿÿÿé,‚ÿÿ»ðÿÿÿé"‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿéúÿÿ»ðÿÿÿéðÿÿ»ðÿÿÿéæÿÿ»ðÿÿÿéÜÿÿ»ðÿÿÿéÒÿÿ»÷ÿÿÿéÈÿÿ‰<$ÿsda‹D$DèxÌþÿ»þÿÿÿé¬ÿÿ»ðÿÿÿé¢ÿÿ»ðÿÿÿé˜ÿÿ»ðÿÿÿéŽÿÿ»ðÿÿÿé„ÿÿ»ðÿÿÿézÿÿ‹Œ$騯ÿÿ»ðÿÿÿédÿÿ»ðÿÿÿéZÿÿ»ðÿÿÿéPÿÿ»ðÿÿÿéFÿÿ»ðÿÿÿé<ÿÿ»ðÿÿÿé2ÿÿ»ðÿÿÿé(ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéÿÿ‰ú‹D$Dè Ìþÿ»÷ÿÿÿéÿ€ÿÿ»ðÿÿÿéõ€ÿÿ»ðÿÿÿéë€ÿÿ»ðÿÿÿéá€ÿÿ‹l$H‰Æ‹D$Dè”Ëþÿ…ö‰¡àÿÿ‰óéÀÿÿ‹|$<‹\$L‰»d 飳ÿÿ»ðÿÿÿ馀ÿÿ‰4$ÿsda‹D$DèVËþÿ»þÿÿÿ銀ÿÿ»ðÿÿÿ退ÿÿ»ðÿÿÿév€ÿÿ»ðÿÿÿél€ÿÿ»ðÿÿÿéb€ÿÿ»ðÿÿÿéX€ÿÿ»ðÿÿÿéN€ÿÿ»ðÿÿÿéD€ÿÿ»ðÿÿÿé:€ÿÿ»ðÿÿÿé0€ÿÿ»ðÿÿÿé&€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ‹l$H‰Æ‹D$Dè»Êþÿ…ö‰÷ßÿÿ‰óéêÿÿ»ðÿÿÿéàÿÿ‹\$<‰C(é´½ÿÿfUWVSƒì\‰D$$‰Ö‹(‰l$‹m‰l$4èuÊþÿ‹l$€½ t)‹]4‹m‰l$@9댆‰Ý+l$@‰l$H‹l$‹m‰l$Dë+‹l$‹]4‹m‰l$D9ëY‹l$D)݉l$H‹l$‹m‰l$@‹l$4‹E öÄ•D$:öÄ€„ŠD$:ƒðˆD$9‹l$4€½„À÷Ћl$‰…¨ Š… ˆD$;1íÇD$(‹T$ƒÂ@‰T$<‹L$Áˆ ‰L$0‰ð¶ð‰t$Lf‹T$‰Z4ŠL$;ˆŠ ‹|$<‰ºP Ç‚L ‹‚\ ‰‚` Ç‚X ‰Z,‰Z0‰Ð‹‹J$…É~,‹@(ƒÀ1ÉÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ4;J$|Ü‹zx…ÿ~5‹|$‹‡œ ƒÀ1ÉfÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ(;Jx|Ü‹r…ö~,‹L$‹A1ÉÇÿÿÿÿÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ9ñuÝ‹rT…ö~(‹|$‹‡´ ƒÀ1ÉvÇÇ@ÿÿÿÿAƒÀ;JT|깋|$01Àóª‹T$Ç‚˜ Ç‚  Ç‚¤ Æ‚ Ç‚ð fÇ‚ü ‹Š¨ …É…ƒ‹L$H;Šl r …Éus€º tjÇD$,‹T$@‹D$‰P‹L$D‰H‹D$(…À…šƒ|$,„‹D$$èÈþÿ‹t$,…öyéõv‹D$$èçÇþÿÇD$,‹D$,ƒÄ\[^_]Ãv‹|$‹‹PÇ$‹L$L‹D$$è yÿÿ‰D$,ƒøŒtÿÿÿ„nÿÿÿH„¹€|$:u€|$9„Uÿÿÿ‹D$‹P09P4„Eÿÿÿ‹D$(…À„‹L$‹q09Þ„‹D$$èSÇþÿ‹D$$‹‰D$‹‰T$ ‹T$ ‹B…À~|‹l$(ÇD$ÇD$ë.f‹E‰U‹KÁá‹s‰Çó¤ÿD$ƒD$ƒÅ‹D$‹|$ ;G}8‹\$‹L$Y‹‹S‰E‰U‹S;U v¶Áâ‹Eè77ÿÿ…Àtc‹S‰U ‰E럋D$$è“Æþÿ‹l$‹]0‰è‹m4‹€¨ …À„‹L$‹¤ H‰¨ €|$9„½üÿÿ€¹ „‰i‰Yé¥üÿÿ‹T$ ‹B…ÀŽf‹|$(1ö‹sda‹l$ ‹G‰$ÿÓFƒÇ;u|ï‹L$(‰ $ÿÓ‹D$$èÆþÿ‹D$@‹l$‰E‹T$D‰U‹D$$èÆþÿÇD$,÷ÿÿÿÿ¼rda…À…þÿÿ1Ò‹D$,èUÀþÿéþÿÿ‹—¤ …Ò…9þÿÿé›ýÿÿ;i4…gþÿÿ‹|$4‹_ …Û~*‹Q‹D$(1É‹89:…Iþÿÿ‹x9z…=þÿÿAƒÂƒÀ9Ùuß‹|$@‹L$‰y‹D$D‰Aƒ|$,u‹|$‹‡¤ …À„‹T$‰r0‰j4‹D$$èPÅþÿ‹D$$‹(‹U‹B…Àޝ1ÿ1ö‹sda‰\$‰Ó‹E‹D8‰$ÿT$F‹CƒÇ9Æ|ç‹\$‹U @Áá‰×‹t$(ó¤‹T$(‰$ÿÓ‹D$$èÌÄþÿ‹l$ÇE ÿÿÿÿÇE$ÿÿÿÿ‹E‹HL‹x …ÿ~T‹Eº½ÿÿÿÿë2f‹X…Ûx/‹1‰Ó9õ}‹l$‰U €y „¦‰U$‰õƒÀBƒÁ 9ß~‹0…öyʉӃÀBƒÁ 9ßí‹D$$èpÄþÿÇD$,‹D$,ƒÄ\[^_]Ë|$‰_‰oéúÿÿ‹D$$èDÄþÿ‹D$$‹‰D$‹‰T$ ‹B@ÁàèÆÿÿ‰D$(…À„ðýÿÿ‹L$ ‹A @Áá‹|$(1Àóªé½üÿÿÆD$9éåùÿÿ‰õéXÿÿÿ‹sdaé±ýÿÿ‹D$$èÛÃþÿ‹l$$‹E‹(‹}…ÿ~I‹|$(1ö‹sdav‹G‰$ÿÓFƒÇ;u|ï‹D$(‰$ÿÓ‹D$$èyÃþÿé¨þÿÿ‰Þéÿýÿÿ‹sdaésþÿÿ‹sdaëωÞé÷ýÿÿvWVSƒì ‰Ã@ ‰D$ÇD$T$‰ØèNXÿÿƒ»$ „-Œ‹‹ …É…ù‹ƒ 9ƒ |k‹“ €» „‰T$ÇD$‹C‰$ÿHsda‰Æ…ö„¢‹ƒ @‰ƒ ‹S ;B ~ ǃ ‹T$‰Øègÿÿ‰ðƒÄ [^_Ãv€» …Ï‹s$¿ë=ƒø…3€» „¾‹C@;C<…²‹“ 9ò„Sÿÿÿø‰C@ƃ ºD$èž÷ÿÿ‰ƒ$ …Ày¬‹T$‰Øè™fÿÿ1öévÿÿÿf‹S(‹C ÇD$‹s‰4$èÓdÿÿ‰Æé"ÿÿÿ‹T$‰Øèefÿÿ‹5¬sdaÿ‰ðƒÄ [^_ËC‰D$‰T$‹C‰$ÿHsda‰Æéèþÿÿf‹s ¿ÿÿÿÿékÿÿÿvÿƒ €» t]‹ƒ ‰D$‹C<‰D$‹C‰$ÿHsda‰Æ…À„Jÿÿÿ‹C@‰ƒ €» t4;Cƃ ‹ƒ$ …À…|þÿÿéBþÿÿ1öëî‹C<‰D$‹ƒ ë¡Æƒ ‹ƒ$ ëÏø‰C@뻋T$‰Øè‡eÿÿ‹ƒ$ 1Ò莻þÿ1öéWþÿÿvƒì‹D$ è˜ýÿÿ;¬sdatƒÄËJ‰…Òt ¡¨sdaÿƒÄËP‰$ÿRëêƒì‹D$ è`ýÿÿ;¬sdatƒÄËJ‰…Òt1ÀƒÄËP‰$ÿR1Àëßvƒì‹D$ è(ýÿÿ;¬sdatƒÄËJ‰…Òt¡Ørda‹‰$ÿÀrda1Àëß‹P‰$ÿRëáWVSƒì‰Ã‰×p ‰t$ÇD$ T$èBUÿÿƒ» „Œ—‰ø¶ÐD$èmõÿÿ‰Á‰ƒ …Àˆ•‹C‰òè³aÿÿ‰Æ‰ø„Àu#‹C<9C@”ƒ ‹T$‰ØèCdÿÿ‰ðƒÄ[^_Ãf€» tÔ€» ÀƒàHC<‰C@ƃ ëÅv‹T$‰Øèdÿÿ‹5¨sdaÿ‰ðƒÄ[^_ËT$‰Øèécÿÿ‹ƒ 1Òèð¹þÿ1öë•‹T$‰ØèÍcÿÿ1ö놺‹D$éúþÿÿfƒìº‹D$ èçþÿÿ;¨sdatƒÄÃv‹J‰…Òt1ÀƒÄËP‰$ÿR1ÀëÜv1Ò‹D$é­þÿÿƒìº‹D$ è›þÿÿ;¨sdatƒÄÃv‹J‰…Òt¡Ørda‹‰$ÿÀrda1ÀëÜ‹P‰$ÿRëáUWVSì| ‹¼$ ¡¨sda‰„$` ‰„$d Ç„$h ‰„$l „$l ‰D$ „$h ‰D$„$d ‰D$„$` ‰D$„$\ ‰D$ÇD$ xËaaÇD$´:ba‹„$˜ ‰D$‹„$” ‰$ÿˆrda…À„Ô1Ò‹„$` è¶kÿÿ‰Ãƒøÿ„«ºÿÿÿ‹„$d èškÿÿ‰Æƒøÿ„¿‹„$l èëkÿÿ…Àˆ‹ÇD$ÇD$ÇD$‰D$ 1À‹¬$h …í•À‰D$‰t$‰$‹Œ$\ ‰úD$Lèœ'ÿÿ„À„<D$L‰„$T Ç„$X Ç$ÿørda‰Å…À„瀼$M ÒƒâJ‰T$<‹„$€9D$`Ä9D$dŒºº„$T èqòÿÿƒøŒ@„š‹G …À…Ç€¼$M „©‹„$€‹T$|‰T$‰D$‹„$\ ‰$ÿHsda‰Æ…À„ô‰t$‰,$ÿôrda‹J‰…Ò„J…ÀˆÒ€¼$L „ì‹D$<D$|‰„$€Æ„$P 9D$`Ž?ÿÿÿvD$LèÃþÿ‰èÄ| [^_]Ãfÿ¼rda…À„Gþÿÿf1í‰èÄ| [^_]Ãø„Ÿ‰$ÿpsda‰Æ…ÀtP‹_ …ÛŽQÿÿÿ1Ûë‰Dž9_ Ž?ÿÿÿC‹T$hÇD$‹„$\ ‰$‰Ù‹D$Lè¥^ÿÿ…ÀuÍ‹H‰…À„˜‹EH‰E…À„­D$LèÐÂþÿ1í‰èÄ| [^_]Ë„$€;D$|”„$P éRþÿÿ‹T$hÇD$‹„$\ ‰$¹‹D$Lè0^ÿÿ‰Æ…À…žþÿÿë‹V‰4$‰D$8ÿR‹D$8é þÿÿf‹D$|‹”$€éRþÿÿ‹F‰4$ÿPéZÿÿÿfÿ¼rda…À„3ýÿÿéÍþÿÿ‹E‰,$ÿPéEÿÿÿfUWVSì\ ‹¼$p Ç„$H ¡¨sda‰„$L „$L ‰D$„$H ‰D$„$D ‰D$ÇD$  ËaaÇD$Ã:ba‹„$x ‰D$‹„$t ‰$ÿˆrda…À„d‹„$H …À„õ‹„$L è}hÿÿ…ÀˆAÇD$ÇD$ÇD$‰D$ ÇD$ÇD$ÿÿÿÇ$‹Œ$D ‰úD$4è0$ÿÿ„À„ôD$4‰„$< Ç„$@ Ç$ÿørda‰Æ…À„¤€¼$5 …i‹D$D‰D$(ÇD$,1ÛÇD$$‹-ôrda‹D$$;„$H º„$< èóîÿÿƒøŒæ„÷€¼$7 „&‹T$h‹D$d9„¾€¼$5 „‰\$‰D$‹„$D ‰$ÿHsda‰Ã…Û„’‰\$‰4$ÿÕ‹J‰…Ò„@…Àxx‹G …ÀŽ»ëf…Àx`C9_ Œî‹T$PÇD$‹„$D ‰$‰Ù‹D$4è¥[ÿÿ…Àt1‰D$‰4$‰D$ ÿÕ‹T$ ‹ I‰ …Éu³‹J‰$‰D$ ÿQ‹D$ …Ày¢f‹H‰…À„ßD$4访þÿ1ö‰ðÄ\ [^_]ÃvÇ„$H ÿÿÿéûýÿÿ‹\$DÇD$,ÿÿÿÿÇD$(éþÿÿv‹D$d€¼$5 …æþÿÿ‰D$‰\$‹„$D ‰$ÿHsda‰Ãéáþÿÿv1ö‰ðÄ\ [^_]ÃÿD$$‹\$h€¼$7 t2;\$d„߯„$8 é.þÿÿv‹S‰$‰D$ ÿR‹D$ éªþÿÿfÆ„$8 éþÿÿv‹F‰4$ÿPéÿÿÿf;\$(tT$,‰T$hÆ„$8 éØýÿÿ€¼$5 uR‹D$D‰D$‰\$‹„$D ‰$ÿHsda‰Ã…Û„¹þÿÿ‰\$‰4$ÿôrda‹J‰…ÒtE…Àˆ›þÿÿD$4èV¾þÿé¥þÿÿ‰\$ÇD$‹„$D ‰$ÿHsda‰Ã묋D$,؉D$héÿÿÿ‹S‰$‰D$ ÿR‹D$ ë¨vUWVSì\ ‰Ã¶¬$t ¶¼$x ¡¨sda‰„$D ‰„$H ‰„$L …Òt…É„n„$L ‰D$„$H ‰D$„$D ‰D$„$@ ‰D$ÇD$ èËaa‹„$p ‰D$‰L$‰$ÿˆrda…À„ô‹„$D 1Òèøcÿÿ‰Æƒøÿ„ͺÿÿÿ‹„$H èÜcÿÿ‰D$,@„Ñ‹„$L è-dÿÿ…Àˆ«çÿ‰|$ÇD$ÇD$‰D$ ÇD$‹D$,‰D$‰4$‹Œ$@ ‰ÚD$0èâÿÿ„Àtdt$0‰´$8 Ç„$< ‰è¶Ð„$8 èÿêÿÿ…ÀˆË‰ÁT$0‰ØèJWÿÿ‰ÃD$0蟼þÿ‰ØÄ\ [^_]Ãfÿ¼rda…À„%ÿÿÿ1Û‰ØÄ\ [^_]Ãvÿ¼rda…À„!ÿÿÿ1ÛëÞf‹5|sda9r…ƒþÿÿ‹r‰t$(Nƒþ‡rþÿÿ‹J ‰Œ$@ ƒ|$(„¸þÿÿ‹B‰„$D ƒ|$(„£þÿÿ‹J‰Œ$H ƒ|$(…Žþÿÿ‹R‰”$L éþÿÿfD$0èã»þÿ1Ûé=ÿÿÿ‹D$‹T$‹L$ ÇD$ ÇD$ÇD$Î:baé§ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$Û:baé{ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$ë:baéOýÿÿvVSƒì$‰Ã…Àtaº÷:ba¸;baèZ®þÿ‰Æ…ÀtL‰\$‰$ÿ$sda‹J‰…Òt"‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ãf‹V‰4$‰D$ÿR‹D$ëË1ÀëàVSƒì$T$èVóþÿ„Àt‹D$ƒøtQƒøtHtA¸ÿÿÿÿƒÄ$[^Ãf¾°`a‹D$…À~ë1Ûë vC‹D$9Ã}Û‰\$‹D$‰$ÿÖƒø\uåëÂv¾T`aëʾ€`aëÂUWVSì| ‰Å‰Ó‰L$0”$L ‰ÈèÐòþÿ„À„B‹Œ$P ‰L$,1Ò‹„$˜ èÃ`ÿÿ‰Æƒøÿ„ºÿÿÿ‹„$œ è§`ÿÿ‰Çƒøÿ„ …öˆÐ;t$,‚…ÿˆ†;|$,d€½„u ‰ø)ð9Ehz‹„$ …Àu Ç„$ ÿÿÿ‰$ÿŒrda…À„ÿÿ¸ÆD$:ÆD$9ÆD$;ÇD$‰D$ÇD$‹„$  ‰D$ÇD$ ‰|$‰t$„$L ‰$‹L$0‰êD$DèÕÿÿ„À„œL$D‰Œ$h Ç„$l Ç„$` Ç„$\ Š„$E ˆ„$d ‹L$0‹Q‹ ”sda‰L$(9ʄ҉L$‰$ÿ€sda…ÀŠ„$E …¶1Òˆ”$e „À„¶‹t$TÇD$<ÿÿÿÿ‹¼$ …ÿÇD$4Žîº„$h èÑæÿÿƒøŒ¦„Ç‹D$t9ðtP€¼$E „ĉt$‰D$‹L$0‰ $ÿHsda‰Æ…ö„k‰ò„$\ è»´þÿ‹J‰…Ò„n…ÀˆH€|$9…3€|$:„ˆ‹K‰L$,…ÉŽ1ÿë|‹D$t‹T$x9ЄӀ¼$E „ð‰D$‰T$‹L$0‰ $ÿHsda‰Æv…ö„Þ¡¨sda9Æ„‰ò„$\ è!´þÿ‹J‰…Ò„Ä…Àˆ®G;|$,„‘‹C ‹¸‹u ‹P;T$(„o;\sda„cè^Uÿÿƒøÿ„Yƒø„LÿÿÿŽX9ÆŒPD@ý‹T$`‹H…É…X‹;P„)¡¨sdaÿ‹J‰…Ò…yÿÿÿ‹P‰$ÿRG;|$,…pÿÿÿÿD$4‹t$x€¼$G „";t$t„PÆ„$H ‹„$ 9D$4…þÿÿŠ„$E „À…ø‹”$P 9Ö„„À„è‰t$ÇD$‹L$0‰ $ÿHsda‰Æ…ö„¼$\ ‰ò‰øèÞ²þÿ‹J‰…Ò„=…Àxo…Ût ‹H‰…À„à‰øèU´þÿ‰ÃD$Dè.¶þÿ…Ût ö„$” …ž‰Øëÿ¼rda…À„âûÿÿ1ÀÄ| [^_]Ãÿ¼rda…À…–1Ò¸ôÿÿÿèF©þÿ‹„$\ …Àt ‹J‰…Ò„¦‹„$` …Àt ‹J‰…Ò„žD$D詵þÿ…Ût›‹H‰…Àu’‹C‰$ÿP1ÀÄ| [^_]Ãf‹|$,é“ûÿÿv‹t$,…ÿ‰zûÿÿ|$,‰pûÿÿ1ÿésûÿÿv‹L$0ÿö„$” …‹D$0Ä| [^_]Ãt$,‰&ûÿÿ1öé)ûÿÿv²ˆ”$e „À…Jüÿÿ1öÇD$<éGüÿÿÿ‰Æé/ýÿÿv‰Ð‰T$‰D$‹L$0‰ $ÿHsda‰Æéýÿÿf‹V‰4$‰D$$ÿR‹D$$é&ýÿÿf;t$t”„$H éßýÿÿv‰D$‰t$‹L$0‰ $ÿHsda‰Æé7üÿÿ€|$;„ýÿÿ¹T$D‰èèOÿÿ‰Æ…À„…þÿÿ‰D$Ç$ÿtsda…À„L‰D$‰$‰D$$ÿ$sda‰Ç‹T$$‹H‰…À„R‹H‰…À„7…ÿ„3þÿÿ‰ú„$\ 胰þÿ‹J‰…Ò„0…À‰þüÿÿé þÿÿ‰Ú„$\ èZ°þÿ…À‰âüÿÿéïýÿÿ‹P‹éÔþÿÿf‹V‰4$‰D$$ÿR‹D$$é|ûÿÿf‰Øè½øÿÿƒøŽ˜ÿ1ÀÆD$:ÆD$9ÆD$;éïùÿÿ‹D$<ð‰D$xÆ„$H é¡üÿÿÿ¼rda…À…TýÿÿéMùÿÿ1Ò¸õÿÿÿè°¦þÿéeýÿÿvÇD$‰L$Ç$;baÿ˜sdaéýÿÿf‹P‰$ÿRéLýÿÿf‹P‰$ÿRéTýÿÿf…¬1À1ÛÆD$:ÆD$9ÆD$;éQùÿÿ‹F‰4$ÿPé»þÿÿ‹B‰$ÿPé þÿÿ‹W‰<$‰D$$ÿR‹D$$éºþÿÿ1Òéüÿÿ‹„$P ‰D$‰t$‹L$0‰ $ÿHsda‰Æéüÿÿ¼$\ é-üÿÿ‹D$4‰D$‰\$Ç$;baÿ˜sdaéXüÿÿ‹C‰$ÿPéüÿÿ‰\$‰l$Ç$ÿtsdaèàöÿÿ‰Ã1À…Û„$üÿÿÆD$:ÆD$9ÆD$;éƒøÿÿ‹V‰4$‰D$$ÿR‹D$$é­ûÿÿ‹H‰…À…üÿÿ‹F‰4$ÿPéüÿÿvƒì\ÇD$@¡¨sda‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ °ËaaÇD$;ba‹D$h‰D$‹D$d‰$ÿˆrda…ÀtG‹D$Lè^Xÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èºöÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡¨sda‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÌËaaÇD$);ba‹D$h‰D$‹D$d‰$ÿˆrda…ÀtG‹D$LèšWÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èöõÿÿƒÄ\Ãf1ÀƒÄ\ÃfUWVSƒìL‹l$`‹\$d‰Øè^õÿÿ…Àxÿ‰ØƒÄL[^_]Ãf‰\$‹E‰D$Ç$ÿtsdaè¿ôÿÿ‰Ç…À„²ÇD$4ÇD$8ÆD$<‹E‹@‹”sda‰T$ 9ЄĉT$‰$ÿ€sda…À•ÀˆD$=‹G‰D$(…ÀŽ’1ö‹G ‹°‹U0‰T$,‹C;D$ t7‹T$ ‰T$‰$‹€sda‰T$$ÿÒ…Àu‹C‹\sda9Ðt‰T$‰$ÿT$$…Àt_ÿ…Û„ס¨sda9ĉÚD$4èÅ«þÿ‹J‰…Ò„€…ÀˆªF;t$(…qÿÿÿ‹H‰…À„D$4è/­þÿ‰ÃéÌþÿÿ‰ØèMÿÿƒøÿt\ƒø„£~_9D$,|YD@ý‹U4‹H…É…®¡¨sdaÿ‹J‰…Òu–‹P‰$ÿRë‹v‹S‰$‰D$ÿR‹D$éjÿÿÿfÿ¼rda…À…¼1Ò¸òÿÿÿèî¡þÿ‹D$4…Àt ‹J‰…Ò„‹D$8…Àt ‹J‰…Òtp‹H‰…ÀtG1Ûéþÿÿ‹U‹E$)ЉD$‹E )ЉD$‹E ‰$ÿHsda‰ÃéÃþÿÿ‹U‹H)щL$‹ë×°éGþÿÿ‹G‰<$ÿP1ÛéÄýÿÿ‹G‰<$ÿPéÚþÿÿf‹P‰$ÿRë…‹P‰$ÿRéeÿÿÿ1Ò¸õÿÿÿè2¡þÿé?ÿÿÿUWVSƒì<ǘÁaa8B`aǬÁaaÐ?`aÇÔÁaa@ÇØÁaa@ÂaaÇèÁaaÇôÁaa`ÂaaÇøÁaa@ÃaaÇüÁaaÀÃaaÇÄaa°:`aÇ,Äaa4>`aÇ8ÄaaÀÄaaÇTÄaaëÇXÄaaÌÄaaÇtÄaaàÄaaÇxÄaaÆaaÇ|Äaa`ÆaaÇøÆaax=`aÇ4ÇaaëÇ8Çaa ÇaaÇLÇaaT`aÇPÇaaØtaaÇTÇaaÀÇaaÇXÇaa ÈaaÇxÈaaD=`aÇ´ÈaaëǸÈaa ÉaaÇÌÈaal`aÇÐÈaaXsaaÇÔÈaa@ÉaaÇØÈaa ÉaaÇ$€Áaa‹„sdaÿÓ…ÀˆBÇ$ÄaaÿÓ…Àˆ1Ç$àÆaaÿÓ…Àˆ Ç$`ÈaaÿÓ…ÀˆÇ PdaÇD$õÇD$ ÇD$ÇD$àÉaaÇ$5;baÿœsda…À„Љ$ÿsda‰ÆÇ$´2‹=ìrdaÿ׉ÅÀt"‰D$ÇD$<;ba‰4$ÿ¨rda‹H‰…À„¯Ç$ÿ׉ÅÀt"‰D$ÇD$B;ba‰4$ÿ¨rda‹H‰…À„pÇ$`ÊaaÿXsda‰Ã…Àt"‰D$ÇD$L;ba‰4$ÿ¨rda‹H‰…À„WÇ$Pda1Ò1Û1À¶•Âéaa9Ú|Z@‰Â=Üuç4‰ðèÁäþÿ‰Å…À„ç1À‰ï‰ñóª1ÿ‰ø‰\$,ëR¶C‰D$Ç$V;baÿ˜sda…Àts‰D$·†Àéaa‹… ÿaa‰D$¶C‹D…‰$‹5¨rdaÿÖG‰øÿÜ„À4…žÀéaa¶CT…‹…Àu”‰T$(ÿœrda‹T$(‰¶C‹D……À…tÿÿÿ‹\$,¡$Pda…Àt ‹J‰…Òt:1öëfF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRë߉,$ÿsdafƒÄ<[^_]ËP‰$ÿR뻋C‰$ÿPé‚þÿÿ‹C‰$ÿPéCþÿÿ‹C‰$ÿPé›þÿÿ‹\$,ÿœrda£$Pda…À„zÿÿÿf1ÿ1À‰\$,‰Ãë.v‰D$·‡@ýaa‹… ÿaa‰D$¡$Pda‰$ÿÖC‰ßû‘t3Áç¶—Cýaa‹T•‰T$¶‡Býaa‰D$Ç$X;baÿ˜sda…Àu§éöþÿÿ‹\$,1öë F9Þ„"ÿÿÿ‹Dµ…Àtï‹J‰…Òuæ‹P‰$ÿRëÛ‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€àqbaÁà¶Œtba‰ÐÁèƒâÈ·Œ vba‰ÐÑ趌ȠbaÑà1ж„H ’baÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€ “baÁà¶ŒÀ•ba‰ÐÁèƒâ¶ŒÈ ˜ba‰ÐÁè¶Œˆ baÁà1ж„ˆ ¡baËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€ ¤baÁà¶ŒÀ¦ba‰ÐÁèƒâÈ·ŒÀ¨ba‰ÐÑ趌Ȁ³baÑà1ж„H@ÂbaÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€ ÄbaÁà¶„@Åba‰ÑÁéƒâÁà¶Œ Çba‰ÐÁè¶ŒHÐbaÁà1ж„ˆàÑbaËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ÀÓbaÁà¶„`Ôba‰ÑÁéƒâÁà¶ŒÀÕba‰ÐÁè¶Œˆ@ÙbaÁà1ж„ˆÀÛbaËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ ÝbaÁà¶Œ@Þba‰ÐÁèƒâÈ·ŒÀßba‰ÐÁè¶ŒÈ`åbaÁà1ж„ˆðbaËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@óbaÁà¶Œ€óba‰ÐÁè¶Ò¶ŒÈÀóba‰ÐÁè¶ŒÈôbaÁáÁà1ÐÁ‰ÈÁè¶€ ôbaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€€õbaÁà¶Œ õba‰ÐÁè¶Ò¶ŒÈ öba‰ÐÁè¶ŒÈ÷baÁáÁà1ÐÁ‰ÈÁè¶€€ùbaƒáÓøƒàÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€¨übaÁà¶”Àüba‰ØÁè ãÿ¶”Ðýba‰ØÁèÁâ¶Œ@ýbaÁáÁà1ØÁ‰ÈÁè¶€@þbaƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€ˆÿbaÁà¶” ÿba‰ØÁè ãÿ¶”Ðàÿba‰ØÁèÁâ¶Œ caÁáÁà1ØÁ‰ÈÁè¶€caƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€caÁà¶”@ca‰ØÁè ãÿ¶”Ѐca‰ØÁèÁâ¶ŒÀcaÁáÁà1ØÁ‰ÈÁè¶€ÀcaƒáÓøƒà[Ãv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀcaÁà¶Œca‰ÐÁè¶Ò¶ŒÈ`ca‰ÐÁè¶ŒÈcaÁáÁà1ÐÁ‰ÈÁè¶€ caƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€à caÁà¶Œ ca‰ÐÁè¶Ò¶ŒÈ` ca‰ÐÁè¶ŒÈÀ caÁáÁà1ÐÁ‰ÈÁè¶€` caƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ caÁà¶Œ` ca‰ÐÁè¶Ò¶ŒÈ  ca‰ÐÁè¶ŒÈà caÁáÁà1ÐÁ‰ÈÁè¶€€ caƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€`caÁà¶Œ ca‰ÐÁè¶Ò¶ŒÈàca‰ÐÁè¶ŒÈ caÁáÁà1ÐÁ‰ÈÁè¶€ÀcaƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ caÁà¶Œàca‰ÐÁè¶Ò¶ŒÈ ca‰ÐÁ趌ȀcaÁáÁà1ÐÁ‰ÈÁè¶€ caƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€caÁà¶Œ@ca‰ÐÁè¶Ò¶ŒÈ€ca‰ÐÁè¶ŒÈàcaÁáÁà1ÐÁ‰ÈÁè¶€€caƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€HcaÁà¶Œ`ca‰ÐÁè¶Ò¶ŒÈàca‰ÐÁè¶ŒÈÀcaÁáÁà1ÐÁ‰ÈÁè¶€@caƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€@caÁà¶Œ€ca‰ÐÁè¶Ò¶ŒÈca‰ÐÁè¶ŒÈcaÁáÁà1ÐÁ‰ÈÁè¶€  caƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ô#caÁà¶Œ $ca‰ÐÁè¶Ò¶ŒÈ $ca‰ÐÁ趌Ȁ%caÁáÁà1ÐÁ‰ÈÁè¶€(caƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€+caÁà¶Œ@+ca‰ÐÁè¶Ò¶ŒÈÀ+ca‰ÐÁè¶ŒÈÀ,caÁáÁà1ÐÁ‰ÈÁè¶€`/caƒáÓøƒàËT$‰ÑÁéâÿ?‰ÐÁè âÿ¶‰À2ca¶ŒÈ 3ca‰ÐÁè¶Ò¶ŒÈ`3ca‰ÐÁè¶ŒÈÀ3caÁáÁà1ÐÁ‰ÈÁè¶€@4caƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€€4caÁà¶ŒÀ4ca‰ÐÁè¶Ò¶ŒÈ 5ca‰ÐÁè¶ŒÈÀ5caÁáÁà1ÐÁ‰ÈÁè¶€ 7caƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Ü8caÁà¶Œ9ca‰ÐÁè¶Ò¶ŒÈ€9ca‰ÐÁ趌Ȁ:caÁáÁà1ÐÁ‰ÈÁè¶€€=caƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€€AcaÁà¶ŒÀAca‰ÐÁè¶Ò¶ŒÈBca‰ÐÁè¶ŒÈ@BcaÁáÁà1ÐÁ‰ÈÁè¶€àBcaƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰$Cca¶„È5Cca‰ÑÁé âÿÁà¶Œ`Cca‰ÐÁ趌ȠCcaÁáÁà1ÐÁ‰ÈÁè¶€àCcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€DcaÁà¶Œ@Dca‰ÐÁè âÿ¶ŒÈ`Dca‰ÐÁè¶ŒÈxDcaÁáÁà1ÐÁ‰ÈÁè¶€ DcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÀDcaÁà¶ŒàDca‰ÐÁè âÿ¶ŒÈEca‰ÐÁè¶ŒÈEcaÁáÁà1ÐÁ‰ÈÁè¶€ EcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€0EcaÁà¶Œ`Eca‰ÐÁè âÿ¶ŒÈ€Eca‰ÐÁè¶ŒÈÀEcaÁáÁà1ÐÁ‰ÈÁè¶€ FcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€˜FcaÁà¶ŒÀFca‰ÐÁè âÿ¶ŒÈàFca‰ÐÁè¶ŒÈ GcaÁáÁà1ÐÁ‰ÈÁè¶€`GcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€°GcaÁà¶ŒàGca‰ÐÁè âÿ¶ŒÈHca‰ÐÁè¶ŒÈ@HcaÁáÁà1ÐÁ‰ÈÁè¶€€HcaƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€ÀHcaÁà¶Œ Ica‰ÐÁèƒâ¶ŒÈ€Ica‰ÐÁè¶Œˆ JcaÁáÁà1ÐÁ‰ÈÁè¶€àJcaƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ KcaÁà¶ŒàKca‰ÐÁè¶Ò¶ŒÈ Lca‰ÐÁè¶ŒÈ`LcaÁáÁà1ÐÁ‰ÈÁè¶€McaƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ÔMca¶ŒÈåMca‰ÐÁè âÿ¶ŒÈõMca‰ÐÁè¶ŒÈ NcaÁáÁà1ÐÁ‰ÈÁè¶€@NcaƒáÓøƒàÃv‹T$‰ÑÁé·Ò‰ÐÁè âÿ¶‰pNca¶ŒÈNca‰ÐÁè âÿ¶ŒÈ‘Nca‰ÐÁ趌ȡNcaÁáÁà1ÐÁ‰ÈÁè¶€ÀNcaƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€àNcaÁà¶Œ Oca‰ÐÁè¶Ò¶ŒÈ`Oca‰ÐÁè¶ŒÈàOcaÁáÁà1ÐÁ‰ÈÁè¶€QcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€8RcaÁà¶Œ`Rca‰ÐÁè âÿ¶ŒÈ Rca‰ÐÁè¶ŒÈScaÁáÁà1ÐÁ‰ÈÁè¶€`ScaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€°ScaÁà¶ŒàSca‰ÐÁè¶Ò¶ŒÈ@Tca‰ÐÁè¶ŒÈÀTcaÁáÁà1ÐÁ‰ÈÁè¶€ VcaƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€PWcaÁà¶Œ€Wca‰ÐÁè¶Ò¶ŒÈÀWca‰ÐÁè¶ŒÈXcaÁáÁà1ÐÁ‰ÈÁè¶€€XcaƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÔXcaÁà¶ŒYca‰ÐÁè âÿ¶ŒÈ Yca‰ÐÁè¶ŒÈ`YcaÁáÁà1ÐÁ‰ÈÁè¶€ YcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ZcaÁà¶„@Zca‰ÑÁé¶ÒÁà¶Œ`Zca‰ÐÁ趌ȀZcaÁáÁà1ÐÁ‰ÈÁè¶€˜ZcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€¤ZcaÁà¶ŒÀZca‰ÐÁè âÿ¶ŒÈàZca‰ÐÁè¶ŒÈøZcaÁáÁà1ÐÁ‰ÈÁè¶€[caƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€([caÁà¶Œ@[ca‰ÐÁè âÿ¶ŒÈ€[ca‰ÐÁè¶ŒÈÀ[caÁáÁà1ÐÁ‰ÈÁè¶€\caƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€H\caÁà¶Œ`\ca‰ÐÁè âÿ¶ŒÈ€\ca‰ÐÁè¶ŒÈ\caÁáÁà1ÐÁ‰ÈÁè¶€ \caƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€°\caÁà¶Œà\ca‰ÐÁè âÿ¶ŒÈ]ca‰ÐÁè¶ŒÈ]caÁáÁà1ÐÁ‰ÈÁè¶€ ]caƒáÓøƒàÃS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€0]caÁà¶”`]ca‰ØÁè ãÿ¶”Ѐ]ca‰ØÁèÁâ¶Œ ]caÁáÁà1ØÁ‰ÈÁè¶€À]caƒáÓøƒà[Ãv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€Ô]caÁà¶Œ^ca‰ÐÁè âÿ¶ŒÈ@^ca‰ÐÁ趌Ȁ^caÁáÁà1ÐÁ‰ÈÁè¶€À^caƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€_caÁà¶Œ _ca‰ÐÁè âÿ¶ŒÈ`_ca‰ÐÁ趌Ƞ_caÁáÁà1ÐÁ‰ÈÁè¶€`caƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€``caÁà¶Œ `ca‰ÐÁè¶Ò¶ŒÈà`ca‰ÐÁè¶ŒÈ acaÁáÁà1ÐÁ‰ÈÁè¶€`acaƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ acaÁà¶Œàaca‰ÐÁè¶Ò¶ŒÈ bca‰ÐÁè¶ŒÈ`bcaÁáÁà1ÐÁ‰ÈÁè¶€àbcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€DccaÁà¶Œ`cca‰ÐÁè âÿ¶ŒÈ€cca‰ÐÁ趌ȘccaÁáÁà1ÐÁ‰ÈÁè¶€°ccaƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰Ècca¶„ÈÙcca‰ÑÁé âÿÁà¶Œdca‰ÐÁè¶ŒÈ dcaÁáÁà1ÐÁ‰ÈÁè¶€8dcaƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰Pdca¶„Èadca‰ÑÁé âÿÁà¶Œ€dca‰ÐÁ趌ȠdcaÁáÁà1ÐÁ‰ÈÁè¶€àdcaƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€ ecaÁà¶Œ€eca‰ÐÁèƒâ¶ŒÈàeca‰ÐÁè¶Œˆ`fcaÁáÁà1ÐÁ‰ÈÁè¶€gcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ŒgcaÁà¶Œ gca‰ÐÁè âÿ¶ŒÈàgca‰ÐÁè¶ŒÈhcaÁáÁà1ÐÁ‰ÈÁè¶€ hcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€HhcaÁà¶Œ`hca‰ÐÁè âÿ¶ŒÈ€hca‰ÐÁ趌ȘhcaÁáÁà1ÐÁ‰ÈÁè¶€ÀhcaƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€àhcaÁà¶Œica‰ÐÁè¶Ò¶ŒÈ@ica‰ÐÁ趌ȀicaÁáÁà1ÐÁ‰ÈÁè¶€àicaƒáÓøƒàÃv‹L$‰ÈÁè·É‰ÊÁê áÿ¶€jcaÁà¶„@jca‰ÊÁêƒáÁà¶”€jca‰ÈÁèÁâ¶”kcaÁà1ȶ„ÐÀkcaÃf‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€ lcaÁà¶Œ@mca‰ÐÁèƒâ¶ŒÈ@oca‰ÐÁè¶Œˆ`scaÁà1ж„ˆàvcaËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€àxcaÁà¶Œ€yca‰ÐÁèƒâ¶ŒÈ`zca‰ÐÁè¶ŒÈÀ{caÁà1ж„ˆ€~caËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@€caÁà¶„à€ca‰ÑÁéƒâÁà¶Œ ‚ca‰ÐÁè¶Œˆ€…caÁà1ж„ˆ@‰caËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ ‹caÁà¶„ÀŒca‰ÑÁéƒâÁà¶ŒÀca‰ÐÁè¶ŒˆcaÁà1ж„ˆ ‘caËL$‰ÈÁè·É‰ÊÁê áÿ¶€D’caÁà¶„`’ca‰ÊÁêƒáÁà¶”€’ca‰ÈÁèÁâ¶”À’caÁà1ȶ„Ð “caÃf‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@”caÁà¶„à”ca‰ÑÁéƒâÁà¶Œ–ca‰ÐÁè¶Œˆà˜caÁà1ж„ˆ›caËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€à›caÁà¶Œca‰ÐÁèƒâÈ·ŒàŸca‰ÐÑ趌ȫcaÑà1ж„HÀ¸caÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ºcaÁà¶Œ »ca‰ÐÁèƒâ¶ŒÈ ¼ca‰ÐÁè¶Œˆ ¿caÁà1ж„È€ÀcaËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€`ÂcaÁà¶Œ€Ãca‰ÐÁèƒâ¶ŒÈÅca‰ÐÁ趌ȀÇcaÁà1ж„ˆËcaËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÌÍcaÁà¶ŒàÍca‰ÐÁè âÿ¶ŒÈ Îca‰ÐÁè¶ŒÈ`ÎcaÁáÁà1ÐÁ‰ÈÁè¶€àÎcaƒáÓøƒàËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ÐcaÁà¶„ Ðca‰ÑÁéƒâÁà¶Œ Ñca‰ÐÑ趌ȀÒcaÑà1ж„HàÔcaÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€`ÕcaÁà¶„Öca‰ÑÁéƒâÁà¶Œ Öca‰ÐÁè¶Œˆ ØcaÁà1ж„ˆ ÚcaÃSQ‹\$ ‰$èçÿÿ…Àu‰$è‚äÿÿƒø ”À¶ÀZ[Ãf¸Z[øÃf1Àƒ|$–ÀÃP‹D$‰$èKäÿÿ…À•À¶ÀZÃP‹D$ƒø t‰$è.äÿÿƒø ”À¶ÀYÃv¸YÃSQ‹\$ ‰$èæíÿÿ…Àu‰$èþãÿÿº€ˆÁÓú1Àƒâ”ÀZ[Ãf1ÀZ[ÃvSP‹\$ ‰$èºÿÿÿ…Àu ‰$è†ÿÿÿ…Àt‰$èºãÿÿƒø•À¶À[[Ãf1À[[ÃvSQ‹\$ ‰$è æÿÿ…Àu*‰$èŠãÿÿºÀ@ˆÁÓúƒâu‰$è îÿÿ…À•À¶ÀZ[øZ[ÃSP‹\$ ‰$èRãÿÿƒø t‰$èaðÿÿ…À•À¶À[[Ãf¸[[ÃVS‹D$ ‹T$‰ÁÁé ‰Ææÿ‰óÁëæÿ¶‰@ÝcaÁá¶œ àÝca‰ñÁéÁã¶œ ÞcaÁá1ñ¶ŒÙ áca IÁá™Àba‰‹‰Àba…Ét'Á‰J‹K…Ét#Á‰J‹K…ÉtȉB ¸[^Ãf¸ëô¸ëì¸ëäS‹D$‰ÂÁê ‰Ããÿ‰ÙÁé¶Û¶’ åcaÁâ¶ŒÀåca‰ÚÁêÁá¶Œ €æcaÁâ1Ú¶”Ê èca•ëca[ÃfVS‹D$ ‹\$‰ÂÁê ‰Ææÿ‰ñÁéæÿ¶’@ìcaÁâ¶Œàìca‰òÁêÁá¶Œ  ícaÁâ1ò¶”ÊàïcaÁâ‚ ba‰‹‚$baf…Àt!·À‰Cf‹‚&baf…Àt·À‰C¸[^øëõ¸ëíÿ%Prdaÿ%Lrdaÿ%Trdaÿ%@rdaÿ%8rdaÿ%`rdaÿ%\rdaÿ%Drdaÿ%XrdaU‰åƒì‹E ƒøt…Àu‹U‰T$‰D$‹E‰$訸ɠvU‰åSƒì‹E ƒ=@Pdat Ç@PdaƒøtHt?¸ƒÄ[É f»€daû€datäv‹…ÀtÿЃÃû€dauí¸ƒÄ[É ‹E‰D$ÇD$‹E‰$èë¥U‰å1ÀÉÃU‰å¸É U‰åVSƒìu ‹hrdaƒÃ@‰\$ ÇD$ÇD$Ç$äòcaèL‰t$‹E‰D$‰$èAèDU‰åWVSƒìL‰Ã‰Ö…Éu eô[^_ÉÃvÇD$EȉD$‰$‰MÄè.ƒì …À‹MÄ„ˆ‹E܃ø@ttƒøtoUä‰T$ ÇD$@‹EÔ‰D$‹Eȉ$‰UÀ‰MÄèôƒì‹EÜ‹Mĉßó¤ƒø@‹UÀt„ƒø„{ÿÿÿ‰T$ ‹Eä‰D$‹EÔ‰D$‹Eȉ$蹃ìeô[^_ÉÃf‰ßó¤eô[^_ÉÉ\$ÇD$Ç$üòcaèÐþÿÿU‰åWVSƒì,¡8Pda…Àt ƒÄ,[^_ÉÃfÇ8Pda¸óca-ócaƒø~Ý»ócaƒø ~a‹=óca…ÿu ‹5”óca…öt=ûócas¶¾`a}à‹Cð‹‰U้úè þÿÿƒÃûócar݃Ä,[^_ÉË ˜óca…Éu»œóca‹…Òu®‹C…Àu§‹Cƒø…ƒÃ ûócaƒJÿÿÿ¸`aC‹ ‹±`a‹SâÿƒútFƒú tyƒútÇEä‰T$Ç$dócaèÉýÿÿ¶8÷Ç€t$Ïÿÿÿ)Ïï`a47‰uäë,v·8÷Ç€ua)ωùé`añ‰Mäƒútaƒú t#ƒúu+¹Uäèºýÿÿë‹)Êê`aò‰Uä¹UäèœýÿÿƒÃ ¸óca9؇8ÿÿÿé}þÿÿvÏÿÿ)Ïï`a47‰uä¹UäècýÿÿëʼnD$Ç$0ócaèýÿÿU‰åƒì¡€ba‹…ÀtvÿС€baP‰€ba‹@…ÀuéÉÃvU‰åSƒì‹t·aaƒûÿt"…Ût fÿt·aaKuöÇ$d´aaèv\þÿƒÄ[ÉÃ1Ûë‰ÃC‹…t·aa…ÒuðëÈfU‰åƒì‹ rƒøuèzþÿÿ¸ÉÃvèkþÿÿ¡DPdaHuéÇDPdaÇ$HPdaè‘PëÐf¡DPda…ÀtÇDPda¸ÉÃfÇ$HPdaèlRëÞÿ%trdaÿ%xrdaÿ%lrdaÿ%prdaÿ%rdaÿ%rdaÿ%0rdaÿ%,rdaÿ%rdaÿ%(rdaÿ%rdaÿ%$rdaÿ% rdaÿ% rdaU‰åƒìè!ZþÿÇ$`aèÉYþÿÉÃÿÿÿÿX·aaÿÿÿÿ[;bai;baw;ba;ba;ba¡;ba¯;ba»;baË;baØ;baç;baô;baba>ba(>ba<>baL>ba\>bap>baˆ>baœ>ba´>baÈ>baÜ>baë>baþ>ba?ba(?ba8?baL?bad?bax?ba‹?ba¢?ba½?baÔ?baä?baø?ba@ba$@ba8@baN@bad@bax@ba…@ba–@ba«@ba¼@baÑ@baâ@baó@baAba!Aba6AbaOAbadAbasAba„Aba”Aba¬Aba¼AbaÒAbaêAbaýAbaBba$Bba5BbaGBbaˆCompiled regex objectVBba¼aa Ìaa\BbaaaÀÌaafBbadaa`ÍaamBba Šaa@ÎaaqBba\‰aa`ÏaavBba$yaa Ðaa|Bba$ä`a Ñaa†Bbaluaa ÑaaŽBbaä`a€Òaa—BbaŒâ`a ÓaaŸBba„`a¨BbaŒ`aµBbaÀBbaýBba CbaCba $CbaSCba4`CbaƒCbaœ:`aCbaÃCba<H`atß`aMatch objectÐCba(Ý`a€ÔaaÖCbaHÜ`a ÖaaÜCba4Ü`aà×aaàCba Ü`a ÙaaCbaè×`a ÛaaåCbaèÝ`a`ÜaaïCbaXà`a`ÝaaüCbaäŠaaÞaaDba Ü`a Þaa DbaøÛ`a@àaaDbaäÛ`a âaaDbaÐÛ`aäaaDbaˆ5`aæaaŸBba¼˜`a¨Bba°˜`a,Dbatß`aH8Dba MatchObject or None. Match zero or more characters at the beginning of the string.fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters against all of the string.search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Search through string looking for a match, and return a corresponding match object instance. Return None if no match is found.sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement repl.subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement repl.split(string, string, maxsplit=0, concurrent=None) --> list. Split string by the occurrences of pattern.splititer(string, maxsplit=0, concurrent=None) --> iterator. Return an iterator yielding the parts of a split string.findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list. Return a list of all matches of pattern in string. The matches may be overlapped if overlapped is True.finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator. Return an iterator over all matches for the RE pattern in string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a MatchObject.scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner. Return an scanner for the RE pattern in string. The matches may be overlapped if overlapped is True.group([group1, ...]) --> string or tuple of strings. Return one or more subgroups of the match. If there is a single argument, the result is a single string, or None if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the whole match is returned. Group 0 is the whole match.start([group1, ...]) --> int or tuple of ints. Return the index of the start of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the start of the whole match is returned. Group 0 is the whole match.end([group1, ...]) --> int or tuple of ints. Return the index of the end of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the end of the whole match is returned. Group 0 is the whole match.span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints. Return the span (a 2-tuple of the indices of the start and end) of one or more subgroups of the match. If there is a single argument, the result is a span, or (-1, -1) if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the span of the whole match is returned. Group 0 is the whole match.groups(default=None) --> tuple of strings. Return a tuple containing all the subgroups of the match. The argument is the default for groups that did not participate in the match.groupdict(default=None) --> dict. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name. The argument is the value to be given for groups that did not participate in the match.capturesdict() --> dict. Return a dictionary containing the captures of all the named subgroups of the match, keyed by the subgroup name.expand(template) --> string. Return the string obtained by doing backslash substitution on the template, as done by the sub() method.captures([group1, ...]) --> list of strings or tuple of list of strings. Return the captures of one or more subgroups of the match. If there is a single argument, the result is a list of strings; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the captures of the whole match is returned. Group 0 is the whole match.starts([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the starts of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the starts of the captures of the whole match is returned. Group 0 is the whole match.ends([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the ends of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the ends of the captures of the whole match is returned. Group 0 is the whole match.spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints. Return the spans (a 2-tuple of the indices of the start and end) of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of spans; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the spans of the captures of the whole match is returned. Group 0 is the whole match.detach_string() Detaches the target string from the match object. The 'string' attribute will become None.match() --> MatchObject or None. Match at the current position in the string.search() --> MatchObject or None. Search from the current position in the string.split() --> string or None. Return the next part of the split string.ô‘aaL’aa ’aaø’aaP“aa¨“aa”aah”aaДaa@•aa°•aa –aaˆ–aað–aaX—aaÀ—aa(˜aa˜aaø˜aa`™aaÈ™aa0šaa˜šaa›aah›aaЛaa8œaa œaaaapaaØaa@žaa¨žaaŸaaxŸaaàŸaaH aa° aa¡aa€¡aaè¡aaP¢aa¸¢aa £aaˆ£aað£aa`¤aaȤaa0¥aa˜¥aa¦aah¦aaЦaa8§aa §aa¨aap¨aaبaa4©aaˆ©aaÜ©aa4ªaaŒªaaèªaa@«aa˜«aaì«aa@¬aa¨¬aa­aaX­aaˆ­aa­aaœ­aa´­aaÜ­aa®aaP®aa”®aaß0Ið°‡–—˜™šžPRTV€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯²³´¶·¼ÂÃÄÆÇÌÒÓÖ×âãäæçòóôö÷üûûûûûûûûûûûû9cAÊĽ%ɾ\¿)ÑäÝ㦠¶  ± ! ` " Ü ~ » | j}~dñ:‹eú‡¢pOŽastoaƒáÑ‹¼ÐbÖT€ìtV¯ŽÛ Ô k Ó 4!!!‘"h""i"ÿ#±#²#Æ$w$x$%#ѹ—•–˜Ÿš^]Þg³ ” š ™ › µ / ¨ ´³ ¶Ùª©­ÛQ|×Ï!’ "! "þ#%$c$Õ%Û&Ú&C':((4(@)¯*+,,ÿ-.†/ 0;151´2 34‡5ý6 7Ì8ç9Ò:®;D<é=è=I>H>}?|?~@@iAµAžB™BCCûD‘DïEîEŒFhGlG´G°H5I¸JßKàKúLÿLMPN=NÊOÉOñPèQüR÷SþS·TõUûUñVëV÷WöWòXìXöYüYóZðZø[ô[\ ]›]^_ÿ_$`ØaÖa—b•bôcùcUdTd{ezeDf@fXgWg:h~iëj$kqkylímìmVnooÎpÍpJqHqZrPrrsqsYtGttusv¼wCx˜y–yÎz{¡|œ|þ}n~N~vº€¯®‚‚Ÿƒ&„d„g…<†‡‡ ˆê‰é‰ÙŠ×Šè‹(Œ#Œ'e8Ž67ÅŒ‘‹‘‘L’N’“œ“±”¯”F•U•L–j——K˜I˜Ô™Ó™²š°š››ßœ¸·žŸ£ ¤¡x¢w¢Ð£ ¤F¥¦7§G¨«©ÉªU«“¬K­{®Ò¯î°í±…²H³Æ´XµW¶I·®¸­¸ô¹sºÙ»;¼È½¾ˆ¿ŠÀ‰ÀÅÁÐÂÏÂïÃwÄvÄÅÅ Æ Æ¢Ç¡Ç È ȃÉ‚ÉÞÊÝÊ­ˬËÖÌÕ̹͸ÍÎËÏÌÏÐÐÏÐùÑýÑÆÒ1Ó0Ó–Ô•Ô[ÕQÕ\ÖRÖ]×S×MØOØÙGÚVÚõÛ÷ÛöÜøÜ=‚m”¢ ”œµ·/.¨§   ­ ¬ Û Ú     QS|‰×ÏÎ!’“"# þý#"ÕÔCB @?¯°†ˆ   :!9!~"u"ë#ê#!$*$o%p%F&b&''«(¾(Q)“){)**,+++ÿ,þ,--´.³. //¶0µ07161É2Ê2U3T3’4…4ö5õ5ý6ü67’7€78899$::þ;ý;GË>ˆ?h?{@z@vAuAB BçCæC®D­DDEEECFDFºG¹G‚HtHŸI¨IÐJÏJ K KÒLÑL<M N‘N OOÆPÇPÅQÄQ¶R·R¼SÎTÍTgUfUèV VKW¶WHX¸XXYYWZyZI[R[s\‹\Ò]Ó]ô^ó^Ù_Ø_;``íaëaîbìbïc‚cÈdÌdÙeØeff€gVi¼½Íà0;†²!✡ñ ï ~ q ˜ ¤ ð  ñ  òâ62äßVi†²~câßœ¡ÝÑB Ë Í ‰ Vi†²âßÅÀñïÚ¿?>J ¤ 6 2 À ¼ ä ã _ ^ ½¼"åænj2,¥SB.ÌËÎÍ©¤šÜÇÝÒÞÓ® o‡jȱZ ` _ M ð é ) 0 « “ ¬È§«ªÆ¥©„q«Ç¦ªîô…r- .  f e  3  w x ~ Œ M T „         ! " ! # # $ $ % & & ' ' + ( 0 ) 5 * ; + @ , B - C . D / E 0 F 1 M 2 Q 3 R 4 S 5 T 6 U 7 V 8 ƒ 9 !Š ! " " # # $ $ % % & & ' ' ( (à )/ )¿ )Á *1 *½ * +¾ +2 +Ø ,ä ,4 ,× -È -6 -Ù .ò .7 .¦ /8 / /¢ 0š 09 0 1: 1“ 1Œ 2‹ 2< 2Ž 3¦ 3= 3» 4> 4£ 4º 5? 5ž 5\ 6_ 6A 6  7Ä 8'   p f ð $  S R æ å ë ê a ` E È í ê å K J [   Ò Õ â á ó ò   Ÿ ‹   [ W õ å   % ’ ” — Ö Ü Ÿ   Á é í ö ÷    - 1 2 3 r } Š   ç ó + 9 s ” • ž   ´ !µ "Á #à $Ë %û & ' ( ) *X + ,k -l .m /u 0v 1y 2z 3ƒ 4è 5 6ç 7; 8¬ 9( 3 k  À  £ š ¨  /  =iONa^˜—*/àßûüP_ˆ ‡ † ƒ 6 2 › “ C ? YZL>=kbùÔøÊÛÚÚㆺ²}r³Ÿ‘úÉúÇ€!_\ip o!"#`$„$0%;%s&F&œ'¡''62¶°¥¤    H    L *Km)J[lyI(kGxZ…j r!"w#"$~%%&„' ()*+ ,!-#.$/&0'1+20354;5@6B7C8D9E:F;MS?T@UAVBWCXDYE\F`GaHbIdJeKfLgMhNiOnPsQzRS†TU,VNW]XoYtZ{[€\‡]^-_O`^apbuc|deˆfg.hPi_jqkvl}m‚n‰op3qcrst¢¦O§(î)-+ , ï * g [VâNÅ3MRQPz u v { | ywx&'úøçæ¾¼^Y ùĻܛšÃÂ@ ?   D ?  A ‘ @=>ŽIEA@fedc¨°   ZaÛßÝlj¡>™–^ L 5!4!º""W#<#C$B$²%±%ã&á&]'K'c(d(&))Y*A*G+F+J,H,›-<.8.X/>/ª0©0×1¿1Á2À2[3C3Z4B4ä5E6U6m7n7l8k8)9<9Þ:Õ: ; ; §< ¿< Ã= Â= m> h> n? o? ¹@£@7A1A8B:BáCàCMDUDOEVEžF™F¥G¹H»IåJKŠL]MbN`HbaeHbagHbaiHbanHbasHbawHba{HbaHbaƒHba‡Hba‹HbaHba“Hba–HbašHbaŸHba¥Hba¬Hba¶HbaÄHbaÈHbaÌHbaÏHbaÔHbaØHbaÛHbaßHbaãHbaæHbaëHbaïHbaóHbaöHbaùHbaþHbaIbaIba Iba IbaIbaIbaIbaIbaIba Iba%Iba+Iba/Iba2Iba6Iba:IbaAIbaEIbaHIbaLIbaPIbaTIbaXIba\Iba_IbacIbagIbakIbaoIbarIbavIbayIba|IbaIba‚Iba…Iba‡IbaŒIbaIba”Iba˜IbaœIbaŸIba£Iba¨Iba®Iba±Iba´Iba·IbaºIba½IbaÀIbaÃIbaÆIbaÉIbaËIbaÏIbaÒIbaÖIbaÛIbaáIbaäIbaçIbaêIbañIbaôIba÷IbaúIbaýIbaJbaJbaJba Jba JbaJbaJbaJbaJba#Jba%Jba(Jba,Jba1Jba7Jba9Jba=JbaAJbaDJbaHJbaMJbaSJbaUJbaXJba\JbaaJbagJbajJbalJbapJbasJbawJba|Jba‚Jba…Jba‡JbaJba—Jba¢Jba°JbaµJba¸Jba¼Jba¿JbaÅJbaÐJbaâJbaçJbaïJbaõJbaûJbaKbaKba/KbaLbaWLbaaLbarLba{Lba€Lba…LbaŒLba’Lba Lba©Lba¬Lba°LbaµLba¹Lba¿LbaÍLbaàLbaîLbaMba MbaMbaMbaMbaMbaMba#Mba,Mba1Mba7Mba@MbaPMba[MbaaMbafMbaiMbalMbapMbavMba€Mba‹MbaMba˜MbaMba£Mba­Mba¹Mba¿MbaÌMbaÒMbaÕMbaØMbaÞMbaâMbaèMbaöMbaùMbaþMbaNbaNba$Nba+Nba:NbaJNbaUNbaXNba]NbadNbaiNbaqNbaNbaŒNba˜Nba¢Nba¯Nba´Nba½NbaÂNbaÈNbaÜNbaëNbaObaObaOba ObaOba$Oba6Oba@ObaXOba]ObabObaiObaxOba~ObaŠOba˜Oba›ObažOba¢Oba¨Oba¯Oba¶Oba¼ObaÃObaÉObaÐOba×ObaÝObaäObaëObaòObaøObaþObaPba PbaPbaPbaPba"Pba(Pba.Pba4Pba:Pba@PbaFPbaLPbaRPbaXPba^PbadPbajPbapPbavPba|Pba‚PbaˆPba‹Pba’Pba—Pba­PbaÃPbaÙPbaïPbaQba QbaQbaQbaQba Qba$Qba.Qba=QbaNQbadQba€Qba¥Qba¹QbaÐQbaØQbaàQbaèQbaðQbaÿQbaRba Rba+RbaDRba\Rba|RbaœRba¼RbaÛRbaÞRbaäRbaõRbaSba Sba SbaSbaSbaSba4SbaXSba|SbaSbaSba¶Sba½SbaÔSbaäSbaëSbaöSbaTba Tba5Tba?TbaMTba\TbapTba€Tba•Tba¤Tba·TbaÇTbaÏTbaßTbaäTbaëTba÷Tba UbaUbaUbaUbaUba#Uba4UbaSUbabUbarUbawUba|Uba€Uba„UbaˆUbaUba¡UbaªUba·UbaÄUbaÖUbaèUbaôUbaVbaVba"Vba$Vba'Vba+Vba6Vba;VbaKVbaNVbaQVbaYVbagVbayVba“Vba—Vba¢VbaªVba¯VbaºVbaÈVbaÛVbaÞVbaâVbaìVbaùVbaWba Wba&Wba/Wba6WbaBWbaNWbaZWbafWbaiWbanWbaqWba}WbaWba‚Wba‘Wba–WbaªWba´Wba·Wba»WbaÌWbaäWbaXbaXba#Xba?XbaVXbatXba‚Xba…XbaˆXbaXba–Xba¢Xba¯XbaÀXbaÒXbaÞXbañXbaYbaYba%Yba(Yba4Yba8Yba?YbaHYbaUYbaWYba]YbafYbaiYbamYbaqYbawYbaˆYba•Yba¨Yba«Yba°Yba·Yba»YbaÄYbaÈYbaÒYbaÖYbaÜYbaßYbaãYbaóYbaZbaZbaZba$Zba0ZbaCZbaFZbaKZbaVZba[Zba`ZbagZbamZbazZbaZbažZba«Zba²Zba¸ZbaÇZbaÐZbaÞZbaãZbaéZbaðZbaùZbaþZba[ba [ba[ba[ba[ba[ba)[ba3[ba=[baX[bag[bak[bap[baw[ba[baš[ba®[baÂ[baÒ[baå[baê[baï[ba÷[baú[baÿ[ba\ba\ba\ba\ba$\ba(\ba1\baJ\ba[\baj\bao\bax\ba{\ba\ba‚\ba‰\baŒ\ba\ba›\ba \ba¬\baÍ\baÑ\baÖ\baè\baí\baõ\ba]ba]ba]ba.]ba?]baU]bab]bal]baq]bay]baŒ]ba‘]ba–]ba«]baÁ]baÍ]baÙ]baã]bañ]baø]ba^ba ^ba ^ba^ba^ba ^ba)^ba2^ba7^ba@^baC^baF^baL^baX^bad^baq^ba}^ba€^baƒ^ba†^baŠ^ba‘^ba–^ba›^ba£^ba²^ba¾^baÅ^baÌ^baÛ^baã^baè^bañ^baý^ba_ba+_ba3_ba9_ba>_baI_baO_ba\_baa_baf_baq_bav_bay_ba{_ba~_ba‚_ba‰_baŽ_ba’_ba—_ba_ba¤_ba®_ba¿_baÉ_baÜ_baæ_bað_baú_ba `ba!`ba0`ba?`baN`baS`baV`baY`bae`baj`baw`baƒ`ba`ba¤`ba·`baË`baÐ`ba×`baÞ`bað`baý`baabaaba abaabaaba)aba:abaDabaMaba[aba`abacabafabaiabamabaƒaba‰aba“aba£aba±abaµaba¹aba½abaÀabaÃabaÆabaÑabaÕabaáabaæabaíabaòabaùabaûabaþababbabbabba"bba*bba9bba>bbaCbbaPbbapbba†bba”bbaŸbba¢bba¥bba¨bba¬bba³bba¸bbaÄbbaÓbbaébbaîbbaóbbacbacbacba&cba-cba7cba;cbaHcbalcbaŽcba£cbaÄcbaçcbaþcbadba dba0dba ` 9\¬ÿÿÿ % Výÿÿ 6 P / }ÚÿÿÿÛÿÿÿ3àÿÿÿàÿÿÿ@àÿÿÿ<Œÿÿÿàÿÿÿàÿÿÿ6ùüÿÿàÿÿÿàÿÿÿàÿÿÿ0áÿÿÿàÿÿÿÿÿÿÿàÿÿÿàÿÿÿ]ÀÿÿÿÁÿÿÿÂÿÿÿâÿÿÿÇÿÿÿçÿÿÿ#ÑÿÿÿñÿÿÿÊÿÿÿêÿÿÿøÿÿÿªÿÿÿÊÿÿÿ°ÿÿÿÐÿÿÿ¤ÿÿÿÄÿÿÿÝÿÿÿ ÿÿÿÀÿÿÿùÿÿÿP°ÿÿÿñÿÿÿ0Ðÿÿÿ`Šæ;ÿÿÿÿ:ÅÿÿÿÆÿÿÿAâÿÿJVd€p~ ¶ÿÿÿ÷ÿÿÿ‡ãÿÿÛãÿÿûãÿÿªÿÿÿ½ãÿÿœÿÿÿÍãÿÿÿÿÿ€ÿÿÿ‚ÿÿÿƒâÿÿ£âÿÿ!ßÿÿAßÿÿšßÿÿºßÿÿäÿÿÿðÿÿÿæÿÿÿ ÖÿÿñÿÿÖÿÿÕÕÿÿØÕÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿ ãÿÿüuÿÿØZÿÿ¼Zÿÿ(Øÿÿÿ ”ÿÿÿs9ÿÿÿsn‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛzþÿÿ ŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?)âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0Þÿÿÿ‚`Òáÿÿ1Ýáÿÿßáÿÿ àáÿÿ Çáÿÿ¾ÆÿÿÿÕáÿÿsøÿÿÿuäÿÿsäÿÿqäÿÿoäÿÿB€ÿÿÿ¹xÿÿÿ¹ÿÿÿ¹ˆÿÿÿ¹Àÿÿÿ¹¸ÿÿÿ¹¾ÿÿÿ¹þãÿÿ¹øãÿÿ¹ûãÿÿBúãÿÿB¹¶ÿÿÿõãÿÿ¹ûãÿÿ²ÿÿÿ¹ôãÿÿ¹êãÿÿ¹ñãÿÿBðãÿÿB¹ªÿÿÿëãÿÿ¹çãÿÿæãÿÿããÿÿBâãÿÿBœÿÿÿããÿÿâãÿÿÝãÿÿßãÿÿBÞãÿÿBÿÿÿŠÿÿÿ¹Öãÿÿ¹Úãÿÿ¹ÓãÿÿBÒãÿÿB¹€ÿÿÿ‚ÿÿÿÍãÿÿ¹£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿfÿÿfeÿÿidÿÿlcÿÿfibÿÿflnÿÿtmÿÿta ÿÿv` ÿÿe_ ÿÿkh ÿÿv] ÿÿm(„·aalibgcc_s_dw2-1.dll__register_frame_infolibgcj-12.dll_Jv_RegisterClasses__deregister_frame_info@`a,`a`a `aü`aì`aT`aÈ`a£`aÂ`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a¸`a£`a£`a£`a¸`aÂ`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`a£`aÂ`a£`aØ`a£`aØ`a£`a£`aÂ`aª`aª`aø`aø`aø`aø`aø`aø`aª`aª`aª`aª`aø`aø`aø`aø`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aª`aø`aø`aø`aø`aø`aø`aø`aø`aª`aª`aª`aª`aª`aª`aª`aø`aø`aø`aø`aø`aø`aø`aø`aø`aø`aø`aø`aø`aø`aø`aø`a²`aç`a²`a²`a²`a²`a²`a²`a`a²`aÄ`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`aü`a²`ap`a|`aü`a`a²`a²`a²`a²`a²`a²`a²`a²`a²`ap`ap`ap`ap`ap`ap`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`a²`aé`a²`aé`aÄ`a²`aÄ`aS`aS`ai`ai`ai`ai`ai`ai`aS`ai`aS`aS`ai`ai`ai`ai`ai`ai`ai`aS`ai`ai`ai`ai`ai`ai`aS`ai`aS`aS`aS`aS`aS`aS`aS`ai`ai`ai`ai`ai`ai`ai`ai`aS`aS`aS`aS`aS`aS`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ai`ann:has_property_valuennn:get_all_casessx$`aý"`aý"`aý"`aý"`aý"`aý"`a¸#`aT$`aì#`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`a $`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`aý"`a#`a#`aX#`a#`at#`a„#`a0$`aØ#`ah#`a¤$`aý$`aß$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a²$`a¤$`a¤$`a¤$`a¤$`a¤$`aÁ$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a¤$`a„$`annerror_regex_coretoo much backtrackingconcurrent not int or Nonegroup indices must be integers or strings, not %.200sgroup indices must be integers or stringsinvalid RE codestring indices must be integersinvalid group referenceexpected string instance, %.200s foundexpected unicode instance, %.200s foundno such groupinvalid replacementinternal error in regular expression engine/`a,/`aP/`al/`aŒ/`a¬/`aÜ/`aø/`aÜ.`a0`aÂ.`aÂ.`aÂ.`aÂ.`aÂ.`a 0`aÂ.`aì.`aregex.Regex(, flags= | regex.=)F`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aF`aÏE`aÏE`aÏE`a(F`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`aÏE`a aaãaa»aaraa¦é`a¦é`aŒaaUö`aôõ`a¤õ`aRõ`aõ`axö`at.aa÷`a„-aa„-aa„-aa„-aa„-aa„-aa8-aa0,aaô+aa¸+aa„-aa„-aa„-aa„-aa0,aa0,aa0,aa÷`a0,aa0,aa0,aa0,aa0,aa0,aaÌ/aa0,aaP/aa÷`a/aa÷`aP/aaÈ.aa÷`a„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa01aa0aa0aa01aa01aa01aa0,aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa„-aa0,aa0,aa0,aa0,aa01aa(2aa(2aa01aa01aa01aa÷`a÷`a÷`a÷`a÷`a÷`ap+aa+aa*aa÷`a€)aa÷`aÜ'aaH'aaÈ%aaˆ%aa,%aa¤$aaBaacAaa³@aa@aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aa¦5aas?aaÇ>aa#>aaƒ=aaã?@@ABCDEFGEHIEE@J@@KLMNOPQRESTUVWXYEE"""""""""""""""""""""""""""""""""""Z"""""""""""""""""""[\""""""""]""^_`abcdefghi"""""""""""""""""""""""jkkkkkkkkkkkkkkkkllllllllllllllllll""mnop""qrstuvwxyzL{|}~LLLLLL€L‚ƒL„L…LLL†LLL‡ˆ‰ŠLLLLLLLLL‹LLLLLLLLLLLLLLLLLL""""""ŒLLLLLLLL""""""""ŽLLLLLLL""""LLLLLLLLL‘’LLLLLLLLLLLLLLLE“”•–L—L˜™š›œžŸLLLLLLLLLLLL ¡LL¢£¤¥¦L§¨©ª«¬­®¯L"""""""""""""°""""""""""""""""±"²LLLLLLLLLLLLLLL""""²LLLLLLLLLLL³L´µLLLLLLLLLLLLlllllllllllllll¶       !"#$ %& ' ( ) *+ ,- ./ 0123456227 8922222:;<=>2 ?22222@AB2CD2EFG2HIIIIJIIIKLM22NOPQRSTUVWXYZ[TU\]^_`abUcdeYfSTUghiYjklmnop_qrsUtuvYwxsUyz{Y|xs2}~Y€‚2ƒ„…I†‡22ˆ‰ŠII‹ŒŽII‘’“”•2–—˜™ š›œII22žŸ ¡¢£¤ ¥22¦222222222222§¨22§22©ª«222ª222¬­®2¯22222°±2222222222222²2³´2222µ¶·¸2¹2º·»222¼½¾¿ÀÁ¿22Â22Ã22Ä2222Å2–ÆÇÈ2ɰ22ÊËÌÍÎÎ2Ï222ÐÑÒ¿¿ÓIIIIIÔ22ÕÖŸ×ØÙ2ÚB22ÛÜ22ÝÞßB2àIIIIáâãä åæç è éê ë ìíììíîìïðððñòóôõö÷øùúûüýþÿI      ÎÎÎÎÎÎÎÎÎÎÎII   ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎ ÎÎ!ÎÎÎÎÎÎ"Î#ÎÎÎÎÎ$% &ÎÎ'()*+,ÎÎÎ-¯IIIIIIIIII . /01 23 422256278888 9:;<IIIIÎ=ÎÎÎÎÎÎÎÎÎÎ>I?@ABC‡2222D±2222EF2ɇ2222GH23ÎÎ2ÎIJÎKLÎÎJÎÎLÎÎÎI222ÅÎÎÎÎ2222–III2M222222–ÎÎÎ22àN2OI PQ R2222STUVW XYZ[IIII\]2^_222`a22bc¿ dB2e2fg2–M22hijII22klmn2o222pqrstuv8IIIIIIIII22w¿22x2y22Êzzzzzzzz{{{{{{{{222222É222222|II}~€222222‚ƒ„22222…I2222†22ÃII‡ ˆé‰Š‹Œ2222222Ž‘’2“2G”•–—˜2«™ÉÉII22222223š  ›   œ?IIIÎΞ2–222eII2GŸ2 III2¡22¢£II ¤ 2222É¿IIIII¥22¦2§II2¨2©IIII222ªIIII«¬2­®¯2°222±2²2³2222´IIIIIIIII µ¶22·¸¹ºIÙ22»¼2´¿½2¾¿ÀIIIÙ22Á¿II22ÃÄ¿III222222GI      ÅÀ22GIIIII222´IIII2222°ÆËÇÈÉIIIIIIÊIIIIIIIÎÎÎÎÎÎÎ>ÎÎËÎÎÎÌÍÎÎÏÎÎÐIIÎÎÎÎÑIIIÎÎÎÎÎ Ò Ó ÔÕÖì רÙÚÛ Ó ÜÝ Þßàá â Ó ÔÕ ì ×á â Ó ã äåæç è éêëì í î ïðððñ2òóôõö÷øÊùÊIIIúÎÎ?ÎÎÎÎÎÎIû##IIüÎIÎÎÎ?ÎÎIIIIýÎþÎÎÿIIÎÎÎÎÎÎÎÎIÎÎÎÎIÎÎÎÎÎÎÎÎÎÎÎÎÎÐÎIIIIIIIIÎÎÎÎ IIIÎÎÎÎ>IIIÎÎÎÎÎÎÎ222227II222°22222ÉIIIIII I       I{{{{{{{    ! """""""" """ "  "  " " " "" # $$%"&%"""""""" "&  " "" '((((((((())(((((()))))))((*)))**))))))))++++++++ * ,-.,,)/ 00 " 1 "   2" " 3++4 """""" ,,,,1 05678,9:++++++++++++++;<=+<,,,,$$$$$$$$$$$$$>,,$?.,,,,,@@A BC+++++=AD$$$$E++$F$$$$$$$$$G+++H3++IJK++$$LMNE$$$$$$$+++++OP$$$$+++++F,,,,,,,$$$$$$$$E++++(Q,,$$$++J++++J+J++,.$$$$E+,.,,,,,,,,>$$$$$>,,,+++++++++++++O+R$$$$$$$$$$$RFST+++RSTSE+++$$$$$+U$$$P$$$:SP$$$>P>P$$$$$$$$$$>$$$>>,$$,FST+OVWVT>,,,V,,$P$+,$X,,:RP$$>,P>$P>$,OSTO,:O:+,:,,,P$>>,,,+$E,,,,,:RP$$$$P$P$$$$$$>$P$$,FST++:RVT,>,,,,,,,B,,,,,,,>$P$$,FTT+OVWVT,,,,R,,$PM,,,,,FP$$>,$>$$,P>>$,P>,$>,$$$$$$,,SRW,SWST,>,,V,,,,YCCXZ,,VSP$$$>$>$$$$$$$$$P$$,P+RSW+O++,,,:O$,,,,,,,Y,SP$$$>$$$P$$,FTSSWRWS+,,,VW,,,>P>,,,,,,$$$$$>PST+OSWST>,,,V,,,,,[$$$,SP$$$$$$$$>,$$$$P$$$$P,$$$>,O,VS+OOSSSS,S.,,,,,P$$$$$$$E$+++O,9$$$J+++=,,P>>P>>P,,,$$P$$$P$PP,$P$E$+++:F,$$>Q+++,,$$LC\\C+CCC333S$$$$P$$$$$$$$$>,:++++++R++=+$$E+++++:+++++++++OCCCCKCCZC\C.,,$$$$$]T+R+++TRTF$$$S+$$+FS^]SSS$E+F$$$$$$RTRSST]STC 1,,1,$$$$$?D$$$$$>$$,$$$>>$$,>$$,$$$>>$$,$$$$$$$>$$$$$$$$$>:+_`,CCCCC,,,$$>,,,,,a$$$$$$$$$$$$$?Gb$$$$$$$$$$$$cd,$$$$$?ef,,,,,,,$$$$$$>$$+O,,,,,$+=.,,,,$+,,,,,,>+,,,,,,$$+T+++SSSSRT+++++UBE,,,,,,,g<+A$h$$$$$$$$$$,,,,$$$$E>,,$$$,,,,,+RSTRS,,SRSST+,,Z,$$$$$$$,$$$$$$,,SSSSSSSS^$$$S,,,`,CCCCCCCCC$$$ERT,$$]R+++ORRT+++RSST++++O:U,++^$$$$$$$R++RRSSR^$$$,,\CCCC3++++CCCCZ,+^$$$$$$]++S+TS$$$$R+STT+S,,,,$$SSSS++++S+,7,P$$$$$(((,,,,+=++++++R+++F$E$$SF>,,,,(((((((--i((+++O,,,,,,,,,,++   , ,1111,jjjjk lm)k l), n) o),k lpqqqqqr@@ssstutuv@@wxyz{|} {~@@A@@@@@,|€|d((((((Q,,,++++++‚4ƒ4ƒ+++++O,,,,,,,C„C…C"  …C2 CCC„„„ † #$'C 2C‡eeeeeeeeeˆ‰eŠ,,,‹CCCC‹C‹CCC‹CCCCCCCC‹‹CCCCCCCCCCCCCCCCŒCCCCCCCC‹CCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,CCCZ,,,,CCCCCZ,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[CCCCCCCCCCCCCCCCC|Ž|Ž‹, 0k """" "( ‡CC…"‘+ ,,7_6,,6,$$$$,,,5.,,,,,,:$$$>,,,,$$$>$$$>ttxytgttUs,,CCCCC[CCCCC,,,,,CCCCCC,,’“C”•–eeee++S—((Ce˜?C$$$>:™šD$$$$$?(D,,P$$$$$$$$$$$$>CCCCCCCCCCCCCZCCCCCCC›$$h$$$$$$$$$$$œ$,, E4+++++U ,,,:$$$eeeee+,,,,)))š(((()  -""" *ž"k ,,,,,, 0,,,,,,(#$$$F$F$E$$$]TRCC,,CŸ,,,$$,,,,S$$$$$$$$$SSSSSSSSO,,,,+$$$G,,$$$++++$$$E+++++S,,,,,7$ES++SRS 5,,$$$$E++RTRTO,,,,$E$$$$R,,D$$LC],,F+FEF$$+E>,,,,,,,,,,,Ph$$$$$]+Sh¡O,,,,P$$>P$$>P$$>,,,,$]TSR T,$$,,,,,,$$$>,P$$¢¢¢¢¢¢¢¢££££££££$$$$$,,,k,,,,,6,,PF$$$$¤$$$$$$>$$>>$P>$$$$$$)))))))),,,,,,,,P$$$$$$$$$$$$$,$$$$$$$$$$$$$Ÿ,¥},,,¦§}¥}z¨.”}©B,,$$>$$$$$$$$$$$>N7|}$$$$$D$$$$$$$$$$$$$$(,$$$,$$$,$$$,$>,ªX‹Z,,,,N@C,$$$$$$P$$$$$$>$P.,«,[CCCCeeŠYCCCCCCCC`,,CCCCCC3,,,,,,,“$$$$f,,$$$$$$$7$$,,$$$$¬ee,,,,, $$$,>$$$$$$P>,>P$$$7$$$,7$$$$$,,7$$$$,,,$E+:O,,++$$P$P$$$$$,,+O,:,,,,.,,,$$$$$$­$$$,7$$$,$>,,$$$$>,,,`T^$$$$$$$$$$+++++++=,,ST+RT=®,,,,,,,+F$$$$$$$$$E++T+++O,,,,,,$]S++++R^$?.,,,$$$$$ETS+++T,,,,ef,,,,,,]SSSSSSSSSSSSSSW,,,,,,,:+I(((((($,,,,,,,CCCZ[CCCCC¯T+C¯SS°@@@±+++K3+++CCCCCCC++CCCCCCCC,C+K,,,,,,,,,,,,  k 0 ,0101 0 666 1 01 0 0 1 0 00, 0 , ! ! ! ! ! ,$$P$$$$$P>>PP$$$$>$$PP,,,>,PPPP$P>>PPPPPP>>P$>$$$>$$P$>>$$$$$P$$P$P$$P$$,,,,,,,[CCCCCCZ`,,,,,CCCCCCZ,,,,,,CCCCZ,,,C,,,,,,,Z,,,,,,,CCC[CCCCCCCCCCZ,CCZCCZ,,ZCCCCCCCCCCC[CZ,CCCC,,,,,,,,,[CCZ,[CCCCCN,,,,,,,@@@@@@@@£££££££,                        !"################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"""""#$%&'()*+,-./01223345678899:;<=>>?@AABCDDEEFGHIJKLMNOPQRRSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWXYYZ[\]^_`abcdefffffffffffffffffffffffffffffffffffffffghhhhhhhijjjjjjjjkkkkkkkkkkkkkkkkkkllllmnnnnnopqrstuvwxyz{|wwwwww}w~€ww‚wwwƒwww„…†‡wwwwwwwwwˆwwwwwwwwwwwwwwwwww‰‰‰‰‰‰‰‰Šwwwwwww‹‹‹‹‹‹‹‹ŒwwwwwwwŽwwwwwwwww‘‘wwwwwwwwwwwwww’’““”w•w––––––––wwwwwwwwwwww——ww˜™šš››œœœœœœžŸw                             ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¥wwwwwwwwwwwwwww¦¦¦¦§wwwwwwwwwww¨w©ªwwwwwwwwwwww««««««««««««««««¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬  !!!!!!!!""""""""""######$$$$$$$$%%%%%%%%&&''''''(((((((())******++,,--..////////0000000000011111222223334444445566777777777888888889999::::;;;;;<<<=>>>????????@@@@AAAABBBBBBBBCCCCCCCCDDDDDDDEEEFFFGGGHHHHHIIIIJJJJJJJKKKKKKKKLLLLLLLLMMMMNNOOOOOOOOOOPPPPPPPPQQRRRRRRSSSSSSSSTTTTTTTTTTTTUUUVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\]]^^^^^^^^___`````aaaaaabbccccccccddddddddeeeeeeeeeeeeeefgggghhhhhhiiiiiijjjkkkkkklmmnnnoppppppppqqqqqqqqrrrrrrrrrrrrssssttttttttuuuuuuuuuvvvvwwwxxxxxxxxxxxxyyyyyyzzzzzz{{||||||||||||||}}}~€€€€€€‚‚‚ƒƒƒ„„………………††††††‡‡ˆˆˆˆˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’’’’’’’“““““”””””””””””•–—˜˜™™ššššššššš›››››››››››››››œžžžžžžžžŸŸŸŸ     ¡¡¡¡¢¢¢££¤¤¤¤¥¥¥¦¦§§¨¨¨¨©©©©©ªªª«««¬¬¬¬­­®®¯¯°°±±±±±±²²²²²²³³´´´´µµ¶¶·····¸¸¹¹¹¹¹¹¹¹ººººº»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÆÆÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÈÉÉÊÊÊÊÊÊÊÊËËËËËËËËÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ   !"#$%%%%%&'()*+,-./0123456789:;;;<=;;;;;>;??;;;;@ABCDEFGHIJKLMNOP;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHQHHHHHHHHHHHHHHHHHHHRSSSSSSSSSTUUVWXYZ[\]^_`a bAAAAAAAAAAAAAAAAAAHHcdefgghijklmnopqArstuvAAAAAAwAxyzA{A|AAA}AAA~€AAAAAAAAA‚AAƒƒƒƒƒƒ„A…AAAAAAA††††††††‡AAAAAAAˆˆˆˆ‰AAAAAAAAAŠ‹ŒAAAAAAAAAAAAAAA;ŽA‘A’“”;;•;–AAAAAAAAAAAA—˜AA™š›œAžŸ ¡¢£¤¥?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{.|}~~~€..‚ƒ„…†..‡‡‡‡ˆ‡‰Š‡ˆ‡‹‹Œ..ŽŽŽŽ‘‘‘‘‘‘‘‘’’’’“”’’“’’•–—’’’–’’’˜’™’š›››››œžŸ    ¡¢£¤¥¦§¨©ª«««««¬­­®¯°°°°°±°°²³´µ¶¶·¸¹º»»¼»½¾««¿ÀÁÁÁÂÁÃÄÄÅ.....ÆÆÆÆÇÆÆÈÉÉÉÉÊÊÊËÌÌÌÍÎÏÏÏ....ÐÑÒÓÔÕÖרÙÚ Û ÛÜ Ý ÞÞß àáâãäåæ.çèéêëìí.æ.îïïïïïïïïðñ..........òòóòòóôôôôôôôõŽŽööö÷ø’ùúúúúû....üýüüüüüþüüüüüüüüüüüüüÿ.û    ‘‘‘‘  ì‘ ‘üüüÿüüüü........ !!"ñ###$%%%%&'2()))**+‘,----./..000123455556789:;ú.........88<=‘‘>‘?‘‘@üüüüüüAüüüüüüB..CDEFGHI.JK..LñÙMNOPîQR‘ STUVWXYZ[[..XXXXXXX\]^ _û...`abcccd..efghi...jkllmn..ooooopppqrs.....tuuvwx..yz{|....}}~....€‚ƒ„…††‡‡‡ˆ‰Š‹ŒŽ.........1‘.’’’’“”•–———˜™...šššš›œ..žŸ...              ¡.      ¢£¤¤¤¤¤¤¤¤¤¤¥.....¦....§§§§¨§§©ª§......«.......¬­®¯°±².. ³...í´âµ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈ...GûìäÊîî..æäûæ....ËÌæÍ´..ÎÏðìÐ.Îä½Ñ²ìÒ........ÓÔ...¬...üüüüüÕ..üüüÖüüüüüA......×..      !!!!!!!!!"""""""""""""#$$$$$$$$$$$$$$$$$$$$$$%&&&&&&&&&&&&&&'(((((((()*(((((((((((((((((+(((,-,---.,.,----------.---..------.,.,-.,-,-------------/0/001/1/0000000000100010/101001/1/0//011000000002323333232333333333343334323333333232343333333356566675756666666666766676566666675756665666666666668988:8:889::89:8:88888888:8:88:98888888888:;<;<<<=<=<<<<<<<<<<<=<<<<<;<<;<<<=<=<<;=<<<<<<<<<<<<>?>>>@>@>>>>>>>>>>>@>>>>>?>>>>>>@>@>>?@@>>>>>>>?@ABAAACACAAAAAAAAAAAAAAAAAAAACBAAACACAACBAAAAAAAAAABAAADEDDDDDDDDFDDDDDDDDDDDDEDDDDEDDDFFEDDFFDDDDDFGHHHHHHHHHHHHHHHHHHHHIHHHHHHJKKJKKJLLJLLLJLJJLJLLLLLLJLLLKKLLLLLLLLLLMMMMMMMMMMMMNMMMMMMMMMONMMMMMMMMMMMMMOMMMPQORRRRRRRRSSSSSSSSSSSTTSSSSSUSSVVVVVVVVWWWWWWWWWWWWXWWWWWXXWWXWWWWWXXWWWWWWWWWXWWWWWWWWWXYWWWWWWWXWWWWWZZZZZZZZZZ[\\\\\\\\]]]]]]]]]]]]]]^_____________`_abbbbbbcbbbcdddddddddde ffffffffffgggggghghgiiiiiiiiiiiiiiiiiiiijkjjjjljjjjjjjjjjjjjjjjjjjjjjl\\\mmmmmmmmmmmmmmnmmmmmmnmmmmmmooooooooooooooooopqqqqqqqqqqqqqqqqqqqqqqqqrqssssssssssssssstttttttttttttttuttttttuvttttttttttttwwwwwwwwwwwwwwwwwwwwxyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{|{}}}}}}}}yyyy~~~~ €‚ƒ„       … „  †††††††† ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆ ‰ ŠŠŠŠŠŠŠŠŠŠŠŠ‹Œ‹WWWXWWWXWWWXŽV‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“~”‘•––––––––––––––––––––—•–˜™VVVVVVVVVVVVVVš›VVVVVVVœ–––––––––––žŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ŸŸŸ ¡¡¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¤¤¤¤¤¤¤¤¤¤……¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¦¦¦§§§§§§§§§§¨§§§§§§((((((©©©©©©©©ªªªªªªªªªª«VVVVVV𬬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬­­­­­­­­­­­®­­­­­­­­­­­­­­RRRRRR¯¯¯¯¯¯¯¯¯°±¯¯²²²²²²²²²²²³YWWXYWWXYWWX²²²²²²²²²²²²VVVVVš™VVVVVVVV…´ ––––––––––––VVVVVVVVVVš µµµµµµ¶µµµµµµµµµµµµ·µµµµµµµµµ·µ¶µµµµµµµµµµµµ·  ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¹ºººººººº»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÆÆÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÈÇÇÈÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉËËËËËËËËËËËËËËÌÍÍÍÍÍÍÍÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÓÑÑÑÑÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÓÒÑÑÑÑÑÑÑÑÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕ×××××××××××××××ØØØØØØØØØÙØØØØÚÚÚÚÚÚÚÚÚÚÚÚÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞààààààààààáàààààààââââââââââââãâââââäääääääääääääääääåååååååååååååååæåæååççççççççççççççç褤¤¤éêêêêêêêêêêëêêêêêêêëìí ~        ´´´´´´´´´´´´´´´´´´´´´´´ î      žž##))77)))) BBBRRR___ )) ***+++,,---  ...///88866NNNN>>>CC]]DDDEE)))559997::::$$$$!!!!)!""""##"$%%%SSFFTT;;AAGGGHHIIIUUMMMOOOOVVV0000JJJKKK&&&'''111<<((22334444WWW@@@LLLbbaa====XXPPPYYZZZ[[[^^\\eee```dddff???QQQTcccc"!!    !"#$%&'()*+,-./01234567899999:99999999999999;<=>?999@ABC9DE999999999999999999999999999999999999999999999999999999999FGHIJKLMNOPQRS99999999999999999999999999999999999999TUVWXYZ[\]^_9`abc999999d9efg9h9i9999999jklm999999999n999999999999999999o9p99999999999999999999999q999999999999999999999999999999999999999r999999999stu999999999999999999999999999999999vwx999yz{|}~99999999999999999999999999999999999999999999€999999999999999999999999999999999‚9ƒ„9999999999999999999999999999  !!!"#$%&'()*+,-./01234'562789:;<=>?@ABCD;EFGHIJAKBLD;MNOPQRSTB;UFVWABCD;UFGPXJAYZ[\]Z^_`aSB;;bcd`eKAf;;bFd`egAhf;idjIAkfklmnopqI=rpstrWurvwdxyz{=rX|}t~€‚[[[[[[ƒC ZW„„…†<‡ˆr‰rŠ‹‡‡SŒur‡Ž=Grr‘r{‡’@“42‡”4‹•–—=<‹‹‹‹˜‹™š›‘šœžŸ ¡¢£¤¥Œ¦kl§¨©ª«W¬K­®¥I¥¯]°±±±±±±±±±±±²ª‹ ±±±±±±±³±±±±±±±±±±±‹´•µIu¥k¶‘ ·¸'‘yr¹42t‡>'Œ¥r@=¸ºr»}¼Q'½¾¾¾'¿r‘À‘ÀÁ!ÂÃÄÅ!KÀ‹k‘Æ=ÇÈÉÊËÌ ͱ±±±±±ÎkkkÏÐbÑ‹‹ ˆW ‹‘§‹r‹;Ò‹‹K¬Ó? @A0(?=:B<C:DE A@D(D0:? -0 D A -0> F?GDB(HI::JBD 9IF?:D0=IDK: 5I5LB?MN I ),  O H(,45PQQ  RSTUV WXW%Y%%@ @  @)Z[\]^^_^^_1`2 aa) @ :?IDb (:@ cd!!"!efdgX Whi jklm^no 29 (p,]:q%r(D:DI A  ?@ABC DEFGGGGGGHHHHIJJJJJAKKLMNOPQRSTUVWXYZ [\]^_`abcdefg hihjkhlhimnopqirs^Gtuvwxyz{|}~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€€€‚€~€€ƒH„JJ…†d-‡Fˆ‰Š‹d[ŒŽ[v‘’“”•h–—˜™Kš›            !"#$%&' $()*%%"+,-./  / 0$   " 1 $ " 222233333344444456-)7.)-&89: , .;1);<=65>6?6--+ 1$ @A  ""BC>----222D+6; C EB6FB#GHHHHHHGHHHHHHGHHGHHH3IJ4444"  K.  B+5&----------LM=NO PQQQQQQ             !"#!!$!%!!&'(!)*!!+,-./01234!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!56789:;<=>!!!?@ABC!!!DE!!!!F!!!!!!!!!GH!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!J!!!!KL!!!!!!!!!!!!!!!!MN!OPQR!!!!!!!!!!!!!!!!!!!!!!S!TUV!!!!!!!!!!!!!!!V!!!!!WX!!!!!!!!!!!!!!  !"#$%&'()*+)),-./0))12345677879:;<=>?@ABCDEFGHI>GJKLMNOPQRISTUVSWXYZ[\]^_`7abc7defghij7)klmnop))))))))))q)rst)u)vwx))y^))))))))))z{))|}~€)‚ƒ„))…)†)‡ˆ‰Š‹)Œ7Ž)‘’77“”•–—)˜)™š›77œžŸ ¡¢£¡¤¥¦§¨©ª«7¬­®¯°±77777777777²³77777777777´µ77¶·77¸¹7777º7»¼½¾¿ÀÁ)ÂÃÄÄÅÆ777777ÇÈ^)É^)pÊË))ÌÍ7Î)))))‡77))))))Ï7))))Ï7ÎÐÑÒÓÔ))ÕÖרÙÚ7ÛÜÝ)Þßàá2âãˆ:äå7)æçè)éêëìí7777)î)))))ïðñ)))ò))ó7ôõö))÷ø))ùÎ)ú)ûüýþÿ)))   7)))Í77)y777 7777ˆ) 7Î7)7)ƒ77‡77777‡ó77)77ˆ7777)‡‡7777))77777–O–– !7–ä"77777)#ƒ7)))Ì7777)))$7777)Ì777777)%777777))&'(777)7777777777*+,7777-77777./0123456789:./;1<=>5?@ABCD½EFGHIJKLMN77))))))Ã7)y))))))7777777OPPP7777Q     !" #"$!%&$'($$)*+,,,,,,,,,,,,-.'/0 1 2!"3 4,5 6789,,,,,,,,,,:;:$$$$$$<$=>?,,@A$$$$$$$$$$B,,,,,CDE$$$$$$$$F,G,HIJKLMNO$$$$$$$,,,,,,@P$$$$$Q,,RK$$$$$$$B,,)S$$$$$QT,,UUV$$$$$$UW$$X,,,,,,@,$$$$$$$$$$$$$QY,,,,U,$$QZP$P$9P$LL$$$$$W$+()Y,[[\]^Q_)9P<`L$$$$$W$Wa)I@][VbP+_Jc9P$^^$$$$$W$WP)Y,::VXQ_,[[Vd^Q_6eP<(W)aW`X<($$)d@dIVX]_9P$WW$$$$$W$$P)f,IIV;)dP$WW$$$$$W$$P)Y,IIV;gQ_a$$$$$$?@ABCDEFGHIJKLMNOO     !"#$%&'()*+,-./01&/234567891:8;<:=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdMefghijklmnopdqrsturvwxyz{|}~h€jQ‚ƒ„„…†‡ˆR‰Š‹DdrŒŽY‘’“”•^1–c—M˜…ƒ™šj›œž“Ÿ i¡¢£¤¥¦r§¨©Mªj«¬­®DZM¯j“r°r±²dd¢³´^Mdd—~µ‘ ~—¶d‹·‹ ¸j¦¹º»¼½¾¿ÀÁÂRºº€€ÃÃĽůÇÈɃZrþÿÿ ÿÿÿÿÿÿÿÃÿP ß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿ¿¶ÿÿÿÿÿÿÿþÀÿÿÿÿïþáœÿÿàÿÿÿÿüÿÿÿ0ÿÿÿüÿÿÿÿýðÿÿÿÿïÿßáÿþþîŸùÿÿýÅãŸY€°î‡ùÿÿýmÇ^?î¿ûÿÿýí㿟À°ìÇ=ÖÇÿÃÇîßýÿÿýïãß`ìßýÿß`@ÿÿÿçß]€üìÿüÿÿû/€_ÿ ÿÿÿ –%ðþ®ìÿ;_ ðÿþÿÿÿþÿÿÿþÿÿÿÿÿùçÁÿÿ@0¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿ‡ÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿÏÿÿ€ÿÿÿÿÿÿÿÿ?ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿþÿ€ÿÿïÿïÿóü¿ÿàüÿÿÿ?Þoÿÿ????ÿªÿÿß_ÜÏÿÜ€ÿ„ü/>P½ÿóàCÿÀÿÿÿÿx ÿ€ÿÿ€àþ>ÿÿààÿÿÿÿ?þÿÿÿÿÿ ÿðÿÿÿ€€ÿüÿÿÿÿyÿÿ»÷ÿÿüÿÿÿÿ÷ÿÿ?ÿÿ8ÿÿ<~~~ÿÿøÿÿÿ?ÿÿÿÿÿøàÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþ?ÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷–þ÷ „ê–ª–÷÷^ÿûÿîûÿ        !"#$"%&'()*+,-./0123456789:;<=>?@ABCDEFGH=>I@J673?@AB%&6CDþÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®¤ªJUUÒUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿ„8'>P=À Àÿÿê%À(UUUUTUTUUUjU(Uÿÿÿÿðÿÿ?ÿÿÿÐdÞ?ÿÿÿ°çß{_üðÿÿ?ðÿÿ?üÿÿðÿÿÿ       !"#$%&'()*+,-./01234567//$$889þÿÿ ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿïÿÿÿÿ Ï<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿ¿ ÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ€ÿ„ü/>P½òàCÀÿÿÿÿÿÿÿÿx ÿ?ÿÿÿüÿÿÿÿxÿøÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷    !"#$%&'()*+,-./0123  !"#$!%&$!'# ()#*+,-#(.#"#/0123456789:;<=!>??@@ABCDEFGHIJKL*MNOPQRSTUVWXYZ[\]^_`abcdefghiRjklmNn4opqrstudvwxyz{|N}~l,€‚ƒ „~N…†N‡ˆ‰Š‹Œ Ž€@@¡ÿÿÿÿÿÿÿÿ0°øþÿÿÿÿ¿¶ÿøÿÿÀ¿ÿ=€ÿÀÿø?Àÿÿ?ðÿÿþ!þ  †9#¾! @ ÀÁ=`@0\òÀò@? þßàÿþÿÿÿ@àýfÃd à °?@þ x‡€ @åøŸ€Ðø< @£ðÏ?÷ÿý!ðÿÿÿøð ààà`ø|ßÿ€ÿÿÿ0€€€€ <>~p €÷¿€D`ÿÿÀ?€ÿÈ~fÁ 0X !üÿÿÿ$ nð‡ÿx&€ïÀ(¿€ÿÿ€øÿç<ÿÿ        !"#$%&'()*+,-þÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿÿ@ Àÿÿê%À(UUUUTUTUUUjU(Uÿ       !"#$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢`[Uµªª-ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿÿßPÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ       !"#!$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢ÐVUµªª+ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿß@ÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ        !"#$%&'()*+,-./01þÿÿ ÿÿÿUUUUUUUªªVUUUUU«ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzU E@×þÿû€cUUU³æÿÿÿÿÿÿTUU«*UUUþÿÿÿ€¿ UULÿ?ÿÿ?ªÿÿÿœœœ@ Àÿÿê%À(UUUUTUTUUUjU(Uøÿ      !"#$%&'()*+,-./01þÿÿ ÿÿÿÿÿÿÿÿÿÿþÿßÿ÷ÿóÿ³ðÿÿÿýÿüÿÿß i‹&  Ï8@×ÿÿûÿÿÿÿÿãÿÿÿ·ïüÿÿÿþÿÿÿþÿÿÿÿ¿ "ÿÿÿOÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ@ @ÀÿÿÿÿÿÿÿÿÿÿmÀx ÿ?ÿÿÿüÿüÿÿÿþÿ8ÿøÿÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMM     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžkŸ ¡^¢y£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ –%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿøÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOP    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨•©Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß<À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿþàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_Ûÿÿÿøÿÿÿüÿÿàßÿüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNN     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžk kŸ ¡^¢ky£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß8@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ–%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿàÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿŠªÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQ    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨N©•Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß8À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿæàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_ÛÿÿÿøÿðÿÿÿÿÿüÿàŠªüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ      €€0xø|ÿÿÿøÿÿÿÿ    !"#$%&'()*+  !"#$%&'()$*+,-./0123456789::;;<=>?@ABCDE#FGHIJKLM NOPQRSPTUVWXYZ[\]^_`$a&bcdeaFfgFhijklmnÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿøÀûï>ðÿÿþ!þ P €†9#¾!Ð À@ €ÀÁ=`D0`„\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8‡€ @åøŸÐ< @£ðÏ÷ÿý!ð0ÿÿ€€ü€÷?D`ÿÿÀ?€ÿÈ~fÁ0@ ! nð‡ÿx€ïÀ(¿€ Ãøç<             !"#$%&'()*+,-./012222222223456789:;<222=>?@A2B2CD2222E2FG222H222I2222JK2222222LMNOPQRS222222T2UVWXYZ[\]^_2222222_22222  !"#$%&'()*+,!-./0123456789:;8<=>?@AB CDEFGHIJKLMNOPQRSTUVWXYZ[\Z]^_`abcdefghZijklmnopdqrstuvwxyz{|}~€‚ƒ„…†Y‡ˆ‰ Š‹ŒSŽ‘ˆh’‡ “”•‹Y–h—˜™š›fœžŸ f¡¢£¤Z¥¦§¨©ª«¬­®–¯°[±²³´µ¶·¸¹µº»Z ¼½¾¿ÀYÁÂõZZ]–ÄÅÆÇÈÉÊËÌ͈ÎÏÐÑÒÓfÔvÕÖרÙvÚ×ÛÆÜÝÜÞßàáhâãäåæŽ`€çèéêëìíîéïðñòóôlˆõöƒ‹lY÷øYùúZˆû]Óü–·ýþÿˆŽ\ÿÿÿÿÿÿÿÿßÿÿÿ|ð×ÿÿûÿÿÿüÿÿÿþÿÿÿþþÿÿÿÿ†@IÿÿÿÀÿÈÿÿÿþÿÿÿ?@`Âÿÿÿ?ýÿÿÿàÿÿ?ÿðÿÿ?ÿÿÿÿAýøÿÿÿÿÿÿëÞÿóÿÿþìŸùÿÿýÅ£Y°Ãÿÿè‡ùÿÿýmÃ^Àÿè¿ûÿÿýíãÃÿÿýí#°ÃÿÿèÇ=ÖÇÿƒÆÀÿÿîßýÿÿýï#Ãÿÿìßýÿÿýïc› @Ãÿÿÿÿ§Á]Ãÿ?þìÿüÿÿû/ÿÿ €€ÿ–%ðþ®ì _ÿóÿÿÿüÿÿ_ýÿþÿÿÿ€ À¿ßÿÿ™ÿÿÿ<þÿáÿ›ßÿß¿ ÿÿÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿcÿÿÿßÿÿOÀ¿ðÿÿÿÿÿÿÿÿÿÿÿÿ?xûñÿÿÿÿ?ÿÿÿÿÿÇÿÿÆÿÿ¿àÿ?ðÿÿÿÿÿ/èûÿÿÿðüÿÿÿÃôÿÿ¿\ ðÿ0øÿãÿÿÿÞoÿÿ????ÿªÿÿÿ?ÿÿßÿßÿÏïÿÿÜÿÿÿÿ€ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ€ÿÿÿÿÿÿÿÿûÿÿÿøàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿ»÷ÿÿŸÿÀÿü?Àÿÿ €ÿÿ7ìÿ¿ÿÃÿ÷/ÿóÿÿb>øÿÏ?~~~ßÿøÿÿÿ?ÿÿø ÿÿ_Ûÿÿÿøÿÿÿÿÿüÿÿÿ?ÿÿÿ÷ÿßÿüüü0ÿïÿÿÿÿ·ÿ?ÿ?‡ÿÿÿÿÿÿÿÿÿÿÿ¿ÿ?ÿ?ýÿÿÿÿ¿‘ÿÿ¿ÿÿÿÿÿÿÿƒÿÿÿÀïþÿÿÿÿ?þÿÿ?ÿÿÿÿÿýÿÿÿ€?üÿÿÿ‡ÙÿÿÿÿÀÿÿÿ?€ÿ×@ÿÿÿÿÿÿøÿþÿÿ_<ðÿÿÿÃÿÿ#ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿÿÏÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿþþÿþÿÀÿÿÿÿÿÿ¿ÿßÿÿÿøáÿ?      €@@> ÿƒ€À|À0      @@?€    @€ „ÿðà„            !"#$%&'()*+,-.    !"#$%&"'(")*+,-.PŒ@€ˆÿÿ0 á þ`8p<ìøÀ0€@àøÀÀ€à€÷€ü€?`     !""#"$%&"'()""""""""""*+,##--../"&01234@'3@``ÿbø„ü/>³ûñààó¶>Ãðÿ?ë/0°ÀðÁŒ”``Àÿøÿÿ0 PÿÿÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿÿÿ÷ÿÿÿÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿ~~ÿ~~ÿ~~     !  !"!#$%&'()*+,-. /012345678+9:9;*<=>?@>ABCDEFG5HIJ5@5KL#M ÿ¿¶ÿøÿþÀž!ÿÿÀÿÀøïðÿÌÿßà ÀŸ€‡#¿ŸÀÇ€ß`߀€_ÿ ò òþÿàÿþÿÿÿøyÀÃ…|0€Àÿÿÿÿ€àþÿàÿþ3€ÿðÿ?ÿÿÿÿÿðøðÿÀ€ÿþ0Aø ø@nðÿ?ÿøÿø?ÿÿÿ   Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?      !"#$%&'(  !"#$%&'()*+,-./0123456789:&;<==>?@ABCDEFG)HIJK@ÿÿÿÿÿÿÿÿà00øþÿûÿÿ¿ø‡€aÿÀÿø?ðÿÿ  €_ ÂÜ@€€¿ þ àŸø À?ÿ!ðÿÿðÿà ààà`€€ü€°€ÿÿÿx@0À€ÿÿ€ãøç<     €@€@ >`p €  ÿ ðÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿ0ÿÿÀÿÿÿÿÿÀ@€`€€0ÀÀ Àó ÿÿÿûÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀ€šÿÿÿÿÿÿÿÿÿÿÿ? €€0 ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿ    € @@  À À À À`@€€þ         !"#$%   !"@€P€0 „@`ÌÀ0€ÀˆÀ€àÄ€`8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ> À   þÿüxþZCˆ€ÿÿÿÿþÿïÿÿÿÿÿÿ?ðÿÿÿÿÀ`                    !"#$%&'()*+,-./0123456784449:44444;<=>?@4ABCDEFGHIJKLMNOPQRSTUVWWWXYZ[\]^_``a`b`c`````d```efghijklmnopq````````````Wr``stuvwxyz{|}~€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€    !"#$% &'()*+,- ./01 2 34 156 372 86 39 1:2 ;4<1 = > ? @AB1C 3D 1 4 1 EF GH IJ K L MNOP< QR STUVW Q X  YZ [ [ 1 1 \]^ X_ ` abc d e fghi j= kil m nl op qrs to uvwwxyz{|}~€ T‚ƒ„…† ‡ˆ‰ Š‹Œ Ž ‘’“X ”• – — ˜‹‰ —™š› œ ‹ x  ž ’Ÿ   d ¡  Œ w –¢ – l£ ¤ ¥ ¦§ ¨ s l © ªl - « ¬­® ¯2 D< ° ±²³´Xtµ¶·¸‰ ¹º» — W¼½¾¿ÀÁ2 Ât‰ l à - ÄÅ l Æ ÇÈ –- ÉÊË Ì Í Œ Î ¡ ‡ ÏÐÐÐÑ—‹ÒÓ’’ Ô … Õ“‹Ö Ò×ØÙ‹Ú Û ‰ ‹ Ü             ! """"""#$%&'((((((()##*+,((((-./012(3((((-""456""7 8"""('9 :;<;=< > = ;<; =?  @ @A= ;>E @ F  : >G =9 9=B;   HI<9E <<; ; <; :@ = =  J >; B :< = KL = 9; : <   A :9G<;A E9;  >B :H > 9E;= ; 9 M   NNOP QRST U VWXYZFZFSSSSF   M[\   [ ]   F F    F    ^ >   _ F F `a :: @ b > >; <9@@  ;EA;> =;= c""d"(((e(((fgh ijFk (((lmn Fop[ """q!"""r4""s #######t 9@ <; >9 =B  uv9< >wx [ yz((( F F{  F     |                                                   !"#$%&'(  !"#$%&''()*+,-./0123456789:;<=>?@A.BCDEFGHIJKLMNAOPQFRSTUV   !"#$%&''()*+$,--.&/0012+34#5678977:;<=>?@ABCDEFGHIJKL0M;NOPQM0R6M STSJ5 UVL9WX5YZ[9N\]91^_`a11;1b@^JMcd9&N;e5Lfg^h5^Mijklmbn0&1&9222223----3+-----))----))-------222262---222--222----23--2455455422-2222-222.-22--2.12 2- 22--2-22-22222-22-2-22--2--2-2-2222222222---2---22222-22 !""####$$%%%%----+&'('''''2222--21.2--2-225*-)2224-2-2222-2,13.//-222-2-22-++0+++++---   !"###########################################$#%&'()*+,-./01234##5   !! "#$%&'()*+!,-./012345675899:;<=!>?<=!@ABCDEFGHIJKLIIMNOOPQRSTUVWXYZ[\]^_`abcdeffghijklmnoppqrstufffvttwxyz{|}9fffffffffffff~€‚ƒ„…‚ƒ„†‡ffffˆ‰fˆffŠ‹tŒttttttŒŽŽŽŽŽfŽŽŽŽŽŽf‘’“Q”•QN–—˜™š›œœœžŸ ¡¢££££££¤¥¥¦§§§¨©ª£«¬­®¯°±²¥³´µ¶·¸¹º»¼½¾¿ÀÀÁÂÃÄÄÄÄÄÅÆÆÆÆÇÈÉÊËÌÍÍÎÏÐÐÐÐÐÑÐÐÐÒÓÔÕÐÐÐÖ×ÐØÙÚÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÜÐÐÐÕÐÝÞßàáâãäåäæf玎èéꎎëìíQ                !     "#$   %    & $$ ''()*+,-   .. /  01234567***+***8#9":;;<=>?@ABBCD;E=>FFFFG   $H# % $  !IIIIIJIIIIK#L,M$$$$$$. ! N% O"IPIIIIIIKQQQQQQQRQQQS7$  $! .;;T $ UVVVVVVVVUUUWUVVXYZ[\UWVUUU]W^^^^^________`aaaaaaaaabcccccd^^e______faccghaijkilih`_i`mnaojpi_jq_`j^^^rsstsssssuvwxxxxwxyz{{|[}~Z}~[}~}~[€‚‚‚‚‚‚‚ƒ„„„„„„„„„„…†„†„†„†‡‚ˆ„… ;;;;;‰;;;;;‰Š‹=‰;;B=;=;;;BŒ=;‰;‰;;BŒ;Ž;‰;;;;>;;;;;Ž‹=;Œ;Š‘=‹‹Œ;Œ;=;;B;;;;==B;’K“”QQ”#•                        !"#      !"#"$%&'()*+,-./01,23!456789:;<=>>?@A&BCDEFGHIJKLMNOLKPGKQKRSRGTUVWXXXXXYZZZZ[\]^A_`a"`bPc_Oa                                  !"""""""#$$$$$$$$$$%&$&$&$&'"($%    !"#-+-) ##!!'' 777 +--++- ###!!'  &  8 )++++++++7/7+--..)#! ,2**01$  "%( 345 # # # 77-++66 ## ' --+9  !"#$%&'()*+,-   !"#$%&'()*+,-.+/-0,1/-2+,3.4+56789+3:+.+;<=>?@ABCDEF4GHIJKGLL++MNOPQRSTUVWXYZ[5\Z]^_]`abcde`fgh]ijk]l9md]no]'pqrst,u4vwexyz,{e]|'}~]€'‚ƒ„iL,  !"#  $$% &'%$! ()*+  %   ++ % %++%, - % +% +./.0 ++,  %+-%  1% %%++2%%   % + %        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOYZ[\]^_`abcdefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefglmmmmmmmmmmmmmmmmHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHOOOOnopqrstuvwxyHz{|}HHHHHH~H€H‚HƒHHH„HHH…†‡ˆHHHHHHHHH‰HHHHHHHHHHHHHHHHHHŠH‹HHHHHHHHHHHHHHHHHHHHHHHŒŽHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH‘’“HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH”•–—H˜H™š›œHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHžŸHH ¡¢£¤H¥¦§¨©ª«¬­HHHHHHHHHHHHHHHHHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO®¯H°±HHHHHHHHHHHHHHHHHHHHHHHHHHHH      !"#$%&'()*% +,-./0000100023456789:;<=>?@A:;BCDEFG;HIJ?K9:;HLM?NOPQRSETUV;WXY?Z[V;\X]?^[V_`a?bcdefg0hijjklm00nopqrs00tu%v8wxyz{|}00jjjj~jjjj€‚‚‚‚ƒ„„„„„…†…‡ˆ‰ˆŠ‹wŒŽŽJ‘’“”‘•jjjjj–—Œ˜—™šw››œjžjjŸj ¡¢jjj£j¤——00000¥¦§¨©ª«¬%)­¦®¯%°0000±²³´µ¶¶·¸¹¹º»¼½¾¿ÀÁÂÃÄwÅÆÇÈÉÊËÌÍÎÏÎÐÑÒÓÔÕÖרÙÚÛÜÝÞß0à0áááááááááâááááÍááãáäåæçèéêëìíîïðñòóôõö÷øùáúûüýþÿw0000000000..€ß  0000       Þ              0             Þ                         !   "°#$0%&'.(à0000Z)*+,-¦.—/%01234456007´89jŸjjjj:; <=>000000000?—@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDBCBE‚F„„GHHHHHHHHßIJKLMNO0P00QR´STUV¹WXY Z [\]^._`abc‰d¸¸00àefàg000hwJ00.(à000ijk00¸—00000lmn00op0000q0000rstuvwxy000000000.«z{P|0«}~y—«1€000«4—00 ‚—000.0ƒ€„…†.00000y0000‡3ˆ«000000‰0000000šŠ‹Œ¸00000ßM¹‘Ž‘’“”Vw•–––—˜™š›œgžg000M        ÞŸ00 á¡ááá¢áá 0000£¤¥  ¦‰00  §¨   ! Þ ©ª0 §   «     ¬­   ®¯°±²( ³00000000´    µ000     000(       ¶00  !"""#$%$$&&'$$$$'&'()$*+,-.$$$$/////////////0$$/1&$$$$$&23 456 78-9--- '5'-$$$$$$$:&$$$&$&$$$$$$$$&&$$$5-; '+'&'&'&&&$$-5+5+&$$$+$$'$ 32 $$+'&$'&'&$55$+5+$+$$$'&&$$$ $$$$$+''&'$-++$&$$$$$$$ $$$$$$$5+5+$$$$$$'$-'&$&$'&&$'&$&$$$5$5$&$$+$$$$ &$$+'&&'$'55$$$+5$$$$$$$$'&'$-$$+5$$$&'&$$$$$$&'55&$$$+$$$$$<$'&$''$&$5$+55$&$$$$$=>>>>>>>>>>>>>>>>>>>>?$*>>>>>>>@ ;$$=??=??=$$$>>=>>>=>==$>=>>>>>>=>$>>??>>>$ $>> AABCD66E9,FF&$++5;-&AGHI$$ ; >>>'$$'$JJJJJJJJKKKKKKKKKKKKLLLLLLLLLLLL&$&&$&$&&$&&+$$$&$$$$$MN$;&5$$$$$)$$$$$$$$$$&$$$$$$>>;OMP>$ $$$6;6I&$$$$$$$$$&$6 >>>>>>>$>>?$$$$$>>>>>>$$>>>>>$$$ ?$>$>>>>>>>?>>>>>>?+--$$ ;;M&$-$$$$$Q;; $';---&$$$$5$$$$$$$$$$$$''''$&$'$& &;;;R;SR;TUVUVWXY!3333Z[\][M;;;^&$_N5$$$$$$$22`$$$abaa$$$$$$&$$$$&$$aaacaaadaeddaaaaaefdafeaefaefaafaefagacaaaU6FFFFFFFbFFFFFhhhhhhhhhhbFFF$$$$$i;Mj$$$')$$$$$$+&&UUUUUUU;;;;kUUFFFF;;9;Ml$$aaaaaaaaaaaaagaaaaa$$$$$aaaaaa$$mnaFFFFFaFFFFopaaaaaaaqaanrasttttaaaataaaaaaatttaaauaatv+w[rxttttaaaaatuanyr$$gaaaaaaaaaaaa$gaaaaaaaaaaaaaazaaaaaz$${{{{{{{{aaaaaanaaaaaaaaaaaz$aaaz$$$$j $$-$$$+;;$$$$$$$$$$--$$|$$$A6$$$$5$$$$;$$;$$$$$'JJJJJJ}$-;' $$$ $;>?$$$$$$$$$$$=>>;5$$$$'&'&'&$$$$$~~~~$$$$$$KKK€$LLLLLLLL$$‚‚‚‚‚‚‚‚$'$$ƒ„////1//////0//00/ƒ0/////$$$$$$$$'F$|$…†:‡ˆ$$$aa‰hhhhhhhm‰maaamN[6‰hhmaaazŠ‹$$&ŒiaaFammaaaaa[aaaaaa‰Žaaaaaa‰Ž‰pF]{{{{[$$$$&$aŠ‘&$$$$+’$'&';)$'$'$$$Q$$M$$$$$$&'&$&'Q$Q$$'$$$+5$$''$$5$+;;;;&$$$$Q;;;$&$$&$$$M$ -;;$$$$$$$5 ;;$$$$$$-M)$$$$$$$&$$$$$$“FpbFFp$$$$$$$+a$$$$$$$--$$$$$$&'&'&''''&'&&'&&&$$ '&&''&''$$$&$'''''&&''''''&&'&&'&&''''gaaaaaaz”$$&$$$$$•••••••••••••az$$$$$$aaaaz$$$z$$$$$$$aaagaaaaaacdaadaaazaaz$$zaaaaaaadddaaaaccdaaaaaaaaaagaz$daaaaaaacdaaaaaa$aaaa$$$$$$$$$gaaz$gaaaaa+$$$$$$$ $     $         %%%%        !!         & && &&& && "### !%%     && ''           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNK    !"#$%&'()$*+,-./01234567,85,69*:;<8=>?7@ABC#DEFGHIJGGKLMNOPQRS:+T:#UVW*<0$      !"#$% &%%#'(#)*+,$$+-./+0'**(1-+(--'*-+ ''2$  *(3 45 678 9('++(#*           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUUVWXYZ[\]^_`abcdefghi>jklm       !"#$%"#$%&'("#$)*"#$)*"#$)*+,-./012"#31245607"#89:;<=>?@ABCDEFGHIJKLMNOPCQRSTUVWXYPZ[\K]^__`abcDKdeQfg01hijklKgmno 9:pqrstuvwxyz{|}~€‚zƒ„g…†‡ˆ‰Š‹Œ"Ž"Ž"#‘’“”•012–—˜   1™#š›œ žŸž ¡¢£¤¥¦§¨©ª"#‘« ¬ ¬ ­1®F¯bC[°XXeIIPk±²!#%' !#%' .  (U^(U^ %' "$&%'(2?@ABCDEFGHIJKLMNOP##g's(^Ust%!(^2<F'2(%#'U^!!#%'  (!!(TUVWXYZ[\]^_`abcdefghijklmno PYbk(PUY^b(PUY^gk((((((Ãÿÿ?ÿÿÿ?y;xpüÿøÿÿùÿÿ?Â7:ð3üÿßSz0p€0¼þÿÿÿÿÏ¿ÿÿÿÿP|pˆ/<60ÿÿó~0P(¨  €       !"#$%%&&'()*+,-./0123456789:;<=>?@ABCDEFGHI,JE              !  "#$%%$ &' ( )* +,-. &/,(012  # 3 4( 5678! +,#9 : ' (%;                !"#$ %&'($ )&*($+,"-./0123456789:;<=>?@ABCDEFGHIJKLMNMNOLPQRSTU?VWXYZ[\]^_`abNcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽN‘’“”•–—˜™š›œ     !! ""#$% &'()*##+&& ,++-.& -/*,++012.$*34# *5"678$  9":;6< ) =>?@ABBCBBBBBBBBDEFGHIJ KLMNOPQRST6UVWXYXZ[#=\]^_`abcdeffghijcklEXmcnoOkpqrstuvwxyz{|}jc~ !€l‚ƒ„…†‡uˆY‚f‰klŠ‹ŒXŽYuQccc‘ ’T“ul”J•–c—˜Q-™ š›5œœXlžYœl?uŸ                                                      !"#$%&'()*+,-./0123456789:;<=>?@AA BBCDEFGHHHIJKKKLMMMMNOPQRSTUVWTUTUVWXYTUZ[TUTUTU\]^_`abc^defghiijjklmmmnnnoHHHHHIKKKKKLpqrs%tuvvvvwxRDDyz%{| }}}}}~~~~~      !"###$$%&'()'()'()*'()+,-./01123456789::;<:=>?@ABACDEFGGGHIIJKL!!!MNNNOPPQRSTUVWXYZ[\]^^^_`abcdefghijklmmnopqrstuvwxy---zzzzzzzz{{{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€‚ƒ„…†nnnnnnnnssssssssnnnnnnssssssnnnnssss‡‡ˆˆˆˆ‰‰ŠŠ‹‹ŒŒnnssŽŽ‘‘‘‘nn’ss““nn”vss••y––——˜™š›œžžžžžžžžŸŸŸŸŸŸŸŸŸŸ          ¡¢£¤¥¦§¨©ªª««««««««««««««««¬­®¯¯¯¯¯¯¯¯°°°°°°°°       !"#$%%&'()***+,,,,-./01211231111456789:;<<=>???*****+@ABCD /EFGHHHHH    !""#$%&'()*+,--------.//////////////////////0000000000000000123333333333333333333344567777533883399,::;;5<=>?@@@@@@@@AAAAAAAAAABCDEFGHIIJKLMMMMMMMM ‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0`ÆÿÿÿAâÿÿøÿÿÿ¶ÿÿÿ÷ÿÿÿûãÿÿªÿÿÿœÿÿÿÿÿÿ€ÿÿÿ‚ÿÿÿ£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿ(         !"#$%&'())*+,-.///0122223456787789:7;<=>?@ABCDEFGHIJKLMNNOPQQQ/////0RSTUV$W++XYZ[\]]]]]      !"#$$$%&&'()*+,-./01233333333455555555555555555555556777777777777777789:;<=>??????????????@ABC????DDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJKLMN??OOPQRSTUVWWWWXYZ[\??]]^_`ab??cc2defghiijjklmnoppppppppqqqqqqqqqqrstuvwxyyz{|}~€‚ƒ„…†‡ˆ‰‰‰‰‰‰‰‰Ô°aaMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| ˆ düÿ‹A…B x Å A @ÌüÿCA…B u Å D zR| ˆÔüÿ 0ÐüÿDÌüÿ XÄüÿ lÀüÿ€Àüÿ ”¸üÿ ¨°üÿ¼¬üÿ Фüÿä”üÿøüÿ €üÿ. œüÿ4˜üÿ#H¨üÿJ(\àüÿÇA†A ƒC S  AÃAÆB ˆ|üÿ!,œŒüÿŠA†A ƒC0I  AÃAÆD ,Ìèüÿ‚A†A ƒC0D  AÃAÆA Dü<üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇDDxüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ,Œ´üÿ‚A†A ƒC0D  AÃAÆA ,¼üÿŠA†A ƒC0I  AÃAÆD ìdüÿ+|üÿ'üÿ( üÿr|<lüÿÍA…A ‡A†AƒC@i AÃA ÆAÇAÅD h AÃAÆ AÇAÅD l AÃAÆ AÇAÅD lAÃAÆ AÇAÅ|¼¼üÿÎA…A ‡A†AƒC@i AÃA ÆAÇAÅD i AÃAÆ AÇAÅC m AÃAÆ AÇAÅC mAÃAÆ AÇAÅ< üÿ 8Püÿ[A…A ‡A†AƒCOAÃA ÆAÇAÅ<Œ$üÿïA‡A †Aƒ}  ÃAÆAÇB hà AÆAÇ,ÌÔüÿBA†A ƒj ÃAÆC PÃAÆüèüÿ àüÿ$Ôüÿ8ÈüÿL¼üÿ`°üÿt¤üÿˆ˜üÿœŒüÿ€°€üÿTA…A ‡A†AƒC0Z AÃA ÆAÇAÅC o AÃAÆ AÇAÅA à AÃAÆ AÇAÅD g AÃAÆ AÇAÅA 4Püÿ7AƒCqAà ThüÿVAƒs ÃD ]ÃxœüÿŒüÿfC0Y D E¬ØüÿPÀÜüÿ5A…A ‡A†AƒCp¸ AÃA ÆAÇAÅA lAÃAÆ AÇAÅ4Àüÿ\A†A ƒC0w  AÃAÆB Y AÃAÆ4Läüÿ„A‡A †AƒC c A ÃAÆAÇD („0üÿ4AƒC Y AÃB RAð8üÿ4Ä8üÿJA‡A †AƒC s A ÃAÆAÇD (üLüÿ/AƒC b AÃA EAÃ4(Püÿ!AƒC e AÃB z AÃA p AÃC ,`<üÿŠA†A ƒC0I  AÃAÆD ,˜üÿ‚A†A ƒC0D  AÃAÆA DÀìüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ (üÿ8 Lüÿ0 @üÿ‹C ] D V B lP ¬üÿ…A…A ‡A†AƒC`R AÃA ÆAÇAÅA c AÃAÆ AÇAÅC × AÃAÆ AÇAÅA À Ä"üÿÔ À"üÿdè À"üÿÁA…A ‡A†AƒC@ AÃA ÆAÇAÅD K AÃAÆ AÇAÅA PAÃAÆ AÇAÅPP #üÿ‰A…A ‡A†AƒC@f AÃA ÆAÇAÅC PAÃAÆ AÇAÅ(¤ T#üÿHA†A ƒC0{  AÃAÆB 8Ð p#üÿÕA†A ƒC v  AÃAÆC 8  AÃAÆB h %üÿA…A ‡A†AƒC0™ AÃAÆ AÇAÅD | AÃA ÆAÇAÅD S AÃAÆ AÇAÅA hx ´%üÿõA…A ‡A†AƒC0… AÃAÆ AÇAÅD u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA hä @&üÿíA…A ‡A†AƒC0€ AÃAÆ AÇAÅA u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA <P Ä&üÿLA…A ‡A†AƒC@u AÃA ÆAÇAÅA < Ð&üÿOA…A ‡A†AƒC@{ AÃA ÆAÇAÅA Ð à&üÿAƒCYAÃð à&üÿC Z( è&üÿ A†A ƒC W AÃAÆ44 Ü&üÿAƒC0g AÃD W AÃD W AÃD <l ¸'üÿA…A ‡A†AƒC@ç AÃA ÆAÇAÅA h¬ Œ(üÿA…A ‡A†AƒC0¡ AÃAÆ AÇAÅD B AÃA ÆAÇAÅB S AÃAÆ AÇAÅA l@)üÿžA‡A †AƒC _ A ÃAÆAÇD | Aà AÆAÇA { Aà AÆAÇB N Aà AÆAÇC Hˆp*üÿ>A†A ƒC0Y  AÃAÆD c  AÃAÆC N  AÃAÆD Ôd+üÿ èd+üÿAƒC e AÃB < Ð+üÿA…A ‡A†AƒC@Ë AÃA ÆAÇAÅB L”-üÿ4AƒC mAÃl¨-üÿ4AƒC mAÃDŒ¼-üÿ‡A‡A †AƒC0O A ÃAÆAÇD E Aà AÆAÇD DÔü-üÿšA‡A †AƒC0s A ÃAÆAÇD N Aà AÆAÇC PP/üÿeA…A ‡A†AƒCPs AÃA ÆAÇAÅB N AÃAÆ AÇAÅB <pd1üÿAA…A ‡A†AƒC0ö AÃA ÆAÇAÅC 8°h2üÿaA†A ƒC Q  AÃAÆD d  AÃAÆB 8ì2üÿ]A†A ƒC R  AÃAÆC a  AÃAÆA ((´2üÿqA†A ƒC Q  AÃAÆD (Tü2üÿqA†A ƒC R  AÃAÆC 4€D3üÿTA†A ƒC0B  AÃAÆC E AÃAÆ8¸`3üÿAA…A ‡A†AƒC uAÃA ÆAÇAÅ\ôh3üÿ³AƒC P AÃC w AÃD Q AÃB Z AÃE F AÃE F AÃE F AÃE 8T¼3üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇ8´3üÿ8A‡A †AƒS  ÃAÆAÇD Yà AÆAÇ8̰3üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇP¨3üÿvA…A ‡A†AƒC@d AÃA ÆAÇAÅA } AÃAÆ AÇAÅC T\Ì4üÿA…A ‡A†AƒCPQ AÃA ÆAÇAÅD q AÃAÆ AÇAÅC |´Œ5üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|46üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ4´„6üÿIAƒN ÃA P ÃH D ÃH D ÃH DÃ|ì˜6üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|l7üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ<ì7üÿÿA…A ‡A†AƒC@n AÃA ÆAÇAÅC h,P:üÿ A…A ‡A†AƒCpv AÃA ÆAÇAÅC e AÃAÆ AÇAÅA n AÃAÆ AÇAÅA X˜èCüÿÔA‡A †Aƒ[  ÃAÆAÇD p à AÆAÇB y à AÆAÇA }à AÆAÇXô`DüÿåA‡A †Aƒ_  ÃAÆAÇD u à AÆAÇA ~ à AÆAÇD ~à AÆAÇdPìDüÿóA‡A †AƒAm A ÃAÆAÇD w Aà AÆAÇB x Aà AÆAÇA Aà AÆAÇ€¸xEüÿXA…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB O AÃAÆ AÇAÅA R AÃAÆ AÇAÅB €<LFüÿ`A…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB S AÃAÆ AÇAÅA V AÃAÆ AÇAÅB hÀ(GüÿüA‡A †AƒAm A ÃAÆAÇD | Aà AÆAÇA y Aà AÆAÇD @Aà AÆAÇ|,¸GüÿõA…A ‡A†AƒC@{ AÃA ÆAÇAÅB p AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|¬0HüÿöA…A ‡A†AƒC@{ AÃA ÆAÇAÅB q AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅl,¨HüÿÊA…A ‡A†Aƒj ÃA ÆAÇAÅC j ÃAÆ AÇAÅC n ÃAÆ AÇAÅC nÃAÆ AÇAÅ|œIüÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅ|Jüÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅlœ,KüÿËA…A ‡A†Aƒj ÃA ÆAÇAÅC k ÃAÆ AÇAÅB o ÃAÆ AÇAÅB oÃAÆ AÇAÅ< ˆKüÿcA…A ‡A†AƒCpC AÃA ÆAÇAÅA <L¬LüÿšA…A ‡A†AƒCpY AÃA ÆAÇAÅA HŒNüÿ‰A…A ‡A†Aƒi ÃA ÆAÇAÅD C ÃAÆ AÇAÅB <ØHNüÿkA‡A †Aƒ| à AÆAÇC [  ÃAÆAÇC 0tNüÿTA†A ƒa ÃAÆD Q ÃAÆB <L”NüÿsA‡A †AƒX  ÃAÆAÇC I à AÆAÇA 0ŒÈNüÿoA†A ƒU ÃAÆD I ÃAÆB 0ÀOüÿoA†A ƒU ÃAÆD I ÃAÆB ô@OüÿDOüÿ1C U D T(XOüÿ%<<lOüÿôA…A ‡A†AƒC0V AÃA ÆAÇAÅC <| PüÿºA…A ‡A†AƒCPZ AÃA ÆAÇAÅC T¼œTüÿA…A ‡A†AƒC@h AÃAÆ AÇAÅA _ AÃA ÆAÇAÅA (\Uüÿ/AƒC T AÃC QAÃT@`Uüÿ!A…A ‡A†AƒC`Y AÃA ÆAÇAÅA o AÃAÆ AÇAÅA <˜,Wüÿ]A…A ‡A†AƒCPw AÃA ÆAÇAÅB €ØL[üÿ_A…A ‡A†AƒC€¥ AÃA ÆAÇAÅA K AÃAÆ AÇAÅA © AÃAÆ AÇAÅA «AÃAÆ AÇAÅT\ (aüÿHA…A ‡A†AƒCp] AÃA ÆAÇAÅA w AÃAÆ AÇAÅA l´ cüÿøA…A ‡A†AƒCp‰ AÃA ÆAÇAÅD W AÃAÆ AÇAÅA M AÃAÆ AÇAÅC <$! hüÿiA…A ‡A†AƒC0b AÃA ÆAÇAÅC (d!Ìküÿ"A†A ƒA\ AÃAÆ4!Äküÿ¸A‡A †AƒC u A ÃAÆAÇB hÈ!DlüÿÆA…A ‡A†AƒC`q AÃA ÆAÇAÅD M AÃAÆ AÇAÅA oAÃAÆ AÇAÅd4" müÿBA…A ‡A†AƒC`y AÃA ÆAÇAÅD Ò AÃAÆ AÇAÅA ^AÃAÆ AÇAÅdœ"|nüÿfA…A ‡A†AƒC`y AÃA ÆAÇAÅD ã AÃAÆ AÇAÅA qAÃAÆ AÇAÅh#|oüÿžA…A ‡A†AƒC`q AÃA ÆAÇAÅD ' AÃAÆ AÇAÅA mAÃAÆ AÇAÅdp#°püÿVA…A ‡A†AƒC`s AÃA ÆAÇAÅB í AÃAÆ AÇAÅA _AÃAÆ AÇAÅTØ# qüÿ/A…A ‡A†AƒC0n AÃA ÆAÇAÅC E AÃAÆ AÇAÅC <0$xrüÿËA…A ‡A†AƒC0¸ AÃA ÆAÇAÅA Dp$süÿÕA‡A †AƒC • A ÃAÆAÇB S Aà AÆAÇB ¸$”süÿ Ì$Œsüÿ Tà$„süÿoA…A ‡A†AƒCPÑ AÃA ÆAÇAÅD U AÃAÆ AÇAÅC P8%œxüÿ¢A…A ‡A†AƒC`w AÃA ÆAÇAÅB YAÃAÆ AÇAÅ Œ%ìxüÿrC | A ^ B Q°%>h>{>®>Æ>Ë>Ö>ç>ð>õ>???&?:???J?T?Y?b?p?u?€??•? ?Â?Ç?Ò?à?å?î?ü?0Ì0 00$0)040A0F0P0`0e0p0¶0Ó01-1H1N1Æ1ß12-2A2G2¾2Ó2õ2313733º3ß3 4'4J4g4~4‰4455+6m6Ö6*7U7|7Ñ7â78*8;8H8|89€9†9Ÿ9Ñ9æ9A:p:v:‘:¨:ð:;X;h;–;Î;-R>—>µ>á>ô>?4?K?R?X?o?ä?ï?@8,0@0m0}0—0¼0Ê0 11U1·1Î1Õ1Û1ò1R2Ô2.3p3Þ5J7·8²;>P +1`©=¿=Ó=Ù=p$Ì3Ý344"4t44¤4È4Ý4ð5¡67€Ú2‘34@ì7õ7ý78\:Ö:à:ê:<%<8 >!>/>[>d>Ó>„?–?Ý?ò?àX0(0E0a00–0/1Û1æ1ú122>2I2n2›2ß2ç23Q3^3f3o3Þ3ú3474[4c4x4˜4¡4©4²45ƒ8·9Ç9.;ð :+:X3o3}>…>ó? o1³2Ÿ40 3:<@ l3::PÙ;><8>E>}>…>•>>`(57±8ç=8>þ>ppG0q0©0´0<1-2O2”2.3B3f3ž3²3½34ë475N5Y5~5Ý5å56Ã6V7m7Ò7þ79A9q9y9”9/:g:Ü:ö;µ<Ì<=Q=¦=¾=²>Ò>æ>„?°?Ü?ô?ù?€ø0‰0½0Å0‰1>2W2å2o33Ó3$4À4*5F5_6©6æ6ÿ6Ö7 88«8Ñ8×8ÿ8h9¬9´9É9,:p:x:: ;P;i;«;¾;à;g<ž< ==…=‹==•=Ÿ=£=©=³=·=½=Á=Ç=Ë=Ñ=Õ=Û=ß=å=é=ï=ù=ý=>> >>>>!>%>+>5>9>?>C>I>M>S>W>]>a>g>k>q>{>>…>‰>>“>™>>£>§>®>´>Å>Ö>ç>÷>?"?(?9?H?\?e??–?ª?°?Â?Ë?Þ?ð?Œ;0A0P0W0l0Š0¢0Á0þ0G1L1o1v11™1¨1³1¹122,282D2f2q22Ž2›2º2Å2Ø2ä2ð23303=3J3j3u3ˆ3•3¢3Â3Í3à3í3ú34(484E4[4‚444ª4À4ë4ö4 55/5[5f5y5‰5Ÿ5Ë5Ö5é5ù56=6H6X6e6{6¥6°6À6Í6ã6 77(757K7u7€777³7Ý7è7ø788E8P8`8m8ƒ8ª8µ8Å8Ò8è89 909=9S9z9…9•9¢9¸9å9ð9: :#:M:U:e:r:ˆ:µ:À:Ð:Ý:ó:;%;5;B;X;…;; ;­;Ã;ê;ò;<<+>3>]>h>x>…>›>Å>Ð>à>í>?*?2?E?R?h?’?š?­?º?Ð?ý? €00%0;0b0m0€00£0Ê0Õ0å0ò0121=1M1Z1p1š1¥1¸1Å1Û12 2 2-2C2j2u2ˆ2•2«2Ò2Ý2ð2ý23:3E3X3e3{3¢3­3À3Í3ã3 44)494O4z4…4˜4¥4»4â4í45 5#5M5X5h5u5‹5µ5À5Ð5Ý5ó56%686E6[6‚6Š6 6­6Ã6ê6ò677+7U7`7p7}7“7º7Å7Ø7å7û7"8-8@8M8c8Š8•8¥8²8È8ò8ý89 9-9N9Y9i9v9ƒ9¢9­9½9Ê9×9ö9::!:.:N:Y:l:y:†:¦:±:Ä:Ô:á:; ; ;-;:;Z;e;x;„;;²;½;Í;Ú;ç;<ô>???%?‰?”?¤?±?¸?å?ð?°¼0 00000Z0b0j0r0z0‚0Š0’0š0à0é0 11%1u1“12¢2¶2¿2Ä2Î2Ù2ã2î2õ23*333V3a3l3–3µ3Õ344:4Z4k4{4„44¯4¹4Ô4è4ö4 55+5`5|5´5¿5È5Ï5ï56626U6e6š6£6®6½6Ç6Û6ê6ò6ú67 777"7*727:7B7J7R7f7x7Àœ000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1Œ1`2d2l2p2t2|2€2„2Œ22”2œ2 2¤2¬2°2´2¼2À2Ä2Ì2Ð2Ô2Ü2à2ä2ì2ð2ô2ü23333@3P3T3d3h3x3|3Œ3À3Ä3Ì3 4À4Ä4à4ä4ì4ð4ô4ü455 5555 5$5,50545<5@5D5L5P5T5\5`5d5l5p5t5|5€5„5Œ55”5œ5 5¤5¬5°5´5À5Ä5Ð5Ô5666$6(686`6d6l6t6x6€6ˆ6Œ6”6œ6 6¨6ì6À7Ä7Ð7Ô7Ü7à7ä7ì7ð7ô788 808l8@9D9P9T9\9`9d9p9t9 9°9à9ä9ð9ô9:::: :$:0:4:@:D: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;x;|;€;„;ˆ;;”;˜; ;¤;¨;°;´;¸;¼;À;Ä;Ì;Ð;Ô;Ø;Ü;à;è;ì;ð;ô;ü;<ਠ7¤7¨7¬7°7´7¸7¼7À7Ä7È7Ì7Ð7Ô7Ø7Ü7à7ä7è7ì7ð7ô7ø7ü7888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8€8„8ˆ8Œ88”8˜8œ8 8¤8¨8¬8°8´8¸8¼8À8Ä8È8Ì8Ð8Ô8Ø8ð8 ?¤?¨?¬?°?´?¸?¼?À?Ä?È?Ì?Ð?Ô?Ø?Ü?à?ä?è?ì?ð?ô?ø?ü?000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|1€1„1ˆ1Œ11”1˜1œ1 1¤1¨1¬1°1´1¸1¼1À1Ä1È1Ì1Ð1Ô1Ø1Ü1à1ä1è1ì1ð1ô1ø1ü1222 22222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|2€2„2ˆ2Œ22”2˜2œ2 2¤2¨2¬2°2´2¸2¼2À2Ä2È2Ì2Ð2Ô2Ø2Ü2à2ä2è2ì2ð2ô2ø2ü2333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|3€3„3ˆ3Œ33”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü3444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4€4„4ˆ4Œ44”4˜4œ4 4¤4¨4¬4°4´4¸4¼4À4Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4è4ì4ð4ô4ø4ü4555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ5Œ55”5˜5œ5 5¤5¨5¬5°5´5¸5¼5À5Ä5È5Ì5Ð5Ô5Ø5Ü5à5ä5è5ì5ð5ô5ø5ü5666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|6€6„6ˆ6Œ66”6˜6œ6 6¤6¨6¬6°6´6¸6¼6À6Ä6È6Ì6Ð6Ô6Ø6Ü6à6ä6è6ì6ð6ô6ø6ü6777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|7€7„7ˆ7Œ77”7˜7œ7 7¤7¨7¬7°7´7¸7¼7À7Ä7È7Ì7Ð7Ô7Ø7Ü7à7ä7è7ì7ð7ô7ø7ü7888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8€8„8ˆ8Œ88”8˜8œ8 8¤8¨8¬8°8´8¸8¼8À8Ä8È8Ì8Ð8Ô8Ø8Ü8à8ä8è8ì8ð8ô8ø8ü8999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|9€9„9ˆ9Œ99”9˜9œ9 9¤9¨9¬9°9´9¸9¼9À9Ä9È9Ì9Ð9Ô9Ø9Ü9à9ä9è9ì9ð9ô9ø9ü9::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8? ”€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|1€1„1ˆ1Œ11”1˜1œ1 1¤1¨1¬1°1´1¸1¼1À1Ä1È1Ì1Ð1Ô1Ø1Ü1à1ä1è1ì1ð1ô1ø1ü1222 22222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|2€2„2ˆ2Œ22”2˜2œ2 2¤2¨2¬2°2´2¸2¼2À2Ä2È2Ì2Ð2Ô2Ø2Ü2à2ä2è2ì2ð2ô2ø2ü2333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|3€3„3ˆ3Œ33”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü3444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4€4„4ˆ4Œ44”4˜4œ4 4¤4¨4¬4°4´4¸4¼4À4Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4è4ì4ð4ô4ø4ü4555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ5Œ55À5Ä5È5Ì5Ð5Ô5Ø5Ü5à5ä5è5ì5ð5ô5ø5ü5666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|6€6„6ˆ6Œ66”6˜6œ6 6¤6¨6¬6°6´6¸6¼6À6Ä6È6Ì6Ð6Ô6Ø6Ü6à6ä6è6ì6ð6ô6ø6ü6777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|7€7„79 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9¸9¼9À9Ä9È9Ì9Ð9Ô9Ø9Ü9à9ä9è9ì9ð9ô9ø9ü9::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?@0À.tls  @@0À.relocd"°$B@0BU‰åSƒì‹`äk…Òt4‹`äkƒë9Úw‹…ÀtóÿЋ`äkƒë9Úvë‰$豦Ç`äkÇ$裦ƒÄ[ÉÃU‰åWVSƒì,‹u‹] ‹}ƒût=‰|$‰\$‰4$èq§ƒì …Ûu‹`äk…Ò„„‰Eäèdÿÿÿ‹Eäeô[^_É vÇ$€èD¦£`äk…ÀtcÇ£`äk¡äk…Àt‰|$ÇD$‰4$ÿЃì è>¨èª‰|$ÇD$‰4$èé¦ƒì …Àt†eô[^_É 1Àeô[^_É èÛ¥Ç 1ÀéiÿÿÿfU‰åƒìÇD$`äkÇD$`äk‹E‰$è³¥ƒøÀÉÃU‰åƒìÇD$`äkÇD$`äk‹E‰$è‹¥ÉÃU‰åƒìÇ$0âkè¬R…ÀteÇD$0âk‰$èù«ƒì…ÀtÇD$`äkÇ$äkÿЋ Ä!âk…Ét1Ç$)0âkèëR…Àt*ÇD$70âk‰$è¶«ƒì…Àt Ç$Ä!âkÿÐÉø맸ëâU‰åƒìÇ$0âkèz«Q…Àt%ÇD$K0âk‰$èm«ƒì…Àt Ç$äkÿÐÉÃv¸ëç‹D$‹T$¶Ãv‹L$ ‹D$‹T$ˆ ËD$D$Ãv‹T$‹D$·PÃv‹L$ ‹T$‹D$f‰ PÃv‹D$‹T$BËT$‹D$‹ËL$ ‹T$‹D$‰ ËD$‹L$ðËD$ƒè ƒø–ÀÃf1ÀËD$‹T$‰H¿ƒùwƒð ‰B¸ÃfHŸƒùvê¸Ãf‹D$P¿ƒúwƒð ËD$‹T$H¿ƒùv‰¸Ã𠉸ËD$‹T$‰ƒøIt!ÇBIƒøit)¸¹Ç iÃv¸¹Ç iÃf¸ÃfVSƒì‹t$ ‰óÁëƒûNv 1ÀƒÄ[^Ãæÿÿ‹D$$‰$ÿàêák9ðt…ÛuÛƒîƒþwÓÿ$µ€0âk°ëɺˆÁÓúˆÐƒà빺ø0ˆÁÓúˆÐƒà멺ˆÁÓúˆÐƒà뙺ÀˆÁÓúˆÐƒà뉺>ˆÁÓúˆÐƒàévÿÿÿº€ˆÁÓúˆÐƒàébÿÿÿºpˆÁÓúˆÐƒàéNÿÿÿ‹T$‹D$ƒøvf…Ò”ÀÉD$‰T$éÿÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè¨ÿÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè]ÿÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mèÿÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$MèÙþÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè—þÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$MèYþÿÿ„À•À1øƒÄ[^_ÃvWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèKýÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$Mè ýÿÿ„À•À1øƒÄ[^_ÃvVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèÈüÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè…üÿÿ„À•ÀŠT$ë¾fVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèDüÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mèùûÿÿ„À•ÀŠT$ë¶f‹D$Pöƒúv=…t=( t=) ”ÀððËD$ƒøItƒøit=0t=1”ÀÃf°ðËD$‹T$‰ƒøItIÇBIƒøit!ÇBi=0uS¸¹ Ç 1ÃÇB0¸¹ Ç 1ÃvÇBiÇB0¸ …@Ç 1ÃÇB 0=1¸uÜÊH.Q÷€úTv ‹P …Òt>öÒÿ$•œ0âkf‹P(‹R…Òtè‹ëÒf‹ŠJ.ƒéF€ùwÕ‰ÐËP(‹J…ÉtÈ‹@Ãf€ùAw½¶Éÿ$ð1âk‹ŠQ.€út€úDu£‰ÈÃfUWVSƒì,Š\$@ˆ\$‹˜œ ‹s ‹x8‹@4ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ërëC9ët¶‰$ÿÖ:D$uí‰Ú)ú‰ÐƒÄ,[^_]Ãv—,9ër ëƒÃ9Ýv ‹‰$ÿÖ:D$uì‰Ú)úÁú‰ÐƒÄ,[^_]ÃvW,O9ër ëƒÃ9Ýv·‰$ÿÖ:D$uë‰Ú)úÑú‰ÐƒÄ,[^_]ÃvUWVSƒì,Š\$@ˆ\$‹˜œ ‹s ‹x8‹@4ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ëwëK9ët¶Cÿ‰$ÿÖ:D$uì‰Ú)ú‰ÐƒÄ,[^_]Ãf—,9ëw ëƒë9Ýs‹Cü‰$ÿÖ:D$uë‰Ú)úÁú‰ÐƒÄ,[^_]ÃfW,O9ëw ëƒë9Ýs·Cþ‰$ÿÖ:D$uê‰Ú)úÑú‰ÐƒÄ,[^_]Ãf‹D$ 9D$”ÀÃUWVSƒì‹‹R‰$ƒút?‹Œ ‰T$~'‹r‹Z ‹HH1Ò‹<Ö‹lÖ‰9‰i‹<“‰yBƒÁ;$uå‹L$‹‰Œ ƒÄ[^_]ÃWVS‹‹s$…Òtx‹ …Étm¹ë0v<[»‹xTŸÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 r6‹Š9ÞÌ)ó›‹¸È ßÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 sÊ[^_Ã…ö~+‹PTƒÂ1ÉÇÇBÿÿÿÿÇBÇBÿÿÿÿAƒÂ49ñuÝ‹Kx…É~Å‹€È ƒÀ1ÒvÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿBƒÀ(9ÊuÝ[^_ÃVS‹ˆ° ‹I(‹\‘‹°Ä Þ;q w ‹t‘9´´ r1À[^Ãf˜Ð ;˜Ô –À[^Ãf‹D$‹@0@Ãv‹D$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿÃUWVSƒì‰Æ‰Ó1ÿ‹C,¨ …4€{.Zv‹ëëf¶S.ÿ$•ø2âk‹‰ðèÇÿÿÿ‰Å‹S‰ðè»ÿÿÿf9ïs‰ïf9øv‰Ç‰øƒÈ f‰C,‰øƒÄ[^_]Ãf‹C(ƒxÿ•D$„Ž‹S‰ðè|ÿÿÿ‹S(‹‹ndTU½fƒ fƒøtfƒ €|$„fƒÿ‚Df9ïs‰ïf9øv‰Ç‹C, øƒÈ f‰C,‰øƒÄ[^_]Ë¿é%ÿÿÿ‹‰ðèÿÿÿ‰Å‹S‰ðèÿÿÿf9ïs‰ï·×·È‰Ö9Ê}‰Îƒþ޽9ʌ͉úƒÊ éµv‹C(‹h‹‰ðèÁþÿÿ‹S(‹‹NdQf‹ ‰ÎƒÎf‰2fƒøtƒÉf‰ E„Ðfƒÿs¿f9øw8‰øfƒÿs0¸ë)‹S‰ðènþÿÿ‰Å‹‰ðècþÿÿ‰Â‰øf9ïs‰èf9Âv‰Ð‰ÂƒÊ f‰S,ƒÄ[^_]Ãvfƒÿƒêþÿÿ¿éàþÿÿº0¿f‰S,‰øƒÄ[^_]Ã‰ÂƒÊ ‰Çëév¿é²þÿÿf‹‰ðèïýÿÿ‰Å‹S‰ðèãýÿÿ‹S(‹‹NdQfƒý„gþÿÿé^þÿÿfƒÿƒ1ÿÿÿ¿é'ÿÿÿƒàé þÿÿSƒì‰Ã…Àu ë&€Ìf‰C,öÄu ‹C…ÀtèÜÿÿÿ‹…Ût‹C,öÄtÚƒÄ[ÃS‹‰X‰XÇ@ …Ût‰ÚfŠJ.€ùVt€ù]u‹ëïv‰P9Ót[Ãv€{.Kwõ¶S.ÿ$•d4âk‹‰P‹S ‰P [Ãf¡$`äkÿÃì,D$‰D$ D$‰D$ÇD$”5âk‹D$4‰$ÿ€‚äk…Àt4‹D$‰D$‹D$‰$èàóÿÿ„À•À¶À‰D$Ç$ª5âkÿƒäkƒÄ,Ãv1ÀƒÄ,ÃfÇD$ÇD$ª5âk¡ƒäkÿàUWVSƒì\D$L‰D$ D$H‰D$ÇD$¬5âk‹D$t‰$ÿ€‚äk…À„„‹D$H¨ …„¨„ÈÇD$Ëákl$,‰l$‹D$L‰$‹T$ÿR0‰Ç‰$ÿô‚äk‰Æ…ÀtC…ÿ~U1Ûë‰D$‰\$‰4$ÿü‚äkC9ût:‹D‰D$Ç$ª5âkÿƒäk…ÀuÑ‹H‰…Àth1ö‰ðƒÄ\[^_]ÃÇD$ÀÊákë‚f‹D$H%"@="@uÚD$<‰D$‹D$L‰$‹T$ÿR8H~Á¡ ƒäk‰D$‰4$ÿð‚äkë­vÇD$@Ëáké3ÿÿÿv‹F‰4$ÿP1ö‰ðƒÄ\[^_]ÃvVSƒì$‰Ã‰T$Ç$½5âkÿƒäk‰Æ…Àt6‰D$‰$ÿð‚äk‹J‰…Òt ÷ÐÁèƒÄ$[^ËV‰4$‰D$ÿR‹D$ëá1ÀƒÄ$[^ÃWVSƒì‹\$ ‹|$$‰ƒûItcÇGIƒûitO¾¸ÇiÇ$ièB•9Øt ƒøIt‰·FÇ$Iè1•9Øt ƒøit‰·F‰ðƒÄ[^_Ãv¾뻾¸ë§Sƒì‹D$ ‹\$$=ÿv ‰¸ƒÄ[É$èÜ”‰¸ƒÄ[ËD$=ÿwéÀ”ÃvWVSƒì‹\$ ‹|$$‰‰$蜔9Øt$¾‰G‰$è”9Øt‰·F‰ðƒÄ[^_Ãv‹G¾ë×fSƒì‹\$ ‰$èX”ƒøIt‰$èS”ƒøi”ÀƒÄ[ðƒÄ[ÃSƒì‹D$ ‹T$$·Øúÿw ‰ÁÁéƒùNv …Û”ÀƒÄ[Ãÿ$À5âkK”Àëìf¡8‚äkƒ8t"ÇD$‰$èò“…À•À¶À9ÔÀƒÄ[áD‚äk‹·P%ëÜf1Àƒú–À9ÔÀ뛉$è4‚ëÀfƒú th1Àƒú ”Àë·¡8‚äkƒ8…¢¡D‚äk‹·P%f…À•À¶À9ÔÀƒÄ[Ãf¡8‚äkƒ8…ž¡D‚äk‹·P%ë̃ú_…7ÿÿÿ¸éOÿÿÿ¡8‚äkƒ8…"¡D‚äk‹·Pƒàëšf¡8‚äkƒ8…z¡D‚äk‹·Pƒàéwÿÿÿv¡8‚äkƒ8…¡D‚äk‹·P%WéQÿÿÿ¡8‚äkƒ8…¡D‚äk‹·Pƒàé/ÿÿÿvƒø"w'ÿ$…ü6âk¡8‚äkƒ8…A¡D‚äk‹·Pƒà…Àuûÿÿ”ÀéPþÿÿƒê0ƒú wê°éAþÿÿ¡8‚äkƒ8…¡D‚äk‹·Pƒà ëÁ¡8‚äkƒ8…¼¡D‚äk‹·Pƒà룡8‚äkƒ8…³¡D‚äk‹·Pƒàë…ÇD$‰$èø‘ésþÿÿvÇD$‰$èà‘é[þÿÿvÇD$W‰$èÈ‘éCþÿÿvÇD$‰$è°‘é+þÿÿvÇD$‰$蘑éþÿÿvÇD$‰$耑éûýÿÿÇD$‰$èk‘éâþÿÿÇD$‰$èV‘éÍþÿÿÇD$‰$èA‘é¸þÿÿÇD$ ‰$è,‘é£þÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè¨üÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè]üÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mèüÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$MèÙûÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè—ûÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$MèYûÿÿ„À•À1øƒÄ[^_Ãv‹D$‹T$ƒøIt#ƒøit=0t=1t‰T$‰D$铎v‰¸Ãé‡vƒì·À‰$ÿœƒäkf=êwf=èr9°ƒÄÃvf=ôv-ùfƒøvæ1ÀƒÄÃf=òsÙ-ìfƒøvÎ1ÀëævfƒøotÁwfƒøet¹fƒøit³fƒøat­1ÀëÅffƒøut¡r¹-àfƒøv”1Àë¬UWVSƒìL‰Ã‰Ö‰Í‹¸  ‹P8…ö~n;p<Œ™Fÿ‰D$‰$ÿ׉D$Ç$Mèëÿÿ„À•Â;s<|F1À‰é8Ñt+8Á”ÀƒÄL[^_]Ã|$( t ƒ|$(…¯ƒ|$8 …¤1ÀƒÄL[^_]Ãf1Ò;s<}º‰t$‹C8‰$ˆT$ÿ׉D$Ç$Mè‘êÿÿ„À•ÀŠT$ë‘f‰t$‰$‰T$ÿ׉D$$Nÿ‰L$,‰L$‹C8‰$ÿ׉D$ ‹D$$‰$èýÿÿƒ|$(„Yýÿÿ‹D$ ‰D$Ç$Mè èÿÿˆÃ‹D$$‰D$Ç$Mèóçÿÿ‰ê8Ó„%ýÿÿ8”ÀƒÄL[^_]Ã|$(„ ýÿÿƒ|$0…ÿÿÿƒ|$( …øþÿÿ1Àéòüÿÿƒ|$( …(þÿÿ1Àéàüÿÿƒ|$0 t ƒ|$0…·þÿÿƒ|$( „Áüÿÿ¸ é¢þÿÿ‹D$0ƒè ƒø‡±þÿÿƒ|$(…¼þÿÿ1Àé—üÿÿ‹D$(ƒè ƒø‡¯þÿÿƒ|$8…¤þÿÿ1Àétüÿÿfƒ|$( …þÿÿ1Àé`üÿÿƒ|$0„~þÿÿƒ|$0 „sþÿÿƒ|$0…›þÿÿécþÿÿ‹D$$‰T$è#ûÿÿ„À‹T$„uýÿÿ°éòûÿÿÇD$0éaýÿÿ1ÀéïýÿÿÇD$8éýÿÿv1É‹T$‹D$éiûÿÿ¹‹T$‹D$éVûÿÿfUWVSƒì,‹|$@‹G0@‰$ÿlƒäk‰Å…Àtq‹G$‰D$‹G ‰D$Ç$ˆ7âk¡ƒäk‰D$ÿÐ…Àt@‰E ‹G0…À~P1ö1ÛëfC‰D ƒÆ9_0~;‹G4ð‹P‰T$‹‰D$Ç$ˆ7âkÿT$…ÀuÒ‹EH‰E…Àt1í‰èƒÄ,[^_]ÃvÿE‰o8‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]ÃvUWVSƒì,Ç$hÿlƒäk‰Æ…ÀtN1Ûl$‹=„ƒäkë‰D$‰\$‰4$ÿtƒäkCƒûht)f‹„ ìákf‰D$ÇD$‰,$ÿ×…ÀuË‹H‰…Àt1ö‰ðƒÄ,[^_]Ãf‹F‰4$ÿP1ö‰ðƒÄ,[^_]Ãvƒì€x9t ‰$ÿˆ‚äkƒÄÃfVSƒì$‰Ö‰$ÿä‚äk‰Ã…Àt.‰t$‰$ÿ,ƒäk‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ã1ÀëõVSƒì‰Ã‰Ö¡ `äk…À„†ƒÃƒûv"ÇD$ð8âk¡Ô‚äk‹‰$ÿÄ‚äkfƒÄ[^Ãfÿ$9âkÇD$28âk¡Ô‚äk‹‰$ÿÄ‚äkëÖf‹F‹@ ‰D$ÇD$¤8âk¡Ü‚äk‹‰$ÿ´‚äkë°‹F‹@ ‰D$ÇD$|8âk¡Ü‚äk‹‰$ÿ´‚äkëŒÇD$7âk¡ `äk‰$ÿÄ‚äkéqÿÿÿÇD$D8âk¡Ü‚äk‹‰$ÿÄ‚äkéSÿÿÿvÇD$Ì8âk¡Ð‚äk‹‰$ÿÄ‚äké3ÿÿÿv…ö„¨‹F‹@ ‰D$ÇD$Ð7âk¡Ü‚äk‹‰$ÿ´‚äkéÿÿÿÇD$d8âk¡ `äk‰$ÿÄ‚äkéåþÿÿÇD$Ú8âk¡ `äk‰$ÿÄ‚äkéÉþÿÿ¡¸‚äkƒÄ[^ÿàÇD$³7âk¡à‚äk‹‰$ÿÄ‚äkéŸþÿÿvº‹7âk¸‘7âkè þÿÿ£ `äkéaþÿÿvÇD$8âk¡Ü‚äk‹‰$ÿ´‚äkécþÿÿvUWVSƒì‹\$0‹D$4…ÀˆÕ;C0Ì…À„€t@ý‹C44ð‹F‰$ÿô‚äk‰Ç…À„—‹F…À„Œ1Û‹-ƒäkëv‹W ‰šC9^vsÝF‹P‰T$‹‰D$Ç$ˆ7âkÿÕ…ÀuЋH‰…Àtk1ÿ‰øƒÄ[^_]ÃvÇ$ÿô‚äk‰Ç…Àt$‹C$‰D$‹C ‰D$Ç$ˆ7âkÿƒäk…Àt¶‹W ‰‰øƒÄ[^_]Ãv1Ò¸òÿÿÿè0ýÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÎvUWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpt@ý‹K44ñ‹F‰$ÿô‚äk‰Ç…À„€‹V…Òty1Û‹-ƒäkëv‹W ‰šC9^v`‹F‹D؉D$Ç$ª5âkÿÕ…ÀuÜ‹H‰…Àtc1ÿ‰øƒÄ[^_]ÃvÇ$ÿô‚äk‰Ç…Àt‹C$‰D$Ç$ª5âkÿƒäk…Àt½‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿè8üÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì‹\$0‹D$4…Àˆ±;C0¨…Àtht@ý‹{44÷‹F‰$ÿô‚äk‰Ç…Àt|‹^…Ûtu1Û‹-ƒäkëv‹W ‰šC9^v\‹F‹؉D$Ç$ª5âkÿÕ…ÀuÝ‹H‰…Àt`1ÿ‰øƒÄ[^_]ÃÇ$ÿô‚äk‰Ç…Àt‹C ‰D$Ç$ª5âkÿƒäk…ÀtÀ‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿèHûÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì,‰Ã‰Õ…Àt*…Òt.‰Ç1ö¡ƒäk‰D$‹G‰$ÿT$FƒÇ9îuî‰$ÿT$ƒÄ,[^_]áƒäk‰D$ëæUWVSƒì,‰Ã‰T$…Àt.…Ò~2‰Æ1ÿ‹-ƒäk‹F‰$ÿÕ‹F‰$ÿÕGƒÆ4;|$uæ‰$ÿÕƒÄ,[^_]Ë-ƒäkëëSƒì‰Ã‹€¸1 t ÿÌ‚äk‰CƒÄ[Ãì‹€º1 t ‹@‰$ÿÈ‚äkƒÄÃfVSƒì‰Ã‰ÖèÒÿÿÿ‰4$ÿƒäk‰ØƒÄ[^ë Sƒì(‰ÓÁë=ÀÊák„¤=@ËákBÿ„¶ƒøwI‹8‚äkƒ;tZÇD$‰ $‰L$èR‚‹L$…ÀuPƒ;tUÇD$‰ $è5‚…À•ÀƒÄ([Ãvƒëƒûv¯‰L$‰$èÌíÿÿƒÄ([Ãv¡D‚äk‹·Hƒà…Àt°°ƒÄ([Ãv¡D‚äk‹·Hƒàë«Bÿƒøv@ƒëƒûv,‰L$‰$è@ÞÿÿëÊfƒøv#ƒëƒûv‰L$‰$èëÞÿÿë­‰ $è¼fë¢f‰ $èôbHƒø–ÀëvUWVSƒì,‹T$@‹R‰T$…Ò„Ê‹L$@‹Y‹q‹A0‰D$…À~c‹i4ÇD$f‹E…Àx9Ã~‰Ã‹E…Àx9Æ}‰Æ‹}…ÿt$‹E‹‹P1À…Éx9Ë~‰Ë…Òx9Ö}‰Ö@9øuçÿD$ƒÅ‹T$9T$uª‰t$‰\$‹L$‰ $ÿDƒäk…Àt9‹L$@‹Q …Òt ‹ I‰ …Ét?‹T$@‰B ‰Z‹B…Àt ‹J‰…Òt‹L$@ÇA¡ ƒäkÿƒÄ,[^_]ËP‰$ÿRëÛ‹J‰$‰D$ÿQ‹D$ë®vUWVSƒì‹t$0‹D$4…Àˆá;F0Ø…À„ˆ|@ý‹F4<ø‹G‰$ÿô‚äk‰Å…À„¥‹G…À„š1Ûë‹U ‰šC9_†…ÝG‹V‹H)щL$‹)ЉD$‹F ‰$ÿDƒäk…Àu‹EH‰E…Àto1í‰èƒÄ[^_]ÃvÇ$ÿô‚äk‰Å…Àt*‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿDƒäk…Àt®‹U ‰‰èƒÄ[^_]Ã1Ò¸òÿÿÿè÷ÿÿ1í‰èƒÄ[^_]ËE‰,$ÿP1íëÐvWVSƒì ‰Ã€x ‹BtCö@W„ÿ‰×‹…Àt_‰|$‰$ÿð‚äk‰Æ…Àˆ‹H‰…À„¿‰ðƒÄ [^_Ãfö@WuÁ‰$‰T$ÿ€ƒäk‰Ç…À‹T$u®¸ïÿÿÿèmöÿÿ¾ïÿÿÿëÇf‹C…À„éÇ$ÿô‚äk‰…Àt"‹@ ‹S‰ÇC‹‹@ ‰x1ö‰ðƒÄ [^_þ÷ÿÿÿ‹H‰…Àtz‹…Àt ‹J‰…Ò„ƒ‹C…Àt ‹J‰…Òtg1Ò‰ðèêõÿÿ‰ðƒÄ [^_ËG‰<$ÿP‰ðƒÄ [^_Ãf‰$‰T$ÿ€ƒäk‰Ç…À‹T$…èþÿÿ¸îÿÿÿè§õÿÿ¾îÿÿÿéþþÿÿ‹G‰<$ÿPéxÿÿÿf‹P‰$ÿR뎋P‰$ÿRéoÿÿÿf‰{1öéÇþÿÿfVSƒì$‰Ã‹…À„ï€{…Å€{ uCÇ$d9âkÿTƒäk‰Æ‹…ö„’‰D$‰4$ÿ˜ƒäk‹J‰…ÒtG‹‹ I‰ …ÉtXƒÄ$[^ÃvÇD$Ç$ÿ„ƒäk‰Æ‹…ötK‰D$‰4$ÿˆƒäk‹J‰…Òu¹‹V‰4$‰D$ÿR‹D$‹‹ I‰ …Éu¨‹J‰$‰D$ÿQ‹D$ƒÄ$[^Ãf‹J‰…Òt1ÀƒÄ$[^Ãv‰$ÿø‚äké-ÿÿÿf‹P‰$ÿR1Àé[ÿÿÿ‹C…À…Pÿÿÿ€{ uÇ$d9âkÿTƒäké8ÿÿÿÇD$Ç$ÿ„ƒäkéÿÿÿf‹D$‹@,‰D$¡”‚äkÿàfSƒì‹\$ ‹C…Àt ‹J‰…Òtl‹C …Àt ‹J‰…ÒtP‹C‹J‰…Òt8‹C4…Àt ‰$ÿƒäk‹C8…Àt‹J‰…Òu ‹P‰$ÿR‰\$ ¡(ƒäkƒÄ[ÿà‹P‰$ÿR뽋P‰$ÿR륋P‰$ÿRë‰UWVSƒì,‰Ç‹€¬ …Àt ‰$ÿdƒäk‹‡p …Àt"‹-ƒäkëf‰Ø‹˜ ‰$ÿÕƒ¯€ @…Ûuè‹7‹Ÿˆ …Ût.‹-ƒäkë‰Ã‹C‹S‰$‰D$ÿÕ‹S ‰$ÿÕ‰$ÿÕ‹D$…ÀuÚ‹Ÿ …Ût)‹-ƒäkë‰Ë‹K‹V$‹C‰L$èø÷ÿÿ‰$ÿÕ‹L$…Éuß‹Fp…À„4‹V‹GHè‰÷ÿÿ‹Ft…À„‹V$‹GTè¿÷ÿÿ‹ŸØ …Ût5‹-ƒäkë‰Ë‹K‹V‹C ‰L$èL÷ÿÿ‹V$‹Cè÷ÿÿ‰$ÿÕ‹L$…ÉuÔ‹FT…À~-1À1Û‹-ƒäkv‹—à ‹T‰$‰D$ÿÕC‹D$ƒÀ9^Tà‹‡à …Àt ‰$ÿƒäk‹‡È ‰D$…Àt>‹vx‰t$…öŽ“‹\$1ö‹-ƒäk‹C‰$ÿÕ‹C‰$ÿÕFƒÃ(;t$uæ‹D$‰$ÿÕ‹‹J‰…ÒtN‹G‹J‰…Òt6€¿+ t ƒÇ‰<$ÿˆ‚äkƒÄ,[^_]ËGT‰Ftéîþÿÿ‹GH‰FpéÌþÿÿ‹P‰$ÿRë¿‹P‰$ÿRë§‹-ƒäkë‹Sƒì‹\$ C èÐýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡(ƒäkƒÄ[ÿàSƒì‹\$ C èœýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡(ƒäkƒÄ[ÿàWVSƒì ‰Ã‰T$Ç$ª5âkÿƒäk‰Æ…Àt=‰$ÿ<ƒäk‰Ç‹H‰…Àt5…ÿt%‰|$‰$ÿð‚äk‹J‰…Òt'÷ÐÁèƒÄ [^_Ãv1ÀƒÄ [^_Ãv‹F‰4$ÿPëÀ‹W‰<$‰D$ÿR‹D$ëÆWVSƒì ‹t$0Ç$ÿô‚äk‰Ã…Àtºe9âkèÅâÿÿ„Àu)‹H‰…Àt 1ÀƒÄ [^_Ãv‹C‰$ÿP1ÀƒÄ [^_Ãf‹V ‰Øèÿÿÿ„Àtɺ9âk‰Øè~âÿÿ„Àt¹‹V$‰Øèüþÿÿ„Àt«º„9âk‰Øè`âÿÿ„Àt›‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿDƒäk‰Æ…À„pÿÿÿ‰$ÿ<ƒäk‰Ç‹H‰…À„˜…ÿ„Pÿÿÿ‰|$‰$ÿð‚äk‰Æ‹J‰…Ò„‚…öˆ,ÿÿÿºŽ9âk‰Øèááÿÿ„À„ÿÿÿÇD$d9âkÇ$½5âkÿƒäk‰Æ…À„ùþÿÿ‰\$‰$ÿˆƒäk‹J‰…Òt?‹J‰…Ò…áþÿÿ‹S‰$‰D$ÿR‹D$éËþÿÿ‹F‰4$ÿPéZÿÿÿ‹G‰<$ÿPépÿÿÿ‹V‰4$‰D$ÿR‹D$ë®fUWVSƒì<‹t$PÇ$ÿô‚äk‰Ã…Àtº9âkè(áÿÿ„Àu(‹H‰…Àt 1ÀƒÄ<[^_]ËC‰$ÿP1ÀƒÄ<[^_]ËF‰$‹-<ƒäkÿՉDžÀtĉD$‰$¡ð‚äk‰D$ÿЋJ‰…Ò„I…Àx¡ÇD$$1À1ÿëPvº9âk‰Øè¨àÿÿ„Àt€ºª9âk‰Øè˜àÿÿ„À„lÿÿÿ‹D$$‹ÅXâk‰Øè~àÿÿ„À„RÿÿÿG‹D$$@‰D$$ƒø w'‹ÅXâk…F tæ…ÿt£º¦9âk‰ØèKàÿÿ„Àu£éÿÿÿfÇD$$‰÷D$,‰D$ D$(‰D$D$$‰D$‹G4‰$ÿ ‚äk…À„ º9âk‰Øèþßÿÿ„À„Òþÿÿ‹D$(‰D$‰$ÿT$…Àˆ»þÿÿ‹D$,‰$ÿՉƅÀ„¨þÿÿº±9âk‰ØèÀßÿÿ„À„”þÿÿ‰t$‰$ÿT$‹J‰…Òt…À‰fÿÿÿésþÿÿv‹V‰4$‰D$ÿR‹D$ëÝ‹W‰<$‰D$ÿR‹D$é¡þÿÿº³9âk‰Øè^ßÿÿ„À„2þÿÿÇD$d9âkÇ$½5âkÿƒäk‰Æ…À„þÿÿ‰\$‰$ÿˆƒäk‹J‰…Òt#‹J‰…Ò…ûýÿÿ‹S‰$‰D$ÿR‹D$éåýÿÿ‹V‰4$‰D$ÿR‹D$ëÊvUWVSƒì‹\$0‹K@…ÉŽ 1ÿ‹-ƒäkë ‰4$ÿÕG9{@~/‹CD‹4¸‹F(‰$ÿÕöF-tá‹F‰$ÿÕ‹F‰$ÿÕ‰4$ÿÕG9{@Ñ‹CD‰$ÿÕ‹CL‰$ÿÕ‹CX‰$ÿÕ‹Cd‰$ÿÕ‹S‹Cpè»ðÿÿ‹S$‹Ctèüðÿÿ‹S…Òt ‰$ÿ$ƒäk‹C…Àt ‹J‰…Òtx‹C,…Àt ‹J‰…Òt\‹C0…Àt ‹J‰…Òt@‹C4‹J‰…Òt(‹C8‹J‰…Òu ‹P‰$ÿR‰\$0¡(ƒäkƒÄ[^_]ÿà‹P‰$ÿRëÍ‹P‰$ÿR뵋P‰$ÿR뙋P‰$ÿRézÿÿÿ‹-ƒäkéÿÿÿvVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F8‰$ÿ–  ƒø tƒè ƒø–ÀƒÄ[^Ã;^<}ȉ\$‹F8‰$ÿ–  ƒø •Àë²vVSƒì‹\$ ‹t$$9s< °ƒÄ[^Ãf‰t$‹C8‰$ÿ“  ƒø tƒè ƒø–ÀƒÄ[^Ã…öÎN‰t$‹C8‰$ÿ“  ƒø •Àë·vVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F8‰$ÿ–  ƒø t PöƒúvÕ=…tÎ=( tÇ=) ”Àë¿;^<}¸‰\$‹F8‰$ÿ–  ƒø •Àë¢vVSƒì‹\$ ‹t$$9s< °ƒÄ[^Ãf‰t$‹C8‰$ÿ“  ƒø t#PöƒúvÙ=…tÒ=( tË=) ”ÀëÃv…öºN‰t$‹C8‰$ÿ“  ƒø •Àë£vVSƒì$‹D$4‹\$89Øt;t$‰t$‰$‹D$0ÿP0ƒø~;\$tºëv;–tB9Âuö1ÀƒÄ$[^Ãf°ƒÄ$[^ÃUWVSƒì ‰Å‰Ó‰Ï1ö…Òu ë"v‹…Ût‰ù‰Ú‰èè:C/uêƒö‹…Ûuç‰ðƒÄ [^_]ÃvSƒìŠZ.ƒë €û:v 1ÀƒÄ[Ãf¶Ûÿ$¸9âkf‹Z$…Ûtä‹R(9 tz1Àëf9 ‚to@9ØuöëË‹B(9”ÀƒÄ[Ãv‰L$‹R(‹‰$ÿƒÄ[ËB(‹P;r9Ñ–Àë˜v‹RƒÄ[ëcv‹RƒÄ[錋RƒÄ[éÿÿÿ‹RƒÄ[ë v°é^ÿÿÿWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè+ÿÿÿ:C/uê°[^_Ã1À[^_ÃfWVS‰Ç‰Ó‰Îè ÿÿÿ:C/t1À[^_Ãv‰ñ‰Ú‰øèñþÿÿ:C/tç‹…Ûuê°[^_ÃWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè¿þÿÿ:C/tê1À[^_ð[^_ÃfUWVSƒì,‰D$‰Ó‰L$‹|$@…É~O1öŠC.ƒè <:v °ƒÄ,[^_]öÀÿ$…¤:âkf‹S$…Òt‹,·‹K(;)tÙ1Àëv9,tÍ@9ÐuöF;t$u·v1ÀƒÄ,[^_]Ãf‹ ·‹S‹D$èÝþÿÿ„ÀuŸF;t$uŽëØ‹ ·‹S‹D$èÉýÿÿ„ÀuƒF;t$…nÿÿÿ븋 ·‹S‹D$è ÿÿÿ„À…_ÿÿÿF;t$…Jÿÿÿ딋 ·‹S‹D$è±þÿÿ„À…;ÿÿÿF;t$…&ÿÿÿémÿÿÿ‹·‹C(‹H;‚Qÿÿÿ9ʆÿÿÿF;t$…üþÿÿéCÿÿÿv‹·‰D$‹C(‹‰$‹T$ÿ„À…áþÿÿF;t$…Ìþÿÿéÿÿÿv‹C(‹9·„ÀþÿÿF;t$…«þÿÿéòþÿÿfUWVSƒì<‰Ç‰Ót$ ‰t$‰ $ÿP0‰ÅŠC.ƒè3< w'¶Àÿ$…;âk‹[‰4$‰é‰Ú‰øèGþÿÿ:C/„ÁfÆD$ŠD$ƒÄ<[^_]Ãv‹[…Ûu ëãv‹…ÛtÚ‰4$‰é‰Ú‰øèþÿÿ:C/uçÆD$ŠD$ƒÄ<[^_]Ãf‹[ÆD$…Ûu ë«€t$‹…Ût ‰4$‰é‰Ú‰øèÉýÿÿ:C/uçëàf‹[…Ûu ë´v‹…Ût«‰4$‰é‰Ú‰øè ýÿÿ:C/tçéZÿÿÿf‰4$‰é‰Ú‰øè†ýÿÿ:C/„Aÿÿÿ‹…ÛuãéoÿÿÿfUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øè{þÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèBþÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øè~ýÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèEýÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfSŠZ.ƒë2€ûv1À[öÛÿ$È;âkf‹R[é³úÿÿv‹R[é¯ùÿÿv‹R[éûÿÿv‹R[éÃúÿÿvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øèGÿÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèÿÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèÑþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øèJþÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèÔýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰Ã‰Ö‹€  ‹S8€~.Aw¶~.ÿ$½<âkv;KD|=v1ÀƒÄ,[^_]Ãf;K@~ïI‰L$‰$ÿЋ›œ ‰Á‰ò‰Øè`ýÿÿ:F/”ÀëÎ;K@~ÇI‰L$‰$ÿЋ›œ ‰Á‰ò‰Øè(úÿÿ:F/”Àë¦;KD}Ÿë¯;K@~—I‰L$‰$ÿЋV(‹J;r`9È–Àf8F/”Àésÿÿÿ;K@ŽgÿÿÿI‰L$‰$ÿЋV(‹j‹:‹“œ \$‰\$‰$ÿR0…À~1Òv‹ “9Ïw 9Ír°ë­B9Âuë1Àë£v;KDÿÿÿ‰L$‰$ÿЋV(‹j‹:‹“œ \$‰\$‰$ÿR0…À~Ç1Ò‹ “9Ïw9Ís°B9Âuð1ÀéUÿÿÿ;KDÇþÿÿé,ÿÿÿf;K@Ž·þÿÿ‹›œ ‹I‰L$‰$ÿЉD$‹F(‹‰$ÿÓ:F/”ÀéŽþÿÿ;K@ŽƒþÿÿI‰L$‰$ÿЋV(‹›œ ‰Á‹‰ØèÉäÿÿ:F/”Àé\þÿÿf;KDOþÿÿëË;KDCþÿÿ‹›œ ‹ë‹;K@Ž/þÿÿI‰L$‰$ÿЋV(;”¶ҶF/9”Àéþÿÿ;K@Žþÿÿ‹~(‹?I‰L$‰$ÿЉ|$‰D$‹ƒœ ‰$èöôÿÿ:F/”ÀéÕýÿÿv;KDÇýÿÿ‹~(‹?ëÃ;KD·ýÿÿë‡;K@Ž«ýÿÿ‹›œ ‹[ I‰L$‰$ÿЉ$ÿÓ„À”Àé‹ýÿÿ;KDýÿÿ‹›œ ‹[ ëÓ;K@ŽkýÿÿI‰L$‰$ÿЃø •ÀéXýÿÿf9K@œÀéKýÿÿ9KDŸÀé?ýÿÿ9KDŽ3ýÿÿëÇUWVSƒì\‰Ã‰Ö‰Í‹zöG- u‹H8‰L$ ‹ˆ  ‰L$€.Kv‹‹T$p‰‰j°ƒÄ\[^_]Ãf¶G.ÿ$…=âk‹W$‰T$$‰è+C@9ÂwE‹(‰é)щL$(…ÒtZ1Û‰t$,‹t$ ‰l$ ‹l$ë fC;\$$„Ý‹D$(؉D$‰4$ÿÕ;Ÿtá1ÀƒÄ\[^_]Ã;kD}ñ‰l$‹L$ ‰ $ÿT$ƒø tÝ‹F‹L$p‰n ‰i°ƒÄ\[^_]Ã;k@â1Àë¼;k@~µEÿ‰D$ë¿;kD|Ë1Àë¥;kD}ž‹ƒœ ‹X ‰l$‹L$ ‰ $ÿT$‰$ÿÓ„Àt¡1Àéxÿÿÿ;k@Žmÿÿÿ‹ƒœ ‹X Eÿ‰D$ëÊ‹ƒœ ‰l$‰$ÿP:G/„fÿÿÿ1Àé=ÿÿÿ‹D$p‰$‰é‰ú‰Øè…þÿÿ„À…EÿÿÿW‹L$p‰ $‰é‰Øèjþÿÿ„À…*ÿÿÿ1Àéÿÿÿ;kDöþÿÿ‰l$‹L$ ‰ $ÿT$‹W(;”¶ҶG/9„ôþÿÿ1ÀéËþÿÿ;kDÀþÿÿ‹G(‹‰l$‹L$ ‰ $‰T$ÿT$‹T$‰T$‰D$‹ƒœ ‰$è2òÿÿ:G/„©þÿÿ1Àé€þÿÿ;k@Žuþÿÿ‹G(‹Eÿ‰D$ë°;k@Ž^þÿÿEÿ‰D$é`ÿÿÿ‹ƒœ ‰l$‰$ÿP:G/„]þÿÿ1Àé4þÿÿ‹ƒœ ‰l$‰$ÿP:G/„=þÿÿ1Àéþÿÿ‹ƒœ ‰l$‰$ÿP:G/„þÿÿ1Àéôýÿÿ9k<„ þÿÿ‰l$‹L$ ‰ $ÿT$ƒø „õýÿÿ1ÀéÌýÿÿ‹ƒœ ‰l$‰$ÿP(„À…Öýÿÿ1Àé­ýÿÿ9k<„Æýÿÿ1Àéýÿÿ9k<„¶ýÿÿ9kd„­ýÿÿ1Àé„ýÿÿ9k<„ýÿÿ9kh„”ýÿÿ1Àékýÿÿ‹ƒœ ‰l$‰$ÿP :G/„týÿÿ1ÀéKýÿÿ‹ƒœ ‰l$‰$ÿP:G/„Týÿÿ1Àé+ýÿÿ;kD ýÿÿ‹ƒœ ‹‰l$‹L$ ‰ $ÿT$‰D$‹G(‹‰$ÿÓ:G/„ýÿÿ1Àéíüÿÿ;kDâüÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹›œ ‰Á‹‰Øè¯ßÿÿ„ÀéÖýÿÿ;k@ޝüÿÿEÿ‰D$ëÈ;k@Žüÿÿ‹ƒœ ‹Eÿ‰D$éuÿÿÿ;kD€üÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹J;rx9È–Àf8G/„{üÿÿ1ÀéRüÿÿ;kDGüÿÿ‰l$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒœ \$@‰\$‰$ÿP0‰Á…À~1Àf‹ƒ9T$w 9T$ r°ë•@9Èuç1Àë‹;k@ŽâûÿÿEÿ‰D$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒœ \$@‰\$‰$ÿP0‰Á…À~µ1Àf‹ƒ9T$w9T$ s˜@9Èuì1Àé%ÿÿÿ;k@Ž|ûÿÿEÿ‰D$éôþÿÿ9kX„‹ûÿÿ1Àébûÿÿ;kDWûÿÿ‰l$‹L$ ‰ $ÿT$‹›œ ‰Á‰ú‰ØèOõÿÿ:G/„Rûÿÿ1Àé)ûÿÿ;kDûÿÿ‰l$‹L$ ‰ $ÿT$‹›œ ‰Á‰ú‰Øèòÿÿ:G/„ûÿÿ1Àéðúÿÿ;k@ŽåúÿÿEÿ‰D$ëÂ;k@ŽÓúÿÿEÿ‰D$étÿÿÿ…í„ãúÿÿEÿ‰D$éÎüÿÿ‹ƒœ ‰l$‰$ÿP$„À…¿úÿÿ1Àé–úÿÿ…í„°úÿÿ1Àé‡úÿÿ‹ƒœ ‰l$‰$ÿP:G/„úÿÿ1Àégúÿÿ‹W$‹CD)è9‡Uúÿÿ‹O(…Ò„núÿÿê‰T$$‰ï‰è÷؉t$(‹t$ ‰l$ ‹l$ë G;|$$„ÿ‰|$‰4$ÿÕ;»tç1Àé úÿÿ‹O$‰L$$‹KD)é‹D$$…À„±ƒ|$$†ëº«ªªª‹D$$÷âÑê9ÑŒÐùÿÿ‹“œ ‰T$(‹J8‰L$4‹(‰|$,‰é‹|$$…ÿ„¼1ÿ1À1Ò‰\$0‰Ó‰t$8‰Æ‰l$<ëfCG9þE;\$$„È9þ/‹D$09hDŽnùÿÿ‰l$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$4‰Æ1ÿ‹L$,‹™‰D$‹D¼@‰D$‹T$(‰$èÑìÿÿ„Àu™1Àé$ùÿÿ‹W$‹CD)è9‡ùÿÿ‹›œ ‰\$,‹O(…Ò„!ùÿÿê‰T$(‰ë‰è÷؉D$$‹|$ ‰t$ ‰l$0‹l$,ë C;\$(„¼‹T$$‹4š‰\$‰<$ÿT$‰t$‰D$‰,$èOìÿÿ„ÀuÏ1À颸ÿÿ‹O$‰ê+S@‰T$$…É„Fƒù†º«ªªª‰È÷âÑê9T$$Œnøÿÿ‹“œ ‹B8‰D$,‹(‰|$$…É„b‰Ï1À‰\$(‰t$0‰î‰l$4‰Õë:‹L$$‹T¹ü‰T$Xÿ‹Dœ@‰D$‰,$èÁëÿÿ„À„øÿÿO‰Ø…Û޾…ÿ„6…À‹D$(9p@ñ÷ÿÿFÿ‰D$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$,ë’‹O$‰L$$‰è+C@9Á‡º÷ÿÿ‹“œ ‹G(‰é+L$$‰L$(‹\$$…Û„¿÷ÿÿ1ۉ׉t$,‰l$0‰Åë vC;\$$tV‹t‹D$(؉D$‹L$ ‰ $ÿT$‰t$‰D$‰<$èüêÿÿ„ÀuÌ1ÀéO÷ÿÿNé<ÿÿÿ1ÒéÇþÿÿ1Òé`ýÿÿ‹t$,‹l$ éO÷ÿÿ‹t$,‹l$0éB÷ÿÿ‹t$(‹l$ é5÷ÿÿ‹t$ ‹l$0é(÷ÿÿºé‚þÿÿºéýÿÿ‰é‹F‹T$p‰‹v …ö„köÿÿ‹D$p‰H°éböÿÿ‰ñ‹t$0‹l$4…Û~Ð1Àé¹öÿÿ‰ð‰é‹t$8‹l$<9Ç}¹1Àé¢öÿÿWVS‰Ã‰È‹t$¶|$ƒûtƒût>Kt[^_ÃvÐÖ9ðs%1Û€8 •Ãçÿ9ûtë1É€8 •Á9Ùu@9ðuï)Ð[^_ʲ9Øs)1Ƀ8 •Á‰Îçÿ9þtë1Ƀ8 •Á9ñuƒÀ9Ãwí)ÐÁø[^_ÃJr9Øs.1Éfƒ8 •Á‰Îçÿ9þtëv1Éfƒ8 •Á9ñuƒÀ9Ãwì)ÐÑø[^_ÃWVS‰Ã‰È‹t$¶|$ƒû„‹ƒûtBKt[^_ÃvÐÖ9ðv*1Û€xÿ •Ãçÿ9ûtëv1É€xÿ •Á9ÙuH9ðuî)Ð[^_ʲ9Øv.1Ƀxü •Á‰Îçÿ9þtëv1Ƀxü •Á9ñuƒè9Ãrì)ÐÁø[^_ÃvJr9Øv/1Éfƒxþ •Á‰Îçÿ9þtëf1Éfƒxþ •Á9ñuƒè9Ãrë)ÐÑø[^_ÃvWVSS‰Ã‰Ï‹D$‹t$ŠL$8L$ ”D$‹ƒû„ˆƒûtGKtZ[^_ÃvÐÖ9ðs,¶9ٔöۉ߶\$9ßtë¶9ٔöÛ9ûu@9ðuì)ÐZ[^_Â4²9ðs(1Û;”Éß¶\$9ßtëf1Û;”Ã9ûuƒÀ9Æwî)ÐÁøZ[^_ÃB4r9ðs0·9ٔöۉ߶\$9ßtëf·9ٔöÛ9ûuƒÀ9Æwê)ÐÑøZ[^_ÃUWVSƒì<‰Ã‹|$P‹l$T‹@8‰D$8L$X”Á‹ƒœ t$ ‰t$‹‰$ˆL$ÿP0‹S4ƒúŠL$„·ƒút^Jt ‰øƒÄ<[^_]Ã|$l$9ïs2‹T$ ‰T$Š…À~¶Û;\$t)1Òë;–tB9Âuö1Ò8ÑuG9ïu×+|$‰øƒÄ<[^_]òëä‹T$<º,ª9ïs1‹T$ ‰T$f‹…À~;\$t,1Òë;–t#B9Âuö1Ò8ÑuƒÇ9ýwÙ+|$Áÿ‰øƒÄ<[^_]òëà‹T$âkë&‹…Àt‹G…ÀtÇD$‰$ÿÐHtcÇD$@>âk¡Ü‚äk‹‰$ÿÄ‚äk1ÀƒÄ[^_Ãf‹C ‰B,‹C‰B0ÇB4ÆB8ÆB9°ƒÄ[^_À~9t ‰4$ÿˆ‚äkÇD$i>âkë¨vÆF9F,‰D$ÇD$‰$ÿ‰Çé&ÿÿÿÇF4‰F0ÆF8°ë…f‰4$ÿˆ‚äké3ÿÿÿf‰4$ÿˆ‚äkÇD$Z>âk¡à‚äk‹‰$ÿÄ‚äk1ÀéKÿÿÿWVSƒìPˆÓT$èoþÿÿ„Àtv‹D$HƒøtfƒøtHtVD$èÙ¸ÿÿ¸ÿÿÿÿƒÄP[^_ÿ°àk‹D$D…À~¶Û1öf‰t$‹D$@‰$ÿ×9ØtÅF9t$DèD$è—¸ÿÿ‹D$DƒÄP[^_ÿTàk뾿€àk붸ÿÿÿÿë¢fSƒì‰$ÿ ƒäk‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿ謸ÿÿ‰ØƒÄ[ÃUWVSƒìL‰D$‰T$$ˆL$‹r$ƒþ °ƒÄL[^_]Ëz(¸èžÿÿÿ‰D$,µèŽÿÿÿ‰D$ ‹T$,…Ò„°…À„¨1À‹T$,‰4‚@=uõ»l$0‰t$‰|$‹|$,ëf%ÿ‰4‡C;\$tB‹t$)Þ‹T$‹Dšü€|$t܉l$‰$‹T$ÿR0…À~Ò1Ò‹L•áÿ‰4B9ÂuîC;\$u¾‹t$‹|$€|$…±ÇD$¬àknþƒî‰t$(ÆD$ÇD$»‰ðØx$T‹—‰T$‹‡‰D$‹D$‰$ÿT$„ÀtuKuÖ­…öxs‹‰D$‹·‰D$‹D$‰$ÿT$„ÀtVN€|$…މt$(ÆD$‹\$K…íy‹D$,‹T$$‰B‹D$ ‰B°ƒÄL[^_]ÃÇD$@EàkéJÿÿÿfN‹\$KéYÿÿÿ‰è)ð‹T$ ‰M€|$uN…öxÿD$ÆD$ë‹t$(…öyì…íx™‹T$ ‰è)ð‰ªMNƒýÿuòë…ÆD$érÿÿÿ‹D$,‰$‹ƒäkÿÓ‹D$ ‰$ÿÓ1ÀéüýÿÿvUWVSƒì<‰Æ‰Ó‰L$‹(‹R$‰ÈÐ;D$PXöC,€„Ü‹{…ÿtU‹E8‰D$ ‹K(‹[‰\$rÿµ‹‰D$‹D$P)Љ$‹E4ƒø„¾ƒø„ÍH„†¸ÿÿÿÿƒÄ<[^_]Ëu8‰t$‹K(‹‹D$P)Ћu4ƒþ„Vƒþ„NuÈ‹t$t$‹l$Å9îv ë´fF9õr­¶9Ãuôƒúv!¶F;Auæ¸ë v¶<;üÿÿ@ÁàèŠÖÿÿ‰Æ‰CT…À„üÿÿ‹E$@ Áá1À‰÷óªéýÿÿ‹T$,éwûÿÿUWVSƒì|‰D$(‰T$,¶¬$˜¶¼$ Šœ$¤¶´$¨T$4‰È‰L$$è Ôÿÿ„À‹L$$u 1ÀƒÄ|[^_]Ãæÿ‰t$¶Û‰\$çÿ‰|$‹„$œ‰D$åÿ‰l$ ‹„$”‰D$‹„$‰D$D$4‰$‹T$,‹D$(è¦ùÿÿ„Àt °ƒÄ|[^_]ÃD$4èŽÿÿ1ÀƒÄ|[^_]Ãì‹T$ ‹D$$…ÀxQ;B0L…Àt(D@ý‹J4Á‹P‰T$‹‰D$Ç$ˆ7âkÿƒäkƒÄËB$‰D$‹B ‰D$Ç$ˆ7âkÿƒäkƒÄÃ1Ò¸òÿÿÿèøÿÿ1ÀƒÄÃfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹@‰D$ÇD$ª5âk¡ƒäkƒÄ ÿà‹B$ëäv1Ò¸òÿÿÿè ÿÿ1ÀƒÄ Ãfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹‰D$ÇD$ª5âk¡ƒäkƒÄ ÿàf‹B ëãv1Ò¸òÿÿÿèHÿÿ1ÀƒÄ ÃfWVSƒì ‰Ã‰ÖIt‰ÐèXÔÿÿ‰Ç…À„Š…ö~'f‹fúÿwL1É1Àëf‰Áf‹Cfúÿw7ˆ@9ðuë‰t$‰|$Ç$—>âkÿƒäk‰<$‰D$ÿƒäk‹D$ƒÄ [^_Ãf‰<$ÿƒäk1ÀƒÄ [^_Ãf‰T$‰D$Ç$—>âkÿƒäkƒÄ [^_Ã1ÀëÃUWVSìŒD$|‰D$ D$x‰D$ÇD$š>âk‹„$¤‰$ÿ€‚äk…À„†öD$xu‹t$|ÿ‰ðÄŒ[^_]ÃT$0‹D$|èKÑÿÿ„À„W‹D$d‰D$ ƒø„ºƒøt!H„¾D$0襋ÿÿ1ö‰ðÄŒ[^_]ÃfÇD$(°àk‹D$x¨ u¨…œ¨€…À¾ÀÊákƒ|$ „ ƒ|$ „…ƒ|$ u¤ÇD$dàköÄ@‹D$`t@¯D$ èÀÒÿÿ‰Ã…Àt€öD$y@„¿‹v8‰t$,‹t$`…öŽf1í1ö|$l‰l$‹D$\‰$ÿT$(‰|$‰$ÿT$,‰D$…À~,1Ò‰l$$‰Ý‰Ó‹Ÿ‰D$‰D$‰,$ÿT$C;\$uä‰ë‹l$$t$E9l$`§€|$h„‰t$‰$ÿ„ƒäk‰Æ‰$ÿƒäkD$0胊ÿÿ‰ðÄŒ[^_]Ãf1ö‰ðÄŒ[^_]Ën4‹t$`…ö~ª1ÿ‹t$(‰l$‹l$v‰|$‹D$\‰$ÿÖ‰$ÿT$‰D$‰|$‰$ÿÕG‹D$`9øÖ‰Æéhÿÿÿv‹L$ ‰ò‰Øè'ýÿÿ‰ÆékÿÿÿÇD$(€àkégþÿÿvÇD$(TàkéWþÿÿv¾ËákégþÿÿfÇD$¼àké}þÿÿvÇD$àkémþÿÿv¾@Ëáké;þÿÿ1öéôþÿÿvUWVSƒìL‰D$$‰T$(‰Î‹\$`‹l$d‹D$hƒèƒø‡?‹<…¬Wâk‹…¸Wâk‰D$,‹D$$‹€œ ‰D$ ‹@,9뾉l$‰õ‰Æë fC;\$„¡‰\$‰,$ÿ׉$ÿÖ„Àtã‰î‹l$‹T$ ‹R<‰T$‰\$‰4$ÿ×T$0‰T$‰$ÿT$‰D$…ÀŽÛC‰D$ 1ÿëvG;|$„’‹D¼0‰D$‰\$‰4$ÿT$,‹T$h‰T$‰l$‹D$ ‰$‰ñ‹T$(‹D$$èÿÿÿ…Àt¼ƒÄL[^_]Éî‹l$‹D$$€¸* u]‹L$h‰ê‰ðè”ûÿÿ‰Ã…Ût_‰\$‹T$(‰$ÿHƒäk‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄL[^_]ÃvÇD$,dàk¿TàkéÁþÿÿf‰l$‰4$ÿ„ƒäk‰Ãë¡1Àë̸÷ÿÿÿëÅSƒì‰T$‰$ÿƒäk‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿè<ˆÿÿ‰ØƒÄ[ÃUWVSƒì,‰Æ‰ÍˆT$¸0èGÏÿÿ‰Ã…Àth¹01À‰ßóª‹D$D‰C$…ÀuwÇC(ŠD$ˆC.‰èƒàˆC/Áå f‰k,‹D$@‰C ‹V<9V@|C‰F<…Àt)Áâ‹FDèVÿÿÿ…ÀtZ‰FD‹V@‰B‰V@‰ØƒÄ,[^_]ÃvÇF<º@ëÌf‹FDëÔvÁàè¬Îÿÿ‰C(…Àu1À‰$‹5ƒäkÿÖ‰$ÿÖ1Ûë¶v‹C(ëävWVSƒì‰Ã‹P9Sr~Š‹H¶ÂƒèƒøIwZ¾°`WâköÁt1ö¶Ò‹CÇD$‰4$èÞþÿÿ…ÀtM‹‹z‹H(‰9ƒÂ ‰‹S‹:…ÿt*‰B‰C…ötÿC ¸ƒÄ[^_Ã1ö멸ƒÄ[^_ÉëÕ¸ÿÿÿÿëݸ÷ÿÿÿëÖfWVSƒì‰Ã‹P 9S‚†Š‹H¶ÂƒèƒøIwb¾°`WâköÁt1ö¶Ò‹CÇD$‰4$è:þÿÿ…ÀtU‹H(‹‹z‰9‹z ‰yƒÂ‰‹S‹ …Ét,‰B‰C…ötÿC ¸ƒÄ[^_Ãv1ö롸ƒÄ[^_ÉëÓ¸ÿÿÿÿëÛ¸÷ÿÿÿëÔfUWVSƒì,‰Ã‰Õ‹‹H‹pµ ‰T$Â9S‚ΊˆD$¶ÀƒèƒøIvv1ÿ¶T$‹C‰t$‰<$èˆýÿÿ…À„¦‰ê„ÒufH,…öt‹h(‹;1Ò‹L— ‰L•B9òuó‹T$‹S‹:…ÿt`‰B‰CŠD$ƒèG<vs ¸ƒÄ,[^_]Ãv¾¸`Wâk¯þ뀋K …öt%ƒþv(º«ªªª‰ð÷âÑêʉS ¸ƒÄ,[^_]Ãv1Òëç‰럺ëܸÿÿÿÿ맸÷ÿÿÿë vUWVSƒì‰Ã‹Š‹H¶ÂƒèƒøI‡í¾°`WâköÁt1ö¶Ò‹CÇD$‰4$èüÿÿ‰Ç…À„僋C‹(…í„ljx‰{‹k ‹‹ƒè ƒø:v¸ÿÿÿÿƒÄ[^_]Ãÿ$…¨>âkº‰Øèdþÿÿ…À„‹;SsÏ‹ƒøuÀƒÂ‰‹‰Glj{‰k …ötPE‰k ¸ƒÄ[^_]Ãv‰Øè!ÿÿÿƒøt¸ë‘f‰Øè]ýÿÿƒøt¨ëf‰Øè­üÿÿƒøt˜énÿÿÿv1öéÿÿÿ¸ƒÄ[^_]Ãv‰8é5ÿÿÿ1ÀéEÿÿÿ¸÷ÿÿÿé;ÿÿÿUWVSƒì‰Î‹\$0‰×JþƒùIwI¾Š^Wâk‰Í¯î‰ù¶Ñ‰t$‰,$1Éè^ûÿÿ…ÀtfH,…ö~‹x(1Òv‹ “‰ —B9òuõƒÄ[^_]Ã1íë¿UWVSƒì‰Ã…Àtk‹@(4•,0‹}B‰T$ …ÿt9 tM1Òë9L•tBB9úuõ‹S$•‰L$è®úÿÿ…À‹L$t,ÿC$‰C(Æ‹‹T$ Ú‰ C‰°ƒÄ[^_]Ãf°ƒÄ[^_]Ã1ÀëôfUWVSƒì‰Å‰×‰Î‹\$0…Ût;‹C,¨@u4ƒÈ@f‰C,ŠC.ƒè‰{‹)‰kDmÁà‰D$‹D$@‹‰D$‰<$è™ëÇC ÿÿÿÿ°ƒÄ,[^_]ËzëÊv1ÀƒÄ,[^_]ÃfWVSƒì‰Ç‰Ö‰ËIC‰$‰øèXÿÿÿ„Àt4KVC‰$‰øèAÿÿÿ„Àt‹C(‰F(‹C,‰F,‹C0‰F0°ƒÄ[^_Ãf‹V‰øèVhÿÿ‹V‰øèLhÿÿ1ÀƒÄ[^_ÃvUWVSƒì‰Å‹¸Ü ‹G‰D$…Àt~‹E‰D$‹@‰$…À~4‹]H‹O 1À1Ò‰|$ v‹4‹|‰4‰|‹t‰tBƒÀ;$uá‹|$ ‹D$‹P$…Ò~.1Û1ö‰$‰Ã‹ $O‹$UT1ÀèÿÿÿFƒ$49s$ã‹G‰D$‹‰…Ü ‹D$ƒÄ[^_]ÃUWVSƒì‰D$‰Ó‹‰$‹‰T$ ‹€Ü …À„ª‹h…턳‰]…Û„€‹D$ ‹@‰D$…À~-‹] ‹$‹JH1À1Ò‹4‹|‰4‰|‹t‰tBƒÀ;T$uà‹L$ ‹Y$…Û~91Û1ö‰Ïë FƒÃ49w$~'‰Ù‹$HT‹UÚ‹D$è5þÿÿ„ÀuÝ1ÀƒÄ[^_]Ãv‹$‰ªÜ °ƒÄ[^_]Ë$‹¨Ø …í…Pÿÿÿvº‹D$èÞÀÿÿ‰Å…Àt·‹T$ ‹B@Áâ‹D$èÂÀÿÿ‰E ‹L$ ‹A$@Áâ‹D$è¦Àÿÿ‰E‹U …ÒtQ…ÀtM‹L$ ‹A @Áá1ö‰×‰ðóª‹T$ ‹B$@ Áá‹U‰×‰ðóª‹$‹‚Ü ‰EÇE…Àt/‰hé¬þÿÿ‹D$èfÿÿ‹U‹D$èúeÿÿ‰ê‹D$èïeÿÿ1Àéÿÿÿ‹ $‰©Ø éwþÿÿfUWVSƒì‰Å‹D$0‹]8‰\$ 8L$8”D$ ‹½œ ‹2‹U4ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ërëC9ët¶ ‰ò‰øè“eÿÿ8D$ t鉨+D$ ƒÄ[^_]Ãv‹T$ ‚‹D$4,‚9ër ëƒÃ9Ýv‹ ‰ò‰øèVeÿÿ8D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹T$ B‹D$4,B9ër ëƒÃ9Ýv· ‰ò‰øèeÿÿ8D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‹D$0‹]8‰\$ 8L$8”D$ ‹½œ ‹2‹U4ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ëwëK9ët¶Kÿ‰ò‰øè–dÿÿ8D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹T$ ‚‹D$4,‚9ëw ëƒë9Ýs‹Kü‰ò‰øèYdÿÿ8D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹T$ B‹D$4,B9ëw ëƒë9Ýs·Kþ‰ò‰øèdÿÿ8D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰D$‰Ë‹|$@€z.Av 1ÀvƒÄ,[^_]öJ.ÿ$HCâkÇD$‰Ù‹D$+H@9ùv‰ù‰ß)ω<$‰Ù‹D$è|ÿÿ)ÉØë½ÇD$‰Ù‹D$+H@9ùv‰ù‰ß)ω<$‰Ù‹D$è£yÿÿ)ÉØëÇD$‹D$‹HD)Ù9ùv‰ùÙ‰ $‰Ù‹D$èyxÿÿ)Øé^ÿÿÿfÇD$‹D$‹HD)Ù9ùv‰ùÙ‰ $‰Ù‹D$èzÿÿ)Øé.ÿÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‰Ù+H@‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èè}•ÿÿ)ÉØéØþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$诓ÿÿ)ÉØéžþÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èá‘ÿÿ)Øéfþÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‹@D)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèËÿÿ)ØéþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$è›ÿÿ)ÉØéâýÿÿfŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$è—üÿÿ)ÉØé¦ýÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èaûÿÿ)ØénýÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èõÿÿ)Øé6ýÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‰Ù+H@‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰è襌ÿÿ)ÉØéàüÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$è ‹ÿÿ)ÉØé¦üÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èy‰ÿÿ)Øénüÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‹@D)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èè;ˆÿÿ)Øé$üÿÿ‰Ú‹D$+P@9úv‰ú‰Ù)ÑÇ$‰Ú‹D$è3Eÿÿ)ÉØéöûÿÿf‹D$‹HD)Ù9ùv‰ùÙÇ$‰Ú‹D$è5Dÿÿ)ØéÊûÿÿf‹D$‹P8‹p4ÇD$‰Ø‹L$+A@9øv‰ø‰ß)lj<$‰Ù‰ð迆ÿÿ)ÉØéŽûÿÿf‰Ø‹L$+A@9ø†{ûÿÿ‰øétûÿÿ‹T$‹BD)Ø9ø†cûÿÿëæ‹D$‹P8‹p4ÇD$‹@D)Ø9øv‰ø؉$‰Ù‰ð艅ÿÿ)Øé.ûÿÿfUWVSƒì\‰D$LˆL$;‹*‹B‰D$4‹Z‹D$L‹‰D$,„Ét‹P`‰T$<‰×+x@9|$4~'1í‰èƒÄ\[^_]ËD$,‹@`‰D$<‹T$,‹zD)Ç9|$4Ù‹D$,‹€  ‰D$ ‹T$,‹r8‹‚œ ‹@4‰D$$‹D$LèC^ÿÿ‹D$,‹@4‰D$@ƒø„2ƒø„þHuŽÇD$(dàk9ß~‰ß‹D$@¯Ç襟ÿÿ‰Ã…À„‹T$,‹‹@8‹@ ‹¨‰D$H…À„ø9|$4ê‰ú÷Ú‰T$0f€|$;„­‹D$0‰D$D…ÿ~91í‹T$<ЉD$‹D$è‰D$‰4$ÿT$ ‰$ÿT$$‰D$‰l$‰$ÿT$(E9ýuÔ‹D$@‰D$‰|$Ç$‰Ù‹T$H‹D$,èÎÍÿÿƒøtM…ÀuOÿD$09|$4Žvÿÿÿ‰Å‰$ÿƒäk‹D$Lè]ÿÿ‰èƒÄ\[^_]ÃÇD$(¼àkéÿÿÿv‰|$D1ÀéPÿÿÿ‰Å‹D$D‹T$,B`ë¹ÇD$(àkéÕþÿÿ1í먉$ÿƒäk‹D$Lèº\ÿÿ½þÿÿÿé=þÿÿWVSƒì‰Æ‰ÓƒùŽ¥¡0Äák‰$ÿ8ƒäkÇD$ Äák‰$ÿ4ƒäk‰Ç…Àth‹C‰G‰G ÇG‰wÇG8ƒÿ‹V …Ò~N‹CHè>Àÿÿ‰G4…Àto‹V ‰W0‹C@‰G‹CD‰G€»- tD‹C`‰G ‹C\‰G$‹CL‰G(‹CP‰G,‰øƒÄ[^_ÃvÇG4ë»vuB‹= ƒäkÿ‰øƒÄ[^_ËC\‰G ‹C`‰G$ëºf‹H‰…Àt1ÿë·v‹G‰<$ÿP1ÿë§v1Ò‰Èè;Vÿÿ1ÿë—vVSƒì$‹t$0Š\$4ˆ\$‹ ƒäk9Þt …É~;H ~$€|$t51Ò1À‰T$‰D$‰4$ÿDƒäkƒÄ$[^ÃfDIý‹B…Àt΋‹RëÒvÿ‰ØƒÄ$[^ÃfSƒì‰Ã‰È…Òxp;S0k…Òt?TRý‹K4Ñ‹ …Éx'‹R…Òx ‹C)‰T$)Á‰L$‹C ‰$ÿDƒäkƒÄ[ÃÿƒÄ[ËS‹C$)ЉD$‹C )ЉD$‹C ‰$ÿDƒäkƒÄ[Ãf1Ò¸òÿÿÿè@Uÿÿ1ÀƒÄ[ÃWVSƒì0‹t$@¡ ƒäk‰D$,D$,‰D$ÇD$ \ÌákÇD$PDâk‹D$H‰D$‹D$D‰$ÿ„‚äk…ÀtD‹F0‰$ÿlƒäk‰Ç…Àt4‹^0…Û~-1Ûë v‰DŸ9^0~C‹L$,‰Ú‰ðèõþÿÿ…Àuå‹H‰…Àt 1ÿ‰øƒÄ0[^_ËG‰<$ÿP1ÿ‰øƒÄ0[^_ÃSƒì‰Ã‹‚¬ …Àt‰$ÿhƒäk‹H‰…ÀtƒÄ[ËC‰$ÿPƒÄ[ÃfVSƒì$‹\$0‹C‹p0…ötA‹C,…Àx:‰D$Ç$ª5âkÿƒäk‰Æ‰D$‹C‹@0‰$ÿ˜‚äk‹J‰…Òt…Àu ÿ°‚äk¡ ƒäkÿƒÄ$[^Ãv‹V‰4$‰D$ÿR‹D$ëÒWVSƒì‰Æ‰$ÿè‚äk‰Ãƒøÿt ‰ØƒÄ[^_Ãv‹=¼‚äkÿ×…Àtèÿ°‚äk‰4$ÿƒäk‰ÃƒøÿuÒÿ×…ÀtÌ1Ò¸ñÿÿÿèˆSÿÿë¾fUWVSƒì,‰Ã‰Ö‰ÍŠD$@ˆD$‰Èèˆÿÿÿ‰Çƒøÿt9…Àx‹9ø|‰øƒÄ,[^_]À|$t ‹|8…ÿàv¿ÿÿÿÿ‰øƒÄ,[^_]ἂäk‰D$ÿÐ…ÀtÍ‹‹5°‚äk‹x,…ÿt;ÿÖ‰l$‹‹@,‰$ÿ0ƒäk‰Ã…Àt!è ÿÿÿ‰Ç‹H‰…Àt ƒÿÿu„ÿT$…À„xÿÿÿÿÖ¿ÿÿÿÿélÿÿÿv‹C‰$ÿPëÕWVSƒì‰Ã‰×‰Î‹B÷@T€t$S0CÇ$‰ùèÿÿÿ‰D$‰$ÿÖƒÄ[^_øóÿÿÿènRÿÿ1ÀƒÄ[^_ÃUWVSƒì,‰D$‰Ö‰L$‹j…íu ÇD$‹D$‰$ÿT$‰Ç‰øƒÄ,[^_]ÃýtK‰,$ÿlƒäk‰Ç…Àtá…í~Ý1Ûë ‰DŸ C9ëtЋTž ‹L$‹D$èBÿÿÿ…Àuâ‹H‰…Àt%1ÿ‰øƒÄ,[^_]ËR ‹L$‹D$ƒÄ,[^_]éÿÿÿ‹G‰<$ÿP1ÿë€v¹”0àk‹T$‹D$é>ÿÿÿf¹¨1àk‹T$‹D$é*ÿÿÿf¹ 2àk‹T$‹D$éÿÿÿf¹´6àk‹T$‹D$éÿÿÿf¹X àk‹T$‹D$éîþÿÿf¹Ì àk‹T$‹D$éÚþÿÿf¹$¡àk‹T$‹D$éÆþÿÿfWVSƒì‰Ã‰×‰ÎŠL$ ‹B÷@T€t$S0C¶É‰ $‰ùèuýÿÿ‰ñ‰Â‰ØƒÄ[^_é ûÿÿ¸óÿÿÿèÞPÿÿ1ÀƒÄ[^_ÃUWVSƒì,‹D$@‰D$‹t$D‹n…íu‹  ƒäk1Ò‹D$ƒÄ,[^_]éÚúÿÿfƒýtS‰,$ÿlƒäk‰Ç…Àt:…í~61Ûë ‰DŸ C9ët)‹Tž Ç$‹  ƒäk‹D$è9ÿÿÿ…ÀuÙ‹H‰…Àt01ÿ‰øƒÄ,[^_]ËV ÇD$@‹  ƒäk‹D$ƒÄ,[^_]éÿþÿÿv‹G‰<$ÿP1ÿëÅvUWVSƒì,‰D$ÿœ‚äk‰Å…À„Ó‹T$‹B‹@,…À„ÁÇD$ÇD$ZDâk‰$ÿƒäk‰Ã…À„‘‹@…ÀŽÍ‹C ‹0…ött1ÿë…ÀxlG9{޲‹C ‹4¸…ötXÇ$‹  ƒäk‰ò‹D$èTþÿÿ…À„œ‰D$‰t$‰,$‰D$ÿ¤‚äk‹T$‹ I‰ …Éu¦‹J‰$‰D$ÿQ‹D$…Ày•‹H‰…Àt/‹EH‰E…Àt 1í‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãv‹C‰$ÿP‹EH‰E…ÀuÈëÒf‹H‰…Àu½‹C‰$ÿP벋H‰…Àu“‹F‰4$ÿPëˆUWVSƒì,‹t$@ÇD$_Dâk‹D$D‰$ÿ,ƒäk‰Å…À„«‹F0@‰$ÿlƒäk‰Ç…À„‰‹F0…Àx*1Ûf‹  ƒäk‰Ú‰ðè¡øÿÿ‰D$‰\$‰<$ÿtƒäkC9^0}Ú‰ðè7þÿÿ‰Ã…Àt9‰D$‰|$‰,$ÿƒäk‹J‰…Òtc‹J‰…Òtt‹UJ‰U…Òt3ƒÄ,[^_]Ãv‹H‰…Àu ‹G‰<$ÿP‹EH‰E…Àtc1ÀƒÄ,[^_]ËU‰,$‰D$ÿR‹D$ƒÄ,[^_]Ãv‹S‰$‰D$ÿR‹D$‹J‰…ÒuŒ‹W‰<$‰D$ÿR‹D$‹UJ‰U…Ò…wÿÿÿ먋E‰,$ÿP1ÀƒÄ,[^_]ÃUWVSƒìL¡ ƒäk‰D$Rÿÿ…ÀtZ‰D$‰t$‰,$‰D$ÿ¤‚äk‹T$‹ I‰ …Éu˜‹J‰$‰D$ÿQ‹D$…Ày‡v‹H‰…ÀtC‹EH‰E…Àt 1í‰èƒÄ,[^_]ËH‰…Àu׋F‰4$ÿPëÌ‹E‰,$ÿP1í‰èƒÄ,[^_]Ãv‹C‰$ÿP‹EH‰E…Àu´ëÒf‹H‰…Àu©‹C‰$ÿPëžVSƒì‰Ã‰Ð; ƒäkt‰$ÿè‚äkƒøÿt ƒÄ[^Ãv‹5¼‚äkÿÖ…Àt,ÿ°‚äk‰$ÿƒäkƒøÿu×ÿÖ…Àt1Ò¸ñÿÿÿè6Iÿÿ1ÀëÁf¸ÿÿÿÿë¸Sƒì; ƒäkt‰$ÿƒäk‰Ãƒøÿt1À…Û•ÀƒÄ[øƒÄ[Ãfÿ¼‚äk…ÀtÞ1Ò¸ýÿÿÿèÞHÿÿ¸ÿÿÿÿëÒvUWVSƒìl‹´$€¡ ƒäk‰D$P‰D$TÇD$X‰D$\D$\‰D$ D$X‰D$D$T‰D$D$P‰D$D$L‰D$ÇD$ €ËákÇD$sDâk‹„$ˆ‰D$‹„$„‰$ÿ„‚äk…À„Ü1Ò‹D$Pè·þÿÿ‰Çƒøÿ„Ôºÿÿÿ‹D$Tèžþÿÿ‰Åƒøÿ„Ÿ‹D$\èòþÿÿ‰Â…Àˆš¡Çák‰$‰T$<ÿ8ƒäkÇD$Çák‰$ÿ4ƒäk‰Ã…À‹T$ûÿÿ1Ûééûÿÿvfƒ,ˆM‹O(‹W$„$‰D$‹CD‰D$‰4$‹t$D‹èwÿÿ‰Æ…öˆ(v9|$@…0þÿÿ‹T$@‹…À„…wŒ$ø‰ $‹Œ$‰ØèÅ_ÿÿ„À…ewFŠƒ- „À„Yl;s@qùÿÿ1ÛéTûÿÿfÇD$‰,$‰ñ‰ú‰ØèŠ[ÿÿ‰Æ9ÅŒ€úÿÿ1Ûé+ûÿÿ‹“  ‰T$l‹S8<ÀƒàHMÿ‰L$8NxA‰|$H‰\$P‰l$\‹|$l‰Õ‰Ãëv9t$8„qZÞx‰t$‰,$ÿ׃ø uä‹|$H‹\$P‹l$\FéúÿÿfÇD$‰,$‰ñ‰ú‰ØèºWÿÿ‰Æ9Åðùÿÿ1Ûé›úÿÿÇD$‰,$‰ñ‰ú‰ØèÖYÿÿ‰Æ9ÅÈùÿÿ1ÛésúÿÿÇD$‰,$‰ñ‰ú‰ØèfXÿÿ‰Æ9ÅŒ ùÿÿ1ÛéKúÿÿŠO/‹W(ÇD$‰l$‰4$‰Øèànÿÿ‰Æ9Årùÿÿ1ÛéúÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@‰|$P‰Çë 9õ„@t$8‰t$‰$ÿ×8D$Huåé`ýÿÿŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@ ‰|$P‰Çë 9õ„t$8‰t$‰$ÿ×8D$Huåéýÿÿ„À„ˆ‹C<9Æý‹Cd9Æò1Ûémùÿÿv„À„<;s<„§øÿÿ1ÛéRùÿÿ‹‹  ‹S8<ÀƒàH‰D$8;s<„‚øÿÿ‰|$P‰\$H‰Ï‰Óë9õ„ Xt$8‹T$H;r<„X‰t$‰$ÿ׃ø uÙ‹|$P‹\$Hé@øÿÿ‹S8‹C4ÇD$‰,$‰ñèügÿÿ‰Æ9ÅŒøÿÿ1ÛéÉøÿÿvfƒ,y ;³ „øÿÿ‰,$‰ñ‰ú‹D$Dè1—ÿÿ‰Æ…À‰ç÷ÿÿ1Ûé’øÿÿ‹S8‹C4ÇD$‰,$‰ñèÈfÿÿ‰Æ9ž÷ÿÿ1Ûéiøÿÿv‹O(‹S8‹C4‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èDhÿÿ‰Æ9Å~÷ÿÿ1Ûé)øÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@‰|$P‰Çë 9õ„Dt$8‰t$‰$ÿ×8D$HuåélûÿÿÇ$‰é‰ò‰Øèþ$ÿÿ‰Æ9ÅŒ÷ÿÿ1Ûé¿÷ÿÿ‹O(‹S8‹C4‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8è4nÿÿ‰Æ9ÅÖöÿÿ1Ûé÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè mÿÿ‰Æ9ÅŒ¦öÿÿ1ÛéQ÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèÚÿÿ‰Æ9ÅŒvöÿÿ1Ûé!÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèèØÿÿ‰Æ9ÅFöÿÿ1ÛéñöÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèÔoÿÿ‰Æ9ÅŒöÿÿ1ÛéÁöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øènÿÿ‰Æ9Åæõÿÿ1Ûé‘öÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒœ ‹@‰|$P‰Çë 9õ„¤t$8‰t$‰$ÿ×8D$HuåéÔùÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒœ ‹@‰|$P‰Çë 9õ„Xt$8‰t$‰$ÿ×8D$HuåéùÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè@hÿÿ‰Æ9ÅŒ.õÿÿ1ÛéÙõÿÿvÇ$‰é‰ò‰Øè""ÿÿ‰Æ9Åõÿÿ1Ûé³õÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè”fÿÿ‰Æ9ÅÚôÿÿ1Ûé…õÿÿv‰Æ9C@ŽÅôÿÿ1Ûépõÿÿf‹„$ø‰ñ‹´$üéþ÷ÿÿv‹l$4‰u`»‰ØÄ,[^_]Ãv‰Œ$é`õÿÿ1Ûé'õÿÿ‹s<9sD„hôÿÿ1Ûéõÿÿ…ö„Xôÿÿ1Ûéõÿÿ‹Cd9Æ~‹C<9Æ~ 1Ûéíôÿÿv‰Æ9CD-ôÿÿ1ÛéØôÿÿf9ÆŽ›÷ÿÿ1ÛéÇôÿÿ1Ûé¿ôÿÿ1Ûé·ôÿÿ1Ûé¯ôÿÿ1Ûé§ôÿÿ1ÛéŸôÿÿ1Ûé—ôÿÿ1Ûéôÿÿ;³ …§øÿÿ‹ƒ$ ‰„$é½øÿÿf;³ …·öÿÿ‹ƒ$ ‰„$éÍöÿÿ‹K`‹C@‰$‹D$DèÔŒÿÿ…Àˆ›q‰ƒ ‹–€‰Á+J$‰‹$ ‹V|…ÒˆØõÿÿ‹C`9ÂÎõÿÿ‰Ðé¸ñÿÿ‹K`‹CD‰$‹D$Dè܃ÿÿ‰Â…ÀˆBq‰“ ‹†€‹@$Љƒ$ ‹F|…Àˆ†õÿÿ)‹C`9ÂŒ|õÿÿ‰Ðéuõÿÿ‹J(‹R$„$‰D$‹C@‰D$‹C`‰$‰ØèOpÿÿ…Àˆíp‰ƒ ‹”$‰“$ ‹V|…Ò‰Oÿÿÿé"õÿÿ‹J(‹R$¼$‰|$‹CD‰D$‹C`‰$‰Øè›nÿÿ…Àˆˆp‰ƒ ‹”$‰“$ ‹V|…Òˆ×ôÿÿ)Љ‹C`9ÂŒËôÿÿ‰ÐéÄôÿÿ‹K`‹CD‰$‹D$Dèy~ÿÿ‰Â…À‰ýþÿÿ1ÛéÚòÿÿ‹K`‹C@‰$‹D$DèV‘ÿÿ…Àˆo‰ƒ ‹–€‰Ç+z$‰»$ ‹V|…Ò‰Šþÿÿé]ôÿÿ‹„$9D$XŒè\öA- …#c‹…( @f‰…( f…À„‰<‹•| ‹‚ H ÀЉ„ €{ ]†Š-»ÿÿÿÿ‰ØÄ,[^_]Ë„$‰D$‰,$‹\$hÿS‹”$:B/„§`öB- t‰Œ$„$‰$‹T$d‹D$DèË—ÿÿ„À„aq‹„$…À…òÿÿéOÿÿÿv‹„$9D$p{[öA- „1ÿÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè'–ÿÿ„À„o‹„$…À…¤ñÿÿéïþÿÿv‹„$9D$XŒI\öA- „ÑþÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèÇ•ÿÿ„À„ûp‹„$…À…Dñÿÿéþÿÿv‹„$‰D$‰,$‹t$hÿV‹”$:B/„G`öB- „]þÿÿŒ$„$‰$‹T$d‹D$D蟖ÿÿ„À„Sp‹„$…À…Øðÿÿé#þÿÿv‹„$‰D$‰,$‹\$hÿS‹”$:B/„aöB- „ñýÿÿŒ$„$‰$‹T$d‹D$Dè3–ÿÿ„À„ÿm‹„$…À…lðÿÿé·ýÿÿv‹„$‰E`‹S(¹‹D$DèåØÿÿƒøŒÕl„Šýÿÿ‹E`‰„$‹„$‹‰„$éðÿÿ‹„$‰E`‹C(‹8‹X‰\$4‹H‹D$D‹‹s`‰ò+S@9T$4:ýÿÿ‹ƒ¨ ‰D$L‹C8‰D$8‹D$D‰T$0‰L$,è47ÿÿ‹‹@8‹@ ‹¸‰D$<…À‹T$0‹L$,„Og‰Ï9Ñ~‰×9|$4/g)þ‰l$Hëfv‰t$‹l$8‰,$ÿT$L‰|$‰$ÿ„ƒäk‰Å…í„ g‰l$‹T$<‰$ÿHƒäk‹MI‰M…É„ÅNƒø„ÒN…À…"nOF9|$4½f€»* u”‹k4‰t$‹D$8‰$ÿT$L‰é‰úè¡£ÿÿ‰Å듺‹D$Dèßÿÿ„À„bk‹„ ÇD$…° ‰D$‰$蹋„$‹@(‹‰C‹„$‰C•´ ¹1À‰×óªÇ…Ä ‹„$‰…° ‹‰„$é|îÿÿ‹„$‰D$‰,$‹t$hÿV‹”$:B/„ _öB- „ûÿÿŒ$„$‰$‹T$d‹D$Dèß“ÿÿ„À„gl‹„$…À…îÿÿécûÿÿv‹C(‹0‹]Tº‹D$Dèæÿÿ„À„}jv†ƒ‹…„ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹… ‰C0‹”$‹B(‹x…ÿ…(1ÿ‹@…À„}T1À‰ú„Ò„ÏR„À…¢e‹„$ø‰„$‹„$ü‰„$éZíÿÿ‹C(‹0‹‹D$DèBÍÿÿ„À„Þi‹]‹K…É~$‹EH1ÒvÇÿÿÿÿÇ@ÿÿÿÿÇ@ÿÿÿÿBƒÀ9Êuä‹K$…É~)‹ET1ÒÇ@Ç@ ÿÿÿÿÇ@Ç@ ÿÿÿÿBƒÀ49ÊuÜ‹\$T‹CX‹ð‹‰„$º‹D$D诎ÿÿ„À…»ìÿÿ»ðÿÿÿéìÿÿ‹„$9D$XŒ›YöA- „åùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèÛÿÿ„À„k‹„$…À…Xìÿÿé£ùÿÿv‹„$9D$XŒ³VöA- „…ùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè{ÿÿ„À„³i‹„$…À…øëÿÿéCùÿÿv‹´$Œ9´$„%\öC- „"ùÿÿŒ$„$‰$‹T$d‹D$Dèd‘ÿÿ„À„&i‹„$…À…ëÿÿéèøÿÿ‹„$;„$Œ„Q;Ed„ QöC- „ÁøÿÿŒ$„$‰$‹T$d‹D$Dè‘ÿÿ„À„wi‹„$…À…<ëÿÿ釸ÿÿv‹„$9D$XŒ0VöA- „iøÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè_ÿÿ„À„j‹œ$…Û…Üêÿÿé'øÿÿvº‹D$D貌ÿÿ„À„ug‹…„ Š•2 ˆP‹…„ ‹• ‰‹D$D訔ÿÿ„À„=g‹| ‹» ‰|$4‹µŒ ‰t$<Š…0 ˆD$L‹½Ü ‹„$‰E`Æ…0 ‹„$‹PÇ$1É‹D$DèAæÿÿ‰Æ…Àˆzg‹„$‹P(‰èèRÿÿ‰½Ü ŠT$Lˆ•0 ‹|$<‰½Œ ‹|$4‰» ‰| N…=÷ÿÿ‹„$‹‰„$‹E`‰„$éÎéÿÿ‹C(‹D@ý‹UH‹H…ɈîY‹‰„$é¦éÿÿ‹D$Dè­“ÿÿ„À„ôe‹µ ‰t$8‹| ‹» ‰|$4‹µŒ Š…0 ˆD$<‹½Ü ‰|$LÇE@‹„$Œ‰ED‹„$‰E`Æ…0 Š•2 ˆT$H‹„$‹PÇ$1É‹D$Dè!åÿÿ‰Ç…Àˆge‹„$‹P(ƒÂ‰èè/ÿÿ‹L$p‰MD‹D$X‰E@‹T$L‰•Ü ŠL$<ˆ0 ‰µŒ ‹D$4‰ƒ ‰| ‹„$€x/„×MO„æc‹E‹X…Û„íõÿÿ‹‰…Œ éàõÿÿ‹„$9D$p’OöA- „ÅõÿÿŒ$ÇD$„$‰$‹T$d‹D$D軌ÿÿ„À„g‹”$…Ò…8èÿÿéƒõÿÿv‹C(‹D@ý‹UH‹x…ÿˆfõÿÿ‹p<þ‹\$h‹[8‰\$4‹„$ …ÀˆN‹„$‰D$‹t$|‰4$ÿT$t”$܉T$‰$ÿT$4‰Ã‹„$ ‰D$‰4$ÿT$t”$ì‰T$‰$ÿT$4‰Æ‹”$ ‹„$9WŽ 9Ë„$9D$pè@1ÛÇ„$;´$ŽD7‹„$9Ã~‹”$‹Œ”ì9Œ„Ü„Ð@‹„$ö@- „ÓZŒ$ÇD$”$‰T$‰t$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$Dèz‰ÿÿ„À„nZ€¼$„¤Z‹„$9à …Û~ÿ„$‹”$ ;´$þþÿÿB‰”$ 9WöþÿÿÇ„$ ÿÿÿÿ9ØŒÂóÿÿ9´$Œµóÿÿ‹„$‹‰„$éPæÿÿ‹C(‹D@ý‹]HËp…öˆ†óÿÿ‹P4ò‹\$h‹[8‰\$4‹Œ$ …ɈoL‹„$H‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰Ã‹„$ H‰D$‹|$|‰<$ÿT$t”$܉T$‰$ÿT$4‰Ç‹”$ ‹„$f;Ž£W…ÀŽÀ5‹„$…ÀŽíÿÿŒ$„$‰$‹T$d‹D$D者ÿÿ„À„œ]‹„$…À…¹ßÿÿéíÿÿ‹„$‰D$‰,$‹\$hÿS ‹”$:B/„çNöB- „ÕìÿÿŒ$„$‰$‹T$d‹D$Dè…ÿÿ„À„C_‹„$…À…Pßÿÿé›ìÿÿv1Ò‹D$Dè5¿ÿÿ„À„2\º ‹D$Dèÿÿ„À„\‹„$‹‰„$é ßÿÿ‹„$9D$p°KöA- „?ìÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè5ƒÿÿ„À„g]‹”$…Ò…²Þÿÿéýëÿÿ‹„$9D$pGöA- „áëÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèׂÿÿ„À„×\‹„$…À…TÞÿÿéŸëÿÿv‹„$9D$XŒ2FöA- „ëÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèw‚ÿÿ„À„¿]‹„$…À…ôÝÿÿé?ëÿÿv‹C(‹‰T$8‹@‰D$4‹uHºV‹D$Dè·ÿÿ„À„¢Z‹T$8|Rýþ‹…„ ‹L$8‰H‹L$4‰H ‹J‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9Btÿ… ‰B‹A(‹X…Û…UF‹‰„$éFÝÿÿ‹C(‹0v†‹MT™‹K,ÇD$Ç$‰ò‹D$Dè¬ÿÿ„À„+Z‹C(@‰C(‹½ ‹”$9{0„iK‹J(‹y9ø‚»G„´1ÿ‹A9C(‚ Y‹Œ$ƒÂ„$ø‰$‰èèÍ@ÿÿ„À•Á‰ú„Ò…4>„É…,>ÿK(éæéÿÿ‹¼$…ÿ…v@‹‰„$éyÜÿÿ‹„$‰D$‰,$‹\$hÿS‹”$:B/„?LöB- „šéÿÿŒ$„$‰$‹T$d‹D$DèÜÿÿ„À„¼Y‹œ$…Û…Üÿÿé`éÿÿ‹C,‹”$f…ÀˆqK‹s$‹|$p)×9þ~ öÄ „7éÿÿ‹„$ …ÀˆO‹[(ëfv‹„$ö@- „EPÇD$ ”$‰T$”$ ‰T$‰$Œ$‹T$d‹D$DèB„ÿÿ„À„þO€¼$„àO‹„$ 9ÆŽN‹„$9D$p~ˆ‰D$‹D$|‰$ÿT$t‹”$ ;“…iÿÿÿB‰„$ ÿ„$빋s,‹¼$‰|$‰´$9D$H‡B‹S‹t$<‰V,‹S ‰V(‹•| ‹Š I‰Š …Éu‹’ …Òt‰•| 9D$H‚¢Ïÿÿ‹„$‹‰„$é=Âÿÿ‹3‰ò‹D$Dè'¢ÿÿ…ötN‰èèüïþÿ‹C‰… ‹E‹@$‰D$4ƒøt/‹½” ~1Û1ö‹OÙ‹UTÚ1ÀèÇ ÿÿFƒÃ4;t$4u勉…” ‹…| ‹ J‰ …Ò…Ïÿÿ‹€ …À„Ïÿÿ‰…| éùÎÿÿ‹‰„$‹S R ŠÁá‹uTñ‰L$4‹y,‰¼$‹q(‰t$<‹p ‰t$8‹t$<¯t$8þ‹@(‹@‰D$LÇD$Ç$‰ñ‹D$Dè×ÿÿ„À„ 9‹”$‹B(‹L$<9H„d‹L$L¯L$8ù‰L$<‹zŠO/ˆL$H‹‰D$LöG- „O‹|$8÷߉|$H‰÷+|$8´$ø‰l$\‰\$P‰óë9|$<„¢‹”$|$H‰þ‰$‰ù‹D$\èË$ÿÿ„Àt×Ç$‰ù‹T$L‹l$D‹EèÆ>ÿÿ„Àuº‹l$\‹\$P‰ò+”$ˆl6‹¼$‰|$8‹G(;P‡Í<‹K‹|$4‰O,‹[ ‰_(‹| ‹» O‰» …ÿu‹› …Ût ‰| ‹\$8‹C(;P‚mÍÿÿ‹L$8‹‰„$‰´$éÀÿÿ‹MH‹CH@Ñ€{t‹s tvý ñ‹q…ötN‰q@Áà‹t$TFL€x‹t 9Btÿ ‹‰B‹C‰B‹…| ‹ J‰ …Ò…æÌÿÿ‹€ …À„ØÌÿÿ‰…| éÍÌÿÿ‹D$D‹‹ƒ° ‹x(‹³„ ‹N‰L$4‹öA-@„ ‹C@‰D$<ÇD$Lÿÿÿÿº‰Ø‰L$,èYîþÿ„À‹L$,„Y ‹D$<9D$4„K ÿF‹“¸ B‰“¸ ‹ƒÀ @‰D$<‰ƒÀ ‹GƒÄ ÿƒÌ ‹GƒÐ ŠFˆƒ2 ‹F ‹@(‹x 9»¼ r;Pr‹P9“´ r ‹|$<;xs vƃ2 ‹D$L¯FD$4‰„$‰Œ$€½2 „! Æ…2 éÂËÿÿf‹K‹SÇD$Ç$‹D$Dèæ~ÿÿ„À„ 6‹…| ‹ J‰ …Ò…Ëÿÿ‹€ …À„qËÿÿ‰…| éfËÿÿf‹K4I ±‹uT Ž‹s ‰q(‹s‰q,‹[‰Y0‰‚ …À…5Ëÿÿ‹‚ …À„'Ëÿÿ‰…| éËÿÿ‰èèÿÿ‹…| ‹ J‰ …Ò…úÊÿÿ‹€ …À„ìÊÿÿ‰…| éáÊÿÿ‹ ‰Œ$‹K‰Œ$‰‚ …À…o½ÿÿ‹‚ …À„a½ÿÿ‰…| éV½ÿÿf‹D$D‹‹ƒ° ‹x(‹³„ ‹F‰„$´‹‰”$°¾F‰„$ÔöB-@„¿ Ç„$Àÿÿÿÿ‹S@‰”$¸…Àx'ÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„Ñ‹SX9”$´•ˆ”$Øë v”$°‰ØèÊ;ÿÿ„À‹„$Ô…ÿ @‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$éŸÉÿÿv‰èèêþÿŠCˆ…2 ‹‰… ‹…| ‹ J‰ …Ò…iÉÿÿ‹€ …À„[Éÿÿ‰…| éPÉÿÿ‹D$D‹‹ƒ° ‹x(‹³„ ‹V‰T$4‰”$´‹‰„$°¾F‰„$Ô¾V ‰”$ÀÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„)‹T$4;SX•ˆ”$Øëf”$°‰Øè":ÿÿ„À‹„$Ô…o @‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$écÈÿÿv€¼$Š„Ì2‹M\‰Œ$€½- „Ë‹D$X9È„˜2‹T$@ŠB.‰|$8‹F‰„$¼¾F‰D$P‰„$ľF‰„$ȾF‰„$Ô¾N‰Œ$ÀÿŒƒ´ ÿ‹À ‹T$4|‚‹)“Ä ÿ‹Ì ‹?)»Ð €¼$Š„S‹|$L;{X•D$HŠT$HˆT$<ŠT$Hˆ”$Ø…ÉŽ ‹T$P…Ò• T$<ˆ”$Øëf”$°‰Øèf6ÿÿ„À‹„$Ô…S@‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$ ÿÿÿÿésÃÿÿ¾V9T$4•ÂéOýÿÿv‹D$Dèsýþÿÿ¬‚äk‰Ã‹D$DèBýþÿ„Û„UÃÿÿ»öÿÿÿé²µÿÿ‹„$ö@- „ü+Œ$ÇD$ÿÿÿÿ”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dè§\ÿÿ„À„¦+€¼$„²+‹„$…ÀŽÅ‹”$ é*Óÿÿf‹„$ö@- „6-Œ$ÇD$”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dè\ÿÿ„À„-€¼$„þ,‹„$9Æÿ„$‹”$ é_Úÿÿv‹F)ƒ¸ )ƒÀ ‹W¯Ð)“Ä )ƒÌ ¯G)ƒÐ ŠFˆƒ2 ‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$€½2 …ßõÿÿ‹„$…À„žÁÿÿ‹‰„$é@´ÿÿ‹\$8‹C‹t$<‰F,‹C ‰F(‹…| ‹ J‰ …Ò…aÁÿÿ‹€ …À„SÁÿÿ‰…| éHÁÿÿ²é5÷ÿÿ‹T$8ŠB.ƒè !ÿÿ„À„ÎFÿ9ÅXýÿÿ‹O(‹W$´$‰t$‰l$D$8‰$‹èlÿÿ…Ày¬é,ýÿÿ‹G$‰D$8‹D$p+D$89Æ~‰Æ9t$<Œóÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë+‰Æ+t$8Ç$‰ñ‹T$L‹è² ÿÿ„À„BN9÷Îüÿÿ‹L$8ñ‰<$‰ê‰Øè»@ÿÿ…Ày¿é³üÿÿ‹G(‹‰D$8¶|$H‰|$H‰ð‹t$|‰\$Pë ;|$<„ž‰øx‰D$‰4$ÿT$t;D$8”À¶À;D$HuÖÇ$‰ù‹T$L‹\$D‹è& ÿÿ„Àuº‹\$P‰þé]áÿÿv‹G(‹‰D$8‰ð‹t$|‰\$Pë ;|$<„5‰øx‰D$‰4$ÿT$t‹\$8‰\$‰D$‹\$h‰$èýùþÿ:D$HuÈÇ$‰ù‹T$L‹\$D‹è¯ÿÿ„Àu¬ë‡‹G(‹8‰\$8ë ;t$<„—N‰t$‹\$|‰$ÿT$t‰|$‰D$‹\$h‰$èŸùþÿ:D$HuÌÇ$‰ñ‹T$L‹\$D‹èQÿÿ„Àu°‹\$8éŠàÿÿ‹G(‹8¶D$H‰D$8‰\$Hë ;t$<„áN‰t$‹\$|‰$ÿT$t9ø”À¶À;D$8uØÇ$‰ñ‹T$L‹\$D‹èðÿÿ„Àu¼‹\$Hé)àÿÿv1Ûéw ÿÿ1Ûép ÿÿ‹|$P‰Ó鳟ÿÿ‹U‰,$‰D$0ÿR‹D$0éÊÿÿ‹U‰,$‰D$0ÿR‹D$0é%±ÿÿ‹l$H){`‹D$Dè§çþÿ‹E`‰„$‹„$‹‰„$é< ÿÿ‹l$H{`‹D$Dèxçþÿ‹E`‰„$‹„$‹‰„$é  ÿÿ»ðÿÿÿéÑŸÿÿ‹„$‹‰„$‰èè8ÿÿéçŸÿÿ1Û鮟ÿÿ1Ûé§Ÿÿÿ‹l$4‹\$TŠ›…ˆœ$‹é¿ŸÿÿH‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰ÃéÉïÿÿ‹„$˜‰D$‰t$Ç$‰ù‹”$œ‹„$”èGWÿÿƒø„Ÿ…À„bØÿÿ‹¬$ ‰<$‰D$0ÿƒäk‹D$Dè‰æþÿ‹T$0…Ò‰“‰Óéøžÿÿf‹„$„)ЉD$‰4$ÿ”$¨‹¬$ ‰l$‹l$<‰l$Ç$‰Á‹”$¤‹„$œè¾Vÿÿƒø„}…À…gG‰|$P‹|$ÿÿ„À„b‹…„ ‰p‹”$‰P‹… ‰C0‰S,‹„$ø‰„$‹„$ü‰„$éÊœÿÿ‹l$L‹\$léèÿÿ‹T$@‹…À„oŒ$ø‰ $‹Œ$‰Øè¯ÿÿ„À…ONŠƒ- „À„ü ;s@[šÿÿ1Ûé>œÿÿ1ÒéòÓÿÿ»ðÿÿÿé-œÿÿö@- „¥©ÿÿŒ$„$‰$‹T$d‹D$DèçAÿÿ„À„ù‹„$…À… œÿÿék©ÿÿv1Òé¢ÐÿÿöC- „W©ÿÿŒ$„$‰$‹T$d‹D$Dè™Aÿÿ„À„=‹´$…ö…Ò›ÿÿé©ÿÿö@- „©ÿÿŒ$„$‰$‹T$d‹D$DèTAÿÿ„À„‹„$…À…›ÿÿ騍ÿÿöC- „ΨÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèÄ?ÿÿ„À„Ћ„$…À…A›ÿÿ錨ÿÿöC- „‚¨ÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèx?ÿÿ„À„n‹„$…À…õšÿÿé@¨ÿÿ‹„$‹‰„$éÛšÿÿO„ï‹U‹J…Ét‹‰•Œ ‹‰„$é´šÿÿ„À„ü§ÿÿ‹„$‰„$‹„$‰„$鋚ÿÿ1Ò騷ÿÿ1Òé•¿ÿÿ‹‰„$éošÿÿ‹‰„$éašÿÿ„À„©§ÿÿ‹„$ø‰„$‹„$ü‰„$é8šÿÿ‹l$H‹\$<é¡Ùÿÿ‹\$Léo×ÿÿ9D$p…h§ÿÿéµÅÿÿv‹¬$„1öéíÒÿÿ‹¼$˜ÇD$<éÐÿÿ‹‰”$ Ç„$Ç„$1À1ö1Ûé,²ÿÿ‰Ú‰œ$ Ç„$1À1öéh·ÿÿ‹V‰”$ Ç„$Ç„$1À1ÿ1Ûé̳ÿÿÇ„$ Ç„$1À1Ò1öéá¾ÿÿ‹„$ø‰„$‹„$ü‰„$é:™ÿÿ‹„$‰„$‹„$‰„$é™ÿÿ1Ûéà˜ÿÿƒÂ„$‰$‹Œ$‰èèýþÿ„À•Àé`«ÿÿ‰D$‹\$|‰$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…5°ÿÿ‹A „$‹‰„$霘ÿÿH‰D$‹t$|‰4$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…}Ãÿÿ‹A „$‹‰„$éJ˜ÿÿ‹•œ ‹Z ‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À… ÿ„$‹„$‹‰„$é ˜ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~B1Év‹4Š9ów19÷r-°‹Œ$8A/…l¹ÿÿ‹A „$‹‰„$é—ÿÿvA9ÁuÃ1Àë̉D$‹t$|‰4$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~A1Éf‹4Š9ów19÷r-°‹Œ$8A/…ˆ¸ÿÿ‹A „$‹‰„$é —ÿÿvA9ÁuÃ1ÀëÌ‹B‰B‹L$4‹T$8‹D$Dè¼Vÿÿ„À„n‹Œ$逹ÿÿH‰D$‹\$|‰$ÿT$tƒø „ú‹„$ö@- „ú£ÿÿŒ$„$‰$‹T$d‹D$Dè<<ÿÿ„À„‹„$…À…u–ÿÿéÀ£ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‰Á‹‹D$hèöÝþÿ‹Œ$:A/…O¤ÿÿ‹A „$‹‰„$é"–ÿÿ‹S(‹‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$èZîþÿ‹Œ$:A/…ó¼ÿÿ‹A „$‹‰„$éÒ•ÿÿH‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…ê¢ÿÿ‹A „$‹‰„$錕ÿÿH‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè>ôþÿ‹Œ$:A/…©ÿÿ‹A „$‹‰„$éB•ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‰Á‹‹D$hèÇÜþÿ‹Œ$:A/…€£ÿÿ‹A „$‹‰„$éó”ÿÿ‹•œ ‹Z H‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…¬ ÿŒ$‹„$‹‰„$é±”ÿÿ‹S(‹H‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$èèìþÿ‹Œ$:A/…á»ÿÿ‹A „$‹‰„$é`”ÿÿƒÂ„$ø‰$‹Œ$‰èè]øþÿ„À•Àé ±ÿÿ‹B‰B‹L$4‹T$8‹D$DèøSÿÿ„À„‹Œ$é­Äÿÿ‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè³ïþÿ‹Œ$:A/…¼Çÿÿ‹A „$‹‰„$éÇ“ÿÿH‰D$‹t$|‰4$ÿT$tƒø „½ÿŒ$‹„$‹‰„$é’“ÿÿ‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèEòþÿ‹Œ$:A/…ÞÆÿÿ‹A „$‹‰„$éI“ÿÿ‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…#´ÿÿ‹A „$‹‰„$é“ÿÿH‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hè¦îþÿ‹Œ$:A/…3¦ÿÿ‹A „$‹‰„$麒ÿÿ‰D$‹\$|‰$ÿT$tƒø „¥ ÿ„$‹„$‹‰„$醒ÿÿ‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚:9Ø–À:A/…,Éÿÿ‹A „$‹‰„$é<’ÿÿº ‹D$Dè4ÿÿ„À„‹…„ ‹”$‹R‰‹…„ ‹”$‰P‹„$ø‰„$‹„$ü‰„$éã‘ÿÿH‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚©9Ø–À:A/…ÐÄÿÿ‹A „$‹‰„$阑ÿÿ‹‰„$銑ÿÿ‹K,;Œ$…‡´ÿÿ1ÿ骴ÿÿ‹œ$öC- „Z‰l$4‰Ú…ÀŽÔ œ$¼$ ¬$ë‹”$ÇD$ÿÿÿÿŒ$‰L$‰t$ ‰l$‰|$‰$‰Ù‹T$d‹D$Dè8ÿÿ„À„r €¼$„ ‹„$…À§ÿŒ$‹”$étÿÿÿ‹‰„$éÂÿÿ‹Œ$9K,…€ÂÿÿÆD$4é¦Âÿÿ‹‰„$éšÿÿ‹‰„$éŒÿÿ9• …ƒ´ÿÿ‹Œ$ …ɉt´ÿÿ‹…$ ‰„$Ç„$ ÿÿÿÿ‹‰„$éKÿÿ9½ …0µÿÿ‹„$ …À‰!µÿÿ‹…$ ‰„$‹‰„$éÿÿ‹‰„$éÿÿ9 …¯ÿÿ‹”$ …Ò‰¯ÿÿ‹…$ ‰„$Ç„$ ÿÿÿÿ‹‰„$éÆÿÿ‹C‰„$é·ÿÿ‹‰„$é©ÿÿ‹‰„$é›ÿÿ‹‰„$éÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèÓ3ÿÿ„À„© ‹„$…À…Pÿÿ雜ÿÿ‹‰„$é=ÿÿ;sDŽÿÿ1ÛéûŽÿÿ9 …a­ÿÿ‹´$ …ö‰R­ÿÿ‹…$ ‰„$éé­ÿÿv9½ …¬ÿÿ‹„$ …À‰ ¬ÿÿ‹…$ ‰„$‹‰„$éÆŽÿÿ€½0 … œÿÿé,ºÿÿ9• …f¿ÿÿ‹¼$ …ÿ‰W¿ÿÿ‹…$ ‰„$éð¿ÿÿv;sDŽ_Œÿÿ1ÛéBŽÿÿº龫ÿÿºééÅÿÿºéçÂÿÿºéd³ÿÿÇ$‹Œ$‰ò‹|$D‹èa ÿÿ„À„ñ‹„$‹P(ÆD$4éÀÿÿ‹\$HéèÞÿÿ‰ÆéyâÿÿÇ„$ ÿÿÿÿ…ÀB›ÿÿ‹Œ$…É3›ÿÿ‹„$‹‰„$éÎÿÿf‹\$8éŸÞÿÿ‰è‹¬$ ‹œ$”‰C`‰<$ÿƒäk‹D$DèêÔþÿ‹E`‰„$‹„$‹‰„$éÿÿ‰ÆéØãÿÿ‰Æé…âÿÿ‰Æé>áÿÿ‰Æé#ãÿÿ‰ÆéŒàÿÿ‹¬$¬‹œ$œ‰{`‰4$ÿƒäk‹D$Dè…Ôþÿ‹E`‰„$‹„$‹‰„$éÿÿ‹l$8‹|$<‹\$L‰»” éíÿÿ‹„$9D$pŽBšÿÿ@‰„$Ç„$‹Œ$‹”$ 1À1öéN²ÿÿ‹œ$éXüÿÿÇ„$ 1ÀéÒ°ÿÿ‹œ$é¿üÿÿ‰”$ ‰ÐéÉ«ÿÿ‰”$ ‰ÐéæªÿÿÇ„$ 1ÀéS½ÿÿÇ„$ ÿÿÿÿé°™ÿÿ»ðÿÿÿé$ŒÿÿÇ„$ ÿÿÿÿé–™ÿÿÇ„$ ÿÿÿÿ醙ÿÿÇ„$ ÿÿÿÿév™ÿÿ»ðÿÿÿéê‹ÿÿÇ„$ ÿÿÿÿé\™ÿÿÇ„$ ÿÿÿÿéL™ÿÿ»ðÿÿÿéÀ‹ÿÿÇ„$ ÿÿÿÿé2™ÿÿÇ„$ ÿÿÿÿé"™ÿÿ»ðÿÿÿé–‹ÿÿ‹Œ$ÇD$Ç$‰ò‹D$Dè;Lÿÿ„À…ï˜ÿÿ»÷ÿÿÿéc‹ÿÿÇ„$ ÿÿÿÿéÔ˜ÿÿ»ðÿÿÿéH‹ÿÿÇ„$ ÿÿÿÿ麘ÿÿÇ„$ ÿÿÿÿ骘ÿÿ»ðÿÿÿé‹ÿÿÇD$<¼àké2ÃÿÿÇD$<àké%Ãÿÿ‹‰„$ éÅÿÿ1ÀéÄøÿÿ‹Œ$éòŸÿÿ1ÀéUùÿÿÇ„$¨ÌàkÇD$L¼àkéû¿ÿÿÇ„$¨¤àkÇD$Làkéã¿ÿÿºS‹D$Dè¼,ÿÿ„À„¦‹…„ ‰p‹”$‰P‹… ‰C0‰S,‹„$‰„$‹„$‰„$鈊ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éhŠÿÿ‹F‰„$ é¹ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$é9ŠÿÿÇ„$ ÿÿÿÿéy—ÿÿ‹‰„$ éÝ·ÿÿ‹Œ$éȹÿÿ÷ÚéÉÿÿÇ„$ ÿÿÿÿ…ÀE—ÿÿéûÿÿ‹F‰„$ éé±ÿÿ»ðÿÿÿ饉ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé÷–ÿÿ»ðÿÿÿék‰ÿÿÇ„$ ÿÿÿÿéÝ–ÿÿÇ„$ ÿÿÿÿéÍ–ÿÿÇ„$ ÿÿÿÿé½–ÿÿ»ðÿÿÿé1‰ÿÿ‹D$Dè¦Ðþÿ»þÿÿÿé‰ÿÿ»ðÿÿÿé‰ÿÿÇ„$ ÿÿÿÿ醖ÿÿ‹D$8‰$‰Ú‰èèÒlÿÿ‰Ã‹„$‹P(‹Œ$éĵÿÿÇ„$ ÿÿÿÿéN–ÿÿÇ„$ ÿÿÿÿé>–ÿÿ»ðÿÿÿ鲈ÿÿÇ„$ ÿÿÿÿ9ðŒ!–ÿÿ驸ÿÿ»÷ÿÿÿéˆÿÿ‰$‰ú‰èèblÿÿ‰Ç‹œ$‹C(9x†Ø¤ÿÿÇD$Ç$‹Œ$‰ò‹D$DèIÿÿ„À…È•ÿÿ»÷ÿÿÿé<ˆÿÿf‹l$H‹D$Dè«Ïþÿ骕ÿÿ‹D$DèÏþÿ»þÿÿÿéˆÿÿ1Ûéˆÿÿ»÷ÿÿÿéˆÿÿ1Ûéý‡ÿÿ»÷ÿÿÿéó‡ÿÿÇ„$ ÿÿÿÿée•ÿÿÇ„$ ÿÿÿÿéU•ÿÿ‹l$H‹D$DèDÏþÿéC•ÿÿÇ„$ ÿÿÿÿé3•ÿÿ»ðÿÿÿ駇ÿÿº\‹D$Dè·)ÿÿ„À„ù‹…„ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰Pé šÿÿº[‹D$Dèd)ÿÿ„À„Ò‹…„ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$é‡ÿÿ‹]TºZ‹D$Dèò(ÿÿ„À„^v†ƒ‹•„ ‹œ$‰‰r‹H,‰J‹H(‰J ‹”$‰P,‰x(é £ÿÿ‹„$9D$X”ÿÿH‰„$Ç„$‹Œ$‹”$ 1À1öéK¤ÿÿ1ÛéQ†ÿÿ‹\$L‹› ‰\$<…Û….¹ÿÿº ‹D$Dè'(ÿÿ‰D$<…À„†¹ ‰Ç1Àóª‹\$4[ƒÁã‰Ú‹D$Dèø'ÿÿ‹|$<‰G…À„ۉljÙ1Àóª‹|$<‰7ÇG…ö„‰~齸ÿÿ„$ø‰$‹Œ$‹”$‰èèõéþÿ‹”$„À‹B(„/˜ÿÿ¿é'˜ÿÿ‹Œ$éÔ±ÿÿ1Ûé|…ÿÿ„$‰$‹Œ$‹”$‰èè§éþÿ‹”$‹J(„À„Ÿ¨ÿÿ¿é—¨ÿÿ„$‰$‹Œ$‹”$‰èèléþÿ‹”$„À‹B(„¢ÿÿ¿é¢ÿÿ„$ø‰$‹Œ$‹”$‰èè1éþÿ„À‹„$‹P(„ñ¶ÿÿÆD$4éì¶ÿÿ‹Œ$é²°ÿÿ‹Œ$é@´ÿÿ‰èè¶²þÿŠ\$Hˆ2 ‹t$8‰µ é’ÿÿº!‹D$Dè£&ÿÿ„À„%‹…„ Š\$HˆX‹…„ ‹t$8‰0‹„$éÈéÿÿ»ðÿÿÿéN„ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé–õÿÿ‹¬$¬‰Ç‰4$ÿƒäk‹D$Dè›Ëþÿ…ÿ‰÷ÿÿ‰ûé„ÿÿ‰s\‹„$ø‹´$ü鉂ÿÿ1Ûéñƒÿÿ»ðÿÿÿéçƒÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿéàóÿÿ‹l$4Ç„$ ÿÿÿÿé?‘ÿÿ÷ØéDÁÿÿ‹l$4Ç„$ ÿÿÿÿé$‘ÿÿ1Û雃ÿÿ»÷ÿÿÿ鑃ÿÿ1Éé §ÿÿ»÷ÿÿÿ逃ÿÿ»ðÿÿÿévƒÿÿ‰Ãéoƒÿÿ»÷ÿÿÿéeƒÿÿ‰ù‹|$4‰W(épÃÿÿ»ðÿÿÿéMƒÿÿ»÷ÿÿÿéCƒÿÿ»ðÿÿÿé9ƒÿÿ‰Ãé2ƒÿÿ»÷ÿÿÿé(ƒÿÿ‰Ãé!ƒÿÿ»÷ÿÿÿéƒÿÿ»ðÿÿÿé ƒÿÿ1ÀÇD$8éÝßÿÿ1ÀÇD$8éæÞÿÿ»ðÿÿÿéå‚ÿÿ»ðÿÿÿéÛ‚ÿÿ»ðÿÿÿéÑ‚ÿÿ»÷ÿÿÿéÇ‚ÿÿ»ðÿÿÿ齂ÿÿ»ðÿÿÿ鳂ÿÿ»÷ÿÿÿé©‚ÿÿ1Û颂ÿÿ1Û雂ÿÿ1Û锂ÿÿ1Ûé‚ÿÿ»ðÿÿÿ郂ÿÿ‰Ãé|‚ÿÿ»ðÿÿÿér‚ÿÿ»ðÿÿÿéh‚ÿÿ»ðÿÿÿé^‚ÿÿ»ðÿÿÿéT‚ÿÿ»ðÿÿÿéJ‚ÿÿ»ðÿÿÿé@‚ÿÿ»÷ÿÿÿé6‚ÿÿ»ðÿÿÿé,‚ÿÿ»ðÿÿÿé"‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿéúÿÿ»ðÿÿÿéðÿÿ»ðÿÿÿéæÿÿ»ðÿÿÿéÜÿÿ»ðÿÿÿéÒÿÿ»÷ÿÿÿéÈÿÿ‰<$ÿƒäk‹D$Dè4Éþÿ»þÿÿÿé¬ÿÿ»ðÿÿÿé¢ÿÿ»ðÿÿÿé˜ÿÿ»ðÿÿÿéŽÿÿ»ðÿÿÿé„ÿÿ»ðÿÿÿézÿÿ‹Œ$騯ÿÿ»ðÿÿÿédÿÿ»ðÿÿÿéZÿÿ»ðÿÿÿéPÿÿ»ðÿÿÿéFÿÿ»ðÿÿÿé<ÿÿ»ðÿÿÿé2ÿÿ»ðÿÿÿé(ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéÿÿ‰ú‹D$DèÇÈþÿ»÷ÿÿÿéÿ€ÿÿ»ðÿÿÿéõ€ÿÿ»ðÿÿÿéë€ÿÿ»ðÿÿÿéá€ÿÿ‹l$H‰Æ‹D$DèPÈþÿ…ö‰¡àÿÿ‰óéÀÿÿ‹|$<‹\$L‰» 飳ÿÿ»ðÿÿÿ馀ÿÿ‰4$ÿƒäk‹D$DèÈþÿ»þÿÿÿ銀ÿÿ»ðÿÿÿ退ÿÿ»ðÿÿÿév€ÿÿ»ðÿÿÿél€ÿÿ»ðÿÿÿéb€ÿÿ»ðÿÿÿéX€ÿÿ»ðÿÿÿéN€ÿÿ»ðÿÿÿéD€ÿÿ»ðÿÿÿé:€ÿÿ»ðÿÿÿé0€ÿÿ»ðÿÿÿé&€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ‹l$H‰Æ‹D$DèwÇþÿ…ö‰÷ßÿÿ‰óéêÿÿ»ðÿÿÿéàÿÿ‹\$<‰C(é´½ÿÿfUWVSƒì\‰D$$‰Ö‹(‰l$‹m‰l$4è1Çþÿ‹l$€½- t)‹]`‹m@‰l$@9댆‰Ý+l$@‰l$H‹l$‹mD‰l$Dë+‹l$‹]`‹mD‰l$D9ëY‹l$D)݉l$H‹l$‹m@‰l$@‹l$4‹E öÄ•D$:öÄ€„ŠD$:ƒðˆD$9‹l$4€½„À÷Ћl$‰…Ô Š…0 ˆD$;1íÇD$(‹T$ƒÂl‰T$<‹L$Á´ ‰L$0‰ð¶ð‰t$Lf‹T$‰Z`ŠL$;ˆŠ0 ‹|$<‰º| Ç‚x ‹‚ˆ ‰‚Œ Ç‚„ ‰ZX‰Z\‰Ð‹‹J$…É~,‹@TƒÀ1ÉÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ4;J$|Ü‹zx…ÿ~5‹|$‹‡È ƒÀ1ÉfÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ(;Jx|Ü‹r…ö~,‹L$‹AH1ÉÇÿÿÿÿÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ9ñuÝ‹rT…ö~(‹|$‹‡à ƒÀ1ÉvÇÇ@ÿÿÿÿAƒÀ;JT|깋|$01Àóª‹T$Ç‚Ä Ç‚Ì Ç‚Ð Æ‚2 Ç‚ fÇ‚( ‹ŠÔ …É…ƒ‹L$H;Š˜ r …Éus€º0 tjÇD$,‹T$@‹D$‰P@‹L$D‰HD‹D$(…À…šƒ|$,„‹D$$è¼Äþÿ‹t$,…öyéõv‹D$$è£ÄþÿÇD$,‹D$,ƒÄ\[^_]Ãv‹|$‹‹PÇ$‹L$L‹D$$è yÿÿ‰D$,ƒøŒtÿÿÿ„nÿÿÿH„¹€|$:u€|$9„Uÿÿÿ‹D$‹P\9P`„Eÿÿÿ‹D$(…À„‹L$‹q\9Þ„‹D$$èÄþÿ‹D$$‹‰D$‹‰T$ ‹T$ ‹B…À~|‹l$(ÇD$ÇD$ë.f‹E‰U‹KÁá‹s‰Çó¤ÿD$ƒD$ƒÅ‹D$‹|$ ;G}8‹\$‹L$YH‹‹S‰E‰U‹S;U v¶Áâ‹Eè5ÿÿ…Àtc‹S‰U ‰E럋D$$èOÃþÿ‹l$‹]\‰è‹m`‹€Ô …À„‹L$‹Ð H‰Ô €|$9„½üÿÿ€¹- „‰i@‰YDé¥üÿÿ‹T$ ‹B…ÀŽf‹|$(1ö‹ƒäk‹l$ ‹G‰$ÿÓFƒÇ;u|ï‹L$(‰ $ÿÓ‹D$$è½Âþÿ‹D$@‹l$‰E@‹T$D‰UD‹D$$èÂÂþÿÇD$,÷ÿÿÿÿ¼‚äk…À…þÿÿ1Ò‹D$,è½þÿéþÿÿ‹—Ð …Ò…9þÿÿé›ýÿÿ;i`…gþÿÿ‹|$4‹_ …Û~*‹QH‹D$(1É‹89:…Iþÿÿ‹x9z…=þÿÿAƒÂƒÀ9Ùuß‹|$@‹L$‰y@‹D$D‰ADƒ|$,u‹|$‹‡Ð …À„‹T$‰r\‰j`‹D$$è Âþÿ‹D$$‹(‹U‹B…Àޝ1ÿ1ö‹ƒäk‰\$‰Ó‹EH‹D8‰$ÿT$F‹CƒÇ9Æ|ç‹\$‹UH @Áá‰×‹t$(ó¤‹T$(‰$ÿÓ‹D$$èˆÁþÿ‹l$ÇELÿÿÿÿÇEPÿÿÿÿ‹E‹HL‹x …ÿ~T‹EHº½ÿÿÿÿë2f‹X…Ûx/‹1‰Ó9õ}‹l$‰UL€y „¦‰UP‰õƒÀBƒÁ 9ß~‹0…öyʉӃÀBƒÁ 9ßí‹D$$è,ÁþÿÇD$,‹D$,ƒÄ\[^_]Ë|$‰_@‰oDéúÿÿ‹D$$èÁþÿ‹D$$‹‰D$‹‰T$ ‹B@Áàè~ÿÿ‰D$(…À„ðýÿÿ‹L$ ‹A @Áá‹|$(1Àóªé½üÿÿÆD$9éåùÿÿ‰õéXÿÿÿ‹ƒäké±ýÿÿ‹D$$è—Àþÿ‹l$$‹E‹(‹}…ÿ~I‹|$(1ö‹ƒäkv‹G‰$ÿÓFƒÇ;u|ï‹D$(‰$ÿÓ‹D$$è5Àþÿé¨þÿÿ‰Þéÿýÿÿ‹ƒäkésþÿÿ‹ƒäkëωÞé÷ýÿÿvWVSƒì ‰Ã@ ‰D$ÇD$T$‰ØèŽVÿÿƒ»P „-Œ‹‹L …É…ù‹ƒ@ 9ƒH |k‹“D €»9 „‰T$ÇD$‹C‰$ÿDƒäk‰Æ…ö„¢‹ƒL @‰ƒL ‹S ;B ~ ǃL ‹T$‰Øè\eÿÿ‰ðƒÄ [^_Ãv€»9 …Ï‹sP¿ë=ƒø…3€»; „¾‹Cl;Ch…²‹“D 9ò„Sÿÿÿø‰Clƃ< ºD$èž÷ÿÿ‰ƒP …Ày¬‹T$‰ØèÙdÿÿ1öévÿÿÿf‹ST‹C ÇD$‹s‰4$ècÿÿ‰Æé"ÿÿÿ‹T$‰Øè¥dÿÿ‹5¤ƒäkÿ‰ðƒÄ [^_ËCH‰D$‰T$‹C‰$ÿDƒäk‰Æéèþÿÿf‹sL¿ÿÿÿÿékÿÿÿvÿƒH €»9 t]‹ƒD ‰D$‹Ch‰D$‹C‰$ÿDƒäk‰Æ…À„Jÿÿÿ‹Cl‰ƒD €»; t4;Cht>ƃ< ‹ƒP …À…|þÿÿéBþÿÿ1öëî‹Ch‰D$‹ƒD ë¡Æƒ< ‹ƒP ëÏø‰Cl뻋T$‰ØèÇcÿÿ‹ƒP 1ÒèJ¸þÿ1öéWþÿÿvƒì‹D$ è˜ýÿÿ;¤ƒäktƒÄËJ‰…Òt ¡ ƒäkÿƒÄËP‰$ÿRëêƒì‹D$ è`ýÿÿ;¤ƒäktƒÄËJ‰…Òt1ÀƒÄËP‰$ÿR1Àëßvƒì‹D$ è(ýÿÿ;¤ƒäktƒÄËJ‰…Òt¡Ø‚äk‹‰$ÿÀ‚äk1Àëß‹P‰$ÿRëáWVSƒì‰Ã‰×p ‰t$ÇD$ T$è‚Sÿÿƒ»@ „Œ—‰ø¶ÐD$èmõÿÿ‰Á‰ƒ@ …Àˆ•‹C‰òèó_ÿÿ‰Æ‰ø„Àu#‹Ch9Cl”ƒ< ‹T$‰Øèƒbÿÿ‰ðƒÄ[^_Ãf€»8 tÔ€»9 ÀƒàHCh‰Clƃ< ëÅv‹T$‰ØèEbÿÿ‹5 ƒäkÿ‰ðƒÄ[^_ËT$‰Øè)bÿÿ‹ƒ@ 1Ò謶þÿ1öë•‹T$‰Øè bÿÿ1ö놺‹D$éúþÿÿfƒìº‹D$ èçþÿÿ; ƒäktƒÄÃv‹J‰…Òt1ÀƒÄËP‰$ÿR1ÀëÜv1Ò‹D$é­þÿÿƒìº‹D$ è›þÿÿ; ƒäktƒÄÃv‹J‰…Òt¡Ø‚äk‹‰$ÿÀ‚äk1ÀëÜ‹P‰$ÿRëáUWVSìœ ‹¼$° ¡ ƒäk‰„$€ ‰„$„ Ç„$ˆ ‰„$Œ „$Œ ‰D$ „$ˆ ‰D$„$„ ‰D$„$€ ‰D$„$| ‰D$ÇD$ ˜ËákÇD$ÈJâk‹„$¸ ‰D$‹„$´ ‰$ÿ„‚äk…À„à1Ò‹„$€ è¶kÿÿ‰Ãƒøÿ„·ºÿÿÿ‹„$„ èškÿÿ‰Æƒøÿ„Û‹„$Œ èëkÿÿ…Àˆ—ÇD$ÇD$ÇD$‰D$ 1À‹¬$ˆ …í•À‰D$‰t$‰$‹Œ$| ‰úD$@è”%ÿÿ„À„HD$@‰„$t Ç„$x Ç$ÿô‚äk‰Å…À„ó€¼$m ÒƒâJ‰T$<‹„$ 9„$€Í9„$„ŒÀº„$t èkòÿÿƒøŒI„ ‹G …À…Í€¼$m „»‹„$ ‹”$œ‰T$‰D$‹„$| ‰$ÿDƒäk‰Æ…À„ú‰t$‰,$ÿð‚äk‹J‰…Ò„Y…ÀˆØ€¼$l „ó‹D$<„$œ‰„$ Æ„$p 9„$€Ž3ÿÿÿD$@èÀþÿ‰èÄœ [^_]Ãfÿ¼‚äk…À„;þÿÿf1í‰èÄœ [^_]Ãø„§‰$ÿlƒäk‰Æ…ÀtS‹_ …ÛŽNÿÿÿ1Ûë‰Dž9_ Ž<ÿÿÿC‹”$ˆÇD$‹„$| ‰$‰Ù‹D$@èÖ\ÿÿ…ÀuÊ‹H‰…À„¥‹EH‰E…À„ºD$@èa¿þÿ1í‰èÄœ [^_]Ãf‹„$ ;„$œ”„$p é?þÿÿ‹”$ˆÇD$‹„$| ‰$¹‹D$@èY\ÿÿ‰Æ…À…þÿÿ눋V‰4$‰D$8ÿR‹D$8é‘þÿÿf‹„$œ‹”$ é@þÿÿ‹F‰4$ÿPéMÿÿÿfÿ¼‚äk…À„ýÿÿé½þÿÿ‹E‰,$ÿPé8ÿÿÿfUWVSìŒ ‹¼$  Ç„$x ¡ ƒäk‰„$| „$| ‰D$„$x ‰D$„$t ‰D$ÇD$ ÀËákÇD$×Jâk‹„$¨ ‰D$‹„$¤ ‰$ÿ„‚äk…À„l‹„$x …À„ý‹„$| èahÿÿ…ÀˆIÇD$ÇD$ÇD$‰D$ ÇD$ÇD$ÿÿÿÇ$‹Œ$t ‰úD$8è "ÿÿ„À„üD$8‰„$l Ç„$p Ç$ÿô‚äk‰Æ…À„³€¼$e …q‹D$t‰D$(ÇD$,1ÛÇD$$‹-ð‚äk‹D$$;„$x &º„$l è×îÿÿƒøŒî„€¼$g „.‹”$˜‹„$”9„¼$e „‰\$‰D$‹„$t ‰$ÿDƒäk‰Ã…Û„”‰\$‰4$ÿÕ‹J‰…Ò„F…Àxz‹G …ÀŽ»ë…ÀxdC9_ Œò‹”$€ÇD$‹„$t ‰$‰Ù‹D$8èÂYÿÿ…Àt2‰D$‰4$‰D$ ÿÕ‹T$ ‹ I‰ …Éu°‹J‰$‰D$ ÿQ‹D$ …ÀyŸv‹H‰…À„ãD$8è*¼þÿ1ö‰ðÄŒ [^_]ÃvÇ„$x ÿÿÿéóýÿÿ‹\$tÇD$,ÿÿÿÿÇD$(éˆþÿÿv‹„$”€¼$e …áþÿÿ‰D$‰\$‹„$t ‰$ÿDƒäk‰ÃéÜþÿÿ1ö‰ðÄŒ [^_]ÃÿD$$‹œ$˜€¼$g t3;œ$”„àÆ„$h é þÿÿ‹S‰$‰D$ ÿR‹D$ é¤þÿÿfÆ„$h éúýÿÿv‹F‰4$ÿPéÿÿÿf;\$(tT$,‰”$˜Æ„$h éÉýÿÿ€¼$e uR‹D$t‰D$‰\$‹„$t ‰$ÿDƒäk‰Ã…Û„²þÿÿ‰\$‰4$ÿð‚äk‹J‰…ÒtH…Àˆ”þÿÿD$8è˺þÿéžþÿÿ‰\$ÇD$‹„$t ‰$ÿDƒäk‰Ã묋D$,؉„$˜éÿÿÿ‹S‰$‰D$ ÿR‹D$ ë¥UWVSìŒ ‰Ã¶¬$¤ ¶¼$¨ ¡ ƒäk‰„$t ‰„$x ‰„$| …Òt…É„n„$| ‰D$„$x ‰D$„$t ‰D$„$p ‰D$ÇD$ @Ìák‹„$  ‰D$‰L$‰$ÿ„‚äk…À„ô‹„$t 1ÒèÌcÿÿ‰Æƒøÿ„ͺÿÿÿ‹„$x è°cÿÿ‰D$,@„Ñ‹„$| èdÿÿ…Àˆ«çÿ‰|$ÇD$ÇD$‰D$ ÇD$‹D$,‰D$‰4$‹Œ$p ‰ÚD$4è®ÿÿ„Àtdt$4‰´$h Ç„$l ‰è¶Ð„$h èÓêÿÿ…ÀˆË‰ÁT$4‰Øè^Uÿÿ‰ÃD$4è¹þÿ‰ØÄŒ [^_]Ãfÿ¼‚äk…À„%ÿÿÿ1Û‰ØÄŒ [^_]Ãvÿ¼‚äk…À„!ÿÿÿ1ÛëÞf‹5xƒäk9r…ƒþÿÿ‹r‰t$(Nƒþ‡rþÿÿ‹J ‰Œ$p ƒ|$(„¸þÿÿ‹B‰„$t ƒ|$(„£þÿÿ‹J‰Œ$x ƒ|$(…Žþÿÿ‹R‰”$| éþÿÿfD$4èW¸þÿ1Ûé=ÿÿÿ‹D$‹T$‹L$ ÇD$ ÇD$ÇD$âJâké§ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$ïJâké{ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$ÿJâkéOýÿÿvVSƒì$‰Ã…Àtaº Kâk¸'Kâkèêªþÿ‰Æ…ÀtL‰\$‰$ÿ ƒäk‹J‰…Òt"‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ãf‹V‰4$‰D$ÿR‹D$ëË1ÀëàUWVSìÜ ‰Å‰Ó‰L$,”$€ ‰ÈèÔïþÿ„À„¸‹Œ$° ‰L$(1Ò‹„$ø è aÿÿ‰Æƒøÿ„Pºÿÿÿ‹„$ü èï`ÿÿ‰Çƒøÿ„ì…öˆà‰t$0‹L$(9Îd…ÿˆh‰þ;|$(D€½„u‰ð+D$09EhX‹„$ð …Àu Ç„$ð ÿÿÿ‰$ÿŒ‚äk…À„}ÿ¸ÆD$9ÆD$:ÆD$8ÆD$;ÇD$‰D$ÇD$‹„$ ‰D$ÇD$ ‰t$‹L$0‰L$„$€ ‰$‹L$,‰êD$LèÂÿÿ„À„¦T$L‰”$È Ç„$Ì Ç„$À Ç„$¼ Š„$y ˆ„$Ä ‹L$,‹QöBW•„$Å „À„1‹´$ˆÇD$<ÿÿÿÿ‹¼$ð …ÿÇD$0Ž º„$È è.çÿÿƒøŒ¿„â‹„$¨9ðtP€¼$y „N‰t$‰D$‹L$,‰ $ÿDƒäk‰Æ…ö„‰ò„$¼ èѱþÿ‹J‰…Ò„ð…Àˆ^€|$8…€|$9…ö€|$:„#‹K‰L$(…ÉŽ1ÿë~‹„$¨‹”$¬9ЄՀ¼$y „„‰D$‰T$‹L$,‰ $ÿDƒäk‰Æ…ö„ç¡ ƒäk9Æ„¢‰ò„$¼ è*±þÿ‹J‰…Ò„%…Àˆ·G;|$(„–‹C ‹¸‹u ‹P;Œƒäk„î;Xƒäk„âèéSÿÿƒøÿ„`ƒø„GÿÿÿŽ_9ÆŒWD@ý‹”$”‹H…É…D‹;P„á¡ ƒäkÿ‹J‰…Ò…tÿÿÿ‹P‰$ÿRG;|$(…kÿÿÿÿD$0‹´$¬€¼${ „—;´$¨„^Æ„$| ‹„$ð 9D$0…þýÿÿŠ„$y „À„º1Ò9Ö„V„À„+‰t$ÇD$‹L$,‰ $ÿDƒäk‰Æ…ö„“¼$¼ ‰ò‰øèá¯þÿ‹J‰…Ò„Y…Àxr…Ût ‹H‰…À„6‰øè<±þÿ‰ÃD$Lè³þÿ…Û„‘ö„$ô „…‹D$0‰D$‰\$Ç$-Kâkÿƒäk‰Ãëhfÿ¼‚äk…À…¶1Ò¸ôÿÿÿèF¦þÿ‹„$¼ …Àt ‹J‰…Ò„‚‹„$À …Àt ‹J‰…Ò„ZD$Lè²þÿ…Ût ‹H‰…À„X1Û‰ØÄÜ [^_]Ãÿ‰Æé®ýÿÿv‹V‰4$‰D$$ÿR‹D$$éÅýÿÿf‰T$‰D$‹L$,‰ $ÿDƒäk‰Æéwýÿÿ;´$¨”„$| éjþÿÿ‰D$‰t$‹L$,‰ $ÿDƒäk‰Æé­üÿÿ‰Ú„$¼ 膮þÿ…À‰ þÿÿéÿÿÿ€|$;„ùýÿÿ¹T$L‰èèNÿÿ‰Æ…À„õþÿÿ‰D$Ç$ÿpƒäk…À„ ‰D$‰$‰D$$ÿ ƒäk‰Ç‹T$$‹H‰…À„‹H‰…À„…ÿ„£þÿÿ‰ú„$¼ èó­þÿ‹J‰…Ò„†f…À‰hýÿÿéyþÿÿv‹V‰4$‰D$$ÿR‹D$$éúûÿÿf‰Ñ‰L$éQüÿÿ¹T$L‰èèHMÿÿ‰D$(…À„6þÿÿ‹D$L‹@ @‰$ÿlƒäk‰Ç…À„Ñ‹D$L‹p …öx81ö‹  ƒäk‰L$4f‹L$4‰ò‹D$(èqNÿÿ‰D$‰t$‰<$ÿtƒäkF‹D$L9p }Ö‹D$(èTÿÿ‰Æ…À„i‰D$‰|$‰$ÿƒäk‰Á‹H‰…À„Ç‹H‰…À„¢‹T$(‹H‰…À„Á…É„ýÿÿ‰Ê„$¼ ‰L$$èˬþÿ‹L$$‹J‰…Ò…Öþÿÿ‹Q‰ $‰D$$ÿR‹D$$éÀþÿÿö„$ô … º\‰Øè êþÿƒøŽ7ÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é^ùÿÿ‹H‹é þÿÿfÿ¼‚äk…À„¢øÿÿ„$€ èÆ¢þÿ1Û‰ØÄÜ [^_]Ãv1öÇD$<éÏùÿÿ‹t$(é³øÿÿv‰L$0…ÿ‰˜øÿÿ|$(‰Žøÿÿ1ö铸ÿÿv‹L$,ÿö„$ô …P‹\$,„$€ èT¢þÿ‰ØÄÜ [^_]Ãv‹C‰$ÿP1Û‰ØÄÜ [^_]Ãt$(‰øÿÿÇD$0éøÿÿº{‰Øèéþÿƒøöþÿÿ… 1ÀÆD$91ÛÆD$:ÆD$8ÆD$;éNøÿÿ‹G‰<$‰L$$ÿP‹L$$éHþÿÿf‹F‰4$‰L$$ÿP‹L$$é#þÿÿf‹B‰$‰L$$ÿP‹L$$é)þÿÿf„$€ 舡þÿ…Û…×ûÿÿéßûÿÿv‹D$<ð‰„$¬Æ„$| éúÿÿf‹P‰$ÿRé˜ûÿÿf‹P‰$ÿRépûÿÿf1Ò¸õÿÿÿè¡þÿéEûÿÿvÿ¼‚äk…À…Hþÿÿé÷ÿÿÇD$‰L$Ç$-Kâkÿƒäk‰Ãé”þÿÿ‹”$° é<úÿÿ‹W‰<$‰D$$ÿR‹D$$éfüÿÿ„Óþÿÿ‰\$‰l$Ç$ÿpƒäkèÆõÿÿ‰Ã…À„Hþÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;éÿöÿÿ‹B‰$ÿPéáûÿÿ‹F‰4$ÿPéàûÿÿ‹„$° ‰D$‰t$‹L$,‰ $ÿDƒäk‰ÆéÍùÿÿ¼$¼ éêùÿÿ‹H‰…Àu ‹G‰<$ÿP‹T$(‹H‰…À…9úÿÿ‹B‰$ÿPé+úÿÿ‹C‰$ÿPé¼ùÿÿ‹V‰4$‰D$$ÿR‹D$$é‘ùÿÿÇD$_Dâk‰$ÿ,ƒäk‰Ã…À„rýÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é)öÿÿ‹H‰…À…Äùÿÿ‹F‰4$ÿPé¶ùÿÿƒì\ÇD$@¡ ƒäk‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÐËákÇD$0Kâk‹D$h‰D$‹D$d‰$ÿ„‚äk…ÀtG‹D$LèVVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èjôÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡ ƒäk‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ìËákÇD$0Kâk‹D$h‰D$‹D$d‰$ÿ„‚äk…ÀtG‹D$Lè’Uÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`è¦óÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡ ƒäk‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÌákÇD$=Kâk‹D$h‰D$‹D$d‰$ÿ„‚äk…ÀtG‹D$LèÎTÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èâòÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡ ƒäk‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ $ÌákÇD$=Kâk‹D$h‰D$‹D$d‰$ÿ„‚äk…ÀtG‹D$Lè Tÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èòÿÿƒÄ\Ãf1ÀƒÄ\ÃfUWVSƒì<‹l$P‹\$Tº\‰Øèiãþÿ…Àx ÿ‰ØƒÄ<[^_]É\$‹E‰D$Ç$ÿpƒäkèWñÿÿ‰Ç…À„~ÇD$$ÇD$(ÆD$,‹E‹@ö@W•D$-‹G‰D$…ÀŽR1öëDfÿ…Û„¡ ƒäk9ă‰ÚD$$èV¥þÿ‹J‰…Ò„…ÀˆãF;t$„ ‹G ‹°‹U0‹C÷@Tu©‰Ø‰T$èHÿÿƒøÿ‹T$„‘ƒøtTŽ”9ÂŒŒD@ý‹U4‹H…Éu]¡ ƒäkÿ‹J‰…Òu”‹P‰$ÿRë‰f‹S‰$‰D$ÿR‹D$éiÿÿÿf‹U‹E$)ЉD$‹E )ЉD$‹E ‰$ÿDƒäk‰Ãéÿÿÿ‹U‹H)щL$‹ë×ÿ¼‚äk…À…Ž1Ò¸òÿÿÿèF›þÿ‹D$$…Àt ‹J‰…Òte‹D$(…Àt ‹J‰…ÒtH‹H‰…Àt#1ÛéIþÿÿ‹H‰…Àt#D$$螥þÿ‰Ãé0þÿÿv‹G‰<$ÿP1Ûéþÿÿ‹G‰<$ÿPëÒ‹P‰$ÿRë­‹P‰$ÿRë1Ò¸õÿÿÿ踚þÿémÿÿÿvUWVSƒì<ǘÁákPBàkǬÁákè?àkÇÔÁák@ÇØÁákDÂákÇèÁákÇôÁák`ÂákÇøÁák`ÃákÇüÁákàÃákÇ8Äák¬:àkÇLÄákL>àkÇXÄákäÄákÇtÄákëÇxÄákðÄákÇ”ÄákÅákǘÄák ÆákÇœÄák€ÆákÇÇák=àkÇTÇákëÇXÇákÄÇákÇlÇákTàkÇpÇák4xákÇtÇákàÇákÇxÇák@ÈákǘÈák\=àkÇÔÈákëÇØÈákDÉákÇìÈáklàkÇðÈák´vákÇôÈák`ÉákÇøÈákÀÉákÇ$€Áák‹|ƒäkÿÓ…ÀˆBÇ$ ÄákÿÓ…Àˆ1Ç$ÇákÿÓ…Àˆ Ç$€ÈákÿÓ…ÀˆÇ `äkÇD$õÇD$ ÇD$ÇD$ÊákÇ$IKâkÿ”ƒäk…À„Љ$ÿƒäk‰ÆÇ$´2‹=ì‚äkÿ׉ÅÀt"‰D$ÇD$PKâk‰4$ÿ¨‚äk‹H‰…À„¯Ç$ÿ׉ÅÀt"‰D$ÇD$VKâk‰4$ÿ¨‚äk‹H‰…À„pÇ$€ÊákÿTƒäk‰Ã…Àt"‰D$ÇD$`Kâk‰4$ÿ¨‚äk‹H‰…À„WÇ$`äk1Ò1Û1À¶•íák9Ú|Z@‰Â=Üuç4‰ðèAßþÿ‰Å…À„ç1À‰ï‰ñóª1ÿ‰ø‰\$,ëR¶C‰D$Ç$jKâkÿƒäk…Àts‰D$·†íák‹…àâk‰D$¶C‹D…‰$‹5¨‚äkÿÖG‰øÿÜ„À4…žíák¶CT…‹…Àu”‰T$(ÿœ‚äk‹T$(‰¶C‹D……À…tÿÿÿ‹\$,¡$`äk…Àt ‹J‰…Òt:1öëfF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRë߉,$ÿƒäkfƒÄ<[^_]ËP‰$ÿR뻋C‰$ÿPé‚þÿÿ‹C‰$ÿPéCþÿÿ‹C‰$ÿPé›þÿÿ‹\$,ÿœ‚äk£$`äk…À„zÿÿÿf1ÿ1À‰\$,‰Ãë.v‰D$·‡€âk‹…àâk‰D$¡$`äk‰$ÿÖC‰ßû‘t3Áç¶—ƒâk‹T•‰T$¶‡‚âk‰D$Ç$lKâkÿƒäk…Àu§éöþÿÿ‹\$,1öë F9Þ„"ÿÿÿ‹Dµ…Àtï‹J‰…Òuæ‹P‰$ÿRëÛ‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€‚âkÁà¶Œ „âk‰ÐÁèƒâÈ·Œ@†âk‰ÐÑè¶ŒÈÀ‘âkÑà1ж„H@¢âkÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€À£âkÁà¶Œà¥âk‰ÐÁèƒâ¶ŒÈ@¨âk‰ÐÁè¶ŒˆÀ­âkÁà1ж„ˆ@±âkËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€À´âkÁà¶Œà¶âk‰ÐÁèƒâÈ·Œà¸âk‰ÐÑ趌ȠÃâkÑà1ж„H`ÒâkÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€@ÔâkÁà¶„`Õâk‰ÑÁéƒâÁà¶ŒÀ×âk‰ÐÁè¶ŒH àâkÁà1ж„ˆââkËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€àãâkÁà¶„€äâk‰ÑÁéƒâÁà¶Œàåâk‰ÐÁè¶Œˆ`éâkÁà1ж„ˆàëâkËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@íâkÁà¶Œ`îâk‰ÐÁèƒâÈ·Œàïâk‰ÐÁ趌ȀõâkÁà1ж„ˆ ãkËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€`ãkÁà¶Œ ãk‰ÐÁè¶Ò¶ŒÈàãk‰ÐÁè¶ŒÈ ãkÁáÁà1ÐÁ‰ÈÁè¶€ÀãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ ãkÁà¶ŒÀãk‰ÐÁè¶Ò¶ŒÈ@ãk‰ÐÁè¶ŒÈ ãkÁáÁà1ÐÁ‰ÈÁè¶€  ãkƒáÓøƒàÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€È ãkÁà¶”à ãk‰ØÁè ãÿ¶”Ð ãk‰ØÁèÁâ¶Œ` ãkÁáÁà1ØÁ‰ÈÁè¶€`ãkƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€¨ãkÁà¶”Àãk‰ØÁè ãÿ¶”Ðãk‰ØÁèÁâ¶Œ@ãkÁáÁà1ØÁ‰ÈÁè¶€ ãkƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€4ãkÁà¶”`ãk‰ØÁè ãÿ¶”Рãk‰ØÁèÁâ¶ŒàãkÁáÁà1ØÁ‰ÈÁè¶€àãkƒáÓøƒà[Ãv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€àãkÁà¶Œ ãk‰ÐÁè¶Ò¶ŒÈ€ãk‰ÐÁè¶ŒÈ ãkÁáÁà1ÐÁ‰ÈÁè¶€ÀãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ãkÁà¶Œ@ãk‰ÐÁè¶Ò¶ŒÈ€ãk‰ÐÁè¶ŒÈàãkÁáÁà1ÐÁ‰ÈÁè¶€€ãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@ãkÁà¶Œ€ãk‰ÐÁè¶Ò¶ŒÈÀãk‰ÐÁè¶ŒÈãkÁáÁà1ÐÁ‰ÈÁè¶€ ãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€ãkÁà¶ŒÀãk‰ÐÁè¶Ò¶ŒÈãk‰ÐÁè¶ŒÈ@ãkÁáÁà1ÐÁ‰ÈÁè¶€àãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€À ãkÁà¶Œ!ãk‰ÐÁè¶Ò¶ŒÈ@!ãk‰ÐÁ趌Ƞ!ãkÁáÁà1ÐÁ‰ÈÁè¶€@"ãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ #ãkÁà¶Œ`#ãk‰ÐÁè¶Ò¶ŒÈ #ãk‰ÐÁè¶ŒÈ$ãkÁáÁà1ÐÁ‰ÈÁè¶€ $ãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€h%ãkÁà¶Œ€%ãk‰ÐÁè¶Ò¶ŒÈ&ãk‰ÐÁè¶ŒÈà&ãkÁáÁà1ÐÁ‰ÈÁè¶€`)ãkƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€`,ãkÁà¶Œ ,ãk‰ÐÁè¶Ò¶ŒÈ -ãk‰ÐÁè¶ŒÈ .ãkÁáÁà1ÐÁ‰ÈÁè¶€À0ãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€4ãkÁà¶Œ@4ãk‰ÐÁè¶Ò¶ŒÈÀ4ãk‰ÐÁ趌Ƞ5ãkÁáÁà1ÐÁ‰ÈÁè¶€ 8ãkƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ;ãkÁà¶Œ`;ãk‰ÐÁè¶Ò¶ŒÈà;ãk‰ÐÁè¶ŒÈà<ãkÁáÁà1ÐÁ‰ÈÁè¶€€?ãkƒáÓøƒàËT$‰ÑÁéâÿ?‰ÐÁè âÿ¶‰àBãk¶ŒÈ@Cãk‰ÐÁè¶Ò¶ŒÈ€Cãk‰ÐÁè¶ŒÈàCãkÁáÁà1ÐÁ‰ÈÁè¶€`DãkƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ DãkÁà¶ŒàDãk‰ÐÁè¶Ò¶ŒÈ@Eãk‰ÐÁè¶ŒÈàEãkÁáÁà1ÐÁ‰ÈÁè¶€@GãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€üHãkÁà¶Œ Iãk‰ÐÁè¶Ò¶ŒÈ Iãk‰ÐÁ趌ȠJãkÁáÁà1ÐÁ‰ÈÁè¶€ MãkƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ QãkÁà¶ŒàQãk‰ÐÁè¶Ò¶ŒÈ Rãk‰ÐÁè¶ŒÈ`RãkÁáÁà1ÐÁ‰ÈÁè¶€SãkƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰DSãk¶„ÈUSãk‰ÑÁé âÿÁà¶Œ€Sãk‰ÐÁè¶ŒÈÀSãkÁáÁà1ÐÁ‰ÈÁè¶€TãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€0TãkÁà¶Œ`Tãk‰ÐÁè âÿ¶ŒÈ€Tãk‰ÐÁ趌ȘTãkÁáÁà1ÐÁ‰ÈÁè¶€ÀTãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€àTãkÁà¶ŒUãk‰ÐÁè âÿ¶ŒÈ Uãk‰ÐÁè¶ŒÈ0UãkÁáÁà1ÐÁ‰ÈÁè¶€@UãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€PUãkÁà¶Œ€Uãk‰ÐÁè âÿ¶ŒÈ Uãk‰ÐÁè¶ŒÈàUãkÁáÁà1ÐÁ‰ÈÁè¶€@VãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€¸VãkÁà¶ŒàVãk‰ÐÁè âÿ¶ŒÈWãk‰ÐÁè¶ŒÈ@WãkÁáÁà1ÐÁ‰ÈÁè¶€€WãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÐWãkÁà¶ŒXãk‰ÐÁè âÿ¶ŒÈ Xãk‰ÐÁè¶ŒÈ`XãkÁáÁà1ÐÁ‰ÈÁè¶€ XãkƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€àXãkÁà¶Œ@Yãk‰ÐÁèƒâ¶ŒÈ Yãk‰ÐÁè¶Œˆ@ZãkÁáÁà1ÐÁ‰ÈÁè¶€[ãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€À[ãkÁà¶Œ\ãk‰ÐÁè¶Ò¶ŒÈ@\ãk‰ÐÁ趌Ȁ\ãkÁáÁà1ÐÁ‰ÈÁè¶€ ]ãkƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ô]ãk¶ŒÈ^ãk‰ÐÁè âÿ¶ŒÈ^ãk‰ÐÁè¶ŒÈ-^ãkÁáÁà1ÐÁ‰ÈÁè¶€`^ãkƒáÓøƒàÃv‹T$‰ÑÁé·Ò‰ÐÁè âÿ¶‰^ãk¶ŒÈ¡^ãk‰ÐÁè âÿ¶ŒÈ±^ãk‰ÐÁè¶ŒÈÁ^ãkÁáÁà1ÐÁ‰ÈÁè¶€à^ãkƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€_ãkÁà¶Œ@_ãk‰ÐÁè¶Ò¶ŒÈ€_ãk‰ÐÁè¶ŒÈ`ãkÁáÁà1ÐÁ‰ÈÁè¶€ aãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€XbãkÁà¶Œ€bãk‰ÐÁè âÿ¶ŒÈÀbãk‰ÐÁè¶ŒÈ cãkÁáÁà1ÐÁ‰ÈÁè¶€€cãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÐcãkÁà¶Œdãk‰ÐÁè¶Ò¶ŒÈ`dãk‰ÐÁè¶ŒÈàdãkÁáÁà1ÐÁ‰ÈÁè¶€@fãkƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€pgãkÁà¶Œ gãk‰ÐÁè¶Ò¶ŒÈàgãk‰ÐÁè¶ŒÈ hãkÁáÁà1ÐÁ‰ÈÁè¶€ hãkƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€ôhãkÁà¶Œ iãk‰ÐÁè âÿ¶ŒÈ@iãk‰ÐÁ趌ȀiãkÁáÁà1ÐÁ‰ÈÁè¶€ÀiãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€8jãkÁà¶„`jãk‰ÑÁé¶ÒÁà¶Œ€jãk‰ÐÁ趌ȠjãkÁáÁà1ÐÁ‰ÈÁè¶€¸jãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÄjãkÁà¶Œàjãk‰ÐÁè âÿ¶ŒÈkãk‰ÐÁè¶ŒÈkãkÁáÁà1ÐÁ‰ÈÁè¶€0kãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€HkãkÁà¶Œ`kãk‰ÐÁè âÿ¶ŒÈ kãk‰ÐÁè¶ŒÈàkãkÁáÁà1ÐÁ‰ÈÁè¶€ lãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€hlãkÁà¶Œ€lãk‰ÐÁè âÿ¶ŒÈ lãk‰ÐÁ趌ȰlãkÁáÁà1ÐÁ‰ÈÁè¶€ÀlãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÐlãkÁà¶Œmãk‰ÐÁè âÿ¶ŒÈ mãk‰ÐÁè¶ŒÈ0mãkÁáÁà1ÐÁ‰ÈÁè¶€@mãkƒáÓøƒàÃS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€PmãkÁà¶”€mãk‰ØÁè ãÿ¶”Рmãk‰ØÁèÁâ¶ŒÀmãkÁáÁà1ØÁ‰ÈÁè¶€àmãkƒáÓøƒà[Ãv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€ômãkÁà¶Œ nãk‰ÐÁè âÿ¶ŒÈ`nãk‰ÐÁ趌ȠnãkÁáÁà1ÐÁ‰ÈÁè¶€ànãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ oãkÁà¶Œ@oãk‰ÐÁè âÿ¶ŒÈ€oãk‰ÐÁè¶ŒÈÀoãkÁáÁà1ÐÁ‰ÈÁè¶€ pãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€pãkÁà¶ŒÀpãk‰ÐÁè¶Ò¶ŒÈqãk‰ÐÁè¶ŒÈ@qãkÁáÁà1ÐÁ‰ÈÁè¶€€qãkƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀqãkÁà¶Œrãk‰ÐÁè¶Ò¶ŒÈ@rãk‰ÐÁ趌ȀrãkÁáÁà1ÐÁ‰ÈÁè¶€sãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€dsãkÁà¶Œ€sãk‰ÐÁè âÿ¶ŒÈ sãk‰ÐÁ趌ȸsãkÁáÁà1ÐÁ‰ÈÁè¶€ÐsãkƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰èsãk¶„Èùsãk‰ÑÁé âÿÁà¶Œ tãk‰ÐÁè¶ŒÈ@tãkÁáÁà1ÐÁ‰ÈÁè¶€XtãkƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ptãk¶„Ètãk‰ÑÁé âÿÁà¶Œ tãk‰ÐÁè¶ŒÈÀtãkÁáÁà1ÐÁ‰ÈÁè¶€uãkƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€@uãkÁà¶Œ uãk‰ÐÁèƒâ¶ŒÈvãk‰ÐÁè¶Œˆ€vãkÁáÁà1ÐÁ‰ÈÁè¶€ wãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€¬wãkÁà¶ŒÀwãk‰ÐÁè âÿ¶ŒÈxãk‰ÐÁè¶ŒÈ xãkÁáÁà1ÐÁ‰ÈÁè¶€@xãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€hxãkÁà¶Œ€xãk‰ÐÁè âÿ¶ŒÈ xãk‰ÐÁ趌ȸxãkÁáÁà1ÐÁ‰ÈÁè¶€àxãkƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€yãkÁà¶Œ yãk‰ÐÁè¶Ò¶ŒÈ`yãk‰ÐÁ趌ȠyãkÁáÁà1ÐÁ‰ÈÁè¶€zãkƒáÓøƒàÃv‹L$‰ÈÁè·É‰ÊÁê áÿ¶€rƒøuèzþÿÿ¸ÉÃvèkþÿÿ¡D`äkHuéÇD`äkÇ$H`äkè‘PëÐf¡D`äk…ÀtÇD`äk¸ÉÃfÇ$H`äkèlRëÞÿ%p‚äkÿ%t‚äkÿ%h‚äkÿ%l‚äkÿ%‚äkÿ%‚äkÿ%,‚äkÿ%(‚äkÿ% ‚äkÿ%$‚äkÿ%‚äkÿ% ‚äkÿ%‚äkÿ%‚äkU‰åƒìèSþÿÇ$àkè5SþÿÉÃÿÿÿÿì½ákÿÿÿÿoKâk}Kâk‹Kâk•Kâk£KâkµKâkÃKâkÏKâkßKâkìKâkûKâkLâkLâk'Lâk;LâkSLâkgLâk~Lâk˜Lâk´Lâk¾LâkÐLâkäLâkøLâkMâk,Mâk>MâkJMâkbMâkvMâk‚Mâk“Mâk¦Mâk¸MâkÉMâkÔMâkãMâköMâk Nâk Nâk,Nâk MatchObject or None. Match zero or more characters at the beginning of the string.fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters against all of the string.search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Search through string looking for a match, and return a corresponding match object instance. Return None if no match is found.sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement repl.subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement format.subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement repl.subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement format.split(string, string, maxsplit=0, concurrent=None) --> list. Split string by the occurrences of pattern.splititer(string, maxsplit=0, concurrent=None) --> iterator. Return an iterator yielding the parts of a split string.findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list. Return a list of all matches of pattern in string. The matches may be overlapped if overlapped is True.finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator. Return an iterator over all matches for the RE pattern in string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a MatchObject.scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner. Return an scanner for the RE pattern in string. The matches may be overlapped if overlapped is True.group([group1, ...]) --> string or tuple of strings. Return one or more subgroups of the match. If there is a single argument, the result is a single string, or None if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the whole match is returned. Group 0 is the whole match.start([group1, ...]) --> int or tuple of ints. Return the index of the start of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the start of the whole match is returned. Group 0 is the whole match.end([group1, ...]) --> int or tuple of ints. Return the index of the end of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the end of the whole match is returned. Group 0 is the whole match.span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints. Return the span (a 2-tuple of the indices of the start and end) of one or more subgroups of the match. If there is a single argument, the result is a span, or (-1, -1) if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the span of the whole match is returned. Group 0 is the whole match.groups(default=None) --> tuple of strings. Return a tuple containing all the subgroups of the match. The argument is the default for groups that did not participate in the match.groupdict(default=None) --> dict. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name. The argument is the value to be given for groups that did not participate in the match.capturesdict() --> dict. Return a dictionary containing the captures of all the named subgroups of the match, keyed by the subgroup name.expand(template) --> string. Return the string obtained by doing backslash substitution on the template, as done by the sub() method.expandf(format) --> string. Return the string obtained by using the format, as done by the subf() method.captures([group1, ...]) --> list of strings or tuple of list of strings. Return the captures of one or more subgroups of the match. If there is a single argument, the result is a list of strings; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the captures of the whole match is returned. Group 0 is the whole match.starts([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the starts of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the starts of the captures of the whole match is returned. Group 0 is the whole match.ends([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the ends of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the ends of the captures of the whole match is returned. Group 0 is the whole match.spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints. Return the spans (a 2-tuple of the indices of the start and end) of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of spans; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the spans of the captures of the whole match is returned. Group 0 is the whole match.detach_string() Detaches the target string from the match object. The 'string' attribute will become None.match() --> MatchObject or None. Match at the current position in the string.search() --> MatchObject or None. Search from the current position in the string.split() --> string or None. Return the next part of the split string.ˆ˜ákà˜ák4™ákŒ™ákä™ák<šák”šáküšákd›ákÔ›ákDœák´œákák„ákìákTžák¼žák$ŸákŒŸákôŸák\ ákÄ ák,¡ák”¡ákü¡ákd¢ákÌ¢ák4£ákœ£ák¤ákl¤ákÔ¤ák<¥ák¤¥ák ¦ákt¦ákܦákD§ák¬§ák¨ák|¨ákä¨ákL©ák´©ákªák„ªákôªák\«ákÄ«ák,¬ák”¬ákü¬ákd­ákÌ­ák4®ákœ®ák¯ákl¯ákȯák°ákp°ákȰák ±ák|±ákÔ±ák,²ák€²ákÔ²ák<³ák”³ákì³ák´ák$´ák0´ákH´ákp´ák¨´ákä´ák(µákß0Ið°‡–—˜™šžPRTV€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯²³´¶·¼ÂÃÄÆÇÌÒÓÖ×âãäæçòóôö÷üûûûûûûûûûûûû9cAÊĽ%ɾ\¿)ÑäÝ㦠¶  ± ! ` " Ü ~ » | j}~dñ:‹eú‡¢pOŽastoaƒáÑ‹¼ÐbÖT€ìtV¯ŽÛ Ô k Ó 4!!!‘"h""i"ÿ#±#²#Æ$w$x$%#ѹ—•–˜Ÿš^]Þg³ ” š ™ › µ / ¨ ´³ ¶Ùª©­ÛQ|×Ï!’ "! "þ#%$c$Õ%Û&Ú&C':((4(@)¯*+,,ÿ-.†/ 0;151´2 34‡5ý6 7Ì8ç9Ò:®;D<é=è=I>H>}?|?~@@iAµAžB™BCCûD‘DïEîEŒFhGlG´G°H5I¸JßKàKúLÿLMPN=NÊOÉOñPèQüR÷SþS·TõUûUñVëV÷WöWòXìXöYüYóZðZø[ô[\ ]›]^_ÿ_$`ØaÖa—b•bôcùcUdTd{ezeDf@fXgWg:h~iëj$kqkylímìmVnooÎpÍpJqHqZrPrrsqsYtGttusv¼wCx˜y–yÎz{¡|œ|þ}n~N~vº€¯®‚‚Ÿƒ&„d„g…<†‡‡ ˆê‰é‰ÙŠ×Šè‹(Œ#Œ'e8Ž67ÅŒ‘‹‘‘L’N’“œ“±”¯”F•U•L–j——K˜I˜Ô™Ó™²š°š››ßœ¸·žŸ£ ¤¡x¢w¢Ð£ ¤F¥¦7§G¨«©ÉªU«“¬K­{®Ò¯î°í±…²H³Æ´XµW¶I·®¸­¸ô¹sºÙ»;¼È½¾ˆ¿ŠÀ‰ÀÅÁÐÂÏÂïÃwÄvÄÅÅ Æ Æ¢Ç¡Ç È ȃÉ‚ÉÞÊÝÊ­ˬËÖÌÕ̹͸ÍÎËÏÌÏÐÐÏÐùÑýÑÆÒ1Ó0Ó–Ô•Ô[ÕQÕ\ÖRÖ]×S×MØOØÙGÚVÚõÛ÷ÛöÜøÜ=‚m”¢ ”œµ·/.¨§   ­ ¬ Û Ú     QS|‰×ÏÎ!’“"# þý#"ÕÔCB @?¯°†ˆ   :!9!~"u"ë#ê#!$*$o%p%F&b&''«(¾(Q)“){)**,+++ÿ,þ,--´.³. //¶0µ07161É2Ê2U3T3’4…4ö5õ5ý6ü67’7€78899$::þ;ý;GË>ˆ?h?{@z@vAuAB BçCæC®D­DDEEECFDFºG¹G‚HtHŸI¨IÐJÏJ K KÒLÑL<M N‘N OOÆPÇPÅQÄQ¶R·R¼SÎTÍTgUfUèV VKW¶WHX¸XXYYWZyZI[R[s\‹\Ò]Ó]ô^ó^Ù_Ø_;``íaëaîbìbïc‚cÈdÌdÙeØeff€gVi¼½Íà0;†²!✡ñ ï ~ q ˜ ¤ ð  ñ  òâ62äßVi†²~câßœ¡ÝÑB Ë Í ‰ Vi†²âßÅÀñïÚ¿?>J ¤ 6 2 À ¼ ä ã _ ^ ½¼"åænj2,¥SB.ÌËÎÍ©¤šÜÇÝÒÞÓ® o‡jȱZ ` _ M ð é ) 0 « “ ¬È§«ªÆ¥©„q«Ç¦ªîô…r- .  f e  3  w x ~ Œ M T „         ! " ! # # $ $ % & & ' ' + ( 0 ) 5 * ; + @ , B - C . D / E 0 F 1 M 2 Q 3 R 4 S 5 T 6 U 7 V 8 ƒ 9 !Š ! " " # # $ $ % % & & ' ' ( (à )/ )¿ )Á *1 *½ * +¾ +2 +Ø ,ä ,4 ,× -È -6 -Ù .ò .7 .¦ /8 / /¢ 0š 09 0 1: 1“ 1Œ 2‹ 2< 2Ž 3¦ 3= 3» 4> 4£ 4º 5? 5ž 5\ 6_ 6A 6  7Ä 8'   p f ð $  S R æ å ë ê a ` E È í ê å K J [   Ò Õ â á ó ò   Ÿ ‹   [ W õ å   % ’ ” — Ö Ü Ÿ   Á é í ö ÷    - 1 2 3 r } Š   ç ó + 9 s ” • ž   ´ !µ "Á #à $Ë %û & ' ( ) *X + ,k -l .m /u 0v 1y 2z 3ƒ 4è 5 6ç 7; 8¬ 9( 3 k  À  £ š ¨  /  =iONa^˜—*/àßûüP_ˆ ‡ † ƒ 6 2 › “ C ? YZL>=kbùÔøÊÛÚÚㆺ²}r³Ÿ‘úÉúÇ€!_\ip o!"#`$„$0%;%s&F&œ'¡''62¶°¥¤    H    L *Km)J[lyI(kGxZ…j r!"w#"$~%%&„' ()*+ ,!-#.$/&0'1+20354;5@6B7C8D9E:F;MS?T@UAVBWCXDYE\F`GaHbIdJeKfLgMhNiOnPsQzRS†TU,VNW]XoYtZ{[€\‡]^-_O`^apbuc|deˆfg.hPi_jqkvl}m‚n‰op3qcrst¢¦O§(î)-+ , ï * g [VâNÅ3MRQPz u v { | ywx&'úøçæ¾¼^Y ùĻܛšÃÂ@ ?   D ?  A ‘ @=>ŽIEA@fedc¨°   ZaÛßÝlj¡>™–^ L 5!4!º""W#<#C$B$²%±%ã&á&]'K'c(d(&))Y*A*G+F+J,H,›-<.8.X/>/ª0©0×1¿1Á2À2[3C3Z4B4ä5E6U6m7n7l8k8)9<9Þ:Õ: ; ; §< ¿< Ã= Â= m> h> n? o? ¹@£@7A1A8B:BáCàCMDUDOEVEžF™F¥G¹H»IåJKŠL]MbN€Xâk…Xâk‡Xâk‰XâkŽXâk“Xâk—Xâk›XâkŸXâk£Xâk§Xâk«Xâk¯Xâk³Xâk¶XâkºXâk¿XâkÅXâkÌXâkÖXâkäXâkèXâkìXâkïXâkôXâkøXâkûXâkÿXâkYâkYâk YâkYâkYâkYâkYâkYâk!Yâk$Yâk)Yâk,Yâk/Yâk1Yâk5Yâk9Yâk]âkC]âkL]âkQ]âkW]âk`]âkp]âk{]âk]âk†]âk‰]âkŒ]âk]âk–]âk ]âk«]âk°]âk¸]âk½]âkÃ]âkÍ]âkÙ]âkß]âkì]âkò]âkõ]âkø]âkþ]âk^âk^âk^âk^âk^âk'^âk3^âkD^âkK^âkZ^âkj^âku^âkx^âk}^âk„^âk‰^âk‘^âk¡^âk¬^âk¸^âkÂ^âkÏ^âkÔ^âkÝ^âkâ^âkè^âkü^âk _âk#_âk%_âk(_âk-_âk1_âkD_âkV_âk`_âkx_âk}_âk‚_âk‰_âk˜_âkž_âkª_âk¸_âk»_âk¾_âkÂ_âkÈ_âkÏ_âkÖ_âkÜ_âkã_âké_âkð_âk÷_âký_âk`âk `âk`âk`âk`âk$`âk*`âk0`âk6`âk<`âkB`âkH`âkN`âkT`âkZ`âk``âkf`âkl`âkr`âkx`âk~`âk„`âkŠ`âk`âk–`âkœ`âk¢`âk¨`âk«`âk²`âk·`âkÍ`âkã`âkù`âkaâk%aâk*aâk3aâk6aâk=aâk@aâkDaâkNaâk]aâknaâk„aâk aâkÅaâkÙaâkðaâkøaâkbâkbâkbâkbâk5bâk@bâkKbâkdbâk|bâkœbâk¼bâkÜbâkûbâkþbâkcâkcâk&câk)câk,câk2câk5câk9câkTcâkxcâkœcâk¯câk½câkÖcâkÝcâkôcâkdâk dâkdâk%dâk@dâkUdâk_dâkmdâk|dâkdâk dâkµdâkÄdâk×dâkçdâkïdâkÿdâkeâk eâkeâk+eâk.eâk3eâk6eâk9eâkCeâkTeâkseâk‚eâk’eâk—eâkœeâk eâk¤eâk¨eâk°eâkÁeâkÊeâk×eâkäeâköeâkfâkfâk'fâk=fâkBfâkDfâkGfâkKfâkVfâk[fâkkfâknfâkqfâkyfâk‡fâk™fâk³fâk·fâkÂfâkÊfâkÏfâkÚfâkèfâkûfâkþfâkgâk gâkgâk0gâk@gâkFgâkOgâkVgâkbgâkngâkzgâk†gâk‰gâkŽgâk‘gâkgâkŸgâk¢gâk±gâk¶gâkÊgâkÔgâk×gâkÛgâkìgâkhâk#hâk7hâkChâk_hâkvhâk”hâk¢hâk¥hâk¨hâk­hâk¶hâkÂhâkÏhâkàhâkòhâkþhâkiâk iâk2iâkEiâkHiâkTiâkXiâk_iâkhiâkuiâkwiâk}iâk†iâk‰iâkiâk‘iâk—iâk¨iâkµiâkÈiâkËiâkÐiâk×iâkÛiâkäiâkèiâkòiâköiâküiâkÿiâkjâkjâk&jâk6jâk;jâkDjâkPjâkcjâkfjâkkjâkvjâk{jâk€jâk‡jâkjâkšjâk¯jâk¾jâkËjâkÒjâkØjâkçjâkðjâkþjâkkâk kâkkâkkâkkâk'kâk,kâk.kâk1kâk4kâk8kâkIkâkSkâk]kâkxkâk‡kâk‹kâkkâk—kâk¯kâkºkâkÎkâkâkâkòkâklâk lâklâklâklâklâk&lâk3lâk7lâk?lâkDlâkHlâkQlâkjlâk{lâkŠlâklâk˜lâk›lâkŸlâk¢lâk©lâk¬lâk°lâk»lâkÀlâkÌlâkílâkñlâkölâkmâk mâkmâk(mâk8mâk;mâkNmâk_mâkumâk‚mâkŒmâk‘mâk™mâk¬mâk±mâk¶mâkËmâkámâkímâkùmâknâknâknâk&nâk)nâk-nâk6nâk;nâk@nâkInâkRnâkWnâk`nâkcnâkfnâklnâkxnâk„nâk‘nâknâk nâk£nâk¦nâkªnâk±nâk¶nâk»nâkÃnâkÒnâkÞnâkånâkìnâkûnâkoâkoâkoâkoâk0oâkKoâkSoâkYoâk^oâkioâkooâk|oâkoâk†oâk‘oâk–oâk™oâk›oâkžoâk¢oâk©oâk®oâk²oâk·oâk½oâkÄoâkÎoâkßoâkéoâküoâkpâkpâkpâk)pâkApâkPpâk_pâknpâkspâkvpâkypâk…pâkŠpâk—pâk£pâk¯pâkÄpâk×pâkëpâkðpâk÷pâkþpâkqâkqâk qâk%qâk+qâk0qâk8qâkIqâkZqâkdqâkmqâk{qâk€qâkƒqâk†qâk‰qâkqâk£qâk©qâk³qâkÃqâkÑqâkÕqâkÙqâkÝqâkàqâkãqâkæqâkñqâkõqâkrâkrâk râkrâkrâkrâkrâk&râk3râk=râkBrâkJrâkYrâk^râkcrâkprâkrâk¦râk´râk¿râkÂrâkÅrâkÈrâkÌrâkÓrâkØrâkärâkórâk sâksâksâk#sâk7sâkxâkDxâkGxâkJxâkNxâkRxâkUxâkXxâk]xâkexâknxâk{xâk€xâk…xâkxâkœxâk¯xâkÌxâkÛxâkÞxâkëxâkðxâkóxâkyâkyâk-yâk0yâk>yâkFyâkLyâkWyâkfyâkkyâknyâkryâkxyâk„yâk‰yâkŽyâk’yâk—yâkyâk yâkªyâk¸yâkºyâkÂyâkÔyâkäyâkèyâkïyâkúyâkýyâkzâkzâkzâk1zâkDzâkXzâk]zâkazâkezâkizâkuzâkzzâkzâk“zâk˜zâkšzâkzâk zâk¤zâkªzâk´zâk¹zâk¾zâkÃzâkÎzâkÑzâkÔzâkÞzâkåzâkèzâkëzâkðzâk{âk {âk{âk{âk%{âk({âk0{âk8{âk={âkB{âkG{âkS{âkX{âk`{âkc{âkf{âkl{âkw{âk‰{âk{âk{âk›{âk {âk¬{âk¯{âkµ{âkÄ{âkÐ{âkç{âkð{âkó{âk÷{âkþ{âk|âk|âk |âk|âk|âk'|âk;|âk?|âkJ|âkU|âk[|âkg|âk|âk’|âk¦|âk¼|âkÞ|âkö|âk}âk0}âk8}âk@}âkO}âkY}âkb}âke}âkj}âkv}âk}}âk‚}âk‰}âk“}âk•}âk}âk¢}âk«}âk°}âk´}âkº}âkÂ}âkÊ}âkÖ}âké}âkî}âkô}âkù}âkþ}âk~âk ~âk~âk~âk~âk,~âk1~âk8~âk=~âkQ~âkV~âk[~âk`~âke~âkl~âkq~âky~âk~~âk‡~âk—~âk¢~âk«~âk¯~âk¼~âkÑ~âkÜ~âkï~âkû~âkâkâk$âk;âk@âkBâkGâkOâkTâk]âkcâkpâk”âk¿âkÐâkØâkÛâkáâkëâkûâkýâk€âk€âk€âk+€âkH€âkQ€âka€âkf€âko€âk}€âk„€âkŒ€âkœ€âk¢€âk±€âk€âkÌ€âkÏ€âkÒ€âkØ€âkÚ€âkÞ€âká€âkì€âkñ€âkô€âkù€âkâkâkâkâkâk$âk0âk5âk>âkCâkHâkKâkMâkQâk[âkgâkkâknâksâkzâkâk›âk§âk¬âk³âkµâk¸âk½âkÃâkÈâkËâkÎâkÑâkÔâkÜâkáâk è ß ,àÿÿÿàÿÿÿÇàÿÿÿ¿ àÿÿÿ ç f ¿àÿÿÿF yÿÿÿÿ9ÿÿÿÿÿÿ‡ÿÿÿÔþÿÿôþÿÿÃÒÎÍOÊËÏaÓÑ£Õ‚ÖÚÙÛ8ÿÿÿÿþÿÿÿÿÿÿÿ±ÿÿÿŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*?*=ÿÿÿEG***.ÿÿÿ2ÿÿÿ3ÿÿÿ6ÿÿÿ5ÿÿÿ1ÿÿÿ(¥D¥/ÿÿÿ-ÿÿÿ÷)ý)+ÿÿÿ*ÿÿÿç)&ÿÿÿ»ÿÿÿ'ÿÿÿ¹ÿÿÿ%ÿÿÿTty&%@?C > ` 9\¬ÿÿÿ % Výÿÿ 6 P / }ÚÿÿÿÛÿÿÿ3àÿÿÿàÿÿÿ@àÿÿÿ<Œÿÿÿàÿÿÿàÿÿÿ6ùüÿÿàÿÿÿàÿÿÿàÿÿÿ0áÿÿÿàÿÿÿÿÿÿÿàÿÿÿàÿÿÿ]ÀÿÿÿÁÿÿÿÂÿÿÿâÿÿÿÇÿÿÿçÿÿÿ#ÑÿÿÿñÿÿÿÊÿÿÿêÿÿÿøÿÿÿªÿÿÿÊÿÿÿ°ÿÿÿÐÿÿÿ¤ÿÿÿÄÿÿÿÝÿÿÿ ÿÿÿÀÿÿÿùÿÿÿP°ÿÿÿñÿÿÿ0Ðÿÿÿ`Šæ;ÿÿÿÿ:ÅÿÿÿÆÿÿÿAâÿÿJVd€p~ ¶ÿÿÿ÷ÿÿÿ‡ãÿÿÛãÿÿûãÿÿªÿÿÿ½ãÿÿœÿÿÿÍãÿÿÿÿÿ€ÿÿÿ‚ÿÿÿƒâÿÿ£âÿÿ!ßÿÿAßÿÿšßÿÿºßÿÿäÿÿÿðÿÿÿæÿÿÿ ÖÿÿñÿÿÖÿÿÕÕÿÿØÕÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿ ãÿÿüuÿÿØZÿÿ¼Zÿÿ(Øÿÿÿ ”ÿÿÿs9ÿÿÿsn‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛzþÿÿ ŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?)âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0Þÿÿÿ‚`Òáÿÿ1Ýáÿÿßáÿÿ àáÿÿ Çáÿÿ¾ÆÿÿÿÕáÿÿsøÿÿÿuäÿÿsäÿÿqäÿÿoäÿÿB€ÿÿÿ¹xÿÿÿ¹ÿÿÿ¹ˆÿÿÿ¹Àÿÿÿ¹¸ÿÿÿ¹¾ÿÿÿ¹þãÿÿ¹øãÿÿ¹ûãÿÿBúãÿÿB¹¶ÿÿÿõãÿÿ¹ûãÿÿ²ÿÿÿ¹ôãÿÿ¹êãÿÿ¹ñãÿÿBðãÿÿB¹ªÿÿÿëãÿÿ¹çãÿÿæãÿÿããÿÿBâãÿÿBœÿÿÿããÿÿâãÿÿÝãÿÿßãÿÿBÞãÿÿBÿÿÿŠÿÿÿ¹Öãÿÿ¹Úãÿÿ¹ÓãÿÿBÒãÿÿB¹€ÿÿÿ‚ÿÿÿÍãÿÿ¹£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿfÿÿfeÿÿidÿÿlcÿÿfibÿÿflnÿÿtmÿÿta ÿÿv` ÿÿe_ ÿÿkh ÿÿv] ÿÿm(¾áklibgcc_s_dw2-1.dll__register_frame_infolibgcj-12.dll_Jv_RegisterClasses__deregister_frame_info@àk,àkàk àküàkìàkTàkÈàk£àkÂàk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk¸àk£àk£àk£àk¸àkÂàk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àk£àkÂàk£àkØàk£àkØàk£àk£àkÂàkªàkªàkøàkøàkøàkøàkøàkøàkªàkªàkªàkªàkøàkøàkøàkøàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkªàkøàkøàkøàkøàkøàkøàkøàkøàkªàkªàkªàkªàkªàkªàkªàkøàkøàkøàkøàkøàkøàkøàkøàkøàkøàkøàkøàkøàkøàkøàkøàk²àkçàk²àk²àk²àk²àk²àk²àkàk²àkÄàk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àküàk²àkpàk|àküàkàk²àk²àk²àk²àk²àk²àk²àk²àk²àkpàkpàkpàkpàkpàkpàk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àk²àkéàk²àkéàkÄàk²àkÄàkSàkSàkiàkiàkiàkiàkiàkiàkSàkiàkSàkSàkiàkiàkiàkiàkiàkiàkiàkSàkiàkiàkiàkiàkiàkiàkSàkiàkSàkSàkSàkSàkSàkSàkSàkiàkiàkiàkiàkiàkiàkiàkiàkSàkSàkSàkSàkSàkSàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàkiàknn:has_property_valuennn:get_all_casessx$àký"àký"àký"àký"àký"àký"àk¸#àkT$àkì#àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àk $àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àký"àk#àk#àkX#àk#àkt#àk„#àk0$àkØ#àkh#àk¤$àký$àkß$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk²$àk¤$àk¤$àk¤$àk¤$àk¤$àkÁ$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk¤$àk„$àknnerror_regex_coretoo much backtrackingconcurrent not int or Nonegroup indices must be integers or strings, not %.200sgroup indices must be integers or stringsinvalid RE codestring indices must be integersinvalid group referenceexpected string instance, %.200s foundexpected unicode instance, %.200s foundno such groupinvalid replacementinternal error in regular expression engine /àkD/àkh/àk„/àk¤/àkÄ/àkô/àk0àkô.àk,0àkÚ.àkÚ.àkÚ.àkÚ.àkÚ.àk80àkÚ.àk/àkregex.Regex(, flags= | regex.=)FàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàk,FàkçEàkçEàkçEàk@FàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkçEàkTFàkçEàkçEàkçEàk`FàkçEàkçEàkçEàklFàkçEàkçEàkçEàkxFàkçEàkçEàkçEàkçEàkçEàkçEàkçEàküEàk„HàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkTHàkRGàkRGàkRGàk(HàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkHàkRGàkRGàkRGàkÜGàkRGàkRGàkRGàk¼GàkRGàkRGàkRGàk GàkRGàkRGàkRGàkRGàkRGàkRGàkRGàkhGàkÔHàkÔHàkðHàkðHàklIàklIàkðHàkðHàkHákÂGákJGákÌFákO|OOnO:findallO|nO:splitO|OOO:searchO|OOO:fullmatchO|OOO:match_compile_replacement_helperregexNnOO|nOOO:subnOO|nOOO:sub_regexMAGICCODE_SIZEcopyrightiiORE_OP_FAILURERE_OP_SUCCESSRE_OP_ANYRE_OP_ANY_ALLRE_OP_ANY_ALL_REVRE_OP_ANY_REVRE_OP_ANY_URE_OP_ANY_U_REVRE_OP_ATOMICRE_OP_BOUNDARYRE_OP_BRANCHRE_OP_CALL_REFRE_OP_CHARACTERRE_OP_CHARACTER_IGNRE_OP_CHARACTER_IGN_REVRE_OP_CHARACTER_REVRE_OP_DEFAULT_BOUNDARYRE_OP_DEFAULT_END_OF_WORDRE_OP_DEFAULT_START_OF_WORDRE_OP_ENDRE_OP_END_OF_LINERE_OP_END_OF_LINE_URE_OP_END_OF_STRINGRE_OP_END_OF_STRING_LINERE_OP_END_OF_STRING_LINE_URE_OP_END_OF_WORDRE_OP_FUZZYRE_OP_GRAPHEME_BOUNDARYRE_OP_GREEDY_REPEATRE_OP_GROUPRE_OP_GROUP_CALLRE_OP_GROUP_EXISTSRE_OP_LAZY_REPEATRE_OP_LOOKAROUNDRE_OP_NEXTRE_OP_PROPERTYRE_OP_PROPERTY_IGNRE_OP_PROPERTY_IGN_REVRE_OP_PROPERTY_REVRE_OP_RANGERE_OP_RANGE_IGNRE_OP_RANGE_IGN_REVRE_OP_RANGE_REVRE_OP_REF_GROUPRE_OP_REF_GROUP_FLDRE_OP_REF_GROUP_FLD_REVRE_OP_REF_GROUP_IGNRE_OP_REF_GROUP_IGN_REVRE_OP_REF_GROUP_REVRE_OP_SEARCH_ANCHORRE_OP_SET_DIFFRE_OP_SET_DIFF_IGNRE_OP_SET_DIFF_IGN_REVRE_OP_SET_DIFF_REVRE_OP_SET_INTERRE_OP_SET_INTER_IGNRE_OP_SET_INTER_IGN_REVRE_OP_SET_INTER_REVRE_OP_SET_SYM_DIFFRE_OP_SET_SYM_DIFF_IGNRE_OP_SET_SYM_DIFF_IGN_REVRE_OP_SET_SYM_DIFF_REVRE_OP_SET_UNIONRE_OP_SET_UNION_IGNRE_OP_SET_UNION_IGN_REVRE_OP_SET_UNION_REVRE_OP_START_OF_LINERE_OP_START_OF_LINE_URE_OP_START_OF_STRINGRE_OP_START_OF_WORDRE_OP_STRINGRE_OP_STRING_FLDRE_OP_STRING_FLD_REVRE_OP_STRING_IGNRE_OP_STRING_IGN_REVRE_OP_STRING_REVRE_OP_STRING_SETRE_OP_STRING_SET_FLDRE_OP_STRING_SET_FLD_REVRE_OP_STRING_SET_IGNRE_OP_STRING_SET_IGN_REVRE_OP_STRING_SET_REVRE_OP_BODY_ENDRE_OP_BODY_STARTRE_OP_END_FUZZYRE_OP_END_GREEDY_REPEATRE_OP_END_GROUPRE_OP_END_LAZY_REPEATRE_OP_GREEDY_REPEAT_ONERE_OP_GROUP_RETURNRE_OP_LAZY_REPEAT_ONERE_OP_MATCH_BODYRE_OP_MATCH_TAILRE_OP_START_GROUP_regex.Patternmatchfullmatchsearchsubsubfsubnsubfnsplitsplititerfindallfinditerscanner__copy____deepcopy__patternThe pattern string from which the regex object was compiled.flagsThe regex matching flags.groupsThe number of capturing groups in the pattern.named_listsThe named lists used by the regex.groupindexA dictionary mapping group names to group numbers._regex.Matchgroupstartendspangroupdictcapturesdictexpandexpandfcapturesstartsendsspansdetach_string__getitem__reThe regex object that produced this match object.posThe position at which the regex engine starting searching.endposThe final position beyond which the regex engine won't search.lastindexThe group number of the last matched capturing group, or None.lastgroupThe name of the last matched capturing group, or None.regsA tuple of the spans of the capturing groups.stringThe string that was searched, or None if it has been detached._regex.ScannernextThe regex object that produced this scanner object._regex.SplitterThe regex object that produced this splitter object.compileget_code_sizeget_propertiesfold_caseget_expand_on_foldinghas_property_valueget_all_casesoverlappedconcurrentmaxsplitcountrepldefaultÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€àkTàk°àkàkdàk¼àkBDSFILMRTUXV0V1WÄWâkÆWâkÈWâkÊWâk@ÌWâkÎWâkÐWâkÒWâkÔWâkÖWâk ØWâk@ÚWâk ÝWâkàWâk-1/2011/101/161/21/31/41/51/61/71/81/91010010001000010000010000000010000000000001031071111/2118121221291313/2130132141515/2161717/2181922/32/52020020002000020221214216216000218222202222242262282323023223323424240252627282933/163/23/43/53/83030030003000031323334353637383944/54040040004000041424343200044454647484955/25/65/85050050005000066060060006000077/27/8707007000700008808008000800008499/29090090009000091AABOVEABOVELEFTABOVERIGHTAEGEANNUMBERSAHEXAIAINALALAPHALCHEMICALALCHEMICALSYMBOLSALEFALETTERALNUMALPHAALPHABETICALPHABETICPFALPHABETICPRESENTATIONFORMSALPHANUMERICAMBIGUOUSANANCIENTGREEKMUSICANCIENTGREEKMUSICALNOTATIONANCIENTGREEKNUMBERSANCIENTSYMBOLSANYARARABARABICARABICEXTAARABICEXTENDEDAARABICLETTERARABICMATHARABICMATHEMATICALALPHABETICSYMBOLSARABICNUMBERARABICPFAARABICPFBARABICPRESENTATIONFORMSAARABICPRESENTATIONFORMSBARABICSUPARABICSUPPLEMENTARMENIANARMIARMNARROWSASCIIASCIIHEXDIGITASSIGNEDATATAATARATBATERMATTACHEDABOVEATTACHEDABOVERIGHTATTACHEDBELOWATTACHEDBELOWLEFTAVAGRAHAAVESTANAVSTBB2BABALIBALINESEBAMUBAMUMBAMUMSUPBAMUMSUPPLEMENTBASICLATINBATAKBATKBBBCBEHBELOWBELOWLEFTBELOWRIGHTBENGBENGALIBETHBIDICBIDICLASSBIDICONTROLBIDIMBIDIMIRROREDBINDUBKBLBLANKBLKBLOCKBLOCKELEMENTSBNBOPOBOPOMOFOBOPOMOFOEXTBOPOMOFOEXTENDEDBOTTOMBOTTOMANDRIGHTBOUNDARYNEUTRALBOXDRAWINGBRBRAHBRAHMIBRAIBRAILLEBRAILLEPATTERNSBREAKAFTERBREAKBEFOREBREAKBOTHBREAKSYMBOLSBUGIBUGINESEBUHDBUHIDBURUSHASKIYEHBARREEBYZANTINEMUSICBYZANTINEMUSICALSYMBOLSCC&CAKMCANCANADIANABORIGINALCANADIANSYLLABICSCANONICALCANONICALCOMBININGCLASSCANSCARICARIANCARRIAGERETURNCASEDCASEDLETTERCASEIGNORABLECBCCCCCCCC10CCC103CCC107CCC11CCC118CCC12CCC122CCC129CCC13CCC130CCC132CCC133CCC14CCC15CCC16CCC17CCC18CCC19CCC20CCC21CCC22CCC23CCC24CCC25CCC26CCC27CCC28CCC29CCC30CCC31CCC32CCC33CCC34CCC35CCC36CCC84CCC91CFCHAKMACHAMCHANGESWHENCASEFOLDEDCHANGESWHENCASEMAPPEDCHANGESWHENLOWERCASEDCHANGESWHENTITLECASEDCHANGESWHENUPPERCASEDCHERCHEROKEECICIRCLECJCJKCJKCOMPATCJKCOMPATFORMSCJKCOMPATIBILITYCJKCOMPATIBILITYFORMSCJKCOMPATIBILITYIDEOGRAPHSCJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENTCJKCOMPATIDEOGRAPHSCJKCOMPATIDEOGRAPHSSUPCJKEXTACJKEXTBCJKEXTCCJKEXTDCJKRADICALSSUPCJKRADICALSSUPPLEMENTCJKSTROKESCJKSYMBOLSCJKSYMBOLSANDPUNCTUATIONCJKUNIFIEDIDEOGRAPHSCJKUNIFIEDIDEOGRAPHSEXTENSIONACJKUNIFIEDIDEOGRAPHSEXTENSIONBCJKUNIFIEDIDEOGRAPHSEXTENSIONCCJKUNIFIEDIDEOGRAPHSEXTENSIONDCLCLOSECLOSEPARENTHESISCLOSEPUNCTUATIONCMCNCNTRLCOCOMCOMBININGDIACRITICALMARKSCOMBININGDIACRITICALMARKSFORSYMBOLSCOMBININGDIACRITICALMARKSSUPPLEMENTCOMBININGHALFMARKSCOMBININGMARKCOMBININGMARKSFORSYMBOLSCOMMONCOMMONINDICNUMBERFORMSCOMMONSEPARATORCOMPATCOMPATJAMOCOMPLEXCONTEXTCONDITIONALJAPANESESTARTERCONNECTORPUNCTUATIONCONSONANTCONSONANTDEADCONSONANTFINALCONSONANTHEADLETTERCONSONANTMEDIALCONSONANTPLACEHOLDERCONSONANTREPHACONSONANTSUBJOINEDCONTINGENTBREAKCONTROLCONTROLPICTURESCOPTCOPTICCOUNTINGRODCOUNTINGRODNUMERALSCPCPRTCRCSCUNEIFORMCUNEIFORMNUMBERSCUNEIFORMNUMBERSANDPUNCTUATIONCURRENCYSYMBOLCURRENCYSYMBOLSCWCFCWCMCWLCWTCWUCYPRIOTCYPRIOTSYLLABARYCYRILLICCYRILLICEXTACYRILLICEXTBCYRILLICEXTENDEDACYRILLICEXTENDEDBCYRILLICSUPCYRILLICSUPPLEMENTCYRILLICSUPPLEMENTARYCYRLDDADALDALATHRISHDASHDASHPUNCTUATIONDBDEDECIMALDECIMALNUMBERDECOMPOSITIONTYPEDEFAULTIGNORABLECODEPOINTDEPDEPRECATEDDESERETDEVADEVANAGARIDEVANAGARIEXTDEVANAGARIEXTENDEDDIDIADIACRITICDIACRITICALSDIACRITICALSFORSYMBOLSDIACRITICALSSUPDIGITDINGBATSDOMINODOMINOTILESDOUBLEABOVEDOUBLEBELOWDOUBLEQUOTEDQDSRTDTDUALJOININGEEAEASTASIANWIDTHEGYPEGYPTIANHIEROGLYPHSEMOTICONSENENCENCLOSEDALPHANUMENCLOSEDALPHANUMERICSENCLOSEDALPHANUMERICSUPPLEMENTENCLOSEDALPHANUMSUPENCLOSEDCJKENCLOSEDCJKLETTERSANDMONTHSENCLOSEDIDEOGRAPHICSUPENCLOSEDIDEOGRAPHICSUPPLEMENTENCLOSINGMARKESETETHIETHIOPICETHIOPICEXTETHIOPICEXTAETHIOPICEXTENDEDETHIOPICEXTENDEDAETHIOPICSUPETHIOPICSUPPLEMENTEUROPEANNUMBEREUROPEANSEPARATOREUROPEANTERMINATOREXEXCLAMATIONEXTEXTENDEXTENDEREXTENDNUMLETFFALSEFARSIYEHFEFEHFINFINALFINALPUNCTUATIONFINALSEMKATHFIRSTSTRONGISOLATEFOFONTFORMATFRAFRACTIONFSIFULLWIDTHGAFGAMALGCGCBGENERALCATEGORYGENERALPUNCTUATIONGEOMETRICSHAPESGEORGEORGIANGEORGIANSUPGEORGIANSUPPLEMENTGLGLAGGLAGOLITICGLUEGOTHGOTHICGRAPHGRAPHEMEBASEGRAPHEMECLUSTERBREAKGRAPHEMEEXTENDGRAPHEMELINKGRBASEGREEKGREEKANDCOPTICGREEKEXTGREEKEXTENDEDGREKGREXTGRLINKGUJARATIGUJRGURMUKHIGURUHH2H3HAHHALFANDFULLFORMSHALFMARKSHALFWIDTHHALFWIDTHANDFULLWIDTHFORMSHAMZAONHEHGOALHANHANGHANGULHANGULCOMPATIBILITYJAMOHANGULJAMOHANGULJAMOEXTENDEDAHANGULJAMOEXTENDEDBHANGULSYLLABLESHANGULSYLLABLETYPEHANIHANOHANUNOOHEHEBRHEBREWHEBREWLETTERHEHHEHGOALHETHHEXHEXDIGITHIGHPRIVATEUSESURROGATESHIGHPUSURROGATESHIGHSURROGATESHIRAHIRAGANAHLHSTHYHYPHENIDIDCIDCONTINUEIDEOIDEOGRAPHICIDEOGRAPHICDESCRIPTIONCHARACTERSIDSIDSBIDSBINARYOPERATORIDSTIDSTARTIDSTRINARYOPERATORIMPERIALARAMAICININDICMATRACATEGORYINDICNUMBERFORMSINDICSYLLABICCATEGORYINFIXNUMERICINHERITEDINITINITIALINITIALPUNCTUATIONINMCINSCINSCRIPTIONALPAHLAVIINSCRIPTIONALPARTHIANINSEPARABLEINSEPERABLEINVISIBLEIOTASUBSCRIPTIPAEXTIPAEXTENSIONSISISOISOLATEDITALJAMOJAMOEXTAJAMOEXTBJAVAJAVANESEJGJLJOINCJOINCAUSINGJOINCONTROLJOININGGROUPJOININGTYPEJTJVKAKAFKAITHIKALIKANAKANASUPKANASUPPLEMENTKANAVOICINGKANBUNKANGXIKANGXIRADICALSKANNADAKAPHKATAKANAKATAKANAEXTKATAKANAORHIRAGANAKATAKANAPHONETICEXTENSIONSKAYAHLIKHAPHKHARKHAROSHTHIKHMERKHMERSYMBOLSKHMRKNDAKNOTTEDHEHKTHIKVLL&LAMLAMADHLANALAOLAOOLATINLATIN1LATIN1SUPLATIN1SUPPLEMENTLATINEXTALATINEXTADDITIONALLATINEXTBLATINEXTCLATINEXTDLATINEXTENDEDALATINEXTENDEDADDITIONALLATINEXTENDEDBLATINEXTENDEDCLATINEXTENDEDDLATNLBLELEADINGJAMOLEFTLEFTANDRIGHTLEFTJOININGLEFTTORIGHTLEFTTORIGHTEMBEDDINGLEFTTORIGHTISOLATELEFTTORIGHTOVERRIDELEPCLEPCHALETTERLETTERLIKESYMBOLSLETTERNUMBERLFLIMBLIMBULINBLINEARBLINEARBIDEOGRAMSLINEARBSYLLABARYLINEBREAKLINEFEEDLINESEPARATORLISULLLMLOLOELOGICALORDEREXCEPTIONLOWERLOWERCASELOWERCASELETTERLOWSURROGATESLRELRILROLTLULVLVSYLLABLELVTLVTSYLLABLELYCILYCIANLYDILYDIANMM&MAHJONGMAHJONGTILESMALAYALAMMANDMANDAICMANDATORYBREAKMARKMATHMATHALPHANUMMATHEMATICALALPHANUMERICSYMBOLSMATHEMATICALOPERATORSMATHOPERATORSMATHSYMBOLMBMCMEMEDMEDIALMEEMMEETEIMAYEKMEETEIMAYEKEXTMEETEIMAYEKEXTENSIONSMERCMEROMEROITICCURSIVEMEROITICHIEROGLYPHSMIAOMIDLETTERMIDNUMMIDNUMLETMIMMISCARROWSMISCELLANEOUSMATHEMATICALSYMBOLSAMISCELLANEOUSMATHEMATICALSYMBOLSBMISCELLANEOUSSYMBOLSMISCELLANEOUSSYMBOLSANDARROWSMISCELLANEOUSSYMBOLSANDPICTOGRAPHSMISCELLANEOUSTECHNICALMISCMATHSYMBOLSAMISCMATHSYMBOLSBMISCPICTOGRAPHSMISCSYMBOLSMISCTECHNICALMLMLYMMNMODIFIERLETTERMODIFIERLETTERSMODIFIERSYMBOLMODIFIERTONELETTERSMODIFYINGLETTERMONGMONGOLIANMTEIMUSICMUSICALSYMBOLSMYANMARMYANMAREXTAMYANMAREXTENDEDAMYMRNN&NANANNARNARROWNBNCHARNDNEUTRALNEWLINENEWTAILUENEXTLINENKNKONKOONLNONOBLOCKNOBREAKNOJOININGGROUPNONCHARACTERCODEPOINTNONENONJOININGNONSPACINGMARKNONSTARTERNOONNOTAPPLICABLENOTREORDEREDNRNSNSMNTNUNUKTANUMBERNUMBERFORMSNUMERICNUMERICTYPENUMERICVALUENUNNVNYAOALPHAOCRODIOGAMOGHAMOGREXTOIDCOIDSOLCHIKIOLCKOLDITALICOLDPERSIANOLDSOUTHARABIANOLDTURKICOLETTEROLOWEROMATHONOPOPENPUNCTUATIONOPTICALCHARACTERRECOGNITIONORIYAORKHORYAOSMAOSMANYAOTHEROTHERALPHABETICOTHERDEFAULTIGNORABLECODEPOINTOTHERGRAPHEMEEXTENDOTHERIDCONTINUEOTHERIDSTARTOTHERLETTEROTHERLOWERCASEOTHERMATHOTHERNEUTRALOTHERNUMBEROTHERPUNCTUATIONOTHERSYMBOLOTHERUPPERCASEOUPPEROVOVERLAYOVERSTRUCKPP&PARAGRAPHSEPARATORPATSYNPATTERNSYNTAXPATTERNWHITESPACEPATWSPCPDPDFPDIPEPFPHAGPHAGSPAPHAISTOSPHAISTOSDISCPHLIPHNXPHOENICIANPHONETICEXTPHONETICEXTENSIONSPHONETICEXTENSIONSSUPPLEMENTPHONETICEXTSUPPIPLAYINGCARDSPLRDPOPOPDIRECTIONALFORMATPOPDIRECTIONALISOLATEPOSTFIXNUMERICPRPREFIXNUMERICPREPENDPRINTPRIVATEUSEPRIVATEUSEAREAPRTIPSPUAPUNCTPUNCTUATIONQAACQAAIQAFQAPHQMARKQUQUOTATIONQUOTATIONMARKRRADICALREGIONALINDICATORREGISTERSHIFTERREHREJANGREVERSEDPERIRIGHTRIGHTJOININGRIGHTTOLEFTRIGHTTOLEFTEMBEDDINGRIGHTTOLEFTISOLATERIGHTTOLEFTOVERRIDERJNGRLERLIRLOROHINGYAYEHRUMIRUMINUMERALSYMBOLSRUNICRUNRSS&SASADSADHESAMARITANSAMRSARBSAURSAURASHTRASBSCSCONTINUESCRIPTSDSESEENSEGMENTSEPARATORSEMKATHSENTENCEBREAKSEPSEPARATORSGSHARADASHAVIANSHAWSHINSHRDSINGLEQUOTESINHSINHALASKSMSMALLSMALLFORMSSMALLFORMVARIANTSSMLSOSOFTDOTTEDSORASORASOMPENGSPSPACESPACESEPARATORSPACINGMARKSPACINGMODIFIERLETTERSSPECIALSSQSQRSQUARESTSTERMSUBSUNDSUNDANESESUNDANESESUPSUNDANESESUPPLEMENTSUPSUPARROWSASUPARROWSBSUPERSUPERANDSUBSUPERSCRIPTSANDSUBSCRIPTSSUPMATHOPERATORSSUPPLEMENTALARROWSASUPPLEMENTALARROWSBSUPPLEMENTALMATHEMATICALOPERATORSSUPPLEMENTALPUNCTUATIONSUPPLEMENTARYPRIVATEUSEAREAASUPPLEMENTARYPRIVATEUSEAREABSUPPUAASUPPUABSUPPUNCTUATIONSURROGATESWASHKAFSYSYLOSYLOTINAGRISYMBOLSYRCSYRIACSYRIACWAWTTAGALOGTAGBTAGBANWATAGSTAHTAILETAITHAMTAIVIETTAIXUANJINGTAIXUANJINGSYMBOLSTAKRTAKRITALETALUTAMILTAMLTAVTTAWTEHMARBUTATEHMARBUTAGOALTELUTELUGUTERMTERMINALPUNCTUATIONTETHTFNGTGLGTHAATHAANATHAITIBETANTIBTTIFINAGHTITLECASELETTERTONELETTERTONEMARKTOPTOPANDBOTTOMTOPANDBOTTOMANDRIGHTTOPANDLEFTTOPANDLEFTANDRIGHTTOPANDRIGHTTRAILINGJAMOTRANSPARENTTRANSPORTANDMAPTRANSPORTANDMAPSYMBOLSTRUEUUCASUCASEXTUGARUGARITICUIDEOUNASSIGNEDUNIFIEDCANADIANABORIGINALSYLLABICSUNIFIEDCANADIANABORIGINALSYLLABICSEXTENDEDUNIFIEDIDEOGRAPHUNKNOWNUPUPPERUPPERCASEUPPERCASELETTERVVAIVAIIVARIATIONSELECTORVARIATIONSELECTORSVARIATIONSELECTORSSUPPLEMENTVEDICEXTVEDICEXTENSIONSVERTVERTICALVERTICALFORMSVIRAMAVISARGAVISUALORDERLEFTVOWELVOWELDEPENDENTVOWELINDEPENDENTVOWELJAMOVRVSVSSUPWWAWWBWHITESPACEWIDEWJWORDWORDBREAKWORDJOINERWSWSPACEXDIGITXIDCXIDCONTINUEXIDSXIDSTARTXPEOXSUXXXYYEHYEHBARREEYEHWITHTAILYESYIYIIIYIJINGYIJINGHEXAGRAMSYMBOLSYIRADICALSYISYLLABLESYUDHYUDHHEZZ&ZAINZHAINZINHZLZPZSZWZWSPACEZYYYZZZZ      !""#$%&'"""()*+,-./0123456789:;<=>?@@ABCDEFGEHIEE@J@@KLMNOPQRESTUVWXYEE"""""""""""""""""""""""""""""""""""Z"""""""""""""""""""[\""""""""]""^_`abcdefghi"""""""""""""""""""""""jkkkkkkkkkkkkkkkkllllllllllllllllll""mnop""qrstuvwxyzL{|}~LLLLLL€L‚ƒL„L…LLL†LLL‡ˆ‰ŠLLLLLLLLL‹LLLLLLLLLLLLLLLLLL""""""ŒLLLLLLLL""""""""ŽLLLLLLL""""LLLLLLLLL‘’LLLLLLLLLLLLLLLE“”•–L—L˜™š›œžŸLLLLLLLLLLLL ¡LL¢£¤¥¦L§¨©ª«¬­®¯L"""""""""""""°""""""""""""""""±"²LLLLLLLLLLLLLLL""""²LLLLLLLLLLL³L´µLLLLLLLLLLLLlllllllllllllll¶       !"#$ %& ' ( ) *+ ,- ./ 0123456227 8922222:;<=>2 ?22222@AB2CD2EFG2HIIIIJIIIKLM22NOPQRSTUVWXYZ[TU\]^_`abUcdeYfSTUghiYjklmnop_qrsUtuvYwxsUyz{Y|xs2}~Y€‚2ƒ„…I†‡22ˆ‰ŠII‹ŒŽII‘’“”•2–—˜™ š›œII22žŸ ¡¢£¤ ¥22¦222222222222§¨22§22©ª«222ª222¬­®2¯22222°±2222222222222²2³´2222µ¶·¸2¹2º·»222¼½¾¿ÀÁ¿22Â22Ã22Ä2222Å2–ÆÇÈ2ɰ22ÊËÌÍÎÎ2Ï222ÐÑÒ¿¿ÓIIIIIÔ22ÕÖŸ×ØÙ2ÚB22ÛÜ22ÝÞßB2àIIIIáâãä åæç è éê ë ìíììíîìïðððñòóôõö÷øùúûüýþÿI      ÎÎÎÎÎÎÎÎÎÎÎII   ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎ ÎÎ!ÎÎÎÎÎÎ"Î#ÎÎÎÎÎ$% &ÎÎ'()*+,ÎÎÎ-¯IIIIIIIIII . /01 23 422256278888 9:;<IIIIÎ=ÎÎÎÎÎÎÎÎÎÎ>I?@ABC‡2222D±2222EF2ɇ2222GH23ÎÎ2ÎIJÎKLÎÎJÎÎLÎÎÎI222ÅÎÎÎÎ2222–III2M222222–ÎÎÎ22àN2OI PQ R2222STUVW XYZ[IIII\]2^_222`a22bc¿ dB2e2fg2–M22hijII22klmn2o222pqrstuv8IIIIIIIII22w¿22x2y22Êzzzzzzzz{{{{{{{{222222É222222|II}~€222222‚ƒ„22222…I2222†22ÃII‡ ˆé‰Š‹Œ2222222Ž‘’2“2G”•–—˜2«™ÉÉII22222223š  ›   œ?IIIÎΞ2–222eII2GŸ2 III2¡22¢£II ¤ 2222É¿IIIII¥22¦2§II2¨2©IIII222ªIIII«¬2­®¯2°222±2²2³2222´IIIIIIIII µ¶22·¸¹ºIÙ22»¼2´¿½2¾¿ÀIIIÙ22Á¿II22ÃÄ¿III222222GI      ÅÀ22GIIIII222´IIII2222°ÆËÇÈÉIIIIIIÊIIIIIIIÎÎÎÎÎÎÎ>ÎÎËÎÎÎÌÍÎÎÏÎÎÐIIÎÎÎÎÑIIIÎÎÎÎÎ Ò Ó ÔÕÖì רÙÚÛ Ó ÜÝ Þßàá â Ó ÔÕ ì ×á â Ó ã äåæç è éêëì í î ïðððñ2òóôõö÷øÊùÊIIIúÎÎ?ÎÎÎÎÎÎIû##IIüÎIÎÎÎ?ÎÎIIIIýÎþÎÎÿIIÎÎÎÎÎÎÎÎIÎÎÎÎIÎÎÎÎÎÎÎÎÎÎÎÎÎÐÎIIIIIIIIÎÎÎÎ IIIÎÎÎÎ>IIIÎÎÎÎÎÎÎ222227II222°22222ÉIIIIII I       I{{{{{{{    ! """""""" """ "  "  " " " "" # $$%"&%"""""""" "&  " "" '((((((((())(((((()))))))((*)))**))))))))++++++++ * ,-.,,)/ 00 " 1 "   2" " 3++4 """""" ,,,,1 05678,9:++++++++++++++;<=+<,,,,$$$$$$$$$$$$$>,,$?.,,,,,@@A BC+++++=AD$$$$E++$F$$$$$$$$$G+++H3++IJK++$$LMNE$$$$$$$+++++OP$$$$+++++F,,,,,,,$$$$$$$$E++++(Q,,$$$++J++++J+J++,.$$$$E+,.,,,,,,,,>$$$$$>,,,+++++++++++++O+R$$$$$$$$$$$RFST+++RSTSE+++$$$$$+U$$$P$$$:SP$$$>P>P$$$$$$$$$$>$$$>>,$$,FST+OVWVT>,,,V,,$P$+,$X,,:RP$$>,P>$P>$,OSTO,:O:+,:,,,P$>>,,,+$E,,,,,:RP$$$$P$P$$$$$$>$P$$,FST++:RVT,>,,,,,,,B,,,,,,,>$P$$,FTT+OVWVT,,,,R,,$PM,,,,,FP$$>,$>$$,P>>$,P>,$>,$$$$$$,,SRW,SWST,>,,V,,,,YCCXZ,,VSP$$$>$>$$$$$$$$$P$$,P+RSW+O++,,,:O$,,,,,,,Y,SP$$$>$$$P$$,FTSSWRWS+,,,VW,,,>P>,,,,,,$$$$$>PST+OSWST>,,,V,,,,,[$$$,SP$$$$$$$$>,$$$$P$$$$P,$$$>,O,VS+OOSSSS,S.,,,,,P$$$$$$$E$+++O,9$$$J+++=,,P>>P>>P,,,$$P$$$P$PP,$P$E$+++:F,$$>Q+++,,$$LC\\C+CCC333S$$$$P$$$$$$$$$>,:++++++R++=+$$E+++++:+++++++++OCCCCKCCZC\C.,,$$$$$]T+R+++TRTF$$$S+$$+FS^]SSS$E+F$$$$$$RTRSST]STC 1,,1,$$$$$?D$$$$$>$$,$$$>>$$,>$$,$$$>>$$,$$$$$$$>$$$$$$$$$>:+_`,CCCCC,,,$$>,,,,,a$$$$$$$$$$$$$?Gb$$$$$$$$$$$$cd,$$$$$?ef,,,,,,,$$$$$$>$$+O,,,,,$+=.,,,,$+,,,,,,>+,,,,,,$$+T+++SSSSRT+++++UBE,,,,,,,g<+A$h$$$$$$$$$$,,,,$$$$E>,,$$$,,,,,+RSTRS,,SRSST+,,Z,$$$$$$$,$$$$$$,,SSSSSSSS^$$$S,,,`,CCCCCCCCC$$$ERT,$$]R+++ORRT+++RSST++++O:U,++^$$$$$$$R++RRSSR^$$$,,\CCCC3++++CCCCZ,+^$$$$$$]++S+TS$$$$R+STT+S,,,,$$SSSS++++S+,7,P$$$$$(((,,,,+=++++++R+++F$E$$SF>,,,,(((((((--i((+++O,,,,,,,,,,++   , ,1111,jjjjk lm)k l), n) o),k lpqqqqqr@@ssstutuv@@wxyz{|} {~@@A@@@@@,|€|d((((((Q,,,++++++‚4ƒ4ƒ+++++O,,,,,,,C„C…C"  …C2 CCC„„„ † #$'C 2C‡eeeeeeeeeˆ‰eŠ,,,‹CCCC‹C‹CCC‹CCCCCCCC‹‹CCCCCCCCCCCCCCCCŒCCCCCCCC‹CCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,CCCZ,,,,CCCCCZ,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[CCCCCCCCCCCCCCCCC|Ž|Ž‹, 0k """" "( ‡CC…"‘+ ,,7_6,,6,$$$$,,,5.,,,,,,:$$$>,,,,$$$>$$$>ttxytgttUs,,CCCCC[CCCCC,,,,,CCCCCC,,’“C”•–eeee++S—((Ce˜?C$$$>:™šD$$$$$?(D,,P$$$$$$$$$$$$>CCCCCCCCCCCCCZCCCCCCC›$$h$$$$$$$$$$$œ$,, E4+++++U ,,,:$$$eeeee+,,,,)))š(((()  -""" *ž"k ,,,,,, 0,,,,,,(#$$$F$F$E$$$]TRCC,,CŸ,,,$$,,,,S$$$$$$$$$SSSSSSSSO,,,,+$$$G,,$$$++++$$$E+++++S,,,,,7$ES++SRS 5,,$$$$E++RTRTO,,,,$E$$$$R,,D$$LC],,F+FEF$$+E>,,,,,,,,,,,Ph$$$$$]+Sh¡O,,,,P$$>P$$>P$$>,,,,$]TSR T,$$,,,,,,$$$>,P$$¢¢¢¢¢¢¢¢££££££££$$$$$,,,k,,,,,6,,PF$$$$¤$$$$$$>$$>>$P>$$$$$$)))))))),,,,,,,,P$$$$$$$$$$$$$,$$$$$$$$$$$$$Ÿ,¥},,,¦§}¥}z¨.”}©B,,$$>$$$$$$$$$$$>N7|}$$$$$D$$$$$$$$$$$$$$(,$$$,$$$,$$$,$>,ªX‹Z,,,,N@C,$$$$$$P$$$$$$>$P.,«,[CCCCeeŠYCCCCCCCC`,,CCCCCC3,,,,,,,“$$$$f,,$$$$$$$7$$,,$$$$¬ee,,,,, $$$,>$$$$$$P>,>P$$$7$$$,7$$$$$,,7$$$$,,,$E+:O,,++$$P$P$$$$$,,+O,:,,,,.,,,$$$$$$­$$$,7$$$,$>,,$$$$>,,,`T^$$$$$$$$$$+++++++=,,ST+RT=®,,,,,,,+F$$$$$$$$$E++T+++O,,,,,,$]S++++R^$?.,,,$$$$$ETS+++T,,,,ef,,,,,,]SSSSSSSSSSSSSSW,,,,,,,:+I(((((($,,,,,,,CCCZ[CCCCC¯T+C¯SS°@@@±+++K3+++CCCCCCC++CCCCCCCC,C+K,,,,,,,,,,,,  k 0 ,0101 0 666 1 01 0 0 1 0 00, 0 , ! ! ! ! ! ,$$P$$$$$P>>PP$$$$>$$PP,,,>,PPPP$P>>PPPPPP>>P$>$$$>$$P$>>$$$$$P$$P$P$$P$$,,,,,,,[CCCCCCZ`,,,,,CCCCCCZ,,,,,,CCCCZ,,,C,,,,,,,Z,,,,,,,CCC[CCCCCCCCCCZ,CCZCCZ,,ZCCCCCCCCCCC[CZ,CCCC,,,,,,,,,[CCZ,[CCCCCN,,,,,,,@@@@@@@@£££££££,                        !"################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"""""#$%&'()*+,-./01223345678899:;<=>>?@AABCDDEEFGHIJKLMNOPQRRSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWXYYZ[\]^_`abcdefffffffffffffffffffffffffffffffffffffffghhhhhhhijjjjjjjjkkkkkkkkkkkkkkkkkkllllmnnnnnopqrstuvwxyz{|wwwwww}w~€ww‚wwwƒwww„…†‡wwwwwwwwwˆwwwwwwwwwwwwwwwwww‰‰‰‰‰‰‰‰Šwwwwwww‹‹‹‹‹‹‹‹ŒwwwwwwwŽwwwwwwwww‘‘wwwwwwwwwwwwww’’““”w•w––––––––wwwwwwwwwwww——ww˜™šš››œœœœœœžŸw                             ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¥wwwwwwwwwwwwwww¦¦¦¦§wwwwwwwwwww¨w©ªwwwwwwwwwwww««««««««««««««««¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬  !!!!!!!!""""""""""######$$$$$$$$%%%%%%%%&&''''''(((((((())******++,,--..////////0000000000011111222223334444445566777777777888888889999::::;;;;;<<<=>>>????????@@@@AAAABBBBBBBBCCCCCCCCDDDDDDDEEEFFFGGGHHHHHIIIIJJJJJJJKKKKKKKKLLLLLLLLMMMMNNOOOOOOOOOOPPPPPPPPQQRRRRRRSSSSSSSSTTTTTTTTTTTTUUUVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\]]^^^^^^^^___`````aaaaaabbccccccccddddddddeeeeeeeeeeeeeefgggghhhhhhiiiiiijjjkkkkkklmmnnnoppppppppqqqqqqqqrrrrrrrrrrrrssssttttttttuuuuuuuuuvvvvwwwxxxxxxxxxxxxyyyyyyzzzzzz{{||||||||||||||}}}~€€€€€€‚‚‚ƒƒƒ„„………………††††††‡‡ˆˆˆˆˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’’’’’’’“““““”””””””””””•–—˜˜™™ššššššššš›››››››››››››››œžžžžžžžžŸŸŸŸ     ¡¡¡¡¢¢¢££¤¤¤¤¥¥¥¦¦§§¨¨¨¨©©©©©ªªª«««¬¬¬¬­­®®¯¯°°±±±±±±²²²²²²³³´´´´µµ¶¶·····¸¸¹¹¹¹¹¹¹¹ººººº»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÆÆÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÈÉÉÊÊÊÊÊÊÊÊËËËËËËËËÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ   !"#$%%%%%&'()*+,-./0123456789:;;;<=;;;;;>;??;;;;@ABCDEFGHIJKLMNOP;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHQHHHHHHHHHHHHHHHHHHHRSSSSSSSSSTUUVWXYZ[\]^_`a bAAAAAAAAAAAAAAAAAAHHcdefgghijklmnopqArstuvAAAAAAwAxyzA{A|AAA}AAA~€AAAAAAAAA‚AAƒƒƒƒƒƒ„A…AAAAAAA††††††††‡AAAAAAAˆˆˆˆ‰AAAAAAAAAŠ‹ŒAAAAAAAAAAAAAAA;ŽA‘A’“”;;•;–AAAAAAAAAAAA—˜AA™š›œAžŸ ¡¢£¤¥?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{.|}~~~€..‚ƒ„…†..‡‡‡‡ˆ‡‰Š‡ˆ‡‹‹Œ..ŽŽŽŽ‘‘‘‘‘‘‘‘’’’’“”’’“’’•–—’’’–’’’˜’™’š›››››œžŸ    ¡¢£¤¥¦§¨©ª«««««¬­­®¯°°°°°±°°²³´µ¶¶·¸¹º»»¼»½¾««¿ÀÁÁÁÂÁÃÄÄÅ.....ÆÆÆÆÇÆÆÈÉÉÉÉÊÊÊËÌÌÌÍÎÏÏÏ....ÐÑÒÓÔÕÖרÙÚ Û ÛÜ Ý ÞÞß àáâãäåæ.çèéêëìí.æ.îïïïïïïïïðñ..........òòóòòóôôôôôôôõŽŽööö÷ø’ùúúúúû....üýüüüüüþüüüüüüüüüüüüüÿ.û    ‘‘‘‘  ì‘ ‘üüüÿüüüü........ !!"ñ###$%%%%&'2()))**+‘,----./..000123455556789:;ú.........88<=‘‘>‘?‘‘@üüüüüüAüüüüüüB..CDEFGHI.JK..LñÙMNOPîQR‘ STUVWXYZ[[..XXXXXXX\]^ _û...`abcccd..efghi...jkllmn..ooooopppqrs.....tuuvwx..yz{|....}}~....€‚ƒ„…††‡‡‡ˆ‰Š‹ŒŽ.........1‘.’’’’“”•–———˜™...šššš›œ..žŸ...              ¡.      ¢£¤¤¤¤¤¤¤¤¤¤¥.....¦....§§§§¨§§©ª§......«.......¬­®¯°±².. ³...í´âµ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈ...GûìäÊîî..æäûæ....ËÌæÍ´..ÎÏðìÐ.Îä½Ñ²ìÒ........ÓÔ...¬...üüüüüÕ..üüüÖüüüüüA......×..      !!!!!!!!!"""""""""""""#$$$$$$$$$$$$$$$$$$$$$$%&&&&&&&&&&&&&&'(((((((()*(((((((((((((((((+(((,-,---.,.,----------.---..------.,.,-.,-,-------------/0/001/1/0000000000100010/101001/1/0//011000000002323333232333333333343334323333333232343333333356566675756666666666766676566666675756665666666666668988:8:889::89:8:88888888:8:88:98888888888:;<;<<<=<=<<<<<<<<<<<=<<<<<;<<;<<<=<=<<;=<<<<<<<<<<<<>?>>>@>@>>>>>>>>>>>@>>>>>?>>>>>>@>@>>?@@>>>>>>>?@ABAAACACAAAAAAAAAAAAAAAAAAAACBAAACACAACBAAAAAAAAAABAAADEDDDDDDDDFDDDDDDDDDDDDEDDDDEDDDFFEDDFFDDDDDFGHHHHHHHHHHHHHHHHHHHHIHHHHHHJKKJKKJLLJLLLJLJJLJLLLLLLJLLLKKLLLLLLLLLLMMMMMMMMMMMMNMMMMMMMMMONMMMMMMMMMMMMMOMMMPQORRRRRRRRSSSSSSSSSSSTTSSSSSUSSVVVVVVVVWWWWWWWWWWWWXWWWWWXXWWXWWWWWXXWWWWWWWWWXWWWWWWWWWXYWWWWWWWXWWWWWZZZZZZZZZZ[\\\\\\\\]]]]]]]]]]]]]]^_____________`_abbbbbbcbbbcdddddddddde ffffffffffgggggghghgiiiiiiiiiiiiiiiiiiiijkjjjjljjjjjjjjjjjjjjjjjjjjjjl\\\mmmmmmmmmmmmmmnmmmmmmnmmmmmmooooooooooooooooopqqqqqqqqqqqqqqqqqqqqqqqqrqssssssssssssssstttttttttttttttuttttttuvttttttttttttwwwwwwwwwwwwwwwwwwwwxyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{|{}}}}}}}}yyyy~~~~ €‚ƒ„       … „  †††††††† ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆ ‰ ŠŠŠŠŠŠŠŠŠŠŠŠ‹Œ‹WWWXWWWXWWWXŽV‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“~”‘•––––––––––––––––––––—•–˜™VVVVVVVVVVVVVVš›VVVVVVVœ–––––––––––žŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ŸŸŸ ¡¡¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¤¤¤¤¤¤¤¤¤¤……¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¦¦¦§§§§§§§§§§¨§§§§§§((((((©©©©©©©©ªªªªªªªªªª«VVVVVV𬬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬­­­­­­­­­­­®­­­­­­­­­­­­­­RRRRRR¯¯¯¯¯¯¯¯¯°±¯¯²²²²²²²²²²²³YWWXYWWXYWWX²²²²²²²²²²²²VVVVVš™VVVVVVVV…´ ––––––––––––VVVVVVVVVVš µµµµµµ¶µµµµµµµµµµµµ·µµµµµµµµµ·µ¶µµµµµµµµµµµµ·  ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¹ºººººººº»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÆÆÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÈÇÇÈÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉËËËËËËËËËËËËËËÌÍÍÍÍÍÍÍÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÓÑÑÑÑÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÓÒÑÑÑÑÑÑÑÑÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕ×××××××××××××××ØØØØØØØØØÙØØØØÚÚÚÚÚÚÚÚÚÚÚÚÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞààààààààààáàààààààââââââââââââãâââââäääääääääääääääääåååååååååååååååæåæååççççççççççççççç褤¤¤éêêêêêêêêêêëêêêêêêêëìí ~        ´´´´´´´´´´´´´´´´´´´´´´´ î      žž##))77)))) BBBRRR___ )) ***+++,,---  ...///88866NNNN>>>CC]]DDDEE)))559997::::$$$$!!!!)!""""##"$%%%SSFFTT;;AAGGGHHIIIUUMMMOOOOVVV0000JJJKKK&&&'''111<<((22334444WWW@@@LLLbbaa====XXPPPYYZZZ[[[^^\\eee```dddff???QQQTcccc"!!    !"#$%&'()*+,-./01234567899999:99999999999999;<=>?999@ABC9DE999999999999999999999999999999999999999999999999999999999FGHIJKLMNOPQRS99999999999999999999999999999999999999TUVWXYZ[\]^_9`abc999999d9efg9h9i9999999jklm999999999n999999999999999999o9p99999999999999999999999q999999999999999999999999999999999999999r999999999stu999999999999999999999999999999999vwx999yz{|}~99999999999999999999999999999999999999999999€999999999999999999999999999999999‚9ƒ„9999999999999999999999999999  !!!"#$%&'()*+,-./01234'562789:;<=>?@ABCD;EFGHIJAKBLD;MNOPQRSTB;UFVWABCD;UFGPXJAYZ[\]Z^_`aSB;;bcd`eKAf;;bFd`egAhf;idjIAkfklmnopqI=rpstrWurvwdxyz{=rX|}t~€‚[[[[[[ƒC ZW„„…†<‡ˆr‰rŠ‹‡‡SŒur‡Ž=Grr‘r{‡’@“42‡”4‹•–—=<‹‹‹‹˜‹™š›‘šœžŸ ¡¢£¤¥Œ¦kl§¨©ª«W¬K­®¥I¥¯]°±±±±±±±±±±±²ª‹ ±±±±±±±³±±±±±±±±±±±‹´•µIu¥k¶‘ ·¸'‘yr¹42t‡>'Œ¥r@=¸ºr»}¼Q'½¾¾¾'¿r‘À‘ÀÁ!ÂÃÄÅ!KÀ‹k‘Æ=ÇÈÉÊËÌ ͱ±±±±±ÎkkkÏÐbÑ‹‹ ˆW ‹‘§‹r‹;Ò‹‹K¬Ó? @A0(?=:B<C:DE A@D(D0:? -0 D A -0> F?GDB(HI::JBD 9IF?:D0=IDK: 5I5LB?MN I ),  O H(,45PQQ  RSTUV WXW%Y%%@ @  @)Z[\]^^_^^_1`2 aa) @ :?IDb (:@ cd!!"!efdgX Whi jklm^no 29 (p,]:q%r(D:DI A  ?@ABC DEFGGGGGGHHHHIJJJJJAKKLMNOPQRSTUVWXYZ [\]^_`abcdefg hihjkhlhimnopqirs^Gtuvwxyz{|}~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€€€‚€~€€ƒH„JJ…†d-‡Fˆ‰Š‹d[ŒŽ[v‘’“”•h–—˜™Kš›            !"#$%&' $()*%%"+,-./  / 0$   " 1 $ " 222233333344444456-)7.)-&89: , .;1);<=65>6?6--+ 1$ @A  ""BC>----222D+6; C EB6FB#GHHHHHHGHHHHHHGHHGHHH3IJ4444"  K.  B+5&----------LM=NO PQQQQQQ             !"#!!$!%!!&'(!)*!!+,-./01234!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!56789:;<=>!!!?@ABC!!!DE!!!!F!!!!!!!!!GH!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!J!!!!KL!!!!!!!!!!!!!!!!MN!OPQR!!!!!!!!!!!!!!!!!!!!!!S!TUV!!!!!!!!!!!!!!!V!!!!!WX!!!!!!!!!!!!!!  !"#$%&'()*+)),-./0))12345677879:;<=>?@ABCDEFGHI>GJKLMNOPQRISTUVSWXYZ[\]^_`7abc7defghij7)klmnop))))))))))q)rst)u)vwx))y^))))))))))z{))|}~€)‚ƒ„))…)†)‡ˆ‰Š‹)Œ7Ž)‘’77“”•–—)˜)™š›77œžŸ ¡¢£¡¤¥¦§¨©ª«7¬­®¯°±77777777777²³77777777777´µ77¶·77¸¹7777º7»¼½¾¿ÀÁ)ÂÃÄÄÅÆ777777ÇÈ^)É^)pÊË))ÌÍ7Î)))))‡77))))))Ï7))))Ï7ÎÐÑÒÓÔ))ÕÖרÙÚ7ÛÜÝ)Þßàá2âãˆ:äå7)æçè)éêëìí7777)î)))))ïðñ)))ò))ó7ôõö))÷ø))ùÎ)ú)ûüýþÿ)))   7)))Í77)y777 7777ˆ) 7Î7)7)ƒ77‡77777‡ó77)77ˆ7777)‡‡7777))77777–O–– !7–ä"77777)#ƒ7)))Ì7777)))$7777)Ì777777)%777777))&'(777)7777777777*+,7777-77777./0123456789:./;1<=>5?@ABCD½EFGHIJKLMN77))))))Ã7)y))))))7777777OPPP7777Q     !" #"$!%&$'($$)*+,,,,,,,,,,,,-.'/0 1 2!"3 4,5 6789,,,,,,,,,,:;:$$$$$$<$=>?,,@A$$$$$$$$$$B,,,,,CDE$$$$$$$$F,G,HIJKLMNO$$$$$$$,,,,,,@P$$$$$Q,,RK$$$$$$$B,,)S$$$$$QT,,UUV$$$$$$UW$$X,,,,,,@,$$$$$$$$$$$$$QY,,,,U,$$QZP$P$9P$LL$$$$$W$+()Y,[[\]^Q_)9P<`L$$$$$W$Wa)I@][VbP+_Jc9P$^^$$$$$W$WP)Y,::VXQ_,[[Vd^Q_6eP<(W)aW`X<($$)d@dIVX]_9P$WW$$$$$W$$P)f,IIV;)dP$WW$$$$$W$$P)Y,IIV;gQ_a$$$$$$?@ABCDEFGHIJKLMNOO     !"#$%&'()*+,-./01&/234567891:8;<:=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdMefghijklmnopdqrsturvwxyz{|}~h€jQ‚ƒ„„…†‡ˆR‰Š‹DdrŒŽY‘’“”•^1–c—M˜…ƒ™šj›œž“Ÿ i¡¢£¤¥¦r§¨©Mªj«¬­®DZM¯j“r°r±²dd¢³´^Mdd—~µ‘ ~—¶d‹·‹ ¸j¦¹º»¼½¾¿ÀÁÂRºº€€ÃÃĽůÇÈɃZrþÿÿ ÿÿÿÿÿÿÿÃÿP ß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿ¿¶ÿÿÿÿÿÿÿþÀÿÿÿÿïþáœÿÿàÿÿÿÿüÿÿÿ0ÿÿÿüÿÿÿÿýðÿÿÿÿïÿßáÿþþîŸùÿÿýÅãŸY€°î‡ùÿÿýmÇ^?î¿ûÿÿýí㿟À°ìÇ=ÖÇÿÃÇîßýÿÿýïãß`ìßýÿß`@ÿÿÿçß]€üìÿüÿÿû/€_ÿ ÿÿÿ –%ðþ®ìÿ;_ ðÿþÿÿÿþÿÿÿþÿÿÿÿÿùçÁÿÿ@0¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿ‡ÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿÏÿÿ€ÿÿÿÿÿÿÿÿ?ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿþÿ€ÿÿïÿïÿóü¿ÿàüÿÿÿ?Þoÿÿ????ÿªÿÿß_ÜÏÿÜ€ÿ„ü/>P½ÿóàCÿÀÿÿÿÿx ÿ€ÿÿ€àþ>ÿÿààÿÿÿÿ?þÿÿÿÿÿ ÿðÿÿÿ€€ÿüÿÿÿÿyÿÿ»÷ÿÿüÿÿÿÿ÷ÿÿ?ÿÿ8ÿÿ<~~~ÿÿøÿÿÿ?ÿÿÿÿÿøàÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþ?ÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷–þ÷ „ê–ª–÷÷^ÿûÿîûÿ        !"#$"%&'()*+,-./0123456789:;<=>?@ABCDEFGH=>I@J673?@AB%&6CDþÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®¤ªJUUÒUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿ„8'>P=À Àÿÿê%À(UUUUTUTUUUjU(Uÿÿÿÿðÿÿ?ÿÿÿÐdÞ?ÿÿÿ°çß{_üðÿÿ?ðÿÿ?üÿÿðÿÿÿ       !"#$%&'()*+,-./01234567//$$889þÿÿ ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿïÿÿÿÿ Ï<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿ¿ ÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ€ÿ„ü/>P½òàCÀÿÿÿÿÿÿÿÿx ÿ?ÿÿÿüÿÿÿÿxÿøÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷    !"#$%&'()*+,-./0123  !"#$!%&$!'# ()#*+,-#(.#"#/0123456789:;<=!>??@@ABCDEFGHIJKL*MNOPQRSTUVWXYZ[\]^_`abcdefghiRjklmNn4opqrstudvwxyz{|N}~l,€‚ƒ „~N…†N‡ˆ‰Š‹Œ Ž€@@¡ÿÿÿÿÿÿÿÿ0°øþÿÿÿÿ¿¶ÿøÿÿÀ¿ÿ=€ÿÀÿø?Àÿÿ?ðÿÿþ!þ  †9#¾! @ ÀÁ=`@0\òÀò@? þßàÿþÿÿÿ@àýfÃd à °?@þ x‡€ @åøŸ€Ðø< @£ðÏ?÷ÿý!ðÿÿÿøð ààà`ø|ßÿ€ÿÿÿ0€€€€ <>~p €÷¿€D`ÿÿÀ?€ÿÈ~fÁ 0X !üÿÿÿ$ nð‡ÿx&€ïÀ(¿€ÿÿ€øÿç<ÿÿ        !"#$%&'()*+,-þÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿÿ@ Àÿÿê%À(UUUUTUTUUUjU(Uÿ       !"#$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢`[Uµªª-ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿÿßPÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ       !"#!$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢ÐVUµªª+ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿß@ÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ        !"#$%&'()*+,-./01þÿÿ ÿÿÿUUUUUUUªªVUUUUU«ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzU E@×þÿû€cUUU³æÿÿÿÿÿÿTUU«*UUUþÿÿÿ€¿ UULÿ?ÿÿ?ªÿÿÿœœœ@ Àÿÿê%À(UUUUTUTUUUjU(Uøÿ      !"#$%&'()*+,-./01þÿÿ ÿÿÿÿÿÿÿÿÿÿþÿßÿ÷ÿóÿ³ðÿÿÿýÿüÿÿß i‹&  Ï8@×ÿÿûÿÿÿÿÿãÿÿÿ·ïüÿÿÿþÿÿÿþÿÿÿÿ¿ "ÿÿÿOÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ@ @ÀÿÿÿÿÿÿÿÿÿÿmÀx ÿ?ÿÿÿüÿüÿÿÿþÿ8ÿøÿÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMM     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžkŸ ¡^¢y£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ –%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿøÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOP    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨•©Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß<À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿþàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_Ûÿÿÿøÿÿÿüÿÿàßÿüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNN     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžk kŸ ¡^¢ky£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß8@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ–%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿàÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿŠªÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQ    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨N©•Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß8À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿæàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_ÛÿÿÿøÿðÿÿÿÿÿüÿàŠªüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ      €€0xø|ÿÿÿøÿÿÿÿ    !"#$%&'()*+  !"#$%&'()$*+,-./0123456789::;;<=>?@ABCDE#FGHIJKLM NOPQRSPTUVWXYZ[\]^_`$a&bcdeaFfgFhijklmnÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿøÀûï>ðÿÿþ!þ P €†9#¾!Ð À@ €ÀÁ=`D0`„\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8‡€ @åøŸÐ< @£ðÏ÷ÿý!ð0ÿÿ€€ü€÷?D`ÿÿÀ?€ÿÈ~fÁ0@ ! nð‡ÿx€ïÀ(¿€ Ãøç<             !"#$%&'()*+,-./012222222223456789:;<222=>?@A2B2CD2222E2FG222H222I2222JK2222222LMNOPQRS222222T2UVWXYZ[\]^_2222222_22222  !"#$%&'()*+,!-./0123456789:;8<=>?@AB CDEFGHIJKLMNOPQRSTUVWXYZ[\Z]^_`abcdefghZijklmnopdqrstuvwxyz{|}~€‚ƒ„…†Y‡ˆ‰ Š‹ŒSŽ‘ˆh’‡ “”•‹Y–h—˜™š›fœžŸ f¡¢£¤Z¥¦§¨©ª«¬­®–¯°[±²³´µ¶·¸¹µº»Z ¼½¾¿ÀYÁÂõZZ]–ÄÅÆÇÈÉÊËÌ͈ÎÏÐÑÒÓfÔvÕÖרÙvÚ×ÛÆÜÝÜÞßàáhâãäåæŽ`€çèéêëìíîéïðñòóôlˆõöƒ‹lY÷øYùúZˆû]Óü–·ýþÿˆŽ\ÿÿÿÿÿÿÿÿßÿÿÿ|ð×ÿÿûÿÿÿüÿÿÿþÿÿÿþþÿÿÿÿ†@IÿÿÿÀÿÈÿÿÿþÿÿÿ?@`Âÿÿÿ?ýÿÿÿàÿÿ?ÿðÿÿ?ÿÿÿÿAýøÿÿÿÿÿÿëÞÿóÿÿþìŸùÿÿýÅ£Y°Ãÿÿè‡ùÿÿýmÃ^Àÿè¿ûÿÿýíãÃÿÿýí#°ÃÿÿèÇ=ÖÇÿƒÆÀÿÿîßýÿÿýï#Ãÿÿìßýÿÿýïc› @Ãÿÿÿÿ§Á]Ãÿ?þìÿüÿÿû/ÿÿ €€ÿ–%ðþ®ì _ÿóÿÿÿüÿÿ_ýÿþÿÿÿ€ À¿ßÿÿ™ÿÿÿ<þÿáÿ›ßÿß¿ ÿÿÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿcÿÿÿßÿÿOÀ¿ðÿÿÿÿÿÿÿÿÿÿÿÿ?xûñÿÿÿÿ?ÿÿÿÿÿÇÿÿÆÿÿ¿àÿ?ðÿÿÿÿÿ/èûÿÿÿðüÿÿÿÃôÿÿ¿\ ðÿ0øÿãÿÿÿÞoÿÿ????ÿªÿÿÿ?ÿÿßÿßÿÏïÿÿÜÿÿÿÿ€ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ€ÿÿÿÿÿÿÿÿûÿÿÿøàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿ»÷ÿÿŸÿÀÿü?Àÿÿ €ÿÿ7ìÿ¿ÿÃÿ÷/ÿóÿÿb>øÿÏ?~~~ßÿøÿÿÿ?ÿÿø ÿÿ_Ûÿÿÿøÿÿÿÿÿüÿÿÿ?ÿÿÿ÷ÿßÿüüü0ÿïÿÿÿÿ·ÿ?ÿ?‡ÿÿÿÿÿÿÿÿÿÿÿ¿ÿ?ÿ?ýÿÿÿÿ¿‘ÿÿ¿ÿÿÿÿÿÿÿƒÿÿÿÀïþÿÿÿÿ?þÿÿ?ÿÿÿÿÿýÿÿÿ€?üÿÿÿ‡ÙÿÿÿÿÀÿÿÿ?€ÿ×@ÿÿÿÿÿÿøÿþÿÿ_<ðÿÿÿÃÿÿ#ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿÿÏÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿþþÿþÿÀÿÿÿÿÿÿ¿ÿßÿÿÿøáÿ?      €@@> ÿƒ€À|À0      @@?€    @€ „ÿðà„            !"#$%&'()*+,-.    !"#$%&"'(")*+,-.PŒ@€ˆÿÿ0 á þ`8p<ìøÀ0€@àøÀÀ€à€÷€ü€?`     !""#"$%&"'()""""""""""*+,##--../"&01234@'3@``ÿbø„ü/>³ûñààó¶>Ãðÿ?ë/0°ÀðÁŒ”``Àÿøÿÿ0 PÿÿÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿÿÿ÷ÿÿÿÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿ~~ÿ~~ÿ~~     !  !"!#$%&'()*+,-. /012345678+9:9;*<=>?@>ABCDEFG5HIJ5@5KL#M ÿ¿¶ÿøÿþÀž!ÿÿÀÿÀøïðÿÌÿßà ÀŸ€‡#¿ŸÀÇ€ß`߀€_ÿ ò òþÿàÿþÿÿÿøyÀÃ…|0€Àÿÿÿÿ€àþÿàÿþ3€ÿðÿ?ÿÿÿÿÿðøðÿÀ€ÿþ0Aø ø@nðÿ?ÿøÿø?ÿÿÿ   Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?      !"#$%&'(  !"#$%&'()*+,-./0123456789:&;<==>?@ABCDEFG)HIJK@ÿÿÿÿÿÿÿÿà00øþÿûÿÿ¿ø‡€aÿÀÿø?ðÿÿ  €_ ÂÜ@€€¿ þ àŸø À?ÿ!ðÿÿðÿà ààà`€€ü€°€ÿÿÿx@0À€ÿÿ€ãøç<     €@€@ >`p €  ÿ ðÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿ0ÿÿÀÿÿÿÿÿÀ@€`€€0ÀÀ Àó ÿÿÿûÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀ€šÿÿÿÿÿÿÿÿÿÿÿ? €€0 ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿ    € @@  À À À À`@€€þ         !"#$%   !"@€P€0 „@`ÌÀ0€ÀˆÀ€àÄ€`8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ> À   þÿüxþZCˆ€ÿÿÿÿþÿïÿÿÿÿÿÿ?ðÿÿÿÿÀ`                    !"#$%&'()*+,-./0123456784449:44444;<=>?@4ABCDEFGHIJKLMNOPQRSTUVWWWXYZ[\]^_``a`b`c`````d```efghijklmnopq````````````Wr``stuvwxyz{|}~€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€    !"#$% &'()*+,- ./01 2 34 156 372 86 39 1:2 ;4<1 = > ? @AB1C 3D 1 4 1 EF GH IJ K L MNOP< QR STUVW Q X  YZ [ [ 1 1 \]^ X_ ` abc d e fghi j= kil m nl op qrs to uvwwxyz{|}~€ T‚ƒ„…† ‡ˆ‰ Š‹Œ Ž ‘’“X ”• – — ˜‹‰ —™š› œ ‹ x  ž ’Ÿ   d ¡  Œ w –¢ – l£ ¤ ¥ ¦§ ¨ s l © ªl - « ¬­® ¯2 D< ° ±²³´Xtµ¶·¸‰ ¹º» — W¼½¾¿ÀÁ2 Ât‰ l à - ÄÅ l Æ ÇÈ –- ÉÊË Ì Í Œ Î ¡ ‡ ÏÐÐÐÑ—‹ÒÓ’’ Ô … Õ“‹Ö Ò×ØÙ‹Ú Û ‰ ‹ Ü             ! """"""#$%&'((((((()##*+,((((-./012(3((((-""456""7 8"""('9 :;<;=< > = ;<; =?  @ @A= ;>E @ F  : >G =9 9=B;   HI<9E <<; ; <; :@ = =  J >; B :< = KL = 9; : <   A :9G<;A E9;  >B :H > 9E;= ; 9 M   NNOP QRST U VWXYZFZFSSSSF   M[\   [ ]   F F    F    ^ >   _ F F `a :: @ b > >; <9@@  ;EA;> =;= c""d"(((e(((fgh ijFk (((lmn Fop[ """q!"""r4""s #######t 9@ <; >9 =B  uv9< >wx [ yz((( F F{  F     |                                                   !"#$%&'(  !"#$%&''()*+,-./0123456789:;<=>?@A.BCDEFGHIJKLMNAOPQFRSTUV   !"#$%&''()*+$,--.&/0012+34#5678977:;<=>?@ABCDEFGHIJKL0M;NOPQM0R6M STSJ5 UVL9WX5YZ[9N\]91^_`a11;1b@^JMcd9&N;e5Lfg^h5^Mijklmbn0&1&9222223----3+-----))----))-------222262---222--222----23--2455455422-2222-222.-22--2.12 2- 22--2-22-22222-22-2-22--2--2-2-2222222222---2---22222-22 !""####$$%%%%----+&'('''''2222--21.2--2-225*-)2224-2-2222-2,13.//-222-2-22-++0+++++---   !"###########################################$#%&'()*+,-./01234##5   !! "#$%&'()*+!,-./012345675899:;<=!>?<=!@ABCDEFGHIJKLIIMNOOPQRSTUVWXYZ[\]^_`abcdeffghijklmnoppqrstufffvttwxyz{|}9fffffffffffff~€‚ƒ„…‚ƒ„†‡ffffˆ‰fˆffŠ‹tŒttttttŒŽŽŽŽŽfŽŽŽŽŽŽf‘’“Q”•QN–—˜™š›œœœžŸ ¡¢££££££¤¥¥¦§§§¨©ª£«¬­®¯°±²¥³´µ¶·¸¹º»¼½¾¿ÀÀÁÂÃÄÄÄÄÄÅÆÆÆÆÇÈÉÊËÌÍÍÎÏÐÐÐÐÐÑÐÐÐÒÓÔÕÐÐÐÖ×ÐØÙÚÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÜÐÐÐÕÐÝÞßàáâãäåäæf玎èéꎎëìíQ                !     "#$   %    & $$ ''()*+,-   .. /  01234567***+***8#9":;;<=>?@ABBCD;E=>FFFFG   $H# % $  !IIIIIJIIIIK#L,M$$$$$$. ! N% O"IPIIIIIIKQQQQQQQRQQQS7$  $! .;;T $ UVVVVVVVVUUUWUVVXYZ[\UWVUUU]W^^^^^________`aaaaaaaaabcccccd^^e______faccghaijkilih`_i`mnaojpi_jq_`j^^^rsstsssssuvwxxxxwxyz{{|[}~Z}~[}~}~[€‚‚‚‚‚‚‚ƒ„„„„„„„„„„…†„†„†„†‡‚ˆ„… ;;;;;‰;;;;;‰Š‹=‰;;B=;=;;;BŒ=;‰;‰;;BŒ;Ž;‰;;;;>;;;;;Ž‹=;Œ;Š‘=‹‹Œ;Œ;=;;B;;;;==B;’K“”QQ”#•                        !"#      !"#"$%&'()*+,-./01,23!456789:;<=>>?@A&BCDEFGHIJKLMNOLKPGKQKRSRGTUVWXXXXXYZZZZ[\]^A_`a"`bPc_Oa                                  !"""""""#$$$$$$$$$$%&$&$&$&'"($%    !"#-+-) ##!!'' 777 +--++- ###!!'  &  8 )++++++++7/7+--..)#! ,2**01$  "%( 345 # # # 77-++66 ## ' --+9  !"#$%&'()*+,-   !"#$%&'()*+,-.+/-0,1/-2+,3.4+56789+3:+.+;<=>?@ABCDEF4GHIJKGLL++MNOPQRSTUVWXYZ[5\Z]^_]`abcde`fgh]ijk]l9md]no]'pqrst,u4vwexyz,{e]|'}~]€'‚ƒ„iL,  !"#  $$% &'%$! ()*+  %   ++ % %++%, - % +% +./.0 ++,  %+-%  1% %%++2%%   % + %        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOYZ[\]^_`abcdefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefglmmmmmmmmmmmmmmmmHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHOOOOnopqrstuvwxyHz{|}HHHHHH~H€H‚HƒHHH„HHH…†‡ˆHHHHHHHHH‰HHHHHHHHHHHHHHHHHHŠH‹HHHHHHHHHHHHHHHHHHHHHHHŒŽHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH‘’“HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH”•–—H˜H™š›œHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHžŸHH ¡¢£¤H¥¦§¨©ª«¬­HHHHHHHHHHHHHHHHHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO®¯H°±HHHHHHHHHHHHHHHHHHHHHHHHHHHH      !"#$%&'()*% +,-./0000100023456789:;<=>?@A:;BCDEFG;HIJ?K9:;HLM?NOPQRSETUV;WXY?Z[V;\X]?^[V_`a?bcdefg0hijjklm00nopqrs00tu%v8wxyz{|}00jjjj~jjjj€‚‚‚‚ƒ„„„„„…†…‡ˆ‰ˆŠ‹wŒŽŽJ‘’“”‘•jjjjj–—Œ˜—™šw››œjžjjŸj ¡¢jjj£j¤——00000¥¦§¨©ª«¬%)­¦®¯%°0000±²³´µ¶¶·¸¹¹º»¼½¾¿ÀÁÂÃÄwÅÆÇÈÉÊËÌÍÎÏÎÐÑÒÓÔÕÖרÙÚÛÜÝÞß0à0áááááááááâááááÍááãáäåæçèéêëìíîïðñòóôõö÷øùáúûüýþÿw0000000000..€ß  0000       Þ              0             Þ                         !   "°#$0%&'.(à0000Z)*+,-¦.—/%01234456007´89jŸjjjj:; <=>000000000?—@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDBCBE‚F„„GHHHHHHHHßIJKLMNO0P00QR´STUV¹WXY Z [\]^._`abc‰d¸¸00àefàg000hwJ00.(à000ijk00¸—00000lmn00op0000q0000rstuvwxy000000000.«z{P|0«}~y—«1€000«4—00 ‚—000.0ƒ€„…†.00000y0000‡3ˆ«000000‰0000000šŠ‹Œ¸00000ßM¹‘Ž‘’“”Vw•–––—˜™š›œgžg000M        ÞŸ00 á¡ááá¢áá 0000£¤¥  ¦‰00  §¨   ! Þ ©ª0 §   «     ¬­   ®¯°±²( ³00000000´    µ000     000(       ¶00  !"""#$%$$&&'$$$$'&'()$*+,-.$$$$/////////////0$$/1&$$$$$&23 456 78-9--- '5'-$$$$$$$:&$$$&$&$$$$$$$$&&$$$5-; '+'&'&'&&&$$-5+5+&$$$+$$'$ 32 $$+'&$'&'&$55$+5+$+$$$'&&$$$ $$$$$+''&'$-++$&$$$$$$$ $$$$$$$5+5+$$$$$$'$-'&$&$'&&$'&$&$$$5$5$&$$+$$$$ &$$+'&&'$'55$$$+5$$$$$$$$'&'$-$$+5$$$&'&$$$$$$&'55&$$$+$$$$$<$'&$''$&$5$+55$&$$$$$=>>>>>>>>>>>>>>>>>>>>?$*>>>>>>>@ ;$$=??=??=$$$>>=>>>=>==$>=>>>>>>=>$>>??>>>$ $>> AABCD66E9,FF&$++5;-&AGHI$$ ; >>>'$$'$JJJJJJJJKKKKKKKKKKKKLLLLLLLLLLLL&$&&$&$&&$&&+$$$&$$$$$MN$;&5$$$$$)$$$$$$$$$$&$$$$$$>>;OMP>$ $$$6;6I&$$$$$$$$$&$6 >>>>>>>$>>?$$$$$>>>>>>$$>>>>>$$$ ?$>$>>>>>>>?>>>>>>?+--$$ ;;M&$-$$$$$Q;; $';---&$$$$5$$$$$$$$$$$$''''$&$'$& &;;;R;SR;TUVUVWXY!3333Z[\][M;;;^&$_N5$$$$$$$22`$$$abaa$$$$$$&$$$$&$$aaacaaadaeddaaaaaefdafeaefaefaafaefagacaaaU6FFFFFFFbFFFFFhhhhhhhhhhbFFF$$$$$i;Mj$$$')$$$$$$+&&UUUUUUU;;;;kUUFFFF;;9;Ml$$aaaaaaaaaaaaagaaaaa$$$$$aaaaaa$$mnaFFFFFaFFFFopaaaaaaaqaanrasttttaaaataaaaaaatttaaauaatv+w[rxttttaaaaatuanyr$$gaaaaaaaaaaaa$gaaaaaaaaaaaaaazaaaaaz$${{{{{{{{aaaaaanaaaaaaaaaaaz$aaaz$$$$j $$-$$$+;;$$$$$$$$$$--$$|$$$A6$$$$5$$$$;$$;$$$$$'JJJJJJ}$-;' $$$ $;>?$$$$$$$$$$$=>>;5$$$$'&'&'&$$$$$~~~~$$$$$$KKK€$LLLLLLLL$$‚‚‚‚‚‚‚‚$'$$ƒ„////1//////0//00/ƒ0/////$$$$$$$$'F$|$…†:‡ˆ$$$aa‰hhhhhhhm‰maaamN[6‰hhmaaazŠ‹$$&ŒiaaFammaaaaa[aaaaaa‰Žaaaaaa‰Ž‰pF]{{{{[$$$$&$aŠ‘&$$$$+’$'&';)$'$'$$$Q$$M$$$$$$&'&$&'Q$Q$$'$$$+5$$''$$5$+;;;;&$$$$Q;;;$&$$&$$$M$ -;;$$$$$$$5 ;;$$$$$$-M)$$$$$$$&$$$$$$“FpbFFp$$$$$$$+a$$$$$$$--$$$$$$&'&'&''''&'&&'&&&$$ '&&''&''$$$&$'''''&&''''''&&'&&'&&''''gaaaaaaz”$$&$$$$$•••••••••••••az$$$$$$aaaaz$$$z$$$$$$$aaagaaaaaacdaadaaazaaz$$zaaaaaaadddaaaaccdaaaaaaaaaagaz$daaaaaaacdaaaaaa$aaaa$$$$$$$$$gaaz$gaaaaa+$$$$$$$ $     $         %%%%        !!         & && &&& && "### !%%     && ''           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNK    !"#$%&'()$*+,-./01234567,85,69*:;<8=>?7@ABC#DEFGHIJGGKLMNOPQRS:+T:#UVW*<0$      !"#$% &%%#'(#)*+,$$+-./+0'**(1-+(--'*-+ ''2$  *(3 45 678 9('++(#*           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUUVWXYZ[\]^_`abcdefghi>jklm       !"#$%"#$%&'("#$)*"#$)*"#$)*+,-./012"#31245607"#89:;<=>?@ABCDEFGHIJKLMNOPCQRSTUVWXYPZ[\K]^__`abcDKdeQfg01hijklKgmno 9:pqrstuvwxyz{|}~€‚zƒ„g…†‡ˆ‰Š‹Œ"Ž"Ž"#‘’“”•012–—˜   1™#š›œ žŸž ¡¢£¤¥¦§¨©ª"#‘« ¬ ¬ ­1®F¯bC[°XXeIIPk±²!#%' !#%' .  (U^(U^ %' "$&%'(2?@ABCDEFGHIJKLMNOP##g's(^Ust%!(^2<F'2(%#'U^!!#%'  (!!(TUVWXYZ[\]^_`abcdefghijklmno PYbk(PUY^b(PUY^gk((((((Ãÿÿ?ÿÿÿ?y;xpüÿøÿÿùÿÿ?Â7:ð3üÿßSz0p€0¼þÿÿÿÿÏ¿ÿÿÿÿP|pˆ/<60ÿÿó~0P(¨  €       !"#$%%&&'()*+,-./0123456789:;<=>?@ABCDEFGHI,JE              !  "#$%%$ &' ( )* +,-. &/,(012  # 3 4( 5678! +,#9 : ' (%;                !"#$ %&'($ )&*($+,"-./0123456789:;<=>?@ABCDEFGHIJKLMNMNOLPQRSTU?VWXYZ[\]^_`abNcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽN‘’“”•–—˜™š›œ     !! ""#$% &'()*##+&& ,++-.& -/*,++012.$*34# *5"678$  9":;6< ) =>?@ABBCBBBBBBBBDEFGHIJ KLMNOPQRST6UVWXYXZ[#=\]^_`abcdeffghijcklEXmcnoOkpqrstuvwxyz{|}jc~ !€l‚ƒ„…†‡uˆY‚f‰klŠ‹ŒXŽYuQccc‘ ’T“ul”J•–c—˜Q-™ š›5œœXlžYœl?uŸ                                                      !"#$%&'()*+,-./0123456789:;<=>?@AA BBCDEFGHHHIJKKKLMMMMNOPQRSTUVWTUTUVWXYTUZ[TUTUTU\]^_`abc^defghiijjklmmmnnnoHHHHHIKKKKKLpqrs%tuvvvvwxRDDyz%{| }}}}}~~~~~      !"###$$%&'()'()'()*'()+,-./01123456789::;<:=>?@ABACDEFGGGHIIJKL!!!MNNNOPPQRSTUVWXYZ[\]^^^_`abcdefghijklmmnopqrstuvwxy---zzzzzzzz{{{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€‚ƒ„…†nnnnnnnnssssssssnnnnnnssssssnnnnssss‡‡ˆˆˆˆ‰‰ŠŠ‹‹ŒŒnnssŽŽ‘‘‘‘nn’ss““nn”vss••y––——˜™š›œžžžžžžžžŸŸŸŸŸŸŸŸŸŸ          ¡¢£¤¥¦§¨©ªª««««««««««««««««¬­®¯¯¯¯¯¯¯¯°°°°°°°°       !"#$%%&'()***+,,,,-./01211231111456789:;<<=>???*****+@ABCD /EFGHHHHH    !""#$%&'()*+,--------.//////////////////////0000000000000000123333333333333333333344567777533883399,::;;5<=>?@@@@@@@@AAAAAAAAAABCDEFGHIIJKLMMMMMMMM ‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0`ÆÿÿÿAâÿÿøÿÿÿ¶ÿÿÿ÷ÿÿÿûãÿÿªÿÿÿœÿÿÿÿÿÿ€ÿÿÿ‚ÿÿÿ£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿ(         !"#$%&'())*+,-.///0122223456787789:7;<=>?@ABCDEFGHIJKLMNNOPQQQ/////0RSTUV$W++XYZ[\]]]]]      !"#$$$%&&'()*+,-./01233333333455555555555555555555556777777777777777789:;<=>??????????????@ABC????DDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJKLMN??OOPQRSTUVWWWWXYZ[\??]]^_`ab??cc2defghiijjklmnoppppppppqqqqqqqqqqrstuvwxyyz{|}~€‚ƒ„…†‡ˆ‰‰‰‰‰‰‰‰h·ákMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| ˆ düÿ‹A…B x Å A @ÌüÿCA…B u Å D zR| ˆÔüÿ 0ÐüÿDÌüÿ XÄüÿ lÀüÿ€Àüÿ ”¸üÿ ¨°üÿ¼¬üÿ Фüÿä”üÿøüÿ €üÿ. œüÿ4˜üÿ#H¨üÿJ(\àüÿÇA†A ƒC S  AÃAÆB ˆ|üÿ!,œŒüÿŠA†A ƒC0I  AÃAÆD ,Ìèüÿ‚A†A ƒC0D  AÃAÆA Dü<üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇDDxüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ,Œ´üÿ‚A†A ƒC0D  AÃAÆA ,¼üÿŠA†A ƒC0I  AÃAÆD ìdüÿ+|üÿ'üÿ( üÿr|<lüÿÍA…A ‡A†AƒC@i AÃA ÆAÇAÅD h AÃAÆ AÇAÅD l AÃAÆ AÇAÅD lAÃAÆ AÇAÅ|¼¼üÿÎA…A ‡A†AƒC@i AÃA ÆAÇAÅD i AÃAÆ AÇAÅC m AÃAÆ AÇAÅC mAÃAÆ AÇAÅ< üÿ 8Püÿ[A…A ‡A†AƒCOAÃA ÆAÇAÅ<Œ$üÿïA‡A †Aƒ}  ÃAÆAÇB hà AÆAÇ,ÌÔüÿBA†A ƒj ÃAÆC PÃAÆüèüÿ àüÿ$Ôüÿ8ÈüÿL¼üÿ`°üÿt¤üÿˆ˜üÿœŒüÿ€°€üÿTA…A ‡A†AƒC0Z AÃA ÆAÇAÅC o AÃAÆ AÇAÅA à AÃAÆ AÇAÅD g AÃAÆ AÇAÅA 4Püÿ7AƒCqAà ThüÿVAƒs ÃD ]ÃxœüÿŒüÿfC0Y D E¬ØüÿPÀÜüÿ5A…A ‡A†AƒCp¸ AÃA ÆAÇAÅA lAÃAÆ AÇAÅ4À üÿ\A†A ƒC0w  AÃAÆB Y AÃAÆ4Lä üÿ„A‡A †AƒC c A ÃAÆAÇD („0 üÿ4AƒC Y AÃB RAð8 üÿ4Ä8 üÿJA‡A †AƒC s A ÃAÆAÇD (üL üÿ/AƒC b AÃA EAÃ4(P üÿ!AƒC e AÃB z AÃA p AÃC ,`< üÿŠA†A ƒC0I  AÃAÆD ,˜ üÿ‚A†A ƒC0D  AÃAÆA DÀì üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ (üÿ8 Lüÿ0 @üÿ‹C ] D V B lP ¬üÿ…A…A ‡A†AƒC`R AÃA ÆAÇAÅA c AÃAÆ AÇAÅC × AÃAÆ AÇAÅA À ÄüÿÔ Àüÿdè ÀüÿÁA…A ‡A†AƒC@ AÃA ÆAÇAÅD K AÃAÆ AÇAÅA PAÃAÆ AÇAÅPP üÿ‰A…A ‡A†AƒC@f AÃA ÆAÇAÅC PAÃAÆ AÇAŤ TüÿC R(¼ TüÿHA†A ƒC0{  AÃAÆB 8è püÿÕA†A ƒC v  AÃAÆC 8  AÃAÆB h$ üÿA…A ‡A†AƒC0™ AÃAÆ AÇAÅD | AÃA ÆAÇAÅD S AÃAÆ AÇAÅA h ´üÿõA…A ‡A†AƒC0… AÃAÆ AÇAÅD u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA hü @üÿíA…A ‡A†AƒC0€ AÃAÆ AÇAÅA u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA <h ÄüÿLA…A ‡A†AƒC@u AÃA ÆAÇAÅA <¨ ÐüÿOA…A ‡A†AƒC@{ AÃA ÆAÇAÅA è àüÿAƒCYAà àüÿC Z( èüÿ A†A ƒC W AÃAÆ4L ÜüÿAƒC0g AÃD W AÃD W AÃD <„ ¸üÿA…A ‡A†AƒC@ç AÃA ÆAÇAÅA hÄ ŒüÿA…A ‡A†AƒC0¡ AÃAÆ AÇAÅD B AÃA ÆAÇAÅB S AÃAÆ AÇAÅA l0@üÿ‚A‡A †AƒC0H A ÃAÆAÇC l Aà AÆAÇA  Aà AÆAÇB N Aà AÆAÇC H Tüÿ>A†A ƒC0Y  AÃAÆD c  AÃAÆC N  AÃAÆD ìHüÿ HüÿAƒC e AÃB <$´üÿA…A ‡A†AƒC@Û AÃA ÆAÇAÅB d”üÿ4AƒC mAĨüÿ4AƒC mAÃD¤¼üÿ‡A‡A †AƒC0O A ÃAÆAÇD E Aà AÆAÇD DìüüÿšA‡A †AƒC0s A ÃAÆAÇD N Aà AÆAÇC P4PüÿeA…A ‡A†AƒCPs AÃA ÆAÇAÅB N AÃAÆ AÇAÅB <ˆd!üÿAA…A ‡A†AƒC0ö AÃA ÆAÇAÅC 8Èh"üÿaA†A ƒC Q  AÃAÆD d  AÃAÆB 8"üÿ]A†A ƒC R  AÃAÆC a  AÃAÆA (@´"üÿqA†A ƒC Q  AÃAÆD (lü"üÿqA†A ƒC R  AÃAÆC 4˜D#üÿTA†A ƒC0B  AÃAÆC E AÃAÆ8Ð`#üÿAA…A ‡A†AƒC uAÃA ÆAÇAÅ\ h#üÿ³AƒC P AÃC w AÃD Q AÃB Z AÃE F AÃE F AÃE F AÃE 8l¼#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇ8¨´#üÿ8A‡A †AƒS  ÃAÆAÇD Yà AÆAÇ8ä°#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇP ¨#üÿvA…A ‡A†AƒC@d AÃA ÆAÇAÅA } AÃAÆ AÇAÅC TtÌ$üÿA…A ‡A†AƒCPQ AÃA ÆAÇAÅD q AÃAÆ AÇAÅC |ÌŒ%üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|L&üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ4Ì„&üÿIAƒN ÃA P ÃH D ÃH D ÃH DÃ|˜&üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|„'üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ<'üÿÿA…A ‡A†AƒC@n AÃA ÆAÇAÅC hDP*üÿ A…A ‡A†AƒCpv AÃA ÆAÇAÅC e AÃAÆ AÇAÅA n AÃAÆ AÇAÅA X°è3üÿÔA‡A †Aƒ[  ÃAÆAÇD p à AÆAÇB y à AÆAÇA }à AÆAÇX `4üÿåA‡A †Aƒ_  ÃAÆAÇD u à AÆAÇA ~ à AÆAÇD ~à AÆAÇdhì4üÿóA‡A †AƒAm A ÃAÆAÇD w Aà AÆAÇB x Aà AÆAÇA Aà AÆAÇ€Ðx5üÿXA…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB O AÃAÆ AÇAÅA R AÃAÆ AÇAÅB €TL6üÿ`A…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB S AÃAÆ AÇAÅA V AÃAÆ AÇAÅB hØ(7üÿüA‡A †AƒAm A ÃAÆAÇD | Aà AÆAÇA y Aà AÆAÇD @Aà AÆAÇ|D¸7üÿõA…A ‡A†AƒC@{ AÃA ÆAÇAÅB p AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|Ä08üÿöA…A ‡A†AƒC@{ AÃA ÆAÇAÅB q AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅlD¨8üÿÊA…A ‡A†Aƒj ÃA ÆAÇAÅC j ÃAÆ AÇAÅC n ÃAÆ AÇAÅC nÃAÆ AÇAÅ|´9üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅ|4:üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅl´,;üÿËA…A ‡A†Aƒj ÃA ÆAÇAÅC k ÃAÆ AÇAÅB o ÃAÆ AÇAÅB oÃAÆ AÇAÅ<$ˆ;üÿcA…A ‡A†AƒCpC AÃA ÆAÇAÅA <d¬<üÿšA…A ‡A†AƒCpY AÃA ÆAÇAÅA H¤>üÿ‰A…A ‡A†Aƒi ÃA ÆAÇAÅD C ÃAÆ AÇAÅB <ðH>üÿkA‡A †Aƒ| à AÆAÇC [  ÃAÆAÇC 00t>üÿTA†A ƒa ÃAÆD Q ÃAÆB <d”>üÿsA‡A †AƒX  ÃAÆAÇC I à AÆAÇA 0¤È>üÿoA†A ƒU ÃAÆD I ÃAÆB 0Ø?üÿoA†A ƒU ÃAÆD I ÃAÆB  @?üÿ D?üÿ1C U D T@X?üÿ%<Tl?üÿôA…A ‡A†AƒC0V AÃA ÆAÇAÅC <” @üÿºA…A ‡A†AƒCPZ AÃA ÆAÇAÅC DÔœDüÿ€A‡A †AƒC È A ÃAÆAÇC ` Aà AÆAÇA DÔEüÿ’A‡A †AƒC`q A ÃAÆAÇB | Aà AÆAÇA (d Füÿ/AƒC T AÃC QAÃT$Füÿ!A…A ‡A†AƒC`Y AÃA ÆAÇAÅA o AÃAÆ AÇAÅA <èðGüÿ]A…A ‡A†AƒCPw AÃA ÆAÇAÅB €( Lüÿ_A…A ‡A†AƒC€¥ AÃA ÆAÇAÅA K AÃAÆ AÇAÅA © AÃAÆ AÇAÅA «AÃAÆ AÇAÅT¬ ìQüÿHA…A ‡A†AƒCp] AÃA ÆAÇAÅA w AÃAÆ AÇAÅA l!ÜSüÿøA…A ‡A†AƒCp‰ AÃA ÆAÇAÅD W AÃAÆ AÇAÅA M AÃAÆ AÇAÅC <t!dYüÿiA…A ‡A†AƒC0b AÃA ÆAÇAÅC (´!\üÿ"A†A ƒA\ AÃAÆ4à!ˆ\üÿ¸A‡A †AƒC u A ÃAÆAÇB h"]üÿÆA…A ‡A†AƒC`q AÃA ÆAÇAÅD M AÃAÆ AÇAÅA oAÃAÆ AÇAÅd„"d^üÿBA…A ‡A†AƒC`y AÃA ÆAÇAÅD Ò AÃAÆ AÇAÅA ^AÃAÆ AÇAÅdì"@_üÿfA…A ‡A†AƒC`y AÃA ÆAÇAÅD ã AÃAÆ AÇAÅA qAÃAÆ AÇAÅhT#@`üÿžA…A ‡A†AƒC`q AÃA ÆAÇAÅD ' AÃAÆ AÇAÅA mAÃAÆ AÇAÅdÀ#taüÿVA…A ‡A†AƒC`s AÃA ÆAÇAÅB í AÃAÆ AÇAÅA _AÃAÆ AÇAÅT($dbüÿ/A…A ‡A†AƒC0n AÃA ÆAÇAÅC E AÃAÆ AÇAÅC <€$PyInt_FromLongLPyList_AppendRPyList_NewSPyList_ReverseTPyList_SetItemZPyLong_AsLong]PyLong_AsUnsignedLong|PyMem_Free}PyMem_Malloc~PyMem_ReallocŽPyModule_GetDictØPyObject_CallÛPyObject_CallMethodÝPyObject_CallObjectßPyObject_ClearWeakRefsçPyObject_FreeîPyObject_GetAttrStringðPyObject_GetItemöPyObject_InitüPyObject_MallocPyObject_ReprPyObject_Size;PySequence_GetSliceIPySet_ContainsQPySlice_GetIndicesExSPySlice_TypeePyString_FromStringlPyString_Type‡PyThread_acquire_lockˆPyThread_allocate_lockPyThread_free_lock’PyThread_release_lock PyTuple_New¡PyTuple_Pack¢PyTuple_SetItem¤PyTuple_TypeªPyType_ReadyòPyUnicodeUCS2_FromObjectöPyUnicodeUCS2_FromUnicodeûPyUnicodeUCS2_JoinPyUnicode_TypePy_BuildValue8Py_InitModule4Ÿ_PyString_Join¸_PyUnicodeUCS2_ToLowercaseÍ_Py_NoneStructÖ_Py_ZeroStruct€€€€€€€€€€KERNEL32.dll€€€€€€€€€€€msvcr90.dll(€(€(€(€(€msvcrt.dll<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€python26.dllh·ák4·ák äk äk(`äkäkP 00(0=0ˆ0¹0È0Í0B1J1j1r11Ÿ1¶1½1Å1Ð1â1ø12+2A2Ì3ã3²8ó8¿>j>€>“>Æ>Þ>ã>î>ÿ>? ??.?3?>?R?W?b?l?q?z?ˆ??˜?¨?­?¸?Ú?ß?ê?ø?ý?0È000"0-0<0A0L0Y0^0h0x0}0ˆ0Î0ë01E1`1f1Þ1÷12E2Y2_2Ö2ë2 353I3O3¨3Ò3÷3%4?4b44–4¡4µ4555C6…6î6B7m7”7878l8ù8|9‚9›9Í9â9=:l:r::¤:ì:;T;d;’;Ê;)_>j>¯>Í>ù> ?0?L?c?j?p?‡?ü?@<0D0X0…0•0¯0Ô0â0"1/1m1Ï1æ1í1ó1 2j2ì2F3ˆ3ö5b7Ï8Ê;>P C1`Á=×=ë=ñ=p0:4a4‰4Ž4™4×4ß4!51595>5I5‘5Ñ5Ù5ñ57µ7#8€î3¥4.5,9 999‰;ë;õ;ÿ;B >>? \Š00©0¯0ù0þ0P1U1Ð1Ö1ã1ù122F2V2Ì2é23Á3Ì3`4p4}4Œ4œ4©4è4ï4û5(6-6A6a6J7‰7-8c9Ú9;:;<° 1û=À82v3†3À3÷34>4R4h4q4z4‚4‹4œ5N6Z6ë708=8¿8Å8Û8(9ó:Ðl·0-6 7(7S7e77™7¡7ª788›8Ä879e99£9«9À9Ð9A:…:‹: :³:¹:é:;;;•;§;Â;š< ==1=E=Y=m==>&>N>>µ>á>ê>1?Y?à|00+0F0`0„0L1`1h1}1‹1·1À1/2à2ò293N3j3„3¡3½3é3ò3‹475B5V5b5k5š5¥5Ê5÷5;6C6^6­6º6Â6Ë6:7V7m7“7·7¿7Ô7ô7ý788Ý8ß;=#=Š>ð l=‡= ´6Ë6 Ù1á1O3Ë46û70 Û6–?@ È6–=P 5?š?`”1¡1Ù1á1ñ1ù1„8ë: <pXC1”1Z2£3Í344˜4‰5«5ð5Š6ž6Â6ú677é7G8“8ª8µ8Ú899A9\9:»:Ò::;f;z<¹<é<ñ< =§=ß=Z>y?€l<0S0Ž0Ù0.1F1:2Z2n2 383d3|33™3§4ç566Ø6ä687Õ7L8R8^8959Ž9§9M:j::¾:~;6=W=]=¡=>s>|>Ì>??-??Ô?Ü?ñ?œT0˜0 0µ01\1d1y12g2ð2A3^3444#4)43474=4G4K4Q4U4[4_4e4i4o4s4y4}4ƒ44‘4—4›4¡4¥4«4¯4µ4¹4¿4É4Í4Ó4×4Ý4á4ç4ë4ñ4õ4û4ÿ455555#5'5-51575;5B5H5Y5j5{5‹5¯5¶5¼5Í5Ü5ð5ù5!6*6>6D6V6_6r6„6Ï6Õ6ä6ë67767U7’7Û7à78 88-8<8G8M8¢8­8À8Ì8Ø8ú899"9/9N9Y9l9x9„9¦9±9Ä9Ñ9Þ9þ9 ::):6:V:a:t::Ž:±:¼:Ì:Ù:ï:;!;1;>;T;;Š;;­;Ã;ï;ú; <<3<_>$>1>G>q>|>Œ>™>¯>Ù>ä>ô>??>?I?Y?f?|?©?´?Ä?Ñ?ç? ”00)060L0y0„0”0¡0·0á0é0ù011I1T1d1q1‡1®1¹1É1Ö1ì12$242A2W2~2†2œ2©2¿2æ2ñ233'3N3Y3l3y33¶3Á3Ô3á3÷34)4<4I4_4†4‘4¤4±4Ç4ñ4ü4 55/5Y5d5t55—5¾5Æ5Ù5æ5ü5&6.6A6N6d6‘6œ6¬6¹6Ï6ö677!777^7i7y7†7œ7Æ7Ñ7á7î78.898L8Y8o8–8¡8´8Á8×8þ8 99)9?9f9q9„9‘9§9Î9Ù9ì9ù9:6:A:T:a:w:Ÿ:ª:½:Í:ã:;;,;9;O;v;;”;¡;·;á;ì;ü; <>'>N>Y>l>y>>¶>Á>Ô>á>÷>?)?9?F?\?†?‘?¤?´?Á?â?í?ý?°H 0060A0Q0^0k0Š0•0¨0µ0Â0â0í01 11:1E1X1h1u1–1¡1´1Á1Î1î1ù1 22$2F2Q2a2n2{2š2¥2µ2Â2Ï2î2ù2 33/3V3a3t3€3Œ3®3¹3Ì3Ù3æ3}5ˆ5˜5¥5±5¹56(686E6L6y6„6”6¡6ª6²6Ä6î6ö6þ67777&7.7t7}77£7¹7 8'8#969J9S9X9b9m9w9‚9‰9­9¾9Ç9ê9õ9:*:I:i:–:°:Î:î:ÿ:;;1;C;M;h;|;Š;¡;³;¿;ô;ÀÄ000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1Œ1`2d2l2p2t2|2€2„2Œ22”2œ2 2¤2¬2°2´2¼2À2Ä2Ì2Ð2Ô2Ü2à2ä2ì2ð2ô2ü233 3333 3$30343`3p3t3„3ˆ3˜3œ3¬3à3ä3ì3,4ä4è455 5555 5$5,50545<5@5D5L5P5T5\5`5d5l5p5t5|5€5„5Œ55”5œ5 5¤5¬5°5´5¼5À5Ä5Ì5Ð5Ô5Ü5à5ä5ð5ô566 60646D6H6X6€6„6Œ6”6˜6 6¨6¬6´6¼6À6È6 7à7ä7ð7ô7ü788 888 8$8@8P8Œ8`9d9p9t9|9€9„99”9À9Ð9:::: :$:0:4:@:D:P:T:`:d:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;˜;œ; ;¤;¨;°;´;¸;À;Ä;È;Ð;Ô;Ø;Ü;à;ä;ì;ð;ô;ø;ü;<< <<<<<$<(<,<0<4<8<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?@0À.tls  @@0À.reloch"°$B@0BU‰åSƒì‹`q…Òt4‹`qƒë9Úw‹…ÀtóÿЋ`qƒë9Úvë‰$èݦÇ`qÇ$èϦƒÄ[ÉÃU‰åWVSƒì,‹u‹] ‹}ƒût=‰|$‰\$‰4$è§ƒì …Ûu‹`q…Ò„„‰Eäèdÿÿÿ‹Eäeô[^_É vÇ$€èp¦£`q…ÀtcÇ£`q¡q…Àt‰|$ÇD$‰4$ÿЃì èj¨è­ª‰|$ÇD$‰4$è§ƒì …Àt†eô[^_É 1Àeô[^_É è¦Ç 1ÀéiÿÿÿfU‰åƒìÇD$`qÇD$`q‹E‰$èߥƒøÀÉÃU‰åƒìÇD$`qÇD$`q‹E‰$è·¥ÉÃU‰åƒìÇ$0qè2¬R…ÀteÇD$0q‰$è%¬ƒì…ÀtÇD$`qÇ$qÿЋ Ä!q…Ét1Ç$)0qèï«R…Àt*ÇD$70q‰$è⫃ì…Àt Ç$Ä!qÿÐÉø맸ëâU‰åƒìÇ$0q覫Q…Àt%ÇD$K0q‰$虫ƒì…Àt Ç$qÿÐÉÃv¸ëç‹D$‹T$¶Ãv‹L$ ‹D$‹T$ˆ ËD$D$Ãv‹T$‹D$·PÃv‹L$ ‹T$‹D$f‰ PÃv‹D$‹T$BËT$‹D$‹ËL$ ‹T$‹D$‰ ËD$‹L$ðËD$ƒè ƒø–ÀÃf1ÀËD$‹T$‰H¿ƒùwƒð ‰B¸ÃfHŸƒùvê¸Ãf‹D$P¿ƒúwƒð ËD$‹T$H¿ƒùv‰¸Ã𠉸ËD$‹T$‰ƒøIt!ÇBIƒøit)¸¹Ç iÃv¸¹Ç iÃf¸ÃfVSƒì‹t$ ‰óÁëƒûNv 1ÀƒÄ[^Ãæÿÿ‹D$$‰$ÿàêq9ðt…ÛuÛƒîƒþwÓÿ$µ€0q°ëɺˆÁÓúˆÐƒà빺ø0ˆÁÓúˆÐƒà멺ˆÁÓúˆÐƒà뙺ÀˆÁÓúˆÐƒà뉺>ˆÁÓúˆÐƒàévÿÿÿº€ˆÁÓúˆÐƒàébÿÿÿºpˆÁÓúˆÐƒàéNÿÿÿ‹T$‹D$ƒøvf…Ò”ÀÉD$‰T$éÿÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè¨ÿÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè]ÿÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mèÿÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$MèÙþÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè—þÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$MèYþÿÿ„À•À1øƒÄ[^_ÃvWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèKýÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$Mè ýÿÿ„À•À1øƒÄ[^_ÃvVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèÈüÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè…üÿÿ„À•ÀŠT$ë¾fVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèDüÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mèùûÿÿ„À•ÀŠT$ë¶f‹D$Pöƒúv=…t=( t=) ”ÀððËD$ƒøItƒøit=0t=1”ÀÃf°ðËD$‹T$‰ƒøItIÇBIƒøit!ÇBi=0uS¸¹ Ç 1ÃÇB0¸¹ Ç 1ÃvÇBiÇB0¸ …@Ç 1ÃÇB 0=1¸uÜÊH.Q÷€úTv ‹P …Òt>öÒÿ$•œ0qf‹P(‹R…Òtè‹ëÒf‹ŠJ.ƒéF€ùwÕ‰ÐËP(‹J…ÉtÈ‹@Ãf€ùAw½¶Éÿ$ð1q‹ŠQ.€út€úDu£‰ÈÃfUWVSƒì,Š\$@ˆ\$‹˜¤ ‹s ‹x@‹@<ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ërëC9ët¶‰$ÿÖ:D$uí‰Ú)ú‰ÐƒÄ,[^_]Ãv—,9ër ëƒÃ9Ýv ‹‰$ÿÖ:D$uì‰Ú)úÁú‰ÐƒÄ,[^_]ÃvW,O9ër ëƒÃ9Ýv·‰$ÿÖ:D$uë‰Ú)úÑú‰ÐƒÄ,[^_]ÃvUWVSƒì,Š\$@ˆ\$‹˜¤ ‹s ‹x@‹@<ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ëwëK9ët¶Cÿ‰$ÿÖ:D$uì‰Ú)ú‰ÐƒÄ,[^_]Ãf—,9ëw ëƒë9Ýs‹Cü‰$ÿÖ:D$uë‰Ú)úÁú‰ÐƒÄ,[^_]ÃfW,O9ëw ëƒë9Ýs·Cþ‰$ÿÖ:D$uê‰Ú)úÑú‰ÐƒÄ,[^_]Ãf‹D$ 9D$”ÀÃUWVSƒì‹‹R‰$ƒút?‹” ‰T$~'‹r‹Z ‹HP1Ò‹<Ö‹lÖ‰9‰i‹<“‰yBƒÁ;$uå‹L$‹‰” ƒÄ[^_]ÃWVS‹‹s$…Òtx‹ …Étm¹ë0v<[»‹x\ŸÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 r6‹Š9ÞÌ)󛋸РßÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 sÊ[^_Ã…ö~+‹P\ƒÂ1ÉÇÇBÿÿÿÿÇBÇBÿÿÿÿAƒÂ49ñuÝ‹Kx…É~Å‹€Ð ƒÀ1ÒvÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿBƒÀ(9ÊuÝ[^_ÃVS‹ˆ¸ ‹I(‹\‘‹°Ì Þ;q w ‹t‘9´¼ r1À[^Ãf˜Ø ;˜Ü –À[^Ãf‹D$‹@0@Ãv‹D$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿÃUWVSƒì‰Æ‰Ó1ÿ‹C,¨ …4€{.Zv‹ëëf¶S.ÿ$•ø2q‹‰ðèÇÿÿÿ‰Å‹S‰ðè»ÿÿÿf9ïs‰ïf9øv‰Ç‰øƒÈ f‰C,‰øƒÄ[^_]Ãf‹C(ƒxÿ•D$„Ž‹S‰ðè|ÿÿÿ‹S(‹‹ndTU½fƒ fƒøtfƒ €|$„fƒÿ‚Df9ïs‰ïf9øv‰Ç‹C, øƒÈ f‰C,‰øƒÄ[^_]Ë¿é%ÿÿÿ‹‰ðèÿÿÿ‰Å‹S‰ðèÿÿÿf9ïs‰ï·×·È‰Ö9Ê}‰Îƒþ޽9ʌ͉úƒÊ éµv‹C(‹h‹‰ðèÁþÿÿ‹S(‹‹NdQf‹ ‰ÎƒÎf‰2fƒøtƒÉf‰ E„Ðfƒÿs¿f9øw8‰øfƒÿs0¸ë)‹S‰ðènþÿÿ‰Å‹‰ðècþÿÿ‰Â‰øf9ïs‰èf9Âv‰Ð‰ÂƒÊ f‰S,ƒÄ[^_]Ãvfƒÿƒêþÿÿ¿éàþÿÿº0¿f‰S,‰øƒÄ[^_]Ã‰ÂƒÊ ‰Çëév¿é²þÿÿf‹‰ðèïýÿÿ‰Å‹S‰ðèãýÿÿ‹S(‹‹NdQfƒý„gþÿÿé^þÿÿfƒÿƒ1ÿÿÿ¿é'ÿÿÿƒàé þÿÿSƒì‰Ã…Àu ë&€Ìf‰C,öÄu ‹C…ÀtèÜÿÿÿ‹…Ût‹C,öÄtÚƒÄ[ÃS‹‰X‰XÇ@ …Ût‰ÚfŠJ.€ùVt€ù]u‹ëïv‰P9Ót[Ãv€{.Kwõ¶S.ÿ$•d4q‹‰P‹S ‰P [Ãf¡$`qÿÃì,D$‰D$ D$‰D$ÇD$”5q‹D$4‰$ÿx‚q…Àt4‹D$‰D$‹D$‰$èàóÿÿ„À•À¶À‰D$Ç$ª5qÿˆƒqƒÄ,Ãv1ÀƒÄ,ÃfÇD$ÇD$ª5q¡ˆƒqÿàUWVSƒì\D$L‰D$ D$H‰D$ÇD$¬5q‹D$t‰$ÿx‚q…À„„‹D$H¨ …„¨„ÈÇD$Ëql$,‰l$‹D$L‰$‹T$ÿR0‰Ç‰$ÿì‚q‰Æ…ÀtC…ÿ~U1Ûë‰D$‰\$‰4$ÿô‚qC9ût:‹D‰D$Ç$ª5qÿˆƒq…ÀuÑ‹H‰…Àth1ö‰ðƒÄ\[^_]ÃÇD$ÀÊqë‚f‹D$H%"@="@uÚD$<‰D$‹D$L‰$‹T$ÿR8H~Á¡˜ƒq‰D$‰4$ÿè‚që­vÇD$@Ëqé3ÿÿÿv‹F‰4$ÿP1ö‰ðƒÄ\[^_]ÃvVSƒì$‰Ã‰T$Ç$½5qÿˆƒq‰Æ…Àt6‰D$‰$ÿè‚q‹J‰…Òt ÷ÐÁèƒÄ$[^ËV‰4$‰D$ÿR‹D$ëá1ÀƒÄ$[^ÃWVSƒì‹\$ ‹|$$‰ƒûItcÇGIƒûitO¾¸ÇiÇ$ièn•9Øt ƒøIt‰·FÇ$Iè]•9Øt ƒøit‰·F‰ðƒÄ[^_Ãv¾뻾¸ë§Sƒì‹D$ ‹\$$=ÿv ‰¸ƒÄ[É$蕉¸ƒÄ[ËD$=ÿwéì”ÃvWVSƒì‹\$ ‹|$$‰‰$èÈ”9Øt$¾‰G‰$è¼”9Øt‰·F‰ðƒÄ[^_Ãv‹G¾ë×fSƒì‹\$ ‰$è„”ƒøIt‰$蔃øi”ÀƒÄ[ðƒÄ[ÃSƒì‹D$ ‹T$$·Øúÿw ‰ÁÁéƒùNv …Û”ÀƒÄ[Ãÿ$À5qK”Àëìf¡4‚qƒ8t"ÇD$‰$è”…À•À¶À9ÔÀƒÄ[á@‚q‹·P%ëÜf1Àƒú–À9ÔÀ뛉$è`‚ëÀfƒú th1Àƒú ”Àë·¡4‚qƒ8…¢¡@‚q‹·P%f…À•À¶À9ÔÀƒÄ[Ãf¡4‚qƒ8…ž¡@‚q‹·P%ë̃ú_…7ÿÿÿ¸éOÿÿÿ¡4‚qƒ8…"¡@‚q‹·Pƒàëšf¡4‚qƒ8…z¡@‚q‹·Pƒàéwÿÿÿv¡4‚qƒ8…¡@‚q‹·P%WéQÿÿÿ¡4‚qƒ8…¡@‚q‹·Pƒàé/ÿÿÿvƒø"w'ÿ$…ü6q¡4‚qƒ8…A¡@‚q‹·Pƒà…Àuûÿÿ”ÀéPþÿÿƒê0ƒú wê°éAþÿÿ¡4‚qƒ8…¡@‚q‹·Pƒà ëÁ¡4‚qƒ8…¼¡@‚q‹·Pƒà룡4‚qƒ8…³¡@‚q‹·Pƒàë…ÇD$‰$è$’ésþÿÿvÇD$‰$è ’é[þÿÿvÇD$W‰$èô‘éCþÿÿvÇD$‰$èÜ‘é+þÿÿvÇD$‰$èÄ‘éþÿÿvÇD$‰$謑éûýÿÿÇD$‰$è—‘éâþÿÿÇD$‰$è‚‘éÍþÿÿÇD$‰$èm‘é¸þÿÿÇD$ ‰$èX‘é£þÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè¨üÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè]üÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mèüÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$MèÙûÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè—ûÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$MèYûÿÿ„À•À1øƒÄ[^_Ãv‹D$‹T$ƒøIt#ƒøit=0t=1t‰T$‰D$鿎v‰¸Ãé³vƒì·À‰$ÿ”ƒqf=êwf=èr9°ƒÄÃvf=ôv-ùfƒøvæ1ÀƒÄÃf=òsÙ-ìfƒøvÎ1ÀëævfƒøotÁwfƒøet¹fƒøit³fƒøat­1ÀëÅffƒøut¡r¹-àfƒøv”1Àë¬UWVSƒìL‰Ã‰Ö‰Í‹¸¨ ‹P@…ö~n;pDŒ™Fÿ‰D$‰$ÿ׉D$Ç$Mèëÿÿ„À•Â;sD|F1À‰é8Ñt+8Á”ÀƒÄL[^_]Ã|$( t ƒ|$(…¯ƒ|$8 …¤1ÀƒÄL[^_]Ãf1Ò;sD}º‰t$‹C@‰$ˆT$ÿ׉D$Ç$Mè‘êÿÿ„À•ÀŠT$ë‘f‰t$‰$‰T$ÿ׉D$$Nÿ‰L$,‰L$‹C@‰$ÿ׉D$ ‹D$$‰$èhp‰D$(‹D$ ‰$èXpƒø‹T$„ ƒø„ ƒø„ƒ|$(„ùƒ|$(„îƒ|$(„ãƒ|$(„1ÿÿÿƒ|$( „&ÿÿÿ‹D$,…Àˆ‰\$4‹\$,‰t$8‰éˆL$?‰Õf‰\$‰,$ÿ׉Ɖ$èÍoƒøtƒø uKƒûÿu݉t$ ‰D$0‰ê‰\$,‹\$4‹t$8¶l$?ƒø „Í‹D$,…Àx ƒ|$ '„rF;sDœ‰éˆL$4‰Ý‰Óf‰t$‰$ÿ׉$è_oƒøtƒø uN9uD߉D$8‰Ú¶l$4ƒ|$0 „?þÿÿ‹\$,KˆG‰Ö‰êˆT$,‹l$0f‰\$‰4$ÿ׉$èoƒøtƒý uKƒûÿuß¶l$,ƒø „7ƒ|$0„òƒ|$0 „çƒø„?ƒ|$0„Wƒ|$0 „pƒ|$0 …wƒ|$(„Êýÿÿƒ|$0u!ƒ|$( „¸ýÿÿƒ|$(„­ýÿÿƒ|$( „¢ýÿÿ‹D$ ‰D$Ç$MèRèÿÿˆÃ‹D$$‰D$Ç$Mè<èÿÿ‰ê8Ó„nýÿÿ8ДÀé>ýÿÿƒ|$(„Yýÿÿ‹D$ ‰D$Ç$Mè èÿÿˆÃ‹D$$‰D$Ç$Mèóçÿÿ‰ê8Ó„%ýÿÿ8”ÀƒÄL[^_]Ã|$(„ ýÿÿƒ|$0…ÿÿÿƒ|$( …øþÿÿ1Àéòüÿÿƒ|$( …(þÿÿ1Àéàüÿÿƒ|$0 t ƒ|$0…·þÿÿƒ|$( „Áüÿÿ¸ é¢þÿÿ‹D$0ƒè ƒø‡±þÿÿƒ|$(…¼þÿÿ1Àé—üÿÿ‹D$(ƒè ƒø‡¯þÿÿƒ|$8…¤þÿÿ1Àétüÿÿfƒ|$( …þÿÿ1Àé`üÿÿƒ|$0„~þÿÿƒ|$0 „sþÿÿƒ|$0…›þÿÿécþÿÿ‹D$$‰T$è#ûÿÿ„À‹T$„uýÿÿ°éòûÿÿÇD$0éaýÿÿ1ÀéïýÿÿÇD$8éýÿÿv1É‹T$‹D$éiûÿÿ¹‹T$‹D$éVûÿÿfUWVSƒì,‹|$@‹G0@‰$ÿdƒq‰Å…Àtq‹G$‰D$‹G ‰D$Ç$ˆ7q¡ˆƒq‰D$ÿÐ…Àt@‰E ‹G0…À~P1ö1ÛëfC‰D ƒÆ9_0~;‹G4ð‹P‰T$‹‰D$Ç$ˆ7qÿT$…ÀuÒ‹EH‰E…Àt1í‰èƒÄ,[^_]ÃvÿE‰o8‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]ÃvUWVSƒì,Ç$hÿdƒq‰Æ…ÀtN1Ûl$‹=|ƒqë‰D$‰\$‰4$ÿlƒqCƒûht)f‹„ ìqf‰D$ÇD$‰,$ÿ×…ÀuË‹H‰…Àt1ö‰ðƒÄ,[^_]Ãf‹F‰4$ÿP1ö‰ðƒÄ,[^_]Ãvƒì€xAt ‰$ÿ€‚qƒÄÃfVSƒì$‰Ö‰$ÿÜ‚q‰Ã…Àt.‰t$‰$ÿ$ƒq‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ã1ÀëõVSƒì‰Ã‰Ö¡ `q…À„†ƒÃƒûv"ÇD$ð8q¡Ì‚q‹‰$ÿ¼‚qfƒÄ[^Ãfÿ$9qÇD$28q¡Ì‚q‹‰$ÿ¼‚qëÖf‹F‹@ ‰D$ÇD$¤8q¡Ô‚q‹‰$ÿ¬‚që°‹F‹@ ‰D$ÇD$|8q¡Ô‚q‹‰$ÿ¬‚qëŒÇD$7q¡ `q‰$ÿ¼‚qéqÿÿÿÇD$D8q¡Ô‚q‹‰$ÿ¼‚qéSÿÿÿvÇD$Ì8q¡È‚q‹‰$ÿ¼‚qé3ÿÿÿv…ö„¨‹F‹@ ‰D$ÇD$Ð7q¡Ô‚q‹‰$ÿ¬‚qéÿÿÿÇD$d8q¡ `q‰$ÿ¼‚qéåþÿÿÇD$Ú8q¡ `q‰$ÿ¼‚qéÉþÿÿ¡°‚qƒÄ[^ÿàÇD$³7q¡Ø‚q‹‰$ÿ¼‚qéŸþÿÿvº‹7q¸‘7qè þÿÿ£ `qéaþÿÿvÇD$8q¡Ô‚q‹‰$ÿ¬‚qécþÿÿvUWVSƒì‹\$0‹D$4…ÀˆÕ;C0Ì…À„€t@ý‹C44ð‹F‰$ÿì‚q‰Ç…À„—‹F…À„Œ1Û‹-ˆƒqëv‹W ‰šC9^vsÝF‹P‰T$‹‰D$Ç$ˆ7qÿÕ…ÀuЋH‰…Àtk1ÿ‰øƒÄ[^_]ÃvÇ$ÿì‚q‰Ç…Àt$‹C$‰D$‹C ‰D$Ç$ˆ7qÿˆƒq…Àt¶‹W ‰‰øƒÄ[^_]Ãv1Ò¸òÿÿÿè0ýÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÎvUWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpt@ý‹K44ñ‹F‰$ÿì‚q‰Ç…À„€‹V…Òty1Û‹-ˆƒqëv‹W ‰šC9^v`‹F‹D؉D$Ç$ª5qÿÕ…ÀuÜ‹H‰…Àtc1ÿ‰øƒÄ[^_]ÃvÇ$ÿì‚q‰Ç…Àt‹C$‰D$Ç$ª5qÿˆƒq…Àt½‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿè8üÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì‹\$0‹D$4…Àˆ±;C0¨…Àtht@ý‹{44÷‹F‰$ÿì‚q‰Ç…Àt|‹^…Ûtu1Û‹-ˆƒqëv‹W ‰šC9^v\‹F‹؉D$Ç$ª5qÿÕ…ÀuÝ‹H‰…Àt`1ÿ‰øƒÄ[^_]ÃÇ$ÿì‚q‰Ç…Àt‹C ‰D$Ç$ª5qÿˆƒq…ÀtÀ‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿèHûÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì,‰Ã‰Õ…Àt*…Òt.‰Ç1ö¡ƒq‰D$‹G‰$ÿT$FƒÇ9îuî‰$ÿT$ƒÄ,[^_]áƒq‰D$ëæUWVSƒì,‰Ã‰T$…Àt.…Ò~2‰Æ1ÿ‹-ƒq‹F‰$ÿÕ‹F‰$ÿÕGƒÆ4;|$uæ‰$ÿÕƒÄ,[^_]Ë-ƒqëëSƒì‰Ã‹€¸9 t ÿÄ‚q‰CƒÄ[Ãì‹€º9 t ‹@‰$ÿÀ‚qƒÄÃfVSƒì‰Ã‰ÖèÒÿÿÿ‰4$ÿƒq‰ØƒÄ[^ë Sƒì(‰ÓÁë=ÀÊq„¤=@ËqBÿ„¶ƒøwI‹4‚qƒ;tZÇD$‰ $‰L$è~‚‹L$…ÀuPƒ;tUÇD$‰ $èa‚…À•ÀƒÄ([Ãvƒëƒûv¯‰L$‰$èÌíÿÿƒÄ([Ãv¡@‚q‹·Hƒà…Àt°°ƒÄ([Ãv¡@‚q‹·Hƒàë«Bÿƒøv@ƒëƒûv,‰L$‰$è@ÞÿÿëÊfƒøv#ƒëƒûv‰L$‰$èëÞÿÿë­‰ $èèfë¢f‰ $è cHƒø–ÀëvUWVSƒì,‹T$@‹R‰T$…Ò„Ê‹L$@‹Y‹q‹A0‰D$…À~c‹i4ÇD$f‹E…Àx9Ã~‰Ã‹E…Àx9Æ}‰Æ‹}…ÿt$‹E‹‹P1À…Éx9Ë~‰Ë…Òx9Ö}‰Ö@9øuçÿD$ƒÅ‹T$9T$uª‰t$‰\$‹L$‰ $ÿ<ƒq…Àt9‹L$@‹Q …Òt ‹ I‰ …Ét?‹T$@‰B ‰Z‹B…Àt ‹J‰…Òt‹L$@ÇA¡˜ƒqÿƒÄ,[^_]ËP‰$ÿRëÛ‹J‰$‰D$ÿQ‹D$ë®vUWVSƒì‹t$0‹D$4…Àˆá;F0Ø…À„ˆ|@ý‹F4<ø‹G‰$ÿì‚q‰Å…À„¥‹G…À„š1Ûë‹U ‰šC9_†…ÝG‹V‹H)щL$‹)ЉD$‹F ‰$ÿ<ƒq…Àu‹EH‰E…Àto1í‰èƒÄ[^_]ÃvÇ$ÿì‚q‰Å…Àt*‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿ<ƒq…Àt®‹U ‰‰èƒÄ[^_]Ã1Ò¸òÿÿÿè÷ÿÿ1í‰èƒÄ[^_]ËE‰,$ÿP1íëÐvWVSƒì ‰Ã€x ‹BtCö@W„ÿ‰×‹…Àt_‰|$‰$ÿè‚q‰Æ…Àˆ‹H‰…À„¿‰ðƒÄ [^_Ãfö@WuÁ‰$‰T$ÿxƒq‰Ç…À‹T$u®¸ïÿÿÿèmöÿÿ¾ïÿÿÿëÇf‹C…À„éÇ$ÿì‚q‰…Àt"‹@ ‹S‰ÇC‹‹@ ‰x1ö‰ðƒÄ [^_þ÷ÿÿÿ‹H‰…Àtz‹…Àt ‹J‰…Ò„ƒ‹C…Àt ‹J‰…Òtg1Ò‰ðèêõÿÿ‰ðƒÄ [^_ËG‰<$ÿP‰ðƒÄ [^_Ãf‰$‰T$ÿxƒq‰Ç…À‹T$…èþÿÿ¸îÿÿÿè§õÿÿ¾îÿÿÿéþþÿÿ‹G‰<$ÿPéxÿÿÿf‹P‰$ÿR뎋P‰$ÿRéoÿÿÿf‰{1öéÇþÿÿfVSƒì$‰Ã‹…À„ï€{…Å€{ uCÇ$d9qÿLƒq‰Æ‹…ö„’‰D$‰4$ÿƒq‹J‰…ÒtG‹‹ I‰ …ÉtXƒÄ$[^ÃvÇD$Ç$ÿ|ƒq‰Æ‹…ötK‰D$‰4$ÿ€ƒq‹J‰…Òu¹‹V‰4$‰D$ÿR‹D$‹‹ I‰ …Éu¨‹J‰$‰D$ÿQ‹D$ƒÄ$[^Ãf‹J‰…Òt1ÀƒÄ$[^Ãv‰$ÿð‚qé-ÿÿÿf‹P‰$ÿR1Àé[ÿÿÿ‹C…À…Pÿÿÿ€{ uÇ$d9qÿLƒqé8ÿÿÿÇD$Ç$ÿ|ƒqéÿÿÿf‹D$‹@,‰D$¡Œ‚qÿàfSƒì‹\$ ‹C…Àt ‹J‰…Òtl‹C …Àt ‹J‰…ÒtP‹C‹J‰…Òt8‹C4…Àt ‰$ÿƒq‹C8…Àt‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒqƒÄ[ÿà‹P‰$ÿR뽋P‰$ÿR륋P‰$ÿRë‰UWVSƒì,‰Ç‹€´ …Àt ‰$ÿ\ƒq‹‡x …Àt"‹-ƒqëf‰Ø‹˜ ‰$ÿÕƒ¯ˆ @…Ûuè‹7‹Ÿ …Ût.‹-ƒqë‰Ã‹C‹S‰$‰D$ÿÕ‹S ‰$ÿÕ‰$ÿÕ‹D$…ÀuÚ‹Ÿ˜ …Ût)‹-ƒqë‰Ë‹K‹V$‹C‰L$èø÷ÿÿ‰$ÿÕ‹L$…Éuß‹Fp…À„4‹V‹GPè‰÷ÿÿ‹Ft…À„‹V$‹G\è¿÷ÿÿ‹Ÿà …Ût5‹-ƒqë‰Ë‹K‹V‹C ‰L$èL÷ÿÿ‹V$‹Cè÷ÿÿ‰$ÿÕ‹L$…ÉuÔ‹FT…À~-1À1Û‹-ƒqv‹—è ‹T‰$‰D$ÿÕC‹D$ƒÀ9^Tà‹‡è …Àt ‰$ÿƒq‹‡Ð ‰D$…Àt>‹vx‰t$…öŽ“‹\$1ö‹-ƒq‹C‰$ÿÕ‹C‰$ÿÕFƒÃ(;t$uæ‹D$‰$ÿÕ‹‹J‰…ÒtN‹G‹J‰…Òt6€¿3 t ƒÇ‰<$ÿ€‚qƒÄ,[^_]ËG\‰Ftéîþÿÿ‹GP‰FpéÌþÿÿ‹P‰$ÿRë¿‹P‰$ÿRë§‹-ƒqë‹Sƒì‹\$ C èÐýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒqƒÄ[ÿàSƒì‹\$ C èœýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒqƒÄ[ÿàWVSƒì ‰Ã‰T$Ç$ª5qÿˆƒq‰Æ…Àt=‰$ÿ4ƒq‰Ç‹H‰…Àt5…ÿt%‰|$‰$ÿè‚q‹J‰…Òt'÷ÐÁèƒÄ [^_Ãv1ÀƒÄ [^_Ãv‹F‰4$ÿPëÀ‹W‰<$‰D$ÿR‹D$ëÆWVSƒì ‹t$0Ç$ÿì‚q‰Ã…Àtºe9qèÅâÿÿ„Àu)‹H‰…Àt 1ÀƒÄ [^_Ãv‹C‰$ÿP1ÀƒÄ [^_Ãf‹V ‰Øèÿÿÿ„Àtɺ9q‰Øè~âÿÿ„Àt¹‹V$‰Øèüþÿÿ„Àt«º„9q‰Øè`âÿÿ„Àt›‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿ<ƒq‰Æ…À„pÿÿÿ‰$ÿ4ƒq‰Ç‹H‰…À„˜…ÿ„Pÿÿÿ‰|$‰$ÿè‚q‰Æ‹J‰…Ò„‚…öˆ,ÿÿÿºŽ9q‰Øèááÿÿ„À„ÿÿÿÇD$d9qÇ$½5qÿˆƒq‰Æ…À„ùþÿÿ‰\$‰$ÿ€ƒq‹J‰…Òt?‹J‰…Ò…áþÿÿ‹S‰$‰D$ÿR‹D$éËþÿÿ‹F‰4$ÿPéZÿÿÿ‹G‰<$ÿPépÿÿÿ‹V‰4$‰D$ÿR‹D$ë®fUWVSƒì<‹t$PÇ$ÿì‚q‰Ã…Àtº9qè(áÿÿ„Àu(‹H‰…Àt 1ÀƒÄ<[^_]ËC‰$ÿP1ÀƒÄ<[^_]ËF‰$‹-4ƒqÿՉDžÀtĉD$‰$¡è‚q‰D$ÿЋJ‰…Ò„I…Àx¡ÇD$$1À1ÿëPvº9q‰Øè¨àÿÿ„Àt€ºª9q‰Øè˜àÿÿ„À„lÿÿÿ‹D$$‹ÅXq‰Øè~àÿÿ„À„RÿÿÿG‹D$$@‰D$$ƒø w'‹ÅXq…F tæ…ÿt£º¦9q‰ØèKàÿÿ„Àu£éÿÿÿfÇD$$‰÷D$,‰D$ D$(‰D$D$$‰D$‹G4‰$ÿ˜‚q…À„ º9q‰Øèþßÿÿ„À„Òþÿÿ‹D$(‰D$‰$ÿT$…Àˆ»þÿÿ‹D$,‰$ÿՉƅÀ„¨þÿÿº±9q‰ØèÀßÿÿ„À„”þÿÿ‰t$‰$ÿT$‹J‰…Òt…À‰fÿÿÿésþÿÿv‹V‰4$‰D$ÿR‹D$ëÝ‹W‰<$‰D$ÿR‹D$é¡þÿÿº³9q‰Øè^ßÿÿ„À„2þÿÿÇD$d9qÇ$½5qÿˆƒq‰Æ…À„þÿÿ‰\$‰$ÿ€ƒq‹J‰…Òt#‹J‰…Ò…ûýÿÿ‹S‰$‰D$ÿR‹D$éåýÿÿ‹V‰4$‰D$ÿR‹D$ëÊvUWVSƒì‹\$0‹K@…ÉŽ 1ÿ‹-ƒqë ‰4$ÿÕG9{@~/‹CD‹4¸‹F(‰$ÿÕöF-tá‹F‰$ÿÕ‹F‰$ÿÕ‰4$ÿÕG9{@Ñ‹CD‰$ÿÕ‹CL‰$ÿÕ‹CX‰$ÿÕ‹Cd‰$ÿÕ‹S‹Cpè»ðÿÿ‹S$‹Ctèüðÿÿ‹S…Òt ‰$ÿƒq‹C…Àt ‹J‰…Òtx‹C,…Àt ‹J‰…Òt\‹C0…Àt ‹J‰…Òt@‹C4‹J‰…Òt(‹C8‹J‰…Òu ‹P‰$ÿR‰\$0¡ ƒqƒÄ[^_]ÿà‹P‰$ÿRëÍ‹P‰$ÿR뵋P‰$ÿR뙋P‰$ÿRézÿÿÿ‹-ƒqéÿÿÿvVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F@‰$ÿ–¨ ƒø tƒè ƒø–ÀƒÄ[^Ã;^D}ȉ\$‹F@‰$ÿ–¨ ƒø •Àë²vVSƒì‹\$ ‹t$$9sD °ƒÄ[^Ãf‰t$‹C@‰$ÿ“¨ ƒø tƒè ƒø–ÀƒÄ[^Ã…öÎN‰t$‹C@‰$ÿ“¨ ƒø •Àë·vVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F@‰$ÿ–¨ ƒø t PöƒúvÕ=…tÎ=( tÇ=) ”Àë¿;^D}¸‰\$‹F@‰$ÿ–¨ ƒø •Àë¢vVSƒì‹\$ ‹t$$9sD °ƒÄ[^Ãf‰t$‹C@‰$ÿ“¨ ƒø t#PöƒúvÙ=…tÒ=( tË=) ”ÀëÃv…öºN‰t$‹C@‰$ÿ“¨ ƒø •Àë£vVSƒì$‹D$4‹\$89Øt;t$‰t$‰$‹D$0ÿP0ƒø~;\$tºëv;–tB9Âuö1ÀƒÄ$[^Ãf°ƒÄ$[^ÃUWVSƒì ‰Å‰Ó‰Ï1ö…Òu ë"v‹…Ût‰ù‰Ú‰èè:C/uêƒö‹…Ûuç‰ðƒÄ [^_]ÃvSƒìŠZ.ƒë €û:v 1ÀƒÄ[Ãf¶Ûÿ$¸9qf‹Z$…Ûtä‹R(9 tz1Àëf9 ‚to@9ØuöëË‹B(9”ÀƒÄ[Ãv‰L$‹R(‹‰$ÿƒÄ[ËB(‹P;r9Ñ–Àë˜v‹RƒÄ[ëcv‹RƒÄ[錋RƒÄ[éÿÿÿ‹RƒÄ[ë v°é^ÿÿÿWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè+ÿÿÿ:C/uê°[^_Ã1À[^_ÃfWVS‰Ç‰Ó‰Îè ÿÿÿ:C/t1À[^_Ãv‰ñ‰Ú‰øèñþÿÿ:C/tç‹…Ûuê°[^_ÃWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè¿þÿÿ:C/tê1À[^_ð[^_ÃfUWVSƒì,‰D$‰Ó‰L$‹|$@…É~O1öŠC.ƒè <:v °ƒÄ,[^_]öÀÿ$…¤:qf‹S$…Òt‹,·‹K(;)tÙ1Àëv9,tÍ@9ÐuöF;t$u·v1ÀƒÄ,[^_]Ãf‹ ·‹S‹D$èÝþÿÿ„ÀuŸF;t$uŽëØ‹ ·‹S‹D$èÉýÿÿ„ÀuƒF;t$…nÿÿÿ븋 ·‹S‹D$è ÿÿÿ„À…_ÿÿÿF;t$…Jÿÿÿ딋 ·‹S‹D$è±þÿÿ„À…;ÿÿÿF;t$…&ÿÿÿémÿÿÿ‹·‹C(‹H;‚Qÿÿÿ9ʆÿÿÿF;t$…üþÿÿéCÿÿÿv‹·‰D$‹C(‹‰$‹T$ÿ„À…áþÿÿF;t$…Ìþÿÿéÿÿÿv‹C(‹9·„ÀþÿÿF;t$…«þÿÿéòþÿÿfUWVSƒì<‰Ç‰Ót$ ‰t$‰ $ÿP0‰ÅŠC.ƒè3< w'¶Àÿ$…;q‹[‰4$‰é‰Ú‰øèGþÿÿ:C/„ÁfÆD$ŠD$ƒÄ<[^_]Ãv‹[…Ûu ëãv‹…ÛtÚ‰4$‰é‰Ú‰øèþÿÿ:C/uçÆD$ŠD$ƒÄ<[^_]Ãf‹[ÆD$…Ûu ë«€t$‹…Ût ‰4$‰é‰Ú‰øèÉýÿÿ:C/uçëàf‹[…Ûu ë´v‹…Ût«‰4$‰é‰Ú‰øè ýÿÿ:C/tçéZÿÿÿf‰4$‰é‰Ú‰øè†ýÿÿ:C/„Aÿÿÿ‹…ÛuãéoÿÿÿfUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øè{þÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèBþÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øè~ýÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèEýÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfSŠZ.ƒë2€ûv1À[öÛÿ$È;qf‹R[é³úÿÿv‹R[é¯ùÿÿv‹R[éûÿÿv‹R[éÃúÿÿvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øèGÿÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèÿÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèÑþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øèJþÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèÔýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰Ã‰Ö‹€¨ ‹S@€~.Aw¶~.ÿ$½<qv;KL|=v1ÀƒÄ,[^_]Ãf;KH~ïI‰L$‰$ÿЋ›¤ ‰Á‰ò‰Øè`ýÿÿ:F/”ÀëÎ;KH~ÇI‰L$‰$ÿЋ›¤ ‰Á‰ò‰Øè(úÿÿ:F/”Àë¦;KL}Ÿë¯;KH~—I‰L$‰$ÿЋV(‹J;r`9È–Àf8F/”Àésÿÿÿ;KHŽgÿÿÿI‰L$‰$ÿЋV(‹j‹:‹“¤ \$‰\$‰$ÿR0…À~1Òv‹ “9Ïw 9Ír°ë­B9Âuë1Àë£v;KLÿÿÿ‰L$‰$ÿЋV(‹j‹:‹“¤ \$‰\$‰$ÿR0…À~Ç1Ò‹ “9Ïw9Ís°B9Âuð1ÀéUÿÿÿ;KLÇþÿÿé,ÿÿÿf;KHŽ·þÿÿ‹›¤ ‹I‰L$‰$ÿЉD$‹F(‹‰$ÿÓ:F/”ÀéŽþÿÿ;KHŽƒþÿÿI‰L$‰$ÿЋV(‹›¤ ‰Á‹‰ØèÉäÿÿ:F/”Àé\þÿÿf;KLOþÿÿëË;KLCþÿÿ‹›¤ ‹ë‹;KHŽ/þÿÿI‰L$‰$ÿЋV(;”¶ҶF/9”Àéþÿÿ;KHŽþÿÿ‹~(‹?I‰L$‰$ÿЉ|$‰D$‹ƒ¤ ‰$èöôÿÿ:F/”ÀéÕýÿÿv;KLÇýÿÿ‹~(‹?ëÃ;KL·ýÿÿë‡;KHŽ«ýÿÿ‹›¤ ‹[ I‰L$‰$ÿЉ$ÿÓ„À”Àé‹ýÿÿ;KLýÿÿ‹›¤ ‹[ ëÓ;KHŽkýÿÿI‰L$‰$ÿЃø •ÀéXýÿÿf9KHœÀéKýÿÿ9KLŸÀé?ýÿÿ9KLŽ3ýÿÿëÇUWVSƒì\‰Ã‰Ö‰Í‹zöG- u‹H@‰L$ ‹ˆ¨ ‰L$€.Kv‹‹T$p‰‰j°ƒÄ\[^_]Ãf¶G.ÿ$…=q‹W$‰T$$‰è+CH9ÂwE‹(‰é)щL$(…ÒtZ1Û‰t$,‹t$ ‰l$ ‹l$ë fC;\$$„Ý‹D$(؉D$‰4$ÿÕ;Ÿtá1ÀƒÄ\[^_]Ã;kL}ñ‰l$‹L$ ‰ $ÿT$ƒø tÝ‹F‹L$p‰n ‰i°ƒÄ\[^_]Ã;kHâ1Àë¼;kH~µEÿ‰D$ë¿;kL|Ë1Àë¥;kL}ž‹ƒ¤ ‹X ‰l$‹L$ ‰ $ÿT$‰$ÿÓ„Àt¡1Àéxÿÿÿ;kHŽmÿÿÿ‹ƒ¤ ‹X Eÿ‰D$ëÊ‹ƒ¤ ‰l$‰$ÿP:G/„fÿÿÿ1Àé=ÿÿÿ‹D$p‰$‰é‰ú‰Øè…þÿÿ„À…EÿÿÿW‹L$p‰ $‰é‰Øèjþÿÿ„À…*ÿÿÿ1Àéÿÿÿ;kLöþÿÿ‰l$‹L$ ‰ $ÿT$‹W(;”¶ҶG/9„ôþÿÿ1ÀéËþÿÿ;kLÀþÿÿ‹G(‹‰l$‹L$ ‰ $‰T$ÿT$‹T$‰T$‰D$‹ƒ¤ ‰$è2òÿÿ:G/„©þÿÿ1Àé€þÿÿ;kHŽuþÿÿ‹G(‹Eÿ‰D$ë°;kHŽ^þÿÿEÿ‰D$é`ÿÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„]þÿÿ1Àé4þÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„=þÿÿ1Àéþÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„þÿÿ1Àéôýÿÿ9kD„ þÿÿ‰l$‹L$ ‰ $ÿT$ƒø „õýÿÿ1ÀéÌýÿÿ‹ƒ¤ ‰l$‰$ÿP(„À…Öýÿÿ1Àé­ýÿÿ9kD„Æýÿÿ1Àéýÿÿ9kD„¶ýÿÿ9kl„­ýÿÿ1Àé„ýÿÿ9kD„ýÿÿ9kp„”ýÿÿ1Àékýÿÿ‹ƒ¤ ‰l$‰$ÿP :G/„týÿÿ1ÀéKýÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„Týÿÿ1Àé+ýÿÿ;kL ýÿÿ‹ƒ¤ ‹‰l$‹L$ ‰ $ÿT$‰D$‹G(‹‰$ÿÓ:G/„ýÿÿ1Àéíüÿÿ;kLâüÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹›¤ ‰Á‹‰Øè¯ßÿÿ„ÀéÖýÿÿ;kHޝüÿÿEÿ‰D$ëÈ;kHŽüÿÿ‹ƒ¤ ‹Eÿ‰D$éuÿÿÿ;kL€üÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹J;rx9È–Àf8G/„{üÿÿ1ÀéRüÿÿ;kLGüÿÿ‰l$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒ¤ \$@‰\$‰$ÿP0‰Á…À~1Àf‹ƒ9T$w 9T$ r°ë•@9Èuç1Àë‹;kHŽâûÿÿEÿ‰D$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒ¤ \$@‰\$‰$ÿP0‰Á…À~µ1Àf‹ƒ9T$w9T$ s˜@9Èuì1Àé%ÿÿÿ;kHŽ|ûÿÿEÿ‰D$éôþÿÿ9k`„‹ûÿÿ1Àébûÿÿ;kLWûÿÿ‰l$‹L$ ‰ $ÿT$‹›¤ ‰Á‰ú‰ØèOõÿÿ:G/„Rûÿÿ1Àé)ûÿÿ;kLûÿÿ‰l$‹L$ ‰ $ÿT$‹›¤ ‰Á‰ú‰Øèòÿÿ:G/„ûÿÿ1Àéðúÿÿ;kHŽåúÿÿEÿ‰D$ëÂ;kHŽÓúÿÿEÿ‰D$étÿÿÿ…í„ãúÿÿEÿ‰D$éÎüÿÿ‹ƒ¤ ‰l$‰$ÿP$„À…¿úÿÿ1Àé–úÿÿ…í„°úÿÿ1Àé‡úÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„úÿÿ1Àégúÿÿ‹W$‹CL)è9‡Uúÿÿ‹O(…Ò„núÿÿê‰T$$‰ï‰è÷؉t$(‹t$ ‰l$ ‹l$ë G;|$$„ÿ‰|$‰4$ÿÕ;»tç1Àé úÿÿ‹O$‰L$$‹KL)é‹D$$…À„±ƒ|$$†ëº«ªªª‹D$$÷âÑê9ÑŒÐùÿÿ‹“¤ ‰T$(‹J8‰L$4‹(‰|$,‰é‹|$$…ÿ„¼1ÿ1À1Ò‰\$0‰Ó‰t$8‰Æ‰l$<ëfCG9þE;\$$„È9þ/‹D$09hLŽnùÿÿ‰l$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$4‰Æ1ÿ‹L$,‹™‰D$‹D¼@‰D$‹T$(‰$èÑìÿÿ„Àu™1Àé$ùÿÿ‹W$‹CL)è9‡ùÿÿ‹›¤ ‰\$,‹O(…Ò„!ùÿÿê‰T$(‰ë‰è÷؉D$$‹|$ ‰t$ ‰l$0‹l$,ë C;\$(„¼‹T$$‹4š‰\$‰<$ÿT$‰t$‰D$‰,$èOìÿÿ„ÀuÏ1À颸ÿÿ‹O$‰ê+SH‰T$$…É„Fƒù†º«ªªª‰È÷âÑê9T$$Œnøÿÿ‹“¤ ‹B8‰D$,‹(‰|$$…É„b‰Ï1À‰\$(‰t$0‰î‰l$4‰Õë:‹L$$‹T¹ü‰T$Xÿ‹Dœ@‰D$‰,$èÁëÿÿ„À„øÿÿO‰Ø…Û޾…ÿ„6…À‹D$(9pHñ÷ÿÿFÿ‰D$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$,ë’‹O$‰L$$‰è+CH9Á‡º÷ÿÿ‹“¤ ‹G(‰é+L$$‰L$(‹\$$…Û„¿÷ÿÿ1ۉ׉t$,‰l$0‰Åë vC;\$$tV‹t‹D$(؉D$‹L$ ‰ $ÿT$‰t$‰D$‰<$èüêÿÿ„ÀuÌ1ÀéO÷ÿÿNé<ÿÿÿ1ÒéÇþÿÿ1Òé`ýÿÿ‹t$,‹l$ éO÷ÿÿ‹t$,‹l$0éB÷ÿÿ‹t$(‹l$ é5÷ÿÿ‹t$ ‹l$0é(÷ÿÿºé‚þÿÿºéýÿÿ‰é‹F‹T$p‰‹v …ö„köÿÿ‹D$p‰H°éböÿÿ‰ñ‹t$0‹l$4…Û~Ð1Àé¹öÿÿ‰ð‰é‹t$8‹l$<9Ç}¹1Àé¢öÿÿWVS‰Ã‰È‹t$¶|$ƒûtƒût>Kt[^_ÃvÐÖ9ðs%1Û€8 •Ãçÿ9ûtë1É€8 •Á9Ùu@9ðuï)Ð[^_ʲ9Øs)1Ƀ8 •Á‰Îçÿ9þtë1Ƀ8 •Á9ñuƒÀ9Ãwí)ÐÁø[^_ÃJr9Øs.1Éfƒ8 •Á‰Îçÿ9þtëv1Éfƒ8 •Á9ñuƒÀ9Ãwì)ÐÑø[^_ÃWVS‰Ã‰È‹t$¶|$ƒû„‹ƒûtBKt[^_ÃvÐÖ9ðv*1Û€xÿ •Ãçÿ9ûtëv1É€xÿ •Á9ÙuH9ðuî)Ð[^_ʲ9Øv.1Ƀxü •Á‰Îçÿ9þtëv1Ƀxü •Á9ñuƒè9Ãrì)ÐÁø[^_ÃvJr9Øv/1Éfƒxþ •Á‰Îçÿ9þtëf1Éfƒxþ •Á9ñuƒè9Ãrë)ÐÑø[^_ÃvWVSS‰Ã‰Ï‹D$‹t$ŠL$8L$ ”D$‹ƒû„ˆƒûtGKtZ[^_ÃvÐÖ9ðs,¶9ٔöۉ߶\$9ßtë¶9ٔöÛ9ûu@9ðuì)ÐZ[^_Â4²9ðs(1Û;”Éß¶\$9ßtëf1Û;”Ã9ûuƒÀ9Æwî)ÐÁøZ[^_ÃB4r9ðs0·9ٔöۉ߶\$9ßtëf·9ٔöÛ9ûuƒÀ9Æwê)ÐÑøZ[^_ÃUWVSƒì<‰Ã‹|$P‹l$T‹@@‰D$8L$X”Á‹ƒ¤ t$ ‰t$‹‰$ˆL$ÿP0‹S<ƒúŠL$„·ƒút^Jt ‰øƒÄ<[^_]Ã|$l$9ïs2‹T$ ‰T$Š…À~¶Û;\$t)1Òë;–tB9Âuö1Ò8ÑuG9ïu×+|$‰øƒÄ<[^_]òëä‹T$<º,ª9ïs1‹T$ ‰T$f‹…À~;\$t,1Òë;–t#B9Âuö1Ò8ÑuƒÇ9ýwÙ+|$Áÿ‰øƒÄ<[^_]òëà‹T$që&‹…Àt‹G…ÀtÇD$‰$ÿÐHtcÇD$@>q¡Ô‚q‹‰$ÿ¼‚q1ÀƒÄ[^_Ãf‹C ‰B4‹C‰B8ÇB<ÆB@ÆBA°ƒÄ[^_À~At ‰4$ÿ€‚qÇD$i>që¨vÆFAF4‰D$ÇD$‰$ÿ‰Çé&ÿÿÿÇF<‰F8ÆF@°ë…f‰4$ÿ€‚qé3ÿÿÿf‰4$ÿ€‚qÇD$Z>q¡Ø‚q‹‰$ÿ¼‚q1ÀéKÿÿÿWVSƒì`ˆÓT$èoþÿÿ„Àtv‹D$XƒøtfƒøtHtVD$èÙ¸ÿÿ¸ÿÿÿÿƒÄ`[^_ÿ°q‹D$T…À~¶Û1öf‰t$‹D$P‰$ÿ×9ØtÅF9t$TèD$è—¸ÿÿ‹D$TƒÄ`[^_ÿTq뾿€q붸ÿÿÿÿë¢fSƒì‰$ÿƒq‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿ謸ÿÿ‰ØƒÄ[ÃUWVSƒìL‰D$‰T$$ˆL$‹r$ƒþ °ƒÄL[^_]Ëz(¸èžÿÿÿ‰D$,µèŽÿÿÿ‰D$ ‹T$,…Ò„°…À„¨1À‹T$,‰4‚@=uõ»l$0‰t$‰|$‹|$,ëf%ÿ‰4‡C;\$tB‹t$)Þ‹T$‹Dšü€|$t܉l$‰$‹T$ÿR0…À~Ò1Ò‹L•áÿ‰4B9ÂuîC;\$u¾‹t$‹|$€|$…±ÇD$¬qnþƒî‰t$(ÆD$ÇD$»‰ðØx$T‹—‰T$‹‡‰D$‹D$‰$ÿT$„ÀtuKuÖ­…öxs‹‰D$‹·‰D$‹D$‰$ÿT$„ÀtVN€|$…މt$(ÆD$‹\$K…íy‹D$,‹T$$‰B‹D$ ‰B°ƒÄL[^_]ÃÇD$@EqéJÿÿÿfN‹\$KéYÿÿÿ‰è)ð‹T$ ‰M€|$uN…öxÿD$ÆD$ë‹t$(…öyì…íx™‹T$ ‰è)ð‰ªMNƒýÿuòë…ÆD$érÿÿÿ‹D$,‰$‹ƒqÿÓ‹D$ ‰$ÿÓ1ÀéüýÿÿvUWVSƒì<‰Æ‰Ó‰L$‹(‹R$‰ÈÐ;D$PXöC,€„Ü‹{…ÿtU‹E@‰D$ ‹K(‹[‰\$rÿµ‹‰D$‹D$P)Љ$‹E<ƒø„¾ƒø„ÍH„†¸ÿÿÿÿƒÄ<[^_]Ëu@‰t$‹K(‹‹D$P)Ћu<ƒþ„Vƒþ„NuÈ‹t$t$‹l$Å9îv ë´fF9õr­¶9Ãuôƒúv!¶F;Auæ¸ë v¶<;üÿÿ@ÁàèŠÖÿÿ‰Æ‰C\…À„üÿÿ‹E$@ Áá1À‰÷óªéýÿÿ‹T$,éwûÿÿUWVS쌉D$(‰T$,¶¬$¨¶¼$°Šœ$´¶´$¸T$<‰È‰L$$èÔÿÿ„À‹L$$u1ÀÄŒ[^_]Ãvæÿ‰t$¶Û‰\$çÿ‰|$‹„$¬‰D$åÿ‰l$ ‹„$¤‰D$‹„$ ‰D$D$<‰$‹T$,‹D$(èžùÿÿ„Àt°ÄŒ[^_]ÃD$<èŽÿÿ1ÀÄŒ[^_]Ãfƒì‹T$ ‹D$$…ÀxQ;B0L…Àt(D@ý‹J4Á‹P‰T$‹‰D$Ç$ˆ7qÿˆƒqƒÄËB$‰D$‹B ‰D$Ç$ˆ7qÿˆƒqƒÄÃ1Ò¸òÿÿÿèèÿÿ1ÀƒÄÃfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹@‰D$ÇD$ª5q¡ˆƒqƒÄ ÿà‹B$ëäv1Ò¸òÿÿÿèÿÿ1ÀƒÄ Ãfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹‰D$ÇD$ª5q¡ˆƒqƒÄ ÿàf‹B ëãv1Ò¸òÿÿÿè8ÿÿ1ÀƒÄ ÃfWVSƒì ‰Ã‰ÖIt‰ÐèHÔÿÿ‰Ç…À„Š…ö~'f‹fúÿwL1É1Àëf‰Áf‹Cfúÿw7ˆ@9ðuë‰t$‰|$Ç$—>qÿˆƒq‰<$‰D$ÿƒq‹D$ƒÄ [^_Ãf‰<$ÿƒq1ÀƒÄ [^_Ãf‰T$‰D$Ç$—>qÿˆƒqƒÄ [^_Ã1ÀëÃUWVS위$Œ‰D$ „$ˆ‰D$ÇD$š>q‹„$´‰$ÿx‚q…À„œö„$ˆu‹´$Œÿ‰ðÄœ[^_]ÃT$8‹„$Œè,Ñÿÿ„À„d‹D$t‰D$ ƒø„ǃøt"H„ËD$8膋ÿÿ1ö‰ðÄœ[^_]ÃvÇD$(°q‹„$ˆ¨ u¨…¥¨€…ɾÀÊqƒ|$ „¨ƒ|$ „ƒ|$ uŸÇD$dqöÄ@‹D$pt@¯D$ èœÒÿÿ‰Ã…À„wÿÿÿö„$‰@„À‹v8‰t$,‹t$p…öŽg1í1ö|$|‰l$‹D$l‰$ÿT$(‰|$‰$ÿT$,‰D$…À~,1Ò‰l$$‰Ý‰Ó‹Ÿ‰D$‰D$‰,$ÿT$C;\$uä‰ë‹l$$t$E9l$p§€|$x„‰t$‰$ÿ|ƒq‰Æ‰$ÿƒqD$8èWŠÿÿ‰ðÄœ[^_]Ãf1ö‰ðÄœ[^_]Ën4‹t$p…ö~ª1ÿ‹t$(‰l$‹l$v‰|$‹D$l‰$ÿÖ‰$ÿT$‰D$‰|$‰$ÿÕG‹D$p9øÖ‰Æéhÿÿÿv‹L$ ‰ò‰Øè ýÿÿ‰ÆékÿÿÿÇD$(€qé[þÿÿvÇD$(TqéKþÿÿv¾Ëqé_þÿÿfÇD$¼qéuþÿÿvÇD$qéeþÿÿv¾@Ëqé3þÿÿ1öéôþÿÿvUWVSƒìL‰D$$‰T$(‰Î‹\$`‹l$d‹D$hƒèƒø‡?‹<…¬Wq‹…¸Wq‰D$,‹D$$‹€¤ ‰D$ ‹@,9뾉l$‰õ‰Æë fC;\$„¡‰\$‰,$ÿ׉$ÿÖ„Àtã‰î‹l$‹T$ ‹R<‰T$‰\$‰4$ÿ×T$0‰T$‰$ÿT$‰D$…ÀŽÛC‰D$ 1ÿëvG;|$„’‹D¼0‰D$‰\$‰4$ÿT$,‹T$h‰T$‰l$‹D$ ‰$‰ñ‹T$(‹D$$èÿÿÿ…Àt¼ƒÄL[^_]Éî‹l$‹D$$€¸2 u]‹L$h‰ê‰ðèxûÿÿ‰Ã…Ût_‰\$‹T$(‰$ÿ@ƒq‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄL[^_]ÃvÇD$,dq¿TqéÁþÿÿf‰l$‰4$ÿ|ƒq‰Ãë¡1Àë̸÷ÿÿÿëÅSƒì‰T$‰$ÿƒq‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿèˆÿÿ‰ØƒÄ[ÃUWVSƒì,‰Æ‰ÍˆT$¸0èÏÿÿ‰Ã…Àth¹01À‰ßóª‹D$D‰C$…ÀuwÇC(ŠD$ˆC.‰èƒàˆC/Áå f‰k,‹D$@‰C ‹V<9V@|C‰F<…Àt)Áâ‹FDèVÿÿÿ…ÀtZ‰FD‹V@‰B‰V@‰ØƒÄ,[^_]ÃvÇF<º@ëÌf‹FDëÔvÁàè€Îÿÿ‰C(…Àu1À‰$‹5ƒqÿÖ‰$ÿÖ1Ûë¶v‹C(ëävWVSƒì‰Ã‹P9Sr~Š‹H¶ÂƒèƒøIwZ¾°`WqöÁt1ö¶Ò‹CÇD$‰4$èÞþÿÿ…ÀtM‹‹z‹H(‰9ƒÂ ‰‹S‹:…ÿt*‰B‰C…ötÿC ¸ƒÄ[^_Ã1ö멸ƒÄ[^_ÉëÕ¸ÿÿÿÿëݸ÷ÿÿÿëÖfWVSƒì‰Ã‹P 9S‚†Š‹H¶ÂƒèƒøIwb¾°`WqöÁt1ö¶Ò‹CÇD$‰4$è:þÿÿ…ÀtU‹H(‹‹z‰9‹z ‰yƒÂ‰‹S‹ …Ét,‰B‰C…ötÿC ¸ƒÄ[^_Ãv1ö롸ƒÄ[^_ÉëÓ¸ÿÿÿÿëÛ¸÷ÿÿÿëÔfUWVSƒì,‰Ã‰Õ‹‹H‹pµ ‰T$Â9S‚ΊˆD$¶ÀƒèƒøIvv1ÿ¶T$‹C‰t$‰<$èˆýÿÿ…À„¦‰ê„ÒufH,…öt‹h(‹;1Ò‹L— ‰L•B9òuó‹T$‹S‹:…ÿt`‰B‰CŠD$ƒèG<vs ¸ƒÄ,[^_]Ãv¾¸`Wq¯þ뀋K …öt%ƒþv(º«ªªª‰ð÷âÑêʉS ¸ƒÄ,[^_]Ãv1Òëç‰럺ëܸÿÿÿÿ맸÷ÿÿÿë vUWVSƒì‰Ã‹Š‹H¶ÂƒèƒøI‡í¾°`WqöÁt1ö¶Ò‹CÇD$‰4$èüÿÿ‰Ç…À„僋C‹(…í„ljx‰{‹k ‹‹ƒè ƒø:v¸ÿÿÿÿƒÄ[^_]Ãÿ$…¨>qº‰Øèdþÿÿ…À„‹;SsÏ‹ƒøuÀƒÂ‰‹‰Glj{‰k …ötPE‰k ¸ƒÄ[^_]Ãv‰Øè!ÿÿÿƒøt¸ë‘f‰Øè]ýÿÿƒøt¨ëf‰Øè­üÿÿƒøt˜énÿÿÿv1öéÿÿÿ¸ƒÄ[^_]Ãv‰8é5ÿÿÿ1ÀéEÿÿÿ¸÷ÿÿÿé;ÿÿÿUWVSƒì‰Î‹\$0‰×JþƒùIwI¾Š^Wq‰Í¯î‰ù¶Ñ‰t$‰,$1Éè^ûÿÿ…ÀtfH,…ö~‹x(1Òv‹ “‰ —B9òuõƒÄ[^_]Ã1íë¿UWVSƒì‰Ã…Àtk‹@(4•,0‹}B‰T$ …ÿt9 tM1Òë9L•tBB9úuõ‹S$•‰L$è®úÿÿ…À‹L$t,ÿC$‰C(Æ‹‹T$ Ú‰ C‰°ƒÄ[^_]Ãf°ƒÄ[^_]Ã1ÀëôfUWVSƒì‰Å‰×‰Î‹\$0…Ût;‹C,¨@u4ƒÈ@f‰C,ŠC.ƒè‰{‹)‰kDmÁà‰D$‹D$@‹‰D$‰<$è™ëÇC ÿÿÿÿ°ƒÄ,[^_]ËzëÊv1ÀƒÄ,[^_]ÃfWVSƒì‰Ç‰Ö‰ËIC‰$‰øèXÿÿÿ„Àt4KVC‰$‰øèAÿÿÿ„Àt‹C(‰F(‹C,‰F,‹C0‰F0°ƒÄ[^_Ãf‹V‰øè*hÿÿ‹V‰øè hÿÿ1ÀƒÄ[^_ÃvUWVSƒì‰Å‹¸ä ‹G‰D$…Àt~‹E‰D$‹@‰$…À~4‹]P‹O 1À1Ò‰|$ v‹4‹|‰4‰|‹t‰tBƒÀ;$uá‹|$ ‹D$‹P$…Ò~.1Û1ö‰$‰Ã‹ $O‹$U\1ÀèÿÿÿFƒ$49s$ã‹G‰D$‹‰…ä ‹D$ƒÄ[^_]ÃUWVSƒì‰D$‰Ó‹‰$‹‰T$ ‹€ä …À„ª‹h…턳‰]…Û„€‹D$ ‹@‰D$…À~-‹] ‹$‹JP1À1Ò‹4‹|‰4‰|‹t‰tBƒÀ;T$uà‹L$ ‹Y$…Û~91Û1ö‰Ïë FƒÃ49w$~'‰Ù‹$H\‹UÚ‹D$è5þÿÿ„ÀuÝ1ÀƒÄ[^_]Ãv‹$‰ªä °ƒÄ[^_]Ë$‹¨à …í…Pÿÿÿvº‹D$è²Àÿÿ‰Å…Àt·‹T$ ‹B@Áâ‹D$è–Àÿÿ‰E ‹L$ ‹A$@Áâ‹D$èzÀÿÿ‰E‹U …ÒtQ…ÀtM‹L$ ‹A @Áá1ö‰×‰ðóª‹T$ ‹B$@ Áá‹U‰×‰ðóª‹$‹‚ä ‰EÇE…Àt/‰hé¬þÿÿ‹D$èÚeÿÿ‹U‹D$èÎeÿÿ‰ê‹D$èÃeÿÿ1Àéÿÿÿ‹ $‰©à éwþÿÿfUWVSƒì‰Å‹D$0‹]@‰\$ 8L$8”D$ ‹½¤ ‹2‹U<ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ërëC9ët¶ ‰ò‰øègeÿÿ8D$ t鉨+D$ ƒÄ[^_]Ãv‹T$ ‚‹D$4,‚9ër ëƒÃ9Ýv‹ ‰ò‰øè*eÿÿ8D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹T$ B‹D$4,B9ër ëƒÃ9Ýv· ‰ò‰øèédÿÿ8D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‹D$0‹]@‰\$ 8L$8”D$ ‹½¤ ‹2‹U<ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ëwëK9ët¶Kÿ‰ò‰øèjdÿÿ8D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹T$ ‚‹D$4,‚9ëw ëƒë9Ýs‹Kü‰ò‰øè-dÿÿ8D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹T$ B‹D$4,B9ëw ëƒë9Ýs·Kþ‰ò‰øèìcÿÿ8D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰D$‰Ë‹|$@€z.Av 1ÀvƒÄ,[^_]öJ.ÿ$HCqÇD$‰Ù‹D$+HH9ùv‰ù‰ß)ω<$‰Ù‹D$èë{ÿÿ)ÉØë½ÇD$‰Ù‹D$+HH9ùv‰ù‰ß)ω<$‰Ù‹D$èwyÿÿ)ÉØëÇD$‹D$‹HL)Ù9ùv‰ùÙ‰ $‰Ù‹D$èMxÿÿ)Øé^ÿÿÿfÇD$‹D$‹HL)Ù9ùv‰ùÙ‰ $‰Ù‹D$èazÿÿ)Øé.ÿÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‰Ù+HH‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èèQ•ÿÿ)ÉØéØþÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$胓ÿÿ)ÉØéžþÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$赑ÿÿ)Øéfþÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‹@L)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèŸÿÿ)ØéþÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$èoÿÿ)ÉØéâýÿÿfŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$è—üÿÿ)ÉØé¦ýÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èaûÿÿ)ØénýÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èÉÿÿ)Øé6ýÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‰Ù+HH‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èèyŒÿÿ)ÉØéàüÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$èߊÿÿ)ÉØé¦üÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èM‰ÿÿ)Øénüÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‹@L)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèˆÿÿ)Øé$üÿÿ‰Ú‹D$+PH9úv‰ú‰Ù)ÑÇ$‰Ú‹D$èEÿÿ)ÉØéöûÿÿf‹D$‹HL)Ù9ùv‰ùÙÇ$‰Ú‹D$è Dÿÿ)ØéÊûÿÿf‹D$‹P@‹p<ÇD$‰Ø‹L$+AH9øv‰ø‰ß)lj<$‰Ù‰ð蓆ÿÿ)ÉØéŽûÿÿf‰Ø‹L$+AH9ø†{ûÿÿ‰øétûÿÿ‹T$‹BL)Ø9ø†cûÿÿëæ‹D$‹P@‹p<ÇD$‹@L)Ø9øv‰ø؉$‰Ù‰ðè]…ÿÿ)Øé.ûÿÿfUWVSƒì\‰D$LˆL$;‹*‹B‰D$4‹Z‹D$L‹‰D$,„Ét‹Ph‰T$<‰×+xH9|$4~'1í‰èƒÄ\[^_]ËD$,‹@h‰D$<‹T$,‹zL)Ç9|$4Ù‹D$,‹€¨ ‰D$ ‹T$,‹r@‹‚¤ ‹@4‰D$$‹D$Lè^ÿÿ‹D$,‹@<‰D$@ƒø„2ƒø„þHuŽÇD$(dq9ß~‰ß‹D$@¯ÇèyŸÿÿ‰Ã…À„‹T$,‹‹@8‹@ ‹¨‰D$H…À„ø9|$4ê‰ú÷Ú‰T$0f€|$;„­‹D$0‰D$D…ÿ~91í‹T$<ЉD$‹D$è‰D$‰4$ÿT$ ‰$ÿT$$‰D$‰l$‰$ÿT$(E9ýuÔ‹D$@‰D$‰|$Ç$‰Ù‹T$H‹D$,èÎÍÿÿƒøtM…ÀuOÿD$09|$4Žvÿÿÿ‰Å‰$ÿƒq‹D$Lèæ\ÿÿ‰èƒÄ\[^_]ÃÇD$(¼qéÿÿÿv‰|$D1ÀéPÿÿÿ‰Å‹D$D‹T$,Bhë¹ÇD$(qéÕþÿÿ1í먉$ÿƒq‹D$LèŽ\ÿÿ½þÿÿÿé=þÿÿWVSƒì‰Æ‰ÓƒùŽ¥¡0Äq‰$ÿ0ƒqÇD$ Äq‰$ÿ,ƒq‰Ç…Àth‹C‰G‰G ÇG‰wÇG8ƒÿ‹V …Ò~N‹CPèÀÿÿ‰G4…Àto‹V ‰W0‹CH‰G‹CL‰G€»5 tD‹Ch‰G ‹Cd‰G$‹CT‰G(‹CX‰G,‰øƒÄ[^_ÃvÇG4ë»vuB‹=˜ƒqÿ‰øƒÄ[^_ËCd‰G ‹Ch‰G$ëºf‹H‰…Àt1ÿë·v‹G‰<$ÿP1ÿë§v1Ò‰ÈèVÿÿ1ÿë—vVSƒì$‹t$0Š\$4ˆ\$‹˜ƒq9Þt …É~;H ~$€|$t51Ò1À‰T$‰D$‰4$ÿ<ƒqƒÄ$[^ÃfDIý‹B…Àt΋‹RëÒvÿ‰ØƒÄ$[^ÃfSƒì‰Ã‰È…Òxp;S0k…Òt?TRý‹K4Ñ‹ …Éx'‹R…Òx ‹C)‰T$)Á‰L$‹C ‰$ÿ<ƒqƒÄ[ÃÿƒÄ[ËS‹C$)ЉD$‹C )ЉD$‹C ‰$ÿ<ƒqƒÄ[Ãf1Ò¸òÿÿÿèUÿÿ1ÀƒÄ[ÃWVSƒì0‹t$@¡˜ƒq‰D$,D$,‰D$ÇD$ \ÌqÇD$PDq‹D$H‰D$‹D$D‰$ÿ|‚q…ÀtD‹F0‰$ÿdƒq‰Ç…Àt4‹^0…Û~-1Ûë v‰DŸ9^0~C‹L$,‰Ú‰ðèõþÿÿ…Àuå‹H‰…Àt 1ÿ‰øƒÄ0[^_ËG‰<$ÿP1ÿ‰øƒÄ0[^_ÃSƒì‰Ã‹‚´ …Àt‰$ÿ`ƒq‹H‰…ÀtƒÄ[ËC‰$ÿPƒÄ[ÃfVSƒì$‹\$0‹C‹p0…ötA‹C,…Àx:‰D$Ç$ª5qÿˆƒq‰Æ‰D$‹C‹@0‰$ÿ‚q‹J‰…Òt…Àu ÿ¨‚q¡˜ƒqÿƒÄ$[^Ãv‹V‰4$‰D$ÿR‹D$ëÒWVSƒì‰Æ‰$ÿà‚q‰Ãƒøÿt ‰ØƒÄ[^_Ãv‹=´‚qÿ×…Àtèÿ¨‚q‰4$ÿø‚q‰ÃƒøÿuÒÿ×…ÀtÌ1Ò¸ñÿÿÿè\Sÿÿë¾fUWVSƒì,‰Ã‰Ö‰ÍŠD$@ˆD$‰Èèˆÿÿÿ‰Çƒøÿt9…Àx‹9ø|‰øƒÄ,[^_]À|$t ‹|8…ÿàv¿ÿÿÿÿ‰øƒÄ,[^_]á´‚q‰D$ÿÐ…ÀtÍ‹‹5¨‚q‹x,…ÿt;ÿÖ‰l$‹‹@,‰$ÿ(ƒq‰Ã…Àt!è ÿÿÿ‰Ç‹H‰…Àt ƒÿÿu„ÿT$…À„xÿÿÿÿÖ¿ÿÿÿÿélÿÿÿv‹C‰$ÿPëÕWVSƒì‰Ã‰×‰Î‹B÷@T€t$S0CÇ$‰ùèÿÿÿ‰D$‰$ÿÖƒÄ[^_øóÿÿÿèBRÿÿ1ÀƒÄ[^_ÃUWVSƒì,‰D$‰Ö‰L$‹j…íu ÇD$‹D$‰$ÿT$‰Ç‰øƒÄ,[^_]ÃýtK‰,$ÿdƒq‰Ç…Àtá…í~Ý1Ûë ‰DŸ C9ëtЋTž ‹L$‹D$èBÿÿÿ…Àuâ‹H‰…Àt%1ÿ‰øƒÄ,[^_]ËR ‹L$‹D$ƒÄ,[^_]éÿÿÿ‹G‰<$ÿP1ÿë€v¹”0q‹T$‹D$é>ÿÿÿf¹¨1q‹T$‹D$é*ÿÿÿf¹ 2q‹T$‹D$éÿÿÿf¹´6q‹T$‹D$éÿÿÿf¹h q‹T$‹D$éîþÿÿf¹Ü q‹T$‹D$éÚþÿÿf¹4¡q‹T$‹D$éÆþÿÿfWVSƒì‰Ã‰×‰ÎŠL$ ‹B÷@T€t$S0C¶É‰ $‰ùèuýÿÿ‰ñ‰Â‰ØƒÄ[^_é ûÿÿ¸óÿÿÿè²Pÿÿ1ÀƒÄ[^_ÃUWVSƒì,‹D$@‰D$‹t$D‹n…íu‹ ˜ƒq1Ò‹D$ƒÄ,[^_]éÚúÿÿfƒýtS‰,$ÿdƒq‰Ç…Àt:…í~61Ûë ‰DŸ C9ët)‹Tž Ç$‹ ˜ƒq‹D$è9ÿÿÿ…ÀuÙ‹H‰…Àt01ÿ‰øƒÄ,[^_]ËV ÇD$@‹ ˜ƒq‹D$ƒÄ,[^_]éÿþÿÿv‹G‰<$ÿP1ÿëÅvUWVSƒì,‰D$ÿ”‚q‰Å…À„Ó‹T$‹B‹@,…À„ÁÇD$ÇD$ZDq‰$ÿƒq‰Ã…À„‘‹@…ÀŽÍ‹C ‹0…ött1ÿë…ÀxlG9{޲‹C ‹4¸…ötXÇ$‹ ˜ƒq‰ò‹D$èTþÿÿ…À„œ‰D$‰t$‰,$‰D$ÿœ‚q‹T$‹ I‰ …Éu¦‹J‰$‰D$ÿQ‹D$…Ày•‹H‰…Àt/‹EH‰E…Àt 1í‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãv‹C‰$ÿP‹EH‰E…ÀuÈëÒf‹H‰…Àu½‹C‰$ÿP벋H‰…Àu“‹F‰4$ÿPëˆUWVSƒì,‹t$@ÇD$_Dq‹D$D‰$ÿ$ƒq‰Å…À„«‹F0@‰$ÿdƒq‰Ç…À„‰‹F0…Àx*1Ûf‹ ˜ƒq‰Ú‰ðè¡øÿÿ‰D$‰\$‰<$ÿlƒqC9^0}Ú‰ðè7þÿÿ‰Ã…Àt9‰D$‰|$‰,$ÿƒq‹J‰…Òtc‹J‰…Òtt‹UJ‰U…Òt3ƒÄ,[^_]Ãv‹H‰…Àu ‹G‰<$ÿP‹EH‰E…Àtc1ÀƒÄ,[^_]ËU‰,$‰D$ÿR‹D$ƒÄ,[^_]Ãv‹S‰$‰D$ÿR‹D$‹J‰…ÒuŒ‹W‰<$‰D$ÿR‹D$‹UJ‰U…Ò…wÿÿÿ먋E‰,$ÿP1ÀƒÄ,[^_]ÃUWVSƒìL¡˜ƒq‰D$ûÿÿ1Ûééûÿÿvfƒ,ˆM‹O(‹W$„$‰D$‹CL‰D$‰4$‹t$D‹èëvÿÿ‰Æ…öˆ(v9|$@…0þÿÿ‹T$@‹…À„…wŒ$ø‰ $‹Œ$‰Øè™_ÿÿ„À…ewFŠƒ5 „À„Yl;sHqùÿÿ1ÛéTûÿÿfÇD$‰,$‰ñ‰ú‰Øè^[ÿÿ‰Æ9ÅŒ€úÿÿ1Ûé+ûÿÿ‹“¨ ‰T$l‹S@<ÀƒàHMÿ‰L$8NxA‰|$H‰\$P‰l$\‹|$l‰Õ‰Ãëv9t$8„qZÞx‰t$‰,$ÿ׃ø uä‹|$H‹\$P‹l$\FéúÿÿfÇD$‰,$‰ñ‰ú‰ØèŽWÿÿ‰Æ9Åðùÿÿ1Ûé›úÿÿÇD$‰,$‰ñ‰ú‰ØèªYÿÿ‰Æ9ÅÈùÿÿ1ÛésúÿÿÇD$‰,$‰ñ‰ú‰Øè:Xÿÿ‰Æ9ÅŒ ùÿÿ1ÛéKúÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè´nÿÿ‰Æ9Årùÿÿ1ÛéúÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„@t$8‰t$‰$ÿ×8D$Huåé`ýÿÿŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@ ‰|$P‰Çë 9õ„t$8‰t$‰$ÿ×8D$Huåéýÿÿ„À„ˆ‹CD9Æý‹Cl9Æò1Ûémùÿÿv„À„<;sD„§øÿÿ1ÛéRùÿÿ‹‹¨ ‹S@<ÀƒàH‰D$8;sD„‚øÿÿ‰|$P‰\$H‰Ï‰Óë9õ„ Xt$8‹T$H;rD„X‰t$‰$ÿ׃ø uÙ‹|$P‹\$Hé@øÿÿ‹S@‹C<ÇD$‰,$‰ñèÐgÿÿ‰Æ9ÅŒøÿÿ1ÛéÉøÿÿvfƒ,y ;³( „øÿÿ‰,$‰ñ‰ú‹D$Dè—ÿÿ‰Æ…À‰ç÷ÿÿ1Ûé’øÿÿ‹S@‹C<ÇD$‰,$‰ñèœfÿÿ‰Æ9ž÷ÿÿ1Ûéiøÿÿv‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èhÿÿ‰Æ9Å~÷ÿÿ1Ûé)øÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„Dt$8‰t$‰$ÿ×8D$HuåélûÿÿÇ$‰é‰ò‰ØèÒ$ÿÿ‰Æ9ÅŒ÷ÿÿ1Ûé¿÷ÿÿ‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8ènÿÿ‰Æ9ÅÖöÿÿ1Ûé÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øèàlÿÿ‰Æ9ÅŒ¦öÿÿ1ÛéQ÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèÚÿÿ‰Æ9ÅŒvöÿÿ1Ûé!÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèèØÿÿ‰Æ9ÅFöÿÿ1ÛéñöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè¨oÿÿ‰Æ9ÅŒöÿÿ1ÛéÁöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øèämÿÿ‰Æ9Åæõÿÿ1Ûé‘öÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„¤t$8‰t$‰$ÿ×8D$HuåéÔùÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„Xt$8‰t$‰$ÿ×8D$HuåéùÿÿŠO/‹W(ÇD$‰l$‰4$‰Øèhÿÿ‰Æ9ÅŒ.õÿÿ1ÛéÙõÿÿvÇ$‰é‰ò‰Øèö!ÿÿ‰Æ9Åõÿÿ1Ûé³õÿÿŠO/‹W(ÇD$‰l$‰4$‰Øèhfÿÿ‰Æ9ÅÚôÿÿ1Ûé…õÿÿv‰Æ9CHŽÅôÿÿ1Ûépõÿÿf‹„$ø‰ñ‹´$üéþ÷ÿÿv‹l$4‰uh»‰ØÄ,[^_]Ãv‰Œ$é`õÿÿ1Ûé'õÿÿ‹sD9sL„hôÿÿ1Ûéõÿÿ…ö„Xôÿÿ1Ûéõÿÿ‹Cl9Æ~‹CD9Æ~ 1Ûéíôÿÿv‰Æ9CL-ôÿÿ1ÛéØôÿÿf9ÆŽ›÷ÿÿ1ÛéÇôÿÿ1Ûé¿ôÿÿ1Ûé·ôÿÿ1Ûé¯ôÿÿ1Ûé§ôÿÿ1ÛéŸôÿÿ1Ûé—ôÿÿ1Ûéôÿÿ;³( …§øÿÿ‹ƒ, ‰„$é½øÿÿf;³( …·öÿÿ‹ƒ, ‰„$éÍöÿÿ‹Kh‹CH‰$‹D$D訌ÿÿ…Àˆ›q‰ƒ( ‹–€‰Á+J$‰‹, ‹V|…ÒˆØõÿÿ‹Ch9ÂÎõÿÿ‰Ðé¸ñÿÿ‹Kh‹CL‰$‹D$Dè°ƒÿÿ‰Â…ÀˆBq‰“( ‹†€‹@$Љƒ, ‹F|…Àˆ†õÿÿ)‹Ch9ÂŒ|õÿÿ‰Ðéuõÿÿ‹J(‹R$„$‰D$‹CH‰D$‹Ch‰$‰Øè#pÿÿ…Àˆíp‰ƒ( ‹”$‰“, ‹V|…Ò‰Oÿÿÿé"õÿÿ‹J(‹R$¼$‰|$‹CL‰D$‹Ch‰$‰Øèonÿÿ…Àˆˆp‰ƒ( ‹”$‰“, ‹V|…Òˆ×ôÿÿ)Љ‹Ch9ÂŒËôÿÿ‰ÐéÄôÿÿ‹Kh‹CL‰$‹D$DèM~ÿÿ‰Â…À‰ýþÿÿ1ÛéÚòÿÿ‹Kh‹CH‰$‹D$Dè*‘ÿÿ…Àˆo‰ƒ( ‹–€‰Ç+z$‰», ‹V|…Ò‰Šþÿÿé]ôÿÿ‹„$9D$XŒè\öA- …#c‹…0 @f‰…0 f…À„‰<‹•„ ‹‚ H ÀЉŒ €{ ]†Š-»ÿÿÿÿ‰ØÄ,[^_]Ë„$‰D$‰,$‹\$hÿS‹”$:B/„§`öB- t‰Œ$„$‰$‹T$d‹D$D蟗ÿÿ„À„aq‹„$…À…òÿÿéOÿÿÿv‹„$9D$p{[öA- „1ÿÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèû•ÿÿ„À„o‹„$…À…¤ñÿÿéïþÿÿv‹„$9D$XŒI\öA- „ÑþÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$D蛕ÿÿ„À„ûp‹„$…À…Dñÿÿéþÿÿv‹„$‰D$‰,$‹t$hÿV‹”$:B/„G`öB- „]þÿÿŒ$„$‰$‹T$d‹D$Dès–ÿÿ„À„Sp‹„$…À…Øðÿÿé#þÿÿv‹„$‰D$‰,$‹\$hÿS‹”$:B/„aöB- „ñýÿÿŒ$„$‰$‹T$d‹D$Dè–ÿÿ„À„ÿm‹„$…À…lðÿÿé·ýÿÿv‹„$‰Eh‹S(¹‹D$DèåØÿÿƒøŒÕl„Šýÿÿ‹Eh‰„$‹„$‹‰„$éðÿÿ‹„$‰Eh‹C(‹8‹X‰\$4‹H‹D$D‹‹sh‰ò+SH9T$4:ýÿÿ‹ƒ° ‰D$L‹C@‰D$8‹D$D‰T$0‰L$,è7ÿÿ‹‹@8‹@ ‹¸‰D$<…À‹T$0‹L$,„Og‰Ï9Ñ~‰×9|$4/g)þ‰l$Hëfv‰t$‹l$8‰,$ÿT$L‰|$‰$ÿ|ƒq‰Å…í„ g‰l$‹T$<‰$ÿ@ƒq‹MI‰M…É„ÅNƒø„ÒN…À…"nOF9|$4½f€»2 u”‹k<‰t$‹D$8‰$ÿT$L‰é‰úè…£ÿÿ‰Å듺‹D$Dè³ÿÿ„À„bk‹Œ ÇD$…¸ ‰D$‰$蹋„$‹@(‹‰C‹„$‰C•¼ ¹1À‰×óªÇ…Ì ‹„$‰…¸ ‹‰„$é|îÿÿ‹„$‰D$‰,$‹t$hÿV‹”$:B/„ _öB- „ûÿÿŒ$„$‰$‹T$d‹D$D賓ÿÿ„À„gl‹„$…À…îÿÿécûÿÿv‹C(‹0‹]\º‹D$Dèºÿÿ„À„}jv†ƒ‹…Œ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹…$ ‰C0‹”$‹B(‹x…ÿ…(1ÿ‹@…À„}T1À‰ú„Ò„ÏR„À…¢e‹„$ø‰„$‹„$ü‰„$éZíÿÿ‹C(‹0‹‹D$DèBÍÿÿ„À„Þi‹]‹K…É~$‹EP1ÒvÇÿÿÿÿÇ@ÿÿÿÿÇ@ÿÿÿÿBƒÀ9Êuä‹K$…É~)‹E\1ÒÇ@Ç@ ÿÿÿÿÇ@Ç@ ÿÿÿÿBƒÀ49ÊuÜ‹\$T‹CX‹ð‹‰„$º‹D$D胎ÿÿ„À…»ìÿÿ»ðÿÿÿéìÿÿ‹„$9D$XŒ›YöA- „åùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè¯ÿÿ„À„k‹„$…À…Xìÿÿé£ùÿÿv‹„$9D$XŒ³VöA- „…ùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèOÿÿ„À„³i‹„$…À…øëÿÿéCùÿÿv‹´$Œ9´$„%\öC- „"ùÿÿŒ$„$‰$‹T$d‹D$Dè8‘ÿÿ„À„&i‹„$…À…ëÿÿéèøÿÿ‹„$;„$Œ„Q;El„ QöC- „ÁøÿÿŒ$„$‰$‹T$d‹D$Dè×ÿÿ„À„wi‹„$…À…<ëÿÿ釸ÿÿv‹„$9D$XŒ0VöA- „iøÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè3ÿÿ„À„j‹œ$…Û…Üêÿÿé'øÿÿvº‹D$D膌ÿÿ„À„ug‹…Œ Š•: ˆP‹…Œ ‹•$ ‰‹D$Dè|”ÿÿ„À„=g‹„ ‹» ‰|$4‹µ” ‰t$<Š…8 ˆD$L‹½ä ‹„$‰EhÆ…8 ‹„$‹PÇ$1É‹D$DèAæÿÿ‰Æ…Àˆzg‹„$‹P(‰èè&ÿÿ‰½ä ŠT$Lˆ•8 ‹|$<‰½” ‹|$4‰» ‰„ N…=÷ÿÿ‹„$‹‰„$‹Eh‰„$éÎéÿÿ‹C(‹D@ý‹UP‹H…ɈîY‹‰„$é¦éÿÿ‹D$Dè“ÿÿ„À„ôe‹µ$ ‰t$8‹„ ‹» ‰|$4‹µ” Š…8 ˆD$<‹½ä ‰|$LÇEH‹„$Œ‰EL‹„$‰EhÆ…8 Š•: ˆT$H‹„$‹PÇ$1É‹D$Dè!åÿÿ‰Ç…Àˆge‹„$‹P(ƒÂ‰èèÿÿ‹L$p‰ML‹D$X‰EH‹T$L‰•ä ŠL$<ˆ8 ‰µ” ‹D$4‰ƒ ‰„ ‹„$€x/„×MO„æc‹E‹X…Û„íõÿÿ‹‰…” éàõÿÿ‹„$9D$p’OöA- „ÅõÿÿŒ$ÇD$„$‰$‹T$d‹D$DèŒÿÿ„À„g‹”$…Ò…8èÿÿéƒõÿÿv‹C(‹D@ý‹UP‹x…ÿˆfõÿÿ‹p<þ‹\$h‹[8‰\$4‹„$ …ÀˆN‹„$‰D$‹t$|‰4$ÿT$t”$܉T$‰$ÿT$4‰Ã‹„$ ‰D$‰4$ÿT$t”$ì‰T$‰$ÿT$4‰Æ‹”$ ‹„$9WŽ 9Ë„$9D$pè@1ÛÇ„$;´$ŽD7‹„$9Ã~‹”$‹Œ”ì9Œ„Ü„Ð@‹„$ö@- „ÓZŒ$ÇD$”$‰T$‰t$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$DèN‰ÿÿ„À„nZ€¼$„¤Z‹„$9à …Û~ÿ„$‹”$ ;´$þþÿÿB‰”$ 9WöþÿÿÇ„$ ÿÿÿÿ9ØŒÂóÿÿ9´$Œµóÿÿ‹„$‹‰„$éPæÿÿ‹C(‹D@ý‹]PËp…öˆ†óÿÿ‹P4ò‹\$h‹[8‰\$4‹Œ$ …ɈoL‹„$H‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰Ã‹„$ H‰D$‹|$|‰<$ÿT$t”$܉T$‰$ÿT$4‰Ç‹”$ ‹„$f;Ž£W…ÀŽÀ5‹„$…ÀŽíÿÿŒ$„$‰$‹T$d‹D$DèT…ÿÿ„À„œ]‹„$…À…¹ßÿÿéíÿÿ‹„$‰D$‰,$‹\$hÿS ‹”$:B/„çNöB- „ÕìÿÿŒ$„$‰$‹T$d‹D$Dèë„ÿÿ„À„C_‹„$…À…Pßÿÿé›ìÿÿv1Ò‹D$Dè5¿ÿÿ„À„2\º ‹D$Dèç€ÿÿ„À„\‹„$‹‰„$é ßÿÿ‹„$9D$p°KöA- „?ìÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè ƒÿÿ„À„g]‹”$…Ò…²Þÿÿéýëÿÿ‹„$9D$pGöA- „áëÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè«‚ÿÿ„À„×\‹„$…À…TÞÿÿéŸëÿÿv‹„$9D$XŒ2FöA- „ëÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèK‚ÿÿ„À„¿]‹„$…À…ôÝÿÿé?ëÿÿv‹C(‹‰T$8‹@‰D$4‹uPºV‹D$Dè‹ÿÿ„À„¢Z‹T$8|Rýþ‹…Œ ‹L$8‰H‹L$4‰H ‹J‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9Btÿ…$ ‰B‹A(‹X…Û…UF‹‰„$éFÝÿÿ‹C(‹0v†‹M\™‹K,ÇD$Ç$‰ò‹D$Dè¬ÿÿ„À„+Z‹C(@‰C(‹½$ ‹”$9{0„iK‹J(‹y9ø‚»G„´1ÿ‹A9C(‚ Y‹Œ$ƒÂ„$ø‰$‰èè¡@ÿÿ„À•Á‰ú„Ò…4>„É…,>ÿK(éæéÿÿ‹¼$…ÿ…v@‹‰„$éyÜÿÿ‹„$‰D$‰,$‹\$hÿS‹”$:B/„?LöB- „šéÿÿŒ$„$‰$‹T$d‹D$Dè°ÿÿ„À„¼Y‹œ$…Û…Üÿÿé`éÿÿ‹C,‹”$f…ÀˆqK‹s$‹|$p)×9þ~ öÄ „7éÿÿ‹„$ …ÀˆO‹[(ëfv‹„$ö@- „EPÇD$ ”$‰T$”$ ‰T$‰$Œ$‹T$d‹D$Dè„ÿÿ„À„þO€¼$„àO‹„$ 9ÆŽN‹„$9D$p~ˆ‰D$‹D$|‰$ÿT$t‹”$ ;“…iÿÿÿB‰„$ ÿ„$빋s,‹¼$‰|$Šÿÿ‰Å딄$ø‰$‹Œ$‰Ú‰èèŒ9ÿÿ„À…\C‹„$‹@‰„$é‚Õÿÿ‹¼$‹D$D‹0ºTè+wÿÿ„À„ú8‹†Œ ‰x‰Ç@Š–: ˆP‰X ‹C(‹P 9–Ä r!‹H9ŽÀ r‹X9ž¼ r ‹x9¾È sƆ: €½: „:Æ…: éFâÿÿ‹„$9D$XŒI<öA- „+âÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèõxÿÿ„À„+S‹„$…À…žÔÿÿééáÿÿ‹„$9E`„ÂE€½; t!€¼$‰u€½5 „F:9D$X…®áÿÿ‰Eh»éÔÿÿ‹„$9D$p…AöA- „…áÿÿŒ$ÇD$„$‰$‹T$d‹D$DèOxÿÿ„À„ÇQ‹„$…À…øÓÿÿéCáÿÿv‹„$…À… =‹‰„$éÓÓÿÿ‹„$‰D$‰,$‹t$hÿV$„À‹„$„ã7‹‰„$é¡Óÿÿ‹C(‹0‹}\Ç$‹Œ$‰ò‹\$D‹è‚Qÿÿ„À…Æàÿÿ‹„$‹P(‹J‰L$8‹Œ$‹X‰\$4ƒ|$8…J1Û;Z‚€G‰|$4‹|$Dë&v…Û„dGK‹„$‹P(‹Œ$9Z‡PG‹@ ¯ÃÁÇ$‰ò‹èýPÿÿ„ÀuÁ‹|$4ºX‹D$Dè£tÿÿ„À„-Pv†‡‹•Œ ‹Œ$‰ ‰r‹p,‰r‹p(‰r ‹”$‰P,‰X(¯Y Ú‰”$‹‰„$éŒÒÿÿ‹C(‹D@ý‹UP‹p…öˆÂßÿÿ‹x4÷‹UL‹„$öC- u)‹F+9ÂŒßÿÿ‹„$ …ÀˆH9F~y‹\$p;œ$¨#‹„$ö@- „ IÇD$ ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$Dènzÿÿ„À„mH€¼$„OH‹„$ 9F‡Ç„$ ÿÿÿÿ‹„$‹‰„$é Ñÿÿ‹C(‹D@ý‹uPÆ‹p…öˆÖÞÿÿ‹H4ñ‹”$‹EHöC- u)‹F+9ÂŒ±Þÿÿ‹„$ …ÀˆêF;~x‹\$X;œ$Œ]"‹„$ö@- „IÇD$ ÿÿÿÿ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$Dèƒyÿÿ„À„H€¼$„ãG‹„$ ;ˆÇ„$ ÿÿÿÿ‹„$‹‰„$é¶Ðÿÿ‹„$9D$XŒÞ<öA- „ëÝÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèµtÿÿ„À„#N‹¼$…ÿ…^Ðÿÿé©Ýÿÿ‹„$9D$pý7öA- „ÝÿÿŒ$ÇD$„$‰$‹T$d‹D$DèWtÿÿ„À„—N‹´$…ö…ÐÿÿéKÝÿÿv‹C(‹‰T$8‹@‰D$4‹uPº]‹D$Dè—qÿÿ„À„L‹T$8|Rýþ‹…Œ ‹L$8‰H‹L$4‰H ‹ ‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9tÿ…$ ‰‹A(‹@…À…(;‹‰„$éUÏÿÿ‹C,‹”$f…ÀˆŽ@‹s$‹|$p)×9þ~ öÄ „|Üÿÿ‹„$ …Àˆ›B‹[(9Æ~x‹”$9T$p‹„$ö@- „®BÇD$ Œ$‰L$”$ ‰T$‰$Œ$‹T$d‹D$DèKwÿÿ„À„åB€¼$„ÇB‹„$ 9ƈ‹œ$Ç„$ ÿÿÿÿ‹‰„$é~Îÿÿ‹C(‹0v†‹}\Ÿ‹K,ÇD$Ç$‰ò‹D$DèäŽÿÿ„À„ÉJ‹C(@‰C(‹•$ 9S0„p=‹”$‹R(‹J9È‚Ñ?A„Ê?ÆD$4‹B9C(r#‹Œ$Ç$‰ò‹|$D‹èòKÿÿ„À„1É€|$4…"0„É…0ÿK(éÛÿÿ‹…ä ‹XºY‹D$Dèroÿÿ„À„»J‹…Œ ‰‹•$ ‰P…Û„Ž-‰œ$‹D$Dèewÿÿ„À„½I‹D$D‹‰D$L‰Ã‹‹@$‰D$4…À„i-‹³œ …ö„ËF‹~‰|$<…ÿ„ÒF‹D$4…ÀŽ@1Û1ö‰l$8‹l$L‹|$<ëFƒÃ4;t$4„ø?‹M\Ù‹WÚ‹D$Dè׫ÿÿ„ÀuÛ»÷ÿÿÿé¿Ìÿÿ‹„$9D$XŒý:öA- „&ÚÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèðpÿÿ„À„:K‹¼$…ÿ…™ÌÿÿéäÙÿÿ‹„$9D$pñ8öA- „ÉÙÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè“pÿÿ„À„iK‹”$…Ò…<Ìÿÿé‡Ùÿÿv‹„$9D$p8öA- „iÙÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè3pÿÿ„À„ÝI‹„$…À…ÜËÿÿé'Ùÿÿv‹„$‰Eh‹C(‹‹p‰´$”‹p‹D$D‹‰„$œ‹xh‰¼$˜‰ù+HH‹„$”…À„u/ƒ¼$”†=º«ªªª‹„$”÷âÑê9Ê·Øÿÿ‹¼$œ‹¿¨ ‰|$\‹¼$œ‹@‰|$l‹¼$œ‹‡¤ ‹@8‰„$€‹<‰¼$ ƒÿ„(@ƒÿ„@O…^ØÿÿÇ„$¨tqÇD$Ldq‰t$H‹D$Dè.ÿÿƒÆ‰´$„‹„$ ¯Æè±Sÿÿ‰Æ…À„óI‹¼$œ‹‹@8‹@ ‹˜‰„$¤…À„ÒI‹T$H9”$”‹œ$˜)Ó‰\$Pœ$܉¬$¬f‹¼$˜9|$Pi0‹l$H…íŽd0‹¼$˜ÇD$<O‰|$‹l$l‰,$ÿT$\‰\$‰$ÿ”$€‰D$4D$<…À~7‹”$„+T$<1í‰|$8‰÷‰Ö‹«‰D$.‰D$‰<$ÿT$LE;l$4uä‰þ‹|$8;|$Pt ‹T$H9T$<|‹l$<9¬$” ‹T$H9ÕŽž*‹D$<;D$H~‹D$HG‰|$PH‰D$H‹l$H9¬$”Ž!ÿÿÿ‹¬$¬‰4$ÿƒq‹D$Dè¤ÿÿéÏÖÿÿ‹„$‰Eh‹S(1É‹D$Dè²ÿÿƒøŒF„¨Öÿÿ‹Eh‰„$‹„$‹‰„$é9Éÿÿ‹„$9D$p¢6öA- „nÖÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè8mÿÿ„À„ØF‹„$…À…áÈÿÿé,Öÿÿ‹„$‰Eh‹C(‹‹p‰´$€‹p‹D$D‹‰„$”‹xh‰¼$„‹HL)ù‹„$€…À„%,ƒ¼$€†:º«ªªª‹„$€÷âÑê9Ê¿Õÿÿ‹¼$”‹¿¨ ‰|$P‹¼$”‹@‰|$\‹¼$”‹‡¤ ‹@8‰D$l‹<‰¼$˜ƒÿ„æ<ƒÿ„Ð<O…iÕÿÿÇD$‰´$9D$H‡B‹S‹t$<‰V,‹S ‰V(‹•„ ‹Š I‰Š …Éu‹’ …Òt‰•„ 9D$H‚¢Ïÿÿ‹„$‹‰„$é=Âÿÿ‹3‰ò‹D$Dè'¢ÿÿ…ötN‰èèÐïþÿ‹C‰…$ ‹E‹@$‰D$4ƒøt/‹½œ ~1Û1ö‹OÙ‹U\Ú1ÀèÇ ÿÿFƒÃ4;t$4u勉…œ ‹…„ ‹ J‰ …Ò…Ïÿÿ‹€ …À„Ïÿÿ‰…„ éùÎÿÿ‹‰„$‹S R ŠÁá‹u\ñ‰L$4‹y,‰¼$‹q(‰t$<‹p ‰t$8‹t$<¯t$8þ‹@(‹@‰D$LÇD$Ç$‰ñ‹D$Dè×ÿÿ„À„ 9‹”$‹B(‹L$<9H„d‹L$L¯L$8ù‰L$<‹zŠO/ˆL$H‹‰D$LöG- „O‹|$8÷߉|$H‰÷+|$8´$ø‰l$\‰\$P‰óë9|$<„¢‹”$|$H‰þ‰$‰ù‹D$\èŸ$ÿÿ„Àt×Ç$‰ù‹T$L‹l$D‹Eèš>ÿÿ„Àuº‹l$\‹\$P‰ò+”$ˆl6‹¼$‰|$8‹G(;P‡Í<‹K‹|$4‰O,‹[ ‰_(‹„ ‹» O‰» …ÿu‹› …Ût ‰„ ‹\$8‹C(;P‚mÍÿÿ‹L$8‹‰„$‰´$éÀÿÿ‹MP‹CH@Ñ€{t‹s tvý ñ‹q…ötN‰q@Áà‹t$TFL€x‹t 9Btÿ$ ‹‰B‹C‰B‹…„ ‹ J‰ …Ò…æÌÿÿ‹€ …À„ØÌÿÿ‰…„ éÍÌÿÿ‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹N‰L$4‹öA-@„ ‹CH‰D$<ÇD$Lÿÿÿÿº‰Ø‰L$,è-îþÿ„À‹L$,„Y ‹D$<9D$4„K ÿF‹“À B‰“À ‹ƒÈ @‰D$<‰ƒÈ ‹GƒÌ ÿƒÔ ‹GƒØ ŠFˆƒ: ‹F ‹@(‹x 9»Ä r;Pr‹P9“¼ r ‹|$<;xs vƃ: ‹D$L¯FD$4‰„$‰Œ$€½: „! Æ…: éÂËÿÿf‹K‹SÇD$Ç$‹D$Dèæ~ÿÿ„À„ 6‹…„ ‹ J‰ …Ò…Ëÿÿ‹€ …À„qËÿÿ‰…„ éfËÿÿf‹K4I ±‹u\ Ž‹s ‰q(‹s‰q,‹[‰Y0‰‚ …À…5Ëÿÿ‹‚ …À„'Ëÿÿ‰…„ éËÿÿ‰èèÿÿ‹…„ ‹ J‰ …Ò…úÊÿÿ‹€ …À„ìÊÿÿ‰…„ éáÊÿÿ‹ ‰Œ$‹K‰Œ$‰‚ …À…o½ÿÿ‹‚ …À„a½ÿÿ‰…„ éV½ÿÿf‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹F‰„$´‹‰”$°¾F‰„$ÔöB-@„¿ Ç„$Àÿÿÿÿ‹SH‰”$¸…Àx'ÿŒƒ¼ ÿ‹È T‡‹ )‹Ì ÿ‹Ô ‹)“Ø €¼$Š„Ñ‹S`9”$´•ˆ”$Øë v”$°‰Øèž;ÿÿ„À‹„$Ô…ÿ @‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$éŸÉÿÿv‰èèñéþÿŠCˆ…: ‹‰…$ ‹…„ ‹ J‰ …Ò…iÉÿÿ‹€ …À„[Éÿÿ‰…„ éPÉÿÿ‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹V‰T$4‰”$´‹‰„$°¾F‰„$Ô¾V ‰”$ÀÿŒƒ¼ ÿ‹È T‡‹ )‹Ì ÿ‹Ô ‹)“Ø €¼$Š„)‹T$4;S`•ˆ”$Øëf”$°‰Øèö9ÿÿ„À‹„$Ô…o @‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$écÈÿÿv€¼$Š„Ì2‹Md‰Œ$€½5 „Ë‹D$X9È„˜2‹T$@ŠB.‰|$8‹F‰„$¼¾F‰D$P‰„$ľF‰„$ȾF‰„$Ô¾N‰Œ$ÀÿŒƒ¼ ÿ‹È ‹T$4|‚‹)“Ì ÿ‹Ô ‹?)»Ø €¼$Š„S‹|$L;{`•D$HŠT$HˆT$<ŠT$Hˆ”$Ø…ÉŽ ‹T$P…Ò• T$<ˆ”$Øëf”$°‰Øè:6ÿÿ„À‹„$Ô…S@‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$ ÿÿÿÿésÃÿÿ¾V9T$4•ÂéOýÿÿv‹D$DèGýþÿÿ¤‚q‰Ã‹D$Dèýþÿ„Û„UÃÿÿ»öÿÿÿé²µÿÿ‹„$ö@- „ü+Œ$ÇD$ÿÿÿÿ”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dè{\ÿÿ„À„¦+€¼$„²+‹„$…ÀŽÅ‹”$ é*Óÿÿf‹„$ö@- „6-Œ$ÇD$”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dèó[ÿÿ„À„-€¼$„þ,‹„$9Æÿ„$‹”$ é_Úÿÿv‹F)ƒÀ )ƒÈ ‹W¯Ð)“Ì )ƒÔ ¯G)ƒØ ŠFˆƒ: ‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$€½: …ßõÿÿ‹„$…À„žÁÿÿ‹‰„$é@´ÿÿ‹\$8‹C‹t$<‰F,‹C ‰F(‹…„ ‹ J‰ …Ò…aÁÿÿ‹€ …À„SÁÿÿ‰…„ éHÁÿÿ²é5÷ÿÿ‹T$8ŠB.ƒè -ÿÿ„Àu¹‹\$Pé£îÿÿ‹l$\‹\$P‹C‹t$4‰F,‹C ‰F(‹…„ ‹ J‰ …Ò…I¼ÿÿ‹€ …À„;¼ÿÿ‰…„ é0¼ÿÿH‰D$‹\$|‰$ÿT$t‰Ã‹„$H‰D$‹|$|‰<$ÿT$t‰\$‰D$‹\$h‰$è×ÿÿ„À„^Ýÿÿ‹„$ H‰„$ ÿŒ$é.Ýÿÿ‰D$‹\$|‰$ÿT$t‰Ã‹„$‰D$‹|$|‰<$ÿT$t‰\$‰D$‹\$h‰$èyÿÿ„À„Üÿÿ‹„$ @‰„$ ÿ„$éäÛÿÿf‰„$‰”$é%ÉÿÿH‰D$‰$ÿT$t‰D$4‹„$ H‰D$‰$ÿT$t9D$4…Öÿÿ‹„$ H‰„$ ÿŒ$‹éÒÕÿÿf‹C‹t$4‰F,‹C ‰F(‹…„ ‹ J‰ …Ò…åºÿÿ‹€ …À„׺ÿÿ‰…„ é̺ÿÿ¾N9L$P• T$<ˆ”$Øéúöÿÿ‰Ñ+L$X‰L$Héâéÿÿ¶Àÿ$…ÈHq‹T$8‹B$‹T$XÂ9T$4}‰T$4;t$4Žéøÿÿ‹L$4)Á‰L$L‰\$\Nÿ‹\$L‰$‹T$8‹D$Dè0Kÿÿ‰Ã…ÀxP€.„9Æu ëfN9ót‰ñ‰ú‰èèÄ ÿÿ„Àuì9óu&Ç$‰ñ‹T$P‹\$D‹è¼*ÿÿ„À„Ö;t$4“‹\$\éeøÿÿ‹T$8‹B$‹T$XÂ9T$4}‰T$4;t$4ŽDøÿÿ‹L$4)Á‰L$L‰\$\Nÿ‹\$L‰$‹T$8‹D$Dè“Dÿÿ‰Ã…Àx«€.„Ú9ÆuëN9ót‰ñ‰ú‰èè ÿÿ„Àuì9óu‚Ç$‰ñ‹T$P‹\$D‹è*ÿÿ„À„2;t$4”éWÿÿÿ‹T$8‹B$‹T$p)Â9T$4~‰T$4;t$4¤÷ÿÿ‹L$4‰D$L‰\$\N‹\$L‰$‹T$8‹D$DèJ;ÿÿ‰Ã…Àˆÿÿÿ€.u陉ñ‰ú‰èè… ÿÿ„À„Ó F9óuèÇ$‰ñ‹T$P‹\$D‹èx)ÿÿ„À„’;t$4|•é·þÿÿ‹D$X9D$4~‰D$4;t$4Ž ÷ÿÿ‰\$L‹\$8‹K(‹S$„$‰D$‹\$4‰\$Fÿ‰$‹\$D‹è'ÿÿ‰Ã…ÀxK€.uéŽf‰ñ‰ú‰èèå ÿÿ„À„Q N9óuèÇ$‰ñ‹T$P‹\$D‹èØ(ÿÿ„À„¡;t$4‹\$Léöÿÿ‹D$p9D$4~‰D$4;t$4iöÿÿ‰\$L‹\$8‹K(‹S$„$‰D$‹\$4‰\$F‰$‹\$D‹èw%ÿÿ‰Ã…Àx§€.„ù9ÆuëF9ót‰ñ‰ú‰èè8 ÿÿ„Àuì9ó…zÿÿÿÇ$‰ñ‹T$P‹\$D‹è,(ÿÿ„À„õ;t$4ŒuÿÿÿéKÿÿÿ‹T$8‹B$‹T$p)Â9T$4~‰T$4;t$4´õÿÿD$4‰D$L‰\$\N‹\$L‰$‹T$8‹D$Dèý4ÿÿ‰Ã…Àˆýÿÿ€.ué9‰ñ‰ú‰èè™ ÿÿ„À„õ F9óuèÇ$‰ñ‹T$P‹\$D‹èŒ'ÿÿ„À„¦;t$4|–éËüÿÿ‹T$8‹B(‹‰D$L‹L$49L$X| ‹D$X@‰D$49t$4õÿÿ¶T$\‰T$8‰|$l‰\$\‹\$|ë ;t$4„€üÿÿ‰ñ‹T$l‰èè ÿÿ„À„küÿÿNFÿ‰D$‰$ÿT$t;D$L”À¶À;D$8uÂÇ$‰ñ‹T$P‹|$D‹èâ&ÿÿ„Àu¦‹\$\éæÿÿ‹T$8‹B(‹‹L$49L$X| ‹T$XB‰T$49t$4oôÿÿ‰l$L‹l$h‰|$8‰Ç‰\$lë v;t$4„À ‰ñ‹T$8‹D$Lèg ÿÿ„À„© NFÿ‰D$‹\$|‰$ÿT$t‰|$‰D$‰,$è„ÿÿ:D$\u¶Ç$‰ñ‹T$P‹\$D‹è6&ÿÿ„Àuš‹l$L‹\$lénåÿÿ‹T$8‹B(‹‹L$49L$p ‹T$pJ‰T$49t$4Ž¿óÿÿ‰l$L‹l$h‰|$8‰Ç‰\$lë v;t$4„ ‰ñ‹T$8‹D$Lè·ÿÿ„À„ù F‰t$‹\$|‰$ÿT$t‰|$‰D$‰,$è×ÿþÿ:D$\u¹Ç$‰ñ‹T$P‹\$D‹è‰%ÿÿ„ÀuéNÿÿÿ‹L$8‹A(‹‰D$L‹D$49D$p ‹T$pJ‰T$49t$4Žóÿÿ¶L$\‰L$8‰|$l‰\$\‹\$|ë v;t$4„„úÿÿ‰ñ‹T$l‰èè ÿÿ„À„oúÿÿF‰t$‰$ÿT$t;D$L”À¶À;D$8uÅÇ$‰ñ‹T$P‹|$D‹èé$ÿÿ„Àu©éþÿÿ‹„$H‰D$‹t$|‰4$ÿT$t‰|$‰$ÿT$4‰Æ‰„$‹”$ éÄÿÿÿŒ$é/ñÿÿ1Ûé`¦ÿÿ‰D$‹\$|‰$ÿT$t”$܉T$‰$ÿT$4‰Ãéò¾ÿÿ@‰„$B‰”$霿ÿÿ‹„$ H‰D$‹L$|‰ $ÿT$t”$܉T$‰$ÿT$4‰Ç‰„$éÀÿÿ¶Àÿ$…ÈIq‹O$‰L$8‹D$Xȉñ9Æ}‰Á9L$<ŒÑöÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë*‹t$8ÆÇ$‰ñ‹T$L‹èÊ#ÿÿ„À„† N9Ï|+L$8‰<$‰ê‰Øè×0ÿÿ…ÀyËl$H‹\$<éröÿÿ‹W$‰T$8‹D$XЉñ9Æ}‰Á9L$<ŒSöÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë,v‹t$8ÆÇ$‰ñ‹T$L‹èJ#ÿÿ„À„ N9Ï|”+L$8‰<$‰ê‰Øè·4ÿÿ…ÀyÃé{ÿÿÿ‹G$‰D$8‹D$p+D$89Æ~‰Æ9t$<Ûõÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë.v‰Æ+t$8Ç$‰ñ‹T$L‹èÒ"ÿÿ„À„Ž N9÷ÿÿÿ‹L$8ñ‰<$‰ê‰Øèã<ÿÿ…Ày¿éÿþÿÿ‹D$h‹@8‰D$H‹G$…À„\!1ÒÇD$8„$܉l$P‰t$\1í‰Ö‰\$l‰Ã‰\$‹G(‹°‰$ÿT$HÅF9w$wç‹t$\‰l$8‹l$P‹\$l‹D$8D$X9ð}‰ð9D$<Œõÿÿ‰l$H‹l$<‰\$<‹\$Dë.‹t$8ÆÇ$‰ñ‹T$L‹èþ!ÿÿ„À„º F9ÅŒDþÿÿ‹O(‹W$´$‰t$‰l$+D$8‰$‹èÈÿÿ…Ày¬éþÿÿ‹T$h‹R8‰T$H‹G$…À„f 1ÒÇD$8„$܉l$P‰t$\1í‰Ö‰\$l‰Ãf‰\$‹G(‹°‰$ÿT$HÅF9w$wç‹t$\‰l$8‹l$P‹\$l‹D$8‹L$p)Á‰È9ñ~‰ð9D$<ôÿÿ‰l$H‹l$<‰\$<‹\$Dë.‰Æ+t$8Ç$‰ñ‹T$L‹è!ÿÿ„À„ÎFÿ9ÅXýÿÿ‹O(‹W$´$‰t$‰l$D$8‰$‹è@ÿÿ…Ày¬é,ýÿÿ‹G$‰D$8‹D$p+D$89Æ~‰Æ9t$<Œóÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë+‰Æ+t$8Ç$‰ñ‹T$L‹è† ÿÿ„À„BN9÷Îüÿÿ‹L$8ñ‰<$‰ê‰Øè@ÿÿ…Ày¿é³üÿÿ‹G(‹‰D$8¶|$H‰|$H‰ð‹t$|‰\$Pë ;|$<„ž‰øx‰D$‰4$ÿT$t;D$8”À¶À;D$HuÖÇ$‰ù‹T$L‹\$D‹èúÿÿ„Àuº‹\$P‰þé]áÿÿv‹G(‹‰D$8‰ð‹t$|‰\$Pë ;|$<„5‰øx‰D$‰4$ÿT$t‹\$8‰\$‰D$‹\$h‰$èÑùþÿ:D$HuÈÇ$‰ù‹T$L‹\$D‹èƒÿÿ„Àu¬ë‡‹G(‹8‰\$8ë ;t$<„—N‰t$‹\$|‰$ÿT$t‰|$‰D$‹\$h‰$èsùþÿ:D$HuÌÇ$‰ñ‹T$L‹\$D‹è%ÿÿ„Àu°‹\$8éŠàÿÿ‹G(‹8¶D$H‰D$8‰\$Hë ;t$<„áN‰t$‹\$|‰$ÿT$t9ø”À¶À;D$8uØÇ$‰ñ‹T$L‹\$D‹èÄÿÿ„Àu¼‹\$Hé)àÿÿv1Ûéw ÿÿ1Ûép ÿÿ‹|$P‰Ó鳟ÿÿ‹U‰,$‰D$0ÿR‹D$0éÊÿÿ‹U‰,$‰D$0ÿR‹D$0é%±ÿÿ‹l$H){h‹D$Dè{çþÿ‹Eh‰„$‹„$‹‰„$é< ÿÿ‹l$H{h‹D$DèLçþÿ‹Eh‰„$‹„$‹‰„$é  ÿÿ»ðÿÿÿéÑŸÿÿ‹„$‹‰„$‰èè8ÿÿéçŸÿÿ1Û鮟ÿÿ1Ûé§Ÿÿÿ‹l$4‹\$TŠ›…ˆœ$‹é¿ŸÿÿH‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰ÃéÉïÿÿ‹„$˜‰D$‰t$Ç$‰ù‹”$œ‹„$”èGWÿÿƒø„Ÿ…À„bØÿÿ‹¬$ ‰<$‰D$0ÿƒq‹D$Dè]æþÿ‹T$0…Ò‰“‰Óéøžÿÿf‹„$„)ЉD$‰4$ÿ”$¨‹¬$ ‰l$‹l$<‰l$Ç$‰Á‹”$¤‹„$œè¾Vÿÿƒø„}…À…gG‰|$P‹|$ÿÿ„À„b‹…Œ ‰p‹”$‰P‹…$ ‰C0‰S,‹„$ø‰„$‹„$ü‰„$éÊœÿÿ‹l$L‹\$léèÿÿ‹T$@‹…À„oŒ$ø‰ $‹Œ$‰Øèƒÿÿ„À…ONŠƒ5 „À„ü ;sH[šÿÿ1Ûé>œÿÿ1ÒéòÓÿÿ»ðÿÿÿé-œÿÿö@- „¥©ÿÿŒ$„$‰$‹T$d‹D$Dè»Aÿÿ„À„ù‹„$…À… œÿÿék©ÿÿv1Òé¢ÐÿÿöC- „W©ÿÿŒ$„$‰$‹T$d‹D$DèmAÿÿ„À„=‹´$…ö…Ò›ÿÿé©ÿÿö@- „©ÿÿŒ$„$‰$‹T$d‹D$Dè(Aÿÿ„À„‹„$…À…›ÿÿ騍ÿÿöC- „ΨÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè˜?ÿÿ„À„Ћ„$…À…A›ÿÿ錨ÿÿöC- „‚¨ÿÿŒ$ÇD$„$‰$‹T$d‹D$DèL?ÿÿ„À„n‹„$…À…õšÿÿé@¨ÿÿ‹„$‹‰„$éÛšÿÿO„ï‹U‹J…Ét‹‰•” ‹‰„$é´šÿÿ„À„ü§ÿÿ‹„$‰„$‹„$‰„$鋚ÿÿ1Ò騷ÿÿ1Òé•¿ÿÿ‹‰„$éošÿÿ‹‰„$éašÿÿ„À„©§ÿÿ‹„$ø‰„$‹„$ü‰„$é8šÿÿ‹l$H‹\$<é¡Ùÿÿ‹\$Léo×ÿÿ9D$p…h§ÿÿéµÅÿÿv‹¬$„1öéíÒÿÿ‹¼$˜ÇD$<éÐÿÿ‹‰”$ Ç„$Ç„$1À1ö1Ûé,²ÿÿ‰Ú‰œ$ Ç„$1À1öéh·ÿÿ‹V‰”$ Ç„$Ç„$1À1ÿ1Ûé̳ÿÿÇ„$ Ç„$1À1Ò1öéá¾ÿÿ‹„$ø‰„$‹„$ü‰„$é:™ÿÿ‹„$‰„$‹„$‰„$é™ÿÿ1Ûéà˜ÿÿƒÂ„$‰$‹Œ$‰èèãüþÿ„À•Àé`«ÿÿ‰D$‹\$|‰$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…5°ÿÿ‹A „$‹‰„$霘ÿÿH‰D$‹t$|‰4$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…}Ãÿÿ‹A „$‹‰„$éJ˜ÿÿ‹•¤ ‹Z ‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À… ÿ„$‹„$‹‰„$é ˜ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~B1Év‹4Š9ów19÷r-°‹Œ$8A/…l¹ÿÿ‹A „$‹‰„$é—ÿÿvA9ÁuÃ1Àë̉D$‹t$|‰4$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~A1Éf‹4Š9ów19÷r-°‹Œ$8A/…ˆ¸ÿÿ‹A „$‹‰„$é —ÿÿvA9ÁuÃ1ÀëÌ‹B‰B‹L$4‹T$8‹D$Dè¼Vÿÿ„À„n‹Œ$逹ÿÿH‰D$‹\$|‰$ÿT$tƒø „ú‹„$ö@- „ú£ÿÿŒ$„$‰$‹T$d‹D$Dè<ÿÿ„À„‹„$…À…u–ÿÿéÀ£ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‰Á‹‹D$hèÊÝþÿ‹Œ$:A/…O¤ÿÿ‹A „$‹‰„$é"–ÿÿ‹S(‹‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è.îþÿ‹Œ$:A/…ó¼ÿÿ‹A „$‹‰„$éÒ•ÿÿH‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…ê¢ÿÿ‹A „$‹‰„$錕ÿÿH‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hèôþÿ‹Œ$:A/…©ÿÿ‹A „$‹‰„$éB•ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‰Á‹‹D$hè›Üþÿ‹Œ$:A/…€£ÿÿ‹A „$‹‰„$éó”ÿÿ‹•¤ ‹Z H‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…¬ ÿŒ$‹„$‹‰„$é±”ÿÿ‹S(‹H‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è¼ìþÿ‹Œ$:A/…á»ÿÿ‹A „$‹‰„$é`”ÿÿƒÂ„$ø‰$‹Œ$‰èè1øþÿ„À•Àé ±ÿÿ‹B‰B‹L$4‹T$8‹D$DèøSÿÿ„À„‹Œ$é­Äÿÿ‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè‡ïþÿ‹Œ$:A/…¼Çÿÿ‹A „$‹‰„$éÇ“ÿÿH‰D$‹t$|‰4$ÿT$tƒø „½ÿŒ$‹„$‹‰„$é’“ÿÿ‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèòþÿ‹Œ$:A/…ÞÆÿÿ‹A „$‹‰„$éI“ÿÿ‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…#´ÿÿ‹A „$‹‰„$é“ÿÿH‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèzîþÿ‹Œ$:A/…3¦ÿÿ‹A „$‹‰„$麒ÿÿ‰D$‹\$|‰$ÿT$tƒø „¥ ÿ„$‹„$‹‰„$醒ÿÿ‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚:9Ø–À:A/…,Éÿÿ‹A „$‹‰„$é<’ÿÿº ‹D$Dèî3ÿÿ„À„‹…Œ ‹”$‹R‰‹…Œ ‹”$‰P‹„$ø‰„$‹„$ü‰„$éã‘ÿÿH‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚©9Ø–À:A/…ÐÄÿÿ‹A „$‹‰„$阑ÿÿ‹‰„$銑ÿÿ‹K,;Œ$…‡´ÿÿ1ÿ骴ÿÿ‹œ$öC- „Z‰l$4‰Ú…ÀŽÔ œ$¼$ ¬$ë‹”$ÇD$ÿÿÿÿŒ$‰L$‰t$ ‰l$‰|$‰$‰Ù‹T$d‹D$Dèð7ÿÿ„À„r €¼$„ ‹„$…À§ÿŒ$‹”$étÿÿÿ‹‰„$éÂÿÿ‹Œ$9K,…€ÂÿÿÆD$4é¦Âÿÿ‹‰„$éšÿÿ‹‰„$éŒÿÿ9•( …ƒ´ÿÿ‹Œ$ …ɉt´ÿÿ‹…, ‰„$Ç„$ ÿÿÿÿ‹‰„$éKÿÿ9½( …0µÿÿ‹„$ …À‰!µÿÿ‹…, ‰„$‹‰„$éÿÿ‹‰„$éÿÿ9( …¯ÿÿ‹”$ …Ò‰¯ÿÿ‹…, ‰„$Ç„$ ÿÿÿÿ‹‰„$éÆÿÿ‹C‰„$é·ÿÿ‹‰„$é©ÿÿ‹‰„$é›ÿÿ‹‰„$éÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè§3ÿÿ„À„© ‹„$…À…Pÿÿ雜ÿÿ‹‰„$é=ÿÿ;sLŽÿÿ1ÛéûŽÿÿ9( …a­ÿÿ‹´$ …ö‰R­ÿÿ‹…, ‰„$éé­ÿÿv9½( …¬ÿÿ‹„$ …À‰ ¬ÿÿ‹…, ‰„$‹‰„$éÆŽÿÿ€½8 … œÿÿé,ºÿÿ9•( …f¿ÿÿ‹¼$ …ÿ‰W¿ÿÿ‹…, ‰„$éð¿ÿÿv;sLŽ_Œÿÿ1ÛéBŽÿÿº龫ÿÿºééÅÿÿºéçÂÿÿºéd³ÿÿÇ$‹Œ$‰ò‹|$D‹è5 ÿÿ„À„ñ‹„$‹P(ÆD$4éÀÿÿ‹\$HéèÞÿÿ‰ÆéyâÿÿÇ„$ ÿÿÿÿ…ÀB›ÿÿ‹Œ$…É3›ÿÿ‹„$‹‰„$éÎÿÿf‹\$8éŸÞÿÿ‰è‹¬$ ‹œ$”‰Ch‰<$ÿƒq‹D$Dè¾Ôþÿ‹Eh‰„$‹„$‹‰„$éÿÿ‰ÆéØãÿÿ‰Æé…âÿÿ‰Æé>áÿÿ‰Æé#ãÿÿ‰ÆéŒàÿÿ‹¬$¬‹œ$œ‰{h‰4$ÿƒq‹D$DèYÔþÿ‹Eh‰„$‹„$‹‰„$éÿÿ‹l$8‹|$<‹\$L‰»œ éíÿÿ‹„$9D$pŽBšÿÿ@‰„$Ç„$‹Œ$‹”$ 1À1öéN²ÿÿ‹œ$éXüÿÿÇ„$ 1ÀéÒ°ÿÿ‹œ$é¿üÿÿ‰”$ ‰ÐéÉ«ÿÿ‰”$ ‰ÐéæªÿÿÇ„$ 1ÀéS½ÿÿÇ„$ ÿÿÿÿé°™ÿÿ»ðÿÿÿé$ŒÿÿÇ„$ ÿÿÿÿé–™ÿÿÇ„$ ÿÿÿÿ醙ÿÿÇ„$ ÿÿÿÿév™ÿÿ»ðÿÿÿéê‹ÿÿÇ„$ ÿÿÿÿé\™ÿÿÇ„$ ÿÿÿÿéL™ÿÿ»ðÿÿÿéÀ‹ÿÿÇ„$ ÿÿÿÿé2™ÿÿÇ„$ ÿÿÿÿé"™ÿÿ»ðÿÿÿé–‹ÿÿ‹Œ$ÇD$Ç$‰ò‹D$Dè;Lÿÿ„À…ï˜ÿÿ»÷ÿÿÿéc‹ÿÿÇ„$ ÿÿÿÿéÔ˜ÿÿ»ðÿÿÿéH‹ÿÿÇ„$ ÿÿÿÿ麘ÿÿÇ„$ ÿÿÿÿ骘ÿÿ»ðÿÿÿé‹ÿÿÇD$<¼qé2ÃÿÿÇD$<qé%Ãÿÿ‹‰„$ éÅÿÿ1ÀéÄøÿÿ‹Œ$éòŸÿÿ1ÀéUùÿÿÇ„$¨ÌqÇD$L¼qéû¿ÿÿÇ„$¨¤qÇD$Lqéã¿ÿÿºS‹D$Dè,ÿÿ„À„¦‹…Œ ‰p‹”$‰P‹…$ ‰C0‰S,‹„$‰„$‹„$‰„$鈊ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éhŠÿÿ‹F‰„$ é¹ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$é9ŠÿÿÇ„$ ÿÿÿÿéy—ÿÿ‹‰„$ éÝ·ÿÿ‹Œ$éȹÿÿ÷ÚéÉÿÿÇ„$ ÿÿÿÿ…ÀE—ÿÿéûÿÿ‹F‰„$ éé±ÿÿ»ðÿÿÿ饉ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé÷–ÿÿ»ðÿÿÿék‰ÿÿÇ„$ ÿÿÿÿéÝ–ÿÿÇ„$ ÿÿÿÿéÍ–ÿÿÇ„$ ÿÿÿÿé½–ÿÿ»ðÿÿÿé1‰ÿÿ‹D$DèzÐþÿ»þÿÿÿé‰ÿÿ»ðÿÿÿé‰ÿÿÇ„$ ÿÿÿÿ醖ÿÿ‹D$8‰$‰Ú‰èèÒlÿÿ‰Ã‹„$‹P(‹Œ$éĵÿÿÇ„$ ÿÿÿÿéN–ÿÿÇ„$ ÿÿÿÿé>–ÿÿ»ðÿÿÿ鲈ÿÿÇ„$ ÿÿÿÿ9ðŒ!–ÿÿ驸ÿÿ»÷ÿÿÿéˆÿÿ‰$‰ú‰èèblÿÿ‰Ç‹œ$‹C(9x†Ø¤ÿÿÇD$Ç$‹Œ$‰ò‹D$DèIÿÿ„À…È•ÿÿ»÷ÿÿÿé<ˆÿÿf‹l$H‹D$DèÏþÿ骕ÿÿ‹D$DèqÏþÿ»þÿÿÿéˆÿÿ1Ûéˆÿÿ»÷ÿÿÿéˆÿÿ1Ûéý‡ÿÿ»÷ÿÿÿéó‡ÿÿÇ„$ ÿÿÿÿée•ÿÿÇ„$ ÿÿÿÿéU•ÿÿ‹l$H‹D$DèÏþÿéC•ÿÿÇ„$ ÿÿÿÿé3•ÿÿ»ðÿÿÿ駇ÿÿº\‹D$Dè‹)ÿÿ„À„ù‹…Œ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰Pé šÿÿº[‹D$Dè8)ÿÿ„À„Ò‹…Œ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$é‡ÿÿ‹]\ºZ‹D$DèÆ(ÿÿ„À„^v†ƒ‹•Œ ‹œ$‰‰r‹H,‰J‹H(‰J ‹”$‰P,‰x(é £ÿÿ‹„$9D$X”ÿÿH‰„$Ç„$‹Œ$‹”$ 1À1öéK¤ÿÿ1ÛéQ†ÿÿ‹\$L‹›˜ ‰\$<…Û….¹ÿÿº ‹D$Dèû'ÿÿ‰D$<…À„†¹ ‰Ç1Àóª‹\$4[ƒÁã‰Ú‹D$DèÌ'ÿÿ‹|$<‰G…À„ۉljÙ1Àóª‹|$<‰7ÇG…ö„‰~齸ÿÿ„$ø‰$‹Œ$‹”$‰èèÉéþÿ‹”$„À‹B(„/˜ÿÿ¿é'˜ÿÿ‹Œ$éÔ±ÿÿ1Ûé|…ÿÿ„$‰$‹Œ$‹”$‰èè{éþÿ‹”$‹J(„À„Ÿ¨ÿÿ¿é—¨ÿÿ„$‰$‹Œ$‹”$‰èè@éþÿ‹”$„À‹B(„¢ÿÿ¿é¢ÿÿ„$ø‰$‹Œ$‹”$‰èèéþÿ„À‹„$‹P(„ñ¶ÿÿÆD$4éì¶ÿÿ‹Œ$é²°ÿÿ‹Œ$é@´ÿÿ‰è芲þÿŠ\$Hˆ: ‹t$8‰µ$ é’ÿÿº!‹D$Dèw&ÿÿ„À„%‹…Œ Š\$HˆX‹…Œ ‹t$8‰0‹„$éÈéÿÿ»ðÿÿÿéN„ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé–õÿÿ‹¬$¬‰Ç‰4$ÿƒq‹D$DèoËþÿ…ÿ‰÷ÿÿ‰ûé„ÿÿ‰sd‹„$ø‹´$ü鉂ÿÿ1Ûéñƒÿÿ»ðÿÿÿéçƒÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿéàóÿÿ‹l$4Ç„$ ÿÿÿÿé?‘ÿÿ÷ØéDÁÿÿ‹l$4Ç„$ ÿÿÿÿé$‘ÿÿ1Û雃ÿÿ»÷ÿÿÿ鑃ÿÿ1Éé §ÿÿ»÷ÿÿÿ逃ÿÿ»ðÿÿÿévƒÿÿ‰Ãéoƒÿÿ»÷ÿÿÿéeƒÿÿ‰ù‹|$4‰W(épÃÿÿ»ðÿÿÿéMƒÿÿ»÷ÿÿÿéCƒÿÿ»ðÿÿÿé9ƒÿÿ‰Ãé2ƒÿÿ»÷ÿÿÿé(ƒÿÿ‰Ãé!ƒÿÿ»÷ÿÿÿéƒÿÿ»ðÿÿÿé ƒÿÿ1ÀÇD$8éÝßÿÿ1ÀÇD$8éæÞÿÿ»ðÿÿÿéå‚ÿÿ»ðÿÿÿéÛ‚ÿÿ»ðÿÿÿéÑ‚ÿÿ»÷ÿÿÿéÇ‚ÿÿ»ðÿÿÿ齂ÿÿ»ðÿÿÿ鳂ÿÿ»÷ÿÿÿé©‚ÿÿ1Û颂ÿÿ1Û雂ÿÿ1Û锂ÿÿ1Ûé‚ÿÿ»ðÿÿÿ郂ÿÿ‰Ãé|‚ÿÿ»ðÿÿÿér‚ÿÿ»ðÿÿÿéh‚ÿÿ»ðÿÿÿé^‚ÿÿ»ðÿÿÿéT‚ÿÿ»ðÿÿÿéJ‚ÿÿ»ðÿÿÿé@‚ÿÿ»÷ÿÿÿé6‚ÿÿ»ðÿÿÿé,‚ÿÿ»ðÿÿÿé"‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿéúÿÿ»ðÿÿÿéðÿÿ»ðÿÿÿéæÿÿ»ðÿÿÿéÜÿÿ»ðÿÿÿéÒÿÿ»÷ÿÿÿéÈÿÿ‰<$ÿƒq‹D$DèÉþÿ»þÿÿÿé¬ÿÿ»ðÿÿÿé¢ÿÿ»ðÿÿÿé˜ÿÿ»ðÿÿÿéŽÿÿ»ðÿÿÿé„ÿÿ»ðÿÿÿézÿÿ‹Œ$騯ÿÿ»ðÿÿÿédÿÿ»ðÿÿÿéZÿÿ»ðÿÿÿéPÿÿ»ðÿÿÿéFÿÿ»ðÿÿÿé<ÿÿ»ðÿÿÿé2ÿÿ»ðÿÿÿé(ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéÿÿ‰ú‹D$Dè›Èþÿ»÷ÿÿÿéÿ€ÿÿ»ðÿÿÿéõ€ÿÿ»ðÿÿÿéë€ÿÿ»ðÿÿÿéá€ÿÿ‹l$H‰Æ‹D$Dè$Èþÿ…ö‰¡àÿÿ‰óéÀÿÿ‹|$<‹\$L‰»˜ 飳ÿÿ»ðÿÿÿ馀ÿÿ‰4$ÿƒq‹D$DèæÇþÿ»þÿÿÿ銀ÿÿ»ðÿÿÿ退ÿÿ»ðÿÿÿév€ÿÿ»ðÿÿÿél€ÿÿ»ðÿÿÿéb€ÿÿ»ðÿÿÿéX€ÿÿ»ðÿÿÿéN€ÿÿ»ðÿÿÿéD€ÿÿ»ðÿÿÿé:€ÿÿ»ðÿÿÿé0€ÿÿ»ðÿÿÿé&€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ‹l$H‰Æ‹D$DèKÇþÿ…ö‰÷ßÿÿ‰óéêÿÿ»ðÿÿÿéàÿÿ‹\$<‰C(é´½ÿÿfUWVSƒì\‰D$$‰Ö‹(‰l$‹m‰l$4èÇþÿ‹l$€½5 t)‹]h‹mH‰l$@9댆‰Ý+l$@‰l$H‹l$‹mL‰l$Dë+‹l$‹]h‹mL‰l$D9ëY‹l$D)݉l$H‹l$‹mH‰l$@‹l$4‹E öÄ•D$:öÄ€„ŠD$:ƒðˆD$9‹l$4€½„À÷Ћl$‰…Ü Š…8 ˆD$;1íÇD$(‹T$ƒÂt‰T$<‹L$Á¼ ‰L$0‰ð¶ð‰t$Lf‹T$‰ZhŠL$;ˆŠ8 ‹|$<‰º„ Ç‚€ ‹‚ ‰‚” Ç‚Œ ‰Z`‰Zd‰Ð‹‹J$…É~,‹@\ƒÀ1ÉÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ4;J$|Ü‹zx…ÿ~5‹|$‹‡Ð ƒÀ1ÉfÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ(;Jx|Ü‹r…ö~,‹L$‹AP1ÉÇÿÿÿÿÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ9ñuÝ‹rT…ö~(‹|$‹‡è ƒÀ1ÉvÇÇ@ÿÿÿÿAƒÀ;JT|깋|$01Àóª‹T$Ç‚Ì Ç‚Ô Ç‚Ø Æ‚: Ç‚$ fÇ‚0 ‹ŠÜ …É…ƒ‹L$H;Š  r …Éus€º8 tjÇD$,‹T$@‹D$‰PH‹L$D‰HL‹D$(…À…šƒ|$,„‹D$$èÄþÿ‹t$,…öyéõv‹D$$èwÄþÿÇD$,‹D$,ƒÄ\[^_]Ãv‹|$‹‹PÇ$‹L$L‹D$$è yÿÿ‰D$,ƒøŒtÿÿÿ„nÿÿÿH„¹€|$:u€|$9„Uÿÿÿ‹D$‹Pd9Ph„Eÿÿÿ‹D$(…À„‹L$‹qd9Þ„‹D$$èãÃþÿ‹D$$‹‰D$‹‰T$ ‹T$ ‹B…À~|‹l$(ÇD$ÇD$ë.f‹E‰U‹KÁá‹s‰Çó¤ÿD$ƒD$ƒÅ‹D$‹|$ ;G}8‹\$‹L$YP‹‹S‰E‰U‹S;U v¶Áâ‹Eè5ÿÿ…Àtc‹S‰U ‰E럋D$$è#Ãþÿ‹l$‹]d‰è‹mh‹€Ü …À„‹L$‹Ø H‰Ü €|$9„½üÿÿ€¹5 „‰iH‰YLé¥üÿÿ‹T$ ‹B…ÀŽf‹|$(1ö‹ƒq‹l$ ‹G‰$ÿÓFƒÇ;u|ï‹L$(‰ $ÿÓ‹D$$è‘Âþÿ‹D$@‹l$‰EH‹T$D‰UL‹D$$è–ÂþÿÇD$,÷ÿÿÿÿ´‚q…À…þÿÿ1Ò‹D$,èå¼þÿéþÿÿ‹—Ø …Ò…9þÿÿé›ýÿÿ;ih…gþÿÿ‹|$4‹_ …Û~*‹QP‹D$(1É‹89:…Iþÿÿ‹x9z…=þÿÿAƒÂƒÀ9Ùuß‹|$@‹L$‰yH‹D$D‰ALƒ|$,u‹|$‹‡Ø …À„‹T$‰rd‰jh‹D$$èàÁþÿ‹D$$‹(‹U‹B…Àޝ1ÿ1ö‹ƒq‰\$‰Ó‹EP‹D8‰$ÿT$F‹CƒÇ9Æ|ç‹\$‹UP @Áá‰×‹t$(ó¤‹T$(‰$ÿÓ‹D$$è\Áþÿ‹l$ÇETÿÿÿÿÇEXÿÿÿÿ‹E‹HL‹x …ÿ~T‹EPº½ÿÿÿÿë2f‹X…Ûx/‹1‰Ó9õ}‹l$‰UT€y „¦‰UX‰õƒÀBƒÁ 9ß~‹0…öyʉӃÀBƒÁ 9ßí‹D$$èÁþÿÇD$,‹D$,ƒÄ\[^_]Ë|$‰_H‰oLéúÿÿ‹D$$èÔÀþÿ‹D$$‹‰D$‹‰T$ ‹B@ÁàèRÿÿ‰D$(…À„ðýÿÿ‹L$ ‹A @Áá‹|$(1Àóªé½üÿÿÆD$9éåùÿÿ‰õéXÿÿÿ‹ƒqé±ýÿÿ‹D$$èkÀþÿ‹l$$‹E‹(‹}…ÿ~I‹|$(1ö‹ƒqv‹G‰$ÿÓFƒÇ;u|ï‹D$(‰$ÿÓ‹D$$è Àþÿé¨þÿÿ‰Þéÿýÿÿ‹ƒqésþÿÿ‹ƒqëωÞé÷ýÿÿvWVSƒì ‰Ã@ ‰D$ÇD$T$‰ØèŽVÿÿƒ»X „-Œ‹‹T …É…ù‹ƒH 9ƒP |k‹“L €»A „‰T$ÇD$‹C‰$ÿ<ƒq‰Æ…ö„¢‹ƒT @‰ƒT ‹S ;B ~ ǃT ‹T$‰Øè\eÿÿ‰ðƒÄ [^_Ãv€»A …Ï‹sX¿ë=ƒø…3€»C „¾‹Ct;Cp…²‹“L 9ò„Sÿÿÿø‰CtƃD ºD$èž÷ÿÿ‰ƒX …Ày¬‹T$‰ØèÙdÿÿ1öévÿÿÿf‹S\‹C ÇD$‹s‰4$ècÿÿ‰Æé"ÿÿÿ‹T$‰Øè¥dÿÿ‹5œƒqÿ‰ðƒÄ [^_ËCP‰D$‰T$‹C‰$ÿ<ƒq‰Æéèþÿÿf‹sT¿ÿÿÿÿékÿÿÿvÿƒP €»A t]‹ƒL ‰D$‹Cp‰D$‹C‰$ÿ<ƒq‰Æ…À„Jÿÿÿ‹Ct‰ƒL €»C t4;Cpt>ƃD ‹ƒX …À…|þÿÿéBþÿÿ1öëî‹Cp‰D$‹ƒL ë¡ÆƒD ‹ƒX ëÏø‰Ct뻋T$‰ØèÇcÿÿ‹ƒX 1Òè¸þÿ1öéWþÿÿvƒì‹D$ è˜ýÿÿ;œƒqtƒÄËJ‰…Òt ¡˜ƒqÿƒÄËP‰$ÿRëêƒì‹D$ è`ýÿÿ;œƒqtƒÄËJ‰…Òt1ÀƒÄËP‰$ÿR1Àëßvƒì‹D$ è(ýÿÿ;œƒqtƒÄËJ‰…Òt¡Ð‚q‹‰$ÿ¸‚q1Àëß‹P‰$ÿRëáWVSƒì‰Ã‰×p ‰t$ÇD$ T$è‚Sÿÿƒ»H „Œ—‰ø¶ÐD$èmõÿÿ‰Á‰ƒH …Àˆ•‹C‰òèó_ÿÿ‰Æ‰ø„Àu#‹Cp9Ct”ƒD ‹T$‰Øèƒbÿÿ‰ðƒÄ[^_Ãf€»@ tÔ€»A ÀƒàHCp‰CtƃD ëÅv‹T$‰ØèEbÿÿ‹5˜ƒqÿ‰ðƒÄ[^_ËT$‰Øè)bÿÿ‹ƒH 1Ò耶þÿ1öë•‹T$‰Øè bÿÿ1ö놺‹D$éúþÿÿfƒìº‹D$ èçþÿÿ;˜ƒqtƒÄÃv‹J‰…Òt1ÀƒÄËP‰$ÿR1ÀëÜv1Ò‹D$é­þÿÿƒìº‹D$ è›þÿÿ;˜ƒqtƒÄÃv‹J‰…Òt¡Ð‚q‹‰$ÿ¸‚q1ÀëÜ‹P‰$ÿRëáUWVSì¬ ‹¼$À ¡˜ƒq‰„$ ‰„$” Ç„$˜ ‰„$œ „$œ ‰D$ „$˜ ‰D$„$” ‰D$„$ ‰D$„$Œ ‰D$ÇD$ ˜ËqÇD$ÈJq‹„$È ‰D$‹„$Ä ‰$ÿ|‚q…À„à1Ò‹„$ è¶kÿÿ‰Ãƒøÿ„·ºÿÿÿ‹„$” èškÿÿ‰Æƒøÿ„Û‹„$œ èëkÿÿ…Àˆ—ÇD$ÇD$ÇD$‰D$ 1À‹¬$˜ …í•À‰D$‰t$‰$‹Œ$Œ ‰úD$Hèh%ÿÿ„À„HD$H‰„$„ Ç„$ˆ Ç$ÿì‚q‰Å…À„ó€¼$} ÒƒâJ‰T$<‹„$°9„$Í9„$”ŒÀº„$„ èkòÿÿƒøŒI„ ‹G …À…Í€¼$} „»‹„$°‹”$¬‰T$‰D$‹„$Œ ‰$ÿ<ƒq‰Æ…À„ú‰t$‰,$ÿè‚q‹J‰…Ò„Y…ÀˆØ€¼$| „ó‹D$<„$¬‰„$°Æ„$€ 9„$Ž3ÿÿÿD$Hèç¿þÿ‰èĬ [^_]Ãfÿ´‚q…À„;þÿÿf1í‰èĬ [^_]Ãø„§‰$ÿdƒq‰Æ…ÀtS‹_ …ÛŽNÿÿÿ1Ûë‰Dž9_ Ž<ÿÿÿC‹”$˜ÇD$‹„$Œ ‰$‰Ù‹D$HèÖ\ÿÿ…ÀuÊ‹H‰…À„¥‹EH‰E…À„ºD$Hè5¿þÿ1í‰èĬ [^_]Ãf‹„$°;„$¬”„$€ é?þÿÿ‹”$˜ÇD$‹„$Œ ‰$¹‹D$HèY\ÿÿ‰Æ…À…þÿÿ눋V‰4$‰D$8ÿR‹D$8é‘þÿÿf‹„$¬‹”$°é@þÿÿ‹F‰4$ÿPéMÿÿÿfÿ´‚q…À„ýÿÿé½þÿÿ‹E‰,$ÿPé8ÿÿÿfUWVSìŒ ‹¼$  Ç„$x ¡˜ƒq‰„$| „$| ‰D$„$x ‰D$„$t ‰D$ÇD$ ÀËqÇD$×Jq‹„$¨ ‰D$‹„$¤ ‰$ÿ|‚q…À„l‹„$x …À„ý‹„$| èahÿÿ…ÀˆIÇD$ÇD$ÇD$‰D$ ÇD$ÇD$ÿÿÿÇ$‹Œ$t ‰úD$0èà!ÿÿ„À„üD$0‰„$l Ç„$p Ç$ÿì‚q‰Æ…À„³€¼$e …q‹D$t‰D$(ÇD$,1ÛÇD$$‹-è‚q‹D$$;„$x &º„$l è×îÿÿƒøŒî„€¼$g „.‹”$˜‹„$”9„¼$e „‰\$‰D$‹„$t ‰$ÿ<ƒq‰Ã…Û„”‰\$‰4$ÿÕ‹J‰…Ò„F…Àxz‹G …ÀŽ»ë…ÀxdC9_ Œò‹”$€ÇD$‹„$t ‰$‰Ù‹D$0èÂYÿÿ…Àt2‰D$‰4$‰D$ ÿÕ‹T$ ‹ I‰ …Éu°‹J‰$‰D$ ÿQ‹D$ …ÀyŸv‹H‰…À„ãD$0èþ»þÿ1ö‰ðÄŒ [^_]ÃvÇ„$x ÿÿÿéóýÿÿ‹\$tÇD$,ÿÿÿÿÇD$(éˆþÿÿv‹„$”€¼$e …áþÿÿ‰D$‰\$‹„$t ‰$ÿ<ƒq‰ÃéÜþÿÿ1ö‰ðÄŒ [^_]ÃÿD$$‹œ$˜€¼$g t3;œ$”„àÆ„$h é þÿÿ‹S‰$‰D$ ÿR‹D$ é¤þÿÿfÆ„$h éúýÿÿv‹F‰4$ÿPéÿÿÿf;\$(tT$,‰”$˜Æ„$h éÉýÿÿ€¼$e uR‹D$t‰D$‰\$‹„$t ‰$ÿ<ƒq‰Ã…Û„²þÿÿ‰\$‰4$ÿè‚q‹J‰…ÒtH…Àˆ”þÿÿD$0蟺þÿéžþÿÿ‰\$ÇD$‹„$t ‰$ÿ<ƒq‰Ã묋D$,؉„$˜éÿÿÿ‹S‰$‰D$ ÿR‹D$ ë¥UWVSìœ ‰Ã¶¬$´ ¶¼$¸ ¡˜ƒq‰„$„ ‰„$ˆ ‰„$Œ …Òt…É„n„$Œ ‰D$„$ˆ ‰D$„$„ ‰D$„$€ ‰D$ÇD$ @Ìq‹„$° ‰D$‰L$‰$ÿ|‚q…À„ô‹„$„ 1ÒèÌcÿÿ‰Æƒøÿ„ͺÿÿÿ‹„$ˆ è°cÿÿ‰D$,@„Ñ‹„$Œ èdÿÿ…Àˆ«çÿ‰|$ÇD$ÇD$‰D$ ÇD$‹D$,‰D$‰4$‹Œ$€ ‰ÚD$<è‚ÿÿ„Àtdt$<‰´$x Ç„$| ‰è¶Ð„$x èÓêÿÿ…ÀˆË‰ÁT$<‰Øè^Uÿÿ‰ÃD$<èç¸þÿ‰ØÄœ [^_]Ãfÿ´‚q…À„%ÿÿÿ1Û‰ØÄœ [^_]Ãvÿ´‚q…À„!ÿÿÿ1ÛëÞf‹5pƒq9r…ƒþÿÿ‹r‰t$(Nƒþ‡rþÿÿ‹J ‰Œ$€ ƒ|$(„¸þÿÿ‹B‰„$„ ƒ|$(„£þÿÿ‹J‰Œ$ˆ ƒ|$(…Žþÿÿ‹R‰”$Œ éþÿÿfD$<è+¸þÿ1Ûé=ÿÿÿ‹D$‹T$‹L$ ÇD$ ÇD$ÇD$âJqé§ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$ïJqé{ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$ÿJqéOýÿÿvVSƒì$‰Ã…Àtaº Kq¸'Kq辪þÿ‰Æ…ÀtL‰\$‰$ÿƒq‹J‰…Òt"‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ãf‹V‰4$‰D$ÿR‹D$ëË1ÀëàUWVSìì ‰Å‰Ó‰L$,”$ˆ ‰Èè¨ïþÿ„À„¸‹Œ$À ‰L$(1Ò‹„$ è aÿÿ‰Æƒøÿ„Pºÿÿÿ‹„$ èï`ÿÿ‰Çƒøÿ„ì…öˆà‰t$0‹L$(9Îd…ÿˆh‰þ;|$(D€½„u‰ð+D$09EhX‹„$ …Àu Ç„$ ÿÿÿ‰$ÿ„‚q…À„}ÿ¸ÆD$9ÆD$:ÆD$8ÆD$;ÇD$‰D$ÇD$‹„$ ‰D$ÇD$ ‰t$‹L$0‰L$„$ˆ ‰$‹L$,‰êD$Lè–ÿÿ„À„¦T$L‰”$Ø Ç„$Ü Ç„$Ð Ç„$Ì Š„$ ˆ„$Ô ‹L$,‹QöBW•„$Õ „À„1‹´$ÇD$<ÿÿÿÿ‹¼$ …ÿÇD$0Ž º„$Ø è.çÿÿƒøŒ¿„â‹„$°9ðtP€¼$ „N‰t$‰D$‹L$,‰ $ÿ<ƒq‰Æ…ö„‰ò„$Ì è¥±þÿ‹J‰…Ò„ð…Àˆ^€|$8…€|$9…ö€|$:„#‹K‰L$(…ÉŽ1ÿë~‹„$°‹”$´9ЄՀ¼$ „„‰D$‰T$‹L$,‰ $ÿ<ƒq‰Æ…ö„硘ƒq9Æ„¢‰ò„$Ì èþ°þÿ‹J‰…Ò„%…Àˆ·G;|$(„–‹C ‹¸‹u ‹P;„ƒq„î;Pƒq„âèéSÿÿƒøÿ„`ƒø„GÿÿÿŽ_9ÆŒWD@ý‹”$œ‹H…É…D‹;P„ᡘƒqÿ‹J‰…Ò…tÿÿÿ‹P‰$ÿRG;|$(…kÿÿÿÿD$0‹´$´€¼$ƒ „—;´$°„^Æ„$„ ‹„$ 9D$0…þýÿÿŠ„$ „À„º1Ò9Ö„V„À„+‰t$ÇD$‹L$,‰ $ÿ<ƒq‰Æ…ö„“¼$Ì ‰ò‰øèµ¯þÿ‹J‰…Ò„Y…Àxr…Ût ‹H‰…À„6‰øè±þÿ‰ÃD$Lèé²þÿ…Û„‘ö„$ „…‹D$0‰D$‰\$Ç$-Kqÿˆƒq‰Ãëhfÿ´‚q…À…¶1Ò¸ôÿÿÿè¦þÿ‹„$Ì …Àt ‹J‰…Ò„‚‹„$Ð …Àt ‹J‰…Ò„ZD$Lèa²þÿ…Ût ‹H‰…À„X1Û‰ØÄì [^_]Ãÿ‰Æé®ýÿÿv‹V‰4$‰D$$ÿR‹D$$éÅýÿÿf‰T$‰D$‹L$,‰ $ÿ<ƒq‰Æéwýÿÿ;´$°”„$„ éjþÿÿ‰D$‰t$‹L$,‰ $ÿ<ƒq‰Æé­üÿÿ‰Ú„$Ì èZ®þÿ…À‰ þÿÿéÿÿÿ€|$;„ùýÿÿ¹T$L‰èèNÿÿ‰Æ…À„õþÿÿ‰D$Ç$ÿhƒq…À„ ‰D$‰$‰D$$ÿƒq‰Ç‹T$$‹H‰…À„‹H‰…À„…ÿ„£þÿÿ‰ú„$Ì èÇ­þÿ‹J‰…Ò„†f…À‰hýÿÿéyþÿÿv‹V‰4$‰D$$ÿR‹D$$éúûÿÿf‰Ñ‰L$éQüÿÿ¹T$L‰èèHMÿÿ‰D$(…À„6þÿÿ‹D$L‹@ @‰$ÿdƒq‰Ç…À„Ñ‹D$L‹p …öx81ö‹ ˜ƒq‰L$4f‹L$4‰ò‹D$(èqNÿÿ‰D$‰t$‰<$ÿlƒqF‹D$L9p }Ö‹D$(èTÿÿ‰Æ…À„i‰D$‰|$‰$ÿƒq‰Á‹H‰…À„Ç‹H‰…À„¢‹T$(‹H‰…À„Á…É„ýÿÿ‰Ê„$Ì ‰L$$蟬þÿ‹L$$‹J‰…Ò…Öþÿÿ‹Q‰ $‰D$$ÿR‹D$$éÀþÿÿö„$ … º\‰ØèÞéþÿƒøŽ7ÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é^ùÿÿ‹H‹é þÿÿfÿ´‚q…À„¢øÿÿ„$ˆ 蚢þÿ1Û‰ØÄì [^_]Ãv1öÇD$<éÏùÿÿ‹t$(é³øÿÿv‰L$0…ÿ‰˜øÿÿ|$(‰Žøÿÿ1ö铸ÿÿv‹L$,ÿö„$ …P‹\$,„$ˆ è(¢þÿ‰ØÄì [^_]Ãv‹C‰$ÿP1Û‰ØÄì [^_]Ãt$(‰øÿÿÇD$0éøÿÿº{‰ØèÔèþÿƒøöþÿÿ… 1ÀÆD$91ÛÆD$:ÆD$8ÆD$;éNøÿÿ‹G‰<$‰L$$ÿP‹L$$éHþÿÿf‹F‰4$‰L$$ÿP‹L$$é#þÿÿf‹B‰$‰L$$ÿP‹L$$é)þÿÿf„$ˆ è\¡þÿ…Û…×ûÿÿéßûÿÿv‹D$<ð‰„$´Æ„$„ éúÿÿf‹P‰$ÿRé˜ûÿÿf‹P‰$ÿRépûÿÿf1Ò¸õÿÿÿèd¡þÿéEûÿÿvÿ´‚q…À…Hþÿÿé÷ÿÿÇD$‰L$Ç$-Kqÿˆƒq‰Ãé”þÿÿ‹”$À é<úÿÿ‹W‰<$‰D$$ÿR‹D$$éfüÿÿ„Óþÿÿ‰\$‰l$Ç$ÿhƒqèÆõÿÿ‰Ã…À„Hþÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;éÿöÿÿ‹B‰$ÿPéáûÿÿ‹F‰4$ÿPéàûÿÿ‹„$À ‰D$‰t$‹L$,‰ $ÿ<ƒq‰ÆéÍùÿÿ¼$Ì éêùÿÿ‹H‰…Àu ‹G‰<$ÿP‹T$(‹H‰…À…9úÿÿ‹B‰$ÿPé+úÿÿ‹C‰$ÿPé¼ùÿÿ‹V‰4$‰D$$ÿR‹D$$é‘ùÿÿÇD$_Dq‰$ÿ$ƒq‰Ã…À„rýÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é)öÿÿ‹H‰…À…Äùÿÿ‹F‰4$ÿPé¶ùÿÿƒì\ÇD$@¡˜ƒq‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÐËqÇD$0Kq‹D$h‰D$‹D$d‰$ÿ|‚q…ÀtG‹D$LèVVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èjôÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡˜ƒq‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ìËqÇD$0Kq‹D$h‰D$‹D$d‰$ÿ|‚q…ÀtG‹D$Lè’Uÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`è¦óÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡˜ƒq‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÌqÇD$=Kq‹D$h‰D$‹D$d‰$ÿ|‚q…ÀtG‹D$LèÎTÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èâòÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡˜ƒq‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ $ÌqÇD$=Kq‹D$h‰D$‹D$d‰$ÿ|‚q…ÀtG‹D$Lè Tÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èòÿÿƒÄ\Ãf1ÀƒÄ\ÃfUWVSƒì<‹l$P‹\$Tº\‰Øè=ãþÿ…Àx ÿ‰ØƒÄ<[^_]É\$‹E‰D$Ç$ÿhƒqèWñÿÿ‰Ç…À„~ÇD$$ÇD$(ÆD$,‹E‹@ö@W•D$-‹G‰D$…ÀŽR1öëDfÿ…Û„¡˜ƒq9ă‰ÚD$$è*¥þÿ‹J‰…Ò„…ÀˆãF;t$„ ‹G ‹°‹U0‹C÷@Tu©‰Ø‰T$èHÿÿƒøÿ‹T$„‘ƒøtTŽ”9ÂŒŒD@ý‹U4‹H…Éu]¡˜ƒqÿ‹J‰…Òu”‹P‰$ÿRë‰f‹S‰$‰D$ÿR‹D$éiÿÿÿf‹U‹E$)ЉD$‹E )ЉD$‹E ‰$ÿ<ƒq‰Ãéÿÿÿ‹U‹H)щL$‹ë×ÿ´‚q…À…Ž1Ò¸òÿÿÿè›þÿ‹D$$…Àt ‹J‰…Òte‹D$(…Àt ‹J‰…ÒtH‹H‰…Àt#1ÛéIþÿÿ‹H‰…Àt#D$$èr¥þÿ‰Ãé0þÿÿv‹G‰<$ÿP1Ûéþÿÿ‹G‰<$ÿPëÒ‹P‰$ÿRë­‹P‰$ÿRë1Ò¸õÿÿÿ茚þÿémÿÿÿvUWVSƒì<ǘÁqPBqǬÁqè?qÇÔÁq@ÇØÁqDÂqÇèÁqÇôÁq`ÂqÇøÁq`ÃqÇüÁqàÃqÇ8Äq¬:qÇLÄqL>qÇXÄqäÄqÇtÄqëÇxÄqðÄqÇ”ÄqÅqǘÄq ÆqÇœÄq€ÆqÇÇq=qÇTÇqëÇXÇqÄÇqÇlÇqTqÇpÇq`xqÇtÇqàÇqÇxÇq@ÈqǘÈq\=qÇÔÈqëÇØÈqDÉqÇìÈqlqÇðÈqàvqÇôÈq`ÉqÇøÈqÀÉqÇ$€Áq‹tƒqÿÓ…ÀˆBÇ$ ÄqÿÓ…Àˆ1Ç$ÇqÿÓ…Àˆ Ç$€ÈqÿÓ…ÀˆÇ `qÇD$õÇD$ ÇD$ÇD$ÊqÇ$IKqÿŒƒq…À„Љ$ÿ ƒq‰ÆÇ$´2‹=ä‚qÿ׉ÅÀt"‰D$ÇD$PKq‰4$ÿ ‚q‹H‰…À„¯Ç$ÿ׉ÅÀt"‰D$ÇD$VKq‰4$ÿ ‚q‹H‰…À„pÇ$€ÊqÿLƒq‰Ã…Àt"‰D$ÇD$`Kq‰4$ÿ ‚q‹H‰…À„WÇ$`q1Ò1Û1À¶•íq9Ú|Z@‰Â=Üuç4‰ðèßþÿ‰Å…À„ç1À‰ï‰ñóª1ÿ‰ø‰\$,ëR¶C‰D$Ç$jKqÿˆƒq…Àts‰D$·†íq‹…àq‰D$¶C‹D…‰$‹5 ‚qÿÖG‰øÿÜ„À4…žíq¶CT…‹…Àu”‰T$(ÿ”‚q‹T$(‰¶C‹D……À…tÿÿÿ‹\$,¡$`q…Àt ‹J‰…Òt:1öëfF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRë߉,$ÿƒqfƒÄ<[^_]ËP‰$ÿR뻋C‰$ÿPé‚þÿÿ‹C‰$ÿPéCþÿÿ‹C‰$ÿPé›þÿÿ‹\$,ÿ”‚q£$`q…À„zÿÿÿf1ÿ1À‰\$,‰Ãë.v‰D$·‡€q‹…àq‰D$¡$`q‰$ÿÖC‰ßû‘t3Áç¶—ƒq‹T•‰T$¶‡‚q‰D$Ç$lKqÿˆƒq…Àu§éöþÿÿ‹\$,1öë F9Þ„"ÿÿÿ‹Dµ…Àtï‹J‰…Òuæ‹P‰$ÿRëÛ‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€‚qÁà¶Œ „q‰ÐÁèƒâÈ·Œ@†q‰ÐÑè¶ŒÈÀ‘qÑà1ж„H@¢qÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€À£qÁà¶Œà¥q‰ÐÁèƒâ¶ŒÈ@¨q‰ÐÁè¶ŒˆÀ­qÁà1ж„ˆ@±qËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€À´qÁà¶Œà¶q‰ÐÁèƒâÈ·Œà¸q‰ÐÑ趌ȠÃqÑà1ж„H`ÒqÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€@ÔqÁà¶„`Õq‰ÑÁéƒâÁà¶ŒÀ×q‰ÐÁè¶ŒH àqÁà1ж„ˆâqËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€àãqÁà¶„€äq‰ÑÁéƒâÁà¶Œàåq‰ÐÁè¶Œˆ`éqÁà1ж„ˆàëqËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@íqÁà¶Œ`îq‰ÐÁèƒâÈ·Œàïq‰ÐÁ趌ȀõqÁà1ж„ˆ qËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€`qÁà¶Œ q‰ÐÁè¶Ò¶ŒÈàq‰ÐÁè¶ŒÈ qÁáÁà1ÐÁ‰ÈÁè¶€ÀqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ qÁà¶ŒÀq‰ÐÁè¶Ò¶ŒÈ@q‰ÐÁè¶ŒÈ qÁáÁà1ÐÁ‰ÈÁè¶€  qƒáÓøƒàÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€È qÁà¶”à q‰ØÁè ãÿ¶”Ð q‰ØÁèÁâ¶Œ` qÁáÁà1ØÁ‰ÈÁè¶€`qƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€¨qÁà¶”Àq‰ØÁè ãÿ¶”Ðq‰ØÁèÁâ¶Œ@qÁáÁà1ØÁ‰ÈÁè¶€ qƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€4qÁà¶”`q‰ØÁè ãÿ¶”Рq‰ØÁèÁâ¶ŒàqÁáÁà1ØÁ‰ÈÁè¶€àqƒáÓøƒà[Ãv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€àqÁà¶Œ q‰ÐÁè¶Ò¶ŒÈ€q‰ÐÁè¶ŒÈ qÁáÁà1ÐÁ‰ÈÁè¶€ÀqƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€qÁà¶Œ@q‰ÐÁè¶Ò¶ŒÈ€q‰ÐÁè¶ŒÈàqÁáÁà1ÐÁ‰ÈÁè¶€€qƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@qÁà¶Œ€q‰ÐÁè¶Ò¶ŒÈÀq‰ÐÁè¶ŒÈqÁáÁà1ÐÁ‰ÈÁè¶€ qƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€qÁà¶ŒÀq‰ÐÁè¶Ò¶ŒÈq‰ÐÁè¶ŒÈ@qÁáÁà1ÐÁ‰ÈÁè¶€àqƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€À qÁà¶Œ!q‰ÐÁè¶Ò¶ŒÈ@!q‰ÐÁ趌Ƞ!qÁáÁà1ÐÁ‰ÈÁè¶€@"qƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ #qÁà¶Œ`#q‰ÐÁè¶Ò¶ŒÈ #q‰ÐÁè¶ŒÈ$qÁáÁà1ÐÁ‰ÈÁè¶€ $qƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€h%qÁà¶Œ€%q‰ÐÁè¶Ò¶ŒÈ&q‰ÐÁè¶ŒÈà&qÁáÁà1ÐÁ‰ÈÁè¶€`)qƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€`,qÁà¶Œ ,q‰ÐÁè¶Ò¶ŒÈ -q‰ÐÁè¶ŒÈ .qÁáÁà1ÐÁ‰ÈÁè¶€À0qƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€4qÁà¶Œ@4q‰ÐÁè¶Ò¶ŒÈÀ4q‰ÐÁ趌Ƞ5qÁáÁà1ÐÁ‰ÈÁè¶€ 8qƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ;qÁà¶Œ`;q‰ÐÁè¶Ò¶ŒÈà;q‰ÐÁè¶ŒÈà<qÁáÁà1ÐÁ‰ÈÁè¶€€?qƒáÓøƒàËT$‰ÑÁéâÿ?‰ÐÁè âÿ¶‰àBq¶ŒÈ@Cq‰ÐÁè¶Ò¶ŒÈ€Cq‰ÐÁè¶ŒÈàCqÁáÁà1ÐÁ‰ÈÁè¶€`DqƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ DqÁà¶ŒàDq‰ÐÁè¶Ò¶ŒÈ@Eq‰ÐÁè¶ŒÈàEqÁáÁà1ÐÁ‰ÈÁè¶€@GqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€üHqÁà¶Œ Iq‰ÐÁè¶Ò¶ŒÈ Iq‰ÐÁ趌ȠJqÁáÁà1ÐÁ‰ÈÁè¶€ MqƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ QqÁà¶ŒàQq‰ÐÁè¶Ò¶ŒÈ Rq‰ÐÁè¶ŒÈ`RqÁáÁà1ÐÁ‰ÈÁè¶€SqƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰DSq¶„ÈUSq‰ÑÁé âÿÁà¶Œ€Sq‰ÐÁè¶ŒÈÀSqÁáÁà1ÐÁ‰ÈÁè¶€TqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€0TqÁà¶Œ`Tq‰ÐÁè âÿ¶ŒÈ€Tq‰ÐÁ趌ȘTqÁáÁà1ÐÁ‰ÈÁè¶€ÀTqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€àTqÁà¶ŒUq‰ÐÁè âÿ¶ŒÈ Uq‰ÐÁè¶ŒÈ0UqÁáÁà1ÐÁ‰ÈÁè¶€@UqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€PUqÁà¶Œ€Uq‰ÐÁè âÿ¶ŒÈ Uq‰ÐÁè¶ŒÈàUqÁáÁà1ÐÁ‰ÈÁè¶€@VqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€¸VqÁà¶ŒàVq‰ÐÁè âÿ¶ŒÈWq‰ÐÁè¶ŒÈ@WqÁáÁà1ÐÁ‰ÈÁè¶€€WqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÐWqÁà¶ŒXq‰ÐÁè âÿ¶ŒÈ Xq‰ÐÁè¶ŒÈ`XqÁáÁà1ÐÁ‰ÈÁè¶€ XqƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€àXqÁà¶Œ@Yq‰ÐÁèƒâ¶ŒÈ Yq‰ÐÁè¶Œˆ@ZqÁáÁà1ÐÁ‰ÈÁè¶€[qƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€À[qÁà¶Œ\q‰ÐÁè¶Ò¶ŒÈ@\q‰ÐÁ趌Ȁ\qÁáÁà1ÐÁ‰ÈÁè¶€ ]qƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ô]q¶ŒÈ^q‰ÐÁè âÿ¶ŒÈ^q‰ÐÁè¶ŒÈ-^qÁáÁà1ÐÁ‰ÈÁè¶€`^qƒáÓøƒàÃv‹T$‰ÑÁé·Ò‰ÐÁè âÿ¶‰^q¶ŒÈ¡^q‰ÐÁè âÿ¶ŒÈ±^q‰ÐÁè¶ŒÈÁ^qÁáÁà1ÐÁ‰ÈÁè¶€à^qƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€_qÁà¶Œ@_q‰ÐÁè¶Ò¶ŒÈ€_q‰ÐÁè¶ŒÈ`qÁáÁà1ÐÁ‰ÈÁè¶€ aqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€XbqÁà¶Œ€bq‰ÐÁè âÿ¶ŒÈÀbq‰ÐÁè¶ŒÈ cqÁáÁà1ÐÁ‰ÈÁè¶€€cqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÐcqÁà¶Œdq‰ÐÁè¶Ò¶ŒÈ`dq‰ÐÁè¶ŒÈàdqÁáÁà1ÐÁ‰ÈÁè¶€@fqƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€pgqÁà¶Œ gq‰ÐÁè¶Ò¶ŒÈàgq‰ÐÁè¶ŒÈ hqÁáÁà1ÐÁ‰ÈÁè¶€ hqƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€ôhqÁà¶Œ iq‰ÐÁè âÿ¶ŒÈ@iq‰ÐÁ趌ȀiqÁáÁà1ÐÁ‰ÈÁè¶€ÀiqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€8jqÁà¶„`jq‰ÑÁé¶ÒÁà¶Œ€jq‰ÐÁ趌ȠjqÁáÁà1ÐÁ‰ÈÁè¶€¸jqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÄjqÁà¶Œàjq‰ÐÁè âÿ¶ŒÈkq‰ÐÁè¶ŒÈkqÁáÁà1ÐÁ‰ÈÁè¶€0kqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€HkqÁà¶Œ`kq‰ÐÁè âÿ¶ŒÈ kq‰ÐÁè¶ŒÈàkqÁáÁà1ÐÁ‰ÈÁè¶€ lqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€hlqÁà¶Œ€lq‰ÐÁè âÿ¶ŒÈ lq‰ÐÁ趌ȰlqÁáÁà1ÐÁ‰ÈÁè¶€ÀlqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÐlqÁà¶Œmq‰ÐÁè âÿ¶ŒÈ mq‰ÐÁè¶ŒÈ0mqÁáÁà1ÐÁ‰ÈÁè¶€@mqƒáÓøƒàÃS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€PmqÁà¶”€mq‰ØÁè ãÿ¶”Рmq‰ØÁèÁâ¶ŒÀmqÁáÁà1ØÁ‰ÈÁè¶€àmqƒáÓøƒà[Ãv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€ômqÁà¶Œ nq‰ÐÁè âÿ¶ŒÈ`nq‰ÐÁ趌ȠnqÁáÁà1ÐÁ‰ÈÁè¶€ànqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ oqÁà¶Œ@oq‰ÐÁè âÿ¶ŒÈ€oq‰ÐÁè¶ŒÈÀoqÁáÁà1ÐÁ‰ÈÁè¶€ pqƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€pqÁà¶ŒÀpq‰ÐÁè¶Ò¶ŒÈqq‰ÐÁè¶ŒÈ@qqÁáÁà1ÐÁ‰ÈÁè¶€€qqƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀqqÁà¶Œrq‰ÐÁè¶Ò¶ŒÈ@rq‰ÐÁ趌ȀrqÁáÁà1ÐÁ‰ÈÁè¶€sqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€dsqÁà¶Œ€sq‰ÐÁè âÿ¶ŒÈ sq‰ÐÁ趌ȸsqÁáÁà1ÐÁ‰ÈÁè¶€ÐsqƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰èsq¶„Èùsq‰ÑÁé âÿÁà¶Œ tq‰ÐÁè¶ŒÈ@tqÁáÁà1ÐÁ‰ÈÁè¶€XtqƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ptq¶„Ètq‰ÑÁé âÿÁà¶Œ tq‰ÐÁè¶ŒÈÀtqÁáÁà1ÐÁ‰ÈÁè¶€uqƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€@uqÁà¶Œ uq‰ÐÁèƒâ¶ŒÈvq‰ÐÁè¶Œˆ€vqÁáÁà1ÐÁ‰ÈÁè¶€ wqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€¬wqÁà¶ŒÀwq‰ÐÁè âÿ¶ŒÈxq‰ÐÁè¶ŒÈ xqÁáÁà1ÐÁ‰ÈÁè¶€@xqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€hxqÁà¶Œ€xq‰ÐÁè âÿ¶ŒÈ xq‰ÐÁ趌ȸxqÁáÁà1ÐÁ‰ÈÁè¶€àxqƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€yqÁà¶Œ yq‰ÐÁè¶Ò¶ŒÈ`yq‰ÐÁ趌ȠyqÁáÁà1ÐÁ‰ÈÁè¶€zqƒáÓøƒàÃv‹L$‰ÈÁè·É‰ÊÁê áÿ¶€rƒøuèzþÿÿ¸ÉÃvèkþÿÿ¡D`qHuéÇD`qÇ$H`qè‘PëÐf¡D`q…ÀtÇD`q¸ÉÃfÇ$H`qèlRëÞÿ%l‚qÿ%p‚qÿ%d‚qÿ%h‚qÿ%‚qÿ%‚qÿ%(‚qÿ%$‚qÿ%‚qÿ% ‚qÿ% ‚qÿ%‚qÿ%‚qÿ%‚qU‰åƒìèaSþÿÇ$qè SþÿÉÃÿÿÿÿ¾qÿÿÿÿoKq}Kq‹Kq•Kq£KqµKqÃKqÏKqßKqìKqûKqLqLq'Lq;LqSLqgLq~Lq˜Lq´Lq¾LqÐLqäLqøLqMq,Mq>MqJMqbMqvMq‚Mq“Mq¦Mq¸MqÉMqÔMqãMqöMq Nq Nq,Nq MatchObject or None. Match zero or more characters at the beginning of the string.fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters against all of the string.search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Search through string looking for a match, and return a corresponding match object instance. Return None if no match is found.sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement repl.subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement format.subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement repl.subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement format.split(string, string, maxsplit=0, concurrent=None) --> list. Split string by the occurrences of pattern.splititer(string, maxsplit=0, concurrent=None) --> iterator. Return an iterator yielding the parts of a split string.findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list. Return a list of all matches of pattern in string. The matches may be overlapped if overlapped is True.finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator. Return an iterator over all matches for the RE pattern in string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a MatchObject.scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner. Return an scanner for the RE pattern in string. The matches may be overlapped if overlapped is True.group([group1, ...]) --> string or tuple of strings. Return one or more subgroups of the match. If there is a single argument, the result is a single string, or None if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the whole match is returned. Group 0 is the whole match.start([group1, ...]) --> int or tuple of ints. Return the index of the start of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the start of the whole match is returned. Group 0 is the whole match.end([group1, ...]) --> int or tuple of ints. Return the index of the end of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the end of the whole match is returned. Group 0 is the whole match.span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints. Return the span (a 2-tuple of the indices of the start and end) of one or more subgroups of the match. If there is a single argument, the result is a span, or (-1, -1) if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the span of the whole match is returned. Group 0 is the whole match.groups(default=None) --> tuple of strings. Return a tuple containing all the subgroups of the match. The argument is the default for groups that did not participate in the match.groupdict(default=None) --> dict. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name. The argument is the value to be given for groups that did not participate in the match.capturesdict() --> dict. Return a dictionary containing the captures of all the named subgroups of the match, keyed by the subgroup name.expand(template) --> string. Return the string obtained by doing backslash substitution on the template, as done by the sub() method.expandf(format) --> string. Return the string obtained by using the format, as done by the subf() method.captures([group1, ...]) --> list of strings or tuple of list of strings. Return the captures of one or more subgroups of the match. If there is a single argument, the result is a list of strings; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the captures of the whole match is returned. Group 0 is the whole match.starts([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the starts of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the starts of the captures of the whole match is returned. Group 0 is the whole match.ends([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the ends of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the ends of the captures of the whole match is returned. Group 0 is the whole match.spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints. Return the spans (a 2-tuple of the indices of the start and end) of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of spans; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the spans of the captures of the whole match is returned. Group 0 is the whole match.detach_string() Detaches the target string from the match object. The 'string' attribute will become None.match() --> MatchObject or None. Match at the current position in the string.search() --> MatchObject or None. Search from the current position in the string.split() --> string or None. Return the next part of the split string.´˜q ™q`™q¸™qšqhšqÀšq(›q›qœqpœqàœqHq°qžq€žqèžqPŸq¸Ÿq  qˆ qð qX¡qÀ¡q(¢q¢qø¢q`£qÈ£q0¤q˜¤q¥qh¥qÐ¥q8¦q ¦q§qp§qاq@¨q¨¨q©qx©qà©qHªq°ªq «qˆ«qð«qX¬qÀ¬q(­q­qø­q`®qÈ®q0¯q˜¯qô¯qH°qœ°qô°qL±q¨±q²qX²q¬²q³qh³qÀ³q´qH´qP´q\´qt´qœ´qÔ´qµqTµqß0Ið°‡–—˜™šžPRTV€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯²³´¶·¼ÂÃÄÆÇÌÒÓÖ×âãäæçòóôö÷üûûûûûûûûûûûû9cAÊĽ%ɾ\¿)ÑäÝ㦠¶  ± ! ` " Ü ~ » | j}~dñ:‹eú‡¢pOŽastoaƒáÑ‹¼ÐbÖT€ìtV¯ŽÛ Ô k Ó 4!!!‘"h""i"ÿ#±#²#Æ$w$x$%#ѹ—•–˜Ÿš^]Þg³ ” š ™ › µ / ¨ ´³ ¶Ùª©­ÛQ|×Ï!’ "! "þ#%$c$Õ%Û&Ú&C':((4(@)¯*+,,ÿ-.†/ 0;151´2 34‡5ý6 7Ì8ç9Ò:®;D<é=è=I>H>}?|?~@@iAµAžB™BCCûD‘DïEîEŒFhGlG´G°H5I¸JßKàKúLÿLMPN=NÊOÉOñPèQüR÷SþS·TõUûUñVëV÷WöWòXìXöYüYóZðZø[ô[\ ]›]^_ÿ_$`ØaÖa—b•bôcùcUdTd{ezeDf@fXgWg:h~iëj$kqkylímìmVnooÎpÍpJqHqZrPrrsqsYtGttusv¼wCx˜y–yÎz{¡|œ|þ}n~N~vº€¯®‚‚Ÿƒ&„d„g…<†‡‡ ˆê‰é‰ÙŠ×Šè‹(Œ#Œ'e8Ž67ÅŒ‘‹‘‘L’N’“œ“±”¯”F•U•L–j——K˜I˜Ô™Ó™²š°š››ßœ¸·žŸ£ ¤¡x¢w¢Ð£ ¤F¥¦7§G¨«©ÉªU«“¬K­{®Ò¯î°í±…²H³Æ´XµW¶I·®¸­¸ô¹sºÙ»;¼È½¾ˆ¿ŠÀ‰ÀÅÁÐÂÏÂïÃwÄvÄÅÅ Æ Æ¢Ç¡Ç È ȃÉ‚ÉÞÊÝÊ­ˬËÖÌÕ̹͸ÍÎËÏÌÏÐÐÏÐùÑýÑÆÒ1Ó0Ó–Ô•Ô[ÕQÕ\ÖRÖ]×S×MØOØÙGÚVÚõÛ÷ÛöÜøÜ=‚m”¢ ”œµ·/.¨§   ­ ¬ Û Ú     QS|‰×ÏÎ!’“"# þý#"ÕÔCB @?¯°†ˆ   :!9!~"u"ë#ê#!$*$o%p%F&b&''«(¾(Q)“){)**,+++ÿ,þ,--´.³. //¶0µ07161É2Ê2U3T3’4…4ö5õ5ý6ü67’7€78899$::þ;ý;GË>ˆ?h?{@z@vAuAB BçCæC®D­DDEEECFDFºG¹G‚HtHŸI¨IÐJÏJ K KÒLÑL<M N‘N OOÆPÇPÅQÄQ¶R·R¼SÎTÍTgUfUèV VKW¶WHX¸XXYYWZyZI[R[s\‹\Ò]Ó]ô^ó^Ù_Ø_;``íaëaîbìbïc‚cÈdÌdÙeØeff€gVi¼½Íà0;†²!✡ñ ï ~ q ˜ ¤ ð  ñ  òâ62äßVi†²~câßœ¡ÝÑB Ë Í ‰ Vi†²âßÅÀñïÚ¿?>J ¤ 6 2 À ¼ ä ã _ ^ ½¼"åænj2,¥SB.ÌËÎÍ©¤šÜÇÝÒÞÓ® o‡jȱZ ` _ M ð é ) 0 « “ ¬È§«ªÆ¥©„q«Ç¦ªîô…r- .  f e  3  w x ~ Œ M T „         ! " ! # # $ $ % & & ' ' + ( 0 ) 5 * ; + @ , B - C . D / E 0 F 1 M 2 Q 3 R 4 S 5 T 6 U 7 V 8 ƒ 9 !Š ! " " # # $ $ % % & & ' ' ( (à )/ )¿ )Á *1 *½ * +¾ +2 +Ø ,ä ,4 ,× -È -6 -Ù .ò .7 .¦ /8 / /¢ 0š 09 0 1: 1“ 1Œ 2‹ 2< 2Ž 3¦ 3= 3» 4> 4£ 4º 5? 5ž 5\ 6_ 6A 6  7Ä 8'   p f ð $  S R æ å ë ê a ` E È í ê å K J [   Ò Õ â á ó ò   Ÿ ‹   [ W õ å   % ’ ” — Ö Ü Ÿ   Á é í ö ÷    - 1 2 3 r } Š   ç ó + 9 s ” • ž   ´ !µ "Á #à $Ë %û & ' ( ) *X + ,k -l .m /u 0v 1y 2z 3ƒ 4è 5 6ç 7; 8¬ 9( 3 k  À  £ š ¨  /  =iONa^˜—*/àßûüP_ˆ ‡ † ƒ 6 2 › “ C ? YZL>=kbùÔøÊÛÚÚㆺ²}r³Ÿ‘úÉúÇ€!_\ip o!"#`$„$0%;%s&F&œ'¡''62¶°¥¤    H    L *Km)J[lyI(kGxZ…j r!"w#"$~%%&„' ()*+ ,!-#.$/&0'1+20354;5@6B7C8D9E:F;MS?T@UAVBWCXDYE\F`GaHbIdJeKfLgMhNiOnPsQzRS†TU,VNW]XoYtZ{[€\‡]^-_O`^apbuc|deˆfg.hPi_jqkvl}m‚n‰op3qcrst¢¦O§(î)-+ , ï * g [VâNÅ3MRQPz u v { | ywx&'úøçæ¾¼^Y ùĻܛšÃÂ@ ?   D ?  A ‘ @=>ŽIEA@fedc¨°   ZaÛßÝlj¡>™–^ L 5!4!º""W#<#C$B$²%±%ã&á&]'K'c(d(&))Y*A*G+F+J,H,›-<.8.X/>/ª0©0×1¿1Á2À2[3C3Z4B4ä5E6U6m7n7l8k8)9<9Þ:Õ: ; ; §< ¿< Ã= Â= m> h> n? o? ¹@£@7A1A8B:BáCàCMDUDOEVEžF™F¥G¹H»IåJKŠL]MbN€Xq…Xq‡Xq‰XqŽXq“Xq—Xq›XqŸXq£Xq§Xq«Xq¯Xq³Xq¶XqºXq¿XqÅXqÌXqÖXqäXqèXqìXqïXqôXqøXqûXqÿXqYqYq YqYqYqYqYqYq!Yq$Yq)Yq,Yq/Yq1Yq5Yq9Yq]qC]qL]qQ]qW]q`]qp]q{]q]q†]q‰]qŒ]q]q–]q ]q«]q°]q¸]q½]qÃ]qÍ]qÙ]qß]qì]qò]qõ]qø]qþ]q^q^q^q^q^q'^q3^qD^qK^qZ^qj^qu^qx^q}^q„^q‰^q‘^q¡^q¬^q¸^qÂ^qÏ^qÔ^qÝ^qâ^qè^qü^q _q#_q%_q(_q-_q1_qD_qV_q`_qx_q}_q‚_q‰_q˜_qž_qª_q¸_q»_q¾_qÂ_qÈ_qÏ_qÖ_qÜ_qã_qé_qð_q÷_qý_q`q `q`q`q`q$`q*`q0`q6`q<`qB`qH`qN`qT`qZ`q``qf`ql`qr`qx`q~`q„`qŠ`q`q–`qœ`q¢`q¨`q«`q²`q·`qÍ`qã`qù`qaq%aq*aq3aq6aq=aq@aqDaqNaq]aqnaq„aq aqÅaqÙaqðaqøaqbqbqbqbq5bq@bqKbqdbq|bqœbq¼bqÜbqûbqþbqcqcq&cq)cq,cq2cq5cq9cqTcqxcqœcq¯cq½cqÖcqÝcqôcqdq dqdq%dq@dqUdq_dqmdq|dqdq dqµdqÄdq×dqçdqïdqÿdqeq eqeq+eq.eq3eq6eq9eqCeqTeqseq‚eq’eq—eqœeq eq¤eq¨eq°eqÁeqÊeq×eqäeqöeqfqfq'fq=fqBfqDfqGfqKfqVfq[fqkfqnfqqfqyfq‡fq™fq³fq·fqÂfqÊfqÏfqÚfqèfqûfqþfqgq gqgq0gq@gqFgqOgqVgqbgqngqzgq†gq‰gqŽgq‘gqgqŸgq¢gq±gq¶gqÊgqÔgq×gqÛgqìgqhq#hq7hqChq_hqvhq”hq¢hq¥hq¨hq­hq¶hqÂhqÏhqàhqòhqþhqiq iq2iqEiqHiqTiqXiq_iqhiquiqwiq}iq†iq‰iqiq‘iq—iq¨iqµiqÈiqËiqÐiq×iqÛiqäiqèiqòiqöiqüiqÿiqjqjq&jq6jq;jqDjqPjqcjqfjqkjqvjq{jq€jq‡jqjqšjq¯jq¾jqËjqÒjqØjqçjqðjqþjqkq kqkqkqkq'kq,kq.kq1kq4kq8kqIkqSkq]kqxkq‡kq‹kqkq—kq¯kqºkqÎkqâkqòkqlq lqlqlqlqlq&lq3lq7lq?lqDlqHlqQlqjlq{lqŠlqlq˜lq›lqŸlq¢lq©lq¬lq°lq»lqÀlqÌlqílqñlqölqmq mqmq(mq8mq;mqNmq_mqumq‚mqŒmq‘mq™mq¬mq±mq¶mqËmqámqímqùmqnqnqnq&nq)nq-nq6nq;nq@nqInqRnqWnq`nqcnqfnqlnqxnq„nq‘nqnq nq£nq¦nqªnq±nq¶nq»nqÃnqÒnqÞnqånqìnqûnqoqoqoqoq0oqKoqSoqYoq^oqioqooq|oqoq†oq‘oq–oq™oq›oqžoq¢oq©oq®oq²oq·oq½oqÄoqÎoqßoqéoqüoqpqpqpq)pqApqPpq_pqnpqspqvpqypq…pqŠpq—pq£pq¯pqÄpq×pqëpqðpq÷pqþpqqqqq qq%qq+qq0qq8qqIqqZqqdqqmqq{qq€qqƒqq†qq‰qqqq£qq©qq³qqÃqqÑqqÕqqÙqqÝqqàqqãqqæqqñqqõqqrqrq rqrqrqrqrq&rq3rq=rqBrqJrqYrq^rqcrqprqrq¦rq´rq¿rqÂrqÅrqÈrqÌrqÓrqØrqärqórq sqsqsq#sq7sqxqDxqGxqJxqNxqRxqUxqXxq]xqexqnxq{xq€xq…xqxqœxq¯xqÌxqÛxqÞxqëxqðxqóxqyqyq-yq0yq>yqFyqLyqWyqfyqkyqnyqryqxyq„yq‰yqŽyq’yq—yqyq yqªyq¸yqºyqÂyqÔyqäyqèyqïyqúyqýyqzqzqzq1zqDzqXzq]zqazqezqizquzqzzqzq“zq˜zqšzqzq zq¤zqªzq´zq¹zq¾zqÃzqÎzqÑzqÔzqÞzqåzqèzqëzqðzq{q {q{q{q%{q({q0{q8{q={qB{qG{qS{qX{q`{qc{qf{ql{qw{q‰{q{q{q›{q {q¬{q¯{qµ{qÄ{qÐ{qç{qð{qó{q÷{qþ{q|q|q |q|q|q'|q;|q?|qJ|qU|q[|qg|q|q’|q¦|q¼|qÞ|qö|q}q0}q8}q@}qO}qY}qb}qe}qj}qv}q}}q‚}q‰}q“}q•}q}q¢}q«}q°}q´}qº}qÂ}qÊ}qÖ}qé}qî}qô}qù}qþ}q~q ~q~q~q~q,~q1~q8~q=~qQ~qV~q[~q`~qe~ql~qq~qy~q~~q‡~q—~q¢~q«~q¯~q¼~qÑ~qÜ~qï~qû~qqq$q;q@qBqGqOqTq]qcqpq”q¿qÐqØqÛqáqëqûqýq€q€q€q+€qH€qQ€qa€qf€qo€q}€q„€qŒ€qœ€q¢€q±€q€qÌ€qÏ€qÒ€qØ€qÚ€qÞ€qá€qì€qñ€qô€qù€qqqqqq$q0q5q>qCqHqKqMqQq[qgqkqnqsqzqq›q§q¬q³qµq¸q½qÃqÈqËqÎqÑqÔqÜqáq è ß ,àÿÿÿàÿÿÿÇàÿÿÿ¿ àÿÿÿ ç f ¿àÿÿÿF yÿÿÿÿ9ÿÿÿÿÿÿ‡ÿÿÿÔþÿÿôþÿÿÃÒÎÍOÊËÏaÓÑ£Õ‚ÖÚÙÛ8ÿÿÿÿþÿÿÿÿÿÿÿ±ÿÿÿŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*?*=ÿÿÿEG***.ÿÿÿ2ÿÿÿ3ÿÿÿ6ÿÿÿ5ÿÿÿ1ÿÿÿ(¥D¥/ÿÿÿ-ÿÿÿ÷)ý)+ÿÿÿ*ÿÿÿç)&ÿÿÿ»ÿÿÿ'ÿÿÿ¹ÿÿÿ%ÿÿÿTty&%@?C > ` 9\¬ÿÿÿ % Výÿÿ 6 P / }ÚÿÿÿÛÿÿÿ3àÿÿÿàÿÿÿ@àÿÿÿ<Œÿÿÿàÿÿÿàÿÿÿ6ùüÿÿàÿÿÿàÿÿÿàÿÿÿ0áÿÿÿàÿÿÿÿÿÿÿàÿÿÿàÿÿÿ]ÀÿÿÿÁÿÿÿÂÿÿÿâÿÿÿÇÿÿÿçÿÿÿ#ÑÿÿÿñÿÿÿÊÿÿÿêÿÿÿøÿÿÿªÿÿÿÊÿÿÿ°ÿÿÿÐÿÿÿ¤ÿÿÿÄÿÿÿÝÿÿÿ ÿÿÿÀÿÿÿùÿÿÿP°ÿÿÿñÿÿÿ0Ðÿÿÿ`Šæ;ÿÿÿÿ:ÅÿÿÿÆÿÿÿAâÿÿJVd€p~ ¶ÿÿÿ÷ÿÿÿ‡ãÿÿÛãÿÿûãÿÿªÿÿÿ½ãÿÿœÿÿÿÍãÿÿÿÿÿ€ÿÿÿ‚ÿÿÿƒâÿÿ£âÿÿ!ßÿÿAßÿÿšßÿÿºßÿÿäÿÿÿðÿÿÿæÿÿÿ ÖÿÿñÿÿÖÿÿÕÕÿÿØÕÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿ ãÿÿüuÿÿØZÿÿ¼Zÿÿ(Øÿÿÿ ”ÿÿÿs9ÿÿÿsn‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛzþÿÿ ŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?)âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0Þÿÿÿ‚`Òáÿÿ1Ýáÿÿßáÿÿ àáÿÿ Çáÿÿ¾ÆÿÿÿÕáÿÿsøÿÿÿuäÿÿsäÿÿqäÿÿoäÿÿB€ÿÿÿ¹xÿÿÿ¹ÿÿÿ¹ˆÿÿÿ¹Àÿÿÿ¹¸ÿÿÿ¹¾ÿÿÿ¹þãÿÿ¹øãÿÿ¹ûãÿÿBúãÿÿB¹¶ÿÿÿõãÿÿ¹ûãÿÿ²ÿÿÿ¹ôãÿÿ¹êãÿÿ¹ñãÿÿBðãÿÿB¹ªÿÿÿëãÿÿ¹çãÿÿæãÿÿããÿÿBâãÿÿBœÿÿÿããÿÿâãÿÿÝãÿÿßãÿÿBÞãÿÿBÿÿÿŠÿÿÿ¹Öãÿÿ¹Úãÿÿ¹ÓãÿÿBÒãÿÿB¹€ÿÿÿ‚ÿÿÿÍãÿÿ¹£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿfÿÿfeÿÿidÿÿlcÿÿfibÿÿflnÿÿtmÿÿta ÿÿv` ÿÿe_ ÿÿkh ÿÿv] ÿÿm(D¾qlibgcc_s_dw2-1.dll__register_frame_infolibgcj-12.dll_Jv_RegisterClasses__deregister_frame_info@q,qq qüqìqTqÈq£qÂq£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q¸q£q£q£q¸qÂq£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£q£qÂq£qØq£qØq£q£qÂqªqªqøqøqøqøqøqøqªqªqªqªqøqøqøqøqªqªqªqªqªqªqªqªqªqªqªqªqªqªqªqªqªqªqªqøqøqøqøqøqøqøqøqªqªqªqªqªqªqªqøqøqøqøqøqøqøqøqøqøqøqøqøqøqøqøq²qçq²q²q²q²q²q²qq²qÄq²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²qüq²qpq|qüqq²q²q²q²q²q²q²q²q²qpqpqpqpqpqpq²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²q²qéq²qéqÄq²qÄqSqSqiqiqiqiqiqiqSqiqSqSqiqiqiqiqiqiqiqSqiqiqiqiqiqiqSqiqSqSqSqSqSqSqSqiqiqiqiqiqiqiqiqSqSqSqSqSqSqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqnn:has_property_valuennn:get_all_casessx$qý"qý"qý"qý"qý"qý"q¸#qT$qì#qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"q $qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"qý"q#q#qX#q#qt#q„#q0$qØ#qh#q¤$qý$qß$q¤$q¤$q¤$q¤$q¤$q¤$q²$q¤$q¤$q¤$q¤$q¤$qÁ$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q¤$q„$qnnerror_regex_coretoo much backtrackingconcurrent not int or Nonegroup indices must be integers or strings, not %.200sgroup indices must be integers or stringsinvalid RE codestring indices must be integersinvalid group referenceexpected string instance, %.200s foundexpected unicode instance, %.200s foundno such groupinvalid replacementinternal error in regular expression engine /qD/qh/q„/q¤/qÄ/qô/q0qô.q,0qÚ.qÚ.qÚ.qÚ.qÚ.q80qÚ.q/qregex.Regex(, flags= | regex.=)FqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEq,FqçEqçEqçEq@FqçEqçEqçEqçEqçEqçEqçEqçEqçEqçEqTFqçEqçEqçEq`FqçEqçEqçEqlFqçEqçEqçEqxFqçEqçEqçEqçEqçEqçEqçEqüEq„HqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqTHqRGqRGqRGq(HqRGqRGqRGqRGqRGqRGqRGqRGqRGqRGqHqRGqRGqRGqÜGqRGqRGqRGq¼GqRGqRGqRGq GqRGqRGqRGqRGqRGqRGqRGqhGqÔHqÔHqðHqðHqlIqlIqðHqðHqqn qfq.íq|qûqpûqqÓ#q`qÀq qM&qÜq¼q€qlqÄqšqx qØ q\q¼qx qØ q\q¼qx qØ q\q¼qx qØ q\q¼qq9qvq“qüqæq$ q·q: q q>q0$q8!q#q¨üqñüq.íq.íqŠqŽq qÆqkqCqúq.íq.íqqÝùq|ùq,ùqÚøqŠøqúqü1q–úq 1q 1q 1q 1q 1q 1qÀ0q¸/q|/q@/q 1q 1q 1q 1q¸/q¸/q¸/q–úq¸/q¸/q¸/q¸/q¸/q¸/qT3q¸/qØ2q–úqœ2q–úqØ2qP2q–úq 1q 1q 1q 1q 1q 1q 1q 1q¸4q¤3q¤3q¸4q¸4q¸4q¸/q 1q 1q 1q 1q 1q 1q 1q 1q 1q 1q 1q 1q 1q 1q 1q 1q¸/q¸/q¸/q¸/q¸4q°5q°5q¸4q¸4q¸4q–úq–úq–úq–úq–úq–úqø.qœ.q-q–úq-q–úqd+qÐ*qP)q)q´(q,(qEqëDq;Dq—Cq.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9q.9qûBqOBq«Aq Aqk@qÆ?qøKq”Kq(Kq¶Jqn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=qn=q=JqQIqjHqîGqvGqøFqO|OOnO:findallO|nO:splitO|OOO:searchO|OOO:fullmatchO|OOO:match_compile_replacement_helperregexNnOO|nOOO:subnOO|nOOO:sub_regexMAGICCODE_SIZEcopyrightiiORE_OP_FAILURERE_OP_SUCCESSRE_OP_ANYRE_OP_ANY_ALLRE_OP_ANY_ALL_REVRE_OP_ANY_REVRE_OP_ANY_URE_OP_ANY_U_REVRE_OP_ATOMICRE_OP_BOUNDARYRE_OP_BRANCHRE_OP_CALL_REFRE_OP_CHARACTERRE_OP_CHARACTER_IGNRE_OP_CHARACTER_IGN_REVRE_OP_CHARACTER_REVRE_OP_DEFAULT_BOUNDARYRE_OP_DEFAULT_END_OF_WORDRE_OP_DEFAULT_START_OF_WORDRE_OP_ENDRE_OP_END_OF_LINERE_OP_END_OF_LINE_URE_OP_END_OF_STRINGRE_OP_END_OF_STRING_LINERE_OP_END_OF_STRING_LINE_URE_OP_END_OF_WORDRE_OP_FUZZYRE_OP_GRAPHEME_BOUNDARYRE_OP_GREEDY_REPEATRE_OP_GROUPRE_OP_GROUP_CALLRE_OP_GROUP_EXISTSRE_OP_LAZY_REPEATRE_OP_LOOKAROUNDRE_OP_NEXTRE_OP_PROPERTYRE_OP_PROPERTY_IGNRE_OP_PROPERTY_IGN_REVRE_OP_PROPERTY_REVRE_OP_RANGERE_OP_RANGE_IGNRE_OP_RANGE_IGN_REVRE_OP_RANGE_REVRE_OP_REF_GROUPRE_OP_REF_GROUP_FLDRE_OP_REF_GROUP_FLD_REVRE_OP_REF_GROUP_IGNRE_OP_REF_GROUP_IGN_REVRE_OP_REF_GROUP_REVRE_OP_SEARCH_ANCHORRE_OP_SET_DIFFRE_OP_SET_DIFF_IGNRE_OP_SET_DIFF_IGN_REVRE_OP_SET_DIFF_REVRE_OP_SET_INTERRE_OP_SET_INTER_IGNRE_OP_SET_INTER_IGN_REVRE_OP_SET_INTER_REVRE_OP_SET_SYM_DIFFRE_OP_SET_SYM_DIFF_IGNRE_OP_SET_SYM_DIFF_IGN_REVRE_OP_SET_SYM_DIFF_REVRE_OP_SET_UNIONRE_OP_SET_UNION_IGNRE_OP_SET_UNION_IGN_REVRE_OP_SET_UNION_REVRE_OP_START_OF_LINERE_OP_START_OF_LINE_URE_OP_START_OF_STRINGRE_OP_START_OF_WORDRE_OP_STRINGRE_OP_STRING_FLDRE_OP_STRING_FLD_REVRE_OP_STRING_IGNRE_OP_STRING_IGN_REVRE_OP_STRING_REVRE_OP_STRING_SETRE_OP_STRING_SET_FLDRE_OP_STRING_SET_FLD_REVRE_OP_STRING_SET_IGNRE_OP_STRING_SET_IGN_REVRE_OP_STRING_SET_REVRE_OP_BODY_ENDRE_OP_BODY_STARTRE_OP_END_FUZZYRE_OP_END_GREEDY_REPEATRE_OP_END_GROUPRE_OP_END_LAZY_REPEATRE_OP_GREEDY_REPEAT_ONERE_OP_GROUP_RETURNRE_OP_LAZY_REPEAT_ONERE_OP_MATCH_BODYRE_OP_MATCH_TAILRE_OP_START_GROUP_regex.Patternmatchfullmatchsearchsubsubfsubnsubfnsplitsplititerfindallfinditerscanner__copy____deepcopy__patternThe pattern string from which the regex object was compiled.flagsThe regex matching flags.groupsThe number of capturing groups in the pattern.named_listsThe named lists used by the regex.groupindexA dictionary mapping group names to group numbers._regex.Matchgroupstartendspangroupdictcapturesdictexpandexpandfcapturesstartsendsspansdetach_string__getitem__reThe regex object that produced this match object.posThe position at which the regex engine starting searching.endposThe final position beyond which the regex engine won't search.lastindexThe group number of the last matched capturing group, or None.lastgroupThe name of the last matched capturing group, or None.regsA tuple of the spans of the capturing groups.stringThe string that was searched, or None if it has been detached._regex.ScannernextThe regex object that produced this scanner object._regex.SplitterThe regex object that produced this splitter object.compileget_code_sizeget_propertiesfold_caseget_expand_on_foldinghas_property_valueget_all_casesoverlappedconcurrentmaxsplitcountrepldefaultÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€qTq°qqdq¼qBDSFILMRTUXV0V1WÄWqÆWqÈWqÊWq@ÌWqÎWqÐWqÒWqÔWqÖWq ØWq@ÚWq ÝWqàWq-1/2011/101/161/21/31/41/51/61/71/81/91010010001000010000010000000010000000000001031071111/2118121221291313/2130132141515/2161717/2181922/32/52020020002000020221214216216000218222202222242262282323023223323424240252627282933/163/23/43/53/83030030003000031323334353637383944/54040040004000041424343200044454647484955/25/65/85050050005000066060060006000077/27/8707007000700008808008000800008499/29090090009000091AABOVEABOVELEFTABOVERIGHTAEGEANNUMBERSAHEXAIAINALALAPHALCHEMICALALCHEMICALSYMBOLSALEFALETTERALNUMALPHAALPHABETICALPHABETICPFALPHABETICPRESENTATIONFORMSALPHANUMERICAMBIGUOUSANANCIENTGREEKMUSICANCIENTGREEKMUSICALNOTATIONANCIENTGREEKNUMBERSANCIENTSYMBOLSANYARARABARABICARABICEXTAARABICEXTENDEDAARABICLETTERARABICMATHARABICMATHEMATICALALPHABETICSYMBOLSARABICNUMBERARABICPFAARABICPFBARABICPRESENTATIONFORMSAARABICPRESENTATIONFORMSBARABICSUPARABICSUPPLEMENTARMENIANARMIARMNARROWSASCIIASCIIHEXDIGITASSIGNEDATATAATARATBATERMATTACHEDABOVEATTACHEDABOVERIGHTATTACHEDBELOWATTACHEDBELOWLEFTAVAGRAHAAVESTANAVSTBB2BABALIBALINESEBAMUBAMUMBAMUMSUPBAMUMSUPPLEMENTBASICLATINBATAKBATKBBBCBEHBELOWBELOWLEFTBELOWRIGHTBENGBENGALIBETHBIDICBIDICLASSBIDICONTROLBIDIMBIDIMIRROREDBINDUBKBLBLANKBLKBLOCKBLOCKELEMENTSBNBOPOBOPOMOFOBOPOMOFOEXTBOPOMOFOEXTENDEDBOTTOMBOTTOMANDRIGHTBOUNDARYNEUTRALBOXDRAWINGBRBRAHBRAHMIBRAIBRAILLEBRAILLEPATTERNSBREAKAFTERBREAKBEFOREBREAKBOTHBREAKSYMBOLSBUGIBUGINESEBUHDBUHIDBURUSHASKIYEHBARREEBYZANTINEMUSICBYZANTINEMUSICALSYMBOLSCC&CAKMCANCANADIANABORIGINALCANADIANSYLLABICSCANONICALCANONICALCOMBININGCLASSCANSCARICARIANCARRIAGERETURNCASEDCASEDLETTERCASEIGNORABLECBCCCCCCCC10CCC103CCC107CCC11CCC118CCC12CCC122CCC129CCC13CCC130CCC132CCC133CCC14CCC15CCC16CCC17CCC18CCC19CCC20CCC21CCC22CCC23CCC24CCC25CCC26CCC27CCC28CCC29CCC30CCC31CCC32CCC33CCC34CCC35CCC36CCC84CCC91CFCHAKMACHAMCHANGESWHENCASEFOLDEDCHANGESWHENCASEMAPPEDCHANGESWHENLOWERCASEDCHANGESWHENTITLECASEDCHANGESWHENUPPERCASEDCHERCHEROKEECICIRCLECJCJKCJKCOMPATCJKCOMPATFORMSCJKCOMPATIBILITYCJKCOMPATIBILITYFORMSCJKCOMPATIBILITYIDEOGRAPHSCJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENTCJKCOMPATIDEOGRAPHSCJKCOMPATIDEOGRAPHSSUPCJKEXTACJKEXTBCJKEXTCCJKEXTDCJKRADICALSSUPCJKRADICALSSUPPLEMENTCJKSTROKESCJKSYMBOLSCJKSYMBOLSANDPUNCTUATIONCJKUNIFIEDIDEOGRAPHSCJKUNIFIEDIDEOGRAPHSEXTENSIONACJKUNIFIEDIDEOGRAPHSEXTENSIONBCJKUNIFIEDIDEOGRAPHSEXTENSIONCCJKUNIFIEDIDEOGRAPHSEXTENSIONDCLCLOSECLOSEPARENTHESISCLOSEPUNCTUATIONCMCNCNTRLCOCOMCOMBININGDIACRITICALMARKSCOMBININGDIACRITICALMARKSFORSYMBOLSCOMBININGDIACRITICALMARKSSUPPLEMENTCOMBININGHALFMARKSCOMBININGMARKCOMBININGMARKSFORSYMBOLSCOMMONCOMMONINDICNUMBERFORMSCOMMONSEPARATORCOMPATCOMPATJAMOCOMPLEXCONTEXTCONDITIONALJAPANESESTARTERCONNECTORPUNCTUATIONCONSONANTCONSONANTDEADCONSONANTFINALCONSONANTHEADLETTERCONSONANTMEDIALCONSONANTPLACEHOLDERCONSONANTREPHACONSONANTSUBJOINEDCONTINGENTBREAKCONTROLCONTROLPICTURESCOPTCOPTICCOUNTINGRODCOUNTINGRODNUMERALSCPCPRTCRCSCUNEIFORMCUNEIFORMNUMBERSCUNEIFORMNUMBERSANDPUNCTUATIONCURRENCYSYMBOLCURRENCYSYMBOLSCWCFCWCMCWLCWTCWUCYPRIOTCYPRIOTSYLLABARYCYRILLICCYRILLICEXTACYRILLICEXTBCYRILLICEXTENDEDACYRILLICEXTENDEDBCYRILLICSUPCYRILLICSUPPLEMENTCYRILLICSUPPLEMENTARYCYRLDDADALDALATHRISHDASHDASHPUNCTUATIONDBDEDECIMALDECIMALNUMBERDECOMPOSITIONTYPEDEFAULTIGNORABLECODEPOINTDEPDEPRECATEDDESERETDEVADEVANAGARIDEVANAGARIEXTDEVANAGARIEXTENDEDDIDIADIACRITICDIACRITICALSDIACRITICALSFORSYMBOLSDIACRITICALSSUPDIGITDINGBATSDOMINODOMINOTILESDOUBLEABOVEDOUBLEBELOWDOUBLEQUOTEDQDSRTDTDUALJOININGEEAEASTASIANWIDTHEGYPEGYPTIANHIEROGLYPHSEMOTICONSENENCENCLOSEDALPHANUMENCLOSEDALPHANUMERICSENCLOSEDALPHANUMERICSUPPLEMENTENCLOSEDALPHANUMSUPENCLOSEDCJKENCLOSEDCJKLETTERSANDMONTHSENCLOSEDIDEOGRAPHICSUPENCLOSEDIDEOGRAPHICSUPPLEMENTENCLOSINGMARKESETETHIETHIOPICETHIOPICEXTETHIOPICEXTAETHIOPICEXTENDEDETHIOPICEXTENDEDAETHIOPICSUPETHIOPICSUPPLEMENTEUROPEANNUMBEREUROPEANSEPARATOREUROPEANTERMINATOREXEXCLAMATIONEXTEXTENDEXTENDEREXTENDNUMLETFFALSEFARSIYEHFEFEHFINFINALFINALPUNCTUATIONFINALSEMKATHFIRSTSTRONGISOLATEFOFONTFORMATFRAFRACTIONFSIFULLWIDTHGAFGAMALGCGCBGENERALCATEGORYGENERALPUNCTUATIONGEOMETRICSHAPESGEORGEORGIANGEORGIANSUPGEORGIANSUPPLEMENTGLGLAGGLAGOLITICGLUEGOTHGOTHICGRAPHGRAPHEMEBASEGRAPHEMECLUSTERBREAKGRAPHEMEEXTENDGRAPHEMELINKGRBASEGREEKGREEKANDCOPTICGREEKEXTGREEKEXTENDEDGREKGREXTGRLINKGUJARATIGUJRGURMUKHIGURUHH2H3HAHHALFANDFULLFORMSHALFMARKSHALFWIDTHHALFWIDTHANDFULLWIDTHFORMSHAMZAONHEHGOALHANHANGHANGULHANGULCOMPATIBILITYJAMOHANGULJAMOHANGULJAMOEXTENDEDAHANGULJAMOEXTENDEDBHANGULSYLLABLESHANGULSYLLABLETYPEHANIHANOHANUNOOHEHEBRHEBREWHEBREWLETTERHEHHEHGOALHETHHEXHEXDIGITHIGHPRIVATEUSESURROGATESHIGHPUSURROGATESHIGHSURROGATESHIRAHIRAGANAHLHSTHYHYPHENIDIDCIDCONTINUEIDEOIDEOGRAPHICIDEOGRAPHICDESCRIPTIONCHARACTERSIDSIDSBIDSBINARYOPERATORIDSTIDSTARTIDSTRINARYOPERATORIMPERIALARAMAICININDICMATRACATEGORYINDICNUMBERFORMSINDICSYLLABICCATEGORYINFIXNUMERICINHERITEDINITINITIALINITIALPUNCTUATIONINMCINSCINSCRIPTIONALPAHLAVIINSCRIPTIONALPARTHIANINSEPARABLEINSEPERABLEINVISIBLEIOTASUBSCRIPTIPAEXTIPAEXTENSIONSISISOISOLATEDITALJAMOJAMOEXTAJAMOEXTBJAVAJAVANESEJGJLJOINCJOINCAUSINGJOINCONTROLJOININGGROUPJOININGTYPEJTJVKAKAFKAITHIKALIKANAKANASUPKANASUPPLEMENTKANAVOICINGKANBUNKANGXIKANGXIRADICALSKANNADAKAPHKATAKANAKATAKANAEXTKATAKANAORHIRAGANAKATAKANAPHONETICEXTENSIONSKAYAHLIKHAPHKHARKHAROSHTHIKHMERKHMERSYMBOLSKHMRKNDAKNOTTEDHEHKTHIKVLL&LAMLAMADHLANALAOLAOOLATINLATIN1LATIN1SUPLATIN1SUPPLEMENTLATINEXTALATINEXTADDITIONALLATINEXTBLATINEXTCLATINEXTDLATINEXTENDEDALATINEXTENDEDADDITIONALLATINEXTENDEDBLATINEXTENDEDCLATINEXTENDEDDLATNLBLELEADINGJAMOLEFTLEFTANDRIGHTLEFTJOININGLEFTTORIGHTLEFTTORIGHTEMBEDDINGLEFTTORIGHTISOLATELEFTTORIGHTOVERRIDELEPCLEPCHALETTERLETTERLIKESYMBOLSLETTERNUMBERLFLIMBLIMBULINBLINEARBLINEARBIDEOGRAMSLINEARBSYLLABARYLINEBREAKLINEFEEDLINESEPARATORLISULLLMLOLOELOGICALORDEREXCEPTIONLOWERLOWERCASELOWERCASELETTERLOWSURROGATESLRELRILROLTLULVLVSYLLABLELVTLVTSYLLABLELYCILYCIANLYDILYDIANMM&MAHJONGMAHJONGTILESMALAYALAMMANDMANDAICMANDATORYBREAKMARKMATHMATHALPHANUMMATHEMATICALALPHANUMERICSYMBOLSMATHEMATICALOPERATORSMATHOPERATORSMATHSYMBOLMBMCMEMEDMEDIALMEEMMEETEIMAYEKMEETEIMAYEKEXTMEETEIMAYEKEXTENSIONSMERCMEROMEROITICCURSIVEMEROITICHIEROGLYPHSMIAOMIDLETTERMIDNUMMIDNUMLETMIMMISCARROWSMISCELLANEOUSMATHEMATICALSYMBOLSAMISCELLANEOUSMATHEMATICALSYMBOLSBMISCELLANEOUSSYMBOLSMISCELLANEOUSSYMBOLSANDARROWSMISCELLANEOUSSYMBOLSANDPICTOGRAPHSMISCELLANEOUSTECHNICALMISCMATHSYMBOLSAMISCMATHSYMBOLSBMISCPICTOGRAPHSMISCSYMBOLSMISCTECHNICALMLMLYMMNMODIFIERLETTERMODIFIERLETTERSMODIFIERSYMBOLMODIFIERTONELETTERSMODIFYINGLETTERMONGMONGOLIANMTEIMUSICMUSICALSYMBOLSMYANMARMYANMAREXTAMYANMAREXTENDEDAMYMRNN&NANANNARNARROWNBNCHARNDNEUTRALNEWLINENEWTAILUENEXTLINENKNKONKOONLNONOBLOCKNOBREAKNOJOININGGROUPNONCHARACTERCODEPOINTNONENONJOININGNONSPACINGMARKNONSTARTERNOONNOTAPPLICABLENOTREORDEREDNRNSNSMNTNUNUKTANUMBERNUMBERFORMSNUMERICNUMERICTYPENUMERICVALUENUNNVNYAOALPHAOCRODIOGAMOGHAMOGREXTOIDCOIDSOLCHIKIOLCKOLDITALICOLDPERSIANOLDSOUTHARABIANOLDTURKICOLETTEROLOWEROMATHONOPOPENPUNCTUATIONOPTICALCHARACTERRECOGNITIONORIYAORKHORYAOSMAOSMANYAOTHEROTHERALPHABETICOTHERDEFAULTIGNORABLECODEPOINTOTHERGRAPHEMEEXTENDOTHERIDCONTINUEOTHERIDSTARTOTHERLETTEROTHERLOWERCASEOTHERMATHOTHERNEUTRALOTHERNUMBEROTHERPUNCTUATIONOTHERSYMBOLOTHERUPPERCASEOUPPEROVOVERLAYOVERSTRUCKPP&PARAGRAPHSEPARATORPATSYNPATTERNSYNTAXPATTERNWHITESPACEPATWSPCPDPDFPDIPEPFPHAGPHAGSPAPHAISTOSPHAISTOSDISCPHLIPHNXPHOENICIANPHONETICEXTPHONETICEXTENSIONSPHONETICEXTENSIONSSUPPLEMENTPHONETICEXTSUPPIPLAYINGCARDSPLRDPOPOPDIRECTIONALFORMATPOPDIRECTIONALISOLATEPOSTFIXNUMERICPRPREFIXNUMERICPREPENDPRINTPRIVATEUSEPRIVATEUSEAREAPRTIPSPUAPUNCTPUNCTUATIONQAACQAAIQAFQAPHQMARKQUQUOTATIONQUOTATIONMARKRRADICALREGIONALINDICATORREGISTERSHIFTERREHREJANGREVERSEDPERIRIGHTRIGHTJOININGRIGHTTOLEFTRIGHTTOLEFTEMBEDDINGRIGHTTOLEFTISOLATERIGHTTOLEFTOVERRIDERJNGRLERLIRLOROHINGYAYEHRUMIRUMINUMERALSYMBOLSRUNICRUNRSS&SASADSADHESAMARITANSAMRSARBSAURSAURASHTRASBSCSCONTINUESCRIPTSDSESEENSEGMENTSEPARATORSEMKATHSENTENCEBREAKSEPSEPARATORSGSHARADASHAVIANSHAWSHINSHRDSINGLEQUOTESINHSINHALASKSMSMALLSMALLFORMSSMALLFORMVARIANTSSMLSOSOFTDOTTEDSORASORASOMPENGSPSPACESPACESEPARATORSPACINGMARKSPACINGMODIFIERLETTERSSPECIALSSQSQRSQUARESTSTERMSUBSUNDSUNDANESESUNDANESESUPSUNDANESESUPPLEMENTSUPSUPARROWSASUPARROWSBSUPERSUPERANDSUBSUPERSCRIPTSANDSUBSCRIPTSSUPMATHOPERATORSSUPPLEMENTALARROWSASUPPLEMENTALARROWSBSUPPLEMENTALMATHEMATICALOPERATORSSUPPLEMENTALPUNCTUATIONSUPPLEMENTARYPRIVATEUSEAREAASUPPLEMENTARYPRIVATEUSEAREABSUPPUAASUPPUABSUPPUNCTUATIONSURROGATESWASHKAFSYSYLOSYLOTINAGRISYMBOLSYRCSYRIACSYRIACWAWTTAGALOGTAGBTAGBANWATAGSTAHTAILETAITHAMTAIVIETTAIXUANJINGTAIXUANJINGSYMBOLSTAKRTAKRITALETALUTAMILTAMLTAVTTAWTEHMARBUTATEHMARBUTAGOALTELUTELUGUTERMTERMINALPUNCTUATIONTETHTFNGTGLGTHAATHAANATHAITIBETANTIBTTIFINAGHTITLECASELETTERTONELETTERTONEMARKTOPTOPANDBOTTOMTOPANDBOTTOMANDRIGHTTOPANDLEFTTOPANDLEFTANDRIGHTTOPANDRIGHTTRAILINGJAMOTRANSPARENTTRANSPORTANDMAPTRANSPORTANDMAPSYMBOLSTRUEUUCASUCASEXTUGARUGARITICUIDEOUNASSIGNEDUNIFIEDCANADIANABORIGINALSYLLABICSUNIFIEDCANADIANABORIGINALSYLLABICSEXTENDEDUNIFIEDIDEOGRAPHUNKNOWNUPUPPERUPPERCASEUPPERCASELETTERVVAIVAIIVARIATIONSELECTORVARIATIONSELECTORSVARIATIONSELECTORSSUPPLEMENTVEDICEXTVEDICEXTENSIONSVERTVERTICALVERTICALFORMSVIRAMAVISARGAVISUALORDERLEFTVOWELVOWELDEPENDENTVOWELINDEPENDENTVOWELJAMOVRVSVSSUPWWAWWBWHITESPACEWIDEWJWORDWORDBREAKWORDJOINERWSWSPACEXDIGITXIDCXIDCONTINUEXIDSXIDSTARTXPEOXSUXXXYYEHYEHBARREEYEHWITHTAILYESYIYIIIYIJINGYIJINGHEXAGRAMSYMBOLSYIRADICALSYISYLLABLESYUDHYUDHHEZZ&ZAINZHAINZINHZLZPZSZWZWSPACEZYYYZZZZ      !""#$%&'"""()*+,-./0123456789:;<=>?@@ABCDEFGEHIEE@J@@KLMNOPQRESTUVWXYEE"""""""""""""""""""""""""""""""""""Z"""""""""""""""""""[\""""""""]""^_`abcdefghi"""""""""""""""""""""""jkkkkkkkkkkkkkkkkllllllllllllllllll""mnop""qrstuvwxyzL{|}~LLLLLL€L‚ƒL„L…LLL†LLL‡ˆ‰ŠLLLLLLLLL‹LLLLLLLLLLLLLLLLLL""""""ŒLLLLLLLL""""""""ŽLLLLLLL""""LLLLLLLLL‘’LLLLLLLLLLLLLLLE“”•–L—L˜™š›œžŸLLLLLLLLLLLL ¡LL¢£¤¥¦L§¨©ª«¬­®¯L"""""""""""""°""""""""""""""""±"²LLLLLLLLLLLLLLL""""²LLLLLLLLLLL³L´µLLLLLLLLLLLLlllllllllllllll¶       !"#$ %& ' ( ) *+ ,- ./ 0123456227 8922222:;<=>2 ?22222@AB2CD2EFG2HIIIIJIIIKLM22NOPQRSTUVWXYZ[TU\]^_`abUcdeYfSTUghiYjklmnop_qrsUtuvYwxsUyz{Y|xs2}~Y€‚2ƒ„…I†‡22ˆ‰ŠII‹ŒŽII‘’“”•2–—˜™ š›œII22žŸ ¡¢£¤ ¥22¦222222222222§¨22§22©ª«222ª222¬­®2¯22222°±2222222222222²2³´2222µ¶·¸2¹2º·»222¼½¾¿ÀÁ¿22Â22Ã22Ä2222Å2–ÆÇÈ2ɰ22ÊËÌÍÎÎ2Ï222ÐÑÒ¿¿ÓIIIIIÔ22ÕÖŸ×ØÙ2ÚB22ÛÜ22ÝÞßB2àIIIIáâãä åæç è éê ë ìíììíîìïðððñòóôõö÷øùúûüýþÿI      ÎÎÎÎÎÎÎÎÎÎÎII   ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎ ÎÎ!ÎÎÎÎÎÎ"Î#ÎÎÎÎÎ$% &ÎÎ'()*+,ÎÎÎ-¯IIIIIIIIII . /01 23 422256278888 9:;<IIIIÎ=ÎÎÎÎÎÎÎÎÎÎ>I?@ABC‡2222D±2222EF2ɇ2222GH23ÎÎ2ÎIJÎKLÎÎJÎÎLÎÎÎI222ÅÎÎÎÎ2222–III2M222222–ÎÎÎ22àN2OI PQ R2222STUVW XYZ[IIII\]2^_222`a22bc¿ dB2e2fg2–M22hijII22klmn2o222pqrstuv8IIIIIIIII22w¿22x2y22Êzzzzzzzz{{{{{{{{222222É222222|II}~€222222‚ƒ„22222…I2222†22ÃII‡ ˆé‰Š‹Œ2222222Ž‘’2“2G”•–—˜2«™ÉÉII22222223š  ›   œ?IIIÎΞ2–222eII2GŸ2 III2¡22¢£II ¤ 2222É¿IIIII¥22¦2§II2¨2©IIII222ªIIII«¬2­®¯2°222±2²2³2222´IIIIIIIII µ¶22·¸¹ºIÙ22»¼2´¿½2¾¿ÀIIIÙ22Á¿II22ÃÄ¿III222222GI      ÅÀ22GIIIII222´IIII2222°ÆËÇÈÉIIIIIIÊIIIIIIIÎÎÎÎÎÎÎ>ÎÎËÎÎÎÌÍÎÎÏÎÎÐIIÎÎÎÎÑIIIÎÎÎÎÎ Ò Ó ÔÕÖì רÙÚÛ Ó ÜÝ Þßàá â Ó ÔÕ ì ×á â Ó ã äåæç è éêëì í î ïðððñ2òóôõö÷øÊùÊIIIúÎÎ?ÎÎÎÎÎÎIû##IIüÎIÎÎÎ?ÎÎIIIIýÎþÎÎÿIIÎÎÎÎÎÎÎÎIÎÎÎÎIÎÎÎÎÎÎÎÎÎÎÎÎÎÐÎIIIIIIIIÎÎÎÎ IIIÎÎÎÎ>IIIÎÎÎÎÎÎÎ222227II222°22222ÉIIIIII I       I{{{{{{{    ! """""""" """ "  "  " " " "" # $$%"&%"""""""" "&  " "" '((((((((())(((((()))))))((*)))**))))))))++++++++ * ,-.,,)/ 00 " 1 "   2" " 3++4 """""" ,,,,1 05678,9:++++++++++++++;<=+<,,,,$$$$$$$$$$$$$>,,$?.,,,,,@@A BC+++++=AD$$$$E++$F$$$$$$$$$G+++H3++IJK++$$LMNE$$$$$$$+++++OP$$$$+++++F,,,,,,,$$$$$$$$E++++(Q,,$$$++J++++J+J++,.$$$$E+,.,,,,,,,,>$$$$$>,,,+++++++++++++O+R$$$$$$$$$$$RFST+++RSTSE+++$$$$$+U$$$P$$$:SP$$$>P>P$$$$$$$$$$>$$$>>,$$,FST+OVWVT>,,,V,,$P$+,$X,,:RP$$>,P>$P>$,OSTO,:O:+,:,,,P$>>,,,+$E,,,,,:RP$$$$P$P$$$$$$>$P$$,FST++:RVT,>,,,,,,,B,,,,,,,>$P$$,FTT+OVWVT,,,,R,,$PM,,,,,FP$$>,$>$$,P>>$,P>,$>,$$$$$$,,SRW,SWST,>,,V,,,,YCCXZ,,VSP$$$>$>$$$$$$$$$P$$,P+RSW+O++,,,:O$,,,,,,,Y,SP$$$>$$$P$$,FTSSWRWS+,,,VW,,,>P>,,,,,,$$$$$>PST+OSWST>,,,V,,,,,[$$$,SP$$$$$$$$>,$$$$P$$$$P,$$$>,O,VS+OOSSSS,S.,,,,,P$$$$$$$E$+++O,9$$$J+++=,,P>>P>>P,,,$$P$$$P$PP,$P$E$+++:F,$$>Q+++,,$$LC\\C+CCC333S$$$$P$$$$$$$$$>,:++++++R++=+$$E+++++:+++++++++OCCCCKCCZC\C.,,$$$$$]T+R+++TRTF$$$S+$$+FS^]SSS$E+F$$$$$$RTRSST]STC 1,,1,$$$$$?D$$$$$>$$,$$$>>$$,>$$,$$$>>$$,$$$$$$$>$$$$$$$$$>:+_`,CCCCC,,,$$>,,,,,a$$$$$$$$$$$$$?Gb$$$$$$$$$$$$cd,$$$$$?ef,,,,,,,$$$$$$>$$+O,,,,,$+=.,,,,$+,,,,,,>+,,,,,,$$+T+++SSSSRT+++++UBE,,,,,,,g<+A$h$$$$$$$$$$,,,,$$$$E>,,$$$,,,,,+RSTRS,,SRSST+,,Z,$$$$$$$,$$$$$$,,SSSSSSSS^$$$S,,,`,CCCCCCCCC$$$ERT,$$]R+++ORRT+++RSST++++O:U,++^$$$$$$$R++RRSSR^$$$,,\CCCC3++++CCCCZ,+^$$$$$$]++S+TS$$$$R+STT+S,,,,$$SSSS++++S+,7,P$$$$$(((,,,,+=++++++R+++F$E$$SF>,,,,(((((((--i((+++O,,,,,,,,,,++   , ,1111,jjjjk lm)k l), n) o),k lpqqqqqr@@ssstutuv@@wxyz{|} {~@@A@@@@@,|€|d((((((Q,,,++++++‚4ƒ4ƒ+++++O,,,,,,,C„C…C"  …C2 CCC„„„ † #$'C 2C‡eeeeeeeeeˆ‰eŠ,,,‹CCCC‹C‹CCC‹CCCCCCCC‹‹CCCCCCCCCCCCCCCCŒCCCCCCCC‹CCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,CCCZ,,,,CCCCCZ,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[CCCCCCCCCCCCCCCCC|Ž|Ž‹, 0k """" "( ‡CC…"‘+ ,,7_6,,6,$$$$,,,5.,,,,,,:$$$>,,,,$$$>$$$>ttxytgttUs,,CCCCC[CCCCC,,,,,CCCCCC,,’“C”•–eeee++S—((Ce˜?C$$$>:™šD$$$$$?(D,,P$$$$$$$$$$$$>CCCCCCCCCCCCCZCCCCCCC›$$h$$$$$$$$$$$œ$,, E4+++++U ,,,:$$$eeeee+,,,,)))š(((()  -""" *ž"k ,,,,,, 0,,,,,,(#$$$F$F$E$$$]TRCC,,CŸ,,,$$,,,,S$$$$$$$$$SSSSSSSSO,,,,+$$$G,,$$$++++$$$E+++++S,,,,,7$ES++SRS 5,,$$$$E++RTRTO,,,,$E$$$$R,,D$$LC],,F+FEF$$+E>,,,,,,,,,,,Ph$$$$$]+Sh¡O,,,,P$$>P$$>P$$>,,,,$]TSR T,$$,,,,,,$$$>,P$$¢¢¢¢¢¢¢¢££££££££$$$$$,,,k,,,,,6,,PF$$$$¤$$$$$$>$$>>$P>$$$$$$)))))))),,,,,,,,P$$$$$$$$$$$$$,$$$$$$$$$$$$$Ÿ,¥},,,¦§}¥}z¨.”}©B,,$$>$$$$$$$$$$$>N7|}$$$$$D$$$$$$$$$$$$$$(,$$$,$$$,$$$,$>,ªX‹Z,,,,N@C,$$$$$$P$$$$$$>$P.,«,[CCCCeeŠYCCCCCCCC`,,CCCCCC3,,,,,,,“$$$$f,,$$$$$$$7$$,,$$$$¬ee,,,,, $$$,>$$$$$$P>,>P$$$7$$$,7$$$$$,,7$$$$,,,$E+:O,,++$$P$P$$$$$,,+O,:,,,,.,,,$$$$$$­$$$,7$$$,$>,,$$$$>,,,`T^$$$$$$$$$$+++++++=,,ST+RT=®,,,,,,,+F$$$$$$$$$E++T+++O,,,,,,$]S++++R^$?.,,,$$$$$ETS+++T,,,,ef,,,,,,]SSSSSSSSSSSSSSW,,,,,,,:+I(((((($,,,,,,,CCCZ[CCCCC¯T+C¯SS°@@@±+++K3+++CCCCCCC++CCCCCCCC,C+K,,,,,,,,,,,,  k 0 ,0101 0 666 1 01 0 0 1 0 00, 0 , ! ! ! ! ! ,$$P$$$$$P>>PP$$$$>$$PP,,,>,PPPP$P>>PPPPPP>>P$>$$$>$$P$>>$$$$$P$$P$P$$P$$,,,,,,,[CCCCCCZ`,,,,,CCCCCCZ,,,,,,CCCCZ,,,C,,,,,,,Z,,,,,,,CCC[CCCCCCCCCCZ,CCZCCZ,,ZCCCCCCCCCCC[CZ,CCCC,,,,,,,,,[CCZ,[CCCCCN,,,,,,,@@@@@@@@£££££££,                        !"################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"""""#$%&'()*+,-./01223345678899:;<=>>?@AABCDDEEFGHIJKLMNOPQRRSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWXYYZ[\]^_`abcdefffffffffffffffffffffffffffffffffffffffghhhhhhhijjjjjjjjkkkkkkkkkkkkkkkkkkllllmnnnnnopqrstuvwxyz{|wwwwww}w~€ww‚wwwƒwww„…†‡wwwwwwwwwˆwwwwwwwwwwwwwwwwww‰‰‰‰‰‰‰‰Šwwwwwww‹‹‹‹‹‹‹‹ŒwwwwwwwŽwwwwwwwww‘‘wwwwwwwwwwwwww’’““”w•w––––––––wwwwwwwwwwww——ww˜™šš››œœœœœœžŸw                             ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¥wwwwwwwwwwwwwww¦¦¦¦§wwwwwwwwwww¨w©ªwwwwwwwwwwww««««««««««««««««¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬  !!!!!!!!""""""""""######$$$$$$$$%%%%%%%%&&''''''(((((((())******++,,--..////////0000000000011111222223334444445566777777777888888889999::::;;;;;<<<=>>>????????@@@@AAAABBBBBBBBCCCCCCCCDDDDDDDEEEFFFGGGHHHHHIIIIJJJJJJJKKKKKKKKLLLLLLLLMMMMNNOOOOOOOOOOPPPPPPPPQQRRRRRRSSSSSSSSTTTTTTTTTTTTUUUVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\]]^^^^^^^^___`````aaaaaabbccccccccddddddddeeeeeeeeeeeeeefgggghhhhhhiiiiiijjjkkkkkklmmnnnoppppppppqqqqqqqqrrrrrrrrrrrrssssttttttttuuuuuuuuuvvvvwwwxxxxxxxxxxxxyyyyyyzzzzzz{{||||||||||||||}}}~€€€€€€‚‚‚ƒƒƒ„„………………††††††‡‡ˆˆˆˆˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’’’’’’’“““““”””””””””””•–—˜˜™™ššššššššš›››››››››››››››œžžžžžžžžŸŸŸŸ     ¡¡¡¡¢¢¢££¤¤¤¤¥¥¥¦¦§§¨¨¨¨©©©©©ªªª«««¬¬¬¬­­®®¯¯°°±±±±±±²²²²²²³³´´´´µµ¶¶·····¸¸¹¹¹¹¹¹¹¹ººººº»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÆÆÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÈÉÉÊÊÊÊÊÊÊÊËËËËËËËËÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ   !"#$%%%%%&'()*+,-./0123456789:;;;<=;;;;;>;??;;;;@ABCDEFGHIJKLMNOP;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHQHHHHHHHHHHHHHHHHHHHRSSSSSSSSSTUUVWXYZ[\]^_`a bAAAAAAAAAAAAAAAAAAHHcdefgghijklmnopqArstuvAAAAAAwAxyzA{A|AAA}AAA~€AAAAAAAAA‚AAƒƒƒƒƒƒ„A…AAAAAAA††††††††‡AAAAAAAˆˆˆˆ‰AAAAAAAAAŠ‹ŒAAAAAAAAAAAAAAA;ŽA‘A’“”;;•;–AAAAAAAAAAAA—˜AA™š›œAžŸ ¡¢£¤¥?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{.|}~~~€..‚ƒ„…†..‡‡‡‡ˆ‡‰Š‡ˆ‡‹‹Œ..ŽŽŽŽ‘‘‘‘‘‘‘‘’’’’“”’’“’’•–—’’’–’’’˜’™’š›››››œžŸ    ¡¢£¤¥¦§¨©ª«««««¬­­®¯°°°°°±°°²³´µ¶¶·¸¹º»»¼»½¾««¿ÀÁÁÁÂÁÃÄÄÅ.....ÆÆÆÆÇÆÆÈÉÉÉÉÊÊÊËÌÌÌÍÎÏÏÏ....ÐÑÒÓÔÕÖרÙÚ Û ÛÜ Ý ÞÞß àáâãäåæ.çèéêëìí.æ.îïïïïïïïïðñ..........òòóòòóôôôôôôôõŽŽööö÷ø’ùúúúúû....üýüüüüüþüüüüüüüüüüüüüÿ.û    ‘‘‘‘  ì‘ ‘üüüÿüüüü........ !!"ñ###$%%%%&'2()))**+‘,----./..000123455556789:;ú.........88<=‘‘>‘?‘‘@üüüüüüAüüüüüüB..CDEFGHI.JK..LñÙMNOPîQR‘ STUVWXYZ[[..XXXXXXX\]^ _û...`abcccd..efghi...jkllmn..ooooopppqrs.....tuuvwx..yz{|....}}~....€‚ƒ„…††‡‡‡ˆ‰Š‹ŒŽ.........1‘.’’’’“”•–———˜™...šššš›œ..žŸ...              ¡.      ¢£¤¤¤¤¤¤¤¤¤¤¥.....¦....§§§§¨§§©ª§......«.......¬­®¯°±².. ³...í´âµ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈ...GûìäÊîî..æäûæ....ËÌæÍ´..ÎÏðìÐ.Îä½Ñ²ìÒ........ÓÔ...¬...üüüüüÕ..üüüÖüüüüüA......×..      !!!!!!!!!"""""""""""""#$$$$$$$$$$$$$$$$$$$$$$%&&&&&&&&&&&&&&'(((((((()*(((((((((((((((((+(((,-,---.,.,----------.---..------.,.,-.,-,-------------/0/001/1/0000000000100010/101001/1/0//011000000002323333232333333333343334323333333232343333333356566675756666666666766676566666675756665666666666668988:8:889::89:8:88888888:8:88:98888888888:;<;<<<=<=<<<<<<<<<<<=<<<<<;<<;<<<=<=<<;=<<<<<<<<<<<<>?>>>@>@>>>>>>>>>>>@>>>>>?>>>>>>@>@>>?@@>>>>>>>?@ABAAACACAAAAAAAAAAAAAAAAAAAACBAAACACAACBAAAAAAAAAABAAADEDDDDDDDDFDDDDDDDDDDDDEDDDDEDDDFFEDDFFDDDDDFGHHHHHHHHHHHHHHHHHHHHIHHHHHHJKKJKKJLLJLLLJLJJLJLLLLLLJLLLKKLLLLLLLLLLMMMMMMMMMMMMNMMMMMMMMMONMMMMMMMMMMMMMOMMMPQORRRRRRRRSSSSSSSSSSSTTSSSSSUSSVVVVVVVVWWWWWWWWWWWWXWWWWWXXWWXWWWWWXXWWWWWWWWWXWWWWWWWWWXYWWWWWWWXWWWWWZZZZZZZZZZ[\\\\\\\\]]]]]]]]]]]]]]^_____________`_abbbbbbcbbbcdddddddddde ffffffffffgggggghghgiiiiiiiiiiiiiiiiiiiijkjjjjljjjjjjjjjjjjjjjjjjjjjjl\\\mmmmmmmmmmmmmmnmmmmmmnmmmmmmooooooooooooooooopqqqqqqqqqqqqqqqqqqqqqqqqrqssssssssssssssstttttttttttttttuttttttuvttttttttttttwwwwwwwwwwwwwwwwwwwwxyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{|{}}}}}}}}yyyy~~~~ €‚ƒ„       … „  †††††††† ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆ ‰ ŠŠŠŠŠŠŠŠŠŠŠŠ‹Œ‹WWWXWWWXWWWXŽV‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“~”‘•––––––––––––––––––––—•–˜™VVVVVVVVVVVVVVš›VVVVVVVœ–––––––––––žŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ŸŸŸ ¡¡¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¤¤¤¤¤¤¤¤¤¤……¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¦¦¦§§§§§§§§§§¨§§§§§§((((((©©©©©©©©ªªªªªªªªªª«VVVVVV𬬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬­­­­­­­­­­­®­­­­­­­­­­­­­­RRRRRR¯¯¯¯¯¯¯¯¯°±¯¯²²²²²²²²²²²³YWWXYWWXYWWX²²²²²²²²²²²²VVVVVš™VVVVVVVV…´ ––––––––––––VVVVVVVVVVš µµµµµµ¶µµµµµµµµµµµµ·µµµµµµµµµ·µ¶µµµµµµµµµµµµ·  ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¹ºººººººº»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÆÆÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÈÇÇÈÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉËËËËËËËËËËËËËËÌÍÍÍÍÍÍÍÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÓÑÑÑÑÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÓÒÑÑÑÑÑÑÑÑÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕ×××××××××××××××ØØØØØØØØØÙØØØØÚÚÚÚÚÚÚÚÚÚÚÚÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞààààààààààáàààààààââââââââââââãâââââäääääääääääääääääåååååååååååååååæåæååççççççççççççççç褤¤¤éêêêêêêêêêêëêêêêêêêëìí ~        ´´´´´´´´´´´´´´´´´´´´´´´ î      žž##))77)))) BBBRRR___ )) ***+++,,---  ...///88866NNNN>>>CC]]DDDEE)))559997::::$$$$!!!!)!""""##"$%%%SSFFTT;;AAGGGHHIIIUUMMMOOOOVVV0000JJJKKK&&&'''111<<((22334444WWW@@@LLLbbaa====XXPPPYYZZZ[[[^^\\eee```dddff???QQQTcccc"!!    !"#$%&'()*+,-./01234567899999:99999999999999;<=>?999@ABC9DE999999999999999999999999999999999999999999999999999999999FGHIJKLMNOPQRS99999999999999999999999999999999999999TUVWXYZ[\]^_9`abc999999d9efg9h9i9999999jklm999999999n999999999999999999o9p99999999999999999999999q999999999999999999999999999999999999999r999999999stu999999999999999999999999999999999vwx999yz{|}~99999999999999999999999999999999999999999999€999999999999999999999999999999999‚9ƒ„9999999999999999999999999999  !!!"#$%&'()*+,-./01234'562789:;<=>?@ABCD;EFGHIJAKBLD;MNOPQRSTB;UFVWABCD;UFGPXJAYZ[\]Z^_`aSB;;bcd`eKAf;;bFd`egAhf;idjIAkfklmnopqI=rpstrWurvwdxyz{=rX|}t~€‚[[[[[[ƒC ZW„„…†<‡ˆr‰rŠ‹‡‡SŒur‡Ž=Grr‘r{‡’@“42‡”4‹•–—=<‹‹‹‹˜‹™š›‘šœžŸ ¡¢£¤¥Œ¦kl§¨©ª«W¬K­®¥I¥¯]°±±±±±±±±±±±²ª‹ ±±±±±±±³±±±±±±±±±±±‹´•µIu¥k¶‘ ·¸'‘yr¹42t‡>'Œ¥r@=¸ºr»}¼Q'½¾¾¾'¿r‘À‘ÀÁ!ÂÃÄÅ!KÀ‹k‘Æ=ÇÈÉÊËÌ ͱ±±±±±ÎkkkÏÐbÑ‹‹ ˆW ‹‘§‹r‹;Ò‹‹K¬Ó? @A0(?=:B<C:DE A@D(D0:? -0 D A -0> F?GDB(HI::JBD 9IF?:D0=IDK: 5I5LB?MN I ),  O H(,45PQQ  RSTUV WXW%Y%%@ @  @)Z[\]^^_^^_1`2 aa) @ :?IDb (:@ cd!!"!efdgX Whi jklm^no 29 (p,]:q%r(D:DI A  ?@ABC DEFGGGGGGHHHHIJJJJJAKKLMNOPQRSTUVWXYZ [\]^_`abcdefg hihjkhlhimnopqirs^Gtuvwxyz{|}~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€€€‚€~€€ƒH„JJ…†d-‡Fˆ‰Š‹d[ŒŽ[v‘’“”•h–—˜™Kš›            !"#$%&' $()*%%"+,-./  / 0$   " 1 $ " 222233333344444456-)7.)-&89: , .;1);<=65>6?6--+ 1$ @A  ""BC>----222D+6; C EB6FB#GHHHHHHGHHHHHHGHHGHHH3IJ4444"  K.  B+5&----------LM=NO PQQQQQQ             !"#!!$!%!!&'(!)*!!+,-./01234!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!56789:;<=>!!!?@ABC!!!DE!!!!F!!!!!!!!!GH!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!J!!!!KL!!!!!!!!!!!!!!!!MN!OPQR!!!!!!!!!!!!!!!!!!!!!!S!TUV!!!!!!!!!!!!!!!V!!!!!WX!!!!!!!!!!!!!!  !"#$%&'()*+)),-./0))12345677879:;<=>?@ABCDEFGHI>GJKLMNOPQRISTUVSWXYZ[\]^_`7abc7defghij7)klmnop))))))))))q)rst)u)vwx))y^))))))))))z{))|}~€)‚ƒ„))…)†)‡ˆ‰Š‹)Œ7Ž)‘’77“”•–—)˜)™š›77œžŸ ¡¢£¡¤¥¦§¨©ª«7¬­®¯°±77777777777²³77777777777´µ77¶·77¸¹7777º7»¼½¾¿ÀÁ)ÂÃÄÄÅÆ777777ÇÈ^)É^)pÊË))ÌÍ7Î)))))‡77))))))Ï7))))Ï7ÎÐÑÒÓÔ))ÕÖרÙÚ7ÛÜÝ)Þßàá2âãˆ:äå7)æçè)éêëìí7777)î)))))ïðñ)))ò))ó7ôõö))÷ø))ùÎ)ú)ûüýþÿ)))   7)))Í77)y777 7777ˆ) 7Î7)7)ƒ77‡77777‡ó77)77ˆ7777)‡‡7777))77777–O–– !7–ä"77777)#ƒ7)))Ì7777)))$7777)Ì777777)%777777))&'(777)7777777777*+,7777-77777./0123456789:./;1<=>5?@ABCD½EFGHIJKLMN77))))))Ã7)y))))))7777777OPPP7777Q     !" #"$!%&$'($$)*+,,,,,,,,,,,,-.'/0 1 2!"3 4,5 6789,,,,,,,,,,:;:$$$$$$<$=>?,,@A$$$$$$$$$$B,,,,,CDE$$$$$$$$F,G,HIJKLMNO$$$$$$$,,,,,,@P$$$$$Q,,RK$$$$$$$B,,)S$$$$$QT,,UUV$$$$$$UW$$X,,,,,,@,$$$$$$$$$$$$$QY,,,,U,$$QZP$P$9P$LL$$$$$W$+()Y,[[\]^Q_)9P<`L$$$$$W$Wa)I@][VbP+_Jc9P$^^$$$$$W$WP)Y,::VXQ_,[[Vd^Q_6eP<(W)aW`X<($$)d@dIVX]_9P$WW$$$$$W$$P)f,IIV;)dP$WW$$$$$W$$P)Y,IIV;gQ_a$$$$$$?@ABCDEFGHIJKLMNOO     !"#$%&'()*+,-./01&/234567891:8;<:=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdMefghijklmnopdqrsturvwxyz{|}~h€jQ‚ƒ„„…†‡ˆR‰Š‹DdrŒŽY‘’“”•^1–c—M˜…ƒ™šj›œž“Ÿ i¡¢£¤¥¦r§¨©Mªj«¬­®DZM¯j“r°r±²dd¢³´^Mdd—~µ‘ ~—¶d‹·‹ ¸j¦¹º»¼½¾¿ÀÁÂRºº€€ÃÃĽůÇÈɃZrþÿÿ ÿÿÿÿÿÿÿÃÿP ß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿ¿¶ÿÿÿÿÿÿÿþÀÿÿÿÿïþáœÿÿàÿÿÿÿüÿÿÿ0ÿÿÿüÿÿÿÿýðÿÿÿÿïÿßáÿþþîŸùÿÿýÅãŸY€°î‡ùÿÿýmÇ^?î¿ûÿÿýí㿟À°ìÇ=ÖÇÿÃÇîßýÿÿýïãß`ìßýÿß`@ÿÿÿçß]€üìÿüÿÿû/€_ÿ ÿÿÿ –%ðþ®ìÿ;_ ðÿþÿÿÿþÿÿÿþÿÿÿÿÿùçÁÿÿ@0¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿ‡ÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿÏÿÿ€ÿÿÿÿÿÿÿÿ?ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿþÿ€ÿÿïÿïÿóü¿ÿàüÿÿÿ?Þoÿÿ????ÿªÿÿß_ÜÏÿÜ€ÿ„ü/>P½ÿóàCÿÀÿÿÿÿx ÿ€ÿÿ€àþ>ÿÿààÿÿÿÿ?þÿÿÿÿÿ ÿðÿÿÿ€€ÿüÿÿÿÿyÿÿ»÷ÿÿüÿÿÿÿ÷ÿÿ?ÿÿ8ÿÿ<~~~ÿÿøÿÿÿ?ÿÿÿÿÿøàÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþ?ÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷–þ÷ „ê–ª–÷÷^ÿûÿîûÿ        !"#$"%&'()*+,-./0123456789:;<=>?@ABCDEFGH=>I@J673?@AB%&6CDþÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®¤ªJUUÒUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿ„8'>P=À Àÿÿê%À(UUUUTUTUUUjU(Uÿÿÿÿðÿÿ?ÿÿÿÐdÞ?ÿÿÿ°çß{_üðÿÿ?ðÿÿ?üÿÿðÿÿÿ       !"#$%&'()*+,-./01234567//$$889þÿÿ ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿïÿÿÿÿ Ï<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿ¿ ÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ€ÿ„ü/>P½òàCÀÿÿÿÿÿÿÿÿx ÿ?ÿÿÿüÿÿÿÿxÿøÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷    !"#$%&'()*+,-./0123  !"#$!%&$!'# ()#*+,-#(.#"#/0123456789:;<=!>??@@ABCDEFGHIJKL*MNOPQRSTUVWXYZ[\]^_`abcdefghiRjklmNn4opqrstudvwxyz{|N}~l,€‚ƒ „~N…†N‡ˆ‰Š‹Œ Ž€@@¡ÿÿÿÿÿÿÿÿ0°øþÿÿÿÿ¿¶ÿøÿÿÀ¿ÿ=€ÿÀÿø?Àÿÿ?ðÿÿþ!þ  †9#¾! @ ÀÁ=`@0\òÀò@? þßàÿþÿÿÿ@àýfÃd à °?@þ x‡€ @åøŸ€Ðø< @£ðÏ?÷ÿý!ðÿÿÿøð ààà`ø|ßÿ€ÿÿÿ0€€€€ <>~p €÷¿€D`ÿÿÀ?€ÿÈ~fÁ 0X !üÿÿÿ$ nð‡ÿx&€ïÀ(¿€ÿÿ€øÿç<ÿÿ        !"#$%&'()*+,-þÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿÿ@ Àÿÿê%À(UUUUTUTUUUjU(Uÿ       !"#$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢`[Uµªª-ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿÿßPÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ       !"#!$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢ÐVUµªª+ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿß@ÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ        !"#$%&'()*+,-./01þÿÿ ÿÿÿUUUUUUUªªVUUUUU«ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzU E@×þÿû€cUUU³æÿÿÿÿÿÿTUU«*UUUþÿÿÿ€¿ UULÿ?ÿÿ?ªÿÿÿœœœ@ Àÿÿê%À(UUUUTUTUUUjU(Uøÿ      !"#$%&'()*+,-./01þÿÿ ÿÿÿÿÿÿÿÿÿÿþÿßÿ÷ÿóÿ³ðÿÿÿýÿüÿÿß i‹&  Ï8@×ÿÿûÿÿÿÿÿãÿÿÿ·ïüÿÿÿþÿÿÿþÿÿÿÿ¿ "ÿÿÿOÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ@ @ÀÿÿÿÿÿÿÿÿÿÿmÀx ÿ?ÿÿÿüÿüÿÿÿþÿ8ÿøÿÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMM     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžkŸ ¡^¢y£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ –%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿøÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOP    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨•©Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß<À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿþàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_Ûÿÿÿøÿÿÿüÿÿàßÿüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNN     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžk kŸ ¡^¢ky£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß8@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ–%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿàÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿŠªÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQ    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨N©•Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß8À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿæàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_ÛÿÿÿøÿðÿÿÿÿÿüÿàŠªüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ      €€0xø|ÿÿÿøÿÿÿÿ    !"#$%&'()*+  !"#$%&'()$*+,-./0123456789::;;<=>?@ABCDE#FGHIJKLM NOPQRSPTUVWXYZ[\]^_`$a&bcdeaFfgFhijklmnÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿøÀûï>ðÿÿþ!þ P €†9#¾!Ð À@ €ÀÁ=`D0`„\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8‡€ @åøŸÐ< @£ðÏ÷ÿý!ð0ÿÿ€€ü€÷?D`ÿÿÀ?€ÿÈ~fÁ0@ ! nð‡ÿx€ïÀ(¿€ Ãøç<             !"#$%&'()*+,-./012222222223456789:;<222=>?@A2B2CD2222E2FG222H222I2222JK2222222LMNOPQRS222222T2UVWXYZ[\]^_2222222_22222  !"#$%&'()*+,!-./0123456789:;8<=>?@AB CDEFGHIJKLMNOPQRSTUVWXYZ[\Z]^_`abcdefghZijklmnopdqrstuvwxyz{|}~€‚ƒ„…†Y‡ˆ‰ Š‹ŒSŽ‘ˆh’‡ “”•‹Y–h—˜™š›fœžŸ f¡¢£¤Z¥¦§¨©ª«¬­®–¯°[±²³´µ¶·¸¹µº»Z ¼½¾¿ÀYÁÂõZZ]–ÄÅÆÇÈÉÊËÌ͈ÎÏÐÑÒÓfÔvÕÖרÙvÚ×ÛÆÜÝÜÞßàáhâãäåæŽ`€çèéêëìíîéïðñòóôlˆõöƒ‹lY÷øYùúZˆû]Óü–·ýþÿˆŽ\ÿÿÿÿÿÿÿÿßÿÿÿ|ð×ÿÿûÿÿÿüÿÿÿþÿÿÿþþÿÿÿÿ†@IÿÿÿÀÿÈÿÿÿþÿÿÿ?@`Âÿÿÿ?ýÿÿÿàÿÿ?ÿðÿÿ?ÿÿÿÿAýøÿÿÿÿÿÿëÞÿóÿÿþìŸùÿÿýÅ£Y°Ãÿÿè‡ùÿÿýmÃ^Àÿè¿ûÿÿýíãÃÿÿýí#°ÃÿÿèÇ=ÖÇÿƒÆÀÿÿîßýÿÿýï#Ãÿÿìßýÿÿýïc› @Ãÿÿÿÿ§Á]Ãÿ?þìÿüÿÿû/ÿÿ €€ÿ–%ðþ®ì _ÿóÿÿÿüÿÿ_ýÿþÿÿÿ€ À¿ßÿÿ™ÿÿÿ<þÿáÿ›ßÿß¿ ÿÿÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿcÿÿÿßÿÿOÀ¿ðÿÿÿÿÿÿÿÿÿÿÿÿ?xûñÿÿÿÿ?ÿÿÿÿÿÇÿÿÆÿÿ¿àÿ?ðÿÿÿÿÿ/èûÿÿÿðüÿÿÿÃôÿÿ¿\ ðÿ0øÿãÿÿÿÞoÿÿ????ÿªÿÿÿ?ÿÿßÿßÿÏïÿÿÜÿÿÿÿ€ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ€ÿÿÿÿÿÿÿÿûÿÿÿøàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿ»÷ÿÿŸÿÀÿü?Àÿÿ €ÿÿ7ìÿ¿ÿÃÿ÷/ÿóÿÿb>øÿÏ?~~~ßÿøÿÿÿ?ÿÿø ÿÿ_Ûÿÿÿøÿÿÿÿÿüÿÿÿ?ÿÿÿ÷ÿßÿüüü0ÿïÿÿÿÿ·ÿ?ÿ?‡ÿÿÿÿÿÿÿÿÿÿÿ¿ÿ?ÿ?ýÿÿÿÿ¿‘ÿÿ¿ÿÿÿÿÿÿÿƒÿÿÿÀïþÿÿÿÿ?þÿÿ?ÿÿÿÿÿýÿÿÿ€?üÿÿÿ‡ÙÿÿÿÿÀÿÿÿ?€ÿ×@ÿÿÿÿÿÿøÿþÿÿ_<ðÿÿÿÃÿÿ#ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿÿÏÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿþþÿþÿÀÿÿÿÿÿÿ¿ÿßÿÿÿøáÿ?      €@@> ÿƒ€À|À0      @@?€    @€ „ÿðà„            !"#$%&'()*+,-.    !"#$%&"'(")*+,-.PŒ@€ˆÿÿ0 á þ`8p<ìøÀ0€@àøÀÀ€à€÷€ü€?`     !""#"$%&"'()""""""""""*+,##--../"&01234@'3@``ÿbø„ü/>³ûñààó¶>Ãðÿ?ë/0°ÀðÁŒ”``Àÿøÿÿ0 PÿÿÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿÿÿ÷ÿÿÿÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿ~~ÿ~~ÿ~~     !  !"!#$%&'()*+,-. /012345678+9:9;*<=>?@>ABCDEFG5HIJ5@5KL#M ÿ¿¶ÿøÿþÀž!ÿÿÀÿÀøïðÿÌÿßà ÀŸ€‡#¿ŸÀÇ€ß`߀€_ÿ ò òþÿàÿþÿÿÿøyÀÃ…|0€Àÿÿÿÿ€àþÿàÿþ3€ÿðÿ?ÿÿÿÿÿðøðÿÀ€ÿþ0Aø ø@nðÿ?ÿøÿø?ÿÿÿ   Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?      !"#$%&'(  !"#$%&'()*+,-./0123456789:&;<==>?@ABCDEFG)HIJK@ÿÿÿÿÿÿÿÿà00øþÿûÿÿ¿ø‡€aÿÀÿø?ðÿÿ  €_ ÂÜ@€€¿ þ àŸø À?ÿ!ðÿÿðÿà ààà`€€ü€°€ÿÿÿx@0À€ÿÿ€ãøç<     €@€@ >`p €  ÿ ðÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿ0ÿÿÀÿÿÿÿÿÀ@€`€€0ÀÀ Àó ÿÿÿûÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀ€šÿÿÿÿÿÿÿÿÿÿÿ? €€0 ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿ    € @@  À À À À`@€€þ         !"#$%   !"@€P€0 „@`ÌÀ0€ÀˆÀ€àÄ€`8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ> À   þÿüxþZCˆ€ÿÿÿÿþÿïÿÿÿÿÿÿ?ðÿÿÿÿÀ`                    !"#$%&'()*+,-./0123456784449:44444;<=>?@4ABCDEFGHIJKLMNOPQRSTUVWWWXYZ[\]^_``a`b`c`````d```efghijklmnopq````````````Wr``stuvwxyz{|}~€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€    !"#$% &'()*+,- ./01 2 34 156 372 86 39 1:2 ;4<1 = > ? @AB1C 3D 1 4 1 EF GH IJ K L MNOP< QR STUVW Q X  YZ [ [ 1 1 \]^ X_ ` abc d e fghi j= kil m nl op qrs to uvwwxyz{|}~€ T‚ƒ„…† ‡ˆ‰ Š‹Œ Ž ‘’“X ”• – — ˜‹‰ —™š› œ ‹ x  ž ’Ÿ   d ¡  Œ w –¢ – l£ ¤ ¥ ¦§ ¨ s l © ªl - « ¬­® ¯2 D< ° ±²³´Xtµ¶·¸‰ ¹º» — W¼½¾¿ÀÁ2 Ât‰ l à - ÄÅ l Æ ÇÈ –- ÉÊË Ì Í Œ Î ¡ ‡ ÏÐÐÐÑ—‹ÒÓ’’ Ô … Õ“‹Ö Ò×ØÙ‹Ú Û ‰ ‹ Ü             ! """"""#$%&'((((((()##*+,((((-./012(3((((-""456""7 8"""('9 :;<;=< > = ;<; =?  @ @A= ;>E @ F  : >G =9 9=B;   HI<9E <<; ; <; :@ = =  J >; B :< = KL = 9; : <   A :9G<;A E9;  >B :H > 9E;= ; 9 M   NNOP QRST U VWXYZFZFSSSSF   M[\   [ ]   F F    F    ^ >   _ F F `a :: @ b > >; <9@@  ;EA;> =;= c""d"(((e(((fgh ijFk (((lmn Fop[ """q!"""r4""s #######t 9@ <; >9 =B  uv9< >wx [ yz((( F F{  F     |                                                   !"#$%&'(  !"#$%&''()*+,-./0123456789:;<=>?@A.BCDEFGHIJKLMNAOPQFRSTUV   !"#$%&''()*+$,--.&/0012+34#5678977:;<=>?@ABCDEFGHIJKL0M;NOPQM0R6M STSJ5 UVL9WX5YZ[9N\]91^_`a11;1b@^JMcd9&N;e5Lfg^h5^Mijklmbn0&1&9222223----3+-----))----))-------222262---222--222----23--2455455422-2222-222.-22--2.12 2- 22--2-22-22222-22-2-22--2--2-2-2222222222---2---22222-22 !""####$$%%%%----+&'('''''2222--21.2--2-225*-)2224-2-2222-2,13.//-222-2-22-++0+++++---   !"###########################################$#%&'()*+,-./01234##5   !! "#$%&'()*+!,-./012345675899:;<=!>?<=!@ABCDEFGHIJKLIIMNOOPQRSTUVWXYZ[\]^_`abcdeffghijklmnoppqrstufffvttwxyz{|}9fffffffffffff~€‚ƒ„…‚ƒ„†‡ffffˆ‰fˆffŠ‹tŒttttttŒŽŽŽŽŽfŽŽŽŽŽŽf‘’“Q”•QN–—˜™š›œœœžŸ ¡¢££££££¤¥¥¦§§§¨©ª£«¬­®¯°±²¥³´µ¶·¸¹º»¼½¾¿ÀÀÁÂÃÄÄÄÄÄÅÆÆÆÆÇÈÉÊËÌÍÍÎÏÐÐÐÐÐÑÐÐÐÒÓÔÕÐÐÐÖ×ÐØÙÚÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÜÐÐÐÕÐÝÞßàáâãäåäæf玎èéꎎëìíQ                !     "#$   %    & $$ ''()*+,-   .. /  01234567***+***8#9":;;<=>?@ABBCD;E=>FFFFG   $H# % $  !IIIIIJIIIIK#L,M$$$$$$. ! N% O"IPIIIIIIKQQQQQQQRQQQS7$  $! .;;T $ UVVVVVVVVUUUWUVVXYZ[\UWVUUU]W^^^^^________`aaaaaaaaabcccccd^^e______faccghaijkilih`_i`mnaojpi_jq_`j^^^rsstsssssuvwxxxxwxyz{{|[}~Z}~[}~}~[€‚‚‚‚‚‚‚ƒ„„„„„„„„„„…†„†„†„†‡‚ˆ„… ;;;;;‰;;;;;‰Š‹=‰;;B=;=;;;BŒ=;‰;‰;;BŒ;Ž;‰;;;;>;;;;;Ž‹=;Œ;Š‘=‹‹Œ;Œ;=;;B;;;;==B;’K“”QQ”#•                        !"#      !"#"$%&'()*+,-./01,23!456789:;<=>>?@A&BCDEFGHIJKLMNOLKPGKQKRSRGTUVWXXXXXYZZZZ[\]^A_`a"`bPc_Oa                                  !"""""""#$$$$$$$$$$%&$&$&$&'"($%    !"#-+-) ##!!'' 777 +--++- ###!!'  &  8 )++++++++7/7+--..)#! ,2**01$  "%( 345 # # # 77-++66 ## ' --+9  !"#$%&'()*+,-   !"#$%&'()*+,-.+/-0,1/-2+,3.4+56789+3:+.+;<=>?@ABCDEF4GHIJKGLL++MNOPQRSTUVWXYZ[5\Z]^_]`abcde`fgh]ijk]l9md]no]'pqrst,u4vwexyz,{e]|'}~]€'‚ƒ„iL,  !"#  $$% &'%$! ()*+  %   ++ % %++%, - % +% +./.0 ++,  %+-%  1% %%++2%%   % + %        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOYZ[\]^_`abcdefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefglmmmmmmmmmmmmmmmmHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHOOOOnopqrstuvwxyHz{|}HHHHHH~H€H‚HƒHHH„HHH…†‡ˆHHHHHHHHH‰HHHHHHHHHHHHHHHHHHŠH‹HHHHHHHHHHHHHHHHHHHHHHHŒŽHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH‘’“HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH”•–—H˜H™š›œHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHžŸHH ¡¢£¤H¥¦§¨©ª«¬­HHHHHHHHHHHHHHHHHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO®¯H°±HHHHHHHHHHHHHHHHHHHHHHHHHHHH      !"#$%&'()*% +,-./0000100023456789:;<=>?@A:;BCDEFG;HIJ?K9:;HLM?NOPQRSETUV;WXY?Z[V;\X]?^[V_`a?bcdefg0hijjklm00nopqrs00tu%v8wxyz{|}00jjjj~jjjj€‚‚‚‚ƒ„„„„„…†…‡ˆ‰ˆŠ‹wŒŽŽJ‘’“”‘•jjjjj–—Œ˜—™šw››œjžjjŸj ¡¢jjj£j¤——00000¥¦§¨©ª«¬%)­¦®¯%°0000±²³´µ¶¶·¸¹¹º»¼½¾¿ÀÁÂÃÄwÅÆÇÈÉÊËÌÍÎÏÎÐÑÒÓÔÕÖרÙÚÛÜÝÞß0à0áááááááááâááááÍááãáäåæçèéêëìíîïðñòóôõö÷øùáúûüýþÿw0000000000..€ß  0000       Þ              0             Þ                         !   "°#$0%&'.(à0000Z)*+,-¦.—/%01234456007´89jŸjjjj:; <=>000000000?—@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDBCBE‚F„„GHHHHHHHHßIJKLMNO0P00QR´STUV¹WXY Z [\]^._`abc‰d¸¸00àefàg000hwJ00.(à000ijk00¸—00000lmn00op0000q0000rstuvwxy000000000.«z{P|0«}~y—«1€000«4—00 ‚—000.0ƒ€„…†.00000y0000‡3ˆ«000000‰0000000šŠ‹Œ¸00000ßM¹‘Ž‘’“”Vw•–––—˜™š›œgžg000M        ÞŸ00 á¡ááá¢áá 0000£¤¥  ¦‰00  §¨   ! Þ ©ª0 §   «     ¬­   ®¯°±²( ³00000000´    µ000     000(       ¶00  !"""#$%$$&&'$$$$'&'()$*+,-.$$$$/////////////0$$/1&$$$$$&23 456 78-9--- '5'-$$$$$$$:&$$$&$&$$$$$$$$&&$$$5-; '+'&'&'&&&$$-5+5+&$$$+$$'$ 32 $$+'&$'&'&$55$+5+$+$$$'&&$$$ $$$$$+''&'$-++$&$$$$$$$ $$$$$$$5+5+$$$$$$'$-'&$&$'&&$'&$&$$$5$5$&$$+$$$$ &$$+'&&'$'55$$$+5$$$$$$$$'&'$-$$+5$$$&'&$$$$$$&'55&$$$+$$$$$<$'&$''$&$5$+55$&$$$$$=>>>>>>>>>>>>>>>>>>>>?$*>>>>>>>@ ;$$=??=??=$$$>>=>>>=>==$>=>>>>>>=>$>>??>>>$ $>> AABCD66E9,FF&$++5;-&AGHI$$ ; >>>'$$'$JJJJJJJJKKKKKKKKKKKKLLLLLLLLLLLL&$&&$&$&&$&&+$$$&$$$$$MN$;&5$$$$$)$$$$$$$$$$&$$$$$$>>;OMP>$ $$$6;6I&$$$$$$$$$&$6 >>>>>>>$>>?$$$$$>>>>>>$$>>>>>$$$ ?$>$>>>>>>>?>>>>>>?+--$$ ;;M&$-$$$$$Q;; $';---&$$$$5$$$$$$$$$$$$''''$&$'$& &;;;R;SR;TUVUVWXY!3333Z[\][M;;;^&$_N5$$$$$$$22`$$$abaa$$$$$$&$$$$&$$aaacaaadaeddaaaaaefdafeaefaefaafaefagacaaaU6FFFFFFFbFFFFFhhhhhhhhhhbFFF$$$$$i;Mj$$$')$$$$$$+&&UUUUUUU;;;;kUUFFFF;;9;Ml$$aaaaaaaaaaaaagaaaaa$$$$$aaaaaa$$mnaFFFFFaFFFFopaaaaaaaqaanrasttttaaaataaaaaaatttaaauaatv+w[rxttttaaaaatuanyr$$gaaaaaaaaaaaa$gaaaaaaaaaaaaaazaaaaaz$${{{{{{{{aaaaaanaaaaaaaaaaaz$aaaz$$$$j $$-$$$+;;$$$$$$$$$$--$$|$$$A6$$$$5$$$$;$$;$$$$$'JJJJJJ}$-;' $$$ $;>?$$$$$$$$$$$=>>;5$$$$'&'&'&$$$$$~~~~$$$$$$KKK€$LLLLLLLL$$‚‚‚‚‚‚‚‚$'$$ƒ„////1//////0//00/ƒ0/////$$$$$$$$'F$|$…†:‡ˆ$$$aa‰hhhhhhhm‰maaamN[6‰hhmaaazŠ‹$$&ŒiaaFammaaaaa[aaaaaa‰Žaaaaaa‰Ž‰pF]{{{{[$$$$&$aŠ‘&$$$$+’$'&';)$'$'$$$Q$$M$$$$$$&'&$&'Q$Q$$'$$$+5$$''$$5$+;;;;&$$$$Q;;;$&$$&$$$M$ -;;$$$$$$$5 ;;$$$$$$-M)$$$$$$$&$$$$$$“FpbFFp$$$$$$$+a$$$$$$$--$$$$$$&'&'&''''&'&&'&&&$$ '&&''&''$$$&$'''''&&''''''&&'&&'&&''''gaaaaaaz”$$&$$$$$•••••••••••••az$$$$$$aaaaz$$$z$$$$$$$aaagaaaaaacdaadaaazaaz$$zaaaaaaadddaaaaccdaaaaaaaaaagaz$daaaaaaacdaaaaaa$aaaa$$$$$$$$$gaaz$gaaaaa+$$$$$$$ $     $         %%%%        !!         & && &&& && "### !%%     && ''           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNK    !"#$%&'()$*+,-./01234567,85,69*:;<8=>?7@ABC#DEFGHIJGGKLMNOPQRS:+T:#UVW*<0$      !"#$% &%%#'(#)*+,$$+-./+0'**(1-+(--'*-+ ''2$  *(3 45 678 9('++(#*           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUUVWXYZ[\]^_`abcdefghi>jklm       !"#$%"#$%&'("#$)*"#$)*"#$)*+,-./012"#31245607"#89:;<=>?@ABCDEFGHIJKLMNOPCQRSTUVWXYPZ[\K]^__`abcDKdeQfg01hijklKgmno 9:pqrstuvwxyz{|}~€‚zƒ„g…†‡ˆ‰Š‹Œ"Ž"Ž"#‘’“”•012–—˜   1™#š›œ žŸž ¡¢£¤¥¦§¨©ª"#‘« ¬ ¬ ­1®F¯bC[°XXeIIPk±²!#%' !#%' .  (U^(U^ %' "$&%'(2?@ABCDEFGHIJKLMNOP##g's(^Ust%!(^2<F'2(%#'U^!!#%'  (!!(TUVWXYZ[\]^_`abcdefghijklmno PYbk(PUY^b(PUY^gk((((((Ãÿÿ?ÿÿÿ?y;xpüÿøÿÿùÿÿ?Â7:ð3üÿßSz0p€0¼þÿÿÿÿÏ¿ÿÿÿÿP|pˆ/<60ÿÿó~0P(¨  €       !"#$%%&&'()*+,-./0123456789:;<=>?@ABCDEFGHI,JE              !  "#$%%$ &' ( )* +,-. &/,(012  # 3 4( 5678! +,#9 : ' (%;                !"#$ %&'($ )&*($+,"-./0123456789:;<=>?@ABCDEFGHIJKLMNMNOLPQRSTU?VWXYZ[\]^_`abNcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽN‘’“”•–—˜™š›œ     !! ""#$% &'()*##+&& ,++-.& -/*,++012.$*34# *5"678$  9":;6< ) =>?@ABBCBBBBBBBBDEFGHIJ KLMNOPQRST6UVWXYXZ[#=\]^_`abcdeffghijcklEXmcnoOkpqrstuvwxyz{|}jc~ !€l‚ƒ„…†‡uˆY‚f‰klŠ‹ŒXŽYuQccc‘ ’T“ul”J•–c—˜Q-™ š›5œœXlžYœl?uŸ                                                      !"#$%&'()*+,-./0123456789:;<=>?@AA BBCDEFGHHHIJKKKLMMMMNOPQRSTUVWTUTUVWXYTUZ[TUTUTU\]^_`abc^defghiijjklmmmnnnoHHHHHIKKKKKLpqrs%tuvvvvwxRDDyz%{| }}}}}~~~~~      !"###$$%&'()'()'()*'()+,-./01123456789::;<:=>?@ABACDEFGGGHIIJKL!!!MNNNOPPQRSTUVWXYZ[\]^^^_`abcdefghijklmmnopqrstuvwxy---zzzzzzzz{{{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€‚ƒ„…†nnnnnnnnssssssssnnnnnnssssssnnnnssss‡‡ˆˆˆˆ‰‰ŠŠ‹‹ŒŒnnssŽŽ‘‘‘‘nn’ss““nn”vss••y––——˜™š›œžžžžžžžžŸŸŸŸŸŸŸŸŸŸ          ¡¢£¤¥¦§¨©ªª««««««««««««««««¬­®¯¯¯¯¯¯¯¯°°°°°°°°       !"#$%%&'()***+,,,,-./01211231111456789:;<<=>???*****+@ABCD /EFGHHHHH    !""#$%&'()*+,--------.//////////////////////0000000000000000123333333333333333333344567777533883399,::;;5<=>?@@@@@@@@AAAAAAAAAABCDEFGHIIJKLMMMMMMMM ‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0`ÆÿÿÿAâÿÿøÿÿÿ¶ÿÿÿ÷ÿÿÿûãÿÿªÿÿÿœÿÿÿÿÿÿ€ÿÿÿ‚ÿÿÿ£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿ(         !"#$%&'())*+,-.///0122223456787789:7;<=>?@ABCDEFGHIJKLMNNOPQQQ/////0RSTUV$W++XYZ[\]]]]]      !"#$$$%&&'()*+,-./01233333333455555555555555555555556777777777777777789:;<=>??????????????@ABC????DDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJKLMN??OOPQRSTUVWWWWXYZ[\??]]^_`ab??cc2defghiijjklmnoppppppppqqqqqqqqqqrstuvwxyyz{|}~€‚ƒ„…†‡ˆ‰‰‰‰‰‰‰‰”·qMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| ˆ düÿ‹A…B x Å A @ÌüÿCA…B u Å D zR| ˆÔüÿ 0ÐüÿDÌüÿ XÄüÿ lÀüÿ€Àüÿ ”¸üÿ ¨°üÿ¼¬üÿ Фüÿä”üÿøüÿ €üÿ. œüÿ4˜üÿ#H¨üÿJ(\àüÿÇA†A ƒC S  AÃAÆB ˆ|üÿ!,œŒüÿŠA†A ƒC0I  AÃAÆD ,Ìèüÿ‚A†A ƒC0D  AÃAÆA Dü<üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇDDxüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ,Œ´üÿ‚A†A ƒC0D  AÃAÆA ,¼üÿŠA†A ƒC0I  AÃAÆD ìdüÿ+|üÿ'üÿ( üÿr|<lüÿÍA…A ‡A†AƒC@i AÃA ÆAÇAÅD h AÃAÆ AÇAÅD l AÃAÆ AÇAÅD lAÃAÆ AÇAÅ|¼¼üÿÎA…A ‡A†AƒC@i AÃA ÆAÇAÅD i AÃAÆ AÇAÅC m AÃAÆ AÇAÅC mAÃAÆ AÇAÅ< üÿ 8Püÿ[A…A ‡A†AƒCOAÃA ÆAÇAÅ<Œ$üÿïA‡A †Aƒ}  ÃAÆAÇB hà AÆAÇ,ÌÔüÿBA†A ƒj ÃAÆC PÃAÆüèüÿ àüÿ$Ôüÿ8ÈüÿL¼üÿ`°üÿt¤üÿˆ˜üÿœŒüÿ€°€üÿTA…A ‡A†AƒC0Z AÃA ÆAÇAÅC o AÃAÆ AÇAÅA à AÃAÆ AÇAÅD g AÃAÆ AÇAÅA 4Püÿ7AƒCqAà ThüÿVAƒs ÃD ]ÃxœüÿŒüÿfC0Y D E¬ØüÿPÀÜüÿ5A…A ‡A†AƒCp¸ AÃA ÆAÇAÅA lAÃAÆ AÇAÅ4À üÿ\A†A ƒC0w  AÃAÆB Y AÃAÆ4Lä üÿ„A‡A †AƒC c A ÃAÆAÇD („0 üÿ4AƒC Y AÃB RAð8 üÿ4Ä8 üÿJA‡A †AƒC s A ÃAÆAÇD (üL üÿ/AƒC b AÃA EAÃ4(P üÿ!AƒC e AÃB z AÃA p AÃC ,`< üÿŠA†A ƒC0I  AÃAÆD ,˜ üÿ‚A†A ƒC0D  AÃAÆA DÀì üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ (üÿ8 Lüÿ0 @üÿ‹C ] D V B lP ¬üÿ…A…A ‡A†AƒC`R AÃA ÆAÇAÅA c AÃAÆ AÇAÅC × AÃAÆ AÇAÅA À ÄüÿÔ Àüÿdè ÀüÿÁA…A ‡A†AƒC@ AÃA ÆAÇAÅD K AÃAÆ AÇAÅA PAÃAÆ AÇAÅPP üÿ‰A…A ‡A†AƒC@f AÃA ÆAÇAÅC PAÃAÆ AÇAŤ TüÿC R(¼ TüÿHA†A ƒC0{  AÃAÆB 8è püÿÕA†A ƒC v  AÃAÆC 8  AÃAÆB h$ üÿA…A ‡A†AƒC0™ AÃAÆ AÇAÅD | AÃA ÆAÇAÅD S AÃAÆ AÇAÅA h ´üÿõA…A ‡A†AƒC0… AÃAÆ AÇAÅD u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA hü @üÿíA…A ‡A†AƒC0€ AÃAÆ AÇAÅA u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA <h ÄüÿLA…A ‡A†AƒC@u AÃA ÆAÇAÅA <¨ ÐüÿOA…A ‡A†AƒC@{ AÃA ÆAÇAÅA è àüÿAƒCYAà àüÿC Z( èüÿ A†A ƒC W AÃAÆ4L ÜüÿAƒC0g AÃD W AÃD W AÃD <„ ¸üÿA…A ‡A†AƒC@ç AÃA ÆAÇAÅA hÄ ŒüÿA…A ‡A†AƒC0¡ AÃAÆ AÇAÅD B AÃA ÆAÇAÅB S AÃAÆ AÇAÅA l0@üÿ‚A‡A †AƒC0H A ÃAÆAÇC l Aà AÆAÇA  Aà AÆAÇB N Aà AÆAÇC H Tüÿ>A†A ƒC0Y  AÃAÆD c  AÃAÆC N  AÃAÆD ìHüÿ HüÿAƒC e AÃB <$´üÿA…A ‡A†AƒC@Û AÃA ÆAÇAÅB d”üÿ4AƒC mAĨüÿ4AƒC mAÃD¤¼üÿ‡A‡A †AƒC0O A ÃAÆAÇD E Aà AÆAÇD DìüüÿšA‡A †AƒC0s A ÃAÆAÇD N Aà AÆAÇC P4PüÿeA…A ‡A†AƒCPs AÃA ÆAÇAÅB N AÃAÆ AÇAÅB <ˆd!üÿAA…A ‡A†AƒC0ö AÃA ÆAÇAÅC 8Èh"üÿaA†A ƒC Q  AÃAÆD d  AÃAÆB 8"üÿ]A†A ƒC R  AÃAÆC a  AÃAÆA (@´"üÿqA†A ƒC Q  AÃAÆD (lü"üÿqA†A ƒC R  AÃAÆC 4˜D#üÿTA†A ƒC0B  AÃAÆC E AÃAÆ8Ð`#üÿAA…A ‡A†AƒC uAÃA ÆAÇAÅ\ h#üÿ³AƒC P AÃC w AÃD Q AÃB Z AÃE F AÃE F AÃE F AÃE 8l¼#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇ8¨´#üÿ8A‡A †AƒS  ÃAÆAÇD Yà AÆAÇ8ä°#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇP ¨#üÿvA…A ‡A†AƒC@d AÃA ÆAÇAÅA } AÃAÆ AÇAÅC TtÌ$üÿA…A ‡A†AƒCPQ AÃA ÆAÇAÅD q AÃAÆ AÇAÅC |ÌŒ%üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|L&üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ4Ì„&üÿIAƒN ÃA P ÃH D ÃH D ÃH DÃ|˜&üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|„'üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ<'üÿÿA…A ‡A†AƒC@n AÃA ÆAÇAÅC hDP*üÿ A…A ‡A†AƒCpv AÃA ÆAÇAÅC e AÃAÆ AÇAÅA n AÃAÆ AÇAÅA X°è3üÿÔA‡A †Aƒ[  ÃAÆAÇD p à AÆAÇB y à AÆAÇA }à AÆAÇX `4üÿåA‡A †Aƒ_  ÃAÆAÇD u à AÆAÇA ~ à AÆAÇD ~à AÆAÇdhì4üÿóA‡A †AƒAm A ÃAÆAÇD w Aà AÆAÇB x Aà AÆAÇA Aà AÆAÇ€Ðx5üÿXA…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB O AÃAÆ AÇAÅA R AÃAÆ AÇAÅB €TL6üÿ`A…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB S AÃAÆ AÇAÅA V AÃAÆ AÇAÅB hØ(7üÿüA‡A †AƒAm A ÃAÆAÇD | Aà AÆAÇA y Aà AÆAÇD @Aà AÆAÇ|D¸7üÿõA…A ‡A†AƒC@{ AÃA ÆAÇAÅB p AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|Ä08üÿöA…A ‡A†AƒC@{ AÃA ÆAÇAÅB q AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅlD¨8üÿÊA…A ‡A†Aƒj ÃA ÆAÇAÅC j ÃAÆ AÇAÅC n ÃAÆ AÇAÅC nÃAÆ AÇAÅ|´9üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅ|4:üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅl´,;üÿËA…A ‡A†Aƒj ÃA ÆAÇAÅC k ÃAÆ AÇAÅB o ÃAÆ AÇAÅB oÃAÆ AÇAÅ<$ˆ;üÿcA…A ‡A†AƒCpC AÃA ÆAÇAÅA <d¬<üÿšA…A ‡A†AƒCpY AÃA ÆAÇAÅA H¤>üÿ‰A…A ‡A†Aƒi ÃA ÆAÇAÅD C ÃAÆ AÇAÅB <ðH>üÿkA‡A †Aƒ| à AÆAÇC [  ÃAÆAÇC 00t>üÿTA†A ƒa ÃAÆD Q ÃAÆB <d”>üÿsA‡A †AƒX  ÃAÆAÇC I à AÆAÇA 0¤È>üÿoA†A ƒU ÃAÆD I ÃAÆB 0Ø?üÿoA†A ƒU ÃAÆD I ÃAÆB  @?üÿ D?üÿ1C U D T@X?üÿ%<Tl?üÿôA…A ‡A†AƒC0V AÃA ÆAÇAÅC <” @üÿºA…A ‡A†AƒCPZ AÃA ÆAÇAÅC DÔœDüÿ€A‡A †AƒC È A ÃAÆAÇC ` Aà AÆAÇA DÔEüÿ’A‡A †AƒCpq A ÃAÆAÇB | Aà AÆAÇA (d Füÿ/AƒC T AÃC QAÃT$Füÿ!A…A ‡A†AƒC`Y AÃA ÆAÇAÅA o AÃAÆ AÇAÅA <èðGüÿ]A…A ‡A†AƒCPw AÃA ÆAÇAÅB €( Lüÿ_A…A ‡A†AƒC€¥ AÃA ÆAÇAÅA K AÃAÆ AÇAÅA © AÃAÆ AÇAÅA «AÃAÆ AÇAÅT¬ ìQüÿHA…A ‡A†AƒCp] AÃA ÆAÇAÅA w AÃAÆ AÇAÅA l!ÜSüÿøA…A ‡A†AƒCp‰ AÃA ÆAÇAÅD W AÃAÆ AÇAÅA M AÃAÆ AÇAÅC <t!dYüÿiA…A ‡A†AƒC0b AÃA ÆAÇAÅC (´!\üÿ"A†A ƒA\ AÃAÆ4à!ˆ\üÿ¸A‡A †AƒC u A ÃAÆAÇB h"]üÿÆA…A ‡A†AƒC`q AÃA ÆAÇAÅD M AÃAÆ AÇAÅA oAÃAÆ AÇAÅd„"d^üÿBA…A ‡A†AƒC`y AÃA ÆAÇAÅD Ò AÃAÆ AÇAÅA ^AÃAÆ AÇAÅdì"@_üÿfA…A ‡A†AƒC`y AÃA ÆAÇAÅD ã AÃAÆ AÇAÅA qAÃAÆ AÇAÅhT#@`üÿžA…A ‡A†AƒC`q AÃA ÆAÇAÅD ' AÃAÆ AÇAÅA mAÃAÆ AÇAÅdÀ#taüÿVA…A ‡A†AƒC`s AÃA ÆAÇAÅB í AÃAÆ AÇAÅA _AÃAÆ AÇAÅT($dbüÿ/A…A ‡A†AƒC0n AÃA ÆAÇAÅC E AÃAÆ AÇAÅC <€$„L„^„n„|„Œ„–„¢„¬„¶„¾„Ȅ҄܄æ„î„ö„… ……*…H…\…p…‚……¢…°…¾…Ð…è…þ… ††.†@†P†b†z†ކ¢†¸†Άà†ô† ‡‡0‡@‡N‡`‡r‡‚‡š‡¨‡¸‡ȇ܇쇈ˆ2ˆBˆ\ˆpˆ€ˆ’ˆ¢ˆ²ˆȈÚˆòˆ‰‰(‰@‰Z‰p‰ˆ‰–‰¦‰¸‰ȉ؉ô‰Š&Š8ŠHŠZŠlŠŠŠœŠ¤ƒ¼ƒÔƒäƒøƒ „&„>„L„^„n„|„Œ„–„¢„¬„¶„¾„Ȅ҄܄æ„î„ö„… ……*…H…\…p…‚……¢…°…¾…Ð…è…þ… ††.†@†P†b†z†ކ¢†¸†Άà†ô† ‡‡0‡@‡N‡`‡r‡‚‡š‡¨‡¸‡ȇ܇쇈ˆ2ˆBˆ\ˆpˆ€ˆ’ˆ¢ˆ²ˆȈÚˆòˆ‰‰(‰@‰Z‰p‰ˆ‰–‰¦‰¸‰ȉ؉ô‰Š&Š8ŠHŠZŠlŠŠŠœŠÏDeleteCriticalSectionìEnterCriticalSectionþGetLastErrorGetModuleHandleAAGetProcAddressÞInitializeCriticalSection.LeaveCriticalSection•TlsGetValue½VirtualProtect¿VirtualQuery8__dllonexitF__mb_cur_max¿_errno!_isctype¡_pctype„fflush“freeÄmallocËmemmovetolowertoupper _iobGabortScallocyfwriteìvfprintfPyArg_ParseTuplePyArg_ParseTupleAndKeywordsPyBuffer_Release9PyCallable_CheckxPyDict_ContainsyPyDict_Copy}PyDict_GetItemƒPyDict_New„PyDict_Next…PyDict_SetItem†PyDict_SetItemStringPyErr_CheckSignalsPyErr_Clear”PyErr_Format˜PyErr_NoMemoryšPyErr_Occurred«PyErr_SetNone­PyErr_SetStringÉPyEval_RestoreThreadÊPyEval_SaveThreadßPyExc_IndexErrorìPyExc_RuntimeErrorïPyExc_StopIterationõPyExc_TypeErrorýPyExc_ValueErrorCPyImport_ImportModuleLPyInt_AsSsize_tQPyInt_FromLong_PyList_AppendePyList_NewfPyList_ReversegPyList_SetItemmPyLong_AsLongrPyLong_AsUnsignedLong’PyMem_Free“PyMem_Malloc”PyMem_Realloc¨PyModule_GetDictôPyObject_Call÷PyObject_CallMethodùPyObject_CallObjectûPyObject_ClearWeakRefsPyObject_Free PyObject_GetAttrString PyObject_GetItemPyObject_InitPyObject_MallocPyObject_Repr#PyObject_SizeWPySequence_GetSliceePySet_ContainsmPySlice_GetIndicesExoPySlice_TypePyString_FromStringˆPyString_Type¤PyThread_acquire_lock¥PyThread_allocate_lockªPyThread_free_lock¯PyThread_release_lock½PyTuple_New¾PyTuple_Pack¿PyTuple_SetItemÁPyTuple_TypeÇPyType_ReadyPyUnicodeUCS2_FromObjectPyUnicodeUCS2_FromUnicodePyUnicodeUCS2_Join-PyUnicode_Type5Py_BuildValueVPy_InitModule4É_PyString_Joinè_PyUnicodeUCS2_ToLowercaseþ_Py_NoneStruct_Py_ZeroStruct€€€€€€€€€€KERNEL32.dll€€€€€€€€€€€msvcr90.dll(€(€(€(€(€msvcrt.dll<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€python27.dll”·q`·q q q(`qqP 00(0=0ˆ0¹0È0Í0B1J1j1r11Ÿ1¶1½1Å1Ð1â1ø12+2A2Ì3ã3²8ó8¿>j>€>“>Æ>Þ>ã>î>ÿ>? ??.?3?>?R?W?b?l?q?z?ˆ??˜?¨?­?¸?Ú?ß?ê?ø?ý?0È000"0-0<0A0L0Y0^0h0x0}0ˆ0Î0ë01E1`1f1Þ1÷12E2Y2_2Ö2ë2 353I3O3¨3Ò3÷3%4?4b44–4¡4µ4555C6…6î6B7m7”7878l8ù8|9‚9›9Í9â9=:l:r::¤:ì:;T;d;’;Ê;)_>j>¯>Í>ù> ?0?L?c?j?p?‡?ü?@<0D0X0…0•0¯0Ô0â0"1/1m1Ï1æ1í1ó1 2j2ì2F3ˆ3ö5b7Ï8Ê;>P C1`Á=×=ë=ñ=p0:4a4‰4Ž4™4×4ß4!51595>5I5‘5Ñ5Ù5ñ57µ7#8€î3¥4.5,9 999‰;ë;õ;ÿ;B >>? \š0 0¹0¿0 11`1e1à1æ1ó1 2#2)2\2l2ì2 323í3ø3Œ4œ4©4¸4È4Õ455'6T6Y6m66v7µ7Y89:g::;?<° 71'>À8;2¢3²3ì3#444j4~4”44¦4®4·4È5z6†68\8i8ë8ñ89T9;Ðlã0Y697T77‘7¼7Å7Í7Ö7d8Ç8ð8c9‘9»9Ï9×9ì9ü9m:±:·:Ì:ß:å:;.;:;C;Á;Ó;î;Æ<5=I=]=q=…=™=­=0>R>z>­>á> ??]?…?à|30@0W0r0Œ0°0x1Œ1”1©1·1ã1ì1[2 33e3z3–3°3Í3é344·4c5n5‚5Ž5—5Æ5Ñ5ö5#6g6o6Š6Ù6æ6î6÷6f7‚7™7¿7ã7ë78 8)818:8 9 ð ˜=³= à6÷6 2 2{3÷4;6'80 7Â?@ ô6Â=P a?Æ?`À1Í12 22%2°8;9<pXo1À1†2Ï3ù314<4Ä4µ5×56¶6Ê6î6&7:7E78s8¿8Ö8á89e9m9ˆ9K:ç:þ:f;’;¦<å<==8=Ó= >†>¥?€hh00º01Z1r1f2†2š283d33¨3­3Å3Ó46­6¼677d78x8~8Š819a9º9Ó9y:–:¼:ê:ª;b=ƒ=‰=Í=/>Ÿ>¨>ø>5>@>P>]>s>>¨>¸>Å>Û>?? ?-?C?j?u?…?’?¨?Õ?à?ð?ý? 0:0E0U0b0x0¥0°0À0Í0ã0 11%121H1u1€111³1Ú1å1õ122E2P2`2m2ƒ2ª2²2È2Õ2ë23303=3S3z3…3˜3¥3»3â3í34 4#4J4U4h4u4‹4²4½4Ð4Ý4ó45(585E5[5…55 5­5Ã5ê5ò566(6R6Z6m6z66½6È6Ø6å6û6"7-7@7M7c7Š7•7¥7²7È7ò7ý7 8808Z8e8x8…8›8Â8Í8à8í89*959H9U9k9’99°9½9Ó9ú9::%:;:b:m:€::£:Ë:Ö:é:ù:;:;E;X;e;{;¢;­;À;Í;ã; <<(<5 >0>=>S>z>…>˜>¥>»>â>í>? ?#?J?U?e?r?ˆ?²?½?Ð?à?í?°P00)060C0b0m0}0Š0—0¶0Á0Ô0á0î011,191F1f1q1„1”1¡1Â1Í1à1í1ú12%282D2P2r2}22š2§2Æ2Ñ2á2î2û23%383E3[3‚33 3¬3¸3Ú3å3ø344©5´5Ä5Ñ5Ý5å5I6T6d6q6x6¥6°6À6Í6Ö6Þ6ð67"7*727:7B7J7R7Z7 7©7É7Ï7å758S8O9b9v99„9Ž9™9£9®9µ9Ù9ê9ó9:!:,:V:u:•:Â:Ü:ú:;+;;;D;];o;y;”;¨;¶;Í;ß;ë; << >>&>8>ÀÄ000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1Œ1`2d2l2p2t2|2€2„2Œ22”2œ2 2¤2¬2°2´2¼2À2Ä2Ì2Ð2Ô2Ü2à2ä2ì2ð2ô2ü233 3333 3$30343`3p3t3„3ˆ3˜3œ3¬3à3ä3ì3,4ä4è455 5555 5$5,50545<5@5D5L5P5T5\5`5d5l5p5t5|5€5„5Œ55”5œ5 5¤5¬5°5´5¼5À5Ä5Ì5Ð5Ô5Ü5à5ä5ð5ô566 60646D6H6X6€6„6Œ6”6˜6 6¨6¬6´6¼6À6È6 7à7ä7ð7ô7ü788 888 8$8@8P8Œ8`9d9p9t9|9€9„99”9À9Ð9:::: :$:0:4:@:D:P:T:`:d:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;˜;œ; ;¤;¨;°;´;¸;À;Ä;È;Ð;Ô;Ø;Ü;à;ä;ì;ð;ô;ø;ü;<< <<<<<$<(<,<0<4<8<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?...) Atomic non-capturing version of regular parentheses. (?flags-flags:...) Non-capturing version of regular parentheses with local flags. (?P...) The substring matched by the group is accessible by name. (?...) The substring matched by the group is accessible by name. (?P=name) Matches the text matched earlier by the group named name. (?#...) A comment; ignored. (?=...) Matches if ... matches next, but doesn't consume the string. (?!...) Matches if ... doesn't match next. (?<=...) Matches if preceded by .... (? Matches the text matched by the group named name. \G Matches the empty string, but only at the position where the search started. \L Named list. The list is provided as a keyword argument. \m Matches the empty string, but only at the start of a word. \M Matches the empty string, but only at the end of a word. \n Matches the newline character. \N{name} Matches the named character. \p{name=value} Matches the character if its property has the specified value. \P{name=value} Matches the character if its property hasn't the specified value. \r Matches the carriage-return character. \s Matches any whitespace character; equivalent to [ \t\n\r\f\v]. \S Matches any non-whitespace character; equivalent to [^\s]. \t Matches the tab character. \uXXXX Matches the Unicode codepoint with 4-digit hex code XXXX. \UXXXXXXXX Matches the Unicode codepoint with 8-digit hex code XXXXXXXX. \v Matches the vertical tab character. \w Matches any alphanumeric character; equivalent to [a-zA-Z0-9_] when matching a bytestring or a Unicode string with the ASCII flag, or the whole range of Unicode alphanumeric characters (letters plus digits plus underscore) when matching a Unicode string. With LOCALE, it will match the set [0-9_] plus characters defined as letters for the current locale. \W Matches the complement of \w; equivalent to [^\w]. \xXX Matches the character with 2-digit hex code XX. \X Matches a grapheme. \Z Matches only at the end of the string. \\ Matches a literal backslash. This module exports the following functions: match Match a regular expression pattern at the beginning of a string. fullmatch Match a regular expression pattern against all of a string. search Search a string for the presence of a pattern. sub Substitute occurrences of a pattern found in a string using a template string. subf Substitute occurrences of a pattern found in a string using a format string. subn Same as sub, but also return the number of substitutions made. subfn Same as subf, but also return the number of substitutions made. split Split a string by the occurrences of a pattern. VERSION1: will split at zero-width match; VERSION0: won't split at zero-width match. splititer Return an iterator yielding the parts of a split string. findall Find all occurrences of a pattern in a string. finditer Return an iterator yielding a match object for each match. compile Compile a pattern into a Pattern object. purge Clear the regular expression cache. escape Backslash all non-alphanumerics or special characters in a string. Most of the functions support a concurrent parameter: if True, the GIL will be released during matching, allowing other Python threads to run concurrently. If the string changes during matching, the behaviour is undefined. This parameter is not needed when working on the builtin (immutable) string classes. Some of the functions in this module take flags as optional parameters. Most of these flags can also be set within an RE: A a ASCII Make \w, \W, \b, \B, \d, and \D match the corresponding ASCII character categories. Default when matching a bytestring. B b BESTMATCH Find the best fuzzy match (default is first). D DEBUG Print the parsed pattern. F f FULLCASE Use full case-folding when performing case-insensitive matching in Unicode. I i IGNORECASE Perform case-insensitive matching. L L LOCALE Make \w, \W, \b, \B, \d, and \D dependent on the current locale. (One byte per character only.) M m MULTILINE "^" matches the beginning of lines (after a newline) as well as the string. "$" matches the end of lines (before a newline) as well as the end of the string. E e ENHANCEMATCH Attempt to improve the fit after finding the first fuzzy match. R r REVERSE Searches backwards. S s DOTALL "." matches any character at all, including the newline. U u UNICODE Make \w, \W, \b, \B, \d, and \D dependent on the Unicode locale. Default when matching a Unicode string. V0 V0 VERSION0 Turn on the old legacy behaviour. V1 V1 VERSION1 Turn on the new enhanced behaviour. This flag includes the FULLCASE flag. W w WORD Make \b and \B work with default Unicode word breaks and make ".", "^" and "$" work with Unicode line breaks. X x VERBOSE Ignore whitespace and comments for nicer looking REs. This module also defines an exception 'error'. """ # Public symbols. __all__ = ["compile", "escape", "findall", "finditer", "fullmatch", "match", "purge", "search", "split", "splititer", "sub", "subf", "subfn", "subn", "template", "Scanner", "A", "ASCII", "B", "BESTMATCH", "D", "DEBUG", "E", "ENHANCEMATCH", "S", "DOTALL", "F", "FULLCASE", "I", "IGNORECASE", "L", "LOCALE", "M", "MULTILINE", "R", "REVERSE", "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "X", "VERBOSE", "W", "WORD", "error", "Regex"] __version__ = "2.4.41" # -------------------------------------------------------------------- # Public interface. def match(pattern, string, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.""" return _compile(pattern, flags, kwargs).match(string, pos, endpos, concurrent) def fullmatch(pattern, string, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Try to apply the pattern against all of the string, returning a match object, or None if no match was found.""" return _compile(pattern, flags, kwargs).fullmatch(string, pos, endpos, concurrent) def search(pattern, string, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Search through string looking for a match to the pattern, returning a match object, or None if no match was found.""" return _compile(pattern, flags, kwargs).search(string, pos, endpos, concurrent) def sub(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).sub(repl, string, count, pos, endpos, concurrent) def subf(pattern, format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement format. format can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).subf(format, string, count, pos, endpos, concurrent) def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the replacement repl. number is the number of substitutions that were made. repl can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).subn(repl, string, count, pos, endpos, concurrent) def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the replacement format. number is the number of substitutions that were made. format can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).subfn(format, string, count, pos, endpos, concurrent) def split(pattern, string, maxsplit=0, flags=0, concurrent=None, **kwargs): """Split the source string by the occurrences of the pattern, returning a list containing the resulting substrings. If capturing parentheses are used in pattern, then the text of all groups in the pattern are also returned as part of the resulting list. If maxsplit is nonzero, at most maxsplit splits occur, and the remainder of the string is returned as the final element of the list.""" return _compile(pattern, flags, kwargs).split(string, maxsplit, concurrent) def splititer(pattern, string, maxsplit=0, flags=0, concurrent=None, **kwargs): "Return an iterator yielding the parts of a split string." return _compile(pattern, flags, kwargs).splititer(string, maxsplit, concurrent) def findall(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, concurrent=None, **kwargs): """Return a list of all matches in the string. The matches may be overlapped if overlapped is True. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.""" return _compile(pattern, flags, kwargs).findall(string, pos, endpos, overlapped, concurrent) def finditer(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, concurrent=None, **kwargs): """Return an iterator over all matches in the string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a match object. Empty matches are included in the result.""" return _compile(pattern, flags, kwargs).finditer(string, pos, endpos, overlapped, concurrent) def compile(pattern, flags=0, **kwargs): "Compile a regular expression pattern, returning a pattern object." return _compile(pattern, flags, kwargs) def purge(): "Clear the regular expression cache" _cache.clear() def template(pattern, flags=0): "Compile a template pattern, returning a pattern object." return _compile(pattern, flags | TEMPLATE) def escape(pattern, special_only=False): "Escape all non-alphanumeric characters or special characters in pattern." if isinstance(pattern, unicode): s = [] if special_only: for c in pattern: if c in _METACHARS: s.append(u"\\") s.append(c) elif c == u"\x00": s.append(u"\\000") else: s.append(c) else: for c in pattern: if c in _ALNUM: s.append(c) elif c == u"\x00": s.append(u"\\000") else: s.append(u"\\") s.append(c) return u"".join(s) else: s = [] if special_only: for c in pattern: if c in _METACHARS: s.append("\\") s.append(c) elif c == "\x00": s.append("\\000") else: s.append(c) else: for c in pattern: if c in _ALNUM: s.append(c) elif c == "\x00": s.append("\\000") else: s.append("\\") s.append(c) return "".join(s) # -------------------------------------------------------------------- # Internals. import _regex_core import _regex from threading import RLock as _RLock from _regex_core import * from _regex_core import (_ALL_VERSIONS, _ALL_ENCODINGS, _FirstSetError, _UnscopedFlagSet, _check_group_features, _compile_firstset, _compile_replacement, _flatten_code, _fold_case, _get_required_string, _parse_pattern, _shrink_cache) from _regex_core import (ALNUM as _ALNUM, Info as _Info, OP as _OP, Source as _Source, Fuzzy as _Fuzzy) # Version 0 is the old behaviour, compatible with the original 're' module. # Version 1 is the new behaviour, which differs slightly. DEFAULT_VERSION = VERSION0 _METACHARS = frozenset("()[]{}?*+|^$\\.") _regex_core.DEFAULT_VERSION = DEFAULT_VERSION # Caches for the patterns and replacements. _cache = {} _cache_lock = _RLock() _named_args = {} _replacement_cache = {} # Maximum size of the cache. _MAXCACHE = 500 _MAXREPCACHE = 500 def _compile(pattern, flags=0, kwargs={}): "Compiles a regular expression to a PatternObject." try: # Do we know what keyword arguments are needed? args_key = pattern, type(pattern), flags args_needed = _named_args[args_key] # Are we being provided with its required keyword arguments? args_supplied = set() if args_needed: for k, v in args_needed: try: args_supplied.add((k, frozenset(kwargs[k]))) except KeyError: raise error("missing named list") args_supplied = frozenset(args_supplied) # Have we already seen this regular expression and named list? pattern_key = (pattern, type(pattern), flags, args_supplied, DEFAULT_VERSION) return _cache[pattern_key] except KeyError: # It's a new pattern, or new named list for a known pattern. pass # Guess the encoding from the class of the pattern string. if isinstance(pattern, unicode): guess_encoding = UNICODE elif isinstance(pattern, str): guess_encoding = ASCII elif isinstance(pattern, _pattern_type): if flags: raise ValueError("can't process flags argument with a compiled pattern") return pattern else: raise TypeError("first argument must be a string or compiled pattern") # Set the default version in the core code in case it has been changed. _regex_core.DEFAULT_VERSION = DEFAULT_VERSION caught_exception = None while True: try: source = _Source(pattern) info = _Info(flags, source.char_type, kwargs) info.guess_encoding = guess_encoding source.ignore_space = bool(info.flags & VERBOSE) parsed = _parse_pattern(source, info) break except _UnscopedFlagSet: # Remember the global flags for the next attempt. flags = info.global_flags except error, e: caught_exception = e if caught_exception: raise error(str(caught_exception)) if not source.at_end(): raise error("trailing characters in pattern at position %d" % source.pos) # Check the global flags for conflicts. version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version not in (0, VERSION0, VERSION1): raise ValueError("VERSION0 and VERSION1 flags are mutually incompatible") if (info.flags & _ALL_ENCODINGS) not in (0, ASCII, LOCALE, UNICODE): raise ValueError("ASCII, LOCALE and UNICODE flags are mutually incompatible") if not (info.flags & _ALL_ENCODINGS): if isinstance(pattern, unicode): info.flags |= UNICODE else: info.flags |= ASCII reverse = bool(info.flags & REVERSE) fuzzy = isinstance(parsed, _Fuzzy) # Should we print the parsed pattern? if flags & DEBUG: parsed.dump(indent=0, reverse=reverse) # Fix the group references. parsed.fix_groups(reverse, False) # Optimise the parsed pattern. parsed = parsed.optimise(info) parsed = parsed.pack_characters(info) # Get the required string. req_offset, req_chars, req_flags = _get_required_string(parsed, info.flags) # Build the named lists. named_lists = {} named_list_indexes = [None] * len(info.named_lists_used) args_needed = set() for key, index in info.named_lists_used.items(): name, case_flags = key values = frozenset(kwargs[name]) if case_flags: items = frozenset(_fold_case(info, v) for v in values) else: items = values named_lists[name] = values named_list_indexes[index] = items args_needed.add((name, values)) # Check the features of the groups. _check_group_features(info, parsed) # Compile the parsed pattern. The result is a list of tuples. code = parsed.compile(reverse) # Is there a group call to the pattern as a whole? key = (0, reverse, fuzzy) ref = info.call_refs.get(key) if ref is not None: code = [(_OP.CALL_REF, ref)] + code + [(_OP.END, )] # Add the final 'success' opcode. code += [(_OP.SUCCESS, )] # Compile the additional copies of the groups that we need. for group, rev, fuz in info.additional_groups: code += group.compile(rev, fuz) # Flatten the code into a list of ints. code = _flatten_code(code) if not parsed.has_simple_start(): # Get the first set, if possible. try: fs_code = _compile_firstset(info, parsed.get_firstset(reverse)) fs_code = _flatten_code(fs_code) code = fs_code + code except _FirstSetError: pass # The named capture groups. index_group = dict((v, n) for n, v in info.group_index.items()) # Create the PatternObject. # # Local flags like IGNORECASE affect the code generation, but aren't needed # by the PatternObject itself. Conversely, global flags like LOCALE _don't_ # affect the code generation but _are_ needed by the PatternObject. compiled_pattern = _regex.compile(pattern, info.flags | version, code, info.group_index, index_group, named_lists, named_list_indexes, req_offset, req_chars, req_flags, info.group_count) # Do we need to reduce the size of the cache? if len(_cache) >= _MAXCACHE: _cache_lock.acquire() try: _shrink_cache(_cache, _named_args, _MAXCACHE) finally: _cache_lock.release() args_needed = frozenset(args_needed) # Store this regular expression and named list. pattern_key = (pattern, type(pattern), flags, args_needed, DEFAULT_VERSION) _cache[pattern_key] = compiled_pattern # Store what keyword arguments are needed. _named_args[args_key] = args_needed return compiled_pattern def _compile_replacement_helper(pattern, template): "Compiles a replacement template." # This function is called by the _regex module. # Have we seen this before? key = pattern.pattern, pattern.flags, template compiled = _replacement_cache.get(key) if compiled is not None: return compiled if len(_replacement_cache) >= _MAXREPCACHE: _replacement_cache.clear() is_unicode = isinstance(template, unicode) source = _Source(template) if is_unicode: def make_string(char_codes): return u"".join(unichr(c) for c in char_codes) else: def make_string(char_codes): return "".join(chr(c) for c in char_codes) compiled = [] literal = [] while True: ch = source.get() if not ch: break if ch == "\\": # '_compile_replacement' will return either an int group reference # or a string literal. It returns items (plural) in order to handle # a 2-character literal (an invalid escape sequence). is_group, items = _compile_replacement(source, pattern, is_unicode) if is_group: # It's a group, so first flush the literal. if literal: compiled.append(make_string(literal)) literal = [] compiled.extend(items) else: literal.extend(items) else: literal.append(ord(ch)) # Flush the literal. if literal: compiled.append(make_string(literal)) _replacement_cache[key] = compiled return compiled # We define _pattern_type here after all the support objects have been defined. _pattern_type = type(_compile("", 0, {})) # We'll define an alias for the 'compile' function so that the repr of a # pattern object is eval-able. Regex = compile # Register myself for pickling. import copy_reg as _copy_reg def _pickle(p): return _compile, (p.pattern, p.flags) _copy_reg.pickle(_pattern_type, _pickle, _compile) if not hasattr(str, "format"): # Strings don't have the .format method (below Python 2.6). while True: _start = __doc__.find(" subf") if _start < 0: break _end = __doc__.find("\n", _start) + 1 while __doc__.startswith(" ", _end): _end = __doc__.find("\n", _end) + 1 __doc__ = __doc__[ : _start] + __doc__[_end : ] __all__ = [_name for _name in __all__ if not _name.startswith("subf")] del _start, _end del subf, subfn regex-2014.02.16/Python2/test_regex.py0000666000000000000000000044766012300213377015460 0ustar 00000000000000from __future__ import with_statement import regex import string from weakref import proxy import unittest import copy from test.test_support import run_unittest import re # _AssertRaisesContext is defined here because the class doesn't exist before # Python 2.7. class _AssertRaisesContext(object): """A context manager used to implement TestCase.assertRaises* methods.""" def __init__(self, expected, test_case, expected_regexp=None): self.expected = expected self.failureException = test_case.failureException self.expected_regexp = expected_regexp def __enter__(self): return self def __exit__(self, exc_type, exc_value, tb): if exc_type is None: try: exc_name = self.expected.__name__ except AttributeError: exc_name = str(self.expected) raise self.failureException( "{0} not raised".format(exc_name)) if not issubclass(exc_type, self.expected): # let unexpected exceptions pass through return False self.exception = exc_value # store for later retrieval if self.expected_regexp is None: return True expected_regexp = self.expected_regexp if isinstance(expected_regexp, basestring): expected_regexp = re.compile(expected_regexp) if not expected_regexp.search(str(exc_value)): raise self.failureException('"%s" does not match "%s"' % (expected_regexp.pattern, str(exc_value))) return True class RegexTests(unittest.TestCase): PATTERN_CLASS = "" FLAGS_WITH_COMPILED_PAT = "can't process flags argument with a compiled pattern" INVALID_GROUP_REF = "invalid group reference" MISSING_GT = "missing >" BAD_GROUP_NAME = "bad group name" MISSING_LT = "missing <" UNKNOWN_GROUP_I = "unknown group" UNKNOWN_GROUP = "unknown group" BAD_ESCAPE = "bad escape" BAD_OCTAL_ESCAPE = "bad octal escape" BAD_SET = "bad set" STR_PAT_ON_BYTES = "can't use a string pattern on a bytes-like object" BYTES_PAT_ON_STR = "can't use a bytes pattern on a string-like object" STR_PAT_BYTES_TEMPL = "expected str instance, bytes found" BYTES_PAT_STR_TEMPL = "expected bytes instance, str found" BYTES_PAT_UNI_FLAG = "can't use UNICODE flag with a bytes pattern" MIXED_FLAGS = "ASCII, LOCALE and UNICODE flags are mutually incompatible" MISSING_RPAREN = "missing \\)" # Need to escape parenthesis for unittest. TRAILING_CHARS = "trailing characters in pattern" BAD_CHAR_RANGE = "bad character range" NOTHING_TO_REPEAT = "nothing to repeat" OPEN_GROUP = "can't refer to an open group" DUPLICATE_GROUP = "duplicate group" CANT_TURN_OFF = "bad inline flags: can't turn flags off" UNDEF_CHAR_NAME = "undefined character name" # assertRaisesRegex is defined here because the method isn't in the # superclass before Python 2.7. def assertRaisesRegex(self, expected_exception, expected_regexp, callable_obj=None, *args, **kwargs): """Asserts that the message in a raised exception matches a regexp. Args: expected_exception: Exception class expected to be raised. expected_regexp: Regexp (re pattern object or string) expected to be found in error message. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs. """ context = _AssertRaisesContext(expected_exception, self, expected_regexp) if callable_obj is None: return context with context: callable_obj(*args, **kwargs) def assertTypedEqual(self, actual, expect, msg=None): self.assertEqual(actual, expect, msg) def recurse(actual, expect): if isinstance(expect, (tuple, list)): for x, y in zip(actual, expect): recurse(x, y) else: self.assertIs(type(actual), type(expect), msg) recurse(actual, expect) def test_weakref(self): s = 'QabbbcR' x = regex.compile('ab+c') y = proxy(x) if x.findall('QabbbcR') != y.findall('QabbbcR'): self.fail() def test_search_star_plus(self): self.assertEqual(regex.search('a*', 'xxx').span(0), (0, 0)) self.assertEqual(regex.search('x*', 'axx').span(), (0, 0)) self.assertEqual(regex.search('x+', 'axx').span(0), (1, 3)) self.assertEqual(regex.search('x+', 'axx').span(), (1, 3)) self.assertEqual(regex.search('x', 'aaa'), None) self.assertEqual(regex.match('a*', 'xxx').span(0), (0, 0)) self.assertEqual(regex.match('a*', 'xxx').span(), (0, 0)) self.assertEqual(regex.match('x*', 'xxxa').span(0), (0, 3)) self.assertEqual(regex.match('x*', 'xxxa').span(), (0, 3)) self.assertEqual(regex.match('a+', 'xxx'), None) def bump_num(self, matchobj): int_value = int(matchobj[0]) return str(int_value + 1) def test_basic_regex_sub(self): self.assertEqual(regex.sub("(?i)b+", "x", "bbbb BBBB"), 'x x') self.assertEqual(regex.sub(r'\d+', self.bump_num, '08.2 -2 23x99y'), '9.3 -3 24x100y') self.assertEqual(regex.sub(r'\d+', self.bump_num, '08.2 -2 23x99y', 3), '9.3 -3 23x99y') self.assertEqual(regex.sub('.', lambda m: r"\n", 'x'), "\\n") self.assertEqual(regex.sub('.', r"\n", 'x'), "\n") self.assertEqual(regex.sub('(?Px)', r'\g\g', 'xx'), 'xxxx') self.assertEqual(regex.sub('(?Px)', r'\g\g<1>', 'xx'), 'xxxx') self.assertEqual(regex.sub('(?Px)', r'\g\g', 'xx'), 'xxxx') self.assertEqual(regex.sub('(?Px)', r'\g<1>\g<1>', 'xx'), 'xxxx') self.assertEqual(regex.sub('a', r'\t\n\v\r\f\a\b\B\Z\a\A\w\W\s\S\d\D', 'a'), "\t\n\v\r\f\a\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D") self.assertEqual(regex.sub('a', '\t\n\v\r\f\a', 'a'), "\t\n\v\r\f\a") self.assertEqual(regex.sub('a', '\t\n\v\r\f\a', 'a'), chr(9) + chr(10) + chr(11) + chr(13) + chr(12) + chr(7)) self.assertEqual(regex.sub(r'^\s*', 'X', 'test'), 'Xtest') self.assertEqual(regex.sub(ur"x", ur"\x0A", u"x"), u"\n") self.assertEqual(regex.sub(ur"x", ur"\u000A", u"x"), u"\n") self.assertEqual(regex.sub(ur"x", ur"\U0000000A", u"x"), u"\n") self.assertEqual(regex.sub(ur"x", ur"\N{LATIN CAPITAL LETTER A}", u"x"), u"A") self.assertEqual(regex.sub(r"x", r"\x0A", "x"), "\n") self.assertEqual(regex.sub(r"x", r"\u000A", "x"), "\\u000A") self.assertEqual(regex.sub(r"x", r"\U0000000A", "x"), "\\U0000000A") self.assertEqual(regex.sub(r"x", r"\N{LATIN CAPITAL LETTER A}", "x"), "\\N{LATIN CAPITAL LETTER A}") def test_bug_449964(self): # Fails for group followed by other escape. self.assertEqual(regex.sub(r'(?Px)', r'\g<1>\g<1>\b', 'xx'), "xx\bxx\b") def test_bug_449000(self): # Test for sub() on escaped characters. self.assertEqual(regex.sub(r'\r\n', r'\n', 'abc\r\ndef\r\n'), "abc\ndef\n") self.assertEqual(regex.sub('\r\n', r'\n', 'abc\r\ndef\r\n'), "abc\ndef\n") self.assertEqual(regex.sub(r'\r\n', '\n', 'abc\r\ndef\r\n'), "abc\ndef\n") self.assertEqual(regex.sub('\r\n', '\n', 'abc\r\ndef\r\n'), "abc\ndef\n") def test_bug_1140(self): # regex.sub(x, y, u'') should return u'', not '', and # regex.sub(x, y, '') should return '', not u''. # Also: # regex.sub(x, y, unicode(x)) should return unicode(y), and # regex.sub(x, y, str(x)) should return # str(y) if isinstance(y, str) else unicode(y). for x in 'x', u'x': for y in 'y', u'y': z = regex.sub(x, y, u'') self.assertEqual((type(z), z), (unicode, u'')) z = regex.sub(x, y, '') self.assertEqual((type(z), z), (str, '')) z = regex.sub(x, y, unicode(x)) self.assertEqual((type(z), z), (unicode, unicode(y))) z = regex.sub(x, y, str(x)) self.assertEqual((type(z), z), (type(y), y)) def test_bug_1661(self): # Verify that flags do not get silently ignored with compiled patterns pattern = regex.compile('.') self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.match(pattern, 'A', regex.I)) self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.search(pattern, 'A', regex.I)) self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.findall(pattern, 'A', regex.I)) self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.compile(pattern, regex.I)) def test_bug_3629(self): # A regex that triggered a bug in the sre-code validator self.assertEqual(repr(type(regex.compile("(?P)(?(quote))"))), self.PATTERN_CLASS) def test_sub_template_numeric_escape(self): # Bug 776311 and friends. self.assertEqual(regex.sub('x', r'\0', 'x'), "\0") self.assertEqual(regex.sub('x', r'\000', 'x'), "\000") self.assertEqual(regex.sub('x', r'\001', 'x'), "\001") self.assertEqual(regex.sub('x', r'\008', 'x'), "\0" + "8") self.assertEqual(regex.sub('x', r'\009', 'x'), "\0" + "9") self.assertEqual(regex.sub('x', r'\111', 'x'), "\111") self.assertEqual(regex.sub('x', r'\117', 'x'), "\117") self.assertEqual(regex.sub('x', r'\1111', 'x'), "\1111") self.assertEqual(regex.sub('x', r'\1111', 'x'), "\111" + "1") self.assertEqual(regex.sub('x', r'\00', 'x'), '\x00') self.assertEqual(regex.sub('x', r'\07', 'x'), '\x07') self.assertEqual(regex.sub('x', r'\08', 'x'), "\0" + "8") self.assertEqual(regex.sub('x', r'\09', 'x'), "\0" + "9") self.assertEqual(regex.sub('x', r'\0a', 'x'), "\0" + "a") self.assertEqual(regex.sub(u'x', ur'\400', u'x'), u"\u0100") self.assertEqual(regex.sub(u'x', ur'\777', u'x'), u"\u01FF") self.assertEqual(regex.sub('x', r'\400', 'x'), "\x00") self.assertEqual(regex.sub('x', r'\777', 'x'), "\xFF") self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\1', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\8', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\9', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\11', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\18', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\1a', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\90', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\99', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\118', 'x')) # r'\11' + '8' self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\11a', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\181', 'x')) # r'\18' + '1' self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\800', 'x')) # r'\80' + '0' # In Python 2.3 (etc), these loop endlessly in sre_parser.py. self.assertEqual(regex.sub('(((((((((((x)))))))))))', r'\11', 'x'), 'x') self.assertEqual(regex.sub('((((((((((y))))))))))(.)', r'\118', 'xyz'), 'xz8') self.assertEqual(regex.sub('((((((((((y))))))))))(.)', r'\11a', 'xyz'), 'xza') def test_qualified_re_sub(self): self.assertEqual(regex.sub('a', 'b', 'aaaaa'), 'bbbbb') self.assertEqual(regex.sub('a', 'b', 'aaaaa', 1), 'baaaa') def test_bug_114660(self): self.assertEqual(regex.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there'), 'hello there') def test_bug_462270(self): # Test for empty sub() behaviour, see SF bug #462270 self.assertEqual(regex.sub('(?V0)x*', '-', 'abxd'), '-a-b-d-') self.assertEqual(regex.sub('(?V1)x*', '-', 'abxd'), '-a-b--d-') self.assertEqual(regex.sub('x+', '-', 'abxd'), 'ab-d') def test_bug_14462(self): # chr(255) is not a valid identifier in Python 2. group_name = u'\xFF' self.assertRaisesRegex(regex.error, self.BAD_GROUP_NAME, lambda: regex.search(ur'(?P<' + group_name + '>a)', u'a')) def test_symbolic_refs(self): self.assertRaisesRegex(regex.error, self.MISSING_GT, lambda: regex.sub('(?Px)', r'\gx)', r'\g<', 'xx')) self.assertRaisesRegex(regex.error, self.MISSING_LT, lambda: regex.sub('(?Px)', r'\g', 'xx')) self.assertRaisesRegex(regex.error, self.BAD_GROUP_NAME, lambda: regex.sub('(?Px)', r'\g', 'xx')) self.assertRaisesRegex(regex.error, self.BAD_GROUP_NAME, lambda: regex.sub('(?Px)', r'\g<1a1>', 'xx')) self.assertRaisesRegex(IndexError, self.UNKNOWN_GROUP_I, lambda: regex.sub('(?Px)', r'\g', 'xx')) # The new behaviour of unmatched but valid groups is to treat them like # empty matches in the replacement template, like in Perl. self.assertEqual(regex.sub('(?Px)|(?Py)', r'\g', 'xx'), '') self.assertEqual(regex.sub('(?Px)|(?Py)', r'\2', 'xx'), '') # The old behaviour was to raise it as an IndexError. self.assertRaisesRegex(regex.error, self.BAD_GROUP_NAME, lambda: regex.sub('(?Px)', r'\g<-1>', 'xx')) def test_re_subn(self): self.assertEqual(regex.subn("(?i)b+", "x", "bbbb BBBB"), ('x x', 2)) self.assertEqual(regex.subn("b+", "x", "bbbb BBBB"), ('x BBBB', 1)) self.assertEqual(regex.subn("b+", "x", "xyz"), ('xyz', 0)) self.assertEqual(regex.subn("b*", "x", "xyz"), ('xxxyxzx', 4)) self.assertEqual(regex.subn("b*", "x", "xyz", 2), ('xxxyz', 2)) def test_re_split(self): self.assertEqual(regex.split(":", ":a:b::c"), ['', 'a', 'b', '', 'c']) self.assertEqual(regex.split(":*", ":a:b::c"), ['', 'a', 'b', 'c']) self.assertEqual(regex.split("(:*)", ":a:b::c"), ['', ':', 'a', ':', 'b', '::', 'c']) self.assertEqual(regex.split("(?::*)", ":a:b::c"), ['', 'a', 'b', 'c']) self.assertEqual(regex.split("(:)*", ":a:b::c"), ['', ':', 'a', ':', 'b', ':', 'c']) self.assertEqual(regex.split("([b:]+)", ":a:b::c"), ['', ':', 'a', ':b::', 'c']) self.assertEqual(regex.split("(b)|(:+)", ":a:b::c"), ['', None, ':', 'a', None, ':', '', 'b', None, '', None, '::', 'c']) self.assertEqual(regex.split("(?:b)|(?::+)", ":a:b::c"), ['', 'a', '', '', 'c']) self.assertEqual(regex.split("x", "xaxbxc"), ['', 'a', 'b', 'c']) self.assertEqual([m for m in regex.splititer("x", "xaxbxc")], ['', 'a', 'b', 'c']) self.assertEqual(regex.split("(?r)x", "xaxbxc"), ['c', 'b', 'a', '']) self.assertEqual([m for m in regex.splititer("(?r)x", "xaxbxc")], ['c', 'b', 'a', '']) self.assertEqual(regex.split("(x)|(y)", "xaxbxc"), ['', 'x', None, 'a', 'x', None, 'b', 'x', None, 'c']) self.assertEqual([m for m in regex.splititer("(x)|(y)", "xaxbxc")], ['', 'x', None, 'a', 'x', None, 'b', 'x', None, 'c']) self.assertEqual(regex.split("(?r)(x)|(y)", "xaxbxc"), ['c', 'x', None, 'b', 'x', None, 'a', 'x', None, '']) self.assertEqual([m for m in regex.splititer("(?r)(x)|(y)", "xaxbxc")], ['c', 'x', None, 'b', 'x', None, 'a', 'x', None, '']) self.assertEqual(regex.split(r"(?V1)\b", "a b c"), ['', 'a', ' ', 'b', ' ', 'c', '']) self.assertEqual(regex.split(r"(?V1)\m", "a b c"), ['', 'a ', 'b ', 'c']) self.assertEqual(regex.split(r"(?V1)\M", "a b c"), ['a', ' b', ' c', '']) def test_qualified_re_split(self): self.assertEqual(regex.split(":", ":a:b::c", 2), ['', 'a', 'b::c']) self.assertEqual(regex.split(':', 'a:b:c:d', 2), ['a', 'b', 'c:d']) self.assertEqual(regex.split("(:)", ":a:b::c", 2), ['', ':', 'a', ':', 'b::c']) self.assertEqual(regex.split("(:*)", ":a:b::c", 2), ['', ':', 'a', ':', 'b::c']) def test_re_findall(self): self.assertEqual(regex.findall(":+", "abc"), []) self.assertEqual(regex.findall(":+", "a:b::c:::d"), [':', '::', ':::']) self.assertEqual(regex.findall("(:+)", "a:b::c:::d"), [':', '::', ':::']) self.assertEqual(regex.findall("(:)(:*)", "a:b::c:::d"), [(':', ''), (':', ':'), (':', '::')]) self.assertEqual(regex.findall(r"\((?P.{0,5}?TEST)\)", "(MY TEST)"), ["MY TEST"]) self.assertEqual(regex.findall(r"\((?P.{0,3}?TEST)\)", "(MY TEST)"), ["MY TEST"]) self.assertEqual(regex.findall(r"\((?P.{0,3}?T)\)", "(MY T)"), ["MY T"]) self.assertEqual(regex.findall(r"[^a]{2}[A-Z]", "\n S"), [' S']) self.assertEqual(regex.findall(r"[^a]{2,3}[A-Z]", "\n S"), ['\n S']) self.assertEqual(regex.findall(r"[^a]{2,3}[A-Z]", "\n S"), [' S']) self.assertEqual(regex.findall(r"X(Y[^Y]+?){1,2}( |Q)+DEF", "XYABCYPPQ\nQ DEF"), [('YPPQ\n', ' ')]) self.assertEqual(regex.findall(r"(\nTest(\n+.+?){0,2}?)?\n+End", "\nTest\nxyz\nxyz\nEnd"), [('\nTest\nxyz\nxyz', '\nxyz')]) def test_bug_117612(self): self.assertEqual(regex.findall(r"(a|(b))", "aba"), [('a', ''), ('b', 'b'), ('a', '')]) def test_re_match(self): self.assertEqual(regex.match('a', 'a')[:], ('a',)) self.assertEqual(regex.match('(a)', 'a')[:], ('a', 'a')) self.assertEqual(regex.match(r'(a)', 'a')[0], 'a') self.assertEqual(regex.match(r'(a)', 'a')[1], 'a') self.assertEqual(regex.match(r'(a)', 'a').group(1, 1), ('a', 'a')) pat = regex.compile('((a)|(b))(c)?') self.assertEqual(pat.match('a')[:], ('a', 'a', 'a', None, None)) self.assertEqual(pat.match('b')[:], ('b', 'b', None, 'b', None)) self.assertEqual(pat.match('ac')[:], ('ac', 'a', 'a', None, 'c')) self.assertEqual(pat.match('bc')[:], ('bc', 'b', None, 'b', 'c')) self.assertEqual(pat.match('bc')[:], ('bc', 'b', None, 'b', 'c')) # A single group. m = regex.match('(a)', 'a') self.assertEqual(m.group(), 'a') self.assertEqual(m.group(0), 'a') self.assertEqual(m.group(1), 'a') self.assertEqual(m.group(1, 1), ('a', 'a')) pat = regex.compile('(?:(?Pa)|(?Pb))(?Pc)?') self.assertEqual(pat.match('a').group(1, 2, 3), ('a', None, None)) self.assertEqual(pat.match('b').group('a1', 'b2', 'c3'), (None, 'b', None)) self.assertEqual(pat.match('ac').group(1, 'b2', 3), ('a', None, 'c')) def test_re_groupref_exists(self): self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', '(a)')[:], ('(a)', '(', 'a')) self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', 'a')[:], ('a', None, 'a')) self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', 'a)'), None) self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', '(a'), None) self.assertEqual(regex.match('^(?:(a)|c)((?(1)b|d))$', 'ab')[:], ('ab', 'a', 'b')) self.assertEqual(regex.match('^(?:(a)|c)((?(1)b|d))$', 'cd')[:], ('cd', None, 'd')) self.assertEqual(regex.match('^(?:(a)|c)((?(1)|d))$', 'cd')[:], ('cd', None, 'd')) self.assertEqual(regex.match('^(?:(a)|c)((?(1)|d))$', 'a')[:], ('a', 'a', '')) # Tests for bug #1177831: exercise groups other than the first group. p = regex.compile('(?Pa)(?Pb)?((?(g2)c|d))') self.assertEqual(p.match('abc')[:], ('abc', 'a', 'b', 'c')) self.assertEqual(p.match('ad')[:], ('ad', 'a', None, 'd')) self.assertEqual(p.match('abd'), None) self.assertEqual(p.match('ac'), None) def test_re_groupref(self): self.assertEqual(regex.match(r'^(\|)?([^()]+)\1$', '|a|')[:], ('|a|', '|', 'a')) self.assertEqual(regex.match(r'^(\|)?([^()]+)\1?$', 'a')[:], ('a', None, 'a')) self.assertEqual(regex.match(r'^(\|)?([^()]+)\1$', 'a|'), None) self.assertEqual(regex.match(r'^(\|)?([^()]+)\1$', '|a'), None) self.assertEqual(regex.match(r'^(?:(a)|c)(\1)$', 'aa')[:], ('aa', 'a', 'a')) self.assertEqual(regex.match(r'^(?:(a)|c)(\1)?$', 'c')[:], ('c', None, None)) self.assertEqual(regex.findall("(?i)(.{1,40}?),(.{1,40}?)(?:;)+(.{1,80}).{1,40}?\\3(\ |;)+(.{1,80}?)\\1", "TEST, BEST; LEST ; Lest 123 Test, Best"), [('TEST', ' BEST', ' LEST', ' ', '123 ')]) def test_groupdict(self): self.assertEqual(regex.match('(?Pfirst) (?Psecond)', 'first second').groupdict(), {'first': 'first', 'second': 'second'}) def test_expand(self): self.assertEqual(regex.match("(?Pfirst) (?Psecond)", "first second").expand(r"\2 \1 \g \g"), 'second first second first') def test_repeat_minmax(self): self.assertEqual(regex.match(r"^(\w){1}$", "abc"), None) self.assertEqual(regex.match(r"^(\w){1}?$", "abc"), None) self.assertEqual(regex.match(r"^(\w){1,2}$", "abc"), None) self.assertEqual(regex.match(r"^(\w){1,2}?$", "abc"), None) self.assertEqual(regex.match(r"^(\w){3}$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,3}$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,4}$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){3,4}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){3}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,3}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,4}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){3,4}?$", "abc")[1], 'c') self.assertEqual(regex.match("^x{1}$", "xxx"), None) self.assertEqual(regex.match("^x{1}?$", "xxx"), None) self.assertEqual(regex.match("^x{1,2}$", "xxx"), None) self.assertEqual(regex.match("^x{1,2}?$", "xxx"), None) self.assertEqual(regex.match("^x{1}", "xxx")[0], 'x') self.assertEqual(regex.match("^x{1}?", "xxx")[0], 'x') self.assertEqual(regex.match("^x{0,1}", "xxx")[0], 'x') self.assertEqual(regex.match("^x{0,1}?", "xxx")[0], '') self.assertEqual(bool(regex.match("^x{3}$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,3}$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,4}$", "xxx")), True) self.assertEqual(bool(regex.match("^x{3,4}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{3}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,3}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,4}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{3,4}?$", "xxx")), True) self.assertEqual(regex.match("^x{}$", "xxx"), None) self.assertEqual(bool(regex.match("^x{}$", "x{}")), True) def test_getattr(self): self.assertEqual(regex.compile("(?i)(a)(b)").pattern, '(?i)(a)(b)') self.assertEqual(regex.compile("(?i)(a)(b)").flags, regex.A | regex.I | regex.DEFAULT_VERSION) self.assertEqual(regex.compile(u"(?i)(a)(b)").flags, regex.I | regex.U | regex.DEFAULT_VERSION) self.assertEqual(regex.compile("(?i)(a)(b)").groups, 2) self.assertEqual(regex.compile("(?i)(a)(b)").groupindex, {}) self.assertEqual(regex.compile("(?i)(?Pa)(?Pb)").groupindex, {'first': 1, 'other': 2}) self.assertEqual(regex.match("(a)", "a").pos, 0) self.assertEqual(regex.match("(a)", "a").endpos, 1) self.assertEqual(regex.search("b(c)", "abcdef").pos, 0) self.assertEqual(regex.search("b(c)", "abcdef").endpos, 6) self.assertEqual(regex.search("b(c)", "abcdef").span(), (1, 3)) self.assertEqual(regex.search("b(c)", "abcdef").span(1), (2, 3)) self.assertEqual(regex.match("(a)", "a").string, 'a') self.assertEqual(regex.match("(a)", "a").regs, ((0, 1), (0, 1))) self.assertEqual(repr(type(regex.match("(a)", "a").re)), self.PATTERN_CLASS) # Issue 14260. p = regex.compile(r'abc(?Pdef)') p.groupindex["n"] = 0 self.assertEqual(p.groupindex["n"], 1) def test_special_escapes(self): self.assertEqual(regex.search(r"\b(b.)\b", "abcd abc bcd bx")[1], 'bx') self.assertEqual(regex.search(r"\B(b.)\B", "abc bcd bc abxd")[1], 'bx') self.assertEqual(regex.search(r"\b(b.)\b", "abcd abc bcd bx", regex.LOCALE)[1], 'bx') self.assertEqual(regex.search(r"\B(b.)\B", "abc bcd bc abxd", regex.LOCALE)[1], 'bx') self.assertEqual(regex.search(ur"\b(b.)\b", u"abcd abc bcd bx", regex.UNICODE)[1], u'bx') self.assertEqual(regex.search(ur"\B(b.)\B", u"abc bcd bc abxd", regex.UNICODE)[1], u'bx') self.assertEqual(regex.search(r"^abc$", "\nabc\n", regex.M)[0], 'abc') self.assertEqual(regex.search(r"^\Aabc\Z$", "abc", regex.M)[0], 'abc') self.assertEqual(regex.search(r"^\Aabc\Z$", "\nabc\n", regex.M), None) self.assertEqual(regex.search(ur"\b(b.)\b", u"abcd abc bcd bx")[1], u'bx') self.assertEqual(regex.search(ur"\B(b.)\B", u"abc bcd bc abxd")[1], u'bx') self.assertEqual(regex.search(ur"^abc$", u"\nabc\n", regex.M)[0], u'abc') self.assertEqual(regex.search(ur"^\Aabc\Z$", u"abc", regex.M)[0], u'abc') self.assertEqual(regex.search(ur"^\Aabc\Z$", u"\nabc\n", regex.M), None) self.assertEqual(regex.search(r"\d\D\w\W\s\S", "1aa! a")[0], '1aa! a') self.assertEqual(regex.search(r"\d\D\w\W\s\S", "1aa! a", regex.LOCALE)[0], '1aa! a') self.assertEqual(regex.search(ur"\d\D\w\W\s\S", u"1aa! a", regex.UNICODE)[0], u'1aa! a') def test_bigcharset(self): self.assertEqual(regex.match(ur"(?u)([\u2222\u2223])", u"\u2222")[1], u'\u2222') self.assertEqual(regex.match(ur"(?u)([\u2222\u2223])", u"\u2222", regex.UNICODE)[1], u'\u2222') self.assertEqual(u"".join(regex.findall(u".", u"e\xe8\xe9\xea\xeb\u0113\u011b\u0117", flags=regex.UNICODE)), u'e\xe8\xe9\xea\xeb\u0113\u011b\u0117') self.assertEqual(u"".join(regex.findall(ur"[e\xe8\xe9\xea\xeb\u0113\u011b\u0117]", u"e\xe8\xe9\xea\xeb\u0113\u011b\u0117", flags=regex.UNICODE)), u'e\xe8\xe9\xea\xeb\u0113\u011b\u0117') self.assertEqual(u"".join(regex.findall(ur"e|\xe8|\xe9|\xea|\xeb|\u0113|\u011b|\u0117", u"e\xe8\xe9\xea\xeb\u0113\u011b\u0117", flags=regex.UNICODE)), u'e\xe8\xe9\xea\xeb\u0113\u011b\u0117') def test_anyall(self): self.assertEqual(regex.match("a.b", "a\nb", regex.DOTALL)[0], "a\nb") self.assertEqual(regex.match("a.*b", "a\n\nb", regex.DOTALL)[0], "a\n\nb") def test_non_consuming(self): self.assertEqual(regex.match(r"(a(?=\s[^a]))", "a b")[1], 'a') self.assertEqual(regex.match(r"(a(?=\s[^a]*))", "a b")[1], 'a') self.assertEqual(regex.match(r"(a(?=\s[abc]))", "a b")[1], 'a') self.assertEqual(regex.match(r"(a(?=\s[abc]*))", "a bc")[1], 'a') self.assertEqual(regex.match(r"(a)(?=\s\1)", "a a")[1], 'a') self.assertEqual(regex.match(r"(a)(?=\s\1*)", "a aa")[1], 'a') self.assertEqual(regex.match(r"(a)(?=\s(abc|a))", "a a")[1], 'a') self.assertEqual(regex.match(r"(a(?!\s[^a]))", "a a")[1], 'a') self.assertEqual(regex.match(r"(a(?!\s[abc]))", "a d")[1], 'a') self.assertEqual(regex.match(r"(a)(?!\s\1)", "a b")[1], 'a') self.assertEqual(regex.match(r"(a)(?!\s(abc|a))", "a b")[1], 'a') def test_ignore_case(self): self.assertEqual(regex.match("abc", "ABC", regex.I)[0], 'ABC') self.assertEqual(regex.match(u"abc", u"ABC", regex.I)[0], u'ABC') self.assertEqual(regex.match(r"(a\s[^a]*)", "a bb", regex.I)[1], 'a bb') self.assertEqual(regex.match(r"(a\s[abc])", "a b", regex.I)[1], 'a b') self.assertEqual(regex.match(r"(a\s[abc]*)", "a bb", regex.I)[1], 'a bb') self.assertEqual(regex.match(r"((a)\s\2)", "a a", regex.I)[1], 'a a') self.assertEqual(regex.match(r"((a)\s\2*)", "a aa", regex.I)[1], 'a aa') self.assertEqual(regex.match(r"((a)\s(abc|a))", "a a", regex.I)[1], 'a a') self.assertEqual(regex.match(r"((a)\s(abc|a)*)", "a aa", regex.I)[1], 'a aa') # Issue 3511. self.assertEqual(regex.match(r"[Z-a]", "_").span(), (0, 1)) self.assertEqual(regex.match(r"(?i)[Z-a]", "_").span(), (0, 1)) self.assertEqual(bool(regex.match(ur"(?iu)nao", u"nAo")), True) self.assertEqual(bool(regex.match(ur"(?iu)n\xE3o", u"n\xC3o")), True) self.assertEqual(bool(regex.match(ur"(?iu)n\xE3o", u"N\xC3O")), True) self.assertEqual(bool(regex.match(ur"(?iu)s", u"\u017F")), True) def test_case_folding(self): self.assertEqual(regex.search(ur"(?fiu)ss", u"SS").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)SS", u"ss").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)SS", u"\N{LATIN SMALL LETTER SHARP S}").span(), (0, 1)) self.assertEqual(regex.search(ur"(?fi)\N{LATIN SMALL LETTER SHARP S}", u"SS").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)\N{LATIN SMALL LIGATURE ST}", u"ST").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)ST", u"\N{LATIN SMALL LIGATURE ST}").span(), (0, 1)) self.assertEqual(regex.search(ur"(?fiu)ST", u"\N{LATIN SMALL LIGATURE LONG S T}").span(), (0, 1)) self.assertEqual(regex.search(ur"(?fiu)SST", u"\N{LATIN SMALL LETTER SHARP S}t").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)SST", u"s\N{LATIN SMALL LIGATURE LONG S T}").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)SST", u"s\N{LATIN SMALL LIGATURE ST}").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)\N{LATIN SMALL LIGATURE ST}", u"SST").span(), (1, 3)) self.assertEqual(regex.search(ur"(?fiu)SST", u"s\N{LATIN SMALL LIGATURE ST}").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)FFI", u"\N{LATIN SMALL LIGATURE FFI}").span(), (0, 1)) self.assertEqual(regex.search(ur"(?fiu)FFI", u"\N{LATIN SMALL LIGATURE FF}i").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)FFI", u"f\N{LATIN SMALL LIGATURE FI}").span(), (0, 2)) self.assertEqual(regex.search(ur"(?fiu)\N{LATIN SMALL LIGATURE FFI}", u"FFI").span(), (0, 3)) self.assertEqual(regex.search(ur"(?fiu)\N{LATIN SMALL LIGATURE FF}i", u"FFI").span(), (0, 3)) self.assertEqual(regex.search(ur"(?fiu)f\N{LATIN SMALL LIGATURE FI}", u"FFI").span(), (0, 3)) sigma = u"\u03A3\u03C3\u03C2" for ch1 in sigma: for ch2 in sigma: if not regex.match(ur"(?fiu)" + ch1, ch2): self.fail() self.assertEqual(bool(regex.search(ur"(?iuV1)ff", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)ff", u"\uFB01\uFB00")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)fi", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)fi", u"\uFB01\uFB00")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)fffi", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)f\uFB03", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)ff", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)fi", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)fffi", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)f\uFB03", u"\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)f\uFB01", u"\uFB00i")), True) self.assertEqual(bool(regex.search(ur"(?iuV1)f\uFB01", u"\uFB00i")), True) self.assertEqual(regex.findall(ur"(?iuV0)\m(?:word){e<=3}\M(?ne", u"affine", options=[u"\N{LATIN SMALL LIGATURE FFI}"]).span(), (0, 6)) self.assertEqual(regex.search(ur"(?fi)a\Lne", u"a\N{LATIN SMALL LIGATURE FFI}ne", options=[u"ffi"]).span(), (0, 4)) def test_category(self): self.assertEqual(regex.match(r"(\s)", " ")[1], ' ') def test_not_literal(self): self.assertEqual(regex.search(r"\s([^a])", " b")[1], 'b') self.assertEqual(regex.search(r"\s([^a]*)", " bb")[1], 'bb') def test_search_coverage(self): self.assertEqual(regex.search(r"\s(b)", " b")[1], 'b') self.assertEqual(regex.search(r"a\s", "a ")[0], 'a ') def test_re_escape(self): p = "" self.assertEqual(regex.escape(p), p) for i in range(0, 256): p += chr(i) self.assertEqual(bool(regex.match(regex.escape(chr(i)), chr(i))), True) self.assertEqual(regex.match(regex.escape(chr(i)), chr(i)).span(), (0, 1)) pat = regex.compile(regex.escape(p)) self.assertEqual(pat.match(p).span(), (0, 256)) def test_constants(self): if regex.I != regex.IGNORECASE: self.fail() if regex.L != regex.LOCALE: self.fail() if regex.M != regex.MULTILINE: self.fail() if regex.S != regex.DOTALL: self.fail() if regex.X != regex.VERBOSE: self.fail() def test_flags(self): for flag in [regex.I, regex.M, regex.X, regex.S, regex.L]: self.assertEqual(repr(type(regex.compile('^pattern$', flag))), self.PATTERN_CLASS) def test_sre_character_literals(self): for i in [0, 8, 16, 32, 64, 127, 128, 255]: self.assertEqual(bool(regex.match(r"\%03o" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"\%03o0" % i, chr(i) + "0")), True) self.assertEqual(bool(regex.match(r"\%03o8" % i, chr(i) + "8")), True) self.assertEqual(bool(regex.match(r"\x%02x" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"\x%02x0" % i, chr(i) + "0")), True) self.assertEqual(bool(regex.match(r"\x%02xz" % i, chr(i) + "z")), True) self.assertRaisesRegex(regex.error, self.UNKNOWN_GROUP, lambda: regex.match(r"\911", "")) def test_sre_character_class_literals(self): for i in [0, 8, 16, 32, 64, 127, 128, 255]: self.assertEqual(bool(regex.match(r"[\%03o]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\%03o0]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\%03o8]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\x%02x]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\x%02x0]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\x%02xz]" % i, chr(i))), True) self.assertRaisesRegex(regex.error, self.BAD_OCTAL_ESCAPE, lambda: regex.match(r"[\911]", "")) def test_bug_113254(self): self.assertEqual(regex.match(r'(a)|(b)', 'b').start(1), -1) self.assertEqual(regex.match(r'(a)|(b)', 'b').end(1), -1) self.assertEqual(regex.match(r'(a)|(b)', 'b').span(1), (-1, -1)) def test_bug_527371(self): # Bug described in patches 527371/672491. self.assertEqual(regex.match(r'(a)?a','a').lastindex, None) self.assertEqual(regex.match(r'(a)(b)?b','ab').lastindex, 1) self.assertEqual(regex.match(r'(?Pa)(?Pb)?b','ab').lastgroup, 'a') self.assertEqual(regex.match("(?Pa(b))", "ab").lastgroup, 'a') self.assertEqual(regex.match("((a))", "a").lastindex, 1) def test_bug_545855(self): # Bug 545855 -- This pattern failed to cause a compile error as it # should, instead provoking a TypeError. self.assertRaisesRegex(regex.error, self.BAD_SET, lambda: regex.compile('foo[a-')) def test_bug_418626(self): # Bugs 418626 at al. -- Testing Greg Chapman's addition of op code # SRE_OP_MIN_REPEAT_ONE for eliminating recursion on simple uses of # pattern '*?' on a long string. self.assertEqual(regex.match('.*?c', 10000 * 'ab' + 'cd').end(0), 20001) self.assertEqual(regex.match('.*?cd', 5000 * 'ab' + 'c' + 5000 * 'ab' + 'cde').end(0), 20003) self.assertEqual(regex.match('.*?cd', 20000 * 'abc' + 'de').end(0), 60001) # Non-simple '*?' still used to hit the recursion limit, before the # non-recursive scheme was implemented. self.assertEqual(regex.search('(a|b)*?c', 10000 * 'ab' + 'cd').end(0), 20001) def test_bug_612074(self): pat = u"[" + regex.escape(u"\u2039") + u"]" self.assertEqual(regex.compile(pat) and 1, 1) def test_stack_overflow(self): # Nasty cases that used to overflow the straightforward recursive # implementation of repeated groups. self.assertEqual(regex.match('(x)*', 50000 * 'x')[1], 'x') self.assertEqual(regex.match('(x)*y', 50000 * 'x' + 'y')[1], 'x') self.assertEqual(regex.match('(x)*?y', 50000 * 'x' + 'y')[1], 'x') def test_scanner(self): def s_ident(scanner, token): return token def s_operator(scanner, token): return "op%s" % token def s_float(scanner, token): return float(token) def s_int(scanner, token): return int(token) scanner = regex.Scanner([(r"[a-zA-Z_]\w*", s_ident), (r"\d+\.\d*", s_float), (r"\d+", s_int), (r"=|\+|-|\*|/", s_operator), (r"\s+", None), ]) self.assertEqual(repr(type(scanner.scanner.scanner("").pattern)), self.PATTERN_CLASS) self.assertEqual(scanner.scan("sum = 3*foo + 312.50 + bar"), (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5, 'op+', 'bar'], '')) def test_bug_448951(self): # Bug 448951 (similar to 429357, but with single char match). # (Also test greedy matches.) for op in '', '?', '*': self.assertEqual(regex.match(r'((.%s):)?z' % op, 'z')[:], ('z', None, None)) self.assertEqual(regex.match(r'((.%s):)?z' % op, 'a:z')[:], ('a:z', 'a:', 'a')) def test_bug_725106(self): # Capturing groups in alternatives in repeats. self.assertEqual(regex.match('^((a)|b)*', 'abc')[:], ('ab', 'b', 'a')) self.assertEqual(regex.match('^(([ab])|c)*', 'abc')[:], ('abc', 'c', 'b')) self.assertEqual(regex.match('^((d)|[ab])*', 'abc')[:], ('ab', 'b', None)) self.assertEqual(regex.match('^((a)c|[ab])*', 'abc')[:], ('ab', 'b', None)) self.assertEqual(regex.match('^((a)|b)*?c', 'abc')[:], ('abc', 'b', 'a')) self.assertEqual(regex.match('^(([ab])|c)*?d', 'abcd')[:], ('abcd', 'c', 'b')) self.assertEqual(regex.match('^((d)|[ab])*?c', 'abc')[:], ('abc', 'b', None)) self.assertEqual(regex.match('^((a)c|[ab])*?c', 'abc')[:], ('abc', 'b', None)) def test_bug_725149(self): # Mark_stack_base restoring before restoring marks. self.assertEqual(regex.match('(a)(?:(?=(b)*)c)*', 'abb')[:], ('a', 'a', None)) self.assertEqual(regex.match('(a)((?!(b)*))*', 'abb')[:], ('a', 'a', None, None)) def test_bug_764548(self): # Bug 764548, regex.compile() barfs on str/unicode subclasses. class my_unicode(str): pass pat = regex.compile(my_unicode("abc")) self.assertEqual(pat.match("xyz"), None) def test_finditer(self): it = regex.finditer(r":+", "a:b::c:::d") self.assertEqual([item[0] for item in it], [':', '::', ':::']) def test_bug_926075(self): if regex.compile('bug_926075') is regex.compile(u'bug_926075'): self.fail() def test_bug_931848(self): pattern = u"[\u002E\u3002\uFF0E\uFF61]" self.assertEqual(regex.compile(pattern).split("a.b.c"), ['a', 'b', 'c']) def test_bug_581080(self): it = regex.finditer(r"\s", "a b") self.assertEqual(it.next().span(), (1, 2)) self.assertRaises(StopIteration, lambda: it.next()) scanner = regex.compile(r"\s").scanner("a b") self.assertEqual(scanner.search().span(), (1, 2)) self.assertEqual(scanner.search(), None) def test_bug_817234(self): it = regex.finditer(r".*", "asdf") self.assertEqual(it.next().span(), (0, 4)) self.assertEqual(it.next().span(), (4, 4)) self.assertRaises(StopIteration, lambda: it.next()) def test_empty_array(self): # SF buf 1647541. import array for typecode in 'cbBuhHiIlLfd': a = array.array(typecode) self.assertEqual(regex.compile("bla").match(a), None) self.assertEqual(regex.compile("").match(a)[1 : ], ()) def test_inline_flags(self): # Bug #1700. upper_char = unichr(0x1ea0) # Latin Capital Letter A with Dot Below lower_char = unichr(0x1ea1) # Latin Small Letter A with Dot Below p = regex.compile(upper_char, regex.I | regex.U) self.assertEqual(bool(p.match(lower_char)), True) p = regex.compile(lower_char, regex.I | regex.U) self.assertEqual(bool(p.match(upper_char)), True) p = regex.compile('(?i)' + upper_char, regex.U) self.assertEqual(bool(p.match(lower_char)), True) p = regex.compile('(?i)' + lower_char, regex.U) self.assertEqual(bool(p.match(upper_char)), True) p = regex.compile('(?iu)' + upper_char) self.assertEqual(bool(p.match(lower_char)), True) p = regex.compile('(?iu)' + lower_char) self.assertEqual(bool(p.match(upper_char)), True) self.assertEqual(bool(regex.match(r"(?i)a", "A")), True) self.assertEqual(bool(regex.match(r"a(?i)", "A")), True) self.assertEqual(bool(regex.match(r"(?iV1)a", "A")), True) self.assertEqual(regex.match(r"a(?iV1)", "A"), None) def test_dollar_matches_twice(self): # $ matches the end of string, and just before the terminating \n. pattern = regex.compile('$') self.assertEqual(pattern.sub('#', 'a\nb\n'), 'a\nb#\n#') self.assertEqual(pattern.sub('#', 'a\nb\nc'), 'a\nb\nc#') self.assertEqual(pattern.sub('#', '\n'), '#\n#') pattern = regex.compile('$', regex.MULTILINE) self.assertEqual(pattern.sub('#', 'a\nb\n' ), 'a#\nb#\n#') self.assertEqual(pattern.sub('#', 'a\nb\nc'), 'a#\nb#\nc#') self.assertEqual(pattern.sub('#', '\n'), '#\n#') def test_ascii_and_unicode_flag(self): # Unicode patterns. for flags in (0, regex.UNICODE): pat = regex.compile(u'\xc0', flags | regex.IGNORECASE) self.assertEqual(bool(pat.match(u'\xe0')), True) pat = regex.compile(u'\w', flags) self.assertEqual(bool(pat.match(u'\xe0')), True) pat = regex.compile(u'\xc0', regex.ASCII | regex.IGNORECASE) self.assertEqual(pat.match(u'\xe0'), None) pat = regex.compile(u'(?a)\xc0', regex.IGNORECASE) self.assertEqual(pat.match(u'\xe0'), None) pat = regex.compile(u'\w', regex.ASCII) self.assertEqual(pat.match(u'\xe0'), None) pat = regex.compile(u'(?a)\w') self.assertEqual(pat.match(u'\xe0'), None) # String patterns. for flags in (0, regex.ASCII): pat = regex.compile('\xc0', flags | regex.IGNORECASE) self.assertEqual(pat.match('\xe0'), None) pat = regex.compile('\w') self.assertEqual(pat.match('\xe0'), None) self.assertRaisesRegex(ValueError, self.MIXED_FLAGS, lambda: regex.compile('(?au)\w')) def test_subscripting_match(self): m = regex.match(r'(?\w)', 'xy') if not m: self.fail("Failed: expected match but returned None") elif not m or m[0] != m.group(0) or m[1] != m.group(1): self.fail("Failed") if not m: self.fail("Failed: expected match but returned None") elif m[:] != ('x', 'x'): self.fail("Failed: expected \"('x', 'x')\" but got %s instead" % repr(m[:])) def test_new_named_groups(self): m0 = regex.match(r'(?P\w)', 'x') m1 = regex.match(r'(?\w)', 'x') if not (m0 and m1 and m0[:] == m1[:]): self.fail("Failed") def test_properties(self): self.assertEqual(regex.match('(?i)\xC0', '\xE0'), None) self.assertEqual(regex.match(r'(?i)\xC0', '\xE0'), None) self.assertEqual(regex.match(r'\w', '\xE0'), None) self.assertEqual(bool(regex.match(ur'(?u)\w', u'\xE0')), True) # Dropped the following test. It's not possible to determine what the # correct result should be in the general case. # self.assertEqual(bool(regex.match(r'(?L)\w', '\xE0')), # '\xE0'.isalnum()) self.assertEqual(bool(regex.match(r'(?L)\d', '0')), True) self.assertEqual(bool(regex.match(r'(?L)\s', ' ')), True) self.assertEqual(bool(regex.match(r'(?L)\w', 'a')), True) self.assertEqual(regex.match(r'(?L)\d', '?'), None) self.assertEqual(regex.match(r'(?L)\s', '?'), None) self.assertEqual(regex.match(r'(?L)\w', '?'), None) self.assertEqual(regex.match(r'(?L)\D', '0'), None) self.assertEqual(regex.match(r'(?L)\S', ' '), None) self.assertEqual(regex.match(r'(?L)\W', 'a'), None) self.assertEqual(bool(regex.match(r'(?L)\D', '?')), True) self.assertEqual(bool(regex.match(r'(?L)\S', '?')), True) self.assertEqual(bool(regex.match(r'(?L)\W', '?')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{Cyrillic}', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{IsCyrillic}', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{Script=Cyrillic}', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{InCyrillic}', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{Block=Cyrillic}', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:Cyrillic:]]', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:IsCyrillic:]]', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:Script=Cyrillic:]]', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:InCyrillic:]]', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:Block=Cyrillic:]]', u'\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\P{Cyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\P{IsCyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\P{Script=Cyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\P{InCyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\P{Block=Cyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{^Cyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{^IsCyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{^Script=Cyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{^InCyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{^Block=Cyrillic}', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:^Cyrillic:]]', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:^IsCyrillic:]]', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:^Script=Cyrillic:]]', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:^InCyrillic:]]', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)[[:^Block=Cyrillic:]]', u'\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(ur'(?u)\d', u'0')), True) self.assertEqual(bool(regex.match(ur'(?u)\s', u' ')), True) self.assertEqual(bool(regex.match(ur'(?u)\w', u'A')), True) self.assertEqual(regex.match(ur"(?u)\d", u"?"), None) self.assertEqual(regex.match(ur"(?u)\s", u"?"), None) self.assertEqual(regex.match(ur"(?u)\w", u"?"), None) self.assertEqual(regex.match(ur"(?u)\D", u"0"), None) self.assertEqual(regex.match(ur"(?u)\S", u" "), None) self.assertEqual(regex.match(ur"(?u)\W", u"A"), None) self.assertEqual(bool(regex.match(ur'(?u)\D', u'?')), True) self.assertEqual(bool(regex.match(ur'(?u)\S', u'?')), True) self.assertEqual(bool(regex.match(ur'(?u)\W', u'?')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{L}', u'A')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{L}', u'a')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{Lu}', u'A')), True) self.assertEqual(bool(regex.match(ur'(?u)\p{Ll}', u'a')), True) self.assertEqual(bool(regex.match(ur'(?u)(?i)a', u'a')), True) self.assertEqual(bool(regex.match(ur'(?u)(?i)a', u'A')), True) self.assertEqual(bool(regex.match(ur'(?u)\w', u'0')), True) self.assertEqual(bool(regex.match(ur'(?u)\w', u'a')), True) self.assertEqual(bool(regex.match(ur'(?u)\w', u'_')), True) self.assertEqual(regex.match(ur"(?u)\X", u"\xE0").span(), (0, 1)) self.assertEqual(regex.match(ur"(?u)\X", u"a\u0300").span(), (0, 2)) self.assertEqual(regex.findall(ur"(?u)\X", u"a\xE0a\u0300e\xE9e\u0301"), [u'a', u'\xe0', u'a\u0300', u'e', u'\xe9', u'e\u0301']) self.assertEqual(regex.findall(ur"(?u)\X{3}", u"a\xE0a\u0300e\xE9e\u0301"), [u'a\xe0a\u0300', u'e\xe9e\u0301']) self.assertEqual(regex.findall(ur"(?u)\X", u"\r\r\n\u0301A\u0301"), [u'\r', u'\r\n', u'\u0301', u'A\u0301']) self.assertEqual(bool(regex.match(ur'(?u)\p{Ll}', u'a')), True) chars_u = u"-09AZaz_\u0393\u03b3" chars_b = "-09AZaz_" word_set = set("Ll Lm Lo Lt Lu Mc Me Mn Nd Nl No Pc".split()) tests = [ (ur"(?u)\w", chars_u, u"09AZaz_\u0393\u03b3"), (ur"(?u)[[:word:]]", chars_u, u"09AZaz_\u0393\u03b3"), (ur"(?u)\W", chars_u, u"-"), (ur"(?u)[[:^word:]]", chars_u, u"-"), (ur"(?u)\d", chars_u, u"09"), (ur"(?u)[[:digit:]]", chars_u, u"09"), (ur"(?u)\D", chars_u, u"-AZaz_\u0393\u03b3"), (ur"(?u)[[:^digit:]]", chars_u, u"-AZaz_\u0393\u03b3"), (ur"(?u)[[:alpha:]]", chars_u, u"AZaz\u0393\u03b3"), (ur"(?u)[[:^alpha:]]", chars_u, u"-09_"), (ur"(?u)[[:alnum:]]", chars_u, u"09AZaz\u0393\u03b3"), (ur"(?u)[[:^alnum:]]", chars_u, u"-_"), (ur"(?u)[[:xdigit:]]", chars_u, u"09Aa"), (ur"(?u)[[:^xdigit:]]", chars_u, u"-Zz_\u0393\u03b3"), (ur"(?u)\p{InBasicLatin}", u"a\xE1", u"a"), (ur"(?u)\P{InBasicLatin}", u"a\xE1", u"\xE1"), (ur"(?iu)\p{InBasicLatin}", u"a\xE1", u"a"), (ur"(?iu)\P{InBasicLatin}", u"a\xE1", u"\xE1"), (r"(?L)\w", chars_b, "09AZaz_"), (r"(?L)[[:word:]]", chars_b, "09AZaz_"), (r"(?L)\W", chars_b, "-"), (r"(?L)[[:^word:]]", chars_b, "-"), (r"(?L)\d", chars_b, "09"), (r"(?L)[[:digit:]]", chars_b, "09"), (r"(?L)\D", chars_b, "-AZaz_"), (r"(?L)[[:^digit:]]", chars_b, "-AZaz_"), (r"(?L)[[:alpha:]]", chars_b, "AZaz"), (r"(?L)[[:^alpha:]]", chars_b, "-09_"), (r"(?L)[[:alnum:]]", chars_b, "09AZaz"), (r"(?L)[[:^alnum:]]", chars_b, "-_"), (r"(?L)[[:xdigit:]]", chars_b, "09Aa"), (r"(?L)[[:^xdigit:]]", chars_b, "-Zz_"), (r"\w", chars_b, "09AZaz_"), (r"[[:word:]]", chars_b, "09AZaz_"), (r"\W", chars_b, "-"), (r"[[:^word:]]", chars_b, "-"), (r"\d", chars_b, "09"), (r"[[:digit:]]", chars_b, "09"), (r"\D", chars_b, "-AZaz_"), (r"[[:^digit:]]", chars_b, "-AZaz_"), (r"[[:alpha:]]", chars_b, "AZaz"), (r"[[:^alpha:]]", chars_b, "-09_"), (r"[[:alnum:]]", chars_b, "09AZaz"), (r"[[:^alnum:]]", chars_b, "-_"), (r"[[:xdigit:]]", chars_b, "09Aa"), (r"[[:^xdigit:]]", chars_b, "-Zz_"), ] for pattern, chars, expected in tests: try: if chars[ : 0].join(regex.findall(pattern, chars)) != expected: self.fail("Failed: %s" % pattern) except Exception, e: self.fail("Failed: %s raised %s" % (pattern, repr(e))) self.assertEqual(bool(regex.match(ur"(?u)\p{NumericValue=0}", u"0")), True) self.assertEqual(bool(regex.match(ur"(?u)\p{NumericValue=1/2}", u"\N{VULGAR FRACTION ONE HALF}")), True) self.assertEqual(bool(regex.match(ur"(?u)\p{NumericValue=0.5}", u"\N{VULGAR FRACTION ONE HALF}")), True) def test_word_class(self): self.assertEqual(regex.findall(ur"(?u)\w+", u" \u0939\u093f\u0928\u094d\u0926\u0940,"), [u'\u0939\u093f\u0928\u094d\u0926\u0940']) self.assertEqual(regex.findall(ur"(?u)\W+", u" \u0939\u093f\u0928\u094d\u0926\u0940,"), [u' ', u',']) self.assertEqual(regex.split(ur"(?uV1)\b", u" \u0939\u093f\u0928\u094d\u0926\u0940,"), [u' ', u'\u0939\u093f\u0928\u094d\u0926\u0940', u',']) self.assertEqual(regex.split(ur"(?uV1)\B", u" \u0939\u093f\u0928\u094d\u0926\u0940,"), [u'', u' \u0939', u'\u093f', u'\u0928', u'\u094d', u'\u0926', u'\u0940,', u'']) def test_search_anchor(self): self.assertEqual(regex.findall(r"\G\w{2}", "abcd ef"), ['ab', 'cd']) def test_search_reverse(self): self.assertEqual(regex.findall(r"(?r).", "abc"), ['c', 'b', 'a']) self.assertEqual(regex.findall(r"(?r).", "abc", overlapped=True), ['c', 'b', 'a']) self.assertEqual(regex.findall(r"(?r)..", "abcde"), ['de', 'bc']) self.assertEqual(regex.findall(r"(?r)..", "abcde", overlapped=True), ['de', 'cd', 'bc', 'ab']) self.assertEqual(regex.findall(r"(?r)(.)(-)(.)", "a-b-c", overlapped=True), [("b", "-", "c"), ("a", "-", "b")]) self.assertEqual([m[0] for m in regex.finditer(r"(?r).", "abc")], ['c', 'b', 'a']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde", overlapped=True)], ['de', 'cd', 'bc', 'ab']) self.assertEqual([m[0] for m in regex.finditer(r"(?r).", "abc")], ['c', 'b', 'a']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde", overlapped=True)], ['de', 'cd', 'bc', 'ab']) self.assertEqual(regex.findall(r"^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?V1)^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?r)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual(regex.findall(r"(?rV1)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"(?V1)^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"(?rV1)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual(regex.findall(r"\G\w{2}", "abcd ef"), ['ab', 'cd']) self.assertEqual(regex.findall(r".{2}(?<=\G.*)", "abcd"), ['ab', 'cd']) self.assertEqual(regex.findall(r"(?r)\G\w{2}", "abcd ef"), []) self.assertEqual(regex.findall(r"(?r)\w{2}\G", "abcd ef"), ['ef']) self.assertEqual(regex.findall(r"q*", "qqwe"), ['qq', '', '', '']) self.assertEqual(regex.findall(r"(?V1)q*", "qqwe"), ['qq', '', '', '']) self.assertEqual(regex.findall(r"(?r)q*", "qqwe"), ['', '', 'qq', '']) self.assertEqual(regex.findall(r"(?rV1)q*", "qqwe"), ['', '', 'qq', '']) self.assertEqual(regex.findall(".", "abcd", pos=1, endpos=3), ['b', 'c']) self.assertEqual(regex.findall(".", "abcd", pos=1, endpos=-1), ['b', 'c']) self.assertEqual([m[0] for m in regex.finditer(".", "abcd", pos=1, endpos=3)], ['b', 'c']) self.assertEqual([m[0] for m in regex.finditer(".", "abcd", pos=1, endpos=-1)], ['b', 'c']) self.assertEqual([m[0] for m in regex.finditer("(?r).", "abcd", pos=1, endpos=3)], ['c', 'b']) self.assertEqual([m[0] for m in regex.finditer("(?r).", "abcd", pos=1, endpos=-1)], ['c', 'b']) self.assertEqual(regex.findall("(?r).", "abcd", pos=1, endpos=3), ['c', 'b']) self.assertEqual(regex.findall("(?r).", "abcd", pos=1, endpos=-1), ['c', 'b']) self.assertEqual(regex.findall(r"[ab]", "aB", regex.I), ['a', 'B']) self.assertEqual(regex.findall(r"(?r)[ab]", "aB", regex.I), ['B', 'a']) self.assertEqual(regex.findall(r"(?r).{2}", "abc"), ['bc']) self.assertEqual(regex.findall(r"(?r).{2}", "abc", overlapped=True), ['bc', 'ab']) self.assertEqual(regex.findall(r"(\w+) (\w+)", "first second third fourth fifth"), [('first', 'second'), ('third', 'fourth')]) self.assertEqual(regex.findall(r"(?r)(\w+) (\w+)", "first second third fourth fifth"), [('fourth', 'fifth'), ('second', 'third')]) self.assertEqual([m[0] for m in regex.finditer(r"(?r).{2}", "abc")], ['bc']) self.assertEqual([m[0] for m in regex.finditer(r"(?r).{2}", "abc", overlapped=True)], ['bc', 'ab']) self.assertEqual([m[0] for m in regex.finditer(r"(\w+) (\w+)", "first second third fourth fifth")], ['first second', 'third fourth']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)(\w+) (\w+)", "first second third fourth fifth")], ['fourth fifth', 'second third']) self.assertEqual(regex.search("abcdef", "abcdef").span(), (0, 6)) self.assertEqual(regex.search("(?r)abcdef", "abcdef").span(), (0, 6)) self.assertEqual(regex.search("(?i)abcdef", "ABCDEF").span(), (0, 6)) self.assertEqual(regex.search("(?ir)abcdef", "ABCDEF").span(), (0, 6)) self.assertEqual(regex.sub(r"(.)", r"\1", "abc"), 'abc') self.assertEqual(regex.sub(r"(?r)(.)", r"\1", "abc"), 'abc') def test_atomic(self): # Issue 433030. self.assertEqual(regex.search(r"(?>a*)a", "aa"), None) def test_possessive(self): # Single-character non-possessive. self.assertEqual(regex.search(r"a?a", "a").span(), (0, 1)) self.assertEqual(regex.search(r"a*a", "aaa").span(), (0, 3)) self.assertEqual(regex.search(r"a+a", "aaa").span(), (0, 3)) self.assertEqual(regex.search(r"a{1,3}a", "aaa").span(), (0, 3)) # Multiple-character non-possessive. self.assertEqual(regex.search(r"(?:ab)?ab", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"(?:ab)*ab", "ababab").span(), (0, 6)) self.assertEqual(regex.search(r"(?:ab)+ab", "ababab").span(), (0, 6)) self.assertEqual(regex.search(r"(?:ab){1,3}ab", "ababab").span(), (0, 6)) # Single-character possessive. self.assertEqual(regex.search(r"a?+a", "a"), None) self.assertEqual(regex.search(r"a*+a", "aaa"), None) self.assertEqual(regex.search(r"a++a", "aaa"), None) self.assertEqual(regex.search(r"a{1,3}+a", "aaa"), None) # Multiple-character possessive. self.assertEqual(regex.search(r"(?:ab)?+ab", "ab"), None) self.assertEqual(regex.search(r"(?:ab)*+ab", "ababab"), None) self.assertEqual(regex.search(r"(?:ab)++ab", "ababab"), None) self.assertEqual(regex.search(r"(?:ab){1,3}+ab", "ababab"), None) def test_zerowidth(self): # Issue 3262. self.assertEqual(regex.split(r"\b", "a b"), ['a b']) self.assertEqual(regex.split(r"(?V1)\b", "a b"), ['', 'a', ' ', 'b', '']) # Issue 1647489. self.assertEqual(regex.findall(r"^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?r)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual(regex.findall(r"(?V1)^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"(?V1)^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?rV1)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"(?rV1)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual(regex.split("", "xaxbxc"), ['xaxbxc']) self.assertEqual([m for m in regex.splititer("", "xaxbxc")], ['xaxbxc']) self.assertEqual(regex.split("(?r)", "xaxbxc"), ['xaxbxc']) self.assertEqual([m for m in regex.splititer("(?r)", "xaxbxc")], ['xaxbxc']) self.assertEqual(regex.split("(?V1)", "xaxbxc"), ['', 'x', 'a', 'x', 'b', 'x', 'c', '']) self.assertEqual([m for m in regex.splititer("(?V1)", "xaxbxc")], ['', 'x', 'a', 'x', 'b', 'x', 'c', '']) self.assertEqual(regex.split("(?rV1)", "xaxbxc"), ['', 'c', 'x', 'b', 'x', 'a', 'x', '']) self.assertEqual([m for m in regex.splititer("(?rV1)", "xaxbxc")], ['', 'c', 'x', 'b', 'x', 'a', 'x', '']) def test_scoped_and_inline_flags(self): # Issues 433028, 433024, 433027. self.assertEqual(regex.search(r"(?i)Ab", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"(?i:A)b", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"A(?i)b", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"A(?iV1)b", "ab"), None) self.assertRaisesRegex(regex.error, self.CANT_TURN_OFF, lambda: regex.search(r"(?V0-i)Ab", "ab", flags=regex.I)) self.assertEqual(regex.search(r"(?V0)Ab", "ab"), None) self.assertEqual(regex.search(r"(?V1)Ab", "ab"), None) self.assertEqual(regex.search(r"(?V1-i)Ab", "ab", flags=regex.I), None) self.assertEqual(regex.search(r"(?-i:A)b", "ab", flags=regex.I), None) self.assertEqual(regex.search(r"A(?V1-i)b", "ab", flags=regex.I).span(), (0, 2)) def test_repeated_repeats(self): # Issue 2537. self.assertEqual(regex.search(r"(?:a+)+", "aaa").span(), (0, 3)) self.assertEqual(regex.search(r"(?:(?:ab)+c)+", "abcabc").span(), (0, 6)) def test_lookbehind(self): self.assertEqual(regex.search(r"123(?<=a\d+)", "a123").span(), (1, 4)) self.assertEqual(regex.search(r"123(?<=a\d+)", "b123"), None) self.assertEqual(regex.search(r"123(?[ \t]+\r*$)|(?P(?<=[^\n])\Z)') self.assertEqual(pat.subn(lambda m: '<' + m.lastgroup + '>', 'foobar '), ('foobar', 1)) self.assertEqual([m.group() for m in pat.finditer('foobar ')], [' ', '']) pat = regex.compile(r'(?mV1)(?P[ \t]+\r*$)|(?P(?<=[^\n])\Z)') self.assertEqual(pat.subn(lambda m: '<' + m.lastgroup + '>', 'foobar '), ('foobar', 2)) self.assertEqual([m.group() for m in pat.finditer('foobar ')], [' ', '']) def test_overlapped(self): self.assertEqual(regex.findall(r"..", "abcde"), ['ab', 'cd']) self.assertEqual(regex.findall(r"..", "abcde", overlapped=True), ['ab', 'bc', 'cd', 'de']) self.assertEqual(regex.findall(r"(?r)..", "abcde"), ['de', 'bc']) self.assertEqual(regex.findall(r"(?r)..", "abcde", overlapped=True), ['de', 'cd', 'bc', 'ab']) self.assertEqual(regex.findall(r"(.)(-)(.)", "a-b-c", overlapped=True), [("a", "-", "b"), ("b", "-", "c")]) self.assertEqual([m[0] for m in regex.finditer(r"..", "abcde")], ['ab', 'cd']) self.assertEqual([m[0] for m in regex.finditer(r"..", "abcde", overlapped=True)], ['ab', 'bc', 'cd', 'de']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde")], ['de', 'bc']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde", overlapped=True)], ['de', 'cd', 'bc', 'ab']) self.assertEqual([m.groups() for m in regex.finditer(r"(.)(-)(.)", "a-b-c", overlapped=True)], [("a", "-", "b"), ("b", "-", "c")]) self.assertEqual([m.groups() for m in regex.finditer(r"(?r)(.)(-)(.)", "a-b-c", overlapped=True)], [("b", "-", "c"), ("a", "-", "b")]) def test_splititer(self): self.assertEqual(regex.split(r",", "a,b,,c,"), ['a', 'b', '', 'c', '']) self.assertEqual([m for m in regex.splititer(r",", "a,b,,c,")], ['a', 'b', '', 'c', '']) def test_grapheme(self): self.assertEqual(regex.match(ur"(?u)\X", u"\xE0").span(), (0, 1)) self.assertEqual(regex.match(ur"(?u)\X", u"a\u0300").span(), (0, 2)) self.assertEqual(regex.findall(ur"(?u)\X", u"a\xE0a\u0300e\xE9e\u0301"), [u'a', u'\xe0', u'a\u0300', u'e', u'\xe9', u'e\u0301']) self.assertEqual(regex.findall(ur"(?u)\X{3}", u"a\xE0a\u0300e\xE9e\u0301"), [u'a\xe0a\u0300', u'e\xe9e\u0301']) self.assertEqual(regex.findall(ur"(?u)\X", u"\r\r\n\u0301A\u0301"), [u'\r', u'\r\n', u'\u0301', u'A\u0301']) def test_word_boundary(self): text = u'The quick ("brown") fox can\'t jump 32.3 feet, right?' self.assertEqual(regex.split(ur'(?V1)\b', text), [u'', u'The', u' ', u'quick', u' ("', u'brown', u'") ', u'fox', u' ', u'can', u"'", u't', u' ', u'jump', u' ', u'32', u'.', u'3', u' ', u'feet', u', ', u'right', u'?']) self.assertEqual(regex.split(ur'(?V1w)\b', text), [u'', u'The', u' ', u'quick', u' ', u'(', u'"', u'brown', u'"', u')', u' ', u'fox', u' ', u"can't", u' ', u'jump', u' ', u'32.3', u' ', u'feet', u',', u' ', u'right', u'?', u'']) text = u"The fox" self.assertEqual(regex.split(ur'(?V1)\b', text), [u'', u'The', u' ', u'fox', u'']) self.assertEqual(regex.split(ur'(?V1w)\b', text), [u'', u'The', u' ', u' ', u'fox', u'']) text = u"can't aujourd'hui l'objectif" self.assertEqual(regex.split(ur'(?V1)\b', text), [u'', u'can', u"'", u't', u' ', u'aujourd', u"'", u'hui', u' ', u'l', u"'", u'objectif', u'']) self.assertEqual(regex.split(ur'(?V1w)\b', text), [u'', u"can't", u' ', u"aujourd'hui", u' ', u"l'", u'objectif', u'']) def test_line_boundary(self): self.assertEqual(regex.findall(r".+", "Line 1\nLine 2\n"), ["Line 1", "Line 2"]) self.assertEqual(regex.findall(r".+", "Line 1\rLine 2\r"), ["Line 1\rLine 2\r"]) self.assertEqual(regex.findall(r".+", "Line 1\r\nLine 2\r\n"), ["Line 1\r", "Line 2\r"]) self.assertEqual(regex.findall(r"(?w).+", "Line 1\nLine 2\n"), ["Line 1", "Line 2"]) self.assertEqual(regex.findall(r"(?w).+", "Line 1\rLine 2\r"), ["Line 1", "Line 2"]) self.assertEqual(regex.findall(r"(?w).+", "Line 1\r\nLine 2\r\n"), ["Line 1", "Line 2"]) self.assertEqual(regex.search(r"^abc", "abc").start(), 0) self.assertEqual(regex.search(r"^abc", "\nabc"), None) self.assertEqual(regex.search(r"^abc", "\rabc"), None) self.assertEqual(regex.search(r"(?w)^abc", "abc").start(), 0) self.assertEqual(regex.search(r"(?w)^abc", "\nabc"), None) self.assertEqual(regex.search(r"(?w)^abc", "\rabc"), None) self.assertEqual(regex.search(r"abc$", "abc").start(), 0) self.assertEqual(regex.search(r"abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"abc$", "abc\r"), None) self.assertEqual(regex.search(r"(?w)abc$", "abc").start(), 0) self.assertEqual(regex.search(r"(?w)abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"(?w)abc$", "abc\r").start(), 0) self.assertEqual(regex.search(r"(?m)^abc", "abc").start(), 0) self.assertEqual(regex.search(r"(?m)^abc", "\nabc").start(), 1) self.assertEqual(regex.search(r"(?m)^abc", "\rabc"), None) self.assertEqual(regex.search(r"(?mw)^abc", "abc").start(), 0) self.assertEqual(regex.search(r"(?mw)^abc", "\nabc").start(), 1) self.assertEqual(regex.search(r"(?mw)^abc", "\rabc").start(), 1) self.assertEqual(regex.search(r"(?m)abc$", "abc").start(), 0) self.assertEqual(regex.search(r"(?m)abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"(?m)abc$", "abc\r"), None) self.assertEqual(regex.search(r"(?mw)abc$", "abc").start(), 0) self.assertEqual(regex.search(r"(?mw)abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"(?mw)abc$", "abc\r").start(), 0) def test_branch_reset(self): self.assertEqual(regex.match(r"(?:(a)|(b))(c)", "ac").groups(), ('a', None, 'c')) self.assertEqual(regex.match(r"(?:(a)|(b))(c)", "bc").groups(), (None, 'b', 'c')) self.assertEqual(regex.match(r"(?:(?a)|(?b))(?c)", "ac").groups(), ('a', None, 'c')) self.assertEqual(regex.match(r"(?:(?a)|(?b))(?c)", "bc").groups(), (None, 'b', 'c')) self.assertEqual(regex.match(r"(?a)(?:(?b)|(?c))(?d)", "abd").groups(), ('a', 'b', None, 'd')) self.assertEqual(regex.match(r"(?a)(?:(?b)|(?c))(?d)", "acd").groups(), ('a', None, 'c', 'd')) self.assertEqual(regex.match(r"(a)(?:(b)|(c))(d)", "abd").groups(), ('a', 'b', None, 'd')) self.assertEqual(regex.match(r"(a)(?:(b)|(c))(d)", "acd").groups(), ('a', None, 'c', 'd')) self.assertEqual(regex.match(r"(a)(?|(b)|(b))(d)", "abd").groups(), ('a', 'b', 'd')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "ac").groups(), ('a', None, 'c')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "bc").groups(), (None, 'b', 'c')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "ac").groups(), ('a', 'c')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "bc").groups(), ('b', 'c')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(?d))(e)", "abe").groups(), ('a', 'b', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(?d))(e)", "cde").groups(), ('d', 'c', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(d))(e)", "abe").groups(), ('a', 'b', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(d))(e)", "cde").groups(), ('d', 'c', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(d))(e)", "abe").groups(), ('a', 'b', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(d))(e)", "cde").groups(), ('c', 'd', 'e')) # Hg issue 87. self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "abe").groups(), ("a", "b", "e")) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "abe").capturesdict(), {"a": ["a"], "b": ["b"]}) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "cde").groups(), ("d", None, "e")) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "cde").capturesdict(), {"a": ["c", "d"], "b": []}) def test_set(self): self.assertEqual(regex.match(r"[a]", "a").span(), (0, 1)) self.assertEqual(regex.match(r"(?i)[a]", "A").span(), (0, 1)) self.assertEqual(regex.match(r"[a-b]", r"a").span(), (0, 1)) self.assertEqual(regex.match(r"(?i)[a-b]", r"A").span(), (0, 1)) self.assertEqual(regex.sub(r"(?V0)([][])", r"-", "a[b]c"), "a-b-c") self.assertEqual(regex.findall(ur"[\p{Alpha}]", u"a0"), [u"a"]) self.assertEqual(regex.findall(ur"(?i)[\p{Alpha}]", u"A0"), [u"A"]) self.assertEqual(regex.findall(ur"[a\p{Alpha}]", u"ab0"), [u"a", u"b"]) self.assertEqual(regex.findall(ur"[a\P{Alpha}]", u"ab0"), [u"a", u"0"]) self.assertEqual(regex.findall(ur"(?i)[a\p{Alpha}]", u"ab0"), [u"a", u"b"]) self.assertEqual(regex.findall(ur"(?i)[a\P{Alpha}]", u"ab0"), [u"a", u"0"]) self.assertEqual(regex.findall(ur"[a-b\p{Alpha}]", u"abC0"), [u"a", u"b", u"C"]) self.assertEqual(regex.findall(ur"(?i)[a-b\p{Alpha}]", u"AbC0"), [u"A", u"b", u"C"]) self.assertEqual(regex.findall(ur"[\p{Alpha}]", u"a0"), [u"a"]) self.assertEqual(regex.findall(ur"[\P{Alpha}]", u"a0"), [u"0"]) self.assertEqual(regex.findall(ur"[^\p{Alpha}]", u"a0"), [u"0"]) self.assertEqual(regex.findall(ur"[^\P{Alpha}]", u"a0"), [u"a"]) self.assertEqual("".join(regex.findall(r"[^\d-h]", "a^b12c-h")), 'a^bc') self.assertEqual("".join(regex.findall(r"[^\dh]", "a^b12c-h")), 'a^bc-') self.assertEqual("".join(regex.findall(r"[^h\s\db]", "a^b 12c-h")), 'a^c-') self.assertEqual("".join(regex.findall(r"[^b\w]", "a b")), ' ') self.assertEqual("".join(regex.findall(r"[^b\S]", "a b")), ' ') self.assertEqual("".join(regex.findall(r"[^8\d]", "a 1b2")), 'a b') all_chars = u"".join(unichr(c) for c in range(0x100)) self.assertEqual(len(regex.findall(ur"(?u)\p{ASCII}", all_chars)), 128) self.assertEqual(len(regex.findall(ur"(?u)\p{Letter}", all_chars)), 117) self.assertEqual(len(regex.findall(ur"(?u)\p{Digit}", all_chars)), 10) # Set operators self.assertEqual(len(regex.findall(ur"(?uV1)[\p{ASCII}&&\p{Letter}]", all_chars)), 52) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{ASCII}&&\p{Alnum}&&\p{Letter}]", all_chars)), 52) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{ASCII}&&\p{Alnum}&&\p{Digit}]", all_chars)), 10) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{ASCII}&&\p{Cc}]", all_chars)), 33) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{ASCII}&&\p{Graph}]", all_chars)), 94) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{ASCII}--\p{Cc}]", all_chars)), 95) self.assertEqual(len(regex.findall(ur"(?u)[\p{Letter}\p{Digit}]", all_chars)), 127) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{Letter}||\p{Digit}]", all_chars)), 127) self.assertEqual(len(regex.findall(ur"(?u)\p{HexDigit}", all_chars)), 22) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{HexDigit}~~\p{Digit}]", all_chars)), 12) self.assertEqual(len(regex.findall(ur"(?uV1)[\p{Digit}~~\p{HexDigit}]", all_chars)), 12) self.assertEqual(repr(type(regex.compile(r"(?V0)([][-])"))), self.PATTERN_CLASS) self.assertEqual(regex.findall(r"(?V1)[[a-z]--[aei]]", "abc"), ["b", "c"]) self.assertEqual(regex.findall(r"(?iV1)[[a-z]--[aei]]", "abc"), ["b", "c"]) self.assertEqual(regex.findall("(?V1)[\w--a]","abc"), ["b", "c"]) self.assertEqual(regex.findall("(?iV1)[\w--a]","abc"), ["b", "c"]) def test_various(self): tests = [ # Test ?P< and ?P= extensions. ('(?Pa)', '', '', regex.error, self.BAD_GROUP_NAME), # Begins with a digit. ('(?Pa)', '', '', regex.error, self.BAD_GROUP_NAME), # Begins with an illegal char. ('(?Pa)', '', '', regex.error, self.BAD_GROUP_NAME), # Begins with an illegal char. # Same tests, for the ?P= form. ('(?Pa)(?P=foo_123', 'aa', '', regex.error, self.MISSING_RPAREN), ('(?Pa)(?P=1)', 'aa', '', regex.error, self.BAD_GROUP_NAME), ('(?Pa)(?P=!)', 'aa', '', regex.error, self.BAD_GROUP_NAME), ('(?Pa)(?P=foo_124)', 'aa', '', regex.error, self.UNKNOWN_GROUP), # Backref to undefined group. ('(?Pa)', 'a', '1', repr('a')), ('(?Pa)(?P=foo_123)', 'aa', '1', repr('a')), # Mal-formed \g in pattern treated as literal for compatibility. (r'(?a)\ga)\g<1>', 'aa', '1', repr('a')), (r'(?a)\g', 'aa', '', repr(None)), (r'(?a)\g', 'aa', '', regex.error, self.UNKNOWN_GROUP), # Backref to undefined group. ('(?a)', 'a', '1', repr('a')), (r'(?a)\g', 'aa', '1', repr('a')), # Test octal escapes. ('\\1', 'a', '', regex.error, self.UNKNOWN_GROUP), # Backreference. ('[\\1]', '\1', '0', "'\\x01'"), # Character. ('\\09', chr(0) + '9', '0', repr(chr(0) + '9')), ('\\141', 'a', '0', repr('a')), ('(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\119', 'abcdefghijklk9', '0,11', repr(('abcdefghijklk9', 'k'))), # Test \0 is handled everywhere. (r'\0', '\0', '0', repr('\0')), (r'[\0a]', '\0', '0', repr('\0')), (r'[a\0]', '\0', '0', repr('\0')), (r'[^a\0]', '\0', '', repr(None)), # Test various letter escapes. (r'\a[\b]\f\n\r\t\v', '\a\b\f\n\r\t\v', '0', repr('\a\b\f\n\r\t\v')), (r'[\a][\b][\f][\n][\r][\t][\v]', '\a\b\f\n\r\t\v', '0', repr('\a\b\f\n\r\t\v')), (r'\c\e\g\h\i\j\k\o\p\q\y\z', 'ceghijkopqyz', '0', repr('ceghijkopqyz')), (r'\xff', '\377', '0', repr(chr(255))), # New \x semantics. (r'\x00ffffffffffffff', '\377', '', repr(None)), (r'\x00f', '\017', '', repr(None)), (r'\x00fe', '\376', '', repr(None)), (r'\x00ff', '\377', '', repr(None)), (r'\t\n\v\r\f\a\g', '\t\n\v\r\f\ag', '0', repr('\t\n\v\r\f\ag')), ('\t\n\v\r\f\a\g', '\t\n\v\r\f\ag', '0', repr('\t\n\v\r\f\ag')), (r'\t\n\v\r\f\a', '\t\n\v\r\f\a', '0', repr(chr(9) + chr(10) + chr(11) + chr(13) + chr(12) + chr(7))), (r'[\t][\n][\v][\r][\f][\b]', '\t\n\v\r\f\b', '0', repr('\t\n\v\r\f\b')), (r"^\w+=(\\[\000-\277]|[^\n\\])*", "SRC=eval.c g.c blah blah blah \\\\\n\tapes.c", '0', repr("SRC=eval.c g.c blah blah blah \\\\")), # Test that . only matches \n in DOTALL mode. ('a.b', 'acb', '0', repr('acb')), ('a.b', 'a\nb', '', repr(None)), ('a.*b', 'acc\nccb', '', repr(None)), ('a.{4,5}b', 'acc\nccb', '', repr(None)), ('a.b', 'a\rb', '0', repr('a\rb')), # The new behaviour is that the inline flag affects only what follows. ('a.b(?s)', 'a\nb', '0', repr('a\nb')), ('a.b(?sV1)', 'a\nb', '', repr(None)), ('(?s)a.b', 'a\nb', '0', repr('a\nb')), ('a.*(?s)b', 'acc\nccb', '0', repr('acc\nccb')), ('a.*(?sV1)b', 'acc\nccb', '', repr(None)), ('(?s)a.*b', 'acc\nccb', '0', repr('acc\nccb')), ('(?s)a.{4,5}b', 'acc\nccb', '0', repr('acc\nccb')), (')', '', '', regex.error, self.TRAILING_CHARS), # Unmatched right bracket. ('', '', '0', "''"), # Empty pattern. ('abc', 'abc', '0', repr('abc')), ('abc', 'xbc', '', repr(None)), ('abc', 'axc', '', repr(None)), ('abc', 'abx', '', repr(None)), ('abc', 'xabcy', '0', repr('abc')), ('abc', 'ababc', '0', repr('abc')), ('ab*c', 'abc', '0', repr('abc')), ('ab*bc', 'abc', '0', repr('abc')), ('ab*bc', 'abbc', '0', repr('abbc')), ('ab*bc', 'abbbbc', '0', repr('abbbbc')), ('ab+bc', 'abbc', '0', repr('abbc')), ('ab+bc', 'abc', '', repr(None)), ('ab+bc', 'abq', '', repr(None)), ('ab+bc', 'abbbbc', '0', repr('abbbbc')), ('ab?bc', 'abbc', '0', repr('abbc')), ('ab?bc', 'abc', '0', repr('abc')), ('ab?bc', 'abbbbc', '', repr(None)), ('ab?c', 'abc', '0', repr('abc')), ('^abc$', 'abc', '0', repr('abc')), ('^abc$', 'abcc', '', repr(None)), ('^abc', 'abcc', '0', repr('abc')), ('^abc$', 'aabc', '', repr(None)), ('abc$', 'aabc', '0', repr('abc')), ('^', 'abc', '0', repr('')), ('$', 'abc', '0', repr('')), ('a.c', 'abc', '0', repr('abc')), ('a.c', 'axc', '0', repr('axc')), ('a.*c', 'axyzc', '0', repr('axyzc')), ('a.*c', 'axyzd', '', repr(None)), ('a[bc]d', 'abc', '', repr(None)), ('a[bc]d', 'abd', '0', repr('abd')), ('a[b-d]e', 'abd', '', repr(None)), ('a[b-d]e', 'ace', '0', repr('ace')), ('a[b-d]', 'aac', '0', repr('ac')), ('a[-b]', 'a-', '0', repr('a-')), ('a[\\-b]', 'a-', '0', repr('a-')), ('a[b-]', 'a-', '0', repr('a-')), ('a[]b', '-', '', regex.error, self.BAD_SET), ('a[', '-', '', regex.error, self.BAD_SET), ('a\\', '-', '', regex.error, self.BAD_ESCAPE), ('abc)', '-', '', regex.error, self.TRAILING_CHARS), ('(abc', '-', '', regex.error, self.MISSING_RPAREN), ('a]', 'a]', '0', repr('a]')), ('a[]]b', 'a]b', '0', repr('a]b')), ('a[]]b', 'a]b', '0', repr('a]b')), ('a[^bc]d', 'aed', '0', repr('aed')), ('a[^bc]d', 'abd', '', repr(None)), ('a[^-b]c', 'adc', '0', repr('adc')), ('a[^-b]c', 'a-c', '', repr(None)), ('a[^]b]c', 'a]c', '', repr(None)), ('a[^]b]c', 'adc', '0', repr('adc')), ('\\ba\\b', 'a-', '0', repr('a')), ('\\ba\\b', '-a', '0', repr('a')), ('\\ba\\b', '-a-', '0', repr('a')), ('\\by\\b', 'xy', '', repr(None)), ('\\by\\b', 'yz', '', repr(None)), ('\\by\\b', 'xyz', '', repr(None)), ('x\\b', 'xyz', '', repr(None)), ('x\\B', 'xyz', '0', repr('x')), ('\\Bz', 'xyz', '0', repr('z')), ('z\\B', 'xyz', '', repr(None)), ('\\Bx', 'xyz', '', repr(None)), ('\\Ba\\B', 'a-', '', repr(None)), ('\\Ba\\B', '-a', '', repr(None)), ('\\Ba\\B', '-a-', '', repr(None)), ('\\By\\B', 'xy', '', repr(None)), ('\\By\\B', 'yz', '', repr(None)), ('\\By\\b', 'xy', '0', repr('y')), ('\\by\\B', 'yz', '0', repr('y')), ('\\By\\B', 'xyz', '0', repr('y')), ('ab|cd', 'abc', '0', repr('ab')), ('ab|cd', 'abcd', '0', repr('ab')), ('()ef', 'def', '0,1', repr(('ef', ''))), ('$b', 'b', '', repr(None)), ('a\\(b', 'a(b', '', repr(('a(b',))), ('a\\(*b', 'ab', '0', repr('ab')), ('a\\(*b', 'a((b', '0', repr('a((b')), ('a\\\\b', 'a\\b', '0', repr('a\\b')), ('((a))', 'abc', '0,1,2', repr(('a', 'a', 'a'))), ('(a)b(c)', 'abc', '0,1,2', repr(('abc', 'a', 'c'))), ('a+b+c', 'aabbabc', '0', repr('abc')), ('(a+|b)*', 'ab', '0,1', repr(('ab', 'b'))), ('(a+|b)+', 'ab', '0,1', repr(('ab', 'b'))), ('(a+|b)?', 'ab', '0,1', repr(('a', 'a'))), (')(', '-', '', regex.error, self.TRAILING_CHARS), ('[^ab]*', 'cde', '0', repr('cde')), ('abc', '', '', repr(None)), ('a*', '', '0', repr('')), ('a|b|c|d|e', 'e', '0', repr('e')), ('(a|b|c|d|e)f', 'ef', '0,1', repr(('ef', 'e'))), ('abcd*efg', 'abcdefg', '0', repr('abcdefg')), ('ab*', 'xabyabbbz', '0', repr('ab')), ('ab*', 'xayabbbz', '0', repr('a')), ('(ab|cd)e', 'abcde', '0,1', repr(('cde', 'cd'))), ('[abhgefdc]ij', 'hij', '0', repr('hij')), ('^(ab|cd)e', 'abcde', '', repr(None)), ('(abc|)ef', 'abcdef', '0,1', repr(('ef', ''))), ('(a|b)c*d', 'abcd', '0,1', repr(('bcd', 'b'))), ('(ab|ab*)bc', 'abc', '0,1', repr(('abc', 'a'))), ('a([bc]*)c*', 'abc', '0,1', repr(('abc', 'bc'))), ('a([bc]*)(c*d)', 'abcd', '0,1,2', repr(('abcd', 'bc', 'd'))), ('a([bc]+)(c*d)', 'abcd', '0,1,2', repr(('abcd', 'bc', 'd'))), ('a([bc]*)(c+d)', 'abcd', '0,1,2', repr(('abcd', 'b', 'cd'))), ('a[bcd]*dcdcde', 'adcdcde', '0', repr('adcdcde')), ('a[bcd]+dcdcde', 'adcdcde', '', repr(None)), ('(ab|a)b*c', 'abc', '0,1', repr(('abc', 'ab'))), ('((a)(b)c)(d)', 'abcd', '1,2,3,4', repr(('abc', 'a', 'b', 'd'))), ('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', '0', repr('alpha')), ('^a(bc+|b[eh])g|.h$', 'abh', '0,1', repr(('bh', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'effgz', '0,1,2', repr(('effgz', 'effgz', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'ij', '0,1,2', repr(('ij', 'ij', 'j'))), ('(bc+d$|ef*g.|h?i(j|k))', 'effg', '', repr(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'bcdd', '', repr(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'reffgz', '0,1,2', repr(('effgz', 'effgz', None))), ('(((((((((a)))))))))', 'a', '0', repr('a')), ('multiple words of text', 'uh-uh', '', repr(None)), ('multiple words', 'multiple words, yeah', '0', repr('multiple words')), ('(.*)c(.*)', 'abcde', '0,1,2', repr(('abcde', 'ab', 'de'))), ('\\((.*), (.*)\\)', '(a, b)', '2,1', repr(('b', 'a'))), ('[k]', 'ab', '', repr(None)), ('a[-]?c', 'ac', '0', repr('ac')), ('(abc)\\1', 'abcabc', '1', repr('abc')), ('([a-c]*)\\1', 'abcabc', '1', repr('abc')), ('^(.+)?B', 'AB', '1', repr('A')), ('(a+).\\1$', 'aaaaa', '0,1', repr(('aaaaa', 'aa'))), ('^(a+).\\1$', 'aaaa', '', repr(None)), ('(abc)\\1', 'abcabc', '0,1', repr(('abcabc', 'abc'))), ('([a-c]+)\\1', 'abcabc', '0,1', repr(('abcabc', 'abc'))), ('(a)\\1', 'aa', '0,1', repr(('aa', 'a'))), ('(a+)\\1', 'aa', '0,1', repr(('aa', 'a'))), ('(a+)+\\1', 'aa', '0,1', repr(('aa', 'a'))), ('(a).+\\1', 'aba', '0,1', repr(('aba', 'a'))), ('(a)ba*\\1', 'aba', '0,1', repr(('aba', 'a'))), ('(aa|a)a\\1$', 'aaa', '0,1', repr(('aaa', 'a'))), ('(a|aa)a\\1$', 'aaa', '0,1', repr(('aaa', 'a'))), ('(a+)a\\1$', 'aaa', '0,1', repr(('aaa', 'a'))), ('([abc]*)\\1', 'abcabc', '0,1', repr(('abcabc', 'abc'))), ('(a)(b)c|ab', 'ab', '0,1,2', repr(('ab', None, None))), ('(a)+x', 'aaax', '0,1', repr(('aaax', 'a'))), ('([ac])+x', 'aacx', '0,1', repr(('aacx', 'c'))), ('([^/]*/)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', '0,1', repr(('d:msgs/tdir/sub1/', 'tdir/'))), ('([^.]*)\\.([^:]*):[T ]+(.*)', 'track1.title:TBlah blah blah', '0,1,2,3', repr(('track1.title:TBlah blah blah', 'track1', 'title', 'Blah blah blah'))), ('([^N]*N)+', 'abNNxyzN', '0,1', repr(('abNNxyzN', 'xyzN'))), ('([^N]*N)+', 'abNNxyz', '0,1', repr(('abNN', 'N'))), ('([abc]*)x', 'abcx', '0,1', repr(('abcx', 'abc'))), ('([abc]*)x', 'abc', '', repr(None)), ('([xyz]*)x', 'abcx', '0,1', repr(('x', ''))), ('(a)+b|aac', 'aac', '0,1', repr(('aac', None))), # Test symbolic groups. ('(?Paaa)a', 'aaaa', '', regex.error, self.BAD_GROUP_NAME), ('(?Paaa)a', 'aaaa', '0,id', repr(('aaaa', 'aaa'))), ('(?Paa)(?P=id)', 'aaaa', '0,id', repr(('aaaa', 'aa'))), ('(?Paa)(?P=xd)', 'aaaa', '', regex.error, self.UNKNOWN_GROUP), # Character properties. (ur"\g", u"g", '0', repr(u'g')), (ur"\g<1>", u"g", '', regex.error, self.UNKNOWN_GROUP), (ur"(.)\g<1>", u"gg", '0', repr(u'gg')), (ur"(.)\g<1>", u"gg", '', repr((u'gg', u'g'))), (ur"\N", u"N", '0', repr(u'N')), (ur"\N{LATIN SMALL LETTER A}", u"a", '0', repr(u'a')), (ur"\p", u"p", '0', repr(u'p')), (ur"\p{Ll}", u"a", '0', repr(u'a')), (ur"\P", u"P", '0', repr(u'P')), (ur"\P{Lu}", u"p", '0', repr(u'p')), # All tests from Perl. ('abc', 'abc', '0', repr('abc')), ('abc', 'xbc', '', repr(None)), ('abc', 'axc', '', repr(None)), ('abc', 'abx', '', repr(None)), ('abc', 'xabcy', '0', repr('abc')), ('abc', 'ababc', '0', repr('abc')), ('ab*c', 'abc', '0', repr('abc')), ('ab*bc', 'abc', '0', repr('abc')), ('ab*bc', 'abbc', '0', repr('abbc')), ('ab*bc', 'abbbbc', '0', repr('abbbbc')), ('ab{0,}bc', 'abbbbc', '0', repr('abbbbc')), ('ab+bc', 'abbc', '0', repr('abbc')), ('ab+bc', 'abc', '', repr(None)), ('ab+bc', 'abq', '', repr(None)), ('ab{1,}bc', 'abq', '', repr(None)), ('ab+bc', 'abbbbc', '0', repr('abbbbc')), ('ab{1,}bc', 'abbbbc', '0', repr('abbbbc')), ('ab{1,3}bc', 'abbbbc', '0', repr('abbbbc')), ('ab{3,4}bc', 'abbbbc', '0', repr('abbbbc')), ('ab{4,5}bc', 'abbbbc', '', repr(None)), ('ab?bc', 'abbc', '0', repr('abbc')), ('ab?bc', 'abc', '0', repr('abc')), ('ab{0,1}bc', 'abc', '0', repr('abc')), ('ab?bc', 'abbbbc', '', repr(None)), ('ab?c', 'abc', '0', repr('abc')), ('ab{0,1}c', 'abc', '0', repr('abc')), ('^abc$', 'abc', '0', repr('abc')), ('^abc$', 'abcc', '', repr(None)), ('^abc', 'abcc', '0', repr('abc')), ('^abc$', 'aabc', '', repr(None)), ('abc$', 'aabc', '0', repr('abc')), ('^', 'abc', '0', repr('')), ('$', 'abc', '0', repr('')), ('a.c', 'abc', '0', repr('abc')), ('a.c', 'axc', '0', repr('axc')), ('a.*c', 'axyzc', '0', repr('axyzc')), ('a.*c', 'axyzd', '', repr(None)), ('a[bc]d', 'abc', '', repr(None)), ('a[bc]d', 'abd', '0', repr('abd')), ('a[b-d]e', 'abd', '', repr(None)), ('a[b-d]e', 'ace', '0', repr('ace')), ('a[b-d]', 'aac', '0', repr('ac')), ('a[-b]', 'a-', '0', repr('a-')), ('a[b-]', 'a-', '0', repr('a-')), ('a[b-a]', '-', '', regex.error, self.BAD_CHAR_RANGE), ('a[]b', '-', '', regex.error, self.BAD_SET), ('a[', '-', '', regex.error, self.BAD_SET), ('a]', 'a]', '0', repr('a]')), ('a[]]b', 'a]b', '0', repr('a]b')), ('a[^bc]d', 'aed', '0', repr('aed')), ('a[^bc]d', 'abd', '', repr(None)), ('a[^-b]c', 'adc', '0', repr('adc')), ('a[^-b]c', 'a-c', '', repr(None)), ('a[^]b]c', 'a]c', '', repr(None)), ('a[^]b]c', 'adc', '0', repr('adc')), ('ab|cd', 'abc', '0', repr('ab')), ('ab|cd', 'abcd', '0', repr('ab')), ('()ef', 'def', '0,1', repr(('ef', ''))), ('*a', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(*)b', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('$b', 'b', '', repr(None)), ('a\\', '-', '', regex.error, self.BAD_ESCAPE), ('a\\(b', 'a(b', '', repr(('a(b',))), ('a\\(*b', 'ab', '0', repr('ab')), ('a\\(*b', 'a((b', '0', repr('a((b')), ('a\\\\b', 'a\\b', '0', repr('a\\b')), ('abc)', '-', '', regex.error, self.TRAILING_CHARS), ('(abc', '-', '', regex.error, self.MISSING_RPAREN), ('((a))', 'abc', '0,1,2', repr(('a', 'a', 'a'))), ('(a)b(c)', 'abc', '0,1,2', repr(('abc', 'a', 'c'))), ('a+b+c', 'aabbabc', '0', repr('abc')), ('a{1,}b{1,}c', 'aabbabc', '0', repr('abc')), ('a**', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('a.+?c', 'abcabc', '0', repr('abc')), ('(a+|b)*', 'ab', '0,1', repr(('ab', 'b'))), ('(a+|b){0,}', 'ab', '0,1', repr(('ab', 'b'))), ('(a+|b)+', 'ab', '0,1', repr(('ab', 'b'))), ('(a+|b){1,}', 'ab', '0,1', repr(('ab', 'b'))), ('(a+|b)?', 'ab', '0,1', repr(('a', 'a'))), ('(a+|b){0,1}', 'ab', '0,1', repr(('a', 'a'))), (')(', '-', '', regex.error, self.TRAILING_CHARS), ('[^ab]*', 'cde', '0', repr('cde')), ('abc', '', '', repr(None)), ('a*', '', '0', repr('')), ('([abc])*d', 'abbbcd', '0,1', repr(('abbbcd', 'c'))), ('([abc])*bcd', 'abcd', '0,1', repr(('abcd', 'a'))), ('a|b|c|d|e', 'e', '0', repr('e')), ('(a|b|c|d|e)f', 'ef', '0,1', repr(('ef', 'e'))), ('abcd*efg', 'abcdefg', '0', repr('abcdefg')), ('ab*', 'xabyabbbz', '0', repr('ab')), ('ab*', 'xayabbbz', '0', repr('a')), ('(ab|cd)e', 'abcde', '0,1', repr(('cde', 'cd'))), ('[abhgefdc]ij', 'hij', '0', repr('hij')), ('^(ab|cd)e', 'abcde', '', repr(None)), ('(abc|)ef', 'abcdef', '0,1', repr(('ef', ''))), ('(a|b)c*d', 'abcd', '0,1', repr(('bcd', 'b'))), ('(ab|ab*)bc', 'abc', '0,1', repr(('abc', 'a'))), ('a([bc]*)c*', 'abc', '0,1', repr(('abc', 'bc'))), ('a([bc]*)(c*d)', 'abcd', '0,1,2', repr(('abcd', 'bc', 'd'))), ('a([bc]+)(c*d)', 'abcd', '0,1,2', repr(('abcd', 'bc', 'd'))), ('a([bc]*)(c+d)', 'abcd', '0,1,2', repr(('abcd', 'b', 'cd'))), ('a[bcd]*dcdcde', 'adcdcde', '0', repr('adcdcde')), ('a[bcd]+dcdcde', 'adcdcde', '', repr(None)), ('(ab|a)b*c', 'abc', '0,1', repr(('abc', 'ab'))), ('((a)(b)c)(d)', 'abcd', '1,2,3,4', repr(('abc', 'a', 'b', 'd'))), ('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', '0', repr('alpha')), ('^a(bc+|b[eh])g|.h$', 'abh', '0,1', repr(('bh', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'effgz', '0,1,2', repr(('effgz', 'effgz', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'ij', '0,1,2', repr(('ij', 'ij', 'j'))), ('(bc+d$|ef*g.|h?i(j|k))', 'effg', '', repr(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'bcdd', '', repr(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'reffgz', '0,1,2', repr(('effgz', 'effgz', None))), ('((((((((((a))))))))))', 'a', '10', repr('a')), ('((((((((((a))))))))))\\10', 'aa', '0', repr('aa')), # Python does not have the same rules for \\41 so this is a syntax error # ('((((((((((a))))))))))\\41', 'aa', '', repr(None)), # ('((((((((((a))))))))))\\41', 'a!', '0', repr('a!')), ('((((((((((a))))))))))\\41', '', '', regex.error, self.UNKNOWN_GROUP), ('(?i)((((((((((a))))))))))\\41', '', '', regex.error, self.UNKNOWN_GROUP), ('(((((((((a)))))))))', 'a', '0', repr('a')), ('multiple words of text', 'uh-uh', '', repr(None)), ('multiple words', 'multiple words, yeah', '0', repr('multiple words')), ('(.*)c(.*)', 'abcde', '0,1,2', repr(('abcde', 'ab', 'de'))), ('\\((.*), (.*)\\)', '(a, b)', '2,1', repr(('b', 'a'))), ('[k]', 'ab', '', repr(None)), ('a[-]?c', 'ac', '0', repr('ac')), ('(abc)\\1', 'abcabc', '1', repr('abc')), ('([a-c]*)\\1', 'abcabc', '1', repr('abc')), ('(?i)abc', 'ABC', '0', repr('ABC')), ('(?i)abc', 'XBC', '', repr(None)), ('(?i)abc', 'AXC', '', repr(None)), ('(?i)abc', 'ABX', '', repr(None)), ('(?i)abc', 'XABCY', '0', repr('ABC')), ('(?i)abc', 'ABABC', '0', repr('ABC')), ('(?i)ab*c', 'ABC', '0', repr('ABC')), ('(?i)ab*bc', 'ABC', '0', repr('ABC')), ('(?i)ab*bc', 'ABBC', '0', repr('ABBC')), ('(?i)ab*?bc', 'ABBBBC', '0', repr('ABBBBC')), ('(?i)ab{0,}?bc', 'ABBBBC', '0', repr('ABBBBC')), ('(?i)ab+?bc', 'ABBC', '0', repr('ABBC')), ('(?i)ab+bc', 'ABC', '', repr(None)), ('(?i)ab+bc', 'ABQ', '', repr(None)), ('(?i)ab{1,}bc', 'ABQ', '', repr(None)), ('(?i)ab+bc', 'ABBBBC', '0', repr('ABBBBC')), ('(?i)ab{1,}?bc', 'ABBBBC', '0', repr('ABBBBC')), ('(?i)ab{1,3}?bc', 'ABBBBC', '0', repr('ABBBBC')), ('(?i)ab{3,4}?bc', 'ABBBBC', '0', repr('ABBBBC')), ('(?i)ab{4,5}?bc', 'ABBBBC', '', repr(None)), ('(?i)ab??bc', 'ABBC', '0', repr('ABBC')), ('(?i)ab??bc', 'ABC', '0', repr('ABC')), ('(?i)ab{0,1}?bc', 'ABC', '0', repr('ABC')), ('(?i)ab??bc', 'ABBBBC', '', repr(None)), ('(?i)ab??c', 'ABC', '0', repr('ABC')), ('(?i)ab{0,1}?c', 'ABC', '0', repr('ABC')), ('(?i)^abc$', 'ABC', '0', repr('ABC')), ('(?i)^abc$', 'ABCC', '', repr(None)), ('(?i)^abc', 'ABCC', '0', repr('ABC')), ('(?i)^abc$', 'AABC', '', repr(None)), ('(?i)abc$', 'AABC', '0', repr('ABC')), ('(?i)^', 'ABC', '0', repr('')), ('(?i)$', 'ABC', '0', repr('')), ('(?i)a.c', 'ABC', '0', repr('ABC')), ('(?i)a.c', 'AXC', '0', repr('AXC')), ('(?i)a.*?c', 'AXYZC', '0', repr('AXYZC')), ('(?i)a.*c', 'AXYZD', '', repr(None)), ('(?i)a[bc]d', 'ABC', '', repr(None)), ('(?i)a[bc]d', 'ABD', '0', repr('ABD')), ('(?i)a[b-d]e', 'ABD', '', repr(None)), ('(?i)a[b-d]e', 'ACE', '0', repr('ACE')), ('(?i)a[b-d]', 'AAC', '0', repr('AC')), ('(?i)a[-b]', 'A-', '0', repr('A-')), ('(?i)a[b-]', 'A-', '0', repr('A-')), ('(?i)a[b-a]', '-', '', regex.error, self.BAD_CHAR_RANGE), ('(?i)a[]b', '-', '', regex.error, self.BAD_SET), ('(?i)a[', '-', '', regex.error, self.BAD_SET), ('(?i)a]', 'A]', '0', repr('A]')), ('(?i)a[]]b', 'A]B', '0', repr('A]B')), ('(?i)a[^bc]d', 'AED', '0', repr('AED')), ('(?i)a[^bc]d', 'ABD', '', repr(None)), ('(?i)a[^-b]c', 'ADC', '0', repr('ADC')), ('(?i)a[^-b]c', 'A-C', '', repr(None)), ('(?i)a[^]b]c', 'A]C', '', repr(None)), ('(?i)a[^]b]c', 'ADC', '0', repr('ADC')), ('(?i)ab|cd', 'ABC', '0', repr('AB')), ('(?i)ab|cd', 'ABCD', '0', repr('AB')), ('(?i)()ef', 'DEF', '0,1', repr(('EF', ''))), ('(?i)*a', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(?i)(*)b', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(?i)$b', 'B', '', repr(None)), ('(?i)a\\', '-', '', regex.error, self.BAD_ESCAPE), ('(?i)a\\(b', 'A(B', '', repr(('A(B',))), ('(?i)a\\(*b', 'AB', '0', repr('AB')), ('(?i)a\\(*b', 'A((B', '0', repr('A((B')), ('(?i)a\\\\b', 'A\\B', '0', repr('A\\B')), ('(?i)abc)', '-', '', regex.error, self.TRAILING_CHARS), ('(?i)(abc', '-', '', regex.error, self.MISSING_RPAREN), ('(?i)((a))', 'ABC', '0,1,2', repr(('A', 'A', 'A'))), ('(?i)(a)b(c)', 'ABC', '0,1,2', repr(('ABC', 'A', 'C'))), ('(?i)a+b+c', 'AABBABC', '0', repr('ABC')), ('(?i)a{1,}b{1,}c', 'AABBABC', '0', repr('ABC')), ('(?i)a**', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(?i)a.+?c', 'ABCABC', '0', repr('ABC')), ('(?i)a.*?c', 'ABCABC', '0', repr('ABC')), ('(?i)a.{0,5}?c', 'ABCABC', '0', repr('ABC')), ('(?i)(a+|b)*', 'AB', '0,1', repr(('AB', 'B'))), ('(?i)(a+|b){0,}', 'AB', '0,1', repr(('AB', 'B'))), ('(?i)(a+|b)+', 'AB', '0,1', repr(('AB', 'B'))), ('(?i)(a+|b){1,}', 'AB', '0,1', repr(('AB', 'B'))), ('(?i)(a+|b)?', 'AB', '0,1', repr(('A', 'A'))), ('(?i)(a+|b){0,1}', 'AB', '0,1', repr(('A', 'A'))), ('(?i)(a+|b){0,1}?', 'AB', '0,1', repr(('', None))), ('(?i))(', '-', '', regex.error, self.TRAILING_CHARS), ('(?i)[^ab]*', 'CDE', '0', repr('CDE')), ('(?i)abc', '', '', repr(None)), ('(?i)a*', '', '0', repr('')), ('(?i)([abc])*d', 'ABBBCD', '0,1', repr(('ABBBCD', 'C'))), ('(?i)([abc])*bcd', 'ABCD', '0,1', repr(('ABCD', 'A'))), ('(?i)a|b|c|d|e', 'E', '0', repr('E')), ('(?i)(a|b|c|d|e)f', 'EF', '0,1', repr(('EF', 'E'))), ('(?i)abcd*efg', 'ABCDEFG', '0', repr('ABCDEFG')), ('(?i)ab*', 'XABYABBBZ', '0', repr('AB')), ('(?i)ab*', 'XAYABBBZ', '0', repr('A')), ('(?i)(ab|cd)e', 'ABCDE', '0,1', repr(('CDE', 'CD'))), ('(?i)[abhgefdc]ij', 'HIJ', '0', repr('HIJ')), ('(?i)^(ab|cd)e', 'ABCDE', '', repr(None)), ('(?i)(abc|)ef', 'ABCDEF', '0,1', repr(('EF', ''))), ('(?i)(a|b)c*d', 'ABCD', '0,1', repr(('BCD', 'B'))), ('(?i)(ab|ab*)bc', 'ABC', '0,1', repr(('ABC', 'A'))), ('(?i)a([bc]*)c*', 'ABC', '0,1', repr(('ABC', 'BC'))), ('(?i)a([bc]*)(c*d)', 'ABCD', '0,1,2', repr(('ABCD', 'BC', 'D'))), ('(?i)a([bc]+)(c*d)', 'ABCD', '0,1,2', repr(('ABCD', 'BC', 'D'))), ('(?i)a([bc]*)(c+d)', 'ABCD', '0,1,2', repr(('ABCD', 'B', 'CD'))), ('(?i)a[bcd]*dcdcde', 'ADCDCDE', '0', repr('ADCDCDE')), ('(?i)a[bcd]+dcdcde', 'ADCDCDE', '', repr(None)), ('(?i)(ab|a)b*c', 'ABC', '0,1', repr(('ABC', 'AB'))), ('(?i)((a)(b)c)(d)', 'ABCD', '1,2,3,4', repr(('ABC', 'A', 'B', 'D'))), ('(?i)[a-zA-Z_][a-zA-Z0-9_]*', 'ALPHA', '0', repr('ALPHA')), ('(?i)^a(bc+|b[eh])g|.h$', 'ABH', '0,1', repr(('BH', None))), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'EFFGZ', '0,1,2', repr(('EFFGZ', 'EFFGZ', None))), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'IJ', '0,1,2', repr(('IJ', 'IJ', 'J'))), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'EFFG', '', repr(None)), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'BCDD', '', repr(None)), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'REFFGZ', '0,1,2', repr(('EFFGZ', 'EFFGZ', None))), ('(?i)((((((((((a))))))))))', 'A', '10', repr('A')), ('(?i)((((((((((a))))))))))\\10', 'AA', '0', repr('AA')), #('(?i)((((((((((a))))))))))\\41', 'AA', '', repr(None)), #('(?i)((((((((((a))))))))))\\41', 'A!', '0', repr('A!')), ('(?i)(((((((((a)))))))))', 'A', '0', repr('A')), ('(?i)(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))', 'A', '1', repr('A')), ('(?i)(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))', 'C', '1', repr('C')), ('(?i)multiple words of text', 'UH-UH', '', repr(None)), ('(?i)multiple words', 'MULTIPLE WORDS, YEAH', '0', repr('MULTIPLE WORDS')), ('(?i)(.*)c(.*)', 'ABCDE', '0,1,2', repr(('ABCDE', 'AB', 'DE'))), ('(?i)\\((.*), (.*)\\)', '(A, B)', '2,1', repr(('B', 'A'))), ('(?i)[k]', 'AB', '', repr(None)), # ('(?i)abcd', 'ABCD', SUCCEED, 'found+"-"+\\found+"-"+\\\\found', repr(ABCD-$&-\\ABCD)), # ('(?i)a(bc)d', 'ABCD', SUCCEED, 'g1+"-"+\\g1+"-"+\\\\g1', repr(BC-$1-\\BC)), ('(?i)a[-]?c', 'AC', '0', repr('AC')), ('(?i)(abc)\\1', 'ABCABC', '1', repr('ABC')), ('(?i)([a-c]*)\\1', 'ABCABC', '1', repr('ABC')), ('a(?!b).', 'abad', '0', repr('ad')), ('a(?=d).', 'abad', '0', repr('ad')), ('a(?=c|d).', 'abad', '0', repr('ad')), ('a(?:b|c|d)(.)', 'ace', '1', repr('e')), ('a(?:b|c|d)*(.)', 'ace', '1', repr('e')), ('a(?:b|c|d)+?(.)', 'ace', '1', repr('e')), ('a(?:b|(c|e){1,2}?|d)+?(.)', 'ace', '1,2', repr(('c', 'e'))), # Lookbehind: split by : but not if it is escaped by -. ('(?]*?b', 'a>b', '', repr(None)), # Bug 490573: minimizing repeat problem. (r'^a*?$', 'foo', '', repr(None)), # Bug 470582: nested groups problem. (r'^((a)c)?(ab)$', 'ab', '1,2,3', repr((None, None, 'ab'))), # Another minimizing repeat problem (capturing groups in assertions). ('^([ab]*?)(?=(b)?)c', 'abc', '1,2', repr(('ab', None))), ('^([ab]*?)(?!(b))c', 'abc', '1,2', repr(('ab', None))), ('^([ab]*?)(?(.){0,2})d", "abcd").captures(1), ['b', 'c']) self.assertEqual(regex.search(r"(.)+", "a").captures(1), ['a']) def test_guards(self): m = regex.search(r"(X.*?Y\s*){3}(X\s*)+AB:", "XY\nX Y\nX Y\nXY\nXX AB:") self.assertEqual(m.span(0, 1, 2), ((3, 21), (12, 15), (16, 18))) m = regex.search(r"(X.*?Y\s*){3,}(X\s*)+AB:", "XY\nX Y\nX Y\nXY\nXX AB:") self.assertEqual(m.span(0, 1, 2), ((0, 21), (12, 15), (16, 18))) m = regex.search(r'\d{4}(\s*\w)?\W*((?!\d)\w){2}', "9999XX") self.assertEqual(m.span(0, 1, 2), ((0, 6), (-1, -1), (5, 6))) m = regex.search(r'A\s*?.*?(\n+.*?\s*?){0,2}\(X', 'A\n1\nS\n1 (X') self.assertEqual(m.span(0, 1), ((0, 10), (5, 8))) m = regex.search('Derde\s*:', 'aaaaaa:\nDerde:') self.assertEqual(m.span(), (8, 14)) m = regex.search('Derde\s*:', 'aaaaa:\nDerde:') self.assertEqual(m.span(), (7, 13)) def test_turkic(self): # Turkish has dotted and dotless I/i. pairs = u"I=i;I=\u0131;i=\u0130" all_chars = set() matching = set() for pair in pairs.split(";"): ch1, ch2 = pair.split("=") all_chars.update((ch1, ch2)) matching.add((ch1, ch1)) matching.add((ch1, ch2)) matching.add((ch2, ch1)) matching.add((ch2, ch2)) for ch1 in all_chars: for ch2 in all_chars: m = regex.match(ur"(?iu)\A" + ch1 + ur"\Z", ch2) if m: if (ch1, ch2) not in matching: self.fail("%s matching %s" % (repr(ch1), repr(ch2))) else: if (ch1, ch2) in matching: self.fail("%s not matching %s" % (repr(ch1), repr(ch2))) def test_named_lists(self): options = [u"one", u"two", u"three"] self.assertEqual(regex.match(ur"333\L444", u"333one444", bar=options).group(), u"333one444") self.assertEqual(regex.match(ur"(?i)333\L444", u"333TWO444", bar=options).group(), u"333TWO444") self.assertEqual(regex.match(ur"333\L444", u"333four444", bar=options), None) options = ["one", "two", "three"] self.assertEqual(regex.match(r"333\L444", "333one444", bar=options).group(), "333one444") self.assertEqual(regex.match(r"(?i)333\L444", "333TWO444", bar=options).group(), "333TWO444") self.assertEqual(regex.match(r"333\L444", "333four444", bar=options), None) self.assertEqual(repr(type(regex.compile(r"3\L4\L+5", bar=["one", "two", "three"]))), self.PATTERN_CLASS) self.assertEqual(regex.findall(r"^\L", "solid QWERT", options=set(['good', 'brilliant', '+s\\ol[i}d'])), []) self.assertEqual(regex.findall(r"^\L", "+solid QWERT", options=set(['good', 'brilliant', '+solid'])), ['+solid']) options = [u"STRASSE"] self.assertEqual(regex.match(ur"(?fiu)\L", u"stra\N{LATIN SMALL LETTER SHARP S}e", words=options).span(), (0, 6)) options = [u"STRASSE", u"stress"] self.assertEqual(regex.match(ur"(?fiu)\L", u"stra\N{LATIN SMALL LETTER SHARP S}e", words=options).span(), (0, 6)) options = [u"stra\N{LATIN SMALL LETTER SHARP S}e"] self.assertEqual(regex.match(ur"(?fiu)\L", u"STRASSE", words=options).span(), (0, 7)) options = ["kit"] self.assertEqual(regex.search(ur"(?iu)\L", u"SKITS", words=options).span(), (1, 4)) self.assertEqual(regex.search(ur"(?iu)\L", u"SK\N{LATIN CAPITAL LETTER I WITH DOT ABOVE}TS", words=options).span(), (1, 4)) self.assertEqual(regex.search(ur"(?fiu)\b(\w+) +\1\b", u" stra\N{LATIN SMALL LETTER SHARP S}e STRASSE ").span(), (1, 15)) self.assertEqual(regex.search(ur"(?fiu)\b(\w+) +\1\b", u" STRASSE stra\N{LATIN SMALL LETTER SHARP S}e ").span(), (1, 15)) self.assertEqual(regex.search(r"^\L$", "", options=[]).span(), (0, 0)) def test_fuzzy(self): # Some tests borrowed from TRE library tests. self.assertEqual(repr(type(regex.compile('(fou){s,e<=1}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(fuu){s}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(fuu){s,e}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(anaconda){1i+1d<1,s<=1}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(anaconda){1i+1d<1,s<=1,e<=10}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(anaconda){s<=1,e<=1,1i+1d<1}'))), self.PATTERN_CLASS) text = 'molasses anaconda foo bar baz smith anderson ' self.assertEqual(regex.search('(znacnda){s<=1,e<=3,1i+1d<1}', text), None) self.assertEqual(regex.search('(znacnda){s<=1,e<=3,1i+1d<2}', text).span(0, 1), ((9, 17), (9, 17))) self.assertEqual(regex.search('(ananda){1i+1d<2}', text), None) self.assertEqual(regex.search(r"(?:\bznacnda){e<=2}", text)[0], "anaconda") self.assertEqual(regex.search(r"(?:\bnacnda){e<=2}", text)[0], "anaconda") text = 'anaconda foo bar baz smith anderson' self.assertEqual(regex.search('(fuu){i<=3,d<=3,e<=5}', text).span(0, 1), ((0, 0), (0, 0))) self.assertEqual(regex.search('(?b)(fuu){i<=3,d<=3,e<=5}', text).span(0, 1), ((9, 10), (9, 10))) self.assertEqual(regex.search('(fuu){i<=2,d<=2,e<=5}', text).span(0, 1), ((7, 10), (7, 10))) self.assertEqual(regex.search('(?e)(fuu){i<=2,d<=2,e<=5}', text).span(0, 1), ((9, 10), (9, 10))) self.assertEqual(regex.search('(fuu){i<=3,d<=3,e}', text).span(0, 1), ((0, 0), (0, 0))) self.assertEqual(regex.search('(?b)(fuu){i<=3,d<=3,e}', text).span(0, 1), ((9, 10), (9, 10))) self.assertEqual(repr(type(regex.compile('(approximate){s<=3,1i+1d<3}'))), self.PATTERN_CLASS) # No cost limit. self.assertEqual(regex.search('(foobar){e}', 'xirefoabralfobarxie').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('(?e)(foobar){e}', 'xirefoabralfobarxie').span(0, 1), ((0, 3), (0, 3))) self.assertEqual(regex.search('(?b)(foobar){e}', 'xirefoabralfobarxie').span(0, 1), ((11, 16), (11, 16))) # At most two errors. self.assertEqual(regex.search('(foobar){e<=2}', 'xirefoabrzlfd').span(0, 1), ((4, 9), (4, 9))) self.assertEqual(regex.search('(foobar){e<=2}', 'xirefoabzlfd'), None) # At most two inserts or substitutions and max two errors total. self.assertEqual(regex.search('(foobar){i<=2,s<=2,e<=2}', 'oobargoobaploowap').span(0, 1), ((5, 11), (5, 11))) # Find best whole word match for "foobar". self.assertEqual(regex.search('\\b(foobar){e}\\b', 'zfoobarz').span(0, 1), ((0, 8), (0, 8))) self.assertEqual(regex.search('\\b(foobar){e}\\b', 'boing zfoobarz goobar woop').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('(?b)\\b(foobar){e}\\b', 'boing zfoobarz goobar woop').span(0, 1), ((15, 21), (15, 21))) # Match whole string, allow only 1 error. self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobar').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xfoobar').span(0, 1), ((0, 7), (0, 7))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobarx').span(0, 1), ((0, 7), (0, 7))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'fooxbar').span(0, 1), ((0, 7), (0, 7))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foxbar').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xoobar').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobax').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'oobar').span(0, 1), ((0, 5), (0, 5))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'fobar').span(0, 1), ((0, 5), (0, 5))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'fooba').span(0, 1), ((0, 5), (0, 5))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xfoobarx'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobarxx'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xxfoobar'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xfoxbar'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foxbarx'), None) # At most one insert, two deletes, and three substitutions. # Additionally, deletes cost two and substitutes one, and total # cost must be less than 4. self.assertEqual(regex.search('(foobar){i<=1,d<=2,s<=3,2d+1s<4}', '3oifaowefbaoraofuiebofasebfaobfaorfeoaro').span(0, 1), ((6, 13), (6, 13))) self.assertEqual(regex.search('(?b)(foobar){i<=1,d<=2,s<=3,2d+1s<4}', '3oifaowefbaoraofuiebofasebfaobfaorfeoaro').span(0, 1), ((26, 33), (26, 33))) # Partially fuzzy matches. self.assertEqual(regex.search('foo(bar){e<=1}zap', 'foobarzap').span(0, 1), ((0, 9), (3, 6))) self.assertEqual(regex.search('foo(bar){e<=1}zap', 'fobarzap'), None) self.assertEqual(regex.search('foo(bar){e<=1}zap', 'foobrzap').span(0, 1), ((0, 8), (3, 5))) text = ('www.cnn.com 64.236.16.20\nwww.slashdot.org 66.35.250.150\n' 'For useful information, use www.slashdot.org\nthis is demo data!\n') self.assertEqual(regex.search(r'(?s)^.*(dot.org){e}.*$', text).span(0, 1), ((0, 120), (120, 120))) self.assertEqual(regex.search(r'(?es)^.*(dot.org){e}.*$', text).span(0, 1), ((0, 120), (93, 100))) self.assertEqual(regex.search(r'^.*(dot.org){e}.*$', text).span(0, 1), ((0, 119), (24, 101))) # Behaviour is unexpected, but arguably not wrong. It first finds the # best match, then the best in what follows, etc. self.assertEqual(regex.findall(r"\b\L{e<=1}\b", " book cot dog desk ", words="cat dog".split()), ["cot", "dog"]) self.assertEqual(regex.findall(r"\b\L{e<=1}\b", " book dog cot desk ", words="cat dog".split()), [" dog", "cot"]) self.assertEqual(regex.findall(r"(?e)\b\L{e<=1}\b", " book dog cot desk ", words="cat dog".split()), ["dog", "cot"]) self.assertEqual(regex.findall(r"(?r)\b\L{e<=1}\b", " book cot dog desk ", words="cat dog".split()), ["dog ", "cot"]) self.assertEqual(regex.findall(r"(?er)\b\L{e<=1}\b", " book cot dog desk ", words="cat dog".split()), ["dog", "cot"]) self.assertEqual(regex.findall(r"(?r)\b\L{e<=1}\b", " book dog cot desk ", words="cat dog".split()), ["cot", "dog"]) self.assertEqual(regex.findall(ur"\b\L{e<=1}\b", u" book cot dog desk ", words=u"cat dog".split()), [u"cot", u"dog"]) self.assertEqual(regex.findall(ur"\b\L{e<=1}\b", u" book dog cot desk ", words=u"cat dog".split()), [u" dog", u"cot"]) self.assertEqual(regex.findall(ur"(?e)\b\L{e<=1}\b", u" book dog cot desk ", words=u"cat dog".split()), [u"dog", u"cot"]) self.assertEqual(regex.findall(ur"(?r)\b\L{e<=1}\b", u" book cot dog desk ", words=u"cat dog".split()), [u"dog ", u"cot"]) self.assertEqual(regex.findall(ur"(?er)\b\L{e<=1}\b", u" book cot dog desk ", words=u"cat dog".split()), [u"dog", u"cot"]) self.assertEqual(regex.findall(ur"(?r)\b\L{e<=1}\b", u" book dog cot desk ", words=u"cat dog".split()), [u"cot", u"dog"]) self.assertEqual(regex.search(r"(\w+) (\1{e<=1})", "foo fou").groups(), ("foo", "fou")) self.assertEqual(regex.search(r"(?r)(\2{e<=1}) (\w+)", "foo fou").groups(), ("foo", "fou")) self.assertEqual(regex.search(ur"(\w+) (\1{e<=1})", u"foo fou").groups(), (u"foo", u"fou")) self.assertEqual(regex.findall(r"(?:(?:QR)+){e}","abcde"), ["abcde", ""]) self.assertEqual(regex.findall(r"(?:Q+){e}","abc"), ["abc", ""]) # Hg issue 41. self.assertEqual(regex.match(r"(?:service detection){0[^()]+)|(?R))*\)", "(ab(cd)ef)")[ : ], ("(ab(cd)ef)", "ef")) self.assertEqual(regex.search(r"\(((?>[^()]+)|(?R))*\)", "(ab(cd)ef)").captures(1), ["ab", "cd", "(cd)", "ef"]) self.assertEqual(regex.search(r"(?r)\(((?R)|(?>[^()]+))*\)", "(ab(cd)ef)")[ : ], ("(ab(cd)ef)", "ab")) self.assertEqual(regex.search(r"(?r)\(((?R)|(?>[^()]+))*\)", "(ab(cd)ef)").captures(1), ["ef", "cd", "(cd)", "ab"]) self.assertEqual(regex.search(r"\(([^()]+|(?R))*\)", "some text (a(b(c)d)e) more text")[ : ], ("(a(b(c)d)e)", "e")) self.assertEqual(regex.search(r"(?r)\(((?R)|[^()]+)*\)", "some text (a(b(c)d)e) more text")[ : ], ("(a(b(c)d)e)", "a")) self.assertEqual(regex.search(r"(foo(\(((?:(?>[^()]+)|(?2))*)\)))", "foo(bar(baz)+baz(bop))")[ : ], ("foo(bar(baz)+baz(bop))", "foo(bar(baz)+baz(bop))", "(bar(baz)+baz(bop))", "bar(baz)+baz(bop)")) self.assertEqual(regex.search(r"(?r)(foo(\(((?:(?2)|(?>[^()]+))*)\)))", "foo(bar(baz)+baz(bop))")[ : ], ("foo(bar(baz)+baz(bop))", "foo(bar(baz)+baz(bop))", "(bar(baz)+baz(bop))", "bar(baz)+baz(bop)")) rgx = regex.compile(r"""^\s*(<\s*([a-zA-Z:]+)(?:\s*[a-zA-Z:]*\s*=\s*(?:'[^']*'|"[^"]*"))*\s*(/\s*)?>(?:[^<>]*|(?1))*(?(3)|<\s*/\s*\2\s*>))\s*$""") self.assertEqual(bool(rgx.search('')), True) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), True) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), True) self.assertEqual(bool(rgx.search('< fooo / >')), True) # The next regex should and does match. Perl 5.14 agrees. #self.assertEqual(bool(rgx.search('foo')), False) self.assertEqual(bool(rgx.search('foo')), False) self.assertEqual(bool(rgx.search('foo')), True) self.assertEqual(bool(rgx.search('foo')), True) self.assertEqual(bool(rgx.search('')), True) def test_copy(self): # PatternObjects are immutable, therefore there's no need to clone them. r = regex.compile("a") self.assert_(copy.copy(r) is r) self.assert_(copy.deepcopy(r) is r) # MatchObjects are normally mutable because the target string can be # detached. However, after the target string has been detached, a # MatchObject becomes immutable, so there's no need to clone it. m = r.match("a") self.assert_(copy.copy(m) is not m) self.assert_(copy.deepcopy(m) is not m) self.assert_(m.string is not None) m2 = copy.copy(m) m2.detach_string() self.assert_(m.string is not None) self.assert_(m2.string is None) # The following behaviour matches that of the re module. it = regex.finditer(".", "ab") it2 = copy.copy(it) self.assertEqual(it.next().group(), "a") self.assertEqual(it2.next().group(), "b") # The following behaviour matches that of the re module. it = regex.finditer(".", "ab") it2 = copy.deepcopy(it) self.assertEqual(it.next().group(), "a") self.assertEqual(it2.next().group(), "b") # The following behaviour is designed to match that of copying 'finditer'. it = regex.splititer(" ", "a b") it2 = copy.copy(it) self.assertEqual(it.next(), "a") self.assertEqual(it2.next(), "b") # The following behaviour is designed to match that of copying 'finditer'. it = regex.splititer(" ", "a b") it2 = copy.deepcopy(it) self.assertEqual(it.next(), "a") self.assertEqual(it2.next(), "b") def test_format(self): self.assertEqual(regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar"), "foo bar => bar foo") self.assertEqual(regex.subf(r"(?\w+) (?\w+)", "{word2} {word1}", "foo bar"), "bar foo") self.assertEqual(regex.subfn(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar"), ("foo bar => bar foo", 1)) self.assertEqual(regex.subfn(r"(?\w+) (?\w+)", "{word2} {word1}", "foo bar"), ("bar foo", 1)) self.assertEqual(regex.match(r"(\w+) (\w+)", "foo bar").expandf("{0} => {2} {1}"), "foo bar => bar foo") def test_fullmatch(self): self.assertEqual(bool(regex.fullmatch(r"abc", "abc")), True) self.assertEqual(bool(regex.fullmatch(r"abc", "abcx")), False) self.assertEqual(bool(regex.fullmatch(r"abc", "abcx", endpos=3)), True) self.assertEqual(bool(regex.fullmatch(r"abc", "xabc", pos=1)), True) self.assertEqual(bool(regex.fullmatch(r"abc", "xabcy", pos=1)), False) self.assertEqual(bool(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4)), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "abc")), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "abcx")), False) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "abcx", endpos=3)), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "xabc", pos=1)), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "xabcy", pos=1)), False) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "xabcy", pos=1, endpos=4)), True) def test_hg_bugs(self): # Hg issue 28. self.assertEqual(bool(regex.compile("(?>b)", flags=regex.V1)), True) # Hg issue 29. self.assertEqual(bool(regex.compile("^((?>\w+)|(?>\s+))*$", flags=regex.V1)), True) # Hg issue 31. self.assertEqual(regex.findall(r"\((?:(?>[^()]+)|(?R))*\)", "a(bcd(e)f)g(h)"), ['(bcd(e)f)', '(h)']) self.assertEqual(regex.findall(r"\((?:(?:[^()]+)|(?R))*\)", "a(bcd(e)f)g(h)"), ['(bcd(e)f)', '(h)']) self.assertEqual(regex.findall(r"\((?:(?>[^()]+)|(?R))*\)", "a(b(cd)e)f)g)h"), ['(b(cd)e)']) self.assertEqual(regex.findall(r"\((?:(?>[^()]+)|(?R))*\)", "a(bc(d(e)f)gh"), ['(d(e)f)']) self.assertEqual(regex.findall(r"(?r)\((?:(?>[^()]+)|(?R))*\)", "a(bc(d(e)f)gh"), ['(d(e)f)']) self.assertEqual([m.group() for m in regex.finditer(r"\((?:[^()]*+|(?0))*\)", "a(b(c(de)fg)h")], ['(c(de)fg)']) # Hg issue 32. self.assertEqual(regex.search("a(bc)d", "abcd", regex.I | regex.V1).group(0), "abcd") # Hg issue 33. self.assertEqual(regex.search("([\da-f:]+)$", "E", regex.I | regex.V1).group(0), "E") self.assertEqual(regex.search("([\da-f:]+)$", "e", regex.I | regex.V1).group(0), "e") # Hg issue 34. self.assertEqual(regex.search("^(?=ab(de))(abd)(e)", "abde").groups(), ('de', 'abd', 'e')) # Hg issue 35. self.assertEqual(bool(regex.match(r"\ ", " ", flags=regex.X)), True) # Hg issue 36. self.assertEqual(regex.search(r"^(a|)\1{2}b", "b").group(0, 1), ('b', '')) # Hg issue 37. self.assertEqual(regex.search("^(a){0,0}", "abc").group(0, 1), ('', None)) # Hg issue 38. self.assertEqual(regex.search("(?>.*/)b", "a/b").group(0), "a/b") # Hg issue 39. self.assertEqual(regex.search(r"(?V0)((?i)blah)\s+\1", "blah BLAH").group(0, 1), ("blah BLAH", "blah")) self.assertEqual(regex.search(r"(?V1)((?i)blah)\s+\1", "blah BLAH"), None) # Hg issue 40. self.assertEqual(regex.search(r"(\()?[^()]+(?(1)\)|)", "(abcd").group(0), "abcd") # Hg issue 42. self.assertEqual(regex.search("(a*)*", "a").span(1), (1, 1)) self.assertEqual(regex.search("(a*)*", "aa").span(1), (2, 2)) self.assertEqual(regex.search("(a*)*", "aaa").span(1), (3, 3)) # Hg issue 43. self.assertEqual(regex.search("a(?#xxx)*", "aaa").group(), "aaa") # Hg issue 44. self.assertEqual(regex.search("(?=abc){3}abc", "abcabcabc").span(), (0, 3)) # Hg issue 45. self.assertEqual(regex.search("^(?:a(?:(?:))+)+", "a").span(), (0, 1)) self.assertEqual(regex.search("^(?:a(?:(?:))+)+", "aa").span(), (0, 2)) # Hg issue 46. self.assertEqual(regex.search("a(?x: b c )d", "abcd").group(0), "abcd") # Hg issue 47. self.assertEqual(regex.search("a#comment\n*", "aaa", flags=regex.X).group(0), "aaa") # Hg issue 48. self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){1}", "aaaaaaaaaa").span(0, 1), ((0, 1), (0, 1))) self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){2}", "aaaaaaaaaa").span(0, 1), ((0, 3), (1, 3))) self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){3}", "aaaaaaaaaa").span(0, 1), ((0, 6), (3, 6))) self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){4}", "aaaaaaaaaa").span(0, 1), ((0, 10), (6, 10))) # Hg issue 49. self.assertEqual(regex.search("(?V1)(a)(?<=b(?1))", "baz").group(0), "a") # Hg issue 50. self.assertEqual(regex.findall(ur'(?fi)\L', u'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05', keywords=['post','pos']), [u'POST', u'Post', u'post', u'po\u017Ft', u'po\uFB06', u'po\uFB05']) self.assertEqual(regex.findall(ur'(?fi)pos|post', u'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05'), [u'POS', u'Pos', u'pos', u'po\u017F', u'po\uFB06', u'po\uFB05']) self.assertEqual(regex.findall(ur'(?fi)post|pos', u'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05'), [u'POST', u'Post', u'post', u'po\u017Ft', u'po\uFB06', u'po\uFB05']) self.assertEqual(regex.findall(ur'(?fi)post|another', u'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05'), [u'POST', u'Post', u'post', u'po\u017Ft', u'po\uFB06', u'po\uFB05']) # Hg issue 51. self.assertEqual(regex.search("(?V1)((a)(?1)|(?2))", "a").group(0, 1, 2), ('a', 'a', None)) # Hg issue 52. self.assertEqual(regex.search(r"(?V1)(\1xx|){6}", "xx").span(0, 1), ((0, 2), (2, 2))) # Hg issue 53. self.assertEqual(regex.search("(a|)+", "a").group(0, 1), ("a", "")) # Hg issue 54. self.assertEqual(regex.search(r"(a|)*\d", "a" * 80), None) # Hg issue 55. self.assertEqual(regex.search("^(?:a?b?)*$", "ac"), None) # Hg issue 58. self.assertRaisesRegex(regex.error, self.UNDEF_CHAR_NAME, lambda: regex.compile("\\N{1}")) # Hg issue 59. self.assertEqual(regex.search("\\Z", "a\na\n").span(0), (4, 4)) # Hg issue 60. self.assertEqual(regex.search("(q1|.)*(q2|.)*(x(a|bc)*y){2,}", "xayxay").group(0), "xayxay") # Hg issue 61. self.assertEqual(regex.search("(?i)[^a]", "A"), None) # Hg issue 63. self.assertEqual(regex.search(u"(?iu)[[:ascii:]]", u"\N{KELVIN SIGN}"), None) # Hg issue 66. self.assertEqual(regex.search("((a|b(?1)c){3,5})", "baaaaca").group(0, 1, 2), ('aaaa', 'aaaa', 'a')) # Hg issue 71. self.assertEqual(regex.findall(r"(?<=:\S+ )\w+", ":9 abc :10 def"), ['abc', 'def']) self.assertEqual(regex.findall(r"(?<=:\S* )\w+", ":9 abc :10 def"), ['abc', 'def']) self.assertEqual(regex.findall(r"(?<=:\S+? )\w+", ":9 abc :10 def"), ['abc', 'def']) self.assertEqual(regex.findall(r"(?<=:\S*? )\w+", ":9 abc :10 def"), ['abc', 'def']) # Hg issue 73. self.assertEqual(regex.search(r"(?:fe)?male", "female").group(), "female") self.assertEqual([m.group() for m in regex.finditer(r"(fe)?male: h(?(1)(er)|(is)) (\w+)", "female: her dog; male: his cat. asdsasda")], ['female: her dog', 'male: his cat']) # Hg issue 78. self.assertEqual(regex.search(r'(?\((?:[^()]++|(?&rec))*\))', 'aaa(((1+0)+1)+1)bbb').captures('rec'), ['(1+0)', '((1+0)+1)', '(((1+0)+1)+1)']) # Hg issue 80. self.assertRaisesRegex(regex.error, self.BAD_ESCAPE, lambda: regex.sub('x', '\\', 'x'), ) # Hg issue 82. fz = "(CAGCCTCCCATTTCAGAATATACATCC){1a(?b))', "ab").spans("x"), [(1, 2), (0, 2)]) # Hg issue 91. # Check that the replacement cache works. self.assertEqual(regex.sub(r'(-)', lambda m: m.expand(r'x'), 'a-b-c'), 'axbxc') # Hg issue 94. rx = regex.compile(r'\bt(est){i<2}', flags=regex.V1) self.assertEqual(rx.search("Some text"), None) self.assertEqual(rx.findall("Some text"), []) # Hg issue 95. self.assertRaisesRegex(regex.error, '^nothing to repeat at position 3$', lambda: regex.compile(r'.???')) # Hg issue 97. self.assertEquals(regex.escape(u'foo!?'), u'foo\\!\\?') self.assertEquals(regex.escape(u'foo!?', special_only=True), u'foo!\\?') self.assertEquals(regex.escape('foo!?'), 'foo\\!\\?') self.assertEquals(regex.escape('foo!?', special_only=True), 'foo!\\?') # Hg issue 100. self.assertEquals(regex.search('^([^z]*(?:WWWi|W))?$', 'WWWi').groups(), ('WWWi', )) self.assertEquals(regex.search('^([^z]*(?:WWWi|w))?$', 'WWWi').groups(), ('WWWi', )) self.assertEquals(regex.search('^([^z]*?(?:WWWi|W))?$', 'WWWi').groups(), ('WWWi', )) # Hg issue 101. pat = regex.compile(r'xxx', flags=regex.FULLCASE | regex.UNICODE) self.assertEquals([x.group() for x in pat.finditer('yxxx')], ['xxx']) self.assertEquals(pat.findall('yxxx'), ['xxx']) raw = 'yxxx' self.assertEquals([x.group() for x in pat.finditer(raw)], ['xxx']) self.assertEquals(pat.findall(raw), ['xxx']) pat = regex.compile(r'xxx', flags=regex.FULLCASE | regex.IGNORECASE | regex.UNICODE) self.assertEquals([x.group() for x in pat.finditer('yxxx')], ['xxx']) self.assertEquals(pat.findall('yxxx'), ['xxx']) raw = 'yxxx' self.assertEquals([x.group() for x in pat.finditer(raw)], ['xxx']) self.assertEquals(pat.findall(raw), ['xxx']) # Hg issue 106. self.assertEquals(regex.sub('(?V0).*', 'x', 'test'), 'x') self.assertEquals(regex.sub('(?V1).*', 'x', 'test'), 'xx') self.assertEquals(regex.sub('(?V0).*?', '|', 'test'), '|t|e|s|t|') self.assertEquals(regex.sub('(?V1).*?', '|', 'test'), '|||||||||') if not hasattr(str, "format"): # Strings don't have the .format method (below Python 2.6). del RegexTests.test_format def test_main(): run_unittest(RegexTests) if __name__ == "__main__": test_main() regex-2014.02.16/Python2/_regex.c0000666000000000000000000226277012300213253014342 0ustar 00000000000000/* Secret Labs' Regular Expression Engine * * regular expression matching engine * * partial history: * 1999-10-24 fl created (based on existing template matcher code) * 2000-03-06 fl first alpha, sort of * 2000-08-01 fl fixes for 1.6b1 * 2000-08-07 fl use PyOS_CheckStack() if available * 2000-09-20 fl added expand method * 2001-03-20 fl lots of fixes for 2.1b2 * 2001-04-15 fl export copyright as Python attribute, not global * 2001-04-28 fl added __copy__ methods (work in progress) * 2001-05-14 fl fixes for 1.5.2 compatibility * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) * 2001-10-20 fl added split primitive; reenable unicode for 1.6/2.0/2.1 * 2001-10-21 fl added sub/subn primitive * 2001-10-24 fl added finditer primitive (for 2.2 only) * 2001-12-07 fl fixed memory leak in sub/subn (Guido van Rossum) * 2002-11-09 fl fixed empty sub/subn return type * 2003-04-18 mvl fully support 4-byte codes * 2003-10-17 gn implemented non recursive scheme * 2009-07-26 mrab completely re-designed matcher code * 2011-11-18 mrab added support for PEP 393 strings * * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * * This version of the SRE library can be redistributed under CNRI's * Python 1.6 license. For any other use, please contact Secret Labs * AB (info@pythonware.com). * * Portions of this engine have been developed in cooperation with * CNRI. Hewlett-Packard provided funding for 1.6 integration and * other compatibility work. */ /* #define VERBOSE */ #if defined(VERBOSE) #define TRACE(X) printf X; #else #define TRACE(X) #endif #include "Python.h" #include "structmember.h" /* offsetof */ #include #include "_regex.h" #include "pyport.h" #include "pythread.h" #define RE_MIN(X, Y) ((X) <= (Y) ? (X) : (Y)) #define RE_MAX(X, Y) ((X) >= (Y) ? (X) : (Y)) #if PY_VERSION_HEX < 0x02060000 #if SIZEOF_SIZE_T == SIZEOF_LONG_LONG #define T_PYSSIZET T_LONGLONG #elif SIZEOF_SIZE_T == SIZEOF_LONG #define T_PYSSIZET T_LONG #else #error size_t is the same size as neither LONG nor LONGLONG #endif #endif typedef unsigned char Py_UCS1; typedef unsigned short Py_UCS2; typedef RE_UINT32 RE_CODE; /* Case-sensitive letters in the General Category. */ #define RE_PROP_GC_LU ((RE_PROP_GC << 16) | RE_PROP_LU) #define RE_PROP_GC_LL ((RE_PROP_GC << 16) | RE_PROP_LL) #define RE_PROP_GC_LT ((RE_PROP_GC << 16) | RE_PROP_LT) /* Unlimited repeat count. */ #define RE_UNLIMITED (~(RE_CODE)0) /* The status of a node. */ typedef unsigned short RE_STATUS_T; /* Whether to match concurrently, i.e. release the GIL while matching. */ #define RE_CONC_NO 0 #define RE_CONC_YES 1 #define RE_CONC_DEFAULT 2 /* Flags for the kind of 'sub' call: 'sub', 'subn', 'subf', 'subfn'. */ #define RE_SUB 0x0 #define RE_SUBN 0x1 #if PY_VERSION_HEX >= 0x02060000 #define RE_SUBF 0x2 #endif /* The name of this module, minus the leading underscore. */ #define RE_MODULE "regex" #define RE_MODULE_UPPER "REGEX" /* Error codes. */ #define RE_ERROR_SUCCESS 1 /* Successful match. */ #define RE_ERROR_FAILURE 0 /* Unsuccessful match. */ #define RE_ERROR_ILLEGAL -1 /* Illegal code. */ #define RE_ERROR_INTERNAL -2 /* Internal error. */ #define RE_ERROR_CONCURRENT -3 /* "concurrent" invalid. */ #define RE_ERROR_MEMORY -9 /* Out of memory. */ #define RE_ERROR_INTERRUPTED -10 /* Signal handler raised exception. */ #define RE_ERROR_REPLACEMENT -11 /* Invalid replacement string. */ #define RE_ERROR_INVALID_GROUP_REF -12 /* Invalid group reference. */ #define RE_ERROR_GROUP_INDEX_TYPE -13 /* Group index type error. */ #define RE_ERROR_NO_SUCH_GROUP -14 /* No such group. */ #define RE_ERROR_INDEX -15 /* String index. */ #define RE_ERROR_BACKTRACKING -16 /* Too much backtracking. */ #define RE_ERROR_NOT_STRING -17 /* Not a string. */ #define RE_ERROR_NOT_UNICODE -18 /* Not a Unicode string. */ /* The number of backtrack entries per allocated block. */ #define RE_BACKTRACK_BLOCK_SIZE 64 /* The maximum number of backtrack entries to allocate. */ #define RE_MAX_BACKTRACK_ALLOC (1024 * 1024) /* The initial maximum capacity of the guard block. */ #define RE_INIT_GUARDS_BLOCK_SIZE 16 /* The initial maximum capacity of the node list. */ #define RE_INIT_NODE_LIST_SIZE 16 /* The size increment for various allocation lists. */ #define RE_LIST_SIZE_INC 16 /* The initial maximum capacity of the capture groups. */ #define RE_INIT_CAPTURE_SIZE 16 /* Node bitflags. */ #define RE_POSITIVE_OP 0x1 #define RE_ZEROWIDTH_OP 0x2 #define RE_FUZZY_OP 0x4 #define RE_REVERSE_OP 0x8 #define RE_REQUIRED_OP 0x10 /* Guards against further matching can occur at the start of the body and the * tail of a repeat containing a repeat. */ #define RE_STATUS_BODY 0x1 #define RE_STATUS_TAIL 0x2 /* Whether a guard is added depends on whether there's a repeat in the body of * the repeat or a group reference in the body or tail of the repeat. */ #define RE_STATUS_NEITHER 0x0 #define RE_STATUS_REPEAT 0x4 #define RE_STATUS_LIMITED 0x8 #define RE_STATUS_REF 0x10 #define RE_STATUS_VISITED_AG 0x20 #define RE_STATUS_VISITED_REP 0x40 /* Whether a string node has been initialised for fast searching. */ #define RE_STATUS_FAST_INIT 0x80 /* Whether a node us being used. (Additional nodes may be created while the * pattern is being built. */ #define RE_STATUS_USED 0x100 /* Whether a node is a string node. */ #define RE_STATUS_STRING 0x200 /* Whether a repeat node is within another repeat. */ #define RE_STATUS_INNER 0x400 /* Various flags stored in a node status member. */ #define RE_STATUS_SHIFT 11 #define RE_STATUS_FUZZY (RE_FUZZY_OP << RE_STATUS_SHIFT) #define RE_STATUS_REVERSE (RE_REVERSE_OP << RE_STATUS_SHIFT) #define RE_STATUS_REQUIRED (RE_REQUIRED_OP << RE_STATUS_SHIFT) /* The different error types for fuzzy matching. */ #define RE_FUZZY_SUB 0 #define RE_FUZZY_INS 1 #define RE_FUZZY_DEL 2 #define RE_FUZZY_ERR 3 #define RE_FUZZY_COUNT 3 #define RE_FUZZY_THRESHOLD 10 /* The various values in a FUZZY node. */ #define RE_FUZZY_VAL_MAX_SUB 1 #define RE_FUZZY_VAL_MAX_INS 2 #define RE_FUZZY_VAL_MAX_DEL 3 #define RE_FUZZY_VAL_MAX_ERR 4 #define RE_FUZZY_VAL_SUB_COST 5 #define RE_FUZZY_VAL_INS_COST 6 #define RE_FUZZY_VAL_DEL_COST 7 #define RE_FUZZY_VAL_MAX_COST 8 #define RE_FUZZY_VAL_MAX_BASE 1 #define RE_FUZZY_VAL_COST_BASE 5 /* The various values in a END_FUZZY node. */ #define RE_FUZZY_VAL_MIN_SUB 1 #define RE_FUZZY_VAL_MIN_INS 2 #define RE_FUZZY_VAL_MIN_DEL 3 #define RE_FUZZY_VAL_MIN_ERR 4 /* The flags which will be set for full Unicode case folding. */ #define RE_FULL_CASE_FOLDING (RE_FLAG_UNICODE | RE_FLAG_FULLCASE | RE_FLAG_IGNORECASE) /* The shortest string prefix for which we'll use a fast string search. */ #define RE_MIN_FAST_LENGTH 5 static char copyright[] = " RE 2.3.0 Copyright (c) 1997-2002 by Secret Labs AB "; /* The exception to raise on error. */ static PyObject* error_exception; /* The dictionary of Unicode properties. */ static PyObject* property_dict; typedef struct RE_State* RE_StatePtr; /* Handlers for ASCII, locale and Unicode. */ typedef struct RE_EncodingTable { BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); BOOL (*at_boundary)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_word_start)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_word_end)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_default_boundary)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_default_word_start)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_default_word_end)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_grapheme_boundary)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*is_line_sep)(Py_UCS4 ch); BOOL (*at_line_start)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_line_end)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*possible_turkic)(Py_UCS4 ch); int (*all_cases)(Py_UCS4 ch, Py_UCS4* codepoints); Py_UCS4 (*simple_case_fold)(Py_UCS4 ch); int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); int (*all_turkic_i)(Py_UCS4 ch, Py_UCS4* cases); } RE_EncodingTable; /* Position within the regex and text. */ typedef struct RE_Position { struct RE_Node* node; Py_ssize_t text_pos; } RE_Position; /* Info about fuzzy matching. */ typedef struct RE_FuzzyInfo { struct RE_Node* node; size_t counts[RE_FUZZY_COUNT + 1]; /* Add 1 for total errors. */ size_t total_cost; } RE_FuzzyInfo; /* Storage for backtrack data. */ typedef struct RE_BacktrackData { union { struct { size_t capture_change; BOOL too_few_errors; } atomic; struct { RE_Position position; } branch; struct { RE_FuzzyInfo fuzzy_info; Py_ssize_t text_pos; RE_UINT32 index; } fuzzy; struct { RE_Position position; Py_ssize_t count; struct RE_Node* fuzzy_node; BOOL too_few_errors; } fuzzy_insert; struct { RE_Position position; RE_INT8 fuzzy_type; RE_INT8 step; } fuzzy_one; struct { RE_Position position; Py_ssize_t string_pos; size_t string_len; RE_INT8 fuzzy_type; RE_INT8 folded_pos; RE_INT8 folded_len; RE_INT8 gfolded_pos; RE_INT8 gfolded_len; RE_INT8 step; } fuzzy_string; struct { RE_Position position; RE_INT8 fuzzy_type; } fuzzy_zero; struct { Py_ssize_t text_pos; Py_ssize_t current_capture; RE_UINT32 private_index; RE_UINT32 public_index; BOOL capture; } group; struct { struct RE_Node* node; size_t capture_change; } group_call; struct { size_t capture_change; BOOL too_few_errors; } lookaround; struct { RE_Position position; Py_ssize_t text_pos; size_t count; Py_ssize_t start; size_t capture_change; RE_UINT32 index; } repeat; struct { size_t* capture_counts; } saved; }; RE_UINT8 op; } RE_BacktrackData; /* Storage for backtrack data is allocated in blocks for speed. */ typedef struct RE_BacktrackBlock { RE_BacktrackData items[RE_BACKTRACK_BLOCK_SIZE]; struct RE_BacktrackBlock* previous; struct RE_BacktrackBlock* next; size_t capacity; size_t count; } RE_BacktrackBlock; /* Storage for saved groups. */ typedef struct RE_SavedGroups { struct RE_SavedGroups* previous; struct RE_SavedGroups* next; struct RE_GroupSpan* spans; size_t* counts; } RE_SavedGroups; /* Storage for info around a recursive by 'basic'match'. */ typedef struct RE_Info { RE_BacktrackBlock* current_backtrack_block; size_t backtrack_count; RE_SavedGroups* current_saved_groups; size_t captures_count; struct RE_GroupCallFrame* current_group_call_frame; BOOL must_advance; } RE_Info; /* Storage for the next node. */ typedef struct RE_NextNode { struct RE_Node* node; struct RE_Node* test; struct RE_Node* match_next; Py_ssize_t match_step; } RE_NextNode; /* A pattern node. */ typedef struct RE_Node { RE_NextNode next_1; union { struct { RE_NextNode next_2; } nonstring; struct { /* Used only if (node->status & RE_STATUS_STRING) is true. */ Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; } string; }; Py_ssize_t step; size_t value_count; RE_CODE* values; RE_STATUS_T status; RE_UINT8 op; BOOL match; } RE_Node; /* Info about a group's span. */ typedef struct RE_GroupSpan { Py_ssize_t start; Py_ssize_t end; } RE_GroupSpan; /* Span of a guard (inclusive range). */ typedef struct RE_GuardSpan { Py_ssize_t low; Py_ssize_t high; BOOL protect; } RE_GuardSpan; /* Spans guarded against further matching. */ typedef struct RE_GuardList { size_t capacity; size_t count; RE_GuardSpan* spans; Py_ssize_t last_text_pos; size_t last_low; } RE_GuardList; /* Info about a group in a context. */ typedef struct RE_GroupData { RE_GroupSpan span; size_t capture_count; size_t capture_capacity; Py_ssize_t current_capture; RE_GroupSpan* captures; } RE_GroupData; /* Info about a repeat. */ typedef struct RE_RepeatData { RE_GuardList body_guard_list; RE_GuardList tail_guard_list; size_t count; Py_ssize_t start; size_t capture_change; } RE_RepeatData; /* Storage for saved repeats. */ typedef struct RE_SavedRepeats { struct RE_SavedRepeats* previous; struct RE_SavedRepeats* next; RE_RepeatData* repeats; } RE_SavedRepeats; /* Guards for fuzzy sections. */ typedef struct RE_FuzzyGuards { RE_GuardList body_guard_list; RE_GuardList tail_guard_list; } RE_FuzzyGuards; /* Info about a capture group. */ typedef struct RE_GroupInfo { Py_ssize_t end_index; RE_Node* node; BOOL referenced; BOOL has_name; BOOL called; } RE_GroupInfo; /* Info about a call_ref. */ typedef struct RE_CallRefInfo { RE_Node* node; BOOL defined; BOOL used; } RE_CallRefInfo; /* Info about a repeat. */ typedef struct RE_RepeatInfo { RE_STATUS_T status; } RE_RepeatInfo; /* Stack frame for a group call. */ typedef struct RE_GroupCallFrame { struct RE_GroupCallFrame* previous; struct RE_GroupCallFrame* next; RE_Node* node; RE_GroupData* groups; RE_RepeatData* repeats; } RE_GroupCallFrame; /* Info about a string argument. */ typedef struct RE_StringInfo { #if PY_VERSION_HEX >= 0x02060000 Py_buffer view; /* View of the string if it's a buffer object. */ #endif void* characters; /* Pointer to the characters of the string. */ Py_ssize_t length; /* Length of the string. */ Py_ssize_t charsize; /* Size of the characters in the string. */ BOOL is_unicode; /* Whether the string is Unicode. */ BOOL should_release; /* Whether the buffer should be released. */ } RE_StringInfo; /* Info about where the next match was found, starting from a certain search * position. This is used when a pattern starts with a BRANCH. */ #define MAX_SEARCH_POSITIONS 7 typedef struct { Py_ssize_t start_pos; Py_ssize_t match_pos; } RE_SearchPosition; /* The state object used during matching. */ typedef struct RE_State { struct PatternObject* pattern; /* Parent PatternObject. */ /* Info about the string being matched. */ PyObject* string; #if PY_VERSION_HEX >= 0x02060000 Py_buffer view; /* View of the string if it's a buffer object. */ #endif Py_ssize_t charsize; void* text; Py_ssize_t text_length; /* The slice of the string being searched. */ Py_ssize_t slice_start; Py_ssize_t slice_end; /* Info about the capture groups. */ RE_GroupData* groups; Py_ssize_t lastindex; Py_ssize_t lastgroup; /* Info about the repeats. */ RE_RepeatData* repeats; Py_ssize_t search_anchor; /* Where the last match finished. */ Py_ssize_t match_pos; /* The start position of the match. */ Py_ssize_t text_pos; /* The current position of the match. */ Py_ssize_t final_newline; /* The index of newline at end of string, or -1. */ Py_ssize_t final_line_sep; /* The index of line separator at end of string, or -1. */ /* Storage for backtrack info. */ RE_BacktrackBlock backtrack_block; RE_BacktrackBlock* current_backtrack_block; size_t backtrack_allocated; RE_BacktrackData* backtrack; /* Storage for saved capture groups. */ RE_SavedGroups* first_saved_groups; RE_SavedGroups* current_saved_groups; RE_SavedRepeats* first_saved_repeats; RE_SavedRepeats* current_saved_repeats; size_t min_width; /* The minimum width of the string to match (assuming it's not a fuzzy pattern). */ RE_EncodingTable* encoding; /* The 'encoding' of the string being searched. */ Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* (*point_to)(void* text, Py_ssize_t pos); PyThread_type_lock lock; /* A lock for accessing the state across threads. */ RE_FuzzyInfo fuzzy_info; /* Info about fuzzy matching. */ RE_FuzzyGuards* fuzzy_guards; /* The guards for a fuzzy match. */ size_t total_errors; /* The total number of errors of a fuzzy match. */ size_t total_cost; /* The total cost of a fuzzy match. */ size_t max_cost; /* The maximum permitted fuzzy cost. */ /* The group call stack. */ RE_GroupCallFrame* first_group_call_frame; RE_GroupCallFrame* current_group_call_frame; RE_GuardList* group_call_guard_list; RE_SearchPosition search_positions[MAX_SEARCH_POSITIONS]; /* Where the search matches next. */ size_t capture_change; /* Incremented every time a captive group changes. */ Py_ssize_t req_pos; /* The position where the required string matched. */ Py_ssize_t req_end; /* The end position where the required string matched. */ RE_UINT16 iterations; /* The number of iterations the matching engine has performed since checking for KeyboardInterrupt. */ BOOL is_unicode; /* Whether the string to be matched is Unicode. */ BOOL should_release; /* Whether the buffer should be released. */ BOOL overlapped; /* Whether the matches can be overlapped. */ BOOL reverse; /* Whether it's a reverse pattern. */ BOOL visible_captures; /* Whether the 'captures' method will be visible. */ BOOL version_0; /* Whether to perform version_0 behaviour (same as re module). */ BOOL must_advance; /* Whether the end of the match must advance past its start. */ BOOL is_multithreaded; /* Whether to release the GIL while matching. */ BOOL too_few_errors; /* Whether there were too few fuzzy errors. */ BOOL match_all; /* Whether to match all of the string ('fullmatch'). */ } RE_State; /* Storage for the regex state and thread state. * * Scanner objects can sometimes be shared across threads, which means that * their RE_State structs are also shared. This isn't safe when the GIL is * released, so in such instances we have a lock (mutex) in the RE_State struct * to protect it during matching. We also need a thread-safe place to store the * thread state when releasing the GIL. */ typedef struct RE_SafeState { RE_State* re_state; PyThreadState* thread_state; } RE_SafeState; /* The PatternObject created from a regular expression. */ typedef struct PatternObject { PyObject_HEAD PyObject* pattern; /* Pattern source (or None). */ Py_ssize_t flags; /* Flags used when compiling pattern source. */ PyObject* weakreflist; /* List of weak references */ /* Nodes into which the regular expression is compiled. */ RE_Node* start_node; RE_Node* start_test; Py_ssize_t true_group_count; /* The true number of capture groups. */ Py_ssize_t public_group_count; /* The number of public capture groups. */ Py_ssize_t repeat_count; /* The number of repeats. */ Py_ssize_t group_end_index; /* The number of group closures. */ PyObject* groupindex; PyObject* indexgroup; PyObject* named_lists; PyObject* named_list_indexes; /* Storage for the pattern nodes. */ Py_ssize_t node_capacity; Py_ssize_t node_count; RE_Node** node_list; /* Info about the capture groups. */ Py_ssize_t group_info_capacity; RE_GroupInfo* group_info; /* Info about the call_refs. */ Py_ssize_t call_ref_info_capacity; Py_ssize_t call_ref_info_count; RE_CallRefInfo* call_ref_info; Py_ssize_t pattern_call_ref; /* Info about the repeats. */ Py_ssize_t repeat_info_capacity; RE_RepeatInfo* repeat_info; size_t min_width; /* The minimum width of the string to match (assuming it isn't a fuzzy pattern). */ RE_EncodingTable* encoding; /* Encoding handlers. */ RE_GroupData* groups_storage; RE_RepeatData* repeats_storage; Py_ssize_t fuzzy_count; /* The number of fuzzy sections. */ Py_ssize_t req_offset; /* The offset to the required string. */ RE_Node* req_string; /* The required string. */ BOOL is_fuzzy; /* Whether it's a fuzzy pattern. */ BOOL do_search_start; /* Whether to do an initial search. */ BOOL recursive; /* Whether the entire pattern is recursive. */ } PatternObject; /* The MatchObject created when a match is found. */ typedef struct MatchObject { PyObject_HEAD PyObject* string; /* Link to the target string or NULL if detached. */ PyObject* substring; /* Link to (a substring of) the target string. */ Py_ssize_t substring_offset; /* Offset into the target string. */ PatternObject* pattern; /* Link to the regex (pattern) object. */ Py_ssize_t pos; /* Start of current slice. */ Py_ssize_t endpos; /* End of current slice. */ Py_ssize_t match_start; /* Start of matched slice. */ Py_ssize_t match_end; /* End of matched slice. */ Py_ssize_t lastindex; /* Last group seen by the engine (-1 if none). */ Py_ssize_t lastgroup; /* Last named group seen by the engine (-1 if none). */ Py_ssize_t group_count; /* The number of groups. */ RE_GroupData* groups; /* The capture groups. */ PyObject* regs; } MatchObject; /* The ScannerObject. */ typedef struct ScannerObject { PyObject_HEAD PatternObject* pattern; RE_State state; int status; } ScannerObject; /* The SplitterObject. */ typedef struct SplitterObject { PyObject_HEAD PatternObject* pattern; RE_State state; Py_ssize_t maxsplit; Py_ssize_t last_pos; Py_ssize_t split_count; Py_ssize_t index; int status; } SplitterObject; /* Info used when compiling a pattern to nodes. */ typedef struct RE_CompileArgs { RE_CODE* code; /* The start of the compiled pattern. */ RE_CODE* end_code; /* The end of the compiled pattern. */ PatternObject* pattern; /* The pattern object. */ size_t min_width; /* The minimum width of the string to match (assuming it isn't a fuzzy pattern). */ RE_Node* start; /* The start node. */ RE_Node* end; /* The end node. */ size_t repeat_depth; /* The nesting depth of the repeat. */ BOOL forward; /* Whether it's a forward (not reverse) pattern. */ BOOL visible_captures; /* Whether all of the captures will be visible. */ BOOL has_captures; /* Whether the pattern has capture groups. */ BOOL is_fuzzy; /* Whether the pattern (or some part of it) is fuzzy. */ BOOL within_fuzzy; /* Whether the subpattern is within a fuzzy section. */ } RE_CompileArgs; /* The string slices which will be concatenated to make the result string of * the 'sub' method. * * This allows us to avoid creating a list of slices if there of fewer than 2 * of them. Empty strings aren't recorded, so if 'list' and 'item' are both * NULL then the result is an empty string. */ typedef struct JoinInfo { PyObject* list; /* The list of slices if there are more than 2 of them. */ PyObject* item; /* The slice if there is only 1 of them. */ BOOL reversed; /* Whether the slices have been found in reverse order. */ BOOL is_unicode; /* Whether the string is Unicode. */ } JoinInfo; typedef struct { RE_Node* new_node; Py_ssize_t new_text_pos; Py_ssize_t limit; Py_ssize_t new_string_pos; int step; int new_folded_pos; int folded_len; int new_gfolded_pos; int new_group_pos; int fuzzy_type; BOOL permit_insertion; } RE_FuzzyData; /* Function types for getting info from a MatchObject. */ typedef PyObject* (*RE_GetByIndexFunc)(MatchObject* self, Py_ssize_t index); Py_LOCAL_INLINE(Py_ssize_t) abs_ssize_t(Py_ssize_t x) { return x >= 0 ? x : -x; } /* Gets a character at the given position assuming 1 byte per character. */ static Py_UCS4 bytes1_char_at(void* text, Py_ssize_t pos) { return *((Py_UCS1*)text + pos); } /* Sets a character at the given position assuming 1 byte per character. */ static void bytes1_set_char_at(void* text, Py_ssize_t pos, Py_UCS4 ch) { *((Py_UCS1*)text + pos) = (Py_UCS1)ch; } /* Gets a pointer to the character at the given position assuming 1 byte per * character. */ static void* bytes1_point_to(void* text, Py_ssize_t pos) { return (Py_UCS1*)text + pos; } /* Gets a character at the given position assuming 2 bytes per character. */ static Py_UCS4 bytes2_char_at(void* text, Py_ssize_t pos) { return *((Py_UCS2*)text + pos); } /* Sets a character at the given position assuming 2 bytes per character. */ static void bytes2_set_char_at(void* text, Py_ssize_t pos, Py_UCS4 ch) { *((Py_UCS2*)text + pos) = (Py_UCS2)ch; } /* Gets a pointer to the character at the given position assuming 2 bytes per * character. */ static void* bytes2_point_to(void* text, Py_ssize_t pos) { return (Py_UCS2*)text + pos; } /* Gets a character at the given position assuming 4 bytes per character. */ static Py_UCS4 bytes4_char_at(void* text, Py_ssize_t pos) { return *((Py_UCS4*)text + pos); } /* Sets a character at the given position assuming 4 bytes per character. */ static void bytes4_set_char_at(void* text, Py_ssize_t pos, Py_UCS4 ch) { *((Py_UCS4*)text + pos) = (Py_UCS4)ch; } /* Gets a pointer to the character at the given position assuming 4 bytes per * character. */ static void* bytes4_point_to(void* text, Py_ssize_t pos) { return (Py_UCS4*)text + pos; } /* Default for whether the current text position is on a boundary. */ static BOOL at_boundary_always(RE_State* state, Py_ssize_t text_pos) { return TRUE; } /* ASCII-specific. */ static BOOL unicode_has_property(RE_CODE property, Py_UCS4 ch); /* Checks whether a character has the given property. */ static BOOL ascii_has_property(RE_CODE property, Py_UCS4 ch) { if (ch > RE_ASCII_MAX) { /* Outside the ASCII range. */ RE_UINT32 value; value = property & 0xFFFF; return value == 0; } return unicode_has_property(property, ch); } /* Checks whether the current text position is on a word boundary. */ static BOOL ascii_at_boundary(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before != after; } /* Checks whether the current text position is at the start of a word. */ static BOOL ascii_at_word_start(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return !before && after; } /* Checks whether the current text position is at the end of a word. */ static BOOL ascii_at_word_end(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before && !after; } /* Checks whether a character is a line separator. */ static BOOL ascii_is_line_sep(Py_UCS4 ch) { return 0x0A <= ch && ch <= 0x0D; } /* Checks whether the current text position is at the start of a line. */ static BOOL ascii_at_line_start(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos == 0) return TRUE; ch = state->char_at(state->text, text_pos - 1); if (ch == 0x0D) /* No line break inside CRLF. */ return text_pos >= state->text_length || state->char_at(state->text, text_pos) != 0x0A; return 0x0A <= ch && ch <= 0x0D; } /* Checks whether the current text position is at the end of a line. */ static BOOL ascii_at_line_end(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos >= state->text_length) return TRUE; ch = state->char_at(state->text, text_pos); if (ch == 0x0A) /* No line break inside CRLF. */ return text_pos >= 1 || state->char_at(state->text, text_pos - 1) != 0x0D; return 0x0A <= ch && ch <= 0x0D; } /* Checks whether a character could be Turkic (variants of I/i). For ASCII, it * won't be. */ static BOOL ascii_possible_turkic(Py_UCS4 ch) { return FALSE; } /* Gets all the cases of a character. */ static int ascii_all_cases(Py_UCS4 ch, Py_UCS4* codepoints) { int count; count = 0; codepoints[count++] = ch; if (('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z')) /* It's a letter, so add the other case. */ codepoints[count++] = ch ^ 0x20; return count; } /* Returns a character with its case folded. */ static Py_UCS4 ascii_simple_case_fold(Py_UCS4 ch) { if ('A' <= ch && ch <= 'Z') /* Uppercase folds to lowercase. */ return ch ^ 0x20; return ch; } /* Returns a character with its case folded. */ static int ascii_full_case_fold(Py_UCS4 ch, Py_UCS4* folded) { if ('A' <= ch && ch <= 'Z') /* Uppercase folds to lowercase. */ folded[0] = ch ^ 0x20; else folded[0] = ch; return 1; } /* Gets all the case variants of Turkic 'I'. The given character will be listed * first. */ static int ascii_all_turkic_i(Py_UCS4 ch, Py_UCS4* cases) { int count; count = 0; cases[count++] = ch; if (ch != 'I') cases[count++] = 'I'; if (ch != 'i') cases[count++] = 'i'; return count; } /* The handlers for ASCII characters. */ static RE_EncodingTable ascii_encoding = { ascii_has_property, ascii_at_boundary, ascii_at_word_start, ascii_at_word_end, ascii_at_boundary, /* No special "default word boundary" for ASCII. */ ascii_at_word_start, /* No special "default start of word" for ASCII. */ ascii_at_word_end, /* No special "default end of a word" for ASCII. */ at_boundary_always, /* No special "grapheme boundary" for ASCII. */ ascii_is_line_sep, ascii_at_line_start, ascii_at_line_end, ascii_possible_turkic, ascii_all_cases, ascii_simple_case_fold, ascii_full_case_fold, ascii_all_turkic_i, }; /* Locale-specific. */ /* Checks whether a character has the given property. */ static BOOL locale_has_property(RE_CODE property, Py_UCS4 ch) { RE_UINT32 value; RE_UINT32 v; value = property & 0xFFFF; if (ch > RE_LOCALE_MAX) /* Outside the locale range. */ return value == 0; switch (property >> 16) { case RE_PROP_ALNUM >> 16: v = isalnum(ch) != 0; break; case RE_PROP_ALPHA >> 16: v = isalpha(ch) != 0; break; case RE_PROP_ANY >> 16: v = 1; break; case RE_PROP_ASCII >> 16: v = ch <= RE_ASCII_MAX; break; case RE_PROP_ASSIGNED >> 16: v = ch <= RE_LOCALE_MAX; break; case RE_PROP_BLANK >> 16: v = ch == '\t' || ch == ' '; break; case RE_PROP_GC: switch (property) { case RE_PROP_CNTRL: v = iscntrl(ch) ? value : 0xFFFF; break; case RE_PROP_DIGIT: v = isdigit(ch) ? value : 0xFFFF; break; case RE_PROP_GC_LL: v = islower(ch) ? value : 0xFFFF; break; case RE_PROP_GC_LU: v = isupper(ch) ? value : 0xFFFF; break; case RE_PROP_PUNCT: v = ispunct(ch) ? value : 0xFFFF; break; default: v = 0xFFFF; break; } break; case RE_PROP_GRAPH >> 16: v = isgraph(ch) != 0; break; case RE_PROP_LOWER >> 16: v = islower(ch) != 0; break; case RE_PROP_PRINT >> 16: v = isprint(ch) != 0; break; case RE_PROP_SPACE >> 16: v = isspace(ch) != 0; break; case RE_PROP_UPPER >> 16: v = isupper(ch) != 0; break; case RE_PROP_WORD >> 16: v = ch == '_' || isalnum(ch) != 0; break; case RE_PROP_XDIGIT >> 16: v = re_get_hex_digit(ch) != 0; break; default: v = 0; break; } return v == value; } /* Checks whether the current text position is on a word boundary. */ static BOOL locale_at_boundary(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before != after; } /* Checks whether the current text position is at the start of a word. */ static BOOL locale_at_word_start(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return !before && after; } /* Checks whether the current text position is at the end of a word. */ static BOOL locale_at_word_end(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before && !after; } /* Checks whether a character could be Turkic (variants of I/i). */ static BOOL locale_possible_turkic(Py_UCS4 ch) { return toupper(ch) == 'I' || tolower(ch) == 'i'; } /* Gets all the cases of a character. */ static int locale_all_cases(Py_UCS4 ch, Py_UCS4* codepoints) { int count; Py_UCS4 other; count = 0; codepoints[count++] = ch; other = toupper(ch); if (other != ch) codepoints[count++] = other; other = tolower(ch); if (other != ch) codepoints[count++] = other; return count; } /* Returns a character with its case folded. */ static Py_UCS4 locale_simple_case_fold(Py_UCS4 ch) { if (ch <= RE_LOCALE_MAX) return tolower(ch); return ch; } /* Returns a character with its case folded. */ static int locale_full_case_fold(Py_UCS4 ch, Py_UCS4* folded) { if (ch <= RE_LOCALE_MAX) folded[0] = tolower(ch); else folded[0] = ch; return 1; } /* Gets all the case variants of Turkic 'I'. The given character will be listed * first. */ static int locale_all_turkic_i(Py_UCS4 ch, Py_UCS4* cases) { int count; Py_UCS4 other; count = 0; cases[count++] = ch; if (ch != 'I') cases[count++] = 'I'; if (ch != 'i') cases[count++] = 'i'; /* Uppercase 'i' will be either dotted (Turkic) or dotless (non-Turkic). */ other = toupper('i'); if (other != ch && other != 'I') cases[count++] = other; /* Lowercase 'I' will be either dotless (Turkic) or dotted (non-Turkic). */ other = tolower('I'); if (other != ch && other != 'i') cases[count++] = other; return count; } /* The handlers for locale characters. */ static RE_EncodingTable locale_encoding = { locale_has_property, locale_at_boundary, locale_at_word_start, locale_at_word_end, locale_at_boundary, /* No special "default word boundary" for locale. */ locale_at_word_start, /* No special "default start of a word" for locale. */ locale_at_word_end, /* No special "default end of a word" for locale. */ at_boundary_always, /* No special "grapheme boundary" for locale. */ ascii_is_line_sep, /* Assume locale line separators are same as ASCII. */ ascii_at_line_start, /* Assume locale line separators are same as ASCII. */ ascii_at_line_end, /* Assume locale line separators are same as ASCII. */ locale_possible_turkic, locale_all_cases, locale_simple_case_fold, locale_full_case_fold, locale_all_turkic_i, }; /* Unicode-specific. */ /* Checks whether a Unicode character has the given property. */ static BOOL unicode_has_property(RE_CODE property, Py_UCS4 ch) { RE_UINT32 prop; RE_UINT32 value; RE_UINT32 v; prop = property >> 16; if (prop >= sizeof(re_get_property) / sizeof(re_get_property[0])) return FALSE; value = property & 0xFFFF; v = re_get_property[prop](ch); if (v == value) return TRUE; if (prop == RE_PROP_GC) { switch (value) { case RE_PROP_C: return (RE_PROP_C_MASK & (1 << v)) != 0; case RE_PROP_L: return (RE_PROP_L_MASK & (1 << v)) != 0; case RE_PROP_M: return (RE_PROP_M_MASK & (1 << v)) != 0; case RE_PROP_N: return (RE_PROP_N_MASK & (1 << v)) != 0; case RE_PROP_P: return (RE_PROP_P_MASK & (1 << v)) != 0; case RE_PROP_S: return (RE_PROP_S_MASK & (1 << v)) != 0; case RE_PROP_Z: return (RE_PROP_Z_MASK & (1 << v)) != 0; } } return FALSE; } /* Checks whether the current text position is on a word boundary. */ static BOOL unicode_at_boundary(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before != after; } /* Checks whether the current text position is at the start of a word. */ static BOOL unicode_at_word_start(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return !before && after; } /* Checks whether the current text position is at the end of a word. */ static BOOL unicode_at_word_end(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before && !after; } /* Checks whether a character is a Unicode vowel. * * Only a limited number are treated as vowels. */ Py_LOCAL_INLINE(BOOL) is_unicode_vowel(Py_UCS4 ch) { switch (Py_UNICODE_TOLOWER(ch)) { case 'a': case 0xE0: case 0xE1: case 0xE2: case 'e': case 0xE8: case 0xE9: case 0xEA: case 'i': case 0xEC: case 0xED: case 0xEE: case 'o': case 0xF2: case 0xF3: case 0xF4: case 'u': case 0xF9: case 0xFA: case 0xFB: return TRUE; default: return FALSE; } } /* Checks whether the current text position is on a default word boundary. * * The rules are defined here: * http://www.unicode.org/reports/tr29/#Default_Word_Boundaries */ static BOOL unicode_at_default_boundary(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; int prop; int prop_m1; Py_ssize_t pos_m1; Py_ssize_t pos_m2; int prop_m2; Py_ssize_t pos_p0; int prop_p0; Py_ssize_t pos_p1; int prop_p1; /* Break at the start and end of the text. */ if (text_pos <= 0 || text_pos >= state->text_length) return TRUE; char_at = state->char_at; text = state->text; prop = (int)re_get_word_break(char_at(text, text_pos)); prop_m1 = (int)re_get_word_break(char_at(text, text_pos - 1)); /* Don't break within CRLF. */ if (prop_m1 == RE_BREAK_CR && prop == RE_BREAK_LF) return FALSE; /* Otherwise break before and after Newlines (including CR and LF). */ if (prop_m1 == RE_BREAK_NEWLINE || prop_m1 == RE_BREAK_CR || prop_m1 == RE_BREAK_LF || prop == RE_BREAK_NEWLINE || prop == RE_BREAK_CR || prop == RE_BREAK_LF) return TRUE; /* Get the property of the previous character. */ pos_m1 = text_pos - 1; prop_m1 = RE_BREAK_OTHER; while (pos_m1 >= 0) { prop_m1 = (int)re_get_word_break(char_at(text, pos_m1)); if (prop_m1 != RE_BREAK_EXTEND && prop_m1 != RE_BREAK_FORMAT) break; --pos_m1; } /* Get the property of the preceding character. */ pos_m2 = pos_m1 - 1; prop_m2 = RE_BREAK_OTHER; while (pos_m2 >= 0) { prop_m2 = (int)re_get_word_break(char_at(text, pos_m2)); if (prop_m2 != RE_BREAK_EXTEND && prop_m2 != RE_BREAK_FORMAT) break; --pos_m2; } /* Get the property of the next character. */ pos_p0 = text_pos; prop_p0 = prop; while (pos_p0 < state->text_length) { prop_p0 = (int)re_get_word_break(char_at(text, pos_p0)); if (prop_p0 != RE_BREAK_EXTEND && prop_p0 != RE_BREAK_FORMAT) break; ++pos_p0; } /* Get the property of the following character. */ pos_p1 = pos_p0 + 1; prop_p1 = RE_BREAK_OTHER; while (pos_p1 < state->text_length) { prop_p1 = (int)re_get_word_break(char_at(text, pos_p1)); if (prop_p1 != RE_BREAK_EXTEND && prop_p1 != RE_BREAK_FORMAT) break; ++pos_p1; } /* Don't break between most letters. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER) && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER)) return FALSE; /* Break between apostrophe and vowels (French, Italian). */ if (pos_m1 >= 0 && char_at(text, pos_m1) == '\'' && is_unicode_vowel(char_at(text, text_pos))) return TRUE; /* Don't break letters across certain punctuation. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER) && (prop_p0 == RE_BREAK_MIDLETTER || prop_p0 == RE_BREAK_MIDNUMLET || prop_p0 == RE_BREAK_SINGLEQUOTE) && (prop_p1 == RE_BREAK_ALETTER || prop_p1 == RE_BREAK_HEBREWLETTER)) return FALSE; if ((prop_m2 == RE_BREAK_ALETTER || prop_m2 == RE_BREAK_HEBREWLETTER) && (prop_m1 == RE_BREAK_MIDLETTER || prop_m1 == RE_BREAK_MIDNUMLET || prop_m1 == RE_BREAK_SINGLEQUOTE) && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER)) return FALSE; if (prop_m1 == RE_BREAK_HEBREWLETTER && prop_p0 == RE_BREAK_SINGLEQUOTE) return FALSE; if (prop_m1 == RE_BREAK_HEBREWLETTER && prop_p0 == RE_BREAK_DOUBLEQUOTE && prop_p1 == RE_BREAK_HEBREWLETTER) return FALSE; if (prop_m2 == RE_BREAK_HEBREWLETTER && prop_m1 == RE_BREAK_DOUBLEQUOTE && prop_p0 == RE_BREAK_HEBREWLETTER) return FALSE; /* Don't break within sequences of digits, or digits adjacent to letters * ("3a", or "A3"). */ if (prop_m1 == RE_BREAK_NUMERIC && prop_p0 == RE_BREAK_NUMERIC) return FALSE; if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER) && prop_p0 == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER)) return FALSE; /* Don't break within sequences, such as "3.2" or "3,456.789". */ if (prop_m2 == RE_BREAK_NUMERIC && (prop_m1 == RE_BREAK_MIDNUM || prop_m1 == RE_BREAK_MIDNUMLET || prop_m1 == RE_BREAK_SINGLEQUOTE) && prop_p0 == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && (prop_p0 == RE_BREAK_MIDNUM || prop_p0 == RE_BREAK_MIDNUMLET || prop_p0 == RE_BREAK_SINGLEQUOTE) && prop_p1 == RE_BREAK_NUMERIC) return FALSE; /* Don't break between Katakana. */ if (prop_m1 == RE_BREAK_KATAKANA && prop_p0 == RE_BREAK_KATAKANA) return FALSE; /* Don't break from extenders. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER || prop_m1 == RE_BREAK_NUMERIC || prop_m1 == RE_BREAK_KATAKANA || prop_m1 == RE_BREAK_EXTENDNUMLET) && prop_p0 == RE_BREAK_EXTENDNUMLET) return FALSE; if (prop_m1 == RE_BREAK_EXTENDNUMLET && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER || prop_p0 == RE_BREAK_NUMERIC || prop_p0 == RE_BREAK_KATAKANA)) return FALSE; /* Don't break between regional indicator symbols. */ if (prop_m1 == RE_BREAK_REGIONALINDICATOR && prop_p0 == RE_BREAK_REGIONALINDICATOR) return FALSE; /* Otherwise, break everywhere (including around ideographs). */ return TRUE; } /* Checks whether the current text position is at the start/end of a word. */ Py_LOCAL_INLINE(BOOL) unicode_at_default_word_start_or_end(RE_State* state, Py_ssize_t text_pos, BOOL at_start) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; BOOL before; BOOL after; Py_UCS4 char_0; Py_UCS4 char_m1; int prop; int prop_m1; Py_ssize_t pos_m1; Py_UCS4 char_p1; Py_ssize_t pos_p1; int prop_p1; Py_ssize_t pos_m2; Py_UCS4 char_m2; int prop_m2; char_at = state->char_at; text = state->text; /* At the start or end of the text. */ if (text_pos <= 0 || text_pos >= state->text_length) { before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, char_at(state->text, text_pos)); return before != at_start && after == at_start; } char_0 = char_at(state->text, text_pos); char_m1 = char_at(state->text, text_pos - 1); prop = (int)re_get_word_break(char_0); prop_m1 = (int)re_get_word_break(char_m1); /* No break within CRLF. */ if (prop_m1 == RE_BREAK_CR && prop == RE_BREAK_LF) return FALSE; /* Break before and after Newlines (including CR and LF). */ if (prop_m1 == RE_BREAK_NEWLINE || prop_m1 == RE_BREAK_CR || prop_m1 == RE_BREAK_LF || prop == RE_BREAK_NEWLINE || prop == RE_BREAK_CR || prop == RE_BREAK_LF) { before = unicode_has_property(RE_PROP_WORD, char_m1); after = unicode_has_property(RE_PROP_WORD, char_0); return before != at_start && after == at_start; } /* No break just before Format or Extend characters. */ if (prop == RE_BREAK_EXTEND || prop == RE_BREAK_FORMAT) return FALSE; /* Get the property of the previous character. */ pos_m1 = text_pos - 1; prop_m1 = RE_BREAK_OTHER; while (pos_m1 >= 0) { char_m1 = char_at(text, pos_m1); prop_m1 = (int)re_get_word_break(char_m1); if (prop_m1 != RE_BREAK_EXTEND && prop_m1 != RE_BREAK_FORMAT) break; --pos_m1; } /* No break between most letters. */ if (prop_m1 == RE_BREAK_ALETTER && prop == RE_BREAK_ALETTER) return FALSE; if (pos_m1 >= 0 && char_m1 == '\'' && is_unicode_vowel(char_0)) return TRUE; pos_p1 = text_pos + 1; prop_p1 = RE_BREAK_OTHER; while (pos_p1 < state->text_length) { char_p1 = char_at(text, pos_p1); prop_p1 = (int)re_get_word_break(char_p1); if (prop_p1 != RE_BREAK_EXTEND && prop_p1 != RE_BREAK_FORMAT) break; --pos_p1; } /* No break letters across certain punctuation. */ if (prop_m1 == RE_BREAK_ALETTER && (prop == RE_BREAK_MIDLETTER || prop == RE_BREAK_MIDNUMLET) && prop_p1 == RE_BREAK_ALETTER) return FALSE; pos_m2 = pos_m1 - 1; prop_m2 = RE_BREAK_OTHER; while (pos_m2 >= 0) { char_m2 = char_at(text, pos_m2); prop_m2 = (int)re_get_word_break(char_m2); if (prop_m2 != RE_BREAK_EXTEND && prop_m1 != RE_BREAK_FORMAT) break; --pos_m2; } if (prop_m2 == RE_BREAK_ALETTER && (prop_m1 == RE_BREAK_MIDLETTER || prop_m1 == RE_BREAK_MIDNUMLET) && prop == RE_BREAK_ALETTER) return FALSE; /* No break within sequences of digits, or digits adjacent to letters * ("3a", or "A3"). */ if ((prop_m1 == RE_BREAK_NUMERIC || prop_m1 == RE_BREAK_ALETTER) && prop == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && prop == RE_BREAK_ALETTER) return FALSE; /* No break within sequences, such as "3.2" or "3,456.789". */ if (prop_m2 == RE_BREAK_NUMERIC && (prop_m1 == RE_BREAK_MIDNUM || prop_m1 == RE_BREAK_MIDNUMLET) && prop == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && (prop == RE_BREAK_MIDNUM || prop == RE_BREAK_MIDNUMLET) && prop_p1 == RE_BREAK_NUMERIC) return FALSE; /* No break between Katakana. */ if (prop_m1 == RE_BREAK_KATAKANA && prop == RE_BREAK_KATAKANA) return FALSE; /* No break from extenders. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_NUMERIC || prop_m1 == RE_BREAK_KATAKANA || prop_m1 == RE_BREAK_EXTENDNUMLET) && prop == RE_BREAK_EXTENDNUMLET) return FALSE; if (prop_m1 == RE_BREAK_EXTENDNUMLET && (prop == RE_BREAK_ALETTER || prop == RE_BREAK_NUMERIC || prop == RE_BREAK_KATAKANA)) return FALSE; /* Otherwise, break everywhere (including around ideographs). */ before = unicode_has_property(RE_PROP_WORD, char_m1); after = unicode_has_property(RE_PROP_WORD, char_0); return before != at_start && after == at_start; } /* Checks whether the current text position is at the start of a word. */ static BOOL unicode_at_default_word_start(RE_State* state, Py_ssize_t text_pos) { return unicode_at_default_word_start_or_end(state, text_pos, TRUE); } /* Checks whether the current text position is at the end of a word. */ static BOOL unicode_at_default_word_end(RE_State* state, Py_ssize_t text_pos) { return unicode_at_default_word_start_or_end(state, text_pos, FALSE); } /* Checks whether the current text position is on a grapheme boundary. * * The rules are defined here: * http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries */ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; int prop; int prop_m1; /* Break at the start and end of the text. */ if (text_pos <= 0 || text_pos >= state->text_length) return TRUE; char_at = state->char_at; text = state->text; prop = (int)re_get_grapheme_cluster_break(char_at(text, text_pos)); prop_m1 = (int)re_get_grapheme_cluster_break(char_at(text, text_pos - 1)); /* Don't break within CRLF. */ if (prop_m1 == RE_GBREAK_CR && prop == RE_GBREAK_LF) return FALSE; /* Otherwise break before and after controls (including CR and LF). */ if (prop_m1 == RE_GBREAK_CONTROL || prop_m1 == RE_GBREAK_CR || prop_m1 == RE_GBREAK_LF || prop == RE_GBREAK_CONTROL || prop == RE_GBREAK_CR || prop == RE_GBREAK_LF) return TRUE; /* Don't break Hangul syllable sequences. */ if (prop_m1 == RE_GBREAK_L && (prop == RE_GBREAK_L || prop == RE_GBREAK_V || prop == RE_GBREAK_LV || prop == RE_GBREAK_LVT)) return FALSE; if ((prop_m1 == RE_GBREAK_LV || prop_m1 == RE_GBREAK_V) && (prop == RE_GBREAK_V || prop == RE_GBREAK_T)) return FALSE; if ((prop_m1 == RE_GBREAK_LVT || prop_m1 == RE_GBREAK_T) && (prop == RE_GBREAK_T)) return FALSE; /* Don't break between regional indicator symbols. */ if (prop_m1 == RE_GBREAK_REGIONALINDICATOR && prop == RE_GBREAK_REGIONALINDICATOR) return FALSE; /* Don't break just before Extend characters. */ if (prop == RE_GBREAK_EXTEND) return FALSE; /* Don't break before SpacingMarks, or after Prepend characters. */ if (prop == RE_GBREAK_SPACINGMARK) return FALSE; if (prop_m1 == RE_GBREAK_PREPEND) return FALSE; /* Otherwise, break everywhere. */ return TRUE; } /* Checks whether a character is a line separator. */ static BOOL unicode_is_line_sep(Py_UCS4 ch) { return (0x0A <= ch && ch <= 0x0D) || ch == 0x85 || ch == 0x2028 || ch == 0x2029; } /* Checks whether the current text position is at the start of a line. */ static BOOL unicode_at_line_start(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos == 0) return TRUE; ch = state->char_at(state->text, text_pos - 1); if (ch == 0x0D) /* No line break inside CRLF. */ return text_pos >= state->text_length || state->char_at(state->text, text_pos) != 0x0A; return (0x0A <= ch && ch <= 0x0D) || ch == 0x85 || ch == 0x2028 || ch == 0x2029; } /* Checks whether the current text position is at the end of a line. */ static BOOL unicode_at_line_end(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos >= state->text_length) return TRUE; ch = state->char_at(state->text, text_pos); if (ch == 0x0A) /* No line break inside CRLF. */ return text_pos >= 1 || state->char_at(state->text, text_pos - 1) != 0x0D; return (0x0A <= ch && ch <= 0x0D) || ch == 0x85 || ch == 0x2028 || ch == 0x2029; } /* Checks whether a character could be Turkic (variants of I/i). */ static BOOL unicode_possible_turkic(Py_UCS4 ch) { return ch == 'I' || ch == 'i' || ch == 0x0130 || ch == 0x0131; } /* Gets all the cases of a character. */ static int unicode_all_cases(Py_UCS4 ch, Py_UCS4* codepoints) { return re_get_all_cases(ch, codepoints); } /* Returns a character with its case folded, unless it could be Turkic * (variants of I/i). */ static Py_UCS4 unicode_simple_case_fold(Py_UCS4 ch) { /* Is it a possible Turkic character? If so, pass it through unchanged. */ if (ch == 'I' || ch == 'i' || ch == 0x0130 || ch == 0x0131) return ch; return (Py_UCS4)re_get_simple_case_folding(ch); } /* Returns a character with its case folded, unless it could be Turkic * (variants of I/i). */ static int unicode_full_case_fold(Py_UCS4 ch, Py_UCS4* folded) { /* Is it a possible Turkic character? If so, pass it through unchanged. */ if (ch == 'I' || ch == 'i' || ch == 0x0130 || ch == 0x0131) { folded[0] = ch; return 1; } return re_get_full_case_folding(ch, folded); } /* Gets all the case variants of Turkic 'I'. */ static int unicode_all_turkic_i(Py_UCS4 ch, Py_UCS4* cases) { int count; count = 0; cases[count++] = ch; if (ch != 'I') cases[count++] = 'I'; if (ch != 'i') cases[count++] = 'i'; if (ch != 0x130) cases[count++] = 0x130; if (ch != 0x131) cases[count++] = 0x131; return count; } /* The handlers for Unicode characters. */ static RE_EncodingTable unicode_encoding = { unicode_has_property, unicode_at_boundary, unicode_at_word_start, unicode_at_word_end, unicode_at_default_boundary, unicode_at_default_word_start, unicode_at_default_word_end, unicode_at_grapheme_boundary, unicode_is_line_sep, unicode_at_line_start, unicode_at_line_end, unicode_possible_turkic, unicode_all_cases, unicode_simple_case_fold, unicode_full_case_fold, unicode_all_turkic_i, }; Py_LOCAL_INLINE(PyObject*) get_object(char* module_name, char* object_name); /* Sets the error message. */ Py_LOCAL_INLINE(void) set_error(int status, PyObject* object) { TRACE(("<>\n")) if (!error_exception) error_exception = get_object("_" RE_MODULE "_core", "error"); switch (status) { case RE_ERROR_BACKTRACKING: PyErr_SetString(error_exception, "too much backtracking"); break; case RE_ERROR_CONCURRENT: PyErr_SetString(PyExc_ValueError, "concurrent not int or None"); break; case RE_ERROR_GROUP_INDEX_TYPE: if (object) PyErr_Format(PyExc_TypeError, "group indices must be integers or strings, not %.200s", object->ob_type->tp_name); else PyErr_Format(PyExc_TypeError, "group indices must be integers or strings"); break; case RE_ERROR_ILLEGAL: PyErr_SetString(PyExc_RuntimeError, "invalid RE code"); break; case RE_ERROR_INDEX: PyErr_SetString(PyExc_TypeError, "string indices must be integers"); break; case RE_ERROR_INTERRUPTED: /* An exception has already been raised, so let it fly. */ break; case RE_ERROR_INVALID_GROUP_REF: PyErr_SetString(error_exception, "invalid group reference"); break; case RE_ERROR_MEMORY: PyErr_NoMemory(); break; case RE_ERROR_NOT_STRING: PyErr_Format(PyExc_TypeError, "expected string instance, %.200s found", object->ob_type->tp_name); break; case RE_ERROR_NOT_UNICODE: PyErr_Format(PyExc_TypeError, "expected unicode instance, %.200s found", object->ob_type->tp_name); break; case RE_ERROR_NO_SUCH_GROUP: PyErr_SetString(PyExc_IndexError, "no such group"); break; case RE_ERROR_REPLACEMENT: PyErr_SetString(error_exception, "invalid replacement"); break; default: /* Other error codes indicate compiler/engine bugs. */ PyErr_SetString(PyExc_RuntimeError, "internal error in regular expression engine"); break; } } /* Allocates memory. * * Sets the Python error handler and returns NULL if the allocation fails. */ Py_LOCAL_INLINE(void*) re_alloc(size_t size) { void* new_ptr; new_ptr = PyMem_Malloc(size); if (!new_ptr) set_error(RE_ERROR_MEMORY, NULL); return new_ptr; } /* Reallocates memory. * * Sets the Python error handler and returns NULL if the reallocation fails. */ Py_LOCAL_INLINE(void*) re_realloc(void* ptr, size_t size) { void* new_ptr; new_ptr = PyMem_Realloc(ptr, size); if (!new_ptr) set_error(RE_ERROR_MEMORY, NULL); return new_ptr; } /* Deallocates memory. */ Py_LOCAL_INLINE(void) re_dealloc(void* ptr) { PyMem_Free(ptr); } /* Releases the GIL if multithreading is enabled. */ Py_LOCAL_INLINE(void) release_GIL(RE_SafeState* safe_state) { if (safe_state->re_state->is_multithreaded) safe_state->thread_state = PyEval_SaveThread(); } /* Acquires the GIL if multithreading is enabled. */ Py_LOCAL_INLINE(void) acquire_GIL(RE_SafeState* safe_state) { if (safe_state->re_state->is_multithreaded) PyEval_RestoreThread(safe_state->thread_state); } /* Allocates memory, holding the GIL during the allocation. * * Sets the Python error handler and returns NULL if the allocation fails. */ Py_LOCAL_INLINE(void*) safe_alloc(RE_SafeState* safe_state, size_t size) { void* new_ptr; acquire_GIL(safe_state); new_ptr = re_alloc(size); release_GIL(safe_state); return new_ptr; } /* Reallocates memory, holding the GIL during the reallocation. * * Sets the Python error handler and returns NULL if the reallocation fails. */ Py_LOCAL_INLINE(void*) safe_realloc(RE_SafeState* safe_state, void* ptr, size_t size) { void* new_ptr; acquire_GIL(safe_state); new_ptr = re_realloc(ptr, size); release_GIL(safe_state); return new_ptr; } /* Deallocates memory, holding the GIL during the deallocation. */ Py_LOCAL_INLINE(void) safe_dealloc(RE_SafeState* safe_state, void* ptr) { acquire_GIL(safe_state); re_dealloc(ptr); release_GIL(safe_state); } /* Checks for KeyboardInterrupt, holding the GIL during the check. */ Py_LOCAL_INLINE(BOOL) safe_check_signals(RE_SafeState* safe_state) { BOOL result; acquire_GIL(safe_state); result = (BOOL)PyErr_CheckSignals(); release_GIL(safe_state); return result; } /* Checks whether a character is in a range. */ Py_LOCAL_INLINE(BOOL) in_range(Py_UCS4 lower, Py_UCS4 upper, Py_UCS4 ch) { return lower <= ch && ch <= upper; } /* Checks whether 2 characters are the same, ignoring case. */ static BOOL same_char_ign(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2) { Py_UCS4 cases[RE_MAX_CASES]; int count; int i; if (ch1 == ch2) return TRUE; count = encoding->all_cases(ch1, cases); for (i = 1; i < count; i++) { if (cases[i] == ch2) return TRUE; } return FALSE; } /* Checks whether a character has or hasn't the given property, ignoring case. */ Py_LOCAL_INLINE(BOOL) has_property_ign(RE_EncodingTable* encoding, RE_CODE property, Py_UCS4 ch) { RE_UINT32 prop; prop = property >> 16; /* We need to do special handling of case-sensitive properties according to * the 'encoding'. */ if (encoding == &unicode_encoding) { /* We are working with Unicode. */ if (property == RE_PROP_GC_LU || property == RE_PROP_GC_LL || property == RE_PROP_GC_LT) { RE_UINT32 value; value = re_get_general_category(ch); return value == RE_PROP_LU || value == RE_PROP_LL || value == RE_PROP_LT; } else if (prop == RE_PROP_UPPERCASE || prop == RE_PROP_LOWERCASE) return (BOOL)re_get_cased(ch); /* The property is case-insensitive. */ return unicode_has_property(property, ch); } else if (encoding == &ascii_encoding) { /* We are working with ASCII. */ if (property == RE_PROP_GC_LU || property == RE_PROP_GC_LL || property == RE_PROP_GC_LT) { RE_UINT32 value; value = re_get_general_category(ch); return value == RE_PROP_LU || value == RE_PROP_LL || value == RE_PROP_LT; } else if (prop == RE_PROP_UPPERCASE || prop == RE_PROP_LOWERCASE) return (BOOL)re_get_cased(ch); /* The property is case-insensitive. */ return ascii_has_property(property, ch); } else { /* We are working with Locale. */ if (property == RE_PROP_GC_LU || property == RE_PROP_GC_LL || property == RE_PROP_GC_LT) return (isupper(ch) || islower(ch)) != 0; else if (prop == RE_PROP_UPPERCASE || prop == RE_PROP_LOWERCASE) return (isupper(ch) || islower(ch)) != 0; /* The property is case-insensitive. */ return locale_has_property(property, ch); } } /* Checks whether a character is in a range, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_range_ign(RE_EncodingTable* encoding, Py_UCS4 lower, Py_UCS4 upper, Py_UCS4 ch) { Py_UCS4 cases[RE_MAX_CASES]; int count; int i; count = encoding->all_cases(ch, cases); for (i = 0; i < count; i++) { if (in_range(lower, upper, cases[i])) return TRUE; } return FALSE; } Py_LOCAL_INLINE(BOOL) in_set_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); Py_LOCAL_INLINE(BOOL) in_set_inter(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); Py_LOCAL_INLINE(BOOL) in_set_sym_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); Py_LOCAL_INLINE(BOOL) in_set_union(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); /* Checks whether a character matches a set member. */ Py_LOCAL_INLINE(BOOL) matches_member(RE_EncodingTable* encoding, RE_Node* member, Py_UCS4 ch) { switch (member->op) { case RE_OP_CHARACTER: /* values are: char_code */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) return ch == member->values[0]; case RE_OP_PROPERTY: /* values are: property */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) return encoding->has_property(member->values[0], ch); case RE_OP_RANGE: /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[member->op], member->match, member->values[0], member->values[1])) return in_range(member->values[0], member->values[1], ch); case RE_OP_SET_DIFF: TRACE(("%s\n", re_op_text[member->op])) return in_set_diff(encoding, member, ch); case RE_OP_SET_INTER: TRACE(("%s\n", re_op_text[member->op])) return in_set_inter(encoding, member, ch); case RE_OP_SET_SYM_DIFF: TRACE(("%s\n", re_op_text[member->op])) return in_set_sym_diff(encoding, member, ch); case RE_OP_SET_UNION: TRACE(("%s\n", re_op_text[member->op])) return in_set_union(encoding, member, ch); case RE_OP_STRING: { /* values are: char_code, char_code, ... */ size_t i; TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->value_count)) for (i = 0; i < member->value_count; i++) { if (ch == member->values[i]) return TRUE; } return FALSE; } default: return FALSE; } } /* Checks whether a character matches a set member, ignoring case. */ Py_LOCAL_INLINE(BOOL) matches_member_ign(RE_EncodingTable* encoding, RE_Node* member, int case_count, Py_UCS4* cases) { int i; for (i = 0; i < case_count; i++) { switch (member->op) { case RE_OP_CHARACTER: /* values are: char_code */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) if (cases[i] == member->values[0]) return TRUE; break; case RE_OP_PROPERTY: /* values are: property */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) if (encoding->has_property(member->values[0], cases[i])) return TRUE; break; case RE_OP_RANGE: /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[member->op], member->match, member->values[0], member->values[1])) if (in_range(member->values[0], member->values[1], cases[i])) return TRUE; break; case RE_OP_SET_DIFF: TRACE(("%s\n", re_op_text[member->op])) if (in_set_diff(encoding, member, cases[i])) return TRUE; break; case RE_OP_SET_INTER: TRACE(("%s\n", re_op_text[member->op])) if (in_set_inter(encoding, member, cases[i])) return TRUE; break; case RE_OP_SET_SYM_DIFF: TRACE(("%s\n", re_op_text[member->op])) if (in_set_sym_diff(encoding, member, cases[i])) return TRUE; break; case RE_OP_SET_UNION: TRACE(("%s\n", re_op_text[member->op])) if (in_set_union(encoding, member, cases[i])) return TRUE; break; case RE_OP_STRING: { size_t j; TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->value_count)) for (j = 0; j < member->value_count; j++) { if (cases[i] == member->values[j]) return TRUE; } break; } default: return TRUE; } } return FALSE; } /* Checks whether a character is in a set difference. */ Py_LOCAL_INLINE(BOOL) in_set_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; member = node->nonstring.next_2.node; if (matches_member(encoding, member, ch) != member->match) return FALSE; member = member->next_1.node; while (member) { if (matches_member(encoding, member, ch) == member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set difference, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_diff_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; member = node->nonstring.next_2.node; if (matches_member_ign(encoding, member, case_count, cases) != member->match) return FALSE; member = member->next_1.node; while (member) { if (matches_member_ign(encoding, member, case_count, cases) == member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set intersection. */ Py_LOCAL_INLINE(BOOL) in_set_inter(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member(encoding, member, ch) != member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set intersection, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_inter_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member_ign(encoding, member, case_count, cases) != member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set symmetric difference. */ Py_LOCAL_INLINE(BOOL) in_set_sym_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; BOOL result; member = node->nonstring.next_2.node; result = FALSE; while (member) { if (matches_member(encoding, member, ch) == member->match) result = !result; member = member->next_1.node; } return result; } /* Checks whether a character is in a set symmetric difference, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_sym_diff_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; BOOL result; member = node->nonstring.next_2.node; result = FALSE; while (member) { if (matches_member_ign(encoding, member, case_count, cases) == member->match) result = !result; member = member->next_1.node; } return result; } /* Checks whether a character is in a set union. */ Py_LOCAL_INLINE(BOOL) in_set_union(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member(encoding, member, ch) == member->match) return TRUE; member = member->next_1.node; } return FALSE; } /* Checks whether a character is in a set union, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_union_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member_ign(encoding, member, case_count, cases) == member->match) return TRUE; member = member->next_1.node; } return FALSE; } /* Checks whether a character is in a set. */ Py_LOCAL_INLINE(BOOL) in_set(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { switch (node->op) { case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_REV: return in_set_diff(encoding, node, ch); case RE_OP_SET_INTER: case RE_OP_SET_INTER_REV: return in_set_inter(encoding, node, ch); case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_REV: return in_set_sym_diff(encoding, node, ch); case RE_OP_SET_UNION: case RE_OP_SET_UNION_REV: return in_set_union(encoding, node, ch); } return FALSE; } /* Checks whether a character is in a set, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_ign(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { Py_UCS4 cases[RE_MAX_CASES]; int case_count; case_count = encoding->all_cases(ch, cases); switch (node->op) { case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: return in_set_diff_ign(encoding, node, case_count, cases); case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: return in_set_inter_ign(encoding, node, case_count, cases); case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: return in_set_sym_diff_ign(encoding, node, case_count, cases); case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: return in_set_union_ign(encoding, node, case_count, cases); } return FALSE; } /* Resets a guard list. */ Py_LOCAL_INLINE(void) reset_guard_list(RE_GuardList* guard_list) { guard_list->count = 0; guard_list->last_text_pos = -1; } /* Initialises the state for a match. */ Py_LOCAL_INLINE(void) init_match(RE_State* state) { Py_ssize_t i; /* Reset the backtrack. */ state->current_backtrack_block = &state->backtrack_block; state->current_backtrack_block->count = 0; state->current_saved_groups = state->first_saved_groups; state->backtrack = NULL; state->search_anchor = state->text_pos; state->match_pos = state->text_pos; /* Reset the guards for the repeats. */ for (i = 0; i < state->pattern->repeat_count; i++) { reset_guard_list(&state->repeats[i].body_guard_list); reset_guard_list(&state->repeats[i].tail_guard_list); } /* Reset the guards for the fuzzy sections. */ for (i = 0; i < state->pattern->fuzzy_count; i++) { reset_guard_list(&state->fuzzy_guards[i].body_guard_list); reset_guard_list(&state->fuzzy_guards[i].tail_guard_list); } for (i = 0; i < state->pattern->true_group_count; i++) { RE_GroupData* group; group = &state->groups[i]; group->span.start = -1; group->span.end = -1; group->capture_count = 0; group->current_capture = -1; } /* Reset the guards for the group calls. */ for (i = 0; i < state->pattern->call_ref_info_count; i++) reset_guard_list(&state->group_call_guard_list[i]); /* Clear the counts and cost for matching. */ memset(state->fuzzy_info.counts, 0, sizeof(state->fuzzy_info.counts)); state->fuzzy_info.total_cost = 0; state->total_errors = 0; state->total_cost = 0; state->too_few_errors = FALSE; state->capture_change = 0; state->iterations = 0; } /* Adds a new backtrack entry. */ Py_LOCAL_INLINE(BOOL) add_backtrack(RE_SafeState* safe_state, RE_UINT8 op) { RE_State* state; RE_BacktrackBlock* current; state = safe_state->re_state; current = state->current_backtrack_block; if (current->count >= current->capacity) { if (!current->next) { RE_BacktrackBlock* next; /* Is there too much backtracking? */ if (state->backtrack_allocated >= RE_MAX_BACKTRACK_ALLOC) return FALSE; next = (RE_BacktrackBlock*)safe_alloc(safe_state, sizeof(RE_BacktrackBlock)); if (!next) return FALSE; next->previous = current; next->next = NULL; next->capacity = RE_BACKTRACK_BLOCK_SIZE; current->next = next; state->backtrack_allocated += RE_BACKTRACK_BLOCK_SIZE; } current = current->next; current->count = 0; state->current_backtrack_block = current; } state->backtrack = ¤t->items[current->count++]; state->backtrack->op = op; return TRUE; } /* Gets the last backtrack entry. * * It'll never be called when there are _no_ entries. */ Py_LOCAL_INLINE(RE_BacktrackData*) last_backtrack(RE_State* state) { RE_BacktrackBlock* current; current = state->current_backtrack_block; state->backtrack = ¤t->items[current->count - 1]; return state->backtrack; } /* Discards the last backtrack entry. * * It'll never be called to discard the _only_ entry. */ Py_LOCAL_INLINE(void) discard_backtrack(RE_State* state) { RE_BacktrackBlock* current; current = state->current_backtrack_block; --current->count; if (current->count == 0 && current->previous) state->current_backtrack_block = current->previous; } /* Copies a repeat guard list. */ Py_LOCAL_INLINE(BOOL) copy_guard_data(RE_SafeState* safe_state, RE_GuardList* dst, RE_GuardList* src) { if (dst->capacity < src->count) { RE_GuardSpan* new_spans; if (!safe_state) return FALSE; dst->capacity = src->count; new_spans = (RE_GuardSpan*)safe_realloc(safe_state, dst->spans, dst->capacity * sizeof(RE_GuardSpan)); if (!new_spans) return FALSE; dst->spans = new_spans; } dst->count = src->count; memmove(dst->spans, src->spans, dst->count * sizeof(RE_GuardSpan)); dst->last_text_pos = -1; return TRUE; } /* Copies a repeat. */ Py_LOCAL_INLINE(BOOL) copy_repeat_data(RE_SafeState* safe_state, RE_RepeatData* dst, RE_RepeatData* src) { if (!copy_guard_data(safe_state, &dst->body_guard_list, &src->body_guard_list) || !copy_guard_data(safe_state, &dst->tail_guard_list, &src->tail_guard_list)) { safe_dealloc(safe_state, dst->body_guard_list.spans); safe_dealloc(safe_state, dst->tail_guard_list.spans); return FALSE; } dst->count = src->count; dst->start = src->start; dst->capture_change = src->capture_change; return TRUE; } /* Pushes a return node onto the group call stack. */ Py_LOCAL_INLINE(BOOL) push_group_return(RE_SafeState* safe_state, RE_Node* return_node) { RE_State* state; PatternObject* pattern; RE_GroupCallFrame* frame; state = safe_state->re_state; pattern = state->pattern; if (state->current_group_call_frame && state->current_group_call_frame->next) /* Advance to the next allocated frame. */ frame = state->current_group_call_frame->next; else if (!state->current_group_call_frame && state->first_group_call_frame) /* Advance to the first allocated frame. */ frame = state->first_group_call_frame; else { /* Create a new frame. */ frame = (RE_GroupCallFrame*)safe_alloc(safe_state, sizeof(RE_GroupCallFrame)); if (!frame) return FALSE; frame->groups = (RE_GroupData*)safe_alloc(safe_state, pattern->true_group_count * sizeof(RE_GroupData)); frame->repeats = (RE_RepeatData*)safe_alloc(safe_state, pattern->repeat_count * sizeof(RE_RepeatData)); if (!frame->groups || !frame->repeats) { safe_dealloc(safe_state, frame->groups); safe_dealloc(safe_state, frame->repeats); safe_dealloc(safe_state, frame); return FALSE; } memset(frame->groups, 0, pattern->true_group_count * sizeof(RE_GroupData)); memset(frame->repeats, 0, pattern->repeat_count * sizeof(RE_RepeatData)); frame->previous = state->current_group_call_frame; frame->next = NULL; if (frame->previous) frame->previous->next = frame; else state->first_group_call_frame = frame; } frame->node = return_node; /* Push the groups and guards. */ if (return_node) { Py_ssize_t g; Py_ssize_t r; for (g = 0; g < pattern->true_group_count; g++) { frame->groups[g].span = state->groups[g].span; frame->groups[g].current_capture = state->groups[g].current_capture; } for (r = 0; r < pattern->repeat_count; r++) { if (!copy_repeat_data(safe_state, &frame->repeats[r], &state->repeats[r])) return FALSE; } } state->current_group_call_frame = frame; return TRUE; } /* Pops a return node from the group call stack. */ Py_LOCAL_INLINE(RE_Node*) pop_group_return(RE_State* state) { RE_GroupCallFrame* frame; frame = state->current_group_call_frame; /* Pop the groups and repeats. */ if (frame->node) { PatternObject* pattern; Py_ssize_t g; Py_ssize_t r; pattern = state->pattern; for (g = 0; g < pattern->true_group_count; g++) { state->groups[g].span = frame->groups[g].span; state->groups[g].current_capture = frame->groups[g].current_capture; } for (r = 0; r < pattern->repeat_count; r++) copy_repeat_data(NULL, &state->repeats[r], &frame->repeats[r]); } /* Withdraw to previous frame. */ state->current_group_call_frame = frame->previous; return frame->node; } /* Returns the return node from the top of the group call stack. */ Py_LOCAL_INLINE(RE_Node*) top_group_return(RE_State* state) { RE_GroupCallFrame* frame; frame = state->current_group_call_frame; return frame->node; } /* Checks whether the node is a firstset. */ Py_LOCAL_INLINE(BOOL) is_firstset(RE_Node* node) { if (node->step != 0) return FALSE; switch (node->op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: return TRUE; default: return FALSE; } } /* Locates the start node for testing ahead. */ Py_LOCAL_INLINE(RE_Node*) locate_test_start(RE_Node* node) { for (;;) { switch (node->op) { case RE_OP_BOUNDARY: switch (node->next_1.node->op) { case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: return node->next_1.node; default: return node; } case RE_OP_CALL_REF: case RE_OP_END_GROUP: case RE_OP_START_GROUP: node = node->next_1.node; break; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: if (node->values[1] == 0) return node; node = node->next_1.node; break; case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: if (node->values[1] == 0) return node; return node->nonstring.next_2.node; case RE_OP_LOOKAROUND: node = node->next_1.node; break; default: if (is_firstset(node)) { switch (node->next_1.node->op) { case RE_OP_END_OF_STRING: case RE_OP_START_OF_STRING: return node->next_1.node; } } return node; } } } /* Checks whether a character matches any of a set of case characters. */ Py_LOCAL_INLINE(BOOL) any_case(Py_UCS4 ch, int case_count, Py_UCS4* cases) { int i; for (i = 0; i < case_count; i++) { if (ch == cases[i]) return TRUE; } return FALSE; } /* Matches many ANYs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] != '\n') == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] != '\n') == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] != '\n') == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many ANYs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY_REV(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] != '\n') == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] != '\n') == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] != '\n') == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many ANY_Us. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY_U(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { BOOL (*is_line_sep)(Py_UCS4 ch); void* text; is_line_sep = state->encoding->is_line_sep; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && is_line_sep(text_ptr[0]) != match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && is_line_sep(text_ptr[0]) != match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && is_line_sep(text_ptr[0]) != match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many ANY_Us backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY_U_REV(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { BOOL (*is_line_sep)(Py_UCS4 ch); void* text; is_line_sep = state->encoding->is_line_sep; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && is_line_sep(text_ptr[-1]) != match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && is_line_sep(text_ptr[-1]) != match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && is_line_sep(text_ptr[-1]) != match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 ch; text = state->text; match = node->match == match; ch = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] == ch) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] == ch) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] == ch) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; match = node->match == match; case_count = state->encoding->all_cases(node->values[0], cases); switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && any_case(text_ptr[0], case_count, cases) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && any_case(text_ptr[0], case_count, cases) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && any_case(text_ptr[0], case_count, cases) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; match = node->match == match; case_count = state->encoding->all_cases(node->values[0], cases); switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && any_case(text_ptr[-1], case_count, cases) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && any_case(text_ptr[-1], case_count, cases) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && any_case(text_ptr[-1], case_count, cases) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 ch; text = state->text; match = node->match == match; ch = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] == ch) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] == ch) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] == ch) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); RE_CODE property; text = state->text; match = node->match == match; has_property = state->encoding->has_property; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && has_property(property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && has_property(property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && has_property(property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; RE_CODE property; text = state->text; match = node->match == match; encoding = state->encoding; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && has_property_ign(encoding, property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && has_property_ign(encoding, property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && has_property_ign(encoding, property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; RE_CODE property; text = state->text; match = node->match == match; encoding = state->encoding; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && has_property_ign(encoding, property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && has_property_ign(encoding, property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && has_property_ign(encoding, property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); RE_CODE property; text = state->text; match = node->match == match; has_property = state->encoding->has_property; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && has_property(property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && has_property(property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && has_property(property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 lower; Py_UCS4 upper; text = state->text; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_range(lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_range(lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_range(lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; Py_UCS4 lower; Py_UCS4 upper; text = state->text; encoding = state->encoding; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; Py_UCS4 lower; Py_UCS4 upper; text = state->text; encoding = state->encoding; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 lower; Py_UCS4 upper; text = state->text; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_range(lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_range(lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_range(lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_set(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_set(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_set(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_set_ign(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_set_ign(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_set_ign(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_set_ign(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_set_ign(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_set_ign(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_set(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_set(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_set(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Counts a repeated character pattern. */ Py_LOCAL_INLINE(size_t) count_one(RE_State* state, RE_Node* node, Py_ssize_t text_pos, size_t max_count) { if (max_count < 1) return 0; switch (node->op) { case RE_OP_ANY: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_ANY(state, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_ANY_ALL: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return max_count; case RE_OP_ANY_ALL_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return max_count; case RE_OP_ANY_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_ANY_REV(state, text_pos, text_pos - max_count, TRUE); case RE_OP_ANY_U: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_ANY_U(state, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_ANY_U_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_ANY_U_REV(state, text_pos, text_pos - max_count, TRUE); case RE_OP_CHARACTER: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_CHARACTER(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_CHARACTER_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_CHARACTER_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_CHARACTER_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_CHARACTER_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_CHARACTER_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_CHARACTER_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_PROPERTY: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_PROPERTY(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_PROPERTY_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_PROPERTY_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_PROPERTY_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_PROPERTY_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_PROPERTY_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_PROPERTY_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_RANGE: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_RANGE(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_RANGE_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_RANGE_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_RANGE_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_RANGE_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_RANGE_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_RANGE_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_SET_DIFF: case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_SET(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_SET_DIFF_IGN: case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_SET_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_SET_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_SET_REV(state, node, text_pos, text_pos - max_count, TRUE); } return 0; } /* Tries to match a character pattern. */ Py_LOCAL_INLINE(BOOL) match_one(RE_State* state, RE_Node* node, Py_ssize_t text_pos) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; char_at = state->char_at; text = state->text; switch (node->op) { case RE_OP_ANY: return text_pos < state->slice_end && char_at(text, text_pos) != '\n'; case RE_OP_ANY_ALL: return text_pos < state->slice_end; case RE_OP_ANY_ALL_REV: return text_pos > state->slice_start; case RE_OP_ANY_REV: return text_pos > state->slice_start && char_at(text, text_pos - 1) != '\n'; case RE_OP_ANY_U: return text_pos < state->slice_end && !state->encoding->is_line_sep(char_at(text, text_pos)); case RE_OP_ANY_U_REV: return text_pos > state->slice_start && !state->encoding->is_line_sep(char_at(text, text_pos - 1)); case RE_OP_CHARACTER: return text_pos < state->slice_end && (char_at(text, text_pos) == node->values[0]) == node->match; case RE_OP_CHARACTER_IGN: return text_pos < state->slice_end && same_char_ign(state->encoding, char_at(text, text_pos), node->values[0]) == node->match; case RE_OP_CHARACTER_IGN_REV: return text_pos > state->slice_start && same_char_ign(state->encoding, char_at(text, text_pos - 1), node->values[0]) == node->match; case RE_OP_CHARACTER_REV: return text_pos > state->slice_start && (char_at(text, text_pos - 1) == node->values[0]) == node->match; case RE_OP_PROPERTY: return text_pos < state->slice_end && state->encoding->has_property(node->values[0], char_at(text, text_pos)) == node->match; case RE_OP_PROPERTY_IGN: return text_pos < state->slice_end && has_property_ign(state->encoding, node->values[0], char_at(text, text_pos)) == node->match; case RE_OP_PROPERTY_IGN_REV: return text_pos > state->slice_start && has_property_ign(state->encoding, node->values[0], char_at(text, text_pos - 1)) == node->match; case RE_OP_PROPERTY_REV: return text_pos > state->slice_start && state->encoding->has_property(node->values[0], char_at(text, text_pos - 1)) == node->match; case RE_OP_RANGE: return text_pos < state->slice_end && in_range(node->values[0], node->values[1], char_at(text, text_pos)) == node->match; case RE_OP_RANGE_IGN: return text_pos < state->slice_end && in_range_ign(state->encoding, node->values[0], node->values[1], char_at(text, text_pos)) == node->match; case RE_OP_RANGE_IGN_REV: return text_pos > state->slice_start && in_range_ign(state->encoding, node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match; case RE_OP_RANGE_REV: return text_pos > state->slice_start && in_range(node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match; case RE_OP_SET_DIFF: case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: return text_pos < state->slice_end && in_set(state->encoding, node, char_at(text, text_pos)) == node->match; case RE_OP_SET_DIFF_IGN: case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: return text_pos < state->slice_end && in_set_ign(state->encoding, node, char_at(text, text_pos)) == node->match; case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: return text_pos > state->slice_start && in_set_ign(state->encoding, node, char_at(text, text_pos - 1)) == node->match; case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: return text_pos > state->slice_start && in_set(state->encoding, node, char_at(text, text_pos - 1)) == node->match; } return FALSE; } /* Performs a simple string search. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; Py_UCS4 first_char; text = state->text; length = node->value_count; values = node->values; first_char = values[0]; limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text; } ++text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text; } ++text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text; } ++text_ptr; } break; } } return -1; } /* Performs a simple string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search_ign(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; RE_EncodingTable* encoding; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; length = node->value_count; values = node->values; encoding = state->encoding; case_count = encoding->all_cases(values[0], cases); limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text; } ++text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text; } ++text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text; } ++text_ptr; } break; } } return -1; } /* Performs a simple string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search_ign_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; RE_EncodingTable* encoding; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; length = node->value_count; values = node->values; encoding = state->encoding; case_count = encoding->all_cases(values[0], cases); text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; } --text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; } --text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; } --text_ptr; } break; } } return -1; } /* Performs a simple string search backwards. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; Py_UCS4 first_char; text = state->text; length = node->value_count; values = node->values; first_char = values[0]; text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; } --text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; } --text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; } --text_ptr; } break; } } return -1; } /* Performs a Boyer-Moore fast string search. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_ssize_t last_pos; Py_UCS4 check_char; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; last_pos = length - 1; check_char = values[last_pos]; limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (ch == check_char) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && text_ptr[pos] == values[pos]) --pos; if (pos < 0) return text_ptr - (Py_UCS1*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (ch == check_char) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && text_ptr[pos] == values[pos]) --pos; if (pos < 0) return text_ptr - (Py_UCS2*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (ch == check_char) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && text_ptr[pos] == values[pos]) --pos; if (pos < 0) return text_ptr - (Py_UCS4*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Performs a Boyer-Moore fast string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search_ign(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_EncodingTable* encoding; void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_ssize_t last_pos; Py_UCS4 cases[RE_MAX_CASES]; int case_count; encoding = state->encoding; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; last_pos = length - 1; case_count = encoding->all_cases(values[last_pos], cases); limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && same_char_ign(encoding, text_ptr[pos], values[pos])) --pos; if (pos < 0) return text_ptr - (Py_UCS1*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && same_char_ign(encoding, text_ptr[pos], values[pos])) --pos; if (pos < 0) return text_ptr - (Py_UCS2*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && same_char_ign(encoding, text_ptr[pos], values[pos])) --pos; if (pos < 0) return text_ptr - (Py_UCS4*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Performs a Boyer-Moore fast string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search_ign_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_EncodingTable* encoding; void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_UCS4 cases[RE_MAX_CASES]; int case_count; encoding = state->encoding; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; case_count = encoding->all_cases(values[0], cases); text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Performs a Boyer-Moore fast string search backwards. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_UCS4 check_char; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; check_char = values[0]; text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (ch == check_char) { Py_ssize_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (ch == check_char) { Py_ssize_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (ch == check_char) { Py_ssize_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Check whether 2 characters are the same. */ static BOOL same_char(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2) { return ch1 == ch2; } /* Build the tables for a Boyer-Moore fast string search. */ Py_LOCAL_INLINE(BOOL) build_fast_tables(RE_EncodingTable* encoding, RE_Node* node, BOOL ignore) { Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad; Py_ssize_t* good; Py_UCS4 ch; Py_ssize_t last_pos; Py_ssize_t pos; BOOL (*is_same_char)(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2); Py_ssize_t suffix_len; BOOL saved_start; Py_ssize_t s; Py_ssize_t i; Py_ssize_t s_start; Py_UCS4 codepoints[RE_MAX_CASES]; length = (Py_ssize_t)node->value_count; if (length < RE_MIN_FAST_LENGTH) return TRUE; values = node->values; bad = (Py_ssize_t*)re_alloc(256 * sizeof(bad[0])); good = (Py_ssize_t*)re_alloc(length * sizeof(good[0])); if (!bad || !good) { re_dealloc(bad); re_dealloc(good); return FALSE; } for (ch = 0; ch < 0x100; ch++) bad[ch] = length; last_pos = length - 1; for (pos = 0; pos < last_pos; pos++) { Py_ssize_t offset; offset = last_pos - pos; ch = values[pos]; if (ignore) { int count; int i; count = encoding->all_cases(ch, codepoints); for (i = 0; i < count; i++) bad[codepoints[i] & 0xFF] = offset; } else bad[ch & 0xFF] = offset; } is_same_char = ignore ? same_char_ign : same_char; suffix_len = 2; pos = length - suffix_len; saved_start = FALSE; s = pos - 1; i = suffix_len - 1; s_start = s; while (pos >= 0) { /* Look for another occurrence of the suffix. */ while (i > 0) { /* Have we dropped off the end of the string? */ if (s + i < 0) break; if (is_same_char(encoding, values[s + i], values[pos + i])) /* It still matches. */ --i; else { /* Start again further along. */ --s; i = suffix_len - 1; } } if (s >= 0 && is_same_char(encoding, values[s], values[pos])) { /* We haven't dropped off the end of the string, and the suffix has * matched this far, so this is a good starting point for the next * iteration. */ --s; if (!saved_start) { s_start = s; saved_start = TRUE; } } else { /* Calculate the suffix offset. */ good[pos] = pos - s; /* Extend the suffix and start searching for _this_ one. */ --pos; ++suffix_len; /* Where's a good place to start searching? */ if (saved_start) { s = s_start; saved_start = FALSE; } else --s; /* Can we short-circuit the searching? */ if (s < 0) break; } i = suffix_len - 1; } /* Fill-in any remaining entries. */ while (pos >= 0) { good[pos] = pos - s; --pos; --s; } node->string.bad_character_offset = bad; node->string.good_suffix_offset = good; return TRUE; } /* Build the tables for a Boyer-Moore fast string search backwards. */ Py_LOCAL_INLINE(BOOL) build_fast_tables_rev(RE_EncodingTable* encoding, RE_Node* node, BOOL ignore) { Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad; Py_ssize_t* good; Py_UCS4 ch; Py_ssize_t last_pos; Py_ssize_t pos; BOOL (*is_same_char)(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2); Py_ssize_t suffix_len; BOOL saved_start; Py_ssize_t s; Py_ssize_t i; Py_ssize_t s_start; Py_UCS4 codepoints[RE_MAX_CASES]; length = (Py_ssize_t)node->value_count; if (length < RE_MIN_FAST_LENGTH) return TRUE; values = node->values; bad = (Py_ssize_t*)re_alloc(256 * sizeof(bad[0])); good = (Py_ssize_t*)re_alloc(length * sizeof(good[0])); if (!bad || !good) { re_dealloc(bad); re_dealloc(good); return FALSE; } for (ch = 0; ch < 0x100; ch++) bad[ch] = -length; last_pos = length - 1; for (pos = last_pos; pos > 0; pos--) { Py_ssize_t offset; offset = -pos; ch = values[pos]; if (ignore) { int count; int i; count = encoding->all_cases(ch, codepoints); for (i = 0; i < count; i++) bad[codepoints[i] & 0xFF] = offset; } else bad[ch & 0xFF] = offset; } is_same_char = ignore ? same_char_ign : same_char; suffix_len = 2; pos = suffix_len - 1; saved_start = FALSE; s = pos + 1; i = suffix_len - 1; s_start = s; while (pos < length) { /* Look for another occurrence of the suffix. */ while (i > 0) { /* Have we dropped off the end of the string? */ if (s - i >= length) break; if (is_same_char(encoding, values[s - i], values[pos - i])) /* It still matches. */ --i; else { /* Start again further along. */ ++s; i = suffix_len - 1; } } if (s < length && is_same_char(encoding, values[s], values[pos])) { /* We haven't dropped off the end of the string, and the suffix has * matched this far, so this is a good starting point for the next * iteration. */ ++s; if (!saved_start) { s_start = s; saved_start = TRUE; } } else { /* Calculate the suffix offset. */ good[pos] = pos - s; /* Extend the suffix and start searching for _this_ one. */ ++pos; ++suffix_len; /* Where's a good place to start searching? */ if (saved_start) { s = s_start; saved_start = FALSE; } else ++s; /* Can we short-circuit the searching? */ if (s >= length) break; } i = suffix_len - 1; } /* Fill-in any remaining entries. */ while (pos < length) { good[pos] = pos - s; ++pos; ++s; } node->string.bad_character_offset = bad; node->string.good_suffix_offset = good; return TRUE; } /* Performs a string search. */ Py_LOCAL_INLINE(Py_ssize_t) string_search(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos + (Py_ssize_t)node->value_count > limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables(state->encoding, node, FALSE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search(state, node, text_pos, limit); else found_pos = simple_string_search(state, node, text_pos, limit); return found_pos; } /* Performs a string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_fld(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, Py_ssize_t* new_pos) { RE_State* state; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; RE_CODE* values; Py_ssize_t start_pos; int folded_pos; int folded_len; Py_ssize_t length; Py_ssize_t string_pos; Py_UCS4 folded[RE_MAX_FOLDED]; int case_count; Py_UCS4 cases[RE_MAX_CASES]; state = safe_state->re_state; encoding = state->encoding; full_case_fold = encoding->full_case_fold; char_at = state->char_at; text = state->text; values = node->values; start_pos = text_pos; folded_pos = 0; folded_len = 0; length = node->value_count; string_pos = 0; /* We'll special-case the first character of the string. */ case_count = encoding->all_cases(values[0], cases); while (string_pos < length || folded_pos < folded_len) { if (folded_pos >= folded_len) { fetch: if (text_pos >= limit) return -1; folded_len = full_case_fold(char_at(text, text_pos), folded); folded_pos = 0; } if (string_pos == 0) { int i; for (i = 0; i < case_count; i++) { if (folded[0] == cases[i]) goto match; } ++start_pos; text_pos = start_pos; goto fetch; } else if (same_char_ign(encoding, values[string_pos], folded[folded_pos])) { match: ++string_pos; ++folded_pos; if (folded_pos >= folded_len) ++text_pos; } else { ++start_pos; text_pos = start_pos; folded_pos = 0; folded_len = 0; string_pos = 0; } } if (new_pos) *new_pos = text_pos; return start_pos; } /* Performs a string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_fld_rev(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, Py_ssize_t* new_pos) { RE_State* state; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; RE_CODE* values; Py_ssize_t start_pos; int folded_pos; int folded_len; Py_ssize_t length; Py_ssize_t string_pos; Py_UCS4 folded[RE_MAX_FOLDED]; int case_count; Py_UCS4 cases[RE_MAX_CASES]; state = safe_state->re_state; encoding = state->encoding; full_case_fold = encoding->full_case_fold; char_at = state->char_at; text = state->text; values = node->values; start_pos = text_pos; folded_pos = 0; folded_len = 0; length = node->value_count; string_pos = length; /* We'll special-case the last character of the string. */ case_count = encoding->all_cases(values[length - 1], cases); while (string_pos > 0 || folded_pos > 0) { if (folded_pos <= 0) { fetch: if (text_pos <= limit) return -1; folded_len = full_case_fold(char_at(text, text_pos - 1), folded); folded_pos = folded_len; } if (string_pos == length) { int i; for (i = 0; i < case_count; i++) { if (folded[folded_len - 1] == cases[i]) goto match; } --start_pos; text_pos = start_pos; goto fetch; } else if (same_char_ign(encoding, values[string_pos - 1], folded[folded_pos - 1])) { match: --string_pos; --folded_pos; if (folded_pos <= 0) --text_pos; } else { --start_pos; text_pos = start_pos; folded_pos = 0; folded_len = 0; string_pos = length; } } if (new_pos) *new_pos = text_pos; return start_pos; } /* Performs a string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_ign(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos + (Py_ssize_t)node->value_count > limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables(state->encoding, node, TRUE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search_ign(state, node, text_pos, limit); else found_pos = simple_string_search_ign(state, node, text_pos, limit); return found_pos; } /* Performs a string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_ign_rev(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos - (Py_ssize_t)node->value_count < limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables_rev(state->encoding, node, TRUE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search_ign_rev(state, node, text_pos, limit); else found_pos = simple_string_search_ign_rev(state, node, text_pos, limit); return found_pos; } /* Performs a string search backwards. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_rev(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos - (Py_ssize_t)node->value_count < limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables_rev(state->encoding, node, FALSE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search_rev(state, node, text_pos, limit); else found_pos = simple_string_search_rev(state, node, text_pos, limit); return found_pos; } /* Returns how many characters there could be before full case-folding. */ Py_LOCAL_INLINE(size_t) possible_unfolded_length(size_t length) { if (length == 0) return 0; if (length < RE_MAX_FOLDED) return 1; return length / RE_MAX_FOLDED; } /* Tries a match at the current text position. * * Returns TRUE and the next node and text position if the match succeeds. */ Py_LOCAL_INLINE(BOOL) try_match(RE_State* state, RE_NextNode* next, Py_ssize_t text_pos, RE_Position* next_position) { RE_Node* test; void* text; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); test = next->test; if (test->status & RE_STATUS_FUZZY) { next_position->node = next->node; next_position->text_pos = text_pos; return TRUE; } text = state->text; char_at = state->char_at; switch (test->op) { case RE_OP_ANY: /* Any character, except a newline. */ if (text_pos >= state->slice_end || char_at(text, text_pos) == '\n') return FALSE; break; case RE_OP_ANY_ALL: /* Any character at all. */ if (text_pos >= state->slice_end) return FALSE; break; case RE_OP_ANY_ALL_REV: /* Any character at all. */ if (text_pos <= state->slice_start) return FALSE; break; case RE_OP_ANY_REV: /* Any character, except a newline. */ if (text_pos <= state->slice_start || char_at(text, text_pos - 1) == '\n') return FALSE; break; case RE_OP_ANY_U: /* Any character, except a line separator. */ if (text_pos >= state->slice_end || state->encoding->is_line_sep(char_at(text, text_pos))) return FALSE; break; case RE_OP_ANY_U_REV: /* Any character, except a line separator. */ if (text_pos <= state->slice_start || state->encoding->is_line_sep(char_at(text, text_pos - 1))) return FALSE; break; case RE_OP_BOUNDARY: /* At a word boundary. */ if (state->encoding->at_boundary(state, text_pos) != test->match) return FALSE; break; case RE_OP_BRANCH: /* 2-way branch. */ if (!try_match(state, &test->next_1, text_pos, next_position) && !try_match(state, &test->nonstring.next_2, text_pos, next_position)) return FALSE; break; case RE_OP_CHARACTER: /* A character literal. */ if (text_pos >= state->slice_end || (char_at(text, text_pos) == test->values[0]) != test->match) return FALSE; break; case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ if (text_pos >= state->slice_end || same_char_ign(state->encoding, char_at(text, text_pos), test->values[0]) != test->match) return FALSE; break; case RE_OP_CHARACTER_IGN_REV: /* A character literal, ignoring case. */ if (text_pos <= state->slice_start || same_char_ign(state->encoding, char_at(text, text_pos - 1), test->values[0]) != test->match) return FALSE; break; case RE_OP_CHARACTER_REV: /* A character literal. */ if (text_pos <= state->slice_start || (char_at(text, text_pos - 1) == test->values[0]) != test->match) return FALSE; break; case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ if (state->encoding->at_default_boundary(state, text_pos) != test->match) return FALSE; break; case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ if (state->encoding->at_default_word_end(state, text_pos) != test->match) return FALSE; break; case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ if (state->encoding->at_default_word_start(state, text_pos) != test->match) return FALSE; break; case RE_OP_END_OF_LINE: /* At the end of a line. */ if (text_pos != state->text_length && char_at(text, text_pos) != '\n') return FALSE; break; case RE_OP_END_OF_LINE_U: /* At the end of a line. */ if (!state->encoding->at_line_end(state, text_pos)) return FALSE; break; case RE_OP_END_OF_STRING: /* At the end of the string. */ if (text_pos != state->text_length) return FALSE; break; case RE_OP_END_OF_STRING_LINE: /* At the end of the string or the final newline. */ if (text_pos != state->text_length && text_pos != state->final_newline) return FALSE; break; case RE_OP_END_OF_STRING_LINE_U: /* At the end of the string or the final newline. */ if (text_pos != state->text_length && text_pos != state->final_line_sep) return FALSE; break; case RE_OP_END_OF_WORD: /* At end of a word. */ if (state->encoding->at_word_end(state, text_pos) != test->match) return FALSE; break; case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ if (state->encoding->at_grapheme_boundary(state, text_pos) != test->match) return FALSE; break; case RE_OP_PROPERTY: /* A character property. */ /* values are: property */ if (text_pos >= state->slice_end || state->encoding->has_property(test->values[0], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_PROPERTY_IGN: /* A character property, ignoring case. */ /* values are: property */ if (text_pos >= state->slice_end || !has_property_ign(state->encoding, test->values[0], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_PROPERTY_IGN_REV: /* A character property, ignoring case. */ /* values are: property */ if (text_pos <= state->slice_start || !has_property_ign(state->encoding, test->values[0], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_PROPERTY_REV: /* A character property. */ /* values are: property */ if (text_pos <= state->slice_start || state->encoding->has_property(test->values[0], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_RANGE: /* A range. */ /* values are: range */ if (text_pos >= state->slice_end || in_range(test->values[0], test->values[1], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_RANGE_IGN: /* A range, ignoring case. */ /* values are: range */ if (text_pos >= state->slice_end || in_range_ign(state->encoding, test->values[0], test->values[1], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_RANGE_IGN_REV: /* A range, ignoring case. */ /* values are: range */ if (text_pos <= state->slice_start || in_range_ign(state->encoding, test->values[0], test->values[1], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_RANGE_REV: /* A range. */ /* values are: range */ if (text_pos <= state->slice_start || in_range(test->values[0], test->values[1], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ if (text_pos != state->search_anchor) return FALSE; break; case RE_OP_SET_DIFF: /* Character set. */ case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: if (text_pos >= state->slice_end || in_set(state->encoding, test, char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_SET_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: if (text_pos >= state->slice_end || in_set_ign(state->encoding, test, char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_SET_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: if (text_pos <= state->slice_start || in_set_ign(state->encoding, test, char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_SET_DIFF_REV: /* Character set. */ case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: if (text_pos <= state->slice_start || in_set(state->encoding, test, char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_START_OF_LINE: /* At the start of a line. */ if (text_pos != 0 && char_at(text, text_pos - 1) != '\n') return FALSE; break; case RE_OP_START_OF_LINE_U: /* At the start of a line. */ if (!state->encoding->at_line_start(state, text_pos)) return FALSE; break; case RE_OP_START_OF_STRING: /* At the start of the string. */ if (text_pos != 0) return FALSE; break; case RE_OP_START_OF_WORD: /* At start of a word. */ if (state->encoding->at_word_start(state, text_pos) != test->match) return FALSE; break; case RE_OP_STRING: /* A string literal. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_CODE* values; size_t i; length = test->value_count; available = state->slice_end - text_pos; if (length > available) return FALSE; char_at = state->char_at; values = test->values; for (i = 0; i < length; i++) { if (char_at(text, text_pos + i) != values[i]) return FALSE; } break; } case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ { size_t length; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t pos; size_t string_pos; RE_CODE* values; int folded_len; int folded_pos; Py_UCS4 folded[RE_MAX_FOLDED]; length = test->value_count; available = state->slice_end - text_pos; if ((Py_ssize_t)possible_unfolded_length(length) > available) return FALSE; char_at = state->char_at; encoding = state->encoding; full_case_fold = encoding->full_case_fold; pos = text_pos; string_pos = 0; values = test->values; folded_len = 0; folded_pos = 0; while (string_pos < length) { if (folded_pos >= folded_len) { if (pos >= state->slice_end) return FALSE; folded_len = full_case_fold(char_at(text, pos), folded); folded_pos = 0; } if (!same_char_ign(encoding, folded[folded_pos], values[string_pos])) return FALSE; ++string_pos; ++folded_pos; if (folded_pos >= folded_len) ++pos; } if (folded_pos < folded_len) return FALSE; next_position->node = next->match_next; if (next->match_step == 0) next_position->text_pos = text_pos; else next_position->text_pos = pos; return TRUE; } case RE_OP_STRING_FLD_REV: /* A string literal, ignoring case. */ { size_t length; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t pos; size_t string_pos; RE_CODE* values; int folded_len; int folded_pos; Py_UCS4 folded[RE_MAX_FOLDED]; length = test->value_count; available = text_pos - state->slice_start; if ((Py_ssize_t)possible_unfolded_length(length) > available) return FALSE; char_at = state->char_at; encoding = state->encoding; full_case_fold = encoding->full_case_fold; pos = text_pos; string_pos = length; values = test->values; folded_len = 0; folded_pos = folded_len; while (string_pos > 0) { if (folded_pos <= 0) { if (pos <= state->slice_start) return FALSE; folded_len = full_case_fold(char_at(text, pos - 1), folded); folded_pos = folded_len; } if (!same_char_ign(encoding, folded[folded_pos - 1], values[string_pos - 1])) return FALSE; --string_pos; --folded_pos; if (folded_pos <= 0) --pos; } if (folded_pos > 0) return FALSE; next_position->node = next->match_next; if (next->match_step == 0) next_position->text_pos = text_pos; else next_position->text_pos = pos; return TRUE; } case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; RE_CODE* values; size_t i; length = test->value_count; available = state->slice_end - text_pos; if (length > available) return FALSE; char_at = state->char_at; encoding = state->encoding; values = test->values; for (i = 0; i < length; i++) { if (!same_char_ign(encoding, char_at(text, text_pos + i), values[i])) return FALSE; } break; } case RE_OP_STRING_IGN_REV: /* A string literal, ignoring case. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; RE_CODE* values; size_t i; length = test->value_count; available = text_pos - state->slice_start; if (length > available) return FALSE; char_at = state->char_at; encoding = state->encoding; values = test->values; text_pos -= length; for (i = 0; i < length; i++) { if (!same_char_ign(encoding, char_at(text, text_pos + i), values[i])) return FALSE; } text_pos += length; break; } case RE_OP_STRING_REV: /* A string literal. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_CODE* values; size_t i; length = test->value_count; available = text_pos - state->slice_start; if (length > available) return FALSE; char_at = state->char_at; values = test->values; text_pos -= length; for (i = 0; i < length; i++) { if (char_at(text, text_pos + i) != values[i]) return FALSE; } text_pos += length; break; } default: next_position->node = next->node; next_position->text_pos = text_pos; return TRUE; } next_position->node = next->match_next; next_position->text_pos = text_pos + next->match_step; return TRUE; } Py_LOCAL_INLINE(BOOL) search_start(RE_SafeState* safe_state, RE_NextNode* next, RE_Position* new_position, int search_index); /* Searches for the start of a match. */ Py_LOCAL_INLINE(BOOL) search_start(RE_SafeState* safe_state, RE_NextNode* next, RE_Position* new_position, int search_index) { RE_State* state; Py_ssize_t text_pos; RE_Node* test; RE_Node* node; Py_ssize_t start_pos; Py_ssize_t step; Py_ssize_t limit; RE_SearchPosition* info; state = safe_state->re_state; start_pos = state->text_pos; TRACE(("<> at %d\n", start_pos)) test = next->test; node = next->node; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; limit = state->slice_start; step = -1; } else { if (start_pos > state->slice_end) return FALSE; limit = state->slice_end; step = 1; } if (test->status & RE_STATUS_FUZZY) { /* Don't call 'search_start' again. */ state->pattern->do_search_start = FALSE; state->match_pos = start_pos; new_position->node = node; new_position->text_pos = start_pos; return TRUE; } again: if (!state->pattern->is_fuzzy) { if (state->reverse) { if (start_pos - (Py_ssize_t)state->min_width < limit) return FALSE; } else { if (start_pos + (Py_ssize_t)state->min_width > limit) return FALSE; } } if (search_index < MAX_SEARCH_POSITIONS) { info = &state->search_positions[search_index]; if (state->reverse) { if (info->start_pos >= 0 && info->start_pos >= start_pos && start_pos >= info->match_pos) { state->match_pos = info->match_pos; new_position->text_pos = state->match_pos; new_position->node = node; return TRUE; } } else { if (info->start_pos >= 0 && info->start_pos <= start_pos && start_pos <= info->match_pos) { state->match_pos = info->match_pos; new_position->text_pos = state->match_pos; new_position->node = node; return TRUE; } } } else info = NULL; switch (test->op) { case RE_OP_ANY: /* Any character, except a newline. */ start_pos = match_many_ANY(state, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_ANY_ALL: /* Any character at all. */ break; case RE_OP_ANY_ALL_REV: /* Any character at all backwards. */ break; case RE_OP_ANY_REV: /* Any character backwards, except a newline. */ start_pos = match_many_ANY_REV(state, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_ANY_U: /* Any character, except a line separator. */ start_pos = match_many_ANY_U(state, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_ANY_U_REV: /* Any character backwards, except a line separator. */ start_pos = match_many_ANY_U_REV(state, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_BOUNDARY: /* At a word boundary. */ { BOOL match; Py_ssize_t step; BOOL (*at_boundary)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_boundary = state->encoding->at_boundary; for (;;) { if (at_boundary(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_CHARACTER: /* A character literal. */ start_pos = match_many_CHARACTER(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ start_pos = match_many_CHARACTER_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_CHARACTER_IGN_REV: /* A character literal backwards, ignoring case. */ start_pos = match_many_CHARACTER_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_CHARACTER_REV: /* A character literal backwards. */ start_pos = match_many_CHARACTER_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ { BOOL match; Py_ssize_t step; BOOL (*at_default_boundary)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_default_boundary = state->encoding->at_default_boundary; for (;;) { if (at_default_boundary(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_default_word_end)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_default_word_end = state->encoding->at_default_word_end; for (;;) { if (at_default_word_end(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_default_word_start)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_default_word_start = state->encoding->at_default_word_start; for (;;) { if (at_default_word_start(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_END_OF_LINE: /* At the end of a line. */ { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t step; char_at = state->char_at; text = state->text; text_pos = start_pos; step = state->reverse ? -1 : 1; for (;;) { if (text_pos == state->text_length || char_at(text, text_pos) == '\n') break; if (text_pos == limit) return FALSE; text_pos += step; } start_pos = text_pos; break; } case RE_OP_END_OF_STRING: /* At the end of the string. */ if (state->reverse) { if (start_pos != state->text_length) return FALSE; } else { if (state->slice_end != state->text_length) return FALSE; } start_pos = state->text_length; break; case RE_OP_END_OF_STRING_LINE: /* At end of string or final newline. */ if (state->reverse) { if (start_pos >= state->text_length) start_pos = state->text_length; else if (start_pos >= state->final_newline) start_pos = state->final_newline; else return FALSE; if (start_pos < state->slice_start) return FALSE; } else { if (start_pos <= state->final_newline) start_pos = state->final_newline; else if (start_pos <= state->text_length) start_pos = state->text_length; else return FALSE; if (start_pos > state->slice_end) return FALSE; } break; case RE_OP_END_OF_WORD: /* At end of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_word_end)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_word_end = state->encoding->at_word_end; for (;;) { if (at_word_end(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ { BOOL match; Py_ssize_t step; BOOL (*at_boundary)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_boundary = state->encoding->at_grapheme_boundary; for (;;) { if (at_boundary(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_PROPERTY: /* A character property. */ start_pos = match_many_PROPERTY(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_PROPERTY_IGN: /* A character property, ignoring case. */ start_pos = match_many_PROPERTY_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_PROPERTY_IGN_REV: /* A character property backwards, ignoring case. */ start_pos = match_many_PROPERTY_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_PROPERTY_REV: /* A character property backwards. */ start_pos = match_many_PROPERTY_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_RANGE: /* A range. */ start_pos = match_many_RANGE(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_RANGE_IGN: /* A range, ignoring case. */ start_pos = match_many_RANGE_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_RANGE_IGN_REV: /* A range backwards, ignoring case. */ start_pos = match_many_RANGE_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_RANGE_REV: /* A range backwards. */ start_pos = match_many_RANGE_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ if (state->reverse) { if (start_pos < state->search_anchor) return FALSE; } else { if (start_pos > state->search_anchor) return FALSE; } start_pos = state->search_anchor; break; case RE_OP_SET_DIFF: /* A set. */ case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: start_pos = match_many_SET(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_SET_DIFF_IGN: /* A set, ignoring case. */ case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: start_pos = match_many_SET_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_SET_DIFF_IGN_REV: /* A set backwards, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: start_pos = match_many_SET_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_SET_DIFF_REV: /* A set backwards. */ case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: start_pos = match_many_SET_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_START_OF_LINE: /* At the start of a line. */ { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t step; Py_ssize_t text_pos; char_at = state->char_at; text = state->text; step = state->reverse ? -1 : 1; text_pos = start_pos - 1; --limit; for (;;) { if (text_pos < 0 || char_at(text, text_pos) == '\n') break; if (text_pos == limit) return FALSE; text_pos += step; } ++text_pos; ++limit; start_pos = text_pos; break; } case RE_OP_START_OF_STRING: /* At the start of the string. */ if (state->reverse) { if (state->slice_start != 0) return FALSE; } else { if (start_pos != 0) return FALSE; } start_pos = 0; break; case RE_OP_START_OF_WORD: /* At start of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_word_start)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_word_start = state->encoding->at_word_start; for (;;) { if (at_word_start(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_STRING: /* A string literal. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ { Py_ssize_t new_pos; if ((test->status & RE_STATUS_REQUIRED) && start_pos == state->req_pos) new_pos = state->req_end; else start_pos = string_search_fld(safe_state, test, start_pos, state->slice_end, &new_pos); if (start_pos < 0) return FALSE; /* Can we look further ahead? */ if (test == node) { if (test->next_1.node && !try_match(state, &test->next_1, new_pos, new_position)) { ++start_pos; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; } else { if (start_pos > state->slice_end) return FALSE; } goto again; } /* It's a possible match. */ state->match_pos = start_pos; return TRUE; } break; } case RE_OP_STRING_FLD_REV: /* A string literal backwards, ignoring case. */ { Py_ssize_t new_pos; if ((test->status & RE_STATUS_REQUIRED) && start_pos == state->req_pos) new_pos = state->req_end; else start_pos = string_search_fld_rev(safe_state, test, start_pos, state->slice_start, &new_pos); if (start_pos < 0) return FALSE; /* Can we look further ahead? */ if (test == node) { if (test->next_1.node && !try_match(state, &test->next_1, new_pos, new_position)) { --start_pos; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; } else { if (start_pos > state->slice_end) return FALSE; } goto again; } /* It's a possible match. */ state->match_pos = start_pos; return TRUE; } break; } case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search_ign(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; case RE_OP_STRING_IGN_REV: /* A string literal backwards, ignoring case. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search_ign_rev(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; case RE_OP_STRING_REV: /* A string literal backwards. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search_rev(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; default: /* Don't call 'search_start' again. */ state->pattern->do_search_start = FALSE; state->match_pos = start_pos; new_position->node = node; new_position->text_pos = start_pos; return TRUE; } text_pos = start_pos; /* Can we look further ahead? */ if (test == node) { text_pos += test->step; if (test->next_1.node && !try_match(state, &test->next_1, text_pos, new_position)) { start_pos += step; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; } else { if (start_pos > state->slice_end) return FALSE; } goto again; } } else { new_position->node = node; new_position->text_pos = start_pos; } /* It's a possible match. */ state->match_pos = start_pos; if (info) { info->start_pos = state->text_pos; info->match_pos = state->match_pos; } return TRUE; } /* Saves a capture group. */ Py_LOCAL_INLINE(BOOL) save_capture(RE_SafeState* safe_state, size_t private_index, size_t public_index) { RE_State* state; RE_GroupData* private_group; RE_GroupData* public_group; state = safe_state->re_state; /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ private_group = &state->groups[private_index - 1]; public_group = &state->groups[public_index - 1]; /* Will the repeated captures ever be visible? */ if (!state->visible_captures) { public_group->captures[0] = private_group->span; public_group->capture_count = 1; return TRUE; } if (public_group->capture_count >= public_group->capture_capacity) { size_t new_capacity; RE_GroupSpan* new_captures; new_capacity = public_group->capture_capacity * 2; new_capacity = RE_MAX(new_capacity, RE_INIT_CAPTURE_SIZE); new_captures = (RE_GroupSpan*)safe_realloc(safe_state, public_group->captures,new_capacity * sizeof(RE_GroupSpan)); if (!new_captures) return FALSE; public_group->captures = new_captures; public_group->capture_capacity = new_capacity; } public_group->captures[public_group->capture_count++] = private_group->span; return TRUE; } /* Unsaves a capture group. */ Py_LOCAL_INLINE(void) unsave_capture(RE_State* state, size_t private_index, size_t public_index) { /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ if (state->groups[public_index - 1].capture_count > 0) --state->groups[public_index - 1].capture_count; } /* Pushes the groups for backtracking. */ Py_LOCAL_INLINE(BOOL) push_groups(RE_SafeState* safe_state) { RE_State* state; Py_ssize_t group_count; RE_SavedGroups* current; Py_ssize_t g; state = safe_state->re_state; group_count = state->pattern->true_group_count; if (group_count == 0) return TRUE; current = state->current_saved_groups; if (current && current->next) current = current->next; else if (!current && state->first_saved_groups) current = state->first_saved_groups; else { RE_SavedGroups* new_block; new_block = (RE_SavedGroups*)safe_alloc(safe_state, sizeof(RE_SavedGroups)); if (!new_block) return FALSE; new_block->spans = (RE_GroupSpan*)safe_alloc(safe_state, group_count * sizeof(RE_GroupSpan)); new_block->counts = (size_t*)safe_alloc(safe_state, group_count * sizeof(size_t)); if (!new_block->spans || !new_block->counts) { safe_dealloc(safe_state, new_block->spans); safe_dealloc(safe_state, new_block->counts); safe_dealloc(safe_state, new_block); return FALSE; } new_block->previous = current; new_block->next = NULL; if (new_block->previous) new_block->previous->next = new_block; else state->first_saved_groups = new_block; current = new_block; } for (g = 0; g < group_count; g++) { current->spans[g] = state->groups[g].span; current->counts[g] = state->groups[g].capture_count; } state->current_saved_groups = current; return TRUE; } /* Pops the groups for backtracking. */ Py_LOCAL_INLINE(void) pop_groups(RE_State* state) { Py_ssize_t group_count; RE_SavedGroups* current; Py_ssize_t g; group_count = state->pattern->true_group_count; if (group_count == 0) return; current = state->current_saved_groups; for (g = 0; g < group_count; g++) { state->groups[g].span = current->spans[g]; state->groups[g].capture_count = current->counts[g]; } state->current_saved_groups = current->previous; } /* Drops the groups for backtracking. */ Py_LOCAL_INLINE(void) drop_groups(RE_State* state) { if (state->pattern->true_group_count != 0) state->current_saved_groups = state->current_saved_groups->previous; } /* Pushes the repeats for backtracking. */ Py_LOCAL_INLINE(BOOL) push_repeats(RE_SafeState* safe_state) { RE_State* state; PatternObject* pattern; Py_ssize_t repeat_count; RE_SavedRepeats* current; Py_ssize_t r; state = safe_state->re_state; pattern = state->pattern; repeat_count = pattern->repeat_count; if (repeat_count == 0) return TRUE; current = state->current_saved_repeats; if (current && current->next) current = current->next; else if (!current && state->first_saved_repeats) current = state->first_saved_repeats; else { RE_SavedRepeats* new_block; new_block = (RE_SavedRepeats*)safe_alloc(safe_state, sizeof(RE_SavedRepeats)); if (!new_block) return FALSE; memset(new_block, 0, sizeof(RE_SavedRepeats)); new_block->repeats = (RE_RepeatData*)safe_alloc(safe_state, repeat_count * sizeof(RE_RepeatData)); if (!new_block->repeats) { safe_dealloc(safe_state, new_block); return FALSE; } memset(new_block->repeats, 0, repeat_count * sizeof(RE_RepeatData)); new_block->previous = current; new_block->next = NULL; if (new_block->previous) new_block->previous->next = new_block; else state->first_saved_repeats = new_block; current = new_block; } for (r = 0; r < repeat_count; r++) { if (!copy_repeat_data(safe_state, ¤t->repeats[r], &state->repeats[r])) return FALSE; } state->current_saved_repeats = current; return TRUE; } /* Pops the repeats for backtracking. */ Py_LOCAL_INLINE(void) pop_repeats(RE_State* state) { PatternObject* pattern; Py_ssize_t repeat_count; RE_SavedRepeats* current; Py_ssize_t r; pattern = state->pattern; repeat_count = pattern->repeat_count; if (repeat_count == 0) return; current = state->current_saved_repeats; for (r = 0; r < repeat_count; r++) copy_repeat_data(NULL, &state->repeats[r], ¤t->repeats[r]); state->current_saved_repeats = current->previous; } /* Saves state info before a recusive call by 'basic_match'. */ Py_LOCAL_INLINE(void) save_info(RE_State* state, RE_Info* info) { info->current_backtrack_block = state->current_backtrack_block; info->backtrack_count = info->current_backtrack_block->count; info->current_saved_groups = state->current_saved_groups; info->must_advance = state->must_advance; info->current_group_call_frame = state->current_group_call_frame; } /* Restores state info after a recusive call by 'basic_match'. */ Py_LOCAL_INLINE(void) restore_info(RE_State* state, RE_Info* info) { state->current_group_call_frame = info->current_group_call_frame; state->must_advance = info->must_advance; state->current_saved_groups = info->current_saved_groups; info->current_backtrack_block->count = info->backtrack_count; state->current_backtrack_block = info->current_backtrack_block; } /* Inserts a new span in a guard list. */ Py_LOCAL_INLINE(BOOL) insert_guard_span(RE_SafeState* safe_state, RE_GuardList* guard_list, Py_ssize_t index) { size_t n; if (guard_list->count >= guard_list->capacity) { size_t new_capacity; RE_GuardSpan* new_spans; new_capacity = guard_list->capacity * 2; if (new_capacity == 0) new_capacity = RE_INIT_GUARDS_BLOCK_SIZE; new_spans = (RE_GuardSpan*)safe_realloc(safe_state, guard_list->spans, new_capacity * sizeof(RE_GuardSpan)); if (!new_spans) return FALSE; guard_list->capacity = new_capacity; guard_list->spans = new_spans; } n = guard_list->count - index; if (n > 0) memmove(guard_list->spans + index + 1, guard_list->spans + index, n * sizeof(RE_GuardSpan)); ++guard_list->count; return TRUE; } /* Deletes a span in a guard list. */ Py_LOCAL_INLINE(void) delete_guard_span(RE_GuardList* guard_list, Py_ssize_t index) { size_t n; n = guard_list->count - index - 1; if (n > 0) memmove(guard_list->spans + index, guard_list->spans + index + 1, n * sizeof(RE_GuardSpan)); --guard_list->count; } /* Checks whether a position is guarded against further matching. */ Py_LOCAL_INLINE(BOOL) is_guarded(RE_GuardList* guard_list, Py_ssize_t text_pos) { size_t low; size_t high; /* Is this position in the guard list? */ low = 0; high = guard_list->count; while (low < high) { size_t mid; RE_GuardSpan* span; mid = (low + high) / 2; span = &guard_list->spans[mid]; if (text_pos < span->low) high = mid; else if (text_pos > span->high) low = mid + 1; else return span->protect; } guard_list->last_text_pos = text_pos; guard_list->last_low = low; return FALSE; } /* Guards a position against further matching. */ Py_LOCAL_INLINE(BOOL) guard(RE_SafeState* safe_state, RE_GuardList* guard_list, Py_ssize_t text_pos, BOOL protect) { size_t low; size_t high; /* Where should be new position be added? */ if (text_pos == guard_list->last_text_pos) low = guard_list->last_low; else { low = 0; high = guard_list->count; while (low < high) { size_t mid; RE_GuardSpan* span; mid = (low + high) / 2; span = &guard_list->spans[mid]; if (text_pos < span->low) high = mid; else if (text_pos > span->high) low = mid + 1; else return TRUE; } } /* Add the position to the guard list. */ if (low > 0 && guard_list->spans[low - 1].high + 1 == text_pos && guard_list->spans[low - 1].protect == protect) { /* The new position is just above this span. */ if (low < guard_list->count && guard_list->spans[low].low - 1 == text_pos && guard_list->spans[low].protect == protect) { /* The new position joins 2 spans */ guard_list->spans[low - 1].high = guard_list->spans[low].high; delete_guard_span(guard_list, low); } else /* Extend the span. */ guard_list->spans[low - 1].high = text_pos; } else if (low < guard_list->count && guard_list->spans[low].low - 1 == text_pos && guard_list->spans[low].protect == protect) /* The new position is just below this span. */ /* Extend the span. */ guard_list->spans[low].low = text_pos; else { /* Insert a new span. */ if (!insert_guard_span(safe_state, guard_list, low)) return FALSE; guard_list->spans[low].low = text_pos; guard_list->spans[low].high = text_pos; guard_list->spans[low].protect = protect; } guard_list->last_text_pos = -1; return TRUE; } /* Guards a position against further matching for a repeat. */ Py_LOCAL_INLINE(BOOL) guard_repeat(RE_SafeState* safe_state, size_t index, Py_ssize_t text_pos, RE_STATUS_T guard_type, BOOL protect) { RE_State* state; RE_GuardList* guard_list; state = safe_state->re_state; /* Is a guard active here? */ if (!(state->pattern->repeat_info[index].status & guard_type)) return TRUE; /* Which guard list? */ if (guard_type & RE_STATUS_BODY) guard_list = &state->repeats[index].body_guard_list; else guard_list = &state->repeats[index].tail_guard_list; return guard(safe_state, guard_list, text_pos, protect); } /* Checks whether a position is guarded against further matching for a repeat. */ Py_LOCAL_INLINE(BOOL) is_repeat_guarded(RE_SafeState* safe_state, size_t index, Py_ssize_t text_pos, RE_STATUS_T guard_type) { RE_State* state; RE_GuardList* guard_list; state = safe_state->re_state; /* Is a guard active here? */ if (!(state->pattern->repeat_info[index].status & guard_type)) return FALSE; /* Which guard list? */ if (guard_type == RE_STATUS_BODY) guard_list = &state->repeats[index].body_guard_list; else guard_list = &state->repeats[index].tail_guard_list; return is_guarded(guard_list, text_pos); } /* Resets the guards inside atomic subpatterns and lookarounds. */ Py_LOCAL_INLINE(void) reset_guards(RE_State* state, RE_CODE* values) { PatternObject* pattern; Py_ssize_t repeat_count; pattern = state->pattern; repeat_count = (size_t)pattern->repeat_count; if (values) { size_t i; for (i = 1; i <= values[0]; i++) { Py_ssize_t index; index = (Py_ssize_t)values[i]; if (index < repeat_count) { reset_guard_list(&state->repeats[index].body_guard_list); reset_guard_list(&state->repeats[index].tail_guard_list); } else { index -= repeat_count; reset_guard_list(&state->fuzzy_guards[index].body_guard_list); reset_guard_list(&state->fuzzy_guards[index].tail_guard_list); } } } else { Py_ssize_t index; Py_ssize_t fuzzy_count; for (index = 0; index < repeat_count; index++) { reset_guard_list(&state->repeats[index].body_guard_list); reset_guard_list(&state->repeats[index].tail_guard_list); } fuzzy_count = pattern->fuzzy_count; for (index = 0; index < fuzzy_count; index++) { reset_guard_list(&state->fuzzy_guards[index].body_guard_list); reset_guard_list(&state->fuzzy_guards[index].tail_guard_list); } } } /* Builds a Unicode string. */ Py_LOCAL_INLINE(PyObject*) build_unicode_value(void* buffer, Py_ssize_t len, Py_ssize_t buffer_charsize) { return PyUnicode_FromUnicode(buffer, len); } /* Builds a bytestring. Returns NULL if any member is too wide. */ Py_LOCAL_INLINE(PyObject*) build_bytes_value(void* buffer, Py_ssize_t len, Py_ssize_t buffer_charsize) { Py_UCS1* byte_buffer; Py_ssize_t i; PyObject* result; if (buffer_charsize == 1) return Py_BuildValue("s#", buffer, len); byte_buffer = re_alloc(len); if (!byte_buffer) return NULL; for (i = 0; i < len; i++) { Py_UCS2 c = ((Py_UCS2*)buffer)[i]; if (c > 0xFF) goto too_wide; byte_buffer[i] = (Py_UCS1)c; } result = Py_BuildValue("s#", byte_buffer, len); re_dealloc(byte_buffer); return result; too_wide: re_dealloc(byte_buffer); return NULL; } /* Looks for a string in a string set, ignoring case. */ Py_LOCAL_INLINE(int) string_set_contains_ign(RE_State* state, PyObject* string_set, void* buffer, Py_ssize_t index, Py_ssize_t len, Py_ssize_t buffer_charsize) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); RE_EncodingTable* encoding; BOOL (*possible_turkic)(Py_UCS4 ch); Py_UCS4 codepoints[4]; switch (buffer_charsize) { case 1: char_at = bytes1_char_at; set_char_at = bytes1_set_char_at; break; case 2: char_at = bytes2_char_at; set_char_at = bytes2_set_char_at; break; case 4: char_at = bytes4_char_at; set_char_at = bytes4_set_char_at; break; default: char_at = bytes1_char_at; set_char_at = bytes1_set_char_at; break; } encoding = state->encoding; possible_turkic = encoding->possible_turkic; /* Look for a possible Turkic 'I'. */ while (index < len && !possible_turkic(char_at(buffer, index))) ++index; if (index < len) { /* Possible Turkic 'I'. */ int count; int i; /* Try all the alternatives to the 'I'. */ count = encoding->all_turkic_i(char_at(buffer, index), codepoints); for (i = 0; i < count; i++) { int status; set_char_at(buffer, index, codepoints[i]); /* Recurse for the remainder of the string. */ status = string_set_contains_ign(state, string_set, buffer, index + 1, len, buffer_charsize); if (status != 0) return status; } return 0; } else { /* No Turkic 'I'. */ PyObject* string; int status; if (state->is_unicode) string = build_unicode_value(buffer, len, buffer_charsize); else string = build_bytes_value(buffer, len, buffer_charsize); if (!string) return RE_ERROR_MEMORY; status = PySet_Contains(string_set, string); Py_DECREF(string); return status; } } /* Tries to match a string at the current position with a member of a string * set, ignoring case, for a forwards or reverse search. */ Py_LOCAL_INLINE(int) string_set_match_ign_fwdrev(RE_SafeState* safe_state, RE_Node* node, BOOL reverse) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; RE_EncodingTable* encoding; Py_UCS4 (*simple_case_fold)(Py_UCS4 ch); Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* folded; PyObject* string_set; int status; Py_ssize_t len; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = reverse ? state->text_pos - state->slice_start : state->slice_end - state->text_pos; if (min_len > available) /* Too few characters for any match. */ return 0; max_len = RE_MIN(max_len, available); char_at = state->char_at; text = state->text; text_pos = state->text_pos; encoding = state->encoding; simple_case_fold = encoding->simple_case_fold; acquire_GIL(safe_state); /* The folded string will have the same width as the original string. */ folded_charsize = state->charsize; switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; break; case 2: set_char_at = bytes2_set_char_at; break; case 4: set_char_at = bytes4_set_char_at; break; default: return 0; } /* Allocate a buffer for the folded string. */ folded = re_alloc(max_len * folded_charsize); if (!folded) goto error; /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ for (len = max_len; status == 0 && len >= min_len; len--) { Py_ssize_t offset; Py_ssize_t inc_len; int i; if (reverse) { offset = -len; inc_len = -len; } else { offset = 0; inc_len = len; } for (i = 0; i < len; i++) { Py_UCS4 ch; ch = simple_case_fold(char_at(text, text_pos + offset + i)); set_char_at(folded, i, ch); } status = string_set_contains_ign(state, string_set, folded, 0, len, folded_charsize); if (status == 1) /* Advance past the match. */ state->text_pos += inc_len; } re_dealloc(folded); release_GIL(safe_state); return status; error: re_dealloc(folded); release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set. */ Py_LOCAL_INLINE(int) string_set_match(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; void* (*point_to)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; PyObject* string_set; int status; Py_ssize_t len; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->slice_end - state->text_pos; if (min_len > available) /* Too few characters for any match. */ return 0; max_len = RE_MIN(max_len, available); point_to = state->point_to; text = state->text; text_pos = state->text_pos; acquire_GIL(safe_state); /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ for (len = max_len; status == 0 && len >= min_len; len--) { PyObject* string; if (state->is_unicode) string = build_unicode_value(point_to(text, text_pos), len, state->charsize); else string = build_bytes_value(point_to(text, text_pos), len, state->charsize); if (!string) goto error; status = PySet_Contains(string_set, string); Py_DECREF(string); if (status == 1) /* Advance past the match. */ state->text_pos += len; } release_GIL(safe_state); return status; error: release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set, ignoring case. */ Py_LOCAL_INLINE(int) string_set_match_fld(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t buf_size; Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* folded; PyObject* string_set; int status; Py_ssize_t end_fetch; Py_ssize_t len; Py_UCS4 codepoints[RE_MAX_FOLDED]; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->slice_end - state->text_pos; if ((Py_ssize_t)possible_unfolded_length(min_len) > available) /* Too few characters for any match. */ return 0; char_at = state->char_at; text = state->text; text_pos = state->text_pos; encoding = state->encoding; full_case_fold = encoding->full_case_fold; /* The folded string will have the same width as the original string. */ folded_charsize = state->charsize; switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; break; case 2: set_char_at = bytes2_set_char_at; break; case 4: set_char_at = bytes4_set_char_at; break; default: return 0; } acquire_GIL(safe_state); /* Allocate a buffer for the folded string, plus a little extra. */ buf_size = max_len + RE_MAX_FOLDED; folded = re_alloc(buf_size * folded_charsize); if (!folded) goto error; /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ end_fetch = text_pos + max_len; for (len = max_len; status == 0 && len >= min_len; len--) { Py_ssize_t pos; int folded_len; pos = text_pos; folded_len = 0; /* Fetch until we have enough characters. */ while (pos < end_fetch && folded_len < len) { int count; int i; count = full_case_fold(char_at(text, pos), codepoints); for (i = 0; i < count; i++) { Py_UCS4 ch; ch = codepoints[i]; set_char_at(folded, folded_len + i, ch); } folded_len += count; ++pos; } /* Do we have an acceptable number? */ if (min_len <= folded_len && folded_len <= len) { status = string_set_contains_ign(state, string_set, folded, 0, folded_len, folded_charsize); if (status == 1) /* Advance past the match. */ state->text_pos = pos; } /* If we got fewer than expected, next time we want still fewer. */ len = RE_MIN(len, folded_len); /* Fetch one fewer next time. */ end_fetch = pos - 1; } re_dealloc(folded); release_GIL(safe_state); return status; error: re_dealloc(folded); release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set, ignoring case. */ Py_LOCAL_INLINE(int) string_set_match_fld_rev(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t buf_size; Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* (*point_to)(void* text, Py_ssize_t pos); void* folded; PyObject* string_set; int status; Py_ssize_t end_fetch; Py_ssize_t len; Py_UCS4 codepoints[RE_MAX_FOLDED]; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->text_pos - state->slice_start; if ((Py_ssize_t)possible_unfolded_length(min_len) > available) /* Too few characters for any match. */ return 0; char_at = state->char_at; text = state->text; text_pos = state->text_pos; encoding = state->encoding; full_case_fold = encoding->full_case_fold; /* The folded string will have the same width as the original string. */ folded_charsize = state->charsize; switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; point_to = bytes1_point_to; break; case 2: set_char_at = bytes2_set_char_at; point_to = bytes2_point_to; break; case 4: set_char_at = bytes4_set_char_at; point_to = bytes4_point_to; break; default: return 0; } acquire_GIL(safe_state); /* Allocate a buffer for the folded string, plus a little extra. */ buf_size = max_len + RE_MAX_FOLDED; folded = re_alloc(buf_size * folded_charsize); if (!folded) goto error; /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ end_fetch = text_pos - max_len; for (len = max_len; status == 0 && len >= min_len; len--) { Py_ssize_t pos; int folded_len; pos = text_pos; folded_len = 0; /* Fetch until we have enough characters. */ while (pos > end_fetch && folded_len < len) { int count; int i; count = full_case_fold(char_at(text, pos - 1), codepoints); folded_len += count; for (i = 0; i < count; i++) { Py_UCS4 ch; ch = codepoints[i]; set_char_at(folded, buf_size - folded_len + i, ch); } --pos; } /* Do we have an acceptable number? */ if (min_len <= folded_len && folded_len <= len) { status = string_set_contains_ign(state, string_set, point_to(folded, buf_size - len), 0, folded_len, folded_charsize); if (status == 1) /* Advance past the match. */ state->text_pos = pos; } /* If we got fewer than expected, next time we want still fewer. */ len = RE_MIN(len, folded_len); /* Fetch one fewer next time. */ end_fetch = pos + 1; } re_dealloc(folded); release_GIL(safe_state); return status; error: re_dealloc(folded); release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set, ignoring case, for a forwards search. */ Py_LOCAL_INLINE(int) string_set_match_ign(RE_SafeState* safe_state, RE_Node* node) { return string_set_match_ign_fwdrev(safe_state, node, FALSE); } /* Tries to match a string at the current position with a member of a string * set, ignoring case, for a reverse search. */ Py_LOCAL_INLINE(int) string_set_match_ign_rev(RE_SafeState* safe_state, RE_Node* node) { return string_set_match_ign_fwdrev(safe_state, node, TRUE); } /* Tries to match a string at the current position with a member of a string * set. */ Py_LOCAL_INLINE(int) string_set_match_rev(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; void* (*point_to)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; PyObject* string_set; int status; Py_ssize_t len; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->text_pos - state->slice_start; if (min_len > available) /* Too few characters for any match. */ return 0; max_len = RE_MIN(max_len, available); point_to = state->point_to; text = state->text; text_pos = state->text_pos; acquire_GIL(safe_state); /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ for (len = max_len; status == 0 && len >= min_len; len--) { PyObject* string; if (state->is_unicode) string = build_unicode_value(point_to(text, text_pos - len), len, state->charsize); else string = build_bytes_value(point_to(text, text_pos - len), len, state->charsize); if (!string) goto error; status = PySet_Contains(string_set, string); Py_DECREF(string); if (status == 1) /* Advance past the match. */ state->text_pos -= len; } release_GIL(safe_state); return status; error: release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Checks whether any additional fuzzy error is permitted. */ Py_LOCAL_INLINE(BOOL) any_error_permitted(RE_State* state) { RE_FuzzyInfo* fuzzy_info; RE_CODE* values; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; return fuzzy_info->total_cost <= values[RE_FUZZY_VAL_MAX_COST] && fuzzy_info->counts[RE_FUZZY_ERR] < values[RE_FUZZY_VAL_MAX_ERR] && state->total_cost <= state->max_cost; } /* Checks whether this additional fuzzy error is permitted. */ Py_LOCAL_INLINE(BOOL) this_error_permitted(RE_State* state, int fuzzy_type) { RE_FuzzyInfo* fuzzy_info; RE_CODE* values; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; return fuzzy_info->total_cost + values[RE_FUZZY_VAL_COST_BASE + fuzzy_type] <= values[RE_FUZZY_VAL_MAX_COST] && fuzzy_info->counts[fuzzy_type] < values[RE_FUZZY_VAL_MAX_BASE + fuzzy_type] && state->total_cost + values[RE_FUZZY_VAL_COST_BASE + fuzzy_type] <= state->max_cost; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_one(RE_State* state, RE_FuzzyData* data) { Py_ssize_t new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_node = data->new_node->next_1.node; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_text_pos + data->step; if (data->permit_insertion && state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_text_pos + data->step; if (state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; data->new_node = data->new_node->next_1.node; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a single-character item. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_one(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *node = NULL; return TRUE; } data.new_text_pos = *text_pos; data.new_node = *node; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_one(state, &data)) goto found; } *node = NULL; return TRUE; found: if (!add_backtrack(safe_state, (*node)->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_one.position.text_pos = *text_pos; bt_data->fuzzy_one.position.node = *node; bt_data->fuzzy_one.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_one.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } /* Retries a fuzzy match of a single-character item. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_one(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; data.new_text_pos = bt_data->fuzzy_one.position.text_pos; data.new_node = bt_data->fuzzy_one.position.node; data.fuzzy_type = bt_data->fuzzy_one.fuzzy_type; data.step = bt_data->fuzzy_one.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_one(state, &data)) goto found; } discard_backtrack(state); *node = NULL; return TRUE; found: bt_data->fuzzy_one.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_zero(RE_State* state, RE_FuzzyData* data) { if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_node = data->new_node->next_1.node; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ if (data->permit_insertion && data->new_text_pos != data->limit) { data->new_text_pos += data->step; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ if (data->new_text_pos != data->limit) { data->new_node = data->new_node->next_1.node; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a zero-width item. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_zero(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *node = NULL; return TRUE; } data.new_text_pos = *text_pos; data.new_node = *node; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; if (data.new_node->status & RE_STATUS_REVERSE) { data.step = -1; data.limit = state->slice_start; } else { data.step = 1; data.limit = state->slice_end; } /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_zero(state, &data)) goto found; } *node = NULL; return TRUE; found: if (!add_backtrack(safe_state, (*node)->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_zero.position.text_pos = *text_pos; bt_data->fuzzy_zero.position.node = *node; bt_data->fuzzy_zero.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } /* Retries a fuzzy match of a zero-width item. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_zero(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; data.new_text_pos = bt_data->fuzzy_zero.position.text_pos; data.new_node = bt_data->fuzzy_zero.position.node; data.fuzzy_type = bt_data->fuzzy_zero.fuzzy_type; if (data.new_node->status & RE_STATUS_REVERSE) { data.step = -1; data.limit = state->slice_start; } else { data.step = 1; data.limit = state->slice_end; } if (data.fuzzy_type >= 0) { --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; } /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_zero(state, &data)) goto found; } discard_backtrack(state); *node = NULL; return TRUE; found: bt_data->fuzzy_zero.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } /* Tries a fuzzy insertion. */ Py_LOCAL_INLINE(BOOL) fuzzy_insert(RE_SafeState* safe_state, Py_ssize_t text_pos, RE_Node* node) { RE_State* state; RE_BacktrackData* bt_data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; state = safe_state->re_state; /* No insertion or deletion. */ if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_insert.position.text_pos = text_pos; bt_data->fuzzy_insert.position.node = node; bt_data->fuzzy_insert.count = 0; bt_data->fuzzy_insert.too_few_errors = state->too_few_errors; bt_data->fuzzy_insert.fuzzy_node = node; /* END_FUZZY node. */ /* Check whether there are too few errors. */ fuzzy_info = &state->fuzzy_info; /* The node in this case is the END_FUZZY node. */ values = node->values; if (fuzzy_info->counts[RE_FUZZY_DEL] < values[RE_FUZZY_VAL_MIN_DEL] || fuzzy_info->counts[RE_FUZZY_INS] < values[RE_FUZZY_VAL_MIN_INS] || fuzzy_info->counts[RE_FUZZY_SUB] < values[RE_FUZZY_VAL_MIN_SUB] || fuzzy_info->counts[RE_FUZZY_ERR] < values[RE_FUZZY_VAL_MIN_ERR]) state->too_few_errors = TRUE; return TRUE; } /* Retries a fuzzy insertion. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_insert(RE_SafeState* safe_state, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyInfo* fuzzy_info; RE_BacktrackData* bt_data; Py_ssize_t new_text_pos; RE_Node* new_node; int step; Py_ssize_t limit; RE_Node* fuzzy_node; RE_CODE* values; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; new_text_pos = bt_data->fuzzy_insert.position.text_pos; new_node = bt_data->fuzzy_insert.position.node; if (new_node->status & RE_STATUS_REVERSE) { step = -1; limit = state->slice_start; } else { step = 1; limit = state->slice_end; } /* Could the character at text_pos have been inserted? */ if (!this_error_permitted(state, RE_FUZZY_INS) || new_text_pos == limit) { Py_ssize_t count; count = bt_data->fuzzy_insert.count; fuzzy_info->counts[RE_FUZZY_INS] -= count; fuzzy_info->counts[RE_FUZZY_ERR] -= count; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_INS_COST] * count; state->total_errors -= count; state->total_cost -= values[RE_FUZZY_VAL_INS_COST] * count; state->too_few_errors = bt_data->fuzzy_insert.too_few_errors; discard_backtrack(state); *node = NULL; return TRUE; } ++bt_data->fuzzy_insert.count; ++fuzzy_info->counts[RE_FUZZY_INS]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_INS_COST]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_INS_COST]; /* Check whether there are too few errors. */ state->too_few_errors = bt_data->fuzzy_insert.too_few_errors; fuzzy_node = bt_data->fuzzy_insert.fuzzy_node; /* END_FUZZY node. */ values = fuzzy_node->values; if (fuzzy_info->counts[RE_FUZZY_DEL] < values[RE_FUZZY_VAL_MIN_DEL] || fuzzy_info->counts[RE_FUZZY_INS] < values[RE_FUZZY_VAL_MIN_INS] || fuzzy_info->counts[RE_FUZZY_SUB] < values[RE_FUZZY_VAL_MIN_SUB] || fuzzy_info->counts[RE_FUZZY_ERR] < values[RE_FUZZY_VAL_MIN_ERR]) state->too_few_errors = TRUE; *text_pos = new_text_pos + step * bt_data->fuzzy_insert.count; *node = new_node; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_string(RE_State* state, RE_FuzzyData* data) { Py_ssize_t new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_string_pos += data->step; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_text_pos + data->step; if (data->permit_insertion && state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_text_pos + data->step; if (state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; data->new_string_pos += data->step; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a string. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_string(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, BOOL* matched, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *matched = FALSE; return TRUE; } data.new_text_pos = *text_pos; data.new_string_pos = *string_pos; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string(state, &data)) goto found; } *matched = FALSE; return TRUE; found: if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_string.position.text_pos = *text_pos; bt_data->fuzzy_string.position.node = node; bt_data->fuzzy_string.string_pos = *string_pos; bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_string.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *string_pos = data.new_string_pos; *matched = TRUE; return TRUE; } /* Retries a fuzzy match of a string. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_string(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, Py_ssize_t* string_pos, BOOL* matched) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; RE_Node* new_node; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; data.new_text_pos = bt_data->fuzzy_string.position.text_pos; new_node = bt_data->fuzzy_string.position.node; data.new_string_pos = bt_data->fuzzy_string.string_pos; data.fuzzy_type = bt_data->fuzzy_string.fuzzy_type; data.step = bt_data->fuzzy_string.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string(state, &data)) goto found; } discard_backtrack(state); *matched = FALSE; return TRUE; found: bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = new_node; *string_pos = data.new_string_pos; *matched = TRUE; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_string_fld(RE_State* state, RE_FuzzyData* data) { int new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_string_pos += data->step; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_folded_pos + data->step; if (data->permit_insertion && 0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_folded_pos + data->step; if (0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; data->new_string_pos += data->step; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a string, ignoring case. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_string_fld(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, int* folded_pos, int folded_len, BOOL* matched, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; Py_ssize_t new_text_pos; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *matched = FALSE; return TRUE; } new_text_pos = *text_pos; data.new_string_pos = *string_pos; data.new_folded_pos = *folded_pos; data.folded_len = folded_len; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor; if (step > 0) data.permit_insertion |= data.new_folded_pos != 0; else data.permit_insertion |= data.new_folded_pos != folded_len; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld(state, &data)) goto found; } *matched = FALSE; return TRUE; found: if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_string.position.text_pos = *text_pos; bt_data->fuzzy_string.position.node = node; bt_data->fuzzy_string.string_pos = *string_pos; bt_data->fuzzy_string.folded_pos = (RE_INT8)(*folded_pos); bt_data->fuzzy_string.folded_len = (RE_INT8)folded_len; bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_string.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *string_pos = data.new_string_pos; *folded_pos = data.new_folded_pos; *matched = TRUE; return TRUE; } /* Retries a fuzzy match of a string, ignoring case. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_string_fld(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, Py_ssize_t* string_pos, int* folded_pos, BOOL* matched) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; Py_ssize_t new_text_pos; RE_Node* new_node; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; new_text_pos = bt_data->fuzzy_string.position.text_pos; new_node = bt_data->fuzzy_string.position.node; data.new_string_pos = bt_data->fuzzy_string.string_pos; data.new_folded_pos = bt_data->fuzzy_string.folded_pos; data.folded_len = bt_data->fuzzy_string.folded_len; data.fuzzy_type = bt_data->fuzzy_string.fuzzy_type; data.step = bt_data->fuzzy_string.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor; if (data.step > 0) data.permit_insertion |= data.new_folded_pos != 0; else data.permit_insertion |= data.new_folded_pos != bt_data->fuzzy_string.folded_len; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld(state, &data)) goto found; } discard_backtrack(state); *matched = FALSE; return TRUE; found: bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *node = new_node; *string_pos = data.new_string_pos; *folded_pos = data.new_folded_pos; *matched = TRUE; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_string_fld2(RE_State* state, RE_FuzzyData* data) { int new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_gfolded_pos += data->step; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_folded_pos + data->step; if (data->permit_insertion && 0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_folded_pos + data->step; if (0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; data->new_gfolded_pos += data->step; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a group reference, ignoring case. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_string_fld2(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, int* folded_pos, int folded_len, Py_ssize_t* group_pos, int* gfolded_pos, int gfolded_len, BOOL* matched, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; Py_ssize_t new_text_pos; Py_ssize_t new_group_pos; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *matched = FALSE; return TRUE; } new_text_pos = *text_pos; data.new_folded_pos = *folded_pos; data.folded_len = folded_len; new_group_pos = *group_pos; data.new_gfolded_pos = *gfolded_pos; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor; if (step > 0) data.permit_insertion |= data.new_folded_pos != 0; else data.permit_insertion |= data.new_folded_pos != folded_len; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld2(state, &data)) goto found; } *matched = FALSE; return TRUE; found: if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_string.position.text_pos = *text_pos; bt_data->fuzzy_string.position.node = node; bt_data->fuzzy_string.string_pos = *group_pos; bt_data->fuzzy_string.folded_pos = (RE_INT8)(*folded_pos); bt_data->fuzzy_string.folded_len = (RE_INT8)folded_len; bt_data->fuzzy_string.gfolded_pos = (RE_INT8)(*gfolded_pos); bt_data->fuzzy_string.gfolded_len = (RE_INT8)gfolded_len; bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_string.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *group_pos = new_group_pos; *folded_pos = data.new_folded_pos; *gfolded_pos = data.new_gfolded_pos; *matched = TRUE; return TRUE; } /* Retries a fuzzy match of a group reference, ignoring case. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_string_fld2(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, int* folded_pos, Py_ssize_t* group_pos, int* gfolded_pos, BOOL* matched) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; Py_ssize_t new_text_pos; Py_ssize_t new_group_pos; RE_Node* new_node; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; new_text_pos = bt_data->fuzzy_string.position.text_pos; new_node = bt_data->fuzzy_string.position.node; new_group_pos = bt_data->fuzzy_string.string_pos; data.new_folded_pos = bt_data->fuzzy_string.folded_pos; data.folded_len = bt_data->fuzzy_string.folded_len; data.new_gfolded_pos = bt_data->fuzzy_string.gfolded_pos; data.fuzzy_type = bt_data->fuzzy_string.fuzzy_type; data.step = bt_data->fuzzy_string.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor || data.new_folded_pos != bt_data->fuzzy_string.folded_len; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld2(state, &data)) goto found; } discard_backtrack(state); *matched = FALSE; return TRUE; found: bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *node = new_node; *group_pos = new_group_pos; *folded_pos = data.new_folded_pos; *gfolded_pos = data.new_gfolded_pos; *matched = TRUE; return TRUE; } /* Locates the required string, if there's one. */ Py_LOCAL_INLINE(Py_ssize_t) locate_required_string(RE_SafeState* safe_state) { RE_State* state; PatternObject* pattern; Py_ssize_t found_pos; Py_ssize_t end_pos; state = safe_state->re_state; pattern = state->pattern; /* We haven't matched the required string yet. */ state->req_pos = -1; if (!pattern->req_string) /* There isn't a required string, so start matching from the current * position. */ return state->text_pos; /* Search for the required string and calculate where to start matching. */ switch (pattern->req_string->op) { case RE_OP_STRING: found_pos = string_search(safe_state, pattern->req_string, state->text_pos, state->slice_end); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos + pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos -= pattern->req_offset; if (found_pos >= state->text_pos) return found_pos; } break; case RE_OP_STRING_FLD: found_pos = string_search_fld(safe_state, pattern->req_string, state->text_pos, state->slice_end, &end_pos); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = end_pos; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos -= pattern->req_offset; if (found_pos >= state->text_pos) return found_pos; } break; case RE_OP_STRING_FLD_REV: found_pos = string_search_fld_rev(safe_state, pattern->req_string, state->text_pos, state->slice_start, &end_pos); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = end_pos; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos += pattern->req_offset; if (found_pos <= state->text_pos) return found_pos; } break; case RE_OP_STRING_IGN: found_pos = string_search_ign(safe_state, pattern->req_string, state->text_pos, state->slice_end); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos + pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos -= pattern->req_offset; if (found_pos >= state->text_pos) return found_pos; } break; case RE_OP_STRING_IGN_REV: found_pos = string_search_ign_rev(safe_state, pattern->req_string, state->text_pos, state->slice_start); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos - pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos += pattern->req_offset; if (found_pos <= state->text_pos) return found_pos; } break; case RE_OP_STRING_REV: found_pos = string_search_rev(safe_state, pattern->req_string, state->text_pos, state->slice_start); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos - pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos += pattern->req_offset; if (found_pos <= state->text_pos) return found_pos; } break; } /* Start matching from the current position. */ return state->text_pos; } /* Performs a depth-first match or search from the context. */ Py_LOCAL_INLINE(int) basic_match(RE_SafeState* safe_state, RE_Node* start_node, BOOL search, BOOL recursive_call) { RE_State* state; Py_ssize_t slice_start; Py_ssize_t slice_end; Py_ssize_t text_pos; RE_EncodingTable* encoding; PatternObject* pattern; Py_ssize_t text_length; RE_NextNode start_pair; void* text; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); Py_ssize_t pattern_step; /* The overall step of the pattern (forwards or backwards). */ Py_ssize_t string_pos; BOOL do_search_start; Py_ssize_t found_pos; int folded_pos; int gfolded_pos; RE_Node* node; TRACE(("<>\n")) state = safe_state->re_state; slice_start = state->slice_start; slice_end = state->slice_end; text_pos = state->text_pos; encoding = state->encoding; pattern = state->pattern; text_length = state->text_length; /* Look beyond any initial group node. */ start_pair.node = start_node; if (recursive_call) start_pair.test = locate_test_start(start_node); else start_pair.test = pattern->start_test; /* Is the pattern anchored to the start or end of the string? */ switch (start_pair.test->op) { case RE_OP_END_OF_STRING: if (state->reverse) { /* Searching backwards. */ if (text_pos != text_length) return RE_ERROR_FAILURE; /* Don't bother to search further because it's anchored. */ search = FALSE; } break; case RE_OP_START_OF_STRING: if (!state->reverse) { /* Searching forwards. */ if (text_pos != 0) return RE_ERROR_FAILURE; /* Don't bother to search further because it's anchored. */ search = FALSE; } break; } text = state->text; char_at = state->char_at; has_property = encoding->has_property; pattern_step = state->reverse ? -1 : 1; string_pos = -1; do_search_start = pattern->do_search_start; /* Add a backtrack entry for failure. */ if (!add_backtrack(safe_state, RE_OP_FAILURE)) return RE_ERROR_BACKTRACKING; start_match: /* If we're searching, advance along the string until there could be a * match. */ if (pattern->pattern_call_ref >= 0) { RE_GuardList* guard_list; guard_list = &state->group_call_guard_list[pattern->pattern_call_ref]; guard_list->count = 0; guard_list->last_text_pos = -1; } /* Locate the required string, if there's one, unless this is a recursive * call of 'basic_match'. */ if (!pattern->req_string || recursive_call) found_pos = state->text_pos; else { found_pos = locate_required_string(safe_state); if (found_pos < 0) return RE_ERROR_FAILURE; } if (search) { state->text_pos = found_pos; if (do_search_start) { RE_Position new_position; next_match_1: /* 'search_start' will clear 'do_search_start' if it can't perform * a fast search for the next possible match. This enables us to * avoid the overhead of the call subsequently. */ if (!search_start(safe_state, &start_pair, &new_position, 0)) return RE_ERROR_FAILURE; node = new_position.node; text_pos = new_position.text_pos; if (node->op == RE_OP_SUCCESS) { /* Must the match advance past its start? */ if (text_pos != state->search_anchor || !state->must_advance) { state->text_pos = text_pos; return RE_ERROR_SUCCESS; } state->text_pos = state->match_pos + pattern_step; goto next_match_1; } /* 'do_search_start' may have been cleared. */ do_search_start = pattern->do_search_start; } else { /* Avoiding 'search_start', which we've found can't perform a fast * search for the next possible match. */ node = start_node; text_pos = state->text_pos; next_match_2: if (state->reverse) { if (text_pos < slice_start) return RE_ERROR_FAILURE; } else { if (text_pos > slice_end) return RE_ERROR_FAILURE; } state->match_pos = text_pos; if (node->op == RE_OP_SUCCESS) { /* Must the match advance past its start? */ if (text_pos != state->search_anchor || !state->must_advance) { BOOL success; if (state->match_all && !recursive_call) { /* We want to match all of the slice. */ if (state->reverse) success = text_pos == slice_start; else success = text_pos == slice_end; } else success = TRUE; if (success) { state->text_pos = text_pos; return RE_ERROR_SUCCESS; } } text_pos = state->match_pos + pattern_step; goto next_match_2; } } } else { /* The start position is anchored to the current position. */ if (found_pos != state->text_pos) return RE_ERROR_FAILURE; node = start_node; } advance: /* The main matching loop. */ for (;;) { TRACE(("%d|", text_pos)) /* Should we abort the matching? */ ++state->iterations; if (state->iterations == 0 && safe_check_signals(safe_state)) return RE_ERROR_INTERRUPTED; switch (node->op) { case RE_OP_ANY: /* Any character, except a newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos < slice_end && char_at(text, text_pos) != '\n') { ++text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_ALL: /* Any character at all. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos < slice_end) { ++text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_ALL_REV: /* Any character at all backwards. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos > slice_start) { --text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_REV: /* Any character backwards, except a newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos > slice_start && char_at(text, text_pos - 1) != '\n') { --text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_U: /* Any character, except a line separator. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos < slice_end && !state->encoding->is_line_sep(char_at(text, text_pos))) { ++text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_U_REV: /* Any character backwards, except a line separator. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos > slice_start && !state->encoding->is_line_sep(char_at(text, text_pos - 1))) { --text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ATOMIC: /* Atomic subpattern. */ { RE_Info info; int status; TRACE(("%s\n", re_op_text[node->op])) if (!add_backtrack(safe_state, RE_OP_ATOMIC)) return RE_ERROR_BACKTRACKING; state->backtrack->atomic.too_few_errors = state->too_few_errors; state->backtrack->atomic.capture_change = state->capture_change; /* Save the groups. */ if (!push_groups(safe_state)) return RE_ERROR_MEMORY; save_info(state, &info); state->text_pos = text_pos; state->must_advance = FALSE; status = basic_match(safe_state, node->nonstring.next_2.node, FALSE, TRUE); if (status < 0) return status; reset_guards(state, node->values); restore_info(state, &info); if (status != RE_ERROR_SUCCESS) goto backtrack; node = node->next_1.node; text_pos = state->text_pos; break; } case RE_OP_BOUNDARY: /* At a word boundary. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_boundary(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_BRANCH: /* 2-way branch. */ { RE_Position next_position; TRACE(("%s\n", re_op_text[node->op])) if (try_match(state, &node->next_1, text_pos, &next_position)) { if (!add_backtrack(safe_state, RE_OP_BRANCH)) return RE_ERROR_BACKTRACKING; state->backtrack->branch.position.node = node->nonstring.next_2.node; state->backtrack->branch.position.text_pos = text_pos; node = next_position.node; text_pos = next_position.text_pos; } else node = node->nonstring.next_2.node; break; } case RE_OP_CALL_REF: /* A group call reference. */ { TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) if (!push_group_return(safe_state, NULL)) return RE_ERROR_MEMORY; if (!add_backtrack(safe_state, RE_OP_CALL_REF)) return RE_ERROR_BACKTRACKING; node = node->next_1.node; break; } case RE_OP_CHARACTER: /* A character literal. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && (char_at(text, text_pos) == node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && same_char_ign(encoding, char_at(text, text_pos), node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_CHARACTER_IGN_REV: /* A character literal backwards, ignoring case. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && same_char_ign(encoding, char_at(text, text_pos - 1), node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_CHARACTER_REV: /* A character literal backwards. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && (char_at(text, text_pos - 1) == node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_default_boundary(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_default_word_end(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_default_word_start(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_FUZZY: /* End of fuzzy matching. */ TRACE(("%s\n", re_op_text[node->op])) if (!fuzzy_insert(safe_state, text_pos, node)) return RE_ERROR_BACKTRACKING; /* If there were too few errors, in the fuzzy section, try again. */ if (state->too_few_errors) { state->too_few_errors = FALSE; goto backtrack; } node = node->next_1.node; break; case RE_OP_END_GREEDY_REPEAT: /* End of a greedy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; BOOL changed; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* The body has matched successfully at this position. */ if (!guard_repeat(safe_state, index, rp_data->start, RE_STATUS_BODY, FALSE)) return RE_ERROR_MEMORY; ++rp_data->count; /* Have we advanced through the text or has a capture group change? */ changed = rp_data->capture_change != state->capture_change || text_pos != rp_data->start; /* The counts are of type size_t, so the format needs to specify * that. */ TRACE(("min is %" PY_FORMAT_SIZE_T "u, max is %" PY_FORMAT_SIZE_T "u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ try_body = changed && (rp_data->count < node->values[2] || ~node->values[2] == 0) && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = (!changed || rp_data->count >= node->values[1]) && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_TAIL) && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) { /* Neither the body nor the tail could match. */ --rp_data->count; goto backtrack; } /* Record info in case we backtrack into the body. */ if (!add_backtrack(safe_state, RE_OP_BODY_END)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count - 1; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the body * takes precedence. If the body fails to match then we * want to try the tail before backtracking further. */ /* Record backtracking info for matching the tail. */ if (!add_backtrack(safe_state, RE_OP_MATCH_TAIL)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_tail_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; } /* Record backtracking info in case the body fails to match. */ if (!add_backtrack(safe_state, RE_OP_BODY_START)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.text_pos = text_pos; rp_data->capture_change = state->capture_change; rp_data->start = text_pos; /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_END_GROUP: /* End of a capture group. */ { RE_CODE private_index; RE_CODE public_index; RE_GroupData* group; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[1])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). */ private_index = node->values[0]; public_index = node->values[1]; group = &state->groups[private_index - 1]; if (!add_backtrack(safe_state, RE_OP_END_GROUP)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->group.private_index = private_index; bt_data->group.public_index = public_index; bt_data->group.text_pos = group->span.end; bt_data->group.capture = (BOOL)node->values[2]; bt_data->group.current_capture = group->current_capture; if (pattern->group_info[private_index - 1].referenced && group->span.end != text_pos) ++state->capture_change; group->span.end = text_pos; /* Save the capture? */ if (node->values[2]) { group->current_capture = group->capture_count; if (!save_capture(safe_state, private_index, public_index)) return RE_ERROR_MEMORY; } node = node->next_1.node; break; } case RE_OP_END_LAZY_REPEAT: /* End of a lazy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; BOOL changed; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* The body has matched successfully at this position. */ if (!guard_repeat(safe_state, index, rp_data->start, RE_STATUS_BODY, FALSE)) return RE_ERROR_MEMORY; ++rp_data->count; /* Have we advanced through the text or has a capture group change? */ changed = rp_data->capture_change != state->capture_change || text_pos != rp_data->start; /* The counts are of type size_t, so the format needs to specify * that. */ TRACE(("min is %" PY_FORMAT_SIZE_T "u, max is %" PY_FORMAT_SIZE_T "u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ try_body = changed && (rp_data->count < node->values[2] || ~node->values[2] == 0) && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = (!changed || rp_data->count >= node->values[1]) && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) { /* Neither the body nor the tail could match. */ --rp_data->count; goto backtrack; } /* Record info in case we backtrack into the body. */ if (!add_backtrack(safe_state, RE_OP_BODY_END)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count - 1; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the tail * takes precedence. If the tail fails to match then we * want to try the body before backtracking further. */ /* Record backtracking info for matching the body. */ if (!add_backtrack(safe_state, RE_OP_MATCH_BODY)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_body_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } else { /* Only the body could match. */ /* Record backtracking info in case the body fails to * match. */ if (!add_backtrack(safe_state, RE_OP_BODY_START)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.text_pos = text_pos; rp_data->capture_change = state->capture_change; rp_data->start = text_pos; /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_END_OF_LINE: /* At the end of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length || char_at(text, text_pos) == '\n') node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_LINE_U: /* At the end of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (encoding->at_line_end(state, text_pos)) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_STRING: /* At the end of the string. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_STRING_LINE: /* At end of string or final newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length || text_pos == state->final_newline) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_STRING_LINE_U: /* At end of string or final newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length || text_pos == state->final_line_sep) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_WORD: /* At end of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_word_end(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_FUZZY: /* Fuzzy matching. */ { RE_FuzzyInfo* fuzzy_info; RE_BacktrackData* bt_data; TRACE(("%s\n", re_op_text[node->op])) fuzzy_info = &state->fuzzy_info; /* Save the current fuzzy info. */ if (!add_backtrack(safe_state, RE_OP_FUZZY)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; memmove(&bt_data->fuzzy.fuzzy_info, fuzzy_info, sizeof(RE_FuzzyInfo)); bt_data->fuzzy.index = node->values[0]; bt_data->fuzzy.text_pos = text_pos; /* Initialise the new fuzzy info. */ memset(fuzzy_info->counts, 0, 4 * sizeof(fuzzy_info->counts[0])); fuzzy_info->total_cost = 0; fuzzy_info->node = node; node = node->next_1.node; break; } case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_grapheme_boundary(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_GREEDY_REPEAT: /* Greedy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; RE_BacktrackData* bt_data; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* We might need to backtrack into the head, so save the current * repeat. */ if (!add_backtrack(safe_state, RE_OP_GREEDY_REPEAT)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Initialise the new repeat. */ rp_data->count = 0; rp_data->start = text_pos; rp_data->capture_change = state->capture_change; /* Could the body or tail match? */ try_body = node->values[2] > 0 && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = node->values[1] == 0 && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) /* Neither the body nor the tail could match. */ goto backtrack; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the body * takes precedence. If the body fails to match then we * want to try the tail before backtracking further. */ /* Record backtracking info for matching the tail. */ if (!add_backtrack(safe_state, RE_OP_MATCH_TAIL)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_tail_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; } /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_GREEDY_REPEAT_ONE: /* Greedy repeat for one character. */ { RE_CODE index; RE_RepeatData* rp_data; size_t count; BOOL match; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; if (is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY)) goto backtrack; /* Count how many times the character repeats, up to the maximum. */ count = count_one(state, node->nonstring.next_2.node, text_pos, (size_t)node->values[2]); /* Unmatch until it's not guarded. */ match = FALSE; for (;;) { if (count < node->values[1]) /* The number of repeats is below the minimum. */ break; if (!is_repeat_guarded(safe_state, index, text_pos + (Py_ssize_t)count * node->step, RE_STATUS_TAIL)) { /* It's not guarded at this position. */ match = TRUE; break; } if (count == 0) break; --count; } if (!match) { /* The repeat has failed to match at this position. */ if (!guard_repeat(safe_state, index, text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; goto backtrack; } /* Record the backtracking info. */ if (!add_backtrack(safe_state, RE_OP_GREEDY_REPEAT_ONE)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position.node = node; bt_data->repeat.index = index; bt_data->repeat.text_pos = rp_data->start; bt_data->repeat.count = rp_data->count; rp_data->start = text_pos; rp_data->count = count; /* Advance into the tail. */ text_pos += (Py_ssize_t)count * node->step; node = node->next_1.node; break; } case RE_OP_GROUP_CALL: /* Group call. */ { RE_CODE index; Py_ssize_t g; Py_ssize_t r; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) index = node->values[0]; /* Save the capture groups and repeat guards. */ if (!push_group_return(safe_state, node->next_1.node)) return RE_ERROR_MEMORY; /* Clear the capture groups for the group call. They'll be restored * on return. */ for (g = 0; g < state->pattern->true_group_count; g++) { RE_GroupData* group; group = &state->groups[g]; group->span.start = -1; group->span.end = -1; group->current_capture = -1; } /* Clear the repeat guards for the group call. They'll be restored * on return. */ for (r = 0; r < state->pattern->repeat_count; r++) { RE_RepeatData* repeat; repeat = &state->repeats[r]; repeat->body_guard_list.count = 0; repeat->body_guard_list.last_text_pos = -1; repeat->tail_guard_list.count = 0; repeat->tail_guard_list.last_text_pos = -1; } /* Call a group, skipping its CALL_REF node. */ node = pattern->call_ref_info[index].node->next_1.node; if (!add_backtrack(safe_state, RE_OP_GROUP_CALL)) return RE_ERROR_BACKTRACKING; break; } case RE_OP_GROUP_EXISTS: /* Capture group exists. */ { RE_GroupData* group; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ group = &state->groups[node->values[0] - 1]; if (group->current_capture >= 0) node = node->next_1.node; else node = node->nonstring.next_2.node; break; } case RE_OP_GROUP_RETURN: /* Group return. */ { RE_Node* return_node; RE_BacktrackData* bt_data; TRACE(("%s\n", re_op_text[node->op])) return_node = top_group_return(state); if (!add_backtrack(safe_state, RE_OP_GROUP_RETURN)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->group_call.node = return_node; bt_data->group_call.capture_change = state->capture_change; if (return_node) { /* The group was called. */ node = return_node; /* Save the groups. */ if (!push_groups(safe_state)) return RE_ERROR_MEMORY; /* Save the repeats. */ if (!push_repeats(safe_state)) return RE_ERROR_MEMORY; } else /* The group was not called. */ node = node->next_1.node; pop_group_return(state); break; } case RE_OP_LAZY_REPEAT: /* Lazy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; RE_BacktrackData* bt_data; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* We might need to backtrack into the head, so save the current * repeat. */ if (!add_backtrack(safe_state, RE_OP_LAZY_REPEAT)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Initialise the new repeat. */ rp_data->count = 0; rp_data->start = text_pos; rp_data->capture_change = state->capture_change; /* Could the body or tail match? */ try_body = node->values[2] > 0 && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = node->values[1] == 0 && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) /* Neither the body nor the tail could match. */ goto backtrack; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the tail * takes precedence. If the tail fails to match then we * want to try the body before backtracking further. */ /* Record backtracking info for matching the tail. */ if (!add_backtrack(safe_state, RE_OP_MATCH_BODY)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_body_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } else { /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_LAZY_REPEAT_ONE: /* Lazy repeat for one character. */ { RE_CODE index; RE_RepeatData* rp_data; size_t count; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; if (is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY)) goto backtrack; /* Count how many times the character repeats, up to the minimum. */ count = count_one(state, node->nonstring.next_2.node, text_pos, (size_t)node->values[1]); /* Have we matched at least the minimum? */ if (count < node->values[1]) { /* The repeat has failed to match at this position. */ if (!guard_repeat(safe_state, index, text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; goto backtrack; } if (count < node->values[2]) { /* The match is shorter than the maximum, so we might need to * backtrack the repeat to consume more. */ RE_BacktrackData* bt_data; /* Get the offset to the repeat values in the context. */ rp_data = &state->repeats[index]; if (!add_backtrack(safe_state, RE_OP_LAZY_REPEAT_ONE)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position.node = node; bt_data->repeat.index = index; bt_data->repeat.text_pos = rp_data->start; bt_data->repeat.count = rp_data->count; rp_data->start = text_pos; rp_data->count = count; } /* Advance into the tail. */ text_pos += (Py_ssize_t)count * node->step; node = node->next_1.node; break; } case RE_OP_LOOKAROUND: /* Lookaround. */ { RE_Info info; size_t capture_change; BOOL too_few_errors; int status; TRACE(("%s %d\n", re_op_text[node->op], node->match)) /* Save the groups. */ if (!push_groups(safe_state)) return RE_ERROR_MEMORY; capture_change = state->capture_change; /* Save the other info. */ save_info(state, &info); state->slice_start = 0; state->slice_end = text_length; state->text_pos = text_pos; state->must_advance = FALSE; too_few_errors = state->too_few_errors; status = basic_match(safe_state, node->nonstring.next_2.node, FALSE, TRUE); if (status < 0) return status; reset_guards(state, node->values + 1); state->slice_end = slice_end; state->slice_start = slice_start; /* Restore the other info. */ restore_info(state, &info); if (node->match) { /* It's a positive lookaround. */ if (status == RE_ERROR_SUCCESS) { /* It succeeded, so the groups and certain flags may have * changed. */ if (!add_backtrack(safe_state, RE_OP_LOOKAROUND)) return RE_ERROR_BACKTRACKING; /* We'll restore the groups and flags on backtracking. */ state->backtrack->lookaround.too_few_errors = too_few_errors; state->backtrack->lookaround.capture_change = capture_change; } else { /* It failed, so the groups and certain flags haven't * changed. */ drop_groups(state); goto backtrack; } } else { /* It's a negative lookaround. */ if (status == RE_ERROR_SUCCESS) { /* It succeeded, so the groups and certain flags may have * changed. We need to restore them. */ pop_groups(state); state->too_few_errors = too_few_errors; state->capture_change = capture_change; goto backtrack; } else /* It failed, so the groups and certain flags haven't * changed. */ drop_groups(state); } node = node->next_1.node; break; } case RE_OP_PROPERTY: /* A property. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && has_property(node->values[0], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_PROPERTY_IGN: /* A property, ignoring case. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && has_property_ign(encoding, node->values[0], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_PROPERTY_IGN_REV: /* A property backwards, ignoring case. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && has_property_ign(encoding, node->values[0], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_PROPERTY_REV: /* A property backwards. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && has_property(node->values[0], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE: /* A range. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos < slice_end && in_range(node->values[0], node->values[1], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE_IGN: /* A range, ignoring case. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos < slice_end && in_range_ign(encoding, node->values[0], node->values[1], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE_IGN_REV: /* A range backwards, ignoring case. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos > slice_start && in_range_ign(encoding, node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE_REV: /* A range backwards. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos > slice_start && in_range(node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_REF_GROUP: /* Reference to a capture group. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = state->slice_end - text_pos; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->start; /* Try comparing. */ while (string_pos < span->end) { if (text_pos < slice_end && char_at(text, text_pos) == char_at(text, string_pos)) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_FLD: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); int folded_len; int gfolded_len; Py_UCS4 folded[RE_MAX_FOLDED]; Py_UCS4 gfolded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = span->start; folded_pos = 0; folded_len = 0; gfolded_pos = 0; gfolded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos), folded); gfolded_len = full_case_fold(char_at(text, string_pos), gfolded); } /* Try comparing. */ while (string_pos < span->end) { /* Case-fold at current position in text. */ if (folded_pos >= folded_len) { if (text_pos < slice_end) folded_len = full_case_fold(char_at(text, text_pos), folded); else folded_len = 0; folded_pos = 0; } /* Case-fold at current position in group. */ if (gfolded_pos >= gfolded_len) { gfolded_len = full_case_fold(char_at(text, string_pos), gfolded); gfolded_pos = 0; } if (folded_pos < folded_len && folded[folded_pos] == gfolded[gfolded_pos]) { ++folded_pos; ++gfolded_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld2(safe_state, search, &text_pos, node, &folded_pos, folded_len, &string_pos, &gfolded_pos, gfolded_len, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } if (folded_pos >= folded_len && folded_len > 0) ++text_pos; if (gfolded_pos >= gfolded_len) ++string_pos; } string_pos = -1; if (folded_pos < folded_len || gfolded_pos < gfolded_len) goto backtrack; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_FLD_REV: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); int folded_len; int gfolded_len; Py_UCS4 folded[RE_MAX_FOLDED]; Py_UCS4 gfolded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = span->end; folded_pos = 0; folded_len = 0; gfolded_pos = 0; gfolded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos - 1), folded); gfolded_len = full_case_fold(char_at(text, string_pos - 1), gfolded); } /* Try comparing. */ while (string_pos > span->start) { /* Case-fold at current position in text. */ if (folded_pos <= 0) { if (text_pos > slice_start) folded_len = full_case_fold(char_at(text, text_pos - 1), folded); else folded_len = 0; folded_pos = folded_len; } /* Case-fold at current position in group. */ if (gfolded_pos <= 0) { gfolded_len = full_case_fold(char_at(text, string_pos - 1), gfolded); gfolded_pos = gfolded_len; } if (folded_pos > 0 && folded[folded_pos - 1] == gfolded[gfolded_pos - 1]) { --folded_pos; --gfolded_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld2(safe_state, search, &text_pos, node, &folded_pos, folded_len, &string_pos, &gfolded_pos, gfolded_len, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } if (folded_pos <= 0 && folded_len > 0) --text_pos; if (gfolded_pos <= 0) --string_pos; } string_pos = -1; if (folded_pos > 0 || gfolded_pos > 0) goto backtrack; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_IGN: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = state->slice_end - text_pos; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->start; /* Try comparing. */ while (string_pos < span->end) { if (text_pos < slice_end && same_char_ign(encoding, char_at(text, text_pos), char_at(text, string_pos))) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_IGN_REV: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = text_pos - state->slice_start; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->end; /* Try comparing. */ while (string_pos > span->start) { if (text_pos > slice_start && same_char_ign(encoding, char_at(text, text_pos - 1), char_at(text, string_pos - 1))) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_REV: /* Reference to a capture group. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = text_pos - state->slice_start; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->end; /* Try comparing. */ while (string_pos > span->start) { if (text_pos > slice_start && char_at(text, text_pos - 1) == char_at(text, string_pos - 1)) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) if (text_pos == state->search_anchor) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF: /* Character set. */ case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos < slice_end && in_set(encoding, node, char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos < slice_end && in_set_ign(encoding, node, char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos > slice_start && in_set_ign(encoding, node, char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF_REV: /* Character set. */ case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos > slice_start && in_set(encoding, node, char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_GROUP: /* Start of a capture group. */ { RE_CODE private_index; RE_CODE public_index; RE_GroupData* group; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[1])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). */ private_index = node->values[0]; public_index = node->values[1]; group = &state->groups[private_index - 1]; if (!add_backtrack(safe_state, RE_OP_START_GROUP)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->group.private_index = private_index; bt_data->group.public_index = public_index; bt_data->group.text_pos = group->span.start; bt_data->group.capture = (BOOL)node->values[2]; bt_data->group.current_capture = group->current_capture; if (pattern->group_info[private_index - 1].referenced && group->span.start != text_pos) ++state->capture_change; group->span.start = text_pos; /* Save the capture? */ if (node->values[2]) { group->current_capture = group->capture_count; if (!save_capture(safe_state, private_index, public_index)) return RE_ERROR_MEMORY; } node = node->next_1.node; break; } case RE_OP_START_OF_LINE: /* At the start of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == 0 || char_at(text, text_pos - 1) == '\n') node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_OF_LINE_U: /* At the start of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (encoding->at_line_start(state, text_pos)) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_OF_STRING: /* At the start of the string. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == 0) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_OF_WORD: /* At start of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_word_start(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_STRING: /* A string literal. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = slice_end - text_pos; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = 0; values = node->values; /* Try comparing. */ while (string_pos < length) { if (text_pos < slice_end && char_at(text, text_pos) == values[string_pos]) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); RE_CODE* values; int folded_len; Py_UCS4 folded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = slice_end - text_pos; if ((Py_ssize_t)possible_unfolded_length(length) > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = 0; folded_pos = 0; folded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos), folded); if (folded_pos >= folded_len) { if (text_pos >= slice_end) goto backtrack; ++text_pos; folded_pos = 0; folded_len = 0; } } values = node->values; /* Try comparing. */ while (string_pos < length) { if (folded_pos >= folded_len) { folded_len = full_case_fold(char_at(text, text_pos), folded); folded_pos = 0; } if (same_char_ign(encoding, folded[folded_pos], values[string_pos])) { ++string_pos; ++folded_pos; if (folded_pos >= folded_len) ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos >= folded_len) ++text_pos; } else { string_pos = -1; goto backtrack; } } if (node->status & RE_STATUS_FUZZY) { while (folded_pos < folded_len) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos >= folded_len) ++text_pos; } } string_pos = -1; if (folded_pos < folded_len) goto backtrack; } /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_FLD_REV: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); RE_CODE* values; int folded_len; Py_UCS4 folded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = text_pos - slice_start; if ((Py_ssize_t)possible_unfolded_length(length) > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = length; folded_pos = 0; folded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos - 1), folded); if (folded_pos <= 0) { if (text_pos <= slice_start) goto backtrack; --text_pos; folded_pos = 0; folded_len = 0; } } values = node->values; /* Try comparing. */ while (string_pos > 0) { if (folded_pos <= 0) { folded_len = full_case_fold(char_at(text, text_pos - 1), folded); folded_pos = folded_len; } if (same_char_ign(encoding, folded[folded_pos - 1], values[string_pos - 1])) { --string_pos; --folded_pos; if (folded_pos <= 0) --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos <= 0) --text_pos; } else { string_pos = -1; goto backtrack; } } if (node->status & RE_STATUS_FUZZY) { while (folded_pos > 0) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos <= 0) --text_pos; } } string_pos = -1; if (folded_pos > 0) goto backtrack; } /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = slice_end - text_pos; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = 0; values = node->values; /* Try comparing. */ while (string_pos < length) { if (text_pos < slice_end && same_char_ign(encoding, char_at(text, text_pos), values[string_pos])) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_IGN_REV: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = text_pos - slice_start; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = length; values = node->values; /* Try comparing. */ while (string_pos > 0) { if (text_pos > slice_start && same_char_ign(encoding, char_at(text, text_pos - 1), values[string_pos - 1])) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_REV: /* A string literal. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = text_pos - slice_start; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = length; values = node->values; /* Try comparing. */ while (string_pos > 0) { if (text_pos > slice_start && char_at(text, text_pos - 1) == values[string_pos - 1]) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_SET: /* Member of a string set. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_FLD: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_fld(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_FLD_REV: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_fld_rev(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_IGN: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_ign(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_IGN_REV: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_ign_rev(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_REV: /* Member of a string set. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_rev(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_SUCCESS: /* Success. */ /* Must the match advance past its start? */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == state->search_anchor && state->must_advance) goto backtrack; if (state->match_all && !recursive_call) { /* We want to match all of the slice. */ if (state->reverse) { if (text_pos != slice_start) goto backtrack; } else { if (text_pos != slice_end) goto backtrack; } } state->text_pos = text_pos; return RE_ERROR_SUCCESS; default: /* Illegal opcode! */ TRACE(("UNKNOWN OP %d\n", node->op)) return RE_ERROR_ILLEGAL; } } backtrack: for (;;) { RE_BacktrackData* bt_data; TRACE(("BACKTRACK ")) /* Should we abort the matching? */ ++state->iterations; if (state->iterations == 0 && safe_check_signals(safe_state)) return RE_ERROR_INTERRUPTED; bt_data = last_backtrack(state); switch (bt_data->op) { case RE_OP_ANY: /* Any character, except a newline. */ case RE_OP_ANY_ALL: /* Any character at all. */ case RE_OP_ANY_ALL_REV: /* Any character at all. */ case RE_OP_ANY_REV: /* Any character, except a newline. */ case RE_OP_ANY_U: /* Any character, except a line separator. */ case RE_OP_ANY_U_REV: /* Any character, except a line separator. */ case RE_OP_CHARACTER: /* A character literal. */ case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ case RE_OP_CHARACTER_IGN_REV: /* A character literal, ignoring case. */ case RE_OP_CHARACTER_REV: /* A character literal. */ case RE_OP_PROPERTY: /* A property. */ case RE_OP_PROPERTY_IGN: /* A property, ignoring case. */ case RE_OP_PROPERTY_IGN_REV: /* A property, ignoring case. */ case RE_OP_PROPERTY_REV: /* A property. */ case RE_OP_RANGE: /* A range. */ case RE_OP_RANGE_IGN: /* A range, ignoring case. */ case RE_OP_RANGE_IGN_REV: /* A range, ignoring case. */ case RE_OP_RANGE_REV: /* A range. */ case RE_OP_SET_DIFF: /* Character set. */ case RE_OP_SET_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_DIFF_REV: /* Character set. */ case RE_OP_SET_INTER: /* Character set. */ case RE_OP_SET_INTER_IGN: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_INTER_REV: /* Character set. */ case RE_OP_SET_SYM_DIFF: /* Character set. */ case RE_OP_SET_SYM_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_SYM_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_SYM_DIFF_REV: /* Character set. */ case RE_OP_SET_UNION: /* Character set. */ case RE_OP_SET_UNION_IGN: /* Character set, ignoring case. */ case RE_OP_SET_UNION_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_UNION_REV: /* Character set. */ TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_one(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (node) goto advance; break; case RE_OP_ATOMIC: /* Atomic subpattern. */ TRACE(("%s\n", re_op_text[bt_data->op])) /* Restore the groups and certain flags and then backtrack. */ pop_groups(state); state->too_few_errors = bt_data->atomic.too_few_errors; state->capture_change = bt_data->atomic.capture_change; discard_backtrack(state); break; case RE_OP_BODY_END: { RE_RepeatData* rp_data; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* We're backtracking into the body. */ rp_data = &state->repeats[bt_data->repeat.index]; /* Restore the repeat info. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; discard_backtrack(state); break; } case RE_OP_BODY_START: { TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* The body may have failed to match at this position. */ if (!guard_repeat(safe_state, bt_data->repeat.index, bt_data->repeat.text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; discard_backtrack(state); break; } case RE_OP_BOUNDARY: /* At a word boundary. */ case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ case RE_OP_END_OF_LINE: /* At the end of a line. */ case RE_OP_END_OF_LINE_U: /* At the end of a line. */ case RE_OP_END_OF_STRING: /* At the end of the string. */ case RE_OP_END_OF_STRING_LINE: /* At end of string or final newline. */ case RE_OP_END_OF_STRING_LINE_U: /* At end of string or final newline. */ case RE_OP_END_OF_WORD: /* At end of a word. */ case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ case RE_OP_START_OF_LINE: /* At the start of a line. */ case RE_OP_START_OF_LINE_U: /* At the start of a line. */ case RE_OP_START_OF_STRING: /* At the start of the string. */ case RE_OP_START_OF_WORD: /* At start of a word. */ TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (node) goto advance; break; case RE_OP_BRANCH: /* 2-way branch. */ TRACE(("%s\n", re_op_text[bt_data->op])) node = bt_data->branch.position.node; text_pos = bt_data->branch.position.text_pos; discard_backtrack(state); goto advance; case RE_OP_CALL_REF: /* A group call ref. */ TRACE(("%s\n", re_op_text[bt_data->op])) pop_group_return(state); discard_backtrack(state); break; case RE_OP_END_FUZZY: /* End of fuzzy matching. */ TRACE(("%s\n", re_op_text[bt_data->op])) /* We need to retry the fuzzy match. */ if (!retry_fuzzy_insert(safe_state, &text_pos, &node)) return RE_ERROR_BACKTRACKING; /* If there were too few errors, in the fuzzy section, try again. */ if (state->too_few_errors) { state->too_few_errors = FALSE; goto backtrack; } if (node) { node = node->next_1.node; goto advance; } break; case RE_OP_END_GROUP: /* End of a capture group. */ { RE_CODE private_index; RE_GroupData* group; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->group.public_index)) private_index = bt_data->group.private_index; group = &state->groups[private_index - 1]; /* Unsave the capture? */ if (bt_data->group.capture) unsave_capture(state, bt_data->group.private_index, bt_data->group.public_index); if (pattern->group_info[private_index - 1].referenced && group->span.end != bt_data->group.text_pos) --state->capture_change; group->span.end = bt_data->group.text_pos; group->current_capture = bt_data->group.current_capture; discard_backtrack(state); break; } case RE_OP_FAILURE: { Py_ssize_t end_pos; TRACE(("%s\n", re_op_text[bt_data->op])) /* Do we have to advance? */ if (!search) return RE_ERROR_FAILURE; /* Can we advance? */ text_pos = state->match_pos; end_pos = state->reverse ? slice_start : slice_end; if (text_pos == end_pos) return RE_ERROR_FAILURE; /* Skip over any repeated leading characters. */ switch (start_node->op) { case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: { size_t count; /* How many characters did the repeat actually match? */ count = count_one(state, start_node->nonstring.next_2.node, text_pos, (size_t)start_node->values[2]); /* If it's fewer than the maximum then skip over those * characters. */ if (count < start_node->values[2]) text_pos += (Py_ssize_t)count * pattern_step; break; } } /* Advance and try to match again. */ state->text_pos = text_pos + pattern_step; goto start_match; } case RE_OP_FUZZY: /* Fuzzy matching. */ { RE_FuzzyInfo* fuzzy_info; TRACE(("%s\n", re_op_text[bt_data->op])) /* Restore the previous fuzzy info. */ fuzzy_info = &state->fuzzy_info; memmove(fuzzy_info, &bt_data->fuzzy.fuzzy_info, sizeof(RE_FuzzyInfo)); discard_backtrack(state); break; } case RE_OP_GREEDY_REPEAT: /* Greedy repeat. */ case RE_OP_LAZY_REPEAT: /* Lazy repeat. */ { RE_RepeatData* rp_data; TRACE(("%s\n", re_op_text[bt_data->op])) /* The repeat failed to match. */ rp_data = &state->repeats[bt_data->repeat.index]; /* The body may have failed to match at this position. */ if (!guard_repeat(safe_state, bt_data->repeat.index, bt_data->repeat.text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; /* Restore the previous repeat. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; discard_backtrack(state); break; } case RE_OP_GREEDY_REPEAT_ONE: /* Greedy repeat for one character. */ { RE_RepeatData* rp_data; size_t count; Py_ssize_t step; Py_ssize_t pos; Py_ssize_t limit; RE_Node* test; BOOL match; BOOL m; size_t index; TRACE(("%s\n", re_op_text[bt_data->op])) node = bt_data->repeat.position.node; rp_data = &state->repeats[bt_data->repeat.index]; /* Unmatch one character at a time until the tail could match or we * have reached the minimum. */ text_pos = rp_data->start; count = rp_data->count; step = node->step; pos = text_pos + (Py_ssize_t)count * step; limit = text_pos + (Py_ssize_t)node->values[1] * step; /* The tail failed to match at this position. */ if (!guard_repeat(safe_state, bt_data->repeat.index, pos, RE_STATUS_TAIL, TRUE)) return RE_ERROR_MEMORY; if (count == node->values[1]) { /* We've backtracked the repeat as far as we can. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); break; } test = node->next_1.test; m = test->match; index = node->values[0]; match = FALSE; if (test->status & RE_STATUS_FUZZY) { for (;;) { RE_Position next_position; pos -= step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } } else { /* A repeated single-character match is often followed by a * literal, so checking specially for it can be a good * optimisation when working with long strings. */ switch (test->op) { case RE_OP_CHARACTER: { Py_UCS4 ch; ch = test->values[0]; for (;;) { --pos; if ((char_at(text, pos) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_CHARACTER_IGN: { Py_UCS4 ch; ch = test->values[0]; for (;;) { --pos; if (same_char_ign(encoding, char_at(text, pos), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_CHARACTER_IGN_REV: { Py_UCS4 ch; ch = test->values[0]; for (;;) { ++pos; if (same_char_ign(encoding, char_at(text, pos - 1), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_CHARACTER_REV: { Py_UCS4 ch; ch = test->values[0]; for (;;) { ++pos; if ((char_at(text, pos - 1) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_STRING: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MIN(pos, slice_end - length); for (;;) { Py_ssize_t found; if (pos < limit) break; found = string_search_rev(safe_state, test, pos + length, limit); if (found < 0) break; pos = found - length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } --pos; } break; } case RE_OP_STRING_FLD: { int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); size_t folded_length; size_t i; Py_UCS4 folded[RE_MAX_FOLDED]; full_case_fold = encoding->full_case_fold; folded_length = 0; for (i = 0; i < test->value_count; i++) folded_length += full_case_fold(test->values[i], folded); /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MIN(pos, slice_end - (Py_ssize_t)folded_length); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos < limit) break; found = string_search_fld_rev(safe_state, test, pos + folded_length, limit, &new_pos); if (found < 0) break; pos = found - folded_length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } --pos; } break; } case RE_OP_STRING_FLD_REV: { int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); size_t folded_length; size_t i; Py_UCS4 folded[RE_MAX_FOLDED]; full_case_fold = encoding->full_case_fold; folded_length = 0; for (i = 0; i < test->value_count; i++) folded_length += full_case_fold(test->values[i], folded); /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MAX(pos, slice_start + (Py_ssize_t)folded_length); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos > limit) break; found = string_search_fld(safe_state, test, pos - folded_length, limit, &new_pos); if (found < 0) break; pos = found + folded_length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } ++pos; } break; } case RE_OP_STRING_IGN: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MIN(pos, slice_end - length); for (;;) { Py_ssize_t found; if (pos < limit) break; found = string_search_ign_rev(safe_state, test, pos + length, limit); if (found < 0) break; pos = found - length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } --pos; } break; } case RE_OP_STRING_IGN_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MAX(pos, slice_start + length); for (;;) { Py_ssize_t found; if (pos > limit) break; found = string_search_ign(safe_state, test, pos - length, limit); if (found < 0) break; pos = found + length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } ++pos; } break; } case RE_OP_STRING_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MAX(pos, slice_start + length); for (;;) { Py_ssize_t found; if (pos > limit) break; found = string_search(safe_state, test, pos - length, limit); if (found < 0) break; pos = found + length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } ++pos; } break; } default: for (;;) { RE_Position next_position; pos -= step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } } if (match) { count = abs_ssize_t(pos - text_pos); /* The tail could match. */ if (count > node->values[1]) /* The match is longer than the minimum, so we might need * to backtrack the repeat again to consume less. */ rp_data->count = count; else { /* We've reached or passed the minimum, so we won't need to * backtrack the repeat again. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); /* Have we passed the minimum? */ if (count < node->values[1]) goto backtrack; } node = node->next_1.node; text_pos = pos; goto advance; } else { /* We've backtracked the repeat as far as we can. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); } break; } case RE_OP_GROUP_CALL: /* Group call. */ TRACE(("%s\n", re_op_text[bt_data->op])) pop_group_return(state); discard_backtrack(state); break; case RE_OP_GROUP_RETURN: /* Group return. */ { RE_Node* return_node; TRACE(("%s\n", re_op_text[bt_data->op])) return_node = bt_data->group_call.node; push_group_return(safe_state, return_node); if (return_node) { /* Restore the groups. */ pop_groups(state); state->capture_change = bt_data->group_call.capture_change; /* Restore the repeats. */ pop_repeats(state); } discard_backtrack(state); break; } case RE_OP_LAZY_REPEAT_ONE: /* Lazy repeat for one character. */ { RE_RepeatData* rp_data; size_t count; Py_ssize_t step; Py_ssize_t pos; size_t available; size_t max_count; Py_ssize_t limit; RE_Node* repeated; RE_Node* test; BOOL match; BOOL m; size_t index; TRACE(("%s\n", re_op_text[bt_data->op])) node = bt_data->repeat.position.node; rp_data = &state->repeats[bt_data->repeat.index]; /* Match one character at a time until the tail could match or we * have reached the maximum. */ text_pos = rp_data->start; count = rp_data->count; step = node->step; pos = text_pos + (Py_ssize_t)count * step; available = step > 0 ? slice_end - text_pos : text_pos - slice_start; max_count = RE_MIN(node->values[2], available); limit = text_pos + (Py_ssize_t)max_count * step; repeated = node->nonstring.next_2.node; test = node->next_1.test; m = test->match; index = node->values[0]; match = FALSE; if (test->status & RE_STATUS_FUZZY) { for (;;) { RE_Position next_position; if (!match_one(state, repeated, pos)) break; pos += step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } } else { /* A repeated single-character match is often followed by a * literal, so checking specially for it can be a good * optimisation when working with long strings. */ switch (test->op) { case RE_OP_CHARACTER: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MIN(limit, slice_end - 1); for (;;) { if (pos >= limit) break; if (!match_one(state, repeated, pos)) break; ++pos; if ((char_at(text, pos) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_CHARACTER_IGN: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MIN(limit, slice_end - 1); for (;;) { if (pos >= limit) break; if (!match_one(state, repeated, pos)) break; ++pos; if (same_char_ign(encoding, char_at(text, pos), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_CHARACTER_IGN_REV: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MAX(limit, slice_start + 1); for (;;) { if (pos <= limit) break; if (!match_one(state, repeated, pos)) break; --pos; if (same_char_ign(encoding, char_at(text, pos - 1), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_CHARACTER_REV: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MAX(limit, slice_start + 1); for (;;) { if (pos <= limit) break; if (!match_one(state, repeated, pos)) break; --pos; if ((char_at(text, pos - 1) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_end - length); for (;;) { Py_ssize_t found; if (pos >= limit) break; /* Look for the tail string. */ found = string_search(safe_state, test, pos + 1, limit + length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) ++pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_FLD: { /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_end); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos >= limit) break; /* Look for the tail string. */ found = string_search_fld(safe_state, test, pos + 1, limit, &new_pos); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) ++pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_FLD_REV: { /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_start); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos <= limit) break; /* Look for the tail string. */ found = string_search_fld_rev(safe_state, test, pos - 1, limit, &new_pos); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) --pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_IGN: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_end - length); for (;;) { Py_ssize_t found; if (pos >= limit) break; /* Look for the tail string. */ found = string_search_ign(safe_state, test, pos + 1, limit + length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) ++pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_IGN_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MAX(limit, slice_start + length); for (;;) { Py_ssize_t found; if (pos <= limit) break; /* Look for the tail string. */ found = string_search_ign_rev(safe_state, test, pos - 1, limit - length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) --pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MAX(limit, slice_start + length); for (;;) { Py_ssize_t found; if (pos <= limit) break; /* Look for the tail string. */ found = string_search_rev(safe_state, test, pos - 1, limit - length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) --pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } default: for (;;) { RE_Position next_position; if (!match_one(state, repeated, pos)) break; pos += step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } } if (match) { /* The tail could match. */ count = abs_ssize_t(pos - text_pos); text_pos = pos; if (count < max_count) { /* The match is shorter than the maximum, so we might need * to backtrack the repeat again to consume more. */ rp_data->count = count; } else { /* We've reached or passed the maximum, so we won't need to * backtrack the repeat again. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); /* Have we passed the maximum? */ if (count > max_count) goto backtrack; } node = node->next_1.node; goto advance; } else { /* The tail couldn't match. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); } break; } case RE_OP_LOOKAROUND: /* Lookaround. */ TRACE(("%s\n", re_op_text[bt_data->op])) /* Restore the groups and certain flags and then backtrack. */ pop_groups(state); state->too_few_errors = bt_data->lookaround.too_few_errors; state->capture_change = bt_data->lookaround.capture_change; discard_backtrack(state); break; case RE_OP_MATCH_BODY: { RE_RepeatData* rp_data; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* We want to match the body. */ rp_data = &state->repeats[bt_data->repeat.index]; /* Restore the repeat info. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; /* Record backtracking info in case the body fails to match. */ bt_data->op = RE_OP_BODY_START; /* Advance into the body. */ node = bt_data->repeat.position.node; text_pos = bt_data->repeat.position.text_pos; goto advance; } case RE_OP_MATCH_TAIL: { RE_RepeatData* rp_data; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* We want to match the tail. */ rp_data = &state->repeats[bt_data->repeat.index]; /* Restore the repeat info. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; /* Advance into the tail. */ node = bt_data->repeat.position.node; text_pos = bt_data->repeat.position.text_pos; discard_backtrack(state); goto advance; } case RE_OP_REF_GROUP: /* Reference to a capture group. */ case RE_OP_REF_GROUP_IGN: /* Reference to a capture group, ignoring case. */ case RE_OP_REF_GROUP_IGN_REV: /* Reference to a capture group backwards, ignoring case. */ case RE_OP_REF_GROUP_REV: /* Reference to a capture group backwards. */ case RE_OP_STRING: /* A string literal. */ case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ case RE_OP_STRING_IGN_REV: /* A string literal backwards, ignoring case. */ case RE_OP_STRING_REV: /* A string literal backwards. */ { BOOL matched; TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_string(safe_state, search, &text_pos, &node, &string_pos, &matched)) return RE_ERROR_BACKTRACKING; if (matched) goto advance; string_pos = -1; break; } case RE_OP_REF_GROUP_FLD: /* Reference to a capture group, ignoring case. */ case RE_OP_REF_GROUP_FLD_REV: /* Reference to a capture group backwards, ignoring case. */ { BOOL matched; TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_string_fld2(safe_state, search, &text_pos, &node, &folded_pos, &string_pos, &gfolded_pos, &matched)) return RE_ERROR_BACKTRACKING; if (matched) goto advance; string_pos = -1; break; } case RE_OP_START_GROUP: /* Start of a capture group. */ { RE_CODE private_index; RE_GroupData* group; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->group.public_index)) private_index = bt_data->group.private_index; group = &state->groups[private_index - 1]; /* Unsave the capture? */ if (bt_data->group.capture) unsave_capture(state, bt_data->group.private_index, bt_data->group.public_index); if (pattern->group_info[private_index - 1].referenced && group->span.start != bt_data->group.text_pos) --state->capture_change; group->span.start = bt_data->group.text_pos; group->current_capture = bt_data->group.current_capture; discard_backtrack(state); break; } case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ case RE_OP_STRING_FLD_REV: /* A string literal backwards, ignoring case. */ { BOOL matched; TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_string_fld(safe_state, search, &text_pos, &node, &string_pos, &folded_pos, &matched)) return RE_ERROR_BACKTRACKING; if (matched) goto advance; string_pos = -1; break; } default: TRACE(("UNKNOWN OP %d\n", bt_data->op)) return RE_ERROR_ILLEGAL; } } } /* Saves group data for fuzzy matching. */ Py_LOCAL_INLINE(RE_GroupData*) save_groups(RE_SafeState* safe_state, RE_GroupData* saved_groups) { RE_State* state; PatternObject* pattern; Py_ssize_t g; /* Re-acquire the GIL. */ acquire_GIL(safe_state); state = safe_state->re_state; pattern = state->pattern; if (!saved_groups) { saved_groups = (RE_GroupData*)re_alloc(pattern->true_group_count * sizeof(RE_GroupData)); if (!saved_groups) goto error; memset(saved_groups, 0, pattern->true_group_count * sizeof(RE_GroupData)); } for (g = 0; g < pattern->true_group_count; g++) { RE_GroupData* orig; RE_GroupData* copy; orig = &state->groups[g]; copy = &saved_groups[g]; copy->span = orig->span; if (orig->capture_count > copy->capture_capacity) { RE_GroupSpan* cap_copy; cap_copy = (RE_GroupSpan*)re_realloc(copy->captures, orig->capture_count * sizeof(RE_GroupSpan)); if (!cap_copy) goto error; copy->capture_capacity = orig->capture_count; copy->captures = cap_copy; } copy->capture_count = orig->capture_count; Py_MEMCPY(copy->captures, orig->captures, orig->capture_count * sizeof(RE_GroupSpan)); } /* Release the GIL. */ release_GIL(safe_state); return saved_groups; error: if (saved_groups) { for (g = 0; g < pattern->true_group_count; g++) re_dealloc(saved_groups[g].captures); re_dealloc(saved_groups); } /* Release the GIL. */ release_GIL(safe_state); return NULL; } /* Restores group data for fuzzy matching. */ Py_LOCAL_INLINE(void) restore_groups(RE_SafeState* safe_state, RE_GroupData* saved_groups) { RE_State* state; PatternObject* pattern; Py_ssize_t g; /* Re-acquire the GIL. */ acquire_GIL(safe_state); state = safe_state->re_state; pattern = state->pattern; for (g = 0; g < pattern->true_group_count; g++) re_dealloc(state->groups[g].captures); Py_MEMCPY(state->groups, saved_groups, pattern->true_group_count * sizeof(RE_GroupData)); re_dealloc(saved_groups); /* Release the GIL. */ release_GIL(safe_state); } /* Discards group data for fuzzy matching. */ Py_LOCAL_INLINE(void) discard_groups(RE_SafeState* safe_state, RE_GroupData* saved_groups) { RE_State* state; PatternObject* pattern; Py_ssize_t g; /* Re-acquire the GIL. */ acquire_GIL(safe_state); state = safe_state->re_state; pattern = state->pattern; for (g = 0; g < pattern->true_group_count; g++) re_dealloc(saved_groups[g].captures); re_dealloc(saved_groups); /* Release the GIL. */ release_GIL(safe_state); } /* Performs a match or search from the current text position. * * The state can sometimes be shared across threads. In such instances there's * a lock (mutex) on it. The lock is held for the duration of matching. */ Py_LOCAL_INLINE(int) do_match(RE_SafeState* safe_state, BOOL search) { RE_State* state; PatternObject* pattern; size_t available; BOOL get_best; BOOL enhance_match; BOOL must_advance; RE_GroupData* best_groups; Py_ssize_t best_match_pos; Py_ssize_t best_text_pos = 0; /* Initialise to stop compiler warning. */ int status; Py_ssize_t slice_start; Py_ssize_t slice_end; TRACE(("<>\n")) state = safe_state->re_state; pattern = state->pattern; /* Release the GIL. */ release_GIL(safe_state); /* Is there enough to search? */ if (state->reverse) { if (state->text_pos < state->slice_start) { acquire_GIL(safe_state); return FALSE; } available = state->text_pos - state->slice_start; } else { if (state->text_pos > state->slice_end) { acquire_GIL(safe_state); return FALSE; } available = state->slice_end - state->text_pos; } get_best = (pattern->flags & RE_FLAG_BESTMATCH) != 0; enhance_match = (pattern->flags & RE_FLAG_ENHANCEMATCH) != 0 && !get_best; /* The maximum permitted cost. */ state->max_cost = pattern->is_fuzzy ? RE_UNLIMITED : 0; best_groups = NULL; best_match_pos = state->text_pos; must_advance = state->must_advance; slice_start = state->slice_start; slice_end = state->slice_end; for (;;) { /* If there's a better match, it won't start earlier in the string than * the current best match, so there's no need to start earlier than * that match. */ state->text_pos = best_match_pos; state->must_advance = must_advance; /* Initialise the state. */ init_match(state); status = RE_ERROR_SUCCESS; if (state->max_cost == 0) { /* An exact match. */ if (available < state->min_width || (available == 0 && state->must_advance)) status = RE_ERROR_FAILURE; } if (status == RE_ERROR_SUCCESS) status = basic_match(safe_state, state->pattern->start_node, search, FALSE); /* Has an error occurred? */ if (status < 0) break; if (status == RE_ERROR_FAILURE || (status == RE_ERROR_SUCCESS && state->total_cost == 0)) break; if (!get_best && !enhance_match) break; if (!get_best && state->text_pos == state->match_pos) /* We want the first match. The match is already zero-width, so the * cost can't get any lower (because the fit can't get any better). */ break; if (best_groups) { BOOL same; Py_ssize_t g; /* Did we get the same match as the best so far? */ same = state->match_pos == best_match_pos && state->text_pos == best_text_pos; for (g = 0; same && g < pattern->public_group_count; g++) { same = state->groups[g].span.start == best_groups[g].span.start && state->groups[g].span.end == best_groups[g].span.end; } if (same) break; } /* Save the best result so far. */ best_groups = save_groups(safe_state, best_groups); if (!best_groups) { status = RE_ERROR_MEMORY; break; } best_match_pos = state->match_pos; best_text_pos = state->text_pos; if (state->max_cost == 0) break; /* Reduce the maximum permitted cost and try again. */ state->max_cost = state->total_cost - 1; if (enhance_match) { if (state->reverse) { state->slice_start = state->text_pos; state->slice_end = state->match_pos; } else { state->slice_start = state->match_pos; state->slice_end = state->text_pos; } } } state->slice_start = slice_start; state->slice_end = slice_end; if (best_groups) { if (status == RE_ERROR_SUCCESS && state->total_cost == 0) /* We have a perfect match, so the previous best match. */ discard_groups(safe_state, best_groups); else { /* Restore the previous best match. */ status = RE_ERROR_SUCCESS; state->match_pos = best_match_pos; state->text_pos = best_text_pos; restore_groups(safe_state, best_groups); } } if (status == RE_ERROR_SUCCESS) { Py_ssize_t max_end_index; PatternObject* pattern; RE_GroupInfo* group_info; Py_ssize_t g; /* Store the results. */ state->lastindex = -1; state->lastgroup = -1; max_end_index = -1; /* Store the capture groups. */ pattern = state->pattern; group_info = pattern->group_info; for (g = 0; g < pattern->public_group_count; g++) { RE_GroupSpan* span; span = &state->groups[g].span; /* The string positions are of type Py_ssize_t, so the format needs * to specify that. */ TRACE(("group %d from %" PY_FORMAT_SIZE_T "d to %" PY_FORMAT_SIZE_T "d\n", g + 1, span->start, span->end)) if (span->start >= 0 && span->end >= 0 && group_info[g].end_index > max_end_index) { max_end_index = group_info[g].end_index; state->lastindex = g + 1; if (group_info[g].has_name) state->lastgroup = g + 1; } } } /* Re-acquire the GIL. */ acquire_GIL(safe_state); if (status < 0 && !PyErr_Occurred()) set_error(status, NULL); return status; } /* Gets a string from a Python object. * * If the function returns true and str_info->should_release is true then it's * the responsibility of the caller to release the buffer when it's no longer * needed. */ Py_LOCAL_INLINE(BOOL) get_string(PyObject* string, RE_StringInfo* str_info) { /* Given a Python object, return a data pointer, a length (in characters), * and a character size. Return FALSE if the object is not a string (or not * compatible). */ PyBufferProcs* buffer; Py_ssize_t bytes; Py_ssize_t size; /* Unicode objects do not support the buffer API. So, get the data directly * instead. */ if (PyUnicode_Check(string)) { /* Unicode strings doesn't always support the buffer interface. */ str_info->characters = (void*)PyUnicode_AS_DATA(string); str_info->length = PyUnicode_GET_SIZE(string); str_info->charsize = sizeof(Py_UNICODE); str_info->is_unicode = TRUE; str_info->should_release = FALSE; return TRUE; } /* Get pointer to string buffer. */ #if PY_VERSION_HEX >= 0x02060000 buffer = Py_TYPE(string)->tp_as_buffer; str_info->view.len = -1; #else buffer = string->ob_type->tp_as_buffer; #endif if (!buffer) { PyErr_SetString(PyExc_TypeError, "expected string or buffer"); return FALSE; } #if PY_VERSION_HEX >= 0x02060000 if (buffer->bf_getbuffer && (*buffer->bf_getbuffer)(string, &str_info->view, PyBUF_SIMPLE) >= 0) /* It's a new-style buffer. */ str_info->should_release = TRUE; else #endif if (buffer->bf_getreadbuffer && buffer->bf_getsegcount && buffer->bf_getsegcount(string, NULL) == 1) /* It's an old-style buffer. */ str_info->should_release = FALSE; else { PyErr_SetString(PyExc_TypeError, "expected string or buffer"); return FALSE; } /* Determine buffer size. */ #if PY_VERSION_HEX >= 0x02060000 if (str_info->should_release) { /* It's a new-style buffer. */ bytes = str_info->view.len; str_info->characters = str_info->view.buf; if (str_info->characters == NULL) { PyBuffer_Release(&str_info->view); PyErr_SetString(PyExc_ValueError, "buffer is NULL"); return FALSE; } } else #endif /* It's an old-style buffer. */ bytes = buffer->bf_getreadbuffer(string, 0, &str_info->characters); if (bytes < 0) { #if PY_VERSION_HEX >= 0x02060000 if (str_info->should_release) PyBuffer_Release(&str_info->view); #endif PyErr_SetString(PyExc_TypeError, "buffer has negative size"); return FALSE; } /* Determine character size. */ size = PyObject_Size(string); if (PyString_Check(string) || bytes == size) str_info->charsize = 1; else { #if PY_VERSION_HEX >= 0x02060000 if (str_info->should_release) PyBuffer_Release(&str_info->view); #endif PyErr_SetString(PyExc_TypeError, "buffer size mismatch"); return FALSE; } str_info->length = size; str_info->is_unicode = FALSE; return TRUE; } /* Deallocates the groups storage. */ Py_LOCAL_INLINE(void) dealloc_groups(RE_GroupData* groups, size_t group_count) { size_t g; if (!groups) return; for (g = 0; g < group_count; g++) re_dealloc(groups[g].captures); re_dealloc(groups); } /* Initialises a state object. */ Py_LOCAL_INLINE(BOOL) state_init_2(RE_State* state, PatternObject* pattern, PyObject* string, RE_StringInfo* str_info, Py_ssize_t start, Py_ssize_t end, BOOL overlapped, int concurrent, BOOL use_lock, BOOL visible_captures, BOOL match_all) { Py_ssize_t final_pos; int i; state->groups = NULL; state->repeats = NULL; state->visible_captures = visible_captures; state->match_all = match_all; state->backtrack_block.previous = NULL; state->backtrack_block.next = NULL; state->backtrack_block.capacity = RE_BACKTRACK_BLOCK_SIZE; state->backtrack_allocated = RE_BACKTRACK_BLOCK_SIZE; state->first_saved_groups = NULL; state->current_saved_groups = NULL; state->first_saved_repeats = NULL; state->current_saved_repeats = NULL; state->lock = NULL; state->fuzzy_guards = NULL; state->first_group_call_frame = NULL; state->current_group_call_frame = NULL; state->group_call_guard_list = NULL; state->req_pos = -1; /* The call guards used by recursive patterns. */ if (pattern->call_ref_info_count > 0) { state->group_call_guard_list = (RE_GuardList*)re_alloc(pattern->call_ref_info_count * sizeof(RE_GuardList)); if (!state->group_call_guard_list) goto error; memset(state->group_call_guard_list, 0, pattern->call_ref_info_count * sizeof(RE_GuardList)); } /* The capture groups. */ if (pattern->true_group_count) { Py_ssize_t g; if (pattern->groups_storage) { state->groups = pattern->groups_storage; pattern->groups_storage = NULL; } else { state->groups = (RE_GroupData*)re_alloc(pattern->true_group_count * sizeof(RE_GroupData)); if (!state->groups) goto error; memset(state->groups, 0, pattern->true_group_count * sizeof(RE_GroupData)); for (g = 0; g < pattern->true_group_count; g++) { RE_GroupSpan* captures; captures = (RE_GroupSpan*)re_alloc(sizeof(RE_GroupSpan)); if (!captures) { Py_ssize_t i; for (i = 0; i < g; i++) re_dealloc(state->groups[i].captures); goto error; } state->groups[g].captures = captures; state->groups[g].capture_capacity = 1; } } } /* Adjust boundaries. */ if (start < 0) start += str_info->length; if (start < 0) start = 0; else if (start > str_info->length) start = str_info->length; if (end < 0) end += str_info->length; if (end < 0) end = 0; else if (end > str_info->length) end = str_info->length; state->overlapped = overlapped; state->min_width = pattern->min_width; /* Initialise the getters and setters for the character size. */ state->charsize = str_info->charsize; state->is_unicode = str_info->is_unicode; #if PY_VERSION_HEX >= 0x02060000 /* Are we using a buffer object? If so, we need to copy the info. */ state->should_release = str_info->should_release; if (state->should_release) state->view = str_info->view; #endif switch (state->charsize) { case 1: state->char_at = bytes1_char_at; state->set_char_at = bytes1_set_char_at; state->point_to = bytes1_point_to; break; case 2: state->char_at = bytes2_char_at; state->set_char_at = bytes2_set_char_at; state->point_to = bytes2_point_to; break; case 4: state->char_at = bytes4_char_at; state->set_char_at = bytes4_set_char_at; state->point_to = bytes4_point_to; break; default: goto error; } state->encoding = pattern->encoding; /* The state object contains a reference to the string and also a pointer * to its contents. * * The documentation says that the end of the slice behaves like the end of * the string. */ state->text = str_info->characters; state->text_length = end; state->reverse = (pattern->flags & RE_FLAG_REVERSE) != 0; state->slice_start = start; state->slice_end = state->text_length; state->text_pos = state->reverse ? state->slice_end : state->slice_start; /* Point to the final newline and line separator if it's at the end of the * string, otherwise just -1. */ state->final_newline = -1; state->final_line_sep = -1; final_pos = state->text_length - 1; if (final_pos >= 0) { Py_UCS4 ch; ch = state->char_at(state->text, final_pos); if (ch == 0x0A) { /* The string ends with LF. */ state->final_newline = final_pos; state->final_line_sep = final_pos; /* Does the string end with CR/LF? */ --final_pos; if (final_pos >= 0 && state->char_at(state->text, final_pos) == 0x0D) state->final_line_sep = final_pos; } else { /* The string doesn't end with LF, but it could be another kind of * line separator. */ if (state->encoding->is_line_sep(ch)) state->final_line_sep = final_pos; } } /* If the 'new' behaviour is enabled then split correctly on zero-width * matches. */ state->version_0 = (pattern->flags & RE_FLAG_VERSION1) == 0; state->must_advance = FALSE; state->pattern = pattern; state->string = string; if (pattern->repeat_count) { if (pattern->repeats_storage) { state->repeats = pattern->repeats_storage; pattern->repeats_storage = NULL; } else { state->repeats = (RE_RepeatData*)re_alloc(pattern->repeat_count * sizeof(RE_RepeatData)); if (!state->repeats) goto error; memset(state->repeats, 0, pattern->repeat_count * sizeof(RE_RepeatData)); } } if (pattern->fuzzy_count) { state->fuzzy_guards = (RE_FuzzyGuards*)re_alloc(pattern->fuzzy_count * sizeof(RE_FuzzyGuards)); if (!state->fuzzy_guards) goto error; memset(state->fuzzy_guards, 0, pattern->fuzzy_count * sizeof(RE_FuzzyGuards)); } Py_INCREF(state->pattern); Py_INCREF(state->string); /* Multithreading is allowed during matching when explicitly enabled or on * immutable strings. */ switch (concurrent) { case RE_CONC_NO: state->is_multithreaded = FALSE; break; case RE_CONC_YES: state->is_multithreaded = TRUE; break; default: state->is_multithreaded = PyUnicode_Check(string) || PyString_Check(string); break; } /* A state struct can sometimes be shared across threads. In such * instances, if multithreading is enabled we need to protect the state * with a lock (mutex) during matching. */ if (state->is_multithreaded && use_lock) state->lock = PyThread_allocate_lock(); for (i = 0; i < MAX_SEARCH_POSITIONS; i++) state->search_positions[i].start_pos = -1; return TRUE; error: re_dealloc(state->group_call_guard_list); re_dealloc(state->repeats); dealloc_groups(state->groups, pattern->true_group_count); re_dealloc(state->fuzzy_guards); state->repeats = NULL; state->groups = NULL; state->fuzzy_guards = NULL; return FALSE; } #if PY_VERSION_HEX >= 0x02060000 /* Releases the string's buffer, if necessary. */ Py_LOCAL_INLINE(void) release_buffer(RE_StringInfo* str_info) { if (str_info->should_release) PyBuffer_Release(&str_info->view); } #endif /* Initialises a state object. */ Py_LOCAL_INLINE(BOOL) state_init(RE_State* state, PatternObject* pattern, PyObject* string, Py_ssize_t start, Py_ssize_t end, BOOL overlapped, int concurrent, BOOL use_lock, BOOL visible_captures, BOOL match_all) { RE_StringInfo str_info; /* Get the string to search or match. */ if (!get_string(string, &str_info)) return FALSE; /* If we fail to initialise the state then we need to release the buffer if * the string is a buffer object. */ if (!state_init_2(state, pattern, string, &str_info, start, end, overlapped, concurrent, use_lock, visible_captures, match_all)) { #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return FALSE; } /* The state has been initialised successfully, so now the state has the * responsibility of releasing the buffer if the string is a buffer object. */ return TRUE; } /* Deallocates repeat data. */ Py_LOCAL_INLINE(void) dealloc_repeats(RE_RepeatData* repeats, Py_ssize_t repeat_count) { Py_ssize_t i; if (!repeats) return; for (i = 0; i < repeat_count; i++) { re_dealloc(repeats[i].body_guard_list.spans); re_dealloc(repeats[i].tail_guard_list.spans); } re_dealloc(repeats); } /* Deallocates fuzzy guards. */ Py_LOCAL_INLINE(void) dealloc_fuzzy_guards(RE_FuzzyGuards* guards, Py_ssize_t fuzzy_count) { Py_ssize_t i; if (!guards) return; for (i = 0; i < fuzzy_count; i++) { re_dealloc(guards[i].body_guard_list.spans); re_dealloc(guards[i].tail_guard_list.spans); } re_dealloc(guards); } /* Finalises a state object, discarding its contents. */ Py_LOCAL_INLINE(void) state_fini(RE_State* state) { RE_BacktrackBlock* current; PatternObject* pattern; RE_SavedGroups* saved_groups; RE_SavedRepeats* saved_repeats; RE_GroupCallFrame* frame; Py_ssize_t i; /* Discard the lock (mutex) if there's one. */ if (state->lock) PyThread_free_lock(state->lock); /* Deallocate the backtrack blocks. */ current = state->backtrack_block.next; while (current) { RE_BacktrackBlock* next; next = current->next; re_dealloc(current); state->backtrack_allocated -= RE_BACKTRACK_BLOCK_SIZE; current = next; } pattern = state->pattern; saved_groups = state->first_saved_groups; while (saved_groups) { RE_SavedGroups* next; next = saved_groups->next; re_dealloc(saved_groups->spans); re_dealloc(saved_groups->counts); re_dealloc(saved_groups); saved_groups = next; } saved_repeats = state->first_saved_repeats; while (saved_repeats) { RE_SavedRepeats* next; next = saved_repeats->next; dealloc_repeats(saved_repeats->repeats, pattern->repeat_count); re_dealloc(saved_repeats); saved_repeats = next; } if (pattern->groups_storage) dealloc_groups(state->groups, pattern->true_group_count); else pattern->groups_storage = state->groups; if (pattern->repeats_storage) dealloc_repeats(state->repeats, pattern->repeat_count); else pattern->repeats_storage = state->repeats; frame = state->first_group_call_frame; while (frame) { RE_GroupCallFrame* next; next = frame->next; dealloc_groups(frame->groups, pattern->true_group_count); dealloc_repeats(frame->repeats, pattern->repeat_count); re_dealloc(frame); frame = next; } for (i = 0; i < pattern->call_ref_info_count; i++) re_dealloc(state->group_call_guard_list[i].spans); if (state->group_call_guard_list) re_dealloc(state->group_call_guard_list); if (state->fuzzy_guards) dealloc_fuzzy_guards(state->fuzzy_guards, pattern->fuzzy_count); Py_DECREF(state->pattern); Py_DECREF(state->string); #if PY_VERSION_HEX >= 0x02060000 if (state->should_release) PyBuffer_Release(&state->view); #endif } /* Converts a string index to an integer. * * If the index is None then the default will be returned. */ Py_LOCAL_INLINE(Py_ssize_t) as_string_index(PyObject* obj, Py_ssize_t def) { Py_ssize_t value; if (obj == Py_None) return def; value = PyInt_AsSsize_t(obj); if (value != -1 || !PyErr_Occurred()) return value; PyErr_Clear(); value = PyLong_AsLong(obj); if (value != -1 || !PyErr_Occurred()) return value; set_error(RE_ERROR_INDEX, NULL); return 0; } /* Deallocates a MatchObject. */ static void match_dealloc(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; Py_XDECREF(self->string); Py_XDECREF(self->substring); Py_DECREF(self->pattern); if (self->groups) re_dealloc(self->groups); Py_XDECREF(self->regs); PyObject_DEL(self); } /* Gets a slice from a string. */ Py_LOCAL_INLINE(PyObject*) get_slice(PyObject* string, Py_ssize_t start, Py_ssize_t end) { return PySequence_GetSlice(string, start, end); } /* Gets a MatchObject's group by integer index. */ Py_LOCAL_INLINE(PyObject*) match_get_group_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; if (span->start < 0 || span->end < 0) { /* Return default value if the string or group is undefined. */ Py_INCREF(def); return def; } return get_slice(self->substring, span->start - self->substring_offset, span->end - self->substring_offset); } /* Gets a MatchObject's start by integer index. */ static PyObject* match_get_start_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return Py_BuildValue("n", self->match_start); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; return Py_BuildValue("n", span->start); } /* Gets a MatchObject's starts by integer index. */ static PyObject* match_get_starts_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* item; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; item = Py_BuildValue("n", self->match_start); if (!item) goto error; PyList_SET_ITEM(result, 0, item); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { item = Py_BuildValue("n", group->captures[i].start); if (!item) goto error; PyList_SET_ITEM(result, i, item); } return result; error: Py_DECREF(result); return NULL; } /* Gets a MatchObject's end by integer index. */ static PyObject* match_get_end_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return Py_BuildValue("n", self->match_end); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; return Py_BuildValue("n", span->end); } /* Gets a MatchObject's ends by integer index. */ static PyObject* match_get_ends_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* item; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; item = Py_BuildValue("n", self->match_end); if (!item) goto error; PyList_SET_ITEM(result, 0, item); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { item = Py_BuildValue("n", group->captures[i].end); if (!item) goto error; PyList_SET_ITEM(result, i, item); } return result; error: Py_DECREF(result); return NULL; } /* Gets a MatchObject's span by integer index. */ static PyObject* match_get_span_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return Py_BuildValue("nn", self->match_start, self->match_end); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; return Py_BuildValue("nn", span->start, span->end); } /* Gets a MatchObject's spans by integer index. */ static PyObject* match_get_spans_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* item; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; item = Py_BuildValue("nn", self->match_start, self->match_end); if (!item) goto error; PyList_SET_ITEM(result, 0, item); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { item = Py_BuildValue("nn", group->captures[i].start, group->captures[i].end); if (!item) goto error; PyList_SET_ITEM(result, i, item); } return result; error: Py_DECREF(result); return NULL; } /* Gets a MatchObject's captures by integer index. */ static PyObject* match_get_captures_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* slice; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; slice = get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); if (!slice) goto error; PyList_SET_ITEM(result, 0, slice); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { slice = get_slice(self->substring, group->captures[i].start - self->substring_offset, group->captures[i].end - self->substring_offset); if (!slice) goto error; PyList_SET_ITEM(result, i, slice); } return result; error: Py_DECREF(result); return NULL; } /* Converts a group index to an integer. */ Py_LOCAL_INLINE(Py_ssize_t) as_group_index(PyObject* obj) { Py_ssize_t value; value = PyInt_AsSsize_t(obj); if (value != -1 || !PyErr_Occurred()) return value; PyErr_Clear(); value = PyLong_AsLong(obj); if (value != -1 || !PyErr_Occurred()) return value; set_error(RE_ERROR_INDEX, NULL); return -1; } /* Gets a MatchObject's group index. * * The supplied index can be an integer or a string (group name) object. */ Py_LOCAL_INLINE(Py_ssize_t) match_get_group_index(MatchObject* self, PyObject* index, BOOL allow_neg) { Py_ssize_t group; /* Is the index an integer? */ group = as_group_index(index); if (group != -1 || !PyErr_Occurred()) { Py_ssize_t min_group = 0; /* Adjust negative indices where valid and allowed. */ if (group < 0 && allow_neg) { group += (Py_ssize_t)self->group_count + 1; min_group = 1; } if (min_group <= group && group <= (Py_ssize_t)self->group_count) return group; return -1; } /* The index might be a group name. */ if (self->pattern->groupindex) { /* Look up the name. */ PyErr_Clear(); index = PyObject_GetItem(self->pattern->groupindex, index); if (index) { /* Check that we have an integer. */ group = as_group_index(index); Py_DECREF(index); if (group != -1 || !PyErr_Occurred()) return group; } } PyErr_Clear(); return -1; } /* Gets a MatchObject's group by object index. */ Py_LOCAL_INLINE(PyObject*) match_get_group(MatchObject* self, PyObject* index, PyObject* def, BOOL allow_neg) { /* Check that the index is an integer or a string. */ if (PyInt_Check(index) || PyLong_Check(index) || PyUnicode_Check(index) || PyString_Check(index)) return match_get_group_by_index(self, match_get_group_index(self, index, allow_neg), def); set_error(RE_ERROR_GROUP_INDEX_TYPE, index); return NULL; } /* Gets info from a MatchObject by object index. */ static PyObject* get_by_arg(MatchObject* self, PyObject* index, RE_GetByIndexFunc get_by_index) { /* Check that the index is an integer or a string. */ if (PyInt_Check(index) || PyLong_Check(index) || PyUnicode_Check(index) || PyString_Check(index)) return get_by_index(self, match_get_group_index(self, index, FALSE)); set_error(RE_ERROR_GROUP_INDEX_TYPE, index); return NULL; } /* MatchObject's 'group' method. */ static PyObject* match_group(MatchObject* self, PyObject* args) { Py_ssize_t size; PyObject* result; Py_ssize_t i; size = PyTuple_GET_SIZE(args); switch (size) { case 0: /* group() */ result = match_get_group_by_index(self, 0, Py_None); break; case 1: /* group(x) */ result = match_get_group(self, PyTuple_GET_ITEM(args, 0), Py_None, FALSE); break; default: /* group(x, y, z, ...) */ /* Fetch multiple items. */ result = PyTuple_New(size); if (!result) return NULL; for (i = 0; i < size; i++) { PyObject* item = match_get_group(self, PyTuple_GET_ITEM(args, i), Py_None, FALSE); if (!item) { Py_DECREF(result); return NULL; } PyTuple_SET_ITEM(result, i, item); } break; } return result; } /* Generic method for getting info from a MatchObject. */ static PyObject* get_from_match(MatchObject* self, PyObject* args, RE_GetByIndexFunc get_by_index) { Py_ssize_t size; PyObject* result; Py_ssize_t i; size = PyTuple_GET_SIZE(args); switch (size) { case 0: /* get() */ result = get_by_index(self, 0); break; case 1: /* get(x) */ result = get_by_arg(self, PyTuple_GET_ITEM(args, 0), get_by_index); break; default: /* get(x, y, z, ...) */ /* Fetch multiple items. */ result = PyTuple_New(size); if (!result) return NULL; for (i = 0; i < size; i++) { PyObject* item = get_by_arg(self, PyTuple_GET_ITEM(args, i), get_by_index); if (!item) { Py_DECREF(result); return NULL; } PyTuple_SET_ITEM(result, i, item); } break; } return result; } /* MatchObject's 'start' method. */ static PyObject* match_start(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_start_by_index); } /* MatchObject's 'starts' method. */ static PyObject* match_starts(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_starts_by_index); } /* MatchObject's 'end' method. */ static PyObject* match_end(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_end_by_index); } /* MatchObject's 'ends' method. */ static PyObject* match_ends(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_ends_by_index); } /* MatchObject's 'span' method. */ static PyObject* match_span(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_span_by_index); } /* MatchObject's 'spans' method. */ static PyObject* match_spans(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_spans_by_index); } /* MatchObject's 'captures' method. */ static PyObject* match_captures(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_captures_by_index); } /* MatchObject's 'groups' method. */ static PyObject* match_groups(MatchObject* self, PyObject* args, PyObject* kwargs) { PyObject* result; Py_ssize_t g; PyObject* def = Py_None; static char* kwlist[] = { "default", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:groups", kwlist, &def)) return NULL; result = PyTuple_New(self->group_count); if (!result) return NULL; /* Group 0 is the entire matched portion of the string. */ for (g = 0; g < self->group_count; g++) { PyObject* item; item = match_get_group_by_index(self, g + 1, def); if (!item) { Py_DECREF(result); return NULL; } PyTuple_SET_ITEM(result, g, item); } return result; } /* MatchObject's 'groupdict' method. */ static PyObject* match_groupdict(MatchObject* self, PyObject* args, PyObject* kwargs) { PyObject* result; PyObject* keys; Py_ssize_t g; PyObject* def = Py_None; static char* kwlist[] = { "default", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:groupdict", kwlist, &def)) return NULL; result = PyDict_New(); if (!result || !self->pattern->groupindex) return result; keys = PyMapping_Keys(self->pattern->groupindex); if (!keys) goto failed; for (g = 0; g < PyList_GET_SIZE(keys); g++) { PyObject* key; PyObject* value; int status; key = PyList_GET_ITEM(keys, g); if (!key) goto failed; value = match_get_group(self, key, def, FALSE); if (!value) { Py_DECREF(key); goto failed; } status = PyDict_SetItem(result, key, value); Py_DECREF(value); if (status < 0) goto failed; } Py_DECREF(keys); return result; failed: Py_XDECREF(keys); Py_DECREF(result); return NULL; } /* MatchObject's 'capturesdict' method. */ static PyObject* match_capturesdict(MatchObject* self) { PyObject* result; PyObject* keys; Py_ssize_t g; result = PyDict_New(); if (!result || !self->pattern->groupindex) return result; keys = PyMapping_Keys(self->pattern->groupindex); if (!keys) goto failed; for (g = 0; g < PyList_GET_SIZE(keys); g++) { PyObject* key; Py_ssize_t group; PyObject* captures; int status; key = PyList_GET_ITEM(keys, g); if (!key) goto failed; group = match_get_group_index(self, key, FALSE); if (group < 0) { Py_DECREF(key); goto failed; } captures = match_get_captures_by_index(self, group); if (!captures) { Py_DECREF(key); goto failed; } status = PyDict_SetItem(result, key, captures); Py_DECREF(captures); if (status < 0) goto failed; } Py_DECREF(keys); return result; failed: Py_XDECREF(keys); Py_DECREF(result); return NULL; } /* Gets a Python object by name from a named module. */ Py_LOCAL_INLINE(PyObject*) get_object(char* module_name, char* object_name) { PyObject* module; PyObject* object; module = PyImport_ImportModule(module_name); if (!module) return NULL; object = PyObject_GetAttrString(module, object_name); Py_DECREF(module); return object; } /* Calls a function in a module. */ Py_LOCAL_INLINE(PyObject*) call(char* module_name, char* function_name, PyObject* args) { PyObject* function; PyObject* result; if (!args) return NULL; function = get_object(module_name, function_name); if (!function) return NULL; result = PyObject_CallObject(function, args); Py_DECREF(function); Py_DECREF(args); return result; } /* Gets a replacement item from the replacement list. * * The replacement item could be a string literal or a group. */ Py_LOCAL_INLINE(PyObject*) get_match_replacement(MatchObject* self, PyObject* item, Py_ssize_t group_count) { Py_ssize_t index; if (PyUnicode_Check(item) || PyString_Check(item)) { /* It's a literal, which can be added directly to the list. */ Py_INCREF(item); return item; } /* Is it a group reference? */ index = as_group_index(item); if (index == -1 && PyErr_Occurred()) { /* Not a group either! */ set_error(RE_ERROR_REPLACEMENT, NULL); return NULL; } if (index == 0) { /* The entire matched portion of the string. */ return get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); } else if (index >= 1 && index <= group_count) { /* A group. If it didn't match then return None instead. */ RE_GroupData* group; group = &self->groups[index - 1]; if (group->capture_count > 0) return get_slice(self->substring, group->span.start - self->substring_offset, group->span.end - self->substring_offset); else { Py_INCREF(Py_None); return Py_None; } } else { /* No such group. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } } /* Adds an item to be joined. */ Py_LOCAL_INLINE(int) add_item(JoinInfo* join_info, PyObject* item) { PyObject* new_item; int status; if (join_info->is_unicode) { if (PyUnicode_Check(item)) { new_item = item; Py_INCREF(new_item); } else { new_item = PyUnicode_FromObject(item); if (!new_item) { set_error(RE_ERROR_NOT_UNICODE, item); return RE_ERROR_NOT_UNICODE; } } } else { if (PyString_Check(item)) { new_item = item; Py_INCREF(new_item); } else { new_item = PyUnicode_FromObject(item); if (!new_item) { set_error(RE_ERROR_NOT_STRING, item); return RE_ERROR_NOT_STRING; } } } /* If the list already exists then just add the item to it. */ if (join_info->list) { status = PyList_Append(join_info->list, new_item); if (status < 0) goto error; Py_DECREF(new_item); return status; } /* If we already have an item then we now have 2(!) and we need to put them * into a list. */ if (join_info->item) { join_info->list = PyList_New(2); if (!join_info->list) { status = RE_ERROR_MEMORY; goto error; } PyList_SET_ITEM(join_info->list, 0, join_info->item); join_info->item = NULL; PyList_SET_ITEM(join_info->list, 1, new_item); return 0; } /* This is the first item. */ join_info->item = new_item; return 0; error: Py_DECREF(new_item); Py_XDECREF(join_info->list); Py_XDECREF(join_info->item); set_error(status, NULL); return status; } /* Joins together a list of strings for pattern_subx. */ Py_LOCAL_INLINE(PyObject*) join_list_info(JoinInfo* join_info) { /* If the list already exists then just do the join. */ if (join_info->list) { PyObject* joiner; PyObject* result; if (join_info->reversed) /* The list needs to be reversed before being joined. */ PyList_Reverse(join_info->list); if (join_info->is_unicode) { /* Concatenate the Unicode strings. */ joiner = PyUnicode_FromUnicode(NULL, 0); if (!joiner) { Py_DECREF(join_info->list); return NULL; } result = PyUnicode_Join(joiner, join_info->list); } else { joiner = PyString_FromString(""); if (!joiner) { Py_DECREF(join_info->list); return NULL; } /* Concatenate the bytestrings. */ result = _PyString_Join(joiner, join_info->list); } Py_DECREF(joiner); Py_DECREF(join_info->list); return result; } /* If we have only 1 item, so we'll just return it. */ if (join_info->item) return join_info->item; /* There are no items, so return an empty string. */ if (join_info->is_unicode) return PyUnicode_FromUnicode(NULL, 0); else return PyString_FromString(""); } /* Checks whether a string replacement is a literal. * * To keep it simple we'll say that a literal is a string which can be used * as-is. * * Returns its length if it is a literal, otherwise -1. */ Py_LOCAL_INLINE(Py_ssize_t) check_replacement_string(PyObject* str_replacement, unsigned char special_char) { RE_StringInfo str_info; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); Py_ssize_t pos; if (!get_string(str_replacement, &str_info)) return -1; switch (str_info.charsize) { case 1: char_at = bytes1_char_at; break; case 2: char_at = bytes2_char_at; break; case 4: char_at = bytes4_char_at; break; default: #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return -1; } for (pos = 0; pos < str_info.length; pos++) { if (char_at(str_info.characters, pos) == special_char) { #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return -1; } } #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return str_info.length; } /* MatchObject's 'expand' method. */ static PyObject* match_expand(MatchObject* self, PyObject* str_template) { Py_ssize_t literal_length; PyObject* replacement; JoinInfo join_info; Py_ssize_t size; Py_ssize_t i; /* Is the template just a literal? */ literal_length = check_replacement_string(str_template, '\\'); if (literal_length >= 0) { /* It's a literal. */ Py_INCREF(str_template); return str_template; } /* Hand the template to the template compiler. */ replacement = call(RE_MODULE, "_compile_replacement_helper", PyTuple_Pack(2, self->pattern, str_template)); if (!replacement) return NULL; join_info.list = NULL; join_info.item = NULL; join_info.reversed = FALSE; join_info.is_unicode = PyUnicode_Check(self->string); /* Add each part of the template to the list. */ size = PyList_GET_SIZE(replacement); for (i = 0; i < size; i++) { PyObject* item; PyObject* str_item; item = PyList_GET_ITEM(replacement, i); str_item = get_match_replacement(self, item, self->group_count); if (!str_item) goto error; /* Add to the list. */ if (str_item == Py_None) Py_DECREF(str_item); else { int status; status = add_item(&join_info, str_item); Py_DECREF(str_item); if (status < 0) goto error; } } Py_DECREF(replacement); /* Convert the list to a single string (also cleans up join_info). */ return join_list_info(&join_info); error: Py_XDECREF(join_info.list); Py_XDECREF(join_info.item); Py_DECREF(replacement); return NULL; } #if PY_VERSION_HEX >= 0x02060000 /* Gets a MatchObject's group dictionary. */ static PyObject* match_get_group_dict(MatchObject* self) { PyObject* result; PyObject* keys; Py_ssize_t g; result = PyDict_New(); if (!result || !self->pattern->groupindex) return result; keys = PyMapping_Keys(self->pattern->groupindex); if (!keys) goto failed; for (g = 0; g < PyList_GET_SIZE(keys); g++) { int status; PyObject* key; PyObject* value; key = PyList_GET_ITEM(keys, g); if (!key) goto failed; value = match_get_group(self, key, Py_None, FALSE); if (!value) { Py_DECREF(key); goto failed; } status = PyDict_SetItem(result, key, value); Py_DECREF(value); if (status < 0) goto failed; } Py_DECREF(keys); return result; failed: Py_XDECREF(keys); Py_DECREF(result); return NULL; } /* MatchObject's 'expandf' method. */ static PyObject* match_expandf(MatchObject* self, PyObject* str_template) { PyObject* format_func; PyObject* args = NULL; Py_ssize_t g; PyObject* kwargs = NULL; PyObject* result; format_func = PyObject_GetAttrString(str_template, "format"); if (!format_func) return NULL; args = PyTuple_New(self->group_count + 1); if (!args) goto error; for (g = 0; g < self->group_count + 1; g++) PyTuple_SetItem(args, g, match_get_group_by_index(self, g, Py_None)); kwargs = match_get_group_dict(self); if (!kwargs) goto error; result = PyObject_Call(format_func, args, kwargs); Py_DECREF(kwargs); Py_DECREF(args); Py_DECREF(format_func); return result; error: Py_XDECREF(args); Py_DECREF(format_func); return NULL; } #endif Py_LOCAL_INLINE(PyObject*) make_match_copy(MatchObject* self); /* MatchObject's '__copy__' method. */ static PyObject* match_copy(MatchObject* self, PyObject *unused) { return make_match_copy(self); } /* MatchObject's '__deepcopy__' method. */ static PyObject* match_deepcopy(MatchObject* self, PyObject* memo) { return make_match_copy(self); } /* MatchObject's 'regs' attribute. */ static PyObject* match_regs(MatchObject* self) { PyObject* regs; PyObject* item; Py_ssize_t g; regs = PyTuple_New(self->group_count + 1); if (!regs) return NULL; item = Py_BuildValue("nn", self->match_start, self->match_end); if (!item) { Py_DECREF(regs); return NULL; } PyTuple_SET_ITEM(regs, 0, item); for (g = 0; g < self->group_count; g++) { RE_GroupSpan* span; span = &self->groups[g].span; item = Py_BuildValue("nn", span->start, span->end); if (!item) { Py_DECREF(regs); return NULL; } PyTuple_SET_ITEM(regs, g + 1, item); } Py_INCREF(regs); self->regs = regs; return regs; } /* MatchObject's slice method. */ Py_LOCAL_INLINE(PyObject*) match_get_group_slice(MatchObject* self, PyObject* slice) { Py_ssize_t start; Py_ssize_t end; Py_ssize_t step; Py_ssize_t slice_length; if (PySlice_GetIndicesEx((PySliceObject*)slice, self->group_count + 1, &start, &end, &step, &slice_length) < 0) return NULL; if (slice_length <= 0) return PyTuple_New(0); else { PyObject* result; Py_ssize_t cur; Py_ssize_t i; result = PyTuple_New(slice_length); if (!result) return NULL; cur = start; for (i = 0; i < slice_length; i++) { PyTuple_SetItem(result, i, match_get_group_by_index(self, cur, Py_None)); cur += step; } return result; } } /* MatchObject's length method. */ static Py_ssize_t match_length(MatchObject* self) { return self->group_count + 1; } /* MatchObject's '__getitem__' method. */ static PyObject* match_getitem(MatchObject* self, PyObject* item) { if (PySlice_Check(item)) return match_get_group_slice(self, item); return match_get_group(self, item, Py_None, TRUE); } /* Determines the portion of the target string which is covered by the group * captures. */ Py_LOCAL_INLINE(void) determine_target_substring(MatchObject* match, Py_ssize_t* slice_start, Py_ssize_t* slice_end) { Py_ssize_t start; Py_ssize_t end; Py_ssize_t g; start = match->pos; end = match->endpos; for (g = 0; g < match->group_count; g++) { RE_GroupSpan* span; size_t c; span = &match->groups[g].span; if (span->start >= 0 && span->start < start) start = span->start; if (span->end >= 0 && span->end > end) end = span->end; for (c = 0; c < match->groups[g].capture_count; c++) { RE_GroupSpan* span; span = match->groups[g].captures; if (span->start >= 0 && span->start < start) start = span->start; if (span->end >= 0 && span->end > end) end = span->end; } } *slice_start = start; *slice_end = end; } /* MatchObject's 'detach_string' method. */ static PyObject* match_detach_string(MatchObject* self, PyObject* unused) { if (self->string) { Py_ssize_t start; Py_ssize_t end; PyObject* substring; determine_target_substring(self, &start, &end); substring = get_slice(self->string, start, end); if (substring) { Py_XDECREF(self->substring); self->substring = substring; self->substring_offset = start; Py_XDECREF(self->string); self->string = NULL; } } Py_INCREF(Py_None); return Py_None; } /* The documentation of a MatchObject. */ PyDoc_STRVAR(match_group_doc, "group([group1, ...]) --> string or tuple of strings.\n\ Return one or more subgroups of the match. If there is a single argument,\n\ the result is a single string, or None if the group did not contribute to\n\ the match; if there are multiple arguments, the result is a tuple with one\n\ item per argument; if there are no arguments, the whole match is returned.\n\ Group 0 is the whole match."); PyDoc_STRVAR(match_start_doc, "start([group1, ...]) --> int or tuple of ints.\n\ Return the index of the start of one or more subgroups of the match. If\n\ there is a single argument, the result is an index, or -1 if the group did\n\ not contribute to the match; if there are multiple arguments, the result is\n\ a tuple with one item per argument; if there are no arguments, the index of\n\ the start of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_end_doc, "end([group1, ...]) --> int or tuple of ints.\n\ Return the index of the end of one or more subgroups of the match. If there\n\ is a single argument, the result is an index, or -1 if the group did not\n\ contribute to the match; if there are multiple arguments, the result is a\n\ tuple with one item per argument; if there are no arguments, the index of\n\ the end of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_span_doc, "span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints.\n\ Return the span (a 2-tuple of the indices of the start and end) of one or\n\ more subgroups of the match. If there is a single argument, the result is a\n\ span, or (-1, -1) if the group did not contribute to the match; if there are\n\ multiple arguments, the result is a tuple with one item per argument; if\n\ there are no arguments, the span of the whole match is returned. Group 0 is\n\ the whole match."); PyDoc_STRVAR(match_groups_doc, "groups(default=None) --> tuple of strings.\n\ Return a tuple containing all the subgroups of the match. The argument is\n\ the default for groups that did not participate in the match."); PyDoc_STRVAR(match_groupdict_doc, "groupdict(default=None) --> dict.\n\ Return a dictionary containing all the named subgroups of the match, keyed\n\ by the subgroup name. The argument is the value to be given for groups that\n\ did not participate in the match."); PyDoc_STRVAR(match_capturesdict_doc, "capturesdict() --> dict.\n\ Return a dictionary containing the captures of all the named subgroups of the\n\ match, keyed by the subgroup name."); PyDoc_STRVAR(match_expand_doc, "expand(template) --> string.\n\ Return the string obtained by doing backslash substitution on the template,\n\ as done by the sub() method."); #if PY_VERSION_HEX >= 0x02060000 PyDoc_STRVAR(match_expandf_doc, "expandf(format) --> string.\n\ Return the string obtained by using the format, as done by the subf()\n\ method."); #endif PyDoc_STRVAR(match_captures_doc, "captures([group1, ...]) --> list of strings or tuple of list of strings.\n\ Return the captures of one or more subgroups of the match. If there is a\n\ single argument, the result is a list of strings; if there are multiple\n\ arguments, the result is a tuple of lists with one item per argument; if\n\ there are no arguments, the captures of the whole match is returned. Group\n\ 0 is the whole match."); PyDoc_STRVAR(match_starts_doc, "starts([group1, ...]) --> list of ints or tuple of list of ints.\n\ Return the indices of the starts of the captures of one or more subgroups of\n\ the match. If there is a single argument, the result is a list of indices;\n\ if there are multiple arguments, the result is a tuple of lists with one\n\ item per argument; if there are no arguments, the indices of the starts of\n\ the captures of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_ends_doc, "ends([group1, ...]) --> list of ints or tuple of list of ints.\n\ Return the indices of the ends of the captures of one or more subgroups of\n\ the match. If there is a single argument, the result is a list of indices;\n\ if there are multiple arguments, the result is a tuple of lists with one\n\ item per argument; if there are no arguments, the indices of the ends of the\n\ captures of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_spans_doc, "spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints.\n\ Return the spans (a 2-tuple of the indices of the start and end) of the\n\ captures of one or more subgroups of the match. If there is a single\n\ argument, the result is a list of spans; if there are multiple arguments,\n\ the result is a tuple of lists with one item per argument; if there are no\n\ arguments, the spans of the captures of the whole match is returned. Group\n\ 0 is the whole match."); PyDoc_STRVAR(match_detach_string_doc, "detach_string()\n\ Detaches the target string from the match object. The 'string' attribute\n\ will become None."); /* MatchObject's methods. */ static PyMethodDef match_methods[] = { {"group", (PyCFunction)match_group, METH_VARARGS, match_group_doc}, {"start", (PyCFunction)match_start, METH_VARARGS, match_start_doc}, {"end", (PyCFunction)match_end, METH_VARARGS, match_end_doc}, {"span", (PyCFunction)match_span, METH_VARARGS, match_span_doc}, {"groups", (PyCFunction)match_groups, METH_VARARGS|METH_KEYWORDS, match_groups_doc}, {"groupdict", (PyCFunction)match_groupdict, METH_VARARGS|METH_KEYWORDS, match_groupdict_doc}, {"capturesdict", (PyCFunction)match_capturesdict, METH_NOARGS, match_capturesdict_doc}, {"expand", (PyCFunction)match_expand, METH_O, match_expand_doc}, #if PY_VERSION_HEX >= 0x02060000 {"expandf", (PyCFunction)match_expandf, METH_O, match_expandf_doc}, #endif {"captures", (PyCFunction)match_captures, METH_VARARGS, match_captures_doc}, {"starts", (PyCFunction)match_starts, METH_VARARGS, match_starts_doc}, {"ends", (PyCFunction)match_ends, METH_VARARGS, match_ends_doc}, {"spans", (PyCFunction)match_spans, METH_VARARGS, match_spans_doc}, {"detach_string", (PyCFunction)match_detach_string, METH_NOARGS, match_detach_string_doc}, {"__copy__", (PyCFunction)match_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)match_deepcopy, METH_O}, {"__getitem__", (PyCFunction)match_getitem, METH_O|METH_COEXIST}, {NULL, NULL} }; PyDoc_STRVAR(match_doc, "Match object"); /* MatchObject's 'lastindex' attribute. */ static PyObject* match_lastindex(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; if (self->lastindex >= 0) return Py_BuildValue("n", self->lastindex); Py_INCREF(Py_None); return Py_None; } /* MatchObject's 'lastgroup' attribute. */ static PyObject* match_lastgroup(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; if (self->pattern->indexgroup && self->lastgroup >= 0) { PyObject* index = Py_BuildValue("n", self->lastgroup); PyObject* result = PyDict_GetItem(self->pattern->indexgroup, index); Py_DECREF(index); if (result) { Py_INCREF(result); return result; } PyErr_Clear(); } Py_INCREF(Py_None); return Py_None; } /* MatchObject's 'string' attribute. */ static PyObject* match_string(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; if (self->string) { Py_INCREF(self->string); return self->string; } else { Py_INCREF(Py_None); return Py_None; } } static PyGetSetDef match_getset[] = { {"lastindex", (getter)match_lastindex, (setter)NULL, "The group number of the last matched capturing group, or None."}, {"lastgroup", (getter)match_lastgroup, (setter)NULL, "The name of the last matched capturing group, or None."}, {"regs", (getter)match_regs, (setter)NULL, "A tuple of the spans of the capturing groups."}, {"string", (getter)match_string, (setter)NULL, "The string that was searched, or None if it has been detached."}, {NULL} /* Sentinel */ }; static PyMemberDef match_members[] = { {"re", T_OBJECT, offsetof(MatchObject, pattern), READONLY, "The regex object that produced this match object."}, {"pos", T_PYSSIZET, offsetof(MatchObject, pos), READONLY, "The position at which the regex engine starting searching."}, {"endpos", T_PYSSIZET, offsetof(MatchObject, endpos), READONLY, "The final position beyond which the regex engine won't search."}, {NULL} /* Sentinel */ }; static PyMappingMethods match_as_mapping = { (lenfunc)match_length, /* mp_length */ (binaryfunc)match_getitem, /* mp_subscript */ 0, /* mp_ass_subscript */ }; static PyTypeObject Match_Type = { PyObject_HEAD_INIT(NULL) 0, "_" RE_MODULE "." "Match", sizeof(MatchObject) }; /* Copies the groups. */ Py_LOCAL_INLINE(RE_GroupData*) copy_groups(RE_GroupData* groups, Py_ssize_t group_count) { Py_ssize_t span_count; Py_ssize_t g; RE_GroupData* groups_copy; RE_GroupSpan* spans_copy; Py_ssize_t offset; /* Calculate the total size of the group info. */ span_count = 0; for (g = 0; g < group_count; g++) span_count += groups[g].capture_count; /* Allocate the storage for the group info in a single block. */ groups_copy = (RE_GroupData*)re_alloc(group_count * sizeof(RE_GroupData) + span_count * sizeof(RE_GroupSpan)); if (!groups_copy) return NULL; /* The storage for the spans comes after the other group info. */ spans_copy = (RE_GroupSpan*)&groups_copy[group_count]; /* There's no need to initialise the spans info. */ memset(groups_copy, 0, group_count * sizeof(RE_GroupData)); offset = 0; for (g = 0; g < group_count; g++) { RE_GroupData* orig; RE_GroupData* copy; orig = &groups[g]; copy = &groups_copy[g]; copy->span = orig->span; copy->captures = &spans_copy[offset]; offset += orig->capture_count; if (orig->capture_count > 0) { Py_MEMCPY(copy->captures, orig->captures, orig->capture_count * sizeof(RE_GroupSpan)); copy->capture_capacity = orig->capture_count; copy->capture_count = orig->capture_count; } } return groups_copy; } /* Makes a copy of a MatchObject. */ Py_LOCAL_INLINE(PyObject*) make_match_copy(MatchObject* self) { MatchObject* match; if (!self->string) { /* The target string has been detached, so the MatchObject is now * immutable. */ Py_INCREF(self); return (PyObject*)self; } /* Create a MatchObject. */ match = PyObject_NEW(MatchObject, &Match_Type); if (!match) return NULL; match->string = self->string; match->substring = self->substring; match->substring_offset = self->substring_offset; match->pattern = self->pattern; match->regs = self->regs; Py_INCREF(match->string); Py_INCREF(match->substring); Py_INCREF(match->pattern); /* Copy the groups to the MatchObject. */ if (self->group_count > 0) { match->groups = copy_groups(self->groups, self->group_count); if (!match->groups) { Py_DECREF(match); return NULL; } } else match->groups = NULL; match->group_count = self->group_count; match->pos = self->pos; match->endpos = self->endpos; match->match_start = self->match_start; match->match_end = self->match_end; match->lastindex = match->lastindex; match->lastgroup = match->lastgroup; return (PyObject*)match; } /* Creates a new MatchObject. */ Py_LOCAL_INLINE(PyObject*) pattern_new_match(PatternObject* pattern, RE_State* state, int status) { /* Create MatchObject (from state object). */ if (status > 0) { MatchObject* match; /* Create a MatchObject. */ match = PyObject_NEW(MatchObject, &Match_Type); if (!match) return NULL; match->string = state->string; match->substring = state->string; match->substring_offset = 0; match->pattern = pattern; match->regs = NULL; Py_INCREF(match->string); Py_INCREF(match->substring); Py_INCREF(match->pattern); /* Copy the groups to the MatchObject. */ if (pattern->public_group_count > 0) { match->groups = copy_groups(state->groups, pattern->public_group_count); if (!match->groups) { Py_DECREF(match); return NULL; } } else match->groups = NULL; match->group_count = pattern->public_group_count; match->pos = state->slice_start; match->endpos = state->slice_end; if (state->reverse) { match->match_start = state->text_pos; match->match_end = state->match_pos; } else { match->match_start = state->match_pos; match->match_end = state->text_pos; } match->lastindex = state->lastindex; match->lastgroup = state->lastgroup; return (PyObject*)match; } else if (status == 0) { /* No match. */ Py_INCREF(Py_None); return Py_None; } else { /* Internal error. */ set_error(status, NULL); return NULL; } } /* Gets the text of a capture group from a state. */ Py_LOCAL_INLINE(PyObject*) state_get_group(RE_State* state, Py_ssize_t index, PyObject* string, BOOL empty) { RE_GroupData* group; Py_ssize_t start; Py_ssize_t end; group = &state->groups[index - 1]; if (string != Py_None && index >= 1 && index <= (Py_ssize_t)state->pattern->public_group_count && group->capture_count > 0) { start = group->span.start; end = group->span.end; } else { if (empty) /* Want an empty string. */ start = end = 0; else { Py_INCREF(Py_None); return Py_None; } } return get_slice(string, start, end); } /* Acquires the lock (mutex) on the state if there's one. * * It also increments the owner's refcount just to ensure that it won't be * destroyed by another thread. */ Py_LOCAL_INLINE(void) acquire_state_lock(PyObject* owner, RE_SafeState* safe_state) { RE_State* state; state = safe_state->re_state; if (state->lock) { /* In order to avoid deadlock we need to release the GIL while trying * to acquire the lock. */ Py_INCREF(owner); if (!PyThread_acquire_lock(state->lock, 0)) { release_GIL(safe_state); PyThread_acquire_lock(state->lock, 1); acquire_GIL(safe_state); } } } /* Releases the lock (mutex) on the state if there's one. * * It also decrements the owner's refcount, which was incremented when the lock * was acquired. */ Py_LOCAL_INLINE(void) release_state_lock(PyObject* owner, RE_SafeState* safe_state) { RE_State* state; state = safe_state->re_state; if (state->lock) { PyThread_release_lock(state->lock); Py_DECREF(owner); } } /* Implements the functionality of ScanObject's search and match methods. */ static PyObject* scanner_search_or_match(ScannerObject* self, BOOL search) { RE_State* state; RE_SafeState safe_state; PyObject* match; state = &self->state; /* Initialise the "safe state" structure. */ safe_state.re_state = state; safe_state.thread_state = NULL; /* Acquire the state lock in case we're sharing the scanner object across * threads. */ acquire_state_lock((PyObject*)self, &safe_state); if (self->status == 0) { /* No match. */ release_state_lock((PyObject*)self, &safe_state); Py_INCREF(Py_None); return Py_None; } else if (self->status < 0) { /* Internal error. */ release_state_lock((PyObject*)self, &safe_state); set_error(self->status, NULL); return NULL; } /* Look for another match. */ self->status = do_match(&safe_state, search); if (self->status < 0) { /* Internal error. */ release_state_lock((PyObject*)self, &safe_state); return NULL; } /* Create the match object. */ match = pattern_new_match(self->pattern, state, self->status); if (search && state->overlapped) { /* Advance one character. */ Py_ssize_t step; step = state->reverse ? -1 : 1; state->text_pos = state->match_pos + step; state->must_advance = FALSE; } else /* Continue from where we left off, but don't allow 2 contiguous * zero-width matches. */ state->must_advance = state->text_pos == state->match_pos; /* Release the state lock. */ release_state_lock((PyObject*)self, &safe_state); return match; } /* ScannerObject's 'match' method. */ static PyObject* scanner_match(ScannerObject* self, PyObject* unused) { return scanner_search_or_match(self, FALSE); } /* ScannerObject's 'search' method. */ static PyObject* scanner_search(ScannerObject* self, PyObject *unused) { return scanner_search_or_match(self, TRUE); } /* ScannerObject's 'next' method. */ static PyObject* scanner_next(PyObject* self) { PyObject* match; match = scanner_search((ScannerObject*)self, NULL); if (match == Py_None) { /* No match. */ Py_DECREF(Py_None); PyErr_SetNone(PyExc_StopIteration); return NULL; } return match; } /* Returns an iterator for a ScannerObject. * * The iterator is actually the ScannerObject itself. */ static PyObject* scanner_iter(PyObject* self) { Py_INCREF(self); return self; } /* Gets the next result from a scanner iterator. */ static PyObject* scanner_iternext(PyObject* self) { PyObject* match; match = scanner_search((ScannerObject*)self, NULL); if (match == Py_None) { /* No match. */ Py_DECREF(match); return NULL; } return match; } /* Makes a copy of a ScannerObject. * * It actually doesn't make a copy, just returns the original object. */ Py_LOCAL_INLINE(PyObject*) make_scanner_copy(ScannerObject* self) { Py_INCREF(self); return (PyObject*)self; } /* ScannerObject's '__copy__' method. */ static PyObject* scanner_copy(ScannerObject* self, PyObject *unused) { return make_scanner_copy(self); } /* ScannerObject's '__deepcopy__' method. */ static PyObject* scanner_deepcopy(ScannerObject* self, PyObject* memo) { return make_scanner_copy(self); } /* The documentation of a ScannerObject. */ PyDoc_STRVAR(scanner_match_doc, "match() --> MatchObject or None.\n\ Match at the current position in the string."); PyDoc_STRVAR(scanner_search_doc, "search() --> MatchObject or None.\n\ Search from the current position in the string."); /* ScannerObject's methods. */ static PyMethodDef scanner_methods[] = { {"next", (PyCFunction)scanner_next, METH_NOARGS}, {"match", (PyCFunction)scanner_match, METH_NOARGS, scanner_match_doc}, {"search", (PyCFunction)scanner_search, METH_NOARGS, scanner_search_doc}, {"__copy__", (PyCFunction)scanner_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)scanner_deepcopy, METH_O}, {NULL, NULL} }; PyDoc_STRVAR(scanner_doc, "Scanner object"); /* Deallocates a ScannerObject. */ static void scanner_dealloc(PyObject* self_) { ScannerObject* self; self = (ScannerObject*)self_; state_fini(&self->state); Py_DECREF(self->pattern); PyObject_DEL(self); } static PyMemberDef scanner_members[] = { {"pattern", T_OBJECT, offsetof(ScannerObject, pattern), READONLY, "The regex object that produced this scanner object."}, {NULL} /* Sentinel */ }; static PyTypeObject Scanner_Type = { PyObject_HEAD_INIT(NULL) 0, "_" RE_MODULE "." "Scanner", sizeof(ScannerObject) }; /* Decodes a 'concurrent' argument. */ Py_LOCAL_INLINE(int) decode_concurrent(PyObject* concurrent) { Py_ssize_t value; if (concurrent == Py_None) return RE_CONC_DEFAULT; value = PyLong_AsLong(concurrent); if (value == -1 && PyErr_Occurred()) { set_error(RE_ERROR_CONCURRENT, NULL); return -1; } return value ? RE_CONC_YES : RE_CONC_NO; } /* Creates a new ScannerObject. */ static PyObject* pattern_scanner(PatternObject* pattern, PyObject* args, PyObject* kwargs) { /* Create search state object. */ ScannerObject* self; Py_ssize_t start; Py_ssize_t end; int conc; PyObject* string; PyObject* pos = Py_None; PyObject* endpos = Py_None; Py_ssize_t overlapped = FALSE; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "pos", "endpos", "overlapped", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOnO:scanner", kwlist, &string, &pos, &endpos, &overlapped, &concurrent)) return NULL; start = as_string_index(pos, 0); if (start == -1 && PyErr_Occurred()) return NULL; end = as_string_index(endpos, PY_SSIZE_T_MAX); if (end == -1 && PyErr_Occurred()) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* Create a scanner object. */ self = PyObject_NEW(ScannerObject, &Scanner_Type); if (!self) return NULL; self->pattern = pattern; Py_INCREF(self->pattern); /* The MatchObject, and therefore repeated captures, will be visible. */ if (!state_init(&self->state, pattern, string, start, end, overlapped != 0, conc, TRUE, TRUE, FALSE)) { PyObject_DEL(self); return NULL; } self->status = 1; return (PyObject*) self; } /* Performs the split for the SplitterObject. */ static PyObject* next_split_part(SplitterObject* self) { RE_State* state; RE_SafeState safe_state; PyObject* result = NULL; /* Initialise to stop compiler warning. */ state = &self->state; /* Initialise the "safe state" structure. */ safe_state.re_state = state; safe_state.thread_state = NULL; /* Acquire the state lock in case we're sharing the splitter object across * threads. */ acquire_state_lock((PyObject*)self, &safe_state); if (self->status == 0) { /* Finished. */ release_state_lock((PyObject*)self, &safe_state); result = Py_False; Py_INCREF(result); return result; } else if (self->status < 0) { /* Internal error. */ release_state_lock((PyObject*)self, &safe_state); set_error(self->status, NULL); return NULL; } if (self->index == 0) { if (self->split_count < self->maxsplit) { Py_ssize_t step; Py_ssize_t end_pos; if (state->reverse) { step = -1; end_pos = state->slice_start; } else { step = 1; end_pos = state->slice_end; } retry: self->status = do_match(&safe_state, TRUE); if (self->status < 0) goto error; if (self->status == RE_ERROR_SUCCESS) { if (state->version_0) { /* Version 0 behaviour is to advance one character if the * split was zero-width. Unfortunately, this can give an * incorrect result. GvR wants this behaviour to be * retained so as not to break any existing software which * might rely on it. */ if (state->text_pos == state->match_pos) { if (self->last_pos == end_pos) goto no_match; /* Advance one character. */ state->text_pos += step; state->must_advance = FALSE; goto retry; } } ++self->split_count; /* Get segment before this match. */ if (state->reverse) result = get_slice(state->string, state->match_pos, self->last_pos); else result = get_slice(state->string, self->last_pos, state->match_pos); if (!result) goto error; self->last_pos = state->text_pos; /* Version 0 behaviour is to advance one character if the match * was zero-width. Unfortunately, this can give an incorrect * result. GvR wants this behaviour to be retained so as not to * break any existing software which might rely on it. */ if (state->version_0) { if (state->text_pos == state->match_pos) /* Advance one character. */ state->text_pos += step; state->must_advance = FALSE; } else /* Continue from where we left off, but don't allow a * contiguous zero-width match. */ state->must_advance = TRUE; } } else goto no_match; if (self->status == RE_ERROR_FAILURE) { no_match: /* Get segment following last match (even if empty). */ if (state->reverse) result = get_slice(state->string, 0, self->last_pos); else result = get_slice(state->string, self->last_pos, state->text_length); if (!result) goto error; } } else { /* Add group. */ result = state_get_group(state, self->index, state->string, FALSE); if (!result) goto error; } ++self->index; if (self->index > (Py_ssize_t)state->pattern->public_group_count) self->index = 0; /* Release the state lock. */ release_state_lock((PyObject*)self, &safe_state); return result; error: /* Release the state lock. */ release_state_lock((PyObject*)self, &safe_state); return NULL; } /* SplitterObject's 'split' method. */ static PyObject* splitter_split(SplitterObject* self, PyObject *unused) { PyObject* result; result = next_split_part(self); if (result == Py_False) { /* The sentinel. */ Py_DECREF(Py_False); Py_INCREF(Py_None); return Py_None; } return result; } /* SplitterObject's 'next' method. */ static PyObject* splitter_next(PyObject* self) { PyObject* result; result = next_split_part((SplitterObject*)self); if (result == Py_False) { /* No match. */ Py_DECREF(Py_False); PyErr_SetNone(PyExc_StopIteration); return NULL; } return result; } /* Returns an iterator for a SplitterObject. * * The iterator is actually the SplitterObject itself. */ static PyObject* splitter_iter(PyObject* self) { Py_INCREF(self); return self; } /* Gets the next result from a splitter iterator. */ static PyObject* splitter_iternext(PyObject* self) { PyObject* result; result = next_split_part((SplitterObject*)self); if (result == Py_False) { /* No match. */ Py_DECREF(result); return NULL; } return result; } /* Makes a copy of a SplitterObject. * * It actually doesn't make a copy, just returns the original object. */ Py_LOCAL_INLINE(PyObject*) make_splitter_copy(SplitterObject* self) { Py_INCREF(self); return (PyObject*)self; } /* SplitterObject's '__copy__' method. */ static PyObject* splitter_copy(SplitterObject* self, PyObject *unused) { return make_splitter_copy(self); } /* SplitterObject's '__deepcopy__' method. */ static PyObject* splitter_deepcopy(SplitterObject* self, PyObject* memo) { return make_splitter_copy(self); } /* The documentation of a SplitterObject. */ PyDoc_STRVAR(splitter_split_doc, "split() --> string or None.\n\ Return the next part of the split string."); /* SplitterObject's methods. */ static PyMethodDef splitter_methods[] = { {"next", (PyCFunction)splitter_next, METH_NOARGS}, {"split", (PyCFunction)splitter_split, METH_NOARGS, splitter_split_doc}, {"__copy__", (PyCFunction)splitter_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)splitter_deepcopy, METH_O}, {NULL, NULL} }; PyDoc_STRVAR(splitter_doc, "Splitter object"); /* Deallocates a SplitterObject. */ static void splitter_dealloc(PyObject* self_) { SplitterObject* self; self = (SplitterObject*)self_; state_fini(&self->state); Py_DECREF(self->pattern); PyObject_DEL(self); } static PyMemberDef splitter_members[] = { {"pattern", T_OBJECT, offsetof(SplitterObject, pattern), READONLY, "The regex object that produced this splitter object."}, {NULL} /* Sentinel */ }; static PyTypeObject Splitter_Type = { PyObject_HEAD_INIT(NULL) 0, "_" RE_MODULE "." "Splitter", sizeof(SplitterObject) }; /* Creates a new SplitterObject. */ static PyObject* pattern_splitter(PatternObject* pattern, PyObject* args, PyObject* kwargs) { /* Create split state object. */ int conc; SplitterObject* self; RE_State* state; PyObject* string; Py_ssize_t maxsplit = 0; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "maxsplit", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO:splitter", kwlist, &string, &maxsplit, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* Create a splitter object. */ self = PyObject_NEW(SplitterObject, &Splitter_Type); if (!self) return NULL; self->pattern = pattern; Py_INCREF(self->pattern); if (maxsplit == 0) maxsplit = PY_SSIZE_T_MAX; state = &self->state; /* The MatchObject, and therefore repeated captures, will not be visible. */ if (!state_init(state, pattern, string, 0, PY_SSIZE_T_MAX, FALSE, conc, TRUE, FALSE, FALSE)) { PyObject_DEL(self); return NULL; } self->maxsplit = maxsplit; self->last_pos = state->reverse ? state->text_length : 0; self->split_count = 0; self->index = 0; self->status = 1; return (PyObject*) self; } /* Implements the functionality of PatternObject's search and match methods. */ static PyObject* pattern_search_or_match(PatternObject* self, PyObject* args, PyObject* kwargs, char* args_desc, BOOL search, BOOL match_all) { Py_ssize_t start; Py_ssize_t end; int conc; RE_State state; RE_SafeState safe_state; int status; PyObject* match; PyObject* string; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "pos", "endpos", "concurrent", NULL }; /* When working with a short string, such as a line from a file, the * relative cost of PyArg_ParseTupleAndKeywords can be significant, and * it's worth not using it when there are only positional arguments. */ Py_ssize_t arg_count; if (args && !kwargs && PyTuple_CheckExact(args)) arg_count = PyTuple_GET_SIZE(args); else arg_count = -1; if (1 <= arg_count && arg_count <= 4) { string = PyTuple_GET_ITEM(args, 0); if (arg_count >= 2) pos = PyTuple_GET_ITEM(args, 1); if (arg_count >= 3) endpos = PyTuple_GET_ITEM(args, 2); if (arg_count >= 4) concurrent = PyTuple_GET_ITEM(args, 3); } else if (!PyArg_ParseTupleAndKeywords(args, kwargs, args_desc, kwlist, &string, &pos, &endpos, &concurrent)) return NULL; start = as_string_index(pos, 0); if (start == -1 && PyErr_Occurred()) return NULL; end = as_string_index(endpos, PY_SSIZE_T_MAX); if (end == -1 && PyErr_Occurred()) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* The MatchObject, and therefore repeated captures, will be visible. */ if (!state_init(&state, self, string, start, end, FALSE, conc, FALSE, TRUE, match_all)) return NULL; /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; status = do_match(&safe_state, search); if (status < 0) { state_fini(&state); return NULL; } /* Create the match object. */ match = pattern_new_match(self, &state, status); state_fini(&state); return match; } /* PatternObject's 'match' method. */ static PyObject* pattern_match(PatternObject* self, PyObject* args, PyObject* kwargs) { return pattern_search_or_match(self, args, kwargs, "O|OOO:match", FALSE, FALSE); } /* PatternObject's 'fullmatch' method. */ static PyObject* pattern_fullmatch(PatternObject* self, PyObject* args, PyObject* kwargs) { return pattern_search_or_match(self, args, kwargs, "O|OOO:fullmatch", FALSE, TRUE); } /* PatternObject's 'search' method. */ static PyObject* pattern_search(PatternObject* self, PyObject* args, PyObject* kwargs) { return pattern_search_or_match(self, args, kwargs, "O|OOO:search", TRUE, FALSE); } /* Gets the limits of the matching. */ Py_LOCAL_INLINE(BOOL) get_limits(PyObject* pos, PyObject* endpos, Py_ssize_t length, Py_ssize_t* start, Py_ssize_t* end) { Py_ssize_t s; Py_ssize_t e; s = as_string_index(pos, 0); if (s == -1 && PyErr_Occurred()) return FALSE; e = as_string_index(endpos, PY_SSIZE_T_MAX); if (e == -1 && PyErr_Occurred()) return FALSE; /* Adjust boundaries. */ if (s < 0) s += length; if (s < 0) s = 0; else if (s > length) s = length; if (e < 0) e += length; if (e < 0) e = 0; else if (e > length) e = length; *start = s; *end = e; return TRUE; } /* Gets a replacement item from the replacement list. * * The replacement item could be a string literal or a group. * * It can return None to represent an empty string. */ Py_LOCAL_INLINE(PyObject*) get_sub_replacement(PyObject* item, PyObject* string, RE_State* state, Py_ssize_t group_count) { Py_ssize_t index; if (PyUnicode_CheckExact(item) || PyString_CheckExact(item)) { /* It's a literal, which can be added directly to the list. */ Py_INCREF(item); return item; } /* Is it a group reference? */ index = as_group_index(item); if (index == -1 && PyErr_Occurred()) { /* Not a group either! */ set_error(RE_ERROR_REPLACEMENT, NULL); return NULL; } if (index == 0) { /* The entire matched portion of the string. */ if (state->match_pos == state->text_pos) { /* Return None for "". */ Py_INCREF(Py_None); return Py_None; } if (state->reverse) return get_slice(string, state->text_pos, state->match_pos); else return get_slice(string, state->match_pos, state->text_pos); } else if (1 <= index && index <= group_count) { /* A group. */ RE_GroupData* group; group = &state->groups[index - 1]; if (group->capture_count == 0 && group->span.start != group->span.end) { /* The group didn't match or is "", so return None for "". */ Py_INCREF(Py_None); return Py_None; } return get_slice(string, group->span.start, group->span.end); } else { /* No such group. */ set_error(RE_ERROR_INVALID_GROUP_REF, NULL); return NULL; } } /* PatternObject's 'subx' method. */ Py_LOCAL_INLINE(PyObject*) pattern_subx(PatternObject* self, PyObject* str_template, PyObject* string, Py_ssize_t maxsub, int sub_type, PyObject* pos, PyObject* endpos, int concurrent) { RE_StringInfo str_info; Py_ssize_t start; Py_ssize_t end; BOOL is_callable = FALSE; BOOL is_literal = FALSE; BOOL is_template = FALSE; PyObject* replacement = NULL; #if PY_VERSION_HEX >= 0x02060000 BOOL is_format = FALSE; #endif RE_State state; RE_SafeState safe_state; JoinInfo join_info; Py_ssize_t sub_count; Py_ssize_t last_pos; PyObject* item; Py_ssize_t end_pos; Py_ssize_t step; /* Get the string. */ if (!get_string(string, &str_info)) return NULL; /* Get the limits of the search. */ if (!get_limits(pos, endpos, str_info.length, &start, &end)) { #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return NULL; } /* If the pattern is too long for the string, then take a shortcut, unless * it's a fuzzy pattern. */ if (!self->is_fuzzy && (Py_ssize_t)self->min_width > end - start) { PyObject* result; Py_INCREF(string); if (sub_type & RE_SUBN) result = Py_BuildValue("Nn", string, 0); else result = string; #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return result; } if (maxsub == 0) maxsub = PY_SSIZE_T_MAX; /* sub/subn takes either a function or a string template. */ if (PyCallable_Check(str_template)) { /* It's callable. */ is_callable = TRUE; replacement = str_template; Py_INCREF(replacement); #if PY_VERSION_HEX >= 0x02060000 } else if (sub_type & RE_SUBF) { /* Is it a literal format? * * To keep it simple we'll say that a literal is a string which can be * used as-is, so no placeholders. */ Py_ssize_t literal_length; literal_length = check_replacement_string(str_template, '{'); if (literal_length > 0) { /* It's a literal. */ is_literal = TRUE; replacement = str_template; Py_INCREF(replacement); } else if (literal_length < 0) { /* It isn't a literal, so get the 'format' method. */ is_format = TRUE; replacement = PyObject_GetAttrString(str_template, "format"); if (!replacement) { release_buffer(&str_info); return NULL; } } #endif } else { /* Is it a literal template? * * To keep it simple we'll say that a literal is a string which can be * used as-is, so no backslashes. */ Py_ssize_t literal_length; literal_length = check_replacement_string(str_template, '\\'); if (literal_length > 0) { /* It's a literal. */ is_literal = TRUE; replacement = str_template; Py_INCREF(replacement); } else if (literal_length < 0 ) { /* It isn't a literal, so hand it over to the template compiler. */ is_template = TRUE; replacement = call(RE_MODULE, "_compile_replacement_helper", PyTuple_Pack(2, self, str_template)); if (!replacement) { #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return NULL; } } } /* The MatchObject, and therefore repeated captures, will be visible only * if the replacement is callable. */ if (!state_init_2(&state, self, string, &str_info, start, end, FALSE, concurrent, FALSE, is_callable, FALSE)) { #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif Py_XDECREF(replacement); return NULL; } /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; join_info.item = NULL; join_info.list = NULL; join_info.reversed = state.reverse; join_info.is_unicode = PyUnicode_Check(string); sub_count = 0; last_pos = state.reverse ? state.text_length : 0; step = state.reverse ? -1 : 1; while (sub_count < maxsub) { int status; status = do_match(&safe_state, TRUE); if (status < 0) goto error; if (status == 0) break; /* Append the segment before this match. */ if (state.match_pos != last_pos) { if (state.reverse) item = get_slice(string, state.match_pos, last_pos); else item = get_slice(string, last_pos, state.match_pos); if (!item) goto error; /* Add to the list. */ status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; } /* Add this match. */ if (is_literal) { /* The replacement is a literal string. */ status = add_item(&join_info, replacement); if (status < 0) goto error; #if PY_VERSION_HEX >= 0x02060000 } else if (is_format) { /* The replacement is a format string. */ MatchObject* match; PyObject* args; Py_ssize_t g; PyObject* kwargs; /* We need to create the arguments for the 'format' method. We'll * start by creating a MatchObject. */ match = (MatchObject*)pattern_new_match(self, &state, 1); if (!match) goto error; /* The args are a tuple of the capture group matches. */ args = PyTuple_New(state.pattern->public_group_count + 1); if (!args) { Py_DECREF(match); goto error; } for (g = 0; g < state.pattern->public_group_count + 1; g++) PyTuple_SetItem(args, g, match_get_group_by_index(match, g, Py_None)); /* The kwargs are a dict of the named capture group matches. */ kwargs = match_get_group_dict(match); if (!kwargs) { Py_DECREF(args); Py_DECREF(match); goto error; } /* Call the 'format' method. */ item = PyObject_Call(replacement, args, kwargs); Py_DECREF(kwargs); Py_DECREF(args); Py_DECREF(match); if (!item) goto error; /* Add the result to the list. */ status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; #endif } else if (is_template) { /* The replacement is a list template. */ Py_ssize_t size; Py_ssize_t i; /* Add each part of the template to the list. */ size = PyList_GET_SIZE(replacement); for (i = 0; i < size; i++) { PyObject* item; PyObject* str_item; item = PyList_GET_ITEM(replacement, i); str_item = get_sub_replacement(item, string, &state, self->public_group_count); if (!str_item) goto error; /* Add the result to the list. */ if (str_item == Py_None) /* None for "". */ Py_DECREF(str_item); else { status = add_item(&join_info, str_item); Py_DECREF(str_item); if (status < 0) goto error; } } } else if (is_callable) { /* Pass a MatchObject to the replacement function. */ PyObject* match; PyObject* args; /* We need to create a MatchObject to pass to the replacement * function. */ match = pattern_new_match(self, &state, 1); if (!match) goto error; /* The args for the replacement function. */ args = PyTuple_Pack(1, match); if (!args) { Py_DECREF(match); goto error; } /* Call the replacement function. */ item = PyObject_CallObject(replacement, args); Py_DECREF(args); Py_DECREF(match); if (!item) goto error; /* Add the result to the list. */ status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; } ++sub_count; last_pos = state.text_pos; if (state.version_0) { /* Always advance after a zero-width match. */ if (state.match_pos == state.text_pos) { state.text_pos += step; state.must_advance = FALSE; } else state.must_advance = TRUE; } else /* Continue from where we left off, but don't allow a contiguous * zero-width match. */ state.must_advance = state.match_pos == state.text_pos; } /* Get the segment following the last match. We use 'length' instead of * 'text_length' because the latter is truncated to 'slice_end', a * documented idiosyncracy of the 're' module. */ end_pos = state.reverse ? 0 : str_info.length; if (last_pos != end_pos) { int status; /* The segment is part of the original string. */ if (state.reverse) item = get_slice(string, 0, last_pos); else item = get_slice(string, last_pos, str_info.length); if (!item) goto error; status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; } Py_XDECREF(replacement); /* Convert the list to a single string (also cleans up join_info). */ item = join_list_info(&join_info); state_fini(&state); if (!item) return NULL; if (sub_type & RE_SUBN) return Py_BuildValue("Nn", item, sub_count); return item; error: Py_XDECREF(join_info.list); Py_XDECREF(join_info.item); state_fini(&state); Py_XDECREF(replacement); return NULL; } /* PatternObject's 'sub' method. */ static PyObject* pattern_sub(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* replacement; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "repl", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:sub", kwlist, &replacement, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, replacement, string, count, RE_SUB, pos, endpos, conc); } #if PY_VERSION_HEX >= 0x02060000 /* PatternObject's 'subf' method. */ static PyObject* pattern_subf(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* format; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "format", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:sub", kwlist, &format, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, format, string, count, RE_SUBF, pos, endpos, conc); } #endif /* PatternObject's 'subn' method. */ static PyObject* pattern_subn(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* replacement; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "repl", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:subn", kwlist, &replacement, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, replacement, string, count, RE_SUBN, pos, endpos, conc); } #if PY_VERSION_HEX >= 0x02060000 /* PatternObject's 'subfn' method. */ static PyObject* pattern_subfn(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* format; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "format", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:subn", kwlist, &format, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, format, string, count, RE_SUBF | RE_SUBN, pos, endpos, conc); } #endif /* PatternObject's 'split' method. */ static PyObject* pattern_split(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; RE_State state; RE_SafeState safe_state; PyObject* list; PyObject* item; int status; Py_ssize_t split_count; Py_ssize_t g; Py_ssize_t start_pos; Py_ssize_t end_pos; Py_ssize_t step; Py_ssize_t last_pos; PyObject* string; Py_ssize_t maxsplit = 0; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "maxsplit", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO:split", kwlist, &string, &maxsplit, &concurrent)) return NULL; if (maxsplit == 0) maxsplit = PY_SSIZE_T_MAX; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* The MatchObject, and therefore repeated captures, will not be visible. */ if (!state_init(&state, self, string, 0, PY_SSIZE_T_MAX, FALSE, conc, FALSE, FALSE, FALSE)) return NULL; /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; list = PyList_New(0); if (!list) { state_fini(&state); return NULL; } split_count = 0; if (state.reverse) { start_pos = state.text_length; end_pos = 0; step = -1; } else { start_pos = 0; end_pos = state.text_length; step = 1; } last_pos = start_pos; while (split_count < maxsplit) { status = do_match(&safe_state, TRUE); if (status < 0) goto error; if (status == 0) /* No more matches. */ break; if (state.version_0) { /* Version 0 behaviour is to advance one character if the split was * zero-width. Unfortunately, this can give an incorrect result. * GvR wants this behaviour to be retained so as not to break any * existing software which might rely on it. */ if (state.text_pos == state.match_pos) { if (last_pos == end_pos) break; /* Advance one character. */ state.text_pos += step; state.must_advance = FALSE; continue; } } /* Get segment before this match. */ if (state.reverse) item = get_slice(string, state.match_pos, last_pos); else item = get_slice(string, last_pos, state.match_pos); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; /* Add groups (if any). */ for (g = 1; g <= self->public_group_count; g++) { item = state_get_group(&state, g, string, FALSE); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; } ++split_count; last_pos = state.text_pos; /* Version 0 behaviour is to advance one character if the match was * zero-width. Unfortunately, this can give an incorrect result. GvR * wants this behaviour to be retained so as not to break any existing * software which might rely on it. */ if (state.version_0) { if (state.text_pos == state.match_pos) /* Advance one character. */ state.text_pos += step; state.must_advance = FALSE; } else /* Continue from where we left off, but don't allow a contiguous * zero-width match. */ state.must_advance = TRUE; } /* Get segment following last match (even if empty). */ if (state.reverse) item = get_slice(string, 0, last_pos); else item = get_slice(string, last_pos, state.text_length); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; state_fini(&state); return list; error: Py_DECREF(list); state_fini(&state); return NULL; } /* PatternObject's 'splititer' method. */ static PyObject* pattern_splititer(PatternObject* pattern, PyObject* args, PyObject* kwargs) { return pattern_splitter(pattern, args, kwargs); } /* PatternObject's 'findall' method. */ static PyObject* pattern_findall(PatternObject* self, PyObject* args, PyObject* kwargs) { Py_ssize_t start; Py_ssize_t end; RE_State state; int conc; RE_SafeState safe_state; PyObject* list; Py_ssize_t step; int status; Py_ssize_t g; Py_ssize_t b; Py_ssize_t e; PyObject* string; PyObject* pos = Py_None; PyObject* endpos = Py_None; Py_ssize_t overlapped = FALSE; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "pos", "endpos", "overlapped", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOnO:findall", kwlist, &string, &pos, &endpos, &overlapped, &concurrent)) return NULL; start = as_string_index(pos, 0); if (start == -1 && PyErr_Occurred()) return NULL; end = as_string_index(endpos, PY_SSIZE_T_MAX); if (end == -1 && PyErr_Occurred()) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* The MatchObject, and therefore repeated captures, will not be visible. */ if (!state_init(&state, self, string, start, end, overlapped != 0, conc, FALSE, FALSE, FALSE)) return NULL; /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; list = PyList_New(0); if (!list) { state_fini(&state); return NULL; } step = state.reverse ? -1 : 1; while (state.slice_start <= state.text_pos && state.text_pos <= state.slice_end) { PyObject* item; status = do_match(&safe_state, TRUE); if (status < 0) goto error; if (status == 0) break; /* Don't bother to build a MatchObject. */ switch (self->public_group_count) { case 0: if (state.reverse) { b = state.text_pos; e = state.match_pos; } else { b = state.match_pos; e = state.text_pos; } item = get_slice(string, b, e); if (!item) goto error; break; case 1: item = state_get_group(&state, 1, string, TRUE); if (!item) goto error; break; default: item = PyTuple_New(self->public_group_count); if (!item) goto error; for (g = 0; g < self->public_group_count; g++) { PyObject* o = state_get_group(&state, g + 1, string, TRUE); if (!o) { Py_DECREF(item); goto error; } PyTuple_SET_ITEM(item, g, o); } break; } status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; if (state.overlapped) { /* Advance one character. */ state.text_pos = state.match_pos + step; state.must_advance = FALSE; } else /* Continue from where we left off, but don't allow 2 contiguous * zero-width matches. */ state.must_advance = state.text_pos == state.match_pos; } state_fini(&state); return list; error: Py_DECREF(list); state_fini(&state); return NULL; } /* PatternObject's 'finditer' method. */ static PyObject* pattern_finditer(PatternObject* pattern, PyObject* args, PyObject* kwargs) { return pattern_scanner(pattern, args, kwargs); } /* Makes a copy of a PatternObject. */ Py_LOCAL_INLINE(PyObject*) make_pattern_copy(PatternObject* self) { Py_INCREF(self); return (PyObject*)self; } /* PatternObject's '__copy__' method. */ static PyObject* pattern_copy(PatternObject* self, PyObject *unused) { return make_pattern_copy(self); } /* PatternObject's '__deepcopy__' method. */ static PyObject* pattern_deepcopy(PatternObject* self, PyObject* memo) { return make_pattern_copy(self); } /* The documentation of a PatternObject. */ PyDoc_STRVAR(pattern_match_doc, "match(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None.\n\ Match zero or more characters at the beginning of the string."); PyDoc_STRVAR(pattern_fullmatch_doc, "fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None.\n\ Match zero or more characters against all of the string."); PyDoc_STRVAR(pattern_search_doc, "search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None.\n\ Search through string looking for a match, and return a corresponding\n\ match object instance. Return None if no match is found."); PyDoc_STRVAR(pattern_sub_doc, "sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring\n\ Return the string obtained by replacing the leftmost (or rightmost with a\n\ reverse pattern) non-overlapping occurrences of pattern in string by the\n\ replacement repl."); #if PY_VERSION_HEX >= 0x02060000 PyDoc_STRVAR(pattern_subf_doc, "subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring\n\ Return the string obtained by replacing the leftmost (or rightmost with a\n\ reverse pattern) non-overlapping occurrences of pattern in string by the\n\ replacement format."); #endif PyDoc_STRVAR(pattern_subn_doc, "subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs)\n\ Return the tuple (new_string, number_of_subs_made) found by replacing the\n\ leftmost (or rightmost with a reverse pattern) non-overlapping occurrences\n\ of pattern with the replacement repl."); #if PY_VERSION_HEX >= 0x02060000 PyDoc_STRVAR(pattern_subfn_doc, "subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs)\n\ Return the tuple (new_string, number_of_subs_made) found by replacing the\n\ leftmost (or rightmost with a reverse pattern) non-overlapping occurrences\n\ of pattern with the replacement format."); #endif PyDoc_STRVAR(pattern_split_doc, "split(string, string, maxsplit=0, concurrent=None) --> list.\n\ Split string by the occurrences of pattern."); PyDoc_STRVAR(pattern_splititer_doc, "splititer(string, maxsplit=0, concurrent=None) --> iterator.\n\ Return an iterator yielding the parts of a split string."); PyDoc_STRVAR(pattern_findall_doc, "findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list.\n\ Return a list of all matches of pattern in string. The matches may be\n\ overlapped if overlapped is True."); PyDoc_STRVAR(pattern_finditer_doc, "finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator.\n\ Return an iterator over all matches for the RE pattern in string. The\n\ matches may be overlapped if overlapped is True. For each match, the\n\ iterator returns a MatchObject."); PyDoc_STRVAR(pattern_scanner_doc, "scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner.\n\ Return an scanner for the RE pattern in string. The matches may be overlapped\n\ if overlapped is True."); /* The methods of a PatternObject. */ static PyMethodDef pattern_methods[] = { {"match", (PyCFunction)pattern_match, METH_VARARGS|METH_KEYWORDS, pattern_match_doc}, {"fullmatch", (PyCFunction)pattern_fullmatch, METH_VARARGS|METH_KEYWORDS, pattern_fullmatch_doc}, {"search", (PyCFunction)pattern_search, METH_VARARGS|METH_KEYWORDS, pattern_search_doc}, {"sub", (PyCFunction)pattern_sub, METH_VARARGS|METH_KEYWORDS, pattern_sub_doc}, #if PY_VERSION_HEX >= 0x02060000 {"subf", (PyCFunction)pattern_subf, METH_VARARGS|METH_KEYWORDS, pattern_subf_doc}, #endif {"subn", (PyCFunction)pattern_subn, METH_VARARGS|METH_KEYWORDS, pattern_subn_doc}, #if PY_VERSION_HEX >= 0x02060000 {"subfn", (PyCFunction)pattern_subfn, METH_VARARGS|METH_KEYWORDS, pattern_subfn_doc}, #endif {"split", (PyCFunction)pattern_split, METH_VARARGS|METH_KEYWORDS, pattern_split_doc}, {"splititer", (PyCFunction)pattern_splititer, METH_VARARGS|METH_KEYWORDS, pattern_splititer_doc}, {"findall", (PyCFunction)pattern_findall, METH_VARARGS|METH_KEYWORDS, pattern_findall_doc}, {"finditer", (PyCFunction)pattern_finditer, METH_VARARGS|METH_KEYWORDS, pattern_finditer_doc}, {"scanner", (PyCFunction)pattern_scanner, METH_VARARGS|METH_KEYWORDS, pattern_scanner_doc}, {"__copy__", (PyCFunction)pattern_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)pattern_deepcopy, METH_O}, {NULL, NULL} }; PyDoc_STRVAR(pattern_doc, "Compiled regex object"); /* Deallocates a PatternObject. */ static void pattern_dealloc(PyObject* self_) { PatternObject* self; Py_ssize_t i; self = (PatternObject*)self_; /* Discard the nodes. */ for (i = 0; i < self->node_count; i++) { RE_Node* node; node = self->node_list[i]; re_dealloc(node->values); if (node->status & RE_STATUS_STRING) { re_dealloc(node->string.bad_character_offset); re_dealloc(node->string.good_suffix_offset); } re_dealloc(node); } re_dealloc(self->node_list); /* Discard the group info. */ re_dealloc(self->group_info); /* Discard the call_ref info. */ re_dealloc(self->call_ref_info); /* Discard the repeat info. */ re_dealloc(self->repeat_info); dealloc_groups(self->groups_storage, self->true_group_count); dealloc_repeats(self->repeats_storage, self->repeat_count); if (self->weakreflist) PyObject_ClearWeakRefs((PyObject*)self); Py_XDECREF(self->pattern); Py_XDECREF(self->groupindex); Py_XDECREF(self->indexgroup); Py_DECREF(self->named_lists); Py_DECREF(self->named_list_indexes); PyObject_DEL(self); } typedef struct RE_FlagName { char* name; int value; } RE_FlagName; /* We won't bother about the A flag in Python 2. */ static RE_FlagName flag_names[] = { {"B", RE_FLAG_BESTMATCH}, {"D", RE_FLAG_DEBUG}, {"S", RE_FLAG_DOTALL}, {"F", RE_FLAG_FULLCASE}, {"I", RE_FLAG_IGNORECASE}, {"L", RE_FLAG_LOCALE}, {"M", RE_FLAG_MULTILINE}, {"R", RE_FLAG_REVERSE}, {"T", RE_FLAG_TEMPLATE}, {"U", RE_FLAG_UNICODE}, {"X", RE_FLAG_VERBOSE}, {"V0", RE_FLAG_VERSION0}, {"V1", RE_FLAG_VERSION1}, {"W", RE_FLAG_WORD}, }; /* Appends a string to a list. */ Py_LOCAL_INLINE(BOOL) append_string(PyObject* list, char* string) { PyObject* item; int status; item = Py_BuildValue("s", string); if (!item) return FALSE; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) return FALSE; return TRUE; } /* Appends a (decimal) integer to a list. */ Py_LOCAL_INLINE(BOOL) append_integer(PyObject* list, Py_ssize_t value) { PyObject* int_obj; PyObject* repr_obj; int status; int_obj = Py_BuildValue("n", value); if (!int_obj) return FALSE; repr_obj = PyObject_Repr(int_obj); Py_DECREF(int_obj); if (!repr_obj) return FALSE; status = PyList_Append(list, repr_obj); Py_DECREF(repr_obj); if (status < 0) return FALSE; return TRUE; } /* MatchObject's '__repr__' method. */ static PyObject* match_repr(PyObject* self_) { MatchObject* self; PyObject* list; PyObject* matched_substring; PyObject* matched_repr; int status; PyObject* separator; PyObject* result; self = (MatchObject*)self_; list = PyList_New(0); if (!list) return NULL; if (!append_string(list, "match_start)) goto error; if (! append_string(list, ", ")) goto error; if (!append_integer(list, self->match_end)) goto error; if (!append_string(list, "), match=")) goto error; matched_substring = get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); if (!matched_substring) goto error; matched_repr = PyObject_Repr(matched_substring); Py_DECREF(matched_substring); if (!matched_repr) goto error; status = PyList_Append(list, matched_repr); Py_DECREF(matched_repr); if (status < 0) goto error; if (! append_string(list, ">")) goto error; separator = Py_BuildValue("s", ""); if (!separator) goto error; result = PyUnicode_Join(separator, list); Py_DECREF(separator); Py_DECREF(list); return result; error: Py_DECREF(list); return NULL; } /* PatternObject's '__repr__' method. */ static PyObject* pattern_repr(PyObject* self_) { PatternObject* self; PyObject* list; PyObject* item; int status; int flag_count; Py_ssize_t i; PyObject *key; PyObject *value; PyObject* separator; PyObject* result; self = (PatternObject*)self_; list = PyList_New(0); if (!list) return NULL; if (!append_string(list, "regex.Regex(")) goto error; item = PyObject_Repr(self->pattern); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; flag_count = 0; for (i = 0; i < sizeof(flag_names) / sizeof(flag_names[0]); i++) { if (self->flags & flag_names[i].value) { if (flag_count == 0) { if (!append_string(list, ", flags=")) goto error; } else { if (!append_string(list, " | ")) goto error; } if (!append_string(list, "regex.")) goto error; if (!append_string(list, flag_names[i].name)) goto error; ++flag_count; } } i = 0; while (PyDict_Next(self->named_lists, &i, &key, &value)) { if (!append_string(list, ", ")) goto error; status = PyList_Append(list, key); if (status < 0) goto error; item = PyObject_Repr(value); if (!item) goto error; if (!append_string(list, "=")) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; } if (!append_string(list, ")")) goto error; separator = Py_BuildValue("s", ""); if (!separator) goto error; result = PyUnicode_Join(separator, list); Py_DECREF(separator); Py_DECREF(list); return result; error: Py_DECREF(list); return NULL; } /* PatternObject's 'groupindex' method. */ static PyObject* pattern_groupindex(PyObject* self_) { PatternObject* self; self = (PatternObject*)self_; return PyDict_Copy(self->groupindex); } static PyGetSetDef pattern_getset[] = { {"groupindex", (getter)pattern_groupindex, (setter)NULL, "A dictionary mapping group names to group numbers."}, {NULL} /* Sentinel */ }; static PyMemberDef pattern_members[] = { {"pattern", T_OBJECT, offsetof(PatternObject, pattern), READONLY, "The pattern string from which the regex object was compiled."}, {"flags", T_PYSSIZET, offsetof(PatternObject, flags), READONLY, "The regex matching flags."}, {"groups", T_PYSSIZET, offsetof(PatternObject, public_group_count), READONLY, "The number of capturing groups in the pattern."}, {"named_lists", T_OBJECT, offsetof(PatternObject, named_lists), READONLY, "The named lists used by the regex."}, {NULL} /* Sentinel */ }; static PyTypeObject Pattern_Type = { PyObject_HEAD_INIT(NULL) 0, "_" RE_MODULE "." "Pattern", sizeof(PatternObject) }; /* Building the nodes is made simpler by allowing branches to have a single * exit. These need to be removed. */ Py_LOCAL_INLINE(void) skip_one_way_branches(PatternObject* pattern) { BOOL modified; /* If a node refers to a 1-way branch then make the former refer to the * latter's destination. Repeat until they're all done. */ do { Py_ssize_t i; modified = FALSE; for (i = 0; i < pattern->node_count; i++) { RE_Node* node; RE_Node* next; node = pattern->node_list[i]; /* Check the first destination. */ next = node->next_1.node; if (next && next->op == RE_OP_BRANCH && !next->nonstring.next_2.node) { node->next_1.node = next->next_1.node; modified = TRUE; } /* Check the second destination. */ next = node->nonstring.next_2.node; if (next && next->op == RE_OP_BRANCH && !next->nonstring.next_2.node) { node->nonstring.next_2.node = next->next_1.node; modified = TRUE; } } } while (modified); /* The start node might be a 1-way branch. Skip over it because it'll be * removed. It might even be the first in a chain. */ while (pattern->start_node->op == RE_OP_BRANCH && !pattern->start_node->nonstring.next_2.node) pattern->start_node = pattern->start_node->next_1.node; } /* Adds guards to repeats which are followed by a reference to a group. * * Returns whether a guard was added for a node at or after the given node. */ Py_LOCAL_INLINE(RE_STATUS_T) add_repeat_guards(PatternObject* pattern, RE_Node* node) { RE_STATUS_T result; result = RE_STATUS_NEITHER; for (;;) { if (node->status & RE_STATUS_VISITED_AG) return node->status & (RE_STATUS_REPEAT | RE_STATUS_REF); switch (node->op) { case RE_OP_ATOMIC: case RE_OP_LOOKAROUND: { RE_STATUS_T body_result; RE_STATUS_T tail_result; RE_STATUS_T status; body_result = add_repeat_guards(pattern, node->nonstring.next_2.node); tail_result = add_repeat_guards(pattern, node->next_1.node); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, body_result), tail_result); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_BRANCH: { RE_STATUS_T branch_1_result; RE_STATUS_T branch_2_result; RE_STATUS_T status; branch_1_result = add_repeat_guards(pattern, node->next_1.node); branch_2_result = add_repeat_guards(pattern, node->nonstring.next_2.node); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, branch_1_result), branch_2_result); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_END_GREEDY_REPEAT: case RE_OP_END_LAZY_REPEAT: node->status |= RE_STATUS_VISITED_AG; return result; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: { BOOL limited; RE_STATUS_T body_result; RE_STATUS_T tail_result; RE_RepeatInfo* repeat_info; RE_STATUS_T status; limited = node->values[2] != RE_UNLIMITED; if (limited) body_result = RE_STATUS_LIMITED; else body_result = add_repeat_guards(pattern, node->next_1.node); tail_result = add_repeat_guards(pattern, node->nonstring.next_2.node); repeat_info = &pattern->repeat_info[node->values[0]]; if (body_result != RE_STATUS_REF) repeat_info->status |= RE_STATUS_BODY; if (tail_result != RE_STATUS_REF) repeat_info->status |= RE_STATUS_TAIL; if (limited) result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_LIMITED); else result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_REPEAT); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, body_result), tail_result); node->status |= RE_STATUS_VISITED_AG | status; return status; } case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: { BOOL limited; RE_STATUS_T tail_result; RE_RepeatInfo* repeat_info; RE_STATUS_T status; limited = node->values[2] != RE_UNLIMITED; tail_result = add_repeat_guards(pattern, node->next_1.node); repeat_info = &pattern->repeat_info[node->values[0]]; repeat_info->status |= RE_STATUS_BODY; if (tail_result != RE_STATUS_REF) repeat_info->status |= RE_STATUS_TAIL; if (limited) result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_LIMITED); else result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_REPEAT); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, RE_STATUS_REPEAT), tail_result); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_GROUP_EXISTS: { RE_STATUS_T branch_1_result; RE_STATUS_T branch_2_result; RE_STATUS_T status; branch_1_result = add_repeat_guards(pattern, node->next_1.node); branch_2_result = add_repeat_guards(pattern, node->nonstring.next_2.node); status = (RE_STATUS_T)RE_MAX(RE_MAX(RE_MAX(result, branch_1_result), branch_2_result), RE_STATUS_REF); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_GROUP_CALL: case RE_OP_REF_GROUP: case RE_OP_REF_GROUP_FLD: case RE_OP_REF_GROUP_FLD_REV: case RE_OP_REF_GROUP_IGN: case RE_OP_REF_GROUP_IGN_REV: case RE_OP_REF_GROUP_REV: result = RE_STATUS_REF; node = node->next_1.node; break; case RE_OP_SUCCESS: node->status = RE_STATUS_VISITED_AG | result; return result; default: node = node->next_1.node; break; } } } /* Adds an index to a node's values unless it's already present. * * 'offset' is the offset of the index count within the values. */ Py_LOCAL_INLINE(BOOL) add_index(RE_Node* node, size_t offset, RE_CODE index) { size_t index_count; size_t first_index; size_t i; RE_CODE* new_values; if (!node) return TRUE; index_count = node->values[offset]; first_index = offset + 1; /* Is the index already present? */ for (i = 0; i < index_count; i++) { if (node->values[first_index + i] == index) return TRUE; } /* Allocate more space for the new index. */ new_values = re_realloc(node->values, (node->value_count + 1) * sizeof(RE_CODE)); if (!new_values) return FALSE; ++node->value_count; node->values = new_values; node->values[first_index + node->values[offset]++] = index; return TRUE; } /* Records the index of every repeat and fuzzy section within atomic * subpatterns and lookarounds. */ Py_LOCAL_INLINE(BOOL) record_subpattern_repeats_and_fuzzy_sections(RE_Node* parent_node, size_t offset, size_t repeat_count, RE_Node* node) { while (node) { if (node->status & RE_STATUS_VISITED_REP) return TRUE; node->status |= RE_STATUS_VISITED_REP; switch (node->op) { case RE_OP_ATOMIC: if (!record_subpattern_repeats_and_fuzzy_sections(node, 0, repeat_count, node->nonstring.next_2.node)) return FALSE; node = node->next_1.node; break; case RE_OP_BRANCH: if (!record_subpattern_repeats_and_fuzzy_sections(parent_node, offset, repeat_count, node->next_1.node)) return FALSE; node = node->nonstring.next_2.node; break; case RE_OP_END_FUZZY: node = node->next_1.node; break; case RE_OP_END_GREEDY_REPEAT: case RE_OP_END_LAZY_REPEAT: return TRUE; case RE_OP_FUZZY: /* Record the fuzzy index. */ if (!add_index(parent_node, offset, (RE_CODE)repeat_count + node->values[0])) return FALSE; node = node->next_1.node; break; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: /* Record the repeat index. */ if (!add_index(parent_node, offset, node->values[0])) return FALSE; if (!record_subpattern_repeats_and_fuzzy_sections(parent_node, offset, repeat_count, node->next_1.node)) return FALSE; node = node->nonstring.next_2.node; break; case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: /* Record the repeat index. */ if (!add_index(parent_node, offset, node->values[0])) return FALSE; node = node->next_1.node; break; case RE_OP_GROUP_EXISTS: if (!record_subpattern_repeats_and_fuzzy_sections(parent_node, offset, repeat_count, node->next_1.node)) return FALSE; node = node->nonstring.next_2.node; break; case RE_OP_LOOKAROUND: if (!record_subpattern_repeats_and_fuzzy_sections(node, 1, repeat_count, node->nonstring.next_2.node)) return FALSE; node = node->next_1.node; break; default: node = node->next_1.node; break; } } return TRUE; } /* Marks nodes which are being used as used. */ Py_LOCAL_INLINE(void) use_nodes(RE_Node* node) { while (node && !(node->status & RE_STATUS_USED)) { node->status |= RE_STATUS_USED; if (!(node->status & RE_STATUS_STRING)) { if (node->nonstring.next_2.node) use_nodes(node->nonstring.next_2.node); } node = node->next_1.node; } } /* Discards any unused nodes. * * Optimising the nodes might result in some nodes no longer being used. */ Py_LOCAL_INLINE(void) discard_unused_nodes(PatternObject* pattern) { size_t new_count; Py_ssize_t i; /* Mark the nodes which are being used. */ use_nodes(pattern->start_node); for (i = 0; i < pattern->call_ref_info_capacity; i++) use_nodes(pattern->call_ref_info[i].node); new_count = 0; for (i = 0; i < pattern->node_count; i++) { RE_Node* node; node = pattern->node_list[i]; if (node->status & RE_STATUS_USED) pattern->node_list[new_count++] = node; else { re_dealloc(node->values); if (node->status & RE_STATUS_STRING) { re_dealloc(node->string.bad_character_offset); re_dealloc(node->string.good_suffix_offset); } re_dealloc(node); } } pattern->node_count = new_count; } /* Marks all the group which are named. */ Py_LOCAL_INLINE(BOOL) mark_named_groups(PatternObject* pattern) { Py_ssize_t i; for (i = 0; i < pattern->public_group_count; i++) { RE_GroupInfo* group_info; PyObject* index; group_info = &pattern->group_info[i]; index = Py_BuildValue("n", i + 1); if (!index) return FALSE; group_info->has_name = (BOOL)PyDict_Contains(pattern->indexgroup, index); Py_DECREF(index); } return TRUE; } /* Gets the test node. * * The test node lets the matcher look ahead in the pattern, allowing it to * avoid the cost of housekeeping, only to find that what follows doesn't match * anyway. */ Py_LOCAL_INLINE(void) set_test_node(RE_NextNode* next) { RE_Node* node = next->node; RE_Node* test; next->test = node; next->match_next = node; next->match_step = 0; if (!node) return; test = node; while (test->op == RE_OP_END_GROUP || test->op == RE_OP_START_GROUP) test = test->next_1.node; next->test = test; if (test != node) return; switch (test->op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: case RE_OP_BOUNDARY: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_DEFAULT_BOUNDARY: case RE_OP_DEFAULT_END_OF_WORD: case RE_OP_DEFAULT_START_OF_WORD: case RE_OP_END_OF_LINE: case RE_OP_END_OF_LINE_U: case RE_OP_END_OF_STRING: case RE_OP_END_OF_STRING_LINE: case RE_OP_END_OF_STRING_LINE_U: case RE_OP_END_OF_WORD: case RE_OP_GRAPHEME_BOUNDARY: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SEARCH_ANCHOR: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: case RE_OP_START_OF_LINE: case RE_OP_START_OF_LINE_U: case RE_OP_START_OF_STRING: case RE_OP_START_OF_WORD: case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: next->match_next = test->next_1.node; next->match_step = test->step; break; case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: if (test->values[1] > 0) next->test = test; break; } } /* Sets the test nodes. */ Py_LOCAL_INLINE(void) set_test_nodes(PatternObject* pattern) { RE_Node** node_list; Py_ssize_t i; node_list = pattern->node_list; for (i = 0; i < pattern->node_count; i++) { RE_Node* node; node = node_list[i]; set_test_node(&node->next_1); if (!(node->status & RE_STATUS_STRING)) set_test_node(&node->nonstring.next_2); } } /* Optimises the pattern. */ Py_LOCAL_INLINE(BOOL) optimise_pattern(PatternObject* pattern) { Py_ssize_t i; /* Building the nodes is made simpler by allowing branches to have a single * exit. These need to be removed. */ skip_one_way_branches(pattern); /* Add position guards for repeat bodies containing a reference to a group * or repeat tails followed at some point by a reference to a group. */ add_repeat_guards(pattern, pattern->start_node); /* Record the index of repeats and fuzzy sections within the body of atomic * and lookaround nodes. */ if (!record_subpattern_repeats_and_fuzzy_sections(NULL, 0, pattern->repeat_count, pattern->start_node)) return FALSE; for (i = 0; i < pattern->call_ref_info_count; i++) { RE_Node* node; node = pattern->call_ref_info[i].node; if (!record_subpattern_repeats_and_fuzzy_sections(NULL, 0, pattern->repeat_count, node)) return FALSE; } /* Discard any unused nodes. */ discard_unused_nodes(pattern); /* Set the test nodes. */ set_test_nodes(pattern); /* Mark all the group that are named. */ if (!mark_named_groups(pattern)) return FALSE; return TRUE; } /* Creates a new pattern node. */ Py_LOCAL_INLINE(RE_Node*) create_node(PatternObject* pattern, RE_UINT8 op, RE_CODE flags, Py_ssize_t step, size_t value_count) { RE_Node* node; node = (RE_Node*)re_alloc(sizeof(*node)); if (!node) return NULL; memset(node, 0, sizeof(RE_Node)); node->value_count = value_count; if (node->value_count > 0) { node->values = (RE_CODE*)re_alloc(node->value_count * sizeof(RE_CODE)); if (!node->values) goto error; } else node->values = NULL; node->op = op; node->match = (flags & RE_POSITIVE_OP) != 0; node->status = (RE_STATUS_T)(flags << RE_STATUS_SHIFT); node->step = step; /* Ensure that there's enough storage to record the new node. */ if (pattern->node_count >= pattern->node_capacity) { RE_Node** new_node_list; pattern->node_capacity *= 2; if (pattern->node_capacity == 0) pattern->node_capacity = RE_INIT_NODE_LIST_SIZE; new_node_list = (RE_Node**)re_realloc(pattern->node_list, pattern->node_capacity * sizeof(RE_Node*)); if (!new_node_list) goto error; pattern->node_list = new_node_list; } /* Record the new node. */ pattern->node_list[pattern->node_count++] = node; return node; error: re_dealloc(node->values); re_dealloc(node); return NULL; } /* Adds a node as a next node for another node. */ Py_LOCAL_INLINE(void) add_node(RE_Node* node_1, RE_Node* node_2) { if (!node_1->next_1.node) node_1->next_1.node = node_2; else node_1->nonstring.next_2.node = node_2; } /* Ensures that the entry for a group's details actually exists. */ Py_LOCAL_INLINE(BOOL) ensure_group(PatternObject* pattern, Py_ssize_t group) { Py_ssize_t old_capacity; Py_ssize_t new_capacity; RE_GroupInfo* new_group_info; if (group <= pattern->true_group_count) /* We already have an entry for the group. */ return TRUE; /* Increase the storage capacity to include the new entry if it's * insufficient. */ old_capacity = pattern->group_info_capacity; new_capacity = pattern->group_info_capacity; while (group > new_capacity) new_capacity += RE_LIST_SIZE_INC; if (new_capacity > old_capacity) { new_group_info = (RE_GroupInfo*)re_realloc(pattern->group_info, new_capacity * sizeof(RE_GroupInfo)); if (!new_group_info) return FALSE; memset(new_group_info + old_capacity, 0, (new_capacity - old_capacity) * sizeof(RE_GroupInfo)); pattern->group_info = new_group_info; pattern->group_info_capacity = new_capacity; } pattern->true_group_count = group; return TRUE; } /* Records that there's a reference to a group. */ Py_LOCAL_INLINE(BOOL) record_ref_group(PatternObject* pattern, RE_CODE group) { if (!ensure_group(pattern, group)) return FALSE; pattern->group_info[group - 1].referenced = TRUE; return TRUE; } /* Records that there's a new group. */ Py_LOCAL_INLINE(BOOL) record_group(PatternObject* pattern, RE_CODE group, RE_Node* node) { if (!ensure_group(pattern, group)) return FALSE; if (group >= 1) { RE_GroupInfo* info; info = &pattern->group_info[group - 1]; info->end_index = pattern->true_group_count; info->node = node; } return TRUE; } /* Records that a group has closed. */ Py_LOCAL_INLINE(void) record_group_end(PatternObject* pattern, RE_CODE group) { if (group >= 1) pattern->group_info[group - 1].end_index = ++pattern->group_end_index; } /* Ensures that the entry for a call_ref's details actually exists. */ Py_LOCAL_INLINE(BOOL) ensure_call_ref(PatternObject* pattern, Py_ssize_t call_ref) { Py_ssize_t old_capacity; Py_ssize_t new_capacity; RE_CallRefInfo* new_call_ref_info; if (call_ref < pattern->call_ref_info_count) /* We already have an entry for the call_ref. */ return TRUE; /* Increase the storage capacity to include the new entry if it's * insufficient. */ old_capacity = pattern->call_ref_info_capacity; new_capacity = pattern->call_ref_info_capacity; while (call_ref >= new_capacity) new_capacity += RE_LIST_SIZE_INC; if (new_capacity > old_capacity) { new_call_ref_info = (RE_CallRefInfo*)re_realloc(pattern->call_ref_info, new_capacity * sizeof(RE_CallRefInfo)); if (!new_call_ref_info) return FALSE; memset(new_call_ref_info + old_capacity, 0, (new_capacity - old_capacity) * sizeof(RE_CallRefInfo)); pattern->call_ref_info = new_call_ref_info; pattern->call_ref_info_capacity = new_capacity; } pattern->call_ref_info_count = 1 + call_ref; return TRUE; } /* Records that a call_ref is defined. */ Py_LOCAL_INLINE(BOOL) record_call_ref_defined(PatternObject* pattern, RE_CODE call_ref, RE_Node* node) { if (!ensure_call_ref(pattern, call_ref)) return FALSE; pattern->call_ref_info[call_ref].defined = TRUE; pattern->call_ref_info[call_ref].node = node; return TRUE; } /* Records that a call_ref is used. */ Py_LOCAL_INLINE(BOOL) record_call_ref_used(PatternObject* pattern, RE_CODE call_ref) { if (!ensure_call_ref(pattern, call_ref)) return FALSE; pattern->call_ref_info[call_ref].used = TRUE; return TRUE; } /* Checks whether a node matches one and only one character. */ Py_LOCAL_INLINE(BOOL) sequence_matches_one(RE_Node* node) { while (node->op == RE_OP_BRANCH && !node->nonstring.next_2.node) node = node->next_1.node; if (node->next_1.node || (node->status & RE_STATUS_FUZZY)) return FALSE; switch (node->op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_REV: return TRUE; default: return FALSE; } } /* Records a repeat. */ Py_LOCAL_INLINE(BOOL) record_repeat(PatternObject* pattern, Py_ssize_t index, size_t repeat_depth) { Py_ssize_t old_capacity; Py_ssize_t new_capacity; /* Increase the storage capacity to include the new entry if it's * insufficient. */ old_capacity = pattern->repeat_info_capacity; new_capacity = pattern->repeat_info_capacity; while (index >= new_capacity) new_capacity += RE_LIST_SIZE_INC; if (new_capacity > old_capacity) { RE_RepeatInfo* new_repeat_info; new_repeat_info = (RE_RepeatInfo*)re_realloc(pattern->repeat_info, new_capacity * sizeof(RE_RepeatInfo)); if (!new_repeat_info) return FALSE; memset(new_repeat_info + old_capacity, 0, (new_capacity - old_capacity) * sizeof(RE_RepeatInfo)); pattern->repeat_info = new_repeat_info; pattern->repeat_info_capacity = new_capacity; } if (index >= pattern->repeat_count) pattern->repeat_count = index + 1; if (repeat_depth > 0) pattern->repeat_info[index].status |= RE_STATUS_INNER; return TRUE; } Py_LOCAL_INLINE(Py_ssize_t) get_step(RE_CODE op) { switch (op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_U: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_IGN: return 1; case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U_REV: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: return -1; } return 0; } Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args); /* Builds an ANY node. */ Py_LOCAL_INLINE(int) build_ANY(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; /* codes: opcode, flags. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); /* Create the node. */ node = create_node(args->pattern, op, flags, step, 0); if (!node) return RE_ERROR_MEMORY; args->code += 2; /* Append the node. */ add_node(args->end, node); args->end = node; ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a FUZZY node. */ Py_LOCAL_INLINE(int) build_FUZZY(RE_CompileArgs* args) { RE_CODE flags; RE_Node* start_node; RE_Node* end_node; RE_CODE index; RE_CompileArgs subargs; int status; /* codes: opcode, flags, constraints, sequence, end. */ if (args->code + 13 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; /* Create nodes for the start and end of the fuzzy sequence. */ start_node = create_node(args->pattern, RE_OP_FUZZY, flags, 0, 9); end_node = create_node(args->pattern, RE_OP_END_FUZZY, flags, 0, 5); if (!start_node || !end_node) return RE_ERROR_MEMORY; index = (RE_CODE)args->pattern->fuzzy_count++; start_node->values[0] = index; end_node->values[0] = index; /* The constraints consist of 4 pairs of limits and the cost equation. */ end_node->values[RE_FUZZY_VAL_MIN_DEL] = args->code[2]; /* Deletion minimum. */ end_node->values[RE_FUZZY_VAL_MIN_INS] = args->code[4]; /* Insertion minimum. */ end_node->values[RE_FUZZY_VAL_MIN_SUB] = args->code[6]; /* Substitution minimum. */ end_node->values[RE_FUZZY_VAL_MIN_ERR] = args->code[8]; /* Error minimum. */ start_node->values[RE_FUZZY_VAL_MAX_DEL] = args->code[3]; /* Deletion maximum. */ start_node->values[RE_FUZZY_VAL_MAX_INS] = args->code[5]; /* Insertion maximum. */ start_node->values[RE_FUZZY_VAL_MAX_SUB] = args->code[7]; /* Substitution maximum. */ start_node->values[RE_FUZZY_VAL_MAX_ERR] = args->code[9]; /* Error maximum. */ start_node->values[RE_FUZZY_VAL_DEL_COST] = args->code[10]; /* Deletion cost. */ start_node->values[RE_FUZZY_VAL_INS_COST] = args->code[11]; /* Insertion cost. */ start_node->values[RE_FUZZY_VAL_SUB_COST] = args->code[12]; /* Substitution cost. */ start_node->values[RE_FUZZY_VAL_MAX_COST] = args->code[13]; /* Total cost. */ args->code += 14; subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = TRUE; subargs.within_fuzzy = TRUE; /* Compile the sequence and check that we've reached the end of the * subpattern. */ status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; ++args->code; /* Append the fuzzy sequence. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); args->end = end_node; args->is_fuzzy = TRUE; return RE_ERROR_SUCCESS; } /* Builds an ATOMIC node. */ Py_LOCAL_INLINE(int) build_ATOMIC(RE_CompileArgs* args) { RE_Node* atomic_node; RE_CompileArgs subargs; RE_Node* success_node; int status; /* codes: opcode, sequence, end. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; atomic_node = create_node(args->pattern, RE_OP_ATOMIC, 0, 0, 1); if (!atomic_node) return RE_ERROR_MEMORY; /* The number of repeat indexes. */ atomic_node->values[0] = 0; ++args->code; subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; /* Compile the sequence and check that we've reached the end of the * subpattern. */ status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; /* Create the success node to terminate the subpattern. */ success_node = create_node(subargs.pattern, RE_OP_SUCCESS, 0, 0, 0); if (!success_node) return RE_ERROR_MEMORY; /* Append the SUCCESS node. */ add_node(subargs.end, success_node); /* Insert the subpattern. */ atomic_node->nonstring.next_2.node = subargs.start; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Append the node. */ add_node(args->end, atomic_node); args->end = atomic_node; return RE_ERROR_SUCCESS; } /* Builds a BOUNDARY node. */ Py_LOCAL_INLINE(int) build_BOUNDARY(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; RE_Node* node; /* codes: opcode, flags. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; args->code += 2; /* Create the node. */ node = create_node(args->pattern, op, flags, 0, 0); if (!node) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a BRANCH node. */ Py_LOCAL_INLINE(int) build_BRANCH(RE_CompileArgs* args) { RE_Node* branch_node; RE_Node* join_node; size_t smallest_min_width; RE_CompileArgs subargs; int status; /* codes: opcode, branch, next, branch, end. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; /* Create nodes for the start and end of the branch sequence. */ branch_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); join_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!branch_node || !join_node) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, branch_node); args->end = join_node; smallest_min_width = ~(size_t)0; subargs = *args; /* A branch in the regular expression is compiled into a series of 2-way * branches. */ do { RE_Node* next_branch_node; /* Skip over the 'BRANCH' or 'NEXT' opcode. */ ++subargs.code; /* Compile the sequence until the next 'BRANCH' or 'NEXT' opcode. */ subargs.min_width = 0; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; smallest_min_width = RE_MIN(smallest_min_width, subargs.min_width); args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; /* Append the sequence. */ add_node(branch_node, subargs.start); add_node(subargs.end, join_node); /* Create a start node for the next sequence and append it. */ next_branch_node = create_node(subargs.pattern, RE_OP_BRANCH, 0, 0, 0); if (!next_branch_node) return RE_ERROR_MEMORY; add_node(branch_node, next_branch_node); branch_node = next_branch_node; } while (subargs.code < subargs.end_code && subargs.code[0] == RE_OP_NEXT); /* We should have reached the end of the branch. */ if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; ++args->code; args->min_width += smallest_min_width; return RE_ERROR_SUCCESS; } /* Builds a CALL_REF node. */ Py_LOCAL_INLINE(int) build_CALL_REF(RE_CompileArgs* args) { RE_CODE call_ref; RE_Node* start_node; RE_Node* end_node; RE_CompileArgs subargs; int status; /* codes: opcode, call_ref. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; call_ref = args->code[1]; args->code += 2; /* Create nodes for the start and end of the subpattern. */ start_node = create_node(args->pattern, RE_OP_CALL_REF, 0, 0, 1); end_node = create_node(args->pattern, RE_OP_GROUP_RETURN, 0, 0, 0); if (!start_node || !end_node) return RE_ERROR_MEMORY; start_node->values[0] = call_ref; /* Compile the sequence and check that we've reached the end of the * subpattern. */ subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Record that we defined a call_ref. */ if (!record_call_ref_defined(args->pattern, call_ref, start_node)) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); args->end = end_node; return RE_ERROR_SUCCESS; } /* Builds a CHARACTER or PROPERTY node. */ Py_LOCAL_INLINE(int) build_CHARACTER_or_PROPERTY(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; /* codes: opcode, flags, value. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); if (flags & RE_ZEROWIDTH_OP) step = 0; /* Create the node. */ node = create_node(args->pattern, op, flags, step, 1); if (!node) return RE_ERROR_MEMORY; node->values[0] = args->code[2]; args->code += 3; /* Append the node. */ add_node(args->end, node); args->end = node; if (step != 0) ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a GROUP node. */ Py_LOCAL_INLINE(int) build_GROUP(RE_CompileArgs* args) { RE_CODE private_group; RE_CODE public_group; RE_Node* start_node; RE_Node* end_node; RE_CompileArgs subargs; int status; /* codes: opcode, private_group, public_group. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; private_group = args->code[1]; public_group = args->code[2]; args->code += 3; /* Create nodes for the start and end of the capture group. */ start_node = create_node(args->pattern, args->forward ? RE_OP_START_GROUP : RE_OP_END_GROUP, 0, 0, 3); end_node = create_node(args->pattern, args->forward ? RE_OP_END_GROUP : RE_OP_START_GROUP, 0, 0, 3); if (!start_node || !end_node) return RE_ERROR_MEMORY; start_node->values[0] = private_group; end_node->values[0] = private_group; start_node->values[1] = public_group; end_node->values[1] = public_group; /* Signal that the capture should be saved when it's complete. */ start_node->values[2] = 0; end_node->values[2] = 1; /* Record that we have a new capture group. */ if (!record_group(args->pattern, private_group, start_node)) return RE_ERROR_MEMORY; /* Compile the sequence and check that we've reached the end of the capture * group. */ subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures || subargs.visible_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Record that the capture group has closed. */ record_group_end(args->pattern, private_group); /* Append the capture group. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); args->end = end_node; return RE_ERROR_SUCCESS; } /* Builds a GROUP_CALL node. */ Py_LOCAL_INLINE(int) build_GROUP_CALL(RE_CompileArgs* args) { RE_CODE call_ref; RE_Node* node; /* codes: opcode, call_ref. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; call_ref = args->code[1]; /* Create the node. */ node = create_node(args->pattern, RE_OP_GROUP_CALL, 0, 0, 1); if (!node) return RE_ERROR_MEMORY; node->values[0] = call_ref; args->code += 2; /* Record that we used a call_ref. */ if (!record_call_ref_used(args->pattern, call_ref)) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a GROUP_EXISTS node. */ Py_LOCAL_INLINE(int) build_GROUP_EXISTS(RE_CompileArgs* args) { RE_CODE group; RE_Node* start_node; RE_Node* end_node; RE_CompileArgs subargs; size_t min_width; int status; /* codes: opcode, sequence, next, sequence, end. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; group = args->code[1]; args->code += 2; /* Create nodes for the start and end of the structure. */ start_node = create_node(args->pattern, RE_OP_GROUP_EXISTS, 0, 0, 1); end_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!start_node || !end_node) return RE_ERROR_MEMORY; start_node->values[0] = group; subargs = *args; subargs.min_width = 0; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; min_width = subargs.min_width; /* Append the start node. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); if (args->code[0] == RE_OP_NEXT) { ++args->code; subargs.code = args->code; subargs.min_width = 0; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; min_width = RE_MIN(min_width, subargs.min_width); add_node(start_node, subargs.start); add_node(subargs.end, end_node); } else { add_node(start_node, end_node); min_width = 0; } args->min_width += min_width; if (args->code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; ++args->code; args->end = end_node; return RE_ERROR_SUCCESS; } /* Builds a LOOKAROUND node. */ Py_LOCAL_INLINE(int) build_LOOKAROUND(RE_CompileArgs* args) { RE_CODE flags; BOOL forward; RE_Node* lookaround_node; RE_Node* success_node; RE_CompileArgs subargs; int status; /* codes: opcode, flags, forward, sequence, end. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; forward = (BOOL)args->code[2]; /* Create a node for the lookaround. */ lookaround_node = create_node(args->pattern, RE_OP_LOOKAROUND, flags, 0, 2); if (!lookaround_node) return RE_ERROR_MEMORY; /* The number of repeat indexes. */ lookaround_node->values[1] = 0; args->code += 3; /* Compile the sequence and check that we've reached the end of the * subpattern. */ subargs = *args; subargs.forward = forward; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; lookaround_node->values[0] = subargs.has_captures; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Create the 'SUCCESS' node and append it to the subpattern. */ success_node = create_node(args->pattern, RE_OP_SUCCESS, 0, 0, 0); if (!success_node) return RE_ERROR_MEMORY; /* Append the SUCCESS node. */ add_node(subargs.end, success_node); /* Insert the subpattern into the node. */ lookaround_node->nonstring.next_2.node = subargs.start; /* Append the lookaround. */ add_node(args->end, lookaround_node); args->end = lookaround_node; return RE_ERROR_SUCCESS; } /* Builds a RANGE node. */ Py_LOCAL_INLINE(int) build_RANGE(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; /* codes: opcode, flags, lower, upper. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); if (flags & RE_ZEROWIDTH_OP) step = 0; /* Create the node. */ node = create_node(args->pattern, op, flags, step, 2); if (!node) return RE_ERROR_MEMORY; node->values[0] = args->code[2]; node->values[1] = args->code[3]; args->code += 4; /* Append the node. */ add_node(args->end, node); args->end = node; if (step != 0) ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a REF_GROUP node. */ Py_LOCAL_INLINE(int) build_REF_GROUP(RE_CompileArgs* args) { RE_CODE flags; RE_CODE group; RE_Node* node; /* codes: opcode, flags, group. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; group = args->code[2]; node = create_node(args->pattern, (RE_UINT8)args->code[0], flags, 0, 1); if (!node) return RE_ERROR_MEMORY; node->values[0] = group; args->code += 3; /* Record that we have a reference to a group. */ if (!record_ref_group(args->pattern, group)) return RE_ERROR_MEMORY; /* Append the reference. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a REPEAT node. */ Py_LOCAL_INLINE(int) build_REPEAT(RE_CompileArgs* args) { BOOL greedy; RE_CODE min_count; RE_CODE max_count; int status; /* codes: opcode, min_count, max_count, sequence, end. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; /* This includes special cases such as optional items, which we'll check * for and treat specially. They don't need repeat counts, which helps us * avoid unnecessary work when matching. */ greedy = args->code[0] == RE_OP_GREEDY_REPEAT; min_count = args->code[1]; max_count = args->code[2]; if (min_count > max_count) return RE_ERROR_ILLEGAL; args->code += 3; if (min_count == 0 && max_count == 1) { /* Optional sequence. */ RE_Node* branch_node; RE_Node* join_node; RE_CompileArgs subargs; /* Create the start and end nodes. */ branch_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); join_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!branch_node || !join_node) return RE_ERROR_MEMORY; /* Compile the sequence and check that we've reached the end of it. */ subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; if (greedy) { /* It's a greedy option. */ add_node(branch_node, subargs.start); add_node(branch_node, join_node); } else { /* It's a lazy option. */ add_node(branch_node, join_node); add_node(branch_node, subargs.start); } add_node(subargs.end, join_node); /* Append the optional sequence. */ add_node(args->end, branch_node); args->end = join_node; } else if (min_count == 1 && max_count == 1) { /* Singly-repeated sequence. */ RE_CompileArgs subargs; subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Append the sequence. */ add_node(args->end, subargs.start); args->end = subargs.end; } else { RE_CODE index; RE_Node* repeat_node; RE_CompileArgs subargs; index = (RE_CODE)args->pattern->repeat_count; /* Create the nodes for the repeat. */ repeat_node = create_node(args->pattern, greedy ? RE_OP_GREEDY_REPEAT : RE_OP_LAZY_REPEAT, 0, args->forward ? 1 : -1, 4); if (!repeat_node || !record_repeat(args->pattern, index, args->repeat_depth)) return RE_ERROR_MEMORY; repeat_node->values[0] = index; repeat_node->values[1] = min_count; repeat_node->values[2] = max_count; repeat_node->values[3] = args->forward; if (args->within_fuzzy) args->pattern->repeat_info[index].status |= RE_STATUS_BODY; /* Compile the 'body' and check that we've reached the end of it. */ subargs = *args; subargs.min_width = 0; subargs.visible_captures = TRUE; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; ++subargs.repeat_depth; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width += min_count * subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Is it a repeat of something which will match a single character? * * If it's in a fuzzy section then it won't be optimised as a * single-character repeat. */ if (sequence_matches_one(subargs.start)) { repeat_node->op = greedy ? RE_OP_GREEDY_REPEAT_ONE : RE_OP_LAZY_REPEAT_ONE; /* Append the new sequence. */ add_node(args->end, repeat_node); repeat_node->nonstring.next_2.node = subargs.start; args->end = repeat_node; } else { RE_Node* end_repeat_node; RE_Node* end_node; end_repeat_node = create_node(args->pattern, greedy ? RE_OP_END_GREEDY_REPEAT : RE_OP_END_LAZY_REPEAT, 0, args->forward ? 1 : -1, 4); if (!end_repeat_node) return RE_ERROR_MEMORY; end_repeat_node->values[0] = repeat_node->values[0]; end_repeat_node->values[1] = repeat_node->values[1]; end_repeat_node->values[2] = repeat_node->values[2]; end_repeat_node->values[3] = args->forward; end_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!end_node) return RE_ERROR_MEMORY; /* Append the new sequence. */ add_node(args->end, repeat_node); add_node(repeat_node, subargs.start); add_node(repeat_node, end_node); add_node(subargs.end, end_repeat_node); add_node(end_repeat_node, subargs.start); add_node(end_repeat_node, end_node); args->end = end_node; } } return RE_ERROR_SUCCESS; } /* Builds a STRING node. */ Py_LOCAL_INLINE(int) build_STRING(RE_CompileArgs* args, BOOL is_charset) { RE_CODE flags; RE_CODE length; RE_UINT8 op; Py_ssize_t step; RE_Node* node; RE_CODE i; /* codes: opcode, flags, length, characters. */ flags = args->code[1]; length = args->code[2]; if (args->code + 3 + length > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; step = get_step(op); /* Create the node. */ node = create_node(args->pattern, op, flags, step * (Py_ssize_t)length, length); if (!node) return RE_ERROR_MEMORY; if (!is_charset) node->status |= RE_STATUS_STRING; for (i = 0; i < length; i++) node->values[i] = args->code[3 + i]; args->code += 3 + length; /* Append the node. */ add_node(args->end, node); args->end = node; /* Because of full case-folding, one character in the text could match * multiple characters in the pattern. */ if (op == RE_OP_STRING_FLD || op == RE_OP_STRING_FLD_REV) args->min_width += possible_unfolded_length(length); else args->min_width += length; return RE_ERROR_SUCCESS; } /* Builds a SET node. */ Py_LOCAL_INLINE(int) build_SET(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; size_t saved_min_width; int status; /* codes: opcode, flags, members. */ op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); if (flags & RE_ZEROWIDTH_OP) step = 0; node = create_node(args->pattern, op, flags, step, 0); if (!node) return RE_ERROR_MEMORY; args->code += 2; /* Append the node. */ add_node(args->end, node); args->end = node; saved_min_width = args->min_width; /* Compile the character set. */ do { switch (args->code[0]) { case RE_OP_CHARACTER: case RE_OP_PROPERTY: status = build_CHARACTER_or_PROPERTY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_RANGE: status = build_RANGE(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_SET_DIFF: case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: status = build_SET(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_STRING: /* A set of characters. */ if (!build_STRING(args, TRUE)) return FALSE; break; default: /* Illegal opcode for a character set. */ return RE_ERROR_ILLEGAL; } } while (args->code < args->end_code && args->code[0] != RE_OP_END); /* Check that we've reached the end correctly. (The last opcode should be * 'END'.) */ if (args->code >= args->end_code || args->code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; ++args->code; /* At this point the set's members are in the main sequence. They need to * be moved out-of-line. */ node->nonstring.next_2.node = node->next_1.node; node->next_1.node = NULL; args->end = node; args->min_width = saved_min_width; if (step != 0) ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a STRING_SET node. */ Py_LOCAL_INLINE(int) build_STRING_SET(RE_CompileArgs* args) { RE_CODE index; RE_CODE min_len; RE_CODE max_len; RE_Node* node; /* codes: opcode, index, min_len, max_len. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; index = args->code[1]; min_len = args->code[2]; max_len = args->code[3]; node = create_node(args->pattern, (RE_UINT8)args->code[0], 0, 0, 3); if (!node) return RE_ERROR_MEMORY; node->values[0] = index; node->values[1] = min_len; node->values[2] = max_len; args->code += 4; /* Append the reference. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a SUCCESS node . */ Py_LOCAL_INLINE(int) build_SUCCESS(RE_CompileArgs* args) { RE_Node* node; /* code: opcode. */ /* Create the node. */ node = create_node(args->pattern, RE_OP_SUCCESS, 0, 0, 0); if (!node) return RE_ERROR_MEMORY; ++args->code; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a zero-width node. */ Py_LOCAL_INLINE(int) build_zerowidth(RE_CompileArgs* args) { RE_CODE flags; RE_Node* node; /* codes: opcode, flags. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; /* Create the node. */ node = create_node(args->pattern, (RE_UINT8)args->code[0], flags, 0, 0); if (!node) return RE_ERROR_MEMORY; args->code += 2; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a sequence of nodes from regular expression code. */ Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args) { int status; /* Guarantee that there's something to attach to. */ args->start = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); args->end = args->start; /* The sequence should end with an opcode we don't understand. If it * doesn't then the code is illegal. */ while (args->code < args->end_code) { /* The following code groups opcodes by format, not function. */ switch (args->code[0]) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: /* A simple opcode with no trailing codewords and width of 1. */ status = build_ANY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_ATOMIC: /* An atomic sequence. */ status = build_ATOMIC(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_BOUNDARY: case RE_OP_DEFAULT_BOUNDARY: case RE_OP_DEFAULT_END_OF_WORD: case RE_OP_DEFAULT_START_OF_WORD: case RE_OP_END_OF_WORD: case RE_OP_GRAPHEME_BOUNDARY: case RE_OP_START_OF_WORD: /* A word or grapheme boundary. */ status = build_BOUNDARY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_BRANCH: /* A 2-way branch. */ status = build_BRANCH(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_CALL_REF: /* A group call ref. */ status = build_CALL_REF(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: /* A character literal or a property. */ status = build_CHARACTER_or_PROPERTY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_END_OF_LINE: case RE_OP_END_OF_LINE_U: case RE_OP_END_OF_STRING: case RE_OP_END_OF_STRING_LINE: case RE_OP_END_OF_STRING_LINE_U: case RE_OP_SEARCH_ANCHOR: case RE_OP_START_OF_LINE: case RE_OP_START_OF_LINE_U: case RE_OP_START_OF_STRING: /* A simple opcode with no trailing codewords and width of 0. */ status = build_zerowidth(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_FUZZY: /* A fuzzy sequence. */ status = build_FUZZY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: /* A repeated sequence. */ status = build_REPEAT(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GROUP: /* A capture group. */ status = build_GROUP(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GROUP_CALL: /* A group call. */ status = build_GROUP_CALL(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GROUP_EXISTS: /* A conditional sequence. */ status = build_GROUP_EXISTS(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_LOOKAROUND: /* A lookaround. */ status = build_LOOKAROUND(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: /* A range. */ status = build_RANGE(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_REF_GROUP: case RE_OP_REF_GROUP_FLD: case RE_OP_REF_GROUP_FLD_REV: case RE_OP_REF_GROUP_IGN: case RE_OP_REF_GROUP_IGN_REV: case RE_OP_REF_GROUP_REV: /* A reference to a group. */ status = build_REF_GROUP(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: /* A set. */ status = build_SET(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: /* A string literal. */ if (!build_STRING(args, FALSE)) return FALSE; break; case RE_OP_STRING_SET: case RE_OP_STRING_SET_FLD: case RE_OP_STRING_SET_FLD_REV: case RE_OP_STRING_SET_IGN: case RE_OP_STRING_SET_IGN_REV: case RE_OP_STRING_SET_REV: /* A reference to a list. */ status = build_STRING_SET(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_SUCCESS: /* Success. */ status = build_SUCCESS(args); if (status != RE_ERROR_SUCCESS) return status; break; default: /* We've found an opcode which we don't recognise. We'll leave it * for the caller. */ return RE_ERROR_SUCCESS; } } /* If we're here then we should be at the end of the code, otherwise we * have an error. */ return args->code == args->end_code; } /* Compiles the regular expression code to 'nodes'. * * Various details about the regular expression are discovered during * compilation and stored in the PatternObject. */ Py_LOCAL_INLINE(BOOL) compile_to_nodes(RE_CODE* code, RE_CODE* end_code, PatternObject* pattern) { RE_CompileArgs args; int status; /* Compile a regex sequence and then check that we've reached the end * correctly. (The last opcode should be 'SUCCESS'.) * * If successful, 'start' and 'end' will point to the start and end nodes * of the compiled sequence. */ args.code = code; args.end_code = end_code; args.pattern = pattern; args.forward = (pattern->flags & RE_FLAG_REVERSE) == 0; args.min_width = 0; args.visible_captures = FALSE; args.has_captures = FALSE; args.repeat_depth = 0; args.is_fuzzy = FALSE; args.within_fuzzy = FALSE; status = build_sequence(&args); if (status == RE_ERROR_ILLEGAL) set_error(RE_ERROR_ILLEGAL, NULL); if (status != RE_ERROR_SUCCESS) return FALSE; pattern->min_width = args.min_width; pattern->is_fuzzy = args.is_fuzzy; pattern->do_search_start = TRUE; pattern->start_node = args.start; /* Optimise the pattern. */ if (!optimise_pattern(pattern)) return FALSE; pattern->start_test = locate_test_start(pattern->start_node); /* Get the call_ref for the entire pattern, if any. */ if (pattern->start_node->op == RE_OP_CALL_REF) pattern->pattern_call_ref = pattern->start_node->values[0]; else pattern->pattern_call_ref = -1; return TRUE; } /* Gets the required characters for a regex. * * In the event of an error, it just pretends that there are no required * characters. */ Py_LOCAL_INLINE(void) get_required_chars(PyObject* required_chars, RE_CODE** req_chars, Py_ssize_t* req_length) { Py_ssize_t len; RE_CODE* chars; Py_ssize_t i; *req_chars = NULL; *req_length = 0; len = PyTuple_GET_SIZE(required_chars); if (len < 1 || PyErr_Occurred()) { PyErr_Clear(); return; } chars = (RE_CODE*)re_alloc(len * sizeof(RE_CODE)); if (!chars) goto error; for (i = 0; i < len; i++) { PyObject* o = PyTuple_GET_ITEM(required_chars, i); size_t value; value = PyLong_AsUnsignedLong(o); if (value == -1 && PyErr_Occurred()) goto error; chars[i] = (RE_CODE)value; if (chars[i] != value) goto error; } *req_chars = chars; *req_length = len; return; error: PyErr_Clear(); re_dealloc(chars); } /* Makes a STRING node. */ Py_LOCAL_INLINE(RE_Node*) make_STRING_node(PatternObject* pattern, RE_UINT8 op, Py_ssize_t length, RE_CODE* chars) { Py_ssize_t step; RE_Node* node; Py_ssize_t i; step = get_step(op); /* Create the node. */ node = create_node(pattern, op, 0, step * length, length); if (!node) return NULL; node->status |= RE_STATUS_STRING; for (i = 0; i < length; i++) node->values[i] = chars[i]; return node; } /* Compiles regular expression code to a PatternObject. * * The regular expression code is provided as a list and is then compiled to * 'nodes'. Various details about the regular expression are discovered during * compilation and stored in the PatternObject. */ static PyObject* re_compile(PyObject* self_, PyObject* args) { PyObject* pattern; Py_ssize_t flags = 0; PyObject* code_list; PyObject* groupindex; PyObject* indexgroup; PyObject* named_lists; PyObject* named_list_indexes; Py_ssize_t req_offset; PyObject* required_chars; Py_ssize_t req_length; RE_CODE* req_chars; Py_ssize_t req_flags; Py_ssize_t public_group_count; Py_ssize_t code_len; RE_CODE* code; Py_ssize_t i; PatternObject* self; BOOL ascii; BOOL locale; BOOL unicode; BOOL ok; if (!PyArg_ParseTuple(args, "OnOOOOOnOnn:re_compile", &pattern, &flags, &code_list, &groupindex, &indexgroup, &named_lists, &named_list_indexes, &req_offset, &required_chars, &req_flags, &public_group_count)) return NULL; /* Read the regex code. */ code_len = PyList_GET_SIZE(code_list); code = (RE_CODE*)re_alloc(code_len * sizeof(RE_CODE)); if (!code) return NULL; for (i = 0; i < code_len; i++) { PyObject* o = PyList_GET_ITEM(code_list, i); size_t value; value = PyLong_AsUnsignedLong(o); if (value == -1 && PyErr_Occurred()) goto error; code[i] = (RE_CODE)value; if (code[i] != value) goto error; } /* Get the required characters. */ get_required_chars(required_chars, &req_chars, &req_length); /* Create the PatternObject. */ self = PyObject_NEW(PatternObject, &Pattern_Type); if (!self) { set_error(RE_ERROR_MEMORY, NULL); re_dealloc(req_chars); re_dealloc(code); return NULL; } /* Initialise the PatternObject. */ self->pattern = pattern; self->flags = flags; self->weakreflist = NULL; self->start_node = NULL; self->repeat_count = 0; self->true_group_count = 0; self->public_group_count = public_group_count; self->group_end_index = 0; self->groupindex = groupindex; self->indexgroup = indexgroup; self->named_lists = named_lists; self->named_list_indexes = named_list_indexes; self->node_capacity = 0; self->node_count = 0; self->node_list = NULL; self->group_info_capacity = 0; self->group_info = NULL; self->call_ref_info_capacity = 0; self->call_ref_info_count = 0; self->call_ref_info = NULL; self->repeat_info_capacity = 0; self->repeat_info = NULL; self->groups_storage = NULL; self->repeats_storage = NULL; self->fuzzy_count = 0; self->recursive = FALSE; self->req_offset = req_offset; self->req_string = NULL; Py_INCREF(self->pattern); Py_INCREF(self->groupindex); Py_INCREF(self->indexgroup); Py_INCREF(self->named_lists); Py_INCREF(self->named_list_indexes); /* Initialise the character encoding. */ unicode = (flags & RE_FLAG_UNICODE) != 0; locale = (flags & RE_FLAG_LOCALE) != 0; ascii = (flags & RE_FLAG_ASCII) != 0; if (!unicode && !locale && !ascii) { if (PyString_Check(self->pattern)) ascii = RE_FLAG_ASCII; else unicode = RE_FLAG_UNICODE; } if (unicode) self->encoding = &unicode_encoding; else if (locale) self->encoding = &locale_encoding; else if (ascii) self->encoding = &ascii_encoding; /* Compile the regular expression code to nodes. */ ok = compile_to_nodes(code, code + code_len, self); /* We no longer need the regular expression code. */ re_dealloc(code); if (!ok) { Py_DECREF(self); re_dealloc(req_chars); return NULL; } /* Make a node for the required string, if there's one. */ if (req_chars) { /* Remove the FULLCASE flag if it's not a Unicode pattern. */ if (!(self->flags & RE_FLAG_UNICODE)) req_flags &= ~RE_FLAG_FULLCASE; if (self->flags & RE_FLAG_REVERSE) { switch (req_flags) { case 0: self->req_string = make_STRING_node(self, RE_OP_STRING_REV, req_length, req_chars); break; case RE_FLAG_IGNORECASE | RE_FLAG_FULLCASE: self->req_string = make_STRING_node(self, RE_OP_STRING_FLD_REV, req_length, req_chars); break; case RE_FLAG_IGNORECASE: self->req_string = make_STRING_node(self, RE_OP_STRING_IGN_REV, req_length, req_chars); break; } } else { switch (req_flags) { case 0: self->req_string = make_STRING_node(self, RE_OP_STRING, req_length, req_chars); break; case RE_FLAG_IGNORECASE | RE_FLAG_FULLCASE: self->req_string = make_STRING_node(self, RE_OP_STRING_FLD, req_length, req_chars); break; case RE_FLAG_IGNORECASE: self->req_string = make_STRING_node(self, RE_OP_STRING_IGN, req_length, req_chars); break; } } re_dealloc(req_chars); } return (PyObject*)self; error: re_dealloc(code); set_error(RE_ERROR_ILLEGAL, NULL); return NULL; } /* Gets the size of the codewords. */ static PyObject* get_code_size(PyObject* self, PyObject* unused) { return Py_BuildValue("n", sizeof(RE_CODE)); } /* Gets the property dict. */ static PyObject* get_properties(PyObject* self_, PyObject* args) { Py_INCREF(property_dict); return property_dict; } /* Folds the case of a string. */ static PyObject* fold_case(PyObject* self_, PyObject* args) { RE_StringInfo str_info; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); RE_EncodingTable* encoding; Py_ssize_t buf_size; void* folded; Py_ssize_t folded_len; PyObject* result; Py_ssize_t flags; PyObject* string; if (!PyArg_ParseTuple(args, "nO:fold_case", &flags, &string)) return NULL; if (!(flags & RE_FLAG_IGNORECASE)) { Py_INCREF(string); return string; } /* Get the string. */ if (!get_string(string, &str_info)) return NULL; /* Get the function for reading from the original string. */ switch (str_info.charsize) { case 1: char_at = bytes1_char_at; break; case 2: char_at = bytes2_char_at; break; case 4: char_at = bytes4_char_at; break; default: #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return NULL; } /* What's the encoding? */ if (flags & RE_FLAG_UNICODE) encoding = &unicode_encoding; else if (flags & RE_FLAG_LOCALE) encoding = &locale_encoding; else if (flags & RE_FLAG_ASCII) encoding = &ascii_encoding; else encoding = &unicode_encoding; /* The folded string will have the same width as the original string. */ folded_charsize = str_info.charsize; /* Get the function for writing to the folded string. */ switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; break; case 2: set_char_at = bytes2_set_char_at; break; case 4: set_char_at = bytes4_set_char_at; break; default: #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return NULL; } /* Allocate a buffer for the folded string. */ if (flags & RE_FLAG_FULLCASE) /* When using full case-folding with Unicode, some single codepoints * are transformed to sequences of codepoints. */ buf_size = str_info.length * RE_MAX_FOLDED; else buf_size = str_info.length; folded = re_alloc(buf_size * folded_charsize); if (!folded) { #if PY_VERSION_HEX >= 0x02060000 release_buffer(&str_info); #endif return NULL; } /* Fold the case of the string. */ folded_len = 0; if (flags & RE_FLAG_FULLCASE) { /* Full case-folding. */ int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t i; Py_UCS4 codepoints[RE_MAX_FOLDED]; full_case_fold = encoding->full_case_fold; for (i = 0; i < str_info.length; i++) { int count; int j; count = full_case_fold(char_at(str_info.characters, i), codepoints); for (j = 0; j < count; j++) set_char_at(folded, folded_len + j, codepoints[j]); folded_len += count; } } else { /* Simple case-folding. */ Py_UCS4 (*simple_case_fold)(Py_UCS4 ch); Py_ssize_t i; simple_case_fold = encoding->simple_case_fold; for (i = 0; i < str_info.length; i++) { Py_UCS4 ch; ch = simple_case_fold(char_at(str_info.characters, i)); set_char_at(folded, i, ch); } folded_len = str_info.length; } /* Build the result string. */ if (str_info.is_unicode) result = build_unicode_value(folded, folded_len, folded_charsize); else result = build_bytes_value(folded, folded_len, folded_charsize); re_dealloc(folded); #if PY_VERSION_HEX >= 0x02060000 /* Release the original string's buffer. */ release_buffer(&str_info); #endif return result; } /* Returns a tuple of the Unicode characters which expand on full case-folding. */ static PyObject* get_expand_on_folding(PyObject* self, PyObject* unused) { int count; int i; PyObject* result; /* How many characters are there? */ count = sizeof(re_expand_on_folding) / sizeof(re_expand_on_folding[0]); /* Put all the characters in a tuple. */ result = PyTuple_New(count); if (!result) goto error; for (i = 0; i < count; i++) { Py_UNICODE codepoint; PyObject* item; codepoint = re_expand_on_folding[i]; item = build_unicode_value(&codepoint, 1, sizeof(codepoint)); if (!item) goto error; PyTuple_SetItem(result, i, item); } return result; error: Py_XDECREF(result); return NULL; } /* Returns whether a character has a given value for a Unicode property. */ static PyObject* has_property_value(PyObject* self_, PyObject* args) { BOOL v; Py_ssize_t property_value; Py_ssize_t character; if (!PyArg_ParseTuple(args, "nn:has_property_value", &property_value, &character)) return NULL; v = unicode_has_property((RE_CODE)property_value, (Py_UCS4)character) ? 1 : 0; return Py_BuildValue("n", v); } /* Returns a list all the simple cases of a character. * * If full case-folding is turned on and the character also expands on full * case-folding, a None is appended to the list. */ static PyObject* get_all_cases(PyObject* self_, PyObject* args) { RE_EncodingTable* encoding; int count; Py_UCS4 cases[RE_MAX_CASES]; Py_UCS4 folded[RE_MAX_FOLDED]; PyObject* result; int i; Py_ssize_t flags; Py_ssize_t character; if (!PyArg_ParseTuple(args, "nn:get_all_cases", &flags, &character)) return NULL; /* What's the encoding? */ if (flags & RE_FLAG_UNICODE) encoding = &unicode_encoding; else if (flags & RE_FLAG_LOCALE) encoding = &locale_encoding; else if (flags & RE_FLAG_ASCII) encoding = &ascii_encoding; else encoding = &ascii_encoding; /* Get all the simple cases. */ count = encoding->all_cases((Py_UCS4)character, cases); result = PyList_New(count); if (!result) goto error; for (i = 0; i < count; i++) { PyObject* item; item = Py_BuildValue("n", cases[i]); if (!item) goto error; PyList_SetItem(result, i, item); } /* If the character also expands on full case-folding, append a None. */ if ((flags & RE_FULL_CASE_FOLDING) == RE_FULL_CASE_FOLDING) { count = encoding->full_case_fold((Py_UCS4)character, folded); if (count > 1) PyList_Append(result, Py_None); } return result; error: Py_XDECREF(result); return NULL; } /* The table of the module's functions. */ static PyMethodDef _functions[] = { {"compile", (PyCFunction)re_compile, METH_VARARGS}, {"get_code_size", (PyCFunction)get_code_size, METH_NOARGS}, {"get_properties", (PyCFunction)get_properties, METH_VARARGS}, {"fold_case", (PyCFunction)fold_case, METH_VARARGS}, {"get_expand_on_folding", (PyCFunction)get_expand_on_folding, METH_NOARGS}, {"has_property_value", (PyCFunction)has_property_value, METH_VARARGS}, {"get_all_cases", (PyCFunction)get_all_cases, METH_VARARGS}, {NULL, NULL} }; /* Initialises the property dictionary. */ static BOOL init_property_dict(void) { int value_set_count; int i; PyObject** value_dicts; property_dict = NULL; /* How many value sets are there? */ value_set_count = 0; for (i = 0; i < sizeof(re_property_values) / sizeof(re_property_values[0]); i++) { RE_PropertyValue* value; value = &re_property_values[i]; if (value->value_set >= value_set_count) value_set_count = value->value_set + 1; } /* Quick references for the value sets. */ value_dicts = (PyObject**)re_alloc(value_set_count * sizeof(value_dicts[0])); if (!value_dicts) return FALSE; memset(value_dicts, 0, value_set_count * sizeof(value_dicts[0])); /* Build the property values dictionaries. */ for (i = 0; i < sizeof(re_property_values) / sizeof(re_property_values[0]); i++) { RE_PropertyValue* value; PyObject* v; value = &re_property_values[i]; if (!value_dicts[value->value_set]) { value_dicts[value->value_set] = PyDict_New(); if (!value_dicts[value->value_set]) goto error; } v = Py_BuildValue("i", value->id); if (!v) goto error; PyDict_SetItemString(value_dicts[value->value_set], re_strings[value->name], v); } /* Build the property dictionary. */ property_dict = PyDict_New(); if (!property_dict) goto error; for (i = 0; i < sizeof(re_properties) / sizeof(re_properties[0]); i++) { RE_Property* property; PyObject* v; property = &re_properties[i]; v = Py_BuildValue("iO", property->id, value_dicts[property->value_set]); if (!v) goto error; PyDict_SetItemString(property_dict, re_strings[property->name], v); } /* DECREF the value sets. Any unused ones will be deallocated. */ for (i = 0; i < value_set_count; i++) Py_XDECREF(value_dicts[i]); re_dealloc(value_dicts); return TRUE; error: Py_XDECREF(property_dict); /* DECREF the value sets. */ for (i = 0; i < value_set_count; i++) Py_XDECREF(value_dicts[i]); re_dealloc(value_dicts); return FALSE; } /* Initialises the module. */ PyMODINIT_FUNC init_regex(void) { PyObject* m; PyObject* d; PyObject* x; #if defined(VERBOSE) /* Unbuffered in case it crashes! */ setvbuf(stdout, NULL, _IONBF, 0); #endif /* Initialise Pattern_Type. */ Pattern_Type.tp_dealloc = pattern_dealloc; Pattern_Type.tp_repr = pattern_repr; Pattern_Type.tp_flags = Py_TPFLAGS_HAVE_WEAKREFS; Pattern_Type.tp_doc = pattern_doc; Pattern_Type.tp_weaklistoffset = offsetof(PatternObject, weakreflist); Pattern_Type.tp_methods = pattern_methods; Pattern_Type.tp_members = pattern_members; Pattern_Type.tp_getset = pattern_getset; /* Initialise Match_Type. */ Match_Type.tp_dealloc = match_dealloc; Match_Type.tp_repr = match_repr; Match_Type.tp_as_mapping = &match_as_mapping; Match_Type.tp_flags = Py_TPFLAGS_DEFAULT; Match_Type.tp_doc = match_doc; Match_Type.tp_methods = match_methods; Match_Type.tp_members = match_members; Match_Type.tp_getset = match_getset; /* Initialise Scanner_Type. */ Scanner_Type.tp_dealloc = scanner_dealloc; Scanner_Type.tp_flags = Py_TPFLAGS_DEFAULT; Scanner_Type.tp_doc = scanner_doc; Scanner_Type.tp_iter = scanner_iter; Scanner_Type.tp_iternext = scanner_iternext; Scanner_Type.tp_methods = scanner_methods; Scanner_Type.tp_members = scanner_members; /* Initialise Splitter_Type. */ Splitter_Type.tp_dealloc = splitter_dealloc; Splitter_Type.tp_flags = Py_TPFLAGS_DEFAULT; Splitter_Type.tp_doc = splitter_doc; Splitter_Type.tp_iter = splitter_iter; Splitter_Type.tp_iternext = splitter_iternext; Splitter_Type.tp_methods = splitter_methods; Splitter_Type.tp_members = splitter_members; /* Initialize object types */ if (PyType_Ready(&Pattern_Type) < 0) return; if (PyType_Ready(&Match_Type) < 0) return; if (PyType_Ready(&Scanner_Type) < 0) return; if (PyType_Ready(&Splitter_Type) < 0) return; error_exception = NULL; m = Py_InitModule("_" RE_MODULE, _functions); if (!m) return; d = PyModule_GetDict(m); x = PyInt_FromLong(RE_MAGIC); if (x) { PyDict_SetItemString(d, "MAGIC", x); Py_DECREF(x); } x = PyInt_FromLong(sizeof(RE_CODE)); if (x) { PyDict_SetItemString(d, "CODE_SIZE", x); Py_DECREF(x); } x = PyString_FromString(copyright); if (x) { PyDict_SetItemString(d, "copyright", x); Py_DECREF(x); } /* Initialise the property dictionary. */ if (!init_property_dict()) return; } /* vim:ts=4:sw=4:et */ regex-2014.02.16/Python2/_regex.h0000666000000000000000000001401612226112662014342 0ustar 00000000000000/* * Secret Labs' Regular Expression Engine * * regular expression matching engine * * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * * NOTE: This file is generated by regex.py. If you need * to change anything in here, edit regex.py and run it. * * 2010-01-16 mrab Re-written */ /* Supports Unicode version 6.3.0. */ #define RE_MAGIC 20100116 #include "_regex_unicode.h" /* Operators. */ #define RE_OP_FAILURE 0 #define RE_OP_SUCCESS 1 #define RE_OP_ANY 2 #define RE_OP_ANY_ALL 3 #define RE_OP_ANY_ALL_REV 4 #define RE_OP_ANY_REV 5 #define RE_OP_ANY_U 6 #define RE_OP_ANY_U_REV 7 #define RE_OP_ATOMIC 8 #define RE_OP_BOUNDARY 9 #define RE_OP_BRANCH 10 #define RE_OP_CALL_REF 11 #define RE_OP_CHARACTER 12 #define RE_OP_CHARACTER_IGN 13 #define RE_OP_CHARACTER_IGN_REV 14 #define RE_OP_CHARACTER_REV 15 #define RE_OP_DEFAULT_BOUNDARY 16 #define RE_OP_DEFAULT_END_OF_WORD 17 #define RE_OP_DEFAULT_START_OF_WORD 18 #define RE_OP_END 19 #define RE_OP_END_OF_LINE 20 #define RE_OP_END_OF_LINE_U 21 #define RE_OP_END_OF_STRING 22 #define RE_OP_END_OF_STRING_LINE 23 #define RE_OP_END_OF_STRING_LINE_U 24 #define RE_OP_END_OF_WORD 25 #define RE_OP_FUZZY 26 #define RE_OP_GRAPHEME_BOUNDARY 27 #define RE_OP_GREEDY_REPEAT 28 #define RE_OP_GROUP 29 #define RE_OP_GROUP_CALL 30 #define RE_OP_GROUP_EXISTS 31 #define RE_OP_LAZY_REPEAT 32 #define RE_OP_LOOKAROUND 33 #define RE_OP_NEXT 34 #define RE_OP_PROPERTY 35 #define RE_OP_PROPERTY_IGN 36 #define RE_OP_PROPERTY_IGN_REV 37 #define RE_OP_PROPERTY_REV 38 #define RE_OP_RANGE 39 #define RE_OP_RANGE_IGN 40 #define RE_OP_RANGE_IGN_REV 41 #define RE_OP_RANGE_REV 42 #define RE_OP_REF_GROUP 43 #define RE_OP_REF_GROUP_FLD 44 #define RE_OP_REF_GROUP_FLD_REV 45 #define RE_OP_REF_GROUP_IGN 46 #define RE_OP_REF_GROUP_IGN_REV 47 #define RE_OP_REF_GROUP_REV 48 #define RE_OP_SEARCH_ANCHOR 49 #define RE_OP_SET_DIFF 50 #define RE_OP_SET_DIFF_IGN 51 #define RE_OP_SET_DIFF_IGN_REV 52 #define RE_OP_SET_DIFF_REV 53 #define RE_OP_SET_INTER 54 #define RE_OP_SET_INTER_IGN 55 #define RE_OP_SET_INTER_IGN_REV 56 #define RE_OP_SET_INTER_REV 57 #define RE_OP_SET_SYM_DIFF 58 #define RE_OP_SET_SYM_DIFF_IGN 59 #define RE_OP_SET_SYM_DIFF_IGN_REV 60 #define RE_OP_SET_SYM_DIFF_REV 61 #define RE_OP_SET_UNION 62 #define RE_OP_SET_UNION_IGN 63 #define RE_OP_SET_UNION_IGN_REV 64 #define RE_OP_SET_UNION_REV 65 #define RE_OP_START_OF_LINE 66 #define RE_OP_START_OF_LINE_U 67 #define RE_OP_START_OF_STRING 68 #define RE_OP_START_OF_WORD 69 #define RE_OP_STRING 70 #define RE_OP_STRING_FLD 71 #define RE_OP_STRING_FLD_REV 72 #define RE_OP_STRING_IGN 73 #define RE_OP_STRING_IGN_REV 74 #define RE_OP_STRING_REV 75 #define RE_OP_STRING_SET 76 #define RE_OP_STRING_SET_FLD 77 #define RE_OP_STRING_SET_FLD_REV 78 #define RE_OP_STRING_SET_IGN 79 #define RE_OP_STRING_SET_IGN_REV 80 #define RE_OP_STRING_SET_REV 81 #define RE_OP_BODY_END 82 #define RE_OP_BODY_START 83 #define RE_OP_END_FUZZY 84 #define RE_OP_END_GREEDY_REPEAT 85 #define RE_OP_END_GROUP 86 #define RE_OP_END_LAZY_REPEAT 87 #define RE_OP_GREEDY_REPEAT_ONE 88 #define RE_OP_GROUP_RETURN 89 #define RE_OP_LAZY_REPEAT_ONE 90 #define RE_OP_MATCH_BODY 91 #define RE_OP_MATCH_TAIL 92 #define RE_OP_START_GROUP 93 char* re_op_text[] = { "RE_OP_FAILURE", "RE_OP_SUCCESS", "RE_OP_ANY", "RE_OP_ANY_ALL", "RE_OP_ANY_ALL_REV", "RE_OP_ANY_REV", "RE_OP_ANY_U", "RE_OP_ANY_U_REV", "RE_OP_ATOMIC", "RE_OP_BOUNDARY", "RE_OP_BRANCH", "RE_OP_CALL_REF", "RE_OP_CHARACTER", "RE_OP_CHARACTER_IGN", "RE_OP_CHARACTER_IGN_REV", "RE_OP_CHARACTER_REV", "RE_OP_DEFAULT_BOUNDARY", "RE_OP_DEFAULT_END_OF_WORD", "RE_OP_DEFAULT_START_OF_WORD", "RE_OP_END", "RE_OP_END_OF_LINE", "RE_OP_END_OF_LINE_U", "RE_OP_END_OF_STRING", "RE_OP_END_OF_STRING_LINE", "RE_OP_END_OF_STRING_LINE_U", "RE_OP_END_OF_WORD", "RE_OP_FUZZY", "RE_OP_GRAPHEME_BOUNDARY", "RE_OP_GREEDY_REPEAT", "RE_OP_GROUP", "RE_OP_GROUP_CALL", "RE_OP_GROUP_EXISTS", "RE_OP_LAZY_REPEAT", "RE_OP_LOOKAROUND", "RE_OP_NEXT", "RE_OP_PROPERTY", "RE_OP_PROPERTY_IGN", "RE_OP_PROPERTY_IGN_REV", "RE_OP_PROPERTY_REV", "RE_OP_RANGE", "RE_OP_RANGE_IGN", "RE_OP_RANGE_IGN_REV", "RE_OP_RANGE_REV", "RE_OP_REF_GROUP", "RE_OP_REF_GROUP_FLD", "RE_OP_REF_GROUP_FLD_REV", "RE_OP_REF_GROUP_IGN", "RE_OP_REF_GROUP_IGN_REV", "RE_OP_REF_GROUP_REV", "RE_OP_SEARCH_ANCHOR", "RE_OP_SET_DIFF", "RE_OP_SET_DIFF_IGN", "RE_OP_SET_DIFF_IGN_REV", "RE_OP_SET_DIFF_REV", "RE_OP_SET_INTER", "RE_OP_SET_INTER_IGN", "RE_OP_SET_INTER_IGN_REV", "RE_OP_SET_INTER_REV", "RE_OP_SET_SYM_DIFF", "RE_OP_SET_SYM_DIFF_IGN", "RE_OP_SET_SYM_DIFF_IGN_REV", "RE_OP_SET_SYM_DIFF_REV", "RE_OP_SET_UNION", "RE_OP_SET_UNION_IGN", "RE_OP_SET_UNION_IGN_REV", "RE_OP_SET_UNION_REV", "RE_OP_START_OF_LINE", "RE_OP_START_OF_LINE_U", "RE_OP_START_OF_STRING", "RE_OP_START_OF_WORD", "RE_OP_STRING", "RE_OP_STRING_FLD", "RE_OP_STRING_FLD_REV", "RE_OP_STRING_IGN", "RE_OP_STRING_IGN_REV", "RE_OP_STRING_REV", "RE_OP_STRING_SET", "RE_OP_STRING_SET_FLD", "RE_OP_STRING_SET_FLD_REV", "RE_OP_STRING_SET_IGN", "RE_OP_STRING_SET_IGN_REV", "RE_OP_STRING_SET_REV", "RE_OP_BODY_END", "RE_OP_BODY_START", "RE_OP_END_FUZZY", "RE_OP_END_GREEDY_REPEAT", "RE_OP_END_GROUP", "RE_OP_END_LAZY_REPEAT", "RE_OP_GREEDY_REPEAT_ONE", "RE_OP_GROUP_RETURN", "RE_OP_LAZY_REPEAT_ONE", "RE_OP_MATCH_BODY", "RE_OP_MATCH_TAIL", "RE_OP_START_GROUP", }; #define RE_FLAG_ASCII 0x80 #define RE_FLAG_BESTMATCH 0x1000 #define RE_FLAG_DEBUG 0x200 #define RE_FLAG_DOTALL 0x10 #define RE_FLAG_ENHANCEMATCH 0x8000 #define RE_FLAG_FULLCASE 0x4000 #define RE_FLAG_IGNORECASE 0x2 #define RE_FLAG_LOCALE 0x4 #define RE_FLAG_MULTILINE 0x8 #define RE_FLAG_REVERSE 0x400 #define RE_FLAG_TEMPLATE 0x1 #define RE_FLAG_UNICODE 0x20 #define RE_FLAG_VERBOSE 0x40 #define RE_FLAG_VERSION0 0x2000 #define RE_FLAG_VERSION1 0x100 #define RE_FLAG_WORD 0x800 regex-2014.02.16/Python2/_regex_core.py0000666000000000000000000036507612300213377015570 0ustar 00000000000000# # Secret Labs' Regular Expression Engine core module # # Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. # # This version of the SRE library can be redistributed under CNRI's # Python 1.6 license. For any other use, please contact Secret Labs # AB (info@pythonware.com). # # Portions of this engine have been developed in cooperation with # CNRI. Hewlett-Packard provided funding for 1.6 integration and # other compatibility work. # # 2010-01-16 mrab Python front-end re-written and extended import string import sys import unicodedata from collections import defaultdict import _regex __all__ = ["A", "ASCII", "B", "BESTMATCH", "D", "DEBUG", "E", "ENHANCEMATCH", "F", "FULLCASE", "I", "IGNORECASE", "L", "LOCALE", "M", "MULTILINE", "R", "REVERSE", "S", "DOTALL", "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "W", "WORD", "X", "VERBOSE", "error", "Scanner"] # The regex exception. class error(Exception): def __init__(self, message, set_error=False): Exception.__init__(self, message) self.set_error = set_error # The exception for when a positional flag has been turned on in the old # behaviour. class _UnscopedFlagSet(Exception): pass # The exception for when parsing fails and we want to try something else. class ParseError(Exception): pass # The exception for when there isn't a valid first set. class _FirstSetError(Exception): pass # Flags. A = ASCII = 0x80 # Assume ASCII locale. B = BESTMATCH = 0x1000 # Best fuzzy match. D = DEBUG = 0x200 # Print parsed pattern. E = ENHANCEMATCH = 0x8000 # Attempt to improve the fit after finding the first # fuzzy match. F = FULLCASE = 0x4000 # Unicode full case-folding. I = IGNORECASE = 0x2 # Ignore case. L = LOCALE = 0x4 # Assume current 8-bit locale. M = MULTILINE = 0x8 # Make anchors look for newline. R = REVERSE = 0x400 # Search backwards. S = DOTALL = 0x10 # Make dot match newline. U = UNICODE = 0x20 # Assume Unicode locale. V0 = VERSION0 = 0x2000 # Old legacy behaviour. V1 = VERSION1 = 0x100 # New enhanced behaviour. W = WORD = 0x800 # Default Unicode word breaks. X = VERBOSE = 0x40 # Ignore whitespace and comments. T = TEMPLATE = 0x1 # Template (present because re module has it). DEFAULT_VERSION = VERSION1 _ALL_VERSIONS = VERSION0 | VERSION1 _ALL_ENCODINGS = ASCII | LOCALE | UNICODE # The default flags for the various versions. DEFAULT_FLAGS = {VERSION0: 0, VERSION1: FULLCASE} # The mask for the flags. GLOBAL_FLAGS = (_ALL_ENCODINGS | _ALL_VERSIONS | BESTMATCH | DEBUG | ENHANCEMATCH | REVERSE) SCOPED_FLAGS = FULLCASE | IGNORECASE | MULTILINE | DOTALL | WORD | VERBOSE ALPHA = frozenset(string.ascii_letters) DIGITS = frozenset(string.digits) ALNUM = ALPHA | DIGITS OCT_DIGITS = frozenset(string.octdigits) HEX_DIGITS = frozenset(string.hexdigits) SPECIAL_CHARS = frozenset("()|?*+{^$.[\\#") | frozenset([""]) NAMED_CHAR_PART = ALNUM | frozenset(" -") PROPERTY_NAME_PART = ALNUM | frozenset(" &_-.") SET_OPS = ("||", "~~", "&&", "--") # The width of the code words inside the regex engine. BYTES_PER_CODE = _regex.get_code_size() BITS_PER_CODE = BYTES_PER_CODE * 8 # The repeat count which represents infinity. UNLIMITED = (1 << BITS_PER_CODE) - 1 # The regular expression flags. REGEX_FLAGS = {"a": ASCII, "b": BESTMATCH, "e": ENHANCEMATCH, "f": FULLCASE, "i": IGNORECASE, "L": LOCALE, "m": MULTILINE, "r": REVERSE, "s": DOTALL, "u": UNICODE, "V0": VERSION0, "V1": VERSION1, "w": WORD, "x": VERBOSE} # The case flags. CASE_FLAGS = FULLCASE | IGNORECASE NOCASE = 0 FULLIGNORECASE = FULLCASE | IGNORECASE FULL_CASE_FOLDING = UNICODE | FULLIGNORECASE # The number of digits in hexadecimal escapes. HEX_ESCAPES = {"x": 2, "u": 4, "U": 8} # A singleton which indicates a comment within a pattern. COMMENT = object() # The names of the opcodes. OPCODES = """ FAILURE SUCCESS ANY ANY_ALL ANY_ALL_REV ANY_REV ANY_U ANY_U_REV ATOMIC BOUNDARY BRANCH CALL_REF CHARACTER CHARACTER_IGN CHARACTER_IGN_REV CHARACTER_REV DEFAULT_BOUNDARY DEFAULT_END_OF_WORD DEFAULT_START_OF_WORD END END_OF_LINE END_OF_LINE_U END_OF_STRING END_OF_STRING_LINE END_OF_STRING_LINE_U END_OF_WORD FUZZY GRAPHEME_BOUNDARY GREEDY_REPEAT GROUP GROUP_CALL GROUP_EXISTS LAZY_REPEAT LOOKAROUND NEXT PROPERTY PROPERTY_IGN PROPERTY_IGN_REV PROPERTY_REV RANGE RANGE_IGN RANGE_IGN_REV RANGE_REV REF_GROUP REF_GROUP_FLD REF_GROUP_FLD_REV REF_GROUP_IGN REF_GROUP_IGN_REV REF_GROUP_REV SEARCH_ANCHOR SET_DIFF SET_DIFF_IGN SET_DIFF_IGN_REV SET_DIFF_REV SET_INTER SET_INTER_IGN SET_INTER_IGN_REV SET_INTER_REV SET_SYM_DIFF SET_SYM_DIFF_IGN SET_SYM_DIFF_IGN_REV SET_SYM_DIFF_REV SET_UNION SET_UNION_IGN SET_UNION_IGN_REV SET_UNION_REV START_OF_LINE START_OF_LINE_U START_OF_STRING START_OF_WORD STRING STRING_FLD STRING_FLD_REV STRING_IGN STRING_IGN_REV STRING_REV STRING_SET STRING_SET_FLD STRING_SET_FLD_REV STRING_SET_IGN STRING_SET_IGN_REV STRING_SET_REV """ # Define the opcodes in a namespace. class Namespace(object): pass OP = Namespace() for i, op in enumerate(OPCODES.split()): setattr(OP, op, i) def _shrink_cache(cache_dict, args_dict, max_length, divisor=5): """Make room in the given cache. Args: cache_dict: The cache dictionary to modify. args_dict: The dictionary of named list args used by patterns. max_length: Maximum # of entries in cache_dict before it is shrunk. divisor: Cache will shrink to max_length - 1/divisor*max_length items. """ # Toss out a fraction of the entries at random to make room for new ones. # A random algorithm was chosen as opposed to simply cache_dict.popitem() # as popitem could penalize the same regular expression repeatedly based # on its internal hash value. Being random should spread the cache miss # love around. cache_keys = tuple(cache_dict.keys()) overage = len(cache_keys) - max_length if overage < 0: # Cache is already within limits. Normally this should not happen # but it could due to multithreading. return number_to_toss = max_length // divisor + overage # The import is done here to avoid a circular dependency. import random if not hasattr(random, 'sample'): # Do nothing while resolving the circular dependency: # re->random->warnings->tokenize->string->re return for doomed_key in random.sample(cache_keys, number_to_toss): try: del cache_dict[doomed_key] except KeyError: # Ignore problems if the cache changed from another thread. pass # Rebuild the arguments dictionary. args_dict.clear() for pattern, pattern_type, flags, args, default_version in cache_dict: args_dict[pattern, pattern_type, flags, default_version] = args def _fold_case(info, string): "Folds the case of a string." flags = info.flags if (flags & _ALL_ENCODINGS) == 0: flags |= info.guess_encoding return _regex.fold_case(flags, string) def is_cased(info, char): "Checks whether a character is cased." return len(_regex.get_all_cases(info.flags, char)) > 1 def _compile_firstset(info, fs): "Compiles the firstset for the pattern." if not fs or None in fs: return [] # If we ignore the case, for simplicity we won't build a firstset. members = set() for i in fs: if i.case_flags: if isinstance(i, Character): if is_cased(info, i.value): return [] elif isinstance(i, SetBase): return [] members.add(i.with_flags(case_flags=NOCASE)) # Build the firstset. fs = SetUnion(info, list(members), zerowidth=True) fs = fs.optimise(info, in_set=True) # Compile the firstset. return fs.compile(bool(info.flags & REVERSE)) def _flatten_code(code): "Flattens the code from a list of tuples." flat_code = [] for c in code: flat_code.extend(c) return flat_code def make_character(info, value, in_set=False): "Makes a character literal." if in_set: # A character set is built case-sensitively. return Character(value) return Character(value, case_flags=info.flags & CASE_FLAGS) def make_ref_group(info, name, position): "Makes a group reference." return RefGroup(info, name, position, case_flags=info.flags & CASE_FLAGS) def make_string_set(info, name): "Makes a string set." return StringSet(info, name, case_flags=info.flags & CASE_FLAGS) def make_property(info, prop, in_set): "Makes a property." if in_set: return prop return prop.with_flags(case_flags=info.flags & CASE_FLAGS) def _parse_pattern(source, info): "Parses a pattern, eg. 'a|b|c'." branches = [parse_sequence(source, info)] while source.match("|"): branches.append(parse_sequence(source, info)) if len(branches) == 1: return branches[0] return Branch(branches) def parse_sequence(source, info): "Parses a sequence, eg. 'abc'." sequence = [] item = parse_item(source, info) while item: sequence.append(item) item = parse_item(source, info) return make_sequence(sequence) def PossessiveRepeat(element, min_count, max_count): "Builds a possessive repeat." return Atomic(GreedyRepeat(element, min_count, max_count)) def parse_item(source, info): "Parses an item, which might be repeated. Returns None if there's no item." element = parse_element(source, info) counts = parse_quantifier(source, info) if counts: min_count, max_count = counts saved_pos = source.pos ch = source.get() if ch == "?": # The "?" suffix that means it's a lazy repeat. repeated = LazyRepeat elif ch == "+": # The "+" suffix that means it's a possessive repeat. repeated = PossessiveRepeat else: # No suffix means that it's a greedy repeat. source.pos = saved_pos repeated = GreedyRepeat if element.is_empty() or min_count == max_count == 1: return element return repeated(element, min_count, max_count) # No quantifier, but maybe there's a fuzzy constraint. constraints = parse_fuzzy(source) if not constraints: # No fuzzy constraint. return element # If a group is marked as fuzzy then put all of the fuzzy part in the # group. if isinstance(element, Group): element.subpattern = Fuzzy(element.subpattern, constraints) return element return Fuzzy(element, constraints) _QUANTIFIERS = {"?": (0, 1), "*": (0, None), "+": (1, None)} def parse_quantifier(source, info): "Parses a quantifier." while True: saved_pos = source.pos ch = source.get() q = _QUANTIFIERS.get(ch) if q: # It's a quantifier. return q if ch == "{": # Looks like a limited repeated element, eg. 'a{2,3}'. counts = parse_limited_quantifier(source) if counts: return counts elif ch == "(" and source.match("?#"): # A comment. parse_comment(source) continue # Neither a quantifier nor a comment. break # Parse it later, perhaps as a literal. source.pos = saved_pos return None def is_above_limit(count): "Checks whether a count is above the maximum." return count is not None and count >= UNLIMITED def parse_limited_quantifier(source): "Parses a limited quantifier." saved_pos = source.pos min_count = parse_count(source) if source.match(","): max_count = parse_count(source) # No minimum means 0 and no maximum means unlimited. min_count = int(min_count or 0) max_count = int(max_count) if max_count else None if max_count is not None and min_count > max_count: raise error("min repeat greater than max repeat at position %d" % saved_pos) else: if not min_count: source.pos = saved_pos return None min_count = max_count = int(min_count) if is_above_limit(min_count) or is_above_limit(max_count): raise error("repeat count too big at position %d" % saved_pos) if not source.match ("}"): source.pos = saved_pos return None return min_count, max_count def parse_fuzzy(source): "Parses a fuzzy setting, if present." saved_pos = source.pos if not source.match("{"): source.pos = saved_pos return None constraints = {} try: parse_fuzzy_item(source, constraints) while source.match(","): parse_fuzzy_item(source, constraints) except ParseError: source.pos = saved_pos return None if not source.match("}"): raise error("expected } at position %d" % source.pos) return constraints def parse_fuzzy_item(source, constraints): "Parses a fuzzy setting item." saved_pos = source.pos try: parse_cost_constraint(source, constraints) except ParseError: source.pos = saved_pos parse_cost_equation(source, constraints) def parse_cost_constraint(source, constraints): "Parses a cost constraint." saved_pos = source.pos ch = source.get() if ch in ALPHA: # Syntax: constraint [("<=" | "<") cost] constraint = parse_constraint(source, constraints, ch) max_inc = parse_fuzzy_compare(source) if max_inc is None: # No maximum cost. constraints[constraint] = 0, None else: # There's a maximum cost. cost_pos = source.pos max_cost = int(parse_count(source)) # Inclusive or exclusive limit? if not max_inc: max_cost -= 1 if max_cost < 0: raise error("bad fuzzy cost limit at position %d" % cost_pos) constraints[constraint] = 0, max_cost elif ch in DIGITS: # Syntax: cost ("<=" | "<") constraint ("<=" | "<") cost source.pos = saved_pos try: # Minimum cost. min_cost = int(parse_count(source)) min_inc = parse_fuzzy_compare(source) if min_inc is None: raise ParseError() constraint = parse_constraint(source, constraints, source.get()) max_inc = parse_fuzzy_compare(source) if max_inc is None: raise ParseError() # Maximum cost. cost_pos = source.pos max_cost = int(parse_count(source)) # Inclusive or exclusive limits? if not min_inc: min_cost += 1 if not max_inc: max_cost -= 1 if not 0 <= min_cost <= max_cost: raise error("bad fuzzy cost limit at position %d" % cost_pos) constraints[constraint] = min_cost, max_cost except ValueError: raise ParseError() else: raise ParseError() def parse_constraint(source, constraints, ch): "Parses a constraint." if ch not in "deis": raise error("bad fuzzy constraint at position %d" % source.pos) if ch in constraints: raise error("repeated fuzzy constraint at position %d" % source.pos) return ch def parse_fuzzy_compare(source): "Parses a cost comparator." if source.match("<="): return True elif source.match("<"): return False else: return None def parse_cost_equation(source, constraints): "Parses a cost equation." if "cost" in constraints: raise error("more than one cost equation at position %d" % source.pos) cost = {} parse_cost_term(source, cost) while source.match("+"): parse_cost_term(source, cost) max_inc = parse_fuzzy_compare(source) if max_inc is None: raise error("missing fuzzy cost limit at position %d" % source.pos) max_cost = int(parse_count(source)) if not max_inc: max_cost -= 1 if max_cost < 0: raise error("bad fuzzy cost limit at position %d" % source.pos) cost["max"] = max_cost constraints["cost"] = cost def parse_cost_term(source, cost): "Parses a cost equation term." coeff = parse_count(source) ch = source.get() if ch not in "dis": raise ParseError() if ch in cost: raise error("repeated fuzzy cost at position %d" % source.pos) cost[ch] = int(coeff or 1) def parse_count(source): "Parses a quantifier's count, which can be empty." return source.get_while(DIGITS) def parse_element(source, info): """Parses an element. An element might actually be a flag, eg. '(?i)', in which case it returns None. """ while True: saved_pos = source.pos ch = source.get() if ch in SPECIAL_CHARS: if ch in ")|": # The end of a sequence. At the end of the pattern ch is "". source.pos = saved_pos return None elif ch == "\\": # An escape sequence outside a set. return parse_escape(source, info, False) elif ch == "(": # A parenthesised subpattern or a flag. element = parse_paren(source, info) if element and element is not COMMENT: return element elif ch == ".": # Any character. if info.flags & DOTALL: return AnyAll() elif info.flags & WORD: return AnyU() else: return Any() elif ch == "[": # A character set. return parse_set(source, info) elif ch == "^": # The start of a line or the string. if info.flags & MULTILINE: if info.flags & WORD: return StartOfLineU() else: return StartOfLine() else: return StartOfString() elif ch == "$": # The end of a line or the string. if info.flags & MULTILINE: if info.flags & WORD: return EndOfLineU() else: return EndOfLine() else: if info.flags & WORD: return EndOfStringLineU() else: return EndOfStringLine() elif ch == "{": # Looks like a limited quantifier. saved_pos_2 = source.pos source.pos = saved_pos counts = parse_quantifier(source, info) if counts: # A quantifier where we expected an element. raise error("nothing to repeat at position %d" % saved_pos_2) # Not a quantifier, so it's a literal. source.pos = saved_pos_2 return make_character(info, ord(ch)) elif ch in "?*+": # A quantifier where we expected an element. raise error("nothing to repeat at position %d" % saved_pos) else: # A literal. return make_character(info, ord(ch)) else: # A literal. return make_character(info, ord(ch)) def parse_paren(source, info): "Parses a parenthesised subpattern or a flag." saved_pos = source.pos ch = source.get() if ch == "?": # (?... saved_pos_2 = source.pos ch = source.get() if ch == "<": # (?<... saved_pos_3 = source.pos ch = source.get() if ch in ("=", "!"): # (?<=... or (?") saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) info.close_group() return Group(info, group, subpattern) if ch in ("=", "!"): # (?=... or (?!...: lookahead. return parse_lookaround(source, info, False, ch == "=") if ch == "P": # (?P...: a Python extension. return parse_extension(source, info) if ch == "#": # (?#...: a comment. return parse_comment(source) if ch == "(": # (?(...: a conditional subpattern. return parse_conditional(source, info) if ch == ">": # (?>...: an atomic subpattern. return parse_atomic(source, info) if ch == "|": # (?|...: a common/reset groups branch. return parse_common(source, info) if ch == "R" or "0" <= ch <= "9": # (?R...: probably a call to a group. return parse_call_group(source, info, ch, saved_pos_2) if ch == "&": # (?&...: a call to a named group. return parse_call_named_group(source, info, saved_pos_2) # (?...: probably a flags subpattern. source.pos = saved_pos_2 return parse_flags_subpattern(source, info) # (...: an unnamed capture group. source.pos = saved_pos group = info.open_group() saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) info.close_group() return Group(info, group, subpattern) def parse_extension(source, info): "Parses a Python extension." saved_pos = source.pos ch = source.get() if ch == "<": # (?P<...: a named capture group. name = parse_name(source) group = info.open_group(name) source.expect(">") saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) info.close_group() return Group(info, group, subpattern) if ch == "=": # (?P=...: a named group reference. name = parse_name(source) source.expect(")") if info.is_open_group(name): raise error("can't refer to an open group at position %d" % saved_pos) return make_ref_group(info, name, saved_pos) if ch == ">" or ch == "&": # (?P>...: a call to a group. return parse_call_named_group(source, info, saved_pos) source.pos = saved_pos raise error("unknown extension at position %d" % saved_pos) def parse_comment(source): "Parses a comment." source.skip_while(set(")"), include=False) source.expect(")") return COMMENT def parse_lookaround(source, info, behind, positive): "Parses a lookaround." saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) return LookAround(behind, positive, subpattern) def parse_conditional(source, info): "Parses a conditional subpattern." saved_flags = info.flags saved_pos = source.pos try: group = parse_name(source, True) source.expect(")") yes_branch = parse_sequence(source, info) if source.match("|"): no_branch = parse_sequence(source, info) else: no_branch = Sequence() source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) if yes_branch.is_empty() and no_branch.is_empty(): return Sequence() return Conditional(info, group, yes_branch, no_branch, saved_pos) def parse_atomic(source, info): "Parses an atomic subpattern." saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) return Atomic(subpattern) def parse_common(source, info): "Parses a common groups branch." # Capture group numbers in different branches can reuse the group numbers. initial_group_count = info.group_count branches = [parse_sequence(source, info)] final_group_count = info.group_count while source.match("|"): info.group_count = initial_group_count branches.append(parse_sequence(source, info)) final_group_count = max(final_group_count, info.group_count) info.group_count = final_group_count source.expect(")") if len(branches) == 1: return branches[0] return Branch(branches) def parse_call_group(source, info, ch, pos): "Parses a call to a group." if ch == "R": group = "0" else: group = ch + source.get_while(DIGITS) source.expect(")") return CallGroup(info, group, pos) def parse_call_named_group(source, info, pos): "Parses a call to a named group." group = parse_name(source) source.expect(")") return CallGroup(info, group, pos) def parse_flag_set(source): "Parses a set of inline flags." flags = 0 try: while True: saved_pos = source.pos ch = source.get() if ch == "V": ch += source.get() flags |= REGEX_FLAGS[ch] except KeyError: source.pos = saved_pos return flags def parse_flags(source, info): "Parses flags being turned on/off." flags_on = parse_flag_set(source) if source.match("-"): flags_off = parse_flag_set(source) if not flags_off: raise error("bad inline flags: no flags after '-' at position %d" % source.pos) else: flags_off = 0 return flags_on, flags_off def parse_subpattern(source, info, flags_on, flags_off): "Parses a subpattern with scoped flags." saved_flags = info.flags info.flags = (info.flags | flags_on) & ~flags_off source.ignore_space = bool(info.flags & VERBOSE) try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) return subpattern def parse_positional_flags(source, info, flags_on, flags_off): "Parses positional flags." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version == VERSION0: # Positional flags are global and can only be turned on. if flags_off: raise error("bad inline flags: can't turn flags off at position %d" % source.pos) new_global_flags = flags_on & ~info.global_flags if new_global_flags: info.global_flags |= new_global_flags # A global has been turned on, so reparse the pattern. raise _UnscopedFlagSet(info.global_flags) else: info.flags = (info.flags | flags_on) & ~flags_off source.ignore_space = bool(info.flags & VERBOSE) return None def parse_flags_subpattern(source, info): """Parses a flags subpattern. It could be inline flags or a subpattern possibly with local flags. """ flags_on, flags_off = parse_flags(source, info) if flags_off & GLOBAL_FLAGS: raise error("bad inline flags: can't turn off global flag at position %d" % source.pos) if flags_on & flags_off: raise error("bad inline flags: flag turned on and off at position %d" % source.pos) # Handle flags which are global in all regex behaviours. new_global_flags = (flags_on & ~info.global_flags) & GLOBAL_FLAGS if new_global_flags: info.global_flags |= new_global_flags # A global has been turned on, so reparse the pattern. raise _UnscopedFlagSet(info.global_flags) # Ensure that from now on we have only scoped flags. flags_on &= ~GLOBAL_FLAGS if source.match(":"): return parse_subpattern(source, info, flags_on, flags_off) if source.match(")"): return parse_positional_flags(source, info, flags_on, flags_off) raise error("unknown extension at position %d" % source.pos) def parse_name(source, allow_numeric=False): "Parses a name." name = source.get_while(set(")>"), include=False) if not name: raise error("bad group name at position %d" % source.pos) if name.isdigit(): if not allow_numeric: raise error("bad group name at position %d" % source.pos) else: if not is_identifier(name): raise error("bad group name at position %d" % source.pos) return name def is_identifier(name): if not name: return False if name[0] not in ALPHA and name[0] != "_": return False name = name.replace("_", "") return not name or all(c in ALNUM for c in name) def is_octal(string): "Checks whether a string is octal." return all(ch in OCT_DIGITS for ch in string) def is_decimal(string): "Checks whether a string is decimal." return all(ch in DIGITS for ch in string) def is_hexadecimal(string): "Checks whether a string is hexadecimal." return all(ch in HEX_DIGITS for ch in string) def parse_escape(source, info, in_set): "Parses an escape sequence." saved_ignore = source.ignore_space source.ignore_space = False ch = source.get() source.ignore_space = saved_ignore if not ch: # A backslash at the end of the pattern. raise error("bad escape at position %d" % source.pos) if ch in HEX_ESCAPES: # A hexadecimal escape sequence. return parse_hex_escape(source, info, HEX_ESCAPES[ch], in_set) elif ch == "g" and not in_set: # A group reference. saved_pos = source.pos try: return parse_group_ref(source, info) except error: # Invalid as a group reference, so assume it's a literal. source.pos = saved_pos return make_character(info, ord(ch), in_set) elif ch == "G" and not in_set: # A search anchor. return SearchAnchor() elif ch == "L" and not in_set: # A string set. return parse_string_set(source, info) elif ch == "N": # A named codepoint. return parse_named_char(source, info, in_set) elif ch in "pP": # A Unicode property, positive or negative. return parse_property(source, info, ch == "p", in_set) elif ch == "X" and not in_set: # A grapheme cluster. return Grapheme() elif ch in ALPHA: # An alphabetic escape sequence. # Positional escapes aren't allowed inside a character set. if not in_set: if info.flags & WORD: value = WORD_POSITION_ESCAPES.get(ch) else: value = POSITION_ESCAPES.get(ch) if value: return value value = CHARSET_ESCAPES.get(ch) if value: return value value = CHARACTER_ESCAPES.get(ch) if value: return Character(ord(value)) return make_character(info, ord(ch), in_set) elif ch in DIGITS: # A numeric escape sequence. return parse_numeric_escape(source, info, ch, in_set) else: # A literal. return make_character(info, ord(ch), in_set) def parse_numeric_escape(source, info, ch, in_set): "Parses a numeric escape sequence." if in_set or ch == "0": # Octal escape sequence, max 3 digits. return parse_octal_escape(source, info, [ch], in_set) # At least 1 digit, so either octal escape or group. digits = ch saved_pos = source.pos ch = source.get() if ch in DIGITS: # At least 2 digits, so either octal escape or group. digits += ch saved_pos = source.pos ch = source.get() if is_octal(digits) and ch in OCT_DIGITS: # 3 octal digits, so octal escape sequence. encoding = info.flags & _ALL_ENCODINGS if encoding == ASCII or encoding == LOCALE: octal_mask = 0xFF else: octal_mask = 0x1FF value = int(digits + ch, 8) & octal_mask return make_character(info, value) # Group reference. source.pos = saved_pos if info.is_open_group(digits): raise error("can't refer to an open group at position %d" % source.pos) return make_ref_group(info, digits, source.pos) def parse_octal_escape(source, info, digits, in_set): "Parses an octal escape sequence." saved_pos = source.pos ch = source.get() while len(digits) < 3 and ch in OCT_DIGITS: digits.append(ch) saved_pos = source.pos ch = source.get() source.pos = saved_pos try: value = int("".join(digits), 8) return make_character(info, value, in_set) except ValueError: raise error("bad octal escape at position %d" % source.pos) def parse_hex_escape(source, info, expected_len, in_set): "Parses a hex escape sequence." digits = [] for i in range(expected_len): ch = source.get() if ch not in HEX_DIGITS: raise error("bad hex escape at position %d" % source.pos) digits.append(ch) value = int("".join(digits), 16) return make_character(info, value, in_set) def parse_group_ref(source, info): "Parses a group reference." source.expect("<") saved_pos = source.pos name = parse_name(source, True) source.expect(">") if info.is_open_group(name): raise error("can't refer to an open group at position %d" % source.pos) return make_ref_group(info, name, saved_pos) def parse_string_set(source, info): "Parses a string set reference." source.expect("<") name = parse_name(source, True) source.expect(">") if name is None or name not in info.kwargs: raise error("undefined named list at position %d" % source.pos) return make_string_set(info, name) def parse_named_char(source, info, in_set): "Parses a named character." saved_pos = source.pos if source.match("{"): name = source.get_while(NAMED_CHAR_PART) if source.match("}"): try: value = unicodedata.lookup(name) return make_character(info, ord(value), in_set) except KeyError: raise error("undefined character name at position %d" % source.pos) source.pos = saved_pos return make_character(info, ord("N"), in_set) def parse_property(source, info, positive, in_set): "Parses a Unicode property." saved_pos = source.pos ch = source.get() if ch == "{": negate = source.match("^") prop_name, name = parse_property_name(source) if source.match("}"): # It's correctly delimited. prop = lookup_property(prop_name, name, positive != negate) return make_property(info, prop, in_set) elif ch and ch in "CLMNPSZ": # An abbreviated property, eg \pL. prop = lookup_property(None, ch, positive) return make_property(info, prop, in_set) # Not a property, so treat as a literal "p" or "P". source.pos = saved_pos ch = "p" if positive else "P" return make_character(info, ord(ch), in_set) def parse_property_name(source): "Parses a property name, which may be qualified." name = source.get_while(PROPERTY_NAME_PART) saved_pos = source.pos ch = source.get() if ch and ch in ":=": prop_name = name name = source.get_while(ALNUM | set(" &_-./")).strip() if name: # Name after the ":" or "=", so it's a qualified name. saved_pos = source.pos else: # No name after the ":" or "=", so assume it's an unqualified name. prop_name, name = None, prop_name else: prop_name = None source.pos = saved_pos return prop_name, name def parse_set(source, info): "Parses a character set." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION saved_ignore = source.ignore_space source.ignore_space = False # Negative set? negate = source.match("^") try: if version == VERSION0: item = parse_set_imp_union(source, info) else: item = parse_set_union(source, info) if not source.match("]"): raise error("missing ] at position %d" % source.pos) finally: source.ignore_space = saved_ignore if negate: item = item.with_flags(positive=not item.positive) item = item.with_flags(case_flags=info.flags & CASE_FLAGS) return item def parse_set_union(source, info): "Parses a set union ([x||y])." items = [parse_set_symm_diff(source, info)] while source.match("||"): items.append(parse_set_symm_diff(source, info)) if len(items) == 1: return items[0] return SetUnion(info, items) def parse_set_symm_diff(source, info): "Parses a set symmetric difference ([x~~y])." items = [parse_set_inter(source, info)] while source.match("~~"): items.append(parse_set_inter(source, info)) if len(items) == 1: return items[0] return SetSymDiff(info, items) def parse_set_inter(source, info): "Parses a set intersection ([x&&y])." items = [parse_set_diff(source, info)] while source.match("&&"): items.append(parse_set_diff(source, info)) if len(items) == 1: return items[0] return SetInter(info, items) def parse_set_diff(source, info): "Parses a set difference ([x--y])." items = [parse_set_imp_union(source, info)] while source.match("--"): items.append(parse_set_imp_union(source, info)) if len(items) == 1: return items[0] return SetDiff(info, items) def parse_set_imp_union(source, info): "Parses a set implicit union ([xy])." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION items = [parse_set_member(source, info)] while True: saved_pos = source.pos if source.match("]"): # End of the set. source.pos = saved_pos break if version == VERSION1 and any(source.match(op) for op in SET_OPS): # The new behaviour has set operators. source.pos = saved_pos break items.append(parse_set_member(source, info)) if len(items) == 1: return items[0] return SetUnion(info, items) def parse_set_member(source, info): "Parses a member in a character set." # Parse a set item. start = parse_set_item(source, info) if (not isinstance(start, Character) or not start.positive or not source.match("-")): # It's not the start of a range. return start # It looks like the start of a range of characters. saved_pos = source.pos if source.match("]"): # We've reached the end of the set, so return both the character and # hyphen. source.pos = saved_pos return SetUnion(info, [start, Character(ord("-"))]) # Parse a set item. end = parse_set_item(source, info) if not isinstance(end, Character) or not end.positive: # It's not a range, so return the character, hyphen and property. return SetUnion(info, [start, Character(ord("-")), end]) # It _is_ a range. if start.value > end.value: raise error("bad character range at position %d" % source.pos) if start.value == end.value: return start return Range(start.value, end.value) def parse_set_item(source, info): "Parses an item in a character set." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if source.match("\\"): # An escape sequence in a set. return parse_escape(source, info, True) saved_pos = source.pos if source.match("[:"): # Looks like a POSIX character class. try: return parse_posix_class(source, info) except ParseError: # Not a POSIX character class. source.pos = saved_pos if version == VERSION1 and source.match("["): # It's the start of a nested set. # Negative set? negate = source.match("^") item = parse_set_union(source, info) if not source.match("]"): raise error("missing ] at position %d" % source.pos) if negate: item = item.with_flags(positive=not item.positive) return item ch = source.get() if not ch: raise error("bad set at position %d" % source.pos, True) return Character(ord(ch)) def parse_posix_class(source, info): "Parses a POSIX character class." negate = source.match("^") prop_name, name = parse_property_name(source) if not source.match(":]"): raise ParseError() return lookup_property(prop_name, name, positive=not negate) def float_to_rational(flt): "Converts a float to a rational pair." int_part = int(flt) error = flt - int_part if abs(error) < 0.0001: return int_part, 1 den, num = float_to_rational(1.0 / error) return int_part * den + num, den def numeric_to_rational(numeric): "Converts a numeric string to a rational string, if possible." if numeric[0] == "-": sign, numeric = numeric[0], numeric[1 : ] else: sign = "" parts = numeric.split("/") if len(parts) == 2: num, den = float_to_rational(float(parts[0]) / float(parts[1])) elif len(parts) == 1: num, den = float_to_rational(float(parts[0])) else: raise ValueError() result = "%s%s/%s" % (sign, num, den) if result.endswith("/1"): return result[ : -2] return result def standardise_name(name): "Standardises a property or value name." try: return numeric_to_rational("".join(name)) except (ValueError, ZeroDivisionError): return "".join(ch for ch in name if ch not in "_- ").upper() def lookup_property(property, value, positive): "Looks up a property." # Normalise the names (which may still be lists). property = standardise_name(property) if property else None value = standardise_name(value) if property: # Both the property and the value are provided. prop = PROPERTIES.get(property) if not prop: raise error("unknown property at position %d" % source.pos) prop_id, value_dict = prop val_id = value_dict.get(value) if val_id is None: raise error("unknown property value at position %d" % source.pos) if "YES" in value_dict and val_id == 0: positive, val_id = not positive, 1 return Property((prop_id << 16) | val_id, positive) # Only the value is provided. # It might be the name of a GC, script or block value. for property in ("GC", "SCRIPT", "BLOCK"): prop_id, value_dict = PROPERTIES.get(property) val_id = value_dict.get(value) if val_id is not None: return Property((prop_id << 16) | val_id, positive) # It might be the name of a binary property. prop = PROPERTIES.get(value) if prop: prop_id, value_dict = prop if "YES" in value_dict: return Property((prop_id << 16) | 1, positive) # It might be the name of a binary property starting with a prefix. if value.startswith("IS"): prop = PROPERTIES.get(value[2 : ]) if prop: prop_id, value_dict = prop if "YES" in value_dict: return Property((prop_id << 16) | 1, positive) # It might be the name of a script or block starting with a prefix. for prefix, property in (("IS", "SCRIPT"), ("IN", "BLOCK")): if value.startswith(prefix): prop_id, value_dict = PROPERTIES.get(property) val_id = value_dict.get(value[2 : ]) if val_id is not None: return Property((prop_id << 16) | val_id, positive) # Unknown property. raise error("unknown property at position %d" % source.pos) def _compile_replacement(source, pattern, is_unicode): "Compiles a replacement template escape sequence." ch = source.get() if ch in ALPHA: # An alphabetic escape sequence. value = CHARACTER_ESCAPES.get(ch) if value: return False, [ord(value)] if ch in HEX_ESCAPES and (ch == "x" or is_unicode): # A hexadecimal escape sequence. return False, [parse_repl_hex_escape(source, HEX_ESCAPES[ch])] if ch == "g": # A group preference. return True, [compile_repl_group(source, pattern)] if ch == "N" and is_unicode: # A named character. value = parse_repl_named_char(source) if value is not None: return False, [value] return False, [ord("\\"), ord(ch)] if isinstance(source.sep, str): octal_mask = 0xFF else: octal_mask = 0x1FF if ch == "0": # An octal escape sequence. digits = ch while len(digits) < 3: saved_pos = source.pos ch = source.get() if ch not in OCT_DIGITS: source.pos = saved_pos break digits += ch return False, [int(digits, 8) & octal_mask] if ch in DIGITS: # Either an octal escape sequence (3 digits) or a group reference (max # 2 digits). digits = ch saved_pos = source.pos ch = source.get() if ch in DIGITS: digits += ch saved_pos = source.pos ch = source.get() if ch and is_octal(digits + ch): # An octal escape sequence. return False, [int(digits + ch, 8) & octal_mask] # A group reference. source.pos = saved_pos return True, [int(digits)] if ch == "\\": # An escaped backslash is a backslash. return False, [ord("\\")] if not ch: # A trailing backslash. raise error("bad escape at position %d" % source.pos) # An escaped non-backslash is a backslash followed by the literal. return False, [ord("\\"), ord(ch)] def parse_repl_hex_escape(source, expected_len): "Parses a hex escape sequence in a replacement string." digits = [] for i in range(expected_len): ch = source.get() if ch not in HEX_DIGITS: raise error("bad hex escape at position %d" % source.pos) digits.append(ch) return int("".join(digits), 16) def parse_repl_named_char(source): "Parses a named character in a replacement string." saved_pos = source.pos if source.match("{"): name = source.get_while(ALPHA | set(" ")) if source.match("}"): try: value = unicodedata.lookup(name) return ord(value) except KeyError: raise error("undefined character name at position %d" % source.pos) source.pos = saved_pos return None def compile_repl_group(source, pattern): "Compiles a replacement template group reference." source.expect("<") name = parse_name(source, True) source.expect(">") if name.isdigit(): index = int(name) if not 0 <= index <= pattern.groups: raise error("invalid group at position %d" % source.pos) return index try: return pattern.groupindex[name] except KeyError: raise IndexError("unknown group") # The regular expression is parsed into a syntax tree. The different types of # node are defined below. INDENT = " " POSITIVE_OP = 0x1 ZEROWIDTH_OP = 0x2 FUZZY_OP = 0x4 REVERSE_OP = 0x8 REQUIRED_OP = 0x10 POS_TEXT = {False: "NON-MATCH", True: "MATCH"} CASE_TEXT = {NOCASE: "", IGNORECASE: " SIMPLE_IGNORE_CASE", FULLCASE: "", FULLIGNORECASE: " FULL_IGNORE_CASE"} def make_sequence(items): if len(items) == 1: return items[0] return Sequence(items) # Common base class for all nodes. class RegexBase(object): def __init__(self): self._key = self.__class__ def with_flags(self, positive=None, case_flags=None, zerowidth=None): if positive is None: positive = self.positive else: positive = bool(positive) if case_flags is None: case_flags = self.case_flags else: case_flags = case_flags & CASE_FLAGS if zerowidth is None: zerowidth = self.zerowidth else: zerowidth = bool(zerowidth) if (positive == self.positive and case_flags == self.case_flags and zerowidth == self.zerowidth): return self return self.rebuild(positive, case_flags, zerowidth) def fix_groups(self, reverse, fuzzy): pass def optimise(self, info): return self def pack_characters(self, info): return self def remove_captures(self): return self def is_atomic(self): return True def can_be_affix(self): return True def contains_group(self): return False def get_firstset(self, reverse): raise _FirstSetError() def has_simple_start(self): return False def is_empty(self): return False def __hash__(self): return hash(self._key) def __eq__(self, other): return type(self) is type(other) and self._key == other._key def __ne__(self, other): return not self.__eq__(other) def get_required_string(self, reverse): return self.max_width(), None # Base class for zero-width nodes. class ZeroWidthBase(RegexBase): def __init__(self, positive=True): RegexBase.__init__(self) self.positive = bool(positive) self._key = self.__class__, self.positive def get_firstset(self, reverse): return set([None]) def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if fuzzy: flags |= FUZZY_OP if reverse: flags |= REVERSE_OP return [(self._opcode, flags)] def dump(self, indent=0, reverse=False): print "%s%s %s" % (INDENT * indent, self._op_name, POS_TEXT[self.positive]) def max_width(self): return 0 class Any(RegexBase): _opcode = {False: OP.ANY, True: OP.ANY_REV} _op_name = "ANY" def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if fuzzy: flags |= FUZZY_OP return [(self._opcode[reverse], flags)] def dump(self, indent=0, reverse=False): print "%s%s" % (INDENT * indent, self._op_name) def max_width(self): return 1 class AnyAll(Any): _opcode = {False: OP.ANY_ALL, True: OP.ANY_ALL_REV} _op_name = "ANY_ALL" class AnyU(Any): _opcode = {False: OP.ANY_U, True: OP.ANY_U_REV} _op_name = "ANY_U" class Atomic(RegexBase): def __init__(self, subpattern): RegexBase.__init__(self) self.subpattern = subpattern def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(reverse, fuzzy) def optimise(self, info): self.subpattern = self.subpattern.optimise(info) if self.subpattern.is_empty(): return self.subpattern return self def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): self.subpattern = self.subpattern.remove_captures() return self def can_be_affix(self): return self.subpattern.can_be_affix() def contains_group(self): return self.subpattern.contains_group() def get_firstset(self, reverse): return self.subpattern.get_firstset(reverse) def has_simple_start(self): return self.subpattern.has_simple_start() def compile(self, reverse=False, fuzzy=False): return ([(OP.ATOMIC, )] + self.subpattern.compile(reverse, fuzzy) + [(OP.END, )]) def dump(self, indent=0, reverse=False): print "%sATOMIC" % (INDENT * indent) self.subpattern.dump(indent + 1, reverse) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return (type(self) is type(other) and self.subpattern == other.subpattern) def max_width(self): return self.subpattern.max_width() def get_required_string(self, reverse): return self.subpattern.get_required_string(reverse) class Boundary(ZeroWidthBase): _opcode = OP.BOUNDARY _op_name = "BOUNDARY" class Branch(RegexBase): def __init__(self, branches): RegexBase.__init__(self) self.branches = branches def fix_groups(self, reverse, fuzzy): for b in self.branches: b.fix_groups(reverse, fuzzy) def optimise(self, info): # Flatten branches within branches. branches = Branch._flatten_branches(info, self.branches) # Move any common prefix or suffix out of the branches. prefix, branches = Branch._split_common_prefix(info, branches) suffix, branches = Branch._split_common_suffix(info, branches) # Merge branches starting with the same character. (If a character # prefix doesn't match in one branch, it won't match in any of the # others starting with that same character.) branches = Branch._merge_common_prefixes(info, branches) # Try to reduce adjacent single-character branches to sets. branches = Branch._reduce_to_set(info, branches) if len(branches) > 1: sequence = prefix + [Branch(branches)] + suffix else: sequence = prefix + branches + suffix return make_sequence(sequence) def pack_characters(self, info): self.branches = [b.pack_characters(info) for b in self.branches] return self def remove_captures(self): self.branches = [b.remove_captures() for b in self.branches] return self def is_atomic(self): return all(b.is_atomic() for b in self.branches) def can_be_affix(self): return all(b.can_be_affix() for b in self.branches) def contains_group(self): return any(b.contains_group() for b in self.branches) def get_firstset(self, reverse): fs = set() for b in self.branches: fs |= b.get_firstset(reverse) return fs or set([None]) def compile(self, reverse=False, fuzzy=False): code = [(OP.BRANCH, )] for b in self.branches: code.extend(b.compile(reverse, fuzzy)) code.append((OP.NEXT, )) code[-1] = (OP.END, ) return code def dump(self, indent=0, reverse=False): print "%sBRANCH" % (INDENT * indent) self.branches[0].dump(indent + 1, reverse) for b in self.branches[1 : ]: print "%sOR" % (INDENT * indent) b.dump(indent + 1, reverse) @staticmethod def _flatten_branches(info, branches): # Flatten the branches so that there aren't branches of branches. new_branches = [] for b in branches: b = b.optimise(info) if isinstance(b, Branch): new_branches.extend(b.branches) else: new_branches.append(b) return new_branches @staticmethod def _split_common_prefix(info, branches): # Common leading items can be moved out of the branches. # Get the items in the branches. alternatives = [] for b in branches: if isinstance(b, Sequence): alternatives.append(b.items) else: alternatives.append([b]) # What is the maximum possible length of the prefix? max_count = min(len(a) for a in alternatives) # What is the longest common prefix? prefix = alternatives[0] pos = 0 end_pos = max_count while pos < end_pos and prefix[pos].can_be_affix() and all(a[pos] == prefix[pos] for a in alternatives): pos += 1 count = pos if info.flags & UNICODE: # We need to check that we're not splitting a sequence of # characters which could form part of full case-folding. count = pos while count > 0 and not all(Branch._can_split(a, count) for a in alternatives): count -= 1 # No common prefix is possible. if count == 0: return [], branches # Rebuild the branches. new_branches = [] for a in alternatives: new_branches.append(make_sequence(a[count : ])) return prefix[ : count], new_branches @staticmethod def _split_common_suffix(info, branches): # Common trailing items can be moved out of the branches. # Get the items in the branches. alternatives = [] for b in branches: if isinstance(b, Sequence): alternatives.append(b.items) else: alternatives.append([b]) # What is the maximum possible length of the suffix? max_count = min(len(a) for a in alternatives) # What is the longest common suffix? suffix = alternatives[0] pos = -1 end_pos = -1 - max_count while pos > end_pos and suffix[pos].can_be_affix() and all(a[pos] == suffix[pos] for a in alternatives): pos -= 1 count = -1 - pos if info.flags & UNICODE: # We need to check that we're not splitting a sequence of # characters which could form part of full case-folding. while count > 0 and not all(Branch._can_split_rev(a, count) for a in alternatives): count -= 1 # No common suffix is possible. if count == 0: return [], branches # Rebuild the branches. new_branches = [] for a in alternatives: new_branches.append(make_sequence(a[ : -count])) return suffix[-count : ], new_branches @staticmethod def _can_split(items, count): # Check the characters either side of the proposed split. if not Branch._is_full_case(items, count - 1): return True if not Branch._is_full_case(items, count): return True # Check whether a 1-1 split would be OK. if Branch._is_folded(items[count - 1 : count + 1]): return False # Check whether a 1-2 split would be OK. if (Branch._is_full_case(items, count + 2) and Branch._is_folded(items[count - 1 : count + 2])): return False # Check whether a 2-1 split would be OK. if (Branch._is_full_case(items, count - 2) and Branch._is_folded(items[count - 2 : count + 1])): return False return True @staticmethod def _can_split_rev(items, count): end = len(items) # Check the characters either side of the proposed split. if not Branch._is_full_case(items, end - count): return True if not Branch._is_full_case(items, end - count - 1): return True # Check whether a 1-1 split would be OK. if Branch._is_folded(items[end - count - 1 : end - count + 1]): return False # Check whether a 1-2 split would be OK. if (Branch._is_full_case(items, end - count + 2) and Branch._is_folded(items[end - count - 1 : end - count + 2])): return False # Check whether a 2-1 split would be OK. if (Branch._is_full_case(items, end - count - 2) and Branch._is_folded(items[end - count - 2 : end - count + 1])): return False return True @staticmethod def _merge_common_prefixes(info, branches): # Branches with the same case-sensitive character prefix can be grouped # together if they are separated only by other branches with a # character prefix. prefixed = defaultdict(list) order = {} new_branches = [] for b in branches: if Branch._is_simple_character(b): # Branch starts with a simple character. prefixed[b.value].append([b]) order.setdefault(b.value, len(order)) elif (isinstance(b, Sequence) and b.items and Branch._is_simple_character(b.items[0])): # Branch starts with a simple character. prefixed[b.items[0].value].append(b.items) order.setdefault(b.items[0].value, len(order)) else: Branch._flush_char_prefix(info, prefixed, order, new_branches) new_branches.append(b) Branch._flush_char_prefix(info, prefixed, order, new_branches) return new_branches @staticmethod def _is_simple_character(c): return isinstance(c, Character) and c.positive and not c.case_flags @staticmethod def _reduce_to_set(info, branches): # Can the branches be reduced to a set? new_branches = [] items = set() case_flags = NOCASE for b in branches: if isinstance(b, (Character, Property, SetBase)): # Branch starts with a single character. if b.case_flags != case_flags: # Different case sensitivity, so flush. Branch._flush_set_members(info, items, case_flags, new_branches) case_flags = b.case_flags items.add(b.with_flags(case_flags=NOCASE)) else: Branch._flush_set_members(info, items, case_flags, new_branches) new_branches.append(b) Branch._flush_set_members(info, items, case_flags, new_branches) return new_branches @staticmethod def _flush_char_prefix(info, prefixed, order, new_branches): # Flush the prefixed branches. if not prefixed: return for value, branches in sorted(prefixed.items(), key=lambda pair: order[pair[0]]): if len(branches) == 1: new_branches.append(make_sequence(branches[0])) else: subbranches = [] optional = False for b in branches: if len(b) > 1: subbranches.append(make_sequence(b[1 : ])) elif not optional: subbranches.append(Sequence()) optional = True sequence = Sequence([Character(value), Branch(subbranches)]) new_branches.append(sequence.optimise(info)) prefixed.clear() order.clear() @staticmethod def _flush_set_members(info, items, case_flags, new_branches): # Flush the set members. if not items: return if len(items) == 1: item = list(items)[0] else: item = SetUnion(info, list(items)).optimise(info) new_branches.append(item.with_flags(case_flags=case_flags)) items.clear() @staticmethod def _is_full_case(items, i): if not 0 <= i < len(items): return False item = items[i] return (isinstance(item, Character) and item.positive and (item.case_flags & FULLIGNORECASE) == FULLIGNORECASE) @staticmethod def _is_folded(items): if len(items) < 2: return False for i in items: if (not isinstance(i, Character) or not i.positive or not i.case_flags): return False folded = u"".join(unichr(i.value) for i in items) folded = _regex.fold_case(FULL_CASE_FOLDING, folded) # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() for c in expanding_chars: if folded == _regex.fold_case(FULL_CASE_FOLDING, c): return True return False def is_empty(self): return all(b.is_empty() for b in self.branches) def __eq__(self, other): return type(self) is type(other) and self.branches == other.branches def max_width(self): return max(b.max_width() for b in self.branches) class CallGroup(RegexBase): def __init__(self, info, group, position): RegexBase.__init__(self) self.info = info self.group = group self.position = position self._key = self.__class__, self.group def fix_groups(self, reverse, fuzzy): try: self.group = int(self.group) except ValueError: try: self.group = self.info.group_index[self.group] except KeyError: raise error("unknown group at position %d" % self.position) if not 0 <= self.group <= self.info.group_count: raise error("unknown group at position %d" % self.position) if self.group > 0 and self.info.open_group_count[self.group] > 1: raise error("ambiguous group reference at position %d" % self.position) self.info.group_calls.append((self, reverse, fuzzy)) self._key = self.__class__, self.group def remove_captures(self): raise error("group reference not allowed at position %d" % self.position) def compile(self, reverse=False, fuzzy=False): return [(OP.GROUP_CALL, self.call_ref)] def dump(self, indent=0, reverse=False): print "%sGROUP_CALL %s" % (INDENT * indent, self.group) def __eq__(self, other): return type(self) is type(other) and self.group == other.group def max_width(self): return UNLIMITED class Character(RegexBase): _opcode = {(NOCASE, False): OP.CHARACTER, (IGNORECASE, False): OP.CHARACTER_IGN, (FULLCASE, False): OP.CHARACTER, (FULLIGNORECASE, False): OP.CHARACTER_IGN, (NOCASE, True): OP.CHARACTER_REV, (IGNORECASE, True): OP.CHARACTER_IGN_REV, (FULLCASE, True): OP.CHARACTER_REV, (FULLIGNORECASE, True): OP.CHARACTER_IGN_REV} def __init__(self, value, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.value = value self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) if (self.positive and (self.case_flags & FULLIGNORECASE) == FULLIGNORECASE): self.folded = _regex.fold_case(FULL_CASE_FOLDING, unichr(self.value)) else: self.folded = unichr(self.value) self._key = (self.__class__, self.value, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return Character(self.value, positive, case_flags, zerowidth) def optimise(self, info, in_set=False): return self def get_firstset(self, reverse): return set([self]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP code = PrecompiledCode([self._opcode[self.case_flags, reverse], flags, self.value]) if len(self.folded) > 1: # The character expands on full case-folding. code = Branch([code, String([ord(c) for c in self.folded], case_flags=self.case_flags)]) return code.compile(reverse, fuzzy) def dump(self, indent=0, reverse=False): display = repr(unichr(self.value)).lstrip("bu") print "%sCHARACTER %s %s%s" % (INDENT * indent, POS_TEXT[self.positive], display, CASE_TEXT[self.case_flags]) def matches(self, ch): return (ch == self.value) == self.positive def max_width(self): return len(self.folded) def get_required_string(self, reverse): if not self.positive: return 1, None self.folded_characters = tuple(ord(c) for c in self.folded) return 0, self class Conditional(RegexBase): def __init__(self, info, group, yes_item, no_item, position): RegexBase.__init__(self) self.info = info self.group = group self.yes_item = yes_item self.no_item = no_item self.position = position def fix_groups(self, reverse, fuzzy): try: self.group = int(self.group) except ValueError: try: self.group = self.info.group_index[self.group] except KeyError: raise error("unknown group at position %d" % self.position) if not 1 <= self.group <= self.info.group_count: raise error("unknown group at position %d" % self.position) self.yes_item.fix_groups(reverse, fuzzy) self.no_item.fix_groups(reverse, fuzzy) def optimise(self, info): yes_item = self.yes_item.optimise(info) no_item = self.no_item.optimise(info) return Conditional(info, self.group, yes_item, no_item, self.position) def pack_characters(self, info): self.yes_item = self.yes_item.pack_characters(info) self.no_item = self.no_item.pack_characters(info) return self def remove_captures(self): self.yes_item = self.yes_item.remove_captures() self.no_item = self.no_item.remove_captures() def is_atomic(self): return self.yes_item.is_atomic() and self.no_item.is_atomic() def can_be_affix(self): return self.yes_item.can_be_affix() and self.no_item.can_be_affix() def contains_group(self): return self.yes_item.contains_group() or self.no_item.contains_group() def get_firstset(self, reverse): return (self.yes_item.get_firstset(reverse) | self.no_item.get_firstset(reverse)) def compile(self, reverse=False, fuzzy=False): code = [(OP.GROUP_EXISTS, self.group)] code.extend(self.yes_item.compile(reverse, fuzzy)) add_code = self.no_item.compile(reverse, fuzzy) if add_code: code.append((OP.NEXT, )) code.extend(add_code) code.append((OP.END, )) return code def dump(self, indent=0, reverse=False): print "%sGROUP_EXISTS %s" % (INDENT * indent, self.group) self.yes_item.dump(indent + 1, reverse) if self.no_item: print "%sOR" % (INDENT * indent) self.no_item.dump(indent + 1, reverse) def is_empty(self): return self.yes_item.is_empty() and self.no_item.is_empty() def __eq__(self, other): return type(self) is type(other) and (self.group, self.yes_item, self.no_item) == (other.group, other.yes_item, other.no_item) def max_width(self): return max(self.yes_item.max_width(), self.no_item.max_width()) class DefaultBoundary(ZeroWidthBase): _opcode = OP.DEFAULT_BOUNDARY _op_name = "DEFAULT_BOUNDARY" class DefaultEndOfWord(ZeroWidthBase): _opcode = OP.DEFAULT_END_OF_WORD _op_name = "DEFAULT_END_OF_WORD" class DefaultStartOfWord(ZeroWidthBase): _opcode = OP.DEFAULT_START_OF_WORD _op_name = "DEFAULT_START_OF_WORD" class EndOfLine(ZeroWidthBase): _opcode = OP.END_OF_LINE _op_name = "END_OF_LINE" class EndOfLineU(EndOfLine): _opcode = OP.END_OF_LINE_U _op_name = "END_OF_LINE_U" class EndOfString(ZeroWidthBase): _opcode = OP.END_OF_STRING _op_name = "END_OF_STRING" class EndOfStringLine(ZeroWidthBase): _opcode = OP.END_OF_STRING_LINE _op_name = "END_OF_STRING_LINE" class EndOfStringLineU(EndOfStringLine): _opcode = OP.END_OF_STRING_LINE_U _op_name = "END_OF_STRING_LINE_U" class EndOfWord(ZeroWidthBase): _opcode = OP.END_OF_WORD _op_name = "END_OF_WORD" class Fuzzy(RegexBase): def __init__(self, subpattern, constraints=None): RegexBase.__init__(self) if constraints is None: constraints = {} self.subpattern = subpattern self.constraints = constraints # If an error type is mentioned in the cost equation, then its maximum # defaults to unlimited. if "cost" in constraints: for e in "dis": if e in constraints["cost"]: constraints.setdefault(e, (0, None)) # If any error type is mentioned, then all the error maxima default to # 0, otherwise they default to unlimited. if set(constraints) & set("dis"): for e in "dis": constraints.setdefault(e, (0, 0)) else: for e in "dis": constraints.setdefault(e, (0, None)) # The maximum of the generic error type defaults to unlimited. constraints.setdefault("e", (0, None)) # The cost equation defaults to equal costs. Also, the cost of any # error type not mentioned in the cost equation defaults to 0. if "cost" in constraints: for e in "dis": constraints["cost"].setdefault(e, 0) else: constraints["cost"] = {"d": 1, "i": 1, "s": 1, "max": constraints["e"][1]} def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(reverse, True) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): self.subpattern = self.subpattern.remove_captures() return self def is_atomic(self): return self.subpattern.is_atomic() def contains_group(self): return self.subpattern.contains_group() def compile(self, reverse=False, fuzzy=False): # The individual limits. arguments = [] for e in "dise": v = self.constraints[e] arguments.append(v[0]) arguments.append(UNLIMITED if v[1] is None else v[1]) # The coeffs of the cost equation. for e in "dis": arguments.append(self.constraints["cost"][e]) # The maximum of the cost equation. v = self.constraints["cost"]["max"] arguments.append(UNLIMITED if v is None else v) flags = 0 if reverse: flags |= REVERSE_OP return ([(OP.FUZZY, flags) + tuple(arguments)] + self.subpattern.compile(reverse, True) + [(OP.END,)]) def dump(self, indent=0, reverse=False): constraints = self._constraints_to_string() if constraints: constraints = " " + constraints print "%sFUZZY%s" % (INDENT * indent, constraints) self.subpattern.dump(indent + 1, reverse) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return (type(self) is type(other) and self.subpattern == other.subpattern) def max_width(self): return UNLIMITED def _constraints_to_string(self): constraints = [] for name in "ids": min, max = self.constraints[name] if max == 0: continue con = "" if min > 0: con = "%s<=" % min con += name if max is not None: con += "<=%s" % max constraints.append(con) cost = [] for name in "ids": coeff = self.constraints["cost"][name] if coeff > 0: cost.append("%s%s" % (coeff, name)) limit = self.constraints["cost"]["max"] if limit is not None and limit > 0: cost = "%s<=%s" % ("+".join(cost), limit) constraints.append(cost) return ",".join(constraints) class Grapheme(RegexBase): def compile(self, reverse=False, fuzzy=False): # Match at least 1 character until a grapheme boundary is reached. Note # that this is the same whether matching forwards or backwards. character_matcher = LazyRepeat(AnyAll(), 1, None).compile(reverse, fuzzy) boundary_matcher = [(OP.GRAPHEME_BOUNDARY, 1)] return character_matcher + boundary_matcher def dump(self, indent=0, reverse=False): print "%sGRAPHEME" % (INDENT * indent) def max_width(self): return UNLIMITED class GreedyRepeat(RegexBase): _opcode = OP.GREEDY_REPEAT _op_name = "GREEDY_REPEAT" def __init__(self, subpattern, min_count, max_count): RegexBase.__init__(self) self.subpattern = subpattern self.min_count = min_count self.max_count = max_count def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(reverse, fuzzy) def optimise(self, info): subpattern = self.subpattern.optimise(info) return type(self)(subpattern, self.min_count, self.max_count) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): self.subpattern = self.subpattern.remove_captures() return self def is_atomic(self): return self.min_count == self.max_count and self.subpattern.is_atomic() def contains_group(self): return self.subpattern.contains_group() def get_firstset(self, reverse): fs = self.subpattern.get_firstset(reverse) if self.min_count == 0: fs.add(None) return fs def compile(self, reverse=False, fuzzy=False): repeat = [self._opcode, self.min_count] if self.max_count is None: repeat.append(UNLIMITED) else: repeat.append(self.max_count) subpattern = self.subpattern.compile(reverse, fuzzy) if not subpattern: return [] return ([tuple(repeat)] + subpattern + [(OP.END, )]) def dump(self, indent=0, reverse=False): if self.max_count is None: limit = "INF" else: limit = self.max_count print "%s%s %s %s" % (INDENT * indent, self._op_name, self.min_count, limit) self.subpattern.dump(indent + 1, reverse) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return type(self) is type(other) and (self.subpattern, self.min_count, self.max_count) == (other.subpattern, other.min_count, other.max_count) def max_width(self): if self.max_count is None: return UNLIMITED return self.subpattern.max_width() * self.max_count def get_required_string(self, reverse): max_count = UNLIMITED if self.max_count is None else self.max_count if self.min_count == 0: w = self.subpattern.max_width() * max_count return min(w, UNLIMITED), None ofs, req = self.subpattern.get_required_string(reverse) if req: return ofs, req w = self.subpattern.max_width() * max_count return min(w, UNLIMITED), None class Group(RegexBase): def __init__(self, info, group, subpattern): RegexBase.__init__(self) self.info = info self.group = group self.subpattern = subpattern self.call_ref = None def fix_groups(self, reverse, fuzzy): self.info.defined_groups[self.group] = (self, reverse, fuzzy) self.subpattern.fix_groups(reverse, fuzzy) def optimise(self, info): subpattern = self.subpattern.optimise(info) return Group(self.info, self.group, subpattern) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): return self.subpattern.remove_captures() def is_atomic(self): return self.subpattern.is_atomic() def can_be_affix(self): return False def contains_group(self): return True def get_firstset(self, reverse): return self.subpattern.get_firstset(reverse) def has_simple_start(self): return self.subpattern.has_simple_start() def compile(self, reverse=False, fuzzy=False): code = [] key = self.group, reverse, fuzzy ref = self.info.call_refs.get(key) if ref is not None: code += [(OP.CALL_REF, ref)] public_group = private_group = self.group if private_group < 0: public_group = self.info.private_groups[private_group] private_group = self.info.group_count - private_group code += ([(OP.GROUP, private_group, public_group)] + self.subpattern.compile(reverse, fuzzy) + [(OP.END, )]) if ref is not None: code += [(OP.END, )] return code def dump(self, indent=0, reverse=False): group = self.group if group < 0: group = private_groups[group] print "%sGROUP %s" % (INDENT * indent, group) self.subpattern.dump(indent + 1, reverse) def __eq__(self, other): return (type(self) is type(other) and (self.group, self.subpattern) == (other.group, other.subpattern)) def max_width(self): return self.subpattern.max_width() def get_required_string(self, reverse): return self.subpattern.get_required_string(reverse) class LazyRepeat(GreedyRepeat): _opcode = OP.LAZY_REPEAT _op_name = "LAZY_REPEAT" class LookAround(RegexBase): _dir_text = {False: "AHEAD", True: "BEHIND"} def __new__(cls, behind, positive, subpattern): if positive and subpattern.is_empty(): return subpattern return RegexBase.__new__(cls) def __init__(self, behind, positive, subpattern): RegexBase.__init__(self) self.behind = bool(behind) self.positive = bool(positive) self.subpattern = subpattern def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(self.behind, fuzzy) def optimise(self, info): subpattern = self.subpattern.optimise(info) return LookAround(self.behind, self.positive, subpattern) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): return self.subpattern.remove_captures() def is_atomic(self): return self.subpattern.is_atomic() def can_be_affix(self): return self.subpattern.can_be_affix() def contains_group(self): return self.subpattern.contains_group() def compile(self, reverse=False, fuzzy=False): return ([(OP.LOOKAROUND, int(self.positive), int(not self.behind))] + self.subpattern.compile(self.behind) + [(OP.END, )]) def dump(self, indent=0, reverse=False): print "%sLOOK%s %s" % (INDENT * indent, self._dir_text[self.behind], POS_TEXT[self.positive]) self.subpattern.dump(indent + 1, self.behind) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return type(self) is type(other) and (self.behind, self.positive, self.subpattern) == (other.behind, other.positive, other.subpattern) def max_width(self): return 0 class PrecompiledCode(RegexBase): def __init__(self, code): self.code = code def compile(self, reverse=False, fuzzy=False): return [tuple(self.code)] class Property(RegexBase): _opcode = {(NOCASE, False): OP.PROPERTY, (IGNORECASE, False): OP.PROPERTY_IGN, (FULLCASE, False): OP.PROPERTY, (FULLIGNORECASE, False): OP.PROPERTY_IGN, (NOCASE, True): OP.PROPERTY_REV, (IGNORECASE, True): OP.PROPERTY_IGN_REV, (FULLCASE, True): OP.PROPERTY_REV, (FULLIGNORECASE, True): OP.PROPERTY_IGN_REV} def __init__(self, value, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.value = value self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) self._key = (self.__class__, self.value, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return Property(self.value, positive, case_flags, zerowidth) def optimise(self, info, in_set=False): return self def get_firstset(self, reverse): return set([self]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP return [(self._opcode[self.case_flags, reverse], flags, self.value)] def dump(self, indent=0, reverse=False): prop = PROPERTY_NAMES[self.value >> 16] name, value = prop[0], prop[1][self.value & 0xFFFF] print "%sPROPERTY %s %s:%s%s" % (INDENT * indent, POS_TEXT[self.positive], name, value, CASE_TEXT[self.case_flags]) def matches(self, ch): return _regex.has_property_value(self.value, ch) == self.positive def max_width(self): return 1 class Range(RegexBase): _opcode = {(NOCASE, False): OP.RANGE, (IGNORECASE, False): OP.RANGE_IGN, (FULLCASE, False): OP.RANGE, (FULLIGNORECASE, False): OP.RANGE_IGN, (NOCASE, True): OP.RANGE_REV, (IGNORECASE, True): OP.RANGE_IGN_REV, (FULLCASE, True): OP.RANGE_REV, (FULLIGNORECASE, True): OP.RANGE_IGN_REV} _op_name = "RANGE" def __init__(self, lower, upper, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.lower = lower self.upper = upper self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) self._key = (self.__class__, self.lower, self.upper, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return Range(self.lower, self.upper, positive, case_flags, zerowidth) def optimise(self, info, in_set=False): # Is the range case-sensitive? if not self.positive or not (self.case_flags & IGNORECASE) or in_set: return self # Is full case-folding possible? if (not (info.flags & UNICODE) or (self.case_flags & FULLIGNORECASE) != FULLIGNORECASE): return self # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() # Get the folded characters in the range. items = [] for ch in expanding_chars: if self.lower <= ord(ch) <= self.upper: folded = _regex.fold_case(FULL_CASE_FOLDING, ch) items.append(String([ord(c) for c in folded], case_flags=self.case_flags)) if not items: # We can fall back to simple case-folding. return self if len(items) < self.upper - self.lower + 1: # Not all the characters are covered by the full case-folding. items.insert(0, self) return Branch(items) def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP return [(self._opcode[self.case_flags, reverse], flags, self.lower, self.upper)] def dump(self, indent=0, reverse=False): display_lower = repr(unichr(self.lower)).lstrip("bu") display_upper = repr(unichr(self.upper)).lstrip("bu") print "%sRANGE %s %s %s%s" % (INDENT * indent, POS_TEXT[self.positive], display_lower, display_upper, CASE_TEXT[self.case_flags]) def matches(self, ch): return (self.lower <= ch <= self.upper) == self.positive def max_width(self): return 1 class RefGroup(RegexBase): _opcode = {(NOCASE, False): OP.REF_GROUP, (IGNORECASE, False): OP.REF_GROUP_IGN, (FULLCASE, False): OP.REF_GROUP, (FULLIGNORECASE, False): OP.REF_GROUP_FLD, (NOCASE, True): OP.REF_GROUP_REV, (IGNORECASE, True): OP.REF_GROUP_IGN_REV, (FULLCASE, True): OP.REF_GROUP_REV, (FULLIGNORECASE, True): OP.REF_GROUP_FLD_REV} def __init__(self, info, group, position, case_flags=NOCASE): RegexBase.__init__(self) self.info = info self.group = group self.position = position self.case_flags = case_flags self._key = self.__class__, self.group, self.case_flags def fix_groups(self, reverse, fuzzy): try: self.group = int(self.group) except ValueError: try: self.group = self.info.group_index[self.group] except KeyError: raise error("unknown group at position %d" % self.position) if not 1 <= self.group <= self.info.group_count: raise error("unknown group at position %d" % self.position) self._key = self.__class__, self.group, self.case_flags def remove_captures(self): raise error("group reference not allowed at position %d" % self.position) def compile(self, reverse=False, fuzzy=False): flags = 0 if fuzzy: flags |= FUZZY_OP return [(self._opcode[self.case_flags, reverse], flags, self.group)] def dump(self, indent=0, reverse=False): print "%sREF_GROUP %s%s" % (INDENT * indent, self.group, CASE_TEXT[self.case_flags]) def max_width(self): return UNLIMITED class SearchAnchor(ZeroWidthBase): _opcode = OP.SEARCH_ANCHOR _op_name = "SEARCH_ANCHOR" class Sequence(RegexBase): def __init__(self, items=None): RegexBase.__init__(self) if items is None: items = [] self.items = items def fix_groups(self, reverse, fuzzy): for s in self.items: s.fix_groups(reverse, fuzzy) def optimise(self, info): # Flatten the sequences. items = [] for s in self.items: s = s.optimise(info) if isinstance(s, Sequence): items.extend(s.items) else: items.append(s) return make_sequence(items) def pack_characters(self, info): "Packs sequences of characters into strings." items = [] characters = [] case_flags = NOCASE for s in self.items: if type(s) is Character and s.positive: if s.case_flags != case_flags: # Different case sensitivity, so flush, unless neither the # previous nor the new character are cased. if case_flags or is_cased(info, s.value): Sequence._flush_characters(info, characters, case_flags, items) case_flags = s.case_flags characters.append(s.value) elif type(s) is String: if s.case_flags != case_flags: # Different case sensitivity, so flush, unless the neither # the previous nor the new string are cased. if not s.case_flags or any(is_cased(info, c) for c in characters): Sequence._flush_characters(info, characters, case_flags, items) case_flags = s.case_flags characters.extend(s.characters) else: Sequence._flush_characters(info, characters, case_flags, items) items.append(s.pack_characters(info)) Sequence._flush_characters(info, characters, case_flags, items) return make_sequence(items) def remove_captures(self): self.items = [s.remove_captures() for s in self.items] return self def is_atomic(self): return all(s.is_atomic() for s in self.items) def can_be_affix(self): return False def contains_group(self): return any(s.contains_group() for s in self.items) def get_firstset(self, reverse): fs = set() items = self.items if reverse: items.reverse() for s in items: fs |= s.get_firstset(reverse) if None not in fs: return fs fs.discard(None) return fs | set([None]) def has_simple_start(self): return self.items and self.items[0].has_simple_start() def compile(self, reverse=False, fuzzy=False): seq = self.items if reverse: seq = seq[::-1] code = [] for s in seq: code.extend(s.compile(reverse, fuzzy)) return code def dump(self, indent=0, reverse=False): for s in self.items: s.dump(indent, reverse) @staticmethod def _flush_characters(info, characters, case_flags, items): if not characters: return # Disregard case_flags if all of the characters are case-less. if case_flags & IGNORECASE: if not any(is_cased(info, c) for c in characters): case_flags = NOCASE if len(characters) == 1: items.append(Character(characters[0], case_flags=case_flags)) else: items.append(String(characters, case_flags=case_flags)) characters[:] = [] def is_empty(self): return all(i.is_empty() for i in self.items) def __eq__(self, other): return type(self) is type(other) and self.items == other.items def max_width(self): return sum(s.max_width() for s in self.items) def get_required_string(self, reverse): seq = self.items if reverse: seq = seq[::-1] offset = 0 for s in seq: ofs, req = s.get_required_string(reverse) offset += ofs if req: return offset, req return offset, None class SetBase(RegexBase): def __init__(self, info, items, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.info = info self.items = tuple(items) self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) self.char_width = 1 self._key = (self.__class__, self.items, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return type(self)(self.info, self.items, positive, case_flags, zerowidth).optimise(self.info) def get_firstset(self, reverse): return set([self]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP code = [(self._opcode[self.case_flags, reverse], flags)] for m in self.items: code.extend(m.compile()) code.append((OP.END, )) return code def dump(self, indent=0, reverse=False): print "%s%s %s%s" % (INDENT * indent, self._op_name, POS_TEXT[self.positive], CASE_TEXT[self.case_flags]) for i in self.items: i.dump(indent + 1) def _handle_case_folding(self, info, in_set): # Is the set case-sensitive? if not self.positive or not (self.case_flags & IGNORECASE) or in_set: return self # Is full case-folding possible? if (not (self.info.flags & UNICODE) or (self.case_flags & FULLIGNORECASE) != FULLIGNORECASE): return self # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() # Get the folded characters in the set. items = [] seen = set() for ch in expanding_chars: if self.matches(ord(ch)): folded = _regex.fold_case(FULL_CASE_FOLDING, ch) if folded not in seen: items.append(String([ord(c) for c in folded], case_flags=self.case_flags)) seen.add(folded) if not items: # We can fall back to simple case-folding. return self return Branch([self] + items) def max_width(self): # Is the set case-sensitive? if not self.positive or not (self.case_flags & IGNORECASE): return 1 # Is full case-folding possible? if (not (self.info.flags & UNICODE) or (self.case_flags & FULLIGNORECASE) != FULLIGNORECASE): return 1 # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() # Get the folded characters in the set. seen = set() for ch in expanding_chars: if self.matches(ord(ch)): folded = _regex.fold_case(FULL_CASE_FOLDING, ch) seen.add(folded) if not seen: return 1 return max(len(folded) for folded in seen) class SetDiff(SetBase): _opcode = {(NOCASE, False): OP.SET_DIFF, (IGNORECASE, False): OP.SET_DIFF_IGN, (FULLCASE, False): OP.SET_DIFF, (FULLIGNORECASE, False): OP.SET_DIFF_IGN, (NOCASE, True): OP.SET_DIFF_REV, (IGNORECASE, True): OP.SET_DIFF_IGN_REV, (FULLCASE, True): OP.SET_DIFF_REV, (FULLIGNORECASE, True): OP.SET_DIFF_IGN_REV} _op_name = "SET_DIFF" def optimise(self, info, in_set=False): items = self.items if len(items) > 2: items = [items[0], SetUnion(info, items[1 : ])] if len(items) == 1: return items[0].with_flags(case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(m.optimise(info, in_set=True) for m in items) return self._handle_case_folding(info, in_set) def matches(self, ch): m = self.items[0].matches(ch) and not self.items[1].matches(ch) return m == self.positive class SetInter(SetBase): _opcode = {(NOCASE, False): OP.SET_INTER, (IGNORECASE, False): OP.SET_INTER_IGN, (FULLCASE, False): OP.SET_INTER, (FULLIGNORECASE, False): OP.SET_INTER_IGN, (NOCASE, True): OP.SET_INTER_REV, (IGNORECASE, True): OP.SET_INTER_IGN_REV, (FULLCASE, True): OP.SET_INTER_REV, (FULLIGNORECASE, True): OP.SET_INTER_IGN_REV} _op_name = "SET_INTER" def optimise(self, info, in_set=False): items = [] for m in self.items: m = m.optimise(info, in_set=True) if isinstance(m, SetInter) and m.positive: # Intersection in intersection. items.extend(m.items) else: items.append(m) if len(items) == 1: return items[0].with_flags(case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(items) return self._handle_case_folding(info, in_set) def matches(self, ch): m = all(i.matches(ch) for i in self.items) return m == self.positive class SetSymDiff(SetBase): _opcode = {(NOCASE, False): OP.SET_SYM_DIFF, (IGNORECASE, False): OP.SET_SYM_DIFF_IGN, (FULLCASE, False): OP.SET_SYM_DIFF, (FULLIGNORECASE, False): OP.SET_SYM_DIFF_IGN, (NOCASE, True): OP.SET_SYM_DIFF_REV, (IGNORECASE, True): OP.SET_SYM_DIFF_IGN_REV, (FULLCASE, True): OP.SET_SYM_DIFF_REV, (FULLIGNORECASE, True): OP.SET_SYM_DIFF_IGN_REV} _op_name = "SET_SYM_DIFF" def optimise(self, info, in_set=False): items = [] for m in self.items: m = m.optimise(info, in_set=True) if isinstance(m, SetSymDiff) and m.positive: # Symmetric difference in symmetric difference. items.extend(m.items) else: items.append(m) if len(items) == 1: return items[0].with_flags(case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(items) return self._handle_case_folding(info, in_set) def matches(self, ch): m = False for i in self.items: m = m != i.matches(ch) return m == self.positive class SetUnion(SetBase): _opcode = {(NOCASE, False): OP.SET_UNION, (IGNORECASE, False): OP.SET_UNION_IGN, (FULLCASE, False): OP.SET_UNION, (FULLIGNORECASE, False): OP.SET_UNION_IGN, (NOCASE, True): OP.SET_UNION_REV, (IGNORECASE, True): OP.SET_UNION_IGN_REV, (FULLCASE, True): OP.SET_UNION_REV, (FULLIGNORECASE, True): OP.SET_UNION_IGN_REV} _op_name = "SET_UNION" def optimise(self, info, in_set=False): items = [] for m in self.items: m = m.optimise(info, in_set=True) if isinstance(m, SetUnion) and m.positive: # Union in union. items.extend(m.items) else: items.append(m) if len(items) == 1: i = items[0] return i.with_flags(positive=i.positive == self.positive, case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(items) return self._handle_case_folding(info, in_set) def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP characters, others = defaultdict(list), [] for m in self.items: if isinstance(m, Character): characters[m.positive].append(m.value) else: others.append(m) code = [(self._opcode[self.case_flags, reverse], flags)] for positive, values in characters.items(): flags = 0 if positive: flags |= POSITIVE_OP if len(values) == 1: code.append((OP.CHARACTER, flags, values[0])) else: code.append((OP.STRING, flags, len(values)) + tuple(values)) for m in others: code.extend(m.compile()) code.append((OP.END, )) return code def matches(self, ch): m = any(i.matches(ch) for i in self.items) return m == self.positive class StartOfLine(ZeroWidthBase): _opcode = OP.START_OF_LINE _op_name = "START_OF_LINE" class StartOfLineU(StartOfLine): _opcode = OP.START_OF_LINE_U _op_name = "START_OF_LINE_U" class StartOfString(ZeroWidthBase): _opcode = OP.START_OF_STRING _op_name = "START_OF_STRING" class StartOfWord(ZeroWidthBase): _opcode = OP.START_OF_WORD _op_name = "START_OF_WORD" class String(RegexBase): _opcode = {(NOCASE, False): OP.STRING, (IGNORECASE, False): OP.STRING_IGN, (FULLCASE, False): OP.STRING, (FULLIGNORECASE, False): OP.STRING_FLD, (NOCASE, True): OP.STRING_REV, (IGNORECASE, True): OP.STRING_IGN_REV, (FULLCASE, True): OP.STRING_REV, (FULLIGNORECASE, True): OP.STRING_FLD_REV} def __init__(self, characters, case_flags=NOCASE): self.characters = tuple(characters) self.case_flags = case_flags if (self.case_flags & FULLIGNORECASE) == FULLIGNORECASE: folded_characters = [] for char in self.characters: folded = _regex.fold_case(FULL_CASE_FOLDING, unichr(char)) folded_characters.extend(ord(c) for c in folded) else: folded_characters = self.characters self.folded_characters = tuple(folded_characters) self.required = False self._key = self.__class__, self.characters, self.case_flags def get_firstset(self, reverse): if reverse: pos = -1 else: pos = 0 return set([Character(self.characters[pos], case_flags=self.case_flags)]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if fuzzy: flags |= FUZZY_OP if self.required: flags |= REQUIRED_OP return [(self._opcode[self.case_flags, reverse], flags, len(self.folded_characters)) + self.folded_characters] def dump(self, indent=0, reverse=False): display = repr("".join(unichr(c) for c in self.characters)).lstrip("bu") print "%sSTRING %s%s" % (INDENT * indent, display, CASE_TEXT[self.case_flags]) def max_width(self): return len(self.folded_characters) def get_required_string(self, reverse): return 0, self class StringSet(RegexBase): _opcode = {(NOCASE, False): OP.STRING_SET, (IGNORECASE, False): OP.STRING_SET_IGN, (FULLCASE, False): OP.STRING_SET, (FULLIGNORECASE, False): OP.STRING_SET_FLD, (NOCASE, True): OP.STRING_SET_REV, (IGNORECASE, True): OP.STRING_SET_IGN_REV, (FULLCASE, True): OP.STRING_SET_REV, (FULLIGNORECASE, True): OP.STRING_SET_FLD_REV} def __init__(self, info, name, case_flags=NOCASE): self.info = info self.name = name self.case_flags = case_flags self._key = self.__class__, self.name, self.case_flags self.set_key = (name, self.case_flags) if self.set_key not in info.named_lists_used: info.named_lists_used[self.set_key] = len(info.named_lists_used) def compile(self, reverse=False, fuzzy=False): index = self.info.named_lists_used[self.set_key] items = self.info.kwargs[self.name] case_flags = self.case_flags if not items: return [] encoding = self.info.flags & _ALL_ENCODINGS fold_flags = encoding | case_flags if fuzzy: choices = [self._folded(fold_flags, i) for i in items] # Sort from longest to shortest. choices.sort(key=lambda s: (-len(s), s)) branches = [] for string in choices: branches.append(Sequence([Character(c, case_flags=case_flags) for c in string])) if len(branches) > 1: branch = Branch(branches) else: branch = branches[0] branch = branch.optimise(self.info).pack_characters(self.info) return branch.compile(reverse, fuzzy) else: min_len = min(len(i) for i in items) max_len = max(len(self._folded(fold_flags, i)) for i in items) return [(self._opcode[case_flags, reverse], index, min_len, max_len)] def dump(self, indent=0, reverse=False): print "%sSTRING_SET %s%s" % (INDENT * indent, self.name, CASE_TEXT[self.case_flags]) def _folded(self, fold_flags, item): if isinstance(item, unicode): return [ord(c) for c in _regex.fold_case(fold_flags, item)] else: return [ord(c) for c in item] def _flatten(self, s): # Flattens the branches. if isinstance(s, Branch): for b in s.branches: self._flatten(b) elif isinstance(s, Sequence) and s.items: seq = s.items while isinstance(seq[-1], Sequence): seq[-1 : ] = seq[-1].items n = 0 while n < len(seq) and isinstance(seq[n], Character): n += 1 if n > 1: seq[ : n] = [String([c.value for c in seq[ : n]], case_flags=self.case_flags)] self._flatten(seq[-1]) def max_width(self): if not self.info.kwargs[self.name]: return 0 if self.case_flags & IGNORECASE: fold_flags = (self.info.flags & _ALL_ENCODINGS) | self.case_flags return max(len(_regex.fold_case(fold_flags, i)) for i in self.info.kwargs[self.name]) else: return max(len(i) for i in self.info.kwargs[self.name]) class Source(object): "Scanner for the regular expression source string." def __init__(self, string): if isinstance(string, unicode): self.string = string self.char_type = unichr else: self.string = string self.char_type = chr self.pos = 0 self.ignore_space = False self.sep = string[ : 0] def get(self): string = self.string pos = self.pos try: if self.ignore_space: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) else: break ch = string[pos] self.pos = pos + 1 return ch except IndexError: # We've reached the end of the string. self.pos = pos return string[ : 0] except ValueError: # The comment extended to the end of the string. self.pos = len(string) return string[ : 0] def get_many(self, count=1): string = self.string pos = self.pos try: if self.ignore_space: substring = [] while len(substring) < count: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) else: break substring.append(string[pos]) pos += 1 substring = "".join(substring) else: substring = string[pos : pos + count] pos += len(substring) self.pos = pos return substring except IndexError: # We've reached the end of the string. self.pos = len(string) return "".join(substring) except ValueError: # The comment extended to the end of the string. self.pos = len(string) return "".join(substring) def get_while(self, test_set, include=True): string = self.string pos = self.pos if self.ignore_space: try: substring = [] while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) elif (string[pos] in test_set) == include: substring.append(string[pos]) pos += 1 else: break self.pos = pos except IndexError: # We've reached the end of the string. self.pos = len(string) except ValueError: # The comment extended to the end of the string. self.pos = len(string) return "".join(substring) else: try: while (string[pos] in test_set) == include: pos += 1 substring = string[self.pos : pos] self.pos = pos return substring except IndexError: # We've reached the end of the string. substring = string[self.pos : pos] self.pos = pos return substring def skip_while(self, test_set, include=True): string = self.string pos = self.pos try: if self.ignore_space: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) elif (string[pos] in test_set) == include: pos += 1 else: break else: while (string[pos] in test_set) == include: pos += 1 self.pos = pos except IndexError: # We've reached the end of the string. self.pos = len(string) except ValueError: # The comment extended to the end of the string. self.pos = len(string) def match(self, substring): string = self.string pos = self.pos if self.ignore_space: try: for c in substring: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) else: break if string[pos] != c: return False pos += 1 self.pos = pos return True except IndexError: # We've reached the end of the string. return False except ValueError: # The comment extended to the end of the string. return False else: if not string.startswith(substring, pos): return False self.pos = pos + len(substring) return True def expect(self, substring): if not self.match(substring): raise error("missing %s at position %d" % (substring, self.pos)) def at_end(self): string = self.string pos = self.pos try: if self.ignore_space: while True: if string[pos].isspace(): pos += 1 elif string[pos] == "#": pos = string.index("\n", pos) else: break return pos >= len(string) except IndexError: # We've reached the end of the string. return True except ValueError: # The comment extended to the end of the string. return True class Info(object): "Info about the regular expression." def __init__(self, flags=0, char_type=None, kwargs={}): flags |= DEFAULT_FLAGS[(flags & _ALL_VERSIONS) or DEFAULT_VERSION] self.flags = flags self.global_flags = flags self.kwargs = kwargs self.group_count = 0 self.group_index = {} self.group_name = {} self.char_type = char_type self.named_lists_used = {} self.open_groups = [] self.open_group_count = {} self.defined_groups = {} self.group_calls = [] self.private_groups = {} def open_group(self, name=None): group = self.group_index.get(name) if group is None: while True: self.group_count += 1 if name is None or self.group_count not in self.group_name: break group = self.group_count if name: self.group_index[name] = group self.group_name[group] = name if group in self.open_groups: # We have a nested named group. We'll assign it a private group # number, initially negative until we can assign a proper # (positive) number. group_alias = -(len(self.private_groups) + 1) self.private_groups[group_alias] = group group = group_alias self.open_groups.append(group) self.open_group_count[group] = self.open_group_count.get(group, 0) + 1 return group def close_group(self): self.open_groups.pop() def is_open_group(self, name): # In version 1, a group reference can refer to an open group. We'll # just pretend the group isn't open. version = (self.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version == VERSION1: return False if name.isdigit(): group = int(name) else: group = self.group_index.get(name) return group in self.open_groups def _check_group_features(info, parsed): """Checks whether the reverse and fuzzy features of the group calls match the groups which they call.""" call_refs = {} additional_groups = [] for call, reverse, fuzzy in info.group_calls: # Look up the reference of this group call. key = (call.group, reverse, fuzzy) ref = call_refs.get(key) if ref is None: # This group doesn't have a reference yet, so look up its features. if call.group == 0: # Calling the pattern as a whole. rev = bool(info.flags & REVERSE) fuz = isinstance(parsed, Fuzzy) if (rev, fuz) != (reverse, fuzzy): # The pattern as a whole doesn't have the features we want, # so we'll need to make a copy of it with the desired # features. additional_groups.append((parsed, reverse, fuzzy)) else: # Calling a capture group. def_info = info.defined_groups[call.group] group = def_info[0] if def_info[1 : ] != (reverse, fuzzy): # The group doesn't have the features we want, so we'll # need to make a copy of it with the desired features. additional_groups.append((group, reverse, fuzzy)) ref = len(call_refs) call_refs[key] = ref call.call_ref = ref info.call_refs = call_refs info.additional_groups = additional_groups def _get_required_string(parsed, flags): "Gets the required string and related info of a parsed pattern." req_offset, required = parsed.get_required_string(bool(flags & REVERSE)) if required: required.required = True if req_offset >= UNLIMITED: req_offset = -1 req_flags = required.case_flags if not (flags & UNICODE): req_flags &= ~UNICODE req_chars = required.folded_characters else: req_offset = 0 req_chars = () req_flags = 0 return req_offset, req_chars, req_flags class Scanner: def __init__(self, lexicon, flags=0): self.lexicon = lexicon # Combine phrases into a compound pattern. patterns = [] for phrase, action in lexicon: # Parse the regular expression. source = Source(phrase) info = Info(flags, source.char_type) source.ignore_space = bool(info.flags & VERBOSE) parsed = _parse_pattern(source, info) if not source.at_end(): raise error("trailing characters at position %d" % source.pos) # We want to forbid capture groups within each phrase. patterns.append(parsed.remove_captures()) # Combine all the subpatterns into one pattern. info = Info(flags) patterns = [Group(info, g + 1, p) for g, p in enumerate(patterns)] parsed = Branch(patterns) # Optimise the compound pattern. parsed = parsed.optimise(info) parsed = parsed.pack_characters(info) # Get the required string. req_offset, req_chars, req_flags = _get_required_string(parsed, info.flags) # Check the features of the groups. _check_group_features(info, parsed) # Complain if there are any group calls. They are not supported by the # Scanner class. if info.call_refs: raise error("recursive regex not supported by Scanner") reverse = bool(info.flags & REVERSE) # Compile the compound pattern. The result is a list of tuples. code = parsed.compile(reverse) + [(OP.SUCCESS, )] # Flatten the code into a list of ints. code = _flatten_code(code) if not parsed.has_simple_start(): # Get the first set, if possible. try: fs_code = _compile_firstset(info, parsed.get_firstset(reverse)) fs_code = _flatten_code(fs_code) code = fs_code + code except _FirstSetError: pass # Check the global flags for conflicts. version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version not in (0, VERSION0, VERSION1): raise ValueError("VERSION0 and VERSION1 flags are mutually incompatible") # Create the PatternObject. # # Local flags like IGNORECASE affect the code generation, but aren't # needed by the PatternObject itself. Conversely, global flags like # LOCALE _don't_ affect the code generation but _are_ needed by the # PatternObject. self.scanner = _regex.compile(None, (flags & GLOBAL_FLAGS) | version, code, {}, {}, {}, [], req_offset, req_chars, req_flags, len(patterns)) def scan(self, string): result = [] append = result.append match = self.scanner.scanner(string).match i = 0 while True: m = match() if not m: break j = m.end() if i == j: break action = self.lexicon[m.lastindex - 1][1] if hasattr(action, '__call__'): self.match = m action = action(self, m.group()) if action is not None: append(action) i = j return result, string[i : ] # Get the known properties dict. PROPERTIES = _regex.get_properties() # Build the inverse of the properties dict. PROPERTY_NAMES = {} for prop_name, (prop_id, values) in PROPERTIES.items(): name, prop_values = PROPERTY_NAMES.get(prop_id, ("", {})) name = max(name, prop_name, key=len) PROPERTY_NAMES[prop_id] = name, prop_values for val_name, val_id in values.items(): prop_values[val_id] = max(prop_values.get(val_id, ""), val_name, key=len) # Character escape sequences. CHARACTER_ESCAPES = { "a": "\a", "b": "\b", "f": "\f", "n": "\n", "r": "\r", "t": "\t", "v": "\v", } # Predefined character set escape sequences. CHARSET_ESCAPES = { "d": lookup_property(None, "DIGIT", True), "D": lookup_property(None, "DIGIT", False), "s": lookup_property(None, "SPACE", True), "S": lookup_property(None, "SPACE", False), "w": lookup_property(None, "WORD", True), "W": lookup_property(None, "WORD", False), } # Positional escape sequences. POSITION_ESCAPES = { "A": StartOfString(), "b": Boundary(), "B": Boundary(False), "m": StartOfWord(), "M": EndOfWord(), "Z": EndOfString(), } # Positional escape sequences when WORD flag set. WORD_POSITION_ESCAPES = dict(POSITION_ESCAPES) WORD_POSITION_ESCAPES.update({ "b": DefaultBoundary(), "B": DefaultBoundary(False), "m": DefaultStartOfWord(), "M": DefaultEndOfWord(), }) regex-2014.02.16/Python2/_regex_unicode.c0000666000000000000000000211563112300206543016045 0ustar 00000000000000/* For Unicode version 6.3.0 */ #include "_regex_unicode.h" #define RE_BLANK_MASK ((1 << RE_PROP_ZL) | (1 << RE_PROP_ZP)) #define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN)) #define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC)) typedef struct RE_AllCases { RE_INT32 diffs[RE_MAX_CASES - 1]; } RE_AllCases; typedef struct RE_FullCaseFolding { RE_INT32 diff; RE_UINT16 codepoints[RE_MAX_FOLDED - 1]; } RE_FullCaseFolding; /* strings. */ char* re_strings[] = { "-1/2", "0", "1", "1/10", "1/16", "1/2", "1/3", "1/4", "1/5", "1/6", "1/7", "1/8", "1/9", "10", "100", "1000", "10000", "100000", "100000000", "1000000000000", "103", "107", "11", "11/2", "118", "12", "122", "129", "13", "13/2", "130", "132", "14", "15", "15/2", "16", "17", "17/2", "18", "19", "2", "2/3", "2/5", "20", "200", "2000", "20000", "202", "21", "214", "216", "216000", "218", "22", "220", "222", "224", "226", "228", "23", "230", "232", "233", "234", "24", "240", "25", "26", "27", "28", "29", "3", "3/16", "3/2", "3/4", "3/5", "3/8", "30", "300", "3000", "30000", "31", "32", "33", "34", "35", "36", "37", "38", "39", "4", "4/5", "40", "400", "4000", "40000", "41", "42", "43", "432000", "44", "45", "46", "47", "48", "49", "5", "5/2", "5/6", "5/8", "50", "500", "5000", "50000", "6", "60", "600", "6000", "60000", "7", "7/2", "7/8", "70", "700", "7000", "70000", "8", "80", "800", "8000", "80000", "84", "9", "9/2", "90", "900", "9000", "90000", "91", "A", "ABOVE", "ABOVELEFT", "ABOVERIGHT", "AEGEANNUMBERS", "AHEX", "AI", "AIN", "AL", "ALAPH", "ALCHEMICAL", "ALCHEMICALSYMBOLS", "ALEF", "ALETTER", "ALNUM", "ALPHA", "ALPHABETIC", "ALPHABETICPF", "ALPHABETICPRESENTATIONFORMS", "ALPHANUMERIC", "AMBIGUOUS", "AN", "ANCIENTGREEKMUSIC", "ANCIENTGREEKMUSICALNOTATION", "ANCIENTGREEKNUMBERS", "ANCIENTSYMBOLS", "ANY", "AR", "ARAB", "ARABIC", "ARABICEXTA", "ARABICEXTENDEDA", "ARABICLETTER", "ARABICMATH", "ARABICMATHEMATICALALPHABETICSYMBOLS", "ARABICNUMBER", "ARABICPFA", "ARABICPFB", "ARABICPRESENTATIONFORMSA", "ARABICPRESENTATIONFORMSB", "ARABICSUP", "ARABICSUPPLEMENT", "ARMENIAN", "ARMI", "ARMN", "ARROWS", "ASCII", "ASCIIHEXDIGIT", "ASSIGNED", "AT", "ATA", "ATAR", "ATB", "ATERM", "ATTACHEDABOVE", "ATTACHEDABOVERIGHT", "ATTACHEDBELOW", "ATTACHEDBELOWLEFT", "AVAGRAHA", "AVESTAN", "AVST", "B", "B2", "BA", "BALI", "BALINESE", "BAMU", "BAMUM", "BAMUMSUP", "BAMUMSUPPLEMENT", "BASICLATIN", "BATAK", "BATK", "BB", "BC", "BEH", "BELOW", "BELOWLEFT", "BELOWRIGHT", "BENG", "BENGALI", "BETH", "BIDIC", "BIDICLASS", "BIDICONTROL", "BIDIM", "BIDIMIRRORED", "BINDU", "BK", "BL", "BLANK", "BLK", "BLOCK", "BLOCKELEMENTS", "BN", "BOPO", "BOPOMOFO", "BOPOMOFOEXT", "BOPOMOFOEXTENDED", "BOTTOM", "BOTTOMANDRIGHT", "BOUNDARYNEUTRAL", "BOXDRAWING", "BR", "BRAH", "BRAHMI", "BRAI", "BRAILLE", "BRAILLEPATTERNS", "BREAKAFTER", "BREAKBEFORE", "BREAKBOTH", "BREAKSYMBOLS", "BUGI", "BUGINESE", "BUHD", "BUHID", "BURUSHASKIYEHBARREE", "BYZANTINEMUSIC", "BYZANTINEMUSICALSYMBOLS", "C", "C&", "CAKM", "CAN", "CANADIANABORIGINAL", "CANADIANSYLLABICS", "CANONICAL", "CANONICALCOMBININGCLASS", "CANS", "CARI", "CARIAN", "CARRIAGERETURN", "CASED", "CASEDLETTER", "CASEIGNORABLE", "CB", "CC", "CCC", "CCC10", "CCC103", "CCC107", "CCC11", "CCC118", "CCC12", "CCC122", "CCC129", "CCC13", "CCC130", "CCC132", "CCC133", "CCC14", "CCC15", "CCC16", "CCC17", "CCC18", "CCC19", "CCC20", "CCC21", "CCC22", "CCC23", "CCC24", "CCC25", "CCC26", "CCC27", "CCC28", "CCC29", "CCC30", "CCC31", "CCC32", "CCC33", "CCC34", "CCC35", "CCC36", "CCC84", "CCC91", "CF", "CHAKMA", "CHAM", "CHANGESWHENCASEFOLDED", "CHANGESWHENCASEMAPPED", "CHANGESWHENLOWERCASED", "CHANGESWHENTITLECASED", "CHANGESWHENUPPERCASED", "CHER", "CHEROKEE", "CI", "CIRCLE", "CJ", "CJK", "CJKCOMPAT", "CJKCOMPATFORMS", "CJKCOMPATIBILITY", "CJKCOMPATIBILITYFORMS", "CJKCOMPATIBILITYIDEOGRAPHS", "CJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENT", "CJKCOMPATIDEOGRAPHS", "CJKCOMPATIDEOGRAPHSSUP", "CJKEXTA", "CJKEXTB", "CJKEXTC", "CJKEXTD", "CJKRADICALSSUP", "CJKRADICALSSUPPLEMENT", "CJKSTROKES", "CJKSYMBOLS", "CJKSYMBOLSANDPUNCTUATION", "CJKUNIFIEDIDEOGRAPHS", "CJKUNIFIEDIDEOGRAPHSEXTENSIONA", "CJKUNIFIEDIDEOGRAPHSEXTENSIONB", "CJKUNIFIEDIDEOGRAPHSEXTENSIONC", "CJKUNIFIEDIDEOGRAPHSEXTENSIOND", "CL", "CLOSE", "CLOSEPARENTHESIS", "CLOSEPUNCTUATION", "CM", "CN", "CNTRL", "CO", "COM", "COMBININGDIACRITICALMARKS", "COMBININGDIACRITICALMARKSFORSYMBOLS", "COMBININGDIACRITICALMARKSSUPPLEMENT", "COMBININGHALFMARKS", "COMBININGMARK", "COMBININGMARKSFORSYMBOLS", "COMMON", "COMMONINDICNUMBERFORMS", "COMMONSEPARATOR", "COMPAT", "COMPATJAMO", "COMPLEXCONTEXT", "CONDITIONALJAPANESESTARTER", "CONNECTORPUNCTUATION", "CONSONANT", "CONSONANTDEAD", "CONSONANTFINAL", "CONSONANTHEADLETTER", "CONSONANTMEDIAL", "CONSONANTPLACEHOLDER", "CONSONANTREPHA", "CONSONANTSUBJOINED", "CONTINGENTBREAK", "CONTROL", "CONTROLPICTURES", "COPT", "COPTIC", "COUNTINGROD", "COUNTINGRODNUMERALS", "CP", "CPRT", "CR", "CS", "CUNEIFORM", "CUNEIFORMNUMBERS", "CUNEIFORMNUMBERSANDPUNCTUATION", "CURRENCYSYMBOL", "CURRENCYSYMBOLS", "CWCF", "CWCM", "CWL", "CWT", "CWU", "CYPRIOT", "CYPRIOTSYLLABARY", "CYRILLIC", "CYRILLICEXTA", "CYRILLICEXTB", "CYRILLICEXTENDEDA", "CYRILLICEXTENDEDB", "CYRILLICSUP", "CYRILLICSUPPLEMENT", "CYRILLICSUPPLEMENTARY", "CYRL", "D", "DA", "DAL", "DALATHRISH", "DASH", "DASHPUNCTUATION", "DB", "DE", "DECIMAL", "DECIMALNUMBER", "DECOMPOSITIONTYPE", "DEFAULTIGNORABLECODEPOINT", "DEP", "DEPRECATED", "DESERET", "DEVA", "DEVANAGARI", "DEVANAGARIEXT", "DEVANAGARIEXTENDED", "DI", "DIA", "DIACRITIC", "DIACRITICALS", "DIACRITICALSFORSYMBOLS", "DIACRITICALSSUP", "DIGIT", "DINGBATS", "DOMINO", "DOMINOTILES", "DOUBLEABOVE", "DOUBLEBELOW", "DOUBLEQUOTE", "DQ", "DSRT", "DT", "DUALJOINING", "E", "EA", "EASTASIANWIDTH", "EGYP", "EGYPTIANHIEROGLYPHS", "EMOTICONS", "EN", "ENC", "ENCLOSEDALPHANUM", "ENCLOSEDALPHANUMERICS", "ENCLOSEDALPHANUMERICSUPPLEMENT", "ENCLOSEDALPHANUMSUP", "ENCLOSEDCJK", "ENCLOSEDCJKLETTERSANDMONTHS", "ENCLOSEDIDEOGRAPHICSUP", "ENCLOSEDIDEOGRAPHICSUPPLEMENT", "ENCLOSINGMARK", "ES", "ET", "ETHI", "ETHIOPIC", "ETHIOPICEXT", "ETHIOPICEXTA", "ETHIOPICEXTENDED", "ETHIOPICEXTENDEDA", "ETHIOPICSUP", "ETHIOPICSUPPLEMENT", "EUROPEANNUMBER", "EUROPEANSEPARATOR", "EUROPEANTERMINATOR", "EX", "EXCLAMATION", "EXT", "EXTEND", "EXTENDER", "EXTENDNUMLET", "F", "FALSE", "FARSIYEH", "FE", "FEH", "FIN", "FINAL", "FINALPUNCTUATION", "FINALSEMKATH", "FIRSTSTRONGISOLATE", "FO", "FONT", "FORMAT", "FRA", "FRACTION", "FSI", "FULLWIDTH", "GAF", "GAMAL", "GC", "GCB", "GENERALCATEGORY", "GENERALPUNCTUATION", "GEOMETRICSHAPES", "GEOR", "GEORGIAN", "GEORGIANSUP", "GEORGIANSUPPLEMENT", "GL", "GLAG", "GLAGOLITIC", "GLUE", "GOTH", "GOTHIC", "GRAPH", "GRAPHEMEBASE", "GRAPHEMECLUSTERBREAK", "GRAPHEMEEXTEND", "GRAPHEMELINK", "GRBASE", "GREEK", "GREEKANDCOPTIC", "GREEKEXT", "GREEKEXTENDED", "GREK", "GREXT", "GRLINK", "GUJARATI", "GUJR", "GURMUKHI", "GURU", "H", "H2", "H3", "HAH", "HALFANDFULLFORMS", "HALFMARKS", "HALFWIDTH", "HALFWIDTHANDFULLWIDTHFORMS", "HAMZAONHEHGOAL", "HAN", "HANG", "HANGUL", "HANGULCOMPATIBILITYJAMO", "HANGULJAMO", "HANGULJAMOEXTENDEDA", "HANGULJAMOEXTENDEDB", "HANGULSYLLABLES", "HANGULSYLLABLETYPE", "HANI", "HANO", "HANUNOO", "HE", "HEBR", "HEBREW", "HEBREWLETTER", "HEH", "HEHGOAL", "HETH", "HEX", "HEXDIGIT", "HIGHPRIVATEUSESURROGATES", "HIGHPUSURROGATES", "HIGHSURROGATES", "HIRA", "HIRAGANA", "HL", "HST", "HY", "HYPHEN", "ID", "IDC", "IDCONTINUE", "IDEO", "IDEOGRAPHIC", "IDEOGRAPHICDESCRIPTIONCHARACTERS", "IDS", "IDSB", "IDSBINARYOPERATOR", "IDST", "IDSTART", "IDSTRINARYOPERATOR", "IMPERIALARAMAIC", "IN", "INDICMATRACATEGORY", "INDICNUMBERFORMS", "INDICSYLLABICCATEGORY", "INFIXNUMERIC", "INHERITED", "INIT", "INITIAL", "INITIALPUNCTUATION", "INMC", "INSC", "INSCRIPTIONALPAHLAVI", "INSCRIPTIONALPARTHIAN", "INSEPARABLE", "INSEPERABLE", "INVISIBLE", "IOTASUBSCRIPT", "IPAEXT", "IPAEXTENSIONS", "IS", "ISO", "ISOLATED", "ITAL", "JAMO", "JAMOEXTA", "JAMOEXTB", "JAVA", "JAVANESE", "JG", "JL", "JOINC", "JOINCAUSING", "JOINCONTROL", "JOININGGROUP", "JOININGTYPE", "JT", "JV", "KA", "KAF", "KAITHI", "KALI", "KANA", "KANASUP", "KANASUPPLEMENT", "KANAVOICING", "KANBUN", "KANGXI", "KANGXIRADICALS", "KANNADA", "KAPH", "KATAKANA", "KATAKANAEXT", "KATAKANAORHIRAGANA", "KATAKANAPHONETICEXTENSIONS", "KAYAHLI", "KHAPH", "KHAR", "KHAROSHTHI", "KHMER", "KHMERSYMBOLS", "KHMR", "KNDA", "KNOTTEDHEH", "KTHI", "KV", "L", "L&", "LAM", "LAMADH", "LANA", "LAO", "LAOO", "LATIN", "LATIN1", "LATIN1SUP", "LATIN1SUPPLEMENT", "LATINEXTA", "LATINEXTADDITIONAL", "LATINEXTB", "LATINEXTC", "LATINEXTD", "LATINEXTENDEDA", "LATINEXTENDEDADDITIONAL", "LATINEXTENDEDB", "LATINEXTENDEDC", "LATINEXTENDEDD", "LATN", "LB", "LE", "LEADINGJAMO", "LEFT", "LEFTANDRIGHT", "LEFTJOINING", "LEFTTORIGHT", "LEFTTORIGHTEMBEDDING", "LEFTTORIGHTISOLATE", "LEFTTORIGHTOVERRIDE", "LEPC", "LEPCHA", "LETTER", "LETTERLIKESYMBOLS", "LETTERNUMBER", "LF", "LIMB", "LIMBU", "LINB", "LINEARB", "LINEARBIDEOGRAMS", "LINEARBSYLLABARY", "LINEBREAK", "LINEFEED", "LINESEPARATOR", "LISU", "LL", "LM", "LO", "LOE", "LOGICALORDEREXCEPTION", "LOWER", "LOWERCASE", "LOWERCASELETTER", "LOWSURROGATES", "LRE", "LRI", "LRO", "LT", "LU", "LV", "LVSYLLABLE", "LVT", "LVTSYLLABLE", "LYCI", "LYCIAN", "LYDI", "LYDIAN", "M", "M&", "MAHJONG", "MAHJONGTILES", "MALAYALAM", "MAND", "MANDAIC", "MANDATORYBREAK", "MARK", "MATH", "MATHALPHANUM", "MATHEMATICALALPHANUMERICSYMBOLS", "MATHEMATICALOPERATORS", "MATHOPERATORS", "MATHSYMBOL", "MB", "MC", "ME", "MED", "MEDIAL", "MEEM", "MEETEIMAYEK", "MEETEIMAYEKEXT", "MEETEIMAYEKEXTENSIONS", "MERC", "MERO", "MEROITICCURSIVE", "MEROITICHIEROGLYPHS", "MIAO", "MIDLETTER", "MIDNUM", "MIDNUMLET", "MIM", "MISCARROWS", "MISCELLANEOUSMATHEMATICALSYMBOLSA", "MISCELLANEOUSMATHEMATICALSYMBOLSB", "MISCELLANEOUSSYMBOLS", "MISCELLANEOUSSYMBOLSANDARROWS", "MISCELLANEOUSSYMBOLSANDPICTOGRAPHS", "MISCELLANEOUSTECHNICAL", "MISCMATHSYMBOLSA", "MISCMATHSYMBOLSB", "MISCPICTOGRAPHS", "MISCSYMBOLS", "MISCTECHNICAL", "ML", "MLYM", "MN", "MODIFIERLETTER", "MODIFIERLETTERS", "MODIFIERSYMBOL", "MODIFIERTONELETTERS", "MODIFYINGLETTER", "MONG", "MONGOLIAN", "MTEI", "MUSIC", "MUSICALSYMBOLS", "MYANMAR", "MYANMAREXTA", "MYANMAREXTENDEDA", "MYMR", "N", "N&", "NA", "NAN", "NAR", "NARROW", "NB", "NCHAR", "ND", "NEUTRAL", "NEWLINE", "NEWTAILUE", "NEXTLINE", "NK", "NKO", "NKOO", "NL", "NO", "NOBLOCK", "NOBREAK", "NOJOININGGROUP", "NONCHARACTERCODEPOINT", "NONE", "NONJOINING", "NONSPACINGMARK", "NONSTARTER", "NOON", "NOTAPPLICABLE", "NOTREORDERED", "NR", "NS", "NSM", "NT", "NU", "NUKTA", "NUMBER", "NUMBERFORMS", "NUMERIC", "NUMERICTYPE", "NUMERICVALUE", "NUN", "NV", "NYA", "OALPHA", "OCR", "ODI", "OGAM", "OGHAM", "OGREXT", "OIDC", "OIDS", "OLCHIKI", "OLCK", "OLDITALIC", "OLDPERSIAN", "OLDSOUTHARABIAN", "OLDTURKIC", "OLETTER", "OLOWER", "OMATH", "ON", "OP", "OPENPUNCTUATION", "OPTICALCHARACTERRECOGNITION", "ORIYA", "ORKH", "ORYA", "OSMA", "OSMANYA", "OTHER", "OTHERALPHABETIC", "OTHERDEFAULTIGNORABLECODEPOINT", "OTHERGRAPHEMEEXTEND", "OTHERIDCONTINUE", "OTHERIDSTART", "OTHERLETTER", "OTHERLOWERCASE", "OTHERMATH", "OTHERNEUTRAL", "OTHERNUMBER", "OTHERPUNCTUATION", "OTHERSYMBOL", "OTHERUPPERCASE", "OUPPER", "OV", "OVERLAY", "OVERSTRUCK", "P", "P&", "PARAGRAPHSEPARATOR", "PATSYN", "PATTERNSYNTAX", "PATTERNWHITESPACE", "PATWS", "PC", "PD", "PDF", "PDI", "PE", "PF", "PHAG", "PHAGSPA", "PHAISTOS", "PHAISTOSDISC", "PHLI", "PHNX", "PHOENICIAN", "PHONETICEXT", "PHONETICEXTENSIONS", "PHONETICEXTENSIONSSUPPLEMENT", "PHONETICEXTSUP", "PI", "PLAYINGCARDS", "PLRD", "PO", "POPDIRECTIONALFORMAT", "POPDIRECTIONALISOLATE", "POSTFIXNUMERIC", "PR", "PREFIXNUMERIC", "PREPEND", "PRINT", "PRIVATEUSE", "PRIVATEUSEAREA", "PRTI", "PS", "PUA", "PUNCT", "PUNCTUATION", "QAAC", "QAAI", "QAF", "QAPH", "QMARK", "QU", "QUOTATION", "QUOTATIONMARK", "R", "RADICAL", "REGIONALINDICATOR", "REGISTERSHIFTER", "REH", "REJANG", "REVERSEDPE", "RI", "RIGHT", "RIGHTJOINING", "RIGHTTOLEFT", "RIGHTTOLEFTEMBEDDING", "RIGHTTOLEFTISOLATE", "RIGHTTOLEFTOVERRIDE", "RJNG", "RLE", "RLI", "RLO", "ROHINGYAYEH", "RUMI", "RUMINUMERALSYMBOLS", "RUNIC", "RUNR", "S", "S&", "SA", "SAD", "SADHE", "SAMARITAN", "SAMR", "SARB", "SAUR", "SAURASHTRA", "SB", "SC", "SCONTINUE", "SCRIPT", "SD", "SE", "SEEN", "SEGMENTSEPARATOR", "SEMKATH", "SENTENCEBREAK", "SEP", "SEPARATOR", "SG", "SHARADA", "SHAVIAN", "SHAW", "SHIN", "SHRD", "SINGLEQUOTE", "SINH", "SINHALA", "SK", "SM", "SMALL", "SMALLFORMS", "SMALLFORMVARIANTS", "SML", "SO", "SOFTDOTTED", "SORA", "SORASOMPENG", "SP", "SPACE", "SPACESEPARATOR", "SPACINGMARK", "SPACINGMODIFIERLETTERS", "SPECIALS", "SQ", "SQR", "SQUARE", "ST", "STERM", "SUB", "SUND", "SUNDANESE", "SUNDANESESUP", "SUNDANESESUPPLEMENT", "SUP", "SUPARROWSA", "SUPARROWSB", "SUPER", "SUPERANDSUB", "SUPERSCRIPTSANDSUBSCRIPTS", "SUPMATHOPERATORS", "SUPPLEMENTALARROWSA", "SUPPLEMENTALARROWSB", "SUPPLEMENTALMATHEMATICALOPERATORS", "SUPPLEMENTALPUNCTUATION", "SUPPLEMENTARYPRIVATEUSEAREAA", "SUPPLEMENTARYPRIVATEUSEAREAB", "SUPPUAA", "SUPPUAB", "SUPPUNCTUATION", "SURROGATE", "SWASHKAF", "SY", "SYLO", "SYLOTINAGRI", "SYMBOL", "SYRC", "SYRIAC", "SYRIACWAW", "T", "TAGALOG", "TAGB", "TAGBANWA", "TAGS", "TAH", "TAILE", "TAITHAM", "TAIVIET", "TAIXUANJING", "TAIXUANJINGSYMBOLS", "TAKR", "TAKRI", "TALE", "TALU", "TAMIL", "TAML", "TAVT", "TAW", "TEHMARBUTA", "TEHMARBUTAGOAL", "TELU", "TELUGU", "TERM", "TERMINALPUNCTUATION", "TETH", "TFNG", "TGLG", "THAA", "THAANA", "THAI", "TIBETAN", "TIBT", "TIFINAGH", "TITLECASELETTER", "TONELETTER", "TONEMARK", "TOP", "TOPANDBOTTOM", "TOPANDBOTTOMANDRIGHT", "TOPANDLEFT", "TOPANDLEFTANDRIGHT", "TOPANDRIGHT", "TRAILINGJAMO", "TRANSPARENT", "TRANSPORTANDMAP", "TRANSPORTANDMAPSYMBOLS", "TRUE", "U", "UCAS", "UCASEXT", "UGAR", "UGARITIC", "UIDEO", "UNASSIGNED", "UNIFIEDCANADIANABORIGINALSYLLABICS", "UNIFIEDCANADIANABORIGINALSYLLABICSEXTENDED", "UNIFIEDIDEOGRAPH", "UNKNOWN", "UP", "UPPER", "UPPERCASE", "UPPERCASELETTER", "V", "VAI", "VAII", "VARIATIONSELECTOR", "VARIATIONSELECTORS", "VARIATIONSELECTORSSUPPLEMENT", "VEDICEXT", "VEDICEXTENSIONS", "VERT", "VERTICAL", "VERTICALFORMS", "VIRAMA", "VISARGA", "VISUALORDERLEFT", "VOWEL", "VOWELDEPENDENT", "VOWELINDEPENDENT", "VOWELJAMO", "VR", "VS", "VSSUP", "W", "WAW", "WB", "WHITESPACE", "WIDE", "WJ", "WORD", "WORDBREAK", "WORDJOINER", "WS", "WSPACE", "XDIGIT", "XIDC", "XIDCONTINUE", "XIDS", "XIDSTART", "XPEO", "XSUX", "XX", "Y", "YEH", "YEHBARREE", "YEHWITHTAIL", "YES", "YI", "YIII", "YIJING", "YIJINGHEXAGRAMSYMBOLS", "YIRADICALS", "YISYLLABLES", "YUDH", "YUDHHE", "Z", "Z&", "ZAIN", "ZHAIN", "ZINH", "ZL", "ZP", "ZS", "ZW", "ZWSPACE", "ZYYY", "ZZZZ", }; /* strings: 10575 bytes. */ /* properties. */ RE_Property re_properties[] = { { 506, 0, 0}, { 504, 0, 0}, { 231, 1, 1}, { 230, 1, 1}, { 958, 2, 2}, { 956, 2, 2}, {1118, 3, 3}, {1113, 3, 3}, { 521, 4, 4}, { 505, 4, 4}, { 964, 5, 5}, { 955, 5, 5}, { 732, 6, 6}, { 155, 7, 6}, { 154, 7, 6}, { 707, 8, 6}, { 706, 8, 6}, {1088, 9, 6}, {1087, 9, 6}, { 271, 10, 6}, { 273, 11, 6}, { 324, 11, 6}, { 319, 12, 6}, { 399, 12, 6}, { 321, 13, 6}, { 401, 13, 6}, { 320, 14, 6}, { 400, 14, 6}, { 317, 15, 6}, { 397, 15, 6}, { 318, 16, 6}, { 398, 16, 6}, { 585, 17, 6}, { 581, 17, 6}, { 577, 18, 6}, { 576, 18, 6}, {1126, 19, 6}, {1125, 19, 6}, {1124, 20, 6}, {1123, 20, 6}, { 424, 21, 6}, { 432, 21, 6}, { 522, 22, 6}, { 530, 22, 6}, { 520, 23, 6}, { 524, 23, 6}, { 523, 24, 6}, { 531, 24, 6}, {1114, 25, 6}, {1121, 25, 6}, { 987, 25, 6}, { 223, 26, 6}, { 221, 26, 6}, { 620, 27, 6}, { 618, 27, 6}, { 417, 28, 6}, { 574, 29, 6}, { 921, 30, 6}, { 918, 30, 6}, {1051, 31, 6}, {1050, 31, 6}, { 862, 32, 6}, { 844, 32, 6}, { 565, 33, 6}, { 564, 33, 6}, { 186, 34, 6}, { 144, 34, 6}, { 855, 35, 6}, { 828, 35, 6}, { 579, 36, 6}, { 578, 36, 6}, { 434, 37, 6}, { 433, 37, 6}, { 483, 38, 6}, { 481, 38, 6}, { 861, 39, 6}, { 843, 39, 6}, { 867, 40, 6}, { 868, 40, 6}, { 806, 41, 6}, { 792, 41, 6}, { 857, 42, 6}, { 833, 42, 6}, { 583, 43, 6}, { 582, 43, 6}, { 586, 44, 6}, { 584, 44, 6}, { 923, 45, 6}, {1084, 46, 6}, {1080, 46, 6}, { 856, 47, 6}, { 830, 47, 6}, { 426, 48, 6}, { 425, 48, 6}, { 983, 49, 6}, { 959, 49, 6}, { 705, 50, 6}, { 704, 50, 6}, { 859, 51, 6}, { 835, 51, 6}, { 858, 52, 6}, { 834, 52, 6}, { 996, 53, 6}, {1093, 54, 6}, {1109, 54, 6}, { 877, 55, 6}, { 878, 55, 6}, { 876, 56, 6}, { 875, 56, 6}, { 553, 57, 7}, { 572, 57, 7}, { 222, 58, 8}, { 213, 58, 8}, { 266, 59, 9}, { 276, 59, 9}, { 423, 60, 10}, { 447, 60, 10}, { 451, 61, 11}, { 450, 61, 11}, { 621, 62, 12}, { 616, 62, 12}, { 622, 63, 13}, { 623, 63, 13}, { 697, 64, 14}, { 675, 64, 14}, { 823, 65, 15}, { 817, 65, 15}, { 824, 66, 16}, { 826, 66, 16}, { 225, 67, 6}, { 224, 67, 6}, { 589, 68, 17}, { 597, 68, 17}, { 591, 69, 18}, { 598, 69, 18}, { 158, 70, 6}, { 153, 70, 6}, { 165, 71, 6}, { 185, 72, 6}, { 187, 73, 6}, { 229, 74, 6}, { 519, 75, 6}, { 906, 76, 6}, {1117, 77, 6}, {1122, 78, 6}, }; /* properties: 580 bytes. */ /* property values. */ RE_PropertyValue re_property_values[] = { {1081, 0, 0}, { 355, 0, 0}, {1089, 0, 1}, { 714, 0, 1}, { 708, 0, 2}, { 701, 0, 2}, {1061, 0, 3}, { 713, 0, 3}, { 771, 0, 4}, { 702, 0, 4}, { 860, 0, 5}, { 703, 0, 5}, { 809, 0, 6}, { 770, 0, 6}, { 465, 0, 7}, { 740, 0, 7}, { 989, 0, 8}, { 739, 0, 8}, { 422, 0, 9}, { 438, 0, 9}, { 793, 0, 9}, { 689, 0, 10}, { 801, 0, 10}, { 864, 0, 11}, { 802, 0, 11}, { 988, 0, 12}, {1150, 0, 12}, { 699, 0, 13}, {1148, 0, 13}, { 874, 0, 14}, {1149, 0, 14}, { 382, 0, 15}, { 356, 0, 15}, { 275, 0, 15}, { 497, 0, 16}, { 314, 0, 16}, { 907, 0, 17}, { 357, 0, 17}, {1018, 0, 18}, { 391, 0, 18}, { 418, 0, 19}, { 880, 0, 19}, { 847, 0, 20}, { 910, 0, 20}, { 353, 0, 21}, { 883, 0, 21}, { 372, 0, 22}, { 879, 0, 22}, { 865, 0, 23}, { 899, 0, 23}, { 737, 0, 24}, { 977, 0, 24}, { 395, 0, 25}, { 956, 0, 25}, { 773, 0, 26}, { 976, 0, 26}, { 866, 0, 27}, { 982, 0, 27}, { 596, 0, 28}, { 896, 0, 28}, { 492, 0, 29}, { 884, 0, 29}, { 854, 0, 30}, { 259, 0, 30}, { 260, 0, 30}, { 687, 0, 31}, { 654, 0, 31}, { 653, 0, 31}, { 731, 0, 32}, { 724, 0, 32}, { 363, 0, 32}, { 723, 0, 32}, { 820, 0, 33}, { 785, 0, 33}, { 786, 0, 33}, { 913, 0, 34}, { 872, 0, 34}, { 912, 0, 34}, { 873, 0, 34}, {1023, 0, 35}, { 945, 0, 35}, { 946, 0, 35}, { 966, 0, 36}, {1143, 0, 36}, {1144, 0, 36}, { 272, 0, 37}, { 803, 1, 0}, { 791, 1, 0}, { 209, 1, 1}, { 185, 1, 1}, { 663, 1, 2}, { 661, 1, 2}, { 662, 1, 2}, { 669, 1, 3}, { 664, 1, 3}, { 671, 1, 4}, { 666, 1, 4}, { 606, 1, 5}, { 605, 1, 5}, { 990, 1, 6}, { 772, 1, 6}, { 359, 1, 7}, { 435, 1, 7}, { 526, 1, 8}, { 525, 1, 8}, { 404, 1, 9}, { 410, 1, 10}, { 409, 1, 10}, { 411, 1, 10}, { 181, 1, 11}, { 559, 1, 12}, { 168, 1, 13}, {1025, 1, 14}, { 180, 1, 15}, { 179, 1, 15}, {1056, 1, 16}, { 799, 1, 17}, { 950, 1, 18}, { 729, 1, 19}, { 170, 1, 20}, { 169, 1, 20}, { 429, 1, 21}, { 219, 1, 22}, { 534, 1, 23}, { 532, 1, 24}, { 849, 1, 25}, {1042, 1, 26}, {1049, 1, 27}, { 636, 1, 28}, { 727, 1, 29}, { 975, 1, 30}, {1057, 1, 31}, { 658, 1, 32}, {1058, 1, 33}, { 781, 1, 34}, { 510, 1, 35}, { 549, 1, 36}, { 611, 1, 36}, { 469, 1, 37}, { 475, 1, 38}, { 474, 1, 38}, { 323, 1, 39}, {1082, 1, 40}, { 264, 1, 40}, {1076, 1, 40}, { 832, 1, 41}, { 943, 1, 42}, {1028, 1, 43}, { 556, 1, 44}, { 255, 1, 45}, {1030, 1, 46}, { 646, 1, 47}, { 777, 1, 48}, {1083, 1, 49}, {1077, 1, 49}, { 692, 1, 50}, {1033, 1, 51}, { 796, 1, 52}, { 647, 1, 53}, { 253, 1, 54}, {1034, 1, 55}, { 204, 1, 56}, { 999, 1, 57}, { 210, 1, 58}, { 686, 1, 59}, { 836, 1, 60}, {1001, 1, 61}, {1000, 1, 61}, {1097, 1, 62}, {1096, 1, 62}, { 893, 1, 63}, { 892, 1, 63}, { 894, 1, 64}, { 895, 1, 64}, { 361, 1, 65}, { 437, 1, 65}, { 670, 1, 66}, { 665, 1, 66}, { 528, 1, 67}, { 527, 1, 67}, { 507, 1, 68}, { 913, 1, 68}, {1007, 1, 69}, {1006, 1, 69}, { 396, 1, 70}, { 360, 1, 71}, { 364, 1, 71}, { 436, 1, 71}, { 688, 1, 72}, { 821, 1, 73}, { 184, 1, 74}, { 735, 1, 75}, { 736, 1, 75}, { 762, 1, 76}, { 767, 1, 76}, { 383, 1, 77}, { 848, 1, 78}, { 829, 1, 78}, { 458, 1, 79}, { 457, 1, 79}, { 241, 1, 80}, { 232, 1, 81}, { 508, 1, 82}, { 759, 1, 83}, { 766, 1, 83}, { 439, 1, 84}, { 757, 1, 85}, { 763, 1, 85}, {1009, 1, 86}, {1003, 1, 86}, { 247, 1, 87}, { 246, 1, 87}, {1010, 1, 88}, {1004, 1, 88}, { 758, 1, 89}, { 764, 1, 89}, {1011, 1, 90}, {1008, 1, 90}, { 760, 1, 91}, { 756, 1, 91}, { 515, 1, 92}, { 672, 1, 93}, { 667, 1, 93}, { 385, 1, 94}, { 512, 1, 95}, { 511, 1, 95}, {1060, 1, 96}, { 472, 1, 97}, { 470, 1, 97}, { 407, 1, 98}, { 405, 1, 98}, {1012, 1, 99}, {1017, 1, 99}, { 341, 1, 100}, { 340, 1, 100}, { 635, 1, 101}, { 634, 1, 101}, { 580, 1, 102}, { 576, 1, 102}, { 344, 1, 103}, { 343, 1, 103}, { 570, 1, 104}, { 638, 1, 105}, { 235, 1, 106}, { 548, 1, 107}, { 369, 1, 107}, { 633, 1, 108}, { 237, 1, 109}, { 236, 1, 109}, { 342, 1, 110}, { 641, 1, 111}, { 639, 1, 111}, { 462, 1, 112}, { 461, 1, 112}, { 330, 1, 113}, { 328, 1, 113}, { 346, 1, 114}, { 336, 1, 114}, {1138, 1, 115}, {1137, 1, 115}, { 345, 1, 116}, { 327, 1, 116}, {1140, 1, 117}, {1139, 1, 118}, { 700, 1, 119}, {1091, 1, 120}, { 408, 1, 121}, { 406, 1, 121}, { 206, 1, 122}, { 774, 1, 123}, { 673, 1, 124}, { 668, 1, 124}, {1022, 1, 125}, { 366, 1, 126}, { 590, 1, 126}, { 886, 1, 127}, { 954, 1, 128}, { 431, 1, 129}, { 430, 1, 129}, { 642, 1, 130}, { 927, 1, 131}, { 550, 1, 132}, { 612, 1, 132}, { 615, 1, 133}, { 316, 1, 134}, { 783, 1, 135}, { 782, 1, 135}, {1035, 1, 136}, { 746, 1, 137}, { 745, 1, 137}, { 473, 1, 138}, { 471, 1, 138}, { 744, 1, 139}, { 552, 1, 140}, { 547, 1, 140}, { 551, 1, 141}, { 613, 1, 141}, { 568, 1, 142}, { 566, 1, 143}, { 567, 1, 143}, { 709, 1, 144}, { 908, 1, 145}, { 907, 1, 145}, { 911, 1, 145}, { 332, 1, 146}, { 334, 1, 146}, { 157, 1, 147}, { 156, 1, 147}, { 177, 1, 148}, { 175, 1, 148}, {1094, 1, 149}, {1109, 1, 149}, {1100, 1, 150}, { 362, 1, 151}, { 541, 1, 151}, { 331, 1, 152}, { 329, 1, 152}, { 980, 1, 153}, { 979, 1, 153}, { 178, 1, 154}, { 176, 1, 154}, { 543, 1, 155}, { 540, 1, 155}, { 991, 1, 156}, { 696, 1, 157}, { 695, 1, 158}, { 143, 1, 159}, { 163, 1, 160}, { 164, 1, 161}, { 888, 1, 162}, { 887, 1, 162}, { 720, 1, 163}, { 269, 1, 164}, { 838, 1, 165}, { 518, 1, 166}, {1079, 1, 167}, { 839, 1, 168}, { 427, 1, 169}, { 969, 1, 170}, { 853, 1, 171}, { 403, 1, 172}, { 587, 1, 173}, { 891, 1, 174}, { 722, 1, 175}, { 750, 1, 176}, { 749, 1, 177}, { 645, 1, 178}, { 840, 1, 179}, { 198, 1, 180}, { 600, 1, 181}, { 599, 1, 182}, { 841, 1, 183}, { 942, 1, 184}, { 941, 1, 184}, { 244, 1, 185}, { 627, 1, 186}, { 985, 1, 187}, { 315, 1, 188}, { 968, 1, 189}, {1039, 1, 190}, { 392, 1, 191}, { 394, 1, 192}, { 393, 1, 192}, { 453, 1, 193}, { 208, 1, 194}, { 207, 1, 194}, { 751, 1, 195}, { 631, 1, 196}, { 630, 1, 196}, { 258, 1, 197}, { 257, 1, 197}, { 780, 1, 198}, { 779, 1, 198}, { 162, 1, 199}, { 161, 1, 199}, {1037, 1, 200}, {1036, 1, 200}, { 387, 1, 201}, { 386, 1, 201}, { 734, 1, 202}, { 733, 1, 202}, { 173, 1, 203}, { 172, 1, 203}, { 726, 1, 204}, { 725, 1, 204}, { 441, 1, 205}, { 440, 1, 205}, { 897, 1, 206}, { 459, 1, 207}, { 460, 1, 207}, { 464, 1, 208}, { 463, 1, 208}, { 761, 1, 209}, { 765, 1, 209}, { 454, 1, 210}, {1073, 1, 211}, {1072, 1, 211}, { 150, 1, 212}, { 149, 1, 212}, { 347, 1, 213}, { 337, 1, 213}, { 348, 1, 214}, { 338, 1, 214}, { 349, 1, 215}, { 339, 1, 215}, { 333, 1, 216}, { 335, 1, 216}, {1031, 1, 217}, {1095, 1, 218}, {1110, 1, 218}, {1013, 1, 219}, {1015, 1, 219}, {1014, 1, 220}, {1016, 1, 220}, {1085, 2, 0}, {1154, 2, 0}, { 365, 2, 1}, {1153, 2, 1}, { 660, 2, 2}, { 674, 2, 2}, { 525, 2, 3}, { 529, 2, 3}, { 404, 2, 4}, { 412, 2, 4}, { 181, 2, 5}, { 183, 2, 5}, { 559, 2, 6}, { 558, 2, 6}, { 168, 2, 7}, { 167, 2, 7}, {1025, 2, 8}, {1024, 2, 8}, {1056, 2, 9}, {1055, 2, 9}, { 429, 2, 10}, { 428, 2, 10}, { 219, 2, 11}, { 218, 2, 11}, { 534, 2, 12}, { 535, 2, 12}, { 532, 2, 13}, { 533, 2, 13}, { 849, 2, 14}, { 851, 2, 14}, {1042, 2, 15}, {1043, 2, 15}, {1049, 2, 16}, {1048, 2, 16}, { 636, 2, 17}, { 649, 2, 17}, { 727, 2, 18}, { 769, 2, 18}, { 975, 2, 19}, { 974, 2, 19}, {1057, 2, 20}, { 658, 2, 21}, { 659, 2, 21}, {1058, 2, 22}, {1059, 2, 22}, { 781, 2, 23}, { 784, 2, 23}, { 510, 2, 24}, { 509, 2, 24}, { 547, 2, 25}, { 546, 2, 25}, { 469, 2, 26}, { 468, 2, 26}, { 323, 2, 27}, { 322, 2, 27}, { 263, 2, 28}, { 267, 2, 28}, { 832, 2, 29}, { 831, 2, 29}, { 943, 2, 30}, { 944, 2, 30}, { 646, 2, 31}, { 648, 2, 31}, { 777, 2, 32}, { 776, 2, 32}, { 570, 2, 33}, { 569, 2, 33}, { 638, 2, 34}, { 629, 2, 34}, { 235, 2, 35}, { 234, 2, 35}, { 545, 2, 36}, { 554, 2, 36}, {1135, 2, 37}, {1136, 2, 37}, { 838, 2, 38}, { 610, 2, 38}, { 518, 2, 39}, { 517, 2, 39}, { 427, 2, 40}, { 446, 2, 40}, { 593, 2, 41}, { 915, 2, 41}, {1147, 2, 41}, {1028, 2, 42}, {1054, 2, 42}, { 556, 2, 43}, { 555, 2, 43}, { 255, 2, 44}, { 254, 2, 44}, {1030, 2, 45}, {1029, 2, 45}, { 692, 2, 46}, { 691, 2, 46}, {1033, 2, 47}, {1040, 2, 47}, { 694, 2, 48}, { 693, 2, 48}, {1079, 2, 49}, {1078, 2, 49}, { 969, 2, 50}, { 970, 2, 50}, { 853, 2, 51}, { 852, 2, 51}, { 402, 2, 52}, { 389, 2, 52}, { 246, 2, 53}, { 245, 2, 53}, { 253, 2, 54}, { 252, 2, 54}, { 385, 2, 55}, { 914, 2, 55}, { 384, 2, 55}, { 796, 2, 56}, {1041, 2, 56}, { 515, 2, 57}, { 514, 2, 57}, {1060, 2, 58}, {1053, 2, 58}, {1022, 2, 59}, {1021, 2, 59}, { 839, 2, 60}, {1127, 2, 60}, { 645, 2, 61}, { 644, 2, 61}, { 204, 2, 62}, { 203, 2, 62}, { 392, 2, 63}, {1128, 2, 63}, { 891, 2, 64}, { 890, 2, 64}, { 886, 2, 65}, { 885, 2, 65}, { 799, 2, 66}, { 800, 2, 66}, { 999, 2, 67}, { 998, 2, 67}, { 686, 2, 68}, { 685, 2, 68}, { 836, 2, 69}, { 837, 2, 69}, {1091, 2, 70}, {1092, 2, 70}, { 954, 2, 71}, { 953, 2, 71}, { 642, 2, 72}, { 628, 2, 72}, { 927, 2, 73}, { 936, 2, 73}, { 720, 2, 74}, { 719, 2, 74}, { 269, 2, 75}, { 268, 2, 75}, { 722, 2, 76}, { 721, 2, 76}, { 316, 2, 77}, {1034, 2, 78}, { 657, 2, 78}, {1035, 2, 79}, {1044, 2, 79}, { 198, 2, 80}, { 199, 2, 80}, { 453, 2, 81}, { 452, 2, 81}, { 950, 2, 82}, { 951, 2, 82}, { 700, 2, 83}, { 206, 2, 84}, { 205, 2, 84}, { 615, 2, 85}, { 614, 2, 85}, { 744, 2, 86}, { 778, 2, 86}, { 587, 2, 87}, { 182, 2, 87}, { 840, 2, 88}, { 952, 2, 88}, { 600, 2, 89}, { 909, 2, 89}, { 599, 2, 90}, { 889, 2, 90}, { 841, 2, 91}, { 850, 2, 91}, { 627, 2, 92}, { 651, 2, 92}, { 210, 2, 93}, { 211, 2, 93}, { 244, 2, 94}, { 243, 2, 94}, { 729, 2, 95}, { 728, 2, 95}, { 315, 2, 96}, { 261, 2, 96}, { 749, 2, 97}, { 747, 2, 97}, { 750, 2, 98}, { 748, 2, 98}, { 751, 2, 99}, { 898, 2, 99}, { 968, 2, 100}, { 972, 2, 100}, { 985, 2, 101}, { 984, 2, 101}, {1039, 2, 102}, {1038, 2, 102}, { 640, 2, 103}, { 854, 3, 0}, {1129, 3, 0}, { 444, 3, 1}, { 445, 3, 1}, { 973, 3, 2}, { 992, 3, 2}, { 560, 3, 3}, { 571, 3, 3}, { 390, 3, 4}, { 690, 3, 5}, { 795, 3, 6}, { 801, 3, 6}, { 482, 3, 7}, { 924, 3, 8}, { 929, 3, 8}, { 497, 3, 9}, { 495, 3, 9}, { 638, 3, 10}, { 625, 3, 10}, { 152, 3, 11}, { 676, 3, 11}, { 752, 3, 12}, { 768, 3, 12}, { 753, 3, 13}, { 770, 3, 13}, { 754, 3, 14}, { 738, 3, 14}, { 822, 3, 15}, { 818, 3, 15}, { 484, 3, 16}, { 479, 3, 16}, { 854, 4, 0}, {1129, 4, 0}, { 390, 4, 1}, { 690, 4, 2}, { 382, 4, 3}, { 355, 4, 3}, { 482, 4, 4}, { 479, 4, 4}, { 924, 4, 5}, { 929, 4, 5}, { 989, 4, 6}, { 977, 4, 6}, { 653, 4, 7}, {1090, 4, 8}, {1027, 4, 9}, { 715, 4, 10}, { 717, 4, 11}, { 905, 4, 12}, { 854, 5, 0}, {1129, 5, 0}, { 390, 5, 1}, { 690, 5, 2}, { 482, 5, 3}, { 479, 5, 3}, { 965, 5, 4}, { 960, 5, 4}, { 497, 5, 5}, { 495, 5, 5}, { 986, 5, 6}, { 706, 5, 7}, { 703, 5, 7}, {1087, 5, 8}, {1086, 5, 8}, { 842, 5, 9}, { 676, 5, 9}, { 822, 5, 10}, { 818, 5, 10}, { 192, 5, 11}, { 188, 5, 11}, { 996, 5, 12}, { 995, 5, 12}, { 351, 5, 13}, { 350, 5, 13}, { 957, 5, 14}, { 956, 5, 14}, { 802, 6, 0}, { 485, 6, 0}, { 486, 6, 0}, { 785, 6, 0}, {1134, 6, 1}, {1027, 6, 1}, {1130, 6, 1}, {1074, 6, 1}, { 812, 7, 0}, { 787, 7, 0}, { 677, 7, 1}, { 653, 7, 1}, {1107, 7, 2}, {1090, 7, 2}, {1070, 7, 3}, {1027, 7, 3}, { 716, 7, 4}, { 715, 7, 4}, { 718, 7, 5}, { 717, 7, 5}, { 681, 8, 0}, { 653, 8, 0}, { 932, 8, 1}, { 922, 8, 1}, { 476, 8, 2}, { 455, 8, 2}, { 477, 8, 3}, { 466, 8, 3}, { 478, 8, 4}, { 467, 8, 4}, { 174, 8, 5}, { 160, 8, 5}, { 367, 8, 6}, { 391, 8, 6}, { 874, 8, 7}, { 200, 8, 7}, { 962, 8, 8}, { 945, 8, 8}, {1114, 8, 9}, {1120, 8, 9}, { 863, 8, 10}, { 845, 8, 10}, { 240, 8, 11}, { 233, 8, 11}, { 809, 8, 12}, { 816, 8, 12}, { 171, 8, 13}, { 147, 8, 13}, { 684, 8, 14}, { 712, 8, 14}, { 935, 8, 15}, { 939, 8, 15}, { 682, 8, 16}, { 710, 8, 16}, { 933, 8, 17}, { 937, 8, 17}, { 900, 8, 18}, { 881, 8, 18}, { 683, 8, 19}, { 711, 8, 19}, { 934, 8, 20}, { 938, 8, 20}, { 494, 8, 21}, { 500, 8, 21}, { 901, 8, 22}, { 882, 8, 22}, { 813, 9, 0}, { 814, 9, 0}, { 1, 9, 0}, { 870, 9, 1}, { 869, 9, 1}, { 2, 9, 1}, { 819, 9, 2}, { 798, 9, 2}, { 119, 9, 2}, { 632, 9, 3}, { 126, 9, 3}, { 652, 9, 3}, {1101, 9, 4}, {1108, 9, 4}, { 132, 9, 4}, { 277, 9, 5}, { 13, 9, 5}, { 280, 9, 6}, { 22, 9, 6}, { 282, 9, 7}, { 25, 9, 7}, { 285, 9, 8}, { 28, 9, 8}, { 289, 9, 9}, { 32, 9, 9}, { 290, 9, 10}, { 33, 9, 10}, { 291, 9, 11}, { 35, 9, 11}, { 292, 9, 12}, { 36, 9, 12}, { 293, 9, 13}, { 38, 9, 13}, { 294, 9, 14}, { 39, 9, 14}, { 295, 9, 15}, { 43, 9, 15}, { 296, 9, 16}, { 48, 9, 16}, { 297, 9, 17}, { 53, 9, 17}, { 298, 9, 18}, { 59, 9, 18}, { 299, 9, 19}, { 64, 9, 19}, { 300, 9, 20}, { 66, 9, 20}, { 301, 9, 21}, { 67, 9, 21}, { 302, 9, 22}, { 68, 9, 22}, { 303, 9, 23}, { 69, 9, 23}, { 304, 9, 24}, { 70, 9, 24}, { 305, 9, 25}, { 77, 9, 25}, { 306, 9, 26}, { 81, 9, 26}, { 307, 9, 27}, { 82, 9, 27}, { 308, 9, 28}, { 83, 9, 28}, { 309, 9, 29}, { 84, 9, 29}, { 310, 9, 30}, { 85, 9, 30}, { 311, 9, 31}, { 86, 9, 31}, { 312, 9, 32}, { 131, 9, 32}, { 313, 9, 33}, { 138, 9, 33}, { 278, 9, 34}, { 20, 9, 34}, { 279, 9, 35}, { 21, 9, 35}, { 281, 9, 36}, { 24, 9, 36}, { 283, 9, 37}, { 26, 9, 37}, { 284, 9, 38}, { 27, 9, 38}, { 286, 9, 39}, { 30, 9, 39}, { 287, 9, 40}, { 31, 9, 40}, { 195, 9, 41}, { 47, 9, 41}, { 191, 9, 41}, { 193, 9, 42}, { 49, 9, 42}, { 189, 9, 42}, { 194, 9, 43}, { 190, 9, 43}, { 50, 9, 43}, { 216, 9, 44}, { 228, 9, 44}, { 52, 9, 44}, { 215, 9, 45}, { 200, 9, 45}, { 54, 9, 45}, { 217, 9, 46}, { 242, 9, 46}, { 55, 9, 46}, { 678, 9, 47}, { 56, 9, 47}, { 653, 9, 47}, { 930, 9, 48}, { 922, 9, 48}, { 57, 9, 48}, { 141, 9, 49}, { 58, 9, 49}, { 147, 9, 49}, { 140, 9, 50}, { 139, 9, 50}, { 60, 9, 50}, { 142, 9, 51}, { 166, 9, 51}, { 61, 9, 51}, { 443, 9, 52}, { 62, 9, 52}, { 419, 9, 52}, { 442, 9, 53}, { 63, 9, 53}, { 414, 9, 53}, { 604, 9, 54}, { 607, 9, 54}, { 65, 9, 54}, { 288, 9, 55}, { 196, 9, 56}, { 807, 10, 0}, { 265, 10, 1}, { 262, 10, 1}, { 368, 10, 2}, { 358, 10, 2}, { 496, 10, 3}, { 804, 10, 4}, { 791, 10, 4}, { 595, 10, 5}, { 594, 10, 5}, { 742, 10, 6}, { 741, 10, 6}, { 491, 10, 7}, { 490, 10, 7}, { 609, 10, 8}, { 608, 10, 8}, { 325, 10, 9}, { 456, 10, 9}, {1005, 10, 10}, {1002, 10, 10}, { 997, 10, 11}, {1099, 10, 12}, {1098, 10, 12}, {1115, 10, 13}, { 790, 10, 14}, { 789, 10, 14}, { 978, 10, 15}, { 981, 10, 15}, { 994, 10, 16}, { 993, 10, 16}, { 499, 10, 17}, { 498, 10, 17}, { 794, 11, 0}, { 785, 11, 0}, { 159, 11, 1}, { 139, 11, 1}, { 542, 11, 2}, { 536, 11, 2}, {1115, 11, 3}, {1111, 11, 3}, { 501, 11, 4}, { 485, 11, 4}, { 790, 11, 5}, { 787, 11, 5}, { 805, 12, 0}, { 146, 12, 1}, { 148, 12, 2}, { 151, 12, 3}, { 214, 12, 4}, { 220, 12, 5}, { 415, 12, 6}, { 416, 12, 7}, { 449, 12, 8}, { 489, 12, 9}, { 493, 12, 10}, { 502, 12, 11}, { 503, 12, 12}, { 539, 12, 13}, { 544, 12, 14}, {1047, 12, 14}, { 557, 12, 15}, { 561, 12, 16}, { 562, 12, 17}, { 563, 12, 18}, { 626, 12, 19}, { 637, 12, 20}, { 650, 12, 21}, { 655, 12, 22}, { 656, 12, 23}, { 743, 12, 24}, { 755, 12, 25}, { 811, 12, 26}, { 825, 12, 27}, { 883, 12, 28}, { 916, 12, 29}, { 917, 12, 30}, { 926, 12, 31}, { 928, 12, 32}, { 948, 12, 33}, { 949, 12, 34}, { 961, 12, 35}, { 963, 12, 36}, { 971, 12, 37}, {1019, 12, 38}, {1032, 12, 39}, {1045, 12, 40}, {1046, 12, 41}, {1052, 12, 42}, {1112, 12, 43}, {1026, 12, 44}, {1131, 12, 45}, {1132, 12, 46}, {1133, 12, 47}, {1141, 12, 48}, {1142, 12, 49}, {1145, 12, 50}, {1146, 12, 51}, { 643, 12, 52}, { 488, 12, 53}, { 256, 12, 54}, { 487, 12, 55}, { 827, 12, 56}, { 940, 12, 57}, { 808, 13, 0}, {1075, 13, 0}, { 619, 13, 1}, { 259, 13, 1}, { 448, 13, 2}, { 413, 13, 2}, { 931, 13, 3}, { 922, 13, 3}, { 680, 13, 4}, { 653, 13, 4}, {1071, 13, 5}, {1027, 13, 5}, {1085, 14, 0}, {1129, 14, 0}, { 847, 14, 1}, { 846, 14, 1}, { 353, 14, 2}, { 350, 14, 2}, { 920, 14, 3}, { 919, 14, 3}, { 516, 14, 4}, { 513, 14, 4}, { 810, 14, 5}, { 815, 14, 5}, { 480, 14, 6}, { 479, 14, 6}, { 251, 14, 7}, {1020, 14, 7}, { 592, 14, 8}, { 607, 14, 8}, { 904, 14, 9}, { 903, 14, 9}, { 902, 14, 10}, { 899, 14, 10}, { 822, 14, 11}, { 818, 14, 11}, { 155, 14, 12}, { 147, 14, 12}, { 579, 14, 13}, { 575, 14, 13}, { 601, 14, 14}, { 602, 14, 14}, { 588, 14, 14}, { 574, 14, 15}, { 573, 14, 15}, { 363, 14, 16}, { 354, 14, 16}, { 249, 14, 17}, { 212, 14, 17}, { 248, 14, 18}, { 202, 14, 18}, { 987, 14, 19}, { 986, 14, 19}, { 730, 14, 20}, { 227, 14, 20}, { 270, 14, 21}, { 390, 14, 21}, { 698, 14, 22}, { 690, 14, 22}, { 381, 14, 23}, { 274, 14, 23}, { 370, 14, 24}, { 947, 14, 24}, { 159, 14, 25}, { 145, 14, 25}, { 250, 14, 26}, { 201, 14, 26}, {1018, 14, 27}, { 967, 14, 27}, {1152, 14, 28}, {1151, 14, 28}, { 797, 14, 29}, { 801, 14, 29}, {1119, 14, 30}, {1116, 14, 30}, { 617, 14, 31}, { 624, 14, 32}, { 623, 14, 33}, { 537, 14, 34}, { 538, 14, 35}, { 352, 14, 36}, { 388, 14, 36}, { 560, 14, 37}, { 571, 14, 37}, { 371, 14, 38}, { 326, 14, 38}, { 924, 14, 39}, { 929, 14, 39}, { 807, 15, 0}, { 822, 15, 1}, { 818, 15, 1}, { 438, 15, 2}, { 432, 15, 2}, { 421, 15, 3}, { 420, 15, 3}, { 788, 16, 0}, { 0, 16, 1}, { 1, 16, 2}, { 4, 16, 3}, { 3, 16, 4}, { 12, 16, 5}, { 11, 16, 6}, { 10, 16, 7}, { 9, 16, 8}, { 72, 16, 9}, { 8, 16, 10}, { 7, 16, 11}, { 6, 16, 12}, { 76, 16, 13}, { 42, 16, 14}, { 5, 16, 15}, { 75, 16, 16}, { 109, 16, 17}, { 41, 16, 18}, { 74, 16, 19}, { 91, 16, 20}, { 108, 16, 21}, { 121, 16, 22}, { 2, 16, 23}, { 73, 16, 24}, { 40, 16, 25}, { 107, 16, 26}, { 71, 16, 27}, { 120, 16, 28}, { 90, 16, 29}, { 133, 16, 30}, { 106, 16, 31}, { 23, 16, 32}, { 114, 16, 33}, { 29, 16, 34}, { 119, 16, 35}, { 34, 16, 36}, { 126, 16, 37}, { 37, 16, 38}, { 132, 16, 39}, { 13, 16, 40}, { 22, 16, 41}, { 25, 16, 42}, { 28, 16, 43}, { 32, 16, 44}, { 33, 16, 45}, { 35, 16, 46}, { 36, 16, 47}, { 38, 16, 48}, { 39, 16, 49}, { 43, 16, 50}, { 48, 16, 51}, { 53, 16, 52}, { 59, 16, 53}, { 64, 16, 54}, { 66, 16, 55}, { 67, 16, 56}, { 68, 16, 57}, { 69, 16, 58}, { 70, 16, 59}, { 77, 16, 60}, { 81, 16, 61}, { 82, 16, 62}, { 83, 16, 63}, { 84, 16, 64}, { 85, 16, 65}, { 86, 16, 66}, { 87, 16, 67}, { 88, 16, 68}, { 89, 16, 69}, { 92, 16, 70}, { 96, 16, 71}, { 97, 16, 72}, { 98, 16, 73}, { 100, 16, 74}, { 101, 16, 75}, { 102, 16, 76}, { 103, 16, 77}, { 104, 16, 78}, { 105, 16, 79}, { 110, 16, 80}, { 115, 16, 81}, { 122, 16, 82}, { 127, 16, 83}, { 134, 16, 84}, { 14, 16, 85}, { 44, 16, 86}, { 78, 16, 87}, { 93, 16, 88}, { 111, 16, 89}, { 116, 16, 90}, { 123, 16, 91}, { 128, 16, 92}, { 135, 16, 93}, { 15, 16, 94}, { 45, 16, 95}, { 79, 16, 96}, { 94, 16, 97}, { 112, 16, 98}, { 117, 16, 99}, { 124, 16, 100}, { 129, 16, 101}, { 136, 16, 102}, { 16, 16, 103}, { 46, 16, 104}, { 80, 16, 105}, { 95, 16, 106}, { 113, 16, 107}, { 118, 16, 108}, { 125, 16, 109}, { 130, 16, 110}, { 137, 16, 111}, { 17, 16, 112}, { 51, 16, 113}, { 99, 16, 114}, { 18, 16, 115}, { 19, 16, 116}, { 787, 17, 0}, { 930, 17, 1}, { 678, 17, 2}, {1103, 17, 3}, { 679, 17, 4}, {1064, 17, 5}, { 238, 17, 6}, {1065, 17, 7}, {1069, 17, 8}, {1067, 17, 9}, {1068, 17, 10}, { 239, 17, 11}, {1066, 17, 12}, { 871, 17, 13}, { 603, 17, 14}, { 854, 18, 0}, { 226, 18, 1}, {1102, 18, 2}, { 197, 18, 3}, { 819, 18, 4}, {1101, 18, 5}, {1106, 18, 6}, {1105, 18, 7}, {1104, 18, 8}, { 378, 18, 9}, { 373, 18, 10}, { 374, 18, 11}, { 379, 18, 12}, { 380, 18, 13}, { 377, 18, 14}, { 375, 18, 15}, { 376, 18, 16}, { 775, 18, 17}, {1062, 18, 18}, {1063, 18, 19}, { 925, 18, 20}, }; /* property values: 4976 bytes. */ /* Codepoints which expand on full case-folding. */ RE_UINT16 re_expand_on_folding[] = { 223, 304, 329, 496, 912, 944, 1415, 7830, 7831, 7832, 7833, 7834, 7838, 8016, 8018, 8020, 8022, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8114, 8115, 8116, 8118, 8119, 8124, 8130, 8131, 8132, 8134, 8135, 8140, 8146, 8147, 8150, 8151, 8162, 8163, 8164, 8166, 8167, 8178, 8179, 8180, 8182, 8183, 8188, 64256, 64257, 64258, 64259, 64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279, }; /* expand_on_folding: 208 bytes. */ /* General_Category. */ static RE_UINT8 re_general_category_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 14, 14, 14, 15, 16, 17, 18, 19, 20, 19, 21, 19, 19, 19, 19, 19, 19, 22, 19, 19, 19, 19, 19, 19, 19, 19, 23, 19, 19, 19, 24, 19, 19, 25, 26, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 7, 28, 29, 19, 19, 19, 19, 19, 19, 19, 30, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 31, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 32, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 32, }; static RE_UINT8 re_general_category_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 69, 72, 73, 69, 69, 64, 74, 64, 64, 75, 76, 77, 78, 79, 80, 81, 82, 69, 83, 84, 85, 86, 87, 88, 89, 69, 69, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 90, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 91, 92, 34, 34, 34, 34, 34, 34, 34, 34, 93, 34, 34, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 34, 34, 109, 110, 111, 112, 34, 34, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 76, 123, 124, 125, 126, 127, 76, 76, 76, 76, 76, 76, 128, 76, 129, 130, 131, 76, 132, 76, 133, 76, 76, 76, 134, 76, 76, 76, 135, 136, 137, 138, 76, 76, 76, 76, 76, 76, 76, 76, 76, 139, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 34, 34, 140, 76, 141, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 34, 34, 34, 34, 142, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 143, 76, 76, 76, 76, 76, 76, 76, 76, 76, 144, 145, 146, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 69, 147, 148, 149, 150, 76, 151, 76, 152, 153, 154, 155, 156, 157, 158, 159, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 160, 161, 76, 76, 162, 163, 164, 165, 166, 76, 167, 168, 169, 170, 171, 172, 173, 174, 175, 76, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 176, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 177, 34, 178, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 178, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 179, 76, 180, 181, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 182, }; static RE_UINT16 re_general_category_stage_3[] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, 13, 13, 42, 43, 9, 44, 45, 11, 46, 47, 32, 48, 49, 50, 51, 52, 53, 54, 50, 50, 55, 32, 56, 57, 50, 50, 50, 50, 50, 58, 59, 60, 61, 62, 50, 32, 63, 50, 50, 50, 50, 50, 64, 65, 66, 50, 67, 68, 50, 69, 70, 71, 50, 72, 73, 73, 73, 73, 74, 73, 73, 73, 75, 76, 77, 50, 50, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 84, 85, 92, 93, 94, 95, 96, 97, 98, 85, 99, 100, 101, 89, 102, 83, 84, 85, 103, 104, 105, 89, 106, 107, 108, 109, 110, 111, 112, 95, 113, 114, 115, 85, 116, 117, 118, 89, 119, 120, 115, 85, 121, 122, 123, 89, 124, 120, 115, 50, 125, 126, 127, 89, 128, 129, 130, 50, 131, 132, 133, 73, 134, 135, 50, 50, 136, 137, 138, 73, 73, 139, 140, 141, 142, 143, 144, 73, 73, 145, 146, 147, 148, 149, 50, 150, 151, 152, 153, 32, 154, 155, 156, 73, 73, 50, 50, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 50, 50, 166, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 167, 168, 50, 50, 167, 50, 50, 169, 170, 171, 50, 50, 50, 170, 50, 50, 50, 172, 173, 174, 50, 175, 50, 50, 50, 50, 50, 176, 177, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 178, 50, 179, 180, 50, 50, 50, 50, 181, 182, 183, 184, 50, 185, 50, 186, 183, 187, 50, 50, 50, 188, 189, 190, 191, 192, 193, 191, 50, 50, 194, 50, 50, 195, 50, 50, 196, 50, 50, 50, 50, 197, 50, 150, 198, 199, 200, 50, 201, 176, 50, 50, 202, 203, 204, 205, 206, 206, 50, 207, 50, 50, 50, 208, 209, 210, 191, 191, 211, 73, 73, 73, 73, 73, 212, 50, 50, 213, 214, 159, 215, 216, 217, 50, 218, 66, 50, 50, 219, 220, 50, 50, 221, 222, 223, 66, 50, 224, 73, 73, 73, 73, 225, 226, 227, 228, 11, 11, 229, 27, 27, 27, 230, 231, 11, 232, 27, 27, 32, 32, 233, 234, 13, 13, 13, 13, 13, 13, 13, 13, 13, 235, 13, 13, 13, 13, 13, 13, 236, 237, 236, 236, 237, 238, 236, 239, 240, 240, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 73, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 267, 268, 269, 270, 206, 271, 272, 206, 273, 274, 274, 274, 274, 274, 274, 274, 274, 275, 206, 276, 206, 206, 206, 206, 277, 206, 278, 274, 279, 206, 280, 281, 282, 206, 206, 283, 73, 284, 73, 266, 266, 266, 285, 206, 206, 206, 206, 286, 266, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 287, 288, 206, 206, 289, 206, 206, 206, 206, 206, 206, 290, 206, 291, 206, 206, 206, 206, 206, 292, 293, 266, 294, 206, 206, 295, 274, 296, 274, 297, 298, 274, 274, 274, 299, 274, 300, 206, 206, 206, 274, 301, 175, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 9, 9, 302, 11, 11, 303, 304, 305, 13, 13, 13, 13, 13, 13, 306, 307, 11, 11, 308, 50, 50, 50, 309, 310, 50, 311, 312, 312, 312, 312, 32, 32, 313, 314, 315, 316, 73, 73, 73, 73, 206, 317, 206, 206, 206, 206, 206, 282, 206, 206, 206, 206, 206, 318, 73, 319, 320, 321, 322, 323, 135, 50, 50, 50, 50, 324, 177, 50, 50, 50, 50, 325, 326, 50, 201, 135, 50, 50, 50, 50, 327, 328, 50, 51, 206, 206, 282, 50, 206, 329, 330, 206, 331, 332, 206, 206, 330, 206, 206, 332, 206, 206, 206, 329, 50, 50, 50, 197, 206, 206, 206, 206, 50, 50, 50, 50, 150, 73, 73, 73, 50, 333, 50, 50, 50, 50, 50, 50, 150, 206, 206, 206, 283, 50, 50, 224, 334, 50, 335, 73, 13, 13, 336, 337, 13, 338, 50, 50, 50, 50, 339, 340, 31, 341, 342, 343, 13, 13, 13, 344, 345, 346, 347, 73, 73, 73, 73, 348, 349, 50, 350, 351, 50, 50, 50, 352, 353, 50, 50, 354, 355, 191, 32, 356, 66, 50, 357, 50, 358, 359, 50, 150, 77, 50, 50, 360, 361, 362, 73, 73, 50, 50, 363, 364, 365, 366, 50, 367, 50, 50, 50, 368, 369, 370, 371, 372, 373, 374, 312, 73, 73, 73, 73, 73, 73, 73, 73, 73, 50, 50, 375, 191, 50, 50, 376, 50, 377, 50, 50, 202, 378, 378, 378, 378, 378, 378, 378, 378, 379, 379, 379, 379, 379, 379, 379, 379, 50, 50, 50, 50, 50, 50, 201, 50, 50, 50, 50, 50, 50, 380, 73, 73, 381, 382, 383, 384, 385, 50, 50, 50, 50, 50, 50, 386, 387, 388, 50, 50, 50, 50, 50, 389, 73, 50, 50, 50, 50, 390, 50, 50, 195, 73, 73, 391, 32, 392, 233, 393, 394, 395, 396, 397, 50, 50, 50, 50, 50, 50, 50, 398, 399, 2, 3, 4, 5, 400, 401, 402, 50, 403, 50, 327, 404, 405, 406, 407, 408, 50, 171, 409, 201, 201, 73, 73, 50, 50, 50, 50, 50, 50, 50, 51, 410, 266, 266, 411, 267, 267, 267, 412, 413, 319, 73, 73, 73, 206, 206, 414, 50, 150, 50, 50, 50, 101, 73, 73, 50, 327, 415, 50, 416, 73, 73, 73, 50, 417, 50, 50, 418, 419, 73, 73, 9, 9, 420, 11, 11, 50, 50, 50, 50, 201, 191, 73, 73, 73, 73, 73, 421, 50, 50, 422, 50, 423, 73, 73, 50, 424, 50, 425, 73, 73, 73, 73, 50, 50, 50, 426, 73, 73, 73, 73, 427, 428, 50, 429, 430, 431, 50, 432, 50, 50, 50, 433, 50, 434, 50, 435, 50, 50, 50, 50, 436, 73, 73, 73, 73, 73, 73, 73, 73, 73, 266, 437, 438, 50, 50, 439, 440, 441, 442, 73, 217, 50, 50, 443, 444, 50, 436, 191, 445, 50, 446, 447, 448, 73, 73, 73, 217, 50, 50, 449, 450, 191, 73, 73, 50, 50, 451, 452, 191, 73, 73, 73, 50, 50, 50, 50, 50, 50, 327, 73, 267, 267, 267, 267, 267, 267, 453, 448, 50, 50, 327, 73, 73, 73, 73, 73, 50, 50, 50, 436, 73, 73, 73, 73, 50, 50, 50, 50, 176, 454, 203, 455, 456, 457, 73, 73, 73, 73, 73, 73, 458, 73, 73, 73, 73, 73, 73, 73, 206, 206, 206, 206, 206, 206, 206, 318, 206, 206, 459, 206, 206, 206, 460, 461, 462, 206, 463, 206, 206, 464, 73, 73, 206, 206, 206, 206, 465, 73, 73, 73, 206, 206, 206, 206, 206, 283, 266, 466, 9, 467, 11, 468, 469, 470, 236, 9, 471, 472, 473, 474, 475, 9, 467, 11, 476, 477, 11, 478, 479, 480, 481, 9, 482, 11, 9, 467, 11, 468, 469, 11, 236, 9, 471, 481, 9, 482, 11, 9, 467, 11, 483, 9, 484, 485, 486, 487, 11, 488, 9, 489, 490, 491, 492, 11, 493, 9, 494, 11, 495, 496, 496, 496, 497, 50, 498, 499, 500, 501, 502, 503, 504, 202, 505, 202, 73, 73, 73, 506, 206, 206, 319, 206, 206, 206, 206, 206, 206, 282, 329, 507, 291, 291, 73, 73, 508, 206, 329, 206, 206, 206, 319, 206, 206, 284, 73, 73, 73, 73, 509, 206, 510, 206, 206, 284, 511, 512, 73, 73, 206, 206, 513, 514, 206, 206, 206, 515, 206, 282, 206, 206, 516, 73, 206, 513, 206, 206, 206, 329, 517, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 518, 206, 206, 206, 464, 282, 206, 519, 73, 73, 73, 73, 73, 73, 73, 73, 520, 206, 206, 206, 206, 521, 73, 73, 73, 206, 206, 206, 206, 318, 73, 73, 73, 206, 206, 206, 206, 206, 206, 206, 282, 50, 50, 50, 50, 50, 311, 73, 73, 50, 50, 50, 176, 50, 50, 50, 50, 50, 201, 73, 73, 73, 73, 73, 73, 522, 73, 523, 523, 523, 523, 523, 523, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 73, 379, 379, 379, 379, 379, 379, 379, 524, }; static RE_UINT8 re_general_category_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 46, 44, 44, 41, 47, 11, 48, 48, 11, 34, 11, 11, 11, 11, 11, 11, 11, 11, 49, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 50, 34, 32, 34, 11, 32, 51, 43, 43, 52, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, 32, 44, 44, 44, 44, 49, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 48, 53, 2, 2, 2, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 55, 56, 44, 57, 58, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 59, 60, 61, 43, 60, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 44, 44, 36, 63, 46, 44, 44, 44, 44, 44, 64, 64, 65, 8, 9, 66, 2, 67, 43, 43, 43, 43, 43, 61, 65, 2, 68, 36, 36, 36, 36, 69, 43, 43, 7, 7, 7, 7, 7, 2, 2, 36, 70, 36, 36, 36, 36, 36, 36, 36, 36, 36, 71, 43, 43, 43, 72, 51, 43, 43, 73, 74, 75, 43, 43, 36, 7, 7, 7, 7, 7, 36, 76, 77, 2, 2, 2, 2, 2, 2, 2, 78, 69, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 79, 80, 36, 36, 36, 36, 43, 43, 43, 43, 43, 70, 44, 44, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 69, 43, 43, 43, 43, 40, 21, 2, 81, 44, 44, 36, 36, 36, 43, 43, 74, 43, 43, 43, 43, 74, 43, 74, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 46, 36, 36, 36, 36, 69, 43, 44, 46, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 62, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 79, 43, 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 82, 70, 83, 84, 43, 43, 43, 82, 83, 84, 83, 69, 43, 43, 43, 36, 36, 36, 36, 36, 43, 2, 7, 7, 7, 7, 7, 85, 36, 36, 36, 80, 36, 36, 36, 58, 83, 80, 36, 36, 36, 62, 80, 62, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 62, 62, 44, 36, 36, 44, 70, 83, 84, 43, 79, 86, 87, 86, 84, 62, 44, 44, 44, 86, 44, 44, 36, 80, 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 88, 44, 44, 58, 82, 80, 36, 36, 62, 44, 80, 62, 36, 80, 62, 36, 44, 79, 83, 84, 79, 44, 58, 79, 58, 43, 44, 58, 44, 44, 44, 80, 36, 62, 62, 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 69, 44, 44, 44, 44, 44, 58, 82, 80, 36, 36, 36, 36, 80, 36, 80, 36, 36, 36, 36, 36, 36, 62, 36, 80, 36, 36, 44, 70, 83, 84, 43, 43, 58, 82, 86, 84, 44, 62, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 44, 44, 44, 44, 62, 36, 80, 36, 36, 44, 70, 84, 84, 43, 79, 86, 87, 86, 84, 44, 44, 44, 44, 82, 44, 44, 36, 80, 77, 27, 27, 27, 44, 44, 44, 44, 44, 70, 80, 36, 36, 62, 44, 36, 62, 36, 36, 44, 80, 62, 62, 36, 44, 80, 62, 44, 36, 62, 44, 36, 36, 36, 36, 36, 36, 44, 44, 83, 82, 87, 44, 83, 87, 83, 84, 44, 62, 44, 44, 86, 44, 44, 44, 44, 27, 89, 67, 67, 88, 90, 44, 44, 86, 83, 80, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 44, 80, 43, 82, 83, 87, 43, 79, 43, 43, 44, 44, 44, 58, 79, 36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 89, 44, 83, 80, 36, 36, 36, 62, 36, 36, 36, 80, 36, 36, 44, 70, 84, 83, 83, 87, 82, 87, 83, 43, 44, 44, 44, 86, 87, 44, 44, 44, 62, 80, 62, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 62, 80, 83, 84, 43, 79, 83, 87, 83, 84, 62, 44, 44, 44, 86, 44, 44, 44, 44, 27, 27, 27, 44, 91, 36, 36, 36, 44, 83, 80, 36, 36, 36, 36, 36, 36, 36, 36, 62, 44, 36, 36, 36, 36, 80, 36, 36, 36, 36, 80, 44, 36, 36, 36, 62, 44, 79, 44, 86, 83, 43, 79, 79, 83, 83, 83, 83, 44, 83, 46, 44, 44, 44, 44, 44, 80, 36, 36, 36, 36, 36, 36, 36, 69, 36, 43, 43, 43, 79, 44, 57, 36, 36, 36, 74, 43, 43, 43, 61, 7, 7, 7, 7, 7, 2, 44, 44, 80, 62, 62, 80, 62, 62, 80, 44, 44, 44, 36, 36, 80, 36, 36, 36, 80, 36, 80, 80, 44, 36, 80, 36, 69, 36, 43, 43, 43, 58, 70, 44, 36, 36, 62, 81, 43, 43, 43, 44, 7, 7, 7, 7, 7, 44, 36, 36, 76, 67, 2, 2, 2, 2, 2, 2, 2, 92, 92, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 51, 51, 51, 4, 4, 83, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 44, 58, 43, 43, 43, 43, 43, 43, 82, 43, 43, 61, 43, 36, 36, 69, 43, 43, 43, 43, 43, 58, 43, 43, 43, 43, 43, 43, 43, 43, 43, 79, 67, 67, 67, 67, 75, 67, 67, 90, 67, 2, 2, 92, 67, 21, 46, 44, 44, 36, 36, 36, 36, 36, 93, 84, 43, 82, 43, 43, 43, 84, 82, 84, 70, 7, 7, 7, 7, 7, 2, 2, 2, 36, 36, 36, 83, 43, 36, 36, 43, 70, 83, 94, 93, 83, 83, 83, 36, 69, 43, 70, 36, 36, 36, 36, 36, 36, 82, 84, 82, 83, 83, 84, 93, 7, 7, 7, 7, 7, 83, 84, 67, 11, 11, 11, 49, 44, 44, 49, 44, 36, 36, 36, 36, 36, 63, 68, 36, 36, 36, 36, 36, 62, 36, 36, 44, 36, 36, 36, 62, 62, 36, 36, 44, 62, 36, 36, 44, 36, 36, 36, 62, 62, 36, 36, 44, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 58, 43, 2, 2, 2, 2, 95, 27, 27, 27, 27, 27, 27, 27, 27, 27, 96, 44, 67, 67, 67, 67, 67, 44, 44, 44, 36, 36, 62, 44, 44, 44, 44, 44, 97, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 63, 71, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 99, 100, 44, 36, 36, 36, 36, 36, 63, 2, 101, 102, 44, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 62, 36, 36, 43, 79, 44, 44, 44, 44, 44, 36, 43, 61, 46, 44, 44, 44, 44, 36, 43, 44, 44, 44, 44, 44, 44, 62, 43, 44, 44, 44, 44, 44, 44, 36, 36, 43, 84, 43, 43, 43, 83, 83, 83, 83, 82, 84, 43, 43, 43, 43, 43, 2, 85, 2, 66, 69, 44, 7, 7, 7, 7, 7, 44, 44, 44, 27, 27, 27, 27, 27, 44, 44, 44, 2, 2, 2, 103, 2, 60, 43, 65, 36, 104, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 69, 62, 44, 44, 36, 36, 36, 44, 44, 44, 44, 44, 43, 82, 83, 84, 82, 83, 44, 44, 83, 82, 83, 83, 84, 43, 44, 44, 90, 44, 2, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 36, 36, 36, 36, 44, 44, 83, 83, 83, 83, 83, 83, 83, 83, 94, 36, 36, 36, 83, 44, 44, 44, 7, 7, 7, 7, 7, 96, 44, 67, 67, 67, 67, 67, 67, 67, 67, 67, 36, 36, 36, 69, 82, 84, 44, 2, 36, 36, 93, 82, 43, 43, 43, 79, 82, 82, 84, 43, 43, 43, 82, 83, 83, 84, 43, 43, 43, 43, 79, 58, 2, 2, 2, 85, 2, 2, 2, 44, 43, 43, 94, 36, 36, 36, 36, 36, 36, 36, 82, 43, 43, 82, 82, 83, 83, 82, 94, 36, 36, 36, 44, 44, 92, 67, 67, 67, 67, 51, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44, 43, 94, 36, 36, 36, 36, 36, 36, 93, 43, 43, 83, 43, 84, 83, 36, 36, 36, 36, 82, 43, 83, 84, 84, 43, 83, 44, 44, 44, 44, 2, 2, 36, 36, 83, 83, 83, 83, 43, 43, 43, 43, 83, 43, 44, 55, 2, 2, 7, 7, 7, 7, 7, 44, 80, 36, 36, 36, 36, 36, 40, 40, 40, 2, 2, 2, 2, 2, 44, 44, 44, 44, 43, 61, 43, 43, 43, 43, 43, 43, 82, 43, 43, 43, 70, 36, 69, 36, 36, 83, 70, 62, 44, 44, 44, 44, 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16, 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16, 105, 40, 40, 43, 43, 43, 79, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44, 16, 16, 16, 16, 49, 49, 49, 49, 16, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16, 16, 106, 106, 106, 106, 16, 16, 107, 16, 11, 11, 108, 109, 41, 16, 107, 16, 11, 11, 108, 41, 16, 16, 44, 16, 11, 11, 110, 41, 16, 16, 16, 16, 11, 11, 111, 41, 44, 16, 107, 16, 11, 11, 108, 112, 113, 113, 113, 113, 113, 114, 64, 64, 115, 115, 115, 2, 116, 117, 116, 117, 2, 2, 2, 2, 118, 64, 64, 119, 2, 2, 2, 2, 120, 121, 2, 122, 123, 2, 124, 125, 2, 2, 2, 2, 2, 9, 123, 2, 2, 2, 2, 126, 64, 64, 65, 64, 64, 64, 64, 64, 127, 44, 27, 27, 27, 8, 124, 128, 27, 27, 27, 27, 27, 8, 124, 100, 40, 40, 40, 40, 40, 40, 81, 44, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 129, 44, 44, 43, 43, 43, 43, 43, 43, 130, 52, 131, 52, 131, 43, 43, 43, 43, 43, 79, 44, 44, 44, 44, 44, 44, 44, 67, 132, 67, 133, 67, 34, 11, 16, 11, 32, 133, 67, 50, 11, 11, 67, 67, 67, 132, 132, 132, 11, 11, 134, 11, 11, 35, 36, 39, 67, 16, 11, 8, 8, 50, 16, 16, 26, 67, 135, 27, 27, 27, 27, 27, 27, 27, 27, 101, 101, 101, 101, 101, 101, 101, 101, 101, 136, 137, 101, 138, 44, 44, 44, 8, 8, 139, 67, 67, 8, 67, 67, 139, 26, 67, 139, 67, 67, 67, 139, 67, 67, 67, 67, 67, 67, 67, 8, 67, 139, 139, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67, 140, 141, 67, 67, 67, 67, 67, 67, 67, 67, 139, 67, 67, 67, 67, 67, 67, 26, 8, 8, 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 44, 44, 44, 44, 67, 67, 67, 67, 67, 90, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67, 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, 67, 67, 67, 67, 67, 67, 67, 26, 91, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 4, 4, 4, 4, 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 8, 8, 124, 142, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 8, 124, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 8, 8, 8, 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 139, 26, 8, 8, 144, 44, 11, 11, 11, 11, 11, 11, 11, 48, 16, 16, 16, 16, 16, 16, 16, 107, 32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11, 32, 32, 135, 67, 67, 133, 34, 145, 43, 32, 44, 44, 55, 2, 95, 2, 16, 16, 16, 54, 44, 44, 54, 44, 36, 36, 36, 36, 44, 44, 44, 53, 46, 44, 44, 44, 44, 44, 44, 58, 36, 36, 36, 62, 44, 44, 44, 44, 36, 36, 36, 62, 36, 36, 36, 62, 2, 116, 116, 2, 120, 121, 116, 2, 2, 2, 2, 6, 2, 103, 116, 2, 116, 4, 4, 4, 4, 2, 2, 85, 2, 2, 2, 2, 2, 115, 44, 44, 67, 67, 67, 67, 67, 91, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44, 1, 2, 146, 147, 4, 4, 4, 4, 4, 67, 4, 4, 4, 4, 148, 149, 150, 101, 101, 101, 101, 43, 43, 83, 151, 40, 40, 67, 101, 152, 63, 67, 36, 36, 36, 62, 58, 153, 154, 68, 36, 36, 36, 36, 36, 63, 40, 68, 44, 44, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, 155, 27, 27, 27, 27, 27, 27, 27, 36, 36, 104, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 156, 2, 7, 7, 7, 7, 7, 36, 44, 44, 32, 32, 32, 32, 32, 32, 32, 69, 52, 157, 43, 43, 43, 43, 43, 85, 32, 32, 32, 32, 44, 44, 44, 58, 36, 36, 36, 101, 101, 101, 101, 101, 43, 2, 2, 2, 44, 44, 44, 44, 41, 41, 41, 154, 40, 40, 40, 40, 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42, 158, 34, 107, 32, 32, 44, 44, 44, 44, 44, 44, 32, 32, 32, 32, 32, 48, 44, 44, 44, 44, 44, 44, 40, 35, 36, 36, 36, 70, 36, 70, 36, 69, 36, 36, 36, 93, 84, 82, 67, 67, 44, 44, 27, 27, 27, 67, 159, 44, 44, 44, 36, 36, 2, 2, 44, 44, 44, 44, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 83, 83, 83, 83, 83, 83, 83, 79, 44, 44, 44, 44, 2, 43, 36, 36, 36, 2, 71, 44, 44, 36, 36, 36, 43, 43, 43, 43, 2, 36, 36, 36, 69, 43, 43, 43, 43, 43, 83, 44, 44, 44, 44, 44, 55, 36, 69, 83, 43, 43, 83, 82, 83, 160, 2, 2, 2, 2, 2, 2, 53, 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 36, 36, 69, 43, 43, 82, 84, 82, 84, 79, 44, 44, 44, 44, 36, 69, 36, 36, 36, 36, 82, 44, 7, 7, 7, 7, 7, 44, 2, 2, 68, 36, 36, 76, 67, 93, 44, 44, 70, 43, 70, 69, 70, 36, 36, 43, 69, 62, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 80, 104, 2, 36, 36, 36, 36, 36, 93, 43, 83, 2, 104, 161, 79, 44, 44, 44, 44, 80, 36, 36, 62, 80, 36, 36, 62, 80, 36, 36, 62, 44, 44, 44, 44, 36, 93, 84, 83, 82, 160, 84, 44, 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 62, 44, 80, 36, 36, 162, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163, 36, 36, 36, 36, 36, 44, 44, 44, 16, 16, 16, 107, 44, 44, 44, 44, 44, 54, 16, 16, 44, 44, 80, 70, 36, 36, 36, 36, 164, 36, 36, 36, 36, 36, 36, 62, 36, 36, 62, 62, 36, 80, 62, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 4, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 159, 44, 2, 2, 2, 165, 125, 44, 44, 44, 6, 166, 167, 143, 143, 143, 143, 143, 143, 143, 125, 165, 125, 2, 122, 168, 2, 46, 2, 2, 148, 143, 143, 125, 2, 169, 8, 144, 66, 2, 44, 44, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 78, 55, 2, 3, 2, 4, 5, 6, 2, 16, 16, 16, 16, 16, 17, 18, 124, 125, 4, 2, 36, 36, 36, 36, 36, 68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 62, 44, 20, 170, 88, 129, 26, 8, 139, 90, 44, 44, 44, 44, 78, 64, 67, 44, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 62, 36, 80, 2, 46, 44, 171, 27, 27, 27, 27, 27, 27, 44, 91, 67, 67, 67, 67, 101, 101, 138, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 96, 44, 44, 67, 67, 67, 67, 67, 67, 51, 44, 27, 27, 44, 44, 44, 44, 44, 44, 147, 36, 36, 36, 36, 102, 44, 44, 36, 36, 36, 36, 36, 36, 36, 55, 36, 36, 44, 44, 36, 36, 36, 36, 172, 101, 101, 44, 44, 44, 44, 44, 11, 11, 11, 11, 16, 16, 16, 16, 36, 36, 36, 44, 62, 36, 36, 36, 36, 36, 36, 80, 62, 44, 62, 80, 36, 36, 36, 55, 27, 27, 27, 27, 36, 36, 36, 27, 27, 27, 44, 55, 36, 36, 36, 36, 36, 44, 44, 55, 36, 36, 36, 36, 44, 44, 44, 36, 69, 43, 58, 79, 44, 44, 43, 43, 36, 36, 80, 36, 80, 36, 36, 36, 36, 36, 44, 44, 43, 79, 44, 58, 27, 27, 27, 27, 44, 44, 44, 44, 2, 2, 2, 2, 46, 44, 44, 44, 36, 36, 36, 36, 36, 36, 173, 30, 36, 36, 36, 44, 55, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27, 36, 62, 44, 44, 27, 27, 27, 27, 36, 36, 36, 36, 62, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27, 96, 84, 94, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 61, 2, 2, 2, 44, 44, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 7, 7, 7, 83, 84, 43, 82, 84, 61, 174, 2, 2, 44, 44, 44, 44, 44, 44, 44, 43, 70, 36, 36, 36, 36, 36, 36, 36, 36, 36, 69, 43, 43, 84, 43, 43, 43, 79, 7, 7, 7, 7, 7, 2, 2, 44, 44, 44, 44, 44, 44, 36, 93, 83, 43, 43, 43, 43, 82, 94, 36, 63, 2, 46, 44, 44, 44, 36, 36, 36, 36, 36, 69, 84, 83, 43, 43, 43, 84, 44, 44, 44, 44, 101, 102, 44, 44, 44, 44, 44, 44, 93, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 87, 44, 44, 44, 44, 44, 44, 44, 58, 43, 73, 40, 40, 40, 40, 40, 40, 36, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 91, 67, 67, 67, 67, 67, 175, 84, 43, 67, 175, 83, 83, 176, 64, 64, 64, 177, 43, 43, 43, 75, 51, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67, 67, 67, 67, 67, 67, 67, 67, 44, 67, 43, 75, 44, 44, 44, 44, 44, 27, 44, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 16, 16, 107, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 48, 11, 44, 48, 49, 48, 49, 11, 48, 11, 11, 11, 11, 16, 16, 54, 54, 16, 16, 16, 54, 16, 16, 16, 16, 16, 16, 16, 11, 49, 11, 48, 49, 11, 11, 11, 48, 11, 11, 11, 48, 16, 16, 16, 16, 16, 11, 49, 11, 48, 11, 11, 48, 48, 44, 11, 11, 11, 48, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7, 7, 7, 7, 7, 7, 7, 7, 7, 36, 36, 80, 36, 36, 36, 36, 36, 80, 62, 62, 80, 80, 36, 36, 36, 36, 62, 36, 36, 80, 80, 44, 44, 44, 62, 44, 80, 80, 80, 80, 36, 80, 62, 62, 80, 80, 80, 80, 80, 80, 62, 62, 80, 36, 62, 36, 36, 36, 62, 36, 36, 80, 36, 62, 62, 36, 36, 36, 36, 36, 80, 36, 36, 80, 36, 80, 36, 36, 80, 36, 36, 8, 44, 44, 44, 44, 44, 44, 44, 91, 67, 67, 67, 67, 67, 67, 90, 27, 27, 27, 27, 27, 96, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 90, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, 90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 91, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, 67, 67, 90, 67, 67, 90, 44, 44, 90, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 91, 67, 90, 44, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 44, 44, 44, 91, 67, 67, 90, 44, 91, 67, 67, 67, 67, 67, 78, 44, 44, 44, 44, 44, 44, 44, 64, 64, 64, 64, 64, 64, 64, 64, 163, 163, 163, 163, 163, 163, 163, 44, }; static RE_UINT8 re_general_category_stage_5[] = { 15, 15, 12, 23, 23, 23, 25, 23, 20, 21, 23, 24, 23, 19, 9, 9, 24, 24, 24, 23, 23, 1, 1, 1, 1, 20, 23, 21, 26, 22, 26, 2, 2, 2, 2, 20, 24, 21, 24, 15, 25, 25, 27, 23, 26, 27, 5, 28, 24, 16, 27, 26, 27, 24, 11, 11, 26, 11, 5, 29, 11, 23, 1, 24, 1, 2, 2, 24, 2, 1, 2, 5, 5, 5, 1, 3, 3, 2, 5, 2, 4, 4, 26, 26, 4, 26, 6, 6, 0, 0, 4, 2, 23, 0, 1, 23, 1, 0, 0, 1, 24, 1, 27, 6, 7, 7, 0, 4, 0, 2, 0, 23, 19, 0, 0, 25, 0, 6, 19, 6, 23, 6, 6, 23, 5, 0, 5, 23, 16, 16, 16, 0, 23, 25, 27, 27, 4, 5, 5, 6, 6, 5, 23, 5, 6, 16, 6, 4, 4, 6, 6, 27, 5, 27, 27, 5, 0, 16, 6, 0, 0, 5, 4, 0, 6, 8, 8, 8, 8, 6, 23, 4, 0, 8, 8, 0, 27, 25, 11, 27, 27, 0, 0, 27, 23, 27, 5, 8, 8, 5, 23, 11, 11, 0, 19, 5, 12, 5, 5, 20, 21, 0, 10, 10, 10, 0, 19, 23, 5, 4, 2, 4, 3, 3, 2, 0, 3, 26, 2, 26, 0, 26, 1, 26, 26, 0, 12, 12, 12, 16, 19, 19, 28, 29, 20, 28, 13, 14, 16, 12, 23, 28, 29, 23, 23, 22, 22, 23, 24, 20, 21, 23, 23, 12, 11, 4, 21, 4, 25, 0, 6, 7, 7, 6, 1, 27, 27, 1, 27, 2, 2, 27, 10, 1, 2, 10, 10, 11, 24, 27, 27, 20, 21, 27, 21, 24, 21, 20, 24, 0, 2, 6, 27, 4, 5, 10, 19, 20, 21, 21, 27, 10, 19, 4, 10, 4, 6, 26, 26, 4, 27, 11, 4, 23, 7, 23, 26, 1, 25, 27, 8, 23, 4, 8, 18, 18, 17, 17, 5, 24, 23, 20, 19, 22, 22, 20, 22, 22, 24, 19, 24, 26, 0, 11, 23, 10, 5, 11, 23, 16, 27, 8, 8, 16, 16, 6, }; /* General_Category: 8556 bytes. */ RE_UINT32 re_get_general_category(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 11; code = ch ^ (f << 11); pos = (RE_UINT32)re_general_category_stage_1[f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_general_category_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_general_category_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_general_category_stage_4[pos + f] << 1; value = re_general_category_stage_5[pos + code]; return value; } /* Block. */ static RE_UINT8 re_block_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 12, 12, 12, 13, 14, 15, 15, 15, 16, 17, 18, 19, 20, 21, 20, 22, 20, 20, 20, 20, 20, 20, 23, 20, 20, 20, 20, 20, 20, 20, 20, 24, 20, 20, 20, 25, 20, 20, 26, 27, 20, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 30, 31, 32, 20, 20, 20, 20, 20, 20, 20, 33, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 34, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, }; static RE_UINT8 re_block_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 31, 32, 32, 32, 33, 34, 34, 34, 34, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 51, 52, 53, 54, 55, 56, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 65, 66, 67, 68, 68, 69, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 82, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 89, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 104, 104, 104, 104, 104, 104, 104, 105, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 109, 110, 110, 110, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 119, 119, 119, 119, 119, 119, 125, 119, 126, 127, 128, 119, 129, 119, 130, 119, 119, 119, 131, 119, 119, 119, 132, 133, 134, 135, 119, 119, 119, 119, 119, 119, 119, 119, 119, 136, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 137, 137, 137, 137, 137, 137, 137, 137, 138, 119, 119, 119, 119, 119, 119, 119, 139, 139, 139, 139, 139, 139, 139, 139, 140, 119, 119, 119, 119, 119, 119, 119, 141, 141, 141, 141, 142, 119, 119, 119, 119, 119, 119, 119, 119, 119, 143, 144, 145, 145, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 146, 146, 147, 147, 148, 119, 149, 119, 150, 150, 150, 150, 150, 150, 150, 150, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 151, 151, 119, 119, 152, 153, 154, 154, 155, 155, 156, 156, 156, 156, 156, 156, 157, 158, 159, 119, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 163, 164, 165, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 166, 166, 166, 166, 167, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 168, 119, 169, 170, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, }; static RE_UINT8 re_block_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 52, 52, 53, 53, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 19, 19, 19, 19, 19, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 19, 19, 19, 19, 61, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 86, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 19, 102, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 106, 106, 106, 107, 107, 107, 107, 107, 107, 108, 109, 109, 110, 110, 110, 111, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 126, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 129, 129, 130, 130, 130, 131, 131, 131, 132, 132, 133, 133, 133, 133, 133, 133, 19, 19, 134, 134, 134, 134, 134, 134, 135, 135, 136, 136, 136, 136, 136, 136, 137, 137, 138, 138, 138, 19, 19, 19, 19, 19, 19, 19, 19, 19, 139, 139, 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, 144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 150, 151, 152, 152, 153, 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, 162, 19, 19, 19, 19, 19, 19, 19, 19, 163, 163, 164, 164, 164, 164, 19, 19, 165, 165, 165, 166, 166, 19, 19, 19, 167, 167, 168, 168, 168, 168, 19, 19, 169, 169, 169, 169, 169, 170, 170, 170, 171, 171, 171, 19, 19, 19, 19, 19, 172, 172, 172, 172, 173, 173, 19, 19, 174, 174, 175, 175, 19, 19, 19, 19, 176, 176, 177, 177, 177, 177, 177, 177, 178, 178, 178, 178, 178, 178, 179, 179, 180, 180, 180, 180, 181, 181, 182, 182, 183, 183, 183, 183, 183, 19, 19, 19, 19, 19, 19, 19, 19, 19, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, 186, 186, 186, 186, 186, 187, 187, 187, 188, 188, 188, 188, 188, 19, 19, 19, 189, 189, 189, 189, 189, 189, 19, 19, 190, 190, 190, 190, 190, 19, 19, 19, 191, 191, 191, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 19, 19, 19, 19, 19, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 19, 19, 19, 19, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 19, 19, 19, 19, 19, 19, 196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 19, 19, 19, 200, 200, 200, 200, 200, 200, 201, 201, 202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 203, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, 19, 19, 19, 211, 211, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 19, 19, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 19, 19, 19, 19, 19, 19, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 19, 19, 19, 19, 19, 19, 217, 217, 217, 217, 217, 217, 217, 217, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 19, 219, 219, 219, 219, 219, 219, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220, }; static RE_UINT8 re_block_stage_4[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 100, 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108, 109, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 121, 121, 121, 121, 122, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125, 126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133, 134, 134, 134, 134, 135, 135, 135, 135, 136, 136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, 141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 144, 144, 144, 144, 145, 145, 145, 145, 146, 146, 146, 146, 147, 147, 147, 147, 148, 148, 148, 148, 149, 149, 149, 149, 150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153, 154, 154, 154, 154, 155, 155, 155, 155, 156, 156, 156, 156, 157, 157, 157, 157, 158, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, 162, 162, 163, 163, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165, 166, 166, 166, 166, 167, 167, 167, 167, 168, 168, 168, 168, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171, 172, 172, 172, 172, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178, 179, 179, 179, 179, 180, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 188, 188, 189, 189, 189, 189, 190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193, 194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197, 198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201, 202, 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 207, 207, 207, 207, 208, 208, 208, 208, 209, 209, 209, 209, 210, 210, 210, 210, 211, 211, 211, 211, 212, 212, 212, 212, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, 216, 216, 216, 216, 217, 217, 217, 217, 218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, }; static RE_UINT8 re_block_stage_5[] = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 0, 0, 0, 0, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 100, 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108, 109, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 121, 121, 121, 121, 122, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125, 126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133, 134, 134, 134, 134, 135, 135, 135, 135, 136, 136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, 141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 144, 144, 144, 144, 145, 145, 145, 145, 146, 146, 146, 146, 147, 147, 147, 147, 148, 148, 148, 148, 149, 149, 149, 149, 150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153, 154, 154, 154, 154, 155, 155, 155, 155, 156, 156, 156, 156, 157, 157, 157, 157, 158, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, 162, 162, 163, 163, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165, 166, 166, 166, 166, 167, 167, 167, 167, 168, 168, 168, 168, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171, 172, 172, 172, 172, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178, 179, 179, 179, 179, 180, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 188, 188, 189, 189, 189, 189, 190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193, 194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197, 198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201, 202, 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 207, 207, 207, 207, 208, 208, 208, 208, 209, 209, 209, 209, 210, 210, 210, 210, 211, 211, 211, 211, 212, 212, 212, 212, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, 216, 216, 216, 216, 217, 217, 217, 217, 218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, }; /* Block: 4288 bytes. */ RE_UINT32 re_get_block(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 11; code = ch ^ (f << 11); pos = (RE_UINT32)re_block_stage_1[f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_block_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_block_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_block_stage_4[pos + f] << 2; value = re_block_stage_5[pos + code]; return value; } /* Script. */ static RE_UINT8 re_script_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15, 16, 17, 18, 14, 19, 14, 20, 14, 14, 14, 14, 14, 14, 21, 14, 14, 14, 14, 14, 14, 14, 14, 22, 14, 14, 14, 23, 14, 14, 24, 25, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 26, 7, 27, 28, 14, 14, 14, 14, 14, 14, 14, 29, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 30, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, }; static RE_UINT8 re_script_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 60, 61, 59, 59, 59, 59, 59, 62, 59, 63, 63, 59, 59, 59, 59, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 59, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 81, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 85, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 98, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 72, 72, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 65, 114, 115, 116, 117, 118, 65, 65, 65, 65, 65, 65, 119, 65, 120, 121, 122, 65, 123, 65, 124, 65, 65, 65, 125, 65, 65, 65, 126, 127, 128, 129, 65, 65, 65, 65, 65, 65, 65, 65, 65, 130, 65, 65, 131, 131, 131, 131, 131, 131, 132, 65, 133, 65, 65, 65, 65, 65, 65, 65, 134, 134, 134, 134, 134, 134, 134, 134, 135, 65, 65, 65, 65, 65, 65, 65, 136, 136, 136, 136, 137, 65, 65, 65, 65, 65, 65, 65, 65, 65, 138, 139, 140, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 59, 141, 142, 143, 144, 65, 145, 65, 146, 147, 148, 59, 59, 149, 59, 150, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 151, 152, 65, 65, 153, 154, 155, 156, 157, 65, 158, 159, 160, 161, 162, 163, 164, 165, 60, 65, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 166, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 167, 72, 168, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 72, 72, 72, 72, 168, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 169, 65, 170, 171, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, }; static RE_UINT16 re_script_stage_3[] = { 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 11, 11, 11, 13, 11, 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 17, 18, 19, 17, 18, 20, 21, 22, 22, 23, 22, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 28, 28, 28, 28, 28, 33, 28, 28, 34, 35, 35, 35, 36, 28, 28, 28, 37, 37, 37, 38, 39, 39, 39, 40, 41, 41, 42, 43, 44, 45, 46, 46, 46, 46, 47, 46, 46, 46, 48, 49, 50, 50, 50, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 46, 124, 125, 126, 126, 127, 126, 128, 46, 46, 129, 130, 131, 132, 133, 134, 46, 46, 135, 135, 135, 135, 136, 135, 137, 138, 135, 136, 135, 139, 139, 140, 46, 46, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 143, 142, 142, 144, 145, 145, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 147, 148, 146, 146, 147, 146, 146, 149, 150, 151, 146, 146, 146, 150, 146, 146, 146, 152, 146, 153, 146, 154, 155, 155, 155, 155, 155, 156, 157, 157, 157, 157, 157, 157, 157, 157, 158, 159, 160, 160, 160, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 171, 171, 171, 172, 173, 173, 174, 175, 176, 176, 176, 176, 176, 177, 176, 176, 178, 157, 157, 157, 157, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 187, 188, 187, 189, 190, 171, 171, 191, 192, 193, 193, 193, 194, 193, 195, 196, 196, 197, 46, 46, 46, 46, 46, 198, 198, 198, 198, 199, 198, 198, 200, 201, 201, 201, 201, 202, 202, 202, 203, 204, 204, 204, 205, 206, 207, 207, 207, 46, 46, 46, 46, 208, 209, 210, 211, 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 217, 218, 11, 219, 11, 11, 219, 220, 11, 221, 11, 11, 11, 222, 222, 223, 11, 224, 225, 0, 0, 0, 0, 0, 226, 227, 228, 229, 0, 230, 46, 8, 8, 231, 0, 0, 232, 233, 234, 0, 4, 4, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 237, 46, 230, 46, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 239, 239, 239, 239, 239, 239, 239, 239, 0, 0, 0, 0, 240, 241, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 242, 242, 243, 242, 242, 243, 4, 4, 244, 244, 244, 244, 244, 244, 244, 245, 142, 142, 143, 246, 246, 246, 247, 248, 146, 249, 250, 250, 250, 250, 14, 14, 0, 0, 0, 251, 46, 46, 46, 46, 252, 253, 252, 252, 252, 252, 252, 254, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 255, 46, 251, 256, 0, 257, 258, 259, 260, 260, 260, 260, 261, 262, 263, 263, 263, 263, 264, 265, 266, 267, 268, 145, 145, 145, 145, 269, 0, 266, 270, 0, 0, 236, 263, 145, 269, 0, 0, 0, 0, 145, 271, 0, 0, 0, 0, 0, 263, 263, 272, 263, 263, 263, 263, 263, 273, 0, 0, 252, 252, 252, 255, 0, 0, 0, 0, 252, 252, 252, 252, 274, 46, 46, 46, 275, 275, 275, 275, 275, 275, 275, 275, 276, 275, 275, 275, 277, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 280, 46, 14, 14, 14, 14, 14, 281, 282, 282, 282, 282, 282, 283, 0, 0, 284, 4, 4, 4, 4, 4, 285, 286, 287, 46, 46, 46, 46, 288, 289, 289, 290, 241, 291, 291, 291, 292, 293, 293, 293, 293, 294, 295, 50, 296, 297, 297, 297, 298, 298, 299, 145, 300, 301, 301, 301, 301, 302, 303, 46, 46, 304, 304, 304, 305, 306, 307, 141, 308, 309, 309, 309, 309, 310, 311, 312, 313, 314, 315, 250, 46, 46, 46, 46, 46, 46, 46, 46, 46, 312, 312, 316, 317, 145, 145, 318, 145, 319, 145, 145, 320, 252, 252, 252, 252, 252, 252, 321, 252, 252, 252, 252, 252, 252, 322, 46, 46, 323, 324, 22, 325, 326, 28, 28, 28, 28, 28, 28, 28, 327, 328, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 329, 46, 28, 28, 28, 28, 330, 28, 28, 331, 46, 46, 332, 8, 241, 217, 0, 0, 333, 334, 335, 28, 28, 28, 28, 28, 28, 28, 336, 238, 0, 1, 2, 1, 2, 337, 262, 263, 338, 145, 269, 339, 340, 341, 342, 343, 344, 345, 346, 347, 347, 46, 46, 344, 344, 344, 344, 344, 344, 344, 348, 349, 0, 0, 350, 11, 11, 11, 11, 351, 251, 46, 46, 46, 0, 0, 352, 353, 354, 355, 355, 355, 356, 46, 46, 357, 358, 359, 360, 361, 46, 46, 46, 362, 363, 364, 364, 365, 366, 46, 46, 367, 367, 367, 367, 367, 368, 368, 368, 369, 370, 371, 46, 46, 46, 46, 46, 372, 373, 373, 374, 375, 376, 46, 46, 377, 378, 379, 380, 46, 46, 46, 46, 381, 381, 382, 383, 46, 46, 46, 46, 384, 385, 386, 387, 388, 389, 390, 390, 391, 391, 391, 392, 393, 394, 395, 396, 397, 397, 397, 397, 398, 46, 46, 46, 46, 46, 46, 46, 46, 46, 28, 49, 399, 399, 399, 399, 400, 401, 399, 46, 402, 402, 402, 402, 403, 404, 405, 406, 407, 407, 407, 408, 409, 46, 46, 46, 410, 410, 410, 410, 411, 412, 46, 46, 413, 413, 413, 414, 415, 46, 46, 46, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 417, 46, 416, 416, 416, 416, 416, 416, 418, 419, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 421, 46, 46, 46, 46, 46, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 422, 46, 46, 46, 46, 423, 423, 423, 423, 424, 423, 423, 425, 426, 423, 46, 46, 46, 46, 46, 46, 427, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 429, 0, 0, 0, 430, 431, 432, 0, 433, 0, 0, 434, 46, 46, 11, 11, 11, 11, 435, 46, 46, 46, 0, 0, 0, 0, 0, 237, 0, 436, 0, 0, 0, 0, 0, 226, 0, 0, 0, 437, 438, 439, 440, 0, 0, 0, 441, 442, 0, 443, 444, 445, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 448, 28, 449, 450, 451, 452, 453, 454, 455, 456, 457, 456, 46, 46, 46, 327, 0, 0, 251, 0, 0, 0, 0, 0, 0, 236, 228, 458, 238, 238, 46, 46, 230, 0, 228, 0, 0, 0, 251, 0, 0, 230, 46, 46, 46, 46, 459, 0, 460, 0, 0, 230, 461, 436, 46, 46, 0, 0, 462, 463, 0, 0, 0, 240, 0, 236, 0, 0, 464, 46, 0, 462, 0, 0, 0, 228, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, 0, 434, 236, 0, 466, 46, 46, 46, 46, 46, 46, 46, 46, 467, 0, 0, 0, 0, 468, 46, 46, 46, 0, 0, 0, 0, 428, 46, 46, 46, 252, 252, 252, 252, 252, 469, 46, 46, 252, 252, 252, 470, 252, 252, 252, 252, 252, 321, 46, 46, 46, 46, 46, 46, 471, 46, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 46, }; static RE_UINT8 re_script_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 2, 2, 3, 0, 0, 4, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 7, 6, 8, 6, 6, 9, 8, 8, 10, 10, 6, 11, 11, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 16, 14, 14, 14, 14, 14, 14, 14, 14, 8, 8, 8, 8, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 17, 18, 18, 18, 18, 18, 18, 18, 20, 19, 8, 17, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 8, 8, 8, 8, 22, 22, 22, 22, 22, 23, 8, 8, 22, 22, 23, 8, 8, 8, 8, 8, 24, 24, 25, 24, 24, 24, 26, 24, 24, 24, 24, 24, 24, 27, 25, 27, 24, 24, 24, 24, 24, 24, 24, 24, 26, 24, 24, 24, 24, 28, 5, 5, 5, 5, 5, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 24, 24, 24, 29, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 27, 24, 30, 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 31, 30, 33, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 8, 8, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 8, 36, 36, 36, 36, 36, 36, 36, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 8, 39, 8, 8, 8, 8, 8, 8, 8, 8, 25, 24, 24, 24, 24, 24, 25, 8, 8, 8, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 40, 40, 40, 40, 40, 40, 40, 40, 41, 42, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 43, 40, 40, 40, 44, 45, 44, 45, 45, 45, 46, 44, 46, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 45, 45, 45, 46, 46, 8, 45, 45, 8, 45, 45, 45, 45, 46, 44, 46, 44, 45, 46, 8, 8, 8, 44, 8, 8, 45, 44, 45, 45, 8, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 8, 8, 47, 48, 47, 48, 48, 49, 8, 47, 49, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 48, 48, 48, 49, 48, 47, 49, 48, 8, 49, 48, 48, 49, 8, 47, 49, 47, 48, 8, 47, 8, 8, 8, 47, 48, 49, 49, 8, 8, 8, 48, 48, 48, 48, 48, 48, 48, 48, 8, 8, 8, 8, 8, 50, 51, 50, 51, 51, 51, 51, 50, 51, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 51, 51, 51, 52, 51, 50, 51, 51, 8, 51, 51, 51, 51, 51, 50, 51, 50, 51, 8, 52, 8, 8, 8, 8, 8, 8, 8, 51, 51, 8, 51, 51, 51, 51, 51, 51, 8, 8, 8, 8, 8, 8, 8, 53, 54, 53, 54, 54, 54, 55, 53, 55, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 54, 54, 55, 54, 53, 54, 54, 8, 54, 54, 54, 54, 55, 53, 55, 53, 54, 8, 8, 8, 8, 54, 8, 8, 54, 53, 54, 54, 8, 54, 54, 54, 54, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8, 56, 57, 56, 56, 58, 8, 56, 58, 56, 56, 8, 57, 58, 58, 56, 8, 57, 58, 8, 56, 58, 8, 56, 56, 56, 56, 56, 56, 8, 8, 56, 56, 58, 8, 56, 58, 56, 56, 8, 58, 8, 8, 57, 8, 8, 8, 8, 8, 8, 8, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 58, 8, 8, 59, 60, 59, 60, 60, 60, 61, 60, 61, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 60, 60, 60, 60, 60, 59, 60, 60, 8, 59, 60, 60, 60, 61, 60, 61, 60, 60, 8, 8, 8, 59, 61, 60, 8, 8, 8, 60, 60, 8, 60, 60, 60, 60, 60, 8, 8, 8, 8, 60, 60, 60, 60, 8, 62, 63, 62, 62, 62, 64, 62, 64, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 64, 62, 62, 62, 62, 62, 63, 62, 62, 8, 62, 62, 62, 62, 64, 62, 64, 62, 62, 8, 8, 8, 63, 64, 8, 8, 8, 64, 62, 62, 8, 62, 62, 62, 62, 62, 63, 64, 8, 8, 8, 8, 8, 8, 8, 65, 66, 65, 65, 65, 67, 65, 67, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 66, 65, 65, 65, 67, 65, 67, 65, 65, 67, 8, 8, 8, 66, 8, 8, 8, 8, 65, 65, 8, 65, 65, 65, 65, 65, 65, 65, 65, 8, 66, 65, 65, 65, 8, 68, 69, 68, 68, 68, 68, 68, 68, 68, 68, 70, 8, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 68, 68, 68, 68, 69, 8, 68, 68, 68, 70, 8, 70, 8, 69, 68, 68, 70, 70, 68, 68, 68, 68, 8, 68, 70, 8, 8, 8, 8, 8, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 8, 20, 72, 72, 72, 72, 72, 72, 8, 8, 74, 75, 75, 74, 75, 75, 74, 8, 8, 8, 76, 76, 74, 76, 76, 76, 74, 76, 74, 74, 8, 76, 74, 76, 76, 76, 76, 76, 76, 74, 76, 8, 76, 76, 75, 75, 76, 76, 76, 8, 76, 76, 76, 76, 76, 8, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 77, 77, 77, 77, 77, 77, 77, 77, 77, 79, 8, 78, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 79, 77, 77, 77, 80, 0, 81, 79, 8, 8, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 8, 8, 84, 8, 83, 83, 83, 83, 83, 85, 83, 83, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 87, 87, 8, 87, 87, 87, 88, 88, 87, 87, 8, 88, 87, 87, 8, 87, 87, 87, 88, 88, 87, 87, 8, 87, 87, 87, 87, 87, 87, 87, 88, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 89, 87, 87, 87, 87, 87, 87, 87, 88, 8, 87, 87, 87, 87, 87, 8, 8, 8, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 8, 8, 8, 8, 8, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, 8, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 0, 95, 97, 8, 8, 8, 8, 8, 8, 8, 98, 98, 98, 98, 98, 98, 99, 98, 98, 98, 99, 8, 8, 8, 8, 8, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 9, 8, 8, 8, 8, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 8, 8, 8, 8, 8, 8, 103, 103, 103, 103, 103, 103, 104, 103, 104, 103, 8, 8, 8, 8, 8, 8, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 8, 105, 105, 105, 105, 105, 8, 8, 8, 106, 0, 107, 106, 106, 106, 106, 108, 106, 106, 106, 106, 106, 8, 8, 8, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 8, 8, 8, 8, 106, 106, 106, 106, 106, 108, 8, 8, 92, 92, 92, 8, 8, 8, 8, 8, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 8, 109, 109, 109, 109, 109, 109, 8, 8, 110, 8, 109, 109, 109, 109, 109, 109, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 8, 111, 111, 112, 8, 8, 8, 8, 8, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 8, 8, 113, 113, 113, 113, 113, 8, 8, 8, 113, 113, 113, 113, 113, 114, 8, 113, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 8, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 116, 116, 116, 116, 116, 116, 117, 118, 116, 116, 116, 116, 116, 8, 8, 8, 116, 116, 116, 116, 116, 116, 116, 8, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 8, 8, 119, 119, 119, 119, 119, 119, 120, 8, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 8, 8, 8, 8, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 8, 124, 123, 123, 123, 123, 123, 123, 123, 8, 124, 123, 125, 125, 125, 125, 125, 125, 125, 125, 121, 121, 121, 121, 8, 8, 8, 8, 5, 126, 5, 5, 5, 5, 5, 5, 126, 5, 5, 5, 126, 0, 127, 0, 0, 0, 126, 9, 8, 8, 8, 8, 2, 2, 2, 6, 6, 128, 2, 2, 2, 2, 2, 2, 2, 2, 129, 6, 6, 2, 2, 6, 6, 130, 2, 2, 2, 2, 2, 2, 131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 129, 5, 5, 5, 132, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 6, 6, 6, 8, 6, 6, 6, 8, 6, 6, 6, 6, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 12, 6, 8, 6, 11, 6, 6, 6, 6, 11, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 9, 2, 2, 2, 2, 2, 2, 133, 8, 0, 0, 0, 0, 0, 9, 8, 8, 132, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 10, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 2, 3, 8, 8, 8, 0, 0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 9, 8, 8, 8, 8, 20, 0, 0, 0, 0, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, 8, 8, 8, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 8, 8, 137, 13, 13, 13, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 8, 8, 8, 139, 140, 8, 8, 8, 8, 8, 8, 139, 87, 87, 87, 88, 8, 8, 8, 8, 87, 87, 87, 88, 87, 87, 87, 88, 0, 0, 0, 0, 0, 0, 8, 8, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 141, 141, 141, 141, 8, 8, 8, 8, 8, 8, 141, 141, 141, 8, 8, 8, 8, 8, 0, 0, 143, 143, 0, 0, 0, 0, 143, 141, 141, 141, 141, 5, 5, 86, 0, 0, 0, 0, 141, 141, 0, 0, 144, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 146, 147, 126, 148, 145, 149, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 149, 150, 8, 8, 152, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 153, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 154, 4, 4, 4, 4, 4, 155, 8, 8, 86, 86, 86, 86, 86, 86, 86, 156, 150, 150, 150, 150, 150, 150, 150, 157, 150, 150, 150, 150, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 158, 8, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 8, 159, 159, 159, 160, 8, 8, 8, 8, 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 8, 8, 14, 14, 14, 14, 8, 8, 8, 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 8, 8, 8, 8, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 2, 133, 2, 2, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 133, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 8, 8, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 8, 8, 8, 8, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 168, 8, 8, 8, 8, 167, 167, 167, 167, 167, 167, 8, 8, 8, 40, 40, 40, 40, 40, 40, 8, 8, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 8, 8, 8, 8, 8, 171, 86, 86, 86, 86, 86, 86, 154, 8, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 20, 172, 172, 172, 172, 172, 8, 8, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 8, 8, 8, 8, 173, 173, 173, 173, 173, 173, 173, 8, 173, 173, 173, 173, 173, 8, 173, 173, 82, 82, 82, 82, 82, 82, 8, 8, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 177, 175, 175, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 8, 8, 8, 8, 89, 87, 87, 88, 89, 87, 87, 88, 89, 87, 87, 88, 8, 8, 8, 8, 178, 178, 178, 178, 178, 178, 178, 8, 178, 178, 178, 178, 178, 8, 8, 8, 86, 86, 8, 8, 8, 8, 8, 8, 86, 86, 86, 154, 8, 153, 86, 86, 86, 86, 86, 86, 86, 86, 8, 8, 141, 141, 141, 141, 141, 141, 141, 8, 141, 141, 141, 141, 141, 8, 8, 8, 2, 2, 2, 133, 8, 8, 8, 8, 8, 17, 18, 18, 8, 8, 21, 22, 22, 22, 22, 23, 22, 22, 23, 23, 22, 21, 23, 22, 22, 22, 22, 22, 24, 8, 8, 8, 8, 8, 8, 8, 8, 180, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 8, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 8, 8, 8, 8, 24, 24, 24, 24, 24, 24, 27, 8, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 24, 24, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 20, 0, 0, 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 0, 8, 86, 86, 86, 8, 86, 86, 86, 8, 86, 86, 86, 8, 86, 154, 8, 0, 0, 0, 9, 0, 0, 0, 9, 8, 8, 8, 8, 20, 0, 0, 8, 181, 181, 181, 181, 181, 181, 182, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 183, 181, 181, 181, 181, 181, 181, 181, 181, 181, 183, 181, 182, 181, 181, 181, 181, 181, 181, 181, 8, 181, 181, 181, 181, 181, 183, 8, 8, 0, 9, 8, 20, 0, 0, 0, 0, 0, 0, 8, 20, 0, 0, 0, 0, 6, 6, 6, 6, 6, 11, 8, 8, 0, 0, 0, 0, 0, 0, 127, 8, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 185, 8, 186, 186, 186, 186, 186, 186, 186, 186, 187, 8, 8, 8, 8, 8, 8, 8, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, 188, 188, 8, 8, 8, 8, 8, 8, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 191, 8, 8, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 8, 8, 194, 194, 194, 194, 194, 194, 194, 8, 8, 8, 8, 8, 195, 195, 195, 195, 195, 195, 195, 195, 196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 8, 197, 197, 197, 197, 197, 8, 8, 8, 198, 198, 198, 8, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 200, 199, 8, 199, 200, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 202, 201, 201, 201, 201, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 8, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 8, 8, 206, 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 8, 8, 8, 208, 209, 209, 210, 211, 8, 8, 209, 209, 209, 209, 210, 209, 210, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 8, 8, 209, 211, 8, 210, 209, 209, 209, 209, 8, 8, 8, 8, 209, 209, 209, 209, 211, 8, 8, 8, 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 8, 214, 213, 213, 213, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 8, 215, 215, 215, 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, 217, 8, 8, 216, 216, 216, 216, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 219, 8, 8, 8, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 8, 8, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221, 221, 8, 8, 8, 8, 8, 8, 8, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 223, 8, 8, 8, 222, 222, 222, 222, 222, 8, 8, 8, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 224, 224, 224, 224, 224, 224, 224, 8, 8, 8, 8, 8, 8, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 8, 8, 8, 226, 226, 226, 226, 226, 8, 8, 8, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 8, 8, 8, 8, 228, 228, 228, 228, 228, 8, 8, 8, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 230, 229, 230, 8, 8, 8, 8, 8, 8, 229, 229, 8, 8, 8, 8, 8, 8, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 232, 164, 164, 164, 164, 233, 8, 8, 8, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 235, 8, 8, 8, 8, 8, 234, 234, 234, 234, 234, 234, 234, 235, 8, 8, 8, 8, 8, 8, 8, 236, 237, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, 9, 20, 0, 0, 0, 0, 0, 0, 127, 5, 0, 0, 0, 0, 0, 0, 0, 0, 127, 5, 5, 5, 126, 127, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 6, 6, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 9, 0, 8, 9, 20, 9, 20, 0, 9, 0, 0, 0, 0, 0, 0, 20, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 20, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 0, 9, 9, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 24, 24, 180, 24, 24, 24, 24, 24, 180, 25, 25, 180, 180, 24, 24, 24, 24, 25, 24, 24, 180, 180, 8, 8, 8, 25, 8, 180, 180, 180, 180, 24, 180, 25, 25, 180, 180, 180, 180, 180, 180, 25, 25, 180, 24, 25, 24, 24, 24, 25, 24, 24, 180, 24, 25, 25, 24, 24, 24, 24, 24, 180, 24, 24, 24, 24, 24, 24, 24, 24, 8, 8, 180, 24, 180, 24, 24, 180, 24, 24, 20, 0, 0, 0, 0, 0, 0, 9, 8, 8, 8, 0, 0, 0, 0, 0, 238, 9, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 9, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 8, 8, 0, 0, 0, 0, 20, 0, 9, 8, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, 0, 0, 9, 8, 20, 0, 0, 0, 0, 0, 141, 141, 141, 158, 8, 8, 8, 8, 141, 141, 158, 8, 8, 8, 8, 8, 20, 8, 8, 8, 8, 8, 8, 8, }; static RE_UINT8 re_script_stage_5[] = { 1, 1, 1, 2, 2, 2, 2, 1, 35, 35, 41, 41, 3, 3, 1, 3, 0, 0, 1, 0, 3, 1, 3, 0, 0, 3, 55, 55, 4, 4, 4, 41, 41, 4, 0, 5, 5, 5, 5, 0, 0, 1, 0, 6, 6, 6, 6, 0, 7, 7, 7, 0, 1, 7, 7, 1, 7, 41, 41, 7, 8, 8, 0, 8, 8, 0, 9, 9, 66, 66, 66, 0, 82, 82, 82, 0, 95, 95, 95, 0, 10, 10, 10, 41, 41, 10, 0, 10, 0, 11, 11, 11, 11, 0, 0, 12, 12, 12, 12, 0, 0, 13, 13, 13, 13, 0, 0, 14, 14, 14, 14, 0, 15, 15, 0, 15, 15, 0, 0, 16, 16, 16, 16, 0, 17, 17, 0, 17, 17, 0, 18, 18, 0, 18, 18, 0, 19, 19, 0, 19, 19, 0, 0, 20, 20, 20, 20, 0, 0, 21, 21, 0, 21, 21, 22, 22, 0, 22, 22, 0, 22, 1, 1, 22, 23, 23, 24, 24, 0, 24, 24, 1, 25, 25, 26, 26, 26, 0, 0, 26, 27, 27, 27, 0, 28, 28, 29, 29, 29, 0, 30, 30, 30, 1, 30, 0, 42, 42, 42, 0, 43, 43, 43, 1, 44, 44, 45, 45, 45, 0, 31, 31, 32, 32, 32, 1, 32, 0, 46, 46, 46, 0, 47, 47, 47, 0, 56, 56, 56, 0, 54, 54, 78, 78, 78, 0, 0, 78, 62, 62, 62, 0, 67, 67, 93, 93, 68, 68, 0, 68, 69, 69, 41, 1, 1, 41, 3, 4, 2, 3, 3, 2, 4, 2, 41, 0, 2, 0, 53, 53, 57, 57, 57, 0, 0, 55, 58, 58, 0, 58, 58, 0, 36, 36, 0, 36, 1, 36, 0, 33, 33, 33, 33, 0, 0, 41, 1, 33, 1, 34, 34, 34, 34, 1, 0, 35, 0, 25, 25, 0, 35, 0, 25, 1, 34, 0, 36, 0, 37, 37, 37, 0, 83, 83, 70, 70, 0, 4, 84, 84, 59, 59, 65, 65, 71, 71, 71, 0, 72, 72, 73, 73, 0, 73, 85, 85, 77, 77, 77, 0, 79, 79, 79, 0, 0, 79, 86, 86, 86, 0, 0, 7, 48, 48, 0, 48, 48, 0, 74, 74, 74, 0, 75, 75, 75, 0, 38, 38, 38, 0, 39, 39, 39, 0, 49, 49, 0, 49, 60, 60, 40, 40, 50, 50, 51, 51, 52, 52, 52, 0, 0, 52, 87, 87, 0, 87, 64, 64, 0, 64, 76, 76, 0, 76, 98, 98, 97, 97, 61, 61, 0, 61, 61, 0, 88, 88, 80, 80, 0, 80, 89, 89, 90, 90, 90, 0, 91, 91, 91, 0, 94, 94, 92, 92, 101, 101, 101, 0, 96, 96, 96, 0, 100, 100, 100, 0, 102, 102, 63, 63, 63, 0, 81, 81, 81, 0, 84, 0, 99, 99, 99, 0, 0, 99, 34, 33, 33, 1, }; /* Script: 8046 bytes. */ RE_UINT32 re_get_script(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 11; code = ch ^ (f << 11); pos = (RE_UINT32)re_script_stage_1[f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_script_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_script_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_script_stage_4[pos + f] << 1; value = re_script_stage_5[pos + code]; return value; } /* Word_Break. */ static RE_UINT8 re_word_break_stage_1[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6, 7, 4, 8, 9, 10, 11, 12, 4, 4, 13, 4, 4, 4, 4, 14, 4, 15, 16, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_word_break_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 2, 2, 31, 32, 33, 34, 35, 2, 2, 2, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 2, 50, 2, 2, 51, 52, 53, 54, 55, 56, 57, 57, 57, 57, 57, 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 59, 60, 61, 62, 63, 57, 57, 57, 64, 65, 66, 67, 57, 68, 69, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 83, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 84, 85, 2, 2, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 57, 96, 97, 98, 2, 99, 57, 57, 57, 57, 57, 57, 100, 57, 101, 102, 103, 57, 104, 57, 105, 57, 57, 57, 57, 57, 57, 57, 106, 107, 108, 109, 57, 57, 57, 57, 57, 57, 57, 57, 57, 110, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 111, 57, 112, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 113, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 114, 57, 57, 57, 57, 57, 57, 57, 57, 57, 115, 116, 117, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 118, 119, 120, 57, 57, 57, 121, 122, 123, 2, 2, 124, 125, 126, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 127, 128, 57, 57, 57, 57, 57, 129, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 130, 57, 131, 132, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, }; static RE_UINT8 re_word_break_stage_3[] = { 0, 1, 0, 0, 2, 3, 4, 5, 6, 7, 7, 8, 6, 7, 7, 9, 10, 0, 0, 0, 0, 11, 12, 13, 7, 7, 14, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 7, 16, 0, 17, 18, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 22, 23, 7, 7, 24, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 26, 27, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 6, 7, 7, 7, 14, 28, 6, 7, 7, 7, 7, 29, 30, 19, 19, 19, 19, 31, 32, 0, 33, 33, 33, 34, 35, 0, 36, 37, 19, 38, 7, 7, 7, 7, 7, 39, 19, 19, 4, 40, 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 43, 44, 45, 4, 46, 0, 47, 48, 7, 7, 7, 19, 19, 19, 49, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 50, 19, 51, 0, 4, 52, 7, 7, 7, 39, 53, 54, 7, 7, 50, 55, 56, 57, 0, 0, 7, 7, 7, 58, 0, 0, 0, 0, 0, 0, 0, 0, 59, 17, 0, 0, 0, 0, 0, 0, 60, 19, 19, 61, 62, 7, 7, 7, 7, 7, 7, 63, 19, 19, 64, 7, 65, 4, 6, 6, 66, 67, 68, 7, 7, 59, 69, 70, 71, 72, 73, 74, 65, 4, 75, 0, 66, 76, 68, 7, 7, 59, 77, 78, 79, 80, 81, 82, 83, 4, 84, 0, 66, 25, 24, 7, 7, 59, 85, 70, 31, 86, 87, 0, 65, 4, 0, 0, 66, 67, 68, 7, 7, 59, 85, 70, 71, 80, 88, 74, 65, 4, 28, 0, 89, 90, 91, 92, 93, 90, 7, 94, 95, 96, 97, 0, 83, 4, 0, 0, 66, 20, 59, 7, 7, 59, 98, 99, 100, 96, 101, 75, 65, 4, 0, 0, 102, 20, 59, 7, 7, 59, 98, 70, 100, 96, 101, 103, 65, 4, 104, 0, 102, 20, 59, 7, 7, 7, 7, 105, 100, 106, 73, 0, 65, 4, 0, 107, 102, 7, 14, 107, 7, 7, 24, 108, 14, 109, 110, 19, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 112, 113, 73, 61, 4, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 115, 0, 116, 4, 114, 0, 0, 0, 0, 87, 0, 0, 117, 4, 114, 118, 119, 7, 6, 7, 7, 7, 17, 30, 19, 100, 120, 19, 30, 19, 19, 19, 121, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 19, 61, 4, 114, 88, 124, 125, 116, 126, 0, 127, 31, 4, 128, 7, 7, 7, 7, 25, 129, 7, 7, 7, 7, 7, 130, 7, 7, 7, 7, 7, 7, 7, 7, 7, 91, 14, 91, 7, 7, 7, 7, 7, 91, 7, 7, 7, 7, 91, 14, 91, 7, 14, 7, 7, 7, 7, 7, 7, 7, 91, 7, 7, 7, 7, 7, 7, 7, 7, 131, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 17, 0, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 67, 7, 7, 6, 7, 7, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 90, 87, 0, 7, 20, 132, 0, 7, 7, 132, 0, 7, 7, 133, 0, 7, 20, 134, 0, 0, 0, 0, 0, 0, 0, 60, 19, 19, 19, 135, 136, 4, 114, 0, 0, 0, 137, 4, 114, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 138, 7, 7, 7, 7, 7, 7, 7, 7, 139, 0, 7, 7, 7, 17, 19, 135, 19, 135, 83, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 140, 117, 4, 114, 0, 0, 0, 0, 7, 7, 141, 135, 0, 0, 0, 0, 0, 0, 142, 61, 19, 19, 19, 71, 4, 114, 4, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 7, 7, 7, 7, 7, 144, 19, 143, 145, 4, 114, 0, 123, 135, 0, 146, 7, 7, 7, 64, 147, 4, 52, 7, 7, 7, 7, 50, 19, 135, 0, 7, 7, 7, 7, 144, 19, 19, 0, 4, 148, 4, 52, 7, 7, 7, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 19, 19, 150, 151, 0, 7, 7, 7, 7, 7, 7, 7, 7, 19, 19, 19, 19, 61, 0, 0, 60, 7, 7, 139, 139, 7, 7, 7, 7, 139, 139, 7, 152, 7, 7, 7, 139, 7, 7, 7, 7, 7, 7, 20, 153, 154, 17, 155, 145, 7, 17, 154, 17, 0, 156, 0, 157, 158, 159, 0, 160, 161, 0, 162, 0, 163, 164, 28, 165, 0, 0, 7, 17, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 140, 0, 166, 107, 108, 167, 18, 168, 7, 169, 170, 171, 0, 0, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 7, 7, 7, 7, 7, 7, 75, 0, 0, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 17, 173, 174, 0, 7, 7, 7, 7, 25, 129, 7, 7, 7, 7, 7, 7, 7, 165, 0, 73, 7, 7, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 19, 19, 19, 19, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 127, 175, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, 170, 7, 7, 7, 7, 139, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 0, 0, 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 177, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 177, 177, 177, 177, 179, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 0, 0, 0, 0, 0, 7, 17, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 139, 7, 17, 7, 7, 4, 180, 0, 0, 7, 7, 7, 7, 7, 141, 149, 181, 7, 7, 7, 73, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 117, 0, 0, 0, 165, 7, 107, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 182, 145, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 183, 184, 7, 7, 39, 0, 0, 0, 7, 7, 7, 7, 7, 7, 145, 0, 27, 7, 7, 7, 7, 7, 144, 19, 121, 0, 4, 114, 19, 19, 27, 185, 4, 52, 7, 7, 50, 116, 7, 7, 141, 19, 135, 0, 7, 7, 7, 17, 62, 7, 7, 7, 7, 7, 39, 19, 140, 165, 4, 114, 0, 0, 0, 0, 7, 7, 7, 7, 7, 64, 61, 0, 184, 186, 4, 114, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 125, 188, 81, 0, 0, 0, 7, 39, 189, 0, 190, 190, 190, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 39, 191, 4, 114, 7, 7, 7, 7, 145, 0, 7, 7, 14, 192, 7, 7, 7, 7, 7, 145, 14, 0, 192, 193, 33, 194, 195, 196, 197, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 75, 0, 0, 0, 192, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 139, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 107, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 145, 19, 19, 198, 0, 61, 0, 199, 0, 0, 200, 201, 0, 0, 0, 20, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 202, 203, 3, 0, 204, 6, 7, 7, 8, 6, 7, 7, 9, 205, 177, 177, 177, 177, 177, 177, 206, 7, 7, 7, 14, 107, 107, 107, 207, 0, 0, 0, 208, 7, 98, 7, 7, 14, 7, 7, 209, 7, 139, 7, 139, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 7, 7, 7, 17, 7, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 7, 7, 7, 14, 0, 0, 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 7, 7, 7, 139, 7, 7, 7, 7, 145, 7, 167, 0, 0, 0, 0, 0, 7, 7, 7, 139, 4, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 59, 7, 7, 7, 7, 25, 210, 7, 7, 139, 0, 0, 0, 0, 0, 7, 7, 139, 0, 7, 7, 7, 75, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 172, 0, 0, 0, 0, 0, 0, 0, 0, 211, 60, 98, 6, 7, 7, 145, 79, 0, 0, 0, 0, 7, 7, 7, 17, 7, 7, 7, 7, 7, 7, 139, 0, 7, 7, 139, 0, 7, 7, 9, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 0, 146, 7, 7, 7, 7, 7, 7, 19, 61, 0, 0, 0, 83, 4, 0, 0, 146, 7, 7, 7, 7, 7, 19, 212, 0, 0, 7, 7, 7, 87, 4, 114, 146, 7, 7, 7, 141, 19, 213, 4, 0, 0, 0, 0, 0, 0, 0, 0, 146, 7, 7, 7, 7, 7, 39, 19, 214, 0, 4, 114, 0, 0, 0, 0, 7, 7, 7, 7, 7, 39, 19, 0, 4, 114, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 0, 0, 0, 7, 7, 7, 7, 7, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 17, 0, 64, 19, 19, 19, 19, 61, 0, 73, 146, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 216, 217, 218, 219, 135, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 20, 7, 7, 7, 7, 7, 7, 7, 7, 20, 222, 223, 7, 224, 98, 7, 7, 7, 7, 7, 7, 7, 25, 225, 20, 20, 7, 7, 7, 226, 153, 107, 59, 7, 7, 7, 7, 7, 7, 7, 7, 7, 139, 7, 7, 7, 59, 7, 7, 130, 7, 7, 7, 130, 7, 7, 20, 7, 7, 7, 20, 7, 7, 14, 7, 7, 7, 14, 7, 7, 7, 59, 7, 7, 7, 59, 7, 7, 130, 227, 4, 4, 4, 4, 4, 4, 98, 7, 7, 7, 228, 6, 130, 229, 166, 230, 228, 152, 228, 130, 130, 82, 7, 24, 7, 145, 231, 24, 7, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, 233, 233, 234, 0, 0, 0, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, }; static RE_UINT8 re_word_break_stage_4[] = { 0, 0, 1, 2, 3, 4, 0, 5, 6, 6, 7, 0, 8, 9, 9, 9, 10, 11, 10, 0, 0, 12, 13, 14, 0, 15, 13, 0, 9, 10, 16, 17, 16, 18, 9, 19, 0, 20, 21, 21, 9, 22, 17, 23, 0, 24, 10, 22, 25, 9, 9, 25, 26, 21, 27, 9, 28, 0, 29, 0, 30, 21, 21, 31, 32, 31, 33, 33, 34, 0, 35, 36, 37, 38, 0, 39, 40, 38, 41, 21, 42, 43, 44, 9, 9, 45, 21, 46, 21, 47, 48, 27, 49, 50, 0, 51, 52, 9, 40, 8, 9, 53, 54, 0, 49, 9, 21, 16, 55, 0, 56, 21, 21, 57, 57, 58, 57, 0, 22, 9, 0, 21, 21, 40, 21, 9, 53, 59, 57, 21, 53, 60, 30, 8, 9, 50, 50, 9, 20, 17, 16, 59, 21, 61, 61, 62, 0, 63, 0, 25, 16, 0, 10, 64, 22, 65, 16, 48, 40, 63, 61, 58, 66, 0, 8, 20, 0, 60, 27, 67, 22, 8, 31, 58, 19, 0, 0, 68, 69, 8, 10, 17, 22, 16, 65, 22, 64, 19, 16, 68, 40, 68, 48, 58, 19, 63, 9, 8, 16, 45, 21, 48, 0, 32, 68, 8, 0, 13, 65, 0, 10, 45, 48, 62, 17, 9, 9, 28, 70, 63, 21, 71, 68, 0, 66, 21, 40, 0, 72, 0, 31, 73, 21, 58, 58, 0, 0, 74, 66, 68, 9, 57, 21, 73, 0, 70, 63, 21, 58, 68, 48, 61, 30, 73, 68, 21, 75, 58, 0, 28, 10, 9, 10, 30, 53, 73, 53, 0, 76, 0, 21, 0, 0, 66, 63, 77, 78, 0, 9, 16, 73, 0, 9, 41, 0, 30, 21, 44, 9, 21, 9, 0, 79, 9, 21, 27, 72, 8, 40, 21, 44, 52, 53, 80, 81, 81, 9, 20, 17, 22, 9, 17, 0, 82, 83, 0, 0, 84, 85, 86, 0, 11, 87, 88, 0, 87, 37, 89, 37, 37, 0, 64, 13, 64, 8, 16, 22, 25, 16, 9, 0, 8, 16, 13, 0, 17, 64, 41, 27, 0, 90, 91, 92, 93, 94, 94, 95, 94, 94, 95, 49, 0, 21, 96, 50, 10, 97, 97, 41, 9, 64, 0, 9, 58, 63, 0, 73, 68, 17, 98, 8, 10, 40, 58, 64, 9, 0, 99, 100, 33, 33, 34, 33, 101, 102, 100, 103, 88, 11, 87, 0, 104, 5, 105, 9, 106, 0, 107, 108, 0, 0, 109, 94, 110, 17, 19, 111, 0, 10, 25, 19, 50, 57, 32, 40, 14, 21, 112, 44, 19, 93, 0, 58, 30, 113, 37, 114, 21, 40, 30, 68, 58, 68, 73, 13, 65, 8, 22, 25, 8, 10, 8, 25, 10, 9, 60, 65, 50, 81, 0, 81, 8, 8, 8, 0, 115, 116, 116, 14, 0, }; static RE_UINT8 re_word_break_stage_5[] = { 0, 0, 0, 0, 0, 0, 5, 6, 6, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 13, 0, 14, 0, 15, 15, 15, 15, 15, 15, 12, 13, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 16, 0, 6, 0, 0, 0, 0, 11, 0, 0, 9, 0, 0, 0, 11, 0, 12, 11, 11, 0, 0, 0, 0, 11, 11, 0, 0, 0, 12, 11, 0, 0, 0, 11, 0, 11, 0, 7, 7, 7, 7, 11, 0, 11, 11, 11, 11, 13, 0, 0, 0, 11, 12, 11, 11, 0, 11, 11, 11, 0, 7, 7, 7, 11, 11, 0, 11, 0, 0, 0, 13, 0, 0, 0, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 11, 12, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 13, 13, 0, 0, 7, 7, 7, 0, 11, 11, 11, 7, 15, 15, 0, 15, 13, 0, 11, 11, 7, 11, 11, 11, 0, 11, 7, 7, 7, 9, 0, 7, 7, 11, 11, 7, 7, 0, 7, 7, 15, 15, 11, 11, 11, 0, 0, 11, 0, 0, 0, 9, 11, 7, 11, 11, 11, 11, 7, 7, 7, 11, 0, 0, 13, 0, 11, 0, 7, 7, 11, 7, 11, 7, 7, 7, 7, 7, 0, 0, 7, 11, 7, 7, 0, 0, 15, 15, 7, 0, 0, 7, 7, 7, 11, 0, 0, 0, 0, 7, 0, 0, 0, 11, 0, 11, 11, 0, 0, 7, 0, 0, 11, 7, 0, 0, 0, 0, 7, 7, 0, 0, 7, 11, 0, 0, 7, 0, 7, 0, 7, 0, 15, 15, 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 15, 15, 7, 7, 11, 0, 7, 7, 7, 7, 9, 0, 11, 7, 11, 0, 7, 7, 7, 11, 7, 11, 11, 0, 0, 11, 0, 11, 7, 7, 9, 9, 14, 14, 0, 0, 14, 0, 0, 12, 6, 6, 9, 9, 9, 9, 9, 0, 16, 0, 0, 0, 13, 0, 0, 0, 9, 0, 9, 9, 0, 10, 10, 10, 10, 10, 0, 0, 0, 7, 7, 10, 10, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 7, 7, 0, 11, 11, 11, 7, 11, 11, 7, 7, 0, 0, 3, 7, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 3, 0, 3, 13, 0, 0, 12, 0, 16, 16, 16, 13, 12, 0, 0, 11, 0, 0, 9, 0, 0, 0, 14, 0, 0, 12, 13, 0, 0, 10, 10, 10, 10, 7, 7, 0, 9, 9, 9, 7, 0, 15, 15, 7, 7, 7, 9, 9, 9, 9, 7, 0, 0, 8, 8, 8, 8, 8, 8, }; /* Word_Break: 3946 bytes. */ RE_UINT32 re_get_word_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_word_break_stage_1[f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_word_break_stage_2[pos + f] << 4; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_word_break_stage_3[pos + f] << 1; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_word_break_stage_4[pos + f] << 2; value = re_word_break_stage_5[pos + code]; return value; } /* Grapheme_Cluster_Break. */ static RE_UINT8 re_grapheme_cluster_break_stage_1[] = { 0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 7, 2, 2, 8, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_grapheme_cluster_break_stage_2[] = { 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 1, 1, 1, 18, 19, 20, 21, 22, 23, 24, 1, 1, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 27, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, 1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 41, 42, 42, 42, 42, 42, 42, 42, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 43, 1, 1, 44, 45, 1, 46, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 1, 1, 48, 49, 1, 1, 1, 1, 50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_grapheme_cluster_break_stage_3[] = { 0, 1, 2, 2, 2, 2, 2, 3, 1, 1, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 5, 8, 9, 2, 2, 2, 10, 11, 2, 2, 12, 5, 2, 13, 2, 2, 2, 2, 2, 14, 15, 2, 3, 16, 2, 5, 17, 2, 2, 2, 2, 2, 18, 13, 2, 2, 12, 19, 2, 20, 21, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 23, 24, 25, 2, 2, 26, 27, 28, 29, 2, 30, 2, 2, 31, 32, 33, 29, 2, 34, 2, 2, 35, 36, 16, 2, 37, 34, 2, 2, 35, 38, 2, 29, 2, 30, 2, 2, 39, 32, 40, 29, 2, 41, 2, 2, 42, 43, 33, 2, 2, 44, 2, 2, 45, 46, 47, 29, 2, 48, 2, 2, 49, 50, 47, 29, 2, 48, 2, 2, 42, 51, 33, 29, 2, 48, 2, 2, 2, 52, 53, 2, 48, 2, 2, 2, 54, 55, 2, 2, 2, 2, 2, 2, 56, 57, 2, 2, 2, 2, 58, 2, 59, 2, 2, 2, 60, 61, 62, 5, 63, 64, 2, 2, 2, 2, 2, 65, 66, 2, 67, 13, 68, 69, 70, 2, 2, 2, 2, 2, 2, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 73, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 65, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 75, 2, 75, 2, 29, 2, 29, 2, 2, 2, 76, 77, 78, 2, 2, 79, 2, 2, 2, 2, 2, 2, 2, 2, 2, 80, 2, 2, 2, 2, 2, 2, 2, 81, 82, 2, 2, 2, 2, 2, 2, 2, 83, 2, 2, 2, 2, 2, 84, 2, 2, 2, 85, 86, 87, 2, 2, 2, 2, 2, 2, 2, 2, 88, 2, 2, 89, 90, 2, 12, 19, 91, 2, 92, 2, 2, 2, 93, 94, 2, 2, 95, 96, 2, 2, 2, 2, 2, 2, 2, 2, 2, 97, 98, 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 100, 101, 102, 2, 103, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 5, 5, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 104, 105, 2, 2, 2, 2, 2, 2, 2, 104, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 106, 2, 2, 2, 2, 2, 2, 107, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 104, 108, 2, 104, 2, 2, 2, 2, 2, 105, 109, 2, 110, 2, 2, 2, 2, 2, 111, 2, 2, 112, 113, 2, 5, 105, 2, 2, 114, 2, 115, 94, 71, 116, 25, 2, 2, 117, 118, 2, 2, 2, 2, 2, 119, 120, 121, 2, 2, 2, 2, 2, 2, 122, 16, 2, 123, 124, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 2, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 131, 72, 132, 74, 74, 133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 100, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 2, 2, 2, 2, 2, 135, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 136, 2, 2, 137, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 138, 2, 2, 139, 100, 2, 2, 2, 91, 2, 2, 140, 2, 2, 2, 2, 141, 2, 142, 143, 2, 2, 2, 2, 91, 2, 2, 144, 118, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 145, 146, 2, 2, 2, 2, 2, 2, 2, 2, 2, 147, 148, 149, 104, 141, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 150, 151, 152, 2, 153, 2, 2, 2, 2, 2, 2, 2, 2, 2, 75, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 154, 155, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, }; static RE_UINT8 re_grapheme_cluster_break_stage_4[] = { 0, 0, 1, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 5, 6, 6, 6, 6, 7, 6, 8, 3, 9, 6, 6, 6, 6, 6, 6, 10, 11, 10, 3, 3, 0, 12, 3, 3, 6, 6, 13, 12, 3, 3, 7, 6, 14, 3, 3, 3, 3, 15, 6, 16, 6, 17, 18, 8, 19, 3, 3, 3, 6, 6, 13, 3, 3, 15, 6, 6, 6, 3, 3, 3, 3, 15, 10, 6, 6, 9, 9, 8, 3, 3, 9, 3, 3, 6, 6, 6, 6, 6, 6, 13, 20, 3, 3, 3, 3, 3, 21, 22, 23, 6, 24, 25, 9, 6, 3, 3, 15, 3, 3, 3, 26, 3, 3, 3, 3, 3, 3, 27, 23, 28, 29, 30, 3, 7, 3, 3, 31, 3, 3, 3, 3, 3, 3, 22, 32, 7, 17, 8, 8, 19, 3, 3, 23, 10, 33, 30, 3, 3, 3, 18, 3, 15, 3, 3, 34, 3, 3, 3, 3, 3, 3, 21, 35, 36, 37, 30, 38, 3, 3, 3, 3, 3, 3, 15, 24, 39, 18, 8, 3, 11, 3, 3, 36, 3, 3, 3, 3, 3, 3, 40, 41, 42, 37, 8, 23, 22, 37, 30, 3, 3, 34, 7, 43, 44, 45, 46, 47, 6, 13, 3, 3, 7, 6, 13, 47, 6, 10, 14, 3, 3, 6, 8, 3, 3, 8, 3, 3, 48, 19, 36, 9, 6, 6, 20, 6, 18, 3, 9, 6, 6, 9, 6, 6, 6, 6, 14, 3, 34, 3, 3, 3, 3, 3, 9, 49, 6, 31, 32, 3, 36, 8, 15, 9, 14, 3, 3, 34, 32, 3, 19, 3, 3, 3, 19, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 15, 14, 3, 3, 3, 53, 6, 54, 45, 41, 23, 6, 6, 3, 3, 19, 3, 3, 7, 55, 3, 3, 19, 3, 20, 46, 24, 3, 41, 45, 23, 3, 3, 38, 56, 3, 3, 7, 57, 3, 3, 58, 6, 13, 44, 9, 6, 24, 46, 6, 6, 17, 6, 59, 3, 3, 3, 49, 20, 24, 41, 59, 3, 3, 60, 3, 3, 3, 61, 54, 53, 62, 3, 21, 54, 63, 54, 3, 3, 3, 3, 45, 45, 6, 6, 43, 3, 3, 13, 6, 6, 6, 49, 6, 14, 19, 36, 14, 3, 3, 6, 13, 3, 3, 3, 3, 3, 6, 3, 3, 4, 64, 3, 3, 0, 65, 3, 3, 3, 7, 8, 3, 3, 3, 3, 3, 15, 6, 3, 3, 11, 3, 13, 6, 6, 8, 34, 34, 7, 3, 66, 67, 3, 3, 62, 3, 3, 3, 3, 45, 45, 45, 45, 14, 3, 3, 3, 15, 6, 8, 3, 7, 6, 6, 50, 50, 50, 68, 7, 43, 54, 24, 59, 3, 3, 3, 3, 3, 9, 20, 67, 32, 3, 3, 7, 3, 3, 69, 18, 17, 14, 15, 3, 3, 66, 54, 3, 70, 3, 3, 66, 25, 35, 30, 71, 72, 72, 72, 72, 72, 72, 71, 72, 72, 72, 72, 72, 72, 71, 72, 72, 71, 72, 72, 72, 3, 3, 3, 51, 73, 74, 52, 52, 52, 52, 3, 3, 3, 3, 34, 0, 0, 0, 3, 9, 11, 3, 6, 3, 3, 13, 7, 75, 3, 3, 3, 3, 3, 6, 6, 46, 20, 32, 5, 13, 3, 3, 3, 3, 7, 6, 23, 6, 14, 3, 3, 66, 43, 6, 20, 3, 3, 7, 25, 6, 53, 3, 3, 38, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 76, 3, 77, 8, 61, 78, 0, 79, 6, 13, 9, 6, 3, 3, 3, 15, 8, 3, 80, 81, 81, 81, 81, 81, 81, }; static RE_UINT8 re_grapheme_cluster_break_stage_5[] = { 3, 3, 3, 3, 3, 3, 2, 3, 3, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 4, 0, 0, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 0, 3, 0, 0, 0, 4, 4, 4, 0, 4, 0, 0, 0, 0, 0, 4, 4, 4, 3, 0, 4, 4, 0, 0, 4, 4, 0, 4, 4, 0, 4, 0, 0, 4, 4, 4, 6, 0, 0, 4, 6, 4, 0, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 4, 6, 6, 0, 4, 6, 6, 4, 0, 4, 6, 4, 0, 0, 6, 6, 0, 0, 6, 6, 4, 0, 0, 0, 4, 4, 6, 6, 4, 4, 0, 4, 6, 0, 6, 0, 0, 4, 0, 4, 6, 6, 0, 0, 0, 6, 6, 6, 0, 6, 6, 0, 6, 6, 6, 6, 0, 4, 4, 4, 0, 6, 4, 6, 6, 4, 6, 6, 0, 4, 6, 6, 6, 4, 4, 4, 0, 4, 0, 6, 6, 6, 6, 6, 6, 6, 4, 0, 4, 0, 6, 0, 4, 0, 4, 4, 6, 4, 4, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 4, 4, 6, 4, 4, 4, 6, 6, 4, 4, 3, 0, 0, 0, 6, 0, 4, 6, 6, 4, 0, 6, 4, 6, 6, 0, 0, 0, 4, 4, 6, 0, 0, 6, 4, 4, 6, 6, 0, 0, 6, 4, 6, 4, 4, 4, 3, 3, 3, 3, 3, 0, 0, 0, 0, 6, 6, 4, 4, 6, 7, 0, 0, 0, 4, 6, 0, 0, 0, 6, 4, 0, 10, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 0, 0, 0, 0, 9, 6, 4, 6, 0, 6, 6, 6, 0, 0, 4, 6, 4, 4, 4, 4, 3, 3, 3, 3, 4, 0, 0, 5, 5, 5, 5, 5, 5, }; /* Grapheme_Cluster_Break: 2336 bytes. */ RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_grapheme_cluster_break_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_cluster_break_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_grapheme_cluster_break_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_grapheme_cluster_break_stage_4[pos + f] << 2; value = re_grapheme_cluster_break_stage_5[pos + code]; return value; } /* Sentence_Break. */ static RE_UINT8 re_sentence_break_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, 11, 12, 13, 14, 9, 9, 15, 9, 9, 9, 9, 16, 9, 17, 18, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 19, 20, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static RE_UINT8 re_sentence_break_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 17, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 33, 33, 36, 33, 37, 33, 33, 38, 39, 40, 33, 41, 42, 33, 33, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 43, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 44, 17, 17, 17, 17, 45, 17, 46, 47, 48, 49, 50, 51, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 52, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 53, 54, 17, 55, 56, 57, 58, 59, 60, 61, 62, 33, 33, 33, 63, 64, 65, 66, 67, 33, 33, 33, 68, 69, 33, 33, 33, 33, 70, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 17, 71, 72, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 17, 17, 73, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 74, 33, 33, 33, 33, 75, 76, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 77, 78, 33, 79, 80, 81, 82, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 83, 33, 17, 17, 17, 17, 17, 17, 84, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 85, 86, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 86, 33, 33, 33, 33, 33, 87, 88, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, }; static RE_UINT16 re_sentence_break_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 8, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 24, 25, 26, 27, 28, 29, 30, 18, 8, 31, 8, 32, 8, 8, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 41, 41, 44, 45, 46, 47, 48, 41, 41, 49, 50, 51, 52, 53, 54, 55, 55, 56, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 62, 71, 74, 75, 76, 77, 78, 79, 80, 81, 82, 73, 83, 84, 85, 86, 83, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 55, 97, 98, 99, 55, 100, 101, 102, 103, 104, 105, 106, 55, 41, 107, 108, 109, 110, 29, 111, 112, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 113, 41, 114, 115, 116, 41, 117, 41, 118, 119, 120, 41, 41, 121, 94, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 122, 123, 41, 41, 124, 125, 126, 127, 128, 41, 129, 130, 131, 132, 41, 41, 133, 41, 134, 41, 135, 136, 137, 138, 139, 41, 140, 141, 55, 142, 41, 143, 144, 145, 146, 55, 55, 147, 129, 148, 149, 150, 151, 41, 152, 41, 153, 154, 155, 55, 55, 156, 157, 18, 18, 18, 18, 18, 18, 23, 158, 8, 8, 8, 8, 159, 8, 8, 8, 160, 161, 162, 163, 161, 164, 165, 166, 167, 168, 169, 170, 171, 55, 172, 173, 174, 175, 176, 30, 177, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 178, 179, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 180, 30, 181, 55, 55, 182, 183, 55, 55, 184, 185, 55, 55, 55, 55, 186, 55, 187, 188, 29, 189, 190, 191, 8, 8, 8, 192, 18, 193, 41, 194, 195, 196, 196, 23, 197, 198, 55, 55, 55, 55, 55, 55, 199, 200, 94, 41, 201, 94, 41, 112, 202, 203, 41, 41, 204, 205, 55, 206, 41, 41, 41, 41, 41, 135, 55, 55, 41, 41, 41, 41, 41, 41, 207, 55, 41, 41, 41, 41, 207, 55, 206, 208, 209, 210, 8, 211, 212, 41, 41, 213, 214, 215, 8, 216, 217, 218, 55, 219, 220, 221, 41, 222, 223, 129, 224, 225, 50, 226, 227, 136, 58, 228, 229, 55, 41, 230, 231, 232, 41, 233, 234, 235, 236, 237, 55, 55, 55, 55, 41, 238, 41, 41, 41, 41, 41, 239, 240, 241, 41, 41, 41, 242, 41, 41, 243, 55, 244, 245, 246, 41, 41, 247, 248, 41, 41, 249, 206, 41, 250, 41, 251, 252, 253, 254, 255, 256, 41, 41, 41, 257, 258, 2, 259, 260, 261, 262, 263, 264, 265, 266, 267, 55, 41, 41, 41, 205, 55, 55, 41, 121, 55, 55, 55, 268, 55, 55, 55, 55, 136, 41, 269, 55, 262, 206, 270, 55, 271, 41, 272, 55, 29, 273, 274, 41, 271, 131, 55, 55, 275, 276, 135, 55, 55, 55, 55, 55, 135, 243, 55, 55, 41, 277, 55, 55, 278, 279, 280, 136, 55, 55, 55, 55, 41, 135, 135, 281, 55, 55, 55, 55, 41, 41, 282, 55, 55, 55, 55, 55, 150, 283, 284, 79, 150, 285, 286, 287, 150, 288, 289, 55, 150, 228, 290, 55, 55, 55, 55, 55, 41, 291, 131, 55, 41, 41, 41, 204, 55, 55, 55, 55, 41, 41, 41, 292, 55, 55, 55, 55, 41, 204, 55, 55, 55, 55, 55, 55, 41, 293, 55, 55, 55, 55, 55, 55, 41, 41, 294, 295, 296, 55, 55, 55, 297, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 298, 299, 300, 55, 55, 55, 55, 301, 55, 55, 55, 55, 55, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 302, 303, 315, 305, 316, 317, 318, 309, 319, 320, 321, 322, 323, 324, 189, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 55, 55, 41, 41, 41, 41, 41, 41, 195, 55, 41, 121, 41, 41, 41, 41, 41, 41, 271, 55, 55, 55, 55, 55, 55, 55, 335, 336, 336, 336, 55, 55, 55, 55, 23, 23, 23, 23, 23, 23, 23, 337, }; static RE_UINT8 re_sentence_break_stage_4[] = { 0, 0, 1, 2, 0, 0, 0, 0, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 11, 11, 11, 12, 13, 14, 15, 15, 15, 15, 15, 16, 13, 0, 17, 0, 0, 0, 0, 0, 0, 18, 0, 19, 20, 0, 21, 19, 0, 11, 11, 11, 11, 11, 22, 11, 23, 15, 15, 15, 15, 15, 24, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 28, 29, 30, 31, 32, 33, 28, 31, 34, 28, 25, 31, 29, 31, 32, 26, 35, 34, 36, 28, 31, 26, 26, 26, 26, 27, 25, 25, 25, 25, 30, 31, 25, 25, 25, 25, 25, 25, 25, 15, 33, 30, 26, 23, 25, 25, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 37, 15, 15, 15, 15, 15, 15, 15, 15, 38, 36, 39, 40, 36, 36, 41, 0, 0, 0, 15, 42, 0, 43, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 25, 45, 46, 39, 0, 47, 22, 48, 32, 11, 11, 11, 49, 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, 50, 33, 34, 25, 25, 25, 25, 25, 25, 15, 51, 30, 32, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 52, 44, 53, 25, 25, 25, 25, 25, 28, 26, 26, 29, 25, 25, 25, 25, 25, 25, 0, 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 22, 54, 55, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 56, 0, 57, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 58, 59, 58, 0, 0, 36, 36, 36, 36, 36, 36, 60, 0, 36, 0, 0, 0, 61, 62, 0, 63, 44, 44, 64, 65, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 66, 44, 44, 44, 44, 44, 7, 7, 67, 68, 69, 36, 36, 36, 36, 36, 36, 36, 36, 70, 44, 71, 44, 72, 73, 74, 7, 7, 75, 76, 77, 0, 0, 78, 79, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, 44, 44, 64, 80, 36, 36, 36, 36, 36, 81, 44, 44, 82, 0, 0, 0, 7, 7, 75, 36, 36, 36, 36, 36, 36, 36, 66, 44, 44, 41, 83, 0, 36, 36, 36, 36, 36, 81, 84, 44, 44, 85, 85, 86, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 36, 36, 88, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 64, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 81, 89, 44, 44, 44, 44, 85, 44, 36, 36, 81, 90, 7, 7, 80, 36, 80, 36, 57, 80, 36, 76, 76, 36, 36, 36, 36, 36, 87, 36, 43, 40, 41, 89, 44, 91, 91, 92, 0, 93, 0, 94, 81, 95, 7, 7, 41, 0, 0, 0, 57, 80, 60, 96, 76, 36, 36, 36, 36, 36, 87, 36, 87, 97, 41, 73, 64, 93, 91, 86, 98, 0, 80, 43, 0, 95, 7, 7, 74, 99, 0, 0, 57, 80, 36, 94, 94, 36, 36, 36, 36, 36, 87, 36, 87, 80, 41, 89, 44, 58, 58, 86, 88, 0, 0, 0, 81, 95, 7, 7, 0, 0, 0, 0, 44, 91, 91, 86, 0, 100, 0, 94, 81, 95, 7, 7, 54, 0, 0, 0, 101, 80, 60, 40, 87, 41, 97, 87, 96, 88, 60, 40, 36, 36, 41, 100, 64, 100, 73, 86, 88, 93, 0, 0, 0, 95, 7, 7, 0, 0, 0, 0, 57, 80, 36, 87, 87, 36, 36, 36, 36, 36, 87, 36, 36, 80, 41, 102, 44, 73, 73, 86, 0, 59, 41, 0, 100, 80, 36, 87, 87, 36, 36, 36, 36, 36, 87, 36, 36, 80, 41, 89, 44, 73, 73, 86, 0, 59, 0, 103, 81, 95, 7, 7, 97, 0, 0, 0, 36, 36, 36, 36, 36, 36, 60, 102, 44, 73, 73, 92, 0, 93, 0, 0, 81, 95, 7, 7, 0, 0, 40, 36, 100, 80, 36, 36, 36, 60, 40, 36, 36, 36, 36, 36, 94, 36, 36, 54, 36, 60, 104, 93, 44, 105, 44, 44, 0, 0, 0, 0, 100, 0, 0, 0, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 79, 44, 64, 0, 36, 66, 44, 64, 7, 7, 106, 0, 97, 76, 43, 54, 0, 36, 80, 36, 80, 107, 40, 80, 79, 44, 58, 82, 36, 43, 44, 86, 7, 7, 106, 36, 88, 0, 0, 0, 0, 0, 86, 0, 7, 7, 106, 0, 0, 108, 109, 110, 36, 36, 80, 36, 36, 36, 36, 36, 36, 36, 36, 88, 57, 44, 44, 44, 44, 73, 36, 85, 44, 44, 57, 44, 44, 44, 44, 44, 44, 44, 44, 111, 0, 104, 0, 0, 0, 0, 0, 0, 36, 36, 66, 44, 44, 44, 44, 112, 7, 7, 113, 0, 36, 81, 74, 81, 89, 72, 44, 74, 85, 69, 36, 36, 81, 44, 44, 84, 7, 7, 114, 86, 11, 49, 0, 115, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 36, 36, 36, 87, 41, 36, 60, 87, 41, 36, 36, 87, 41, 36, 36, 36, 36, 36, 36, 36, 36, 87, 41, 36, 60, 87, 41, 36, 36, 36, 60, 36, 36, 36, 36, 36, 36, 87, 41, 36, 36, 36, 36, 36, 36, 36, 36, 60, 57, 116, 9, 117, 0, 0, 0, 0, 0, 36, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 36, 88, 0, 0, 36, 36, 36, 118, 36, 36, 36, 36, 119, 36, 36, 36, 36, 36, 120, 121, 36, 36, 60, 40, 88, 0, 0, 0, 36, 36, 36, 87, 81, 111, 0, 0, 36, 36, 36, 36, 81, 122, 0, 0, 36, 36, 36, 36, 81, 0, 0, 0, 36, 36, 36, 87, 123, 0, 0, 0, 36, 36, 36, 36, 36, 44, 44, 44, 44, 44, 44, 44, 44, 96, 0, 99, 7, 7, 106, 0, 0, 0, 0, 0, 124, 0, 125, 126, 7, 7, 106, 0, 36, 36, 36, 36, 36, 36, 0, 0, 36, 36, 127, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, 44, 0, 44, 44, 44, 0, 0, 90, 7, 7, 36, 36, 36, 36, 36, 36, 36, 41, 36, 88, 0, 0, 36, 36, 36, 0, 44, 44, 44, 44, 69, 36, 86, 0, 7, 7, 106, 0, 36, 36, 36, 36, 36, 66, 44, 0, 36, 36, 36, 36, 36, 85, 44, 64, 44, 44, 44, 44, 44, 44, 44, 91, 7, 7, 106, 0, 7, 7, 106, 0, 0, 96, 128, 0, 0, 0, 0, 0, 44, 69, 36, 36, 36, 36, 36, 36, 44, 69, 36, 0, 7, 7, 113, 129, 0, 0, 93, 44, 44, 0, 0, 0, 112, 36, 36, 36, 36, 36, 36, 36, 85, 44, 44, 74, 7, 7, 75, 36, 36, 81, 44, 44, 44, 0, 0, 0, 36, 44, 44, 44, 44, 44, 9, 117, 7, 7, 106, 80, 7, 7, 75, 36, 36, 36, 36, 36, 36, 36, 36, 130, 0, 0, 0, 0, 64, 44, 44, 44, 44, 44, 69, 79, 81, 131, 0, 0, 44, 64, 0, 0, 0, 0, 0, 44, 25, 25, 25, 25, 25, 34, 15, 27, 15, 15, 11, 11, 15, 39, 11, 132, 15, 15, 11, 11, 15, 15, 11, 11, 15, 39, 11, 132, 15, 15, 133, 133, 15, 15, 11, 11, 15, 15, 15, 39, 15, 15, 11, 11, 15, 134, 11, 135, 46, 134, 11, 136, 15, 46, 11, 0, 15, 15, 11, 136, 46, 134, 11, 136, 137, 137, 138, 139, 140, 141, 142, 142, 0, 143, 144, 145, 0, 0, 146, 147, 0, 148, 147, 0, 0, 0, 0, 149, 61, 150, 61, 61, 21, 0, 0, 151, 0, 0, 0, 146, 15, 15, 15, 42, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 111, 0, 0, 0, 47, 152, 153, 154, 23, 115, 10, 132, 0, 155, 48, 156, 11, 38, 157, 33, 0, 158, 39, 159, 0, 0, 0, 0, 160, 38, 88, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 11, 11, 15, 15, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 162, 0, 0, 142, 142, 142, 5, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 163, 142, 142, 0, 0, 0, 0, 4, 142, 142, 142, 142, 142, 121, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 5, 11, 11, 11, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 31, 164, 26, 32, 25, 29, 15, 33, 25, 42, 152, 165, 53, 0, 0, 0, 15, 166, 0, 21, 36, 36, 36, 36, 36, 36, 0, 96, 0, 0, 0, 93, 36, 36, 36, 36, 36, 60, 0, 0, 36, 60, 36, 60, 36, 60, 36, 60, 142, 142, 142, 5, 0, 0, 0, 5, 142, 142, 5, 167, 0, 0, 0, 0, 168, 80, 142, 142, 5, 142, 142, 169, 80, 36, 81, 44, 80, 41, 36, 88, 36, 36, 36, 36, 36, 60, 59, 80, 0, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 80, 36, 36, 36, 36, 36, 36, 60, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 60, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 88, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 170, 36, 36, 36, 171, 36, 36, 36, 36, 7, 7, 75, 0, 0, 0, 0, 0, 25, 25, 25, 172, 64, 44, 44, 173, 25, 25, 25, 25, 25, 25, 0, 93, 36, 36, 36, 36, 174, 9, 0, 0, 0, 0, 0, 0, 0, 96, 36, 36, 175, 25, 25, 25, 27, 25, 25, 25, 25, 25, 25, 25, 15, 15, 26, 30, 25, 25, 176, 177, 25, 0, 0, 0, 25, 25, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 36, 180, 180, 66, 36, 36, 36, 36, 36, 66, 44, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 129, 0, 0, 74, 36, 36, 36, 36, 36, 36, 36, 44, 111, 0, 129, 7, 7, 106, 0, 44, 44, 44, 44, 74, 36, 96, 0, 36, 81, 44, 174, 36, 36, 36, 36, 36, 66, 44, 44, 44, 0, 0, 0, 36, 36, 36, 36, 66, 44, 44, 44, 111, 0, 147, 96, 7, 7, 106, 0, 36, 36, 85, 44, 44, 64, 0, 0, 66, 36, 36, 86, 7, 7, 106, 181, 36, 36, 36, 36, 36, 60, 182, 0, 36, 36, 36, 36, 89, 72, 69, 81, 127, 0, 0, 0, 0, 0, 96, 41, 36, 36, 66, 44, 183, 184, 0, 0, 80, 60, 80, 60, 80, 60, 0, 0, 36, 60, 36, 60, 0, 0, 0, 0, 66, 44, 185, 86, 7, 7, 106, 0, 36, 0, 0, 0, 36, 36, 36, 36, 36, 60, 96, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 41, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 15, 24, 0, 0, 186, 15, 0, 187, 36, 36, 87, 36, 36, 60, 36, 43, 94, 87, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 96, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 188, 36, 36, 36, 36, 40, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 0, 44, 44, 44, 44, 189, 4, 121, 0, 44, 64, 0, 0, 190, 169, 142, 142, 142, 191, 121, 0, 6, 192, 193, 162, 140, 0, 0, 0, 36, 87, 36, 36, 36, 36, 36, 36, 36, 36, 36, 194, 56, 0, 5, 6, 0, 0, 195, 9, 14, 15, 15, 15, 15, 15, 16, 196, 197, 198, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 81, 36, 36, 36, 36, 36, 36, 36, 60, 40, 36, 40, 36, 40, 36, 40, 88, 0, 0, 0, 0, 0, 0, 199, 0, 36, 36, 36, 80, 36, 36, 36, 36, 36, 60, 36, 36, 36, 36, 60, 94, 36, 36, 36, 41, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 98, 36, 36, 36, 36, 88, 0, 0, 0, 36, 36, 60, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 41, 36, 0, 36, 36, 80, 41, 0, 0, 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 36, 36, 36, 36, 36, 41, 87, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 94, 88, 76, 36, 36, 36, 36, 36, 36, 0, 40, 85, 59, 0, 44, 36, 80, 80, 36, 36, 36, 36, 36, 36, 0, 64, 93, 0, 0, 0, 0, 0, 129, 0, 0, 36, 36, 36, 36, 60, 0, 0, 0, 36, 36, 88, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 44, 44, 44, 185, 117, 0, 0, 0, 0, 0, 36, 36, 36, 36, 44, 44, 64, 200, 147, 0, 0, 0, 36, 36, 36, 36, 36, 36, 88, 0, 7, 7, 106, 0, 36, 66, 44, 44, 44, 201, 7, 7, 181, 0, 0, 0, 0, 0, 0, 0, 69, 202, 0, 0, 7, 7, 106, 0, 36, 36, 66, 44, 44, 44, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 88, 0, 36, 88, 0, 0, 85, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 64, 0, 0, 0, 93, 112, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 57, 86, 57, 203, 61, 204, 44, 64, 57, 44, 0, 0, 0, 0, 0, 0, 0, 100, 86, 0, 0, 0, 0, 100, 111, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 134, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 48, 47, 205, 10, 48, 11, 154, 166, 14, 15, 14, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 49, 22, 10, 11, 48, 11, 206, 15, 15, 15, 15, 15, 15, 49, 22, 11, 155, 161, 11, 206, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 154, 15, 15, 15, 15, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 15, 39, 11, 11, 11, 11, 11, 11, 206, 15, 15, 15, 15, 15, 24, 15, 33, 11, 11, 11, 11, 11, 22, 15, 15, 15, 15, 15, 15, 134, 15, 11, 11, 11, 11, 11, 11, 206, 15, 15, 15, 15, 15, 24, 15, 33, 11, 11, 15, 15, 134, 15, 11, 11, 11, 11, 11, 11, 206, 15, 15, 15, 15, 15, 24, 15, 27, 95, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 36, 80, 36, 36, 36, 36, 36, 36, 97, 76, 80, 36, 60, 36, 107, 0, 103, 96, 107, 80, 97, 76, 107, 107, 97, 76, 60, 36, 60, 36, 80, 43, 36, 36, 94, 36, 36, 36, 36, 0, 80, 80, 94, 36, 36, 36, 36, 0, 20, 0, 0, 0, 0, 0, 0, 0, 61, 61, 61, 61, 61, 61, 61, 61, 44, 44, 44, 44, 0, 0, 0, 0, }; static RE_UINT8 re_sentence_break_stage_5[] = { 0, 0, 0, 0, 0, 6, 2, 6, 6, 1, 0, 0, 6, 12, 13, 0, 0, 0, 0, 13, 13, 13, 0, 0, 14, 14, 11, 0, 10, 10, 10, 10, 10, 10, 14, 0, 0, 0, 0, 12, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 0, 13, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 13, 0, 4, 0, 0, 6, 0, 0, 0, 0, 0, 7, 13, 0, 5, 0, 0, 0, 7, 0, 0, 8, 8, 8, 0, 8, 8, 8, 7, 7, 7, 7, 0, 8, 7, 8, 7, 7, 8, 7, 8, 7, 7, 8, 7, 8, 8, 7, 8, 7, 8, 7, 7, 7, 8, 8, 7, 8, 7, 8, 8, 7, 8, 8, 8, 7, 7, 8, 8, 8, 7, 7, 7, 8, 7, 7, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 9, 9, 9, 7, 7, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 7, 0, 0, 0, 9, 0, 9, 0, 3, 3, 3, 3, 9, 0, 8, 7, 0, 0, 7, 7, 0, 0, 8, 0, 8, 0, 8, 8, 8, 8, 0, 8, 7, 7, 7, 8, 8, 7, 0, 8, 8, 7, 0, 3, 3, 3, 8, 7, 0, 9, 0, 0, 12, 14, 12, 0, 0, 12, 0, 0, 0, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3, 0, 9, 9, 9, 0, 5, 5, 5, 5, 5, 0, 0, 0, 14, 14, 0, 0, 3, 3, 3, 0, 5, 0, 0, 12, 9, 9, 9, 3, 10, 10, 0, 10, 10, 0, 9, 9, 3, 9, 9, 9, 12, 9, 3, 3, 3, 5, 0, 3, 3, 9, 9, 3, 3, 0, 3, 3, 3, 3, 9, 9, 10, 10, 9, 9, 9, 0, 0, 9, 12, 12, 12, 0, 0, 0, 0, 5, 9, 3, 9, 9, 0, 9, 9, 9, 9, 9, 3, 3, 3, 9, 0, 0, 14, 12, 9, 0, 3, 3, 9, 3, 9, 3, 3, 3, 3, 3, 0, 0, 9, 0, 9, 9, 9, 0, 0, 0, 3, 9, 3, 3, 12, 12, 10, 10, 3, 0, 0, 3, 3, 3, 9, 0, 0, 0, 0, 3, 9, 9, 0, 9, 0, 0, 10, 10, 0, 0, 0, 9, 0, 9, 9, 0, 0, 3, 0, 0, 9, 3, 0, 0, 0, 0, 3, 3, 0, 0, 3, 9, 0, 9, 3, 3, 0, 0, 9, 0, 0, 0, 3, 0, 3, 0, 3, 0, 10, 10, 0, 0, 0, 9, 0, 9, 0, 3, 0, 3, 0, 3, 13, 13, 13, 13, 3, 3, 3, 0, 0, 0, 3, 3, 3, 9, 10, 10, 12, 12, 10, 10, 3, 3, 0, 8, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 9, 0, 12, 9, 6, 9, 9, 9, 9, 9, 9, 13, 13, 0, 0, 0, 3, 12, 12, 0, 9, 0, 3, 3, 0, 0, 14, 12, 14, 12, 0, 3, 3, 3, 5, 0, 9, 3, 9, 0, 12, 12, 12, 12, 0, 0, 12, 12, 9, 9, 12, 12, 3, 9, 9, 0, 8, 8, 0, 0, 0, 8, 0, 8, 7, 0, 7, 7, 8, 0, 7, 0, 8, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 5, 3, 3, 5, 5, 0, 0, 0, 14, 14, 0, 0, 0, 13, 13, 13, 13, 11, 0, 0, 0, 4, 4, 5, 5, 5, 5, 5, 6, 0, 13, 13, 0, 12, 12, 0, 0, 0, 13, 13, 12, 0, 0, 0, 6, 5, 0, 5, 5, 0, 13, 13, 7, 0, 0, 0, 8, 0, 0, 7, 8, 8, 8, 7, 7, 8, 0, 8, 0, 8, 8, 0, 7, 9, 7, 0, 0, 0, 8, 7, 7, 0, 0, 7, 0, 9, 9, 9, 8, 0, 0, 8, 8, 13, 13, 13, 0, 0, 0, 13, 13, 8, 7, 7, 8, 7, 8, 7, 3, 7, 7, 0, 7, 0, 0, 12, 9, 6, 14, 12, 0, 0, 13, 13, 13, 9, 9, 0, 12, 9, 0, 12, 12, 8, 7, 9, 3, 3, 3, 0, 9, 3, 3, 0, 12, 0, 0, 8, 7, 9, 0, 0, 8, 7, 8, 7, 0, 8, 7, 8, 0, 7, 7, 7, 9, 9, 9, 3, 9, 0, 12, 12, 12, 0, 0, 9, 3, 12, 12, 9, 9, 9, 3, 3, 0, 3, 3, 3, 12, 0, 0, 0, 7, 0, 9, 3, 9, 9, 9, 13, 13, 14, 14, 0, 14, 0, 14, 14, 0, 13, 0, 0, 13, 0, 14, 12, 12, 14, 13, 13, 13, 9, 0, 0, 5, 0, 0, 14, 0, 0, 13, 0, 13, 13, 12, 13, 13, 14, 0, 9, 9, 0, 5, 5, 5, 0, 5, 12, 12, 3, 0, 10, 10, 9, 12, 12, 0, 3, 3, 3, 5, 5, 5, 5, 3, 0, 8, 8, 0, 8, 0, 7, 7, }; /* Sentence_Break: 5596 bytes. */ RE_UINT32 re_get_sentence_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_sentence_break_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_sentence_break_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_sentence_break_stage_3[pos + f] << 3; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_sentence_break_stage_4[pos + f] << 2; value = re_sentence_break_stage_5[pos + code]; return value; } /* Math. */ static RE_UINT8 re_math_stage_1[] = { 0, 1, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_math_stage_2[] = { 0, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 6, 1, 1, }; static RE_UINT8 re_math_stage_3[] = { 0, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, 6, 6, 11, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 13, 14, 1, 1, 1, 1, 15, 16, 17, 18, 1, 1, 1, 1, 1, 1, 19, 1, }; static RE_UINT8 re_math_stage_4[] = { 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 0, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 25, 0, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 31, 32, 33, 34, 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 0, 19, 37, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 40, 23, 23, 41, 23, 42, 43, 44, 23, 45, 46, 47, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 48, 23, 23, 23, 23, 23, 23, 23, 23, 49, 23, 44, 50, 51, 52, 53, 54, 0, 55, }; static RE_UINT8 re_math_stage_5[] = { 0, 0, 0, 0, 0, 8, 0, 112, 0, 0, 0, 64, 0, 0, 0, 80, 0, 16, 2, 0, 0, 0, 128, 0, 0, 0, 39, 0, 0, 0, 115, 0, 192, 1, 0, 0, 0, 0, 64, 0, 0, 0, 28, 0, 17, 0, 4, 0, 30, 0, 0, 124, 0, 124, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 63, 16, 179, 251, 241, 255, 11, 0, 0, 0, 0, 255, 255, 255, 126, 195, 240, 255, 255, 255, 47, 48, 0, 240, 255, 255, 255, 255, 255, 0, 15, 0, 0, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 248, 255, 255, 191, 0, 0, 0, 1, 240, 7, 0, 0, 0, 3, 192, 255, 240, 195, 140, 15, 0, 148, 31, 0, 255, 96, 0, 0, 0, 5, 0, 0, 0, 15, 224, 0, 0, 159, 31, 0, 0, 0, 2, 0, 0, 126, 1, 0, 0, 4, 30, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0, }; /* Math: 538 bytes. */ RE_UINT32 re_get_math(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_math_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_math_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_math_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_math_stage_4[pos + f] << 5; pos += code; value = (re_math_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Alphabetic. */ static RE_UINT8 re_alphabetic_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_alphabetic_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_alphabetic_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, 53, 54, 55, 56, 57, 31, 31, 31, 58, 59, 60, 61, 62, 31, 31, 31, 63, 64, 31, 31, 31, 31, 65, 31, 1, 1, 1, 66, 67, 31, 31, 31, 1, 1, 1, 1, 68, 31, 31, 31, 1, 1, 69, 31, 31, 31, 31, 70, 71, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 72, 73, 74, 75, 31, 31, 31, 31, 31, 31, 76, 31, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 78, 79, 31, 31, 31, 31, 31, 31, 31, 1, 1, 79, 31, 31, 31, 31, 31, }; static RE_UINT8 re_alphabetic_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 7, 8, 9, 10, 4, 11, 4, 4, 4, 4, 12, 4, 4, 4, 4, 13, 14, 15, 16, 17, 18, 19, 20, 4, 21, 22, 4, 4, 23, 24, 25, 4, 26, 4, 4, 27, 28, 29, 30, 31, 32, 0, 0, 33, 0, 34, 4, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 38, 47, 50, 51, 52, 53, 54, 0, 55, 56, 57, 49, 58, 56, 59, 60, 58, 61, 62, 63, 64, 65, 66, 67, 15, 68, 69, 0, 70, 71, 72, 0, 73, 0, 74, 75, 76, 77, 0, 0, 4, 78, 25, 79, 80, 4, 81, 82, 4, 4, 83, 4, 84, 85, 86, 4, 87, 4, 88, 0, 89, 4, 4, 90, 15, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 91, 1, 4, 4, 92, 93, 94, 94, 95, 4, 96, 97, 0, 0, 4, 4, 98, 4, 99, 4, 100, 77, 101, 25, 102, 4, 103, 104, 0, 105, 4, 106, 107, 0, 108, 0, 0, 4, 109, 110, 0, 4, 111, 4, 112, 4, 100, 113, 114, 0, 0, 0, 115, 4, 4, 4, 4, 4, 4, 0, 0, 116, 4, 117, 114, 4, 118, 119, 120, 0, 0, 0, 121, 122, 0, 0, 0, 123, 124, 125, 4, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 4, 104, 4, 128, 106, 4, 4, 4, 4, 129, 4, 81, 4, 130, 131, 132, 132, 4, 0, 133, 0, 0, 0, 0, 0, 0, 134, 135, 15, 4, 136, 15, 4, 82, 137, 138, 4, 4, 139, 68, 0, 25, 4, 4, 4, 4, 4, 100, 0, 0, 4, 4, 4, 4, 4, 4, 31, 0, 4, 4, 4, 4, 31, 0, 25, 114, 140, 141, 4, 142, 143, 4, 4, 89, 144, 145, 4, 4, 146, 147, 0, 148, 149, 16, 4, 94, 4, 4, 49, 150, 28, 99, 151, 77, 4, 152, 133, 0, 4, 131, 153, 154, 4, 106, 155, 156, 157, 158, 0, 0, 0, 0, 4, 147, 4, 4, 4, 4, 4, 159, 160, 105, 4, 4, 4, 161, 4, 4, 162, 0, 163, 164, 165, 4, 4, 27, 166, 4, 4, 114, 25, 4, 167, 4, 16, 168, 0, 0, 0, 169, 4, 4, 4, 77, 0, 1, 1, 170, 4, 106, 171, 0, 172, 173, 174, 0, 4, 4, 4, 68, 0, 0, 4, 90, 0, 0, 0, 0, 0, 0, 0, 0, 77, 4, 175, 0, 106, 25, 147, 0, 114, 4, 176, 0, 4, 4, 4, 4, 114, 0, 0, 0, 177, 178, 100, 0, 0, 0, 0, 0, 100, 162, 0, 0, 4, 179, 0, 0, 180, 94, 0, 77, 0, 0, 0, 0, 4, 100, 100, 151, 0, 0, 0, 0, 4, 4, 126, 0, 0, 0, 0, 0, 4, 4, 181, 0, 145, 32, 25, 126, 4, 151, 0, 0, 4, 4, 182, 0, 0, 0, 0, 0, 4, 100, 0, 0, 4, 4, 4, 139, 0, 0, 0, 0, 4, 4, 4, 183, 0, 0, 0, 0, 4, 139, 0, 0, 0, 0, 0, 0, 4, 32, 0, 0, 0, 0, 0, 0, 4, 4, 184, 106, 166, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 4, 4, 186, 4, 187, 188, 189, 4, 190, 191, 192, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 193, 194, 82, 186, 186, 128, 128, 195, 195, 196, 0, 189, 197, 198, 199, 200, 201, 0, 0, 4, 4, 4, 4, 4, 4, 131, 0, 4, 90, 4, 4, 4, 4, 4, 4, 114, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_alphabetic_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 32, 0, 0, 0, 0, 0, 223, 60, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 7, 7, 0, 0, 0, 255, 7, 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, 254, 225, 0, 156, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, 253, 31, 0, 0, 240, 3, 255, 127, 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 254, 238, 159, 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 0, 238, 135, 249, 255, 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, 238, 191, 251, 255, 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 0, 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 29, 129, 0, 238, 223, 253, 255, 255, 253, 239, 227, 223, 29, 96, 3, 236, 223, 253, 255, 223, 29, 96, 64, 15, 0, 6, 0, 255, 255, 255, 231, 223, 93, 128, 0, 15, 0, 0, 252, 236, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, 255, 255, 255, 7, 127, 32, 0, 0, 150, 37, 240, 254, 174, 236, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, 231, 193, 255, 255, 127, 64, 0, 48, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 135, 255, 255, 0, 0, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, 255, 1, 128, 16, 255, 255, 255, 0, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 255, 15, 255, 255, 255, 127, 254, 255, 31, 0, 128, 0, 0, 0, 255, 255, 239, 255, 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, 0, 224, 0, 252, 255, 255, 255, 63, 0, 222, 111, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 255, 255, 127, 0, 127, 127, 127, 127, 0, 128, 0, 0, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, 255, 255, 255, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 255, 7, 0, 0, 0, 0, 0, 255, 187, 247, 255, 255, 0, 0, 252, 8, 255, 255, 7, 0, 255, 255, 247, 255, 255, 63, 0, 0, 255, 255, 127, 4, 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, 127, 127, 0, 0, 15, 0, 255, 255, 127, 248, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 111, 240, 239, 254, 63, 0, 0, 0, 30, 0, 0, 0, 7, 0, 0, 0, 31, 0, 255, 255, 3, 0, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* Alphabetic: 1817 bytes. */ RE_UINT32 re_get_alphabetic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_alphabetic_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_alphabetic_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_alphabetic_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_alphabetic_stage_4[pos + f] << 5; pos += code; value = (re_alphabetic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Lowercase. */ static RE_UINT8 re_lowercase_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_lowercase_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_lowercase_stage_3[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 3, 7, 3, 3, 3, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 3, 11, 3, 3, 12, 3, 3, 3, 3, 3, 3, 3, 13, 14, 3, 3, 3, 3, }; static RE_UINT8 re_lowercase_stage_4[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, 0, 26, 15, 5, 27, 5, 28, 5, 5, 29, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 5, 5, 5, 5, 32, 5, 5, 5, 33, 34, 35, 36, 34, 37, 38, 39, 0, 0, 0, 40, 41, 0, 0, 0, 42, 43, 44, 26, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 47, 48, 5, 5, 5, 49, 15, 50, 0, 0, 0, 0, 0, 0, 0, 0, 5, 51, 52, 0, 0, 0, 0, 53, 5, 54, 55, 56, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 63, 31, 64, 65, 66, 67, 68, 69, 70, 71, 72, 61, 62, 73, 31, 64, 74, 60, 67, 75, 76, 77, 78, 74, 79, 26, 80, 67, 81, 0, }; static RE_UINT8 re_lowercase_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 0, 0, 0, 128, 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 85, 85, 171, 170, 170, 170, 170, 170, 212, 41, 49, 36, 78, 42, 45, 81, 230, 64, 82, 85, 181, 170, 170, 41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 138, 60, 0, 0, 1, 0, 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 25, 0, 0, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 0, 0, 0, 254, 255, 255, 255, 255, 0, 0, 0, 170, 170, 234, 191, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, 255, 0, 220, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 196, 8, 0, 0, 128, 16, 50, 192, 67, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 218, 63, 26, 80, 8, 0, 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 0, 168, 170, 171, 170, 170, 170, 255, 149, 170, 80, 10, 0, 170, 2, 0, 0, 0, 0, 0, 7, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 223, 255, 252, 255, 255, 15, 0, 0, 192, 235, 239, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 255, 255, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 255, 255, 255, 0, 192, 255, 255, 0, 0, 192, 255, 63, 0, 0, 0, 252, 255, 255, 247, 3, 0, 0, 240, 255, 255, 223, 15, 255, 127, 63, 0, 255, 253, 0, 0, 247, 11, 0, 0, }; /* Lowercase: 697 bytes. */ RE_UINT32 re_get_lowercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_lowercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_lowercase_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_lowercase_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_lowercase_stage_4[pos + f] << 5; pos += code; value = (re_lowercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Uppercase. */ static RE_UINT8 re_uppercase_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_uppercase_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_uppercase_stage_3[] = { 0, 1, 2, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 5, 6, 3, 7, 3, 3, 3, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 3, 3, 11, 3, 3, 3, 3, 3, 3, 3, 12, 13, 3, 3, 3, 3, }; static RE_UINT8 re_uppercase_stage_4[] = { 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 25, 3, 3, 3, 26, 27, 28, 29, 0, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 19, 36, 0, 0, 0, 0, 0, 0, 0, 0, 37, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 38, 0, 39, 3, 3, 3, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 42, 0, 0, 0, 0, 43, 3, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 18, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 48, 49, 50, 51, 61, 62, 54, 55, 51, 63, 64, 65, 66, 37, 38, 54, 67, 68, 0, }; static RE_UINT8 re_uppercase_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, 213, 210, 174, 17, 144, 164, 170, 74, 85, 85, 210, 85, 85, 85, 5, 108, 122, 85, 0, 0, 0, 0, 69, 0, 64, 215, 254, 255, 251, 15, 0, 0, 0, 128, 28, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, 85, 0, 254, 255, 255, 255, 127, 0, 191, 32, 0, 0, 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 31, 0, 15, 132, 56, 39, 62, 80, 61, 15, 192, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 0, 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 5, 0, 85, 5, 0, 0, 255, 0, 0, 0, 255, 255, 255, 3, 0, 0, 240, 255, 255, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 208, 100, 222, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 176, 231, 223, 31, 0, 0, 0, 123, 95, 252, 1, 0, 0, 240, 255, 255, 63, 0, 0, 0, 3, 0, 0, 240, 255, 255, 63, 0, 1, 0, 0, 0, 252, 255, 255, 7, 0, 0, 0, 240, 255, 255, 31, 0, 255, 1, 0, 0, 0, 4, 0, 0, }; /* Uppercase: 629 bytes. */ RE_UINT32 re_get_uppercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_uppercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_uppercase_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_uppercase_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_uppercase_stage_4[pos + f] << 5; pos += code; value = (re_uppercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Cased. */ static RE_UINT8 re_cased_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_cased_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_cased_stage_3[] = { 0, 1, 2, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 6, 7, 3, 8, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 11, 3, 12, 3, 3, 13, 3, 3, 3, 3, 3, 3, 3, 14, 15, 3, 3, 3, 3, }; static RE_UINT8 re_cased_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 5, 6, 4, 4, 4, 4, 4, 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, 4, 15, 4, 4, 4, 4, 16, 4, 4, 4, 4, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 22, 4, 23, 24, 4, 25, 26, 27, 0, 0, 0, 28, 29, 0, 0, 0, 30, 31, 32, 4, 33, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 35, 0, 0, 0, 0, 0, 0, 0, 0, 4, 36, 37, 4, 4, 4, 4, 38, 4, 21, 0, 0, 0, 0, 0, 0, 0, 0, 4, 39, 40, 0, 0, 0, 0, 41, 4, 4, 42, 43, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 4, 4, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 47, 4, 48, 49, 50, 4, 51, 52, 53, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, 55, 5, 47, 47, 36, 36, 56, 56, 57, 0, }; static RE_UINT8 re_cased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 207, 60, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, 191, 32, 0, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 31, 242, 224, 67, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, 255, 63, 0, 0, 255, 255, 255, 0, 252, 255, 255, 255, 255, 120, 15, 0, 255, 7, 0, 0, 0, 0, 0, 7, 127, 0, 248, 0, 255, 255, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, }; /* Cased: 617 bytes. */ RE_UINT32 re_get_cased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_cased_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_cased_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_cased_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_cased_stage_4[pos + f] << 5; pos += code; value = (re_cased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Case_Ignorable. */ static RE_UINT8 re_case_ignorable_stage_1[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, }; static RE_UINT8 re_case_ignorable_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 11, 12, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }; static RE_UINT8 re_case_ignorable_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 1, 17, 1, 1, 1, 18, 19, 20, 21, 22, 23, 24, 1, 25, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 28, 29, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 32, 1, 33, 34, 35, 36, 37, 38, 1, 1, 1, 1, 1, 1, 1, 39, 1, 1, 40, 41, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 43, 1, 1, 1, 1, 1, 44, 45, 1, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 48, 49, 1, 1, 1, 1, 1, 50, 51, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_case_ignorable_stage_4[] = { 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 6, 6, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 14, 15, 0, 16, 17, 0, 0, 18, 19, 20, 5, 21, 0, 0, 22, 0, 23, 24, 25, 26, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 33, 37, 38, 36, 33, 39, 35, 32, 40, 41, 35, 42, 0, 43, 0, 0, 44, 45, 35, 0, 40, 46, 35, 0, 0, 34, 35, 0, 0, 47, 0, 0, 48, 49, 0, 0, 50, 51, 0, 52, 53, 0, 54, 55, 56, 57, 0, 0, 58, 59, 60, 61, 0, 0, 33, 0, 0, 62, 0, 0, 0, 0, 0, 63, 63, 64, 64, 0, 65, 66, 0, 67, 0, 68, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 71, 0, 72, 73, 0, 74, 0, 0, 75, 76, 42, 77, 78, 79, 0, 80, 0, 81, 0, 82, 0, 0, 83, 84, 0, 85, 6, 86, 87, 6, 6, 88, 0, 0, 0, 0, 0, 89, 90, 91, 92, 93, 0, 94, 95, 0, 5, 96, 0, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 101, 102, 0, 0, 103, 0, 0, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 106, 0, 0, 107, 108, 0, 0, 109, 6, 78, 0, 17, 110, 0, 0, 52, 111, 112, 0, 0, 0, 0, 113, 114, 0, 115, 116, 0, 28, 117, 100, 0, 0, 118, 119, 17, 0, 120, 121, 122, 0, 0, 0, 0, 0, 0, 0, 123, 2, 0, 0, 0, 0, 124, 78, 0, 125, 126, 127, 0, 0, 0, 0, 108, 1, 2, 3, 17, 44, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 129, 130, 131, 0, 0, 0, 0, 0, 0, 32, 132, 126, 0, 78, 133, 0, 0, 28, 134, 0, 0, 78, 135, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 138, 139, 140, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 32, 6, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 142, }; static RE_UINT8 re_case_ignorable_stage_5[] = { 0, 0, 0, 0, 128, 64, 0, 4, 0, 0, 0, 64, 1, 0, 0, 0, 0, 161, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 48, 4, 176, 0, 0, 0, 248, 3, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 16, 0, 31, 0, 255, 23, 1, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 191, 255, 61, 0, 0, 0, 128, 2, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 4, 0, 0, 192, 255, 255, 63, 0, 0, 0, 0, 0, 14, 240, 255, 255, 127, 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 16, 30, 32, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 0, 0, 0, 144, 30, 32, 64, 0, 4, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 192, 193, 61, 96, 0, 64, 48, 0, 0, 0, 4, 92, 0, 0, 0, 242, 7, 192, 127, 0, 0, 0, 0, 242, 27, 64, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 143, 32, 0, 120, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 128, 0, 0, 0, 15, 0, 0, 0, 0, 0, 208, 23, 0, 248, 15, 0, 3, 0, 0, 0, 60, 11, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 0, 63, 0, 0, 247, 255, 253, 33, 16, 0, 0, 240, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 127, 0, 0, 240, 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, 0, 248, 0, 3, 144, 124, 0, 0, 223, 255, 2, 128, 0, 0, 255, 31, 255, 255, 1, 0, 0, 0, 0, 48, 0, 128, 3, 0, 0, 128, 0, 128, 0, 128, 0, 0, 32, 0, 0, 0, 0, 60, 62, 8, 0, 0, 0, 126, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, 0, 128, 247, 191, 0, 0, 0, 128, 0, 0, 3, 0, 0, 7, 0, 0, 68, 8, 0, 0, 96, 0, 0, 0, 16, 0, 0, 0, 255, 255, 3, 0, 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 19, 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, 2, 0, 0, 32, 0, 48, 88, 0, 32, 33, 0, 0, 0, 0, 252, 255, 255, 255, 8, 0, 127, 0, 0, 0, 0, 0, 36, 0, 8, 0, 0, 14, 0, 0, 0, 32, 110, 240, 0, 0, 0, 0, 0, 135, 0, 0, 0, 255, 0, 0, 120, 38, 128, 239, 31, 0, 0, 0, 192, 127, 0, 40, 191, 0, 0, 128, 255, 255, 128, 3, 248, 255, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 0, 0, }; /* Case_Ignorable: 1254 bytes. */ RE_UINT32 re_get_case_ignorable(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_case_ignorable_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_case_ignorable_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_case_ignorable_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_case_ignorable_stage_4[pos + f] << 5; pos += code; value = (re_case_ignorable_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Lowercased. */ static RE_UINT8 re_changes_when_lowercased_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_lowercased_stage_2[] = { 0, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_lowercased_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 15, 6, 6, 6, 6, 16, 6, 6, 6, }; static RE_UINT8 re_changes_when_lowercased_stage_4[] = { 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 24, 0, 3, 3, 3, 3, 25, 3, 3, 3, 26, 27, 28, 29, 27, 30, 31, 32, 0, 33, 0, 19, 34, 0, 0, 0, 0, 0, 0, 0, 0, 35, 19, 0, 18, 36, 0, 37, 3, 3, 3, 38, 0, 0, 3, 39, 40, 0, 0, 0, 0, 41, 3, 42, 43, 44, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 18, 45, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_lowercased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, 122, 85, 0, 0, 0, 0, 69, 0, 64, 215, 254, 255, 251, 15, 0, 0, 0, 128, 0, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, 85, 0, 254, 255, 255, 255, 127, 0, 191, 32, 0, 0, 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, 0, 255, 0, 31, 0, 31, 0, 15, 0, 31, 0, 31, 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 0, 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 5, 0, 85, 5, 0, 0, 255, 0, 0, 0, }; /* Changes_When_Lowercased: 490 bytes. */ RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_lowercased_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_lowercased_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_lowercased_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_lowercased_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_lowercased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Uppercased. */ static RE_UINT8 re_changes_when_uppercased_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_uppercased_stage_2[] = { 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_uppercased_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 13, 6, 6, 6, 6, 6, 6, 6, 6, 14, 15, 6, 6, 6, 16, 6, 6, 6, 17, 6, 6, 6, 6, 18, 6, 6, 6, }; static RE_UINT8 re_changes_when_uppercased_stage_4[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 5, 5, 5, 5, 31, 5, 5, 5, 32, 33, 34, 35, 24, 36, 37, 38, 0, 0, 39, 23, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 41, 0, 23, 42, 43, 5, 5, 5, 44, 24, 45, 0, 0, 0, 0, 0, 0, 0, 0, 5, 46, 47, 0, 0, 0, 0, 48, 5, 49, 50, 51, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_uppercased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 96, 91, 85, 181, 170, 170, 45, 170, 168, 170, 10, 144, 133, 170, 223, 10, 105, 139, 38, 32, 9, 31, 4, 0, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 39, 9, 0, 0, 255, 255, 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 0, 0, 0, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 34, 170, 170, 234, 15, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 255, 223, 80, 220, 16, 207, 0, 255, 0, 220, 16, 0, 64, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 0, 168, 170, 168, 170, 170, 170, 0, 148, 170, 16, 10, 0, 170, 2, 0, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, }; /* Changes_When_Uppercased: 534 bytes. */ RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_uppercased_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_uppercased_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_uppercased_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_uppercased_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_uppercased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Titlecased. */ static RE_UINT8 re_changes_when_titlecased_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_titlecased_stage_2[] = { 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_titlecased_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 13, 6, 6, 6, 6, 6, 6, 6, 6, 14, 15, 6, 6, 6, 16, 6, 6, 6, 17, 6, 6, 6, 6, 18, 6, 6, 6, }; static RE_UINT8 re_changes_when_titlecased_stage_4[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 5, 5, 5, 5, 31, 5, 5, 5, 32, 33, 34, 35, 33, 36, 37, 38, 0, 0, 39, 23, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 41, 0, 23, 42, 43, 5, 5, 5, 44, 24, 45, 0, 0, 0, 0, 0, 0, 0, 0, 5, 46, 47, 0, 0, 0, 0, 48, 5, 49, 50, 51, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_titlecased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 208, 86, 85, 181, 170, 170, 43, 170, 168, 170, 10, 144, 133, 170, 223, 10, 105, 139, 38, 32, 9, 31, 4, 0, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 39, 9, 0, 0, 255, 255, 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 0, 0, 0, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 34, 170, 170, 234, 15, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, 255, 0, 220, 0, 0, 64, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 0, 168, 170, 168, 170, 170, 170, 0, 148, 170, 16, 10, 0, 170, 2, 0, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, }; /* Changes_When_Titlecased: 534 bytes. */ RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_titlecased_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_titlecased_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_titlecased_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_titlecased_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_titlecased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Casefolded. */ static RE_UINT8 re_changes_when_casefolded_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_casefolded_stage_2[] = { 0, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_casefolded_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 15, 6, 6, 6, 16, 6, 6, 6, 6, 17, 6, 6, 6, }; static RE_UINT8 re_changes_when_casefolded_stage_4[] = { 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 27, 0, 4, 4, 4, 4, 28, 4, 4, 4, 29, 30, 31, 32, 20, 33, 34, 35, 0, 36, 0, 21, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 21, 0, 20, 39, 0, 40, 4, 4, 4, 41, 0, 0, 4, 42, 43, 0, 0, 0, 0, 44, 4, 45, 46, 47, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 49, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_casefolded_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, 85, 85, 85, 85, 85, 85, 85, 170, 170, 86, 85, 85, 85, 85, 85, 171, 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, 122, 85, 0, 0, 32, 0, 0, 0, 0, 0, 69, 0, 64, 215, 254, 255, 251, 15, 0, 0, 4, 128, 99, 85, 85, 85, 179, 230, 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, 85, 0, 254, 255, 255, 255, 127, 0, 128, 0, 0, 0, 191, 32, 0, 0, 85, 85, 21, 76, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, 255, 255, 156, 31, 156, 31, 0, 15, 0, 31, 156, 31, 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 0, 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 5, 0, 85, 5, 0, 0, 127, 0, 248, 0, 255, 0, 0, 0, }; /* Changes_When_Casefolded: 514 bytes. */ RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_casefolded_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_casefolded_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_casefolded_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_casefolded_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_casefolded_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Casemapped. */ static RE_UINT8 re_changes_when_casemapped_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_casemapped_stage_2[] = { 0, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_casemapped_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 10, 6, 11, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 17, 6, 6, 6, 18, 6, 6, 6, 6, 19, 6, 6, 6, }; static RE_UINT8 re_changes_when_casemapped_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 5, 4, 4, 6, 7, 8, 4, 4, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 4, 4, 4, 4, 19, 4, 4, 4, 4, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 0, 0, 0, 0, 25, 0, 0, 0, 0, 4, 4, 4, 4, 26, 4, 4, 4, 27, 4, 28, 29, 4, 30, 31, 32, 0, 33, 34, 4, 35, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 37, 4, 38, 39, 40, 4, 4, 4, 41, 4, 24, 0, 0, 0, 0, 0, 0, 0, 0, 4, 42, 43, 0, 0, 0, 0, 44, 4, 45, 46, 47, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 4, 4, 49, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_casemapped_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179, 240, 255, 255, 255, 253, 255, 15, 252, 255, 255, 223, 10, 105, 139, 38, 32, 9, 31, 4, 0, 32, 0, 0, 0, 0, 0, 207, 56, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 183, 239, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, 191, 32, 0, 0, 0, 0, 0, 34, 255, 255, 255, 79, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 64, 12, 4, 0, 0, 64, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192, 15, 120, 12, 0, 255, 63, 0, 0, 255, 255, 255, 0, 252, 255, 252, 255, 255, 255, 0, 254, 255, 56, 15, 0, 255, 7, 0, 0, 127, 0, 248, 0, 255, 255, 0, 0, }; /* Changes_When_Casemapped: 530 bytes. */ RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_casemapped_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_casemapped_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_casemapped_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_casemapped_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_casemapped_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* ID_Start. */ static RE_UINT8 re_id_start_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_id_start_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_id_start_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, 51, 52, 53, 54, 55, 31, 31, 31, 56, 57, 58, 59, 60, 31, 31, 31, 61, 62, 31, 31, 31, 31, 63, 31, 1, 1, 1, 64, 65, 31, 31, 31, 1, 1, 1, 1, 66, 31, 31, 31, 1, 1, 67, 31, 31, 31, 31, 68, 69, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 70, 71, 72, 73, 31, 31, 31, 31, 31, 31, 74, 31, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, 1, 76, 77, 31, 31, 31, 31, 31, 31, 31, 1, 1, 77, 31, 31, 31, 31, 31, }; static RE_UINT8 re_id_start_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 14, 15, 0, 16, 17, 0, 4, 18, 19, 4, 4, 20, 21, 22, 23, 24, 4, 4, 25, 26, 27, 28, 29, 30, 0, 0, 31, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 36, 45, 48, 49, 50, 51, 46, 0, 52, 53, 54, 47, 52, 53, 55, 56, 52, 57, 58, 59, 60, 61, 62, 0, 14, 63, 62, 0, 64, 65, 66, 0, 67, 0, 68, 69, 70, 0, 0, 0, 4, 71, 72, 73, 74, 4, 75, 76, 4, 4, 77, 4, 78, 79, 80, 4, 81, 4, 82, 0, 23, 4, 4, 83, 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 84, 1, 4, 4, 85, 86, 87, 87, 88, 4, 89, 90, 0, 0, 4, 4, 91, 4, 92, 4, 93, 94, 0, 16, 95, 4, 96, 97, 0, 98, 4, 83, 0, 0, 99, 0, 0, 100, 89, 101, 0, 102, 103, 4, 104, 4, 105, 106, 107, 0, 0, 0, 108, 4, 4, 4, 4, 4, 4, 0, 0, 109, 4, 110, 107, 4, 111, 112, 113, 0, 0, 0, 114, 115, 0, 0, 0, 116, 117, 118, 4, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 120, 121, 4, 4, 4, 4, 122, 4, 75, 4, 123, 98, 124, 124, 0, 125, 126, 14, 4, 127, 14, 4, 76, 100, 128, 4, 4, 129, 82, 0, 16, 4, 4, 4, 4, 4, 93, 0, 0, 4, 4, 4, 4, 4, 4, 69, 0, 4, 4, 4, 4, 69, 0, 16, 107, 130, 131, 4, 132, 91, 4, 4, 23, 133, 134, 4, 4, 135, 18, 0, 136, 137, 138, 4, 89, 134, 89, 0, 139, 26, 140, 62, 94, 32, 141, 142, 0, 4, 119, 143, 144, 4, 145, 146, 147, 148, 149, 0, 0, 0, 0, 4, 138, 4, 4, 4, 4, 4, 150, 151, 152, 4, 4, 4, 153, 4, 4, 154, 0, 155, 156, 157, 4, 4, 87, 158, 4, 4, 107, 16, 4, 159, 4, 15, 160, 0, 0, 0, 161, 4, 4, 4, 94, 0, 1, 1, 162, 4, 121, 163, 0, 164, 165, 166, 0, 4, 4, 4, 82, 0, 0, 4, 83, 0, 0, 0, 0, 0, 0, 0, 0, 94, 4, 167, 0, 121, 16, 18, 0, 107, 4, 168, 0, 4, 4, 4, 4, 107, 0, 0, 0, 169, 170, 93, 0, 0, 0, 0, 0, 93, 154, 0, 0, 4, 171, 0, 0, 172, 89, 0, 94, 0, 0, 0, 0, 4, 93, 93, 141, 0, 0, 0, 0, 4, 4, 119, 0, 0, 0, 0, 0, 102, 91, 0, 0, 102, 23, 16, 119, 102, 62, 0, 0, 102, 141, 173, 0, 0, 0, 0, 0, 4, 18, 0, 0, 4, 4, 4, 129, 0, 0, 0, 0, 4, 4, 4, 138, 0, 0, 0, 0, 4, 129, 0, 0, 0, 0, 0, 0, 4, 30, 0, 0, 0, 0, 0, 0, 4, 4, 174, 0, 158, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 4, 4, 175, 4, 176, 177, 178, 4, 179, 180, 181, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 182, 183, 76, 175, 175, 120, 120, 184, 184, 143, 0, 178, 185, 186, 187, 188, 189, 0, 0, 4, 4, 4, 4, 4, 4, 98, 0, 4, 83, 4, 4, 4, 4, 4, 4, 107, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_id_start_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 60, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 7, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, 16, 1, 0, 0, 255, 255, 255, 1, 253, 31, 0, 0, 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 254, 224, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 0, 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 3, 0, 0, 0, 64, 3, 0, 6, 0, 255, 255, 255, 39, 0, 64, 0, 0, 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, 255, 255, 13, 0, 150, 37, 240, 254, 174, 236, 13, 32, 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 255, 255, 0, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 31, 255, 63, 31, 0, 255, 15, 0, 0, 254, 0, 0, 0, 255, 255, 127, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, 0, 222, 99, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 248, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 0, 0, 0, 255, 187, 247, 255, 255, 7, 0, 0, 0, 0, 0, 252, 8, 63, 0, 255, 255, 255, 255, 7, 0, 0, 128, 0, 0, 247, 15, 0, 0, 255, 255, 127, 4, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, 127, 127, 0, 0, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 1, 0, 239, 254, 30, 0, 0, 0, 31, 0, 1, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* ID_Start: 1753 bytes. */ RE_UINT32 re_get_id_start(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_id_start_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_id_start_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_id_start_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_id_start_stage_4[pos + f] << 5; pos += code; value = (re_id_start_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* ID_Continue. */ static RE_UINT8 re_id_continue_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, }; static RE_UINT8 re_id_continue_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_id_continue_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, 51, 52, 53, 54, 55, 31, 31, 31, 56, 57, 58, 59, 60, 31, 31, 31, 61, 62, 31, 31, 31, 31, 63, 31, 1, 1, 1, 64, 65, 31, 31, 31, 1, 1, 1, 1, 66, 31, 31, 31, 1, 1, 67, 31, 31, 31, 31, 68, 69, 31, 31, 31, 31, 31, 31, 31, 31, 70, 71, 31, 72, 73, 74, 75, 31, 31, 31, 31, 31, 31, 76, 31, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 78, 79, 31, 31, 31, 31, 31, 31, 31, 1, 1, 79, 31, 31, 31, 31, 31, 31, 80, 31, 31, 31, 31, 31, 31, }; static RE_UINT8 re_id_continue_stage_4[] = { 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 16, 14, 17, 18, 19, 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, 6, 28, 29, 0, 0, 30, 0, 31, 6, 6, 6, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 42, 45, 46, 47, 48, 49, 50, 51, 52, 53, 44, 54, 55, 56, 57, 54, 58, 59, 60, 61, 62, 63, 64, 16, 65, 66, 0, 67, 68, 69, 0, 70, 71, 72, 73, 74, 75, 76, 0, 6, 6, 77, 6, 78, 6, 79, 80, 6, 6, 81, 6, 82, 83, 84, 6, 85, 6, 58, 86, 87, 6, 6, 88, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, 3, 6, 6, 90, 91, 88, 92, 93, 6, 6, 94, 95, 96, 6, 6, 97, 6, 98, 6, 99, 75, 100, 101, 102, 6, 103, 104, 0, 29, 6, 105, 106, 107, 108, 0, 0, 6, 6, 109, 110, 6, 6, 6, 92, 6, 97, 111, 78, 0, 0, 112, 113, 6, 6, 6, 6, 6, 6, 6, 114, 115, 6, 116, 78, 6, 117, 118, 119, 0, 120, 121, 122, 123, 0, 123, 124, 125, 126, 127, 6, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 129, 105, 6, 6, 6, 6, 130, 6, 79, 6, 131, 113, 132, 132, 6, 133, 134, 16, 6, 135, 16, 6, 80, 136, 137, 6, 6, 138, 65, 0, 24, 6, 6, 6, 6, 6, 99, 0, 0, 6, 6, 6, 6, 6, 6, 139, 0, 6, 6, 6, 6, 139, 0, 24, 78, 140, 141, 6, 142, 143, 6, 6, 26, 144, 145, 6, 6, 146, 147, 0, 148, 6, 149, 6, 92, 6, 6, 150, 151, 6, 152, 92, 75, 6, 6, 153, 0, 6, 113, 154, 155, 6, 6, 156, 157, 158, 159, 0, 0, 0, 0, 6, 160, 6, 6, 6, 6, 6, 161, 162, 29, 6, 6, 6, 152, 6, 6, 163, 0, 164, 165, 166, 6, 6, 26, 167, 6, 6, 78, 24, 6, 168, 6, 149, 169, 87, 170, 171, 172, 6, 6, 6, 75, 1, 2, 3, 101, 6, 105, 173, 0, 174, 175, 176, 0, 6, 6, 6, 65, 0, 0, 6, 88, 0, 0, 0, 177, 0, 0, 0, 0, 75, 6, 178, 0, 105, 24, 147, 0, 78, 6, 179, 0, 6, 6, 6, 6, 78, 95, 0, 0, 180, 181, 99, 0, 0, 0, 0, 0, 99, 163, 0, 0, 6, 182, 0, 0, 183, 184, 0, 75, 0, 0, 0, 0, 6, 99, 99, 185, 0, 0, 0, 0, 6, 6, 128, 0, 0, 0, 0, 0, 6, 6, 186, 50, 6, 65, 24, 187, 6, 188, 0, 0, 6, 6, 150, 0, 0, 0, 0, 0, 6, 97, 95, 0, 6, 6, 6, 138, 0, 0, 0, 0, 6, 6, 6, 189, 0, 0, 0, 0, 6, 138, 0, 0, 0, 0, 0, 0, 6, 190, 0, 0, 0, 0, 0, 0, 6, 6, 191, 105, 192, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, 196, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 6, 6, 188, 6, 198, 199, 200, 6, 201, 202, 203, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 204, 205, 80, 188, 188, 129, 129, 206, 206, 207, 6, 200, 208, 209, 210, 211, 212, 0, 0, 6, 6, 6, 6, 6, 6, 113, 0, 6, 88, 6, 6, 6, 6, 6, 6, 78, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 87, }; static RE_UINT8 re_id_continue_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 255, 255, 223, 60, 192, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 251, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 7, 7, 0, 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 4, 255, 63, 0, 0, 255, 255, 255, 15, 253, 31, 0, 0, 240, 255, 255, 127, 207, 255, 254, 254, 238, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, 207, 255, 3, 0, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, 207, 255, 0, 0, 159, 57, 192, 176, 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 0, 0, 238, 223, 253, 255, 255, 253, 239, 227, 223, 61, 96, 3, 236, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 255, 255, 255, 231, 223, 125, 128, 0, 207, 255, 0, 252, 236, 255, 127, 252, 255, 255, 251, 47, 127, 132, 95, 255, 0, 0, 12, 0, 255, 255, 255, 7, 255, 127, 255, 3, 150, 37, 240, 254, 174, 236, 255, 59, 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 0, 254, 3, 0, 255, 255, 0, 0, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 0, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 127, 255, 255, 255, 159, 255, 3, 255, 3, 128, 0, 0, 0, 255, 15, 255, 3, 0, 248, 15, 0, 255, 227, 255, 255, 0, 0, 247, 255, 255, 255, 127, 0, 127, 0, 0, 240, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 31, 248, 15, 0, 255, 128, 0, 128, 127, 127, 127, 127, 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 254, 224, 255, 255, 255, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, 255, 255, 240, 191, 255, 255, 255, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 255, 7, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 31, 0, 255, 3, 255, 255, 255, 8, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, 255, 255, 127, 12, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, 127, 127, 0, 0, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 127, 0, 24, 0, 0, 224, 0, 0, 0, 0, 223, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 15, 135, 255, 255, 7, 0, 127, 0, 0, 0, 255, 1, 255, 3, 255, 255, 223, 255, 7, 0, 0, 0, 255, 255, 255, 1, 31, 0, 255, 255, 0, 128, 255, 255, 3, 0, 0, 0, 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* ID_Continue: 1894 bytes. */ RE_UINT32 re_get_id_continue(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_id_continue_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_id_continue_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_id_continue_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_id_continue_stage_4[pos + f] << 5; pos += code; value = (re_id_continue_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* XID_Start. */ static RE_UINT8 re_xid_start_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_xid_start_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_xid_start_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 31, 31, 31, 57, 58, 59, 60, 61, 31, 31, 31, 62, 63, 31, 31, 31, 31, 64, 31, 1, 1, 1, 65, 66, 31, 31, 31, 1, 1, 1, 1, 67, 31, 31, 31, 1, 1, 68, 31, 31, 31, 31, 69, 70, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 71, 72, 73, 74, 31, 31, 31, 31, 31, 31, 75, 31, 1, 1, 1, 1, 1, 1, 76, 1, 1, 1, 1, 1, 1, 1, 1, 77, 78, 31, 31, 31, 31, 31, 31, 31, 1, 1, 78, 31, 31, 31, 31, 31, }; static RE_UINT8 re_xid_start_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 14, 15, 0, 16, 17, 0, 4, 18, 19, 4, 4, 20, 21, 22, 23, 24, 4, 4, 25, 26, 27, 28, 29, 30, 0, 0, 31, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 36, 45, 48, 49, 50, 51, 46, 0, 52, 53, 54, 47, 52, 53, 55, 56, 52, 57, 58, 59, 60, 61, 62, 0, 14, 63, 62, 0, 64, 65, 66, 0, 67, 0, 68, 69, 70, 0, 0, 0, 4, 71, 72, 73, 74, 4, 75, 76, 4, 4, 77, 4, 78, 79, 80, 4, 81, 4, 82, 0, 23, 4, 4, 83, 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 84, 1, 4, 4, 85, 86, 87, 87, 88, 4, 89, 90, 0, 0, 4, 4, 91, 4, 92, 4, 93, 94, 0, 16, 95, 4, 96, 97, 0, 98, 4, 83, 0, 0, 99, 0, 0, 100, 89, 101, 0, 102, 103, 4, 104, 4, 105, 106, 107, 0, 0, 0, 108, 4, 4, 4, 4, 4, 4, 0, 0, 109, 4, 110, 107, 4, 111, 112, 113, 0, 0, 0, 114, 115, 0, 0, 0, 116, 117, 118, 4, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 120, 121, 4, 4, 4, 4, 122, 4, 75, 4, 123, 98, 124, 124, 0, 125, 126, 14, 4, 127, 14, 4, 76, 100, 128, 4, 4, 129, 82, 0, 16, 4, 4, 4, 4, 4, 93, 0, 0, 4, 4, 4, 4, 4, 4, 69, 0, 4, 4, 4, 4, 69, 0, 16, 107, 130, 131, 4, 132, 91, 4, 4, 23, 133, 134, 4, 4, 135, 18, 0, 136, 137, 138, 4, 89, 134, 89, 0, 139, 26, 140, 62, 94, 32, 141, 142, 0, 4, 119, 143, 144, 4, 145, 146, 147, 148, 149, 0, 0, 0, 0, 4, 138, 4, 4, 4, 4, 4, 150, 151, 152, 4, 4, 4, 153, 4, 4, 154, 0, 155, 156, 157, 4, 4, 87, 158, 4, 4, 4, 107, 32, 4, 4, 4, 4, 4, 107, 16, 4, 159, 4, 15, 160, 0, 0, 0, 161, 4, 4, 4, 94, 0, 1, 1, 162, 107, 121, 163, 0, 164, 165, 166, 0, 4, 4, 4, 82, 0, 0, 4, 83, 0, 0, 0, 0, 0, 0, 0, 0, 94, 4, 167, 0, 121, 16, 18, 0, 107, 4, 168, 0, 4, 4, 4, 4, 107, 0, 0, 0, 169, 170, 93, 0, 0, 0, 0, 0, 93, 154, 0, 0, 4, 171, 0, 0, 172, 89, 0, 94, 0, 0, 0, 0, 4, 93, 93, 141, 0, 0, 0, 0, 4, 4, 119, 0, 0, 0, 0, 0, 102, 91, 0, 0, 102, 23, 16, 119, 102, 62, 0, 0, 102, 141, 173, 0, 0, 0, 0, 0, 4, 18, 0, 0, 4, 4, 4, 129, 0, 0, 0, 0, 4, 4, 4, 138, 0, 0, 0, 0, 4, 129, 0, 0, 0, 0, 0, 0, 4, 30, 0, 0, 0, 0, 0, 0, 4, 4, 174, 0, 158, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 4, 4, 175, 4, 176, 177, 178, 4, 179, 180, 181, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 182, 183, 76, 175, 175, 120, 120, 184, 184, 143, 0, 178, 185, 186, 187, 188, 189, 0, 0, 4, 4, 4, 4, 4, 4, 98, 0, 4, 83, 4, 4, 4, 4, 4, 4, 107, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_xid_start_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 56, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 7, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, 16, 1, 0, 0, 255, 255, 255, 1, 253, 31, 0, 0, 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 254, 224, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 0, 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 3, 0, 0, 0, 64, 3, 0, 6, 0, 255, 255, 255, 39, 0, 64, 0, 0, 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, 255, 255, 5, 0, 150, 37, 240, 254, 174, 236, 5, 32, 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 255, 255, 0, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 31, 255, 63, 31, 0, 255, 15, 0, 0, 254, 0, 0, 0, 255, 255, 127, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, 0, 222, 99, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 0, 0, 0, 255, 187, 247, 255, 255, 7, 0, 0, 0, 0, 0, 252, 8, 63, 0, 255, 255, 255, 255, 7, 0, 0, 128, 0, 0, 247, 15, 0, 0, 255, 255, 127, 4, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, 127, 127, 0, 0, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 3, 0, 0, 138, 170, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 1, 0, 239, 254, 30, 0, 0, 0, 31, 0, 1, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* XID_Start: 1761 bytes. */ RE_UINT32 re_get_xid_start(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_xid_start_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_xid_start_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_xid_start_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_xid_start_stage_4[pos + f] << 5; pos += code; value = (re_xid_start_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* XID_Continue. */ static RE_UINT8 re_xid_continue_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, }; static RE_UINT8 re_xid_continue_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_xid_continue_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 31, 31, 31, 57, 58, 59, 60, 61, 31, 31, 31, 62, 63, 31, 31, 31, 31, 64, 31, 1, 1, 1, 65, 66, 31, 31, 31, 1, 1, 1, 1, 67, 31, 31, 31, 1, 1, 68, 31, 31, 31, 31, 69, 70, 31, 31, 31, 31, 31, 31, 31, 31, 71, 72, 31, 73, 74, 75, 76, 31, 31, 31, 31, 31, 31, 77, 31, 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 79, 80, 31, 31, 31, 31, 31, 31, 31, 1, 1, 80, 31, 31, 31, 31, 31, 31, 81, 31, 31, 31, 31, 31, 31, }; static RE_UINT8 re_xid_continue_stage_4[] = { 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 16, 14, 17, 18, 19, 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, 6, 28, 29, 0, 0, 30, 0, 31, 6, 6, 6, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 42, 45, 46, 47, 48, 49, 50, 51, 52, 53, 44, 54, 55, 56, 57, 54, 58, 59, 60, 61, 62, 63, 64, 16, 65, 66, 0, 67, 68, 69, 0, 70, 71, 72, 73, 74, 75, 76, 0, 6, 6, 77, 6, 78, 6, 79, 80, 6, 6, 81, 6, 82, 83, 84, 6, 85, 6, 58, 86, 87, 6, 6, 88, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, 3, 6, 6, 90, 91, 88, 92, 93, 6, 6, 94, 95, 96, 6, 6, 97, 6, 98, 6, 99, 75, 100, 101, 102, 6, 103, 104, 0, 29, 6, 105, 106, 107, 108, 0, 0, 6, 6, 109, 110, 6, 6, 6, 92, 6, 97, 111, 78, 0, 0, 112, 113, 6, 6, 6, 6, 6, 6, 6, 114, 115, 6, 116, 78, 6, 117, 118, 119, 0, 120, 121, 122, 123, 0, 123, 124, 125, 126, 127, 6, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 129, 105, 6, 6, 6, 6, 130, 6, 79, 6, 131, 113, 132, 132, 6, 133, 134, 16, 6, 135, 16, 6, 80, 136, 137, 6, 6, 138, 65, 0, 24, 6, 6, 6, 6, 6, 99, 0, 0, 6, 6, 6, 6, 6, 6, 139, 0, 6, 6, 6, 6, 139, 0, 24, 78, 140, 141, 6, 142, 143, 6, 6, 26, 144, 145, 6, 6, 146, 147, 0, 148, 6, 149, 6, 92, 6, 6, 150, 151, 6, 152, 92, 75, 6, 6, 153, 0, 6, 113, 154, 155, 6, 6, 156, 157, 158, 159, 0, 0, 0, 0, 6, 160, 6, 6, 6, 6, 6, 161, 162, 29, 6, 6, 6, 152, 6, 6, 163, 0, 164, 165, 166, 6, 6, 26, 167, 6, 6, 6, 78, 168, 6, 6, 6, 6, 6, 78, 24, 6, 169, 6, 149, 1, 87, 170, 171, 172, 6, 6, 6, 75, 1, 2, 3, 101, 6, 105, 173, 0, 174, 175, 176, 0, 6, 6, 6, 65, 0, 0, 6, 88, 0, 0, 0, 177, 0, 0, 0, 0, 75, 6, 178, 0, 105, 24, 147, 0, 78, 6, 179, 0, 6, 6, 6, 6, 78, 95, 0, 0, 180, 181, 99, 0, 0, 0, 0, 0, 99, 163, 0, 0, 6, 182, 0, 0, 183, 184, 0, 75, 0, 0, 0, 0, 6, 99, 99, 185, 0, 0, 0, 0, 6, 6, 128, 0, 0, 0, 0, 0, 6, 6, 186, 50, 6, 65, 24, 187, 6, 188, 0, 0, 6, 6, 150, 0, 0, 0, 0, 0, 6, 97, 95, 0, 6, 6, 6, 138, 0, 0, 0, 0, 6, 6, 6, 189, 0, 0, 0, 0, 6, 138, 0, 0, 0, 0, 0, 0, 6, 190, 0, 0, 0, 0, 0, 0, 6, 6, 191, 105, 192, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, 196, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 6, 6, 188, 6, 198, 199, 200, 6, 201, 202, 203, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 204, 205, 80, 188, 188, 129, 129, 206, 206, 207, 6, 200, 208, 209, 210, 211, 212, 0, 0, 6, 6, 6, 6, 6, 6, 113, 0, 6, 88, 6, 6, 6, 6, 6, 6, 78, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 87, }; static RE_UINT8 re_xid_continue_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 255, 255, 223, 56, 192, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 251, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 7, 7, 0, 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 4, 255, 63, 0, 0, 255, 255, 255, 15, 253, 31, 0, 0, 240, 255, 255, 127, 207, 255, 254, 254, 238, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, 207, 255, 3, 0, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, 207, 255, 0, 0, 159, 57, 192, 176, 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 0, 0, 238, 223, 253, 255, 255, 253, 239, 227, 223, 61, 96, 3, 236, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 255, 255, 255, 231, 223, 125, 128, 0, 207, 255, 0, 252, 236, 255, 127, 252, 255, 255, 251, 47, 127, 132, 95, 255, 0, 0, 12, 0, 255, 255, 255, 7, 255, 127, 255, 3, 150, 37, 240, 254, 174, 236, 255, 59, 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 0, 254, 3, 0, 255, 255, 0, 0, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 0, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 127, 255, 255, 255, 159, 255, 3, 255, 3, 128, 0, 0, 0, 255, 15, 255, 3, 0, 248, 15, 0, 255, 227, 255, 255, 0, 0, 247, 255, 255, 255, 127, 0, 127, 0, 0, 240, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 31, 248, 15, 0, 255, 128, 0, 128, 127, 127, 127, 127, 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 230, 224, 255, 255, 255, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, 255, 255, 240, 191, 255, 255, 255, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 255, 7, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 31, 0, 255, 3, 255, 255, 255, 8, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, 255, 255, 127, 12, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, 127, 127, 0, 0, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 240, 255, 255, 255, 255, 255, 252, 255, 127, 0, 24, 0, 0, 224, 0, 0, 0, 0, 138, 170, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 15, 135, 255, 255, 7, 0, 127, 0, 0, 0, 255, 1, 255, 3, 255, 255, 223, 255, 7, 0, 0, 0, 255, 255, 255, 1, 31, 0, 255, 255, 0, 128, 255, 255, 3, 0, 0, 0, 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* XID_Continue: 1902 bytes. */ RE_UINT32 re_get_xid_continue(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_xid_continue_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_xid_continue_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_xid_continue_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_xid_continue_stage_4[pos + f] << 5; pos += code; value = (re_xid_continue_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Default_Ignorable_Code_Point. */ static RE_UINT8 re_default_ignorable_code_point_stage_1[] = { 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_default_ignorable_code_point_stage_2[] = { 0, 1, 2, 3, 4, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 7, 1, 1, 1, 1, 1, 8, 8, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_default_ignorable_code_point_stage_3[] = { 0, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 10, 1, 11, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, }; static RE_UINT8 re_default_ignorable_code_point_stage_4[] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, }; static RE_UINT8 re_default_ignorable_code_point_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 128, 0, 0, 0, 0, 0, 16, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 48, 0, 0, 120, 0, 0, 0, 248, 0, 0, 0, 124, 0, 0, 255, 255, 0, 0, 16, 0, 0, 0, 0, 0, 255, 1, 0, 0, 248, 7, 255, 255, 255, 255, }; /* Default_Ignorable_Code_Point: 344 bytes. */ RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 14; code = ch ^ (f << 14); pos = (RE_UINT32)re_default_ignorable_code_point_stage_1[f] << 3; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_default_ignorable_code_point_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_default_ignorable_code_point_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_default_ignorable_code_point_stage_4[pos + f] << 5; pos += code; value = (re_default_ignorable_code_point_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Grapheme_Extend. */ static RE_UINT8 re_grapheme_extend_stage_1[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, }; static RE_UINT8 re_grapheme_extend_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 11, 12, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }; static RE_UINT8 re_grapheme_extend_stage_3[] = { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 34, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 41, 42, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_grapheme_extend_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, 7, 0, 8, 9, 0, 0, 10, 11, 12, 13, 14, 0, 0, 15, 0, 16, 17, 18, 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 24, 28, 29, 30, 31, 28, 29, 32, 24, 25, 33, 34, 24, 35, 36, 37, 0, 0, 38, 39, 24, 0, 40, 41, 24, 0, 36, 27, 24, 0, 0, 42, 0, 0, 43, 44, 0, 0, 45, 46, 0, 47, 48, 0, 49, 50, 51, 52, 0, 0, 53, 54, 55, 56, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 58, 58, 59, 59, 0, 60, 61, 0, 62, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 65, 0, 66, 67, 0, 0, 0, 0, 68, 69, 35, 16, 70, 71, 0, 72, 0, 73, 0, 0, 0, 0, 74, 75, 0, 0, 0, 0, 0, 0, 1, 76, 77, 0, 0, 0, 0, 0, 13, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 1, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 0, 83, 80, 0, 0, 84, 85, 86, 0, 0, 0, 0, 87, 88, 0, 89, 90, 0, 21, 91, 0, 0, 0, 92, 93, 0, 0, 94, 25, 95, 0, 0, 0, 0, 0, 0, 0, 96, 36, 0, 0, 0, 0, 0, 0, 0, 2, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 100, 0, 0, 0, 0, 0, 0, 25, 101, 97, 0, 70, 102, 0, 0, 21, 103, 0, 0, 70, 104, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 107, 108, 109, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, }; static RE_UINT8 re_grapheme_extend_stage_5[] = { 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 248, 3, 0, 0, 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, 0, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 159, 159, 61, 0, 0, 0, 0, 2, 0, 0, 0, 255, 255, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 15, 0, 0, 0, 192, 251, 239, 62, 0, 0, 0, 0, 0, 14, 240, 255, 255, 127, 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 80, 30, 32, 128, 0, 6, 0, 0, 0, 0, 0, 0, 16, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 0, 0, 0, 208, 30, 32, 192, 0, 4, 0, 0, 0, 0, 0, 0, 64, 1, 32, 128, 0, 0, 0, 0, 192, 193, 61, 96, 0, 0, 0, 0, 144, 68, 48, 96, 0, 0, 132, 92, 128, 0, 0, 242, 7, 128, 127, 0, 0, 0, 0, 242, 27, 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 15, 32, 0, 56, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 15, 0, 0, 0, 0, 0, 208, 23, 3, 0, 0, 0, 60, 11, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 247, 255, 253, 33, 16, 0, 127, 0, 0, 240, 0, 48, 0, 0, 255, 255, 1, 0, 0, 128, 3, 0, 0, 0, 0, 128, 0, 252, 0, 0, 0, 0, 0, 6, 0, 128, 247, 63, 0, 0, 3, 0, 68, 8, 0, 0, 96, 0, 0, 0, 16, 0, 0, 0, 255, 255, 3, 0, 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 19, 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, 0, 48, 64, 0, 32, 33, 0, 0, 127, 0, 0, 0, 0, 0, 0, 32, 110, 240, 0, 0, 0, 0, 0, 135, 0, 0, 0, 255, 0, 0, 120, 6, 128, 239, 31, 0, 0, 0, 192, 127, 0, 40, 191, 0, 0, 128, 7, 0, 160, 195, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, }; /* Grapheme_Extend: 1062 bytes. */ RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_grapheme_extend_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_grapheme_extend_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_extend_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_grapheme_extend_stage_4[pos + f] << 5; pos += code; value = (re_grapheme_extend_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Grapheme_Base. */ static RE_UINT8 re_grapheme_base_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_grapheme_base_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 24, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 26, 27, 13, 13, 13, 13, 13, 13, 13, 28, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_grapheme_base_stage_3[] = { 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 16, 17, 1, 1, 18, 19, 20, 21, 22, 23, 24, 25, 1, 26, 27, 28, 1, 29, 30, 1, 1, 31, 1, 1, 1, 32, 33, 34, 35, 36, 37, 38, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 42, 1, 43, 44, 45, 46, 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 1, 51, 52, 1, 53, 54, 55, 56, 57, 58, 59, 60, 50, 50, 50, 61, 62, 63, 64, 65, 50, 66, 50, 67, 68, 50, 50, 50, 50, 69, 50, 1, 1, 1, 70, 71, 50, 50, 50, 1, 1, 1, 1, 72, 50, 50, 50, 1, 1, 73, 50, 50, 50, 50, 74, 75, 50, 50, 50, 50, 50, 50, 50, 76, 77, 78, 79, 80, 81, 82, 83, 50, 50, 50, 50, 50, 50, 84, 50, 85, 86, 87, 88, 89, 90, 91, 92, 1, 1, 1, 1, 1, 1, 93, 1, 1, 1, 1, 1, 1, 1, 1, 94, 95, 50, 50, 50, 50, 50, 50, 50, 1, 1, 95, 50, 50, 50, 50, 50, }; static RE_UINT8 re_grapheme_base_stage_4[] = { 0, 1, 1, 2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 8, 9, 10, 11, 12, 13, 14, 15, 1, 16, 17, 1, 1, 18, 19, 20, 21, 22, 1, 1, 23, 1, 24, 25, 26, 27, 0, 0, 28, 0, 0, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 56, 60, 61, 62, 63, 64, 65, 66, 10, 67, 68, 0, 69, 70, 71, 0, 72, 73, 74, 75, 76, 77, 78, 0, 1, 79, 80, 81, 82, 1, 83, 1, 1, 1, 84, 1, 85, 86, 87, 1, 88, 1, 89, 90, 91, 1, 1, 92, 1, 1, 1, 1, 90, 1, 1, 93, 94, 95, 96, 97, 1, 98, 99, 100, 101, 1, 1, 102, 1, 103, 1, 104, 90, 105, 106, 107, 1, 108, 109, 1, 110, 1, 111, 112, 100, 113, 0, 0, 114, 115, 116, 117, 118, 119, 1, 120, 1, 121, 122, 1, 0, 0, 123, 124, 1, 1, 1, 1, 1, 1, 0, 0, 125, 1, 126, 127, 1, 128, 129, 130, 131, 132, 1, 133, 134, 89, 0, 0, 1, 1, 1, 1, 135, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 136, 1, 137, 16, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 138, 0, 0, 0, 0, 0, 1, 139, 2, 1, 1, 1, 1, 140, 1, 83, 1, 141, 142, 143, 143, 0, 1, 144, 0, 0, 145, 1, 1, 136, 1, 1, 1, 1, 1, 1, 104, 146, 1, 135, 10, 1, 147, 1, 1, 1, 148, 149, 1, 1, 139, 89, 1, 150, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 104, 1, 1, 1, 1, 1, 1, 1, 1, 151, 0, 1, 1, 1, 1, 152, 1, 153, 1, 1, 154, 1, 155, 102, 1, 1, 156, 1, 1, 1, 1, 157, 16, 0, 158, 159, 160, 1, 102, 1, 1, 161, 162, 1, 163, 164, 90, 29, 165, 166, 0, 1, 167, 168, 144, 1, 169, 170, 171, 172, 173, 0, 0, 0, 0, 1, 174, 1, 1, 1, 1, 1, 150, 175, 144, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 176, 1, 1, 91, 0, 177, 178, 179, 1, 1, 1, 180, 1, 1, 1, 181, 1, 182, 1, 183, 184, 185, 181, 186, 187, 1, 1, 1, 90, 10, 1, 1, 1, 127, 2, 188, 189, 190, 191, 192, 0, 1, 1, 1, 89, 193, 194, 1, 1, 195, 0, 181, 90, 0, 0, 0, 0, 90, 1, 93, 0, 2, 150, 16, 0, 196, 1, 197, 0, 1, 1, 1, 1, 127, 198, 0, 0, 199, 200, 201, 0, 0, 0, 0, 0, 202, 203, 0, 0, 1, 204, 0, 0, 205, 136, 206, 1, 0, 0, 0, 0, 1, 207, 208, 209, 0, 0, 0, 0, 1, 1, 210, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 211, 102, 212, 21, 118, 213, 214, 215, 29, 216, 217, 0, 118, 218, 215, 0, 0, 0, 0, 0, 1, 219, 198, 0, 1, 1, 1, 220, 0, 0, 0, 0, 1, 1, 1, 221, 0, 0, 0, 0, 1, 220, 0, 0, 0, 0, 0, 0, 1, 222, 0, 0, 0, 0, 0, 0, 1, 1, 223, 2, 224, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 104, 1, 226, 1, 227, 228, 229, 127, 0, 1, 1, 230, 0, 0, 0, 0, 0, 1, 1, 142, 96, 0, 0, 0, 0, 1, 1, 128, 1, 231, 232, 233, 1, 234, 235, 236, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 237, 1, 1, 1, 1, 1, 1, 1, 1, 238, 1, 233, 239, 240, 241, 242, 243, 0, 244, 1, 108, 1, 1, 136, 245, 246, 0, 131, 139, 1, 108, 89, 0, 0, 247, 248, 89, 249, 0, 0, 0, 0, 0, 1, 250, 1, 90, 136, 1, 251, 93, 1, 2, 211, 1, 1, 1, 1, 252, 1, 127, 150, 183, 0, 0, 0, 253, 1, 1, 254, 0, 1, 1, 255, 0, 1, 1, 1, 136, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 142, 0, 1, 92, 1, 1, 1, 1, 1, 1, 127, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_grapheme_base_stage_5[] = { 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 223, 255, 255, 0, 0, 255, 124, 240, 215, 255, 255, 251, 255, 255, 255, 7, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 254, 254, 255, 255, 255, 255, 134, 0, 0, 0, 0, 0, 64, 73, 0, 255, 255, 255, 7, 31, 0, 192, 255, 0, 200, 255, 7, 0, 0, 255, 255, 254, 255, 255, 255, 63, 64, 96, 194, 255, 255, 255, 63, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 63, 0, 2, 0, 255, 7, 240, 7, 255, 255, 63, 4, 16, 1, 255, 127, 255, 255, 255, 65, 253, 31, 0, 0, 248, 255, 255, 255, 255, 255, 255, 235, 1, 222, 1, 255, 243, 255, 255, 254, 236, 159, 249, 255, 255, 253, 197, 163, 129, 89, 0, 176, 195, 255, 255, 15, 232, 135, 249, 255, 255, 253, 109, 195, 1, 0, 0, 94, 192, 255, 28, 0, 232, 191, 251, 255, 255, 253, 237, 227, 1, 26, 1, 0, 195, 255, 3, 0, 255, 253, 237, 35, 129, 25, 0, 176, 195, 255, 255, 0, 232, 199, 61, 214, 24, 199, 255, 131, 198, 29, 1, 0, 192, 255, 255, 7, 238, 223, 253, 255, 255, 253, 239, 35, 30, 0, 0, 3, 195, 255, 0, 255, 236, 223, 253, 255, 255, 253, 239, 99, 155, 13, 0, 64, 195, 255, 6, 0, 255, 255, 255, 167, 193, 93, 0, 0, 195, 255, 63, 254, 236, 255, 127, 252, 255, 255, 251, 47, 127, 0, 3, 127, 0, 0, 28, 0, 255, 255, 13, 128, 127, 128, 255, 15, 150, 37, 240, 254, 174, 236, 13, 32, 95, 0, 255, 243, 255, 255, 255, 252, 255, 255, 95, 253, 255, 254, 255, 255, 255, 31, 0, 128, 32, 31, 0, 0, 0, 0, 0, 192, 191, 223, 255, 7, 255, 31, 2, 153, 255, 255, 255, 60, 254, 255, 225, 255, 155, 223, 255, 223, 191, 32, 255, 255, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 31, 0, 255, 255, 1, 0, 255, 223, 3, 0, 255, 255, 99, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 79, 192, 191, 1, 240, 31, 255, 3, 255, 3, 255, 7, 255, 3, 255, 255, 255, 0, 255, 5, 255, 255, 255, 255, 63, 0, 120, 14, 251, 1, 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, 255, 255, 127, 198, 255, 255, 191, 0, 26, 224, 7, 0, 255, 63, 0, 0, 240, 255, 255, 255, 255, 255, 47, 232, 251, 15, 255, 255, 255, 7, 240, 31, 252, 255, 255, 255, 195, 244, 255, 255, 191, 92, 12, 240, 255, 15, 48, 248, 255, 227, 255, 255, 255, 0, 8, 0, 2, 222, 111, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, 255, 7, 255, 255, 255, 128, 255, 255, 0, 0, 243, 255, 255, 127, 255, 31, 255, 3, 255, 255, 255, 255, 15, 0, 127, 0, 0, 0, 255, 31, 255, 3, 255, 127, 255, 255, 255, 127, 12, 254, 255, 128, 1, 0, 255, 255, 127, 0, 127, 127, 127, 127, 255, 255, 255, 15, 255, 255, 255, 251, 0, 0, 255, 15, 255, 255, 127, 248, 224, 255, 255, 255, 255, 63, 254, 255, 15, 0, 255, 255, 255, 31, 0, 0, 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, 255, 127, 8, 192, 255, 255, 252, 0, 255, 127, 15, 0, 0, 0, 0, 255, 187, 247, 255, 255, 159, 15, 255, 3, 15, 192, 255, 3, 0, 0, 252, 15, 63, 192, 255, 255, 127, 0, 12, 128, 255, 255, 55, 236, 255, 191, 255, 195, 255, 129, 25, 0, 247, 47, 255, 243, 255, 255, 98, 62, 5, 0, 0, 248, 255, 207, 63, 0, 126, 126, 126, 0, 127, 127, 0, 0, 223, 30, 255, 3, 127, 248, 255, 255, 255, 63, 255, 255, 127, 0, 248, 160, 255, 255, 127, 95, 219, 255, 255, 255, 3, 0, 248, 255, 0, 0, 255, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 63, 0, 0, 255, 3, 255, 255, 247, 255, 127, 15, 223, 255, 252, 252, 252, 28, 127, 127, 0, 48, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 135, 255, 255, 255, 255, 255, 143, 255, 255, 7, 255, 15, 255, 255, 255, 191, 15, 255, 63, 0, 255, 3, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, 255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 192, 1, 0, 239, 254, 255, 0, 255, 1, 255, 255, 63, 254, 255, 255, 63, 255, 255, 255, 7, 255, 255, 1, 0, 0, 253, 255, 255, 255, 128, 63, 252, 255, 255, 255, 135, 217, 3, 0, 255, 255, 255, 1, 255, 3, 127, 16, 192, 255, 15, 0, 0, 0, 255, 255, 63, 128, 255, 215, 64, 0, 255, 127, 0, 0, 7, 0, 15, 0, 255, 255, 255, 1, 31, 0, 255, 255, 0, 0, 248, 255, 3, 0, 0, 0, 127, 254, 255, 255, 95, 60, 0, 0, 24, 240, 255, 255, 255, 195, 255, 255, 35, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0, 255, 127, 254, 127, 254, 255, 254, 255, 192, 255, 255, 255, 7, 0, 255, 255, 255, 1, 3, 0, 1, 0, 191, 255, 223, 7, 0, 0, 255, 255, 255, 30, 0, 0, 0, 248, 225, 255, 0, 0, 63, 0, 0, 0, }; /* Grapheme_Base: 2169 bytes. */ RE_UINT32 re_get_grapheme_base(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_grapheme_base_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_grapheme_base_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_base_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_grapheme_base_stage_4[pos + f] << 5; pos += code; value = (re_grapheme_base_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Grapheme_Link. */ static RE_UINT8 re_grapheme_link_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_grapheme_link_stage_2[] = { 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_grapheme_link_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 17, 0, }; static RE_UINT8 re_grapheme_link_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0, 13, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 14, 0, 0, }; static RE_UINT8 re_grapheme_link_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 6, 0, 0, 16, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 0, 0, 0, 0, 128, 64, 0, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 2, 0, 0, 24, 0, }; /* Grapheme_Link: 374 bytes. */ RE_UINT32 re_get_grapheme_link(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_grapheme_link_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_grapheme_link_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_link_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_grapheme_link_stage_4[pos + f] << 5; pos += code; value = (re_grapheme_link_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* White_Space. */ static RE_UINT8 re_white_space_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_white_space_stage_2[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_white_space_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_white_space_stage_4[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 4, 5, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_white_space_stage_5[] = { 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 255, 7, 0, 0, 0, 131, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, }; /* White_Space: 169 bytes. */ RE_UINT32 re_get_white_space(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_white_space_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_white_space_stage_2[pos + f] << 4; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_white_space_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_white_space_stage_4[pos + f] << 6; pos += code; value = (re_white_space_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Bidi_Control. */ static RE_UINT8 re_bidi_control_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_bidi_control_stage_2[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_bidi_control_stage_3[] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_bidi_control_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_bidi_control_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 192, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, }; /* Bidi_Control: 129 bytes. */ RE_UINT32 re_get_bidi_control(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_bidi_control_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_bidi_control_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_bidi_control_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_bidi_control_stage_4[pos + f] << 6; pos += code; value = (re_bidi_control_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Join_Control. */ static RE_UINT8 re_join_control_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_join_control_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_join_control_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_join_control_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_join_control_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, }; /* Join_Control: 97 bytes. */ RE_UINT32 re_get_join_control(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_join_control_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_join_control_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_join_control_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_join_control_stage_4[pos + f] << 6; pos += code; value = (re_join_control_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Dash. */ static RE_UINT8 re_dash_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_dash_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_dash_stage_3[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, }; static RE_UINT8 re_dash_stage_4[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 10, 1, 11, 1, 1, 1, 1, 1, 12, 13, 1, 1, 14, 1, 1, 1, }; static RE_UINT8 re_dash_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 4, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, }; /* Dash: 297 bytes. */ RE_UINT32 re_get_dash(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_dash_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_dash_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_dash_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_dash_stage_4[pos + f] << 6; pos += code; value = (re_dash_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Hyphen. */ static RE_UINT8 re_hyphen_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hyphen_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_hyphen_stage_3[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, }; static RE_UINT8 re_hyphen_stage_4[] = { 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, 9, 1, 1, }; static RE_UINT8 re_hyphen_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, }; /* Hyphen: 241 bytes. */ RE_UINT32 re_get_hyphen(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_hyphen_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_hyphen_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_hyphen_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_hyphen_stage_4[pos + f] << 6; pos += code; value = (re_hyphen_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Quotation_Mark. */ static RE_UINT8 re_quotation_mark_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_quotation_mark_stage_2[] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_quotation_mark_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, }; static RE_UINT8 re_quotation_mark_stage_4[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 6, 7, 1, 1, }; static RE_UINT8 re_quotation_mark_stage_5[] = { 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 255, 0, 0, 0, 6, 0, 240, 0, 224, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, }; /* Quotation_Mark: 193 bytes. */ RE_UINT32 re_get_quotation_mark(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_quotation_mark_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_quotation_mark_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_quotation_mark_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_quotation_mark_stage_4[pos + f] << 6; pos += code; value = (re_quotation_mark_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Terminal_Punctuation. */ static RE_UINT8 re_terminal_punctuation_stage_1[] = { 0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_terminal_punctuation_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, 9, 16, 9, 17, 9, 9, 9, 9, 18, 9, 9, 9, 9, 9, 9, }; static RE_UINT8 re_terminal_punctuation_stage_3[] = { 0, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 4, 5, 6, 7, 8, 9, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 12, 1, 13, 1, 1, 1, 1, 1, 14, 1, 1, 1, 1, 1, 15, 16, 1, 17, 18, 1, 19, 1, 1, 20, 21, 1, 22, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 1, 1, 25, 1, 1, 1, 1, 1, 1, 1, 1, 26, 1, 1, 27, 28, 1, 1, 29, 30, 31, 32, 33, 34, 1, 35, 1, 1, 1, 1, 36, 1, 37, 1, 1, 1, 1, 1, 1, 1, 1, 38, 39, 1, 40, 1, 1, 1, 41, 1, 42, 43, 44, 45, 1, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_terminal_punctuation_stage_4[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 4, 0, 5, 0, 6, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 9, 0, 10, 2, 0, 0, 0, 0, 11, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 18, 0, 19, 0, 0, 0, 0, 0, 11, 0, 0, 20, 0, 0, 0, 0, 21, 0, 0, 22, 0, 23, 0, 24, 25, 0, 0, 26, 0, 0, 27, 0, 0, 0, 0, 0, 0, 23, 28, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 0, 0, 25, 0, 0, 0, 33, 0, 0, 0, 34, 35, 0, 0, 0, 36, 0, 0, 37, 0, 1, 0, 0, 38, 34, 0, 39, 0, 0, 0, 40, 0, 34, 0, 0, 0, 0, 41, 0, 0, 0, 0, 42, 0, 0, 23, 43, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 46, }; static RE_UINT8 re_terminal_punctuation_stage_5[] = { 0, 0, 0, 0, 2, 80, 0, 140, 0, 0, 0, 64, 128, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 16, 0, 136, 0, 0, 16, 0, 255, 23, 0, 0, 0, 0, 0, 3, 0, 0, 255, 127, 48, 0, 0, 0, 0, 0, 0, 12, 0, 225, 7, 0, 0, 12, 0, 0, 254, 1, 0, 0, 0, 96, 0, 0, 0, 56, 0, 0, 0, 0, 112, 4, 60, 3, 0, 0, 0, 15, 0, 0, 0, 0, 0, 236, 0, 0, 0, 248, 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 0, 6, 0, 0, 0, 0, 224, 0, 0, 0, 0, 248, 0, 0, 0, 192, 0, 0, 192, 0, 0, 0, 128, 0, 0, 0, 0, 0, 224, 0, 0, 0, 128, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 247, 0, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 0, 0, 252, 128, 63, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, 96, 0, 0, 0, 0, 0, 15, 0, }; /* Terminal_Punctuation: 676 bytes. */ RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 14; code = ch ^ (f << 14); pos = (RE_UINT32)re_terminal_punctuation_stage_1[f] << 4; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_terminal_punctuation_stage_2[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_terminal_punctuation_stage_3[pos + f] << 2; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_terminal_punctuation_stage_4[pos + f] << 5; pos += code; value = (re_terminal_punctuation_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Math. */ static RE_UINT8 re_other_math_stage_1[] = { 0, 1, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_other_math_stage_2[] = { 0, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 6, 1, 1, }; static RE_UINT8 re_other_math_stage_3[] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 1, 5, 1, 6, 7, 8, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 11, 1, 1, 1, 1, 12, 13, 14, 15, 1, 1, 1, 1, 1, 1, 16, 1, }; static RE_UINT8 re_other_math_stage_4[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 0, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 0, 0, 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, 22, 23, 24, 25, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 28, 0, 0, 0, 0, 29, 0, 30, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 34, 35, 34, 36, 37, 38, 34, 39, 40, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 42, 43, 44, 35, 35, 45, 45, 46, 46, 47, 34, 38, 48, 49, 50, 51, 52, 0, 0, }; static RE_UINT8 re_other_math_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 39, 0, 0, 0, 51, 0, 0, 0, 64, 0, 0, 0, 28, 0, 1, 0, 0, 0, 30, 0, 0, 96, 0, 96, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 62, 16, 179, 251, 241, 224, 3, 0, 0, 0, 0, 224, 243, 182, 62, 195, 240, 255, 63, 235, 47, 48, 0, 0, 0, 0, 15, 0, 0, 0, 0, 176, 0, 0, 0, 1, 0, 4, 0, 0, 0, 3, 192, 127, 240, 193, 140, 15, 0, 148, 31, 0, 0, 96, 0, 0, 0, 5, 0, 0, 0, 15, 96, 0, 0, 192, 255, 0, 0, 248, 255, 255, 1, 0, 0, 0, 15, 0, 0, 0, 48, 10, 1, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 255, 255, 247, 255, 127, 255, 255, 255, 253, 255, 255, 247, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* Other_Math: 502 bytes. */ RE_UINT32 re_get_other_math(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_other_math_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_other_math_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_other_math_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_other_math_stage_4[pos + f] << 5; pos += code; value = (re_other_math_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Hex_Digit. */ static RE_UINT8 re_hex_digit_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hex_digit_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hex_digit_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, }; static RE_UINT8 re_hex_digit_stage_4[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, }; static RE_UINT8 re_hex_digit_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, }; /* Hex_Digit: 129 bytes. */ RE_UINT32 re_get_hex_digit(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_hex_digit_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_hex_digit_stage_2[pos + f] << 3; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_hex_digit_stage_3[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_hex_digit_stage_4[pos + f] << 7; pos += code; value = (re_hex_digit_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* ASCII_Hex_Digit. */ static RE_UINT8 re_ascii_hex_digit_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_4[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* ASCII_Hex_Digit: 97 bytes. */ RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ascii_hex_digit_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_ascii_hex_digit_stage_2[pos + f] << 3; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_ascii_hex_digit_stage_3[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_ascii_hex_digit_stage_4[pos + f] << 7; pos += code; value = (re_ascii_hex_digit_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Alphabetic. */ static RE_UINT8 re_other_alphabetic_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_other_alphabetic_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 10, 11, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_other_alphabetic_stage_3[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 14, 0, 0, 0, 15, 16, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 33, }; static RE_UINT8 re_other_alphabetic_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 5, 6, 0, 0, 7, 8, 9, 10, 0, 0, 0, 11, 0, 0, 12, 13, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 18, 19, 20, 22, 23, 19, 20, 24, 18, 19, 20, 25, 18, 26, 20, 27, 0, 19, 20, 28, 18, 18, 20, 28, 18, 18, 20, 29, 18, 18, 0, 30, 31, 0, 32, 33, 0, 0, 34, 33, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 39, 40, 41, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 31, 31, 31, 31, 0, 43, 44, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 0, 0, 0, 10, 47, 0, 48, 0, 49, 50, 0, 0, 0, 0, 51, 52, 15, 0, 53, 54, 0, 55, 0, 56, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 43, 57, 58, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 59, 42, 0, 0, 0, 0, 60, 0, 0, 61, 62, 15, 0, 0, 63, 64, 0, 15, 62, 0, 0, 0, 65, 66, 0, 0, 67, 0, 68, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 53, 72, 73, 0, 26, 74, 0, 0, 53, 64, 0, 0, 53, 75, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 35, 77, 0, 0, 0, 0, }; static RE_UINT8 re_other_alphabetic_stage_5[] = { 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, 0, 248, 255, 254, 0, 0, 1, 0, 0, 0, 192, 31, 158, 33, 0, 0, 0, 0, 2, 0, 0, 0, 255, 255, 192, 255, 1, 0, 0, 0, 192, 248, 239, 30, 0, 0, 240, 3, 255, 127, 15, 0, 0, 0, 0, 0, 0, 204, 255, 223, 224, 0, 12, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 192, 159, 25, 128, 0, 135, 25, 2, 0, 0, 0, 35, 0, 191, 27, 0, 0, 159, 25, 192, 0, 4, 0, 0, 0, 199, 29, 128, 0, 223, 29, 96, 0, 223, 29, 128, 0, 0, 128, 95, 255, 0, 0, 12, 0, 0, 0, 242, 7, 0, 32, 0, 0, 0, 0, 242, 27, 0, 0, 254, 255, 3, 224, 255, 254, 255, 255, 255, 31, 0, 248, 127, 121, 0, 0, 192, 195, 133, 1, 30, 0, 124, 0, 0, 48, 0, 0, 0, 128, 0, 0, 192, 255, 255, 1, 0, 0, 0, 2, 0, 0, 255, 15, 255, 1, 1, 3, 0, 0, 0, 0, 128, 15, 0, 0, 224, 127, 254, 255, 31, 0, 31, 0, 0, 0, 0, 0, 224, 255, 7, 0, 0, 0, 254, 51, 0, 0, 128, 255, 3, 0, 240, 255, 63, 0, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 240, 15, 248, 0, 0, 0, 3, 0, 0, 0, 0, 0, 240, 255, 192, 7, 0, 0, 128, 255, 7, 0, 0, 254, 127, 0, 8, 48, 0, 0, 0, 0, 157, 65, 0, 248, 32, 0, 248, 7, 0, 0, 0, 0, 0, 64, 110, 240, 0, 0, 0, 0, 0, 255, 63, 0, 0, 0, 0, 0, 255, 1, 0, 0, 248, 255, 0, 248, 63, 0, 255, 255, 255, 127, }; /* Other_Alphabetic: 786 bytes. */ RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_other_alphabetic_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_other_alphabetic_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_other_alphabetic_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_other_alphabetic_stage_4[pos + f] << 5; pos += code; value = (re_other_alphabetic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Ideographic. */ static RE_UINT8 re_ideographic_stage_1[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ideographic_stage_2[] = { 0, 0, 0, 1, 2, 3, 3, 3, 3, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 0, 0, 0, 8, }; static RE_UINT8 re_ideographic_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 5, 6, 0, 0, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 8, 9, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0, 0, }; static RE_UINT8 re_ideographic_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 2, 2, 2, 2, 2, 5, 2, 6, 0, 0, 0, 0, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 9, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_ideographic_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 254, 3, 0, 7, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 255, 31, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 255, 255, 127, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 0, 0, 0, 0, }; /* Ideographic: 297 bytes. */ RE_UINT32 re_get_ideographic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ideographic_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_ideographic_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_ideographic_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_ideographic_stage_4[pos + f] << 6; pos += code; value = (re_ideographic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Diacritic. */ static RE_UINT8 re_diacritic_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_diacritic_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 4, 4, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_diacritic_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 1, 1, 1, 1, 1, 17, 1, 18, 19, 20, 21, 22, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 25, 1, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 28, 29, 30, 31, 32, 1, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 36, 37, 1, 1, 1, 1, 38, 1, 1, 1, 1, 1, 1, 1, 1, 39, 1, 40, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_diacritic_stage_4[] = { 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 0, 0, 0, 14, 0, 0, 0, 15, 16, 0, 4, 17, 0, 0, 18, 0, 19, 20, 0, 0, 0, 0, 0, 0, 21, 0, 22, 23, 24, 0, 22, 25, 0, 0, 22, 25, 0, 0, 22, 25, 0, 0, 22, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 22, 25, 0, 0, 0, 25, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 28, 0, 20, 29, 0, 0, 30, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 37, 38, 39, 0, 40, 0, 0, 0, 41, 0, 42, 0, 0, 4, 43, 0, 44, 5, 17, 0, 0, 45, 46, 0, 0, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, 22, 0, 0, 0, 54, 0, 0, 0, 55, 56, 57, 0, 0, 58, 0, 0, 20, 0, 0, 0, 0, 0, 0, 38, 59, 0, 60, 61, 0, 0, 61, 2, 0, 0, 0, 0, 62, 0, 15, 63, 64, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 1, 2, 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 73, 74, 75, 0, 0, }; static RE_UINT8 re_diacritic_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 129, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224, 7, 0, 48, 4, 48, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, 251, 255, 255, 191, 22, 0, 0, 0, 0, 248, 135, 1, 0, 0, 0, 128, 97, 28, 0, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 0, 0, 0, 0, 3, 240, 255, 255, 127, 0, 0, 0, 16, 0, 32, 30, 0, 0, 0, 2, 0, 0, 32, 0, 0, 0, 4, 0, 0, 128, 95, 0, 0, 0, 31, 0, 0, 0, 0, 160, 194, 220, 0, 0, 0, 64, 0, 0, 0, 0, 0, 128, 6, 128, 191, 0, 12, 0, 254, 15, 32, 0, 0, 0, 14, 0, 0, 224, 159, 0, 0, 16, 0, 16, 0, 0, 0, 0, 248, 15, 0, 0, 12, 0, 0, 0, 0, 192, 0, 0, 0, 0, 63, 255, 33, 16, 0, 0, 240, 255, 255, 240, 255, 0, 0, 0, 0, 0, 224, 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, 0, 128, 3, 0, 0, 128, 0, 0, 0, 252, 0, 0, 0, 0, 0, 30, 0, 128, 0, 176, 0, 0, 3, 0, 0, 0, 128, 255, 3, 0, 0, 0, 0, 1, 0, 0, 255, 255, 3, 0, 0, 120, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, 64, 0, 0, 48, 0, 0, 127, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 192, 8, 0, 0, 0, 0, 0, 0, 6, 0, 0, 24, 0, 0, 128, 255, 255, 128, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, }; /* Diacritic: 849 bytes. */ RE_UINT32 re_get_diacritic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_diacritic_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_diacritic_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_diacritic_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_diacritic_stage_4[pos + f] << 5; pos += code; value = (re_diacritic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Extender. */ static RE_UINT8 re_extender_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_extender_stage_2[] = { 0, 1, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_extender_stage_3[] = { 0, 1, 2, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 7, 1, 8, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 11, 1, 1, 12, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, }; static RE_UINT8 re_extender_stage_4[] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 10, 0, 0, 0, 0, 11, 12, 0, 0, 13, 0, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 18, 0, 0, 19, 20, 0, 0, 0, 18, 0, 0, 0, 0, }; static RE_UINT8 re_extender_stage_5[] = { 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 4, 0, 0, 8, 0, 0, 0, 128, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 8, 32, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 96, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, 0, 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32, 0, 0, 24, 0, }; /* Extender: 349 bytes. */ RE_UINT32 re_get_extender(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_extender_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_extender_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_extender_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_extender_stage_4[pos + f] << 5; pos += code; value = (re_extender_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Lowercase. */ static RE_UINT8 re_other_lowercase_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_lowercase_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_other_lowercase_stage_3[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 4, 2, 5, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, }; static RE_UINT8 re_other_lowercase_stage_4[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 8, 9, 0, 0, 10, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 14, }; static RE_UINT8 re_other_lowercase_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, }; /* Other_Lowercase: 273 bytes. */ RE_UINT32 re_get_other_lowercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_lowercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_lowercase_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_lowercase_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_lowercase_stage_4[pos + f] << 6; pos += code; value = (re_other_lowercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Uppercase. */ static RE_UINT8 re_other_uppercase_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_uppercase_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_uppercase_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_uppercase_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, }; static RE_UINT8 re_other_uppercase_stage_5[] = { 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 192, 255, }; /* Other_Uppercase: 117 bytes. */ RE_UINT32 re_get_other_uppercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_uppercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_uppercase_stage_2[pos + f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_other_uppercase_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_other_uppercase_stage_4[pos + f] << 5; pos += code; value = (re_other_uppercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Noncharacter_Code_Point. */ static RE_UINT8 re_noncharacter_code_point_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_noncharacter_code_point_stage_2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, }; static RE_UINT8 re_noncharacter_code_point_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 2, }; static RE_UINT8 re_noncharacter_code_point_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, }; static RE_UINT8 re_noncharacter_code_point_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, }; /* Noncharacter_Code_Point: 121 bytes. */ RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_noncharacter_code_point_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_noncharacter_code_point_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_noncharacter_code_point_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_noncharacter_code_point_stage_4[pos + f] << 6; pos += code; value = (re_noncharacter_code_point_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Grapheme_Extend. */ static RE_UINT8 re_other_grapheme_extend_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_other_grapheme_extend_stage_2[] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_grapheme_extend_stage_3[] = { 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_grapheme_extend_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 0, 3, 1, 2, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 8, 0, 0, }; static RE_UINT8 re_other_grapheme_extend_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 128, 0, 0, 0, 0, 0, 4, 0, 96, 0, 0, 0, 0, 0, 0, 128, 0, 128, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 32, 192, 7, 0, }; /* Other_Grapheme_Extend: 249 bytes. */ RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_grapheme_extend_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_grapheme_extend_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_grapheme_extend_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_grapheme_extend_stage_4[pos + f] << 6; pos += code; value = (re_other_grapheme_extend_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* IDS_Binary_Operator. */ static RE_UINT8 re_ids_binary_operator_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ids_binary_operator_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_ids_binary_operator_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_binary_operator_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_binary_operator_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 15, }; /* IDS_Binary_Operator: 97 bytes. */ RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ids_binary_operator_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_ids_binary_operator_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_ids_binary_operator_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_ids_binary_operator_stage_4[pos + f] << 6; pos += code; value = (re_ids_binary_operator_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* IDS_Trinary_Operator. */ static RE_UINT8 re_ids_trinary_operator_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ids_trinary_operator_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_ids_trinary_operator_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_trinary_operator_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_trinary_operator_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, }; /* IDS_Trinary_Operator: 97 bytes. */ RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ids_trinary_operator_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_ids_trinary_operator_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_ids_trinary_operator_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_ids_trinary_operator_stage_4[pos + f] << 6; pos += code; value = (re_ids_trinary_operator_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Radical. */ static RE_UINT8 re_radical_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_radical_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_radical_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_radical_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 0, }; static RE_UINT8 re_radical_stage_5[] = { 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 15, 0, 255, 255, 63, 0, }; /* Radical: 117 bytes. */ RE_UINT32 re_get_radical(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_radical_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_radical_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_radical_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_radical_stage_4[pos + f] << 5; pos += code; value = (re_radical_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Unified_Ideograph. */ static RE_UINT8 re_unified_ideograph_stage_1[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_unified_ideograph_stage_2[] = { 0, 0, 0, 1, 2, 3, 3, 3, 3, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 0, 0, 0, 0, }; static RE_UINT8 re_unified_ideograph_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 4, 0, 0, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 6, 7, 0, 0, 0, }; static RE_UINT8 re_unified_ideograph_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 3, 4, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_unified_ideograph_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 255, 31, 0, 0, 0, 0, 0, 0, 0, 192, 26, 128, 154, 3, 0, 0, 255, 255, 127, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 0, 0, 0, 0, }; /* Unified_Ideograph: 257 bytes. */ RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_unified_ideograph_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_unified_ideograph_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_unified_ideograph_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_unified_ideograph_stage_4[pos + f] << 6; pos += code; value = (re_unified_ideograph_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Default_Ignorable_Code_Point. */ static RE_UINT8 re_other_default_ignorable_code_point_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_3[] = { 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 8, 8, 8, 8, 8, 8, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 9, 9, 0, 0, 0, 10, 9, 9, 9, 9, 9, 9, 9, 9, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 1, 253, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, }; /* Other_Default_Ignorable_Code_Point: 281 bytes. */ RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_4[pos + f] << 6; pos += code; value = (re_other_default_ignorable_code_point_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Deprecated. */ static RE_UINT8 re_deprecated_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, }; static RE_UINT8 re_deprecated_stage_2[] = { 0, 1, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_deprecated_stage_3[] = { 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_deprecated_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 7, 8, 8, 8, 0, 0, 0, 0, }; static RE_UINT8 re_deprecated_stage_5[] = { 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 8, 0, 0, 0, 128, 2, 24, 0, 0, 0, 0, 252, 0, 0, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, 255, 255, }; /* Deprecated: 230 bytes. */ RE_UINT32 re_get_deprecated(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_deprecated_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_deprecated_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_deprecated_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_deprecated_stage_4[pos + f] << 5; pos += code; value = (re_deprecated_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Soft_Dotted. */ static RE_UINT8 re_soft_dotted_stage_1[] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_soft_dotted_stage_2[] = { 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, }; static RE_UINT8 re_soft_dotted_stage_3[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 5, 8, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 5, 5, 5, 5, 5, 11, 12, 13, 5, }; static RE_UINT8 re_soft_dotted_stage_4[] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 0, 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 17, 18, 0, 19, 20, 0, 21, 0, 22, 23, 0, 24, 0, 17, 18, 0, 19, 20, 0, 21, 0, 0, 0, }; static RE_UINT8 re_soft_dotted_stage_5[] = { 0, 0, 0, 0, 0, 6, 0, 0, 0, 128, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 64, 1, 4, 0, 0, 0, 0, 0, 64, 0, 16, 1, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 192, 0, 0, 0, 0, 0, 0, 12, 0, 192, 0, 0, }; /* Soft_Dotted: 342 bytes. */ RE_UINT32 re_get_soft_dotted(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_soft_dotted_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_soft_dotted_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_soft_dotted_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_soft_dotted_stage_4[pos + f] << 5; pos += code; value = (re_soft_dotted_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Logical_Order_Exception. */ static RE_UINT8 re_logical_order_exception_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_logical_order_exception_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_logical_order_exception_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, }; static RE_UINT8 re_logical_order_exception_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, }; static RE_UINT8 re_logical_order_exception_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 26, }; /* Logical_Order_Exception: 121 bytes. */ RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_logical_order_exception_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_logical_order_exception_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_logical_order_exception_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_logical_order_exception_stage_4[pos + f] << 6; pos += code; value = (re_logical_order_exception_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_ID_Start. */ static RE_UINT8 re_other_id_start_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_id_start_stage_2[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_id_start_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_id_start_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_id_start_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 64, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, }; /* Other_ID_Start: 113 bytes. */ RE_UINT32 re_get_other_id_start(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_id_start_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_other_id_start_stage_2[pos + f] << 4; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_id_start_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_id_start_stage_4[pos + f] << 6; pos += code; value = (re_other_id_start_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_ID_Continue. */ static RE_UINT8 re_other_id_continue_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_id_continue_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_id_continue_stage_3[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_other_id_continue_stage_4[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, }; static RE_UINT8 re_other_id_continue_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, }; /* Other_ID_Continue: 145 bytes. */ RE_UINT32 re_get_other_id_continue(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_id_continue_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_other_id_continue_stage_2[pos + f] << 4; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_id_continue_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_id_continue_stage_4[pos + f] << 6; pos += code; value = (re_other_id_continue_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* STerm. */ static RE_UINT8 re_sterm_stage_1[] = { 0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_sterm_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 3, 9, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 11, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_sterm_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 11, 1, 12, 1, 13, 1, 14, 1, 1, 15, 16, 1, 17, 1, 1, 1, 1, 1, 1, 1, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 1, 1, 1, 20, 1, 1, 1, 1, 1, 1, 1, 1, 21, 1, 1, 22, 23, 1, 1, 24, 25, 26, 27, 28, 29, 1, 30, 1, 1, 1, 1, 31, 1, 32, 1, 1, 1, 1, 1, 33, 1, 1, 1, 34, 35, 36, 37, 1, 1, 1, 1, }; static RE_UINT8 re_sterm_stage_4[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 9, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 12, 0, 0, 13, 0, 0, 0, 0, 0, 8, 0, 0, 14, 0, 0, 0, 0, 15, 0, 0, 16, 0, 17, 0, 18, 19, 0, 0, 11, 0, 0, 20, 0, 0, 0, 0, 0, 0, 4, 21, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 21, 0, 0, 24, 0, 0, 0, 0, 25, 0, 0, 0, 26, 0, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 29, 0, 1, 0, 0, 30, 0, 0, 23, 0, 0, 0, 31, 0, 0, 17, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, }; static RE_UINT8 re_sterm_stage_5[] = { 0, 0, 0, 0, 2, 64, 0, 128, 0, 0, 0, 80, 0, 2, 0, 0, 0, 0, 0, 128, 0, 0, 16, 0, 7, 0, 0, 0, 0, 0, 0, 2, 48, 0, 0, 0, 0, 12, 0, 0, 132, 1, 0, 0, 0, 64, 0, 0, 0, 0, 96, 0, 8, 2, 0, 0, 0, 15, 0, 0, 0, 0, 0, 204, 0, 0, 0, 24, 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 4, 0, 0, 0, 0, 192, 0, 0, 0, 0, 136, 0, 0, 0, 192, 0, 0, 128, 0, 0, 0, 3, 0, 0, 0, 0, 0, 224, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 196, 0, 2, 0, 0, 0, 128, 1, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, 96, 0, 0, 0, }; /* STerm: 568 bytes. */ RE_UINT32 re_get_sterm(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 14; code = ch ^ (f << 14); pos = (RE_UINT32)re_sterm_stage_1[f] << 4; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_sterm_stage_2[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_sterm_stage_3[pos + f] << 2; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_sterm_stage_4[pos + f] << 5; pos += code; value = (re_sterm_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Variation_Selector. */ static RE_UINT8 re_variation_selector_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, }; static RE_UINT8 re_variation_selector_stage_2[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_variation_selector_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_variation_selector_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, }; static RE_UINT8 re_variation_selector_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, }; /* Variation_Selector: 169 bytes. */ RE_UINT32 re_get_variation_selector(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_variation_selector_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_variation_selector_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_variation_selector_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_variation_selector_stage_4[pos + f] << 6; pos += code; value = (re_variation_selector_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Pattern_White_Space. */ static RE_UINT8 re_pattern_white_space_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_2[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_4[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_5[] = { 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 3, 0, 0, }; /* Pattern_White_Space: 129 bytes. */ RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_pattern_white_space_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_pattern_white_space_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_pattern_white_space_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_pattern_white_space_stage_4[pos + f] << 6; pos += code; value = (re_pattern_white_space_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Pattern_Syntax. */ static RE_UINT8 re_pattern_syntax_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_syntax_stage_2[] = { 0, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_syntax_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 4, 4, 6, 4, 4, 4, 4, 1, 1, 7, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 10, 1, }; static RE_UINT8 re_pattern_syntax_stage_4[] = { 0, 1, 2, 2, 0, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 9, 10, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, }; static RE_UINT8 re_pattern_syntax_stage_5[] = { 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 120, 254, 90, 67, 136, 0, 0, 128, 0, 0, 0, 255, 255, 255, 0, 255, 127, 254, 255, 239, 127, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 240, 255, 14, 255, 255, 255, 1, 0, 1, 0, 0, 0, 0, 192, 96, 0, 0, 0, }; /* Pattern_Syntax: 277 bytes. */ RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_pattern_syntax_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_pattern_syntax_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_pattern_syntax_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_pattern_syntax_stage_4[pos + f] << 5; pos += code; value = (re_pattern_syntax_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Hangul_Syllable_Type. */ static RE_UINT8 re_hangul_syllable_type_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hangul_syllable_type_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_hangul_syllable_type_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 11, }; static RE_UINT8 re_hangul_syllable_type_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 4, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 6, 5, 6, 6, 8, 0, 2, 2, 9, 10, 3, 3, 3, 3, 3, 11, }; static RE_UINT8 re_hangul_syllable_type_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 0, 0, 0, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, }; /* Hangul_Syllable_Type: 497 bytes. */ RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_hangul_syllable_type_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_hangul_syllable_type_stage_2[pos + f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_hangul_syllable_type_stage_3[pos + f] << 4; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_hangul_syllable_type_stage_4[pos + f] << 3; value = re_hangul_syllable_type_stage_5[pos + code]; return value; } /* Bidi_Class. */ static RE_UINT8 re_bidi_class_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 7, 8, 9, 5, 5, 5, 5, 10, 5, 5, 5, 5, 5, 5, 11, 12, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, }; static RE_UINT8 re_bidi_class_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2, 2, 2, 2, 30, 31, 32, 2, 2, 2, 2, 33, 34, 35, 36, 37, 38, 39, 40, 2, 41, 42, 43, 44, 2, 45, 2, 2, 2, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 52, 52, 52, 57, 58, 52, 2, 2, 52, 52, 52, 52, 59, 2, 2, 60, 61, 62, 63, 64, 52, 65, 66, 67, 2, 68, 69, 70, 71, 72, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 73, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 2, 2, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 2, 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 87, 87, 87, 88, 89, 90, 91, 92, 93, 2, 2, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 96, 96, 97, 96, 98, 96, 99, 96, 96, 96, 96, 96, 100, 96, 96, 96, 101, 102, 103, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 105, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 106, 2, 2, 107, 108, 109, 2, 110, 2, 2, 2, 2, 2, 2, 111, 112, 113, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 87, 114, 96, 96, 115, 116, 117, 2, 2, 2, 118, 119, 120, 121, 122, 123, 124, 125, 126, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 127, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 127, 128, 128, 129, 130, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static RE_UINT8 re_bidi_class_stage_3[] = { 0, 1, 2, 3, 4, 5, 4, 6, 7, 8, 9, 10, 11, 12, 11, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 14, 14, 15, 16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 11, 11, 11, 11, 11, 11, 20, 21, 11, 11, 11, 11, 11, 11, 11, 22, 23, 17, 24, 25, 26, 26, 26, 27, 28, 29, 29, 30, 17, 31, 32, 29, 29, 29, 29, 29, 33, 34, 35, 29, 36, 29, 17, 28, 29, 29, 29, 29, 29, 37, 32, 26, 26, 38, 39, 26, 40, 41, 26, 26, 42, 26, 26, 26, 26, 29, 29, 29, 29, 43, 44, 45, 11, 11, 46, 47, 48, 49, 11, 50, 11, 11, 51, 52, 11, 49, 53, 54, 11, 11, 51, 55, 50, 11, 56, 54, 11, 11, 51, 57, 11, 49, 58, 50, 11, 11, 59, 52, 60, 49, 11, 61, 11, 11, 11, 62, 11, 11, 63, 11, 11, 11, 64, 65, 66, 49, 67, 11, 11, 11, 51, 68, 11, 49, 11, 11, 11, 11, 11, 52, 11, 49, 11, 11, 11, 11, 11, 69, 70, 11, 11, 11, 11, 11, 71, 72, 11, 11, 11, 11, 11, 11, 73, 74, 11, 11, 11, 11, 75, 11, 76, 11, 11, 11, 77, 78, 79, 17, 80, 60, 11, 11, 11, 11, 11, 81, 82, 11, 83, 84, 85, 86, 87, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 81, 11, 11, 11, 88, 11, 11, 11, 11, 11, 11, 4, 11, 11, 11, 11, 11, 11, 11, 89, 90, 11, 11, 11, 11, 11, 11, 11, 91, 11, 91, 11, 49, 11, 49, 11, 11, 11, 92, 93, 94, 11, 88, 95, 11, 11, 11, 11, 11, 11, 11, 11, 11, 96, 11, 11, 11, 11, 11, 11, 11, 97, 98, 99, 11, 11, 11, 11, 11, 11, 11, 11, 100, 16, 16, 11, 101, 11, 11, 11, 102, 103, 104, 105, 11, 11, 106, 61, 11, 107, 105, 108, 11, 109, 11, 11, 11, 110, 108, 11, 11, 111, 112, 11, 11, 11, 11, 11, 11, 11, 11, 11, 113, 114, 115, 11, 11, 11, 11, 17, 17, 116, 111, 11, 11, 11, 117, 118, 119, 119, 120, 121, 16, 122, 123, 124, 125, 126, 127, 128, 11, 129, 129, 129, 17, 17, 84, 130, 131, 132, 133, 134, 16, 11, 11, 135, 16, 16, 16, 16, 16, 16, 16, 16, 136, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 137, 11, 11, 11, 5, 16, 138, 16, 16, 16, 16, 16, 139, 16, 16, 140, 11, 141, 11, 16, 16, 142, 143, 11, 11, 11, 11, 144, 16, 16, 16, 145, 16, 16, 16, 16, 16, 146, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 147, 88, 11, 11, 11, 11, 11, 11, 11, 11, 148, 149, 11, 11, 11, 11, 11, 11, 11, 150, 11, 11, 11, 11, 11, 11, 17, 17, 16, 16, 16, 151, 11, 11, 11, 11, 16, 152, 16, 16, 16, 16, 16, 139, 16, 16, 16, 16, 16, 137, 11, 151, 153, 16, 154, 155, 11, 11, 11, 11, 11, 156, 4, 11, 11, 11, 11, 157, 11, 11, 11, 11, 16, 16, 139, 11, 11, 120, 11, 11, 11, 16, 11, 158, 11, 11, 11, 146, 159, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 160, 11, 11, 11, 11, 11, 100, 11, 161, 11, 11, 11, 11, 16, 16, 16, 16, 11, 16, 16, 16, 140, 11, 11, 11, 119, 11, 11, 11, 11, 11, 150, 162, 11, 150, 11, 11, 11, 11, 11, 108, 16, 16, 163, 11, 11, 11, 11, 11, 164, 11, 11, 11, 11, 11, 11, 11, 165, 11, 166, 167, 11, 11, 11, 168, 11, 11, 11, 11, 115, 11, 17, 108, 11, 11, 169, 11, 170, 108, 11, 11, 45, 11, 11, 171, 11, 11, 11, 11, 11, 11, 172, 173, 174, 11, 11, 11, 11, 11, 11, 175, 50, 11, 68, 60, 11, 11, 11, 11, 11, 11, 176, 11, 11, 177, 178, 26, 26, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 179, 29, 29, 29, 29, 29, 29, 29, 29, 29, 8, 8, 180, 17, 88, 116, 16, 16, 181, 182, 29, 29, 29, 29, 29, 29, 29, 29, 183, 184, 3, 4, 5, 4, 5, 137, 11, 11, 11, 11, 11, 11, 11, 185, 186, 187, 11, 11, 11, 16, 16, 16, 16, 141, 151, 11, 11, 11, 11, 11, 87, 26, 26, 26, 26, 26, 26, 26, 26, 26, 188, 26, 26, 26, 26, 26, 26, 189, 26, 26, 190, 26, 26, 26, 26, 26, 26, 26, 191, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 192, 193, 50, 11, 11, 194, 116, 14, 137, 11, 108, 11, 11, 195, 11, 11, 11, 11, 45, 11, 196, 197, 11, 11, 11, 11, 108, 11, 11, 198, 11, 11, 11, 11, 11, 11, 199, 200, 11, 11, 11, 11, 150, 45, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 201, 202, 203, 11, 204, 11, 11, 11, 11, 11, 16, 16, 16, 16, 205, 11, 11, 11, 16, 16, 16, 16, 16, 140, 11, 11, 11, 11, 11, 11, 11, 157, 11, 11, 11, 206, 11, 11, 161, 11, 11, 11, 135, 11, 11, 11, 207, 208, 208, 208, 29, 29, 29, 29, 29, 29, 29, 209, 16, 16, 151, 16, 16, 16, 16, 16, 16, 139, 210, 211, 146, 146, 11, 11, 212, 11, 11, 11, 11, 11, 133, 11, 16, 16, 4, 213, 16, 16, 16, 147, 16, 139, 16, 16, 214, 11, 16, 4, 16, 16, 16, 210, 215, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 216, 16, 16, 16, 217, 139, 16, 218, 11, 11, 11, 11, 11, 11, 11, 11, 5, 16, 16, 16, 16, 219, 11, 11, 11, 16, 16, 16, 16, 137, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 139, 11, 11, 11, 11, 11, 11, 11, 220, 8, 8, 8, 8, 8, 8, 8, 8, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 8, }; static RE_UINT8 re_bidi_class_stage_4[] = { 0, 0, 1, 2, 0, 0, 0, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 12, 12, 12, 12, 13, 10, 12, 12, 13, 14, 0, 15, 0, 0, 0, 0, 0, 0, 16, 5, 17, 18, 19, 20, 21, 10, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, 22, 12, 23, 10, 10, 10, 12, 24, 10, 17, 10, 10, 10, 10, 25, 25, 25, 25, 12, 26, 12, 27, 12, 17, 12, 12, 12, 27, 12, 12, 28, 25, 29, 12, 12, 12, 27, 30, 31, 25, 25, 25, 25, 25, 25, 32, 33, 32, 34, 34, 34, 34, 34, 34, 35, 36, 37, 38, 25, 25, 39, 40, 40, 40, 40, 40, 40, 40, 41, 25, 35, 35, 42, 43, 44, 40, 40, 40, 40, 45, 25, 46, 25, 47, 48, 49, 8, 8, 50, 40, 51, 40, 40, 40, 40, 45, 25, 25, 34, 34, 52, 25, 25, 53, 54, 34, 34, 55, 32, 25, 25, 31, 31, 56, 34, 34, 31, 34, 40, 25, 25, 25, 25, 25, 25, 39, 57, 12, 12, 12, 12, 12, 58, 59, 60, 25, 59, 61, 60, 25, 12, 12, 62, 12, 12, 12, 61, 12, 12, 12, 12, 12, 12, 59, 60, 59, 12, 61, 63, 12, 30, 12, 64, 12, 12, 12, 64, 28, 65, 29, 29, 61, 12, 12, 60, 66, 59, 61, 67, 12, 12, 12, 12, 12, 12, 65, 12, 58, 12, 12, 58, 12, 12, 12, 59, 12, 12, 61, 13, 10, 68, 12, 12, 12, 12, 62, 59, 62, 69, 29, 12, 64, 12, 12, 12, 12, 10, 70, 12, 12, 12, 29, 12, 12, 58, 12, 62, 71, 12, 12, 61, 25, 57, 30, 12, 28, 25, 57, 61, 25, 66, 59, 12, 12, 25, 29, 12, 12, 29, 12, 12, 72, 73, 26, 60, 25, 25, 57, 25, 69, 12, 60, 25, 25, 60, 25, 25, 25, 25, 59, 12, 12, 12, 60, 69, 25, 64, 64, 12, 12, 29, 62, 59, 12, 12, 12, 60, 59, 12, 12, 58, 64, 12, 61, 12, 12, 12, 61, 10, 10, 26, 12, 74, 12, 12, 12, 12, 12, 13, 11, 62, 59, 12, 12, 12, 66, 25, 29, 12, 58, 60, 25, 25, 12, 30, 61, 10, 10, 75, 76, 12, 12, 61, 12, 57, 28, 59, 12, 58, 12, 60, 12, 11, 26, 12, 12, 12, 12, 12, 23, 12, 28, 65, 12, 12, 58, 25, 57, 71, 60, 25, 59, 28, 25, 25, 65, 25, 12, 12, 12, 12, 69, 57, 59, 12, 12, 28, 25, 29, 12, 12, 12, 62, 29, 66, 12, 12, 58, 29, 72, 12, 12, 12, 25, 25, 62, 12, 12, 57, 25, 25, 25, 69, 25, 59, 61, 12, 59, 12, 12, 25, 57, 12, 12, 12, 12, 12, 77, 26, 12, 12, 24, 12, 12, 12, 24, 12, 12, 12, 22, 78, 78, 79, 80, 10, 10, 81, 82, 83, 84, 10, 10, 10, 85, 10, 10, 10, 10, 10, 86, 0, 87, 88, 0, 89, 8, 90, 70, 8, 8, 90, 70, 83, 83, 83, 83, 17, 70, 26, 12, 12, 20, 11, 23, 10, 77, 91, 92, 12, 12, 23, 12, 10, 11, 23, 26, 12, 12, 91, 12, 93, 10, 10, 10, 10, 26, 12, 12, 10, 20, 10, 10, 10, 12, 12, 12, 10, 70, 12, 12, 10, 10, 70, 12, 10, 10, 8, 8, 8, 8, 8, 12, 12, 12, 23, 10, 10, 10, 10, 24, 24, 10, 10, 10, 10, 10, 10, 11, 12, 24, 70, 28, 29, 12, 24, 10, 12, 12, 12, 28, 10, 10, 10, 12, 10, 10, 17, 10, 94, 11, 10, 10, 11, 12, 62, 29, 11, 23, 12, 24, 12, 12, 95, 11, 12, 12, 13, 12, 12, 12, 12, 70, 12, 12, 12, 10, 12, 13, 70, 12, 12, 12, 12, 13, 96, 25, 25, 97, 26, 12, 12, 12, 12, 12, 11, 12, 58, 58, 28, 12, 12, 64, 10, 12, 12, 12, 98, 12, 12, 10, 12, 12, 12, 62, 25, 29, 12, 28, 25, 25, 28, 62, 29, 59, 12, 12, 60, 57, 64, 64, 12, 12, 28, 12, 12, 59, 69, 65, 59, 62, 12, 61, 59, 61, 12, 12, 12, 99, 34, 34, 100, 34, 40, 40, 40, 101, 40, 40, 40, 102, 103, 104, 10, 105, 106, 70, 107, 12, 40, 40, 40, 108, 109, 5, 6, 7, 5, 110, 10, 70, 0, 0, 111, 112, 91, 12, 12, 12, 34, 34, 34, 113, 31, 33, 34, 25, 34, 34, 114, 52, 34, 34, 115, 10, 35, 35, 35, 35, 35, 35, 35, 116, 12, 12, 25, 25, 28, 57, 64, 12, 12, 28, 25, 60, 25, 59, 12, 12, 12, 62, 25, 57, 12, 12, 28, 61, 25, 66, 12, 12, 12, 28, 29, 12, 117, 0, 118, 25, 57, 60, 25, 12, 12, 12, 62, 29, 119, 120, 12, 12, 12, 91, 12, 12, 13, 12, 12, 121, 8, 8, 8, 8, 122, 40, 40, 40, 10, 10, 10, 70, 24, 10, 10, 70, 8, 8, 123, 12, 10, 17, 10, 10, 10, 20, 70, 12, 20, 10, 10, 10, 10, 10, 24, 11, 10, 10, 10, 26, 10, 10, 12, 12, 11, 24, 10, 10, 12, 12, 12, 124, }; static RE_UINT8 re_bidi_class_stage_5[] = { 11, 11, 11, 11, 11, 8, 7, 8, 9, 7, 11, 11, 7, 7, 7, 8, 9, 10, 10, 4, 4, 4, 10, 10, 10, 10, 10, 3, 6, 3, 6, 6, 2, 2, 2, 2, 2, 2, 6, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 11, 11, 7, 11, 11, 6, 10, 4, 4, 10, 10, 0, 10, 10, 11, 10, 10, 4, 4, 2, 2, 10, 0, 10, 10, 10, 2, 0, 10, 0, 10, 10, 0, 0, 0, 10, 10, 0, 10, 10, 10, 12, 12, 12, 12, 10, 10, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0, 4, 1, 12, 12, 12, 12, 12, 1, 12, 1, 12, 12, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 13, 10, 10, 13, 4, 4, 13, 6, 13, 10, 10, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 12, 5, 5, 4, 5, 5, 13, 13, 13, 12, 13, 13, 13, 13, 13, 12, 12, 12, 5, 10, 12, 12, 13, 13, 12, 12, 10, 12, 12, 12, 12, 13, 13, 2, 2, 13, 13, 13, 12, 13, 13, 1, 1, 1, 12, 1, 1, 10, 10, 10, 10, 1, 1, 1, 1, 12, 12, 12, 12, 1, 1, 12, 12, 12, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 12, 12, 12, 0, 12, 0, 0, 0, 0, 12, 12, 0, 0, 4, 4, 0, 12, 12, 0, 12, 0, 0, 12, 12, 12, 0, 12, 0, 4, 0, 0, 10, 4, 10, 0, 12, 0, 12, 12, 10, 10, 10, 0, 12, 0, 12, 0, 0, 12, 0, 12, 0, 12, 10, 10, 9, 0, 0, 0, 10, 10, 10, 12, 12, 12, 11, 0, 0, 10, 0, 10, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 0, 1, 9, 7, 16, 17, 18, 14, 15, 6, 4, 4, 4, 4, 4, 10, 10, 10, 6, 10, 10, 10, 10, 10, 10, 9, 11, 11, 19, 20, 21, 22, 11, 11, 2, 0, 0, 0, 2, 2, 3, 3, 0, 10, 0, 0, 0, 0, 4, 0, 10, 10, 3, 4, 9, 10, 10, 10, 0, 12, 12, 10, 12, 12, 12, 10, 12, 12, 10, 10, 4, 4, 0, 0, 0, 1, 12, 1, 1, 3, 1, 1, 13, 13, 10, 10, 13, 10, 13, 13, 6, 10, 6, 0, 10, 6, 10, 10, 10, 10, 10, 4, 10, 10, 3, 3, 10, 4, 4, 10, 13, 13, 13, 11, 0, 10, 10, 4, 10, 4, 4, 0, 11, 10, 10, 10, 10, 10, 11, 11, 1, 1, 1, 10, 12, 12, 12, 1, 1, 10, 10, 10, 5, 5, 5, 1, 0, 0, 0, 11, 11, 11, 11, 12, 10, 10, 12, 12, 12, 10, 0, 0, 0, 0, 2, 2, 10, 10, 13, 13, 2, 2, 2, 0, 0, 0, 11, 11, }; /* Bidi_Class: 3216 bytes. */ RE_UINT32 re_get_bidi_class(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_bidi_class_stage_1[f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_bidi_class_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_bidi_class_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_bidi_class_stage_4[pos + f] << 2; value = re_bidi_class_stage_5[pos + code]; return value; } /* Canonical_Combining_Class. */ static RE_UINT8 re_canonical_combining_class_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_canonical_combining_class_stage_2[] = { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_canonical_combining_class_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 0, 0, 0, 21, 0, 22, 23, 0, 0, 22, 24, 0, 0, 22, 24, 0, 0, 22, 24, 0, 0, 22, 24, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 22, 24, 0, 0, 0, 24, 0, 0, 0, 26, 0, 0, 27, 28, 0, 0, 29, 30, 0, 31, 32, 0, 33, 34, 0, 35, 0, 0, 36, 0, 0, 37, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 39, 39, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 43, 0, 0, 44, 0, 0, 0, 0, 0, 45, 46, 47, 0, 48, 0, 49, 0, 50, 0, 0, 0, 0, 51, 52, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 58, 0, 0, 0, 59, 0, 60, 0, 0, 61, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 64, 65, 0, 0, 0, 0, 0, 46, 66, 0, 67, 68, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, 0, 24, 74, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 79, 0, 0, 80, 81, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 83, 84, 85, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, }; static RE_UINT8 re_canonical_combining_class_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 0, 0, 0, 0, 19, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0, 38, 47, 1, 1, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 21, 43, 51, 52, 21, 35, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 55, 0, 58, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 67, 68, 69, 70, 71, 72, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 59, 0, 0, 78, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 19, 81, 0, 77, 0, 0, 0, 0, 48, 1, 82, 0, 0, 0, 0, 0, 54, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 84, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 53, 9, 12, 4, 85, 8, 86, 76, 0, 57, 0, 0, 21, 1, 21, 87, 88, 1, 1, 1, 1, 53, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 90, 1, 91, 57, 78, 92, 93, 4, 57, 0, 0, 0, 0, 0, 0, 19, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 19, 0, 1, 1, 49, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 49, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 49, 0, 0, 0, 0, 0, 98, 64, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 57, 38, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 1, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 94, 0, 0, 0, 0, 0, 0, 104, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 77, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 106, 107, 108, 109, 0, 98, 4, 110, 48, 23, 0, 0, 0, 0, 0, 0, 0, 38, 49, 0, 0, 0, 0, 38, 57, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_canonical_combining_class_stage_5[] = { 0, 0, 0, 0, 50, 50, 50, 50, 50, 51, 45, 45, 45, 45, 51, 43, 45, 45, 45, 45, 45, 41, 41, 45, 45, 45, 45, 41, 41, 45, 45, 45, 1, 1, 1, 1, 1, 45, 45, 45, 45, 50, 50, 50, 50, 54, 50, 45, 45, 45, 50, 50, 50, 45, 45, 0, 50, 50, 50, 45, 45, 45, 45, 50, 51, 45, 45, 50, 52, 53, 53, 52, 53, 53, 52, 50, 0, 0, 0, 50, 0, 45, 50, 50, 50, 50, 45, 50, 50, 50, 46, 45, 50, 50, 45, 45, 50, 46, 49, 50, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 0, 18, 0, 19, 20, 0, 50, 45, 0, 13, 25, 26, 27, 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 29, 50, 50, 45, 45, 50, 45, 50, 50, 45, 30, 0, 0, 0, 0, 0, 50, 50, 50, 0, 0, 50, 50, 0, 45, 50, 50, 45, 0, 0, 0, 31, 0, 0, 50, 45, 50, 50, 45, 45, 50, 45, 45, 50, 45, 50, 45, 50, 50, 0, 50, 50, 0, 50, 0, 50, 50, 50, 50, 50, 0, 0, 0, 45, 45, 45, 50, 45, 45, 45, 22, 23, 24, 50, 50, 50, 50, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 50, 45, 50, 50, 0, 0, 0, 0, 32, 33, 0, 0, 0, 4, 0, 34, 34, 4, 0, 35, 35, 35, 35, 36, 36, 0, 0, 37, 37, 37, 37, 45, 45, 0, 0, 0, 45, 0, 45, 0, 43, 0, 0, 0, 38, 39, 0, 40, 0, 0, 0, 0, 0, 39, 39, 39, 39, 0, 0, 39, 0, 50, 50, 4, 0, 50, 50, 0, 0, 45, 0, 0, 0, 0, 2, 0, 4, 4, 0, 0, 45, 0, 0, 4, 0, 0, 0, 0, 50, 0, 0, 0, 49, 0, 0, 0, 46, 50, 45, 45, 0, 0, 0, 50, 0, 0, 45, 0, 0, 4, 4, 0, 0, 2, 0, 50, 0, 1, 1, 1, 0, 0, 0, 50, 53, 42, 45, 41, 50, 50, 50, 52, 45, 50, 45, 50, 50, 1, 1, 1, 1, 1, 50, 0, 1, 1, 50, 45, 50, 1, 1, 0, 0, 0, 4, 0, 0, 44, 49, 51, 46, 47, 47, 0, 3, 3, 0, 0, 0, 0, 45, 50, 0, 50, 50, 45, 0, 0, 50, 0, 0, 21, 0, 0, 45, 0, 50, 50, 1, 45, 0, 0, 4, 2, 0, 0, 0, 4, 2, 0, 43, 43, 1, 1, 1, 0, 0, 0, 48, 43, 43, 43, 43, 43, 0, 45, 45, 45, 0, }; /* Canonical_Combining_Class: 1828 bytes. */ RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_canonical_combining_class_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_canonical_combining_class_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_canonical_combining_class_stage_3[pos + f] << 3; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_canonical_combining_class_stage_4[pos + f] << 2; value = re_canonical_combining_class_stage_5[pos + code]; return value; } /* Decomposition_Type. */ static RE_UINT8 re_decomposition_type_stage_1[] = { 0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 7, 8, 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_decomposition_type_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 17, 18, 19, 20, 21, 22, 23, 24, 7, 7, 7, 7, 7, 25, 7, 26, 27, 28, 29, 30, 31, 32, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 34, 7, 7, 7, 7, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 37, 38, 39, 40, 41, 42, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 44, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 45, 7, 7, 46, 47, 48, 49, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 50, 7, 7, 51, 52, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 35, 53, 7, 7, 7, 7, 7, }; static RE_UINT8 re_decomposition_type_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 3, 5, 6, 7, 8, 9, 10, 11, 8, 12, 0, 0, 13, 14, 15, 16, 17, 18, 6, 19, 20, 21, 0, 0, 0, 0, 0, 0, 0, 22, 0, 23, 24, 0, 0, 0, 0, 0, 25, 0, 0, 26, 27, 14, 28, 14, 29, 30, 0, 31, 32, 33, 0, 33, 0, 32, 0, 34, 0, 0, 0, 0, 35, 36, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 41, 0, 0, 0, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 57, 0, 58, 0, 0, 59, 0, 0, 0, 60, 61, 33, 62, 63, 60, 61, 33, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 71, 72, 73, 74, 75, 0, 76, 73, 73, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 77, 6, 6, 6, 6, 6, 78, 6, 79, 6, 6, 79, 80, 6, 81, 6, 6, 6, 82, 83, 84, 6, 85, 86, 87, 88, 89, 90, 91, 0, 92, 93, 94, 95, 0, 0, 0, 0, 0, 96, 97, 98, 99, 100, 101, 102, 102, 103, 104, 105, 0, 106, 0, 0, 0, 107, 0, 108, 109, 110, 0, 111, 112, 112, 0, 113, 0, 0, 0, 114, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 102, 102, 102, 118, 116, 116, 119, 0, 120, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 57, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 126, 0, 0, 127, 0, 0, 128, 129, 130, 131, 132, 0, 133, 129, 130, 131, 132, 0, 134, 0, 0, 0, 135, 102, 102, 102, 102, 136, 137, 0, 0, 0, 0, 0, 0, 102, 136, 102, 102, 138, 139, 116, 140, 116, 116, 116, 116, 141, 116, 116, 140, 142, 142, 142, 142, 142, 143, 102, 144, 142, 142, 142, 142, 142, 142, 102, 145, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 147, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 21, 0, 0, 0, 0, 0, 81, 148, 149, 6, 6, 6, 81, 6, 6, 6, 6, 6, 6, 78, 0, 0, 150, 151, 152, 153, 154, 155, 156, 156, 157, 156, 158, 159, 0, 160, 161, 162, 163, 163, 163, 163, 163, 163, 164, 165, 165, 166, 167, 167, 167, 168, 169, 170, 163, 171, 172, 173, 0, 174, 175, 176, 177, 178, 165, 179, 180, 0, 0, 181, 0, 182, 0, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 196, 196, 196, 196, 197, 198, 198, 198, 198, 199, 200, 201, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 204, 0, 0, 0, 0, 0, 0, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 206, 0, 0, 0, 0, 207, 14, 0, 0, 0, 208, 208, 208, 208, 208, 209, 208, 208, 208, 210, 211, 212, 213, 208, 208, 208, 214, 215, 208, 216, 217, 218, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 219, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 220, 208, 208, 208, 213, 208, 221, 222, 223, 224, 225, 226, 227, 228, 229, 228, 0, 0, 0, 0, 230, 102, 231, 142, 142, 0, 232, 0, 0, 233, 0, 0, 0, 0, 0, 0, 234, 142, 142, 235, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_decomposition_type_stage_4[] = { 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 8, 8, 10, 11, 10, 12, 10, 11, 10, 9, 8, 8, 8, 8, 13, 8, 8, 8, 8, 12, 8, 8, 14, 8, 10, 15, 16, 8, 17, 8, 12, 8, 8, 8, 8, 8, 8, 15, 12, 0, 0, 18, 19, 0, 0, 0, 0, 20, 20, 21, 8, 8, 8, 22, 8, 13, 8, 8, 23, 12, 8, 8, 8, 8, 8, 13, 0, 13, 8, 8, 8, 0, 0, 0, 24, 24, 25, 0, 0, 0, 20, 5, 24, 25, 0, 0, 9, 19, 0, 0, 0, 19, 26, 27, 0, 21, 11, 22, 0, 0, 13, 8, 0, 0, 13, 11, 28, 29, 0, 0, 30, 5, 31, 0, 9, 18, 0, 11, 0, 0, 32, 0, 0, 13, 0, 0, 33, 0, 0, 0, 8, 13, 13, 8, 13, 8, 13, 8, 8, 12, 12, 0, 0, 3, 0, 0, 13, 11, 0, 0, 0, 34, 35, 0, 36, 0, 0, 0, 18, 0, 0, 0, 32, 19, 0, 0, 0, 0, 8, 8, 0, 0, 18, 19, 0, 0, 0, 9, 18, 27, 0, 0, 0, 0, 10, 27, 0, 0, 37, 19, 0, 0, 0, 12, 0, 19, 0, 0, 0, 0, 13, 19, 0, 0, 19, 0, 19, 18, 22, 0, 0, 0, 27, 11, 3, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 18, 0, 0, 32, 27, 18, 0, 19, 18, 38, 17, 0, 32, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 25, 0, 27, 36, 36, 27, 0, 0, 0, 0, 0, 18, 32, 9, 0, 0, 0, 0, 0, 0, 39, 24, 24, 39, 24, 24, 24, 24, 40, 24, 24, 24, 24, 41, 42, 43, 0, 0, 0, 25, 0, 0, 0, 44, 24, 8, 8, 45, 0, 8, 8, 12, 0, 8, 12, 8, 12, 8, 8, 46, 46, 8, 8, 8, 12, 8, 22, 8, 47, 21, 22, 8, 8, 8, 13, 8, 10, 13, 22, 8, 48, 49, 50, 30, 0, 51, 3, 0, 0, 0, 30, 0, 52, 3, 53, 0, 54, 0, 3, 5, 0, 0, 3, 0, 3, 55, 24, 24, 24, 42, 42, 42, 43, 42, 42, 42, 56, 0, 0, 35, 0, 57, 34, 58, 59, 59, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 59, 69, 61, 62, 0, 70, 70, 70, 70, 20, 20, 20, 20, 0, 0, 71, 0, 0, 0, 13, 0, 0, 0, 0, 27, 0, 0, 0, 10, 0, 19, 32, 19, 0, 36, 0, 72, 35, 0, 0, 0, 32, 37, 32, 0, 36, 0, 0, 10, 12, 12, 12, 0, 0, 0, 0, 8, 8, 0, 13, 12, 0, 0, 33, 0, 73, 73, 73, 73, 73, 20, 20, 20, 20, 74, 73, 73, 73, 73, 75, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0, 0, 0, 19, 0, 0, 0, 76, 0, 0, 0, 44, 0, 0, 0, 3, 20, 5, 0, 0, 77, 0, 0, 0, 0, 26, 30, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 46, 32, 0, 9, 22, 33, 12, 0, 19, 3, 78, 0, 37, 11, 79, 34, 20, 20, 20, 20, 20, 20, 30, 4, 24, 24, 24, 20, 73, 0, 0, 80, 73, 73, 73, 73, 73, 73, 75, 20, 20, 20, 81, 81, 81, 81, 81, 81, 81, 20, 20, 82, 81, 81, 81, 20, 20, 20, 83, 25, 0, 0, 0, 0, 0, 55, 0, 36, 10, 8, 11, 36, 33, 13, 8, 20, 30, 0, 0, 3, 20, 0, 46, 59, 59, 84, 8, 8, 11, 8, 36, 9, 22, 8, 15, 85, 86, 86, 86, 86, 86, 86, 86, 86, 85, 85, 85, 87, 85, 86, 86, 88, 0, 0, 0, 89, 90, 91, 92, 85, 87, 86, 85, 85, 85, 93, 87, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 99, 99, 99, 99, 99, 100, 94, 94, 101, 95, 95, 95, 95, 95, 95, 102, 97, 99, 99, 103, 104, 97, 105, 106, 107, 105, 108, 105, 104, 96, 95, 105, 96, 109, 110, 97, 111, 106, 112, 105, 95, 106, 113, 95, 96, 106, 0, 0, 94, 94, 94, 114, 115, 115, 116, 0, 115, 115, 115, 115, 115, 117, 118, 20, 119, 120, 120, 120, 120, 119, 120, 0, 121, 122, 123, 123, 124, 91, 125, 126, 90, 125, 127, 127, 127, 127, 126, 91, 125, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 125, 126, 91, 128, 129, 130, 130, 130, 130, 130, 130, 130, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 134, 132, 134, 132, 134, 132, 134, 135, 130, 136, 132, 133, 0, 0, 27, 19, 0, 0, 18, 0, 0, 0, 0, 13, 8, 19, 0, 0, 0, 0, 18, 8, 59, 59, 59, 59, 59, 137, 59, 59, 59, 59, 59, 137, 138, 139, 61, 137, 59, 59, 66, 61, 59, 61, 59, 59, 59, 66, 140, 61, 59, 137, 59, 137, 59, 59, 66, 140, 59, 141, 142, 59, 137, 59, 59, 59, 59, 62, 59, 59, 59, 59, 59, 142, 139, 143, 61, 59, 140, 59, 144, 0, 138, 145, 144, 61, 139, 143, 144, 144, 139, 143, 140, 59, 140, 59, 61, 141, 59, 59, 66, 59, 59, 59, 59, 0, 61, 61, 66, 59, 20, 20, 30, 0, 20, 20, 146, 75, 0, 0, 4, 0, 147, 0, 0, 0, 148, 0, 0, 0, 81, 81, 148, 0, 20, 20, 35, 0, 149, 0, 0, 0, }; static RE_UINT8 re_decomposition_type_stage_5[] = { 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 10, 0, 0, 0, 0, 2, 0, 0, 10, 10, 2, 2, 0, 0, 2, 10, 10, 0, 17, 17, 17, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 2, 2, 1, 1, 1, 2, 2, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 2, 2, 1, 1, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 2, 10, 10, 10, 0, 10, 10, 0, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 10, 1, 1, 2, 1, 0, 1, 0, 1, 1, 2, 1, 2, 1, 1, 2, 0, 1, 1, 2, 2, 2, 2, 2, 4, 0, 4, 0, 0, 0, 0, 0, 4, 2, 0, 2, 2, 2, 0, 2, 0, 10, 10, 0, 0, 11, 0, 0, 0, 2, 2, 3, 2, 0, 2, 3, 3, 3, 3, 3, 3, 0, 3, 2, 0, 0, 3, 3, 3, 3, 3, 0, 0, 10, 2, 10, 0, 3, 0, 1, 0, 3, 0, 1, 1, 3, 3, 0, 3, 3, 2, 2, 2, 2, 3, 0, 2, 3, 0, 0, 0, 17, 17, 17, 17, 0, 17, 0, 0, 2, 2, 0, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, 9, 0, 11, 10, 0, 0, 13, 0, 0, 0, 2, 0, 1, 12, 0, 0, 1, 12, 16, 9, 9, 9, 16, 16, 16, 16, 2, 16, 16, 16, 2, 2, 2, 16, 3, 3, 1, 1, 8, 7, 8, 7, 5, 6, 8, 7, 8, 7, 5, 6, 8, 7, 0, 0, 0, 0, 0, 8, 7, 5, 6, 8, 7, 8, 7, 8, 7, 8, 8, 7, 5, 8, 7, 5, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 7, 7, 7, 7, 5, 5, 5, 7, 8, 0, 0, 5, 7, 5, 5, 7, 5, 7, 7, 5, 5, 7, 7, 5, 5, 7, 5, 5, 7, 7, 5, 7, 7, 5, 7, 5, 5, 5, 7, 0, 0, 5, 5, 5, 7, 7, 7, 5, 7, 5, 7, 8, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 12, 12, 2, 2, 2, 15, 15, 15, 0, 15, 15, 15, 15, 8, 6, 8, 0, 8, 0, 8, 6, 8, 6, 8, 6, 8, 8, 7, 8, 7, 8, 7, 5, 6, 8, 7, 8, 6, 8, 7, 5, 7, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 0, 0, 13, 13, 13, 0, 3, 0, 3, 3, 0, 0, 3, 0, 0, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 3, 3, 3, 0, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 2, 2, 2, 9, 16, 0, 0, 0, 16, 16, 16, 0, 9, 9, 0, 0, }; /* Decomposition_Type: 2872 bytes. */ RE_UINT32 re_get_decomposition_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_decomposition_type_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_decomposition_type_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_decomposition_type_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_decomposition_type_stage_4[pos + f] << 2; value = re_decomposition_type_stage_5[pos + code]; return value; } /* East_Asian_Width. */ static RE_UINT8 re_east_asian_width_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 15, }; static RE_UINT8 re_east_asian_width_stage_2[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 5, 15, 5, 16, 5, 5, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, 5, 5, 5, 5, 25, 5, 5, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 26, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 22, 22, 5, 5, 5, 28, 29, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 30, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 31, 32, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 33, 5, 34, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 35, }; static RE_UINT8 re_east_asian_width_stage_3[] = { 0, 0, 1, 1, 1, 1, 1, 2, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 11, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 17, 18, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 0, 20, 21, 20, 21, 0, 0, 0, 9, 19, 19, 19, 19, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 27, 0, 28, 0, 0, 0, 0, 0, 29, 30, 31, 0, 0, 32, 33, 34, 35, 34, 0, 36, 0, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 0, 46, 47, 48, 49, 0, 0, 0, 0, 0, 44, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 51, 19, 19, 19, 19, 19, 33, 19, 19, 52, 19, 53, 21, 54, 55, 56, 57, 0, 58, 59, 0, 0, 60, 0, 61, 0, 0, 62, 0, 62, 63, 19, 64, 19, 0, 0, 0, 65, 0, 38, 0, 66, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 70, 22, 22, 22, 22, 22, 71, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 72, 0, 73, 74, 22, 22, 75, 76, 22, 22, 22, 22, 77, 22, 22, 22, 22, 22, 22, 78, 22, 79, 76, 22, 22, 22, 22, 75, 22, 22, 80, 22, 22, 71, 22, 22, 75, 22, 22, 81, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 75, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 82, 22, 22, 22, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 82, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 71, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 84, 0, 22, 22, 85, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, 88, 88, 88, 88, 89, 90, 90, 90, 90, 91, 92, 93, 94, 65, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 19, 97, 19, 19, 19, 34, 19, 19, 96, 0, 0, 0, 0, 0, 0, 98, 22, 22, 80, 99, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 79, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 97, }; static RE_UINT8 re_east_asian_width_stage_4[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 0, 10, 0, 0, 11, 12, 11, 13, 14, 10, 9, 14, 8, 12, 9, 5, 15, 0, 0, 0, 16, 0, 12, 0, 0, 13, 12, 0, 17, 0, 11, 12, 9, 11, 7, 15, 13, 0, 0, 0, 0, 0, 0, 10, 5, 5, 5, 11, 0, 18, 17, 15, 11, 0, 7, 16, 7, 7, 7, 7, 17, 7, 7, 7, 19, 7, 14, 0, 20, 20, 20, 20, 18, 9, 14, 14, 9, 7, 0, 0, 8, 15, 12, 10, 0, 11, 0, 12, 17, 11, 0, 0, 0, 0, 21, 11, 12, 15, 15, 0, 12, 10, 0, 0, 22, 10, 12, 0, 12, 11, 12, 9, 7, 7, 7, 0, 7, 7, 14, 0, 0, 0, 15, 0, 0, 0, 14, 0, 10, 11, 0, 0, 0, 12, 0, 0, 8, 12, 18, 12, 15, 15, 10, 17, 18, 16, 7, 5, 0, 7, 0, 14, 0, 0, 11, 11, 10, 0, 0, 0, 14, 7, 13, 13, 13, 13, 0, 0, 0, 15, 15, 0, 0, 15, 0, 0, 0, 0, 0, 12, 0, 0, 23, 0, 7, 7, 19, 7, 7, 0, 0, 0, 13, 14, 0, 0, 13, 13, 0, 14, 14, 13, 18, 13, 14, 0, 0, 0, 13, 14, 0, 12, 0, 22, 15, 13, 0, 14, 0, 5, 5, 0, 0, 0, 19, 19, 9, 19, 0, 0, 0, 13, 0, 7, 7, 19, 19, 0, 7, 7, 0, 0, 0, 15, 0, 13, 7, 7, 0, 24, 1, 25, 0, 26, 0, 0, 0, 17, 14, 0, 20, 20, 27, 20, 20, 0, 0, 0, 20, 28, 0, 0, 20, 20, 20, 0, 29, 20, 20, 20, 20, 20, 20, 30, 31, 20, 20, 20, 20, 30, 31, 20, 0, 31, 20, 20, 20, 20, 20, 28, 20, 20, 30, 0, 20, 20, 7, 7, 20, 20, 20, 32, 20, 30, 0, 0, 20, 20, 28, 0, 30, 20, 20, 20, 20, 30, 20, 0, 33, 34, 34, 34, 34, 34, 34, 34, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 36, 38, 36, 38, 36, 38, 39, 34, 40, 36, 37, 28, 0, 0, 0, 7, 7, 9, 0, 7, 7, 7, 14, 30, 0, 0, 0, 20, 20, 32, 0, }; static RE_UINT8 re_east_asian_width_stage_5[] = { 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 1, 5, 5, 1, 5, 5, 1, 1, 0, 1, 0, 5, 1, 1, 5, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 3, 3, 3, 3, 0, 2, 0, 0, 0, 1, 1, 0, 0, 3, 3, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 5, 5, 0, 3, 3, 0, 3, 3, 3, 0, 0, 4, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 4, 4, 4, 0, }; /* East_Asian_Width: 1668 bytes. */ RE_UINT32 re_get_east_asian_width(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_east_asian_width_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_east_asian_width_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_east_asian_width_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_east_asian_width_stage_4[pos + f] << 2; value = re_east_asian_width_stage_5[pos + code]; return value; } /* Joining_Group. */ static RE_UINT8 re_joining_group_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_joining_group_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_joining_group_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_joining_group_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 0, 21, 0, 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_joining_group_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 3, 3, 43, 3, 45, 3, 4, 41, 4, 4, 13, 13, 13, 6, 6, 31, 31, 35, 35, 33, 33, 39, 39, 1, 1, 11, 11, 55, 55, 55, 0, 9, 29, 19, 22, 24, 26, 16, 43, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 29, 0, 3, 3, 3, 0, 3, 43, 43, 45, 4, 4, 4, 4, 4, 4, 4, 4, 13, 13, 13, 13, 13, 13, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 35, 35, 33, 33, 39, 1, 9, 9, 9, 9, 9, 9, 29, 29, 11, 38, 11, 19, 19, 19, 11, 11, 11, 11, 11, 11, 22, 22, 22, 22, 26, 26, 26, 26, 56, 21, 13, 41, 17, 17, 14, 43, 43, 43, 43, 43, 43, 43, 43, 55, 47, 55, 43, 45, 45, 46, 46, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 6, 31, 0, 0, 35, 33, 1, 0, 0, 21, 2, 0, 5, 12, 12, 7, 7, 15, 44, 50, 18, 42, 42, 48, 49, 20, 23, 25, 27, 36, 10, 8, 28, 32, 34, 30, 7, 37, 40, 5, 12, 7, 0, 0, 0, 0, 0, 51, 52, 53, 4, 4, 4, 4, 4, 4, 4, 13, 13, 6, 6, 31, 35, 1, 1, 1, 9, 9, 11, 11, 11, 24, 24, 26, 26, 26, 22, 31, 31, 35, 13, 13, 35, 31, 13, 3, 3, 55, 55, 45, 43, 43, 54, 54, 13, 35, 35, 19, 4, 0, 13, 39, 9, 29, 22, 24, 45, 45, 31, 43, 57, 0, 0, 0, }; /* Joining_Group: 481 bytes. */ RE_UINT32 re_get_joining_group(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_joining_group_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_joining_group_stage_2[pos + f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_joining_group_stage_3[pos + f] << 4; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_joining_group_stage_4[pos + f] << 3; value = re_joining_group_stage_5[pos + code]; return value; } /* Joining_Type. */ static RE_UINT8 re_joining_type_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_joining_type_stage_2[] = { 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 1, 16, 1, 1, 1, 17, 18, 19, 20, 21, 22, 23, 1, 1, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, 1, 1, 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 1, 29, 30, 31, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 1, 38, 39, 1, 1, 1, 1, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 44, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_joining_type_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 5, 6, 0, 0, 0, 0, 7, 8, 9, 10, 2, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 2, 23, 24, 25, 26, 0, 0, 27, 28, 29, 15, 30, 31, 0, 32, 33, 0, 34, 35, 0, 0, 0, 0, 36, 0, 0, 0, 37, 38, 39, 0, 0, 40, 41, 42, 43, 0, 44, 0, 0, 45, 46, 0, 43, 0, 47, 0, 0, 45, 48, 44, 0, 49, 47, 0, 0, 45, 50, 0, 43, 0, 44, 0, 0, 51, 46, 52, 43, 0, 53, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 43, 0, 0, 0, 0, 51, 58, 0, 43, 0, 0, 0, 0, 0, 46, 0, 43, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0, 65, 0, 66, 0, 0, 0, 67, 68, 69, 2, 70, 52, 0, 0, 0, 0, 0, 71, 72, 0, 73, 28, 74, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 76, 0, 43, 0, 43, 0, 0, 0, 77, 78, 79, 0, 0, 80, 0, 15, 15, 15, 15, 15, 81, 82, 15, 83, 0, 0, 0, 0, 0, 0, 0, 84, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 91, 53, 0, 92, 90, 93, 0, 94, 0, 0, 0, 95, 93, 0, 0, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 101, 96, 102, 0, 103, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 2, 2, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 93, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 105, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 107, 0, 20, 0, 0, 0, 0, 0, 93, 108, 0, 57, 0, 15, 15, 15, 109, 0, 0, 0, 0, 100, 0, 2, 93, 0, 0, 110, 0, 111, 93, 0, 0, 39, 0, 0, 112, 0, 0, 0, 0, 0, 0, 113, 114, 115, 0, 0, 0, 0, 0, 0, 116, 44, 0, 117, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 121, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 123, 101, 0, 0, 0, 93, 0, 0, 124, 0, 0, 0, 0, 39, 0, 125, 126, 0, 0, 0, 0, 93, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 131, 132, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, }; static RE_UINT8 re_joining_type_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 3, 2, 4, 0, 5, 2, 2, 2, 2, 2, 2, 6, 7, 6, 0, 0, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 16, 15, 17, 2, 0, 0, 0, 18, 19, 20, 15, 15, 15, 15, 21, 21, 21, 21, 22, 15, 15, 15, 15, 15, 23, 21, 21, 24, 25, 26, 2, 27, 2, 27, 28, 29, 0, 0, 18, 30, 0, 0, 0, 3, 31, 32, 22, 33, 15, 15, 34, 23, 2, 2, 8, 35, 15, 15, 32, 15, 15, 15, 13, 36, 24, 36, 22, 15, 0, 37, 2, 2, 9, 0, 0, 0, 0, 0, 18, 15, 15, 15, 38, 2, 2, 0, 39, 0, 0, 37, 6, 2, 2, 5, 5, 4, 36, 33, 12, 13, 15, 40, 5, 0, 41, 15, 25, 42, 0, 2, 2, 2, 2, 2, 2, 8, 8, 0, 0, 0, 0, 0, 43, 9, 5, 2, 9, 1, 5, 2, 0, 0, 37, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 9, 5, 9, 0, 1, 7, 0, 0, 0, 7, 3, 27, 4, 4, 1, 0, 0, 5, 6, 9, 1, 0, 0, 0, 27, 0, 43, 0, 0, 43, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 37, 9, 37, 28, 4, 0, 7, 0, 0, 0, 43, 0, 4, 0, 0, 43, 0, 37, 44, 0, 0, 1, 2, 8, 0, 0, 3, 2, 8, 1, 2, 6, 9, 0, 0, 2, 4, 0, 0, 4, 0, 0, 45, 1, 0, 5, 2, 2, 8, 2, 28, 0, 5, 2, 2, 5, 2, 2, 2, 2, 9, 0, 0, 0, 5, 28, 2, 7, 7, 0, 0, 4, 37, 5, 9, 0, 0, 43, 7, 0, 1, 37, 9, 0, 0, 0, 6, 2, 4, 0, 43, 5, 2, 2, 0, 0, 1, 0, 46, 47, 4, 15, 15, 0, 0, 0, 46, 15, 15, 15, 15, 48, 0, 8, 3, 9, 0, 43, 0, 5, 0, 0, 3, 27, 0, 0, 43, 2, 8, 44, 5, 2, 9, 3, 2, 2, 27, 2, 0, 0, 0, 0, 28, 8, 9, 0, 0, 3, 2, 4, 0, 0, 0, 37, 4, 6, 0, 0, 43, 4, 45, 0, 0, 0, 2, 2, 37, 0, 0, 8, 2, 2, 2, 28, 2, 9, 1, 0, 9, 0, 0, 2, 8, 0, 0, 0, 0, 3, 49, 0, 0, 37, 8, 2, 9, 37, 2, 0, 0, 37, 4, 0, 0, 7, 0, 8, 2, 2, 4, 43, 43, 3, 0, 50, 0, 0, 0, 0, 37, 2, 4, 0, 3, 2, 2, 3, 37, 4, 9, 0, 0, 5, 8, 7, 7, 0, 0, 3, 0, 0, 9, 28, 27, 9, 37, 0, 0, 0, 4, 0, 1, 9, 1, 0, 0, 0, 43, 0, 0, 5, 0, 5, 7, 0, 2, 0, 0, 8, 3, 0, 0, 2, 2, 3, 8, 7, 1, 0, 3, 2, 5, 2, 9, 0, 0, 0, 37, 2, 8, 0, 0, 3, 1, 2, 6, 0, 0, 0, 3, 4, 0, 3, 2, 2, 2, 8, 5, 2, 0, }; static RE_UINT8 re_joining_type_stage_5[] = { 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 5, 0, 5, 0, 0, 0, 2, 0, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 2, 2, 2, 3, 2, 2, 5, 0, 0, 2, 2, 5, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 2, 3, 2, 3, 2, 3, 2, 2, 3, 3, 0, 3, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 3, 3, 2, 0, 0, 2, 3, 5, 2, 2, 2, 3, 3, 3, 2, 2, 3, 2, 3, 2, 3, 2, 0, 3, 2, 2, 3, 2, 2, 2, 0, 0, 5, 5, 2, 2, 2, 5, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 2, 2, 3, 0, 0, 0, 0, 0, 5, 0, 5, 0, 5, 0, 0, 5, 0, 5, 0, 0, 0, 2, 0, 0, 1, 5, 2, 5, 2, 0, 0, 1, 5, 5, 2, 2, 4, 0, }; /* Joining_Type: 1896 bytes. */ RE_UINT32 re_get_joining_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_joining_type_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_joining_type_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_joining_type_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_joining_type_stage_4[pos + f] << 2; value = re_joining_type_stage_5[pos + code]; return value; } /* Line_Break. */ static RE_UINT8 re_line_break_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 10, 10, 16, 10, 10, 10, 10, 17, 10, 18, 19, 20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 22, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, }; static RE_UINT8 re_line_break_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 2, 2, 2, 2, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 2, 51, 2, 2, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 87, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 88, 79, 79, 79, 79, 79, 79, 79, 79, 89, 2, 2, 90, 91, 2, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 79, 79, 79, 79, 110, 111, 2, 2, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 72, 122, 123, 124, 2, 125, 72, 72, 72, 72, 72, 72, 126, 72, 127, 128, 129, 72, 130, 72, 131, 72, 72, 72, 132, 72, 72, 72, 133, 134, 135, 136, 72, 72, 72, 72, 72, 72, 72, 72, 72, 137, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 2, 138, 72, 139, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 140, 141, 142, 2, 143, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 144, 72, 72, 72, 72, 72, 72, 72, 72, 72, 145, 146, 147, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 148, 149, 150, 151, 72, 152, 72, 153, 154, 155, 2, 2, 156, 2, 157, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 158, 159, 72, 72, 160, 161, 162, 163, 164, 72, 165, 166, 167, 168, 169, 170, 171, 172, 173, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 174, 175, 72, 176, 177, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, }; static RE_UINT16 re_line_break_stage_3[] = { 0, 1, 2, 3, 4, 5, 4, 6, 7, 1, 8, 9, 4, 10, 4, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 12, 4, 4, 1, 1, 1, 1, 13, 14, 15, 16, 17, 4, 18, 4, 4, 4, 4, 4, 19, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20, 21, 4, 22, 21, 4, 23, 24, 1, 25, 26, 27, 28, 29, 30, 31, 4, 4, 32, 1, 33, 34, 4, 4, 4, 4, 4, 35, 36, 37, 38, 39, 4, 1, 40, 4, 4, 4, 4, 4, 41, 42, 37, 4, 32, 43, 4, 44, 45, 46, 4, 47, 48, 48, 48, 48, 49, 48, 48, 48, 50, 51, 52, 4, 4, 53, 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 58, 59, 66, 67, 68, 69, 70, 71, 18, 59, 72, 73, 74, 63, 75, 57, 58, 59, 72, 76, 77, 63, 20, 78, 79, 80, 81, 82, 83, 69, 84, 85, 86, 59, 87, 88, 89, 63, 90, 91, 86, 59, 92, 88, 93, 63, 94, 91, 86, 4, 95, 96, 97, 63, 98, 99, 100, 4, 101, 102, 103, 48, 104, 105, 106, 106, 107, 108, 109, 48, 48, 110, 111, 112, 113, 114, 115, 48, 48, 116, 117, 37, 118, 56, 4, 119, 120, 121, 122, 1, 123, 124, 125, 48, 48, 106, 106, 106, 106, 126, 106, 106, 106, 106, 127, 4, 4, 128, 4, 4, 4, 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, 131, 132, 132, 132, 132, 132, 4, 4, 4, 4, 133, 134, 4, 4, 133, 4, 4, 135, 136, 137, 4, 4, 4, 136, 4, 4, 4, 138, 139, 119, 4, 140, 4, 4, 4, 4, 4, 141, 142, 4, 4, 4, 4, 4, 4, 4, 142, 143, 4, 4, 4, 4, 144, 74, 145, 146, 4, 147, 4, 148, 145, 149, 106, 106, 106, 106, 106, 150, 151, 140, 152, 151, 4, 4, 4, 4, 4, 20, 4, 4, 153, 4, 4, 4, 4, 154, 4, 119, 155, 155, 156, 106, 157, 158, 106, 106, 159, 106, 160, 161, 4, 4, 4, 162, 106, 106, 106, 163, 106, 164, 151, 151, 157, 48, 48, 48, 48, 48, 165, 4, 4, 166, 167, 168, 169, 170, 171, 4, 172, 37, 4, 4, 41, 173, 4, 4, 166, 174, 175, 37, 4, 176, 48, 48, 48, 48, 20, 177, 178, 179, 4, 4, 4, 4, 1, 1, 180, 181, 4, 182, 4, 4, 182, 183, 4, 184, 4, 4, 4, 185, 185, 186, 4, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 119, 197, 198, 199, 1, 1, 200, 201, 202, 203, 4, 4, 204, 205, 206, 207, 206, 4, 4, 4, 208, 4, 4, 209, 210, 211, 212, 213, 214, 215, 4, 216, 217, 218, 219, 4, 4, 4, 4, 4, 220, 221, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 222, 4, 4, 223, 48, 224, 48, 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 205, 225, 225, 227, 225, 228, 229, 230, 231, 232, 233, 4, 234, 235, 4, 236, 237, 4, 238, 239, 4, 240, 4, 241, 242, 243, 244, 245, 246, 4, 4, 4, 4, 247, 248, 249, 225, 250, 4, 4, 251, 4, 252, 4, 253, 254, 4, 4, 4, 255, 4, 256, 4, 4, 4, 4, 119, 257, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 4, 4, 46, 4, 4, 46, 4, 4, 4, 4, 4, 4, 4, 4, 258, 259, 4, 4, 128, 4, 4, 4, 260, 261, 4, 223, 262, 262, 262, 262, 1, 1, 263, 264, 265, 266, 48, 48, 48, 48, 267, 268, 267, 267, 267, 267, 267, 222, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 269, 48, 270, 271, 272, 273, 274, 275, 267, 276, 267, 277, 278, 279, 267, 276, 267, 277, 280, 281, 267, 282, 283, 267, 267, 267, 267, 284, 267, 267, 285, 267, 267, 222, 286, 267, 284, 267, 267, 287, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 284, 267, 267, 267, 267, 4, 4, 4, 4, 267, 288, 267, 267, 267, 267, 267, 267, 289, 267, 267, 267, 290, 4, 4, 176, 291, 4, 292, 48, 4, 4, 258, 293, 4, 294, 4, 4, 4, 4, 4, 295, 46, 296, 224, 48, 48, 48, 48, 90, 297, 4, 298, 299, 4, 4, 4, 300, 301, 4, 4, 166, 302, 151, 1, 303, 37, 4, 304, 4, 305, 306, 129, 307, 52, 4, 4, 308, 309, 310, 48, 48, 4, 4, 311, 180, 312, 313, 106, 159, 106, 106, 106, 106, 314, 315, 32, 316, 317, 318, 262, 48, 48, 48, 48, 48, 48, 48, 48, 48, 4, 4, 319, 151, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 323, 322, 325, 130, 326, 132, 132, 327, 328, 328, 328, 328, 328, 328, 328, 328, 223, 329, 330, 331, 332, 4, 4, 4, 4, 4, 4, 4, 333, 334, 4, 4, 4, 4, 4, 335, 48, 4, 4, 4, 4, 336, 4, 4, 20, 48, 48, 337, 1, 338, 180, 339, 340, 341, 342, 185, 4, 4, 4, 4, 4, 4, 4, 343, 344, 345, 267, 346, 267, 347, 348, 349, 4, 350, 4, 46, 351, 352, 353, 354, 355, 4, 137, 356, 184, 184, 48, 48, 4, 4, 4, 4, 4, 4, 4, 224, 357, 4, 4, 358, 4, 4, 4, 4, 224, 359, 48, 48, 48, 4, 4, 360, 4, 119, 4, 4, 4, 74, 48, 48, 4, 46, 296, 4, 224, 48, 48, 48, 4, 361, 4, 4, 362, 363, 48, 48, 4, 184, 151, 48, 48, 48, 48, 48, 364, 4, 4, 365, 4, 366, 48, 48, 4, 367, 4, 368, 48, 48, 48, 48, 4, 4, 4, 369, 48, 48, 48, 48, 370, 371, 4, 372, 20, 373, 4, 4, 4, 4, 4, 374, 4, 375, 4, 376, 4, 4, 4, 4, 377, 48, 48, 48, 48, 48, 48, 48, 48, 48, 4, 46, 171, 4, 4, 378, 379, 336, 380, 48, 171, 4, 4, 381, 382, 4, 377, 151, 171, 4, 305, 383, 384, 48, 48, 48, 171, 4, 4, 308, 385, 151, 48, 48, 4, 4, 32, 386, 151, 48, 48, 48, 4, 4, 4, 4, 4, 4, 46, 48, 4, 4, 4, 4, 4, 4, 387, 384, 4, 4, 4, 4, 4, 388, 4, 4, 389, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 390, 4, 4, 46, 48, 48, 48, 48, 48, 4, 4, 4, 377, 48, 48, 48, 48, 4, 4, 4, 4, 141, 391, 1, 51, 392, 171, 48, 48, 48, 48, 48, 48, 393, 48, 48, 48, 48, 48, 48, 48, 4, 4, 4, 4, 4, 4, 4, 154, 4, 4, 22, 4, 4, 4, 394, 1, 395, 4, 396, 4, 4, 184, 48, 48, 4, 4, 4, 4, 397, 48, 48, 48, 4, 4, 4, 4, 4, 223, 4, 333, 4, 4, 4, 4, 4, 185, 4, 4, 4, 145, 398, 399, 400, 4, 4, 4, 401, 402, 4, 403, 404, 86, 4, 4, 4, 4, 375, 4, 4, 4, 4, 4, 4, 4, 4, 4, 405, 406, 406, 406, 400, 4, 407, 408, 409, 410, 411, 412, 413, 359, 414, 359, 48, 48, 48, 333, 267, 267, 270, 267, 267, 267, 267, 267, 267, 222, 284, 415, 283, 283, 48, 48, 416, 225, 417, 225, 225, 225, 418, 225, 225, 416, 48, 48, 48, 48, 419, 420, 421, 267, 267, 285, 422, 393, 48, 48, 267, 267, 423, 424, 267, 267, 267, 289, 267, 222, 267, 425, 426, 48, 267, 423, 267, 267, 267, 284, 427, 267, 267, 267, 267, 267, 428, 429, 267, 267, 267, 430, 431, 432, 433, 434, 296, 267, 435, 48, 48, 48, 48, 48, 48, 48, 48, 436, 267, 267, 267, 267, 437, 48, 48, 48, 267, 267, 267, 267, 269, 48, 48, 48, 4, 4, 4, 4, 4, 4, 4, 296, 267, 267, 267, 267, 267, 267, 267, 282, 438, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, }; static RE_UINT8 re_line_break_stage_4[] = { 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 13, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, 14, 14, 14, 14, 16, 18, 19, 0, 0, 20, 0, 0, 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 14, 22, 28, 29, 28, 28, 26, 28, 30, 14, 14, 14, 24, 14, 14, 14, 14, 14, 14, 14, 24, 31, 28, 31, 14, 25, 14, 14, 14, 28, 28, 24, 32, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 34, 34, 35, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 36, 14, 14, 37, 36, 36, 14, 14, 14, 38, 38, 14, 14, 39, 14, 14, 14, 14, 14, 14, 14, 19, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 36, 36, 36, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 38, 39, 14, 14, 14, 14, 14, 14, 14, 40, 41, 36, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 19, 45, 0, 46, 36, 36, 36, 36, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 36, 36, 47, 49, 38, 36, 36, 36, 36, 36, 14, 14, 38, 14, 50, 51, 13, 14, 0, 0, 0, 0, 0, 52, 53, 54, 14, 14, 14, 14, 14, 19, 0, 0, 12, 12, 12, 12, 12, 55, 56, 14, 45, 14, 14, 14, 14, 14, 14, 14, 14, 14, 57, 0, 0, 0, 45, 19, 0, 0, 45, 19, 45, 0, 0, 14, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 39, 19, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 53, 39, 14, 14, 14, 14, 0, 0, 0, 0, 0, 45, 36, 36, 36, 36, 36, 36, 36, 0, 0, 14, 14, 58, 38, 36, 36, 14, 14, 14, 0, 0, 19, 0, 0, 0, 0, 19, 0, 19, 0, 0, 36, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 14, 14, 19, 0, 36, 38, 36, 36, 36, 36, 36, 36, 36, 36, 38, 14, 14, 14, 14, 14, 38, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 45, 0, 19, 0, 0, 0, 14, 14, 14, 14, 14, 0, 59, 12, 12, 12, 12, 12, 14, 14, 14, 14, 39, 14, 14, 14, 43, 0, 39, 14, 14, 14, 38, 39, 38, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 14, 38, 38, 36, 14, 14, 36, 45, 0, 0, 0, 53, 43, 53, 43, 0, 38, 36, 36, 36, 43, 36, 36, 14, 39, 14, 0, 36, 12, 12, 12, 12, 12, 14, 51, 14, 14, 50, 9, 36, 36, 43, 0, 39, 14, 14, 38, 36, 39, 38, 14, 39, 38, 14, 36, 53, 0, 0, 53, 36, 43, 53, 43, 0, 36, 43, 36, 36, 36, 39, 14, 38, 38, 36, 36, 36, 12, 12, 12, 12, 12, 0, 14, 19, 36, 36, 36, 36, 36, 43, 0, 39, 14, 14, 14, 14, 39, 38, 14, 39, 14, 14, 36, 45, 0, 0, 0, 0, 43, 0, 43, 0, 36, 38, 36, 36, 36, 36, 36, 36, 36, 9, 36, 36, 36, 36, 36, 36, 36, 0, 0, 53, 43, 53, 43, 0, 36, 36, 36, 36, 0, 36, 36, 14, 39, 36, 45, 39, 14, 14, 38, 36, 14, 38, 14, 14, 36, 39, 38, 38, 14, 36, 39, 38, 36, 14, 38, 36, 14, 14, 14, 14, 14, 14, 36, 36, 0, 0, 53, 36, 0, 53, 0, 0, 36, 38, 36, 36, 43, 36, 36, 36, 36, 14, 14, 14, 14, 9, 38, 36, 36, 43, 0, 39, 14, 14, 14, 38, 14, 38, 14, 14, 14, 14, 14, 14, 14, 14, 14, 39, 14, 14, 36, 39, 0, 0, 0, 53, 0, 53, 0, 0, 36, 36, 36, 43, 53, 14, 36, 36, 36, 36, 36, 36, 36, 14, 14, 14, 14, 36, 0, 39, 14, 14, 14, 38, 14, 14, 14, 39, 14, 14, 36, 45, 0, 36, 36, 43, 53, 36, 36, 36, 38, 39, 38, 36, 36, 36, 36, 36, 36, 14, 14, 14, 14, 14, 38, 39, 0, 0, 0, 53, 0, 53, 0, 0, 38, 36, 36, 36, 43, 36, 36, 36, 36, 14, 14, 14, 36, 60, 14, 14, 14, 36, 0, 39, 14, 14, 14, 14, 14, 14, 14, 14, 38, 36, 14, 14, 14, 14, 39, 14, 14, 14, 14, 39, 36, 14, 14, 14, 38, 36, 53, 36, 43, 0, 0, 53, 53, 0, 0, 0, 0, 36, 0, 38, 36, 36, 36, 36, 36, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 36, 42, 62, 62, 62, 62, 62, 62, 62, 64, 12, 12, 12, 12, 12, 59, 36, 36, 61, 63, 63, 61, 63, 63, 61, 36, 36, 36, 62, 62, 61, 62, 62, 62, 61, 62, 61, 61, 36, 62, 61, 62, 62, 62, 62, 62, 62, 61, 62, 36, 62, 62, 63, 63, 62, 62, 62, 36, 12, 12, 12, 12, 12, 36, 62, 62, 32, 65, 29, 65, 66, 67, 68, 54, 54, 69, 57, 14, 0, 14, 14, 14, 14, 14, 44, 19, 19, 70, 70, 0, 14, 14, 14, 14, 14, 14, 38, 36, 43, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 14, 14, 19, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 59, 14, 14, 14, 45, 14, 14, 38, 14, 65, 71, 14, 14, 72, 73, 36, 36, 12, 12, 12, 12, 12, 59, 14, 14, 12, 12, 12, 12, 12, 62, 62, 62, 14, 14, 14, 39, 36, 36, 39, 36, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 14, 14, 14, 14, 38, 14, 14, 36, 14, 14, 14, 38, 38, 14, 14, 36, 38, 14, 14, 36, 14, 14, 14, 38, 38, 14, 14, 36, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 14, 14, 14, 14, 14, 14, 14, 38, 43, 0, 27, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 36, 36, 14, 14, 38, 36, 36, 36, 36, 36, 77, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 78, 36, 14, 14, 14, 14, 14, 27, 59, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 0, 53, 36, 36, 36, 36, 36, 14, 0, 1, 41, 36, 36, 36, 36, 14, 0, 36, 36, 36, 36, 36, 36, 38, 0, 36, 36, 36, 36, 36, 36, 62, 62, 59, 79, 77, 80, 62, 36, 12, 12, 12, 12, 12, 36, 36, 36, 14, 54, 59, 29, 54, 19, 0, 73, 14, 14, 14, 14, 19, 38, 36, 36, 14, 14, 14, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 36, 36, 38, 36, 54, 12, 12, 12, 12, 12, 62, 62, 62, 62, 62, 62, 62, 36, 62, 62, 63, 36, 36, 36, 36, 36, 62, 62, 62, 62, 62, 62, 36, 36, 62, 62, 62, 62, 62, 36, 36, 36, 12, 12, 12, 12, 12, 63, 36, 62, 14, 14, 14, 19, 0, 0, 36, 14, 62, 62, 62, 62, 62, 62, 62, 63, 62, 62, 62, 62, 62, 62, 63, 43, 0, 0, 45, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 45, 14, 14, 14, 36, 36, 12, 12, 12, 12, 12, 59, 27, 59, 77, 14, 14, 14, 14, 19, 0, 0, 0, 0, 14, 14, 14, 14, 38, 36, 0, 45, 14, 14, 14, 14, 14, 14, 19, 0, 0, 0, 0, 0, 0, 14, 0, 0, 36, 36, 36, 36, 14, 14, 0, 0, 0, 0, 36, 81, 59, 59, 12, 12, 12, 12, 12, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 59, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 14, 19, 14, 14, 0, 45, 38, 36, 36, 36, 36, 0, 0, 0, 53, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 14, 14, 14, 36, 14, 14, 14, 36, 14, 14, 14, 14, 39, 39, 39, 39, 14, 14, 14, 14, 14, 14, 14, 36, 14, 14, 38, 14, 14, 14, 14, 14, 14, 14, 36, 14, 14, 14, 39, 14, 36, 14, 38, 14, 14, 14, 32, 38, 59, 59, 59, 82, 59, 83, 0, 0, 82, 59, 84, 25, 85, 86, 85, 86, 28, 14, 87, 88, 89, 0, 0, 33, 51, 51, 51, 51, 7, 90, 91, 14, 14, 14, 92, 93, 91, 14, 14, 14, 14, 14, 14, 77, 59, 59, 27, 59, 94, 14, 38, 0, 0, 0, 0, 0, 14, 36, 25, 14, 14, 14, 16, 95, 24, 28, 25, 14, 14, 14, 16, 78, 23, 23, 23, 6, 23, 23, 23, 23, 23, 23, 23, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 53, 36, 36, 36, 36, 36, 36, 36, 14, 50, 24, 14, 50, 14, 14, 14, 14, 24, 14, 96, 14, 14, 14, 14, 24, 25, 14, 14, 14, 24, 14, 14, 14, 14, 28, 14, 14, 24, 14, 25, 28, 28, 28, 28, 28, 28, 14, 14, 28, 28, 28, 28, 28, 14, 14, 14, 14, 14, 14, 14, 24, 36, 36, 36, 14, 25, 25, 14, 14, 14, 14, 14, 25, 28, 14, 24, 25, 24, 14, 24, 24, 23, 24, 14, 14, 25, 24, 28, 25, 24, 24, 24, 28, 28, 25, 25, 14, 14, 28, 28, 14, 14, 28, 14, 14, 14, 14, 14, 25, 14, 25, 14, 14, 25, 14, 14, 14, 14, 14, 14, 28, 14, 28, 28, 14, 28, 14, 28, 14, 28, 14, 28, 14, 14, 14, 14, 14, 14, 24, 14, 24, 14, 14, 14, 14, 14, 24, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 24, 14, 25, 14, 14, 14, 97, 14, 14, 14, 14, 14, 14, 16, 98, 14, 14, 97, 97, 36, 36, 36, 36, 36, 36, 14, 14, 14, 38, 36, 36, 36, 36, 14, 14, 14, 14, 14, 38, 36, 36, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 25, 28, 28, 25, 14, 14, 14, 14, 14, 14, 28, 28, 14, 14, 14, 14, 14, 28, 24, 28, 28, 28, 14, 14, 14, 14, 28, 14, 28, 14, 14, 28, 14, 28, 14, 14, 28, 25, 24, 14, 28, 28, 14, 14, 14, 14, 14, 14, 14, 14, 28, 28, 14, 14, 14, 14, 24, 97, 97, 24, 25, 24, 14, 14, 28, 14, 14, 97, 28, 99, 97, 97, 97, 14, 14, 14, 14, 100, 97, 14, 14, 25, 25, 14, 14, 14, 14, 14, 14, 28, 24, 28, 24, 101, 25, 28, 24, 14, 14, 14, 14, 14, 14, 14, 100, 14, 14, 14, 14, 14, 14, 14, 28, 14, 14, 14, 14, 14, 14, 100, 97, 97, 97, 97, 97, 101, 28, 102, 100, 97, 102, 101, 28, 97, 28, 101, 102, 97, 24, 14, 14, 28, 101, 28, 28, 102, 97, 97, 102, 97, 101, 102, 97, 103, 97, 99, 14, 97, 97, 97, 14, 14, 14, 14, 24, 14, 7, 85, 5, 14, 54, 14, 14, 70, 70, 70, 70, 70, 70, 70, 28, 28, 28, 28, 28, 28, 28, 14, 14, 14, 14, 14, 14, 14, 14, 16, 98, 14, 14, 14, 14, 14, 14, 14, 70, 70, 70, 70, 70, 14, 16, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 98, 14, 14, 14, 14, 14, 14, 14, 70, 70, 14, 14, 14, 14, 14, 14, 14, 14, 70, 14, 14, 14, 24, 28, 28, 36, 36, 36, 14, 14, 14, 14, 14, 14, 14, 19, 0, 14, 36, 36, 105, 59, 77, 106, 14, 14, 14, 14, 36, 36, 36, 39, 41, 36, 36, 36, 36, 36, 36, 43, 14, 14, 14, 38, 14, 14, 14, 38, 85, 85, 85, 85, 85, 85, 85, 59, 59, 59, 59, 27, 107, 14, 85, 14, 85, 70, 70, 70, 70, 59, 59, 57, 59, 27, 77, 14, 14, 108, 36, 36, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 103, 97, 97, 97, 97, 97, 36, 36, 36, 36, 36, 97, 97, 97, 97, 97, 97, 36, 36, 18, 109, 110, 97, 70, 70, 70, 70, 70, 97, 70, 70, 70, 70, 111, 112, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 113, 97, 97, 110, 114, 97, 115, 116, 116, 116, 116, 97, 97, 97, 97, 116, 97, 97, 97, 97, 97, 97, 97, 116, 116, 116, 97, 97, 97, 117, 97, 97, 116, 118, 43, 119, 91, 114, 120, 116, 116, 116, 116, 97, 97, 97, 97, 97, 116, 117, 97, 110, 121, 114, 36, 36, 103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 36, 103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 122, 97, 97, 97, 97, 97, 122, 36, 36, 123, 123, 123, 123, 123, 123, 123, 123, 97, 97, 97, 97, 28, 28, 28, 28, 97, 97, 110, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 122, 36, 97, 97, 97, 122, 36, 36, 36, 36, 14, 14, 14, 14, 14, 14, 27, 106, 12, 12, 12, 12, 12, 14, 36, 36, 0, 45, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 36, 36, 36, 43, 0, 27, 59, 59, 36, 36, 36, 36, 14, 14, 36, 36, 36, 36, 36, 36, 14, 45, 14, 45, 14, 19, 14, 14, 14, 19, 0, 0, 14, 14, 36, 36, 14, 14, 14, 14, 124, 36, 36, 36, 14, 14, 65, 54, 36, 36, 36, 36, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 53, 36, 36, 36, 36, 59, 0, 14, 14, 14, 14, 14, 36, 36, 14, 14, 14, 0, 0, 0, 0, 59, 14, 14, 14, 19, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 39, 74, 74, 74, 74, 74, 74, 125, 36, 14, 19, 0, 0, 0, 0, 0, 0, 45, 14, 14, 27, 59, 14, 14, 39, 12, 12, 12, 12, 12, 36, 36, 14, 14, 14, 14, 14, 19, 0, 0, 0, 14, 19, 14, 14, 14, 14, 0, 36, 12, 12, 12, 12, 12, 36, 27, 59, 62, 63, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 62, 62, 59, 14, 19, 53, 36, 36, 36, 36, 39, 14, 14, 38, 39, 14, 14, 38, 39, 14, 14, 38, 36, 36, 36, 36, 14, 19, 0, 0, 0, 1, 0, 36, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 36, 36, 36, 36, 36, 36, 75, 75, 75, 128, 36, 129, 76, 76, 76, 76, 76, 76, 76, 76, 36, 36, 130, 130, 130, 130, 130, 130, 130, 130, 36, 39, 14, 14, 36, 36, 131, 132, 47, 47, 47, 47, 49, 47, 47, 47, 47, 47, 47, 48, 47, 47, 48, 48, 47, 131, 48, 47, 47, 47, 47, 47, 14, 36, 36, 36, 36, 36, 36, 36, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 70, 36, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 124, 36, 133, 134, 58, 135, 136, 36, 36, 36, 97, 97, 137, 104, 104, 104, 104, 104, 104, 104, 109, 137, 109, 97, 97, 97, 109, 78, 91, 54, 137, 104, 104, 109, 97, 97, 97, 122, 138, 139, 36, 36, 14, 14, 14, 14, 14, 14, 38, 140, 105, 97, 6, 97, 70, 97, 109, 109, 97, 97, 97, 97, 97, 91, 97, 141, 97, 97, 97, 97, 97, 137, 142, 97, 97, 97, 97, 97, 97, 137, 142, 137, 112, 70, 93, 143, 123, 123, 123, 123, 144, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 91, 36, 14, 14, 14, 36, 14, 14, 14, 36, 14, 14, 14, 36, 14, 38, 36, 22, 97, 138, 145, 14, 14, 14, 38, 36, 36, 36, 36, 43, 0, 146, 36, 14, 14, 14, 14, 14, 14, 39, 14, 14, 14, 14, 14, 14, 38, 14, 39, 59, 41, 36, 39, 14, 14, 14, 14, 14, 14, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 36, 14, 14, 14, 14, 14, 14, 19, 36, 14, 14, 14, 14, 14, 14, 14, 81, 14, 14, 36, 36, 14, 14, 14, 14, 77, 14, 14, 36, 36, 36, 36, 36, 14, 14, 14, 36, 38, 14, 14, 14, 14, 14, 14, 39, 38, 36, 38, 39, 14, 14, 14, 81, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 81, 14, 14, 14, 14, 14, 36, 36, 39, 14, 14, 14, 14, 36, 36, 36, 14, 19, 0, 43, 53, 36, 36, 0, 0, 14, 14, 39, 14, 39, 14, 14, 14, 14, 14, 36, 36, 0, 53, 36, 43, 59, 59, 59, 59, 38, 36, 36, 36, 14, 14, 14, 36, 81, 59, 59, 59, 14, 14, 14, 36, 14, 14, 14, 14, 14, 38, 36, 36, 14, 14, 14, 14, 14, 14, 14, 14, 38, 36, 36, 36, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 1, 77, 14, 14, 36, 14, 14, 14, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 45, 14, 59, 59, 36, 36, 36, 36, 36, 36, 36, 0, 0, 53, 12, 12, 12, 12, 12, 59, 59, 36, 36, 36, 36, 36, 36, 45, 14, 27, 77, 41, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 14, 38, 36, 36, 36, 36, 36, 36, 14, 14, 14, 14, 147, 70, 112, 14, 14, 98, 14, 70, 70, 14, 14, 14, 14, 14, 14, 14, 16, 112, 14, 14, 19, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 43, 97, 36, 36, 36, 36, 36, 36, 36, 14, 14, 19, 0, 0, 14, 19, 0, 0, 45, 19, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 45, 36, 36, 36, 36, 36, 36, 38, 39, 38, 39, 14, 38, 14, 14, 14, 14, 14, 14, 39, 39, 14, 14, 14, 39, 14, 14, 14, 14, 14, 14, 14, 14, 39, 14, 38, 39, 14, 14, 14, 38, 14, 14, 14, 38, 14, 14, 14, 14, 14, 14, 39, 14, 38, 14, 14, 38, 38, 36, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 12, 12, 12, 12, 12, 12, 12, 12, 12, 39, 38, 38, 39, 39, 14, 14, 14, 14, 38, 14, 14, 39, 39, 36, 36, 36, 38, 36, 39, 39, 39, 39, 14, 39, 38, 38, 39, 39, 39, 39, 39, 39, 38, 38, 39, 14, 38, 14, 14, 14, 38, 14, 14, 39, 14, 38, 38, 14, 14, 14, 14, 14, 39, 14, 14, 39, 14, 39, 14, 14, 39, 14, 14, 103, 97, 97, 97, 97, 97, 97, 122, 28, 28, 28, 28, 28, 148, 36, 36, 28, 28, 28, 28, 28, 28, 28, 38, 28, 28, 28, 28, 28, 14, 36, 36, 36, 36, 36, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 97, 122, 36, 36, 36, 36, 36, 36, 97, 97, 97, 97, 122, 36, 36, 36, 122, 36, 36, 36, 36, 36, 36, 36, 97, 97, 97, 103, 97, 97, 97, 97, 97, 97, 99, 100, 97, 97, 100, 97, 97, 97, 122, 97, 97, 122, 36, 36, 122, 97, 97, 97, 97, 97, 97, 97, 100, 100, 100, 97, 97, 97, 97, 99, 99, 100, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 103, 97, 122, 36, 14, 14, 14, 100, 97, 97, 97, 97, 97, 97, 97, 99, 14, 14, 14, 14, 14, 14, 100, 97, 97, 97, 97, 97, 97, 14, 14, 14, 14, 14, 14, 36, 97, 97, 97, 97, 36, 36, 36, 36, 36, 36, 36, 36, 36, 103, 97, 97, 122, 36, 103, 97, 97, 97, 97, 97, 43, 36, 36, 36, 36, 36, 36, 36, }; static RE_UINT8 re_line_break_stage_5[] = { 16, 16, 16, 18, 22, 20, 20, 21, 19, 6, 3, 12, 9, 10, 12, 3, 1, 36, 12, 9, 8, 15, 8, 7, 11, 11, 8, 8, 12, 12, 12, 6, 12, 1, 9, 36, 18, 2, 12, 16, 16, 29, 4, 1, 10, 9, 9, 9, 12, 25, 25, 12, 25, 3, 12, 18, 25, 25, 17, 12, 25, 1, 17, 25, 12, 17, 16, 4, 4, 4, 4, 16, 0, 0, 8, 0, 12, 0, 0, 12, 0, 8, 18, 0, 0, 9, 0, 16, 18, 16, 16, 12, 6, 16, 37, 37, 37, 0, 37, 12, 12, 10, 10, 10, 16, 6, 16, 0, 6, 6, 10, 11, 11, 12, 6, 12, 8, 6, 18, 18, 0, 10, 0, 24, 24, 24, 24, 0, 24, 12, 17, 17, 4, 17, 17, 18, 4, 6, 4, 12, 1, 2, 18, 17, 12, 4, 4, 0, 31, 31, 32, 32, 33, 33, 18, 12, 2, 0, 5, 24, 18, 9, 0, 18, 18, 4, 18, 28, 26, 25, 3, 3, 1, 3, 14, 14, 14, 18, 20, 20, 3, 25, 5, 5, 8, 1, 2, 5, 30, 12, 2, 25, 9, 12, 13, 13, 2, 12, 13, 12, 12, 13, 13, 25, 25, 13, 0, 13, 2, 1, 0, 6, 6, 18, 1, 18, 26, 26, 2, 13, 13, 5, 5, 1, 2, 2, 13, 16, 5, 13, 0, 38, 13, 38, 38, 13, 38, 0, 16, 5, 5, 38, 38, 5, 13, 0, 38, 38, 10, 12, 31, 0, 34, 35, 35, 35, 32, 0, 0, 33, 27, 27, 0, 37, 16, 37, 8, 2, 2, 8, 6, 1, 2, 14, 13, 1, 13, 9, 10, 13, 0, 30, 13, 6, 13, 2, 12, 38, 38, 12, 9, 0, 23, 25, 1, 1, 25, 0, 39, 39, }; /* Line_Break: 7668 bytes. */ RE_UINT32 re_get_line_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_line_break_stage_1[f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_line_break_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_line_break_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_line_break_stage_4[pos + f] << 1; value = re_line_break_stage_5[pos + code]; return value; } /* Numeric_Type. */ static RE_UINT8 re_numeric_type_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11, 12, 13, 14, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 11, 17, 18, 11, 19, 20, 11, 11, 21, 11, 11, 11, 11, 11, 11, 11, 11, 22, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; static RE_UINT8 re_numeric_type_stage_2[] = { 0, 1, 1, 1, 1, 1, 2, 3, 1, 4, 5, 6, 7, 8, 9, 10, 11, 1, 1, 12, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1, 1, 1, 20, 21, 1, 1, 22, 1, 1, 23, 1, 1, 1, 1, 24, 1, 1, 1, 25, 26, 27, 1, 28, 1, 1, 1, 29, 1, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 32, 1, 33, 1, 34, 1, 1, 35, 1, 36, 1, 1, 1, 1, 1, 37, 38, 1, 1, 39, 40, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, 43, 1, 1, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 1, 51, 52, 53, 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 15, 1, 56, 1, 57, 58, 1, 1, 1, 59, 60, 61, 62, 1, 1, 63, 1, 64, 65, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 67, 1, 1, 1, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 70, 71, 1, 1, 1, 1, 1, 1, 1, 72, 73, 74, 1, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_numeric_type_stage_3[] = { 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 0, 0, 0, 0, 0, 18, 19, 20, 0, 0, 0, 0, 0, 0, 21, 22, 0, 0, 23, 0, 0, 0, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 30, 31, 0, 30, 32, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 37, 0, 26, 0, 38, 39, 40, 41, 36, 0, 0, 42, 0, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 50, 0, 0, 0, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 0, 0, 0, 56, 0, 3, 0, 0, 0, 0, 0, 61, 0, 62, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 63, 0, 55, 64, 26, 65, 66, 19, 67, 35, 0, 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, 71, 71, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 76, 77, 0, 0, 0, 1, 0, 78, 0, 0, 0, 0, 1, 0, 19, 19, 19, 79, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 82, 83, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 43, 0, 0, 0, 84, 0, 58, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, }; static RE_UINT8 re_numeric_type_stage_4[] = { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 3, 4, 1, 2, 0, 0, 5, 1, 0, 0, 5, 1, 6, 7, 5, 1, 8, 0, 5, 1, 9, 0, 5, 1, 0, 10, 5, 1, 11, 0, 1, 12, 13, 0, 0, 14, 15, 16, 0, 17, 18, 0, 1, 2, 19, 7, 0, 0, 1, 20, 1, 2, 1, 2, 0, 0, 21, 22, 23, 22, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 24, 7, 0, 0, 23, 25, 26, 27, 19, 23, 25, 13, 0, 28, 29, 30, 0, 0, 31, 32, 23, 33, 34, 0, 0, 0, 0, 35, 36, 0, 0, 0, 37, 7, 0, 9, 0, 0, 38, 0, 19, 7, 0, 0, 0, 19, 37, 19, 0, 0, 37, 19, 35, 0, 0, 0, 39, 0, 0, 0, 0, 40, 0, 0, 0, 35, 0, 0, 41, 42, 0, 0, 0, 43, 44, 0, 0, 0, 0, 36, 18, 0, 0, 36, 0, 18, 0, 0, 0, 0, 18, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 46, 0, 0, 47, 43, 0, 0, 48, 0, 0, 0, 0, 0, 0, 39, 0, 0, 42, 42, 0, 0, 0, 40, 0, 0, 0, 17, 0, 49, 18, 0, 0, 0, 0, 45, 0, 43, 0, 0, 0, 0, 40, 0, 0, 0, 45, 0, 0, 45, 39, 0, 42, 0, 0, 0, 45, 43, 0, 0, 0, 0, 0, 18, 17, 19, 0, 0, 0, 0, 11, 0, 0, 39, 39, 18, 0, 0, 50, 0, 36, 19, 19, 19, 19, 19, 13, 0, 19, 19, 19, 18, 13, 0, 0, 0, 42, 40, 0, 0, 0, 0, 51, 0, 0, 0, 0, 19, 0, 0, 17, 13, 52, 0, 0, 0, 0, 0, 0, 53, 23, 25, 19, 10, 0, 0, 54, 55, 56, 1, 0, 0, 0, 0, 5, 1, 9, 0, 0, 0, 19, 19, 7, 0, 0, 5, 1, 1, 1, 1, 1, 1, 23, 57, 0, 0, 40, 0, 0, 0, 39, 43, 0, 43, 0, 40, 0, 35, 0, 0, 0, 42, }; static RE_UINT8 re_numeric_type_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, }; /* Numeric_Type: 2088 bytes. */ RE_UINT32 re_get_numeric_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_numeric_type_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_numeric_type_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_numeric_type_stage_3[pos + f] << 2; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_numeric_type_stage_4[pos + f] << 3; value = re_numeric_type_stage_5[pos + code]; return value; } /* Numeric_Value. */ static RE_UINT8 re_numeric_value_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11, 12, 13, 14, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 11, 17, 18, 11, 19, 20, 11, 11, 21, 11, 11, 11, 11, 11, 11, 11, 11, 22, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; static RE_UINT8 re_numeric_value_stage_2[] = { 0, 1, 1, 1, 1, 1, 2, 3, 1, 4, 5, 6, 7, 8, 9, 10, 11, 1, 1, 12, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1, 1, 1, 20, 21, 1, 1, 22, 1, 1, 23, 1, 1, 1, 1, 24, 1, 1, 1, 25, 26, 27, 1, 28, 1, 1, 1, 29, 1, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 32, 1, 33, 1, 34, 1, 1, 35, 1, 36, 1, 1, 1, 1, 1, 37, 38, 1, 1, 39, 40, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, 43, 1, 1, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 1, 51, 52, 53, 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 15, 1, 56, 1, 57, 58, 1, 1, 1, 59, 60, 61, 62, 1, 1, 63, 1, 64, 65, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 67, 1, 1, 1, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 70, 71, 1, 1, 1, 1, 1, 1, 1, 72, 73, 74, 1, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 79, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_numeric_value_stage_3[] = { 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 15, 3, 0, 0, 0, 0, 0, 16, 17, 18, 0, 0, 0, 0, 0, 0, 19, 20, 0, 0, 21, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 28, 29, 0, 28, 30, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 35, 0, 36, 0, 37, 38, 39, 40, 41, 0, 0, 42, 0, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 50, 0, 0, 0, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 0, 0, 0, 66, 0, 3, 0, 0, 0, 0, 0, 67, 0, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 69, 0, 70, 71, 72, 73, 74, 75, 76, 77, 0, 0, 0, 0, 78, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 85, 85, 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 87, 88, 0, 0, 0, 1, 0, 89, 0, 0, 0, 0, 1, 0, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 99, 0, 0, 0, 100, 0, 101, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, }; static RE_UINT8 re_numeric_value_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 4, 0, 5, 6, 1, 2, 3, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 7, 8, 9, 0, 10, 11, 0, 0, 7, 8, 9, 12, 13, 0, 0, 0, 7, 8, 9, 14, 0, 0, 0, 0, 7, 8, 9, 0, 0, 1, 15, 0, 7, 8, 9, 16, 17, 0, 0, 1, 2, 18, 19, 20, 0, 0, 0, 0, 0, 21, 2, 22, 23, 24, 25, 0, 0, 0, 26, 27, 0, 0, 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 0, 0, 1, 2, 28, 0, 0, 0, 0, 0, 29, 2, 3, 0, 0, 0, 0, 0, 30, 31, 32, 33, 34, 35, 36, 37, 34, 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, 0, 34, 35, 36, 41, 42, 34, 35, 36, 41, 42, 34, 35, 36, 41, 42, 0, 0, 0, 43, 44, 45, 46, 2, 47, 0, 0, 0, 0, 0, 48, 49, 50, 34, 35, 51, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 53, 0, 0, 0, 0, 0, 0, 21, 2, 3, 0, 0, 0, 54, 0, 0, 0, 0, 0, 48, 55, 0, 0, 34, 35, 56, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 63, 64, 65, 66, 0, 67, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 75, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 79, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 0, 0, 0, 0, 86, 87, 0, 88, 0, 0, 0, 0, 89, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 15, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 99, 68, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, 48, 49, 104, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 0, 0, 0, 0, 107, 0, 108, 0, 75, 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 111, 8, 9, 57, 58, 112, 113, 114, 115, 116, 117, 118, 0, 0, 0, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 122, 131, 132, 0, 0, 0, 103, 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 134, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 0, 0, 0, 0, 0, 0, 0, 0, 138, 139, 0, 0, 0, 0, 0, 140, 141, 0, 34, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 34, 142, 34, 35, 144, 145, 146, 147, 148, 149, 0, 0, 0, 0, 48, 49, 50, 150, 151, 152, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 8, 9, 49, 153, 35, 154, 2, 155, 156, 157, 9, 158, 159, 158, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 0, 0, 0, 0, 0, 0, 0, 34, 35, 144, 145, 171, 0, 0, 0, 0, 0, 0, 7, 8, 9, 1, 2, 172, 8, 9, 1, 2, 172, 8, 9, 173, 49, 174, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 176, 0, 0, 88, 0, 0, 0, 88, 0, 0, 101, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, }; static RE_UINT8 re_numeric_value_stage_5[] = { 0, 0, 0, 0, 2, 23, 25, 27, 29, 31, 33, 35, 37, 39, 0, 0, 0, 0, 25, 27, 0, 23, 0, 0, 11, 15, 19, 0, 0, 0, 2, 23, 25, 27, 29, 31, 33, 35, 37, 39, 3, 6, 9, 11, 19, 46, 0, 0, 0, 0, 11, 15, 19, 3, 6, 9, 40, 85, 94, 0, 23, 25, 27, 0, 40, 85, 94, 11, 15, 19, 0, 0, 37, 39, 15, 24, 26, 28, 30, 32, 34, 36, 38, 1, 0, 23, 25, 27, 37, 39, 40, 50, 60, 70, 80, 81, 82, 83, 84, 85, 103, 0, 0, 0, 0, 0, 47, 48, 49, 0, 0, 0, 37, 39, 23, 0, 2, 0, 0, 0, 7, 5, 4, 12, 18, 10, 14, 16, 20, 8, 21, 6, 13, 17, 22, 23, 23, 25, 27, 29, 31, 33, 35, 37, 39, 40, 41, 42, 80, 85, 89, 94, 94, 98, 103, 0, 0, 33, 80, 107, 112, 2, 0, 0, 43, 44, 45, 46, 47, 48, 49, 50, 0, 0, 2, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 23, 25, 27, 37, 39, 40, 2, 0, 0, 23, 25, 27, 29, 31, 33, 35, 37, 39, 40, 39, 40, 23, 25, 0, 15, 0, 0, 0, 0, 0, 2, 40, 50, 60, 0, 27, 29, 0, 0, 39, 40, 0, 0, 40, 50, 60, 70, 80, 81, 82, 83, 0, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 0, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 0, 31, 0, 0, 0, 0, 0, 25, 0, 0, 31, 0, 0, 35, 0, 0, 23, 0, 0, 35, 0, 0, 0, 103, 0, 27, 0, 0, 0, 39, 0, 0, 25, 0, 0, 0, 31, 0, 29, 0, 0, 0, 0, 115, 40, 0, 0, 0, 0, 0, 0, 94, 27, 0, 0, 0, 85, 0, 0, 0, 115, 0, 0, 0, 0, 0, 116, 0, 0, 25, 0, 37, 0, 33, 0, 0, 0, 40, 0, 94, 50, 60, 0, 0, 70, 0, 0, 0, 0, 27, 27, 27, 0, 0, 0, 29, 0, 0, 23, 0, 0, 0, 39, 50, 0, 0, 40, 0, 37, 0, 0, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 0, 85, 0, 0, 0, 29, 0, 0, 0, 25, 0, 0, 94, 0, 0, 0, 0, 33, 0, 33, 0, 0, 0, 0, 0, 2, 0, 35, 37, 39, 2, 11, 15, 19, 3, 6, 9, 0, 0, 0, 0, 0, 27, 0, 0, 0, 40, 0, 33, 0, 33, 0, 40, 0, 0, 0, 0, 0, 23, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 11, 15, 23, 31, 80, 89, 98, 107, 31, 40, 80, 85, 89, 94, 98, 31, 40, 80, 85, 89, 94, 103, 107, 40, 23, 23, 23, 25, 25, 25, 25, 31, 40, 40, 40, 40, 40, 60, 80, 80, 80, 80, 85, 87, 89, 89, 89, 89, 80, 15, 15, 18, 19, 0, 0, 0, 23, 31, 40, 80, 0, 84, 0, 0, 0, 0, 93, 0, 0, 23, 25, 40, 50, 85, 0, 0, 23, 25, 27, 40, 50, 85, 94, 103, 0, 0, 23, 40, 50, 85, 25, 27, 40, 50, 85, 94, 0, 23, 80, 0, 39, 40, 50, 60, 70, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 15, 11, 12, 18, 0, 50, 60, 70, 80, 81, 82, 83, 84, 85, 94, 2, 23, 35, 37, 39, 29, 39, 23, 25, 27, 37, 39, 23, 25, 27, 29, 31, 25, 27, 27, 29, 31, 23, 25, 27, 27, 29, 31, 113, 114, 29, 31, 27, 27, 29, 29, 29, 29, 33, 35, 35, 35, 37, 37, 39, 39, 39, 39, 25, 27, 29, 31, 33, 23, 25, 27, 29, 29, 31, 31, 25, 27, 23, 25, 12, 18, 21, 12, 18, 6, 11, 8, 11, 0, 83, 84, 0, 0, 37, 39, 2, 23, 2, 2, 23, 25, 35, 37, 39, 0, 29, 0, 0, 0, 0, 0, 0, 60, 0, 29, 0, 0, 39, 0, 0, 0, }; /* Numeric_Value: 2876 bytes. */ RE_UINT32 re_get_numeric_value(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_numeric_value_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_numeric_value_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_numeric_value_stage_3[pos + f] << 3; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_numeric_value_stage_4[pos + f] << 2; value = re_numeric_value_stage_5[pos + code]; return value; } /* Bidi_Mirrored. */ static RE_UINT8 re_bidi_mirrored_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_bidi_mirrored_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_bidi_mirrored_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 4, 5, 1, 6, 7, 8, 1, 9, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, 12, 1, 1, 1, 1, }; static RE_UINT8 re_bidi_mirrored_stage_4[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3, 3, 9, 3, 3, 10, 11, 12, 13, 14, 3, 3, 3, 3, 3, 3, 3, 3, 15, 3, 16, 3, 3, 3, 3, 3, 3, 17, 18, 19, 20, 21, 22, 3, 3, 3, 3, 23, 3, 3, 3, 3, 3, 3, 3, 24, 3, 3, 3, 3, 3, 3, 3, 3, 25, 3, 3, 26, 27, 3, 3, 3, 3, 3, 28, 29, 30, 31, 32, }; static RE_UINT8 re_bidi_mirrored_stage_5[] = { 0, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 30, 63, 98, 188, 87, 248, 15, 250, 255, 31, 60, 128, 245, 207, 255, 255, 255, 159, 7, 1, 204, 255, 255, 193, 0, 62, 195, 255, 255, 63, 255, 255, 0, 15, 0, 0, 3, 6, 0, 0, 0, 0, 0, 0, 0, 255, 63, 0, 121, 59, 120, 112, 252, 255, 0, 0, 248, 255, 255, 249, 255, 255, 0, 1, 63, 194, 55, 31, 58, 3, 240, 51, 0, 252, 255, 223, 83, 122, 48, 112, 0, 0, 128, 1, 48, 188, 25, 254, 255, 255, 255, 255, 207, 191, 255, 255, 255, 255, 127, 80, 124, 112, 136, 47, 60, 54, 0, 48, 255, 3, 0, 0, 0, 255, 243, 15, 0, 0, 0, 0, 0, 0, 0, 126, 48, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 0, 0, 168, 13, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, }; /* Bidi_Mirrored: 489 bytes. */ RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_bidi_mirrored_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_bidi_mirrored_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_bidi_mirrored_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_bidi_mirrored_stage_4[pos + f] << 6; pos += code; value = (re_bidi_mirrored_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Indic_Matra_Category. */ static RE_UINT8 re_indic_matra_category_stage_1[] = { 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_indic_matra_category_stage_2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 9, 0, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 19, 20, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_indic_matra_category_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 5, 6, 7, 4, 0, 0, 0, 0, 5, 8, 0, 0, 0, 0, 0, 0, 5, 9, 0, 4, 0, 0, 0, 0, 10, 11, 12, 4, 0, 0, 0, 0, 13, 14, 7, 0, 0, 0, 0, 0, 15, 16, 17, 4, 0, 0, 0, 0, 10, 18, 19, 4, 0, 0, 0, 0, 13, 20, 7, 4, 0, 0, 0, 0, 0, 21, 22, 0, 23, 0, 0, 0, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 0, 32, 33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 37, 0, 38, 0, 38, 0, 0, 0, 39, 40, 41, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 23, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 66, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 71, 72, 0, 0, 0, 0, 0, 0, 0, 73, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 69, 0, 0, 0, 0, }; static RE_UINT8 re_indic_matra_category_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 1, 7, 3, 8, 0, 0, 9, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 10, 11, 12, 13, 14, 0, 0, 0, 0, 15, 0, 0, 0, 0, 3, 10, 0, 9, 16, 9, 17, 0, 3, 4, 5, 9, 18, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 19, 3, 4, 10, 11, 20, 13, 21, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 17, 10, 0, 22, 12, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 7, 25, 6, 26, 6, 6, 0, 0, 0, 9, 10, 0, 0, 0, 0, 27, 7, 25, 18, 28, 29, 6, 0, 0, 0, 15, 25, 0, 0, 0, 0, 7, 3, 10, 22, 12, 23, 24, 0, 0, 0, 0, 0, 0, 16, 0, 15, 7, 6, 10, 10, 2, 30, 23, 31, 0, 7, 0, 0, 0, 0, 0, 0, 19, 7, 6, 6, 4, 10, 0, 0, 32, 32, 33, 9, 0, 0, 0, 16, 19, 7, 6, 6, 4, 9, 0, 0, 32, 32, 34, 0, 0, 0, 0, 0, 35, 36, 4, 37, 37, 6, 6, 0, 36, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 19, 17, 38, 6, 6, 0, 39, 16, 0, 0, 0, 0, 0, 7, 4, 0, 0, 0, 0, 25, 0, 15, 25, 0, 0, 0, 9, 6, 16, 0, 0, 0, 0, 0, 0, 15, 40, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 17, 10, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 17, 4, 41, 42, 22, 23, 0, 25, 0, 0, 0, 9, 43, 0, 0, 0, 0, 0, 0, 6, 44, 45, 46, 16, 0, 0, 0, 7, 7, 2, 22, 7, 8, 7, 7, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 38, 2, 0, 0, 47, 1, 19, 6, 17, 5, 44, 22, 22, 40, 16, 0, 0, 0, 0, 0, 0, 0, 15, 6, 4, 48, 49, 22, 23, 18, 25, 0, 0, 0, 0, 0, 0, 0, 17, 8, 6, 25, 0, 0, 0, 0, 0, 2, 50, 7, 10, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 15, 3, 1, 0, 0, 0, 0, 0, 0, 15, 7, 7, 7, 7, 7, 7, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 35, 4, 17, 4, 10, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 4, 22, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 17, 52, 40, 10, 0, 0, 0, 0, 0, 0, 1, 6, 53, 54, 55, 56, 33, 16, 0, 0, 0, 0, 0, 11, 5, 8, 0, 0, 0, 43, 0, 0, 0, 0, 0, 15, 19, 7, 44, 25, 35, 0, 57, 4, 9, 58, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 6, 6, 4, 4, 4, 6, 6, 16, 0, 0, 0, 0, 2, 3, 5, 1, 3, 0, 0, 0, 0, 0, 0, 9, 6, 4, 40, 37, 17, 59, 16, 0, 0, 0, 0, 0, 0, 15, 8, 4, 4, 4, 6, 18, 0, 0, 0, 0, 0, 0, 9, 8, }; static RE_UINT8 re_indic_matra_category_stage_5[] = { 0, 0, 5, 1, 1, 2, 1, 6, 6, 6, 6, 5, 5, 5, 1, 1, 2, 1, 0, 5, 6, 0, 0, 2, 2, 0, 0, 4, 4, 6, 0, 1, 5, 0, 5, 6, 5, 8, 1, 5, 9, 0, 10, 6, 2, 2, 4, 4, 4, 5, 1, 0, 7, 0, 8, 1, 8, 0, 8, 8, 9, 2, 4, 1, 3, 3, 3, 1, 3, 0, 0, 6, 5, 7, 7, 7, 6, 2, 0, 14, 2, 5, 9, 10, 4, 2, 14, 0, 6, 1, 1, 8, 8, 5, 14, 1, 6, 11, 7, 12, 2, 9, 11, 0, 5, 2, 6, 3, 3, 5, 5, 3, 1, 3, 0, 13, 13, 0, 6, 14, }; /* Indic_Matra_Category: 1336 bytes. */ RE_UINT32 re_get_indic_matra_category(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_indic_matra_category_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_indic_matra_category_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_indic_matra_category_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_indic_matra_category_stage_4[pos + f] << 1; value = re_indic_matra_category_stage_5[pos + code]; return value; } /* Indic_Syllabic_Category. */ static RE_UINT8 re_indic_syllabic_category_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_indic_syllabic_category_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 1, 1, 1, 1, 1, 10, 1, 11, 12, 13, 14, 1, 1, 1, 1, 1, 1, 1, 1, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 17, 18, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 1, 1, 21, 22, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_indic_syllabic_category_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 8, 16, 17, 11, 12, 18, 19, 20, 0, 21, 22, 23, 12, 24, 25, 0, 8, 0, 10, 11, 12, 24, 26, 27, 8, 28, 29, 30, 31, 32, 33, 34, 0, 0, 35, 36, 12, 37, 38, 39, 8, 0, 40, 36, 12, 41, 38, 42, 8, 0, 40, 36, 4, 43, 44, 34, 8, 45, 46, 47, 4, 48, 49, 50, 0, 51, 52, 4, 53, 54, 55, 0, 0, 0, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 62, 4, 63, 64, 65, 66, 67, 68, 0, 0, 0, 0, 4, 4, 69, 70, 0, 71, 72, 73, 74, 75, 0, 0, 0, 0, 0, 0, 76, 77, 78, 77, 78, 79, 76, 80, 4, 4, 81, 82, 83, 84, 0, 0, 85, 63, 86, 87, 0, 4, 88, 89, 4, 4, 90, 91, 92, 0, 0, 0, 4, 93, 4, 4, 94, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 98, 78, 4, 99, 100, 0, 0, 0, 101, 4, 102, 103, 4, 4, 104, 105, 4, 4, 106, 107, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 111, 4, 112, 0, 4, 113, 114, 115, 116, 117, 4, 118, 119, 0, 0, 0, 120, 4, 121, 4, 122, 123, 0, 0, 124, 4, 4, 125, 126, 0, 0, 0, 127, 4, 128, 129, 130, 0, 4, 131, 4, 4, 4, 132, 133, 0, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 138, 0, 139, 140, 4, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 78, 4, 143, 144, 0, 0, 0, 145, 4, 4, 146, 0, 0, 0, 0, 147, 4, 148, 149, 0, 0, 0, 0, 150, 151, 4, 152, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 4, 155, 156, 0, 0, 0, 0, }; static RE_UINT8 re_indic_syllabic_category_stage_4[] = { 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 8, 9, 0, 10, 5, 5, 11, 0, 0, 0, 12, 3, 13, 5, 14, 15, 3, 16, 16, 4, 5, 5, 5, 5, 17, 5, 18, 19, 20, 7, 8, 21, 21, 22, 0, 23, 0, 24, 20, 0, 0, 0, 14, 15, 25, 26, 17, 27, 20, 28, 29, 23, 21, 30, 0, 0, 13, 18, 31, 32, 0, 0, 14, 15, 3, 33, 33, 4, 5, 5, 17, 13, 20, 7, 8, 34, 34, 30, 8, 21, 21, 30, 0, 35, 0, 24, 36, 0, 0, 0, 37, 15, 25, 12, 38, 39, 27, 17, 40, 41, 42, 19, 5, 5, 20, 35, 29, 35, 43, 30, 0, 23, 0, 0, 14, 15, 3, 38, 38, 4, 5, 5, 5, 13, 20, 44, 8, 43, 43, 30, 0, 45, 20, 0, 46, 15, 3, 38, 5, 13, 20, 7, 0, 45, 0, 47, 5, 5, 42, 44, 8, 43, 43, 48, 0, 0, 49, 50, 46, 15, 3, 3, 3, 25, 19, 5, 24, 5, 5, 36, 5, 42, 51, 23, 8, 52, 8, 8, 35, 0, 0, 0, 13, 5, 5, 5, 5, 5, 5, 42, 8, 8, 53, 0, 8, 34, 54, 55, 27, 56, 18, 36, 0, 5, 13, 5, 13, 57, 19, 27, 8, 8, 34, 58, 8, 59, 54, 60, 0, 0, 0, 20, 5, 5, 13, 5, 5, 5, 5, 41, 10, 8, 8, 61, 62, 63, 64, 65, 66, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 68, 69, 3, 70, 8, 8, 71, 72, 73, 74, 11, 75, 76, 77, 78, 79, 80, 81, 82, 5, 5, 83, 84, 54, 85, 0, 0, 86, 87, 88, 5, 5, 17, 6, 89, 0, 0, 88, 5, 5, 5, 6, 0, 0, 0, 90, 0, 0, 0, 91, 3, 3, 3, 3, 35, 8, 8, 8, 61, 92, 93, 94, 0, 0, 95, 96, 5, 5, 5, 8, 8, 97, 0, 98, 99, 100, 0, 101, 102, 102, 103, 104, 105, 0, 0, 5, 5, 5, 0, 8, 8, 8, 8, 106, 99, 107, 0, 5, 108, 8, 0, 5, 5, 5, 69, 88, 109, 99, 110, 111, 8, 8, 8, 8, 79, 107, 0, 112, 113, 3, 3, 5, 114, 8, 8, 8, 115, 5, 0, 116, 3, 117, 5, 118, 8, 119, 120, 0, 0, 121, 122, 5, 123, 8, 8, 124, 0, 0, 0, 5, 125, 8, 106, 99, 126, 0, 0, 0, 0, 0, 13, 127, 0, 0, 0, 0, 0, 0, 1, 33, 128, 129, 5, 108, 8, 0, 0, 5, 5, 5, 130, 131, 132, 133, 5, 134, 0, 0, 0, 135, 3, 3, 3, 117, 5, 5, 5, 5, 136, 8, 8, 8, 89, 0, 0, 0, 0, 19, 5, 130, 102, 137, 107, 5, 108, 8, 138, 139, 0, 0, 0, 140, 3, 4, 88, 141, 8, 8, 142, 89, 0, 0, 0, 3, 117, 5, 5, 5, 5, 81, 8, 143, 144, 0, 0, 99, 99, 99, 145, 13, 0, 146, 0, 8, 8, 8, 84, 147, 0, 0, 0, 117, 5, 108, 8, 0, 148, 0, 0, 5, 5, 5, 74, 149, 5, 150, 99, 151, 8, 29, 152, 81, 45, 0, 153, 5, 13, 13, 5, 5, 0, 0, 154, 155, 15, 3, 3, 5, 5, 8, 8, 8, 53, 0, 0, 156, 3, 3, 4, 8, 8, 157, 0, 156, 88, 5, 5, 5, 108, 8, 8, 158, 89, 0, 0, 156, 3, 3, 3, 4, 5, 5, 5, 108, 8, 8, 8, 63, 0, 0, 0, 3, 3, 117, 5, 5, 5, 129, 159, 8, 160, 0, 0, }; static RE_UINT8 re_indic_syllabic_category_stage_5[] = { 0, 0, 0, 0, 9, 0, 0, 0, 1, 1, 1, 2, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 4, 3, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 0, 7, 7, 7, 6, 6, 7, 7, 0, 0, 6, 6, 0, 10, 10, 10, 0, 1, 1, 2, 0, 6, 6, 6, 6, 0, 0, 6, 10, 0, 10, 10, 10, 0, 10, 0, 0, 0, 10, 10, 10, 10, 0, 0, 7, 0, 0, 7, 7, 5, 11, 0, 0, 0, 0, 7, 10, 10, 0, 10, 6, 6, 6, 0, 0, 0, 0, 6, 0, 10, 10, 0, 4, 0, 7, 7, 7, 7, 7, 0, 7, 5, 0, 0, 1, 0, 9, 9, 0, 14, 0, 0, 6, 6, 0, 6, 7, 7, 0, 7, 0, 0, 7, 7, 0, 10, 0, 0, 0, 0, 1, 17, 6, 0, 6, 6, 6, 10, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 10, 10, 10, 0, 7, 0, 7, 7, 0, 3, 7, 7, 0, 7, 7, 0, 0, 0, 1, 2, 0, 0, 10, 0, 7, 5, 12, 0, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 5, 0, 7, 0, 7, 0, 7, 7, 5, 0, 19, 19, 19, 19, 0, 1, 5, 0, 10, 0, 0, 10, 0, 10, 0, 10, 14, 14, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 7, 7, 1, 2, 7, 7, 1, 1, 5, 3, 0, 0, 16, 16, 16, 16, 16, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 0, 0, 10, 6, 6, 6, 6, 6, 6, 7, 7, 7, 1, 19, 2, 5, 5, 14, 14, 14, 14, 10, 10, 10, 6, 6, 7, 7, 10, 10, 10, 10, 14, 14, 14, 10, 7, 19, 19, 10, 10, 7, 7, 19, 19, 19, 19, 19, 10, 10, 10, 7, 7, 7, 7, 10, 10, 10, 10, 10, 14, 7, 7, 7, 7, 19, 19, 19, 10, 19, 0, 0, 19, 19, 7, 7, 0, 0, 6, 6, 6, 10, 5, 0, 0, 0, 10, 0, 7, 7, 10, 10, 10, 6, 7, 20, 20, 0, 12, 0, 0, 0, 0, 5, 5, 0, 3, 0, 0, 0, 9, 10, 10, 10, 7, 13, 13, 13, 15, 15, 1, 15, 15, 15, 15, 15, 15, 0, 0, 0, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 0, 0, 18, 18, 18, 18, 18, 0, 0, 0, 7, 15, 15, 15, 19, 19, 0, 0, 10, 10, 10, 7, 10, 14, 14, 15, 15, 15, 15, 0, 5, 7, 7, 7, 1, 1, 1, 12, 2, 6, 6, 6, 4, 7, 7, 7, 5, 10, 10, 10, 1, 12, 2, 6, 6, 6, 10, 10, 10, 13, 13, 13, 7, 7, 5, 5, 13, 13, 10, 10, 0, 0, 3, 10, 10, 10, 15, 15, 6, 6, 4, 7, 15, 15, 5, 5, 13, 13, 7, 7, 1, 1, 0, 4, 0, 0, 2, 2, 6, 6, 5, 10, 10, 10, 10, 1, 10, 10, 8, 8, 8, 8, 10, 10, 10, 10, 8, 13, 13, 10, 10, 10, 10, 13, 10, 1, 1, 2, 6, 6, 15, 7, 7, 7, 8, 8, 8, 19, 7, 7, 7, 15, 15, 15, 15, 5, 1, 1, 12, 2, 10, 10, 10, 4, 7, 13, 14, 14, 7, 7, 7, 14, 14, 14, 14, 0, 15, 15, 0, 0, 0, 0, 10, 19, 18, 19, 18, 0, 0, 2, 5, 0, 10, 6, 10, 10, 10, 10, 10, 15, 15, 15, 15, 7, 19, 5, 0, 0, 7, 0, 1, 2, 0, 0, 0, 5, 1, 1, 2, 0, 1, 1, 2, 6, 7, 5, 4, 0, 7, 7, 7, 5, 2, 7, 7, 7, 7, 7, 5, 4, }; /* Indic_Syllabic_Category: 1952 bytes. */ RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_indic_syllabic_category_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_indic_syllabic_category_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_indic_syllabic_category_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_indic_syllabic_category_stage_4[pos + f] << 2; value = re_indic_syllabic_category_stage_5[pos + code]; return value; } /* Alphanumeric. */ RE_UINT32 re_get_alphanumeric(RE_UINT32 ch) { return re_get_alphabetic(ch) || re_get_general_category(ch) == RE_PROP_ND; } /* Any. */ RE_UINT32 re_get_any(RE_UINT32 ch) { return 1; } /* ASCII. */ RE_UINT32 re_get_ascii(RE_UINT32 ch) { if (ch <= RE_ASCII_MAX) return 1; return 0; } /* Assigned. */ RE_UINT32 re_get_assigned(RE_UINT32 ch) { return re_get_general_category(ch) != RE_PROP_CN; } /* Blank. */ RE_UINT32 re_get_blank(RE_UINT32 ch) { return ch == 0x09 || re_get_general_category(ch) == RE_PROP_ZS; } /* Graph. */ RE_UINT32 re_get_graph(RE_UINT32 ch) { return !re_get_white_space(ch) && (RE_GRAPH_MASK & (1 << re_get_general_category(ch))) == 0; } /* Print. */ RE_UINT32 re_get_print(RE_UINT32 ch) { return (re_get_graph(ch) || re_get_blank(ch)) && re_get_general_category(ch) != RE_PROP_CC; } /* Word. */ RE_UINT32 re_get_word(RE_UINT32 ch) { return re_get_alphabetic(ch) || (RE_WORD_MASK & (1 << re_get_general_category(ch))) != 0 || re_get_join_control(ch); } /* XDigit. */ RE_UINT32 re_get_xdigit(RE_UINT32 ch) { return re_get_general_category(ch) == RE_PROP_ND || re_get_hex_digit(ch); } /* All_Cases. */ static RE_UINT8 re_all_cases_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_all_cases_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 10, 6, 11, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 17, 6, 6, 6, 18, 6, 6, 6, 6, 19, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_all_cases_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 9, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 18, 18, 18, 18, 18, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 34, 18, 18, 35, 18, 18, 18, 18, 18, 36, 18, 37, 38, 39, 18, 40, 41, 42, 43, 44, 45, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 18, 18, 18, 63, 64, 65, 65, 11, 11, 11, 11, 15, 15, 15, 15, 66, 66, 18, 18, 18, 18, 67, 68, 18, 18, 18, 18, 18, 18, 69, 70, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 71, 72, 72, 72, 73, 0, 74, 75, 75, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 77, 77, 77, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 81, 18, 18, 18, 18, 18, 82, 83, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 84, 85, 86, 87, 84, 85, 84, 85, 86, 87, 88, 89, 84, 85, 90, 91, 84, 85, 84, 85, 84, 85, 92, 93, 94, 95, 96, 97, 98, 99, 94, 100, 0, 0, 0, 0, 101, 102, 103, 0, 0, 104, 0, 0, 105, 105, 106, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 109, 109, 110, 110, 110, 111, 0, 0, 72, 72, 72, 72, 72, 73, 75, 75, 75, 75, 75, 76, 112, 113, 114, 115, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 37, 116, 117, 0, 118, 118, 118, 118, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 82, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 18, 68, 18, 18, 18, 18, 18, 18, 18, 0, 121, 18, 122, 37, 0, 18, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 11, 4, 5, 15, 15, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_all_cases_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 7, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 11, 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 13, 14, 15, 14, 15, 14, 15, 14, 15, 16, 17, 14, 15, 14, 15, 14, 15, 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 14, 15, 14, 15, 14, 15, 18, 14, 15, 14, 15, 14, 15, 19, 20, 21, 14, 15, 14, 15, 22, 14, 15, 23, 23, 14, 15, 0, 24, 25, 26, 14, 15, 23, 27, 28, 29, 30, 14, 15, 31, 0, 29, 32, 33, 34, 14, 15, 14, 15, 14, 15, 35, 14, 15, 35, 0, 0, 14, 15, 35, 14, 15, 36, 36, 14, 15, 14, 15, 37, 14, 15, 0, 0, 14, 15, 0, 38, 0, 0, 0, 0, 39, 40, 41, 39, 40, 41, 39, 40, 41, 14, 15, 14, 15, 14, 15, 14, 15, 42, 14, 15, 0, 39, 40, 41, 14, 15, 43, 44, 45, 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 0, 46, 14, 15, 47, 48, 49, 49, 14, 15, 50, 51, 52, 14, 15, 53, 54, 55, 56, 57, 0, 58, 58, 0, 59, 0, 60, 0, 0, 0, 0, 58, 0, 0, 61, 0, 62, 63, 0, 64, 65, 0, 66, 0, 0, 0, 65, 0, 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 71, 0, 0, 71, 0, 0, 0, 0, 71, 72, 73, 73, 74, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 14, 15, 14, 15, 0, 0, 14, 15, 0, 0, 0, 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 78, 78, 78, 0, 79, 0, 80, 80, 81, 1, 82, 1, 1, 83, 1, 1, 84, 85, 86, 1, 87, 1, 1, 1, 88, 89, 0, 90, 1, 1, 91, 1, 1, 92, 1, 1, 93, 94, 94, 94, 95, 5, 96, 5, 5, 97, 5, 5, 98, 99, 100, 5, 101, 5, 5, 5, 102, 103, 104, 105, 5, 5, 106, 5, 5, 107, 5, 5, 108, 109, 109, 110, 111, 112, 0, 0, 0, 113, 114, 115, 116, 117, 118, 0, 119, 120, 0, 14, 15, 121, 14, 15, 0, 45, 45, 45, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 14, 15, 14, 15, 124, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 125, 0, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 0, 0, 0, 0, 0, 128, 0, 0, 0, 129, 0, 0, 0, 130, 0, 0, 131, 132, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 133, 0, 0, 134, 0, 110, 110, 110, 110, 110, 110, 110, 110, 115, 115, 115, 115, 115, 115, 115, 115, 110, 110, 110, 110, 110, 110, 0, 0, 115, 115, 115, 115, 115, 115, 0, 0, 0, 110, 0, 110, 0, 110, 0, 110, 0, 115, 0, 115, 0, 115, 0, 115, 135, 135, 136, 136, 136, 136, 137, 137, 138, 138, 139, 139, 140, 140, 0, 0, 110, 110, 0, 141, 0, 0, 0, 0, 115, 115, 142, 142, 143, 0, 144, 0, 0, 0, 0, 141, 0, 0, 0, 0, 145, 145, 145, 145, 143, 0, 0, 0, 110, 110, 0, 146, 0, 0, 0, 0, 115, 115, 147, 147, 0, 0, 0, 0, 110, 110, 0, 148, 0, 118, 0, 0, 115, 115, 149, 149, 121, 0, 0, 0, 150, 150, 151, 151, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 0, 0, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 0, 0, 0, 0, 0, 0, 14, 15, 161, 162, 163, 164, 165, 14, 15, 14, 15, 14, 15, 166, 167, 168, 169, 0, 14, 15, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 170, 170, 0, 0, 0, 14, 15, 14, 15, 0, 0, 0, 14, 15, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 171, 0, 0, 0, 0, 0, 171, 0, 0, 0, 14, 15, 14, 15, 172, 14, 15, 0, 0, 0, 14, 15, 173, 0, 0, 14, 15, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176, 176, 176, 176, }; /* All_Cases: 1984 bytes. */ static RE_AllCases re_all_cases_table[] = { {{ 0, 0, 0}}, {{ 32, 0, 0}}, {{ 32, 232, 0}}, {{ 32, 8415, 0}}, {{ 32, 300, 0}}, {{ -32, 0, 0}}, {{ -32, 199, 0}}, {{ -32, 8383, 0}}, {{ -32, 268, 0}}, {{ 743, 775, 0}}, {{ 32, 8294, 0}}, {{ 7615, 0, 0}}, {{ -32, 8262, 0}}, {{ 121, 0, 0}}, {{ 1, 0, 0}}, {{ -1, 0, 0}}, {{ -199, 0, 0}}, {{ -232, 0, 0}}, {{ -121, 0, 0}}, {{ -300, -268, 0}}, {{ 195, 0, 0}}, {{ 210, 0, 0}}, {{ 206, 0, 0}}, {{ 205, 0, 0}}, {{ 79, 0, 0}}, {{ 202, 0, 0}}, {{ 203, 0, 0}}, {{ 207, 0, 0}}, {{ 97, 0, 0}}, {{ 211, 0, 0}}, {{ 209, 0, 0}}, {{ 163, 0, 0}}, {{ 213, 0, 0}}, {{ 130, 0, 0}}, {{ 214, 0, 0}}, {{ 218, 0, 0}}, {{ 217, 0, 0}}, {{ 219, 0, 0}}, {{ 56, 0, 0}}, {{ 1, 2, 0}}, {{ -1, 1, 0}}, {{ -2, -1, 0}}, {{ -79, 0, 0}}, {{ -97, 0, 0}}, {{ -56, 0, 0}}, {{ -130, 0, 0}}, {{ 10795, 0, 0}}, {{ -163, 0, 0}}, {{ 10792, 0, 0}}, {{ 10815, 0, 0}}, {{ -195, 0, 0}}, {{ 69, 0, 0}}, {{ 71, 0, 0}}, {{ 10783, 0, 0}}, {{ 10780, 0, 0}}, {{ 10782, 0, 0}}, {{ -210, 0, 0}}, {{ -206, 0, 0}}, {{ -205, 0, 0}}, {{ -202, 0, 0}}, {{ -203, 0, 0}}, {{ -207, 0, 0}}, {{ 42280, 0, 0}}, {{ 42308, 0, 0}}, {{ -209, 0, 0}}, {{ -211, 0, 0}}, {{ 10743, 0, 0}}, {{ 10749, 0, 0}}, {{ -213, 0, 0}}, {{ -214, 0, 0}}, {{ 10727, 0, 0}}, {{ -218, 0, 0}}, {{ -69, 0, 0}}, {{ -217, 0, 0}}, {{ -71, 0, 0}}, {{ -219, 0, 0}}, {{ 84, 116, 7289}}, {{ 38, 0, 0}}, {{ 37, 0, 0}}, {{ 64, 0, 0}}, {{ 63, 0, 0}}, {{ 7235, 0, 0}}, {{ 32, 62, 0}}, {{ 32, 96, 0}}, {{ 32, 57, 92}}, {{ -84, 32, 7205}}, {{ 32, 86, 0}}, {{ -743, 32, 0}}, {{ 32, 54, 0}}, {{ 32, 80, 0}}, {{ 31, 32, 0}}, {{ 32, 47, 0}}, {{ 32, 7549, 0}}, {{ -38, 0, 0}}, {{ -37, 0, 0}}, {{ 7219, 0, 0}}, {{ -32, 30, 0}}, {{ -32, 64, 0}}, {{ -32, 25, 60}}, {{ -116, -32, 7173}}, {{ -32, 54, 0}}, {{ -775, -32, 0}}, {{ -32, 22, 0}}, {{ -32, 48, 0}}, {{ -31, 1, 0}}, {{ -32, -1, 0}}, {{ -32, 15, 0}}, {{ -32, 7517, 0}}, {{ -64, 0, 0}}, {{ -63, 0, 0}}, {{ 8, 0, 0}}, {{ -62, -30, 0}}, {{ -57, -25, 35}}, {{ -47, -15, 0}}, {{ -54, -22, 0}}, {{ -8, 0, 0}}, {{ -86, -54, 0}}, {{ -80, -48, 0}}, {{ 7, 0, 0}}, {{ -92, -60, -35}}, {{ -96, -64, 0}}, {{ -7, 0, 0}}, {{ 80, 0, 0}}, {{ -80, 0, 0}}, {{ 15, 0, 0}}, {{ -15, 0, 0}}, {{ 48, 0, 0}}, {{ -48, 0, 0}}, {{ 7264, 0, 0}}, {{ 35332, 0, 0}}, {{ 3814, 0, 0}}, {{ 1, 59, 0}}, {{ -1, 58, 0}}, {{ -59, -58, 0}}, {{ -7615, 0, 0}}, {{ 74, 0, 0}}, {{ 86, 0, 0}}, {{ 100, 0, 0}}, {{ 128, 0, 0}}, {{ 112, 0, 0}}, {{ 126, 0, 0}}, {{ 9, 0, 0}}, {{ -74, 0, 0}}, {{ -9, 0, 0}}, {{ -7289, -7205, -7173}}, {{ -86, 0, 0}}, {{ -7235, 0, 0}}, {{ -100, 0, 0}}, {{ -7219, 0, 0}}, {{ -112, 0, 0}}, {{ -128, 0, 0}}, {{ -126, 0, 0}}, {{ -7549, -7517, 0}}, {{ -8415, -8383, 0}}, {{ -8294, -8262, 0}}, {{ 28, 0, 0}}, {{ -28, 0, 0}}, {{ 16, 0, 0}}, {{ -16, 0, 0}}, {{ 26, 0, 0}}, {{ -26, 0, 0}}, {{-10743, 0, 0}}, {{ -3814, 0, 0}}, {{-10727, 0, 0}}, {{-10795, 0, 0}}, {{-10792, 0, 0}}, {{-10780, 0, 0}}, {{-10749, 0, 0}}, {{-10783, 0, 0}}, {{-10782, 0, 0}}, {{-10815, 0, 0}}, {{ -7264, 0, 0}}, {{-35332, 0, 0}}, {{-42280, 0, 0}}, {{-42308, 0, 0}}, {{ 40, 0, 0}}, {{ -40, 0, 0}}, }; /* All_Cases: 1062 bytes. */ int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; RE_AllCases* all_cases; int count; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_all_cases_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_all_cases_stage_2[pos + f] << 5; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_all_cases_stage_3[pos + f] << 3; value = re_all_cases_stage_4[pos + code]; all_cases = &re_all_cases_table[value]; codepoints[0] = ch; count = 1; while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) { codepoints[count] = ch + all_cases->diffs[count - 1]; ++count; } return count; } /* Simple_Case_Folding. */ static RE_UINT8 re_simple_case_folding_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_simple_case_folding_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 6, 6, 6, 6, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_simple_case_folding_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 5, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 7, 8, 8, 7, 6, 6, 6, 6, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 8, 20, 6, 6, 21, 6, 6, 6, 6, 6, 22, 6, 23, 24, 25, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 27, 0, 28, 29, 1, 2, 30, 31, 0, 0, 32, 33, 34, 6, 6, 6, 35, 36, 37, 37, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 38, 7, 6, 6, 6, 6, 6, 6, 39, 40, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 41, 42, 42, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 45, 46, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 47, 48, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 49, 0, 50, 0, 49, 0, 49, 0, 50, 0, 51, 0, 49, 0, 0, 0, 49, 0, 49, 0, 49, 0, 52, 0, 53, 0, 54, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 60, 60, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 63, 63, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 43, 0, 0, 0, 0, 0, 0, 64, 65, 66, 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 68, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 47, 0, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 6, 6, 6, 6, 6, 6, 6, 0, 69, 6, 70, 23, 0, 6, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 72, 72, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_simple_case_folding_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 0, 3, 0, 3, 0, 0, 3, 0, 3, 0, 3, 0, 3, 4, 3, 0, 3, 0, 3, 0, 5, 0, 6, 3, 0, 3, 0, 7, 3, 0, 8, 8, 3, 0, 0, 9, 10, 11, 3, 0, 8, 12, 0, 13, 14, 3, 0, 0, 0, 13, 15, 0, 16, 3, 0, 3, 0, 3, 0, 17, 3, 0, 17, 0, 0, 3, 0, 17, 3, 0, 18, 18, 3, 0, 3, 0, 19, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 20, 3, 0, 20, 3, 0, 20, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 3, 0, 0, 20, 3, 0, 3, 0, 21, 22, 23, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 24, 3, 0, 25, 26, 0, 0, 3, 0, 27, 28, 29, 3, 0, 0, 0, 0, 0, 0, 30, 0, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 32, 32, 0, 33, 0, 34, 34, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 39, 0, 40, 41, 0, 0, 42, 43, 0, 3, 0, 44, 3, 0, 0, 23, 23, 23, 45, 45, 45, 45, 45, 45, 45, 45, 3, 0, 0, 0, 0, 0, 0, 0, 46, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 0, 0, 48, 0, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 49, 0, 0, 50, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 0, 51, 0, 51, 0, 51, 51, 51, 52, 52, 53, 0, 54, 0, 55, 55, 55, 55, 53, 0, 0, 0, 51, 51, 56, 56, 0, 0, 0, 0, 51, 51, 57, 57, 44, 0, 0, 0, 58, 58, 59, 59, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 3, 0, 66, 67, 68, 0, 0, 3, 0, 3, 0, 3, 0, 69, 70, 71, 72, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 73, 73, 0, 0, 0, 3, 0, 3, 0, 0, 0, 3, 0, 3, 0, 74, 3, 0, 0, 0, 0, 3, 0, 75, 0, 0, 3, 0, 76, 0, 0, 0, 0, 0, 77, 77, 77, 77, 77, 77, 77, 77, }; /* Simple_Case_Folding: 1456 bytes. */ static RE_INT32 re_simple_case_folding_table[] = { 0, 32, 775, 1, -121, -268, 210, 206, 205, 79, 202, 203, 207, 211, 209, 213, 214, 218, 217, 219, 2, -97, -56, -130, 10795, -163, 10792, -195, 69, 71, 116, 38, 37, 64, 63, 8, -30, -25, -15, -22, -54, -48, -60, -64, -7, 80, 15, 48, 7264, -58, -7615, -8, -74, -9, -7173, -86, -100, -112, -128, -126, -7517, -8383, -8262, 28, 16, 26, -10743, -3814, -10727, -10780, -10749, -10783, -10782, -10815, -35332, -42280, -42308, 40, }; /* Simple_Case_Folding: 312 bytes. */ RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; RE_INT32 diff; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_simple_case_folding_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_simple_case_folding_stage_2[pos + f] << 5; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_simple_case_folding_stage_3[pos + f] << 3; value = re_simple_case_folding_stage_4[pos + code]; diff = re_simple_case_folding_table[value]; return ch + diff; } /* Full_Case_Folding. */ static RE_UINT8 re_full_case_folding_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_full_case_folding_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 6, 6, 6, 16, 6, 6, 6, 6, 17, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_full_case_folding_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 6, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 8, 9, 9, 10, 7, 7, 7, 7, 7, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 9, 22, 7, 7, 23, 7, 7, 7, 7, 7, 24, 7, 25, 26, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 2, 33, 34, 35, 0, 36, 37, 38, 7, 7, 7, 39, 40, 41, 41, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 42, 43, 7, 7, 7, 7, 7, 7, 44, 45, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 46, 47, 47, 47, 48, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 51, 52, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 53, 54, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 55, 0, 56, 0, 55, 0, 55, 0, 56, 57, 58, 0, 55, 0, 0, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, 0, 0, 75, 76, 77, 0, 0, 0, 0, 0, 78, 78, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 81, 81, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 48, 0, 0, 0, 0, 0, 0, 82, 83, 84, 85, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 86, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 87, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 7, 43, 7, 7, 7, 7, 7, 7, 7, 0, 88, 7, 89, 25, 0, 7, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_full_case_folding_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 3, 4, 0, 4, 0, 4, 0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 0, 6, 4, 0, 4, 0, 4, 0, 7, 4, 0, 4, 0, 4, 0, 8, 0, 9, 4, 0, 4, 0, 10, 4, 0, 11, 11, 4, 0, 0, 12, 13, 14, 4, 0, 11, 15, 0, 16, 17, 4, 0, 0, 0, 16, 18, 0, 19, 4, 0, 4, 0, 4, 0, 20, 4, 0, 20, 0, 0, 4, 0, 20, 4, 0, 21, 21, 4, 0, 4, 0, 22, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 23, 4, 0, 23, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 4, 0, 24, 23, 4, 0, 4, 0, 25, 26, 27, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 28, 4, 0, 29, 30, 0, 0, 4, 0, 31, 32, 33, 4, 0, 0, 0, 0, 0, 0, 34, 0, 0, 4, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 35, 0, 36, 36, 36, 0, 37, 0, 38, 38, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, 45, 0, 46, 47, 0, 0, 48, 49, 0, 4, 0, 50, 4, 0, 0, 27, 27, 27, 51, 51, 51, 51, 51, 51, 51, 51, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 4, 0, 52, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 55, 0, 0, 4, 0, 4, 0, 4, 0, 56, 57, 58, 59, 60, 61, 0, 0, 62, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 64, 0, 65, 0, 66, 0, 67, 0, 0, 63, 0, 63, 0, 63, 0, 63, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 74, 75, 76, 0, 77, 78, 63, 63, 79, 79, 80, 0, 81, 0, 0, 0, 82, 83, 84, 0, 85, 86, 87, 87, 87, 87, 88, 0, 0, 0, 0, 0, 89, 90, 0, 0, 91, 92, 63, 63, 93, 93, 0, 0, 0, 0, 0, 0, 94, 95, 96, 0, 97, 98, 63, 63, 99, 99, 50, 0, 0, 0, 0, 0, 100, 101, 102, 0, 103, 104, 105, 105, 106, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 4, 0, 114, 115, 116, 0, 0, 4, 0, 4, 0, 4, 0, 117, 118, 119, 120, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 121, 121, 0, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 4, 0, 122, 4, 0, 0, 0, 0, 4, 0, 123, 0, 0, 4, 0, 124, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 131, 0, 0, 0, 0, 132, 133, 134, 135, 136, 137, 137, 137, 137, 137, 137, 137, 137, }; /* Full_Case_Folding: 1656 bytes. */ static RE_FullCaseFolding re_full_case_folding_table[] = { { 0, { 0, 0}}, { 32, { 0, 0}}, { 775, { 0, 0}}, { -108, { 115, 0}}, { 1, { 0, 0}}, { -199, { 775, 0}}, { 371, { 110, 0}}, { -121, { 0, 0}}, { -268, { 0, 0}}, { 210, { 0, 0}}, { 206, { 0, 0}}, { 205, { 0, 0}}, { 79, { 0, 0}}, { 202, { 0, 0}}, { 203, { 0, 0}}, { 207, { 0, 0}}, { 211, { 0, 0}}, { 209, { 0, 0}}, { 213, { 0, 0}}, { 214, { 0, 0}}, { 218, { 0, 0}}, { 217, { 0, 0}}, { 219, { 0, 0}}, { 2, { 0, 0}}, { -390, { 780, 0}}, { -97, { 0, 0}}, { -56, { 0, 0}}, { -130, { 0, 0}}, { 10795, { 0, 0}}, { -163, { 0, 0}}, { 10792, { 0, 0}}, { -195, { 0, 0}}, { 69, { 0, 0}}, { 71, { 0, 0}}, { 116, { 0, 0}}, { 38, { 0, 0}}, { 37, { 0, 0}}, { 64, { 0, 0}}, { 63, { 0, 0}}, { 41, { 776, 769}}, { 21, { 776, 769}}, { 8, { 0, 0}}, { -30, { 0, 0}}, { -25, { 0, 0}}, { -15, { 0, 0}}, { -22, { 0, 0}}, { -54, { 0, 0}}, { -48, { 0, 0}}, { -60, { 0, 0}}, { -64, { 0, 0}}, { -7, { 0, 0}}, { 80, { 0, 0}}, { 15, { 0, 0}}, { 48, { 0, 0}}, { -34, {1410, 0}}, { 7264, { 0, 0}}, { -7726, { 817, 0}}, { -7715, { 776, 0}}, { -7713, { 778, 0}}, { -7712, { 778, 0}}, { -7737, { 702, 0}}, { -58, { 0, 0}}, { -7723, { 115, 0}}, { -8, { 0, 0}}, { -7051, { 787, 0}}, { -7053, { 787, 768}}, { -7055, { 787, 769}}, { -7057, { 787, 834}}, { -128, { 953, 0}}, { -136, { 953, 0}}, { -112, { 953, 0}}, { -120, { 953, 0}}, { -64, { 953, 0}}, { -72, { 953, 0}}, { -66, { 953, 0}}, { -7170, { 953, 0}}, { -7176, { 953, 0}}, { -7173, { 834, 0}}, { -7174, { 834, 953}}, { -74, { 0, 0}}, { -7179, { 953, 0}}, { -7173, { 0, 0}}, { -78, { 953, 0}}, { -7180, { 953, 0}}, { -7190, { 953, 0}}, { -7183, { 834, 0}}, { -7184, { 834, 953}}, { -86, { 0, 0}}, { -7189, { 953, 0}}, { -7193, { 776, 768}}, { -7194, { 776, 769}}, { -7197, { 834, 0}}, { -7198, { 776, 834}}, { -100, { 0, 0}}, { -7197, { 776, 768}}, { -7198, { 776, 769}}, { -7203, { 787, 0}}, { -7201, { 834, 0}}, { -7202, { 776, 834}}, { -112, { 0, 0}}, { -118, { 953, 0}}, { -7210, { 953, 0}}, { -7206, { 953, 0}}, { -7213, { 834, 0}}, { -7214, { 834, 953}}, { -128, { 0, 0}}, { -126, { 0, 0}}, { -7219, { 953, 0}}, { -7517, { 0, 0}}, { -8383, { 0, 0}}, { -8262, { 0, 0}}, { 28, { 0, 0}}, { 16, { 0, 0}}, { 26, { 0, 0}}, {-10743, { 0, 0}}, { -3814, { 0, 0}}, {-10727, { 0, 0}}, {-10780, { 0, 0}}, {-10749, { 0, 0}}, {-10783, { 0, 0}}, {-10782, { 0, 0}}, {-10815, { 0, 0}}, {-35332, { 0, 0}}, {-42280, { 0, 0}}, {-42308, { 0, 0}}, {-64154, { 102, 0}}, {-64155, { 105, 0}}, {-64156, { 108, 0}}, {-64157, { 102, 105}}, {-64158, { 102, 108}}, {-64146, { 116, 0}}, {-64147, { 116, 0}}, {-62879, {1398, 0}}, {-62880, {1381, 0}}, {-62881, {1387, 0}}, {-62872, {1398, 0}}, {-62883, {1389, 0}}, { 40, { 0, 0}}, }; /* Full_Case_Folding: 1104 bytes. */ int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; RE_FullCaseFolding* case_folding; int count; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_full_case_folding_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_full_case_folding_stage_2[pos + f] << 5; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_full_case_folding_stage_3[pos + f] << 3; value = re_full_case_folding_stage_4[pos + code]; case_folding = &re_full_case_folding_table[value]; codepoints[0] = ch + case_folding->diff; count = 1; while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) { codepoints[count] = case_folding->codepoints[count - 1]; ++count; } return count; } /* Property function table. */ RE_GetPropertyFunc re_get_property[] = { re_get_general_category, re_get_block, re_get_script, re_get_word_break, re_get_grapheme_cluster_break, re_get_sentence_break, re_get_math, re_get_alphabetic, re_get_lowercase, re_get_uppercase, re_get_cased, re_get_case_ignorable, re_get_changes_when_lowercased, re_get_changes_when_uppercased, re_get_changes_when_titlecased, re_get_changes_when_casefolded, re_get_changes_when_casemapped, re_get_id_start, re_get_id_continue, re_get_xid_start, re_get_xid_continue, re_get_default_ignorable_code_point, re_get_grapheme_extend, re_get_grapheme_base, re_get_grapheme_link, re_get_white_space, re_get_bidi_control, re_get_join_control, re_get_dash, re_get_hyphen, re_get_quotation_mark, re_get_terminal_punctuation, re_get_other_math, re_get_hex_digit, re_get_ascii_hex_digit, re_get_other_alphabetic, re_get_ideographic, re_get_diacritic, re_get_extender, re_get_other_lowercase, re_get_other_uppercase, re_get_noncharacter_code_point, re_get_other_grapheme_extend, re_get_ids_binary_operator, re_get_ids_trinary_operator, re_get_radical, re_get_unified_ideograph, re_get_other_default_ignorable_code_point, re_get_deprecated, re_get_soft_dotted, re_get_logical_order_exception, re_get_other_id_start, re_get_other_id_continue, re_get_sterm, re_get_variation_selector, re_get_pattern_white_space, re_get_pattern_syntax, re_get_hangul_syllable_type, re_get_bidi_class, re_get_canonical_combining_class, re_get_decomposition_type, re_get_east_asian_width, re_get_joining_group, re_get_joining_type, re_get_line_break, re_get_numeric_type, re_get_numeric_value, re_get_bidi_mirrored, re_get_indic_matra_category, re_get_indic_syllabic_category, re_get_alphanumeric, re_get_any, re_get_ascii, re_get_assigned, re_get_blank, re_get_graph, re_get_print, re_get_word, re_get_xdigit, }; regex-2014.02.16/Python2/_regex_unicode.h0000666000000000000000000001602012226112251016037 0ustar 00000000000000typedef unsigned char RE_UINT8; typedef signed char RE_INT8; typedef unsigned short RE_UINT16; typedef signed short RE_INT16; typedef unsigned int RE_UINT32; typedef signed int RE_INT32; typedef unsigned char BOOL; enum {FALSE, TRUE}; #define RE_ASCII_MAX 0x7F #define RE_LOCALE_MAX 0xFF #define RE_UNICODE_MAX 0x10FFFF #define RE_MAX_CASES 4 #define RE_MAX_FOLDED 3 typedef struct RE_Property { RE_UINT16 name; RE_UINT8 id; RE_UINT8 value_set; } RE_Property; typedef struct RE_PropertyValue { RE_UINT16 name; RE_UINT8 value_set; RE_UINT8 id; } RE_PropertyValue; typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); #define RE_PROP_GC 0x0 #define RE_PROP_CASED 0xA #define RE_PROP_UPPERCASE 0x9 #define RE_PROP_LOWERCASE 0x8 #define RE_PROP_C 30 #define RE_PROP_L 31 #define RE_PROP_M 32 #define RE_PROP_N 33 #define RE_PROP_P 34 #define RE_PROP_S 35 #define RE_PROP_Z 36 #define RE_PROP_CN 0 #define RE_PROP_LU 1 #define RE_PROP_LL 2 #define RE_PROP_LT 3 #define RE_PROP_LM 4 #define RE_PROP_LO 5 #define RE_PROP_MN 6 #define RE_PROP_ME 7 #define RE_PROP_MC 8 #define RE_PROP_ND 9 #define RE_PROP_NL 10 #define RE_PROP_NO 11 #define RE_PROP_ZS 12 #define RE_PROP_ZL 13 #define RE_PROP_ZP 14 #define RE_PROP_CC 15 #define RE_PROP_CF 16 #define RE_PROP_CO 17 #define RE_PROP_CS 18 #define RE_PROP_PD 19 #define RE_PROP_PS 20 #define RE_PROP_PE 21 #define RE_PROP_PC 22 #define RE_PROP_PO 23 #define RE_PROP_SM 24 #define RE_PROP_SC 25 #define RE_PROP_SK 26 #define RE_PROP_SO 27 #define RE_PROP_PI 28 #define RE_PROP_PF 29 #define RE_PROP_C_MASK 0x00078001 #define RE_PROP_L_MASK 0x0000003E #define RE_PROP_M_MASK 0x000001C0 #define RE_PROP_N_MASK 0x00000E00 #define RE_PROP_P_MASK 0x30F80000 #define RE_PROP_S_MASK 0x0F000000 #define RE_PROP_Z_MASK 0x00007000 #define RE_PROP_ALNUM 0x460001 #define RE_PROP_ALPHA 0x070001 #define RE_PROP_ANY 0x470001 #define RE_PROP_ASCII 0x480001 #define RE_PROP_ASSIGNED 0x490001 #define RE_PROP_BLANK 0x4A0001 #define RE_PROP_CNTRL 0x00000F #define RE_PROP_DIGIT 0x000009 #define RE_PROP_GRAPH 0x4B0001 #define RE_PROP_LOWER 0x080001 #define RE_PROP_PRINT 0x4C0001 #define RE_PROP_PUNCT 0x000022 #define RE_PROP_SPACE 0x190001 #define RE_PROP_UPPER 0x090001 #define RE_PROP_WORD 0x4D0001 #define RE_PROP_XDIGIT 0x4E0001 #define RE_BREAK_OTHER 0 #define RE_BREAK_DOUBLEQUOTE 1 #define RE_BREAK_SINGLEQUOTE 2 #define RE_BREAK_HEBREWLETTER 3 #define RE_BREAK_CR 4 #define RE_BREAK_LF 5 #define RE_BREAK_NEWLINE 6 #define RE_BREAK_EXTEND 7 #define RE_BREAK_REGIONALINDICATOR 8 #define RE_BREAK_FORMAT 9 #define RE_BREAK_KATAKANA 10 #define RE_BREAK_ALETTER 11 #define RE_BREAK_MIDLETTER 12 #define RE_BREAK_MIDNUM 13 #define RE_BREAK_MIDNUMLET 14 #define RE_BREAK_NUMERIC 15 #define RE_BREAK_EXTENDNUMLET 16 #define RE_GBREAK_OTHER 0 #define RE_GBREAK_CR 1 #define RE_GBREAK_LF 2 #define RE_GBREAK_CONTROL 3 #define RE_GBREAK_EXTEND 4 #define RE_GBREAK_REGIONALINDICATOR 5 #define RE_GBREAK_SPACINGMARK 6 #define RE_GBREAK_L 7 #define RE_GBREAK_V 8 #define RE_GBREAK_T 9 #define RE_GBREAK_LV 10 #define RE_GBREAK_LVT 11 #define RE_GBREAK_PREPEND 12 extern char* re_strings[1155]; extern RE_Property re_properties[145]; extern RE_PropertyValue re_property_values[1244]; extern RE_UINT16 re_expand_on_folding[104]; extern RE_GetPropertyFunc re_get_property[79]; RE_UINT32 re_get_general_category(RE_UINT32 ch); RE_UINT32 re_get_block(RE_UINT32 ch); RE_UINT32 re_get_script(RE_UINT32 ch); RE_UINT32 re_get_word_break(RE_UINT32 ch); RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch); RE_UINT32 re_get_sentence_break(RE_UINT32 ch); RE_UINT32 re_get_math(RE_UINT32 ch); RE_UINT32 re_get_alphabetic(RE_UINT32 ch); RE_UINT32 re_get_lowercase(RE_UINT32 ch); RE_UINT32 re_get_uppercase(RE_UINT32 ch); RE_UINT32 re_get_cased(RE_UINT32 ch); RE_UINT32 re_get_case_ignorable(RE_UINT32 ch); RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch); RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch); RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch); RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch); RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch); RE_UINT32 re_get_id_start(RE_UINT32 ch); RE_UINT32 re_get_id_continue(RE_UINT32 ch); RE_UINT32 re_get_xid_start(RE_UINT32 ch); RE_UINT32 re_get_xid_continue(RE_UINT32 ch); RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch); RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch); RE_UINT32 re_get_grapheme_base(RE_UINT32 ch); RE_UINT32 re_get_grapheme_link(RE_UINT32 ch); RE_UINT32 re_get_white_space(RE_UINT32 ch); RE_UINT32 re_get_bidi_control(RE_UINT32 ch); RE_UINT32 re_get_join_control(RE_UINT32 ch); RE_UINT32 re_get_dash(RE_UINT32 ch); RE_UINT32 re_get_hyphen(RE_UINT32 ch); RE_UINT32 re_get_quotation_mark(RE_UINT32 ch); RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch); RE_UINT32 re_get_other_math(RE_UINT32 ch); RE_UINT32 re_get_hex_digit(RE_UINT32 ch); RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch); RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch); RE_UINT32 re_get_ideographic(RE_UINT32 ch); RE_UINT32 re_get_diacritic(RE_UINT32 ch); RE_UINT32 re_get_extender(RE_UINT32 ch); RE_UINT32 re_get_other_lowercase(RE_UINT32 ch); RE_UINT32 re_get_other_uppercase(RE_UINT32 ch); RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch); RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch); RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch); RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch); RE_UINT32 re_get_radical(RE_UINT32 ch); RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch); RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch); RE_UINT32 re_get_deprecated(RE_UINT32 ch); RE_UINT32 re_get_soft_dotted(RE_UINT32 ch); RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch); RE_UINT32 re_get_other_id_start(RE_UINT32 ch); RE_UINT32 re_get_other_id_continue(RE_UINT32 ch); RE_UINT32 re_get_sterm(RE_UINT32 ch); RE_UINT32 re_get_variation_selector(RE_UINT32 ch); RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch); RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch); RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch); RE_UINT32 re_get_bidi_class(RE_UINT32 ch); RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch); RE_UINT32 re_get_decomposition_type(RE_UINT32 ch); RE_UINT32 re_get_east_asian_width(RE_UINT32 ch); RE_UINT32 re_get_joining_group(RE_UINT32 ch); RE_UINT32 re_get_joining_type(RE_UINT32 ch); RE_UINT32 re_get_line_break(RE_UINT32 ch); RE_UINT32 re_get_numeric_type(RE_UINT32 ch); RE_UINT32 re_get_numeric_value(RE_UINT32 ch); RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch); RE_UINT32 re_get_indic_matra_category(RE_UINT32 ch); RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch); RE_UINT32 re_get_alphanumeric(RE_UINT32 ch); RE_UINT32 re_get_any(RE_UINT32 ch); RE_UINT32 re_get_ascii(RE_UINT32 ch); RE_UINT32 re_get_assigned(RE_UINT32 ch); RE_UINT32 re_get_blank(RE_UINT32 ch); RE_UINT32 re_get_graph(RE_UINT32 ch); RE_UINT32 re_get_print(RE_UINT32 ch); RE_UINT32 re_get_word(RE_UINT32 ch); RE_UINT32 re_get_xdigit(RE_UINT32 ch); int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints); RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch); int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints); regex-2014.02.16/Python3/0000777000000000000000000000000012300214544012712 5ustar 00000000000000regex-2014.02.16/Python3/Python31/0000777000000000000000000000000012300214544014337 5ustar 00000000000000regex-2014.02.16/Python3/Python31/_regex.pyd0000666000000000000000000106300012300213473016326 0ustar 00000000000000MZÿÿ¸@€º´ Í!¸LÍ!This program cannot be run in DOS mode. $PEL ;Sà# ®bXÀtfàêÙ pK€` °X" ‚œ.text´­®`0`.dataèaÀb²@`À.rdata0Ô0Ö@`@.eh_framXCDê@0@.bssx`€0À.edataKp.@0@.idata` €0@0À.CRT>@0À.tls  @@0À.relocX"°$B@0BU‰åSƒì‹`xf…Òt4‹`xfƒë9Úw‹…ÀtóÿЋ`xfƒë9Úvë‰$èI¦Ç`xfÇ$è;¦ƒÄ[ÉÃU‰åWVSƒì,‹u‹] ‹}ƒût=‰|$‰\$‰4$è §ƒì …Ûu‹`xf…Ò„„‰Eäèdÿÿÿ‹Eäeô[^_É vÇ$€èÜ¥£`xf…ÀtcÇ£`xf¡€xf…Àt‰|$ÇD$‰4$ÿЃì è֧誉|$ÇD$‰4$è¦ƒì …Àt†eô[^_É 1Àeô[^_É ès¥Ç 1ÀéiÿÿÿfU‰åƒìÇD$`xfÇD$`xf‹E‰$èK¥ƒøÀÉÃU‰åƒìÇD$`xfÇD$`xf‹E‰$è#¥ÉÃU‰åƒìÇ$0vfèž«R…ÀteÇD$0vf‰$è‘«ƒì…ÀtÇD$`xfÇ$xfÿЋ ä!vf…Ét1Ç$)0vfè[«R…Àt*ÇD$70vf‰$èN«ƒì…Àt Ç$ä!vfÿÐÉø맸ëâU‰åƒìÇ$0vfè«Q…Àt%ÇD$K0vf‰$諃ì…Àt Ç$xfÿÐÉÃv¸ëç‹D$‹T$¶Ãv‹L$ ‹D$‹T$ˆ ËD$D$Ãv‹T$‹D$·PÃv‹L$ ‹T$‹D$f‰ PÃv‹D$‹T$BËT$‹D$‹ËL$ ‹T$‹D$‰ ËD$‹L$ðËD$ƒè ƒø–ÀÃf1ÀËD$‹T$‰H¿ƒùwƒð ‰B¸ÃfHŸƒùvê¸Ãf‹D$P¿ƒúwƒð ËD$‹T$H¿ƒùv‰¸Ã𠉸ËD$‹T$‰ƒøIt!ÇBIƒøit)¸¹Ç iÃv¸¹Ç iÃf¸ÃfVSƒì‹t$ ‰óÁëƒûNv 1ÀƒÄ[^Ãæÿÿ‹D$$‰$ÿëuf9ðt…ÛuÛƒîƒþwÓÿ$µ€0vf°ëɺˆÁÓúˆÐƒà빺ø0ˆÁÓúˆÐƒà멺ˆÁÓúˆÐƒà뙺ÀˆÁÓúˆÐƒà뉺>ˆÁÓúˆÐƒàévÿÿÿº€ˆÁÓúˆÐƒàébÿÿÿºpˆÁÓúˆÐƒàéNÿÿÿ‹T$‹D$ƒøvf…Ò”ÀÉD$‰T$éÿÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè¨ÿÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè]ÿÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mèÿÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$MèÙþÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè—þÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$MèYþÿÿ„À•À1øƒÄ[^_ÃvWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèKýÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$Mè ýÿÿ„À•À1øƒÄ[^_ÃvVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèÈüÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè…üÿÿ„À•ÀŠT$ë¾fVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèDüÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mèùûÿÿ„À•ÀŠT$ë¶f‹D$Pöƒúv=…t=( t=) ”ÀððËD$ƒøItƒøit=0t=1”ÀÃf°ðËD$‹T$‰ƒøItIÇBIƒøit!ÇBi=0uS¸¹ Ç 1ÃÇB0¸¹ Ç 1ÃvÇBiÇB0¸ …@Ç 1ÃÇB 0=1¸uÜÊH.Q÷€úTv ‹P …Òt>öÒÿ$•œ0vff‹P(‹R…Òtè‹ëÒf‹ŠJ.ƒéF€ùwÕ‰ÐËP(‹J…ÉtÈ‹@Ãf€ùAw½¶Éÿ$ð1vf‹ŠQ.€út€úDu£‰ÈÃfUWVSƒì,Š\$@ˆ\$‹˜¤ ‹s ‹x@‹@<ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ërëC9ët¶‰$ÿÖ:D$uí‰Ú)ú‰ÐƒÄ,[^_]Ãv—,9ër ëƒÃ9Ýv ‹‰$ÿÖ:D$uì‰Ú)úÁú‰ÐƒÄ,[^_]ÃvW,O9ër ëƒÃ9Ýv·‰$ÿÖ:D$uë‰Ú)úÑú‰ÐƒÄ,[^_]ÃvUWVSƒì,Š\$@ˆ\$‹˜¤ ‹s ‹x@‹@<ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ëwëK9ët¶Cÿ‰$ÿÖ:D$uì‰Ú)ú‰ÐƒÄ,[^_]Ãf—,9ëw ëƒë9Ýs‹Cü‰$ÿÖ:D$uë‰Ú)úÁú‰ÐƒÄ,[^_]ÃfW,O9ëw ëƒë9Ýs·Cþ‰$ÿÖ:D$uê‰Ú)úÑú‰ÐƒÄ,[^_]Ãf‹D$ 9D$”ÀÃUWVSƒì‹‹R‰$ƒút?‹” ‰T$~'‹r‹Z ‹HP1Ò‹<Ö‹lÖ‰9‰i‹<“‰yBƒÁ;$uå‹L$‹‰” ƒÄ[^_]ÃWVS‹‹s$…Òtx‹ …Étm¹ë0v<[»‹x\ŸÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 r6‹Š9ÞÌ)󛋸РßÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 sÊ[^_Ã…ö~+‹P\ƒÂ1ÉÇÇBÿÿÿÿÇBÇBÿÿÿÿAƒÂ49ñuÝ‹Kx…É~Å‹€Ð ƒÀ1ÒvÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿBƒÀ(9ÊuÝ[^_ÃVS‹ˆ¸ ‹I(‹\‘‹°Ì Þ;q w ‹t‘9´¼ r1À[^Ãf˜Ø ;˜Ü –À[^Ãf‹D$‹@0@Ãv‹D$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿÃUWVSƒì‰Æ‰Ó1ÿ‹C,¨ …4€{.Zv‹ëëf¶S.ÿ$•ø2vf‹‰ðèÇÿÿÿ‰Å‹S‰ðè»ÿÿÿf9ïs‰ïf9øv‰Ç‰øƒÈ f‰C,‰øƒÄ[^_]Ãf‹C(ƒxÿ•D$„Ž‹S‰ðè|ÿÿÿ‹S(‹‹ndTU½fƒ fƒøtfƒ €|$„fƒÿ‚Df9ïs‰ïf9øv‰Ç‹C, øƒÈ f‰C,‰øƒÄ[^_]Ë¿é%ÿÿÿ‹‰ðèÿÿÿ‰Å‹S‰ðèÿÿÿf9ïs‰ï·×·È‰Ö9Ê}‰Îƒþ޽9ʌ͉úƒÊ éµv‹C(‹h‹‰ðèÁþÿÿ‹S(‹‹NdQf‹ ‰ÎƒÎf‰2fƒøtƒÉf‰ E„Ðfƒÿs¿f9øw8‰øfƒÿs0¸ë)‹S‰ðènþÿÿ‰Å‹‰ðècþÿÿ‰Â‰øf9ïs‰èf9Âv‰Ð‰ÂƒÊ f‰S,ƒÄ[^_]Ãvfƒÿƒêþÿÿ¿éàþÿÿº0¿f‰S,‰øƒÄ[^_]Ã‰ÂƒÊ ‰Çëév¿é²þÿÿf‹‰ðèïýÿÿ‰Å‹S‰ðèãýÿÿ‹S(‹‹NdQfƒý„gþÿÿé^þÿÿfƒÿƒ1ÿÿÿ¿é'ÿÿÿƒàé þÿÿSƒì‰Ã…Àu ë&€Ìf‰C,öÄu ‹C…ÀtèÜÿÿÿ‹…Ût‹C,öÄtÚƒÄ[ÃS‹‰X‰XÇ@ …Ût‰ÚfŠJ.€ùVt€ù]u‹ëïv‰P9Ót[Ãv€{.Kwõ¶S.ÿ$•d4vf‹‰P‹S ‰P [Ãf¡$`xfÿÃì,D$‰D$ D$‰D$ÇD$”5vf‹D$4‰$ÿt‚xf…Àt4‹D$‰D$‹D$‰$èàóÿÿ„À•À¶À‰D$Ç$ª5vfÿ„ƒxfƒÄ,Ãv1ÀƒÄ,ÃfÇD$ÇD$ª5vf¡„ƒxfÿàUWVSƒì\D$L‰D$ D$H‰D$ÇD$¬5vf‹D$t‰$ÿt‚xf…Àtx‹D$H¨ t|ÇD$`Êufl$,‰l$‹D$L‰$‹T$ÿR0‰Ç‰$ÿä‚xf‰Æ…ÀtC…ÿ~e1Ûë‰D$‰\$‰4$ÿì‚xfC9ûtJ‹D‰D$Ç$ª5vfÿ„ƒxf…ÀuÑ‹H‰…Àtx1ö‰ðƒÄ\[^_]èuX¨€„xÿÿÿÇD$àÊufésÿÿÿv‹D$H%"@="@uÊD$<‰D$‹D$L‰$‹T$ÿR8H~±¡”ƒxf‰D$‰4$ÿà‚xfëvÇD$ Êufé#ÿÿÿv‹F‰4$ÿP1ö‰ðƒÄ\[^_]ÃvVSƒì$‰Ã‰T$Ç$½5vfÿ„ƒxf‰Æ…Àt6‰D$‰$ÿà‚xf‹J‰…Òt ÷ÐÁèƒÄ$[^ËV‰4$‰D$ÿR‹D$ëá1ÀƒÄ$[^ÃWVSƒì‹\$ ‹|$$‰ƒûItcÇGIƒûitO¾¸ÇiÇ$ièÚ”9Øt ƒøIt‰·FÇ$IèÉ”9Øt ƒøit‰·F‰ðƒÄ[^_Ãv¾뻾¸ë§Sƒì‹D$ ‹\$$=ÿv ‰¸ƒÄ[É$èt”‰¸ƒÄ[ËD$=ÿwéX”ÃvWVSƒì‹\$ ‹|$$‰‰$è4”9Øt$¾‰G‰$è(”9Øt‰·F‰ðƒÄ[^_Ãv‹G¾ë×fSƒì‹\$ ‰$èð“ƒøIt‰$è듃øi”ÀƒÄ[ðƒÄ[ÃSƒì‹D$ ‹T$$·Øúÿw ‰ÁÁéƒùNv …Û”ÀƒÄ[Ãÿ$À5vfK”Àëìf¡0‚xfƒ8t"ÇD$‰$芓…À•À¶À9ÔÀƒÄ[á<‚xf‹·P%ëÜf1Àƒú–À9ÔÀ뛉$èÌëÀfƒú th1Àƒú ”Àë·¡0‚xfƒ8…¢¡<‚xf‹·P%f…À•À¶À9ÔÀƒÄ[Ãf¡0‚xfƒ8…ž¡<‚xf‹·P%ë̃ú_…7ÿÿÿ¸éOÿÿÿ¡0‚xfƒ8…"¡<‚xf‹·Pƒàëšf¡0‚xfƒ8…z¡<‚xf‹·Pƒàéwÿÿÿv¡0‚xfƒ8…¡<‚xf‹·P%WéQÿÿÿ¡0‚xfƒ8…¡<‚xf‹·Pƒàé/ÿÿÿvƒø"w'ÿ$…ü6vf¡0‚xfƒ8…A¡<‚xf‹·Pƒà…Àuûÿÿ”ÀéPþÿÿƒê0ƒú wê°éAþÿÿ¡0‚xfƒ8…¡<‚xf‹·Pƒà ëÁ¡0‚xfƒ8…¼¡<‚xf‹·Pƒà룡0‚xfƒ8…³¡<‚xf‹·Pƒàë…ÇD$‰$è‘ésþÿÿvÇD$‰$èx‘é[þÿÿvÇD$W‰$è`‘éCþÿÿvÇD$‰$èH‘é+þÿÿvÇD$‰$è0‘éþÿÿvÇD$‰$è‘éûýÿÿÇD$‰$è‘éâþÿÿÇD$‰$èîéÍþÿÿÇD$‰$èÙé¸þÿÿÇD$ ‰$èÄé£þÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè¨üÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè]üÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mèüÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$MèÙûÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè—ûÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$MèYûÿÿ„À•À1øƒÄ[^_Ãv‹D$‹T$ƒøIt#ƒøit=0t=1t‰T$‰D$é+Žv‰¸Ãévƒì·À‰$ÿŒƒxff=êwf=èr9°ƒÄÃvf=ôv-ùfƒøvæ1ÀƒÄÃf=òsÙ-ìfƒøvÎ1ÀëævfƒøotÁwfƒøet¹fƒøit³fƒøat­1ÀëÅffƒøut¡r¹-àfƒøv”1Àë¬UWVSƒìL‰Ã‰Ö‰Í‹¸¨ ‹P@…ö~n;pDŒ™Fÿ‰D$‰$ÿ׉D$Ç$Mèëÿÿ„À•Â;sD|F1À‰é8Ñt+8Á”ÀƒÄL[^_]Ã|$( t ƒ|$(…¯ƒ|$8 …¤1ÀƒÄL[^_]Ãf1Ò;sD}º‰t$‹C@‰$ˆT$ÿ׉D$Ç$Mè‘êÿÿ„À•ÀŠT$ë‘f‰t$‰$‰T$ÿ׉D$$Nÿ‰L$,‰L$‹C@‰$ÿ׉D$ ‹D$$‰$èÔo‰D$(‹D$ ‰$èÄoƒø‹T$„ ƒø„ ƒø„ƒ|$(„ùƒ|$(„îƒ|$(„ãƒ|$(„1ÿÿÿƒ|$( „&ÿÿÿ‹D$,…Àˆ‰\$4‹\$,‰t$8‰éˆL$?‰Õf‰\$‰,$ÿ׉Ɖ$è9oƒøtƒø uKƒûÿu݉t$ ‰D$0‰ê‰\$,‹\$4‹t$8¶l$?ƒø „Í‹D$,…Àx ƒ|$ '„rF;sDœ‰éˆL$4‰Ý‰Óf‰t$‰$ÿ׉$èËnƒøtƒø uN9uD߉D$8‰Ú¶l$4ƒ|$0 „?þÿÿ‹\$,KˆG‰Ö‰êˆT$,‹l$0f‰\$‰4$ÿ׉$è{nƒøtƒý uKƒûÿuß¶l$,ƒø „7ƒ|$0„òƒ|$0 „çƒø„?ƒ|$0„Wƒ|$0 „pƒ|$0 …wƒ|$(„Êýÿÿƒ|$0u!ƒ|$( „¸ýÿÿƒ|$(„­ýÿÿƒ|$( „¢ýÿÿ‹D$ ‰D$Ç$MèRèÿÿˆÃ‹D$$‰D$Ç$Mè<èÿÿ‰ê8Ó„nýÿÿ8ДÀé>ýÿÿƒ|$(„Yýÿÿ‹D$ ‰D$Ç$Mè èÿÿˆÃ‹D$$‰D$Ç$Mèóçÿÿ‰ê8Ó„%ýÿÿ8”ÀƒÄL[^_]Ã|$(„ ýÿÿƒ|$0…ÿÿÿƒ|$( …øþÿÿ1Àéòüÿÿƒ|$( …(þÿÿ1Àéàüÿÿƒ|$0 t ƒ|$0…·þÿÿƒ|$( „Áüÿÿ¸ é¢þÿÿ‹D$0ƒè ƒø‡±þÿÿƒ|$(…¼þÿÿ1Àé—üÿÿ‹D$(ƒè ƒø‡¯þÿÿƒ|$8…¤þÿÿ1Àétüÿÿfƒ|$( …þÿÿ1Àé`üÿÿƒ|$0„~þÿÿƒ|$0 „sþÿÿƒ|$0…›þÿÿécþÿÿ‹D$$‰T$è#ûÿÿ„À‹T$„uýÿÿ°éòûÿÿÇD$0éaýÿÿ1ÀéïýÿÿÇD$8éýÿÿv1É‹T$‹D$éiûÿÿ¹‹T$‹D$éVûÿÿfUWVSƒì,‹|$@‹G0@‰$ÿ\ƒxf‰Å…Àtq‹G$‰D$‹G ‰D$Ç$ˆ7vf¡„ƒxf‰D$ÿÐ…Àt@‰E ‹G0…À~P1ö1ÛëfC‰D ƒÆ9_0~;‹G4ð‹P‰T$‹‰D$Ç$ˆ7vfÿT$…ÀuÒ‹EH‰E…Àt1í‰èƒÄ,[^_]ÃvÿE‰o8‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]ÃvUWVSƒì,Ç$hÿ\ƒxf‰Æ…ÀtN1Ûl$‹=xƒxfë‰D$‰\$‰4$ÿdƒxfCƒûht)f‹„@ìuff‰D$ÇD$‰,$ÿ×…ÀuË‹H‰…Àt1ö‰ðƒÄ,[^_]Ãf‹F‰4$ÿP1ö‰ðƒÄ,[^_]Ãvƒì€xAt ‰$ÿ|‚xfƒÄÃfVSƒì$‰Ö‰$ÿÜ‚xf‰Ã…Àt.‰t$‰$ÿ$ƒxf‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ã1ÀëõVSƒì‰Ã‰Ö¡ `xf…À„®ƒÃƒûv"ÇD$9vf¡Ð‚xf‹‰$ÿÀ‚xffƒÄ[^Ãfÿ$@9vfÇD$28vf¡Ð‚xf‹‰$ÿÀ‚xfëÖf‹F‹@ ‰D$ÇD$|8vf¡Ô‚xf‹‰$ÿ´‚xfë°‹F‹@ ‰D$ÇD$Ì8vf¡Ô‚xf‹‰$ÿ´‚xf댋F‹@ ‰D$ÇD$¤8vf¡Ô‚xf‹‰$ÿ´‚xféeÿÿÿÇD$7vf¡ `xf‰$ÿÀ‚xféIÿÿÿÇD$D8vf¡Ô‚xf‹‰$ÿÀ‚xfé+ÿÿÿvÇD$ð8vf¡Ì‚xf‹‰$ÿÀ‚xfé ÿÿÿv…ö„¨‹F‹@ ‰D$ÇD$Ð7vf¡Ô‚xf‹‰$ÿ´‚xféÙþÿÿÇD$d8vf¡ `xf‰$ÿÀ‚xfé½þÿÿÇD$þ8vf¡ `xf‰$ÿÀ‚xfé¡þÿÿ¡¸‚xfƒÄ[^ÿàÇD$³7vf¡Ø‚xf‹‰$ÿÀ‚xféwþÿÿvº‹7vf¸‘7vfèåýÿÿ£ `xfé9þÿÿvÇD$8vf¡Ô‚xf‹‰$ÿ´‚xfé;þÿÿvUWVSƒì‹\$0‹D$4…ÀˆÕ;C0Ì…À„€t@ý‹C44ð‹F‰$ÿä‚xf‰Ç…À„—‹F…À„Œ1Û‹-„ƒxfëv‹W ‰šC9^vsÝF‹P‰T$‹‰D$Ç$ˆ7vfÿÕ…ÀuЋH‰…Àtk1ÿ‰øƒÄ[^_]ÃvÇ$ÿä‚xf‰Ç…Àt$‹C$‰D$‹C ‰D$Ç$ˆ7vfÿ„ƒxf…Àt¶‹W ‰‰øƒÄ[^_]Ãv1Ò¸òÿÿÿèýÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÎvUWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpt@ý‹K44ñ‹F‰$ÿä‚xf‰Ç…À„€‹V…Òty1Û‹-„ƒxfëv‹W ‰šC9^v`‹F‹D؉D$Ç$ª5vfÿÕ…ÀuÜ‹H‰…Àtc1ÿ‰øƒÄ[^_]ÃvÇ$ÿä‚xf‰Ç…Àt‹C$‰D$Ç$ª5vfÿ„ƒxf…Àt½‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿèüÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì‹\$0‹D$4…Àˆ±;C0¨…Àtht@ý‹{44÷‹F‰$ÿä‚xf‰Ç…Àt|‹^…Ûtu1Û‹-„ƒxfëv‹W ‰šC9^v\‹F‹؉D$Ç$ª5vfÿÕ…ÀuÝ‹H‰…Àt`1ÿ‰øƒÄ[^_]ÃÇ$ÿä‚xf‰Ç…Àt‹C ‰D$Ç$ª5vfÿ„ƒxf…ÀtÀ‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿè ûÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì,‰Ã‰Õ…Àt*…Òt.‰Ç1ö¡ƒxf‰D$‹G‰$ÿT$FƒÇ9îuî‰$ÿT$ƒÄ,[^_]áƒxf‰D$ëæUWVSƒì,‰Ã‰T$…Àt.…Ò~2‰Æ1ÿ‹-ƒxf‹F‰$ÿÕ‹F‰$ÿÕGƒÆ4;|$uæ‰$ÿÕƒÄ,[^_]Ë-ƒxfëëSƒì‰Ã‹€¸9 t ÿÈ‚xf‰CƒÄ[Ãì‹€º9 t ‹@‰$ÿÄ‚xfƒÄÃfVSƒì‰Ã‰ÖèÒÿÿÿ‰4$ÿƒxf‰ØƒÄ[^ë Sƒì(‰ÓÁë=`Êuf„¤=àÊufBÿ„¶ƒøwI‹0‚xfƒ;tZÇD$‰ $‰L$è‹L$…ÀuPƒ;tUÇD$‰ $襅À•ÀƒÄ([Ãvƒëƒûv¯‰L$‰$è¤íÿÿƒÄ([Ãv¡<‚xf‹·Hƒà…Àt°°ƒÄ([Ãv¡<‚xf‹·Hƒàë«Bÿƒøv@ƒëƒûv,‰L$‰$èÞÿÿëÊfƒøv#ƒëƒûv‰L$‰$èÃÞÿÿë­‰ $è,fë¢f‰ $èdbHƒø–ÀëvUWVSƒì,‹T$@‹R‰T$…Ò„Ê‹L$@‹Y‹q‹A0‰D$…À~c‹i4ÇD$f‹E…Àx9Ã~‰Ã‹E…Àx9Æ}‰Æ‹}…ÿt$‹E‹‹P1À…Éx9Ë~‰Ë…Òx9Ö}‰Ö@9øuçÿD$ƒÅ‹T$9T$uª‰t$‰\$‹L$‰ $ÿ<ƒxf…Àt9‹L$@‹Q …Òt ‹ I‰ …Ét?‹T$@‰B ‰Z‹B…Àt ‹J‰…Òt‹L$@ÇA¡”ƒxfÿƒÄ,[^_]ËP‰$ÿRëÛ‹J‰$‰D$ÿQ‹D$ë®vUWVSƒì‹t$0‹D$4…Àˆá;F0Ø…À„ˆ|@ý‹F4<ø‹G‰$ÿä‚xf‰Å…À„¥‹G…À„š1Ûë‹U ‰šC9_†…ÝG‹V‹H)щL$‹)ЉD$‹F ‰$ÿ<ƒxf…Àu‹EH‰E…Àto1í‰èƒÄ[^_]ÃvÇ$ÿä‚xf‰Å…Àt*‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿ<ƒxf…Àt®‹U ‰‰èƒÄ[^_]Ã1Ò¸òÿÿÿèÜöÿÿ1í‰èƒÄ[^_]ËE‰,$ÿP1íëÐvWVSƒì ‰Ã€x ‹BtCö@W„ÿ‰×‹…Àt_‰|$‰$ÿà‚xf‰Æ…Àˆ‹H‰…À„¿‰ðƒÄ [^_Ãfö@WuÁ‰$‰T$ÿ€‚xf‰Ç…À‹T$u®¸íÿÿÿèEöÿÿ¾íÿÿÿëÇf‹C…À„éÇ$ÿä‚xf‰…Àt"‹@ ‹S‰ÇC‹‹@ ‰x1ö‰ðƒÄ [^_þ÷ÿÿÿ‹H‰…Àtz‹…Àt ‹J‰…Ò„ƒ‹C…Àt ‹J‰…Òtg1Ò‰ðèÂõÿÿ‰ðƒÄ [^_ËG‰<$ÿP‰ðƒÄ [^_Ãf‰$‰T$ÿpƒxf‰Ç…À‹T$…èþÿÿ¸îÿÿÿèõÿÿ¾îÿÿÿéþþÿÿ‹G‰<$ÿPéxÿÿÿf‹P‰$ÿR뎋P‰$ÿRéoÿÿÿf‰{1öéÇþÿÿfVSƒì$‰Ã‹…À„ï€{…Å€{ uCÇ$Œ9vfÿ„‚xf‰Æ‹…ö„’‰D$‰4$ÿˆƒxf‹J‰…ÒtG‹‹ I‰ …ÉtXƒÄ$[^ÃvÇD$Ç$ÿxƒxf‰Æ‹…ötK‰D$‰4$ÿ|ƒxf‹J‰…Òu¹‹V‰4$‰D$ÿR‹D$‹‹ I‰ …Éu¨‹J‰$‰D$ÿQ‹D$ƒÄ$[^Ãf‹J‰…Òt1ÀƒÄ$[^Ãv‰$ÿè‚xfé-ÿÿÿf‹P‰$ÿR1Àé[ÿÿÿ‹C…À…Pÿÿÿ€{ uÇ$Œ9vfÿ„‚xfé8ÿÿÿÇD$Ç$ÿxƒxféÿÿÿf‹D$‹@,‰D$¡”‚xfÿàfSƒì‹\$ ‹C…Àt ‹J‰…Òtl‹C …Àt ‹J‰…ÒtP‹C‹J‰…Òt8‹C4…Àt ‰$ÿƒxf‹C8…Àt‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒxfƒÄ[ÿà‹P‰$ÿR뽋P‰$ÿR륋P‰$ÿRë‰UWVSƒì,‰Ç‹€´ …Àt ‰$ÿTƒxf‹‡x …Àt"‹-ƒxfëf‰Ø‹˜ ‰$ÿÕƒ¯ˆ @…Ûuè‹7‹Ÿ …Ût.‹-ƒxfë‰Ã‹C‹S‰$‰D$ÿÕ‹S ‰$ÿÕ‰$ÿÕ‹D$…ÀuÚ‹Ÿ˜ …Ût)‹-ƒxfë‰Ë‹K‹V$‹C‰L$èø÷ÿÿ‰$ÿÕ‹L$…Éuß‹Fp…À„4‹V‹GPè‰÷ÿÿ‹Ft…À„‹V$‹G\è¿÷ÿÿ‹Ÿà …Ût5‹-ƒxfë‰Ë‹K‹V‹C ‰L$èL÷ÿÿ‹V$‹Cè÷ÿÿ‰$ÿÕ‹L$…ÉuÔ‹FT…À~-1À1Û‹-ƒxfv‹—è ‹T‰$‰D$ÿÕC‹D$ƒÀ9^Tà‹‡è …Àt ‰$ÿƒxf‹‡Ð ‰D$…Àt>‹vx‰t$…öŽ“‹\$1ö‹-ƒxf‹C‰$ÿÕ‹C‰$ÿÕFƒÃ(;t$uæ‹D$‰$ÿÕ‹‹J‰…ÒtN‹G‹J‰…Òt6€¿3 t ƒÇ‰<$ÿ|‚xfƒÄ,[^_]ËG\‰Ftéîþÿÿ‹GP‰FpéÌþÿÿ‹P‰$ÿRë¿‹P‰$ÿRë§‹-ƒxfë‹Sƒì‹\$ C èÐýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒxfƒÄ[ÿàSƒì‹\$ C èœýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒxfƒÄ[ÿàWVSƒì ‰Ã‰T$Ç$ª5vfÿ„ƒxf‰Æ…Àt=‰$ÿ4ƒxf‰Ç‹H‰…Àt5…ÿt%‰|$‰$ÿà‚xf‹J‰…Òt'÷ÐÁèƒÄ [^_Ãv1ÀƒÄ [^_Ãv‹F‰4$ÿPëÀ‹W‰<$‰D$ÿR‹D$ëÆWVSƒì ‹t$0Ç$ÿä‚xf‰Ã…Àtº9vfèâÿÿ„Àu)‹H‰…Àt 1ÀƒÄ [^_Ãv‹C‰$ÿP1ÀƒÄ [^_Ãf‹V ‰Øèÿÿÿ„Àtɺ©9vf‰ØèVâÿÿ„Àt¹‹V$‰Øèüþÿÿ„Àt«º¬9vf‰Øè8âÿÿ„Àt›‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿ<ƒxf‰Æ…À„pÿÿÿ‰$ÿ4ƒxf‰Ç‹H‰…À„˜…ÿ„Pÿÿÿ‰|$‰$ÿà‚xf‰Æ‹J‰…Ò„‚…öˆ,ÿÿÿº¶9vf‰Øè¹áÿÿ„À„ÿÿÿÇD$Œ9vfÇ$½5vfÿ„ƒxf‰Æ…À„ùþÿÿ‰\$‰$ÿ|ƒxf‹J‰…Òt?‹J‰…Ò…áþÿÿ‹S‰$‰D$ÿR‹D$éËþÿÿ‹F‰4$ÿPéZÿÿÿ‹G‰<$ÿPépÿÿÿ‹V‰4$‰D$ÿR‹D$ë®fUWVSƒì<‹t$PÇ$ÿä‚xf‰Ã…Àtº¸9vfèáÿÿ„Àu(‹H‰…Àt 1ÀƒÄ<[^_]ËC‰$ÿP1ÀƒÄ<[^_]ËF‰$‹-4ƒxfÿՉDžÀtĉD$‰$¡à‚xf‰D$ÿЋJ‰…Ò„I…Àx¡ÇD$$1À1ÿëPvºÅ9vf‰Øè€àÿÿ„Àt€ºÒ9vf‰Øèpàÿÿ„À„lÿÿÿ‹D$$‹Å Xvf‰ØèVàÿÿ„À„RÿÿÿG‹D$$@‰D$$ƒø w'‹Å$Xvf…F tæ…ÿt£ºÎ9vf‰Øè#àÿÿ„Àu£éÿÿÿfÇD$$‰÷D$,‰D$ D$(‰D$D$$‰D$‹G4‰$ÿ ‚xf…À„ º©9vf‰ØèÖßÿÿ„À„Òþÿÿ‹D$(‰D$‰$ÿT$…Àˆ»þÿÿ‹D$,‰$ÿՉƅÀ„¨þÿÿºÙ9vf‰Øè˜ßÿÿ„À„”þÿÿ‰t$‰$ÿT$‹J‰…Òt…À‰fÿÿÿésþÿÿv‹V‰4$‰D$ÿR‹D$ëÝ‹W‰<$‰D$ÿR‹D$é¡þÿÿºÛ9vf‰Øè6ßÿÿ„À„2þÿÿÇD$Œ9vfÇ$½5vfÿ„ƒxf‰Æ…À„þÿÿ‰\$‰$ÿ|ƒxf‹J‰…Òt#‹J‰…Ò…ûýÿÿ‹S‰$‰D$ÿR‹D$éåýÿÿ‹V‰4$‰D$ÿR‹D$ëÊvUWVSƒì‹\$0‹K@…ÉŽ 1ÿ‹-ƒxfë ‰4$ÿÕG9{@~/‹CD‹4¸‹F(‰$ÿÕöF-tá‹F‰$ÿÕ‹F‰$ÿÕ‰4$ÿÕG9{@Ñ‹CD‰$ÿÕ‹CL‰$ÿÕ‹CX‰$ÿÕ‹Cd‰$ÿÕ‹S‹Cpè»ðÿÿ‹S$‹Ctèüðÿÿ‹S…Òt ‰$ÿƒxf‹C…Àt ‹J‰…Òtx‹C,…Àt ‹J‰…Òt\‹C0…Àt ‹J‰…Òt@‹C4‹J‰…Òt(‹C8‹J‰…Òu ‹P‰$ÿR‰\$0¡ ƒxfƒÄ[^_]ÿà‹P‰$ÿRëÍ‹P‰$ÿR뵋P‰$ÿR뙋P‰$ÿRézÿÿÿ‹-ƒxféÿÿÿvVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F@‰$ÿ–¨ ƒø tƒè ƒø–ÀƒÄ[^Ã;^D}ȉ\$‹F@‰$ÿ–¨ ƒø •Àë²vVSƒì‹\$ ‹t$$9sD °ƒÄ[^Ãf‰t$‹C@‰$ÿ“¨ ƒø tƒè ƒø–ÀƒÄ[^Ã…öÎN‰t$‹C@‰$ÿ“¨ ƒø •Àë·vVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F@‰$ÿ–¨ ƒø t PöƒúvÕ=…tÎ=( tÇ=) ”Àë¿;^D}¸‰\$‹F@‰$ÿ–¨ ƒø •Àë¢vVSƒì‹\$ ‹t$$9sD °ƒÄ[^Ãf‰t$‹C@‰$ÿ“¨ ƒø t#PöƒúvÙ=…tÒ=( tË=) ”ÀëÃv…öºN‰t$‹C@‰$ÿ“¨ ƒø •Àë£vVSƒì$‹D$4‹\$89Øt;t$‰t$‰$‹D$0ÿP0ƒø~;\$tºëv;–tB9Âuö1ÀƒÄ$[^Ãf°ƒÄ$[^ÃUWVSƒì ‰Å‰Ó‰Ï1ö…Òu ë"v‹…Ût‰ù‰Ú‰èè:C/uêƒö‹…Ûuç‰ðƒÄ [^_]ÃvSƒìŠZ.ƒë €û:v 1ÀƒÄ[Ãf¶Ûÿ$à9vff‹Z$…Ûtä‹R(9 tz1Àëf9 ‚to@9ØuöëË‹B(9”ÀƒÄ[Ãv‰L$‹R(‹‰$ÿƒÄ[ËB(‹P;r9Ñ–Àë˜v‹RƒÄ[ëcv‹RƒÄ[錋RƒÄ[éÿÿÿ‹RƒÄ[ë v°é^ÿÿÿWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè+ÿÿÿ:C/uê°[^_Ã1À[^_ÃfWVS‰Ç‰Ó‰Îè ÿÿÿ:C/t1À[^_Ãv‰ñ‰Ú‰øèñþÿÿ:C/tç‹…Ûuê°[^_ÃWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè¿þÿÿ:C/tê1À[^_ð[^_ÃfUWVSƒì,‰D$‰Ó‰L$‹|$@…É~O1öŠC.ƒè <:v °ƒÄ,[^_]öÀÿ$…Ì:vff‹S$…Òt‹,·‹K(;)tÙ1Àëv9,tÍ@9ÐuöF;t$u·v1ÀƒÄ,[^_]Ãf‹ ·‹S‹D$èÝþÿÿ„ÀuŸF;t$uŽëØ‹ ·‹S‹D$èÉýÿÿ„ÀuƒF;t$…nÿÿÿ븋 ·‹S‹D$è ÿÿÿ„À…_ÿÿÿF;t$…Jÿÿÿ딋 ·‹S‹D$è±þÿÿ„À…;ÿÿÿF;t$…&ÿÿÿémÿÿÿ‹·‹C(‹H;‚Qÿÿÿ9ʆÿÿÿF;t$…üþÿÿéCÿÿÿv‹·‰D$‹C(‹‰$‹T$ÿ„À…áþÿÿF;t$…Ìþÿÿéÿÿÿv‹C(‹9·„ÀþÿÿF;t$…«þÿÿéòþÿÿfUWVSƒì<‰Ç‰Ót$ ‰t$‰ $ÿP0‰ÅŠC.ƒè3< w'¶Àÿ$…¸;vf‹[‰4$‰é‰Ú‰øèGþÿÿ:C/„ÁfÆD$ŠD$ƒÄ<[^_]Ãv‹[…Ûu ëãv‹…ÛtÚ‰4$‰é‰Ú‰øèþÿÿ:C/uçÆD$ŠD$ƒÄ<[^_]Ãf‹[ÆD$…Ûu ë«€t$‹…Ût ‰4$‰é‰Ú‰øèÉýÿÿ:C/uçëàf‹[…Ûu ë´v‹…Ût«‰4$‰é‰Ú‰øè ýÿÿ:C/tçéZÿÿÿf‰4$‰é‰Ú‰øè†ýÿÿ:C/„Aÿÿÿ‹…ÛuãéoÿÿÿfUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øè{þÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèBþÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øè~ýÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèEýÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfSŠZ.ƒë2€ûv1À[öÛÿ$ð;vff‹R[é³úÿÿv‹R[é¯ùÿÿv‹R[éûÿÿv‹R[éÃúÿÿvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øèGÿÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèÿÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèÑþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øèJþÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèÔýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰Ã‰Ö‹€¨ ‹S@€~.Aw¶~.ÿ$½0Kt[^_ÃvÐÖ9ðs%1Û€8 •Ãçÿ9ûtë1É€8 •Á9Ùu@9ðuï)Ð[^_ʲ9Øs)1Ƀ8 •Á‰Îçÿ9þtë1Ƀ8 •Á9ñuƒÀ9Ãwí)ÐÁø[^_ÃJr9Øs.1Éfƒ8 •Á‰Îçÿ9þtëv1Éfƒ8 •Á9ñuƒÀ9Ãwì)ÐÑø[^_ÃWVS‰Ã‰È‹t$¶|$ƒû„‹ƒûtBKt[^_ÃvÐÖ9ðv*1Û€xÿ •Ãçÿ9ûtëv1É€xÿ •Á9ÙuH9ðuî)Ð[^_ʲ9Øv.1Ƀxü •Á‰Îçÿ9þtëv1Ƀxü •Á9ñuƒè9Ãrì)ÐÁø[^_ÃvJr9Øv/1Éfƒxþ •Á‰Îçÿ9þtëf1Éfƒxþ •Á9ñuƒè9Ãrë)ÐÑø[^_ÃvWVSS‰Ã‰Ï‹D$‹t$ŠL$8L$ ”D$‹ƒû„ˆƒûtGKtZ[^_ÃvÐÖ9ðs,¶9ٔöۉ߶\$9ßtë¶9ٔöÛ9ûu@9ðuì)ÐZ[^_Â4²9ðs(1Û;”Éß¶\$9ßtëf1Û;”Ã9ûuƒÀ9Æwî)ÐÁøZ[^_ÃB4r9ðs0·9ٔöۉ߶\$9ßtëf·9ٔöÛ9ûuƒÀ9Æwê)ÐÑøZ[^_ÃUWVSƒì<‰Ã‹|$P‹l$T‹@@‰D$8L$X”Á‹ƒ¤ t$ ‰t$‹‰$ˆL$ÿP0‹S<ƒúŠL$„·ƒút^Jt ‰øƒÄ<[^_]Ã|$l$9ïs2‹T$ ‰T$Š…À~¶Û;\$t)1Òë;–tB9Âuö1Ò8ÑuG9ïu×+|$‰øƒÄ<[^_]òëä‹T$<º,ª9ïs1‹T$ ‰T$f‹…À~;\$t,1Òë;–t#B9Âuö1Ò8ÑuƒÇ9ýwÙ+|$Áÿ‰øƒÄ<[^_]òëà‹T$vf¡Ô‚xf‹‰$ÿÀ‚xf1ÀƒÄÃfÇD$h>vfëÞfVSƒì$‰Ã‹@ö@Wt$‹C ‰B4‹C‰B8ÇB<ÆB@ÆBA°ƒÄ$[^Ë@PÇBÿÿÿÿ…À„ž‹…À„”ÇD$‰T$‰$‰T$ÿÐ…À‹T$xwÆBA‹r‹‰B4…À„ƒ…öxk‰$‰T$ÿ8ƒxf‹KöAW‹T$u-9Æt)‰$ÿ|‚xfÇD$?vf¡Ô‚xf‹‰$ÿÀ‚xf1ÀƒÄ$[^ÃÇB<‰B8ÆB@°ƒÄ$[^ÃfÇD$Î>vfëÆf‰$ÿ|‚xfÇD$÷>vf뱉$ÿ|‚xfÇD$è>vf¡Ø‚xf‹‰$ÿÀ‚xf1ÀéÿÿÿWVSƒì`ˆÓT$èÃþÿÿ„Àtv‹D$XƒøtfƒøtHtVD$轸ÿÿ¸ÿÿÿÿƒÄ`[^_ÿ°tf‹D$T…À~¶Û1öf‰t$‹D$P‰$ÿ×9ØtÅF9t$TèD$è{¸ÿÿ‹D$TƒÄ`[^_ÿTtf뾿€tf붸ÿÿÿÿë¢fSƒì‰$ÿƒxf‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿè¸ÿÿ‰ØƒÄ[ÃUWVSƒìL‰D$‰T$$ˆL$‹r$ƒþ °ƒÄL[^_]Ëz(¸èžÿÿÿ‰D$,µèŽÿÿÿ‰D$ ‹T$,…Ò„°…À„¨1À‹T$,‰4‚@=uõ»l$0‰t$‰|$‹|$,ëf%ÿ‰4‡C;\$tB‹t$)Þ‹T$‹Dšü€|$t܉l$‰$‹T$ÿR0…À~Ò1Ò‹L•áÿ‰4B9ÂuîC;\$u¾‹t$‹|$€|$…±ÇD$¬tfnþƒî‰t$(ÆD$ÇD$»‰ðØx$T‹—‰T$‹‡‰D$‹D$‰$ÿT$„ÀtuKuÖ­…öxs‹‰D$‹·‰D$‹D$‰$ÿT$„ÀtVN€|$…މt$(ÆD$‹\$K…íy‹D$,‹T$$‰B‹D$ ‰B°ƒÄL[^_]ÃÇD$hEtféJÿÿÿfN‹\$KéYÿÿÿ‰è)ð‹T$ ‰M€|$uN…öxÿD$ÆD$ë‹t$(…öyì…íx™‹T$ ‰è)ð‰ªMNƒýÿuòë…ÆD$érÿÿÿ‹D$,‰$‹ƒxfÿÓ‹D$ ‰$ÿÓ1ÀéüýÿÿvUWVSƒì<‰Æ‰Ó‰L$‹(‹R$‰ÈÐ;D$PXöC,€„Ü‹{…ÿtU‹E@‰D$ ‹K(‹[‰\$rÿµ‹‰D$‹D$P)Љ$‹E<ƒø„¾ƒø„ÍH„†¸ÿÿÿÿƒÄ<[^_]Ëu@‰t$‹K(‹‹D$P)Ћu<ƒþ„Vƒþ„NuÈ‹t$t$‹l$Å9îv ë´fF9õr­¶9Ãuôƒúv!¶F;Auæ¸ë v¶<;üÿÿ@ÁàèŠÖÿÿ‰Æ‰C\…À„üÿÿ‹E$@ Áá1À‰÷óªéýÿÿ‹T$,éwûÿÿUWVS쌉D$(‰Ó‰ÎŠ„$¨ˆD$.Š„$°ˆD$/¶¬$´¶¼$¸T$<‰ÈèYÔÿÿ„Àu 1ÀÄŒ[^_]öT$|‹CèóÓÿÿ„Àtoçÿ‰|$åÿ‰l$¶D$/‰D$‹„$¬‰D$¶D$.‰D$ ‹„$¤‰D$‹„$ ‰D$D$<‰$‰ñ‰Ú‹D$(èùÿÿ„Àt°ÄŒ[^_]ÃvD$<è×ÿÿ1ÀÄŒ[^_]Ãfƒì‹T$ ‹D$$…ÀxQ;B0L…Àt(D@ý‹J4Á‹P‰T$‹‰D$Ç$ˆ7vfÿ„ƒxfƒÄËB$‰D$‹B ‰D$Ç$ˆ7vfÿ„ƒxfƒÄÃ1Ò¸òÿÿÿè¼ÿÿ1ÀƒÄÃfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹@‰D$ÇD$ª5vf¡„ƒxfƒÄ ÿà‹B$ëäv1Ò¸òÿÿÿèdÿÿ1ÀƒÄ Ãfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹‰D$ÇD$ª5vf¡„ƒxfƒÄ ÿàf‹B ëãv1Ò¸òÿÿÿè ÿÿ1ÀƒÄ ÃfWVSƒì ‰Ã‰ÖIt‰Ðè8Ôÿÿ‰Ç…À„Š…ö~'f‹fúÿwL1É1Àëf‰Áf‹Cfúÿw7ˆ@9ðuë‰t$‰|$Ç$%?vfÿ„ƒxf‰<$‰D$ÿƒxf‹D$ƒÄ [^_Ãf‰<$ÿƒxf1ÀƒÄ [^_Ãf‰T$‰D$Ç$%?vfÿ„ƒxfƒÄ [^_Ã1ÀëÃUWVS위$Œ‰D$ „$ˆ‰D$ÇD$(?vf‹„$´‰$ÿt‚xf…À„œö„$ˆu‹´$Œÿ‰ðÄœ[^_]ÃT$8‹„$ŒèpÑÿÿ„À„d‹D$t‰D$ ƒø„ǃøt"H„ËD$8èZ‹ÿÿ1ö‰ðÄœ[^_]ÃvÇD$(°tf‹„$ˆ¨ u¨…¥¨€…ɾ`Êufƒ|$ „¨ƒ|$ „ƒ|$ uŸÇD$dtföÄ@‹D$pt@¯D$ èŒÒÿÿ‰Ã…À„wÿÿÿö„$‰@„À‹v8‰t$,‹t$p…öŽg1í1ö|$|‰l$‹D$l‰$ÿT$(‰|$‰$ÿT$,‰D$…À~,1Ò‰l$$‰Ý‰Ó‹Ÿ‰D$‰D$‰,$ÿT$C;\$uä‰ë‹l$$t$E9l$p§€|$x„‰t$‰$ÿxƒxf‰Æ‰$ÿƒxfD$8è+Šÿÿ‰ðÄœ[^_]Ãf1ö‰ðÄœ[^_]Ën4‹t$p…ö~ª1ÿ‹t$(‰l$‹l$v‰|$‹D$l‰$ÿÖ‰$ÿT$‰D$‰|$‰$ÿÕG‹D$p9øÖ‰Æéhÿÿÿv‹L$ ‰ò‰Øè ýÿÿ‰ÆékÿÿÿÇD$(€tfé[þÿÿvÇD$(TtféKþÿÿv¾ Êufé_þÿÿfÇD$¼tféuþÿÿvÇD$tféeþÿÿv¾àÊufé3þÿÿ1öéôþÿÿvUWVSƒìL‰D$$‰T$(‰Î‹\$`‹l$d‹D$hƒèƒø‡?‹<…ÌWvf‹…ØWvf‰D$,‹D$$‹€¤ ‰D$ ‹@,9뾉l$‰õ‰Æë fC;\$„¡‰\$‰,$ÿ׉$ÿÖ„Àtã‰î‹l$‹T$ ‹R<‰T$‰\$‰4$ÿ×T$0‰T$‰$ÿT$‰D$…ÀŽÛC‰D$ 1ÿëvG;|$„’‹D¼0‰D$‰\$‰4$ÿT$,‹T$h‰T$‰l$‹D$ ‰$‰ñ‹T$(‹D$$èÿÿÿ…Àt¼ƒÄL[^_]Éî‹l$‹D$$€¸2 u]‹L$h‰ê‰ðèxûÿÿ‰Ã…Ût_‰\$‹T$(‰$ÿ@ƒxf‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄL[^_]ÃvÇD$,dtf¿TtféÁþÿÿf‰l$‰4$ÿxƒxf‰Ãë¡1Àë̸÷ÿÿÿëÅSƒì‰T$‰$ÿƒxf‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿèä‡ÿÿ‰ØƒÄ[ÃUWVSƒì,‰Æ‰ÍˆT$¸0è Ïÿÿ‰Ã…Àth¹01À‰ßóª‹D$D‰C$…ÀuwÇC(ŠD$ˆC.‰èƒàˆC/Áå f‰k,‹D$@‰C ‹V<9V@|C‰F<…Àt)Áâ‹FDèVÿÿÿ…ÀtZ‰FD‹V@‰B‰V@‰ØƒÄ,[^_]ÃvÇF<º@ëÌf‹FDëÔvÁàèpÎÿÿ‰C(…Àu1À‰$‹5ƒxfÿÖ‰$ÿÖ1Ûë¶v‹C(ëävWVSƒì‰Ã‹P9Sr~Š‹H¶ÂƒèƒøIwZ¾°€WvföÁt1ö¶Ò‹CÇD$‰4$èÞþÿÿ…ÀtM‹‹z‹H(‰9ƒÂ ‰‹S‹:…ÿt*‰B‰C…ötÿC ¸ƒÄ[^_Ã1ö멸ƒÄ[^_ÉëÕ¸ÿÿÿÿëݸ÷ÿÿÿëÖfWVSƒì‰Ã‹P 9S‚†Š‹H¶ÂƒèƒøIwb¾°€WvföÁt1ö¶Ò‹CÇD$‰4$è:þÿÿ…ÀtU‹H(‹‹z‰9‹z ‰yƒÂ‰‹S‹ …Ét,‰B‰C…ötÿC ¸ƒÄ[^_Ãv1ö롸ƒÄ[^_ÉëÓ¸ÿÿÿÿëÛ¸÷ÿÿÿëÔfUWVSƒì,‰Ã‰Õ‹‹H‹pµ ‰T$Â9S‚ΊˆD$¶ÀƒèƒøIvv1ÿ¶T$‹C‰t$‰<$èˆýÿÿ…À„¦‰ê„ÒufH,…öt‹h(‹;1Ò‹L— ‰L•B9òuó‹T$‹S‹:…ÿt`‰B‰CŠD$ƒèG<vs ¸ƒÄ,[^_]Ãv¾¸€Wvf¯þ뀋K …öt%ƒþv(º«ªªª‰ð÷âÑêʉS ¸ƒÄ,[^_]Ãv1Òëç‰럺ëܸÿÿÿÿ맸÷ÿÿÿë vUWVSƒì‰Ã‹Š‹H¶ÂƒèƒøI‡í¾°€WvföÁt1ö¶Ò‹CÇD$‰4$èüÿÿ‰Ç…À„僋C‹(…í„ljx‰{‹k ‹‹ƒè ƒø:v¸ÿÿÿÿƒÄ[^_]Ãÿ$…8?vfº‰Øèdþÿÿ…À„‹;SsÏ‹ƒøuÀƒÂ‰‹‰Glj{‰k …ötPE‰k ¸ƒÄ[^_]Ãv‰Øè!ÿÿÿƒøt¸ë‘f‰Øè]ýÿÿƒøt¨ëf‰Øè­üÿÿƒøt˜énÿÿÿv1öéÿÿÿ¸ƒÄ[^_]Ãv‰8é5ÿÿÿ1ÀéEÿÿÿ¸÷ÿÿÿé;ÿÿÿUWVSƒì‰Î‹\$0‰×JþƒùIwI¾Š~Wvf‰Í¯î‰ù¶Ñ‰t$‰,$1Éè^ûÿÿ…ÀtfH,…ö~‹x(1Òv‹ “‰ —B9òuõƒÄ[^_]Ã1íë¿UWVSƒì‰Ã…Àtk‹@(4•,0‹}B‰T$ …ÿt9 tM1Òë9L•tBB9úuõ‹S$•‰L$è®úÿÿ…À‹L$t,ÿC$‰C(Æ‹‹T$ Ú‰ C‰°ƒÄ[^_]Ãf°ƒÄ[^_]Ã1ÀëôfUWVSƒì‰Å‰×‰Î‹\$0…Ût;‹C,¨@u4ƒÈ@f‰C,ŠC.ƒè‰{‹)‰kDmÁà‰D$‹D$@‹‰D$‰<$èÙêÇC ÿÿÿÿ°ƒÄ,[^_]ËzëÊv1ÀƒÄ,[^_]ÃfWVSƒì‰Ç‰Ö‰ËIC‰$‰øèXÿÿÿ„Àt4KVC‰$‰øèAÿÿÿ„Àt‹C(‰F(‹C,‰F,‹C0‰F0°ƒÄ[^_Ãf‹V‰øè&hÿÿ‹V‰øèhÿÿ1ÀƒÄ[^_ÃvUWVSƒì‰Å‹¸ä ‹G‰D$…Àt~‹E‰D$‹@‰$…À~4‹]P‹O 1À1Ò‰|$ v‹4‹|‰4‰|‹t‰tBƒÀ;$uá‹|$ ‹D$‹P$…Ò~.1Û1ö‰$‰Ã‹ $O‹$U\1ÀèÿÿÿFƒ$49s$ã‹G‰D$‹‰…ä ‹D$ƒÄ[^_]ÃUWVSƒì‰D$‰Ó‹‰$‹‰T$ ‹€ä …À„ª‹h…턳‰]…Û„€‹D$ ‹@‰D$…À~-‹] ‹$‹JP1À1Ò‹4‹|‰4‰|‹t‰tBƒÀ;T$uà‹L$ ‹Y$…Û~91Û1ö‰Ïë FƒÃ49w$~'‰Ù‹$H\‹UÚ‹D$è5þÿÿ„ÀuÝ1ÀƒÄ[^_]Ãv‹$‰ªä °ƒÄ[^_]Ë$‹¨à …í…Pÿÿÿvº‹D$è¢Àÿÿ‰Å…Àt·‹T$ ‹B@Áâ‹D$è†Àÿÿ‰E ‹L$ ‹A$@Áâ‹D$èjÀÿÿ‰E‹U …ÒtQ…ÀtM‹L$ ‹A @Áá1ö‰×‰ðóª‹T$ ‹B$@ Áá‹U‰×‰ðóª‹$‹‚ä ‰EÇE…Àt/‰hé¬þÿÿ‹D$èÖeÿÿ‹U‹D$èÊeÿÿ‰ê‹D$è¿eÿÿ1Àéÿÿÿ‹ $‰©à éwþÿÿfUWVSƒì‰Å‹D$0‹]@‰\$ 8L$8”D$ ‹½¤ ‹2‹U<ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ërëC9ët¶ ‰ò‰øèceÿÿ8D$ t鉨+D$ ƒÄ[^_]Ãv‹T$ ‚‹D$4,‚9ër ëƒÃ9Ýv‹ ‰ò‰øè&eÿÿ8D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹T$ B‹D$4,B9ër ëƒÃ9Ýv· ‰ò‰øèådÿÿ8D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‹D$0‹]@‰\$ 8L$8”D$ ‹½¤ ‹2‹U<ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ëwëK9ët¶Kÿ‰ò‰øèfdÿÿ8D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹T$ ‚‹D$4,‚9ëw ëƒë9Ýs‹Kü‰ò‰øè)dÿÿ8D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹T$ B‹D$4,B9ëw ëƒë9Ýs·Kþ‰ò‰øèècÿÿ8D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰D$‰Ë‹|$@€z.Av 1ÀvƒÄ,[^_]öJ.ÿ$ØCvfÇD$‰Ù‹D$+HH9ùv‰ù‰ß)ω<$‰Ù‹D$èç{ÿÿ)ÉØë½ÇD$‰Ù‹D$+HH9ùv‰ù‰ß)ω<$‰Ù‹D$èsyÿÿ)ÉØëÇD$‹D$‹HL)Ù9ùv‰ùÙ‰ $‰Ù‹D$èIxÿÿ)Øé^ÿÿÿfÇD$‹D$‹HL)Ù9ùv‰ùÙ‰ $‰Ù‹D$è]zÿÿ)Øé.ÿÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‰Ù+HH‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èèM•ÿÿ)ÉØéØþÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$è“ÿÿ)ÉØéžþÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$豑ÿÿ)Øéfþÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‹@L)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èè›ÿÿ)ØéþÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$èkÿÿ)ÉØéâýÿÿfŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$è—üÿÿ)ÉØé¦ýÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èaûÿÿ)ØénýÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èÅÿÿ)Øé6ýÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‰Ù+HH‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èèuŒÿÿ)ÉØéàüÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$èÛŠÿÿ)ÉØé¦üÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èI‰ÿÿ)Øénüÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‹@L)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èè ˆÿÿ)Øé$üÿÿ‰Ú‹D$+PH9úv‰ú‰Ù)ÑÇ$‰Ú‹D$èÛDÿÿ)ÉØéöûÿÿf‹D$‹HL)Ù9ùv‰ùÙÇ$‰Ú‹D$èÝCÿÿ)ØéÊûÿÿf‹D$‹P@‹p<ÇD$‰Ø‹L$+AH9øv‰ø‰ß)lj<$‰Ù‰ðè†ÿÿ)ÉØéŽûÿÿf‰Ø‹L$+AH9ø†{ûÿÿ‰øétûÿÿ‹T$‹BL)Ø9ø†cûÿÿëæ‹D$‹P@‹p<ÇD$‹@L)Ø9øv‰ø؉$‰Ù‰ðèY…ÿÿ)Øé.ûÿÿfUWVSƒì\‰D$LˆL$;‹*‹B‰D$4‹Z‹D$L‹‰D$,„Ét‹Ph‰T$<‰×+xH9|$4~'1í‰èƒÄ\[^_]ËD$,‹@h‰D$<‹T$,‹zL)Ç9|$4Ù‹D$,‹€¨ ‰D$ ‹T$,‹r@‹‚¤ ‹@4‰D$$‹D$Lè^ÿÿ‹D$,‹@<‰D$@ƒø„2ƒø„þHuŽÇD$(dtf9ß~‰ß‹D$@¯ÇèiŸÿÿ‰Ã…À„‹T$,‹‹@8‹@ ‹¨‰D$H…À„ø9|$4ê‰ú÷Ú‰T$0f€|$;„­‹D$0‰D$D…ÿ~91í‹T$<ЉD$‹D$è‰D$‰4$ÿT$ ‰$ÿT$$‰D$‰l$‰$ÿT$(E9ýuÔ‹D$@‰D$‰|$Ç$‰Ù‹T$H‹D$,èÎÍÿÿƒøtM…ÀuOÿD$09|$4Žvÿÿÿ‰Å‰$ÿƒxf‹D$Lèâ\ÿÿ‰èƒÄ\[^_]ÃÇD$(¼tféÿÿÿv‰|$D1ÀéPÿÿÿ‰Å‹D$D‹T$,Bhë¹ÇD$(tféÕþÿÿ1í먉$ÿƒxf‹D$LèŠ\ÿÿ½þÿÿÿé=þÿÿWVSƒì‰Æ‰ÓƒùŽ¥¡0Äuf‰$ÿ0ƒxfÇD$ Äuf‰$ÿ,ƒxf‰Ç…Àth‹C‰G‰G ÇG‰wÇG8ƒÿ‹V …Ò~N‹CPèÀÿÿ‰G4…Àto‹V ‰W0‹CH‰G‹CL‰G€»5 tD‹Ch‰G ‹Cd‰G$‹CT‰G(‹CX‰G,‰øƒÄ[^_ÃvÇG4ë»vuB‹=”ƒxfÿ‰øƒÄ[^_ËCd‰G ‹Ch‰G$ëºf‹H‰…Àt1ÿë·v‹G‰<$ÿP1ÿë§v1Ò‰ÈèãUÿÿ1ÿë—vVSƒì$‹t$0Š\$4ˆ\$‹”ƒxf9Þt …É~;H ~$€|$t51Ò1À‰T$‰D$‰4$ÿ<ƒxfƒÄ$[^ÃfDIý‹B…Àt΋‹RëÒvÿ‰ØƒÄ$[^ÃfSƒì‰Ã‰È…Òxp;S0k…Òt?TRý‹K4Ñ‹ …Éx'‹R…Òx ‹C)‰T$)Á‰L$‹C ‰$ÿ<ƒxfƒÄ[ÃÿƒÄ[ËS‹C$)ЉD$‹C )ЉD$‹C ‰$ÿ<ƒxfƒÄ[Ãf1Ò¸òÿÿÿèèTÿÿ1ÀƒÄ[ÃWVSƒì0‹t$@¡”ƒxf‰D$,D$,‰D$ÇD$ üËufÇD$àDvf‹D$H‰D$‹D$D‰$ÿx‚xf…ÀtD‹F0‰$ÿ\ƒxf‰Ç…Àt4‹^0…Û~-1Ûë v‰DŸ9^0~C‹L$,‰Ú‰ðèõþÿÿ…Àuå‹H‰…Àt 1ÿ‰øƒÄ0[^_ËG‰<$ÿP1ÿ‰øƒÄ0[^_ÃSƒì‰Ã‹‚´ …Àt‰$ÿXƒxf‹H‰…ÀtƒÄ[ËC‰$ÿPƒÄ[ÃfVSƒì$‹\$0‹C‹p0…ötA‹C,…Àx:‰D$Ç$ª5vfÿ„ƒxf‰Æ‰D$‹C‹@0‰$ÿ˜‚xf‹J‰…Òt…Àu ÿ°‚xf¡”ƒxfÿƒÄ$[^Ãv‹V‰4$‰D$ÿR‹D$ëÒSƒì‰$ÿð‚xf‰Ãƒøÿt‰ØƒÄ[Ãÿ¼‚xf…Àtî1Ò¸ñÿÿÿèVSÿÿëàUWVSƒì,‰Ã‰Ö‰ÍŠD$@ˆD$‰Èè°ÿÿÿ‰Çƒøÿt9…Àx‹9ø|‰øƒÄ,[^_]À|$t ‹|8…ÿàv¿ÿÿÿÿ‰øƒÄ,[^_]ἂxf‰D$ÿÐ…ÀtÍ‹‹5°‚xf‹x,…ÿt;ÿÖ‰l$‹‹@,‰$ÿ(ƒxf‰Ã…Àt!è3ÿÿÿ‰Ç‹H‰…Àt ƒÿÿu„ÿT$…À„xÿÿÿÿÖ¿ÿÿÿÿélÿÿÿv‹C‰$ÿPëÕWVSƒì‰Ã‰×‰Î‹B÷@Tt$S0CÇ$‰ùèÿÿÿ‰D$‰$ÿÖƒÄ[^_øóÿÿÿè>Rÿÿ1ÀƒÄ[^_ÃUWVSƒì,‰D$‰Ö‰L$‹j…íu ÇD$‹D$‰$ÿT$‰Ç‰øƒÄ,[^_]ÃýtK‰,$ÿ\ƒxf‰Ç…Àtá…í~Ý1Ûë ‰DŸ C9ëtЋTž ‹L$‹D$èBÿÿÿ…Àuâ‹H‰…Àt%1ÿ‰øƒÄ,[^_]ËR ‹L$‹D$ƒÄ,[^_]éÿÿÿ‹G‰<$ÿP1ÿë€v¹¼0tf‹T$‹D$é>ÿÿÿf¹Ð1tf‹T$‹D$é*ÿÿÿf¹È2tf‹T$‹D$éÿÿÿf¹Ü6tf‹T$‹D$éÿÿÿf¹” tf‹T$‹D$éîþÿÿf¹¡tf‹T$‹D$éÚþÿÿf¹`¡tf‹T$‹D$éÆþÿÿfWVSƒì‰Ã‰×‰ÎŠL$ ‹B÷@Tt$S0C¶É‰ $‰ùèuýÿÿ‰ñ‰Â‰ØƒÄ[^_éHûÿÿ¸óÿÿÿè®Pÿÿ1ÀƒÄ[^_ÃUWVSƒì,‹D$@‰D$‹t$D‹n…íu‹ ”ƒxf1Ò‹D$ƒÄ,[^_]éûÿÿfƒýtS‰,$ÿ\ƒxf‰Ç…Àt:…í~61Ûë ‰DŸ C9ët)‹Tž Ç$‹ ”ƒxf‹D$è9ÿÿÿ…ÀuÙ‹H‰…Àt01ÿ‰øƒÄ,[^_]ËV ÇD$@‹ ”ƒxf‹D$ƒÄ,[^_]éÿþÿÿv‹G‰<$ÿP1ÿëÅvUWVSƒì,‰D$ÿœ‚xf‰Å…À„ËT$‹B‹@,…À„±‰$ÿü‚xf‰Ã…À„‘‹@…ÀŽÍ‹C ‹0…ött1ÿë…ÀxlG9{޲‹C ‹4¸…ötXÇ$‹ ”ƒxf‰ò‹D$èdþÿÿ…À„œ‰D$‰t$‰,$‰D$ÿ¤‚xf‹T$‹ I‰ …Éu¦‹J‰$‰D$ÿQ‹D$…Ày•‹H‰…Àt/‹EH‰E…Àt 1í‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãv‹C‰$ÿP‹EH‰E…ÀuÈëÒf‹H‰…Àu½‹C‰$ÿP벋H‰…Àu“‹F‰4$ÿPëˆUWVSƒì,‹t$@ÇD$êDvf‹D$D‰$ÿ$ƒxf‰Å…À„«‹F0@‰$ÿ\ƒxf‰Ç…À„‰‹F0…Àx*1Ûf‹ ”ƒxf‰Ú‰ðèÙøÿÿ‰D$‰\$‰<$ÿdƒxfC9^0}Ú‰ðèGþÿÿ‰Ã…Àt9‰D$‰|$‰,$ÿƒxf‹J‰…Òtc‹J‰…Òtt‹UJ‰U…Òt3ƒÄ,[^_]Ãv‹H‰…Àu ‹G‰<$ÿP‹EH‰E…Àtc1ÀƒÄ,[^_]ËU‰,$‰D$ÿR‹D$ƒÄ,[^_]Ãv‹S‰$‰D$ÿR‹D$‹J‰…ÒuŒ‹W‰<$‰D$ÿR‹D$‹UJ‰U…Ò…wÿÿÿ먋E‰,$ÿP1ÀƒÄ,[^_]ÃUWVSƒìL¡”ƒxf‰D$Gÿÿ„Ût½»öÿÿÿénÿÿÿÆ„$Š‹u@‰t$|‹¨ ‰\$t‹t$h‹6‰´$ÇD$`ÿÿÿÿétüÿÿ€½5 „@üÿÿ;œ$Œt¶1Û‰ØÄ,[^_]Ãv‰Ðè+ÿÿ‰D$xé±ûÿÿ‹T$@‰”$‰„$Š•5 ‰Á‹t$`‹|$p‹\$@f„Òt49D$XeX‰Ed€{.…… 9E`tD€½; u‰Eh»é¤þÿÿf9Ç}Ò1Ûé—þÿÿ€¼$‰uÛ„Òt9D$X”Á„ÉuÌð‰Á뀽8 uðë±9Ç”Áëâ‹D$D‹‹3ǃ( ÿÿÿÿ‹–€…Òt ŠB.ƒèF<v‹Ch…À‰éûÿÿ1Ûé*þÿÿ¶Àÿ$…ÄGvfffƒ,y ;³( „Yýÿÿ‰,$‰ñ‰ú‹D$DèÉ–ÿÿ‰Æ…À‰?ýÿÿ1Ûéêýÿÿfƒ,y ;³( „%ýÿÿ‰,$‰ñ‰ú‹D$Dèíÿÿ‰Æ…À‰ ýÿÿ1Ûé¶ýÿÿfƒ,ˆ= ‹O(‹W$„$‰D$‹CH‰D$‰4$‹t$D‹èzÿÿ‰Æ…öˆ#w9|$@„æ`‰ñ‹T$@‰”$ø‰´$ü‰Ð‰Kd‹Sh‹\$L‰‰KéØûÿÿ„À‹C`„e9ÆŒo8‰Æézüÿÿf‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èØwÿÿ‰Æ9ÅŒBüÿÿ1Ûéíüÿÿvfƒ,y ;³( „%üÿÿ‰,$‰ñ‰ú‹D$Dèˆÿÿ‰Æ…À‰ üÿÿ1Ûé¶üÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„ìt$8‰t$‰$ÿ×8D$Huå‹|$Pé»ûÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„¨t$8‰t$‰$ÿ×8D$Huåë³v‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èôoÿÿ‰Æ9ÅŒ>ûÿÿ1Ûééûÿÿvfƒ,ˆM‹O(‹W$„$‰D$‹CL‰D$‰4$‹t$D‹è[wÿÿ‰Æ…öˆ(v9|$@…0þÿÿ‹T$@‹…À„…wŒ$ø‰ $‹Œ$‰Øè `ÿÿ„À…ewFŠƒ5 „À„Yl;sHqùÿÿ1ÛéTûÿÿfÇD$‰,$‰ñ‰ú‰ØèÎ[ÿÿ‰Æ9ÅŒ€úÿÿ1Ûé+ûÿÿ‹“¨ ‰T$l‹S@<ÀƒàHMÿ‰L$8NxA‰|$H‰\$P‰l$\‹|$l‰Õ‰Ãëv9t$8„qZÞx‰t$‰,$ÿ׃ø uä‹|$H‹\$P‹l$\FéúÿÿfÇD$‰,$‰ñ‰ú‰ØèþWÿÿ‰Æ9Åðùÿÿ1Ûé›úÿÿÇD$‰,$‰ñ‰ú‰ØèZÿÿ‰Æ9ÅÈùÿÿ1ÛésúÿÿÇD$‰,$‰ñ‰ú‰ØèªXÿÿ‰Æ9ÅŒ ùÿÿ1ÛéKúÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè$oÿÿ‰Æ9Årùÿÿ1ÛéúÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„@t$8‰t$‰$ÿ×8D$Huåé`ýÿÿŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@ ‰|$P‰Çë 9õ„t$8‰t$‰$ÿ×8D$Huåéýÿÿ„À„ˆ‹CD9Æý‹Cl9Æò1Ûémùÿÿv„À„<;sD„§øÿÿ1ÛéRùÿÿ‹‹¨ ‹S@<ÀƒàH‰D$8;sD„‚øÿÿ‰|$P‰\$H‰Ï‰Óë9õ„ Xt$8‹T$H;rD„X‰t$‰$ÿ׃ø uÙ‹|$P‹\$Hé@øÿÿ‹S@‹C<ÇD$‰,$‰ñè@hÿÿ‰Æ9ÅŒøÿÿ1ÛéÉøÿÿvfƒ,y ;³( „øÿÿ‰,$‰ñ‰ú‹D$Dèi—ÿÿ‰Æ…À‰ç÷ÿÿ1Ûé’øÿÿ‹S@‹C<ÇD$‰,$‰ñè gÿÿ‰Æ9ž÷ÿÿ1Ûéiøÿÿv‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èˆhÿÿ‰Æ9Å~÷ÿÿ1Ûé)øÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„Dt$8‰t$‰$ÿ×8D$HuåélûÿÿÇ$‰é‰ò‰Øè%ÿÿ‰Æ9ÅŒ÷ÿÿ1Ûé¿÷ÿÿ‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èxnÿÿ‰Æ9ÅÖöÿÿ1Ûé÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèPmÿÿ‰Æ9ÅŒ¦öÿÿ1ÛéQ÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèˆÚÿÿ‰Æ9ÅŒvöÿÿ1Ûé!÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè\Ùÿÿ‰Æ9ÅFöÿÿ1ÛéñöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øèpÿÿ‰Æ9ÅŒöÿÿ1ÛéÁöÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèTnÿÿ‰Æ9Åæõÿÿ1Ûé‘öÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„¤t$8‰t$‰$ÿ×8D$HuåéÔùÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„Xt$8‰t$‰$ÿ×8D$HuåéùÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè„hÿÿ‰Æ9ÅŒ.õÿÿ1ÛéÙõÿÿvÇ$‰é‰ò‰Øè>"ÿÿ‰Æ9Åõÿÿ1Ûé³õÿÿŠO/‹W(ÇD$‰l$‰4$‰ØèØfÿÿ‰Æ9ÅÚôÿÿ1Ûé…õÿÿv‰Æ9CHŽÅôÿÿ1Ûépõÿÿf‹„$ø‰ñ‹´$üéþ÷ÿÿv‹l$4‰uh»‰ØÄ,[^_]Ãv‰Œ$é`õÿÿ1Ûé'õÿÿ‹sD9sL„hôÿÿ1Ûéõÿÿ…ö„Xôÿÿ1Ûéõÿÿ‹Cl9Æ~‹CD9Æ~ 1Ûéíôÿÿv‰Æ9CL-ôÿÿ1ÛéØôÿÿf9ÆŽ›÷ÿÿ1ÛéÇôÿÿ1Ûé¿ôÿÿ1Ûé·ôÿÿ1Ûé¯ôÿÿ1Ûé§ôÿÿ1ÛéŸôÿÿ1Ûé—ôÿÿ1Ûéôÿÿ;³( …§øÿÿ‹ƒ, ‰„$é½øÿÿf;³( …·öÿÿ‹ƒ, ‰„$éÍöÿÿ‹Kh‹CH‰$‹D$Dè ÿÿ…Àˆ›q‰ƒ( ‹–€‰Á+J$‰‹, ‹V|…ÒˆØõÿÿ‹Ch9ÂÎõÿÿ‰Ðé¸ñÿÿ‹Kh‹CL‰$‹D$Dè„ÿÿ‰Â…ÀˆBq‰“( ‹†€‹@$Љƒ, ‹F|…Àˆ†õÿÿ)‹Ch9ÂŒ|õÿÿ‰Ðéuõÿÿ‹J(‹R$„$‰D$‹CH‰D$‹Ch‰$‰Øè“pÿÿ…Àˆíp‰ƒ( ‹”$‰“, ‹V|…Ò‰Oÿÿÿé"õÿÿ‹J(‹R$¼$‰|$‹CL‰D$‹Ch‰$‰Øèßnÿÿ…Àˆˆp‰ƒ( ‹”$‰“, ‹V|…Òˆ×ôÿÿ)Љ‹Ch9ÂŒËôÿÿ‰ÐéÄôÿÿ‹Kh‹CL‰$‹D$Dè±~ÿÿ‰Â…À‰ýþÿÿ1ÛéÚòÿÿ‹Kh‹CH‰$‹D$D莑ÿÿ…Àˆo‰ƒ( ‹–€‰Ç+z$‰», ‹V|…Ò‰Šþÿÿé]ôÿÿ‹„$9D$XŒè\öA- …#c‹…0 @f‰…0 f…À„‰<‹•„ ‹‚ H ÀЉŒ €{ ]†Š-»ÿÿÿÿ‰ØÄ,[^_]Ë„$‰D$‰,$‹\$hÿS‹”$:B/„§`öB- t‰Œ$„$‰$‹T$d‹D$Dè˜ÿÿ„À„aq‹„$…À…òÿÿéOÿÿÿv‹„$9D$p{[öA- „1ÿÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè_–ÿÿ„À„o‹„$…À…¤ñÿÿéïþÿÿv‹„$9D$XŒI\öA- „ÑþÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèÿ•ÿÿ„À„ûp‹„$…À…Dñÿÿéþÿÿv‹„$‰D$‰,$‹t$hÿV‹”$:B/„G`öB- „]þÿÿŒ$„$‰$‹T$d‹D$Dè×–ÿÿ„À„Sp‹„$…À…Øðÿÿé#þÿÿv‹„$‰D$‰,$‹\$hÿS‹”$:B/„aöB- „ñýÿÿŒ$„$‰$‹T$d‹D$Dèk–ÿÿ„À„ÿm‹„$…À…lðÿÿé·ýÿÿv‹„$‰Eh‹S(¹‹D$DèYÙÿÿƒøŒÕl„Šýÿÿ‹Eh‰„$‹„$‹‰„$éðÿÿ‹„$‰Eh‹C(‹8‹X‰\$4‹H‹D$D‹‹sh‰ò+SH9T$4:ýÿÿ‹ƒ° ‰D$L‹C@‰D$8‹D$D‰T$0‰L$,èx7ÿÿ‹‹@8‹@ ‹¸‰D$<…À‹T$0‹L$,„Og‰Ï9Ñ~‰×9|$4/g)þ‰l$Hëfv‰t$‹l$8‰,$ÿT$L‰|$‰$ÿxƒxf‰Å…í„ g‰l$‹T$<‰$ÿ@ƒxf‹MI‰M…É„ÅNƒø„ÒN…À…"nOF9|$4½f€»2 u”‹k<‰t$‹D$8‰$ÿT$L‰é‰úèù£ÿÿ‰Å듺‹D$Dè‘ÿÿ„À„bk‹Œ ÇD$…¸ ‰D$‰$è˸‹„$‹@(‹‰C‹„$‰C•¼ ¹1À‰×óªÇ…Ì ‹„$‰…¸ ‹‰„$é|îÿÿ‹„$‰D$‰,$‹t$hÿV‹”$:B/„ _öB- „ûÿÿŒ$„$‰$‹T$d‹D$Dè”ÿÿ„À„gl‹„$…À…îÿÿécûÿÿv‹C(‹0‹]\º‹D$Dèÿÿ„À„}jv†ƒ‹…Œ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹…$ ‰C0‹”$‹B(‹x…ÿ…(1ÿ‹@…À„}T1À‰ú„Ò„ÏR„À…¢e‹„$ø‰„$‹„$ü‰„$éZíÿÿ‹C(‹0‹‹D$Dè¶Íÿÿ„À„Þi‹]‹K…É~$‹EP1ÒvÇÿÿÿÿÇ@ÿÿÿÿÇ@ÿÿÿÿBƒÀ9Êuä‹K$…É~)‹E\1ÒÇ@Ç@ ÿÿÿÿÇ@Ç@ ÿÿÿÿBƒÀ49ÊuÜ‹\$T‹CX‹ð‹‰„$º‹D$DèçŽÿÿ„À…»ìÿÿ»ðÿÿÿéìÿÿ‹„$9D$XŒ›YöA- „åùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè‘ÿÿ„À„k‹„$…À…Xìÿÿé£ùÿÿv‹„$9D$XŒ³VöA- „…ùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè³ÿÿ„À„³i‹„$…À…øëÿÿéCùÿÿv‹´$Œ9´$„%\öC- „"ùÿÿŒ$„$‰$‹T$d‹D$D蜑ÿÿ„À„&i‹„$…À…ëÿÿéèøÿÿ‹„$;„$Œ„Q;El„ QöC- „ÁøÿÿŒ$„$‰$‹T$d‹D$Dè;‘ÿÿ„À„wi‹„$…À…<ëÿÿ釸ÿÿv‹„$9D$XŒ0VöA- „iøÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè—ÿÿ„À„j‹œ$…Û…Üêÿÿé'øÿÿvº‹D$DèêŒÿÿ„À„ug‹…Œ Š•: ˆP‹…Œ ‹•$ ‰‹D$Dèà”ÿÿ„À„=g‹„ ‹» ‰|$4‹µ” ‰t$<Š…8 ˆD$L‹½ä ‹„$‰EhÆ…8 ‹„$‹PÇ$1É‹D$DèAæÿÿ‰Æ…Àˆzg‹„$‹P(‰èènÿÿ‰½ä ŠT$Lˆ•8 ‹|$<‰½” ‹|$4‰» ‰„ N…=÷ÿÿ‹„$‹‰„$‹Eh‰„$éÎéÿÿ‹C(‹D@ý‹UP‹H…ɈîY‹‰„$é¦éÿÿ‹D$Dèå“ÿÿ„À„ôe‹µ$ ‰t$8‹„ ‹» ‰|$4‹µ” Š…8 ˆD$<‹½ä ‰|$LÇEH‹„$Œ‰EL‹„$‰EhÆ…8 Š•: ˆT$H‹„$‹PÇ$1É‹D$Dè!åÿÿ‰Ç…Àˆge‹„$‹P(ƒÂ‰èèKÿÿ‹L$p‰ML‹D$X‰EH‹T$L‰•ä ŠL$<ˆ8 ‰µ” ‹D$4‰ƒ ‰„ ‹„$€x/„×MO„æc‹E‹X…Û„íõÿÿ‹‰…” éàõÿÿ‹„$9D$p’OöA- „ÅõÿÿŒ$ÇD$„$‰$‹T$d‹D$DèóŒÿÿ„À„g‹”$…Ò…8èÿÿéƒõÿÿv‹C(‹D@ý‹UP‹x…ÿˆfõÿÿ‹p<þ‹\$h‹[8‰\$4‹„$ …ÀˆN‹„$‰D$‹t$|‰4$ÿT$t”$܉T$‰$ÿT$4‰Ã‹„$ ‰D$‰4$ÿT$t”$ì‰T$‰$ÿT$4‰Æ‹”$ ‹„$9WŽ 9Ë„$9D$pè@1ÛÇ„$;´$ŽD7‹„$9Ã~‹”$‹Œ”ì9Œ„Ü„Ð@‹„$ö@- „ÓZŒ$ÇD$”$‰T$‰t$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$D貉ÿÿ„À„nZ€¼$„¤Z‹„$9à …Û~ÿ„$‹”$ ;´$þþÿÿB‰”$ 9WöþÿÿÇ„$ ÿÿÿÿ9ØŒÂóÿÿ9´$Œµóÿÿ‹„$‹‰„$éPæÿÿ‹C(‹D@ý‹]PËp…öˆ†óÿÿ‹P4ò‹\$h‹[8‰\$4‹Œ$ …ɈoL‹„$H‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰Ã‹„$ H‰D$‹|$|‰<$ÿT$t”$܉T$‰$ÿT$4‰Ç‹”$ ‹„$f;Ž£W…ÀŽÀ5‹„$…ÀŽíÿÿŒ$„$‰$‹T$d‹D$D踅ÿÿ„À„œ]‹„$…À…¹ßÿÿéíÿÿ‹„$‰D$‰,$‹\$hÿS ‹”$:B/„çNöB- „ÕìÿÿŒ$„$‰$‹T$d‹D$DèO…ÿÿ„À„C_‹„$…À…Pßÿÿé›ìÿÿv1Ò‹D$Dè©¿ÿÿ„À„2\º ‹D$DèKÿÿ„À„\‹„$‹‰„$é ßÿÿ‹„$9D$p°KöA- „?ìÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèmƒÿÿ„À„g]‹”$…Ò…²Þÿÿéýëÿÿ‹„$9D$pGöA- „áëÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèƒÿÿ„À„×\‹„$…À…TÞÿÿéŸëÿÿv‹„$9D$XŒ2FöA- „ëÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$D诂ÿÿ„À„¿]‹„$…À…ôÝÿÿé?ëÿÿv‹C(‹‰T$8‹@‰D$4‹uPºV‹D$Dèïÿÿ„À„¢Z‹T$8|Rýþ‹…Œ ‹L$8‰H‹L$4‰H ‹J‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9Btÿ…$ ‰B‹A(‹X…Û…UF‹‰„$éFÝÿÿ‹C(‹0v†‹M\™‹K,ÇD$Ç$‰ò‹D$Dè žÿÿ„À„+Z‹C(@‰C(‹½$ ‹”$9{0„iK‹J(‹y9ø‚»G„´1ÿ‹A9C(‚ Y‹Œ$ƒÂ„$ø‰$‰èèAÿÿ„À•Á‰ú„Ò…4>„É…,>ÿK(éæéÿÿ‹¼$…ÿ…v@‹‰„$éyÜÿÿ‹„$‰D$‰,$‹\$hÿS‹”$:B/„?LöB- „šéÿÿŒ$„$‰$‹T$d‹D$Dè‚ÿÿ„À„¼Y‹œ$…Û…Üÿÿé`éÿÿ‹C,‹”$f…ÀˆqK‹s$‹|$p)×9þ~ öÄ „7éÿÿ‹„$ …ÀˆO‹[(ëfv‹„$ö@- „EPÇD$ ”$‰T$”$ ‰T$‰$Œ$‹T$d‹D$Dèz„ÿÿ„À„þO€¼$„àO‹„$ 9ÆŽN‹„$9D$p~ˆ‰D$‹D$|‰$ÿT$t‹”$ ;“…iÿÿÿB‰„$ ÿ„$빋s,‹¼$‰|$‰´$9D$H‡B‹S‹t$<‰V,‹S ‰V(‹•„ ‹Š I‰Š …Éu‹’ …Òt‰•„ 9D$H‚¢Ïÿÿ‹„$‹‰„$é=Âÿÿ‹3‰ò‹D$D蛢ÿÿ…ötN‰èèðþÿ‹C‰…$ ‹E‹@$‰D$4ƒøt/‹½œ ~1Û1ö‹OÙ‹U\Ú1Àè;¡ÿÿFƒÃ4;t$4u勉…œ ‹…„ ‹ J‰ …Ò…Ïÿÿ‹€ …À„Ïÿÿ‰…„ éùÎÿÿ‹‰„$‹S R ŠÁá‹u\ñ‰L$4‹y,‰¼$‹q(‰t$<‹p ‰t$8‹t$<¯t$8þ‹@(‹@‰D$LÇD$Ç$‰ñ‹D$DèK‚ÿÿ„À„ 9‹”$‹B(‹L$<9H„d‹L$L¯L$8ù‰L$<‹zŠO/ˆL$H‹‰D$LöG- „O‹|$8÷߉|$H‰÷+|$8´$ø‰l$\‰\$P‰óë9|$<„¢‹”$|$H‰þ‰$‰ù‹D$\è%ÿÿ„Àt×Ç$‰ù‹T$L‹l$D‹Eè ?ÿÿ„Àuº‹l$\‹\$P‰ò+”$ˆl6‹¼$‰|$8‹G(;P‡Í<‹K‹|$4‰O,‹[ ‰_(‹„ ‹» O‰» …ÿu‹› …Ût ‰„ ‹\$8‹C(;P‚mÍÿÿ‹L$8‹‰„$‰´$éÀÿÿ‹MP‹CH@Ñ€{t‹s tvý ñ‹q…ötN‰q@Áà‹t$TFL€x‹t 9Btÿ$ ‹‰B‹C‰B‹…„ ‹ J‰ …Ò…æÌÿÿ‹€ …À„ØÌÿÿ‰…„ éÍÌÿÿ‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹N‰L$4‹öA-@„ ‹CH‰D$<ÇD$Lÿÿÿÿº‰Ø‰L$,èuîþÿ„À‹L$,„Y ‹D$<9D$4„K ÿF‹“À B‰“À ‹ƒÈ @‰D$<‰ƒÈ ‹GƒÌ ÿƒÔ ‹GƒØ ŠFˆƒ: ‹F ‹@(‹x 9»Ä r;Pr‹P9“¼ r ‹|$<;xs vƃ: ‹D$L¯FD$4‰„$‰Œ$€½: „! Æ…: éÂËÿÿf‹K‹SÇD$Ç$‹D$DèZÿÿ„À„ 6‹…„ ‹ J‰ …Ò…Ëÿÿ‹€ …À„qËÿÿ‰…„ éfËÿÿf‹K4I ±‹u\ Ž‹s ‰q(‹s‰q,‹[‰Y0‰‚ …À…5Ëÿÿ‹‚ …À„'Ëÿÿ‰…„ éËÿÿ‰èè…ÿÿ‹…„ ‹ J‰ …Ò…úÊÿÿ‹€ …À„ìÊÿÿ‰…„ éáÊÿÿ‹ ‰Œ$‹K‰Œ$‰‚ …À…o½ÿÿ‹‚ …À„a½ÿÿ‰…„ éV½ÿÿf‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹F‰„$´‹‰”$°¾F‰„$ÔöB-@„¿ Ç„$Àÿÿÿÿ‹SH‰”$¸…Àx'ÿŒƒ¼ ÿ‹È T‡‹ )‹Ì ÿ‹Ô ‹)“Ø €¼$Š„Ñ‹S`9”$´•ˆ”$Øë v”$°‰Øè<ÿÿ„À‹„$Ô…ÿ @‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$éŸÉÿÿv‰èè9êþÿŠCˆ…: ‹‰…$ ‹…„ ‹ J‰ …Ò…iÉÿÿ‹€ …À„[Éÿÿ‰…„ éPÉÿÿ‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹V‰T$4‰”$´‹‰„$°¾F‰„$Ô¾V ‰”$ÀÿŒƒ¼ ÿ‹È T‡‹ )‹Ì ÿ‹Ô ‹)“Ø €¼$Š„)‹T$4;S`•ˆ”$Øëf”$°‰Øèf:ÿÿ„À‹„$Ô…o @‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$écÈÿÿv€¼$Š„Ì2‹Md‰Œ$€½5 „Ë‹D$X9È„˜2‹T$@ŠB.‰|$8‹F‰„$¼¾F‰D$P‰„$ľF‰„$ȾF‰„$Ô¾N‰Œ$ÀÿŒƒ¼ ÿ‹È ‹T$4|‚‹)“Ì ÿ‹Ô ‹?)»Ø €¼$Š„S‹|$L;{`•D$HŠT$HˆT$<ŠT$Hˆ”$Ø…ÉŽ ‹T$P…Ò• T$<ˆ”$Øëf”$°‰Øèª6ÿÿ„À‹„$Ô…S@‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$ ÿÿÿÿésÃÿÿ¾V9T$4•ÂéOýÿÿv‹D$Dè·ýþÿÿ¬‚xf‰Ã‹D$Dè†ýþÿ„Û„UÃÿÿ»öÿÿÿé²µÿÿ‹„$ö@- „ü+Œ$ÇD$ÿÿÿÿ”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dèß\ÿÿ„À„¦+€¼$„²+‹„$…ÀŽÅ‹”$ é*Óÿÿf‹„$ö@- „6-Œ$ÇD$”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$DèW\ÿÿ„À„-€¼$„þ,‹„$9Æÿ„$‹”$ é_Úÿÿv‹F)ƒÀ )ƒÈ ‹W¯Ð)“Ì )ƒÔ ¯G)ƒØ ŠFˆƒ: ‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$€½: …ßõÿÿ‹„$…À„žÁÿÿ‹‰„$é@´ÿÿ‹\$8‹C‹t$<‰F,‹C ‰F(‹…„ ‹ J‰ …Ò…aÁÿÿ‹€ …À„SÁÿÿ‰…„ éHÁÿÿ²é5÷ÿÿ‹T$8ŠB.ƒè œÿÿ1ÒéòÓÿÿ»ðÿÿÿé-œÿÿö@- „¥©ÿÿŒ$„$‰$‹T$d‹D$DèBÿÿ„À„ù‹„$…À… œÿÿék©ÿÿv1Òé¢ÐÿÿöC- „W©ÿÿŒ$„$‰$‹T$d‹D$DèÑAÿÿ„À„=‹´$…ö…Ò›ÿÿé©ÿÿö@- „©ÿÿŒ$„$‰$‹T$d‹D$DèŒAÿÿ„À„‹„$…À…›ÿÿ騍ÿÿöC- „ΨÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèü?ÿÿ„À„Ћ„$…À…A›ÿÿ錨ÿÿöC- „‚¨ÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè°?ÿÿ„À„n‹„$…À…õšÿÿé@¨ÿÿ‹„$‹‰„$éÛšÿÿO„ï‹U‹J…Ét‹‰•” ‹‰„$é´šÿÿ„À„ü§ÿÿ‹„$‰„$‹„$‰„$鋚ÿÿ1Ò騷ÿÿ1Òé•¿ÿÿ‹‰„$éošÿÿ‹‰„$éašÿÿ„À„©§ÿÿ‹„$ø‰„$‹„$ü‰„$é8šÿÿ‹l$H‹\$<é¡Ùÿÿ‹\$Léo×ÿÿ9D$p…h§ÿÿéµÅÿÿv‹¬$„1öéíÒÿÿ‹¼$˜ÇD$<éÐÿÿ‹‰”$ Ç„$Ç„$1À1ö1Ûé,²ÿÿ‰Ú‰œ$ Ç„$1À1öéh·ÿÿ‹V‰”$ Ç„$Ç„$1À1ÿ1Ûé̳ÿÿÇ„$ Ç„$1À1Ò1öéá¾ÿÿ‹„$ø‰„$‹„$ü‰„$é:™ÿÿ‹„$‰„$‹„$‰„$é™ÿÿ1Ûéà˜ÿÿƒÂ„$‰$‹Œ$‰èèSýþÿ„À•Àé`«ÿÿ‰D$‹\$|‰$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…5°ÿÿ‹A „$‹‰„$霘ÿÿH‰D$‹t$|‰4$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…}Ãÿÿ‹A „$‹‰„$éJ˜ÿÿ‹•¤ ‹Z ‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À… ÿ„$‹„$‹‰„$é ˜ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~B1Év‹4Š9ów19÷r-°‹Œ$8A/…l¹ÿÿ‹A „$‹‰„$é—ÿÿvA9ÁuÃ1Àë̉D$‹t$|‰4$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~A1Éf‹4Š9ów19÷r-°‹Œ$8A/…ˆ¸ÿÿ‹A „$‹‰„$é —ÿÿvA9ÁuÃ1ÀëÌ‹B‰B‹L$4‹T$8‹D$Dè0Wÿÿ„À„n‹Œ$逹ÿÿH‰D$‹\$|‰$ÿT$tƒø „ú‹„$ö@- „ú£ÿÿŒ$„$‰$‹T$d‹D$Dèt<ÿÿ„À„‹„$…À…u–ÿÿéÀ£ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‰Á‹‹D$hè:Þþÿ‹Œ$:A/…O¤ÿÿ‹A „$‹‰„$é"–ÿÿ‹S(‹‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$èžîþÿ‹Œ$:A/…ó¼ÿÿ‹A „$‹‰„$éÒ•ÿÿH‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…ê¢ÿÿ‹A „$‹‰„$錕ÿÿH‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè‚ôþÿ‹Œ$:A/…©ÿÿ‹A „$‹‰„$éB•ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‰Á‹‹D$hè Ýþÿ‹Œ$:A/…€£ÿÿ‹A „$‹‰„$éó”ÿÿ‹•¤ ‹Z H‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…¬ ÿŒ$‹„$‹‰„$é±”ÿÿ‹S(‹H‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è,íþÿ‹Œ$:A/…á»ÿÿ‹A „$‹‰„$é`”ÿÿƒÂ„$ø‰$‹Œ$‰èè¡øþÿ„À•Àé ±ÿÿ‹B‰B‹L$4‹T$8‹D$DèlTÿÿ„À„‹Œ$é­Äÿÿ‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè÷ïþÿ‹Œ$:A/…¼Çÿÿ‹A „$‹‰„$éÇ“ÿÿH‰D$‹t$|‰4$ÿT$tƒø „½ÿŒ$‹„$‹‰„$é’“ÿÿ‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hè‰òþÿ‹Œ$:A/…ÞÆÿÿ‹A „$‹‰„$éI“ÿÿ‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…#´ÿÿ‹A „$‹‰„$é“ÿÿH‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèêîþÿ‹Œ$:A/…3¦ÿÿ‹A „$‹‰„$麒ÿÿ‰D$‹\$|‰$ÿT$tƒø „¥ ÿ„$‹„$‹‰„$醒ÿÿ‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚:9Ø–À:A/…,Éÿÿ‹A „$‹‰„$é<’ÿÿº ‹D$DèR4ÿÿ„À„‹…Œ ‹”$‹R‰‹…Œ ‹”$‰P‹„$ø‰„$‹„$ü‰„$éã‘ÿÿH‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚©9Ø–À:A/…ÐÄÿÿ‹A „$‹‰„$阑ÿÿ‹‰„$銑ÿÿ‹K,;Œ$…‡´ÿÿ1ÿ骴ÿÿ‹œ$öC- „Z‰l$4‰Ú…ÀŽÔ œ$¼$ ¬$ë‹”$ÇD$ÿÿÿÿŒ$‰L$‰t$ ‰l$‰|$‰$‰Ù‹T$d‹D$DèT8ÿÿ„À„r €¼$„ ‹„$…À§ÿŒ$‹”$étÿÿÿ‹‰„$éÂÿÿ‹Œ$9K,…€ÂÿÿÆD$4é¦Âÿÿ‹‰„$éšÿÿ‹‰„$éŒÿÿ9•( …ƒ´ÿÿ‹Œ$ …ɉt´ÿÿ‹…, ‰„$Ç„$ ÿÿÿÿ‹‰„$éKÿÿ9½( …0µÿÿ‹„$ …À‰!µÿÿ‹…, ‰„$‹‰„$éÿÿ‹‰„$éÿÿ9( …¯ÿÿ‹”$ …Ò‰¯ÿÿ‹…, ‰„$Ç„$ ÿÿÿÿ‹‰„$éÆÿÿ‹C‰„$é·ÿÿ‹‰„$é©ÿÿ‹‰„$é›ÿÿ‹‰„$éÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè 4ÿÿ„À„© ‹„$…À…Pÿÿ雜ÿÿ‹‰„$é=ÿÿ;sLŽÿÿ1ÛéûŽÿÿ9( …a­ÿÿ‹´$ …ö‰R­ÿÿ‹…, ‰„$éé­ÿÿv9½( …¬ÿÿ‹„$ …À‰ ¬ÿÿ‹…, ‰„$‹‰„$éÆŽÿÿ€½8 … œÿÿé,ºÿÿ9•( …f¿ÿÿ‹¼$ …ÿ‰W¿ÿÿ‹…, ‰„$éð¿ÿÿv;sLŽ_Œÿÿ1ÛéBŽÿÿº龫ÿÿºééÅÿÿºéçÂÿÿºéd³ÿÿÇ$‹Œ$‰ò‹|$D‹è¥ ÿÿ„À„ñ‹„$‹P(ÆD$4éÀÿÿ‹\$HéèÞÿÿ‰ÆéyâÿÿÇ„$ ÿÿÿÿ…ÀB›ÿÿ‹Œ$…É3›ÿÿ‹„$‹‰„$éÎÿÿf‹\$8éŸÞÿÿ‰è‹¬$ ‹œ$”‰Ch‰<$ÿƒxf‹D$Dè.Õþÿ‹Eh‰„$‹„$‹‰„$éÿÿ‰ÆéØãÿÿ‰Æé…âÿÿ‰Æé>áÿÿ‰Æé#ãÿÿ‰ÆéŒàÿÿ‹¬$¬‹œ$œ‰{h‰4$ÿƒxf‹D$DèÉÔþÿ‹Eh‰„$‹„$‹‰„$éÿÿ‹l$8‹|$<‹\$L‰»œ éíÿÿ‹„$9D$pŽBšÿÿ@‰„$Ç„$‹Œ$‹”$ 1À1öéN²ÿÿ‹œ$éXüÿÿÇ„$ 1ÀéÒ°ÿÿ‹œ$é¿üÿÿ‰”$ ‰ÐéÉ«ÿÿ‰”$ ‰ÐéæªÿÿÇ„$ 1ÀéS½ÿÿÇ„$ ÿÿÿÿé°™ÿÿ»ðÿÿÿé$ŒÿÿÇ„$ ÿÿÿÿé–™ÿÿÇ„$ ÿÿÿÿ醙ÿÿÇ„$ ÿÿÿÿév™ÿÿ»ðÿÿÿéê‹ÿÿÇ„$ ÿÿÿÿé\™ÿÿÇ„$ ÿÿÿÿéL™ÿÿ»ðÿÿÿéÀ‹ÿÿÇ„$ ÿÿÿÿé2™ÿÿÇ„$ ÿÿÿÿé"™ÿÿ»ðÿÿÿé–‹ÿÿ‹Œ$ÇD$Ç$‰ò‹D$Dè¯Lÿÿ„À…ï˜ÿÿ»÷ÿÿÿéc‹ÿÿÇ„$ ÿÿÿÿéÔ˜ÿÿ»ðÿÿÿéH‹ÿÿÇ„$ ÿÿÿÿ麘ÿÿÇ„$ ÿÿÿÿ骘ÿÿ»ðÿÿÿé‹ÿÿÇD$<¼tfé2ÃÿÿÇD$<tfé%Ãÿÿ‹‰„$ éÅÿÿ1ÀéÄøÿÿ‹Œ$éòŸÿÿ1ÀéUùÿÿÇ„$¨ÌtfÇD$L¼tféû¿ÿÿÇ„$¨¤tfÇD$Ltféã¿ÿÿºS‹D$Dèô,ÿÿ„À„¦‹…Œ ‰p‹”$‰P‹…$ ‰C0‰S,‹„$‰„$‹„$‰„$鈊ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éhŠÿÿ‹F‰„$ é¹ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$é9ŠÿÿÇ„$ ÿÿÿÿéy—ÿÿ‹‰„$ éÝ·ÿÿ‹Œ$éȹÿÿ÷ÚéÉÿÿÇ„$ ÿÿÿÿ…ÀE—ÿÿéûÿÿ‹F‰„$ éé±ÿÿ»ðÿÿÿ饉ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé÷–ÿÿ»ðÿÿÿék‰ÿÿÇ„$ ÿÿÿÿéÝ–ÿÿÇ„$ ÿÿÿÿéÍ–ÿÿÇ„$ ÿÿÿÿé½–ÿÿ»ðÿÿÿé1‰ÿÿ‹D$DèêÐþÿ»þÿÿÿé‰ÿÿ»ðÿÿÿé‰ÿÿÇ„$ ÿÿÿÿ醖ÿÿ‹D$8‰$‰Ú‰èèFmÿÿ‰Ã‹„$‹P(‹Œ$éĵÿÿÇ„$ ÿÿÿÿéN–ÿÿÇ„$ ÿÿÿÿé>–ÿÿ»ðÿÿÿ鲈ÿÿÇ„$ ÿÿÿÿ9ðŒ!–ÿÿ驸ÿÿ»÷ÿÿÿéˆÿÿ‰$‰ú‰èèÖlÿÿ‰Ç‹œ$‹C(9x†Ø¤ÿÿÇD$Ç$‹Œ$‰ò‹D$DèˆIÿÿ„À…È•ÿÿ»÷ÿÿÿé<ˆÿÿf‹l$H‹D$DèïÏþÿ骕ÿÿ‹D$DèáÏþÿ»þÿÿÿéˆÿÿ1Ûéˆÿÿ»÷ÿÿÿéˆÿÿ1Ûéý‡ÿÿ»÷ÿÿÿéó‡ÿÿÇ„$ ÿÿÿÿée•ÿÿÇ„$ ÿÿÿÿéU•ÿÿ‹l$H‹D$DèˆÏþÿéC•ÿÿÇ„$ ÿÿÿÿé3•ÿÿ»ðÿÿÿ駇ÿÿº\‹D$Dèï)ÿÿ„À„ù‹…Œ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰Pé šÿÿº[‹D$Dèœ)ÿÿ„À„Ò‹…Œ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$é‡ÿÿ‹]\ºZ‹D$Dè*)ÿÿ„À„^v†ƒ‹•Œ ‹œ$‰‰r‹H,‰J‹H(‰J ‹”$‰P,‰x(é £ÿÿ‹„$9D$X”ÿÿH‰„$Ç„$‹Œ$‹”$ 1À1öéK¤ÿÿ1ÛéQ†ÿÿ‹\$L‹›˜ ‰\$<…Û….¹ÿÿº ‹D$Dè_(ÿÿ‰D$<…À„†¹ ‰Ç1Àóª‹\$4[ƒÁã‰Ú‹D$Dè0(ÿÿ‹|$<‰G…À„ۉljÙ1Àóª‹|$<‰7ÇG…ö„‰~齸ÿÿ„$ø‰$‹Œ$‹”$‰èè9êþÿ‹”$„À‹B(„/˜ÿÿ¿é'˜ÿÿ‹Œ$éÔ±ÿÿ1Ûé|…ÿÿ„$‰$‹Œ$‹”$‰èèëéþÿ‹”$‹J(„À„Ÿ¨ÿÿ¿é—¨ÿÿ„$‰$‹Œ$‹”$‰èè°éþÿ‹”$„À‹B(„¢ÿÿ¿é¢ÿÿ„$ø‰$‹Œ$‹”$‰èèuéþÿ„À‹„$‹P(„ñ¶ÿÿÆD$4éì¶ÿÿ‹Œ$é²°ÿÿ‹Œ$é@´ÿÿ‰èèÒ²þÿŠ\$Hˆ: ‹t$8‰µ$ é’ÿÿº!‹D$DèÛ&ÿÿ„À„%‹…Œ Š\$HˆX‹…Œ ‹t$8‰0‹„$éÈéÿÿ»ðÿÿÿéN„ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé–õÿÿ‹¬$¬‰Ç‰4$ÿƒxf‹D$DèßËþÿ…ÿ‰÷ÿÿ‰ûé„ÿÿ‰sd‹„$ø‹´$ü鉂ÿÿ1Ûéñƒÿÿ»ðÿÿÿéçƒÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿéàóÿÿ‹l$4Ç„$ ÿÿÿÿé?‘ÿÿ÷ØéDÁÿÿ‹l$4Ç„$ ÿÿÿÿé$‘ÿÿ1Û雃ÿÿ»÷ÿÿÿ鑃ÿÿ1Éé §ÿÿ»÷ÿÿÿ逃ÿÿ»ðÿÿÿévƒÿÿ‰Ãéoƒÿÿ»÷ÿÿÿéeƒÿÿ‰ù‹|$4‰W(épÃÿÿ»ðÿÿÿéMƒÿÿ»÷ÿÿÿéCƒÿÿ»ðÿÿÿé9ƒÿÿ‰Ãé2ƒÿÿ»÷ÿÿÿé(ƒÿÿ‰Ãé!ƒÿÿ»÷ÿÿÿéƒÿÿ»ðÿÿÿé ƒÿÿ1ÀÇD$8éÝßÿÿ1ÀÇD$8éæÞÿÿ»ðÿÿÿéå‚ÿÿ»ðÿÿÿéÛ‚ÿÿ»ðÿÿÿéÑ‚ÿÿ»÷ÿÿÿéÇ‚ÿÿ»ðÿÿÿ齂ÿÿ»ðÿÿÿ鳂ÿÿ»÷ÿÿÿé©‚ÿÿ1Û颂ÿÿ1Û雂ÿÿ1Û锂ÿÿ1Ûé‚ÿÿ»ðÿÿÿ郂ÿÿ‰Ãé|‚ÿÿ»ðÿÿÿér‚ÿÿ»ðÿÿÿéh‚ÿÿ»ðÿÿÿé^‚ÿÿ»ðÿÿÿéT‚ÿÿ»ðÿÿÿéJ‚ÿÿ»ðÿÿÿé@‚ÿÿ»÷ÿÿÿé6‚ÿÿ»ðÿÿÿé,‚ÿÿ»ðÿÿÿé"‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿéúÿÿ»ðÿÿÿéðÿÿ»ðÿÿÿéæÿÿ»ðÿÿÿéÜÿÿ»ðÿÿÿéÒÿÿ»÷ÿÿÿéÈÿÿ‰<$ÿƒxf‹D$DèxÉþÿ»þÿÿÿé¬ÿÿ»ðÿÿÿé¢ÿÿ»ðÿÿÿé˜ÿÿ»ðÿÿÿéŽÿÿ»ðÿÿÿé„ÿÿ»ðÿÿÿézÿÿ‹Œ$騯ÿÿ»ðÿÿÿédÿÿ»ðÿÿÿéZÿÿ»ðÿÿÿéPÿÿ»ðÿÿÿéFÿÿ»ðÿÿÿé<ÿÿ»ðÿÿÿé2ÿÿ»ðÿÿÿé(ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéÿÿ‰ú‹D$Dè Éþÿ»÷ÿÿÿéÿ€ÿÿ»ðÿÿÿéõ€ÿÿ»ðÿÿÿéë€ÿÿ»ðÿÿÿéá€ÿÿ‹l$H‰Æ‹D$Dè”Èþÿ…ö‰¡àÿÿ‰óéÀÿÿ‹|$<‹\$L‰»˜ 飳ÿÿ»ðÿÿÿ馀ÿÿ‰4$ÿƒxf‹D$DèVÈþÿ»þÿÿÿ銀ÿÿ»ðÿÿÿ退ÿÿ»ðÿÿÿév€ÿÿ»ðÿÿÿél€ÿÿ»ðÿÿÿéb€ÿÿ»ðÿÿÿéX€ÿÿ»ðÿÿÿéN€ÿÿ»ðÿÿÿéD€ÿÿ»ðÿÿÿé:€ÿÿ»ðÿÿÿé0€ÿÿ»ðÿÿÿé&€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ‹l$H‰Æ‹D$Dè»Çþÿ…ö‰÷ßÿÿ‰óéêÿÿ»ðÿÿÿéàÿÿ‹\$<‰C(é´½ÿÿfUWVSƒì\‰D$$‰Ö‹(‰l$‹m‰l$4èuÇþÿ‹l$€½5 t)‹]h‹mH‰l$@9댆‰Ý+l$@‰l$H‹l$‹mL‰l$Dë+‹l$‹]h‹mL‰l$D9ëY‹l$D)݉l$H‹l$‹mH‰l$@‹l$4‹E öÄ•D$:öÄ€„ŠD$:ƒðˆD$9‹l$4€½„À÷Ћl$‰…Ü Š…8 ˆD$;1íÇD$(‹T$ƒÂt‰T$<‹L$Á¼ ‰L$0‰ð¶ð‰t$Lf‹T$‰ZhŠL$;ˆŠ8 ‹|$<‰º„ Ç‚€ ‹‚ ‰‚” Ç‚Œ ‰Z`‰Zd‰Ð‹‹J$…É~,‹@\ƒÀ1ÉÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ4;J$|Ü‹zx…ÿ~5‹|$‹‡Ð ƒÀ1ÉfÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ(;Jx|Ü‹r…ö~,‹L$‹AP1ÉÇÿÿÿÿÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ9ñuÝ‹rT…ö~(‹|$‹‡è ƒÀ1ÉvÇÇ@ÿÿÿÿAƒÀ;JT|깋|$01Àóª‹T$Ç‚Ì Ç‚Ô Ç‚Ø Æ‚: Ç‚$ fÇ‚0 ‹ŠÜ …É…ƒ‹L$H;Š  r …Éus€º8 tjÇD$,‹T$@‹D$‰PH‹L$D‰HL‹D$(…À…šƒ|$,„‹D$$èÅþÿ‹t$,…öyéõv‹D$$èçÄþÿÇD$,‹D$,ƒÄ\[^_]Ãv‹|$‹‹PÇ$‹L$L‹D$$è yÿÿ‰D$,ƒøŒtÿÿÿ„nÿÿÿH„¹€|$:u€|$9„Uÿÿÿ‹D$‹Pd9Ph„Eÿÿÿ‹D$(…À„‹L$‹qd9Þ„‹D$$èSÄþÿ‹D$$‹‰D$‹‰T$ ‹T$ ‹B…À~|‹l$(ÇD$ÇD$ë.f‹E‰U‹KÁá‹s‰Çó¤ÿD$ƒD$ƒÅ‹D$‹|$ ;G}8‹\$‹L$YP‹‹S‰E‰U‹S;U v¶Áâ‹Eè6ÿÿ…Àtc‹S‰U ‰E럋D$$è“Ãþÿ‹l$‹]d‰è‹mh‹€Ü …À„‹L$‹Ø H‰Ü €|$9„½üÿÿ€¹5 „‰iH‰YLé¥üÿÿ‹T$ ‹B…ÀŽf‹|$(1ö‹ƒxf‹l$ ‹G‰$ÿÓFƒÇ;u|ï‹L$(‰ $ÿÓ‹D$$èÃþÿ‹D$@‹l$‰EH‹T$D‰UL‹D$$èÃþÿÇD$,÷ÿÿÿÿ¼‚xf…À…þÿÿ1Ò‹D$,è-½þÿéþÿÿ‹—Ø …Ò…9þÿÿé›ýÿÿ;ih…gþÿÿ‹|$4‹_ …Û~*‹QP‹D$(1É‹89:…Iþÿÿ‹x9z…=þÿÿAƒÂƒÀ9Ùuß‹|$@‹L$‰yH‹D$D‰ALƒ|$,u‹|$‹‡Ø …À„‹T$‰rd‰jh‹D$$èPÂþÿ‹D$$‹(‹U‹B…Àޝ1ÿ1ö‹ƒxf‰\$‰Ó‹EP‹D8‰$ÿT$F‹CƒÇ9Æ|ç‹\$‹UP @Áá‰×‹t$(ó¤‹T$(‰$ÿÓ‹D$$èÌÁþÿ‹l$ÇETÿÿÿÿÇEXÿÿÿÿ‹E‹HL‹x …ÿ~T‹EPº½ÿÿÿÿë2f‹X…Ûx/‹1‰Ó9õ}‹l$‰UT€y „¦‰UX‰õƒÀBƒÁ 9ß~‹0…öyʉӃÀBƒÁ 9ßí‹D$$èpÁþÿÇD$,‹D$,ƒÄ\[^_]Ë|$‰_H‰oLéúÿÿ‹D$$èDÁþÿ‹D$$‹‰D$‹‰T$ ‹B@Áàè¶ÿÿ‰D$(…À„ðýÿÿ‹L$ ‹A @Áá‹|$(1Àóªé½üÿÿÆD$9éåùÿÿ‰õéXÿÿÿ‹ƒxfé±ýÿÿ‹D$$èÛÀþÿ‹l$$‹E‹(‹}…ÿ~I‹|$(1ö‹ƒxfv‹G‰$ÿÓFƒÇ;u|ï‹D$(‰$ÿÓ‹D$$èyÀþÿé¨þÿÿ‰Þéÿýÿÿ‹ƒxfésþÿÿ‹ƒxfëωÞé÷ýÿÿvWVSƒì ‰Ã@ ‰D$ÇD$T$‰ØèWÿÿƒ»X „-Œ‹‹T …É…ù‹ƒH 9ƒP |k‹“L €»A „‰T$ÇD$‹C‰$ÿ<ƒxf‰Æ…ö„¢‹ƒT @‰ƒT ‹S ;B ~ ǃT ‹T$‰ØèÐeÿÿ‰ðƒÄ [^_Ãv€»A …Ï‹sX¿ë=ƒø…3€»C „¾‹Ct;Cp…²‹“L 9ò„Sÿÿÿø‰CtƃD ºD$èž÷ÿÿ‰ƒX …Ày¬‹T$‰ØèMeÿÿ1öévÿÿÿf‹S\‹C ÇD$‹s‰4$è‡cÿÿ‰Æé"ÿÿÿ‹T$‰Øèeÿÿ‹5ƒxfÿ‰ðƒÄ [^_ËCP‰D$‰T$‹C‰$ÿ<ƒxf‰Æéèþÿÿf‹sT¿ÿÿÿÿékÿÿÿvÿƒP €»A t]‹ƒL ‰D$‹Cp‰D$‹C‰$ÿ<ƒxf‰Æ…À„Jÿÿÿ‹Ct‰ƒL €»C t4;Cpt>ƃD ‹ƒX …À…|þÿÿéBþÿÿ1öëî‹Cp‰D$‹ƒL ë¡ÆƒD ‹ƒX ëÏø‰Ct뻋T$‰Øè;dÿÿ‹ƒX 1Òèf¸þÿ1öéWþÿÿvƒì‹D$ è˜ýÿÿ;ƒxftƒÄËJ‰…Òt ¡”ƒxfÿƒÄËP‰$ÿRëêƒì‹D$ è`ýÿÿ;ƒxftƒÄËJ‰…Òt1ÀƒÄËP‰$ÿR1ÀëßvWVSƒì‰Ã‰×p ‰t$ÇD$ T$è6Tÿÿƒ»H „Œ—‰ø¶ÐD$è­õÿÿ‰Á‰ƒH …Àˆ•‹C‰òè§`ÿÿ‰Æ‰ø„Àu#‹Cp9Ct”ƒD ‹T$‰Øè7cÿÿ‰ðƒÄ[^_Ãf€»@ tÔ€»A ÀƒàHCp‰CtƃD ëÅv‹T$‰Øèùbÿÿ‹5”ƒxfÿ‰ðƒÄ[^_ËT$‰ØèÝbÿÿ‹ƒH 1Òè·þÿ1öë•‹T$‰ØèÁbÿÿ1ö놺‹D$éúþÿÿfƒìº‹D$ èçþÿÿ;”ƒxftƒÄÃv‹J‰…Òt1ÀƒÄËP‰$ÿR1ÀëÜv1Ò‹D$é­þÿÿUWVSì¬ ‹¼$À ¡”ƒxf‰„$ ‰„$” Ç„$˜ ‰„$œ „$œ ‰D$ „$˜ ‰D$„$” ‰D$„$ ‰D$„$Œ ‰D$ÇD$ 8ËufÇD$TKvf‹„$È ‰D$‹„$Ä ‰$ÿx‚xf…À„à1Ò‹„$ èZlÿÿ‰Ãƒøÿ„·ºÿÿÿ‹„$” è>lÿÿ‰Æƒøÿ„Û‹„$œ èslÿÿ…Àˆ—ÇD$ÇD$ÇD$‰D$ 1À‹¬$˜ …í•À‰D$‰t$‰$‹Œ$Œ ‰úD$HèT&ÿÿ„À„HD$H‰„$„ Ç„$ˆ Ç$ÿä‚xf‰Å…À„ó€¼$} ÒƒâJ‰T$<‹„$°9„$Í9„$”ŒÀº„$„ èóòÿÿƒøŒI„ ‹G …À…Í€¼$} „»‹„$°‹”$¬‰T$‰D$‹„$Œ ‰$ÿ<ƒxf‰Æ…À„ú‰t$‰,$ÿà‚xf‹J‰…Ò„Y…ÀˆØ€¼$| „ó‹D$<„$¬‰„$°Æ„$€ 9„$Ž3ÿÿÿD$HèßÀþÿ‰èĬ [^_]Ãfÿ¼‚xf…À„;þÿÿf1í‰èĬ [^_]Ãø„§‰$ÿ\ƒxf‰Æ…ÀtS‹_ …ÛŽNÿÿÿ1Ûë‰Dž9_ Ž<ÿÿÿC‹”$˜ÇD$‹„$Œ ‰$‰Ù‹D$HèÒ]ÿÿ…ÀuÊ‹H‰…À„¥‹EH‰E…À„ºD$Hè-Àþÿ1í‰èĬ [^_]Ãf‹„$°;„$¬”„$€ é?þÿÿ‹”$˜ÇD$‹„$Œ ‰$¹‹D$HèU]ÿÿ‰Æ…À…þÿÿ눋V‰4$‰D$8ÿR‹D$8é‘þÿÿf‹„$¬‹”$°é@þÿÿ‹F‰4$ÿPéMÿÿÿfÿ¼‚xf…À„ýÿÿé½þÿÿ‹E‰,$ÿPé8ÿÿÿfUWVSìŒ ‹¼$  Ç„$x ¡”ƒxf‰„$| „$| ‰D$„$x ‰D$„$t ‰D$ÇD$ `ËufÇD$cKvf‹„$¨ ‰D$‹„$¤ ‰$ÿx‚xf…À„l‹„$x …À„ý‹„$| èéhÿÿ…ÀˆIÇD$ÇD$ÇD$‰D$ ÇD$ÇD$ÿÿÿÇ$‹Œ$t ‰úD$0èÌ"ÿÿ„À„üD$0‰„$l Ç„$p Ç$ÿä‚xf‰Æ…À„³€¼$e …q‹D$t‰D$(ÇD$,1ÛÇD$$‹-à‚xf‹D$$;„$x &º„$l è_ïÿÿƒøŒî„€¼$g „.‹”$˜‹„$”9„¼$e „‰\$‰D$‹„$t ‰$ÿ<ƒxf‰Ã…Û„”‰\$‰4$ÿÕ‹J‰…Ò„F…Àxz‹G …ÀŽ»ë…ÀxdC9_ Œò‹”$€ÇD$‹„$t ‰$‰Ù‹D$0è¾Zÿÿ…Àt2‰D$‰4$‰D$ ÿÕ‹T$ ‹ I‰ …Éu°‹J‰$‰D$ ÿQ‹D$ …ÀyŸv‹H‰…À„ãD$0èö¼þÿ1ö‰ðÄŒ [^_]ÃvÇ„$x ÿÿÿéóýÿÿ‹\$tÇD$,ÿÿÿÿÇD$(éˆþÿÿv‹„$”€¼$e …áþÿÿ‰D$‰\$‹„$t ‰$ÿ<ƒxf‰ÃéÜþÿÿ1ö‰ðÄŒ [^_]ÃÿD$$‹œ$˜€¼$g t3;œ$”„àÆ„$h é þÿÿ‹S‰$‰D$ ÿR‹D$ é¤þÿÿfÆ„$h éúýÿÿv‹F‰4$ÿPéÿÿÿf;\$(tT$,‰”$˜Æ„$h éÉýÿÿ€¼$e uR‹D$t‰D$‰\$‹„$t ‰$ÿ<ƒxf‰Ã…Û„²þÿÿ‰\$‰4$ÿà‚xf‹J‰…ÒtH…Àˆ”þÿÿD$0è—»þÿéžþÿÿ‰\$ÇD$‹„$t ‰$ÿ<ƒxf‰Ã묋D$,؉„$˜éÿÿÿ‹S‰$‰D$ ÿR‹D$ ë¥UWVSìœ ‰Ã¶¬$´ ¶¼$¸ ¡”ƒxf‰„$„ ‰„$ˆ ‰„$Œ …Òt…É„n„$Œ ‰D$„$ˆ ‰D$„$„ ‰D$„$€ ‰D$ÇD$ àËuf‹„$° ‰D$‰L$‰$ÿx‚xf…À„ô‹„$„ 1Òèpdÿÿ‰Æƒøÿ„ͺÿÿÿ‹„$ˆ èTdÿÿ‰D$,@„Ñ‹„$Œ è‰dÿÿ…Àˆ«çÿ‰|$ÇD$ÇD$‰D$ ÇD$‹D$,‰D$‰4$‹Œ$€ ‰ÚD$<ènÿÿ„Àtdt$<‰´$x Ç„$| ‰è¶Ð„$x è[ëÿÿ…ÀˆË‰ÁT$<‰ØèZVÿÿ‰ÃD$<èß¹þÿ‰ØÄœ [^_]Ãfÿ¼‚xf…À„%ÿÿÿ1Û‰ØÄœ [^_]Ãvÿ¼‚xf…À„!ÿÿÿ1ÛëÞf‹5hƒxf9r…ƒþÿÿ‹r‰t$(Nƒþ‡rþÿÿ‹J ‰Œ$€ ƒ|$(„¸þÿÿ‹B‰„$„ ƒ|$(„£þÿÿ‹J‰Œ$ˆ ƒ|$(…Žþÿÿ‹R‰”$Œ éþÿÿfD$<è#¹þÿ1Ûé=ÿÿÿ‹D$‹T$‹L$ ÇD$ ÇD$ÇD$nKvfé§ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD${Kvfé{ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$‹KvféOýÿÿvVSƒì$‰Ã…Àtaº—Kvf¸³Kvf莫þÿ‰Æ…ÀtL‰\$‰$ÿƒxf‹J‰…Òt"‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ãf‹V‰4$‰D$ÿR‹D$ëË1ÀëàUWVSìì ‰Å‰Ó‰L$,”$ˆ ‰Èèèðþÿ„À„x¶”$È ‹Eèˆðþÿ„À„¾‹Œ$À ‰L$(1Ò‹„$ è—aÿÿ‰Æƒøÿ„Œºÿÿÿ‹„$ è{aÿÿ‰Çƒøÿ„H…öˆX‰t$0‹L$(9Τ…ÿˆ¨‰þ;|$(„€½„u‰ð+D$09Eh˜‹„$ …Àu Ç„$ ÿÿÿ‰$ÿŒ‚xf…À„Åÿ¸ÆD$9ÆD$:ÆD$8ÆD$;ÇD$‰D$ÇD$‹„$ ‰D$ÇD$ ‰t$‹L$0‰L$„$ˆ ‰$‹L$,‰êD$Lèjÿÿ„À„2T$L‰”$Ø Ç„$Ü Ç„$Ð Ç„$Ì Š„$ ˆ„$Ô ‹L$,‹QöBW•„$Õ „À…m1öÇD$<‹¼$ …ÿÇD$0Ž º„$Ø è£çÿÿƒøŒ|„ã‹„$°9ðtP€¼$ „'‰t$‰D$‹L$,‰ $ÿ<ƒxf‰Æ…ö„>‰ò„$Ì èŠ²þÿ‹J‰…Ò„E…Àˆ€|$8…v€|$9…K€|$:„x‹K‰L$(…ÉŽ1ÿë‹„$°‹”$´9ЄՀ¼$ „\‰D$‰T$‹L$,‰ $ÿ<ƒxf‰Æ…ö„£¡”ƒxf9Æ„¢‰ò„$Ì èâ±þÿ‹J‰…Ò„ý…ÀˆsG;|$(„–‹C ‹¸‹u ‹P;€ƒxf„Æ;ˆ‚xf„ºèÑTÿÿƒøÿ„ƒø„GÿÿÿŽ9ÆŒD@ý‹”$œ‹H…É…X‹;P„5¡”ƒxfÿ‹J‰…Ò…tÿÿÿ‹P‰$ÿRG;|$(…kÿÿÿÿD$0‹´$´€¼$ƒ „o;´$°„ Æ„$„ ‹„$ 9D$0…ýýÿÿŠ„$ „À„²1Ò9Ö„N„À„#‰t$ÇD$‹L$,‰ $ÿ<ƒxf‰Æ…ö„O¼$Ì ‰ò‰øè™°þÿ‹J‰…Ò„Q…Àˆ*…Ût ‹H‰…À„*‰øèð±þÿ‰ÃD$Lèɳþÿ…Ût=ö„$ t5‹D$0‰D$‰\$Ç$¹Kvfÿ„ƒxf‰Ãëf„$ˆ 舦þÿ…Û…1Û‰ØÄì [^_]Ãö„$ …Òº\‰ØèjíþÿƒøŽÍÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;éüÿÿÿ¼‚xf…À„fûÿÿ„$ˆ è¦þÿ1Û‰ØÄì [^_]Ãv‹´$ÇD$<ÿÿÿÿé‰üÿÿ‹t$(ésûÿÿv‰L$0…ÿ‰Xûÿÿ|$(‰Nûÿÿ1öéSûÿÿv‹L$,ÿö„$ …‹\$,„$ˆ è ¥þÿ‰ØÄì [^_]Ãvº{‰Øè˜ìþÿƒø.ÿÿÿ…ð1ÀÆD$91ÛÆD$:ÆD$8ÆD$;é>ûÿÿÿ¼‚xf…À…(ÿÿÿé¥úÿÿÿ‰ÆéÖüÿÿv‹V‰4$‰D$$ÿR‹D$$éíüÿÿf‰T$‰D$‹L$,‰ $ÿ<ƒxf‰ÆéŸüÿÿ;´$°”„$„ é’ýÿÿ‰D$‰t$‹L$,‰ $ÿ<ƒxf‰ÆéÔûÿÿÿ¼‚xf…À…¾1Ò¸ôÿÿÿè¥þÿ‹„$Ì …Àt ‹J‰…Ò„Š‹„$Ð …Àt ‹J‰…Ò„bD$L艱þÿ…Û„ùýÿÿ‹H‰…À…ìýÿÿ‹C‰$ÿP1Û‰ØÄì [^_]Éڄ$Ì èæ­þÿ…À‰²üÿÿë‚€|$;„¥üÿÿ¹T$L‰èè™Mÿÿ‰Æ…À„]ÿÿÿ‰D$Ç$ÿ`ƒxf…À„¯‰D$‰$‰D$$ÿƒxf‰Ç‹T$$‹H‰…À„­‹H‰…À„’…ÿ„ ÿÿÿ‰ú„$Ì èW­þÿ‹J‰…Ò„‹f…À‰üÿÿéáþÿÿv‹V‰4$‰D$$ÿR‹D$$é¥úÿÿf‰Ñ‰L$éýúÿÿ¹T$L‰èèÜLÿÿ‰D$(…À„žþÿÿ‹D$L‹@ @‰$ÿ\ƒxf‰Ç…À„u‹D$L‹p …öx81ö‹ ”ƒxf‰L$4f‹L$4‰ò‹D$(èNÿÿ‰D$‰t$‰<$ÿdƒxfF‹D$L9p }Ö‹D$(èmSÿÿ‰Æ…À„ ‰D$‰|$‰$ÿƒxf‰Á‹H‰…À„‹H‰…À„Þ‹T$(‹H‰…À„µ…É„çýÿÿ‰Ê„$Ì ‰L$$è/¬þÿ‹L$$‹J‰…Ò…Öþÿÿ‹Q‰ $‰D$$ÿR‹D$$éÀþÿÿ‹H‹éàþÿÿf‹D$<ð‰„$´Æ„$„ éäúÿÿft$(‰ž÷ÿÿÇD$0é¡÷ÿÿ‹P‰$ÿRéýÿÿf‹P‰$ÿRéhýÿÿf1Ò¸õÿÿÿè\¢þÿé=ýÿÿv‹B‰$‰L$$ÿP‹L$$é5ÿÿÿf‹G‰<$‰L$$ÿP‹L$$é ÿÿÿf‹F‰4$‰L$$ÿP‹L$$éçþÿÿfÇD$‰L$Ç$¹Kvfÿ„ƒxf‰Ãéàûÿÿ‹”$À éDúÿÿ„üÿÿ‰\$‰l$Ç$ÿ`ƒxfèÐõÿÿ‰Ã…À„ªûÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é!÷ÿÿ‹F‰4$ÿPé`ýÿÿ‹B‰$ÿPéEýÿÿ‹W‰<$‰D$$ÿR‹D$$éaýÿÿ‹„$À ‰D$‰t$‹L$,‰ $ÿ<ƒxf‰ÆéÕùÿÿ¼$Ì éöùÿÿ‹H‰…Àu ‹G‰<$ÿP‹T$(‹H‰…À…ýûÿÿ‹B‰$ÿPéïûÿÿ‹C‰$ÿPéÈùÿÿ‹V‰4$‰D$$ÿR‹D$$é™ùÿÿÇD$êDvf‰$ÿ$ƒxf‰Ã…À„¾úÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é5öÿÿ‹H‰…À…ˆûÿÿ‹F‰4$ÿPézûÿÿƒì\ÇD$@¡”ƒxf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ pËufÇD$¼Kvf‹D$h‰D$‹D$d‰$ÿx‚xf…ÀtG‹D$LèÒVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`è^ôÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡”ƒxf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ŒËufÇD$¼Kvf‹D$h‰D$‹D$d‰$ÿx‚xf…ÀtG‹D$LèVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èšóÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡”ƒxf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ¨ËufÇD$ÉKvf‹D$h‰D$‹D$d‰$ÿx‚xf…ÀtG‹D$LèJUÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èÖòÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡”ƒxf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÄËufÇD$ÉKvf‹D$h‰D$‹D$d‰$ÿx‚xf…ÀtG‹D$Lè†Tÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èòÿÿƒÄ\Ãf1ÀƒÄ\ÃfUWVSƒì<‹l$P‹\$Tº\‰Øèäþÿ…Àx ÿ‰ØƒÄ<[^_]É\$‹E‰D$Ç$ÿ`ƒxfèKñÿÿ‰Ç…À„~ÇD$$ÇD$(ÆD$,‹E‹@ö@W•D$-‹G‰D$…ÀŽR1öëDfÿ…Û„¡”ƒxf9ă‰ÚD$$è¦þÿ‹J‰…Ò„…ÀˆãF;t$„ ‹G ‹°‹U0‹C÷@Tu©‰Ø‰T$èIÿÿƒøÿ‹T$„‘ƒøtTŽ”9ÂŒŒD@ý‹U4‹H…Éu]¡”ƒxfÿ‹J‰…Òu”‹P‰$ÿRë‰f‹S‰$‰D$ÿR‹D$éiÿÿÿf‹U‹E$)ЉD$‹E )ЉD$‹E ‰$ÿ<ƒxf‰Ãéÿÿÿ‹U‹H)щL$‹ë×ÿ¼‚xf…À…Ž1Ò¸òÿÿÿèÞ›þÿ‹D$$…Àt ‹J‰…Òte‹D$(…Àt ‹J‰…ÒtH‹H‰…Àt#1ÛéIþÿÿ‹H‰…Àt#D$$è^¦þÿ‰Ãé0þÿÿv‹G‰<$ÿP1Ûéþÿÿ‹G‰<$ÿPëÒ‹P‰$ÿRë­‹P‰$ÿRë1Ò¸õÿÿÿèP›þÿémÿÿÿvUWVSƒì,ǘÁufxBtfǬÁuf@tfÇÔÁufÇØÁufDÂufÇèÁufÇôÁuf`ÂufÇøÁuf`ÃufÇüÁufàÃufÇ8ÄufÔ:tfÇLÄuft>tfÇXÄufäÄufÇtÄufÇxÄufðÄufÇ”ÄufÅufǘÄuf ÆufÇœÄuf€ÆufÇÇuf¸=tfÇTÇufÇXÇufÄÇufÇlÇufTtfÇpÇufØwufÇtÇufàÇufÇxÇuf@ÈufǘÈuf„=tfÇÔÈufÇØÈufDÉufÇìÈufltfÇðÈuf˜vufÇôÈuf`ÉufÇøÈuf ÉufÇ$€Áuf‹lƒxfÿÓ…ÀˆGÇ$ ÄufÿÓ…Àˆ6Ç$ÇufÿÓ…Àˆ%Ç$€ÈufÿÓ…ÀˆÇ `xfÇD$õÇ$àÉufÿ ƒxf‰D$…À„݉$ÿƒxf‰ÆÇ$´2‹=ø‚xfÿ׉ÅÀt"‰D$ÇD$ÕKvf‰4$ÿ¨‚xf‹H‰…À„»Ç$ÿ׉ÅÀt"‰D$ÇD$ÛKvf‰4$ÿ¨‚xf‹H‰…À„«Ç$ Êufÿtƒxf‰Ã…Àt"‰D$ÇD$åKvf‰4$ÿ¨‚xf‹H‰…À„’Ç$`xf1Ò1Û1À¶•"íuf9Ú|Z@‰Â=Üuç4‰ðè àþÿ‰Å…À„1À‰ï‰ñóª1ÿ‰ø‰\$ëR¶C‰D$Ç$ïKvfÿ„ƒxf…Àts‰D$·† íuf‹…vf‰D$¶C‹D…‰$‹5¨‚xfÿÖG‰øÿÜ„û4…ž íuf¶CT…‹…Àu”‰T$ÿœ‚xf‹T$‰¶C‹D……À…tÿÿÿ‹\$¡$`xf…Àt ‹J‰…Ò„Š1öëfF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRF9Þuá‰,$ÿƒxfÇD$‹D$ƒÄ,[^_]ÃÇD$‹D$ƒÄ,[^_]ËC‰$ÿPÇ$ÿ׉ÅÀ…8þÿÿéUþÿÿ‹C‰$ÿPéGþÿÿ‹P‰$ÿRéhÿÿÿ‹C‰$ÿPé`þÿÿ‹\$ÿœ‚xf£$`xf…À„Cÿÿÿf1ÿ1À‰\$‰Ãë+‰D$·‡ vf‹…vf‰D$¡$`xf‰$ÿÖC‰ßû‘t3Áç¶—£vf‹T•‰T$¶‡¢vf‰D$Ç$ñKvfÿ„ƒxf…Àu§é¾þÿÿ‹\$1öëF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRë߉,$ÿƒxféÜþÿÿ‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€€‚vfÁà¶Œ „vf‰ÐÁèƒâÈ·ŒÀ†vf‰ÐÑè¶ŒÈ@’vfÑà1ж„HÀ¢vfÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€@¤vfÁà¶Œ`¦vf‰ÐÁèƒâ¶ŒÈÀ¨vf‰ÐÁè¶Œˆ@®vfÁà1ж„ˆÀ±vfËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€@µvfÁà¶Œ`·vf‰ÐÁèƒâÈ·Œ`¹vf‰ÐÑè¶ŒÈ ÄvfÑà1ж„HàÒvfÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€ÀÔvfÁà¶„àÕvf‰ÑÁéƒâÁà¶Œ@Øvf‰ÐÁè¶ŒH àvfÁà1ж„ˆ€âvfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€`ävfÁà¶„åvf‰ÑÁéƒâÁà¶Œ`ævf‰ÐÁè¶ŒˆàévfÁà1ж„ˆ`ìvfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ÀívfÁà¶Œàîvf‰ÐÁèƒâÈ·Œ`ðvf‰ÐÁè¶ŒÈövfÁà1ж„ˆ wfËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€àwfÁà¶Œ wf‰ÐÁè¶Ò¶ŒÈ`wf‰ÐÁ趌ȠwfÁáÁà1ÐÁ‰ÈÁè¶€@wfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ wfÁà¶Œ@wf‰ÐÁè¶Ò¶ŒÈÀwf‰ÐÁ趌ȠwfÁáÁà1ÐÁ‰ÈÁè¶€ wfƒáÓøƒàÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€H wfÁà¶”` wf‰ØÁè ãÿ¶”Р wf‰ØÁèÁâ¶Œà wfÁáÁà1ØÁ‰ÈÁè¶€àwfƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€(wfÁà¶”@wf‰ØÁè ãÿ¶”Ѐwf‰ØÁèÁâ¶ŒÀwfÁáÁà1ØÁ‰ÈÁè¶€ wfƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€´wfÁà¶”àwf‰ØÁè ãÿ¶”Ð wf‰ØÁèÁâ¶Œ`wfÁáÁà1ØÁ‰ÈÁè¶€`wfƒáÓøƒà[Ãv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€`wfÁà¶Œ wf‰ÐÁè¶Ò¶ŒÈwf‰ÐÁ趌ȠwfÁáÁà1ÐÁ‰ÈÁè¶€@wfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€wfÁà¶ŒÀwf‰ÐÁè¶Ò¶ŒÈwf‰ÐÁè¶ŒÈ`wfÁáÁà1ÐÁ‰ÈÁè¶€wfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀwfÁà¶Œwf‰ÐÁè¶Ò¶ŒÈ@wf‰ÐÁ趌ȀwfÁáÁà1ÐÁ‰ÈÁè¶€ wfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€wfÁà¶Œ@wf‰ÐÁè¶Ò¶ŒÈ€wf‰ÐÁè¶ŒÈÀwfÁáÁà1ÐÁ‰ÈÁè¶€` wfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@!wfÁà¶Œ€!wf‰ÐÁè¶Ò¶ŒÈÀ!wf‰ÐÁè¶ŒÈ "wfÁáÁà1ÐÁ‰ÈÁè¶€À"wfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ #wfÁà¶Œà#wf‰ÐÁè¶Ò¶ŒÈ $wf‰ÐÁ趌Ȁ$wfÁáÁà1ÐÁ‰ÈÁè¶€ %wfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€è%wfÁà¶Œ&wf‰ÐÁè¶Ò¶ŒÈ€&wf‰ÐÁè¶ŒÈ`'wfÁáÁà1ÐÁ‰ÈÁè¶€à)wfƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€à,wfÁà¶Œ -wf‰ÐÁè¶Ò¶ŒÈ -wf‰ÐÁ趌Ƞ.wfÁáÁà1ÐÁ‰ÈÁè¶€@1wfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€”4wfÁà¶ŒÀ4wf‰ÐÁè¶Ò¶ŒÈ@5wf‰ÐÁè¶ŒÈ 6wfÁáÁà1ÐÁ‰ÈÁè¶€ 8wfƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ;wfÁà¶Œà;wf‰ÐÁè¶Ò¶ŒÈ`rƒøuèzþÿÿ¸ÉÃvèkþÿÿ¡D`xfHuéÇD`xfÇ$H`xfè‘PëÐf¡D`xf…ÀtÇD`xf¸ÉÃfÇ$H`xfèlRëÞÿ%h‚xfÿ%l‚xfÿ%`‚xfÿ%d‚xfÿ% ‚xfÿ%‚xfÿ%$‚xfÿ% ‚xfÿ%‚xfÿ%‚xfÿ%‚xfÿ%‚xfÿ%‚xfÿ%‚xfU‰åƒìèõSþÿÇ$tfèSþÿÉÃÿÿÿÿ„½ufÿÿÿÿôKvfLvfLvfLvf(Lvf:LvfHLvfTLvfdLvfqLvf€LvfLvfœLvf¬LvfÀLvfØLvfìLvfMvfMvf9MvfCMvfUMvfiMvf}Mvf–Mvf±MvfÃMvfÏMvfçMvfûMvfNvfNvf+Nvf=NvfNNvfYNvfhNvf{Nvf’Nvf¥Nvf±NvfÁNvfÕNvfåNvfõNvf Ovf!Ovf5OvfMOvfaOvfuOvf„Ovf—Ovf®OvfÁOvfÑOvfåOvfýOvfPvf$Pvf;PvfVPvfmPvf}Pvf‘Pvf©Pvf½PvfÑPvfçPvfýPvfQvfQvf/QvfDQvfUQvfjQvf{QvfŒQvf¡QvfºQvfÏQvfèQvfýQvf RvfRvf-RvfERvfURvfkRvfƒRvf–Rvf¬Rvf½RvfÎRvfàRvfˆCompiled regex objectïRvf ‚uf ÌufõRvft‚ufÀÌufÿRvfH‚uf`ÍufSvftuf@Îuf Svf°uf`ÏufSvfìŽuf€ÐufSvf(ŽufÀÑufSvfø{ufÓuf Svfdçtf€Óuf*Svf$xufÔuf2Svf\çtfàÔuf;SvfÌåtfÖufCSvf„tfLSvfŒtfYSvfdSvf¡Svf §SvfÁSvf ÈSvf÷Svf4Tvf'TvfÀ:tf4TvfgTvf<HtfàâtfMatch objecttTvfÞtfàÖufzTvf°Ýtf€Øuf€TvfœÝtf@Úuf„TvfˆÝtfÜufÁSvfÜÙtfÞuf‰TvfdátfÀÞuf“TvfÄãtfÀßuf Tvf8‘uf`àuf§Tvfàtfáuf¯TvftÝtf€áuf¸Tvf`Ýtf ãuf¿TvfLÝtfåufÄTvf8ÝtfàæufÊTvfÈ5tfàèufCSvfì™tfLSvfà™tfØTvfàâtfHäTvfèTvfUvf Uvf[UvfdUvf£Uvfðmtf°UvfïUvf¼ÚtfüUvf3Vvf -tf8VvffVvfØmtfpVvf¯VvfL Scanner objectïRvfxuf`éufÿRvfÈwufÀéufCSvf\tfLSvfdtfYSvfÀVvfôVvf\ Splitter objectSvf`vuf êufCSvfttfLSvf|tfYSvfWvf9Wvfÿÿÿÿ€êuf RE 2.3.0 Copyright (c) 1997-2002 by Secret Labs AB  tf tf¤tf(tf@otfø,tfè,tfLntf´tf€DtfôDtfàtfÌ'tf$ntf”'tftfÜ"tf'tfŒ&tf&tf'tfŒ&tf&tfØtfÜtf¼Ctf Dtf¬"tf`"tfL"tf"tf”!tfhtfœtftfŒtfœtftfŒtfØtfÜtf¼Ctf Dtfìtfðtf tf0tfTtffVvfUvf[Uvf@WvfKWvffVvfUvf[Uvf@WvfKWvffVvfVWvfKWvffVvfVWvfKWvfêDvffVvf_WvfUvf[UvfKWvfeWvffVvf_WvfUvf[UvfKWvfêDvffVvf_WvfUvf[UvfKWvfeWvffVvf_WvfUvf[UvfKWvffVvfUvf[UvfKWvfjWvfjWvfmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters at the beginning of the string.fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters against all of the string.search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Search through string looking for a match, and return a corresponding match object instance. Return None if no match is found.sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement repl.subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement format.subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement repl.subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement format.split(string, string, maxsplit=0, concurrent=None) --> list. Split string by the occurrences of pattern.splititer(string, maxsplit=0, concurrent=None) --> iterator. Return an iterator yielding the parts of a split string.findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list. Return a list of all matches of pattern in string. The matches may be overlapped if overlapped is True.finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator. Return an iterator over all matches for the RE pattern in string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a MatchObject.scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner. Return an scanner for the RE pattern in string. The matches may be overlapped if overlapped is True.group([group1, ...]) --> string or tuple of strings. Return one or more subgroups of the match. If there is a single argument, the result is a single string, or None if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the whole match is returned. Group 0 is the whole match.start([group1, ...]) --> int or tuple of ints. Return the index of the start of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the start of the whole match is returned. Group 0 is the whole match.end([group1, ...]) --> int or tuple of ints. Return the index of the end of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the end of the whole match is returned. Group 0 is the whole match.span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints. Return the span (a 2-tuple of the indices of the start and end) of one or more subgroups of the match. If there is a single argument, the result is a span, or (-1, -1) if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the span of the whole match is returned. Group 0 is the whole match.groups(default=None) --> tuple of strings. Return a tuple containing all the subgroups of the match. The argument is the default for groups that did not participate in the match.groupdict(default=None) --> dict. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name. The argument is the value to be given for groups that did not participate in the match.capturesdict() --> dict. Return a dictionary containing the captures of all the named subgroups of the match, keyed by the subgroup name.expand(template) --> string. Return the string obtained by doing backslash substitution on the template, as done by the sub() method.expandf(format) --> string. Return the string obtained by using the format, as done by the subf() method.captures([group1, ...]) --> list of strings or tuple of list of strings. Return the captures of one or more subgroups of the match. If there is a single argument, the result is a list of strings; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the captures of the whole match is returned. Group 0 is the whole match.starts([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the starts of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the starts of the captures of the whole match is returned. Group 0 is the whole match.ends([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the ends of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the ends of the captures of the whole match is returned. Group 0 is the whole match.spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints. Return the spans (a 2-tuple of the indices of the start and end) of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of spans; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the spans of the captures of the whole match is returned. Group 0 is the whole match.detach_string() Detaches the target string from the match object. The 'string' attribute will become None.match() --> MatchObject or None. Match at the current position in the string.search() --> MatchObject or None. Search from the current position in the string.split() --> string or None. Return the next part of the split string.Xvf<Ãtf˜Xvfètf¦XvfxtfµXvfd¢tf¿XvfÐ-tfÕXvf€tfèXvf tf ˜ufx˜uf̘uf$™uf|™ufÔ™uf,šuf”šufüšufl›ufÜ›ufLœuf´œufuf„ufìufTžuf¼žuf$ŸufŒŸufôŸuf\ ufÄ uf,¡uf”¡ufü¡ufd¢ufÌ¢uf4£ufœ£uf¤ufl¤ufÔ¤uf<¥uf¤¥uf ¦uft¦ufܦufD§uf¬§uf¨uf|¨ufä¨ufL©uf´©ufªufŒªufôªuf\«ufÄ«uf,¬uf”¬ufü¬ufd­ufÌ­uf4®ufœ®uf¯uf`¯uf´¯uf°uf`°uf¸°uf±ufl±ufıuf²ufl²ufÔ²uf,³uf„³uf´³uf¼³ufȳufà³uf´uf@´uf|´ufÀ´ufß0Ið°‡–—˜™šžPRTV€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯²³´¶·¼ÂÃÄÆÇÌÒÓÖ×âãäæçòóôö÷üûûûûûûûûûûûû9cAÊĽ%ɾ\¿)ÑäÝ㦠¶  ± ! ` " Ü ~ » | j}~dñ:‹eú‡¢pOŽastoaƒáÑ‹¼ÐbÖT€ìtV¯ŽÛ Ô k Ó 4!!!‘"h""i"ÿ#±#²#Æ$w$x$%#ѹ—•–˜Ÿš^]Þg³ ” š ™ › µ / ¨ ´³ ¶Ùª©­ÛQ|×Ï!’ "! "þ#%$c$Õ%Û&Ú&C':((4(@)¯*+,,ÿ-.†/ 0;151´2 34‡5ý6 7Ì8ç9Ò:®;D<é=è=I>H>}?|?~@@iAµAžB™BCCûD‘DïEîEŒFhGlG´G°H5I¸JßKàKúLÿLMPN=NÊOÉOñPèQüR÷SþS·TõUûUñVëV÷WöWòXìXöYüYóZðZø[ô[\ ]›]^_ÿ_$`ØaÖa—b•bôcùcUdTd{ezeDf@fXgWg:h~iëj$kqkylímìmVnooÎpÍpJqHqZrPrrsqsYtGttusv¼wCx˜y–yÎz{¡|œ|þ}n~N~vº€¯®‚‚Ÿƒ&„d„g…<†‡‡ ˆê‰é‰ÙŠ×Šè‹(Œ#Œ'e8Ž67ÅŒ‘‹‘‘L’N’“œ“±”¯”F•U•L–j——K˜I˜Ô™Ó™²š°š››ßœ¸·žŸ£ ¤¡x¢w¢Ð£ ¤F¥¦7§G¨«©ÉªU«“¬K­{®Ò¯î°í±…²H³Æ´XµW¶I·®¸­¸ô¹sºÙ»;¼È½¾ˆ¿ŠÀ‰ÀÅÁÐÂÏÂïÃwÄvÄÅÅ Æ Æ¢Ç¡Ç È ȃÉ‚ÉÞÊÝÊ­ˬËÖÌÕ̹͸ÍÎËÏÌÏÐÐÏÐùÑýÑÆÒ1Ó0Ó–Ô•Ô[ÕQÕ\ÖRÖ]×S×MØOØÙGÚVÚõÛ÷ÛöÜøÜ=‚m”¢ ”œµ·/.¨§   ­ ¬ Û Ú     QS|‰×ÏÎ!’“"# þý#"ÕÔCB @?¯°†ˆ   :!9!~"u"ë#ê#!$*$o%p%F&b&''«(¾(Q)“){)**,+++ÿ,þ,--´.³. //¶0µ07161É2Ê2U3T3’4…4ö5õ5ý6ü67’7€78899$::þ;ý;GË>ˆ?h?{@z@vAuAB BçCæC®D­DDEEECFDFºG¹G‚HtHŸI¨IÐJÏJ K KÒLÑL<M N‘N OOÆPÇPÅQÄQ¶R·R¼SÎTÍTgUfUèV VKW¶WHX¸XXYYWZyZI[R[s\‹\Ò]Ó]ô^ó^Ù_Ø_;``íaëaîbìbïc‚cÈdÌdÙeØeff€gVi¼½Íà0;†²!✡ñ ï ~ q ˜ ¤ ð  ñ  òâ62äßVi†²~câßœ¡ÝÑB Ë Í ‰ Vi†²âßÅÀñïÚ¿?>J ¤ 6 2 À ¼ ä ã _ ^ ½¼"åænj2,¥SB.ÌËÎÍ©¤šÜÇÝÒÞÓ® o‡jȱZ ` _ M ð é ) 0 « “ ¬È§«ªÆ¥©„q«Ç¦ªîô…r- .  f e  3  w x ~ Œ M T „         ! " ! # # $ $ % & & ' ' + ( 0 ) 5 * ; + @ , B - C . D / E 0 F 1 M 2 Q 3 R 4 S 5 T 6 U 7 V 8 ƒ 9 !Š ! " " # # $ $ % % & & ' ' ( (à )/ )¿ )Á *1 *½ * +¾ +2 +Ø ,ä ,4 ,× -È -6 -Ù .ò .7 .¦ /8 / /¢ 0š 09 0 1: 1“ 1Œ 2‹ 2< 2Ž 3¦ 3= 3» 4> 4£ 4º 5? 5ž 5\ 6_ 6A 6  7Ä 8'   p f ð $  S R æ å ë ê a ` E È í ê å K J [   Ò Õ â á ó ò   Ÿ ‹   [ W õ å   % ’ ” — Ö Ü Ÿ   Á é í ö ÷    - 1 2 3 r } Š   ç ó + 9 s ” • ž   ´ !µ "Á #à $Ë %û & ' ( ) *X + ,k -l .m /u 0v 1y 2z 3ƒ 4è 5 6ç 7; 8¬ 9( 3 k  À  £ š ¨  /  =iONa^˜—*/àßûüP_ˆ ‡ † ƒ 6 2 › “ C ? YZL>=kbùÔøÊÛÚÚㆺ²}r³Ÿ‘úÉúÇ€!_\ip o!"#`$„$0%;%s&F&œ'¡''62¶°¥¤    H    L *Km)J[lyI(kGxZ…j r!"w#"$~%%&„' ()*+ ,!-#.$/&0'1+20354;5@6B7C8D9E:F;MS?T@UAVBWCXDYE\F`GaHbIdJeKfLgMhNiOnPsQzRS†TU,VNW]XoYtZ{[€\‡]^-_O`^apbuc|deˆfg.hPi_jqkvl}m‚n‰op3qcrst¢¦O§(î)-+ , ï * g [VâNÅ3MRQPz u v { | ywx&'úøçæ¾¼^Y ùĻܛšÃÂ@ ?   D ?  A ‘ @=>ŽIEA@fedc¨°   ZaÛßÝlj¡>™–^ L 5!4!º""W#<#C$B$²%±%ã&á&]'K'c(d(&))Y*A*G+F+J,H,›-<.8.X/>/ª0©0×1¿1Á2À2[3C3Z4B4ä5E6U6m7n7l8k8)9<9Þ:Õ: ; ; §< ¿< Ã= Â= m> h> n? o? ¹@£@7A1A8B:BáCàCMDUDOEVEžF™F¥G¹H»IåJKŠL]MbNYvfYvfYvf YvfYvfYvfYvfYvfYvf#Yvf'Yvf+Yvf/Yvf3Yvf6Yvf:Yvf?YvfEYvfLYvfVYvfdYvfhYvflYvfoYvftYvfxYvf{YvfYvfƒYvf†Yvf‹YvfYvf“Yvf–Yvf™YvfžYvf¡Yvf¤Yvf©Yvf¬Yvf¯Yvf±YvfµYvf¹Yvf¼YvfÀYvfÅYvfËYvfÏYvfÒYvfÖYvfÚYvfáYvfåYvfèYvfìYvfðYvfôYvføYvfüYvfÿYvfZvfZvf ZvfZvfZvfZvfZvfZvfZvf"Zvf%Zvf'Zvf,Zvf0Zvf4Zvf8Zvf\vfA\vfF\vfM\vfX\vfh\vfu\vf€\vf¤\vf±\vf»\vfÅ\vfÞ\vf÷\vf]vf]vf]vf ]vf%]vf,]vf2]vf@]vfI]vfL]vfP]vfU]vfY]vf_]vfm]vf€]vfŽ]vf ]vf©]vf±]vf¶]vf¸]vf»]vf¾]vfÃ]vfÌ]vfÑ]vf×]vfà]vfð]vfû]vf^vf^vf ^vf ^vf^vf^vf ^vf+^vf0^vf8^vf=^vfC^vfM^vfY^vf_^vfl^vfr^vfu^vfx^vf~^vf‚^vfˆ^vf–^vf™^vfž^vf§^vf³^vfÄ^vfË^vfÚ^vfê^vfõ^vfø^vfý^vf_vf _vf_vf!_vf,_vf8_vfB_vfO_vfT_vf]_vfb_vfh_vf|_vf‹_vf£_vf¥_vf¨_vf­_vf±_vfÄ_vfÖ_vfà_vfø_vfý_vf`vf `vf`vf`vf*`vf8`vf;`vf>`vfB`vfH`vfO`vfV`vf\`vfc`vfi`vfp`vfw`vf}`vf„`vf‹`vf’`vf˜`vfž`vf¤`vfª`vf°`vf¶`vf¼`vfÂ`vfÈ`vfÎ`vfÔ`vfÚ`vfà`vfæ`vfì`vfò`vfø`vfþ`vfavf avfavfavfavf"avf(avf+avf2avf7avfMavfcavfyavfavf¥avfªavf³avf¶avf½avfÀavfÄavfÎavfÝavfîavfbvf bvfEbvfYbvfpbvfxbvf€bvfˆbvfbvfŸbvfµbvfÀbvfËbvfäbvfübvfcvfkvfKkvfRkvfXkvfgkvfpkvf~kvfƒkvf‰kvfkvf™kvfžkvf§kvf¬kvf®kvf±kvf´kvf¸kvfÉkvfÓkvfÝkvføkvflvf lvflvflvf/lvf:lvfNlvfblvfrlvf…lvfŠlvflvf—lvfšlvfŸlvf¦lvf³lvf·lvf¿lvfÄlvfÈlvfÑlvfêlvfûlvf mvfmvfmvfmvfmvf"mvf)mvf,mvf0mvf;mvf@mvfLmvfmmvfqmvfvmvfˆmvfmvf•mvf¨mvf¸mvf»mvfÎmvfßmvfõmvfnvf nvfnvfnvf,nvf1nvf6nvfKnvfanvfmnvfynvfƒnvf‘nvf˜nvf¦nvf©nvf­nvf¶nvf»nvfÀnvfÉnvfÒnvf×nvfànvfãnvfænvfìnvfønvfovfovfovf ovf#ovf&ovf*ovf1ovf6ovf;ovfCovfRovf^ovfeovflovf{ovfƒovfˆovf‘ovfovf°ovfËovfÓovfÙovfÞovféovfïovfüovfpvfpvfpvfpvfpvfpvfpvf"pvf)pvf.pvf2pvf7pvf=pvfDpvfNpvf_pvfipvf|pvf†pvfpvfšpvf©pvfÁpvfÐpvfßpvfîpvfópvföpvfùpvfqvf qvfqvf#qvf/qvfDqvfWqvfkqvfpqvfwqvf~qvfqvfqvf qvf¥qvf«qvf°qvf¸qvfÉqvfÚqvfäqvfíqvfûqvfrvfrvfrvf rvf rvf#rvf)rvf3rvfCrvfQrvfUrvfYrvf]rvf`rvfcrvffrvfqrvfurvfrvf†rvfrvf’rvf™rvf›rvfžrvf¦rvf³rvf½rvfÂrvfÊrvfÙrvfÞrvfãrvfðrvfsvf&svf4svf?svfBsvfEsvfHsvfLsvfSsvfXsvfdsvfssvf‰svfŽsvf“svf£svf·svf¼svfÆsvfÍsvf×svfÛsvfèsvf tvf.tvfCtvfdtvf‡tvfžtvf¯tvfÀtvfÐtvfÜtvfêtvfítvfòtvfõtvfuvfuvf#uvf7uvfGuvfLuvfVuvf[uvfauvfpuvfxuvf„uvf•uvfšuvfœuvfŸuvf¢uvf¦uvfªuvf±uvf´uvfºuvf½uvfÅuvfÍuvf×uvfàuvfãuvfçuvfìuvfïuvfòuvfúuvfvvfvvf'vvf,vvf7vvfFvvfQvvfVvvfdvvfqvvftvvfwvvf{vvf~vvfvvf‡vvfŽvvfšvvf¢vvf®vvf»vvf¿vvfÂvvfÆvvfÍvvfÑvvfÕvvfÚvvfàvvfçvvfìvvfñvvfùvvfþvvfwvfwvf#wvf-wvf5wvf{vfC{vfN{vfQ{vfT{vf^{vfe{vfh{vfk{vfp{vf{vf‰{vf—{vf›{vf¥{vf¨{vf°{vf¸{vf½{vfÂ{vfÇ{vfÓ{vfØ{vfà{vfã{vfæ{vfì{vf÷{vf |vf |vf|vf|vf |vf,|vf/|vf5|vfD|vfP|vfg|vfp|vfs|vfw|vf~|vf|vf‡|vf‹|vf|vfš|vf§|vf»|vf¿|vfÊ|vfÕ|vfÛ|vfç|vf}vf}vf&}vf<}vf^}vfv}vf“}vf°}vf¸}vfÀ}vfÏ}vfÙ}vfâ}vfå}vfê}vfö}vfý}vf~vf ~vf~vf~vf~vf"~vf+~vf0~vf4~vf:~vfB~vfJ~vfV~vfi~vfn~vft~vfy~vf~~vf„~vf‰~vfŽ~vf’~vf~vf¬~vf±~vf¸~vf½~vfÑ~vfÖ~vfÛ~vfà~vfå~vfì~vfñ~vfù~vfþ~vfvfvf"vf+vf/vf<vfQvf\vfovf{vfˆvf”vf¤vf»vfÀvfÂvfÇvfÏvfÔvfÝvfãvfðvf€vf?€vfP€vfX€vf[€vfa€vfk€vf{€vf}€vf€vf†€vf˜€vf«€vfÈ€vfÑ€vfá€vfæ€vfï€vfý€vfvf vfvf"vf1vfBvfLvfOvfRvfXvfZvf^vfavflvfqvftvfyvfƒvfŽvf‘vf˜vfŸvf¤vf°vfµvf¾vfÃvfÈvfËvfÍvfÑvfÛvfçvfëvfîvfóvfúvf‚vf‚vf'‚vf,‚vf3‚vf5‚vf8‚vf=‚vfC‚vfH‚vfK‚vfN‚vfQ‚vfT‚vf\‚vfa‚vf è ß ,àÿÿÿàÿÿÿÇàÿÿÿ¿ àÿÿÿ ç f ¿àÿÿÿF yÿÿÿÿ9ÿÿÿÿÿÿ‡ÿÿÿÔþÿÿôþÿÿÃÒÎÍOÊËÏaÓÑ£Õ‚ÖÚÙÛ8ÿÿÿÿþÿÿÿÿÿÿÿ±ÿÿÿŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*?*=ÿÿÿEG***.ÿÿÿ2ÿÿÿ3ÿÿÿ6ÿÿÿ5ÿÿÿ1ÿÿÿ(¥D¥/ÿÿÿ-ÿÿÿ÷)ý)+ÿÿÿ*ÿÿÿç)&ÿÿÿ»ÿÿÿ'ÿÿÿ¹ÿÿÿ%ÿÿÿTty&%@?C > ` 9\¬ÿÿÿ % Výÿÿ 6 P / }ÚÿÿÿÛÿÿÿ3àÿÿÿàÿÿÿ@àÿÿÿ<Œÿÿÿàÿÿÿàÿÿÿ6ùüÿÿàÿÿÿàÿÿÿàÿÿÿ0áÿÿÿàÿÿÿÿÿÿÿàÿÿÿàÿÿÿ]ÀÿÿÿÁÿÿÿÂÿÿÿâÿÿÿÇÿÿÿçÿÿÿ#ÑÿÿÿñÿÿÿÊÿÿÿêÿÿÿøÿÿÿªÿÿÿÊÿÿÿ°ÿÿÿÐÿÿÿ¤ÿÿÿÄÿÿÿÝÿÿÿ ÿÿÿÀÿÿÿùÿÿÿP°ÿÿÿñÿÿÿ0Ðÿÿÿ`Šæ;ÿÿÿÿ:ÅÿÿÿÆÿÿÿAâÿÿJVd€p~ ¶ÿÿÿ÷ÿÿÿ‡ãÿÿÛãÿÿûãÿÿªÿÿÿ½ãÿÿœÿÿÿÍãÿÿÿÿÿ€ÿÿÿ‚ÿÿÿƒâÿÿ£âÿÿ!ßÿÿAßÿÿšßÿÿºßÿÿäÿÿÿðÿÿÿæÿÿÿ ÖÿÿñÿÿÖÿÿÕÕÿÿØÕÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿ ãÿÿüuÿÿØZÿÿ¼Zÿÿ(Øÿÿÿ ”ÿÿÿs9ÿÿÿsn‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛzþÿÿ ŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?)âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0Þÿÿÿ‚`Òáÿÿ1Ýáÿÿßáÿÿ àáÿÿ Çáÿÿ¾ÆÿÿÿÕáÿÿsøÿÿÿuäÿÿsäÿÿqäÿÿoäÿÿB€ÿÿÿ¹xÿÿÿ¹ÿÿÿ¹ˆÿÿÿ¹Àÿÿÿ¹¸ÿÿÿ¹¾ÿÿÿ¹þãÿÿ¹øãÿÿ¹ûãÿÿBúãÿÿB¹¶ÿÿÿõãÿÿ¹ûãÿÿ²ÿÿÿ¹ôãÿÿ¹êãÿÿ¹ñãÿÿBðãÿÿB¹ªÿÿÿëãÿÿ¹çãÿÿæãÿÿããÿÿBâãÿÿBœÿÿÿããÿÿâãÿÿÝãÿÿßãÿÿBÞãÿÿBÿÿÿŠÿÿÿ¹Öãÿÿ¹Úãÿÿ¹ÓãÿÿBÒãÿÿB¹€ÿÿÿ‚ÿÿÿÍãÿÿ¹£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿfÿÿfeÿÿidÿÿlcÿÿfibÿÿflnÿÿtmÿÿta ÿÿv` ÿÿe_ ÿÿkh ÿÿv] ÿÿm(°½uflibgcc_s_dw2-1.dll__register_frame_infolibgcj-12.dll_Jv_RegisterClasses__deregister_frame_info@tf,tftf tfütfìtfTtfÈtf£tfÂtf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf¸tf£tf£tf£tf¸tfÂtf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tf£tfÂtf£tfØtf£tfØtf£tf£tfÂtfªtfªtføtføtføtføtføtføtfªtfªtfªtfªtføtføtføtføtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtfªtføtføtføtføtføtføtføtføtfªtfªtfªtfªtfªtfªtfªtføtføtføtføtføtføtføtføtføtføtføtføtføtføtføtføtf²tfçtf²tf²tf²tf²tf²tf²tftf²tfÄtf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tfütf²tfptf|tfütftf²tf²tf²tf²tf²tf²tf²tf²tf²tfptfptfptfptfptfptf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tf²tfétf²tfétfÄtf²tfÄtfStfStfitfitfitfitfitfitfStfitfStfStfitfitfitfitfitfitfitfStfitfitfitfitfitfitfStfitfStfStfStfStfStfStfStfitfitfitfitfitfitfitfitfStfStfStfStfStfStfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfitfnn:has_property_valuennn:get_all_casesUx$tfý"tfý"tfý"tfý"tfý"tfý"tf¸#tfT$tfì#tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tf $tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tfý"tf#tf#tfX#tf#tft#tf„#tf0$tfØ#tfh#tf¤$tfý$tfß$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf²$tf¤$tf¤$tf¤$tf¤$tf¤$tfÁ$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf¤$tf„$tfnnerror_regex_coretoo much backtrackingconcurrent not int or Nonegroup indices must be integers or strings, not %.200sgroup indices must be integers or stringsinvalid RE codestring indices must be integersinvalid group referenceexpected bytes instance, %.200s foundexpected string instance, %.200s foundexpected str instance, %.200s foundno such groupinvalid replacementinternal error in regular expression engine /tfD/tfh/tf/tf¬/tfÌ/tfì/tf0tf80tfô.tfT0tfÚ.tfÚ.tfÚ.tfÚ.tfÚ.tf`0tfÚ.tf/tfregex.Regex(, flags= | regex.=)DFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfTFtfFtfFtfFtfhFtfFtfFtfFtfFtfFtfFtfFtfFtfFtfFtf|FtfFtfFtfFtfˆFtfFtfFtfFtf”FtfFtfFtfFtf FtfFtfFtfFtfFtfFtfFtfFtf$Ftf¬HtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtf|HtfzGtfzGtfzGtfPHtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtf(HtfzGtfzGtfzGtfHtfzGtfzGtfzGtfäGtfzGtfzGtfzGtfÈGtfzGtfzGtfzGtfzGtfzGtfzGtfzGtfGtfüHtfüHtfItfItf”Itf”ItfItfItfdItfdItfItfItf,Itf,ItfLtfèKtfèKtfLtfLtfèKtfèKtfLtfLtfèKtfèKtfLtføKtfèKtfèKtføKtfPNtfPNtfQtfQtfüPtfÜPtfÈPtfœPtfPNtfPNtfPNtfPNtfPtf€PtfDPtfPtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPNtfPtføOtfÄOtfOtf€Otf4OtfàNtf´NtfPNtfPNtfPNtfPNtfPNtfPNtfPNtf¬NtfHNtf„Ntf\Ntf¬NtfHNtf„Ntf\Ntf¬NtfHNtf„Ntf\Ntf¬NtfHNtf„Ntf\NtfMQtfMQtfÎQtfRtfRtf Rtf!RtfNRtfMQtfiRtf‰RtfMQtfÅRtfûRtfFStf]StfrStf’Stf²StfMQtfÒStfúStfTtf)TtfBTtf[TtfMQtf{TtfMQtfMQtfMQtfMQtfMQtfMQtfMQtf›TtfÙTtf UtfUtf;UtftUtfÙUtf?VtfMQtfMQtfMQtfMQtfMQtfMQtfTVtfdVtfVtfÖVtfèVtfdVtfVtfÖVtfèVtfdVtfVtfÖVtfèVtfdVtfVtfÖVtfèVtfýVtfWtf0Wtf?Wtf_Wtf¼Wtf$Ytf¢XtföYtfoQtfcan't use a bytes pattern on a string-like objectcan't use a string pattern on a bytes-like objectexpected string or bufferbuffer is NULLbuffer has negative sizebuffer size mismatchy#nO:fold_case«tf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf«tf‚ªtf‚ªtf‚ªtføªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtfèªtf‚ªtf‚ªtf‚ªtfèªtf‚ªtf‚ªtf‚ªtfèªtf‚ªtf‚ªtf‚ªtfèªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf‚ªtf˜ªtfð¬tf‚¬tf¦¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tfä¬tf‚¬tf”¬tf‚¬tf‚¬tf¦¬tf”¬tfÀ¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tf‚¬tfˆ¬tf‚¬tfˆ¬tfp¬tf‚¬tfp¬tfQ±tfˆ¾tf4¾tf4¾tf4¾tf4¾tf4¾tf4¾tfP½tf ½tf¨»tf„ºtflºtflºtflºtflºtf ½tf ½tf ½tfQ±tfTºtfTºtfTºtfTºtfTºtf ½tfð¸tf ½tf¤¶tfµtf¬´tfŒ³tf¤¶tf²tfQ±tflºtflºtflºtflºtfx²tfx²tfx²tfx²tf²tf²tf²tf²tf²tf²tfTºtfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfð±tfTºtfTºtfTºtf ½tfܱtfܱtfܱtfܱtfܱtfܱtfh±tfh±tfh±tfh±tfh±tfh±tf¸tf¸tfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtf¸tf¸tf¸tf¸tfkÂtfkÂtfkÂtfkÂtf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tf¸tfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtf¸tf¸tf¸tf¸tf¸tf¸tf¸tfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtfkÂtf¸tfkÂtfOnOOOOOnOnn:re_compileûÐtfûÐtf ÕtfŒÕtftÕtf8Õtf ÕtfÜÔtfûÐtfûÐtfûÐtfûÐtf”Ôtf\Ôtf ÔtfÌÓtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtf”Ótf\Ótf ÓtfäÒtfœÒtfdÒtf(ÒtfÔÑtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtfûÐtf¤ÑtftÑtfDÑtfÑtf¤ÑtftÑtfDÑtfÑtf¤ÑtftÑtfDÑtfÑtf¤ÑtftÑtfDÑtfÑtf|O:groupsformat|O:groupdictO|OOnO:scannerO|nO:splitterëtfëtfôtfàëtfàëtf ótf¼ötf°ôtfëtflôtfëtfëtf,ôtfàötfŒötflðtf(ðtfHötfötfëtf@ótfëtf(ótfótfëtf¼òtfëtfxòtfëtfëtfëtfëtfëtfëtfëtfHòtftõtfDõtfõtfÔôtfÔõtf¤õtfhïtfëtfëtfëtfëtfëtfëtfLïtføñtfÐñtf òtf@ñtføñtfÐñtf òtf@ñtføñtfÐñtf òtf@ñtføñtfÐñtf òtf@ñtfhñtfëtfÈëtfÜïtf¨ïtf¬ðtfÜîtf¨îtftîtfÌótfæìtf,uftuf¨ufÏufuflufufðufQuf uf| ufº uf¼ufufùùtf`útfˆûtfôûtfæìtfuf€ufÔuf,uf¯ uf ufÃýtfHþtf´þtfæìtfjÿtföuf& ufufæìtf4ufÈútf(ûtfÎuf‹#ufufxufÓuf&uf”uftuf8uf$uf|ufRuf0 uf ufuftuf0 uf ufuftuf0 uf ufuftuf0 uf ufuftufÔufñuf.ufKuf´ufžufÜ ufoufò ufÇ uföufè#ufð ufE#uf`ütf©ütfæìtfæìtfBufFufØuf~uf#ufûuf²ufæìtfæìtfÌuf•ùtf4ùtfäøtf’øtfBøtf¸ùtf´1ufNútfÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufx0ufp/uf4/ufø.ufÄ0ufÄ0ufÄ0ufÄ0ufp/ufp/ufp/ufNútfp/ufp/ufp/ufp/ufp/ufp/uf 3ufp/uf2ufNútfT2ufNútf2uf2ufNútfÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufp4uf\3uf\3ufp4ufp4ufp4ufp/ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufÄ0ufp/ufp/ufp/ufp/ufp4ufh5ufh5ufp4ufp4ufp4ufNútfNútfNútfNútfNútfNútf°.ufT.ufH-ufNútfÀ,ufNútf+ufˆ*uf)ufÈ(ufl(ufä'ufHEuf£DufóCufOCufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8ufæ8uf³BufBufcAufÃ@uf#@uf~?uf°KufLKufàJufnJuf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=uf&=ufõIuf Iuf"Huf¦Guf.Guf°FufO|OOnO:findallO|nO:splitO|OOO:searchO|OOO:fullmatchO|OOO:match_compile_replacement_helperregexNnOO|nOOO:subnOO|nOOO:subMAGICCODE_SIZEcopyrightiiORE_OP_FAILURERE_OP_SUCCESSRE_OP_ANYRE_OP_ANY_ALLRE_OP_ANY_ALL_REVRE_OP_ANY_REVRE_OP_ANY_URE_OP_ANY_U_REVRE_OP_ATOMICRE_OP_BOUNDARYRE_OP_BRANCHRE_OP_CALL_REFRE_OP_CHARACTERRE_OP_CHARACTER_IGNRE_OP_CHARACTER_IGN_REVRE_OP_CHARACTER_REVRE_OP_DEFAULT_BOUNDARYRE_OP_DEFAULT_END_OF_WORDRE_OP_DEFAULT_START_OF_WORDRE_OP_ENDRE_OP_END_OF_LINERE_OP_END_OF_LINE_URE_OP_END_OF_STRINGRE_OP_END_OF_STRING_LINERE_OP_END_OF_STRING_LINE_URE_OP_END_OF_WORDRE_OP_FUZZYRE_OP_GRAPHEME_BOUNDARYRE_OP_GREEDY_REPEATRE_OP_GROUPRE_OP_GROUP_CALLRE_OP_GROUP_EXISTSRE_OP_LAZY_REPEATRE_OP_LOOKAROUNDRE_OP_NEXTRE_OP_PROPERTYRE_OP_PROPERTY_IGNRE_OP_PROPERTY_IGN_REVRE_OP_PROPERTY_REVRE_OP_RANGERE_OP_RANGE_IGNRE_OP_RANGE_IGN_REVRE_OP_RANGE_REVRE_OP_REF_GROUPRE_OP_REF_GROUP_FLDRE_OP_REF_GROUP_FLD_REVRE_OP_REF_GROUP_IGNRE_OP_REF_GROUP_IGN_REVRE_OP_REF_GROUP_REVRE_OP_SEARCH_ANCHORRE_OP_SET_DIFFRE_OP_SET_DIFF_IGNRE_OP_SET_DIFF_IGN_REVRE_OP_SET_DIFF_REVRE_OP_SET_INTERRE_OP_SET_INTER_IGNRE_OP_SET_INTER_IGN_REVRE_OP_SET_INTER_REVRE_OP_SET_SYM_DIFFRE_OP_SET_SYM_DIFF_IGNRE_OP_SET_SYM_DIFF_IGN_REVRE_OP_SET_SYM_DIFF_REVRE_OP_SET_UNIONRE_OP_SET_UNION_IGNRE_OP_SET_UNION_IGN_REVRE_OP_SET_UNION_REVRE_OP_START_OF_LINERE_OP_START_OF_LINE_URE_OP_START_OF_STRINGRE_OP_START_OF_WORDRE_OP_STRINGRE_OP_STRING_FLDRE_OP_STRING_FLD_REVRE_OP_STRING_IGNRE_OP_STRING_IGN_REVRE_OP_STRING_REVRE_OP_STRING_SETRE_OP_STRING_SET_FLDRE_OP_STRING_SET_FLD_REVRE_OP_STRING_SET_IGNRE_OP_STRING_SET_IGN_REVRE_OP_STRING_SET_REVRE_OP_BODY_ENDRE_OP_BODY_STARTRE_OP_END_FUZZYRE_OP_END_GREEDY_REPEATRE_OP_END_GROUPRE_OP_END_LAZY_REPEATRE_OP_GREEDY_REPEAT_ONERE_OP_GROUP_RETURNRE_OP_LAZY_REPEAT_ONERE_OP_MATCH_BODYRE_OP_MATCH_TAILRE_OP_START_GROUP_regex.Patternmatchfullmatchsearchsubsubfsubnsubfnsplitsplititerfindallfinditerscanner__copy____deepcopy__patternThe pattern string from which the regex object was compiled.flagsThe regex matching flags.groupsThe number of capturing groups in the pattern.named_listsThe named lists used by the regex.groupindexA dictionary mapping group names to group numbers._regex.Matchgroupstartendspangroupdictcapturesdictexpandexpandfcapturesstartsendsspansdetach_string__getitem__reThe regex object that produced this match object.posThe position at which the regex engine starting searching.endposThe final position beyond which the regex engine won't search.lastindexThe group number of the last matched capturing group, or None.lastgroupThe name of the last matched capturing group, or None.regsA tuple of the spans of the capturing groups.stringThe string that was searched, or None if it has been detached._regex.ScannerThe regex object that produced this scanner object._regex.SplitterThe regex object that produced this splitter object._regexoverlappedconcurrentmaxsplitcountrepldefaultÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€tfTtf°tftfdtf¼tfABDSFILMRTXV0V1WäWvf€æWvfèWvfêWvfìWvf@îWvfðWvfòWvfôWvföWvføWvf@úWvf ýWvfXvfcompileget_code_sizeget_propertiesfold_caseget_expand_on_foldinghas_property_valueget_all_cases-1/2011/101/161/21/31/41/51/61/71/81/91010010001000010000010000000010000000000001031071111/2118121221291313/2130132141515/2161717/2181922/32/52020020002000020221214216216000218222202222242262282323023223323424240252627282933/163/23/43/53/83030030003000031323334353637383944/54040040004000041424343200044454647484955/25/65/85050050005000066060060006000077/27/8707007000700008808008000800008499/29090090009000091AABOVEABOVELEFTABOVERIGHTAEGEANNUMBERSAHEXAIAINALALAPHALCHEMICALALCHEMICALSYMBOLSALEFALETTERALNUMALPHAALPHABETICALPHABETICPFALPHABETICPRESENTATIONFORMSALPHANUMERICAMBIGUOUSANANCIENTGREEKMUSICANCIENTGREEKMUSICALNOTATIONANCIENTGREEKNUMBERSANCIENTSYMBOLSANYARARABARABICARABICEXTAARABICEXTENDEDAARABICLETTERARABICMATHARABICMATHEMATICALALPHABETICSYMBOLSARABICNUMBERARABICPFAARABICPFBARABICPRESENTATIONFORMSAARABICPRESENTATIONFORMSBARABICSUPARABICSUPPLEMENTARMENIANARMIARMNARROWSASCIIASCIIHEXDIGITASSIGNEDATATAATARATBATERMATTACHEDABOVEATTACHEDABOVERIGHTATTACHEDBELOWATTACHEDBELOWLEFTAVAGRAHAAVESTANAVSTBB2BABALIBALINESEBAMUBAMUMBAMUMSUPBAMUMSUPPLEMENTBASICLATINBATAKBATKBBBCBEHBELOWBELOWLEFTBELOWRIGHTBENGBENGALIBETHBIDICBIDICLASSBIDICONTROLBIDIMBIDIMIRROREDBINDUBKBLBLANKBLKBLOCKBLOCKELEMENTSBNBOPOBOPOMOFOBOPOMOFOEXTBOPOMOFOEXTENDEDBOTTOMBOTTOMANDRIGHTBOUNDARYNEUTRALBOXDRAWINGBRBRAHBRAHMIBRAIBRAILLEBRAILLEPATTERNSBREAKAFTERBREAKBEFOREBREAKBOTHBREAKSYMBOLSBUGIBUGINESEBUHDBUHIDBURUSHASKIYEHBARREEBYZANTINEMUSICBYZANTINEMUSICALSYMBOLSCC&CAKMCANCANADIANABORIGINALCANADIANSYLLABICSCANONICALCANONICALCOMBININGCLASSCANSCARICARIANCARRIAGERETURNCASEDCASEDLETTERCASEIGNORABLECBCCCCCCCC10CCC103CCC107CCC11CCC118CCC12CCC122CCC129CCC13CCC130CCC132CCC133CCC14CCC15CCC16CCC17CCC18CCC19CCC20CCC21CCC22CCC23CCC24CCC25CCC26CCC27CCC28CCC29CCC30CCC31CCC32CCC33CCC34CCC35CCC36CCC84CCC91CFCHAKMACHAMCHANGESWHENCASEFOLDEDCHANGESWHENCASEMAPPEDCHANGESWHENLOWERCASEDCHANGESWHENTITLECASEDCHANGESWHENUPPERCASEDCHERCHEROKEECICIRCLECJCJKCJKCOMPATCJKCOMPATFORMSCJKCOMPATIBILITYCJKCOMPATIBILITYFORMSCJKCOMPATIBILITYIDEOGRAPHSCJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENTCJKCOMPATIDEOGRAPHSCJKCOMPATIDEOGRAPHSSUPCJKEXTACJKEXTBCJKEXTCCJKEXTDCJKRADICALSSUPCJKRADICALSSUPPLEMENTCJKSTROKESCJKSYMBOLSCJKSYMBOLSANDPUNCTUATIONCJKUNIFIEDIDEOGRAPHSCJKUNIFIEDIDEOGRAPHSEXTENSIONACJKUNIFIEDIDEOGRAPHSEXTENSIONBCJKUNIFIEDIDEOGRAPHSEXTENSIONCCJKUNIFIEDIDEOGRAPHSEXTENSIONDCLCLOSECLOSEPARENTHESISCLOSEPUNCTUATIONCMCNCNTRLCOCOMCOMBININGDIACRITICALMARKSCOMBININGDIACRITICALMARKSFORSYMBOLSCOMBININGDIACRITICALMARKSSUPPLEMENTCOMBININGHALFMARKSCOMBININGMARKCOMBININGMARKSFORSYMBOLSCOMMONCOMMONINDICNUMBERFORMSCOMMONSEPARATORCOMPATCOMPATJAMOCOMPLEXCONTEXTCONDITIONALJAPANESESTARTERCONNECTORPUNCTUATIONCONSONANTCONSONANTDEADCONSONANTFINALCONSONANTHEADLETTERCONSONANTMEDIALCONSONANTPLACEHOLDERCONSONANTREPHACONSONANTSUBJOINEDCONTINGENTBREAKCONTROLCONTROLPICTURESCOPTCOPTICCOUNTINGRODCOUNTINGRODNUMERALSCPCPRTCRCSCUNEIFORMCUNEIFORMNUMBERSCUNEIFORMNUMBERSANDPUNCTUATIONCURRENCYSYMBOLCURRENCYSYMBOLSCWCFCWCMCWLCWTCWUCYPRIOTCYPRIOTSYLLABARYCYRILLICCYRILLICEXTACYRILLICEXTBCYRILLICEXTENDEDACYRILLICEXTENDEDBCYRILLICSUPCYRILLICSUPPLEMENTCYRILLICSUPPLEMENTARYCYRLDDADALDALATHRISHDASHDASHPUNCTUATIONDBDEDECIMALDECIMALNUMBERDECOMPOSITIONTYPEDEFAULTIGNORABLECODEPOINTDEPDEPRECATEDDESERETDEVADEVANAGARIDEVANAGARIEXTDEVANAGARIEXTENDEDDIDIADIACRITICDIACRITICALSDIACRITICALSFORSYMBOLSDIACRITICALSSUPDIGITDINGBATSDOMINODOMINOTILESDOUBLEABOVEDOUBLEBELOWDOUBLEQUOTEDQDSRTDTDUALJOININGEEAEASTASIANWIDTHEGYPEGYPTIANHIEROGLYPHSEMOTICONSENENCENCLOSEDALPHANUMENCLOSEDALPHANUMERICSENCLOSEDALPHANUMERICSUPPLEMENTENCLOSEDALPHANUMSUPENCLOSEDCJKENCLOSEDCJKLETTERSANDMONTHSENCLOSEDIDEOGRAPHICSUPENCLOSEDIDEOGRAPHICSUPPLEMENTENCLOSINGMARKESETETHIETHIOPICETHIOPICEXTETHIOPICEXTAETHIOPICEXTENDEDETHIOPICEXTENDEDAETHIOPICSUPETHIOPICSUPPLEMENTEUROPEANNUMBEREUROPEANSEPARATOREUROPEANTERMINATOREXEXCLAMATIONEXTEXTENDEXTENDEREXTENDNUMLETFFALSEFARSIYEHFEFEHFINFINALFINALPUNCTUATIONFINALSEMKATHFIRSTSTRONGISOLATEFOFONTFORMATFRAFRACTIONFSIFULLWIDTHGAFGAMALGCGCBGENERALCATEGORYGENERALPUNCTUATIONGEOMETRICSHAPESGEORGEORGIANGEORGIANSUPGEORGIANSUPPLEMENTGLGLAGGLAGOLITICGLUEGOTHGOTHICGRAPHGRAPHEMEBASEGRAPHEMECLUSTERBREAKGRAPHEMEEXTENDGRAPHEMELINKGRBASEGREEKGREEKANDCOPTICGREEKEXTGREEKEXTENDEDGREKGREXTGRLINKGUJARATIGUJRGURMUKHIGURUHH2H3HAHHALFANDFULLFORMSHALFMARKSHALFWIDTHHALFWIDTHANDFULLWIDTHFORMSHAMZAONHEHGOALHANHANGHANGULHANGULCOMPATIBILITYJAMOHANGULJAMOHANGULJAMOEXTENDEDAHANGULJAMOEXTENDEDBHANGULSYLLABLESHANGULSYLLABLETYPEHANIHANOHANUNOOHEHEBRHEBREWHEBREWLETTERHEHHEHGOALHETHHEXHEXDIGITHIGHPRIVATEUSESURROGATESHIGHPUSURROGATESHIGHSURROGATESHIRAHIRAGANAHLHSTHYHYPHENIDIDCIDCONTINUEIDEOIDEOGRAPHICIDEOGRAPHICDESCRIPTIONCHARACTERSIDSIDSBIDSBINARYOPERATORIDSTIDSTARTIDSTRINARYOPERATORIMPERIALARAMAICININDICMATRACATEGORYINDICNUMBERFORMSINDICSYLLABICCATEGORYINFIXNUMERICINHERITEDINITINITIALINITIALPUNCTUATIONINMCINSCINSCRIPTIONALPAHLAVIINSCRIPTIONALPARTHIANINSEPARABLEINSEPERABLEINVISIBLEIOTASUBSCRIPTIPAEXTIPAEXTENSIONSISISOISOLATEDITALJAMOJAMOEXTAJAMOEXTBJAVAJAVANESEJGJLJOINCJOINCAUSINGJOINCONTROLJOININGGROUPJOININGTYPEJTJVKAKAFKAITHIKALIKANAKANASUPKANASUPPLEMENTKANAVOICINGKANBUNKANGXIKANGXIRADICALSKANNADAKAPHKATAKANAKATAKANAEXTKATAKANAORHIRAGANAKATAKANAPHONETICEXTENSIONSKAYAHLIKHAPHKHARKHAROSHTHIKHMERKHMERSYMBOLSKHMRKNDAKNOTTEDHEHKTHIKVLL&LAMLAMADHLANALAOLAOOLATINLATIN1LATIN1SUPLATIN1SUPPLEMENTLATINEXTALATINEXTADDITIONALLATINEXTBLATINEXTCLATINEXTDLATINEXTENDEDALATINEXTENDEDADDITIONALLATINEXTENDEDBLATINEXTENDEDCLATINEXTENDEDDLATNLBLELEADINGJAMOLEFTLEFTANDRIGHTLEFTJOININGLEFTTORIGHTLEFTTORIGHTEMBEDDINGLEFTTORIGHTISOLATELEFTTORIGHTOVERRIDELEPCLEPCHALETTERLETTERLIKESYMBOLSLETTERNUMBERLFLIMBLIMBULINBLINEARBLINEARBIDEOGRAMSLINEARBSYLLABARYLINEBREAKLINEFEEDLINESEPARATORLISULLLMLOLOELOGICALORDEREXCEPTIONLOWERLOWERCASELOWERCASELETTERLOWSURROGATESLRELRILROLTLULVLVSYLLABLELVTLVTSYLLABLELYCILYCIANLYDILYDIANMM&MAHJONGMAHJONGTILESMALAYALAMMANDMANDAICMANDATORYBREAKMARKMATHMATHALPHANUMMATHEMATICALALPHANUMERICSYMBOLSMATHEMATICALOPERATORSMATHOPERATORSMATHSYMBOLMBMCMEMEDMEDIALMEEMMEETEIMAYEKMEETEIMAYEKEXTMEETEIMAYEKEXTENSIONSMERCMEROMEROITICCURSIVEMEROITICHIEROGLYPHSMIAOMIDLETTERMIDNUMMIDNUMLETMIMMISCARROWSMISCELLANEOUSMATHEMATICALSYMBOLSAMISCELLANEOUSMATHEMATICALSYMBOLSBMISCELLANEOUSSYMBOLSMISCELLANEOUSSYMBOLSANDARROWSMISCELLANEOUSSYMBOLSANDPICTOGRAPHSMISCELLANEOUSTECHNICALMISCMATHSYMBOLSAMISCMATHSYMBOLSBMISCPICTOGRAPHSMISCSYMBOLSMISCTECHNICALMLMLYMMNMODIFIERLETTERMODIFIERLETTERSMODIFIERSYMBOLMODIFIERTONELETTERSMODIFYINGLETTERMONGMONGOLIANMTEIMUSICMUSICALSYMBOLSMYANMARMYANMAREXTAMYANMAREXTENDEDAMYMRNN&NANANNARNARROWNBNCHARNDNEUTRALNEWLINENEWTAILUENEXTLINENKNKONKOONLNONOBLOCKNOBREAKNOJOININGGROUPNONCHARACTERCODEPOINTNONENONJOININGNONSPACINGMARKNONSTARTERNOONNOTAPPLICABLENOTREORDEREDNRNSNSMNTNUNUKTANUMBERNUMBERFORMSNUMERICNUMERICTYPENUMERICVALUENUNNVNYAOALPHAOCRODIOGAMOGHAMOGREXTOIDCOIDSOLCHIKIOLCKOLDITALICOLDPERSIANOLDSOUTHARABIANOLDTURKICOLETTEROLOWEROMATHONOPOPENPUNCTUATIONOPTICALCHARACTERRECOGNITIONORIYAORKHORYAOSMAOSMANYAOTHEROTHERALPHABETICOTHERDEFAULTIGNORABLECODEPOINTOTHERGRAPHEMEEXTENDOTHERIDCONTINUEOTHERIDSTARTOTHERLETTEROTHERLOWERCASEOTHERMATHOTHERNEUTRALOTHERNUMBEROTHERPUNCTUATIONOTHERSYMBOLOTHERUPPERCASEOUPPEROVOVERLAYOVERSTRUCKPP&PARAGRAPHSEPARATORPATSYNPATTERNSYNTAXPATTERNWHITESPACEPATWSPCPDPDFPDIPEPFPHAGPHAGSPAPHAISTOSPHAISTOSDISCPHLIPHNXPHOENICIANPHONETICEXTPHONETICEXTENSIONSPHONETICEXTENSIONSSUPPLEMENTPHONETICEXTSUPPIPLAYINGCARDSPLRDPOPOPDIRECTIONALFORMATPOPDIRECTIONALISOLATEPOSTFIXNUMERICPRPREFIXNUMERICPREPENDPRINTPRIVATEUSEPRIVATEUSEAREAPRTIPSPUAPUNCTPUNCTUATIONQAACQAAIQAFQAPHQMARKQUQUOTATIONQUOTATIONMARKRRADICALREGIONALINDICATORREGISTERSHIFTERREHREJANGREVERSEDPERIRIGHTRIGHTJOININGRIGHTTOLEFTRIGHTTOLEFTEMBEDDINGRIGHTTOLEFTISOLATERIGHTTOLEFTOVERRIDERJNGRLERLIRLOROHINGYAYEHRUMIRUMINUMERALSYMBOLSRUNICRUNRSS&SASADSADHESAMARITANSAMRSARBSAURSAURASHTRASBSCSCONTINUESCRIPTSDSESEENSEGMENTSEPARATORSEMKATHSENTENCEBREAKSEPSEPARATORSGSHARADASHAVIANSHAWSHINSHRDSINGLEQUOTESINHSINHALASKSMSMALLSMALLFORMSSMALLFORMVARIANTSSMLSOSOFTDOTTEDSORASORASOMPENGSPSPACESPACESEPARATORSPACINGMARKSPACINGMODIFIERLETTERSSPECIALSSQSQRSQUARESTSTERMSUBSUNDSUNDANESESUNDANESESUPSUNDANESESUPPLEMENTSUPSUPARROWSASUPARROWSBSUPERSUPERANDSUBSUPERSCRIPTSANDSUBSCRIPTSSUPMATHOPERATORSSUPPLEMENTALARROWSASUPPLEMENTALARROWSBSUPPLEMENTALMATHEMATICALOPERATORSSUPPLEMENTALPUNCTUATIONSUPPLEMENTARYPRIVATEUSEAREAASUPPLEMENTARYPRIVATEUSEAREABSUPPUAASUPPUABSUPPUNCTUATIONSURROGATESWASHKAFSYSYLOSYLOTINAGRISYMBOLSYRCSYRIACSYRIACWAWTTAGALOGTAGBTAGBANWATAGSTAHTAILETAITHAMTAIVIETTAIXUANJINGTAIXUANJINGSYMBOLSTAKRTAKRITALETALUTAMILTAMLTAVTTAWTEHMARBUTATEHMARBUTAGOALTELUTELUGUTERMTERMINALPUNCTUATIONTETHTFNGTGLGTHAATHAANATHAITIBETANTIBTTIFINAGHTITLECASELETTERTONELETTERTONEMARKTOPTOPANDBOTTOMTOPANDBOTTOMANDRIGHTTOPANDLEFTTOPANDLEFTANDRIGHTTOPANDRIGHTTRAILINGJAMOTRANSPARENTTRANSPORTANDMAPTRANSPORTANDMAPSYMBOLSTRUEUUCASUCASEXTUGARUGARITICUIDEOUNASSIGNEDUNIFIEDCANADIANABORIGINALSYLLABICSUNIFIEDCANADIANABORIGINALSYLLABICSEXTENDEDUNIFIEDIDEOGRAPHUNKNOWNUPUPPERUPPERCASEUPPERCASELETTERVVAIVAIIVARIATIONSELECTORVARIATIONSELECTORSVARIATIONSELECTORSSUPPLEMENTVEDICEXTVEDICEXTENSIONSVERTVERTICALVERTICALFORMSVIRAMAVISARGAVISUALORDERLEFTVOWELVOWELDEPENDENTVOWELINDEPENDENTVOWELJAMOVRVSVSSUPWWAWWBWHITESPACEWIDEWJWORDWORDBREAKWORDJOINERWSWSPACEXDIGITXIDCXIDCONTINUEXIDSXIDSTARTXPEOXSUXXXYYEHYEHBARREEYEHWITHTAILYESYIYIIIYIJINGYIJINGHEXAGRAMSYMBOLSYIRADICALSYISYLLABLESYUDHYUDHHEZZ&ZAINZHAINZINHZLZPZSZWZWSPACEZYYYZZZZ      !""#$%&'"""()*+,-./0123456789:;<=>?@@ABCDEFGEHIEE@J@@KLMNOPQRESTUVWXYEE"""""""""""""""""""""""""""""""""""Z"""""""""""""""""""[\""""""""]""^_`abcdefghi"""""""""""""""""""""""jkkkkkkkkkkkkkkkkllllllllllllllllll""mnop""qrstuvwxyzL{|}~LLLLLL€L‚ƒL„L…LLL†LLL‡ˆ‰ŠLLLLLLLLL‹LLLLLLLLLLLLLLLLLL""""""ŒLLLLLLLL""""""""ŽLLLLLLL""""LLLLLLLLL‘’LLLLLLLLLLLLLLLE“”•–L—L˜™š›œžŸLLLLLLLLLLLL ¡LL¢£¤¥¦L§¨©ª«¬­®¯L"""""""""""""°""""""""""""""""±"²LLLLLLLLLLLLLLL""""²LLLLLLLLLLL³L´µLLLLLLLLLLLLlllllllllllllll¶       !"#$ %& ' ( ) *+ ,- ./ 0123456227 8922222:;<=>2 ?22222@AB2CD2EFG2HIIIIJIIIKLM22NOPQRSTUVWXYZ[TU\]^_`abUcdeYfSTUghiYjklmnop_qrsUtuvYwxsUyz{Y|xs2}~Y€‚2ƒ„…I†‡22ˆ‰ŠII‹ŒŽII‘’“”•2–—˜™ š›œII22žŸ ¡¢£¤ ¥22¦222222222222§¨22§22©ª«222ª222¬­®2¯22222°±2222222222222²2³´2222µ¶·¸2¹2º·»222¼½¾¿ÀÁ¿22Â22Ã22Ä2222Å2–ÆÇÈ2ɰ22ÊËÌÍÎÎ2Ï222ÐÑÒ¿¿ÓIIIIIÔ22ÕÖŸ×ØÙ2ÚB22ÛÜ22ÝÞßB2àIIIIáâãä åæç è éê ë ìíììíîìïðððñòóôõö÷øùúûüýþÿI      ÎÎÎÎÎÎÎÎÎÎÎII   ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎ ÎÎ!ÎÎÎÎÎÎ"Î#ÎÎÎÎÎ$% &ÎÎ'()*+,ÎÎÎ-¯IIIIIIIIII . /01 23 422256278888 9:;<IIIIÎ=ÎÎÎÎÎÎÎÎÎÎ>I?@ABC‡2222D±2222EF2ɇ2222GH23ÎÎ2ÎIJÎKLÎÎJÎÎLÎÎÎI222ÅÎÎÎÎ2222–III2M222222–ÎÎÎ22àN2OI PQ R2222STUVW XYZ[IIII\]2^_222`a22bc¿ dB2e2fg2–M22hijII22klmn2o222pqrstuv8IIIIIIIII22w¿22x2y22Êzzzzzzzz{{{{{{{{222222É222222|II}~€222222‚ƒ„22222…I2222†22ÃII‡ ˆé‰Š‹Œ2222222Ž‘’2“2G”•–—˜2«™ÉÉII22222223š  ›   œ?IIIÎΞ2–222eII2GŸ2 III2¡22¢£II ¤ 2222É¿IIIII¥22¦2§II2¨2©IIII222ªIIII«¬2­®¯2°222±2²2³2222´IIIIIIIII µ¶22·¸¹ºIÙ22»¼2´¿½2¾¿ÀIIIÙ22Á¿II22ÃÄ¿III222222GI      ÅÀ22GIIIII222´IIII2222°ÆËÇÈÉIIIIIIÊIIIIIIIÎÎÎÎÎÎÎ>ÎÎËÎÎÎÌÍÎÎÏÎÎÐIIÎÎÎÎÑIIIÎÎÎÎÎ Ò Ó ÔÕÖì רÙÚÛ Ó ÜÝ Þßàá â Ó ÔÕ ì ×á â Ó ã äåæç è éêëì í î ïðððñ2òóôõö÷øÊùÊIIIúÎÎ?ÎÎÎÎÎÎIû##IIüÎIÎÎÎ?ÎÎIIIIýÎþÎÎÿIIÎÎÎÎÎÎÎÎIÎÎÎÎIÎÎÎÎÎÎÎÎÎÎÎÎÎÐÎIIIIIIIIÎÎÎÎ IIIÎÎÎÎ>IIIÎÎÎÎÎÎÎ222227II222°22222ÉIIIIII I       I{{{{{{{    ! """""""" """ "  "  " " " "" # $$%"&%"""""""" "&  " "" '((((((((())(((((()))))))((*)))**))))))))++++++++ * ,-.,,)/ 00 " 1 "   2" " 3++4 """""" ,,,,1 05678,9:++++++++++++++;<=+<,,,,$$$$$$$$$$$$$>,,$?.,,,,,@@A BC+++++=AD$$$$E++$F$$$$$$$$$G+++H3++IJK++$$LMNE$$$$$$$+++++OP$$$$+++++F,,,,,,,$$$$$$$$E++++(Q,,$$$++J++++J+J++,.$$$$E+,.,,,,,,,,>$$$$$>,,,+++++++++++++O+R$$$$$$$$$$$RFST+++RSTSE+++$$$$$+U$$$P$$$:SP$$$>P>P$$$$$$$$$$>$$$>>,$$,FST+OVWVT>,,,V,,$P$+,$X,,:RP$$>,P>$P>$,OSTO,:O:+,:,,,P$>>,,,+$E,,,,,:RP$$$$P$P$$$$$$>$P$$,FST++:RVT,>,,,,,,,B,,,,,,,>$P$$,FTT+OVWVT,,,,R,,$PM,,,,,FP$$>,$>$$,P>>$,P>,$>,$$$$$$,,SRW,SWST,>,,V,,,,YCCXZ,,VSP$$$>$>$$$$$$$$$P$$,P+RSW+O++,,,:O$,,,,,,,Y,SP$$$>$$$P$$,FTSSWRWS+,,,VW,,,>P>,,,,,,$$$$$>PST+OSWST>,,,V,,,,,[$$$,SP$$$$$$$$>,$$$$P$$$$P,$$$>,O,VS+OOSSSS,S.,,,,,P$$$$$$$E$+++O,9$$$J+++=,,P>>P>>P,,,$$P$$$P$PP,$P$E$+++:F,$$>Q+++,,$$LC\\C+CCC333S$$$$P$$$$$$$$$>,:++++++R++=+$$E+++++:+++++++++OCCCCKCCZC\C.,,$$$$$]T+R+++TRTF$$$S+$$+FS^]SSS$E+F$$$$$$RTRSST]STC 1,,1,$$$$$?D$$$$$>$$,$$$>>$$,>$$,$$$>>$$,$$$$$$$>$$$$$$$$$>:+_`,CCCCC,,,$$>,,,,,a$$$$$$$$$$$$$?Gb$$$$$$$$$$$$cd,$$$$$?ef,,,,,,,$$$$$$>$$+O,,,,,$+=.,,,,$+,,,,,,>+,,,,,,$$+T+++SSSSRT+++++UBE,,,,,,,g<+A$h$$$$$$$$$$,,,,$$$$E>,,$$$,,,,,+RSTRS,,SRSST+,,Z,$$$$$$$,$$$$$$,,SSSSSSSS^$$$S,,,`,CCCCCCCCC$$$ERT,$$]R+++ORRT+++RSST++++O:U,++^$$$$$$$R++RRSSR^$$$,,\CCCC3++++CCCCZ,+^$$$$$$]++S+TS$$$$R+STT+S,,,,$$SSSS++++S+,7,P$$$$$(((,,,,+=++++++R+++F$E$$SF>,,,,(((((((--i((+++O,,,,,,,,,,++   , ,1111,jjjjk lm)k l), n) o),k lpqqqqqr@@ssstutuv@@wxyz{|} {~@@A@@@@@,|€|d((((((Q,,,++++++‚4ƒ4ƒ+++++O,,,,,,,C„C…C"  …C2 CCC„„„ † #$'C 2C‡eeeeeeeeeˆ‰eŠ,,,‹CCCC‹C‹CCC‹CCCCCCCC‹‹CCCCCCCCCCCCCCCCŒCCCCCCCC‹CCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,CCCZ,,,,CCCCCZ,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[CCCCCCCCCCCCCCCCC|Ž|Ž‹, 0k """" "( ‡CC…"‘+ ,,7_6,,6,$$$$,,,5.,,,,,,:$$$>,,,,$$$>$$$>ttxytgttUs,,CCCCC[CCCCC,,,,,CCCCCC,,’“C”•–eeee++S—((Ce˜?C$$$>:™šD$$$$$?(D,,P$$$$$$$$$$$$>CCCCCCCCCCCCCZCCCCCCC›$$h$$$$$$$$$$$œ$,, E4+++++U ,,,:$$$eeeee+,,,,)))š(((()  -""" *ž"k ,,,,,, 0,,,,,,(#$$$F$F$E$$$]TRCC,,CŸ,,,$$,,,,S$$$$$$$$$SSSSSSSSO,,,,+$$$G,,$$$++++$$$E+++++S,,,,,7$ES++SRS 5,,$$$$E++RTRTO,,,,$E$$$$R,,D$$LC],,F+FEF$$+E>,,,,,,,,,,,Ph$$$$$]+Sh¡O,,,,P$$>P$$>P$$>,,,,$]TSR T,$$,,,,,,$$$>,P$$¢¢¢¢¢¢¢¢££££££££$$$$$,,,k,,,,,6,,PF$$$$¤$$$$$$>$$>>$P>$$$$$$)))))))),,,,,,,,P$$$$$$$$$$$$$,$$$$$$$$$$$$$Ÿ,¥},,,¦§}¥}z¨.”}©B,,$$>$$$$$$$$$$$>N7|}$$$$$D$$$$$$$$$$$$$$(,$$$,$$$,$$$,$>,ªX‹Z,,,,N@C,$$$$$$P$$$$$$>$P.,«,[CCCCeeŠYCCCCCCCC`,,CCCCCC3,,,,,,,“$$$$f,,$$$$$$$7$$,,$$$$¬ee,,,,, $$$,>$$$$$$P>,>P$$$7$$$,7$$$$$,,7$$$$,,,$E+:O,,++$$P$P$$$$$,,+O,:,,,,.,,,$$$$$$­$$$,7$$$,$>,,$$$$>,,,`T^$$$$$$$$$$+++++++=,,ST+RT=®,,,,,,,+F$$$$$$$$$E++T+++O,,,,,,$]S++++R^$?.,,,$$$$$ETS+++T,,,,ef,,,,,,]SSSSSSSSSSSSSSW,,,,,,,:+I(((((($,,,,,,,CCCZ[CCCCC¯T+C¯SS°@@@±+++K3+++CCCCCCC++CCCCCCCC,C+K,,,,,,,,,,,,  k 0 ,0101 0 666 1 01 0 0 1 0 00, 0 , ! ! ! ! ! ,$$P$$$$$P>>PP$$$$>$$PP,,,>,PPPP$P>>PPPPPP>>P$>$$$>$$P$>>$$$$$P$$P$P$$P$$,,,,,,,[CCCCCCZ`,,,,,CCCCCCZ,,,,,,CCCCZ,,,C,,,,,,,Z,,,,,,,CCC[CCCCCCCCCCZ,CCZCCZ,,ZCCCCCCCCCCC[CZ,CCCC,,,,,,,,,[CCZ,[CCCCCN,,,,,,,@@@@@@@@£££££££,                        !"################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"""""#$%&'()*+,-./01223345678899:;<=>>?@AABCDDEEFGHIJKLMNOPQRRSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWXYYZ[\]^_`abcdefffffffffffffffffffffffffffffffffffffffghhhhhhhijjjjjjjjkkkkkkkkkkkkkkkkkkllllmnnnnnopqrstuvwxyz{|wwwwww}w~€ww‚wwwƒwww„…†‡wwwwwwwwwˆwwwwwwwwwwwwwwwwww‰‰‰‰‰‰‰‰Šwwwwwww‹‹‹‹‹‹‹‹ŒwwwwwwwŽwwwwwwwww‘‘wwwwwwwwwwwwww’’““”w•w––––––––wwwwwwwwwwww——ww˜™šš››œœœœœœžŸw                             ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¥wwwwwwwwwwwwwww¦¦¦¦§wwwwwwwwwww¨w©ªwwwwwwwwwwww««««««««««««««««¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬  !!!!!!!!""""""""""######$$$$$$$$%%%%%%%%&&''''''(((((((())******++,,--..////////0000000000011111222223334444445566777777777888888889999::::;;;;;<<<=>>>????????@@@@AAAABBBBBBBBCCCCCCCCDDDDDDDEEEFFFGGGHHHHHIIIIJJJJJJJKKKKKKKKLLLLLLLLMMMMNNOOOOOOOOOOPPPPPPPPQQRRRRRRSSSSSSSSTTTTTTTTTTTTUUUVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\]]^^^^^^^^___`````aaaaaabbccccccccddddddddeeeeeeeeeeeeeefgggghhhhhhiiiiiijjjkkkkkklmmnnnoppppppppqqqqqqqqrrrrrrrrrrrrssssttttttttuuuuuuuuuvvvvwwwxxxxxxxxxxxxyyyyyyzzzzzz{{||||||||||||||}}}~€€€€€€‚‚‚ƒƒƒ„„………………††††††‡‡ˆˆˆˆˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’’’’’’’“““““”””””””””””•–—˜˜™™ššššššššš›››››››››››››››œžžžžžžžžŸŸŸŸ     ¡¡¡¡¢¢¢££¤¤¤¤¥¥¥¦¦§§¨¨¨¨©©©©©ªªª«««¬¬¬¬­­®®¯¯°°±±±±±±²²²²²²³³´´´´µµ¶¶·····¸¸¹¹¹¹¹¹¹¹ººººº»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÆÆÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÈÉÉÊÊÊÊÊÊÊÊËËËËËËËËÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ   !"#$%%%%%&'()*+,-./0123456789:;;;<=;;;;;>;??;;;;@ABCDEFGHIJKLMNOP;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHQHHHHHHHHHHHHHHHHHHHRSSSSSSSSSTUUVWXYZ[\]^_`a bAAAAAAAAAAAAAAAAAAHHcdefgghijklmnopqArstuvAAAAAAwAxyzA{A|AAA}AAA~€AAAAAAAAA‚AAƒƒƒƒƒƒ„A…AAAAAAA††††††††‡AAAAAAAˆˆˆˆ‰AAAAAAAAAŠ‹ŒAAAAAAAAAAAAAAA;ŽA‘A’“”;;•;–AAAAAAAAAAAA—˜AA™š›œAžŸ ¡¢£¤¥?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{.|}~~~€..‚ƒ„…†..‡‡‡‡ˆ‡‰Š‡ˆ‡‹‹Œ..ŽŽŽŽ‘‘‘‘‘‘‘‘’’’’“”’’“’’•–—’’’–’’’˜’™’š›››››œžŸ    ¡¢£¤¥¦§¨©ª«««««¬­­®¯°°°°°±°°²³´µ¶¶·¸¹º»»¼»½¾««¿ÀÁÁÁÂÁÃÄÄÅ.....ÆÆÆÆÇÆÆÈÉÉÉÉÊÊÊËÌÌÌÍÎÏÏÏ....ÐÑÒÓÔÕÖרÙÚ Û ÛÜ Ý ÞÞß àáâãäåæ.çèéêëìí.æ.îïïïïïïïïðñ..........òòóòòóôôôôôôôõŽŽööö÷ø’ùúúúúû....üýüüüüüþüüüüüüüüüüüüüÿ.û    ‘‘‘‘  ì‘ ‘üüüÿüüüü........ !!"ñ###$%%%%&'2()))**+‘,----./..000123455556789:;ú.........88<=‘‘>‘?‘‘@üüüüüüAüüüüüüB..CDEFGHI.JK..LñÙMNOPîQR‘ STUVWXYZ[[..XXXXXXX\]^ _û...`abcccd..efghi...jkllmn..ooooopppqrs.....tuuvwx..yz{|....}}~....€‚ƒ„…††‡‡‡ˆ‰Š‹ŒŽ.........1‘.’’’’“”•–———˜™...šššš›œ..žŸ...              ¡.      ¢£¤¤¤¤¤¤¤¤¤¤¥.....¦....§§§§¨§§©ª§......«.......¬­®¯°±².. ³...í´âµ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈ...GûìäÊîî..æäûæ....ËÌæÍ´..ÎÏðìÐ.Îä½Ñ²ìÒ........ÓÔ...¬...üüüüüÕ..üüüÖüüüüüA......×..      !!!!!!!!!"""""""""""""#$$$$$$$$$$$$$$$$$$$$$$%&&&&&&&&&&&&&&'(((((((()*(((((((((((((((((+(((,-,---.,.,----------.---..------.,.,-.,-,-------------/0/001/1/0000000000100010/101001/1/0//011000000002323333232333333333343334323333333232343333333356566675756666666666766676566666675756665666666666668988:8:889::89:8:88888888:8:88:98888888888:;<;<<<=<=<<<<<<<<<<<=<<<<<;<<;<<<=<=<<;=<<<<<<<<<<<<>?>>>@>@>>>>>>>>>>>@>>>>>?>>>>>>@>@>>?@@>>>>>>>?@ABAAACACAAAAAAAAAAAAAAAAAAAACBAAACACAACBAAAAAAAAAABAAADEDDDDDDDDFDDDDDDDDDDDDEDDDDEDDDFFEDDFFDDDDDFGHHHHHHHHHHHHHHHHHHHHIHHHHHHJKKJKKJLLJLLLJLJJLJLLLLLLJLLLKKLLLLLLLLLLMMMMMMMMMMMMNMMMMMMMMMONMMMMMMMMMMMMMOMMMPQORRRRRRRRSSSSSSSSSSSTTSSSSSUSSVVVVVVVVWWWWWWWWWWWWXWWWWWXXWWXWWWWWXXWWWWWWWWWXWWWWWWWWWXYWWWWWWWXWWWWWZZZZZZZZZZ[\\\\\\\\]]]]]]]]]]]]]]^_____________`_abbbbbbcbbbcdddddddddde ffffffffffgggggghghgiiiiiiiiiiiiiiiiiiiijkjjjjljjjjjjjjjjjjjjjjjjjjjjl\\\mmmmmmmmmmmmmmnmmmmmmnmmmmmmooooooooooooooooopqqqqqqqqqqqqqqqqqqqqqqqqrqssssssssssssssstttttttttttttttuttttttuvttttttttttttwwwwwwwwwwwwwwwwwwwwxyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{|{}}}}}}}}yyyy~~~~ €‚ƒ„       … „  †††††††† ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆ ‰ ŠŠŠŠŠŠŠŠŠŠŠŠ‹Œ‹WWWXWWWXWWWXŽV‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“~”‘•––––––––––––––––––––—•–˜™VVVVVVVVVVVVVVš›VVVVVVVœ–––––––––––žŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ŸŸŸ ¡¡¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¤¤¤¤¤¤¤¤¤¤……¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¦¦¦§§§§§§§§§§¨§§§§§§((((((©©©©©©©©ªªªªªªªªªª«VVVVVV𬬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬­­­­­­­­­­­®­­­­­­­­­­­­­­RRRRRR¯¯¯¯¯¯¯¯¯°±¯¯²²²²²²²²²²²³YWWXYWWXYWWX²²²²²²²²²²²²VVVVVš™VVVVVVVV…´ ––––––––––––VVVVVVVVVVš µµµµµµ¶µµµµµµµµµµµµ·µµµµµµµµµ·µ¶µµµµµµµµµµµµ·  ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¹ºººººººº»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÆÆÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÈÇÇÈÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉËËËËËËËËËËËËËËÌÍÍÍÍÍÍÍÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÓÑÑÑÑÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÓÒÑÑÑÑÑÑÑÑÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕ×××××××××××××××ØØØØØØØØØÙØØØØÚÚÚÚÚÚÚÚÚÚÚÚÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞààààààààààáàààààààââââââââââââãâââââäääääääääääääääääåååååååååååååååæåæååççççççççççççççç褤¤¤éêêêêêêêêêêëêêêêêêêëìí ~        ´´´´´´´´´´´´´´´´´´´´´´´ î      žž##))77)))) BBBRRR___ )) ***+++,,---  ...///88866NNNN>>>CC]]DDDEE)))559997::::$$$$!!!!)!""""##"$%%%SSFFTT;;AAGGGHHIIIUUMMMOOOOVVV0000JJJKKK&&&'''111<<((22334444WWW@@@LLLbbaa====XXPPPYYZZZ[[[^^\\eee```dddff???QQQTcccc"!!    !"#$%&'()*+,-./01234567899999:99999999999999;<=>?999@ABC9DE999999999999999999999999999999999999999999999999999999999FGHIJKLMNOPQRS99999999999999999999999999999999999999TUVWXYZ[\]^_9`abc999999d9efg9h9i9999999jklm999999999n999999999999999999o9p99999999999999999999999q999999999999999999999999999999999999999r999999999stu999999999999999999999999999999999vwx999yz{|}~99999999999999999999999999999999999999999999€999999999999999999999999999999999‚9ƒ„9999999999999999999999999999  !!!"#$%&'()*+,-./01234'562789:;<=>?@ABCD;EFGHIJAKBLD;MNOPQRSTB;UFVWABCD;UFGPXJAYZ[\]Z^_`aSB;;bcd`eKAf;;bFd`egAhf;idjIAkfklmnopqI=rpstrWurvwdxyz{=rX|}t~€‚[[[[[[ƒC ZW„„…†<‡ˆr‰rŠ‹‡‡SŒur‡Ž=Grr‘r{‡’@“42‡”4‹•–—=<‹‹‹‹˜‹™š›‘šœžŸ ¡¢£¤¥Œ¦kl§¨©ª«W¬K­®¥I¥¯]°±±±±±±±±±±±²ª‹ ±±±±±±±³±±±±±±±±±±±‹´•µIu¥k¶‘ ·¸'‘yr¹42t‡>'Œ¥r@=¸ºr»}¼Q'½¾¾¾'¿r‘À‘ÀÁ!ÂÃÄÅ!KÀ‹k‘Æ=ÇÈÉÊËÌ ͱ±±±±±ÎkkkÏÐbÑ‹‹ ˆW ‹‘§‹r‹;Ò‹‹K¬Ó? @A0(?=:B<C:DE A@D(D0:? -0 D A -0> F?GDB(HI::JBD 9IF?:D0=IDK: 5I5LB?MN I ),  O H(,45PQQ  RSTUV WXW%Y%%@ @  @)Z[\]^^_^^_1`2 aa) @ :?IDb (:@ cd!!"!efdgX Whi jklm^no 29 (p,]:q%r(D:DI A  ?@ABC DEFGGGGGGHHHHIJJJJJAKKLMNOPQRSTUVWXYZ [\]^_`abcdefg hihjkhlhimnopqirs^Gtuvwxyz{|}~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€€€‚€~€€ƒH„JJ…†d-‡Fˆ‰Š‹d[ŒŽ[v‘’“”•h–—˜™Kš›            !"#$%&' $()*%%"+,-./  / 0$   " 1 $ " 222233333344444456-)7.)-&89: , .;1);<=65>6?6--+ 1$ @A  ""BC>----222D+6; C EB6FB#GHHHHHHGHHHHHHGHHGHHH3IJ4444"  K.  B+5&----------LM=NO PQQQQQQ             !"#!!$!%!!&'(!)*!!+,-./01234!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!56789:;<=>!!!?@ABC!!!DE!!!!F!!!!!!!!!GH!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!J!!!!KL!!!!!!!!!!!!!!!!MN!OPQR!!!!!!!!!!!!!!!!!!!!!!S!TUV!!!!!!!!!!!!!!!V!!!!!WX!!!!!!!!!!!!!!  !"#$%&'()*+)),-./0))12345677879:;<=>?@ABCDEFGHI>GJKLMNOPQRISTUVSWXYZ[\]^_`7abc7defghij7)klmnop))))))))))q)rst)u)vwx))y^))))))))))z{))|}~€)‚ƒ„))…)†)‡ˆ‰Š‹)Œ7Ž)‘’77“”•–—)˜)™š›77œžŸ ¡¢£¡¤¥¦§¨©ª«7¬­®¯°±77777777777²³77777777777´µ77¶·77¸¹7777º7»¼½¾¿ÀÁ)ÂÃÄÄÅÆ777777ÇÈ^)É^)pÊË))ÌÍ7Î)))))‡77))))))Ï7))))Ï7ÎÐÑÒÓÔ))ÕÖרÙÚ7ÛÜÝ)Þßàá2âãˆ:äå7)æçè)éêëìí7777)î)))))ïðñ)))ò))ó7ôõö))÷ø))ùÎ)ú)ûüýþÿ)))   7)))Í77)y777 7777ˆ) 7Î7)7)ƒ77‡77777‡ó77)77ˆ7777)‡‡7777))77777–O–– !7–ä"77777)#ƒ7)))Ì7777)))$7777)Ì777777)%777777))&'(777)7777777777*+,7777-77777./0123456789:./;1<=>5?@ABCD½EFGHIJKLMN77))))))Ã7)y))))))7777777OPPP7777Q     !" #"$!%&$'($$)*+,,,,,,,,,,,,-.'/0 1 2!"3 4,5 6789,,,,,,,,,,:;:$$$$$$<$=>?,,@A$$$$$$$$$$B,,,,,CDE$$$$$$$$F,G,HIJKLMNO$$$$$$$,,,,,,@P$$$$$Q,,RK$$$$$$$B,,)S$$$$$QT,,UUV$$$$$$UW$$X,,,,,,@,$$$$$$$$$$$$$QY,,,,U,$$QZP$P$9P$LL$$$$$W$+()Y,[[\]^Q_)9P<`L$$$$$W$Wa)I@][VbP+_Jc9P$^^$$$$$W$WP)Y,::VXQ_,[[Vd^Q_6eP<(W)aW`X<($$)d@dIVX]_9P$WW$$$$$W$$P)f,IIV;)dP$WW$$$$$W$$P)Y,IIV;gQ_a$$$$$$?@ABCDEFGHIJKLMNOO     !"#$%&'()*+,-./01&/234567891:8;<:=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdMefghijklmnopdqrsturvwxyz{|}~h€jQ‚ƒ„„…†‡ˆR‰Š‹DdrŒŽY‘’“”•^1–c—M˜…ƒ™šj›œž“Ÿ i¡¢£¤¥¦r§¨©Mªj«¬­®DZM¯j“r°r±²dd¢³´^Mdd—~µ‘ ~—¶d‹·‹ ¸j¦¹º»¼½¾¿ÀÁÂRºº€€ÃÃĽůÇÈɃZrþÿÿ ÿÿÿÿÿÿÿÃÿP ß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿ¿¶ÿÿÿÿÿÿÿþÀÿÿÿÿïþáœÿÿàÿÿÿÿüÿÿÿ0ÿÿÿüÿÿÿÿýðÿÿÿÿïÿßáÿþþîŸùÿÿýÅãŸY€°î‡ùÿÿýmÇ^?î¿ûÿÿýí㿟À°ìÇ=ÖÇÿÃÇîßýÿÿýïãß`ìßýÿß`@ÿÿÿçß]€üìÿüÿÿû/€_ÿ ÿÿÿ –%ðþ®ìÿ;_ ðÿþÿÿÿþÿÿÿþÿÿÿÿÿùçÁÿÿ@0¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿ‡ÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿÏÿÿ€ÿÿÿÿÿÿÿÿ?ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿþÿ€ÿÿïÿïÿóü¿ÿàüÿÿÿ?Þoÿÿ????ÿªÿÿß_ÜÏÿÜ€ÿ„ü/>P½ÿóàCÿÀÿÿÿÿx ÿ€ÿÿ€àþ>ÿÿààÿÿÿÿ?þÿÿÿÿÿ ÿðÿÿÿ€€ÿüÿÿÿÿyÿÿ»÷ÿÿüÿÿÿÿ÷ÿÿ?ÿÿ8ÿÿ<~~~ÿÿøÿÿÿ?ÿÿÿÿÿøàÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþ?ÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷–þ÷ „ê–ª–÷÷^ÿûÿîûÿ        !"#$"%&'()*+,-./0123456789:;<=>?@ABCDEFGH=>I@J673?@AB%&6CDþÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®¤ªJUUÒUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿ„8'>P=À Àÿÿê%À(UUUUTUTUUUjU(Uÿÿÿÿðÿÿ?ÿÿÿÐdÞ?ÿÿÿ°çß{_üðÿÿ?ðÿÿ?üÿÿðÿÿÿ       !"#$%&'()*+,-./01234567//$$889þÿÿ ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿïÿÿÿÿ Ï<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿ¿ ÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ€ÿ„ü/>P½òàCÀÿÿÿÿÿÿÿÿx ÿ?ÿÿÿüÿÿÿÿxÿøÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷    !"#$%&'()*+,-./0123  !"#$!%&$!'# ()#*+,-#(.#"#/0123456789:;<=!>??@@ABCDEFGHIJKL*MNOPQRSTUVWXYZ[\]^_`abcdefghiRjklmNn4opqrstudvwxyz{|N}~l,€‚ƒ „~N…†N‡ˆ‰Š‹Œ Ž€@@¡ÿÿÿÿÿÿÿÿ0°øþÿÿÿÿ¿¶ÿøÿÿÀ¿ÿ=€ÿÀÿø?Àÿÿ?ðÿÿþ!þ  †9#¾! @ ÀÁ=`@0\òÀò@? þßàÿþÿÿÿ@àýfÃd à °?@þ x‡€ @åøŸ€Ðø< @£ðÏ?÷ÿý!ðÿÿÿøð ààà`ø|ßÿ€ÿÿÿ0€€€€ <>~p €÷¿€D`ÿÿÀ?€ÿÈ~fÁ 0X !üÿÿÿ$ nð‡ÿx&€ïÀ(¿€ÿÿ€øÿç<ÿÿ        !"#$%&'()*+,-þÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿÿ@ Àÿÿê%À(UUUUTUTUUUjU(Uÿ       !"#$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢`[Uµªª-ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿÿßPÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ       !"#!$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢ÐVUµªª+ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿß@ÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ        !"#$%&'()*+,-./01þÿÿ ÿÿÿUUUUUUUªªVUUUUU«ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzU E@×þÿû€cUUU³æÿÿÿÿÿÿTUU«*UUUþÿÿÿ€¿ UULÿ?ÿÿ?ªÿÿÿœœœ@ Àÿÿê%À(UUUUTUTUUUjU(Uøÿ      !"#$%&'()*+,-./01þÿÿ ÿÿÿÿÿÿÿÿÿÿþÿßÿ÷ÿóÿ³ðÿÿÿýÿüÿÿß i‹&  Ï8@×ÿÿûÿÿÿÿÿãÿÿÿ·ïüÿÿÿþÿÿÿþÿÿÿÿ¿ "ÿÿÿOÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ@ @ÀÿÿÿÿÿÿÿÿÿÿmÀx ÿ?ÿÿÿüÿüÿÿÿþÿ8ÿøÿÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMM     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžkŸ ¡^¢y£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ –%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿøÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOP    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨•©Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß<À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿþàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_Ûÿÿÿøÿÿÿüÿÿàßÿüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNN     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžk kŸ ¡^¢ky£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß8@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ–%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿàÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿŠªÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQ    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨N©•Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß8À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿæàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_ÛÿÿÿøÿðÿÿÿÿÿüÿàŠªüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ      €€0xø|ÿÿÿøÿÿÿÿ    !"#$%&'()*+  !"#$%&'()$*+,-./0123456789::;;<=>?@ABCDE#FGHIJKLM NOPQRSPTUVWXYZ[\]^_`$a&bcdeaFfgFhijklmnÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿøÀûï>ðÿÿþ!þ P €†9#¾!Ð À@ €ÀÁ=`D0`„\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8‡€ @åøŸÐ< @£ðÏ÷ÿý!ð0ÿÿ€€ü€÷?D`ÿÿÀ?€ÿÈ~fÁ0@ ! nð‡ÿx€ïÀ(¿€ Ãøç<             !"#$%&'()*+,-./012222222223456789:;<222=>?@A2B2CD2222E2FG222H222I2222JK2222222LMNOPQRS222222T2UVWXYZ[\]^_2222222_22222  !"#$%&'()*+,!-./0123456789:;8<=>?@AB CDEFGHIJKLMNOPQRSTUVWXYZ[\Z]^_`abcdefghZijklmnopdqrstuvwxyz{|}~€‚ƒ„…†Y‡ˆ‰ Š‹ŒSŽ‘ˆh’‡ “”•‹Y–h—˜™š›fœžŸ f¡¢£¤Z¥¦§¨©ª«¬­®–¯°[±²³´µ¶·¸¹µº»Z ¼½¾¿ÀYÁÂõZZ]–ÄÅÆÇÈÉÊËÌ͈ÎÏÐÑÒÓfÔvÕÖרÙvÚ×ÛÆÜÝÜÞßàáhâãäåæŽ`€çèéêëìíîéïðñòóôlˆõöƒ‹lY÷øYùúZˆû]Óü–·ýþÿˆŽ\ÿÿÿÿÿÿÿÿßÿÿÿ|ð×ÿÿûÿÿÿüÿÿÿþÿÿÿþþÿÿÿÿ†@IÿÿÿÀÿÈÿÿÿþÿÿÿ?@`Âÿÿÿ?ýÿÿÿàÿÿ?ÿðÿÿ?ÿÿÿÿAýøÿÿÿÿÿÿëÞÿóÿÿþìŸùÿÿýÅ£Y°Ãÿÿè‡ùÿÿýmÃ^Àÿè¿ûÿÿýíãÃÿÿýí#°ÃÿÿèÇ=ÖÇÿƒÆÀÿÿîßýÿÿýï#Ãÿÿìßýÿÿýïc› @Ãÿÿÿÿ§Á]Ãÿ?þìÿüÿÿû/ÿÿ €€ÿ–%ðþ®ì _ÿóÿÿÿüÿÿ_ýÿþÿÿÿ€ À¿ßÿÿ™ÿÿÿ<þÿáÿ›ßÿß¿ ÿÿÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿcÿÿÿßÿÿOÀ¿ðÿÿÿÿÿÿÿÿÿÿÿÿ?xûñÿÿÿÿ?ÿÿÿÿÿÇÿÿÆÿÿ¿àÿ?ðÿÿÿÿÿ/èûÿÿÿðüÿÿÿÃôÿÿ¿\ ðÿ0øÿãÿÿÿÞoÿÿ????ÿªÿÿÿ?ÿÿßÿßÿÏïÿÿÜÿÿÿÿ€ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ€ÿÿÿÿÿÿÿÿûÿÿÿøàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿ»÷ÿÿŸÿÀÿü?Àÿÿ €ÿÿ7ìÿ¿ÿÃÿ÷/ÿóÿÿb>øÿÏ?~~~ßÿøÿÿÿ?ÿÿø ÿÿ_Ûÿÿÿøÿÿÿÿÿüÿÿÿ?ÿÿÿ÷ÿßÿüüü0ÿïÿÿÿÿ·ÿ?ÿ?‡ÿÿÿÿÿÿÿÿÿÿÿ¿ÿ?ÿ?ýÿÿÿÿ¿‘ÿÿ¿ÿÿÿÿÿÿÿƒÿÿÿÀïþÿÿÿÿ?þÿÿ?ÿÿÿÿÿýÿÿÿ€?üÿÿÿ‡ÙÿÿÿÿÀÿÿÿ?€ÿ×@ÿÿÿÿÿÿøÿþÿÿ_<ðÿÿÿÃÿÿ#ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿÿÏÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿþþÿþÿÀÿÿÿÿÿÿ¿ÿßÿÿÿøáÿ?      €@@> ÿƒ€À|À0      @@?€    @€ „ÿðà„            !"#$%&'()*+,-.    !"#$%&"'(")*+,-.PŒ@€ˆÿÿ0 á þ`8p<ìøÀ0€@àøÀÀ€à€÷€ü€?`     !""#"$%&"'()""""""""""*+,##--../"&01234@'3@``ÿbø„ü/>³ûñààó¶>Ãðÿ?ë/0°ÀðÁŒ”``Àÿøÿÿ0 PÿÿÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿÿÿ÷ÿÿÿÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿ~~ÿ~~ÿ~~     !  !"!#$%&'()*+,-. /012345678+9:9;*<=>?@>ABCDEFG5HIJ5@5KL#M ÿ¿¶ÿøÿþÀž!ÿÿÀÿÀøïðÿÌÿßà ÀŸ€‡#¿ŸÀÇ€ß`߀€_ÿ ò òþÿàÿþÿÿÿøyÀÃ…|0€Àÿÿÿÿ€àþÿàÿþ3€ÿðÿ?ÿÿÿÿÿðøðÿÀ€ÿþ0Aø ø@nðÿ?ÿøÿø?ÿÿÿ   Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?      !"#$%&'(  !"#$%&'()*+,-./0123456789:&;<==>?@ABCDEFG)HIJK@ÿÿÿÿÿÿÿÿà00øþÿûÿÿ¿ø‡€aÿÀÿø?ðÿÿ  €_ ÂÜ@€€¿ þ àŸø À?ÿ!ðÿÿðÿà ààà`€€ü€°€ÿÿÿx@0À€ÿÿ€ãøç<     €@€@ >`p €  ÿ ðÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿ0ÿÿÀÿÿÿÿÿÀ@€`€€0ÀÀ Àó ÿÿÿûÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀ€šÿÿÿÿÿÿÿÿÿÿÿ? €€0 ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿ    € @@  À À À À`@€€þ         !"#$%   !"@€P€0 „@`ÌÀ0€ÀˆÀ€àÄ€`8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ> À   þÿüxþZCˆ€ÿÿÿÿþÿïÿÿÿÿÿÿ?ðÿÿÿÿÀ`                    !"#$%&'()*+,-./0123456784449:44444;<=>?@4ABCDEFGHIJKLMNOPQRSTUVWWWXYZ[\]^_``a`b`c`````d```efghijklmnopq````````````Wr``stuvwxyz{|}~€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€    !"#$% &'()*+,- ./01 2 34 156 372 86 39 1:2 ;4<1 = > ? @AB1C 3D 1 4 1 EF GH IJ K L MNOP< QR STUVW Q X  YZ [ [ 1 1 \]^ X_ ` abc d e fghi j= kil m nl op qrs to uvwwxyz{|}~€ T‚ƒ„…† ‡ˆ‰ Š‹Œ Ž ‘’“X ”• – — ˜‹‰ —™š› œ ‹ x  ž ’Ÿ   d ¡  Œ w –¢ – l£ ¤ ¥ ¦§ ¨ s l © ªl - « ¬­® ¯2 D< ° ±²³´Xtµ¶·¸‰ ¹º» — W¼½¾¿ÀÁ2 Ât‰ l à - ÄÅ l Æ ÇÈ –- ÉÊË Ì Í Œ Î ¡ ‡ ÏÐÐÐÑ—‹ÒÓ’’ Ô … Õ“‹Ö Ò×ØÙ‹Ú Û ‰ ‹ Ü             ! """"""#$%&'((((((()##*+,((((-./012(3((((-""456""7 8"""('9 :;<;=< > = ;<; =?  @ @A= ;>E @ F  : >G =9 9=B;   HI<9E <<; ; <; :@ = =  J >; B :< = KL = 9; : <   A :9G<;A E9;  >B :H > 9E;= ; 9 M   NNOP QRST U VWXYZFZFSSSSF   M[\   [ ]   F F    F    ^ >   _ F F `a :: @ b > >; <9@@  ;EA;> =;= c""d"(((e(((fgh ijFk (((lmn Fop[ """q!"""r4""s #######t 9@ <; >9 =B  uv9< >wx [ yz((( F F{  F     |                                                   !"#$%&'(  !"#$%&''()*+,-./0123456789:;<=>?@A.BCDEFGHIJKLMNAOPQFRSTUV   !"#$%&''()*+$,--.&/0012+34#5678977:;<=>?@ABCDEFGHIJKL0M;NOPQM0R6M STSJ5 UVL9WX5YZ[9N\]91^_`a11;1b@^JMcd9&N;e5Lfg^h5^Mijklmbn0&1&9222223----3+-----))----))-------222262---222--222----23--2455455422-2222-222.-22--2.12 2- 22--2-22-22222-22-2-22--2--2-2-2222222222---2---22222-22 !""####$$%%%%----+&'('''''2222--21.2--2-225*-)2224-2-2222-2,13.//-222-2-22-++0+++++---   !"###########################################$#%&'()*+,-./01234##5   !! "#$%&'()*+!,-./012345675899:;<=!>?<=!@ABCDEFGHIJKLIIMNOOPQRSTUVWXYZ[\]^_`abcdeffghijklmnoppqrstufffvttwxyz{|}9fffffffffffff~€‚ƒ„…‚ƒ„†‡ffffˆ‰fˆffŠ‹tŒttttttŒŽŽŽŽŽfŽŽŽŽŽŽf‘’“Q”•QN–—˜™š›œœœžŸ ¡¢££££££¤¥¥¦§§§¨©ª£«¬­®¯°±²¥³´µ¶·¸¹º»¼½¾¿ÀÀÁÂÃÄÄÄÄÄÅÆÆÆÆÇÈÉÊËÌÍÍÎÏÐÐÐÐÐÑÐÐÐÒÓÔÕÐÐÐÖ×ÐØÙÚÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÜÐÐÐÕÐÝÞßàáâãäåäæf玎èéꎎëìíQ                !     "#$   %    & $$ ''()*+,-   .. /  01234567***+***8#9":;;<=>?@ABBCD;E=>FFFFG   $H# % $  !IIIIIJIIIIK#L,M$$$$$$. ! N% O"IPIIIIIIKQQQQQQQRQQQS7$  $! .;;T $ UVVVVVVVVUUUWUVVXYZ[\UWVUUU]W^^^^^________`aaaaaaaaabcccccd^^e______faccghaijkilih`_i`mnaojpi_jq_`j^^^rsstsssssuvwxxxxwxyz{{|[}~Z}~[}~}~[€‚‚‚‚‚‚‚ƒ„„„„„„„„„„…†„†„†„†‡‚ˆ„… ;;;;;‰;;;;;‰Š‹=‰;;B=;=;;;BŒ=;‰;‰;;BŒ;Ž;‰;;;;>;;;;;Ž‹=;Œ;Š‘=‹‹Œ;Œ;=;;B;;;;==B;’K“”QQ”#•                        !"#      !"#"$%&'()*+,-./01,23!456789:;<=>>?@A&BCDEFGHIJKLMNOLKPGKQKRSRGTUVWXXXXXYZZZZ[\]^A_`a"`bPc_Oa                                  !"""""""#$$$$$$$$$$%&$&$&$&'"($%    !"#-+-) ##!!'' 777 +--++- ###!!'  &  8 )++++++++7/7+--..)#! ,2**01$  "%( 345 # # # 77-++66 ## ' --+9  !"#$%&'()*+,-   !"#$%&'()*+,-.+/-0,1/-2+,3.4+56789+3:+.+;<=>?@ABCDEF4GHIJKGLL++MNOPQRSTUVWXYZ[5\Z]^_]`abcde`fgh]ijk]l9md]no]'pqrst,u4vwexyz,{e]|'}~]€'‚ƒ„iL,  !"#  $$% &'%$! ()*+  %   ++ % %++%, - % +% +./.0 ++,  %+-%  1% %%++2%%   % + %        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOYZ[\]^_`abcdefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefglmmmmmmmmmmmmmmmmHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHOOOOnopqrstuvwxyHz{|}HHHHHH~H€H‚HƒHHH„HHH…†‡ˆHHHHHHHHH‰HHHHHHHHHHHHHHHHHHŠH‹HHHHHHHHHHHHHHHHHHHHHHHŒŽHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH‘’“HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH”•–—H˜H™š›œHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHžŸHH ¡¢£¤H¥¦§¨©ª«¬­HHHHHHHHHHHHHHHHHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO®¯H°±HHHHHHHHHHHHHHHHHHHHHHHHHHHH      !"#$%&'()*% +,-./0000100023456789:;<=>?@A:;BCDEFG;HIJ?K9:;HLM?NOPQRSETUV;WXY?Z[V;\X]?^[V_`a?bcdefg0hijjklm00nopqrs00tu%v8wxyz{|}00jjjj~jjjj€‚‚‚‚ƒ„„„„„…†…‡ˆ‰ˆŠ‹wŒŽŽJ‘’“”‘•jjjjj–—Œ˜—™šw››œjžjjŸj ¡¢jjj£j¤——00000¥¦§¨©ª«¬%)­¦®¯%°0000±²³´µ¶¶·¸¹¹º»¼½¾¿ÀÁÂÃÄwÅÆÇÈÉÊËÌÍÎÏÎÐÑÒÓÔÕÖרÙÚÛÜÝÞß0à0áááááááááâááááÍááãáäåæçèéêëìíîïðñòóôõö÷øùáúûüýþÿw0000000000..€ß  0000       Þ              0             Þ                         !   "°#$0%&'.(à0000Z)*+,-¦.—/%01234456007´89jŸjjjj:; <=>000000000?—@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDBCBE‚F„„GHHHHHHHHßIJKLMNO0P00QR´STUV¹WXY Z [\]^._`abc‰d¸¸00àefàg000hwJ00.(à000ijk00¸—00000lmn00op0000q0000rstuvwxy000000000.«z{P|0«}~y—«1€000«4—00 ‚—000.0ƒ€„…†.00000y0000‡3ˆ«000000‰0000000šŠ‹Œ¸00000ßM¹‘Ž‘’“”Vw•–––—˜™š›œgžg000M        ÞŸ00 á¡ááá¢áá 0000£¤¥  ¦‰00  §¨   ! Þ ©ª0 §   «     ¬­   ®¯°±²( ³00000000´    µ000     000(       ¶00  !"""#$%$$&&'$$$$'&'()$*+,-.$$$$/////////////0$$/1&$$$$$&23 456 78-9--- '5'-$$$$$$$:&$$$&$&$$$$$$$$&&$$$5-; '+'&'&'&&&$$-5+5+&$$$+$$'$ 32 $$+'&$'&'&$55$+5+$+$$$'&&$$$ $$$$$+''&'$-++$&$$$$$$$ $$$$$$$5+5+$$$$$$'$-'&$&$'&&$'&$&$$$5$5$&$$+$$$$ &$$+'&&'$'55$$$+5$$$$$$$$'&'$-$$+5$$$&'&$$$$$$&'55&$$$+$$$$$<$'&$''$&$5$+55$&$$$$$=>>>>>>>>>>>>>>>>>>>>?$*>>>>>>>@ ;$$=??=??=$$$>>=>>>=>==$>=>>>>>>=>$>>??>>>$ $>> AABCD66E9,FF&$++5;-&AGHI$$ ; >>>'$$'$JJJJJJJJKKKKKKKKKKKKLLLLLLLLLLLL&$&&$&$&&$&&+$$$&$$$$$MN$;&5$$$$$)$$$$$$$$$$&$$$$$$>>;OMP>$ $$$6;6I&$$$$$$$$$&$6 >>>>>>>$>>?$$$$$>>>>>>$$>>>>>$$$ ?$>$>>>>>>>?>>>>>>?+--$$ ;;M&$-$$$$$Q;; $';---&$$$$5$$$$$$$$$$$$''''$&$'$& &;;;R;SR;TUVUVWXY!3333Z[\][M;;;^&$_N5$$$$$$$22`$$$abaa$$$$$$&$$$$&$$aaacaaadaeddaaaaaefdafeaefaefaafaefagacaaaU6FFFFFFFbFFFFFhhhhhhhhhhbFFF$$$$$i;Mj$$$')$$$$$$+&&UUUUUUU;;;;kUUFFFF;;9;Ml$$aaaaaaaaaaaaagaaaaa$$$$$aaaaaa$$mnaFFFFFaFFFFopaaaaaaaqaanrasttttaaaataaaaaaatttaaauaatv+w[rxttttaaaaatuanyr$$gaaaaaaaaaaaa$gaaaaaaaaaaaaaazaaaaaz$${{{{{{{{aaaaaanaaaaaaaaaaaz$aaaz$$$$j $$-$$$+;;$$$$$$$$$$--$$|$$$A6$$$$5$$$$;$$;$$$$$'JJJJJJ}$-;' $$$ $;>?$$$$$$$$$$$=>>;5$$$$'&'&'&$$$$$~~~~$$$$$$KKK€$LLLLLLLL$$‚‚‚‚‚‚‚‚$'$$ƒ„////1//////0//00/ƒ0/////$$$$$$$$'F$|$…†:‡ˆ$$$aa‰hhhhhhhm‰maaamN[6‰hhmaaazŠ‹$$&ŒiaaFammaaaaa[aaaaaa‰Žaaaaaa‰Ž‰pF]{{{{[$$$$&$aŠ‘&$$$$+’$'&';)$'$'$$$Q$$M$$$$$$&'&$&'Q$Q$$'$$$+5$$''$$5$+;;;;&$$$$Q;;;$&$$&$$$M$ -;;$$$$$$$5 ;;$$$$$$-M)$$$$$$$&$$$$$$“FpbFFp$$$$$$$+a$$$$$$$--$$$$$$&'&'&''''&'&&'&&&$$ '&&''&''$$$&$'''''&&''''''&&'&&'&&''''gaaaaaaz”$$&$$$$$•••••••••••••az$$$$$$aaaaz$$$z$$$$$$$aaagaaaaaacdaadaaazaaz$$zaaaaaaadddaaaaccdaaaaaaaaaagaz$daaaaaaacdaaaaaa$aaaa$$$$$$$$$gaaz$gaaaaa+$$$$$$$ $     $         %%%%        !!         & && &&& && "### !%%     && ''           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNK    !"#$%&'()$*+,-./01234567,85,69*:;<8=>?7@ABC#DEFGHIJGGKLMNOPQRS:+T:#UVW*<0$      !"#$% &%%#'(#)*+,$$+-./+0'**(1-+(--'*-+ ''2$  *(3 45 678 9('++(#*           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUUVWXYZ[\]^_`abcdefghi>jklm       !"#$%"#$%&'("#$)*"#$)*"#$)*+,-./012"#31245607"#89:;<=>?@ABCDEFGHIJKLMNOPCQRSTUVWXYPZ[\K]^__`abcDKdeQfg01hijklKgmno 9:pqrstuvwxyz{|}~€‚zƒ„g…†‡ˆ‰Š‹Œ"Ž"Ž"#‘’“”•012–—˜   1™#š›œ žŸž ¡¢£¤¥¦§¨©ª"#‘« ¬ ¬ ­1®F¯bC[°XXeIIPk±²!#%' !#%' .  (U^(U^ %' "$&%'(2?@ABCDEFGHIJKLMNOP##g's(^Ust%!(^2<F'2(%#'U^!!#%'  (!!(TUVWXYZ[\]^_`abcdefghijklmno PYbk(PUY^b(PUY^gk((((((Ãÿÿ?ÿÿÿ?y;xpüÿøÿÿùÿÿ?Â7:ð3üÿßSz0p€0¼þÿÿÿÿÏ¿ÿÿÿÿP|pˆ/<60ÿÿó~0P(¨  €       !"#$%%&&'()*+,-./0123456789:;<=>?@ABCDEFGHI,JE              !  "#$%%$ &' ( )* +,-. &/,(012  # 3 4( 5678! +,#9 : ' (%;                !"#$ %&'($ )&*($+,"-./0123456789:;<=>?@ABCDEFGHIJKLMNMNOLPQRSTU?VWXYZ[\]^_`abNcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽN‘’“”•–—˜™š›œ     !! ""#$% &'()*##+&& ,++-.& -/*,++012.$*34# *5"678$  9":;6< ) =>?@ABBCBBBBBBBBDEFGHIJ KLMNOPQRST6UVWXYXZ[#=\]^_`abcdeffghijcklEXmcnoOkpqrstuvwxyz{|}jc~ !€l‚ƒ„…†‡uˆY‚f‰klŠ‹ŒXŽYuQccc‘ ’T“ul”J•–c—˜Q-™ š›5œœXlžYœl?uŸ                                                      !"#$%&'()*+,-./0123456789:;<=>?@AA BBCDEFGHHHIJKKKLMMMMNOPQRSTUVWTUTUVWXYTUZ[TUTUTU\]^_`abc^defghiijjklmmmnnnoHHHHHIKKKKKLpqrs%tuvvvvwxRDDyz%{| }}}}}~~~~~      !"###$$%&'()'()'()*'()+,-./01123456789::;<:=>?@ABACDEFGGGHIIJKL!!!MNNNOPPQRSTUVWXYZ[\]^^^_`abcdefghijklmmnopqrstuvwxy---zzzzzzzz{{{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€‚ƒ„…†nnnnnnnnssssssssnnnnnnssssssnnnnssss‡‡ˆˆˆˆ‰‰ŠŠ‹‹ŒŒnnssŽŽ‘‘‘‘nn’ss““nn”vss••y––——˜™š›œžžžžžžžžŸŸŸŸŸŸŸŸŸŸ          ¡¢£¤¥¦§¨©ªª««««««««««««««««¬­®¯¯¯¯¯¯¯¯°°°°°°°°       !"#$%%&'()***+,,,,-./01211231111456789:;<<=>???*****+@ABCD /EFGHHHHH    !""#$%&'()*+,--------.//////////////////////0000000000000000123333333333333333333344567777533883399,::;;5<=>?@@@@@@@@AAAAAAAAAABCDEFGHIIJKLMMMMMMMM ‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0`ÆÿÿÿAâÿÿøÿÿÿ¶ÿÿÿ÷ÿÿÿûãÿÿªÿÿÿœÿÿÿÿÿÿ€ÿÿÿ‚ÿÿÿ£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿ(         !"#$%&'())*+,-.///0122223456787789:7;<=>?@ABCDEFGHIJKLMNNOPQQQ/////0RSTUV$W++XYZ[\]]]]]      !"#$$$%&&'()*+,-./01233333333455555555555555555555556777777777777777789:;<=>??????????????@ABC????DDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJKLMN??OOPQRSTUVWWWWXYZ[\??]]^_`ab??cc2defghiijjklmnoppppppppqqqqqqqqqqrstuvwxyyz{|}~€‚ƒ„…†‡ˆ‰‰‰‰‰‰‰‰·ufMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| ˆ düÿ‹A…B x Å A @ÌüÿCA…B u Å D zR| ˆÔüÿ 0ÐüÿDÌüÿ XÄüÿ lÀüÿ€Àüÿ ”¸üÿ ¨°üÿ¼¬üÿ Фüÿä”üÿøüÿ €üÿ. œüÿ4˜üÿ#H¨üÿJ(\àüÿÇA†A ƒC S  AÃAÆB ˆ|üÿ!,œŒüÿŠA†A ƒC0I  AÃAÆD ,Ìèüÿ‚A†A ƒC0D  AÃAÆA Dü<üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇDDxüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ,Œ´üÿ‚A†A ƒC0D  AÃAÆA ,¼üÿŠA†A ƒC0I  AÃAÆD ìdüÿ+|üÿ'üÿ( üÿr|<lüÿÍA…A ‡A†AƒC@i AÃA ÆAÇAÅD h AÃAÆ AÇAÅD l AÃAÆ AÇAÅD lAÃAÆ AÇAÅ|¼¼üÿÎA…A ‡A†AƒC@i AÃA ÆAÇAÅD i AÃAÆ AÇAÅC m AÃAÆ AÇAÅC mAÃAÆ AÇAÅ< üÿ 8Püÿ[A…A ‡A†AƒCOAÃA ÆAÇAÅ<Œ$üÿïA‡A †Aƒ}  ÃAÆAÇB hà AÆAÇ,ÌÔüÿBA†A ƒj ÃAÆC PÃAÆüèüÿ àüÿ$Ôüÿ8ÈüÿL¼üÿ`°üÿt¤üÿˆ˜üÿœŒüÿ€°€üÿTA…A ‡A†AƒC0Z AÃA ÆAÇAÅC o AÃAÆ AÇAÅA à AÃAÆ AÇAÅD g AÃAÆ AÇAÅA 4Püÿ7AƒCqAà ThüÿVAƒs ÃD ]ÃxœüÿŒüÿfC0Y D E¬ØüÿPÀÜüÿ5A…A ‡A†AƒCp¨ AÃA ÆAÇAÅA |AÃAÆ AÇAÅ4À üÿ\A†A ƒC0w  AÃAÆB Y AÃAÆ4Lä üÿ„A‡A †AƒC c A ÃAÆAÇD („0 üÿ4AƒC Y AÃB RAð8 üÿ4Ä8 üÿJA‡A †AƒC s A ÃAÆAÇD (üL üÿ/AƒC b AÃA EAÃ4(P üÿ!AƒC e AÃB z AÃA p AÃC ,`< üÿŠA†A ƒC0I  AÃAÆD ,˜ üÿ‚A†A ƒC0D  AÃAÆA DÀì üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ (üÿ8 Lüÿ0 @üÿ‹C ] D V B lP ¬üÿ…A…A ‡A†AƒC`R AÃA ÆAÇAÅA c AÃAÆ AÇAÅC × AÃAÆ AÇAÅA À ÄüÿÔ Àüÿdè ÀüÿÁA…A ‡A†AƒC@ AÃA ÆAÇAÅD K AÃAÆ AÇAÅA PAÃAÆ AÇAÅPP üÿ‰A…A ‡A†AƒC@f AÃA ÆAÇAÅC PAÃAÆ AÇAŤ TüÿC R(¼ TüÿHA†A ƒC0{  AÃAÆB 8è püÿýA†A ƒC v  AÃAÆC `  AÃAÆB h$ 4üÿA…A ‡A†AƒC0™ AÃAÆ AÇAÅD | AÃA ÆAÇAÅD S AÃAÆ AÇAÅA h ÜüÿõA…A ‡A†AƒC0… AÃAÆ AÇAÅD u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA hü hüÿíA…A ‡A†AƒC0€ AÃAÆ AÇAÅA u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA <h ìüÿLA…A ‡A†AƒC@u AÃA ÆAÇAÅA <¨ øüÿOA…A ‡A†AƒC@{ AÃA ÆAÇAÅA è üÿAƒCYAà üÿC Z( üÿ A†A ƒC W AÃAÆ4L üÿAƒC0g AÃD W AÃD W AÃD <„ àüÿA…A ‡A†AƒC@ç AÃA ÆAÇAÅA hÄ ´üÿA…A ‡A†AƒC0¡ AÃAÆ AÇAÅD B AÃA ÆAÇAÅB S AÃAÆ AÇAÅA l0hüÿ‚A‡A †AƒC0H A ÃAÆAÇC l Aà AÆAÇA  Aà AÆAÇB N Aà AÆAÇC H |üÿ>A†A ƒC0Y  AÃAÆD c  AÃAÆC N  AÃAÆD ìpüÿ püÿAƒC e AÃB <$ÜüÿA…A ‡A†AƒC@Û AÃA ÆAÇAÅB d¼üÿ4AƒC mAÄÐüÿ4AƒC mAÃD¤äüÿ‡A‡A †AƒC0O A ÃAÆAÇD E Aà AÆAÇD Dì$üÿšA‡A †AƒC0s A ÃAÆAÇD N Aà AÆAÇC P4xüÿeA…A ‡A†AƒCPs AÃA ÆAÇAÅB N AÃAÆ AÇAÅB <ˆŒ!üÿAA…A ‡A†AƒC0ö AÃA ÆAÇAÅC 8È"üÿaA†A ƒC Q  AÃAÆD d  AÃAÆB 8¸"üÿ]A†A ƒC R  AÃAÆC a  AÃAÆA (@Ü"üÿqA†A ƒC Q  AÃAÆD (l$#üÿqA†A ƒC R  AÃAÆC 4˜l#üÿTA†A ƒC0B  AÃAÆC E AÃAÆ8Ј#üÿAA…A ‡A†AƒC uAÃA ÆAÇAÅ\ #üÿ³AƒC P AÃC w AÃD Q AÃB Z AÃE F AÃE F AÃE F AÃE 8lä#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇ8¨Ü#üÿ8A‡A †AƒS  ÃAÆAÇD Yà AÆAÇ8äØ#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇP Ð#üÿvA…A ‡A†AƒC@d AÃA ÆAÇAÅA } AÃAÆ AÇAÅC Ttô$üÿA…A ‡A†AƒCPQ AÃA ÆAÇAÅD q AÃAÆ AÇAÅC |Ì´%üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|L0&üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ4̬&üÿIAƒN ÃA P ÃH D ÃH D ÃH DÃ|À&üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|„<'üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ<¸'üÿÿA…A ‡A†AƒC@n AÃA ÆAÇAÅC hDx*üÿ A…A ‡A†AƒCpv AÃA ÆAÇAÅC e AÃAÆ AÇAÅA n AÃAÆ AÇAÅA X°4üÿÔA‡A †Aƒ[  ÃAÆAÇD p à AÆAÇB y à AÆAÇA }à AÆAÇX ˆ4üÿåA‡A †Aƒ_  ÃAÆAÇD u à AÆAÇA ~ à AÆAÇD ~à AÆAÇdh5üÿóA‡A †AƒAm A ÃAÆAÇD w Aà AÆAÇB x Aà AÆAÇA Aà AÆAǀР5üÿXA…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB O AÃAÆ AÇAÅA R AÃAÆ AÇAÅB €Tt6üÿ`A…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB S AÃAÆ AÇAÅA V AÃAÆ AÇAÅB hØP7üÿüA‡A †AƒAm A ÃAÆAÇD | Aà AÆAÇA y Aà AÆAÇD @Aà AÆAÇ|Dà7üÿõA…A ‡A†AƒC@{ AÃA ÆAÇAÅB p AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|ÄX8üÿöA…A ‡A†AƒC@{ AÃA ÆAÇAÅB q AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅlDÐ8üÿÊA…A ‡A†Aƒj ÃA ÆAÇAÅC j ÃAÆ AÇAÅC n ÃAÆ AÇAÅC nÃAÆ AÇAÅ|´,9üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅ|4@:üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅl´T;üÿËA…A ‡A†Aƒj ÃA ÆAÇAÅC k ÃAÆ AÇAÅB o ÃAÆ AÇAÅB oÃAÆ AÇAÅ<$°;üÿcA…A ‡A†AƒCpC AÃA ÆAÇAÅA <dÔ<üÿšA…A ‡A†AƒCpY AÃA ÆAÇAÅA H¤0>üÿ‰A…A ‡A†Aƒi ÃA ÆAÇAÅD C ÃAÆ AÇAÅB <ðp>üÿkA‡A †Aƒ| à AÆAÇC [  ÃAÆAÇC 00œ>üÿTA†A ƒa ÃAÆD Q ÃAÆB <d¼>üÿsA‡A †AƒX  ÃAÆAÇC I à AÆAÇA 0¤ð>üÿoA†A ƒU ÃAÆD I ÃAÆB 0Ø,?üÿoA†A ƒU ÃAÆD I ÃAÆB  h?üÿ l?üÿ1C U D T@€?üÿ%<T”?üÿôA…A ‡A†AƒC0V AÃA ÆAÇAÅC <”H@üÿºA…A ‡A†AƒCPZ AÃA ÆAÇAÅC ÔÄDüÿFC R C a C HôìDüÿ,A†A ƒC0k  AÃAÆB •  AÃAÆA S  AÃAÆC D@ÌEüÿ’A‡A †AƒCpq A ÃAÆAÇB | Aà AÆAÇA (ˆFüÿ/AƒC T AÃC QAÃT´Füÿ!A…A ‡A†AƒC`Y AÃA ÆAÇAÅA o AÃAÆ AÇAÅA < èGüÿ]A…A ‡A†AƒCPw AÃA ÆAÇAÅB €L Lüÿ_A…A ‡A†AƒC€¥ AÃA ÆAÇAÅA K AÃAÆ AÇAÅA © AÃAÆ AÇAÅA «AÃAÆ AÇAÅTÐ äQüÿHA…A ‡A†AƒCp] AÃA ÆAÇAÅA w AÃAÆ AÇAÅA l(!ÔSüÿøA…A ‡A†AƒCp‰ AÃA ÆAÇAÅD W AÃAÆ AÇAÅA M AÃAÆ AÇAÅC <˜!\YüÿiA…A ‡A†AƒC0b AÃA ÆAÇAÅC (Ø!ˆ\üÿ"A†A ƒA\ AÃAÆ4"€\üÿ¸A‡A †AƒC u A ÃAÆAÇB h<"]üÿÆA…A ‡A†AƒC`q AÃA ÆAÇAÅD M AÃAÆ AÇAÅA oAÃAÆ AÇAÅd¨"\^üÿBA…A ‡A†AƒC`y AÃA ÆAÇAÅD Ò AÃAÆ AÇAÅA ^AÃAÆ AÇAÅd#8_üÿfA…A ‡A†AƒC`y AÃA ÆAÇAÅD ã AÃAÆ AÇAÅA qAÃAÆ AÇAÅhx#8`üÿžA…A ‡A†AƒC`q AÃA ÆAÇAÅD ' AÃAÆ AÇAÅA mAÃAÆ AÇAÅdä#laüÿVA…A ‡A†AƒC`s AÃA ÆAÇAÅB í AÃAÆ AÇAÅA _AÃAÆ AÇAÅTL$\büÿ/A…A ‡A†AƒC0n AÃA ÆAÇAÅC E AÃAÆ AÇAÅC <¤$4cüÿËA…A ‡A†AƒC0¸ AÃA ÆAÇAÅA Dä$ÀcüÿÕA‡A †AƒC • A ÃAÆAÇB S Aà AÆAÇB ,%Pdüÿ @%Hdüÿ TT%@düÿ¯A…A ‡A†AƒCPê AÃA ÆAÇAÅC © AÃAÆ AÇAÅC h¬%˜iüÿêA…A ‡A†AƒF E AÃA ÆAÇAÅA x AÃAÆ AÇAÅD QAÃAÆ AÇAÅ &jüÿrC | A ^ B Q<&hjüÿVCv C Y\& jüÿVCu D YX|&Øjüÿ¬A‡A †AƒC0l A ÃAÆAÇC N Aà AÆAÇC X Aà AÆAÇA „Ø&(küÿ­A…A ‡A†AƒF°Q AÃA ÆAÇAÅA H AÃAÆ AÇAÅD % AÃAÆ AÇAÅC J AÃAÆ AÇAÅB T`'Pmüÿ˜A…A ‡A†AƒC` AÃAÆ AÇAÅA T AÃA ÆAÇAÅD (¸'nüÿ3AƒC X AÃC QAÃ<ä'˜nüÿÙA…A ‡A†AƒC@… AÃA ÆAÇAÅD D$(4oüÿžA‡A †AƒC q A ÃAÆAÇB L Aà AÆAÇA Dl(ŒoüÿªA‡A †AƒC { A ÃAÆAÇD L Aà AÆAÇA T´(ðoüÿA…A ‡A†AƒC@¡ AÃA ÆAÇAÅD p AÃAÆ AÇAÅD l ) püÿ<A…A ‡A†AƒC0s AÃA ÆAÇAÅB P AÃAÆ AÇAÅD D AÃAÆ AÇAÅD <|)lqüÿdA…A ‡A†AƒC0S AÃA ÆAÇAÅB T¼)qüÿ†A…A ‡A†AƒC0j AÃAÆ AÇAÅC E AÃA ÆAÇAÅA T*ÀqüÿÔA…A ‡A†AƒC0N AÃA ÆAÇAÅC I AÃAÆ AÇAÅC Tl*ˆNˆhˆ|ˆŒˆžˆ®ˆ¾ˆÔˆæˆþˆ‰&‰@‰V‰n‰|‰Œ‰ž‰®‰¾‰Ú‰ö‰Š(Š:ŠJŠZŠxŠŠŠœƒ´ƒ̃܃ðƒ„„6„D„V„f„t„„„Ž„š„¤„®„¶„À„ʄԄބæ„î„ø„……"…@…T…j…€……¤…¶…Ä…Ö…ä…ò…††2†@†P†b†t†††ž†²†Ɔ܆‡*‡8‡J‡\‡l‡„‡–‡¨‡¶‡ƇÖ‡ê‡þ‡ˆ$ˆ>ˆNˆhˆ|ˆŒˆžˆ®ˆ¾ˆÔˆæˆþˆ‰&‰@‰V‰n‰|‰Œ‰ž‰®‰¾‰Ú‰ö‰Š(Š:ŠJŠZŠxŠŠŠÏDeleteCriticalSectionìEnterCriticalSectionþGetLastErrorGetModuleHandleAAGetProcAddressÞInitializeCriticalSection.LeaveCriticalSection•TlsGetValue½VirtualProtect¿VirtualQuery8__dllonexitF__mb_cur_max¿_errno!_isctype¡_pctype„fflush“freeÄmallocËmemmovetolowertoupper _iobGabortScallocyfwriteìvfprintfPyArg_ParseTuplePyArg_ParseTupleAndKeywordsPyBuffer_Release)PyBytes_FromObject*PyBytes_FromString.PyBytes_TypeAPyCallable_CheckPyDict_Contains€PyDict_Copy„PyDict_GetItem‹PyDict_NewŒPyDict_NextPyDict_SetItemŽPyDict_SetItemString—PyErr_CheckSignals˜PyErr_ClearœPyErr_FormatŸPyErr_NoMemory¡PyErr_Occurred´PyErr_SetStringÐPyEval_RestoreThreadÑPyEval_SaveThreadçPyExc_IndexErroróPyExc_RuntimeErrorûPyExc_TypeErrorPyExc_ValueErrorHPyImport_ImportModuleYPyList_Append_PyList_New`PyList_ReverseaPyList_SetItemhPyLong_AsLongmPyLong_AsUnsignedLongsPyLong_FromLong„PyMapping_Keys‘PyMem_Free’PyMem_Malloc“PyMem_Realloc¥PyModule_Create2§PyModule_GetDictñPyObject_CallöPyObject_CallObjectøPyObject_ClearWeakRefsþPyObject_FreePyObject_GetAttrStringPyObject_GetItem PyObject_InitPyObject_MallocPyObject_ReprPyObject_SizeRPySequence_GetSliceaPySet_ContainsiPySlice_GetIndicesExkPySlice_Type‹PyThread_acquire_lockŒPyThread_allocate_lock‘PyThread_free_lock–PyThread_release_lock¥PyTuple_New¦PyTuple_Pack§PyTuple_SetItem©PyTuple_Type¯PyType_ReadyPyUnicodeUCS2_FromObjectPyUnicodeUCS2_FromStringPyUnicodeUCS2_FromUnicode PyUnicodeUCS2_Join#PyUnicode_Type,Py_BuildValuer_PyBytes_Join×_PyUnicodeUCS2_ToLowercaseî_Py_FalseStructò_Py_NoneStruct€€€€€€€€€€KERNEL32.dll€€€€€€€€€€€msvcr90.dll(€(€(€(€(€msvcrt.dll<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€python31.dll·uf̶uf xf xf(`xfxfP 00(0=0ˆ0¹0È0Í0B1J1j1r11Ÿ1¶1½1Å1Ð1â1ø12+2A2Ì3ã3²8ó8¿>j>€>“>Æ>Þ>ã>î>ÿ>? ??.?3?>?R?W?b?v?{?†?”?™?¢?°?µ?À?Ð?Õ?à?0Ð000 0%0.0<0A0J0U0d0i0t00†00 0¥0°0ö01B1m1ˆ1Ž122B2m22‡2þ2353]3q3w3Ð3ú34M4g4Š4§4¾4É4Ý4A5]5k6­67j7•7¼7*8_8”8!9¤9ª9Ã9õ9 :e:”:š:µ:Ì:;6;|;Œ;º;ò;Q<‘<Ç<ð>,>‡>’>×>õ>!?4?X?t?‹?’?˜?¯?@<$0/0l0€0­0½0×0ü0 1J1W1•1÷122222’23n3°36Š7÷8ò;A>P k1`é=ÿ=>>p84!4,4<4Ò4ì4ô4ù45,595A5M5U5Z5e5­5í5õ5 6 7Ñ7?8€ 4Á4J5,9%9-969¥;<<<^>&>4>,? \Æ0Ì0å0ë051:1Œ1‘1 22252O2U2ˆ2˜2393^34$4¸4È4Õ4ä4ô45@5G5S6€6…6™6¹6¢7á7…8»92:“:f;k<° c1S>À8g2Î3Þ34O4`4–4ª4À4É4Ò4Ú4ã4ô5¦6²6C8ˆ8•89939€9K;Ðh1…6e7€7«7½7è7ñ7ù788ó899½9ç9û9::(:™:Ý:ã:ø: ;;=;R;Å;×;ò;Ê<9=M=a=u=‰==±=4>V>~>±>å> ?Q?y?àt'040K0f0€0¤0l1€1ˆ11«1Ð1?2ð23I3^3z3”3±3Í3ò3‹415<5R5~5‰5®5Û56'6B6‘6ž6¦6¯67:7Q7w7›7£7¸7Ø7á7é7ò7Á8Ã;÷<=n>ð P=k= ˜6¯6 ½1Å133¯4ó5ß70 ¿6z?@ ¬6z=P ?~?`x1…1½1Å1Õ1Ý1h8Ï:ñ;pT'1x1>2‡3±3é3ô3|4m55Ô5n6‚6¦67ë768•88¸8{9:.:–:Â:Ö;˜?¯?ê?€h50Š0¢0–1¶1Ê1h2”2À2Ø2Ý2õ24V5ñ56H6T6¨6E7¸7¾7.89M9}9Š9R:k:;.;T;‚;¿<Å<óx>€>•>ø>9I9\9i9v9–9¡9´9Á9Î9î9ù9 ::&:I:T:d:q:‡:®:¹:É:Ö:ì:;";5;E;[;‡;’;¥;µ;Ë;÷;<<%<;>$>1>G>q>|>Œ>™>¯>Ö>á>ñ>þ>?A?L?\?i??¦?±?Á?Î?ä? ˜00,090O0y00‘0ž0´0á0ì0ü0 11F1Q1a1n1„1±1¼1Ì1Ù1ï12242A2W2~2‰2œ2©2¿2æ2ñ233'3N3Y3l3y33¶3Á3Ô3á3÷34)4<4I4_4‰4”4¤4±4Ç4ñ4ü4 55/5V5^5q5~5”5¾5Æ5Ù5æ5ü5)646D6Q6g6Ž6™6¬6¹6Ï6ö677747^7i7y7†7œ7Æ7Ñ7ä7ñ78.898L8Y8o8–8¡8´8Á8×8þ8 99)9?9f9q9„9‘9§9Î9Ù9ì9ù9:7:B:U:e:{:¦:±:Ä:Ñ:ç:;;,;9;O;y;„;”;¡;·;á;ì;ü; <>'>N>Y>l>y>>¶>Á>Ñ>Þ>ô>?)?=F=N=V=^=f=n=v=~=’=¤=À¤000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1Œ1`2d2l2p2t2|2€2„2Œ22”2œ2 2¤2¬2°2´2¼2À2Ä2Ì2Ð2Ô2Ü2à2ä2ì2ð2ô2ü233 3333 3$30343`3p3t3„3ˆ3˜3œ3¬3à3ä3ì3,4ä4è455 5555 5$5,50545<5@5D5L5P5T5\5`5d5l5p5t5|5€5„5Œ55”5œ5 5¤5¬5°5´5¼5À5Ä5Ì5Ð5Ô5Ü5à5ä5ð5ô566 60646D6H6X6€6„6Œ6”6˜6 6¨6¬6´6¼6À6È6 7à7ä7ì7ð7ô7ü78888@8P8Œ8`9d9l9p9t9€9„9 9°9ô9:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;8;<;@;D;H;P;T;X;`;d;h;p;t;x;|;€;„;Œ;;”;˜;œ; ;¨;¬;°;´;¸;¼;Ä;È;Ì;Ð;Ô;Ø;à;ä;è;ì;ô;ü;àÄ€:„::”: :¤:°:´:À:Ä:Ð:Ô:à:ä:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<ˆ333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|3€3„3ˆ3Œ33”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü3444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4€4„4ˆ4Œ44”4˜4œ4 4¤4¨4¬4°4´4¸4¼4À4Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4è4ì4ð4ô4ø4ü4555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ5Œ55”5˜5œ5 5¤5¨5¬5°5´5¸5¼5À5Ä5È5Ì5Ð5Ô5Ø5Ü5à5ä5è5ì5ð5ô5ø5ü5666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|6€6„6ˆ6Œ66”6˜6œ6 6¤6¨6¬6°6´6¸6¼6À6Ä6È6Ì6Ð6Ô6Ø6Ü6à6ä6è6ì6ð6ô6ø6ü6777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|7€7„7ˆ7Œ77”7˜7œ7 7¤7¨7¬7°7´7¸7¼7À7Ä7È7Ì7Ð7Ô7Ø7Ü7à7ä7è7ì7ð7ô7ø7ü7888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8€8„8ˆ8Œ88”8˜8œ8 8¤8¨8¬8°8´8¸8¼8À8Ä8È8Ì8Ð8Ô8Ø8Ü8à8ä8è8ì8ð8ô8ø8ü8999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|9€9„9ˆ9Œ99”9˜9œ9 9¤9¨9¬9°9´9¸9¼9À9Ä9È9Ì9Ð9Ô9Ø9Ü9à9ä9è9ì9ð9ô9ø9ü9::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>8?@0À.tls  @@0À.reloc\"°$B@0BU‰åSƒì‹`¤f…Òt4‹`¤fƒë9Úw‹…ÀtóÿЋ`¤fƒë9Úvë‰$èA¦Ç`¤fÇ$è3¦ƒÄ[ÉÃU‰åWVSƒì,‹u‹] ‹}ƒût=‰|$‰\$‰4$è§ƒì …Ûu‹`¤f…Ò„„‰Eäèdÿÿÿ‹Eäeô[^_É vÇ$€èÔ¥£`¤f…ÀtcÇ£`¤f¡€¤f…Àt‰|$ÇD$‰4$ÿЃì èΧ誉|$ÇD$‰4$èy¦ƒì …Àt†eô[^_É 1Àeô[^_É èk¥Ç 1ÀéiÿÿÿfU‰åƒìÇD$`¤fÇD$`¤f‹E‰$èC¥ƒøÀÉÃU‰åƒìÇD$`¤fÇD$`¤f‹E‰$è¥ÉÃU‰åƒìÇ$0¢fè–«R…ÀteÇD$0¢f‰$艫ƒì…ÀtÇD$`¤fÇ$¤fÿЋ ä!¢f…Ét1Ç$)0¢fèS«R…Àt*ÇD$70¢f‰$èF«ƒì…Àt Ç$ä!¢fÿÐÉø맸ëâU‰åƒìÇ$0¢fè «Q…Àt%ÇD$K0¢f‰$èýªƒì…Àt Ç$¤fÿÐÉÃv¸ëç‹D$‹T$¶Ãv‹L$ ‹D$‹T$ˆ ËD$D$Ãv‹T$‹D$·PÃv‹L$ ‹T$‹D$f‰ PÃv‹D$‹T$BËT$‹D$‹ËL$ ‹T$‹D$‰ ËD$‹L$ðËD$ƒè ƒø–ÀÃf1ÀËD$‹T$‰H¿ƒùwƒð ‰B¸ÃfHŸƒùvê¸Ãf‹D$P¿ƒúwƒð ËD$‹T$H¿ƒùv‰¸Ã𠉸ËD$‹T$‰ƒøIt!ÇBIƒøit)¸¹Ç iÃv¸¹Ç iÃf¸ÃfVSƒì‹t$ ‰óÁëƒûNv 1ÀƒÄ[^Ãæÿÿ‹D$$‰$ÿë¡f9ðt…ÛuÛƒîƒþwÓÿ$µ€0¢f°ëɺˆÁÓúˆÐƒà빺ø0ˆÁÓúˆÐƒà멺ˆÁÓúˆÐƒà뙺ÀˆÁÓúˆÐƒà뉺>ˆÁÓúˆÐƒàévÿÿÿº€ˆÁÓúˆÐƒàébÿÿÿºpˆÁÓúˆÐƒàéNÿÿÿ‹T$‹D$ƒøvf…Ò”ÀÉD$‰T$éÿÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè¨ÿÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè]ÿÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mèÿÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$MèÙþÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè—þÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$MèYþÿÿ„À•À1øƒÄ[^_ÃvWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèKýÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$Mè ýÿÿ„À•À1øƒÄ[^_ÃvVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèÈüÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè…üÿÿ„À•ÀŠT$ë¾fVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$MèDüÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mèùûÿÿ„À•ÀŠT$ë¶f‹D$Pöƒúv=…t=( t=) ”ÀððËD$ƒøItƒøit=0t=1”ÀÃf°ðËD$‹T$‰ƒøItIÇBIƒøit!ÇBi=0uS¸¹ Ç 1ÃÇB0¸¹ Ç 1ÃvÇBiÇB0¸ …@Ç 1ÃÇB 0=1¸uÜÊH.Q÷€úTv ‹P …Òt>öÒÿ$•œ0¢ff‹P(‹R…Òtè‹ëÒf‹ŠJ.ƒéF€ùwÕ‰ÐËP(‹J…ÉtÈ‹@Ãf€ùAw½¶Éÿ$ð1¢f‹ŠQ.€út€úDu£‰ÈÃfUWVSƒì,Š\$@ˆ\$‹˜¤ ‹s ‹x@‹@<ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ërëC9ët¶‰$ÿÖ:D$uí‰Ú)ú‰ÐƒÄ,[^_]Ãv—,9ër ëƒÃ9Ýv ‹‰$ÿÖ:D$uì‰Ú)úÁú‰ÐƒÄ,[^_]ÃvW,O9ër ëƒÃ9Ýv·‰$ÿÖ:D$uë‰Ú)úÑú‰ÐƒÄ,[^_]ÃvUWVSƒì,Š\$@ˆ\$‹˜¤ ‹s ‹x@‹@<ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ëwëK9ët¶Cÿ‰$ÿÖ:D$uì‰Ú)ú‰ÐƒÄ,[^_]Ãf—,9ëw ëƒë9Ýs‹Cü‰$ÿÖ:D$uë‰Ú)úÁú‰ÐƒÄ,[^_]ÃfW,O9ëw ëƒë9Ýs·Cþ‰$ÿÖ:D$uê‰Ú)úÑú‰ÐƒÄ,[^_]Ãf‹D$ 9D$”ÀÃUWVSƒì‹‹R‰$ƒút?‹” ‰T$~'‹r‹Z ‹HP1Ò‹<Ö‹lÖ‰9‰i‹<“‰yBƒÁ;$uå‹L$‹‰” ƒÄ[^_]ÃWVS‹‹s$…Òtx‹ …Étm¹ë0v<[»‹x\ŸÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 r6‹Š9ÞÌ)󛋸РßÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 sÊ[^_Ã…ö~+‹P\ƒÂ1ÉÇÇBÿÿÿÿÇBÇBÿÿÿÿAƒÂ49ñuÝ‹Kx…É~Å‹€Ð ƒÀ1ÒvÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿBƒÀ(9ÊuÝ[^_ÃVS‹ˆ¸ ‹I(‹\‘‹°Ì Þ;q w ‹t‘9´¼ r1À[^Ãf˜Ø ;˜Ü –À[^Ãf‹D$‹@0@Ãv‹D$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿÃUWVSƒì‰Æ‰Ó1ÿ‹C,¨ …4€{.Zv‹ëëf¶S.ÿ$•ø2¢f‹‰ðèÇÿÿÿ‰Å‹S‰ðè»ÿÿÿf9ïs‰ïf9øv‰Ç‰øƒÈ f‰C,‰øƒÄ[^_]Ãf‹C(ƒxÿ•D$„Ž‹S‰ðè|ÿÿÿ‹S(‹‹ndTU½fƒ fƒøtfƒ €|$„fƒÿ‚Df9ïs‰ïf9øv‰Ç‹C, øƒÈ f‰C,‰øƒÄ[^_]Ë¿é%ÿÿÿ‹‰ðèÿÿÿ‰Å‹S‰ðèÿÿÿf9ïs‰ï·×·È‰Ö9Ê}‰Îƒþ޽9ʌ͉úƒÊ éµv‹C(‹h‹‰ðèÁþÿÿ‹S(‹‹NdQf‹ ‰ÎƒÎf‰2fƒøtƒÉf‰ E„Ðfƒÿs¿f9øw8‰øfƒÿs0¸ë)‹S‰ðènþÿÿ‰Å‹‰ðècþÿÿ‰Â‰øf9ïs‰èf9Âv‰Ð‰ÂƒÊ f‰S,ƒÄ[^_]Ãvfƒÿƒêþÿÿ¿éàþÿÿº0¿f‰S,‰øƒÄ[^_]Ã‰ÂƒÊ ‰Çëév¿é²þÿÿf‹‰ðèïýÿÿ‰Å‹S‰ðèãýÿÿ‹S(‹‹NdQfƒý„gþÿÿé^þÿÿfƒÿƒ1ÿÿÿ¿é'ÿÿÿƒàé þÿÿSƒì‰Ã…Àu ë&€Ìf‰C,öÄu ‹C…ÀtèÜÿÿÿ‹…Ût‹C,öÄtÚƒÄ[ÃS‹‰X‰XÇ@ …Ût‰ÚfŠJ.€ùVt€ù]u‹ëïv‰P9Ót[Ãv€{.Kwõ¶S.ÿ$•d4¢f‹‰P‹S ‰P [Ãf¡$`¤fÿÃì,D$‰D$ D$‰D$ÇD$”5¢f‹D$4‰$ÿt‚¤f…Àt4‹D$‰D$‹D$‰$èàóÿÿ„À•À¶À‰D$Ç$ª5¢fÿ„ƒ¤fƒÄ,Ãv1ÀƒÄ,ÃfÇD$ÇD$ª5¢f¡„ƒ¤fÿàUWVSƒì\D$L‰D$ D$H‰D$ÇD$¬5¢f‹D$t‰$ÿt‚¤f…Àtx‹D$H¨ t|ÇD$`Ê¡fl$,‰l$‹D$L‰$‹T$ÿR0‰Ç‰$ÿ䂤f‰Æ…ÀtC…ÿ~e1Ûë‰D$‰\$‰4$ÿ삤fC9ûtJ‹D‰D$Ç$ª5¢fÿ„ƒ¤f…ÀuÑ‹H‰…Àtx1ö‰ðƒÄ\[^_]èuX¨€„xÿÿÿÇD$àÊ¡fésÿÿÿv‹D$H%"@="@uÊD$<‰D$‹D$L‰$‹T$ÿR8H~±¡”ƒ¤f‰D$‰4$ÿà‚¤fëvÇD$ Ê¡fé#ÿÿÿv‹F‰4$ÿP1ö‰ðƒÄ\[^_]ÃvVSƒì$‰Ã‰T$Ç$½5¢fÿ„ƒ¤f‰Æ…Àt6‰D$‰$ÿà‚¤f‹J‰…Òt ÷ÐÁèƒÄ$[^ËV‰4$‰D$ÿR‹D$ëá1ÀƒÄ$[^ÃWVSƒì‹\$ ‹|$$‰ƒûItcÇGIƒûitO¾¸ÇiÇ$ièÒ”9Øt ƒøIt‰·FÇ$IèÁ”9Øt ƒøit‰·F‰ðƒÄ[^_Ãv¾뻾¸ë§Sƒì‹D$ ‹\$$=ÿv ‰¸ƒÄ[É$èl”‰¸ƒÄ[ËD$=ÿwéP”ÃvWVSƒì‹\$ ‹|$$‰‰$è,”9Øt$¾‰G‰$è ”9Øt‰·F‰ðƒÄ[^_Ãv‹G¾ë×fSƒì‹\$ ‰$è蓃øIt‰$è㓃øi”ÀƒÄ[ðƒÄ[ÃSƒì‹D$ ‹T$$·Øúÿw ‰ÁÁéƒùNv …Û”ÀƒÄ[Ãÿ$À5¢fK”Àëìf¡0‚¤fƒ8t"ÇD$‰$è‚“…À•À¶À9ÔÀƒÄ[á<‚¤f‹·P%ëÜf1Àƒú–À9ÔÀ뛉$èÄëÀfƒú th1Àƒú ”Àë·¡0‚¤fƒ8…¢¡<‚¤f‹·P%f…À•À¶À9ÔÀƒÄ[Ãf¡0‚¤fƒ8…ž¡<‚¤f‹·P%ë̃ú_…7ÿÿÿ¸éOÿÿÿ¡0‚¤fƒ8…"¡<‚¤f‹·Pƒàëšf¡0‚¤fƒ8…z¡<‚¤f‹·Pƒàéwÿÿÿv¡0‚¤fƒ8…¡<‚¤f‹·P%WéQÿÿÿ¡0‚¤fƒ8…¡<‚¤f‹·Pƒàé/ÿÿÿvƒø"w'ÿ$…ü6¢f¡0‚¤fƒ8…A¡<‚¤f‹·Pƒà…Àuûÿÿ”ÀéPþÿÿƒê0ƒú wê°éAþÿÿ¡0‚¤fƒ8…¡<‚¤f‹·Pƒà ëÁ¡0‚¤fƒ8…¼¡<‚¤f‹·Pƒà룡0‚¤fƒ8…³¡<‚¤f‹·Pƒàë…ÇD$‰$舑ésþÿÿvÇD$‰$èp‘é[þÿÿvÇD$W‰$èX‘éCþÿÿvÇD$‰$è@‘é+þÿÿvÇD$‰$è(‘éþÿÿvÇD$‰$è‘éûýÿÿÇD$‰$èûéâþÿÿÇD$‰$èæéÍþÿÿÇD$‰$èÑé¸þÿÿÇD$ ‰$è¼é£þÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè¨üÿÿ„À•Â;^D|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^D}ã‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$Mè]üÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mèüÿÿ„À•Â;^D|1À„Òt1ÀƒÄ$[^Ã1Ò;^D}ë‰\$‹F@‰$ˆT$ÿ–¨ ‰D$Ç$MèÙûÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F@‰$ÿ–¨ ‰D$Ç$Mè—ûÿÿ„À•À‰Ç;^D|1À1øƒÄ[^_Ã1ÿ;^D}î‰\$‹F@‰$ÿ–¨ ‰D$Ç$MèYûÿÿ„À•À1øƒÄ[^_Ãv‹D$‹T$ƒøIt#ƒøit=0t=1t‰T$‰D$é#Žv‰¸Ãévƒì‰$ÿŒƒ¤f=êw =èr6°ƒÄÃ=ôv-ùƒøvé1ÀƒÄÃ=òsÛ-ìƒøvÑ1ÀëævƒøotÅwƒøet¾ƒøit¹ƒøat´1ÀëÉfƒøut©r¾-àƒøv1Àë²vUWVSƒìL‰Ã‰Ö‰Í‹¸¨ ‹P@…ö~n;pDŒ™Fÿ‰D$‰$ÿ׉D$Ç$Mè ëÿÿ„À•Â;sD|F1À‰é8Ñt+8Á”ÀƒÄL[^_]Ã|$( t ƒ|$(…¯ƒ|$8 …¤1ÀƒÄL[^_]Ãf1Ò;sD}º‰t$‹C@‰$ˆT$ÿ׉D$Ç$Mè™êÿÿ„À•ÀŠT$ë‘f‰t$‰$‰T$ÿ׉D$$Nÿ‰L$,‰L$‹C@‰$ÿ׉D$ ‹D$$‰$èÔo‰D$(‹D$ ‰$èÄoƒø‹T$„ ƒø„ ƒø„ƒ|$(„ùƒ|$(„îƒ|$(„ãƒ|$(„1ÿÿÿƒ|$( „&ÿÿÿ‹D$,…Àˆ‰\$4‹\$,‰t$8‰éˆL$?‰Õf‰\$‰,$ÿ׉Ɖ$è9oƒøtƒø uKƒûÿu݉t$ ‰D$0‰ê‰\$,‹\$4‹t$8¶l$?ƒø „Í‹D$,…Àx ƒ|$ '„rF;sDœ‰éˆL$4‰Ý‰Óf‰t$‰$ÿ׉$èËnƒøtƒø uN9uD߉D$8‰Ú¶l$4ƒ|$0 „?þÿÿ‹\$,KˆG‰Ö‰êˆT$,‹l$0f‰\$‰4$ÿ׉$è{nƒøtƒý uKƒûÿuß¶l$,ƒø „7ƒ|$0„òƒ|$0 „çƒø„?ƒ|$0„Wƒ|$0 „pƒ|$0 …wƒ|$(„Êýÿÿƒ|$0u!ƒ|$( „¸ýÿÿƒ|$(„­ýÿÿƒ|$( „¢ýÿÿ‹D$ ‰D$Ç$MèZèÿÿˆÃ‹D$$‰D$Ç$MèDèÿÿ‰ê8Ó„nýÿÿ8ДÀé>ýÿÿƒ|$(„Yýÿÿ‹D$ ‰D$Ç$MèèÿÿˆÃ‹D$$‰D$Ç$Mèûçÿÿ‰ê8Ó„%ýÿÿ8”ÀƒÄL[^_]Ã|$(„ ýÿÿƒ|$0…ÿÿÿƒ|$( …øþÿÿ1Àéòüÿÿƒ|$( …(þÿÿ1Àéàüÿÿƒ|$0 t ƒ|$0…·þÿÿƒ|$( „Áüÿÿ¸ é¢þÿÿ‹D$0ƒè ƒø‡±þÿÿƒ|$(…¼þÿÿ1Àé—üÿÿ‹D$(ƒè ƒø‡¯þÿÿƒ|$8…¤þÿÿ1Àétüÿÿfƒ|$( …þÿÿ1Àé`üÿÿƒ|$0„~þÿÿƒ|$0 „sþÿÿƒ|$0…›þÿÿécþÿÿ‹D$$‰T$è+ûÿÿ„À‹T$„uýÿÿ°éòûÿÿÇD$0éaýÿÿ1ÀéïýÿÿÇD$8éýÿÿv1É‹T$‹D$éiûÿÿ¹‹T$‹D$éVûÿÿfUWVSƒì,‹|$@‹G0@‰$ÿ\ƒ¤f‰Å…Àtq‹G$‰D$‹G ‰D$Ç$ˆ7¢f¡„ƒ¤f‰D$ÿÐ…Àt@‰E ‹G0…À~P1ö1ÛëfC‰D ƒÆ9_0~;‹G4ð‹P‰T$‹‰D$Ç$ˆ7¢fÿT$…ÀuÒ‹EH‰E…Àt1í‰èƒÄ,[^_]ÃvÿE‰o8‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]ÃvUWVSƒì,Ç$hÿ\ƒ¤f‰Æ…ÀtN1Ûl$‹=xƒ¤fë‰D$‰\$‰4$ÿdƒ¤fCƒûht)f‹„@ì¡ff‰D$ÇD$‰,$ÿ×…ÀuË‹H‰…Àt1ö‰ðƒÄ,[^_]Ãf‹F‰4$ÿP1ö‰ðƒÄ,[^_]Ãvƒì€xAt ‰$ÿ|‚¤fƒÄÃfVSƒì$‰Ö‰$ÿÜ‚¤f‰Ã…Àt.‰t$‰$ÿ$ƒ¤f‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ã1ÀëõVSƒì‰Ã‰Ö¡ `¤f…À„®ƒÃƒûv"ÇD$9¢f¡Ð‚¤f‹‰$ÿÀ‚¤ffƒÄ[^Ãfÿ$@9¢fÇD$28¢f¡Ð‚¤f‹‰$ÿÀ‚¤fëÖf‹F‹@ ‰D$ÇD$|8¢f¡Ô‚¤f‹‰$ÿ´‚¤fë°‹F‹@ ‰D$ÇD$Ì8¢f¡Ô‚¤f‹‰$ÿ´‚¤f댋F‹@ ‰D$ÇD$¤8¢f¡Ô‚¤f‹‰$ÿ´‚¤féeÿÿÿÇD$7¢f¡ `¤f‰$ÿÀ‚¤féIÿÿÿÇD$D8¢f¡Ô‚¤f‹‰$ÿÀ‚¤fé+ÿÿÿvÇD$ð8¢f¡Ì‚¤f‹‰$ÿÀ‚¤fé ÿÿÿv…ö„¨‹F‹@ ‰D$ÇD$Ð7¢f¡Ô‚¤f‹‰$ÿ´‚¤féÙþÿÿÇD$d8¢f¡ `¤f‰$ÿÀ‚¤fé½þÿÿÇD$þ8¢f¡ `¤f‰$ÿÀ‚¤fé¡þÿÿ¡¸‚¤fƒÄ[^ÿàÇD$³7¢f¡Ø‚¤f‹‰$ÿÀ‚¤féwþÿÿvº‹7¢f¸‘7¢fèåýÿÿ£ `¤fé9þÿÿvÇD$8¢f¡Ô‚¤f‹‰$ÿ´‚¤fé;þÿÿvUWVSƒì‹\$0‹D$4…ÀˆÕ;C0Ì…À„€t@ý‹C44ð‹F‰$ÿ䂤f‰Ç…À„—‹F…À„Œ1Û‹-„ƒ¤fëv‹W ‰šC9^vsÝF‹P‰T$‹‰D$Ç$ˆ7¢fÿÕ…ÀuЋH‰…Àtk1ÿ‰øƒÄ[^_]ÃvÇ$ÿ䂤f‰Ç…Àt$‹C$‰D$‹C ‰D$Ç$ˆ7¢fÿ„ƒ¤f…Àt¶‹W ‰‰øƒÄ[^_]Ãv1Ò¸òÿÿÿèýÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÎvUWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpt@ý‹K44ñ‹F‰$ÿ䂤f‰Ç…À„€‹V…Òty1Û‹-„ƒ¤fëv‹W ‰šC9^v`‹F‹D؉D$Ç$ª5¢fÿÕ…ÀuÜ‹H‰…Àtc1ÿ‰øƒÄ[^_]ÃvÇ$ÿ䂤f‰Ç…Àt‹C$‰D$Ç$ª5¢fÿ„ƒ¤f…Àt½‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿèüÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì‹\$0‹D$4…Àˆ±;C0¨…Àtht@ý‹{44÷‹F‰$ÿ䂤f‰Ç…Àt|‹^…Ûtu1Û‹-„ƒ¤fëv‹W ‰šC9^v\‹F‹؉D$Ç$ª5¢fÿÕ…ÀuÝ‹H‰…Àt`1ÿ‰øƒÄ[^_]ÃÇ$ÿ䂤f‰Ç…Àt‹C ‰D$Ç$ª5¢fÿ„ƒ¤f…ÀtÀ‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿè ûÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì,‰Ã‰Õ…Àt*…Òt.‰Ç1ö¡ƒ¤f‰D$‹G‰$ÿT$FƒÇ9îuî‰$ÿT$ƒÄ,[^_]ფf‰D$ëæUWVSƒì,‰Ã‰T$…Àt.…Ò~2‰Æ1ÿ‹-ƒ¤f‹F‰$ÿÕ‹F‰$ÿÕGƒÆ4;|$uæ‰$ÿÕƒÄ,[^_]Ë-ƒ¤fëëSƒì‰Ã‹€¸9 t ÿÈ‚¤f‰CƒÄ[Ãì‹€º9 t ‹@‰$ÿÄ‚¤fƒÄÃfVSƒì‰Ã‰ÖèÒÿÿÿ‰4$ÿƒ¤f‰ØƒÄ[^ë Sƒì(‰ÓÁë=`Ê¡f„¤=àÊ¡fBÿ„¶ƒøwI‹0‚¤fƒ;tZÇD$‰ $‰L$è‹L$…ÀuPƒ;tUÇD$‰ $襅À•ÀƒÄ([Ãvƒëƒûv¯‰L$‰$è¬íÿÿƒÄ([Ãv¡<‚¤f‹·Hƒà…Àt°°ƒÄ([Ãv¡<‚¤f‹·Hƒàë«Bÿƒøv@ƒëƒûv,‰L$‰$è ÞÿÿëÊfƒøv#ƒëƒûv‰L$‰$èËÞÿÿë­‰ $è,fë¢f‰ $èdbHƒø–ÀëvUWVSƒì,‹T$@‹R‰T$…Ò„Ê‹L$@‹Y‹q‹A0‰D$…À~c‹i4ÇD$f‹E…Àx9Ã~‰Ã‹E…Àx9Æ}‰Æ‹}…ÿt$‹E‹‹P1À…Éx9Ë~‰Ë…Òx9Ö}‰Ö@9øuçÿD$ƒÅ‹T$9T$uª‰t$‰\$‹L$‰ $ÿ<ƒ¤f…Àt9‹L$@‹Q …Òt ‹ I‰ …Ét?‹T$@‰B ‰Z‹B…Àt ‹J‰…Òt‹L$@ÇA¡”ƒ¤fÿƒÄ,[^_]ËP‰$ÿRëÛ‹J‰$‰D$ÿQ‹D$ë®vUWVSƒì‹t$0‹D$4…Àˆá;F0Ø…À„ˆ|@ý‹F4<ø‹G‰$ÿ䂤f‰Å…À„¥‹G…À„š1Ûë‹U ‰šC9_†…ÝG‹V‹H)щL$‹)ЉD$‹F ‰$ÿ<ƒ¤f…Àu‹EH‰E…Àto1í‰èƒÄ[^_]ÃvÇ$ÿ䂤f‰Å…Àt*‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿ<ƒ¤f…Àt®‹U ‰‰èƒÄ[^_]Ã1Ò¸òÿÿÿèÜöÿÿ1í‰èƒÄ[^_]ËE‰,$ÿP1íëÐvWVSƒì ‰Ã€x ‹BtCö@W„ÿ‰×‹…Àt_‰|$‰$ÿà‚¤f‰Æ…Àˆ‹H‰…À„¿‰ðƒÄ [^_Ãfö@WuÁ‰$‰T$ÿ€‚¤f‰Ç…À‹T$u®¸íÿÿÿèEöÿÿ¾íÿÿÿëÇf‹C…À„éÇ$ÿ䂤f‰…Àt"‹@ ‹S‰ÇC‹‹@ ‰x1ö‰ðƒÄ [^_þ÷ÿÿÿ‹H‰…Àtz‹…Àt ‹J‰…Ò„ƒ‹C…Àt ‹J‰…Òtg1Ò‰ðèÂõÿÿ‰ðƒÄ [^_ËG‰<$ÿP‰ðƒÄ [^_Ãf‰$‰T$ÿpƒ¤f‰Ç…À‹T$…èþÿÿ¸îÿÿÿèõÿÿ¾îÿÿÿéþþÿÿ‹G‰<$ÿPéxÿÿÿf‹P‰$ÿR뎋P‰$ÿRéoÿÿÿf‰{1öéÇþÿÿfVSƒì$‰Ã‹…À„ï€{…Å€{ uCÇ$Œ9¢fÿ„‚¤f‰Æ‹…ö„’‰D$‰4$ÿˆƒ¤f‹J‰…ÒtG‹‹ I‰ …ÉtXƒÄ$[^ÃvÇD$Ç$ÿxƒ¤f‰Æ‹…ötK‰D$‰4$ÿ|ƒ¤f‹J‰…Òu¹‹V‰4$‰D$ÿR‹D$‹‹ I‰ …Éu¨‹J‰$‰D$ÿQ‹D$ƒÄ$[^Ãf‹J‰…Òt1ÀƒÄ$[^Ãv‰$ÿ肤fé-ÿÿÿf‹P‰$ÿR1Àé[ÿÿÿ‹C…À…Pÿÿÿ€{ uÇ$Œ9¢fÿ„‚¤fé8ÿÿÿÇD$Ç$ÿxƒ¤féÿÿÿf‹D$‹@,‰D$¡”‚¤fÿàfSƒì‹\$ ‹C…Àt ‹J‰…Òtl‹C …Àt ‹J‰…ÒtP‹C‹J‰…Òt8‹C4…Àt ‰$ÿƒ¤f‹C8…Àt‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒ¤fƒÄ[ÿà‹P‰$ÿR뽋P‰$ÿR륋P‰$ÿRë‰UWVSƒì,‰Ç‹€´ …Àt ‰$ÿTƒ¤f‹‡x …Àt"‹-ƒ¤fëf‰Ø‹˜ ‰$ÿÕƒ¯ˆ @…Ûuè‹7‹Ÿ …Ût.‹-ƒ¤fë‰Ã‹C‹S‰$‰D$ÿÕ‹S ‰$ÿÕ‰$ÿÕ‹D$…ÀuÚ‹Ÿ˜ …Ût)‹-ƒ¤fë‰Ë‹K‹V$‹C‰L$èø÷ÿÿ‰$ÿÕ‹L$…Éuß‹Fp…À„4‹V‹GPè‰÷ÿÿ‹Ft…À„‹V$‹G\è¿÷ÿÿ‹Ÿà …Ût5‹-ƒ¤fë‰Ë‹K‹V‹C ‰L$èL÷ÿÿ‹V$‹Cè÷ÿÿ‰$ÿÕ‹L$…ÉuÔ‹FT…À~-1À1Û‹-ƒ¤fv‹—è ‹T‰$‰D$ÿÕC‹D$ƒÀ9^Tà‹‡è …Àt ‰$ÿƒ¤f‹‡Ð ‰D$…Àt>‹vx‰t$…öŽ“‹\$1ö‹-ƒ¤f‹C‰$ÿÕ‹C‰$ÿÕFƒÃ(;t$uæ‹D$‰$ÿÕ‹‹J‰…ÒtN‹G‹J‰…Òt6€¿3 t ƒÇ‰<$ÿ|‚¤fƒÄ,[^_]ËG\‰Ftéîþÿÿ‹GP‰FpéÌþÿÿ‹P‰$ÿRë¿‹P‰$ÿRë§‹-ƒ¤fë‹Sƒì‹\$ C èÐýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒ¤fƒÄ[ÿàSƒì‹\$ C èœýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡ ƒ¤fƒÄ[ÿàWVSƒì ‰Ã‰T$Ç$ª5¢fÿ„ƒ¤f‰Æ…Àt=‰$ÿ4ƒ¤f‰Ç‹H‰…Àt5…ÿt%‰|$‰$ÿà‚¤f‹J‰…Òt'÷ÐÁèƒÄ [^_Ãv1ÀƒÄ [^_Ãv‹F‰4$ÿPëÀ‹W‰<$‰D$ÿR‹D$ëÆWVSƒì ‹t$0Ç$ÿ䂤f‰Ã…Àtº9¢fè¥âÿÿ„Àu)‹H‰…Àt 1ÀƒÄ [^_Ãv‹C‰$ÿP1ÀƒÄ [^_Ãf‹V ‰Øèÿÿÿ„Àtɺ©9¢f‰Øè^âÿÿ„Àt¹‹V$‰Øèüþÿÿ„Àt«º¬9¢f‰Øè@âÿÿ„Àt›‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿ<ƒ¤f‰Æ…À„pÿÿÿ‰$ÿ4ƒ¤f‰Ç‹H‰…À„˜…ÿ„Pÿÿÿ‰|$‰$ÿà‚¤f‰Æ‹J‰…Ò„‚…öˆ,ÿÿÿº¶9¢f‰ØèÁáÿÿ„À„ÿÿÿÇD$Œ9¢fÇ$½5¢fÿ„ƒ¤f‰Æ…À„ùþÿÿ‰\$‰$ÿ|ƒ¤f‹J‰…Òt?‹J‰…Ò…áþÿÿ‹S‰$‰D$ÿR‹D$éËþÿÿ‹F‰4$ÿPéZÿÿÿ‹G‰<$ÿPépÿÿÿ‹V‰4$‰D$ÿR‹D$ë®fUWVSƒì<‹t$PÇ$ÿ䂤f‰Ã…Àtº¸9¢fèáÿÿ„Àu(‹H‰…Àt 1ÀƒÄ<[^_]ËC‰$ÿP1ÀƒÄ<[^_]ËF‰$‹-4ƒ¤fÿՉDžÀtĉD$‰$¡à‚¤f‰D$ÿЋJ‰…Ò„I…Àx¡ÇD$$1À1ÿëPvºÅ9¢f‰Øèˆàÿÿ„Àt€ºÒ9¢f‰Øèxàÿÿ„À„lÿÿÿ‹D$$‹Å X¢f‰Øè^àÿÿ„À„RÿÿÿG‹D$$@‰D$$ƒø w'‹Å$X¢f…F tæ…ÿt£ºÎ9¢f‰Øè+àÿÿ„Àu£éÿÿÿfÇD$$‰÷D$,‰D$ D$(‰D$D$$‰D$‹G4‰$ÿ ‚¤f…À„ º©9¢f‰ØèÞßÿÿ„À„Òþÿÿ‹D$(‰D$‰$ÿT$…Àˆ»þÿÿ‹D$,‰$ÿՉƅÀ„¨þÿÿºÙ9¢f‰Øè ßÿÿ„À„”þÿÿ‰t$‰$ÿT$‹J‰…Òt…À‰fÿÿÿésþÿÿv‹V‰4$‰D$ÿR‹D$ëÝ‹W‰<$‰D$ÿR‹D$é¡þÿÿºÛ9¢f‰Øè>ßÿÿ„À„2þÿÿÇD$Œ9¢fÇ$½5¢fÿ„ƒ¤f‰Æ…À„þÿÿ‰\$‰$ÿ|ƒ¤f‹J‰…Òt#‹J‰…Ò…ûýÿÿ‹S‰$‰D$ÿR‹D$éåýÿÿ‹V‰4$‰D$ÿR‹D$ëÊvUWVSƒì‹\$0‹K@…ÉŽ 1ÿ‹-ƒ¤fë ‰4$ÿÕG9{@~/‹CD‹4¸‹F(‰$ÿÕöF-tá‹F‰$ÿÕ‹F‰$ÿÕ‰4$ÿÕG9{@Ñ‹CD‰$ÿÕ‹CL‰$ÿÕ‹CX‰$ÿÕ‹Cd‰$ÿÕ‹S‹Cpè»ðÿÿ‹S$‹Ctèüðÿÿ‹S…Òt ‰$ÿƒ¤f‹C…Àt ‹J‰…Òtx‹C,…Àt ‹J‰…Òt\‹C0…Àt ‹J‰…Òt@‹C4‹J‰…Òt(‹C8‹J‰…Òu ‹P‰$ÿR‰\$0¡ ƒ¤fƒÄ[^_]ÿà‹P‰$ÿRëÍ‹P‰$ÿR뵋P‰$ÿR뙋P‰$ÿRézÿÿÿ‹-ƒ¤féÿÿÿvVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F@‰$ÿ–¨ ƒø tƒè ƒø–ÀƒÄ[^Ã;^D}ȉ\$‹F@‰$ÿ–¨ ƒø •Àë²vVSƒì‹\$ ‹t$$9sD °ƒÄ[^Ãf‰t$‹C@‰$ÿ“¨ ƒø tƒè ƒø–ÀƒÄ[^Ã…öÎN‰t$‹C@‰$ÿ“¨ ƒø •Àë·vVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F@‰$ÿ–¨ ƒø t PöƒúvÕ=…tÎ=( tÇ=) ”Àë¿;^D}¸‰\$‹F@‰$ÿ–¨ ƒø •Àë¢vVSƒì‹\$ ‹t$$9sD °ƒÄ[^Ãf‰t$‹C@‰$ÿ“¨ ƒø t#PöƒúvÙ=…tÒ=( tË=) ”ÀëÃv…öºN‰t$‹C@‰$ÿ“¨ ƒø •Àë£vVSƒì$‹D$4‹\$89Øt;t$‰t$‰$‹D$0ÿP0ƒø~;\$tºëv;–tB9Âuö1ÀƒÄ$[^Ãf°ƒÄ$[^ÃUWVSƒì ‰Å‰Ó‰Ï1ö…Òu ë"v‹…Ût‰ù‰Ú‰èè:C/uêƒö‹…Ûuç‰ðƒÄ [^_]ÃvSƒìŠZ.ƒë €û:v 1ÀƒÄ[Ãf¶Ûÿ$à9¢ff‹Z$…Ûtä‹R(9 tz1Àëf9 ‚to@9ØuöëË‹B(9”ÀƒÄ[Ãv‰L$‹R(‹‰$ÿƒÄ[ËB(‹P;r9Ñ–Àë˜v‹RƒÄ[ëcv‹RƒÄ[錋RƒÄ[éÿÿÿ‹RƒÄ[ë v°é^ÿÿÿWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè+ÿÿÿ:C/uê°[^_Ã1À[^_ÃfWVS‰Ç‰Ó‰Îè ÿÿÿ:C/t1À[^_Ãv‰ñ‰Ú‰øèñþÿÿ:C/tç‹…Ûuê°[^_ÃWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè¿þÿÿ:C/tê1À[^_ð[^_ÃfUWVSƒì,‰D$‰Ó‰L$‹|$@…É~O1öŠC.ƒè <:v °ƒÄ,[^_]öÀÿ$…Ì:¢ff‹S$…Òt‹,·‹K(;)tÙ1Àëv9,tÍ@9ÐuöF;t$u·v1ÀƒÄ,[^_]Ãf‹ ·‹S‹D$èÝþÿÿ„ÀuŸF;t$uŽëØ‹ ·‹S‹D$èÉýÿÿ„ÀuƒF;t$…nÿÿÿ븋 ·‹S‹D$è ÿÿÿ„À…_ÿÿÿF;t$…Jÿÿÿ딋 ·‹S‹D$è±þÿÿ„À…;ÿÿÿF;t$…&ÿÿÿémÿÿÿ‹·‹C(‹H;‚Qÿÿÿ9ʆÿÿÿF;t$…üþÿÿéCÿÿÿv‹·‰D$‹C(‹‰$‹T$ÿ„À…áþÿÿF;t$…Ìþÿÿéÿÿÿv‹C(‹9·„ÀþÿÿF;t$…«þÿÿéòþÿÿfUWVSƒì<‰Ç‰Ót$ ‰t$‰ $ÿP0‰ÅŠC.ƒè3< w'¶Àÿ$…¸;¢f‹[‰4$‰é‰Ú‰øèGþÿÿ:C/„ÁfÆD$ŠD$ƒÄ<[^_]Ãv‹[…Ûu ëãv‹…ÛtÚ‰4$‰é‰Ú‰øèþÿÿ:C/uçÆD$ŠD$ƒÄ<[^_]Ãf‹[ÆD$…Ûu ë«€t$‹…Ût ‰4$‰é‰Ú‰øèÉýÿÿ:C/uçëàf‹[…Ûu ë´v‹…Ût«‰4$‰é‰Ú‰øè ýÿÿ:C/tçéZÿÿÿf‰4$‰é‰Ú‰øè†ýÿÿ:C/„Aÿÿÿ‹…ÛuãéoÿÿÿfUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øè{þÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèBþÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øè~ýÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèEýÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfSŠZ.ƒë2€ûv1À[öÛÿ$ð;¢ff‹R[é³úÿÿv‹R[é¯ùÿÿv‹R[éûÿÿv‹R[éÃúÿÿvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øèGÿÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèÿÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèÑþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M@‰L$ ŠL$48N/”D$ ‹½¤ ‹M<ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øèJþÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèÔýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰Ã‰Ö‹€¨ ‹S@€~.Aw¶~.ÿ$½0<¢fv;KL|=v1ÀƒÄ,[^_]Ãf;KH~ïI‰L$‰$ÿЋ›¤ ‰Á‰ò‰Øè`ýÿÿ:F/”ÀëÎ;KH~ÇI‰L$‰$ÿЋ›¤ ‰Á‰ò‰Øè(úÿÿ:F/”Àë¦;KL}Ÿë¯;KH~—I‰L$‰$ÿЋV(‹J;r`9È–Àf8F/”Àésÿÿÿ;KHŽgÿÿÿI‰L$‰$ÿЋV(‹j‹:‹“¤ \$‰\$‰$ÿR0…À~1Òv‹ “9Ïw 9Ír°ë­B9Âuë1Àë£v;KLÿÿÿ‰L$‰$ÿЋV(‹j‹:‹“¤ \$‰\$‰$ÿR0…À~Ç1Ò‹ “9Ïw9Ís°B9Âuð1ÀéUÿÿÿ;KLÇþÿÿé,ÿÿÿf;KHŽ·þÿÿ‹›¤ ‹I‰L$‰$ÿЉD$‹F(‹‰$ÿÓ:F/”ÀéŽþÿÿ;KHŽƒþÿÿI‰L$‰$ÿЋV(‹›¤ ‰Á‹‰ØèÉäÿÿ:F/”Àé\þÿÿf;KLOþÿÿëË;KLCþÿÿ‹›¤ ‹ë‹;KHŽ/þÿÿI‰L$‰$ÿЋV(;”¶ҶF/9”Àéþÿÿ;KHŽþÿÿ‹~(‹?I‰L$‰$ÿЉ|$‰D$‹ƒ¤ ‰$èöôÿÿ:F/”ÀéÕýÿÿv;KLÇýÿÿ‹~(‹?ëÃ;KL·ýÿÿë‡;KHŽ«ýÿÿ‹›¤ ‹[ I‰L$‰$ÿЉ$ÿÓ„À”Àé‹ýÿÿ;KLýÿÿ‹›¤ ‹[ ëÓ;KHŽkýÿÿI‰L$‰$ÿЃø •ÀéXýÿÿf9KHœÀéKýÿÿ9KLŸÀé?ýÿÿ9KLŽ3ýÿÿëÇUWVSƒì\‰Ã‰Ö‰Í‹zöG- u‹H@‰L$ ‹ˆ¨ ‰L$€.Kv‹‹T$p‰‰j°ƒÄ\[^_]Ãf¶G.ÿ$…8=¢f‹W$‰T$$‰è+CH9ÂwE‹(‰é)щL$(…ÒtZ1Û‰t$,‹t$ ‰l$ ‹l$ë fC;\$$„Ý‹D$(؉D$‰4$ÿÕ;Ÿtá1ÀƒÄ\[^_]Ã;kL}ñ‰l$‹L$ ‰ $ÿT$ƒø tÝ‹F‹L$p‰n ‰i°ƒÄ\[^_]Ã;kHâ1Àë¼;kH~µEÿ‰D$ë¿;kL|Ë1Àë¥;kL}ž‹ƒ¤ ‹X ‰l$‹L$ ‰ $ÿT$‰$ÿÓ„Àt¡1Àéxÿÿÿ;kHŽmÿÿÿ‹ƒ¤ ‹X Eÿ‰D$ëÊ‹ƒ¤ ‰l$‰$ÿP:G/„fÿÿÿ1Àé=ÿÿÿ‹D$p‰$‰é‰ú‰Øè…þÿÿ„À…EÿÿÿW‹L$p‰ $‰é‰Øèjþÿÿ„À…*ÿÿÿ1Àéÿÿÿ;kLöþÿÿ‰l$‹L$ ‰ $ÿT$‹W(;”¶ҶG/9„ôþÿÿ1ÀéËþÿÿ;kLÀþÿÿ‹G(‹‰l$‹L$ ‰ $‰T$ÿT$‹T$‰T$‰D$‹ƒ¤ ‰$è2òÿÿ:G/„©þÿÿ1Àé€þÿÿ;kHŽuþÿÿ‹G(‹Eÿ‰D$ë°;kHŽ^þÿÿEÿ‰D$é`ÿÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„]þÿÿ1Àé4þÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„=þÿÿ1Àéþÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„þÿÿ1Àéôýÿÿ9kD„ þÿÿ‰l$‹L$ ‰ $ÿT$ƒø „õýÿÿ1ÀéÌýÿÿ‹ƒ¤ ‰l$‰$ÿP(„À…Öýÿÿ1Àé­ýÿÿ9kD„Æýÿÿ1Àéýÿÿ9kD„¶ýÿÿ9kl„­ýÿÿ1Àé„ýÿÿ9kD„ýÿÿ9kp„”ýÿÿ1Àékýÿÿ‹ƒ¤ ‰l$‰$ÿP :G/„týÿÿ1ÀéKýÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„Týÿÿ1Àé+ýÿÿ;kL ýÿÿ‹ƒ¤ ‹‰l$‹L$ ‰ $ÿT$‰D$‹G(‹‰$ÿÓ:G/„ýÿÿ1Àéíüÿÿ;kLâüÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹›¤ ‰Á‹‰Øè¯ßÿÿ„ÀéÖýÿÿ;kHޝüÿÿEÿ‰D$ëÈ;kHŽüÿÿ‹ƒ¤ ‹Eÿ‰D$éuÿÿÿ;kL€üÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹J;rx9È–Àf8G/„{üÿÿ1ÀéRüÿÿ;kLGüÿÿ‰l$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒ¤ \$@‰\$‰$ÿP0‰Á…À~1Àf‹ƒ9T$w 9T$ r°ë•@9Èuç1Àë‹;kHŽâûÿÿEÿ‰D$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒ¤ \$@‰\$‰$ÿP0‰Á…À~µ1Àf‹ƒ9T$w9T$ s˜@9Èuì1Àé%ÿÿÿ;kHŽ|ûÿÿEÿ‰D$éôþÿÿ9k`„‹ûÿÿ1Àébûÿÿ;kLWûÿÿ‰l$‹L$ ‰ $ÿT$‹›¤ ‰Á‰ú‰ØèOõÿÿ:G/„Rûÿÿ1Àé)ûÿÿ;kLûÿÿ‰l$‹L$ ‰ $ÿT$‹›¤ ‰Á‰ú‰Øèòÿÿ:G/„ûÿÿ1Àéðúÿÿ;kHŽåúÿÿEÿ‰D$ëÂ;kHŽÓúÿÿEÿ‰D$étÿÿÿ…í„ãúÿÿEÿ‰D$éÎüÿÿ‹ƒ¤ ‰l$‰$ÿP$„À…¿úÿÿ1Àé–úÿÿ…í„°úÿÿ1Àé‡úÿÿ‹ƒ¤ ‰l$‰$ÿP:G/„úÿÿ1Àégúÿÿ‹W$‹CL)è9‡Uúÿÿ‹O(…Ò„núÿÿê‰T$$‰ï‰è÷؉t$(‹t$ ‰l$ ‹l$ë G;|$$„ÿ‰|$‰4$ÿÕ;»tç1Àé úÿÿ‹O$‰L$$‹KL)é‹D$$…À„±ƒ|$$†ëº«ªªª‹D$$÷âÑê9ÑŒÐùÿÿ‹“¤ ‰T$(‹J8‰L$4‹(‰|$,‰é‹|$$…ÿ„¼1ÿ1À1Ò‰\$0‰Ó‰t$8‰Æ‰l$<ëfCG9þE;\$$„È9þ/‹D$09hLŽnùÿÿ‰l$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$4‰Æ1ÿ‹L$,‹™‰D$‹D¼@‰D$‹T$(‰$èÑìÿÿ„Àu™1Àé$ùÿÿ‹W$‹CL)è9‡ùÿÿ‹›¤ ‰\$,‹O(…Ò„!ùÿÿê‰T$(‰ë‰è÷؉D$$‹|$ ‰t$ ‰l$0‹l$,ë C;\$(„¼‹T$$‹4š‰\$‰<$ÿT$‰t$‰D$‰,$èOìÿÿ„ÀuÏ1À颸ÿÿ‹O$‰ê+SH‰T$$…É„Fƒù†º«ªªª‰È÷âÑê9T$$Œnøÿÿ‹“¤ ‹B8‰D$,‹(‰|$$…É„b‰Ï1À‰\$(‰t$0‰î‰l$4‰Õë:‹L$$‹T¹ü‰T$Xÿ‹Dœ@‰D$‰,$èÁëÿÿ„À„øÿÿO‰Ø…Û޾…ÿ„6…À‹D$(9pHñ÷ÿÿFÿ‰D$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$,ë’‹O$‰L$$‰è+CH9Á‡º÷ÿÿ‹“¤ ‹G(‰é+L$$‰L$(‹\$$…Û„¿÷ÿÿ1ۉ׉t$,‰l$0‰Åë vC;\$$tV‹t‹D$(؉D$‹L$ ‰ $ÿT$‰t$‰D$‰<$èüêÿÿ„ÀuÌ1ÀéO÷ÿÿNé<ÿÿÿ1ÒéÇþÿÿ1Òé`ýÿÿ‹t$,‹l$ éO÷ÿÿ‹t$,‹l$0éB÷ÿÿ‹t$(‹l$ é5÷ÿÿ‹t$ ‹l$0é(÷ÿÿºé‚þÿÿºéýÿÿ‰é‹F‹T$p‰‹v …ö„köÿÿ‹D$p‰H°éböÿÿ‰ñ‹t$0‹l$4…Û~Ð1Àé¹öÿÿ‰ð‰é‹t$8‹l$<9Ç}¹1Àé¢öÿÿWVS‰Ã‰È‹t$¶|$ƒûtƒût>Kt[^_ÃvÐÖ9ðs%1Û€8 •Ãçÿ9ûtë1É€8 •Á9Ùu@9ðuï)Ð[^_ʲ9Øs)1Ƀ8 •Á‰Îçÿ9þtë1Ƀ8 •Á9ñuƒÀ9Ãwí)ÐÁø[^_ÃJr9Øs.1Éfƒ8 •Á‰Îçÿ9þtëv1Éfƒ8 •Á9ñuƒÀ9Ãwì)ÐÑø[^_ÃWVS‰Ã‰È‹t$¶|$ƒû„‹ƒûtBKt[^_ÃvÐÖ9ðv*1Û€xÿ •Ãçÿ9ûtëv1É€xÿ •Á9ÙuH9ðuî)Ð[^_ʲ9Øv.1Ƀxü •Á‰Îçÿ9þtëv1Ƀxü •Á9ñuƒè9Ãrì)ÐÁø[^_ÃvJr9Øv/1Éfƒxþ •Á‰Îçÿ9þtëf1Éfƒxþ •Á9ñuƒè9Ãrë)ÐÑø[^_ÃvWVSS‰Ã‰Ï‹D$‹t$ŠL$8L$ ”D$‹ƒû„ˆƒûtGKtZ[^_ÃvÐÖ9ðs,¶9ٔöۉ߶\$9ßtë¶9ٔöÛ9ûu@9ðuì)ÐZ[^_Â4²9ðs(1Û;”Éß¶\$9ßtëf1Û;”Ã9ûuƒÀ9Æwî)ÐÁøZ[^_ÃB4r9ðs0·9ٔöۉ߶\$9ßtëf·9ٔöÛ9ûuƒÀ9Æwê)ÐÑøZ[^_ÃUWVSƒì<‰Ã‹|$P‹l$T‹@@‰D$8L$X”Á‹ƒ¤ t$ ‰t$‹‰$ˆL$ÿP0‹S<ƒúŠL$„·ƒút^Jt ‰øƒÄ<[^_]Ã|$l$9ïs2‹T$ ‰T$Š…À~¶Û;\$t)1Òë;–tB9Âuö1Ò8ÑuG9ïu×+|$‰øƒÄ<[^_]òëä‹T$<º,ª9ïs1‹T$ ‰T$f‹…À~;\$t,1Òë;–t#B9Âuö1Ò8ÑuƒÇ9ýwÙ+|$Áÿ‰øƒÄ<[^_]òëà‹T$¢f¡Ô‚¤f‹‰$ÿÀ‚¤f1ÀƒÄÃfÇD$h>¢fëÞfVSƒì$‰Ã‹@ö@Wt$‹C ‰B4‹C‰B8ÇB<ÆB@ÆBA°ƒÄ$[^Ë@PÇBÿÿÿÿ…À„ž‹…À„”ÇD$‰T$‰$‰T$ÿÐ…À‹T$xwÆBA‹r‹‰B4…À„ƒ…öxk‰$‰T$ÿ8ƒ¤f‹KöAW‹T$u-9Æt)‰$ÿ|‚¤fÇD$?¢f¡Ô‚¤f‹‰$ÿÀ‚¤f1ÀƒÄ$[^ÃÇB<‰B8ÆB@°ƒÄ$[^ÃfÇD$Î>¢fëÆf‰$ÿ|‚¤fÇD$÷>¢f뱉$ÿ|‚¤fÇD$è>¢f¡Ø‚¤f‹‰$ÿÀ‚¤f1ÀéÿÿÿWVSƒì`ˆÓT$èÃþÿÿ„Àtv‹D$XƒøtfƒøtHtVD$轸ÿÿ¸ÿÿÿÿƒÄ`[^_ÿ° f‹D$T…À~¶Û1öf‰t$‹D$P‰$ÿ×9ØtÅF9t$TèD$è{¸ÿÿ‹D$TƒÄ`[^_ÿT f뾿€ f붸ÿÿÿÿë¢fSƒì‰$ÿƒ¤f‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿè¸ÿÿ‰ØƒÄ[ÃUWVSƒìL‰D$‰T$$ˆL$‹r$ƒþ °ƒÄL[^_]Ëz(¸èžÿÿÿ‰D$,µèŽÿÿÿ‰D$ ‹T$,…Ò„°…À„¨1À‹T$,‰4‚@=uõ»l$0‰t$‰|$‹|$,ëf%ÿ‰4‡C;\$tB‹t$)Þ‹T$‹Dšü€|$t܉l$‰$‹T$ÿR0…À~Ò1Ò‹L•áÿ‰4B9ÂuîC;\$u¾‹t$‹|$€|$…±ÇD$¬ fnþƒî‰t$(ÆD$ÇD$»‰ðØx$T‹—‰T$‹‡‰D$‹D$‰$ÿT$„ÀtuKuÖ­…öxs‹‰D$‹·‰D$‹D$‰$ÿT$„ÀtVN€|$…މt$(ÆD$‹\$K…íy‹D$,‹T$$‰B‹D$ ‰B°ƒÄL[^_]ÃÇD$`E féJÿÿÿfN‹\$KéYÿÿÿ‰è)ð‹T$ ‰M€|$uN…öxÿD$ÆD$ë‹t$(…öyì…íx™‹T$ ‰è)ð‰ªMNƒýÿuòë…ÆD$érÿÿÿ‹D$,‰$‹ƒ¤fÿÓ‹D$ ‰$ÿÓ1ÀéüýÿÿvUWVSƒì<‰Æ‰Ó‰L$‹(‹R$‰ÈÐ;D$PXöC,€„Ü‹{…ÿtU‹E@‰D$ ‹K(‹[‰\$rÿµ‹‰D$‹D$P)Љ$‹E<ƒø„¾ƒø„ÍH„†¸ÿÿÿÿƒÄ<[^_]Ëu@‰t$‹K(‹‹D$P)Ћu<ƒþ„Vƒþ„NuÈ‹t$t$‹l$Å9îv ë´fF9õr­¶9Ãuôƒúv!¶F;Auæ¸ë v¶<;üÿÿ@ÁàèŠÖÿÿ‰Æ‰C\…À„üÿÿ‹E$@ Áá1À‰÷óªéýÿÿ‹T$,éwûÿÿUWVS쌉D$(‰Ó‰ÎŠ„$¨ˆD$.Š„$°ˆD$/¶¬$´¶¼$¸T$<‰ÈèYÔÿÿ„Àu 1ÀÄŒ[^_]öT$|‹CèóÓÿÿ„Àtoçÿ‰|$åÿ‰l$¶D$/‰D$‹„$¬‰D$¶D$.‰D$ ‹„$¤‰D$‹„$ ‰D$D$<‰$‰ñ‰Ú‹D$(èùÿÿ„Àt°ÄŒ[^_]ÃvD$<è×ÿÿ1ÀÄŒ[^_]Ãfƒì‹T$ ‹D$$…ÀxQ;B0L…Àt(D@ý‹J4Á‹P‰T$‹‰D$Ç$ˆ7¢fÿ„ƒ¤fƒÄËB$‰D$‹B ‰D$Ç$ˆ7¢fÿ„ƒ¤fƒÄÃ1Ò¸òÿÿÿè¼ÿÿ1ÀƒÄÃfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹@‰D$ÇD$ª5¢f¡„ƒ¤fƒÄ ÿà‹B$ëäv1Ò¸òÿÿÿèdÿÿ1ÀƒÄ Ãfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹‰D$ÇD$ª5¢f¡„ƒ¤fƒÄ ÿàf‹B ëãv1Ò¸òÿÿÿè ÿÿ1ÀƒÄ ÃfWVSƒì ‰Ã‰ÖIt‰Ðè8Ôÿÿ‰Ç…À„Š…ö~'f‹fúÿwL1É1Àëf‰Áf‹Cfúÿw7ˆ@9ðuë‰t$‰|$Ç$%?¢fÿ„ƒ¤f‰<$‰D$ÿƒ¤f‹D$ƒÄ [^_Ãf‰<$ÿƒ¤f1ÀƒÄ [^_Ãf‰T$‰D$Ç$%?¢fÿ„ƒ¤fƒÄ [^_Ã1ÀëÃUWVS위$Œ‰D$ „$ˆ‰D$ÇD$(?¢f‹„$´‰$ÿt‚¤f…À„œö„$ˆu‹´$Œÿ‰ðÄœ[^_]ÃT$8‹„$ŒèpÑÿÿ„À„d‹D$t‰D$ ƒø„ǃøt"H„ËD$8èZ‹ÿÿ1ö‰ðÄœ[^_]ÃvÇD$(° f‹„$ˆ¨ u¨…¥¨€…ɾ`Ê¡fƒ|$ „¨ƒ|$ „ƒ|$ uŸÇD$d föÄ@‹D$pt@¯D$ èŒÒÿÿ‰Ã…À„wÿÿÿö„$‰@„À‹v8‰t$,‹t$p…öŽg1í1ö|$|‰l$‹D$l‰$ÿT$(‰|$‰$ÿT$,‰D$…À~,1Ò‰l$$‰Ý‰Ó‹Ÿ‰D$‰D$‰,$ÿT$C;\$uä‰ë‹l$$t$E9l$p§€|$x„‰t$‰$ÿxƒ¤f‰Æ‰$ÿƒ¤fD$8è+Šÿÿ‰ðÄœ[^_]Ãf1ö‰ðÄœ[^_]Ën4‹t$p…ö~ª1ÿ‹t$(‰l$‹l$v‰|$‹D$l‰$ÿÖ‰$ÿT$‰D$‰|$‰$ÿÕG‹D$p9øÖ‰Æéhÿÿÿv‹L$ ‰ò‰Øè ýÿÿ‰ÆékÿÿÿÇD$(€ fé[þÿÿvÇD$(T féKþÿÿv¾ Ê¡fé_þÿÿfÇD$¼ féuþÿÿvÇD$ féeþÿÿv¾àÊ¡fé3þÿÿ1öéôþÿÿvUWVSƒìL‰D$$‰T$(‰Î‹\$`‹l$d‹D$hƒèƒø‡?‹<…ÌW¢f‹…ØW¢f‰D$,‹D$$‹€¤ ‰D$ ‹@,9뾉l$‰õ‰Æë fC;\$„¡‰\$‰,$ÿ׉$ÿÖ„Àtã‰î‹l$‹T$ ‹R<‰T$‰\$‰4$ÿ×T$0‰T$‰$ÿT$‰D$…ÀŽÛC‰D$ 1ÿëvG;|$„’‹D¼0‰D$‰\$‰4$ÿT$,‹T$h‰T$‰l$‹D$ ‰$‰ñ‹T$(‹D$$èÿÿÿ…Àt¼ƒÄL[^_]Éî‹l$‹D$$€¸2 u]‹L$h‰ê‰ðèxûÿÿ‰Ã…Ût_‰\$‹T$(‰$ÿ@ƒ¤f‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄL[^_]ÃvÇD$,d f¿T féÁþÿÿf‰l$‰4$ÿxƒ¤f‰Ãë¡1Àë̸÷ÿÿÿëÅSƒì‰T$‰$ÿƒ¤f‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿèä‡ÿÿ‰ØƒÄ[ÃUWVSƒì,‰Æ‰ÍˆT$¸0è Ïÿÿ‰Ã…Àth¹01À‰ßóª‹D$D‰C$…ÀuwÇC(ŠD$ˆC.‰èƒàˆC/Áå f‰k,‹D$@‰C ‹V<9V@|C‰F<…Àt)Áâ‹FDèVÿÿÿ…ÀtZ‰FD‹V@‰B‰V@‰ØƒÄ,[^_]ÃvÇF<º@ëÌf‹FDëÔvÁàèpÎÿÿ‰C(…Àu1À‰$‹5ƒ¤fÿÖ‰$ÿÖ1Ûë¶v‹C(ëävWVSƒì‰Ã‹P9Sr~Š‹H¶ÂƒèƒøIwZ¾°€W¢föÁt1ö¶Ò‹CÇD$‰4$èÞþÿÿ…ÀtM‹‹z‹H(‰9ƒÂ ‰‹S‹:…ÿt*‰B‰C…ötÿC ¸ƒÄ[^_Ã1ö멸ƒÄ[^_ÉëÕ¸ÿÿÿÿëݸ÷ÿÿÿëÖfWVSƒì‰Ã‹P 9S‚†Š‹H¶ÂƒèƒøIwb¾°€W¢föÁt1ö¶Ò‹CÇD$‰4$è:þÿÿ…ÀtU‹H(‹‹z‰9‹z ‰yƒÂ‰‹S‹ …Ét,‰B‰C…ötÿC ¸ƒÄ[^_Ãv1ö롸ƒÄ[^_ÉëÓ¸ÿÿÿÿëÛ¸÷ÿÿÿëÔfUWVSƒì,‰Ã‰Õ‹‹H‹pµ ‰T$Â9S‚ΊˆD$¶ÀƒèƒøIvv1ÿ¶T$‹C‰t$‰<$èˆýÿÿ…À„¦‰ê„ÒufH,…öt‹h(‹;1Ò‹L— ‰L•B9òuó‹T$‹S‹:…ÿt`‰B‰CŠD$ƒèG<vs ¸ƒÄ,[^_]Ãv¾¸€W¢f¯þ뀋K …öt%ƒþv(º«ªªª‰ð÷âÑêʉS ¸ƒÄ,[^_]Ãv1Òëç‰럺ëܸÿÿÿÿ맸÷ÿÿÿë vUWVSƒì‰Ã‹Š‹H¶ÂƒèƒøI‡í¾°€W¢föÁt1ö¶Ò‹CÇD$‰4$èüÿÿ‰Ç…À„僋C‹(…í„ljx‰{‹k ‹‹ƒè ƒø:v¸ÿÿÿÿƒÄ[^_]Ãÿ$…8?¢fº‰Øèdþÿÿ…À„‹;SsÏ‹ƒøuÀƒÂ‰‹‰Glj{‰k …ötPE‰k ¸ƒÄ[^_]Ãv‰Øè!ÿÿÿƒøt¸ë‘f‰Øè]ýÿÿƒøt¨ëf‰Øè­üÿÿƒøt˜énÿÿÿv1öéÿÿÿ¸ƒÄ[^_]Ãv‰8é5ÿÿÿ1ÀéEÿÿÿ¸÷ÿÿÿé;ÿÿÿUWVSƒì‰Î‹\$0‰×JþƒùIwI¾Š~W¢f‰Í¯î‰ù¶Ñ‰t$‰,$1Éè^ûÿÿ…ÀtfH,…ö~‹x(1Òv‹ “‰ —B9òuõƒÄ[^_]Ã1íë¿UWVSƒì‰Ã…Àtk‹@(4•,0‹}B‰T$ …ÿt9 tM1Òë9L•tBB9úuõ‹S$•‰L$è®úÿÿ…À‹L$t,ÿC$‰C(Æ‹‹T$ Ú‰ C‰°ƒÄ[^_]Ãf°ƒÄ[^_]Ã1ÀëôfUWVSƒì‰Å‰×‰Î‹\$0…Ût;‹C,¨@u4ƒÈ@f‰C,ŠC.ƒèVÿÿëà‹t$P1ÿ1í‰t$TëfƒÇ ;k Ž‹SL‰T$PE‰l$Ç$ª5¢fÿ„ƒ¤f‰Æ…Àtf‰D$‹C0‰$ÿ‚¤f‹T$PˆD: ‹H‰…Àu´‹F‰4$ÿPë©‹E‰$ÿT$X‹E‰$ÿT$Xéªþÿÿ‹C‰$ÿPééüÿÿ‹t$T‹-ƒ¤f‰l$Xé;ûÿÿ‹t$Té¹üÿÿ‹t$T‹{‰øèüNÿÿ‰C€. „;ÇC\ÿÿÿÿ‰4$ÿT$X‹D$\…À„§úÿÿ‹S ‹„$¨ö u €ä¿‰„$¨€ætKƒø„”=@tn…Àu‹D$\‰$‹L$LºK‰Øè8áÿÿ‰ƒ€f‹D$\‰$ÿT$X‰ØÄ¼[^_]Ãø„=@td…ÀuÔ‹D$\‰$‹L$LºF‰Øèíàÿÿ‰ƒ€ëµ‹D$\‰$‹L$LºH‰ØèÎàÿÿ‰ƒ€ë–‹D$\‰$‹L$LºJ‰Øè¯àÿÿ‰ƒ€étÿÿÿ‹D$\‰$‹L$LºG‰Øèàÿÿ‰ƒ€éRÿÿÿ‹D$\‰$‹L$LºI‰Øèkàÿÿ‰ƒ€é0ÿÿÿ‹G(‹‰C\é¿þÿÿ1Ò¸÷ÿÿÿè·cÿÿ‹D$\‰$ÿT$X‰4$ÿT$XéVùÿÿÇC@éÈýÿÿWVSƒì‰Ó‹2‹–´ …ÒtÿÇD$‰$‹=Lƒ¤fÿ×…ÀtƒÄ[^_ÉØèñhÿÿÇD$‹†´ ‰$ÿ׉؃Ä[^_éñhÿÿUWVSƒì,‰Æ‰Ó‹)9*sg…Àtk‰*‹z‰L$èÍhÿÿTmÁâ‰øè÷Úÿÿ‰Ç‰ðè–hÿÿ…ÿ‹L$t>‰{‹)‰kDmÁà‰D$‹D$@‹‰D$‰<$èÙêÇC ÿÿÿÿ°ƒÄ,[^_]ËzëÊv1ÀƒÄ,[^_]ÃfWVSƒì‰Ç‰Ö‰ËIC‰$‰øèXÿÿÿ„Àt4KVC‰$‰øèAÿÿÿ„Àt‹C(‰F(‹C,‰F,‹C0‰F0°ƒÄ[^_Ãf‹V‰øè&hÿÿ‹V‰øèhÿÿ1ÀƒÄ[^_ÃvUWVSƒì‰Å‹¸ä ‹G‰D$…Àt~‹E‰D$‹@‰$…À~4‹]P‹O 1À1Ò‰|$ v‹4‹|‰4‰|‹t‰tBƒÀ;$uá‹|$ ‹D$‹P$…Ò~.1Û1ö‰$‰Ã‹ $O‹$U\1ÀèÿÿÿFƒ$49s$ã‹G‰D$‹‰…ä ‹D$ƒÄ[^_]ÃUWVSƒì‰D$‰Ó‹‰$‹‰T$ ‹€ä …À„ª‹h…턳‰]…Û„€‹D$ ‹@‰D$…À~-‹] ‹$‹JP1À1Ò‹4‹|‰4‰|‹t‰tBƒÀ;T$uà‹L$ ‹Y$…Û~91Û1ö‰Ïë FƒÃ49w$~'‰Ù‹$H\‹UÚ‹D$è5þÿÿ„ÀuÝ1ÀƒÄ[^_]Ãv‹$‰ªä °ƒÄ[^_]Ë$‹¨à …í…Pÿÿÿvº‹D$è¢Àÿÿ‰Å…Àt·‹T$ ‹B@Áâ‹D$è†Àÿÿ‰E ‹L$ ‹A$@Áâ‹D$èjÀÿÿ‰E‹U …ÒtQ…ÀtM‹L$ ‹A @Áá1ö‰×‰ðóª‹T$ ‹B$@ Áá‹U‰×‰ðóª‹$‹‚ä ‰EÇE…Àt/‰hé¬þÿÿ‹D$èÖeÿÿ‹U‹D$èÊeÿÿ‰ê‹D$è¿eÿÿ1Àéÿÿÿ‹ $‰©à éwþÿÿfUWVSƒì‰Å‹D$0‹]@‰\$ 8L$8”D$ ‹½¤ ‹2‹U<ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ërëC9ët¶ ‰ò‰øèceÿÿ8D$ t鉨+D$ ƒÄ[^_]Ãv‹T$ ‚‹D$4,‚9ër ëƒÃ9Ýv‹ ‰ò‰øè&eÿÿ8D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹T$ B‹D$4,B9ër ëƒÃ9Ýv· ‰ò‰øèådÿÿ8D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‹D$0‹]@‰\$ 8L$8”D$ ‹½¤ ‹2‹U<ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ëwëK9ët¶Kÿ‰ò‰øèfdÿÿ8D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹T$ ‚‹D$4,‚9ëw ëƒë9Ýs‹Kü‰ò‰øè)dÿÿ8D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹T$ B‹D$4,B9ëw ëƒë9Ýs·Kþ‰ò‰øèècÿÿ8D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰D$‰Ë‹|$@€z.Av 1ÀvƒÄ,[^_]öJ.ÿ$ØC¢fÇD$‰Ù‹D$+HH9ùv‰ù‰ß)ω<$‰Ù‹D$èç{ÿÿ)ÉØë½ÇD$‰Ù‹D$+HH9ùv‰ù‰ß)ω<$‰Ù‹D$èsyÿÿ)ÉØëÇD$‹D$‹HL)Ù9ùv‰ùÙ‰ $‰Ù‹D$èIxÿÿ)Øé^ÿÿÿfÇD$‹D$‹HL)Ù9ùv‰ùÙ‰ $‰Ù‹D$è]zÿÿ)Øé.ÿÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‰Ù+HH‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èèM•ÿÿ)ÉØéØþÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$è“ÿÿ)ÉØéžþÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$豑ÿÿ)Øéfþÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‹@L)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èè›ÿÿ)ØéþÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$èkÿÿ)ÉØéâýÿÿfŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$è—üÿÿ)ÉØé¦ýÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èaûÿÿ)ØénýÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èÅÿÿ)Øé6ýÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‰Ù+HH‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èèuŒÿÿ)ÉØéàüÿÿŠJ/‹R(ÇD$‰Þ‹D$+pH9þv‰þ‰ß)÷‰|$‰$‹D$èÛŠÿÿ)ÉØé¦üÿÿfŠJ/‹R(ÇD$‹D$‹pL)Þ9þv‰þÞ‰t$‰$‹D$èI‰ÿÿ)Øénüÿÿf‹J(‰L$‹D$‹p@‹h<ÇD$ ‹@L)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èè ˆÿÿ)Øé$üÿÿ‰Ú‹D$+PH9úv‰ú‰Ù)ÑÇ$‰Ú‹D$èãDÿÿ)ÉØéöûÿÿf‹D$‹HL)Ù9ùv‰ùÙÇ$‰Ú‹D$èåCÿÿ)ØéÊûÿÿf‹D$‹P@‹p<ÇD$‰Ø‹L$+AH9øv‰ø‰ß)lj<$‰Ù‰ðè†ÿÿ)ÉØéŽûÿÿf‰Ø‹L$+AH9ø†{ûÿÿ‰øétûÿÿ‹T$‹BL)Ø9ø†cûÿÿëæ‹D$‹P@‹p<ÇD$‹@L)Ø9øv‰ø؉$‰Ù‰ðèY…ÿÿ)Øé.ûÿÿfUWVSƒì\‰D$LˆL$;‹*‹B‰D$4‹Z‹D$L‹‰D$,„Ét‹Ph‰T$<‰×+xH9|$4~'1í‰èƒÄ\[^_]ËD$,‹@h‰D$<‹T$,‹zL)Ç9|$4Ù‹D$,‹€¨ ‰D$ ‹T$,‹r@‹‚¤ ‹@4‰D$$‹D$Lè^ÿÿ‹D$,‹@<‰D$@ƒø„2ƒø„þHuŽÇD$(d f9ß~‰ß‹D$@¯ÇèiŸÿÿ‰Ã…À„‹T$,‹‹@8‹@ ‹¨‰D$H…À„ø9|$4ê‰ú÷Ú‰T$0f€|$;„­‹D$0‰D$D…ÿ~91í‹T$<ЉD$‹D$è‰D$‰4$ÿT$ ‰$ÿT$$‰D$‰l$‰$ÿT$(E9ýuÔ‹D$@‰D$‰|$Ç$‰Ù‹T$H‹D$,èÎÍÿÿƒøtM…ÀuOÿD$09|$4Žvÿÿÿ‰Å‰$ÿƒ¤f‹D$Lèâ\ÿÿ‰èƒÄ\[^_]ÃÇD$(¼ féÿÿÿv‰|$D1ÀéPÿÿÿ‰Å‹D$D‹T$,Bhë¹ÇD$( féÕþÿÿ1í먉$ÿƒ¤f‹D$LèŠ\ÿÿ½þÿÿÿé=þÿÿWVSƒì‰Æ‰ÓƒùŽ¥¡0Ä¡f‰$ÿ0ƒ¤fÇD$ Ä¡f‰$ÿ,ƒ¤f‰Ç…Àth‹C‰G‰G ÇG‰wÇG8ƒÿ‹V …Ò~N‹CPèÀÿÿ‰G4…Àto‹V ‰W0‹CH‰G‹CL‰G€»5 tD‹Ch‰G ‹Cd‰G$‹CT‰G(‹CX‰G,‰øƒÄ[^_ÃvÇG4ë»vuB‹=”ƒ¤fÿ‰øƒÄ[^_ËCd‰G ‹Ch‰G$ëºf‹H‰…Àt1ÿë·v‹G‰<$ÿP1ÿë§v1Ò‰ÈèãUÿÿ1ÿë—vVSƒì$‹t$0Š\$4ˆ\$‹”ƒ¤f9Þt …É~;H ~$€|$t51Ò1À‰T$‰D$‰4$ÿ<ƒ¤fƒÄ$[^ÃfDIý‹B…Àt΋‹RëÒvÿ‰ØƒÄ$[^ÃfSƒì‰Ã‰È…Òxp;S0k…Òt?TRý‹K4Ñ‹ …Éx'‹R…Òx ‹C)‰T$)Á‰L$‹C ‰$ÿ<ƒ¤fƒÄ[ÃÿƒÄ[ËS‹C$)ЉD$‹C )ЉD$‹C ‰$ÿ<ƒ¤fƒÄ[Ãf1Ò¸òÿÿÿèèTÿÿ1ÀƒÄ[ÃWVSƒì0‹t$@¡”ƒ¤f‰D$,D$,‰D$ÇD$ üË¡fÇD$àD¢f‹D$H‰D$‹D$D‰$ÿx‚¤f…ÀtD‹F0‰$ÿ\ƒ¤f‰Ç…Àt4‹^0…Û~-1Ûë v‰DŸ9^0~C‹L$,‰Ú‰ðèõþÿÿ…Àuå‹H‰…Àt 1ÿ‰øƒÄ0[^_ËG‰<$ÿP1ÿ‰øƒÄ0[^_ÃSƒì‰Ã‹‚´ …Àt‰$ÿXƒ¤f‹H‰…ÀtƒÄ[ËC‰$ÿPƒÄ[ÃfVSƒì$‹\$0‹C‹p0…ötA‹C,…Àx:‰D$Ç$ª5¢fÿ„ƒ¤f‰Æ‰D$‹C‹@0‰$ÿ˜‚¤f‹J‰…Òt…Àu ÿ°‚¤f¡”ƒ¤fÿƒÄ$[^Ãv‹V‰4$‰D$ÿR‹D$ëÒSƒì‰$ÿð‚¤f‰Ãƒøÿt‰ØƒÄ[Ãÿ¼‚¤f…Àtî1Ò¸ñÿÿÿèVSÿÿëàUWVSƒì,‰Ã‰Ö‰ÍŠD$@ˆD$‰Èè°ÿÿÿ‰Çƒøÿt9…Àx‹9ø|‰øƒÄ,[^_]À|$t ‹|8…ÿàv¿ÿÿÿÿ‰øƒÄ,[^_]ἂ¤f‰D$ÿÐ…ÀtÍ‹‹5°‚¤f‹x,…ÿt;ÿÖ‰l$‹‹@,‰$ÿ(ƒ¤f‰Ã…Àt!è3ÿÿÿ‰Ç‹H‰…Àt ƒÿÿu„ÿT$…À„xÿÿÿÿÖ¿ÿÿÿÿélÿÿÿv‹C‰$ÿPëÕWVSƒì‰Ã‰×‰Î‹B÷@Tt$S0CÇ$‰ùèÿÿÿ‰D$‰$ÿÖƒÄ[^_øóÿÿÿè>Rÿÿ1ÀƒÄ[^_ÃUWVSƒì,‰D$‰Ö‰L$‹j…íu ÇD$‹D$‰$ÿT$‰Ç‰øƒÄ,[^_]ÃýtK‰,$ÿ\ƒ¤f‰Ç…Àtá…í~Ý1Ûë ‰DŸ C9ëtЋTž ‹L$‹D$èBÿÿÿ…Àuâ‹H‰…Àt%1ÿ‰øƒÄ,[^_]ËR ‹L$‹D$ƒÄ,[^_]éÿÿÿ‹G‰<$ÿP1ÿë€v¹´0 f‹T$‹D$é>ÿÿÿf¹È1 f‹T$‹D$é*ÿÿÿf¹À2 f‹T$‹D$éÿÿÿf¹Ô6 f‹T$‹D$éÿÿÿf¹Œ  f‹T$‹D$éîþÿÿf¹¡ f‹T$‹D$éÚþÿÿf¹X¡ f‹T$‹D$éÆþÿÿfWVSƒì‰Ã‰×‰ÎŠL$ ‹B÷@Tt$S0C¶É‰ $‰ùèuýÿÿ‰ñ‰Â‰ØƒÄ[^_éHûÿÿ¸óÿÿÿè®Pÿÿ1ÀƒÄ[^_ÃUWVSƒì,‹D$@‰D$‹t$D‹n…íu‹ ”ƒ¤f1Ò‹D$ƒÄ,[^_]éûÿÿfƒýtS‰,$ÿ\ƒ¤f‰Ç…Àt:…í~61Ûë ‰DŸ C9ët)‹Tž Ç$‹ ”ƒ¤f‹D$è9ÿÿÿ…ÀuÙ‹H‰…Àt01ÿ‰øƒÄ,[^_]ËV ÇD$@‹ ”ƒ¤f‹D$ƒÄ,[^_]éÿþÿÿv‹G‰<$ÿP1ÿëÅvUWVSƒì,‰D$ÿœ‚¤f‰Å…À„ËT$‹B‹@,…À„±‰$ÿü‚¤f‰Ã…À„‘‹@…ÀŽÍ‹C ‹0…ött1ÿë…ÀxlG9{޲‹C ‹4¸…ötXÇ$‹ ”ƒ¤f‰ò‹D$èdþÿÿ…À„œ‰D$‰t$‰,$‰D$ÿ¤‚¤f‹T$‹ I‰ …Éu¦‹J‰$‰D$ÿQ‹D$…Ày•‹H‰…Àt/‹EH‰E…Àt 1í‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãv‹C‰$ÿP‹EH‰E…ÀuÈëÒf‹H‰…Àu½‹C‰$ÿP벋H‰…Àu“‹F‰4$ÿPëˆUWVSƒì,‹t$@ÇD$êD¢f‹D$D‰$ÿ$ƒ¤f‰Å…À„«‹F0@‰$ÿ\ƒ¤f‰Ç…À„‰‹F0…Àx*1Ûf‹ ”ƒ¤f‰Ú‰ðèÙøÿÿ‰D$‰\$‰<$ÿdƒ¤fC9^0}Ú‰ðèGþÿÿ‰Ã…Àt9‰D$‰|$‰,$ÿƒ¤f‹J‰…Òtc‹J‰…Òtt‹UJ‰U…Òt3ƒÄ,[^_]Ãv‹H‰…Àu ‹G‰<$ÿP‹EH‰E…Àtc1ÀƒÄ,[^_]ËU‰,$‰D$ÿR‹D$ƒÄ,[^_]Ãv‹S‰$‰D$ÿR‹D$‹J‰…ÒuŒ‹W‰<$‰D$ÿR‹D$‹UJ‰U…Ò…wÿÿÿ먋E‰,$ÿP1ÀƒÄ,[^_]ÃUWVSƒìL¡”ƒ¤f‰D$Gÿÿ„Ût½»öÿÿÿénÿÿÿÆ„$Š‹u@‰t$|‹¨ ‰\$t‹t$h‹6‰´$ÇD$`ÿÿÿÿétüÿÿ€½5 „@üÿÿ;œ$Œt¶1Û‰ØÄ,[^_]Ãv‰Ðè+ÿÿ‰D$xé±ûÿÿ‹T$@‰”$‰„$Š•5 ‰Á‹t$`‹|$p‹\$@f„Òt49D$XeX‰Ed€{.…… 9E`tD€½; u‰Eh»é¤þÿÿf9Ç}Ò1Ûé—þÿÿ€¼$‰uÛ„Òt9D$X”Á„ÉuÌð‰Á뀽8 uðë±9Ç”Áëâ‹D$D‹‹3ǃ( ÿÿÿÿ‹–€…Òt ŠB.ƒèF<v‹Ch…À‰éûÿÿ1Ûé*þÿÿ¶Àÿ$…ÄG¢fffƒ,y ;³( „Yýÿÿ‰,$‰ñ‰ú‹D$DèÉ–ÿÿ‰Æ…À‰?ýÿÿ1Ûéêýÿÿfƒ,y ;³( „%ýÿÿ‰,$‰ñ‰ú‹D$Dèíÿÿ‰Æ…À‰ ýÿÿ1Ûé¶ýÿÿfƒ,ˆ= ‹O(‹W$„$‰D$‹CH‰D$‰4$‹t$D‹èzÿÿ‰Æ…öˆ#w9|$@„æ`‰ñ‹T$@‰”$ø‰´$ü‰Ð‰Kd‹Sh‹\$L‰‰KéØûÿÿ„À‹C`„e9ÆŒo8‰Æézüÿÿf‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èØwÿÿ‰Æ9ÅŒBüÿÿ1Ûéíüÿÿvfƒ,y ;³( „%üÿÿ‰,$‰ñ‰ú‹D$Dèˆÿÿ‰Æ…À‰ üÿÿ1Ûé¶üÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„ìt$8‰t$‰$ÿ×8D$Huå‹|$Pé»ûÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„¨t$8‰t$‰$ÿ×8D$Huåë³v‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èôoÿÿ‰Æ9ÅŒ>ûÿÿ1Ûééûÿÿvfƒ,ˆM‹O(‹W$„$‰D$‹CL‰D$‰4$‹t$D‹è[wÿÿ‰Æ…öˆ(v9|$@…0þÿÿ‹T$@‹…À„…wŒ$ø‰ $‹Œ$‰Øè `ÿÿ„À…ewFŠƒ5 „À„Yl;sHqùÿÿ1ÛéTûÿÿfÇD$‰,$‰ñ‰ú‰ØèÎ[ÿÿ‰Æ9ÅŒ€úÿÿ1Ûé+ûÿÿ‹“¨ ‰T$l‹S@<ÀƒàHMÿ‰L$8NxA‰|$H‰\$P‰l$\‹|$l‰Õ‰Ãëv9t$8„qZÞx‰t$‰,$ÿ׃ø uä‹|$H‹\$P‹l$\FéúÿÿfÇD$‰,$‰ñ‰ú‰ØèþWÿÿ‰Æ9Åðùÿÿ1Ûé›úÿÿÇD$‰,$‰ñ‰ú‰ØèZÿÿ‰Æ9ÅÈùÿÿ1ÛésúÿÿÇD$‰,$‰ñ‰ú‰ØèªXÿÿ‰Æ9ÅŒ ùÿÿ1ÛéKúÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè$oÿÿ‰Æ9Årùÿÿ1ÛéúÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„@t$8‰t$‰$ÿ×8D$Huåé`ýÿÿŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@ ‰|$P‰Çë 9õ„t$8‰t$‰$ÿ×8D$Huåéýÿÿ„À„ˆ‹CD9Æý‹Cl9Æò1Ûémùÿÿv„À„<;sD„§øÿÿ1ÛéRùÿÿ‹‹¨ ‹S@<ÀƒàH‰D$8;sD„‚øÿÿ‰|$P‰\$H‰Ï‰Óë9õ„ Xt$8‹T$H;rD„X‰t$‰$ÿ׃ø uÙ‹|$P‹\$Hé@øÿÿ‹S@‹C<ÇD$‰,$‰ñè@hÿÿ‰Æ9ÅŒøÿÿ1ÛéÉøÿÿvfƒ,y ;³( „øÿÿ‰,$‰ñ‰ú‹D$Dèi—ÿÿ‰Æ…À‰ç÷ÿÿ1Ûé’øÿÿ‹S@‹C<ÇD$‰,$‰ñè gÿÿ‰Æ9ž÷ÿÿ1Ûéiøÿÿv‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èˆhÿÿ‰Æ9Å~÷ÿÿ1Ûé)øÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„Dt$8‰t$‰$ÿ×8D$HuåélûÿÿÇ$‰é‰ò‰Øè"%ÿÿ‰Æ9ÅŒ÷ÿÿ1Ûé¿÷ÿÿ‹O(‹S@‹C<‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èxnÿÿ‰Æ9ÅÖöÿÿ1Ûé÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèPmÿÿ‰Æ9ÅŒ¦öÿÿ1ÛéQ÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèˆÚÿÿ‰Æ9ÅŒvöÿÿ1Ûé!÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè\Ùÿÿ‰Æ9ÅFöÿÿ1ÛéñöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øèpÿÿ‰Æ9ÅŒöÿÿ1ÛéÁöÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèTnÿÿ‰Æ9Åæõÿÿ1Ûé‘öÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„¤t$8‰t$‰$ÿ×8D$HuåéÔùÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒ¤ ‹@‰|$P‰Çë 9õ„Xt$8‰t$‰$ÿ×8D$HuåéùÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè„hÿÿ‰Æ9ÅŒ.õÿÿ1ÛéÙõÿÿvÇ$‰é‰ò‰ØèF"ÿÿ‰Æ9Åõÿÿ1Ûé³õÿÿŠO/‹W(ÇD$‰l$‰4$‰ØèØfÿÿ‰Æ9ÅÚôÿÿ1Ûé…õÿÿv‰Æ9CHŽÅôÿÿ1Ûépõÿÿf‹„$ø‰ñ‹´$üéþ÷ÿÿv‹l$4‰uh»‰ØÄ,[^_]Ãv‰Œ$é`õÿÿ1Ûé'õÿÿ‹sD9sL„hôÿÿ1Ûéõÿÿ…ö„Xôÿÿ1Ûéõÿÿ‹Cl9Æ~‹CD9Æ~ 1Ûéíôÿÿv‰Æ9CL-ôÿÿ1ÛéØôÿÿf9ÆŽ›÷ÿÿ1ÛéÇôÿÿ1Ûé¿ôÿÿ1Ûé·ôÿÿ1Ûé¯ôÿÿ1Ûé§ôÿÿ1ÛéŸôÿÿ1Ûé—ôÿÿ1Ûéôÿÿ;³( …§øÿÿ‹ƒ, ‰„$é½øÿÿf;³( …·öÿÿ‹ƒ, ‰„$éÍöÿÿ‹Kh‹CH‰$‹D$Dè ÿÿ…Àˆ›q‰ƒ( ‹–€‰Á+J$‰‹, ‹V|…ÒˆØõÿÿ‹Ch9ÂÎõÿÿ‰Ðé¸ñÿÿ‹Kh‹CL‰$‹D$Dè„ÿÿ‰Â…ÀˆBq‰“( ‹†€‹@$Љƒ, ‹F|…Àˆ†õÿÿ)‹Ch9ÂŒ|õÿÿ‰Ðéuõÿÿ‹J(‹R$„$‰D$‹CH‰D$‹Ch‰$‰Øè“pÿÿ…Àˆíp‰ƒ( ‹”$‰“, ‹V|…Ò‰Oÿÿÿé"õÿÿ‹J(‹R$¼$‰|$‹CL‰D$‹Ch‰$‰Øèßnÿÿ…Àˆˆp‰ƒ( ‹”$‰“, ‹V|…Òˆ×ôÿÿ)Љ‹Ch9ÂŒËôÿÿ‰ÐéÄôÿÿ‹Kh‹CL‰$‹D$Dè±~ÿÿ‰Â…À‰ýþÿÿ1ÛéÚòÿÿ‹Kh‹CH‰$‹D$D莑ÿÿ…Àˆo‰ƒ( ‹–€‰Ç+z$‰», ‹V|…Ò‰Šþÿÿé]ôÿÿ‹„$9D$XŒè\öA- …#c‹…0 @f‰…0 f…À„‰<‹•„ ‹‚ H ÀЉŒ €{ ]†Š-»ÿÿÿÿ‰ØÄ,[^_]Ë„$‰D$‰,$‹\$hÿS‹”$:B/„§`öB- t‰Œ$„$‰$‹T$d‹D$Dè˜ÿÿ„À„aq‹„$…À…òÿÿéOÿÿÿv‹„$9D$p{[öA- „1ÿÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè_–ÿÿ„À„o‹„$…À…¤ñÿÿéïþÿÿv‹„$9D$XŒI\öA- „ÑþÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèÿ•ÿÿ„À„ûp‹„$…À…Dñÿÿéþÿÿv‹„$‰D$‰,$‹t$hÿV‹”$:B/„G`öB- „]þÿÿŒ$„$‰$‹T$d‹D$Dè×–ÿÿ„À„Sp‹„$…À…Øðÿÿé#þÿÿv‹„$‰D$‰,$‹\$hÿS‹”$:B/„aöB- „ñýÿÿŒ$„$‰$‹T$d‹D$Dèk–ÿÿ„À„ÿm‹„$…À…lðÿÿé·ýÿÿv‹„$‰Eh‹S(¹‹D$DèYÙÿÿƒøŒÕl„Šýÿÿ‹Eh‰„$‹„$‹‰„$éðÿÿ‹„$‰Eh‹C(‹8‹X‰\$4‹H‹D$D‹‹sh‰ò+SH9T$4:ýÿÿ‹ƒ° ‰D$L‹C@‰D$8‹D$D‰T$0‰L$,èx7ÿÿ‹‹@8‹@ ‹¸‰D$<…À‹T$0‹L$,„Og‰Ï9Ñ~‰×9|$4/g)þ‰l$Hëfv‰t$‹l$8‰,$ÿT$L‰|$‰$ÿxƒ¤f‰Å…í„ g‰l$‹T$<‰$ÿ@ƒ¤f‹MI‰M…É„ÅNƒø„ÒN…À…"nOF9|$4½f€»2 u”‹k<‰t$‹D$8‰$ÿT$L‰é‰úèù£ÿÿ‰Å듺‹D$Dè‘ÿÿ„À„bk‹Œ ÇD$…¸ ‰D$‰$è˸‹„$‹@(‹‰C‹„$‰C•¼ ¹1À‰×óªÇ…Ì ‹„$‰…¸ ‹‰„$é|îÿÿ‹„$‰D$‰,$‹t$hÿV‹”$:B/„ _öB- „ûÿÿŒ$„$‰$‹T$d‹D$Dè”ÿÿ„À„gl‹„$…À…îÿÿécûÿÿv‹C(‹0‹]\º‹D$Dèÿÿ„À„}jv†ƒ‹…Œ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹…$ ‰C0‹”$‹B(‹x…ÿ…(1ÿ‹@…À„}T1À‰ú„Ò„ÏR„À…¢e‹„$ø‰„$‹„$ü‰„$éZíÿÿ‹C(‹0‹‹D$Dè¶Íÿÿ„À„Þi‹]‹K…É~$‹EP1ÒvÇÿÿÿÿÇ@ÿÿÿÿÇ@ÿÿÿÿBƒÀ9Êuä‹K$…É~)‹E\1ÒÇ@Ç@ ÿÿÿÿÇ@Ç@ ÿÿÿÿBƒÀ49ÊuÜ‹\$T‹CX‹ð‹‰„$º‹D$DèçŽÿÿ„À…»ìÿÿ»ðÿÿÿéìÿÿ‹„$9D$XŒ›YöA- „åùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè‘ÿÿ„À„k‹„$…À…Xìÿÿé£ùÿÿv‹„$9D$XŒ³VöA- „…ùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè³ÿÿ„À„³i‹„$…À…øëÿÿéCùÿÿv‹´$Œ9´$„%\öC- „"ùÿÿŒ$„$‰$‹T$d‹D$D蜑ÿÿ„À„&i‹„$…À…ëÿÿéèøÿÿ‹„$;„$Œ„Q;El„ QöC- „ÁøÿÿŒ$„$‰$‹T$d‹D$Dè;‘ÿÿ„À„wi‹„$…À…<ëÿÿ釸ÿÿv‹„$9D$XŒ0VöA- „iøÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè—ÿÿ„À„j‹œ$…Û…Üêÿÿé'øÿÿvº‹D$DèêŒÿÿ„À„ug‹…Œ Š•: ˆP‹…Œ ‹•$ ‰‹D$Dèà”ÿÿ„À„=g‹„ ‹» ‰|$4‹µ” ‰t$<Š…8 ˆD$L‹½ä ‹„$‰EhÆ…8 ‹„$‹PÇ$1É‹D$DèAæÿÿ‰Æ…Àˆzg‹„$‹P(‰èèvÿÿ‰½ä ŠT$Lˆ•8 ‹|$<‰½” ‹|$4‰» ‰„ N…=÷ÿÿ‹„$‹‰„$‹Eh‰„$éÎéÿÿ‹C(‹D@ý‹UP‹H…ɈîY‹‰„$é¦éÿÿ‹D$Dèå“ÿÿ„À„ôe‹µ$ ‰t$8‹„ ‹» ‰|$4‹µ” Š…8 ˆD$<‹½ä ‰|$LÇEH‹„$Œ‰EL‹„$‰EhÆ…8 Š•: ˆT$H‹„$‹PÇ$1É‹D$Dè!åÿÿ‰Ç…Àˆge‹„$‹P(ƒÂ‰èèSÿÿ‹L$p‰ML‹D$X‰EH‹T$L‰•ä ŠL$<ˆ8 ‰µ” ‹D$4‰ƒ ‰„ ‹„$€x/„×MO„æc‹E‹X…Û„íõÿÿ‹‰…” éàõÿÿ‹„$9D$p’OöA- „ÅõÿÿŒ$ÇD$„$‰$‹T$d‹D$DèóŒÿÿ„À„g‹”$…Ò…8èÿÿéƒõÿÿv‹C(‹D@ý‹UP‹x…ÿˆfõÿÿ‹p<þ‹\$h‹[8‰\$4‹„$ …ÀˆN‹„$‰D$‹t$|‰4$ÿT$t”$܉T$‰$ÿT$4‰Ã‹„$ ‰D$‰4$ÿT$t”$ì‰T$‰$ÿT$4‰Æ‹”$ ‹„$9WŽ 9Ë„$9D$pè@1ÛÇ„$;´$ŽD7‹„$9Ã~‹”$‹Œ”ì9Œ„Ü„Ð@‹„$ö@- „ÓZŒ$ÇD$”$‰T$‰t$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$D貉ÿÿ„À„nZ€¼$„¤Z‹„$9à …Û~ÿ„$‹”$ ;´$þþÿÿB‰”$ 9WöþÿÿÇ„$ ÿÿÿÿ9ØŒÂóÿÿ9´$Œµóÿÿ‹„$‹‰„$éPæÿÿ‹C(‹D@ý‹]PËp…öˆ†óÿÿ‹P4ò‹\$h‹[8‰\$4‹Œ$ …ɈoL‹„$H‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰Ã‹„$ H‰D$‹|$|‰<$ÿT$t”$܉T$‰$ÿT$4‰Ç‹”$ ‹„$f;Ž£W…ÀŽÀ5‹„$…ÀŽíÿÿŒ$„$‰$‹T$d‹D$D踅ÿÿ„À„œ]‹„$…À…¹ßÿÿéíÿÿ‹„$‰D$‰,$‹\$hÿS ‹”$:B/„çNöB- „ÕìÿÿŒ$„$‰$‹T$d‹D$DèO…ÿÿ„À„C_‹„$…À…Pßÿÿé›ìÿÿv1Ò‹D$Dè©¿ÿÿ„À„2\º ‹D$DèKÿÿ„À„\‹„$‹‰„$é ßÿÿ‹„$9D$p°KöA- „?ìÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèmƒÿÿ„À„g]‹”$…Ò…²Þÿÿéýëÿÿ‹„$9D$pGöA- „áëÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèƒÿÿ„À„×\‹„$…À…TÞÿÿéŸëÿÿv‹„$9D$XŒ2FöA- „ëÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$D诂ÿÿ„À„¿]‹„$…À…ôÝÿÿé?ëÿÿv‹C(‹‰T$8‹@‰D$4‹uPºV‹D$Dèïÿÿ„À„¢Z‹T$8|Rýþ‹…Œ ‹L$8‰H‹L$4‰H ‹J‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9Btÿ…$ ‰B‹A(‹X…Û…UF‹‰„$éFÝÿÿ‹C(‹0v†‹M\™‹K,ÇD$Ç$‰ò‹D$Dè žÿÿ„À„+Z‹C(@‰C(‹½$ ‹”$9{0„iK‹J(‹y9ø‚»G„´1ÿ‹A9C(‚ Y‹Œ$ƒÂ„$ø‰$‰èèAÿÿ„À•Á‰ú„Ò…4>„É…,>ÿK(éæéÿÿ‹¼$…ÿ…v@‹‰„$éyÜÿÿ‹„$‰D$‰,$‹\$hÿS‹”$:B/„?LöB- „šéÿÿŒ$„$‰$‹T$d‹D$Dè‚ÿÿ„À„¼Y‹œ$…Û…Üÿÿé`éÿÿ‹C,‹”$f…ÀˆqK‹s$‹|$p)×9þ~ öÄ „7éÿÿ‹„$ …ÀˆO‹[(ëfv‹„$ö@- „EPÇD$ ”$‰T$”$ ‰T$‰$Œ$‹T$d‹D$Dèz„ÿÿ„À„þO€¼$„àO‹„$ 9ÆŽN‹„$9D$p~ˆ‰D$‹D$|‰$ÿT$t‹”$ ;“…iÿÿÿB‰„$ ÿ„$빋s,‹¼$‰|$‰´$9D$H‡B‹S‹t$<‰V,‹S ‰V(‹•„ ‹Š I‰Š …Éu‹’ …Òt‰•„ 9D$H‚¢Ïÿÿ‹„$‹‰„$é=Âÿÿ‹3‰ò‹D$D蛢ÿÿ…ötN‰èè ðþÿ‹C‰…$ ‹E‹@$‰D$4ƒøt/‹½œ ~1Û1ö‹OÙ‹U\Ú1Àè;¡ÿÿFƒÃ4;t$4u勉…œ ‹…„ ‹ J‰ …Ò…Ïÿÿ‹€ …À„Ïÿÿ‰…„ éùÎÿÿ‹‰„$‹S R ŠÁá‹u\ñ‰L$4‹y,‰¼$‹q(‰t$<‹p ‰t$8‹t$<¯t$8þ‹@(‹@‰D$LÇD$Ç$‰ñ‹D$DèK‚ÿÿ„À„ 9‹”$‹B(‹L$<9H„d‹L$L¯L$8ù‰L$<‹zŠO/ˆL$H‹‰D$LöG- „O‹|$8÷߉|$H‰÷+|$8´$ø‰l$\‰\$P‰óë9|$<„¢‹”$|$H‰þ‰$‰ù‹D$\è%ÿÿ„Àt×Ç$‰ù‹T$L‹l$D‹Eè ?ÿÿ„Àuº‹l$\‹\$P‰ò+”$ˆl6‹¼$‰|$8‹G(;P‡Í<‹K‹|$4‰O,‹[ ‰_(‹„ ‹» O‰» …ÿu‹› …Ût ‰„ ‹\$8‹C(;P‚mÍÿÿ‹L$8‹‰„$‰´$éÀÿÿ‹MP‹CH@Ñ€{t‹s tvý ñ‹q…ötN‰q@Áà‹t$TFL€x‹t 9Btÿ$ ‹‰B‹C‰B‹…„ ‹ J‰ …Ò…æÌÿÿ‹€ …À„ØÌÿÿ‰…„ éÍÌÿÿ‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹N‰L$4‹öA-@„ ‹CH‰D$<ÇD$Lÿÿÿÿº‰Ø‰L$,è}îþÿ„À‹L$,„Y ‹D$<9D$4„K ÿF‹“À B‰“À ‹ƒÈ @‰D$<‰ƒÈ ‹GƒÌ ÿƒÔ ‹GƒØ ŠFˆƒ: ‹F ‹@(‹x 9»Ä r;Pr‹P9“¼ r ‹|$<;xs vƃ: ‹D$L¯FD$4‰„$‰Œ$€½: „! Æ…: éÂËÿÿf‹K‹SÇD$Ç$‹D$DèZÿÿ„À„ 6‹…„ ‹ J‰ …Ò…Ëÿÿ‹€ …À„qËÿÿ‰…„ éfËÿÿf‹K4I ±‹u\ Ž‹s ‰q(‹s‰q,‹[‰Y0‰‚ …À…5Ëÿÿ‹‚ …À„'Ëÿÿ‰…„ éËÿÿ‰èè…ÿÿ‹…„ ‹ J‰ …Ò…úÊÿÿ‹€ …À„ìÊÿÿ‰…„ éáÊÿÿ‹ ‰Œ$‹K‰Œ$‰‚ …À…o½ÿÿ‹‚ …À„a½ÿÿ‰…„ éV½ÿÿf‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹F‰„$´‹‰”$°¾F‰„$ÔöB-@„¿ Ç„$Àÿÿÿÿ‹SH‰”$¸…Àx'ÿŒƒ¼ ÿ‹È T‡‹ )‹Ì ÿ‹Ô ‹)“Ø €¼$Š„Ñ‹S`9”$´•ˆ”$Øë v”$°‰Øè<ÿÿ„À‹„$Ô…ÿ @‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$éŸÉÿÿv‰èèAêþÿŠCˆ…: ‹‰…$ ‹…„ ‹ J‰ …Ò…iÉÿÿ‹€ …À„[Éÿÿ‰…„ éPÉÿÿ‹D$D‹‹ƒ¸ ‹x(‹³Œ ‹V‰T$4‰”$´‹‰„$°¾F‰„$Ô¾V ‰”$ÀÿŒƒ¼ ÿ‹È T‡‹ )‹Ì ÿ‹Ô ‹)“Ø €¼$Š„)‹T$4;S`•ˆ”$Øëf”$°‰Øèf:ÿÿ„À‹„$Ô…o @‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$écÈÿÿv€¼$Š„Ì2‹Md‰Œ$€½5 „Ë‹D$X9È„˜2‹T$@ŠB.‰|$8‹F‰„$¼¾F‰D$P‰„$ľF‰„$ȾF‰„$Ô¾N‰Œ$ÀÿŒƒ¼ ÿ‹È ‹T$4|‚‹)“Ì ÿ‹Ô ‹?)»Ø €¼$Š„S‹|$L;{`•D$HŠT$HˆT$<ŠT$Hˆ”$Ø…ÉŽ ‹T$P…Ò• T$<ˆ”$Øëf”$°‰Øèª6ÿÿ„À‹„$Ô…S@‰„$Ôƒø~Ö‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$ ÿÿÿÿésÃÿÿ¾V9T$4•ÂéOýÿÿv‹D$Dè·ýþÿÿ¬‚¤f‰Ã‹D$Dè†ýþÿ„Û„UÃÿÿ»öÿÿÿé²µÿÿ‹„$ö@- „ü+Œ$ÇD$ÿÿÿÿ”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$Dèß\ÿÿ„À„¦+€¼$„²+‹„$…ÀŽÅ‹”$ é*Óÿÿf‹„$ö@- „6-Œ$ÇD$”$‰T$‰t$ ”$‰T$”$ ‰T$‰$‹T$d‹D$DèW\ÿÿ„À„-€¼$„þ,‹„$9Æÿ„$‹”$ é_Úÿÿv‹F)ƒÀ )ƒÈ ‹W¯Ð)“Ì )ƒÔ ¯G)ƒØ ŠFˆƒ: ‹ƒ„ ‹ J‰ …Òu‹€ …Àt‰ƒ„ Ç„$€½: …ßõÿÿ‹„$…À„žÁÿÿ‹‰„$é@´ÿÿ‹\$8‹C‹t$<‰F,‹C ‰F(‹…„ ‹ J‰ …Ò…aÁÿÿ‹€ …À„SÁÿÿ‰…„ éHÁÿÿ²é5÷ÿÿ‹T$8ŠB.ƒè œÿÿ1ÒéòÓÿÿ»ðÿÿÿé-œÿÿö@- „¥©ÿÿŒ$„$‰$‹T$d‹D$DèBÿÿ„À„ù‹„$…À… œÿÿék©ÿÿv1Òé¢ÐÿÿöC- „W©ÿÿŒ$„$‰$‹T$d‹D$DèÑAÿÿ„À„=‹´$…ö…Ò›ÿÿé©ÿÿö@- „©ÿÿŒ$„$‰$‹T$d‹D$DèŒAÿÿ„À„‹„$…À…›ÿÿ騍ÿÿöC- „ΨÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèü?ÿÿ„À„Ћ„$…À…A›ÿÿ錨ÿÿöC- „‚¨ÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè°?ÿÿ„À„n‹„$…À…õšÿÿé@¨ÿÿ‹„$‹‰„$éÛšÿÿO„ï‹U‹J…Ét‹‰•” ‹‰„$é´šÿÿ„À„ü§ÿÿ‹„$‰„$‹„$‰„$鋚ÿÿ1Ò騷ÿÿ1Òé•¿ÿÿ‹‰„$éošÿÿ‹‰„$éašÿÿ„À„©§ÿÿ‹„$ø‰„$‹„$ü‰„$é8šÿÿ‹l$H‹\$<é¡Ùÿÿ‹\$Léo×ÿÿ9D$p…h§ÿÿéµÅÿÿv‹¬$„1öéíÒÿÿ‹¼$˜ÇD$<éÐÿÿ‹‰”$ Ç„$Ç„$1À1ö1Ûé,²ÿÿ‰Ú‰œ$ Ç„$1À1öéh·ÿÿ‹V‰”$ Ç„$Ç„$1À1ÿ1Ûé̳ÿÿÇ„$ Ç„$1À1Ò1öéá¾ÿÿ‹„$ø‰„$‹„$ü‰„$é:™ÿÿ‹„$‰„$‹„$‰„$é™ÿÿ1Ûéà˜ÿÿƒÂ„$‰$‹Œ$‰èèSýþÿ„À•Àé`«ÿÿ‰D$‹\$|‰$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…5°ÿÿ‹A „$‹‰„$霘ÿÿH‰D$‹t$|‰4$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…}Ãÿÿ‹A „$‹‰„$éJ˜ÿÿ‹•¤ ‹Z ‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À… ÿ„$‹„$‹‰„$é ˜ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~B1Év‹4Š9ów19÷r-°‹Œ$8A/…l¹ÿÿ‹A „$‹‰„$é—ÿÿvA9ÁuÃ1Àë̉D$‹t$|‰4$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~A1Éf‹4Š9ów19÷r-°‹Œ$8A/…ˆ¸ÿÿ‹A „$‹‰„$é —ÿÿvA9ÁuÃ1ÀëÌ‹B‰B‹L$4‹T$8‹D$Dè0Wÿÿ„À„n‹Œ$逹ÿÿH‰D$‹\$|‰$ÿT$tƒø „ú‹„$ö@- „ú£ÿÿŒ$„$‰$‹T$d‹D$Dèt<ÿÿ„À„‹„$…À…u–ÿÿéÀ£ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‰Á‹‹D$hè:Þþÿ‹Œ$:A/…O¤ÿÿ‹A „$‹‰„$é"–ÿÿ‹S(‹‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$èžîþÿ‹Œ$:A/…ó¼ÿÿ‹A „$‹‰„$éÒ•ÿÿH‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…ê¢ÿÿ‹A „$‹‰„$錕ÿÿH‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè‚ôþÿ‹Œ$:A/…©ÿÿ‹A „$‹‰„$éB•ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‰Á‹‹D$hè Ýþÿ‹Œ$:A/…€£ÿÿ‹A „$‹‰„$éó”ÿÿ‹•¤ ‹Z H‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…¬ ÿŒ$‹„$‹‰„$é±”ÿÿ‹S(‹H‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è,íþÿ‹Œ$:A/…á»ÿÿ‹A „$‹‰„$é`”ÿÿƒÂ„$ø‰$‹Œ$‰èè¡øþÿ„À•Àé ±ÿÿ‹B‰B‹L$4‹T$8‹D$DèlTÿÿ„À„‹Œ$é­Äÿÿ‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hè÷ïþÿ‹Œ$:A/…¼Çÿÿ‹A „$‹‰„$éÇ“ÿÿH‰D$‹t$|‰4$ÿT$tƒø „½ÿŒ$‹„$‹‰„$é’“ÿÿ‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hè‰òþÿ‹Œ$:A/…ÞÆÿÿ‹A „$‹‰„$éI“ÿÿ‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…#´ÿÿ‹A „$‹‰„$é“ÿÿH‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèêîþÿ‹Œ$:A/…3¦ÿÿ‹A „$‹‰„$麒ÿÿ‰D$‹\$|‰$ÿT$tƒø „¥ ÿ„$‹„$‹‰„$醒ÿÿ‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚:9Ø–À:A/…,Éÿÿ‹A „$‹‰„$é<’ÿÿº ‹D$DèR4ÿÿ„À„‹…Œ ‹”$‹R‰‹…Œ ‹”$‰P‹„$ø‰„$‹„$ü‰„$éã‘ÿÿH‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚©9Ø–À:A/…ÐÄÿÿ‹A „$‹‰„$阑ÿÿ‹‰„$銑ÿÿ‹K,;Œ$…‡´ÿÿ1ÿ骴ÿÿ‹œ$öC- „Z‰l$4‰Ú…ÀŽÔ œ$¼$ ¬$ë‹”$ÇD$ÿÿÿÿŒ$‰L$‰t$ ‰l$‰|$‰$‰Ù‹T$d‹D$DèT8ÿÿ„À„r €¼$„ ‹„$…À§ÿŒ$‹”$étÿÿÿ‹‰„$éÂÿÿ‹Œ$9K,…€ÂÿÿÆD$4é¦Âÿÿ‹‰„$éšÿÿ‹‰„$éŒÿÿ9•( …ƒ´ÿÿ‹Œ$ …ɉt´ÿÿ‹…, ‰„$Ç„$ ÿÿÿÿ‹‰„$éKÿÿ9½( …0µÿÿ‹„$ …À‰!µÿÿ‹…, ‰„$‹‰„$éÿÿ‹‰„$éÿÿ9( …¯ÿÿ‹”$ …Ò‰¯ÿÿ‹…, ‰„$Ç„$ ÿÿÿÿ‹‰„$éÆÿÿ‹C‰„$é·ÿÿ‹‰„$é©ÿÿ‹‰„$é›ÿÿ‹‰„$éÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè 4ÿÿ„À„© ‹„$…À…Pÿÿ雜ÿÿ‹‰„$é=ÿÿ;sLŽÿÿ1ÛéûŽÿÿ9( …a­ÿÿ‹´$ …ö‰R­ÿÿ‹…, ‰„$éé­ÿÿv9½( …¬ÿÿ‹„$ …À‰ ¬ÿÿ‹…, ‰„$‹‰„$éÆŽÿÿ€½8 … œÿÿé,ºÿÿ9•( …f¿ÿÿ‹¼$ …ÿ‰W¿ÿÿ‹…, ‰„$éð¿ÿÿv;sLŽ_Œÿÿ1ÛéBŽÿÿº龫ÿÿºééÅÿÿºéçÂÿÿºéd³ÿÿÇ$‹Œ$‰ò‹|$D‹è¥ ÿÿ„À„ñ‹„$‹P(ÆD$4éÀÿÿ‹\$HéèÞÿÿ‰ÆéyâÿÿÇ„$ ÿÿÿÿ…ÀB›ÿÿ‹Œ$…É3›ÿÿ‹„$‹‰„$éÎÿÿf‹\$8éŸÞÿÿ‰è‹¬$ ‹œ$”‰Ch‰<$ÿƒ¤f‹D$Dè.Õþÿ‹Eh‰„$‹„$‹‰„$éÿÿ‰ÆéØãÿÿ‰Æé…âÿÿ‰Æé>áÿÿ‰Æé#ãÿÿ‰ÆéŒàÿÿ‹¬$¬‹œ$œ‰{h‰4$ÿƒ¤f‹D$DèÉÔþÿ‹Eh‰„$‹„$‹‰„$éÿÿ‹l$8‹|$<‹\$L‰»œ éíÿÿ‹„$9D$pŽBšÿÿ@‰„$Ç„$‹Œ$‹”$ 1À1öéN²ÿÿ‹œ$éXüÿÿÇ„$ 1ÀéÒ°ÿÿ‹œ$é¿üÿÿ‰”$ ‰ÐéÉ«ÿÿ‰”$ ‰ÐéæªÿÿÇ„$ 1ÀéS½ÿÿÇ„$ ÿÿÿÿé°™ÿÿ»ðÿÿÿé$ŒÿÿÇ„$ ÿÿÿÿé–™ÿÿÇ„$ ÿÿÿÿ醙ÿÿÇ„$ ÿÿÿÿév™ÿÿ»ðÿÿÿéê‹ÿÿÇ„$ ÿÿÿÿé\™ÿÿÇ„$ ÿÿÿÿéL™ÿÿ»ðÿÿÿéÀ‹ÿÿÇ„$ ÿÿÿÿé2™ÿÿÇ„$ ÿÿÿÿé"™ÿÿ»ðÿÿÿé–‹ÿÿ‹Œ$ÇD$Ç$‰ò‹D$Dè¯Lÿÿ„À…ï˜ÿÿ»÷ÿÿÿéc‹ÿÿÇ„$ ÿÿÿÿéÔ˜ÿÿ»ðÿÿÿéH‹ÿÿÇ„$ ÿÿÿÿ麘ÿÿÇ„$ ÿÿÿÿ骘ÿÿ»ðÿÿÿé‹ÿÿÇD$<¼ fé2ÃÿÿÇD$< fé%Ãÿÿ‹‰„$ éÅÿÿ1ÀéÄøÿÿ‹Œ$éòŸÿÿ1ÀéUùÿÿÇ„$¨Ì fÇD$L¼ féû¿ÿÿÇ„$¨¤ fÇD$L féã¿ÿÿºS‹D$Dèô,ÿÿ„À„¦‹…Œ ‰p‹”$‰P‹…$ ‰C0‰S,‹„$‰„$‹„$‰„$鈊ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éhŠÿÿ‹F‰„$ é¹ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$é9ŠÿÿÇ„$ ÿÿÿÿéy—ÿÿ‹‰„$ éÝ·ÿÿ‹Œ$éȹÿÿ÷ÚéÉÿÿÇ„$ ÿÿÿÿ…ÀE—ÿÿéûÿÿ‹F‰„$ éé±ÿÿ»ðÿÿÿ饉ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé—ÿÿÇ„$ ÿÿÿÿé÷–ÿÿ»ðÿÿÿék‰ÿÿÇ„$ ÿÿÿÿéÝ–ÿÿÇ„$ ÿÿÿÿéÍ–ÿÿÇ„$ ÿÿÿÿé½–ÿÿ»ðÿÿÿé1‰ÿÿ‹D$DèêÐþÿ»þÿÿÿé‰ÿÿ»ðÿÿÿé‰ÿÿÇ„$ ÿÿÿÿ醖ÿÿ‹D$8‰$‰Ú‰èèFmÿÿ‰Ã‹„$‹P(‹Œ$éĵÿÿÇ„$ ÿÿÿÿéN–ÿÿÇ„$ ÿÿÿÿé>–ÿÿ»ðÿÿÿ鲈ÿÿÇ„$ ÿÿÿÿ9ðŒ!–ÿÿ驸ÿÿ»÷ÿÿÿéˆÿÿ‰$‰ú‰èèÖlÿÿ‰Ç‹œ$‹C(9x†Ø¤ÿÿÇD$Ç$‹Œ$‰ò‹D$DèˆIÿÿ„À…È•ÿÿ»÷ÿÿÿé<ˆÿÿf‹l$H‹D$DèïÏþÿ骕ÿÿ‹D$DèáÏþÿ»þÿÿÿéˆÿÿ1Ûéˆÿÿ»÷ÿÿÿéˆÿÿ1Ûéý‡ÿÿ»÷ÿÿÿéó‡ÿÿÇ„$ ÿÿÿÿée•ÿÿÇ„$ ÿÿÿÿéU•ÿÿ‹l$H‹D$DèˆÏþÿéC•ÿÿÇ„$ ÿÿÿÿé3•ÿÿ»ðÿÿÿ駇ÿÿº\‹D$Dèï)ÿÿ„À„ù‹…Œ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰Pé šÿÿº[‹D$Dèœ)ÿÿ„À„Ò‹…Œ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$é‡ÿÿ‹]\ºZ‹D$Dè*)ÿÿ„À„^v†ƒ‹•Œ ‹œ$‰‰r‹H,‰J‹H(‰J ‹”$‰P,‰x(é £ÿÿ‹„$9D$X”ÿÿH‰„$Ç„$‹Œ$‹”$ 1À1öéK¤ÿÿ1ÛéQ†ÿÿ‹\$L‹›˜ ‰\$<…Û….¹ÿÿº ‹D$Dè_(ÿÿ‰D$<…À„†¹ ‰Ç1Àóª‹\$4[ƒÁã‰Ú‹D$Dè0(ÿÿ‹|$<‰G…À„ۉljÙ1Àóª‹|$<‰7ÇG…ö„‰~齸ÿÿ„$ø‰$‹Œ$‹”$‰èè9êþÿ‹”$„À‹B(„/˜ÿÿ¿é'˜ÿÿ‹Œ$éÔ±ÿÿ1Ûé|…ÿÿ„$‰$‹Œ$‹”$‰èèëéþÿ‹”$‹J(„À„Ÿ¨ÿÿ¿é—¨ÿÿ„$‰$‹Œ$‹”$‰èè°éþÿ‹”$„À‹B(„¢ÿÿ¿é¢ÿÿ„$ø‰$‹Œ$‹”$‰èèuéþÿ„À‹„$‹P(„ñ¶ÿÿÆD$4éì¶ÿÿ‹Œ$é²°ÿÿ‹Œ$é@´ÿÿ‰èèÚ²þÿŠ\$Hˆ: ‹t$8‰µ$ é’ÿÿº!‹D$DèÛ&ÿÿ„À„%‹…Œ Š\$HˆX‹…Œ ‹t$8‰0‹„$éÈéÿÿ»ðÿÿÿéN„ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé–õÿÿ‹¬$¬‰Ç‰4$ÿƒ¤f‹D$DèßËþÿ…ÿ‰÷ÿÿ‰ûé„ÿÿ‰sd‹„$ø‹´$ü鉂ÿÿ1Ûéñƒÿÿ»ðÿÿÿéçƒÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿéàóÿÿ‹l$4Ç„$ ÿÿÿÿé?‘ÿÿ÷ØéDÁÿÿ‹l$4Ç„$ ÿÿÿÿé$‘ÿÿ1Û雃ÿÿ»÷ÿÿÿ鑃ÿÿ1Éé §ÿÿ»÷ÿÿÿ逃ÿÿ»ðÿÿÿévƒÿÿ‰Ãéoƒÿÿ»÷ÿÿÿéeƒÿÿ‰ù‹|$4‰W(épÃÿÿ»ðÿÿÿéMƒÿÿ»÷ÿÿÿéCƒÿÿ»ðÿÿÿé9ƒÿÿ‰Ãé2ƒÿÿ»÷ÿÿÿé(ƒÿÿ‰Ãé!ƒÿÿ»÷ÿÿÿéƒÿÿ»ðÿÿÿé ƒÿÿ1ÀÇD$8éÝßÿÿ1ÀÇD$8éæÞÿÿ»ðÿÿÿéå‚ÿÿ»ðÿÿÿéÛ‚ÿÿ»ðÿÿÿéÑ‚ÿÿ»÷ÿÿÿéÇ‚ÿÿ»ðÿÿÿ齂ÿÿ»ðÿÿÿ鳂ÿÿ»÷ÿÿÿé©‚ÿÿ1Û颂ÿÿ1Û雂ÿÿ1Û锂ÿÿ1Ûé‚ÿÿ»ðÿÿÿ郂ÿÿ‰Ãé|‚ÿÿ»ðÿÿÿér‚ÿÿ»ðÿÿÿéh‚ÿÿ»ðÿÿÿé^‚ÿÿ»ðÿÿÿéT‚ÿÿ»ðÿÿÿéJ‚ÿÿ»ðÿÿÿé@‚ÿÿ»÷ÿÿÿé6‚ÿÿ»ðÿÿÿé,‚ÿÿ»ðÿÿÿé"‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿéúÿÿ»ðÿÿÿéðÿÿ»ðÿÿÿéæÿÿ»ðÿÿÿéÜÿÿ»ðÿÿÿéÒÿÿ»÷ÿÿÿéÈÿÿ‰<$ÿƒ¤f‹D$DèxÉþÿ»þÿÿÿé¬ÿÿ»ðÿÿÿé¢ÿÿ»ðÿÿÿé˜ÿÿ»ðÿÿÿéŽÿÿ»ðÿÿÿé„ÿÿ»ðÿÿÿézÿÿ‹Œ$騯ÿÿ»ðÿÿÿédÿÿ»ðÿÿÿéZÿÿ»ðÿÿÿéPÿÿ»ðÿÿÿéFÿÿ»ðÿÿÿé<ÿÿ»ðÿÿÿé2ÿÿ»ðÿÿÿé(ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéÿÿ‰ú‹D$Dè Éþÿ»÷ÿÿÿéÿ€ÿÿ»ðÿÿÿéõ€ÿÿ»ðÿÿÿéë€ÿÿ»ðÿÿÿéá€ÿÿ‹l$H‰Æ‹D$Dè”Èþÿ…ö‰¡àÿÿ‰óéÀÿÿ‹|$<‹\$L‰»˜ 飳ÿÿ»ðÿÿÿ馀ÿÿ‰4$ÿƒ¤f‹D$DèVÈþÿ»þÿÿÿ銀ÿÿ»ðÿÿÿ退ÿÿ»ðÿÿÿév€ÿÿ»ðÿÿÿél€ÿÿ»ðÿÿÿéb€ÿÿ»ðÿÿÿéX€ÿÿ»ðÿÿÿéN€ÿÿ»ðÿÿÿéD€ÿÿ»ðÿÿÿé:€ÿÿ»ðÿÿÿé0€ÿÿ»ðÿÿÿé&€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ»ðÿÿÿé€ÿÿ‹l$H‰Æ‹D$Dè»Çþÿ…ö‰÷ßÿÿ‰óéêÿÿ»ðÿÿÿéàÿÿ‹\$<‰C(é´½ÿÿfUWVSƒì\‰D$$‰Ö‹(‰l$‹m‰l$4èuÇþÿ‹l$€½5 t)‹]h‹mH‰l$@9댆‰Ý+l$@‰l$H‹l$‹mL‰l$Dë+‹l$‹]h‹mL‰l$D9ëY‹l$D)݉l$H‹l$‹mH‰l$@‹l$4‹E öÄ•D$:öÄ€„ŠD$:ƒðˆD$9‹l$4€½„À÷Ћl$‰…Ü Š…8 ˆD$;1íÇD$(‹T$ƒÂt‰T$<‹L$Á¼ ‰L$0‰ð¶ð‰t$Lf‹T$‰ZhŠL$;ˆŠ8 ‹|$<‰º„ Ç‚€ ‹‚ ‰‚” Ç‚Œ ‰Z`‰Zd‰Ð‹‹J$…É~,‹@\ƒÀ1ÉÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ4;J$|Ü‹zx…ÿ~5‹|$‹‡Ð ƒÀ1ÉfÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ(;Jx|Ü‹r…ö~,‹L$‹AP1ÉÇÿÿÿÿÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ9ñuÝ‹rT…ö~(‹|$‹‡è ƒÀ1ÉvÇÇ@ÿÿÿÿAƒÀ;JT|깋|$01Àóª‹T$Ç‚Ì Ç‚Ô Ç‚Ø Æ‚: Ç‚$ fÇ‚0 ‹ŠÜ …É…ƒ‹L$H;Š  r …Éus€º8 tjÇD$,‹T$@‹D$‰PH‹L$D‰HL‹D$(…À…šƒ|$,„‹D$$èÅþÿ‹t$,…öyéõv‹D$$èçÄþÿÇD$,‹D$,ƒÄ\[^_]Ãv‹|$‹‹PÇ$‹L$L‹D$$è yÿÿ‰D$,ƒøŒtÿÿÿ„nÿÿÿH„¹€|$:u€|$9„Uÿÿÿ‹D$‹Pd9Ph„Eÿÿÿ‹D$(…À„‹L$‹qd9Þ„‹D$$èSÄþÿ‹D$$‹‰D$‹‰T$ ‹T$ ‹B…À~|‹l$(ÇD$ÇD$ë.f‹E‰U‹KÁá‹s‰Çó¤ÿD$ƒD$ƒÅ‹D$‹|$ ;G}8‹\$‹L$YP‹‹S‰E‰U‹S;U v¶Áâ‹Eè6ÿÿ…Àtc‹S‰U ‰E럋D$$è“Ãþÿ‹l$‹]d‰è‹mh‹€Ü …À„‹L$‹Ø H‰Ü €|$9„½üÿÿ€¹5 „‰iH‰YLé¥üÿÿ‹T$ ‹B…ÀŽf‹|$(1ö‹ƒ¤f‹l$ ‹G‰$ÿÓFƒÇ;u|ï‹L$(‰ $ÿÓ‹D$$èÃþÿ‹D$@‹l$‰EH‹T$D‰UL‹D$$èÃþÿÇD$,÷ÿÿÿÿ¼‚¤f…À…þÿÿ1Ò‹D$,è-½þÿéþÿÿ‹—Ø …Ò…9þÿÿé›ýÿÿ;ih…gþÿÿ‹|$4‹_ …Û~*‹QP‹D$(1É‹89:…Iþÿÿ‹x9z…=þÿÿAƒÂƒÀ9Ùuß‹|$@‹L$‰yH‹D$D‰ALƒ|$,u‹|$‹‡Ø …À„‹T$‰rd‰jh‹D$$èPÂþÿ‹D$$‹(‹U‹B…Àޝ1ÿ1ö‹ƒ¤f‰\$‰Ó‹EP‹D8‰$ÿT$F‹CƒÇ9Æ|ç‹\$‹UP @Áá‰×‹t$(ó¤‹T$(‰$ÿÓ‹D$$èÌÁþÿ‹l$ÇETÿÿÿÿÇEXÿÿÿÿ‹E‹HL‹x …ÿ~T‹EPº½ÿÿÿÿë2f‹X…Ûx/‹1‰Ó9õ}‹l$‰UT€y „¦‰UX‰õƒÀBƒÁ 9ß~‹0…öyʉӃÀBƒÁ 9ßí‹D$$èpÁþÿÇD$,‹D$,ƒÄ\[^_]Ë|$‰_H‰oLéúÿÿ‹D$$èDÁþÿ‹D$$‹‰D$‹‰T$ ‹B@Áàè¶ÿÿ‰D$(…À„ðýÿÿ‹L$ ‹A @Áá‹|$(1Àóªé½üÿÿÆD$9éåùÿÿ‰õéXÿÿÿ‹ƒ¤fé±ýÿÿ‹D$$èÛÀþÿ‹l$$‹E‹(‹}…ÿ~I‹|$(1ö‹ƒ¤fv‹G‰$ÿÓFƒÇ;u|ï‹D$(‰$ÿÓ‹D$$èyÀþÿé¨þÿÿ‰Þéÿýÿÿ‹ƒ¤fésþÿÿ‹ƒ¤fëωÞé÷ýÿÿvWVSƒì ‰Ã@ ‰D$ÇD$T$‰ØèWÿÿƒ»X „-Œ‹‹T …É…ù‹ƒH 9ƒP |k‹“L €»A „‰T$ÇD$‹C‰$ÿ<ƒ¤f‰Æ…ö„¢‹ƒT @‰ƒT ‹S ;B ~ ǃT ‹T$‰ØèÐeÿÿ‰ðƒÄ [^_Ãv€»A …Ï‹sX¿ë=ƒø…3€»C „¾‹Ct;Cp…²‹“L 9ò„Sÿÿÿø‰CtƃD ºD$èž÷ÿÿ‰ƒX …Ày¬‹T$‰ØèMeÿÿ1öévÿÿÿf‹S\‹C ÇD$‹s‰4$è‡cÿÿ‰Æé"ÿÿÿ‹T$‰Øèeÿÿ‹5ƒ¤fÿ‰ðƒÄ [^_ËCP‰D$‰T$‹C‰$ÿ<ƒ¤f‰Æéèþÿÿf‹sT¿ÿÿÿÿékÿÿÿvÿƒP €»A t]‹ƒL ‰D$‹Cp‰D$‹C‰$ÿ<ƒ¤f‰Æ…À„Jÿÿÿ‹Ct‰ƒL €»C t4;Cpt>ƃD ‹ƒX …À…|þÿÿéBþÿÿ1öëî‹Cp‰D$‹ƒL ë¡ÆƒD ‹ƒX ëÏø‰Ct뻋T$‰Øè;dÿÿ‹ƒX 1Òèf¸þÿ1öéWþÿÿvƒì‹D$ è˜ýÿÿ;ƒ¤ftƒÄËJ‰…Òt ¡”ƒ¤fÿƒÄËP‰$ÿRëêƒì‹D$ è`ýÿÿ;ƒ¤ftƒÄËJ‰…Òt1ÀƒÄËP‰$ÿR1ÀëßvWVSƒì‰Ã‰×p ‰t$ÇD$ T$è6Tÿÿƒ»H „Œ—‰ø¶ÐD$è­õÿÿ‰Á‰ƒH …Àˆ•‹C‰òè§`ÿÿ‰Æ‰ø„Àu#‹Cp9Ct”ƒD ‹T$‰Øè7cÿÿ‰ðƒÄ[^_Ãf€»@ tÔ€»A ÀƒàHCp‰CtƃD ëÅv‹T$‰Øèùbÿÿ‹5”ƒ¤fÿ‰ðƒÄ[^_ËT$‰ØèÝbÿÿ‹ƒH 1Òè·þÿ1öë•‹T$‰ØèÁbÿÿ1ö놺‹D$éúþÿÿfƒìº‹D$ èçþÿÿ;”ƒ¤ftƒÄÃv‹J‰…Òt1ÀƒÄËP‰$ÿR1ÀëÜv1Ò‹D$é­þÿÿUWVSì¬ ‹¼$À ¡”ƒ¤f‰„$ ‰„$” Ç„$˜ ‰„$œ „$œ ‰D$ „$˜ ‰D$„$” ‰D$„$ ‰D$„$Œ ‰D$ÇD$ 8Ë¡fÇD$TK¢f‹„$È ‰D$‹„$Ä ‰$ÿx‚¤f…À„à1Ò‹„$ èZlÿÿ‰Ãƒøÿ„·ºÿÿÿ‹„$” è>lÿÿ‰Æƒøÿ„Û‹„$œ èslÿÿ…Àˆ—ÇD$ÇD$ÇD$‰D$ 1À‹¬$˜ …í•À‰D$‰t$‰$‹Œ$Œ ‰úD$HèT&ÿÿ„À„HD$H‰„$„ Ç„$ˆ Ç$ÿ䂤f‰Å…À„ó€¼$} ÒƒâJ‰T$<‹„$°9„$Í9„$”ŒÀº„$„ èóòÿÿƒøŒI„ ‹G …À…Í€¼$} „»‹„$°‹”$¬‰T$‰D$‹„$Œ ‰$ÿ<ƒ¤f‰Æ…À„ú‰t$‰,$ÿà‚¤f‹J‰…Ò„Y…ÀˆØ€¼$| „ó‹D$<„$¬‰„$°Æ„$€ 9„$Ž3ÿÿÿD$HèßÀþÿ‰èĬ [^_]Ãfÿ¼‚¤f…À„;þÿÿf1í‰èĬ [^_]Ãø„§‰$ÿ\ƒ¤f‰Æ…ÀtS‹_ …ÛŽNÿÿÿ1Ûë‰Dž9_ Ž<ÿÿÿC‹”$˜ÇD$‹„$Œ ‰$‰Ù‹D$HèÒ]ÿÿ…ÀuÊ‹H‰…À„¥‹EH‰E…À„ºD$Hè-Àþÿ1í‰èĬ [^_]Ãf‹„$°;„$¬”„$€ é?þÿÿ‹”$˜ÇD$‹„$Œ ‰$¹‹D$HèU]ÿÿ‰Æ…À…þÿÿ눋V‰4$‰D$8ÿR‹D$8é‘þÿÿf‹„$¬‹”$°é@þÿÿ‹F‰4$ÿPéMÿÿÿfÿ¼‚¤f…À„ýÿÿé½þÿÿ‹E‰,$ÿPé8ÿÿÿfUWVSìŒ ‹¼$  Ç„$x ¡”ƒ¤f‰„$| „$| ‰D$„$x ‰D$„$t ‰D$ÇD$ `Ë¡fÇD$cK¢f‹„$¨ ‰D$‹„$¤ ‰$ÿx‚¤f…À„l‹„$x …À„ý‹„$| èéhÿÿ…ÀˆIÇD$ÇD$ÇD$‰D$ ÇD$ÇD$ÿÿÿÇ$‹Œ$t ‰úD$0èÌ"ÿÿ„À„üD$0‰„$l Ç„$p Ç$ÿ䂤f‰Æ…À„³€¼$e …q‹D$t‰D$(ÇD$,1ÛÇD$$‹-à‚¤f‹D$$;„$x &º„$l è_ïÿÿƒøŒî„€¼$g „.‹”$˜‹„$”9„¼$e „‰\$‰D$‹„$t ‰$ÿ<ƒ¤f‰Ã…Û„”‰\$‰4$ÿÕ‹J‰…Ò„F…Àxz‹G …ÀŽ»ë…ÀxdC9_ Œò‹”$€ÇD$‹„$t ‰$‰Ù‹D$0è¾Zÿÿ…Àt2‰D$‰4$‰D$ ÿÕ‹T$ ‹ I‰ …Éu°‹J‰$‰D$ ÿQ‹D$ …ÀyŸv‹H‰…À„ãD$0èö¼þÿ1ö‰ðÄŒ [^_]ÃvÇ„$x ÿÿÿéóýÿÿ‹\$tÇD$,ÿÿÿÿÇD$(éˆþÿÿv‹„$”€¼$e …áþÿÿ‰D$‰\$‹„$t ‰$ÿ<ƒ¤f‰ÃéÜþÿÿ1ö‰ðÄŒ [^_]ÃÿD$$‹œ$˜€¼$g t3;œ$”„àÆ„$h é þÿÿ‹S‰$‰D$ ÿR‹D$ é¤þÿÿfÆ„$h éúýÿÿv‹F‰4$ÿPéÿÿÿf;\$(tT$,‰”$˜Æ„$h éÉýÿÿ€¼$e uR‹D$t‰D$‰\$‹„$t ‰$ÿ<ƒ¤f‰Ã…Û„²þÿÿ‰\$‰4$ÿà‚¤f‹J‰…ÒtH…Àˆ”þÿÿD$0è—»þÿéžþÿÿ‰\$ÇD$‹„$t ‰$ÿ<ƒ¤f‰Ã묋D$,؉„$˜éÿÿÿ‹S‰$‰D$ ÿR‹D$ ë¥UWVSìœ ‰Ã¶¬$´ ¶¼$¸ ¡”ƒ¤f‰„$„ ‰„$ˆ ‰„$Œ …Òt…É„n„$Œ ‰D$„$ˆ ‰D$„$„ ‰D$„$€ ‰D$ÇD$ àË¡f‹„$° ‰D$‰L$‰$ÿx‚¤f…À„ô‹„$„ 1Òèpdÿÿ‰Æƒøÿ„ͺÿÿÿ‹„$ˆ èTdÿÿ‰D$,@„Ñ‹„$Œ è‰dÿÿ…Àˆ«çÿ‰|$ÇD$ÇD$‰D$ ÇD$‹D$,‰D$‰4$‹Œ$€ ‰ÚD$<ènÿÿ„Àtdt$<‰´$x Ç„$| ‰è¶Ð„$x è[ëÿÿ…ÀˆË‰ÁT$<‰ØèZVÿÿ‰ÃD$<èß¹þÿ‰ØÄœ [^_]Ãfÿ¼‚¤f…À„%ÿÿÿ1Û‰ØÄœ [^_]Ãvÿ¼‚¤f…À„!ÿÿÿ1ÛëÞf‹5hƒ¤f9r…ƒþÿÿ‹r‰t$(Nƒþ‡rþÿÿ‹J ‰Œ$€ ƒ|$(„¸þÿÿ‹B‰„$„ ƒ|$(„£þÿÿ‹J‰Œ$ˆ ƒ|$(…Žþÿÿ‹R‰”$Œ éþÿÿfD$<è#¹þÿ1Ûé=ÿÿÿ‹D$‹T$‹L$ ÇD$ ÇD$ÇD$nK¢fé§ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD${K¢fé{ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$‹K¢féOýÿÿvVSƒì$‰Ã…Àtaº—K¢f¸³K¢f莫þÿ‰Æ…ÀtL‰\$‰$ÿƒ¤f‹J‰…Òt"‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ãf‹V‰4$‰D$ÿR‹D$ëË1ÀëàUWVSìì ‰Å‰Ó‰L$,”$ˆ ‰Èèèðþÿ„À„x¶”$È ‹Eèˆðþÿ„À„¾‹Œ$À ‰L$(1Ò‹„$ è—aÿÿ‰Æƒøÿ„Œºÿÿÿ‹„$ è{aÿÿ‰Çƒøÿ„H…öˆX‰t$0‹L$(9Τ…ÿˆ¨‰þ;|$(„€½„u‰ð+D$09Eh˜‹„$ …Àu Ç„$ ÿÿÿ‰$ÿŒ‚¤f…À„Åÿ¸ÆD$9ÆD$:ÆD$8ÆD$;ÇD$‰D$ÇD$‹„$ ‰D$ÇD$ ‰t$‹L$0‰L$„$ˆ ‰$‹L$,‰êD$Lèjÿÿ„À„2T$L‰”$Ø Ç„$Ü Ç„$Ð Ç„$Ì Š„$ ˆ„$Ô ‹L$,‹QöBW•„$Õ „À…m1öÇD$<‹¼$ …ÿÇD$0Ž º„$Ø è£çÿÿƒøŒ|„ã‹„$°9ðtP€¼$ „'‰t$‰D$‹L$,‰ $ÿ<ƒ¤f‰Æ…ö„>‰ò„$Ì èŠ²þÿ‹J‰…Ò„E…Àˆ€|$8…v€|$9…K€|$:„x‹K‰L$(…ÉŽ1ÿë‹„$°‹”$´9ЄՀ¼$ „\‰D$‰T$‹L$,‰ $ÿ<ƒ¤f‰Æ…ö„£¡”ƒ¤f9Æ„¢‰ò„$Ì èâ±þÿ‹J‰…Ò„ý…ÀˆsG;|$(„–‹C ‹¸‹u ‹P;€ƒ¤f„Æ;ˆ‚¤f„ºèÑTÿÿƒøÿ„ƒø„GÿÿÿŽ9ÆŒD@ý‹”$œ‹H…É…X‹;P„5¡”ƒ¤fÿ‹J‰…Ò…tÿÿÿ‹P‰$ÿRG;|$(…kÿÿÿÿD$0‹´$´€¼$ƒ „o;´$°„ Æ„$„ ‹„$ 9D$0…ýýÿÿŠ„$ „À„²1Ò9Ö„N„À„#‰t$ÇD$‹L$,‰ $ÿ<ƒ¤f‰Æ…ö„O¼$Ì ‰ò‰øè™°þÿ‹J‰…Ò„Q…Àˆ*…Ût ‹H‰…À„*‰øèð±þÿ‰ÃD$Lèɳþÿ…Ût=ö„$ t5‹D$0‰D$‰\$Ç$¹K¢fÿ„ƒ¤f‰Ãëf„$ˆ 舦þÿ…Û…1Û‰ØÄì [^_]Ãö„$ …Òº\‰ØèjíþÿƒøŽÍÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;éüÿÿÿ¼‚¤f…À„fûÿÿ„$ˆ è¦þÿ1Û‰ØÄì [^_]Ãv‹´$ÇD$<ÿÿÿÿé‰üÿÿ‹t$(ésûÿÿv‰L$0…ÿ‰Xûÿÿ|$(‰Nûÿÿ1öéSûÿÿv‹L$,ÿö„$ …‹\$,„$ˆ è ¥þÿ‰ØÄì [^_]Ãvº{‰Øè˜ìþÿƒø.ÿÿÿ…ð1ÀÆD$91ÛÆD$:ÆD$8ÆD$;é>ûÿÿÿ¼‚¤f…À…(ÿÿÿé¥úÿÿÿ‰ÆéÖüÿÿv‹V‰4$‰D$$ÿR‹D$$éíüÿÿf‰T$‰D$‹L$,‰ $ÿ<ƒ¤f‰ÆéŸüÿÿ;´$°”„$„ é’ýÿÿ‰D$‰t$‹L$,‰ $ÿ<ƒ¤f‰ÆéÔûÿÿÿ¼‚¤f…À…¾1Ò¸ôÿÿÿè¥þÿ‹„$Ì …Àt ‹J‰…Ò„Š‹„$Ð …Àt ‹J‰…Ò„bD$L艱þÿ…Û„ùýÿÿ‹H‰…À…ìýÿÿ‹C‰$ÿP1Û‰ØÄì [^_]Éڄ$Ì èæ­þÿ…À‰²üÿÿë‚€|$;„¥üÿÿ¹T$L‰èè™Mÿÿ‰Æ…À„]ÿÿÿ‰D$Ç$ÿ`ƒ¤f…À„¯‰D$‰$‰D$$ÿƒ¤f‰Ç‹T$$‹H‰…À„­‹H‰…À„’…ÿ„ ÿÿÿ‰ú„$Ì èW­þÿ‹J‰…Ò„‹f…À‰üÿÿéáþÿÿv‹V‰4$‰D$$ÿR‹D$$é¥úÿÿf‰Ñ‰L$éýúÿÿ¹T$L‰èèÜLÿÿ‰D$(…À„žþÿÿ‹D$L‹@ @‰$ÿ\ƒ¤f‰Ç…À„u‹D$L‹p …öx81ö‹ ”ƒ¤f‰L$4f‹L$4‰ò‹D$(èNÿÿ‰D$‰t$‰<$ÿdƒ¤fF‹D$L9p }Ö‹D$(èmSÿÿ‰Æ…À„ ‰D$‰|$‰$ÿƒ¤f‰Á‹H‰…À„‹H‰…À„Þ‹T$(‹H‰…À„µ…É„çýÿÿ‰Ê„$Ì ‰L$$è/¬þÿ‹L$$‹J‰…Ò…Öþÿÿ‹Q‰ $‰D$$ÿR‹D$$éÀþÿÿ‹H‹éàþÿÿf‹D$<ð‰„$´Æ„$„ éäúÿÿft$(‰ž÷ÿÿÇD$0é¡÷ÿÿ‹P‰$ÿRéýÿÿf‹P‰$ÿRéhýÿÿf1Ò¸õÿÿÿè\¢þÿé=ýÿÿv‹B‰$‰L$$ÿP‹L$$é5ÿÿÿf‹G‰<$‰L$$ÿP‹L$$é ÿÿÿf‹F‰4$‰L$$ÿP‹L$$éçþÿÿfÇD$‰L$Ç$¹K¢fÿ„ƒ¤f‰Ãéàûÿÿ‹”$À éDúÿÿ„üÿÿ‰\$‰l$Ç$ÿ`ƒ¤fèÐõÿÿ‰Ã…À„ªûÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é!÷ÿÿ‹F‰4$ÿPé`ýÿÿ‹B‰$ÿPéEýÿÿ‹W‰<$‰D$$ÿR‹D$$éaýÿÿ‹„$À ‰D$‰t$‹L$,‰ $ÿ<ƒ¤f‰ÆéÕùÿÿ¼$Ì éöùÿÿ‹H‰…Àu ‹G‰<$ÿP‹T$(‹H‰…À…ýûÿÿ‹B‰$ÿPéïûÿÿ‹C‰$ÿPéÈùÿÿ‹V‰4$‰D$$ÿR‹D$$é™ùÿÿÇD$êD¢f‰$ÿ$ƒ¤f‰Ã…À„¾úÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é5öÿÿ‹H‰…À…ˆûÿÿ‹F‰4$ÿPézûÿÿƒì\ÇD$@¡”ƒ¤f‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ pË¡fÇD$¼K¢f‹D$h‰D$‹D$d‰$ÿx‚¤f…ÀtG‹D$LèÒVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`è^ôÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡”ƒ¤f‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ŒË¡fÇD$¼K¢f‹D$h‰D$‹D$d‰$ÿx‚¤f…ÀtG‹D$LèVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èšóÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡”ƒ¤f‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ¨Ë¡fÇD$ÉK¢f‹D$h‰D$‹D$d‰$ÿx‚¤f…ÀtG‹D$LèJUÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èÖòÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡”ƒ¤f‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÄË¡fÇD$ÉK¢f‹D$h‰D$‹D$d‰$ÿx‚¤f…ÀtG‹D$Lè†Tÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èòÿÿƒÄ\Ãf1ÀƒÄ\ÃfUWVSƒì<‹l$P‹\$Tº\‰Øèäþÿ…Àx ÿ‰ØƒÄ<[^_]É\$‹E‰D$Ç$ÿ`ƒ¤fèKñÿÿ‰Ç…À„~ÇD$$ÇD$(ÆD$,‹E‹@ö@W•D$-‹G‰D$…ÀŽR1öëDfÿ…Û„¡”ƒ¤f9ă‰ÚD$$è¦þÿ‹J‰…Ò„…ÀˆãF;t$„ ‹G ‹°‹U0‹C÷@Tu©‰Ø‰T$èIÿÿƒøÿ‹T$„‘ƒøtTŽ”9ÂŒŒD@ý‹U4‹H…Éu]¡”ƒ¤fÿ‹J‰…Òu”‹P‰$ÿRë‰f‹S‰$‰D$ÿR‹D$éiÿÿÿf‹U‹E$)ЉD$‹E )ЉD$‹E ‰$ÿ<ƒ¤f‰Ãéÿÿÿ‹U‹H)щL$‹ë×ÿ¼‚¤f…À…Ž1Ò¸òÿÿÿèÞ›þÿ‹D$$…Àt ‹J‰…Òte‹D$(…Àt ‹J‰…ÒtH‹H‰…Àt#1ÛéIþÿÿ‹H‰…Àt#D$$è^¦þÿ‰Ãé0þÿÿv‹G‰<$ÿP1Ûéþÿÿ‹G‰<$ÿPëÒ‹P‰$ÿRë­‹P‰$ÿRë1Ò¸õÿÿÿèP›þÿémÿÿÿvUWVSƒì,ǘÁ¡fpB fǬÁ¡f@ fÇÔÁ¡fÇØÁ¡fD¡fÇèÁ¡fÇôÁ¡f`¡fÇøÁ¡f`áfÇüÁ¡fàáfÇ8Ä¡fÌ: fÇLÄ¡fl> fÇXÄ¡fäÄ¡fÇtÄ¡fÇxÄ¡fðÄ¡fǔġfÅ¡fǘġf Æ¡fǜġf€Æ¡fÇÇ¡f°= fÇTÇ¡fÇXÇ¡fÄÇ¡fÇlÇ¡fT fÇpÇ¡fÐw¡fÇtÇ¡fàÇ¡fÇxÇ¡f@È¡fǘȡf|= fÇÔÈ¡fÇØÈ¡fDÉ¡fÇìÈ¡fl fÇðÈ¡fv¡fÇôÈ¡f`É¡fÇøÈ¡f É¡fÇ$€Á¡f‹lƒ¤fÿÓ…ÀˆGÇ$ Ä¡fÿÓ…Àˆ6Ç$Ç¡fÿÓ…Àˆ%Ç$€È¡fÿÓ…ÀˆÇ `¤fÇD$õÇ$àÉ¡fÿ ƒ¤f‰D$…À„݉$ÿƒ¤f‰ÆÇ$´2‹=ø‚¤fÿ׉ÅÀt"‰D$ÇD$ÕK¢f‰4$ÿ¨‚¤f‹H‰…À„»Ç$ÿ׉ÅÀt"‰D$ÇD$ÛK¢f‰4$ÿ¨‚¤f‹H‰…À„«Ç$ Ê¡fÿtƒ¤f‰Ã…Àt"‰D$ÇD$åK¢f‰4$ÿ¨‚¤f‹H‰…À„’Ç$`¤f1Ò1Û1À¶•"í¡f9Ú|Z@‰Â=Üuç4‰ðè àþÿ‰Å…À„1À‰ï‰ñóª1ÿ‰ø‰\$ëR¶C‰D$Ç$ïK¢fÿ„ƒ¤f…Àts‰D$·† í¡f‹…¢f‰D$¶C‹D…‰$‹5¨‚¤fÿÖG‰øÿÜ„û4…ž í¡f¶CT…‹…Àu”‰T$ÿœ‚¤f‹T$‰¶C‹D……À…tÿÿÿ‹\$¡$`¤f…Àt ‹J‰…Ò„Š1öëfF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRF9Þuá‰,$ÿƒ¤fÇD$‹D$ƒÄ,[^_]ÃÇD$‹D$ƒÄ,[^_]ËC‰$ÿPÇ$ÿ׉ÅÀ…8þÿÿéUþÿÿ‹C‰$ÿPéGþÿÿ‹P‰$ÿRéhÿÿÿ‹C‰$ÿPé`þÿÿ‹\$ÿœ‚¤f£$`¤f…À„Cÿÿÿf1ÿ1À‰\$‰Ãë+‰D$·‡ ¢f‹…¢f‰D$¡$`¤f‰$ÿÖC‰ßû‘t3Áç¶—£¢f‹T•‰T$¶‡¢¢f‰D$Ç$ñK¢fÿ„ƒ¤f…Àu§é¾þÿÿ‹\$1öëF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRë߉,$ÿƒ¤féÜþÿÿ‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€€‚¢fÁà¶Œ „¢f‰ÐÁèƒâÈ·ŒÀ†¢f‰ÐÑè¶ŒÈ@’¢fÑà1ж„HÀ¢¢fÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€@¤¢fÁà¶Œ`¦¢f‰ÐÁèƒâ¶ŒÈÀ¨¢f‰ÐÁè¶Œˆ@®¢fÁà1ж„ˆÀ±¢fËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€@µ¢fÁà¶Œ`·¢f‰ÐÁèƒâÈ·Œ`¹¢f‰ÐÑè¶ŒÈ Ä¢fÑà1ж„HàÒ¢fÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€ÀÔ¢fÁà¶„àÕ¢f‰ÑÁéƒâÁà¶Œ@Ø¢f‰ÐÁè¶ŒH à¢fÁà1ж„ˆ€â¢fËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€`ä¢fÁà¶„å¢f‰ÑÁéƒâÁà¶Œ`æ¢f‰ÐÁè¶Œˆàé¢fÁà1ж„ˆ`ì¢fËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€Àí¢fÁà¶Œàî¢f‰ÐÁèƒâÈ·Œ`ð¢f‰ÐÁè¶ŒÈö¢fÁà1ж„ˆ £fËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€à£fÁà¶Œ £f‰ÐÁè¶Ò¶ŒÈ`£f‰ÐÁ趌Ƞ£fÁáÁà1ÐÁ‰ÈÁè¶€@£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ £fÁà¶Œ@£f‰ÐÁè¶Ò¶ŒÈÀ£f‰ÐÁ趌Ƞ£fÁáÁà1ÐÁ‰ÈÁè¶€ £fƒáÓøƒàÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€H £fÁà¶”` £f‰ØÁè ãÿ¶”Р £f‰ØÁèÁâ¶Œà £fÁáÁà1ØÁ‰ÈÁè¶€à£fƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€(£fÁà¶”@£f‰ØÁè ãÿ¶”Ѐ£f‰ØÁèÁâ¶ŒÀ£fÁáÁà1ØÁ‰ÈÁè¶€ £fƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€´£fÁà¶”à£f‰ØÁè ãÿ¶”Ð £f‰ØÁèÁâ¶Œ`£fÁáÁà1ØÁ‰ÈÁè¶€`£fƒáÓøƒà[Ãv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€`£fÁà¶Œ £f‰ÐÁè¶Ò¶ŒÈ£f‰ÐÁ趌Ƞ£fÁáÁà1ÐÁ‰ÈÁè¶€@£fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€£fÁà¶ŒÀ£f‰ÐÁè¶Ò¶ŒÈ£f‰ÐÁè¶ŒÈ`£fÁáÁà1ÐÁ‰ÈÁè¶€£fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€À£fÁà¶Œ£f‰ÐÁè¶Ò¶ŒÈ@£f‰ÐÁ趌Ȁ£fÁáÁà1ÐÁ‰ÈÁè¶€ £fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€£fÁà¶Œ@£f‰ÐÁè¶Ò¶ŒÈ€£f‰ÐÁè¶ŒÈÀ£fÁáÁà1ÐÁ‰ÈÁè¶€` £fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@!£fÁà¶Œ€!£f‰ÐÁè¶Ò¶ŒÈÀ!£f‰ÐÁè¶ŒÈ "£fÁáÁà1ÐÁ‰ÈÁè¶€À"£fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ #£fÁà¶Œà#£f‰ÐÁè¶Ò¶ŒÈ $£f‰ÐÁ趌Ȁ$£fÁáÁà1ÐÁ‰ÈÁè¶€ %£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€è%£fÁà¶Œ&£f‰ÐÁè¶Ò¶ŒÈ€&£f‰ÐÁè¶ŒÈ`'£fÁáÁà1ÐÁ‰ÈÁè¶€à)£fƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€à,£fÁà¶Œ -£f‰ÐÁè¶Ò¶ŒÈ -£f‰ÐÁ趌Ƞ.£fÁáÁà1ÐÁ‰ÈÁè¶€@1£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€”4£fÁà¶ŒÀ4£f‰ÐÁè¶Ò¶ŒÈ@5£f‰ÐÁè¶ŒÈ 6£fÁáÁà1ÐÁ‰ÈÁè¶€ 8£fƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ;£fÁà¶Œà;£f‰ÐÁè¶Ò¶ŒÈ`<£f‰ÐÁè¶ŒÈ`=£fÁáÁà1ÐÁ‰ÈÁè¶€@£fƒáÓøƒàËT$‰ÑÁéâÿ?‰ÐÁè âÿ¶‰`C£f¶ŒÈÀC£f‰ÐÁè¶Ò¶ŒÈD£f‰ÐÁè¶ŒÈ`D£fÁáÁà1ÐÁ‰ÈÁè¶€àD£fƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ E£fÁà¶Œ`E£f‰ÐÁè¶Ò¶ŒÈÀE£f‰ÐÁè¶ŒÈ`F£fÁáÁà1ÐÁ‰ÈÁè¶€ÀG£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€|I£fÁà¶Œ I£f‰ÐÁè¶Ò¶ŒÈ J£f‰ÐÁè¶ŒÈ K£fÁáÁà1ÐÁ‰ÈÁè¶€ N£fƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ R£fÁà¶Œ`R£f‰ÐÁè¶Ò¶ŒÈ R£f‰ÐÁè¶ŒÈàR£fÁáÁà1ÐÁ‰ÈÁè¶€€S£fƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ÄS£f¶„ÈÕS£f‰ÑÁé âÿÁà¶ŒT£f‰ÐÁè¶ŒÈ@T£fÁáÁà1ÐÁ‰ÈÁè¶€€T£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€°T£fÁà¶ŒàT£f‰ÐÁè âÿ¶ŒÈU£f‰ÐÁè¶ŒÈU£fÁáÁà1ÐÁ‰ÈÁè¶€@U£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€`U£fÁà¶Œ€U£f‰ÐÁè âÿ¶ŒÈ U£f‰ÐÁ趌ȰU£fÁáÁà1ÐÁ‰ÈÁè¶€ÀU£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÐU£fÁà¶ŒV£f‰ÐÁè âÿ¶ŒÈ V£f‰ÐÁè¶ŒÈ`V£fÁáÁà1ÐÁ‰ÈÁè¶€ÀV£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€8W£fÁà¶Œ`W£f‰ÐÁè âÿ¶ŒÈ€W£f‰ÐÁè¶ŒÈÀW£fÁáÁà1ÐÁ‰ÈÁè¶€X£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€PX£fÁà¶Œ€X£f‰ÐÁè âÿ¶ŒÈ X£f‰ÐÁè¶ŒÈàX£fÁáÁà1ÐÁ‰ÈÁè¶€ Y£fƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€`Y£fÁà¶ŒÀY£f‰ÐÁèƒâ¶ŒÈ Z£f‰ÐÁè¶ŒˆÀZ£fÁáÁà1ÐÁ‰ÈÁè¶€€[£fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@\£fÁà¶Œ€\£f‰ÐÁè¶Ò¶ŒÈÀ\£f‰ÐÁè¶ŒÈ]£fÁáÁà1ÐÁ‰ÈÁè¶€ ]£fƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰t^£f¶ŒÈ…^£f‰ÐÁè âÿ¶ŒÈ•^£f‰ÐÁ趌ȭ^£fÁáÁà1ÐÁ‰ÈÁè¶€à^£fƒáÓøƒàÃv‹T$‰ÑÁé·Ò‰ÐÁè âÿ¶‰_£f¶ŒÈ!_£f‰ÐÁè âÿ¶ŒÈ1_£f‰ÐÁè¶ŒÈA_£fÁáÁà1ÐÁ‰ÈÁè¶€`_£fƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€€_£fÁà¶ŒÀ_£f‰ÐÁè¶Ò¶ŒÈ`£f‰ÐÁ趌Ȁ`£fÁáÁà1ÐÁ‰ÈÁè¶€ a£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Øb£fÁà¶Œc£f‰ÐÁè âÿ¶ŒÈ@c£f‰ÐÁ趌Ƞc£fÁáÁà1ÐÁ‰ÈÁè¶€d£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Pd£fÁà¶Œ€d£f‰ÐÁè¶Ò¶ŒÈàd£f‰ÐÁè¶ŒÈ`e£fÁáÁà1ÐÁ‰ÈÁè¶€Àf£fƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€ðg£fÁà¶Œ h£f‰ÐÁè¶Ò¶ŒÈ`h£f‰ÐÁ趌Ƞh£fÁáÁà1ÐÁ‰ÈÁè¶€ i£fƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€ti£fÁà¶Œ i£f‰ÐÁè âÿ¶ŒÈÀi£f‰ÐÁè¶ŒÈj£fÁáÁà1ÐÁ‰ÈÁè¶€@j£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€¸j£fÁà¶„àj£f‰ÑÁé¶ÒÁà¶Œk£f‰ÐÁè¶ŒÈ k£fÁáÁà1ÐÁ‰ÈÁè¶€8k£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Dk£fÁà¶Œ`k£f‰ÐÁè âÿ¶ŒÈ€k£f‰ÐÁ趌Șk£fÁáÁà1ÐÁ‰ÈÁè¶€°k£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Èk£fÁà¶Œàk£f‰ÐÁè âÿ¶ŒÈ l£f‰ÐÁè¶ŒÈ`l£fÁáÁà1ÐÁ‰ÈÁè¶€ l£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€èl£fÁà¶Œm£f‰ÐÁè âÿ¶ŒÈ m£f‰ÐÁè¶ŒÈ0m£fÁáÁà1ÐÁ‰ÈÁè¶€@m£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Pm£fÁà¶Œ€m£f‰ÐÁè âÿ¶ŒÈ m£f‰ÐÁ趌Ȱm£fÁáÁà1ÐÁ‰ÈÁè¶€Àm£fƒáÓøƒàÃS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€Ðm£fÁà¶”n£f‰ØÁè ãÿ¶”Ð n£f‰ØÁèÁâ¶Œ@n£fÁáÁà1ØÁ‰ÈÁè¶€`n£fƒáÓøƒà[Ãv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€tn£fÁà¶Œ n£f‰ÐÁè âÿ¶ŒÈàn£f‰ÐÁè¶ŒÈ o£fÁáÁà1ÐÁ‰ÈÁè¶€`o£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ o£fÁà¶ŒÀo£f‰ÐÁè âÿ¶ŒÈp£f‰ÐÁè¶ŒÈ@p£fÁáÁà1ÐÁ‰ÈÁè¶€ p£fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€q£fÁà¶Œ@q£f‰ÐÁè¶Ò¶ŒÈ€q£f‰ÐÁè¶ŒÈÀq£fÁáÁà1ÐÁ‰ÈÁè¶€r£fƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@r£fÁà¶Œ€r£f‰ÐÁè¶Ò¶ŒÈÀr£f‰ÐÁè¶ŒÈs£fÁáÁà1ÐÁ‰ÈÁè¶€€s£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€äs£fÁà¶Œt£f‰ÐÁè âÿ¶ŒÈ t£f‰ÐÁè¶ŒÈ8t£fÁáÁà1ÐÁ‰ÈÁè¶€Pt£fƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ht£f¶„Èyt£f‰ÑÁé âÿÁà¶Œ t£f‰ÐÁè¶ŒÈÀt£fÁáÁà1ÐÁ‰ÈÁè¶€Øt£fƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰ðt£f¶„Èu£f‰ÑÁé âÿÁà¶Œ u£f‰ÐÁè¶ŒÈ@u£fÁáÁà1ÐÁ‰ÈÁè¶€€u£fƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€Àu£fÁà¶Œ v£f‰ÐÁèƒâ¶ŒÈ€v£f‰ÐÁè¶Œˆw£fÁáÁà1ÐÁ‰ÈÁè¶€ w£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€,x£fÁà¶Œ@x£f‰ÐÁè âÿ¶ŒÈ€x£f‰ÐÁ趌Ƞx£fÁáÁà1ÐÁ‰ÈÁè¶€Àx£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€èx£fÁà¶Œy£f‰ÐÁè âÿ¶ŒÈ y£f‰ÐÁè¶ŒÈ8y£fÁáÁà1ÐÁ‰ÈÁè¶€`y£fƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€€y£fÁà¶Œ y£f‰ÐÁè¶Ò¶ŒÈày£f‰ÐÁè¶ŒÈ z£fÁáÁà1ÐÁ‰ÈÁè¶€€z£fƒáÓøƒàÃv‹L$‰ÈÁè·É‰ÊÁê áÿ¶€¼z£fÁà¶„àz£f‰ÊÁêƒáÁà¶” {£f‰ÈÁèÁâ¶” {£fÁà1ȶ„Ð`|£fÃf‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€À|£fÁà¶Œà}£f‰ÐÁèƒâ¶ŒÈà£f‰ÐÁè¶Œˆ„£fÁà1ж„ˆ€‡£fËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€€‰£fÁà¶Œ Š£f‰ÐÁèƒâ¶ŒÈ‹£f‰ÐÁè¶ŒÈ`Œ£fÁà1ж„ˆ £fËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€à£fÁà¶„€‘£f‰ÑÁéƒâÁà¶ŒÀ’£f‰ÐÁè¶Œˆ –£fÁà1ж„ˆà™£fËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@œ£fÁà¶„`£f‰ÑÁéƒâÁà¶Œ`ž£f‰ÐÁè¶Œˆ  £fÁà1ж„ˆ@¢£fËL$‰ÈÁè·É‰ÊÁê áÿ¶€ä¢£fÁà¶„££f‰ÊÁêƒáÁà¶” ££f‰ÈÁèÁâ¶”`££fÁà1ȶ„ÐÀ££fÃf‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€à¤£fÁà¶„€¥£f‰ÑÁéƒâÁà¶Œ ¦£f‰ÐÁè¶Œˆ€©£fÁà1ж„ˆ «£fËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€€¬£fÁà¶Œ ­£f‰ÐÁèƒâÈ·Œ€°£f‰ÐÑ趌Ƞ»£fÑà1ж„H`É£fÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ Ê£fÁà¶ŒÀË£f‰ÐÁèƒâ¶ŒÈ@Í£f‰ÐÁè¶ŒˆÀÏ£fÁà1ж„È Ñ£fËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€Ó£fÁà¶Œ Ô£f‰ÐÁèƒâ¶ŒÈ Õ£f‰ÐÁè¶ŒÈ Ø£fÁà1ж„ˆ Û£fËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€lÞ£fÁà¶Œ€Þ£f‰ÐÁè âÿ¶ŒÈÀÞ£f‰ÐÁè¶ŒÈߣfÁáÁà1ÐÁ‰ÈÁè¶€€ß£fƒáÓøƒàËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ à£fÁà¶„@á£f‰ÑÁéƒâÁà¶ŒÀá£f‰ÐÑè¶ŒÈ ã£fÑà1ж„H€å£fÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€æ£fÁà¶„ æ£f‰ÑÁéƒâÁà¶Œ@ç£f‰ÐÁè¶ŒˆÀè£fÁà1ж„ˆ@ë£fÃSQ‹\$ ‰$èçÿÿ…Àu‰$è‚äÿÿƒø ”À¶ÀZ[Ãf¸Z[øÃf1Àƒ|$–ÀÃP‹D$‰$èKäÿÿ…À•À¶ÀZÃP‹D$ƒø t‰$è.äÿÿƒø ”À¶ÀYÃv¸YÃSQ‹\$ ‰$èæíÿÿ…Àu‰$èþãÿÿº€ˆÁÓú1Àƒâ”ÀZ[Ãf1ÀZ[ÃvSP‹\$ ‰$èºÿÿÿ…Àu ‰$è†ÿÿÿ…Àt‰$èºãÿÿƒø•À¶À[[Ãf1À[[ÃvSQ‹\$ ‰$è æÿÿ…Àu*‰$èŠãÿÿºÀ@ˆÁÓúƒâu‰$è îÿÿ…À•À¶ÀZ[øZ[ÃSP‹\$ ‰$èRãÿÿƒø t‰$èaðÿÿ…À•À¶À[[Ãf¸[[ÃVS‹D$ ‹T$‰ÁÁé ‰Ææÿ‰óÁëæÿ¶‰àí£fÁá¶œ €î£f‰ñÁéÁã¶œ@ï£fÁá1ñ¶ŒÙÀñ£f IÁá™ ¢f‰‹‰ ¢f…Ét'Á‰J‹K…Ét#Á‰J‹K…ÉtȉB ¸[^Ãf¸ëô¸ëì¸ëäS‹D$‰ÂÁê ‰Ããÿ‰ÙÁé¶Û¶’Àõ£fÁâ¶Œ`ö£f‰ÚÁêÁá¶Œ ÷£fÁâ1Ú¶”Ê@ù£f• û£f[ÃfVS‹D$ ‹\$‰ÂÁê ‰Ææÿ‰ñÁéæÿ¶’àü£fÁâ¶Œ€ý£f‰òÁêÁá¶Œ @þ£fÁâ1ò¶”Ê€¤fÁâ‚€¢f‰‹‚„¢ff…Àt!·À‰Cf‹‚†¢ff…Àt·À‰C¸[^øëõ¸ëíÿ%D‚¤fÿ%@‚¤fÿ%H‚¤fÿ%4‚¤fÿ%,‚¤fÿ%T‚¤fÿ%P‚¤fÿ%8‚¤fÿ%L‚¤fU‰åƒì‹E ƒøt…Àu‹U‰T$‰D$‹E‰$訸ɠvU‰åSƒì‹E ƒ=@`¤ft Ç@`¤fƒøtHt?¸ƒÄ[É f»¤fû¤ftäv‹…ÀtÿЃÃû¤fuí¸ƒÄ[É ‹E‰D$ÇD$‹E‰$èë¥U‰å1ÀÉÃU‰å¸É U‰åVSƒìu ‹\‚¤fƒÃ@‰\$ ÇD$ÇD$Ç$„¤fèL‰t$‹E‰D$‰$èAèDU‰åWVSƒìL‰Ã‰Ö…Éu eô[^_ÉÃvÇD$EȉD$‰$‰MÄè.ƒì …À‹MÄ„ˆ‹E܃ø@ttƒøtoUä‰T$ ÇD$@‹EÔ‰D$‹Eȉ$‰UÀ‰MÄèôƒì‹EÜ‹Mĉßó¤ƒø@‹UÀt„ƒø„{ÿÿÿ‰T$ ‹Eä‰D$‹EÔ‰D$‹Eȉ$蹃ìeô[^_ÉÃf‰ßó¤eô[^_ÉÉ\$ÇD$Ç$œ¤fèÐþÿÿU‰åWVSƒì,¡8`¤f…Àt ƒÄ,[^_ÉÃfÇ8`¤f¸0¤f-0¤fƒø~Ý»0¤fƒø ~a‹=0¤f…ÿu ‹54¤f…öt=û0¤fs¶¾ f}à‹Cð‹‰U้úè þÿÿƒÃû0¤fr݃Ä,[^_ÉË 8¤f…Éu»<¤f‹…Òu®‹C…Àu§‹Cƒø…ƒÃ û0¤fƒJÿÿÿ¸ fC‹ ‹± f‹SâÿƒútFƒú tyƒútÇEä‰T$Ç$¤fèÉýÿÿ¶8÷Ç€t$Ïÿÿÿ)Ïï f47‰uäë,v·8÷Ç€ua)ωùé fñ‰Mäƒútaƒú t#ƒúu+¹Uäèºýÿÿë‹)Êê fò‰Uä¹UäèœýÿÿƒÃ ¸0¤f9؇8ÿÿÿé}þÿÿvÏÿÿ)Ïï f47‰uä¹UäècýÿÿëʼnD$Ç$ФfèýÿÿU‰åƒì¡à!¢f‹…ÀtvÿСà!¢fP‰à!¢f‹@…ÀuéÉÃvU‰åSƒì‹˜½¡fƒûÿt"…Ût fÿ˜½¡fKuöÇ$ˆº¡fèRVþÿƒÄ[ÉÃ1Ûë‰ÃC‹…˜½¡f…ÒuðëÈfU‰åƒì‹ <`¤f…ÉtÉÃfÇ<`¤fÉë“U‰åVSƒì¡D`¤f…Àueø[^ÉÃÇ$H`¤fèQ‹``¤f…Ût*‹‰$èòR‰Æèò…Àu …öt‹C‰4$ÿЋ[…Ûu×Ç$H`¤fè×Peø[^ÉÃvU‰åSƒì¡D`¤f…Àu1À‹]üÉÃÇD$ Ç$è`‰Ã…Àt7‹E‰‹E ‰CÇ$H`¤fèkP¡``¤f‰C‰``¤fÇ$H`¤fèhS1À멸ÿÿÿÿë¢U‰åSƒì‹]¡D`¤f…Àu 1À‹]üÉÃfÇ$H`¤fèQ‹``¤f…Òt‹9Øu ëB‹9Ùt‰Â‹B…ÀuñÇ$H`¤fèR1À‹]üÉËH‰J‰$èúÿÿÇ$H`¤fèâRëÛ‹B£``¤f‰ÐëÝvU‰åƒì‹E ƒøt>rƒøuèzþÿÿ¸ÉÃvèkþÿÿ¡D`¤fHuéÇD`¤fÇ$H`¤fè‘PëÐf¡D`¤f…ÀtÇD`¤f¸ÉÃfÇ$H`¤fèlRëÞÿ%h‚¤fÿ%l‚¤fÿ%`‚¤fÿ%d‚¤fÿ% ‚¤fÿ%‚¤fÿ%$‚¤fÿ% ‚¤fÿ%‚¤fÿ%‚¤fÿ%‚¤fÿ%‚¤fÿ%‚¤fÿ%‚¤fU‰åƒìèýSþÿÇ$ fè¥SþÿÉÃÿÿÿÿ|½¡fÿÿÿÿôK¢fL¢fL¢fL¢f(L¢f:L¢fHL¢fTL¢fdL¢fqL¢f€L¢fL¢fœL¢f¬L¢fÀL¢fØL¢fìL¢fM¢fM¢f9M¢fCM¢fUM¢fiM¢f}M¢f–M¢f±M¢fÃM¢fÏM¢fçM¢fûM¢fN¢fN¢f+N¢f=N¢fNN¢fYN¢fhN¢f{N¢f’N¢f¥N¢f±N¢fÁN¢fÕN¢fåN¢fõN¢f O¢f!O¢f5O¢fMO¢faO¢fuO¢f„O¢f—O¢f®O¢fÁO¢fÑO¢fåO¢fýO¢fP¢f$P¢f;P¢fVP¢fmP¢f}P¢f‘P¢f©P¢f½P¢fÑP¢fçP¢fýP¢fQ¢fQ¢f/Q¢fDQ¢fUQ¢fjQ¢f{Q¢fŒQ¢f¡Q¢fºQ¢fÏQ¢fèQ¢fýQ¢f R¢fR¢f-R¢fER¢fUR¢fkR¢fƒR¢f–R¢f¬R¢f½R¢fÎR¢fàR¢fˆCompiled regex objectïR¢f˜‚¡f Ì¡fõR¢fl‚¡fÀÌ¡fÿR¢f@‚¡f`Í¡fS¢fl¡f@Ρf S¢f¨¡f`Ï¡fS¢f䎡f€Ð¡fS¢f Ž¡fÀÑ¡fS¢fð{¡fÓ¡f S¢f\ç f€Ó¡f*S¢fx¡fÔ¡f2S¢fTç fàÔ¡f;S¢fÄå fÖ¡fCS¢f„ fLS¢fŒ fYS¢fdS¢f¡S¢f §S¢fÁS¢f ÈS¢f÷S¢f4T¢f'T¢f¸: f4T¢fgT¢f<H fØâ fMatch objecttT¢fÞ fàÖ¡fzT¢f¨Ý f€Ø¡f€T¢f”Ý f@Ú¡f„T¢f€Ý fÜ¡fÁS¢fÔÙ fÞ¡f‰T¢f\á fÀÞ¡f“T¢f¼ã fÀß¡f T¢f0‘¡f`à¡f§T¢fà fá¡f¯T¢flÝ f€á¡f¸T¢fXÝ f ã¡f¿T¢fDÝ få¡fÄT¢f0Ý fàæ¡fÊT¢fÀ5 fàè¡fCS¢fä™ fLS¢fØ™ fØT¢fØâ fHäT¢fèT¢fU¢f U¢f[U¢fdU¢f£U¢fèm f°U¢fïU¢f´Ú füU¢f3V¢f- f8V¢ffV¢fÐm fpV¢f¯V¢fL Scanner objectïR¢fx¡f`é¡fÿR¢fÀw¡fÀé¡fCS¢f\ fLS¢fd fYS¢fÀV¢fôV¢f\ Splitter objectS¢fXv¡f ê¡fCS¢ft fLS¢f| fYS¢fW¢f9W¢fÿÿÿÿ€ê¡f RE 2.3.0 Copyright (c) 1997-2002 by Secret Labs AB   f  f¤ f( f8o fð, fà, fDn f´ fxD fìD fà fÌ' fn f”' f fÜ" f' fŒ& f& f' fŒ& f& fØ fÜ f´C fD f¬" f`" fL" f" f”! fh fœ f fŒ fœ f fŒ fØ fÜ f´C fD fì fð f  f0 fT ffV¢fU¢f[U¢f@W¢fKW¢ffV¢fU¢f[U¢f@W¢fKW¢ffV¢fVW¢fKW¢ffV¢fVW¢fKW¢fêD¢ffV¢f_W¢fU¢f[U¢fKW¢feW¢ffV¢f_W¢fU¢f[U¢fKW¢fêD¢ffV¢f_W¢fU¢f[U¢fKW¢feW¢ffV¢f_W¢fU¢f[U¢fKW¢ffV¢fU¢f[U¢fKW¢fjW¢fjW¢fmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters at the beginning of the string.fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters against all of the string.search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Search through string looking for a match, and return a corresponding match object instance. Return None if no match is found.sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement repl.subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement format.subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement repl.subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement format.split(string, string, maxsplit=0, concurrent=None) --> list. Split string by the occurrences of pattern.splititer(string, maxsplit=0, concurrent=None) --> iterator. Return an iterator yielding the parts of a split string.findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list. Return a list of all matches of pattern in string. The matches may be overlapped if overlapped is True.finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator. Return an iterator over all matches for the RE pattern in string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a MatchObject.scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner. Return an scanner for the RE pattern in string. The matches may be overlapped if overlapped is True.group([group1, ...]) --> string or tuple of strings. Return one or more subgroups of the match. If there is a single argument, the result is a single string, or None if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the whole match is returned. Group 0 is the whole match.start([group1, ...]) --> int or tuple of ints. Return the index of the start of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the start of the whole match is returned. Group 0 is the whole match.end([group1, ...]) --> int or tuple of ints. Return the index of the end of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the end of the whole match is returned. Group 0 is the whole match.span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints. Return the span (a 2-tuple of the indices of the start and end) of one or more subgroups of the match. If there is a single argument, the result is a span, or (-1, -1) if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the span of the whole match is returned. Group 0 is the whole match.groups(default=None) --> tuple of strings. Return a tuple containing all the subgroups of the match. The argument is the default for groups that did not participate in the match.groupdict(default=None) --> dict. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name. The argument is the value to be given for groups that did not participate in the match.capturesdict() --> dict. Return a dictionary containing the captures of all the named subgroups of the match, keyed by the subgroup name.expand(template) --> string. Return the string obtained by doing backslash substitution on the template, as done by the sub() method.expandf(format) --> string. Return the string obtained by using the format, as done by the subf() method.captures([group1, ...]) --> list of strings or tuple of list of strings. Return the captures of one or more subgroups of the match. If there is a single argument, the result is a list of strings; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the captures of the whole match is returned. Group 0 is the whole match.starts([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the starts of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the starts of the captures of the whole match is returned. Group 0 is the whole match.ends([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the ends of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the ends of the captures of the whole match is returned. Group 0 is the whole match.spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints. Return the spans (a 2-tuple of the indices of the start and end) of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of spans; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the spans of the captures of the whole match is returned. Group 0 is the whole match.detach_string() Detaches the target string from the match object. The 'string' attribute will become None.match() --> MatchObject or None. Match at the current position in the string.search() --> MatchObject or None. Search from the current position in the string.split() --> string or None. Return the next part of the split string.X¢f4àf˜X¢fè f¦X¢fx fµX¢f\¢ f¿X¢fÈ- fÕX¢f€ fèX¢f  f˜¡fp˜¡fĘ¡f™¡ft™¡fÌ™¡f$š¡fŒš¡fôš¡fd›¡fÔ›¡fDœ¡f¬œ¡f¡f|¡fä¡fLž¡f´ž¡fŸ¡f„Ÿ¡f쟡fT ¡f¼ ¡f$¡¡fŒ¡¡fô¡¡f\¢¡fÄ¢¡f,£¡f”£¡fü£¡fd¤¡f̤¡f4¥¡fœ¥¡f¦¡fl¦¡fÔ¦¡f<§¡f¤§¡f ¨¡ft¨¡fܨ¡fD©¡f¬©¡fª¡f„ª¡f쪡fT«¡f¼«¡f$¬¡fŒ¬¡fô¬¡f\­¡fÄ­¡f,®¡f”®¡fü®¡fX¯¡f¬¯¡f°¡fX°¡f°°¡f ±¡fd±¡f¼±¡f²¡fd²¡f̲¡f$³¡f|³¡f¬³¡f´³¡fÀ³¡fس¡f´¡f8´¡ft´¡f¸´¡fß0Ið°‡–—˜™šžPRTV€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯²³´¶·¼ÂÃÄÆÇÌÒÓÖ×âãäæçòóôö÷üûûûûûûûûûûûû9cAÊĽ%ɾ\¿)ÑäÝ㦠¶  ± ! ` " Ü ~ » | j}~dñ:‹eú‡¢pOŽastoaƒáÑ‹¼ÐbÖT€ìtV¯ŽÛ Ô k Ó 4!!!‘"h""i"ÿ#±#²#Æ$w$x$%#ѹ—•–˜Ÿš^]Þg³ ” š ™ › µ / ¨ ´³ ¶Ùª©­ÛQ|×Ï!’ "! "þ#%$c$Õ%Û&Ú&C':((4(@)¯*+,,ÿ-.†/ 0;151´2 34‡5ý6 7Ì8ç9Ò:®;D<é=è=I>H>}?|?~@@iAµAžB™BCCûD‘DïEîEŒFhGlG´G°H5I¸JßKàKúLÿLMPN=NÊOÉOñPèQüR÷SþS·TõUûUñVëV÷WöWòXìXöYüYóZðZø[ô[\ ]›]^_ÿ_$`ØaÖa—b•bôcùcUdTd{ezeDf@fXgWg:h~iëj$kqkylímìmVnooÎpÍpJqHqZrPrrsqsYtGttusv¼wCx˜y–yÎz{¡|œ|þ}n~N~vº€¯®‚‚Ÿƒ&„d„g…<†‡‡ ˆê‰é‰ÙŠ×Šè‹(Œ#Œ'e8Ž67ÅŒ‘‹‘‘L’N’“œ“±”¯”F•U•L–j——K˜I˜Ô™Ó™²š°š››ßœ¸·žŸ£ ¤¡x¢w¢Ð£ ¤F¥¦7§G¨«©ÉªU«“¬K­{®Ò¯î°í±…²H³Æ´XµW¶I·®¸­¸ô¹sºÙ»;¼È½¾ˆ¿ŠÀ‰ÀÅÁÐÂÏÂïÃwÄvÄÅÅ Æ Æ¢Ç¡Ç È ȃÉ‚ÉÞÊÝÊ­ˬËÖÌÕ̹͸ÍÎËÏÌÏÐÐÏÐùÑýÑÆÒ1Ó0Ó–Ô•Ô[ÕQÕ\ÖRÖ]×S×MØOØÙGÚVÚõÛ÷ÛöÜøÜ=‚m”¢ ”œµ·/.¨§   ­ ¬ Û Ú     QS|‰×ÏÎ!’“"# þý#"ÕÔCB @?¯°†ˆ   :!9!~"u"ë#ê#!$*$o%p%F&b&''«(¾(Q)“){)**,+++ÿ,þ,--´.³. //¶0µ07161É2Ê2U3T3’4…4ö5õ5ý6ü67’7€78899$::þ;ý;GË>ˆ?h?{@z@vAuAB BçCæC®D­DDEEECFDFºG¹G‚HtHŸI¨IÐJÏJ K KÒLÑL<M N‘N OOÆPÇPÅQÄQ¶R·R¼SÎTÍTgUfUèV VKW¶WHX¸XXYYWZyZI[R[s\‹\Ò]Ó]ô^ó^Ù_Ø_;``íaëaîbìbïc‚cÈdÌdÙeØeff€gVi¼½Íà0;†²!✡ñ ï ~ q ˜ ¤ ð  ñ  òâ62äßVi†²~câßœ¡ÝÑB Ë Í ‰ Vi†²âßÅÀñïÚ¿?>J ¤ 6 2 À ¼ ä ã _ ^ ½¼"åænj2,¥SB.ÌËÎÍ©¤šÜÇÝÒÞÓ® o‡jȱZ ` _ M ð é ) 0 « “ ¬È§«ªÆ¥©„q«Ç¦ªîô…r- .  f e  3  w x ~ Œ M T „         ! " ! # # $ $ % & & ' ' + ( 0 ) 5 * ; + @ , B - C . D / E 0 F 1 M 2 Q 3 R 4 S 5 T 6 U 7 V 8 ƒ 9 !Š ! " " # # $ $ % % & & ' ' ( (à )/ )¿ )Á *1 *½ * +¾ +2 +Ø ,ä ,4 ,× -È -6 -Ù .ò .7 .¦ /8 / /¢ 0š 09 0 1: 1“ 1Œ 2‹ 2< 2Ž 3¦ 3= 3» 4> 4£ 4º 5? 5ž 5\ 6_ 6A 6  7Ä 8'   p f ð $  S R æ å ë ê a ` E È í ê å K J [   Ò Õ â á ó ò   Ÿ ‹   [ W õ å   % ’ ” — Ö Ü Ÿ   Á é í ö ÷    - 1 2 3 r } Š   ç ó + 9 s ” • ž   ´ !µ "Á #à $Ë %û & ' ( ) *X + ,k -l .m /u 0v 1y 2z 3ƒ 4è 5 6ç 7; 8¬ 9( 3 k  À  £ š ¨  /  =iONa^˜—*/àßûüP_ˆ ‡ † ƒ 6 2 › “ C ? YZL>=kbùÔøÊÛÚÚㆺ²}r³Ÿ‘úÉúÇ€!_\ip o!"#`$„$0%;%s&F&œ'¡''62¶°¥¤    H    L *Km)J[lyI(kGxZ…j r!"w#"$~%%&„' ()*+ ,!-#.$/&0'1+20354;5@6B7C8D9E:F;MS?T@UAVBWCXDYE\F`GaHbIdJeKfLgMhNiOnPsQzRS†TU,VNW]XoYtZ{[€\‡]^-_O`^apbuc|deˆfg.hPi_jqkvl}m‚n‰op3qcrst¢¦O§(î)-+ , ï * g [VâNÅ3MRQPz u v { | ywx&'úøçæ¾¼^Y ùĻܛšÃÂ@ ?   D ?  A ‘ @=>ŽIEA@fedc¨°   ZaÛßÝlj¡>™–^ L 5!4!º""W#<#C$B$²%±%ã&á&]'K'c(d(&))Y*A*G+F+J,H,›-<.8.X/>/ª0©0×1¿1Á2À2[3C3Z4B4ä5E6U6m7n7l8k8)9<9Þ:Õ: ; ; §< ¿< Ã= Â= m> h> n? o? ¹@£@7A1A8B:BáCàCMDUDOEVEžF™F¥G¹H»IåJKŠL]MbNY¢fY¢fY¢f Y¢fY¢fY¢fY¢fY¢fY¢f#Y¢f'Y¢f+Y¢f/Y¢f3Y¢f6Y¢f:Y¢f?Y¢fEY¢fLY¢fVY¢fdY¢fhY¢flY¢foY¢ftY¢fxY¢f{Y¢fY¢fƒY¢f†Y¢f‹Y¢fY¢f“Y¢f–Y¢f™Y¢fžY¢f¡Y¢f¤Y¢f©Y¢f¬Y¢f¯Y¢f±Y¢fµY¢f¹Y¢f¼Y¢fÀY¢fÅY¢fËY¢fÏY¢fÒY¢fÖY¢fÚY¢fáY¢fåY¢fèY¢fìY¢fðY¢fôY¢føY¢füY¢fÿY¢fZ¢fZ¢f Z¢fZ¢fZ¢fZ¢fZ¢fZ¢fZ¢f"Z¢f%Z¢f'Z¢f,Z¢f0Z¢f4Z¢f8Z¢f\¢fA\¢fF\¢fM\¢fX\¢fh\¢fu\¢f€\¢f¤\¢f±\¢f»\¢fÅ\¢fÞ\¢f÷\¢f]¢f]¢f]¢f ]¢f%]¢f,]¢f2]¢f@]¢fI]¢fL]¢fP]¢fU]¢fY]¢f_]¢fm]¢f€]¢fŽ]¢f ]¢f©]¢f±]¢f¶]¢f¸]¢f»]¢f¾]¢fÃ]¢fÌ]¢fÑ]¢f×]¢fà]¢fð]¢fû]¢f^¢f^¢f ^¢f ^¢f^¢f^¢f ^¢f+^¢f0^¢f8^¢f=^¢fC^¢fM^¢fY^¢f_^¢fl^¢fr^¢fu^¢fx^¢f~^¢f‚^¢fˆ^¢f–^¢f™^¢fž^¢f§^¢f³^¢fÄ^¢fË^¢fÚ^¢fê^¢fõ^¢fø^¢fý^¢f_¢f _¢f_¢f!_¢f,_¢f8_¢fB_¢fO_¢fT_¢f]_¢fb_¢fh_¢f|_¢f‹_¢f£_¢f¥_¢f¨_¢f­_¢f±_¢fÄ_¢fÖ_¢fà_¢fø_¢fý_¢f`¢f `¢f`¢f`¢f*`¢f8`¢f;`¢f>`¢fB`¢fH`¢fO`¢fV`¢f\`¢fc`¢fi`¢fp`¢fw`¢f}`¢f„`¢f‹`¢f’`¢f˜`¢fž`¢f¤`¢fª`¢f°`¢f¶`¢f¼`¢fÂ`¢fÈ`¢fÎ`¢fÔ`¢fÚ`¢fà`¢fæ`¢fì`¢fò`¢fø`¢fþ`¢fa¢f a¢fa¢fa¢fa¢f"a¢f(a¢f+a¢f2a¢f7a¢fMa¢fca¢fya¢fa¢f¥a¢fªa¢f³a¢f¶a¢f½a¢fÀa¢fÄa¢fÎa¢fÝa¢fîa¢fb¢f b¢fEb¢fYb¢fpb¢fxb¢f€b¢fˆb¢fb¢fŸb¢fµb¢fÀb¢fËb¢fäb¢füb¢fc¢fk¢fKk¢fRk¢fXk¢fgk¢fpk¢f~k¢fƒk¢f‰k¢fk¢f™k¢fžk¢f§k¢f¬k¢f®k¢f±k¢f´k¢f¸k¢fÉk¢fÓk¢fÝk¢føk¢fl¢f l¢fl¢fl¢f/l¢f:l¢fNl¢fbl¢frl¢f…l¢fŠl¢fl¢f—l¢fšl¢fŸl¢f¦l¢f³l¢f·l¢f¿l¢fÄl¢fÈl¢fÑl¢fêl¢fûl¢f m¢fm¢fm¢fm¢fm¢f"m¢f)m¢f,m¢f0m¢f;m¢f@m¢fLm¢fmm¢fqm¢fvm¢fˆm¢fm¢f•m¢f¨m¢f¸m¢f»m¢fÎm¢fßm¢fõm¢fn¢f n¢fn¢fn¢f,n¢f1n¢f6n¢fKn¢fan¢fmn¢fyn¢fƒn¢f‘n¢f˜n¢f¦n¢f©n¢f­n¢f¶n¢f»n¢fÀn¢fÉn¢fÒn¢f×n¢fàn¢fãn¢fæn¢fìn¢føn¢fo¢fo¢fo¢f o¢f#o¢f&o¢f*o¢f1o¢f6o¢f;o¢fCo¢fRo¢f^o¢feo¢flo¢f{o¢fƒo¢fˆo¢f‘o¢fo¢f°o¢fËo¢fÓo¢fÙo¢fÞo¢féo¢fïo¢füo¢fp¢fp¢fp¢fp¢fp¢fp¢fp¢f"p¢f)p¢f.p¢f2p¢f7p¢f=p¢fDp¢fNp¢f_p¢fip¢f|p¢f†p¢fp¢fšp¢f©p¢fÁp¢fÐp¢fßp¢fîp¢fóp¢föp¢fùp¢fq¢f q¢fq¢f#q¢f/q¢fDq¢fWq¢fkq¢fpq¢fwq¢f~q¢fq¢fq¢f q¢f¥q¢f«q¢f°q¢f¸q¢fÉq¢fÚq¢fäq¢fíq¢fûq¢fr¢fr¢fr¢f r¢f r¢f#r¢f)r¢f3r¢fCr¢fQr¢fUr¢fYr¢f]r¢f`r¢fcr¢ffr¢fqr¢fur¢fr¢f†r¢fr¢f’r¢f™r¢f›r¢fžr¢f¦r¢f³r¢f½r¢fÂr¢fÊr¢fÙr¢fÞr¢fãr¢fðr¢fs¢f&s¢f4s¢f?s¢fBs¢fEs¢fHs¢fLs¢fSs¢fXs¢fds¢fss¢f‰s¢fŽs¢f“s¢f£s¢f·s¢f¼s¢fÆs¢fÍs¢f×s¢fÛs¢fès¢f t¢f.t¢fCt¢fdt¢f‡t¢fžt¢f¯t¢fÀt¢fÐt¢fÜt¢fêt¢fít¢fòt¢fõt¢fu¢fu¢f#u¢f7u¢fGu¢fLu¢fVu¢f[u¢fau¢fpu¢fxu¢f„u¢f•u¢fšu¢fœu¢fŸu¢f¢u¢f¦u¢fªu¢f±u¢f´u¢fºu¢f½u¢fÅu¢fÍu¢f×u¢fàu¢fãu¢fçu¢fìu¢fïu¢fòu¢fúu¢fv¢fv¢f'v¢f,v¢f7v¢fFv¢fQv¢fVv¢fdv¢fqv¢ftv¢fwv¢f{v¢f~v¢fv¢f‡v¢fŽv¢fšv¢f¢v¢f®v¢f»v¢f¿v¢fÂv¢fÆv¢fÍv¢fÑv¢fÕv¢fÚv¢fàv¢fçv¢fìv¢fñv¢fùv¢fþv¢fw¢fw¢f#w¢f-w¢f5w¢f{¢fC{¢fN{¢fQ{¢fT{¢f^{¢fe{¢fh{¢fk{¢fp{¢f{¢f‰{¢f—{¢f›{¢f¥{¢f¨{¢f°{¢f¸{¢f½{¢fÂ{¢fÇ{¢fÓ{¢fØ{¢fà{¢fã{¢fæ{¢fì{¢f÷{¢f |¢f |¢f|¢f|¢f |¢f,|¢f/|¢f5|¢fD|¢fP|¢fg|¢fp|¢fs|¢fw|¢f~|¢f|¢f‡|¢f‹|¢f|¢fš|¢f§|¢f»|¢f¿|¢fÊ|¢fÕ|¢fÛ|¢fç|¢f}¢f}¢f&}¢f<}¢f^}¢fv}¢f“}¢f°}¢f¸}¢fÀ}¢fÏ}¢fÙ}¢fâ}¢få}¢fê}¢fö}¢fý}¢f~¢f ~¢f~¢f~¢f~¢f"~¢f+~¢f0~¢f4~¢f:~¢fB~¢fJ~¢fV~¢fi~¢fn~¢ft~¢fy~¢f~~¢f„~¢f‰~¢fŽ~¢f’~¢f~¢f¬~¢f±~¢f¸~¢f½~¢fÑ~¢fÖ~¢fÛ~¢fà~¢få~¢fì~¢fñ~¢fù~¢fþ~¢f¢f¢f"¢f+¢f/¢f<¢fQ¢f\¢fo¢f{¢fˆ¢f”¢f¤¢f»¢fÀ¢f¢fÇ¢fÏ¢fÔ¢fÝ¢fã¢fð¢f€¢f?€¢fP€¢fX€¢f[€¢fa€¢fk€¢f{€¢f}€¢f€¢f†€¢f˜€¢f«€¢fÈ€¢fÑ€¢fဢf怢ffý€¢f¢f ¢f¢f"¢f1¢fB¢fL¢fO¢fR¢fX¢fZ¢f^¢fa¢fl¢fq¢ft¢fy¢fƒ¢fŽ¢f‘¢f˜¢fŸ¢f¤¢f°¢fµ¢f¾¢fâfÈ¢fË¢fÍ¢fÑ¢fÛ¢fç¢fë¢fî¢fó¢fú¢f‚¢f‚¢f'‚¢f,‚¢f3‚¢f5‚¢f8‚¢f=‚¢fC‚¢fH‚¢fK‚¢fN‚¢fQ‚¢fT‚¢f\‚¢fa‚¢f è ß ,àÿÿÿàÿÿÿÇàÿÿÿ¿ àÿÿÿ ç f ¿àÿÿÿF yÿÿÿÿ9ÿÿÿÿÿÿ‡ÿÿÿÔþÿÿôþÿÿÃÒÎÍOÊËÏaÓÑ£Õ‚ÖÚÙÛ8ÿÿÿÿþÿÿÿÿÿÿÿ±ÿÿÿŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*?*=ÿÿÿEG***.ÿÿÿ2ÿÿÿ3ÿÿÿ6ÿÿÿ5ÿÿÿ1ÿÿÿ(¥D¥/ÿÿÿ-ÿÿÿ÷)ý)+ÿÿÿ*ÿÿÿç)&ÿÿÿ»ÿÿÿ'ÿÿÿ¹ÿÿÿ%ÿÿÿTty&%@?C > ` 9\¬ÿÿÿ % Výÿÿ 6 P / }ÚÿÿÿÛÿÿÿ3àÿÿÿàÿÿÿ@àÿÿÿ<Œÿÿÿàÿÿÿàÿÿÿ6ùüÿÿàÿÿÿàÿÿÿàÿÿÿ0áÿÿÿàÿÿÿÿÿÿÿàÿÿÿàÿÿÿ]ÀÿÿÿÁÿÿÿÂÿÿÿâÿÿÿÇÿÿÿçÿÿÿ#ÑÿÿÿñÿÿÿÊÿÿÿêÿÿÿøÿÿÿªÿÿÿÊÿÿÿ°ÿÿÿÐÿÿÿ¤ÿÿÿÄÿÿÿÝÿÿÿ ÿÿÿÀÿÿÿùÿÿÿP°ÿÿÿñÿÿÿ0Ðÿÿÿ`Šæ;ÿÿÿÿ:ÅÿÿÿÆÿÿÿAâÿÿJVd€p~ ¶ÿÿÿ÷ÿÿÿ‡ãÿÿÛãÿÿûãÿÿªÿÿÿ½ãÿÿœÿÿÿÍãÿÿÿÿÿ€ÿÿÿ‚ÿÿÿƒâÿÿ£âÿÿ!ßÿÿAßÿÿšßÿÿºßÿÿäÿÿÿðÿÿÿæÿÿÿ ÖÿÿñÿÿÖÿÿÕÕÿÿØÕÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿ ãÿÿüuÿÿØZÿÿ¼Zÿÿ(Øÿÿÿ ”ÿÿÿs9ÿÿÿsn‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛzþÿÿ ŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?)âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0Þÿÿÿ‚`Òáÿÿ1Ýáÿÿßáÿÿ àáÿÿ Çáÿÿ¾ÆÿÿÿÕáÿÿsøÿÿÿuäÿÿsäÿÿqäÿÿoäÿÿB€ÿÿÿ¹xÿÿÿ¹ÿÿÿ¹ˆÿÿÿ¹Àÿÿÿ¹¸ÿÿÿ¹¾ÿÿÿ¹þãÿÿ¹øãÿÿ¹ûãÿÿBúãÿÿB¹¶ÿÿÿõãÿÿ¹ûãÿÿ²ÿÿÿ¹ôãÿÿ¹êãÿÿ¹ñãÿÿBðãÿÿB¹ªÿÿÿëãÿÿ¹çãÿÿæãÿÿããÿÿBâãÿÿBœÿÿÿããÿÿâãÿÿÝãÿÿßãÿÿBÞãÿÿBÿÿÿŠÿÿÿ¹Öãÿÿ¹Úãÿÿ¹ÓãÿÿBÒãÿÿB¹€ÿÿÿ‚ÿÿÿÍãÿÿ¹£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿfÿÿfeÿÿidÿÿlcÿÿfibÿÿflnÿÿtmÿÿta ÿÿv` ÿÿe_ ÿÿkh ÿÿv] ÿÿm(¨½¡flibgcc_s_dw2-1.dll__register_frame_infolibgcj-12.dll_Jv_RegisterClasses__deregister_frame_info@ f, f f  fü fì fT fÈ f£ f f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f¸ f£ f£ f£ f¸ f f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f£ f f£ fØ f£ fØ f£ f£ f fª fª fø fø fø fø fø fø fª fª fª fª fø fø fø fø fª fª fª fª fª fª fª fª fª fª fª fª fª fª fª fª fª fª fª fø fø fø fø fø fø fø fø fª fª fª fª fª fª fª fø fø fø fø fø fø fø fø fø fø fø fø fø fø fø fø f² fç f² f² f² f² f² f² f f² fÄ f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² fü f² fp f| fü f f² f² f² f² f² f² f² f² f² fp fp fp fp fp fp f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² f² fé f² fé fÄ f² fÄ fS fS fi fi fi fi fi fi fS fi fS fS fi fi fi fi fi fi fi fS fi fi fi fi fi fi fS fi fS fS fS fS fS fS fS fi fi fi fi fi fi fi fi fS fS fS fS fS fS fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fnn:has_property_valuennn:get_all_casesUx$ fý" fý" fý" fý" fý" fý" f¸# fT$ fì# fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" f $ fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" fý" f# f# fX# f# ft# f„# f0$ fØ# fh# f¤$ fý$ fß$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f²$ f¤$ f¤$ f¤$ f¤$ f¤$ fÁ$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f¤$ f„$ fnnerror_regex_coretoo much backtrackingconcurrent not int or Nonegroup indices must be integers or strings, not %.200sgroup indices must be integers or stringsinvalid RE codestring indices must be integersinvalid group referenceexpected bytes instance, %.200s foundexpected string instance, %.200s foundexpected str instance, %.200s foundno such groupinvalid replacementinternal error in regular expression engine/ fregex.Regex(, flags= | regex.=)S fUS fjS fŠS fªS fEQ fÊS fòS fT f!T f:T fST fEQ fsT fEQ fEQ fEQ fEQ fEQ fEQ fEQ f“T fÑT fU fU f3U flU fÑU f7V fEQ fEQ fEQ fEQ fEQ fEQ fLV f\V f•V fÎV fàV f\V f•V fÎV fàV f\V f•V fÎV fàV f\V f•V fÎV fàV fõV f W f(W f7W fWW f´W fY fšX fîY fgQ fcan't use a bytes pattern on a string-like objectcan't use a string pattern on a bytes-like objectexpected string or bufferbuffer is NULLbuffer has negative sizebuffer size mismatchy#nO:fold_case« fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª f« fzª fzª fzª fðª fzª fzª fzª fzª fzª fzª fzª fzª fzª fzª fઠfzª fzª fzª fઠfzª fzª fzª fઠfzª fzª fzª fઠfzª fzª fzª fzª fzª fzª fzª fª f謠fz¬ fž¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fܬ fz¬ fŒ¬ fz¬ fz¬ fž¬ fŒ¬ f¸¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ fz¬ f€¬ fz¬ f€¬ fh¬ fz¬ fh¬ fI± f€¾ f,¾ f,¾ f,¾ f,¾ f,¾ f,¾ fH½ f½ f » f|º fdº fdº fdº fdº f½ f½ f½ fI± fLº fLº fLº fLº fLº f½ f踠f½ fœ¶ fµ f¤´ f„³ fœ¶ fˆ² fI± fdº fdº fdº fdº fp² fp² fp² fp² fü± fü± fü± fü± fü± fü± fLº fè± fè± fè± fè± fè± fè± fè± fè± fè± fè± fè± fè± fè± fè± fè± fè± fLº fLº fLº f½ fÔ± fÔ± fÔ± fÔ± fÔ± fÔ± f`± f`± f`± f`± f`± f`± f¸ f¸ fc fc fc fc fc fc f¸ f¸ f¸ f¸ fc fc fc fc f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ f¸ fc fc fc fc fc fc fc fc f¸ f¸ f¸ f¸ f¸ f¸ f¸ fc fc fc fc fc fc fc fc fc fc fc fc fc fc f¸ fc fOnOOOOOnOnn:re_compileóРfóРf˜Õ f„Õ flÕ f0Õ fÕ fÔÔ fóРfóРfóРfóРfŒÔ fTÔ fÔ fÄÓ fóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfóРfŒÓ fTÓ fÓ fÜÒ f”Ò f\Ò f Ò fÌÑ fóРfóРfóРfóРfóРfóРfóРfœÑ flÑ f<Ñ f Ñ fœÑ flÑ f<Ñ f Ñ fœÑ flÑ f<Ñ f Ñ fœÑ flÑ f<Ñ f Ñ f|O:groupsformat|O:groupdictO|OOnO:scannerO|nO:splitterúê fúê føó fØë fØë f˜ó f´ö f¨ô fúê fdô fúê fúê f$ô fØö f„ö fdð f ð f@ö füõ fúê f8ó fúê f ó føò fúê f´ò fúê fpò fúê fúê fúê fúê fúê fúê fúê f@ò flõ f<õ f õ fÌô fÌõ fœõ f`ï fúê fúê fúê fúê fúê fúê fDï fðñ fÈñ fò f8ñ fðñ fÈñ fò f8ñ fðñ fÈñ fò f8ñ fðñ fÈñ fò f8ñ f`ñ fúê fÀë fÔï f ï f¤ð fÔî f î flî fÄó fÞì f$¡fl¡f ¡fÇ¡f¡fd¡fˆ¡fè¡fI¡f¡ft ¡f² ¡f´¡f¡fñù fXú f€û fìû fÞì fÿ¡fx¡fÌ¡f$¡f§ ¡f ¡f»ý f@þ f¬þ fÞì fbÿ fî¡f ¡f¡fÞì f,¡fÀú f û fÆ¡fƒ#¡f¡fp¡fË¡fý%¡fŒ¡fl¡f0¡f¡ft¡fJ¡f( ¡fˆ ¡f ¡fl¡f( ¡fˆ ¡f ¡fl¡f( ¡fˆ ¡f ¡fl¡f( ¡fˆ ¡f ¡fl¡fÌ¡fé¡f&¡fC¡f¬¡f–¡fÔ ¡fg¡fê ¡f¿ ¡fî¡fà#¡fè ¡f=#¡fXü f¡ü fÞì fÞì f:¡f>¡fСfv¡f¡fó¡fª¡fÞì fÞì fÄ¡fù f,ù fÜø fŠø f:ø f°ù f¬1¡fFú f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡fp0¡fh/¡f,/¡fð.¡f¼0¡f¼0¡f¼0¡f¼0¡fh/¡fh/¡fh/¡fFú fh/¡fh/¡fh/¡fh/¡fh/¡fh/¡f3¡fh/¡fˆ2¡fFú fL2¡fFú fˆ2¡f2¡fFú f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡fh4¡fT3¡fT3¡fh4¡fh4¡fh4¡fh/¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡f¼0¡fh/¡fh/¡fh/¡fh/¡fh4¡f`5¡f`5¡fh4¡fh4¡fh4¡fFú fFú fFú fFú fFú fFú f¨.¡fL.¡f@-¡fFú f¸,¡fFú f+¡f€*¡f)¡fÀ(¡fd(¡fÜ'¡f@E¡f›D¡fëC¡fGC¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡fÞ8¡f«B¡fÿA¡f[A¡f»@¡f@¡fv?¡f¨K¡fDK¡fØJ¡ffJ¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡f=¡fíI¡fI¡fH¡fžG¡f&G¡f¨F¡fO|OOnO:findallO|nO:splitO|OOO:searchO|OOO:fullmatchO|OOO:match_compile_replacement_helperregexNnOO|nOOO:subnOO|nOOO:subMAGICCODE_SIZEcopyrightiiORE_OP_FAILURERE_OP_SUCCESSRE_OP_ANYRE_OP_ANY_ALLRE_OP_ANY_ALL_REVRE_OP_ANY_REVRE_OP_ANY_URE_OP_ANY_U_REVRE_OP_ATOMICRE_OP_BOUNDARYRE_OP_BRANCHRE_OP_CALL_REFRE_OP_CHARACTERRE_OP_CHARACTER_IGNRE_OP_CHARACTER_IGN_REVRE_OP_CHARACTER_REVRE_OP_DEFAULT_BOUNDARYRE_OP_DEFAULT_END_OF_WORDRE_OP_DEFAULT_START_OF_WORDRE_OP_ENDRE_OP_END_OF_LINERE_OP_END_OF_LINE_URE_OP_END_OF_STRINGRE_OP_END_OF_STRING_LINERE_OP_END_OF_STRING_LINE_URE_OP_END_OF_WORDRE_OP_FUZZYRE_OP_GRAPHEME_BOUNDARYRE_OP_GREEDY_REPEATRE_OP_GROUPRE_OP_GROUP_CALLRE_OP_GROUP_EXISTSRE_OP_LAZY_REPEATRE_OP_LOOKAROUNDRE_OP_NEXTRE_OP_PROPERTYRE_OP_PROPERTY_IGNRE_OP_PROPERTY_IGN_REVRE_OP_PROPERTY_REVRE_OP_RANGERE_OP_RANGE_IGNRE_OP_RANGE_IGN_REVRE_OP_RANGE_REVRE_OP_REF_GROUPRE_OP_REF_GROUP_FLDRE_OP_REF_GROUP_FLD_REVRE_OP_REF_GROUP_IGNRE_OP_REF_GROUP_IGN_REVRE_OP_REF_GROUP_REVRE_OP_SEARCH_ANCHORRE_OP_SET_DIFFRE_OP_SET_DIFF_IGNRE_OP_SET_DIFF_IGN_REVRE_OP_SET_DIFF_REVRE_OP_SET_INTERRE_OP_SET_INTER_IGNRE_OP_SET_INTER_IGN_REVRE_OP_SET_INTER_REVRE_OP_SET_SYM_DIFFRE_OP_SET_SYM_DIFF_IGNRE_OP_SET_SYM_DIFF_IGN_REVRE_OP_SET_SYM_DIFF_REVRE_OP_SET_UNIONRE_OP_SET_UNION_IGNRE_OP_SET_UNION_IGN_REVRE_OP_SET_UNION_REVRE_OP_START_OF_LINERE_OP_START_OF_LINE_URE_OP_START_OF_STRINGRE_OP_START_OF_WORDRE_OP_STRINGRE_OP_STRING_FLDRE_OP_STRING_FLD_REVRE_OP_STRING_IGNRE_OP_STRING_IGN_REVRE_OP_STRING_REVRE_OP_STRING_SETRE_OP_STRING_SET_FLDRE_OP_STRING_SET_FLD_REVRE_OP_STRING_SET_IGNRE_OP_STRING_SET_IGN_REVRE_OP_STRING_SET_REVRE_OP_BODY_ENDRE_OP_BODY_STARTRE_OP_END_FUZZYRE_OP_END_GREEDY_REPEATRE_OP_END_GROUPRE_OP_END_LAZY_REPEATRE_OP_GREEDY_REPEAT_ONERE_OP_GROUP_RETURNRE_OP_LAZY_REPEAT_ONERE_OP_MATCH_BODYRE_OP_MATCH_TAILRE_OP_START_GROUP_regex.Patternmatchfullmatchsearchsubsubfsubnsubfnsplitsplititerfindallfinditerscanner__copy____deepcopy__patternThe pattern string from which the regex object was compiled.flagsThe regex matching flags.groupsThe number of capturing groups in the pattern.named_listsThe named lists used by the regex.groupindexA dictionary mapping group names to group numbers._regex.Matchgroupstartendspangroupdictcapturesdictexpandexpandfcapturesstartsendsspansdetach_string__getitem__reThe regex object that produced this match object.posThe position at which the regex engine starting searching.endposThe final position beyond which the regex engine won't search.lastindexThe group number of the last matched capturing group, or None.lastgroupThe name of the last matched capturing group, or None.regsA tuple of the spans of the capturing groups.stringThe string that was searched, or None if it has been detached._regex.ScannerThe regex object that produced this scanner object._regex.SplitterThe regex object that produced this splitter object._regexoverlappedconcurrentmaxsplitcountrepldefaultÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ fT f° f fd f¼ fABDSFILMRTXV0V1WäW¢f€æW¢fèW¢fêW¢fìW¢f@îW¢fðW¢fòW¢fôW¢föW¢føW¢f@úW¢f ýW¢fX¢fcompileget_code_sizeget_propertiesfold_caseget_expand_on_foldinghas_property_valueget_all_cases-1/2011/101/161/21/31/41/51/61/71/81/91010010001000010000010000000010000000000001031071111/2118121221291313/2130132141515/2161717/2181922/32/52020020002000020221214216216000218222202222242262282323023223323424240252627282933/163/23/43/53/83030030003000031323334353637383944/54040040004000041424343200044454647484955/25/65/85050050005000066060060006000077/27/8707007000700008808008000800008499/29090090009000091AABOVEABOVELEFTABOVERIGHTAEGEANNUMBERSAHEXAIAINALALAPHALCHEMICALALCHEMICALSYMBOLSALEFALETTERALNUMALPHAALPHABETICALPHABETICPFALPHABETICPRESENTATIONFORMSALPHANUMERICAMBIGUOUSANANCIENTGREEKMUSICANCIENTGREEKMUSICALNOTATIONANCIENTGREEKNUMBERSANCIENTSYMBOLSANYARARABARABICARABICEXTAARABICEXTENDEDAARABICLETTERARABICMATHARABICMATHEMATICALALPHABETICSYMBOLSARABICNUMBERARABICPFAARABICPFBARABICPRESENTATIONFORMSAARABICPRESENTATIONFORMSBARABICSUPARABICSUPPLEMENTARMENIANARMIARMNARROWSASCIIASCIIHEXDIGITASSIGNEDATATAATARATBATERMATTACHEDABOVEATTACHEDABOVERIGHTATTACHEDBELOWATTACHEDBELOWLEFTAVAGRAHAAVESTANAVSTBB2BABALIBALINESEBAMUBAMUMBAMUMSUPBAMUMSUPPLEMENTBASICLATINBATAKBATKBBBCBEHBELOWBELOWLEFTBELOWRIGHTBENGBENGALIBETHBIDICBIDICLASSBIDICONTROLBIDIMBIDIMIRROREDBINDUBKBLBLANKBLKBLOCKBLOCKELEMENTSBNBOPOBOPOMOFOBOPOMOFOEXTBOPOMOFOEXTENDEDBOTTOMBOTTOMANDRIGHTBOUNDARYNEUTRALBOXDRAWINGBRBRAHBRAHMIBRAIBRAILLEBRAILLEPATTERNSBREAKAFTERBREAKBEFOREBREAKBOTHBREAKSYMBOLSBUGIBUGINESEBUHDBUHIDBURUSHASKIYEHBARREEBYZANTINEMUSICBYZANTINEMUSICALSYMBOLSCC&CAKMCANCANADIANABORIGINALCANADIANSYLLABICSCANONICALCANONICALCOMBININGCLASSCANSCARICARIANCARRIAGERETURNCASEDCASEDLETTERCASEIGNORABLECBCCCCCCCC10CCC103CCC107CCC11CCC118CCC12CCC122CCC129CCC13CCC130CCC132CCC133CCC14CCC15CCC16CCC17CCC18CCC19CCC20CCC21CCC22CCC23CCC24CCC25CCC26CCC27CCC28CCC29CCC30CCC31CCC32CCC33CCC34CCC35CCC36CCC84CCC91CFCHAKMACHAMCHANGESWHENCASEFOLDEDCHANGESWHENCASEMAPPEDCHANGESWHENLOWERCASEDCHANGESWHENTITLECASEDCHANGESWHENUPPERCASEDCHERCHEROKEECICIRCLECJCJKCJKCOMPATCJKCOMPATFORMSCJKCOMPATIBILITYCJKCOMPATIBILITYFORMSCJKCOMPATIBILITYIDEOGRAPHSCJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENTCJKCOMPATIDEOGRAPHSCJKCOMPATIDEOGRAPHSSUPCJKEXTACJKEXTBCJKEXTCCJKEXTDCJKRADICALSSUPCJKRADICALSSUPPLEMENTCJKSTROKESCJKSYMBOLSCJKSYMBOLSANDPUNCTUATIONCJKUNIFIEDIDEOGRAPHSCJKUNIFIEDIDEOGRAPHSEXTENSIONACJKUNIFIEDIDEOGRAPHSEXTENSIONBCJKUNIFIEDIDEOGRAPHSEXTENSIONCCJKUNIFIEDIDEOGRAPHSEXTENSIONDCLCLOSECLOSEPARENTHESISCLOSEPUNCTUATIONCMCNCNTRLCOCOMCOMBININGDIACRITICALMARKSCOMBININGDIACRITICALMARKSFORSYMBOLSCOMBININGDIACRITICALMARKSSUPPLEMENTCOMBININGHALFMARKSCOMBININGMARKCOMBININGMARKSFORSYMBOLSCOMMONCOMMONINDICNUMBERFORMSCOMMONSEPARATORCOMPATCOMPATJAMOCOMPLEXCONTEXTCONDITIONALJAPANESESTARTERCONNECTORPUNCTUATIONCONSONANTCONSONANTDEADCONSONANTFINALCONSONANTHEADLETTERCONSONANTMEDIALCONSONANTPLACEHOLDERCONSONANTREPHACONSONANTSUBJOINEDCONTINGENTBREAKCONTROLCONTROLPICTURESCOPTCOPTICCOUNTINGRODCOUNTINGRODNUMERALSCPCPRTCRCSCUNEIFORMCUNEIFORMNUMBERSCUNEIFORMNUMBERSANDPUNCTUATIONCURRENCYSYMBOLCURRENCYSYMBOLSCWCFCWCMCWLCWTCWUCYPRIOTCYPRIOTSYLLABARYCYRILLICCYRILLICEXTACYRILLICEXTBCYRILLICEXTENDEDACYRILLICEXTENDEDBCYRILLICSUPCYRILLICSUPPLEMENTCYRILLICSUPPLEMENTARYCYRLDDADALDALATHRISHDASHDASHPUNCTUATIONDBDEDECIMALDECIMALNUMBERDECOMPOSITIONTYPEDEFAULTIGNORABLECODEPOINTDEPDEPRECATEDDESERETDEVADEVANAGARIDEVANAGARIEXTDEVANAGARIEXTENDEDDIDIADIACRITICDIACRITICALSDIACRITICALSFORSYMBOLSDIACRITICALSSUPDIGITDINGBATSDOMINODOMINOTILESDOUBLEABOVEDOUBLEBELOWDOUBLEQUOTEDQDSRTDTDUALJOININGEEAEASTASIANWIDTHEGYPEGYPTIANHIEROGLYPHSEMOTICONSENENCENCLOSEDALPHANUMENCLOSEDALPHANUMERICSENCLOSEDALPHANUMERICSUPPLEMENTENCLOSEDALPHANUMSUPENCLOSEDCJKENCLOSEDCJKLETTERSANDMONTHSENCLOSEDIDEOGRAPHICSUPENCLOSEDIDEOGRAPHICSUPPLEMENTENCLOSINGMARKESETETHIETHIOPICETHIOPICEXTETHIOPICEXTAETHIOPICEXTENDEDETHIOPICEXTENDEDAETHIOPICSUPETHIOPICSUPPLEMENTEUROPEANNUMBEREUROPEANSEPARATOREUROPEANTERMINATOREXEXCLAMATIONEXTEXTENDEXTENDEREXTENDNUMLETFFALSEFARSIYEHFEFEHFINFINALFINALPUNCTUATIONFINALSEMKATHFIRSTSTRONGISOLATEFOFONTFORMATFRAFRACTIONFSIFULLWIDTHGAFGAMALGCGCBGENERALCATEGORYGENERALPUNCTUATIONGEOMETRICSHAPESGEORGEORGIANGEORGIANSUPGEORGIANSUPPLEMENTGLGLAGGLAGOLITICGLUEGOTHGOTHICGRAPHGRAPHEMEBASEGRAPHEMECLUSTERBREAKGRAPHEMEEXTENDGRAPHEMELINKGRBASEGREEKGREEKANDCOPTICGREEKEXTGREEKEXTENDEDGREKGREXTGRLINKGUJARATIGUJRGURMUKHIGURUHH2H3HAHHALFANDFULLFORMSHALFMARKSHALFWIDTHHALFWIDTHANDFULLWIDTHFORMSHAMZAONHEHGOALHANHANGHANGULHANGULCOMPATIBILITYJAMOHANGULJAMOHANGULJAMOEXTENDEDAHANGULJAMOEXTENDEDBHANGULSYLLABLESHANGULSYLLABLETYPEHANIHANOHANUNOOHEHEBRHEBREWHEBREWLETTERHEHHEHGOALHETHHEXHEXDIGITHIGHPRIVATEUSESURROGATESHIGHPUSURROGATESHIGHSURROGATESHIRAHIRAGANAHLHSTHYHYPHENIDIDCIDCONTINUEIDEOIDEOGRAPHICIDEOGRAPHICDESCRIPTIONCHARACTERSIDSIDSBIDSBINARYOPERATORIDSTIDSTARTIDSTRINARYOPERATORIMPERIALARAMAICININDICMATRACATEGORYINDICNUMBERFORMSINDICSYLLABICCATEGORYINFIXNUMERICINHERITEDINITINITIALINITIALPUNCTUATIONINMCINSCINSCRIPTIONALPAHLAVIINSCRIPTIONALPARTHIANINSEPARABLEINSEPERABLEINVISIBLEIOTASUBSCRIPTIPAEXTIPAEXTENSIONSISISOISOLATEDITALJAMOJAMOEXTAJAMOEXTBJAVAJAVANESEJGJLJOINCJOINCAUSINGJOINCONTROLJOININGGROUPJOININGTYPEJTJVKAKAFKAITHIKALIKANAKANASUPKANASUPPLEMENTKANAVOICINGKANBUNKANGXIKANGXIRADICALSKANNADAKAPHKATAKANAKATAKANAEXTKATAKANAORHIRAGANAKATAKANAPHONETICEXTENSIONSKAYAHLIKHAPHKHARKHAROSHTHIKHMERKHMERSYMBOLSKHMRKNDAKNOTTEDHEHKTHIKVLL&LAMLAMADHLANALAOLAOOLATINLATIN1LATIN1SUPLATIN1SUPPLEMENTLATINEXTALATINEXTADDITIONALLATINEXTBLATINEXTCLATINEXTDLATINEXTENDEDALATINEXTENDEDADDITIONALLATINEXTENDEDBLATINEXTENDEDCLATINEXTENDEDDLATNLBLELEADINGJAMOLEFTLEFTANDRIGHTLEFTJOININGLEFTTORIGHTLEFTTORIGHTEMBEDDINGLEFTTORIGHTISOLATELEFTTORIGHTOVERRIDELEPCLEPCHALETTERLETTERLIKESYMBOLSLETTERNUMBERLFLIMBLIMBULINBLINEARBLINEARBIDEOGRAMSLINEARBSYLLABARYLINEBREAKLINEFEEDLINESEPARATORLISULLLMLOLOELOGICALORDEREXCEPTIONLOWERLOWERCASELOWERCASELETTERLOWSURROGATESLRELRILROLTLULVLVSYLLABLELVTLVTSYLLABLELYCILYCIANLYDILYDIANMM&MAHJONGMAHJONGTILESMALAYALAMMANDMANDAICMANDATORYBREAKMARKMATHMATHALPHANUMMATHEMATICALALPHANUMERICSYMBOLSMATHEMATICALOPERATORSMATHOPERATORSMATHSYMBOLMBMCMEMEDMEDIALMEEMMEETEIMAYEKMEETEIMAYEKEXTMEETEIMAYEKEXTENSIONSMERCMEROMEROITICCURSIVEMEROITICHIEROGLYPHSMIAOMIDLETTERMIDNUMMIDNUMLETMIMMISCARROWSMISCELLANEOUSMATHEMATICALSYMBOLSAMISCELLANEOUSMATHEMATICALSYMBOLSBMISCELLANEOUSSYMBOLSMISCELLANEOUSSYMBOLSANDARROWSMISCELLANEOUSSYMBOLSANDPICTOGRAPHSMISCELLANEOUSTECHNICALMISCMATHSYMBOLSAMISCMATHSYMBOLSBMISCPICTOGRAPHSMISCSYMBOLSMISCTECHNICALMLMLYMMNMODIFIERLETTERMODIFIERLETTERSMODIFIERSYMBOLMODIFIERTONELETTERSMODIFYINGLETTERMONGMONGOLIANMTEIMUSICMUSICALSYMBOLSMYANMARMYANMAREXTAMYANMAREXTENDEDAMYMRNN&NANANNARNARROWNBNCHARNDNEUTRALNEWLINENEWTAILUENEXTLINENKNKONKOONLNONOBLOCKNOBREAKNOJOININGGROUPNONCHARACTERCODEPOINTNONENONJOININGNONSPACINGMARKNONSTARTERNOONNOTAPPLICABLENOTREORDEREDNRNSNSMNTNUNUKTANUMBERNUMBERFORMSNUMERICNUMERICTYPENUMERICVALUENUNNVNYAOALPHAOCRODIOGAMOGHAMOGREXTOIDCOIDSOLCHIKIOLCKOLDITALICOLDPERSIANOLDSOUTHARABIANOLDTURKICOLETTEROLOWEROMATHONOPOPENPUNCTUATIONOPTICALCHARACTERRECOGNITIONORIYAORKHORYAOSMAOSMANYAOTHEROTHERALPHABETICOTHERDEFAULTIGNORABLECODEPOINTOTHERGRAPHEMEEXTENDOTHERIDCONTINUEOTHERIDSTARTOTHERLETTEROTHERLOWERCASEOTHERMATHOTHERNEUTRALOTHERNUMBEROTHERPUNCTUATIONOTHERSYMBOLOTHERUPPERCASEOUPPEROVOVERLAYOVERSTRUCKPP&PARAGRAPHSEPARATORPATSYNPATTERNSYNTAXPATTERNWHITESPACEPATWSPCPDPDFPDIPEPFPHAGPHAGSPAPHAISTOSPHAISTOSDISCPHLIPHNXPHOENICIANPHONETICEXTPHONETICEXTENSIONSPHONETICEXTENSIONSSUPPLEMENTPHONETICEXTSUPPIPLAYINGCARDSPLRDPOPOPDIRECTIONALFORMATPOPDIRECTIONALISOLATEPOSTFIXNUMERICPRPREFIXNUMERICPREPENDPRINTPRIVATEUSEPRIVATEUSEAREAPRTIPSPUAPUNCTPUNCTUATIONQAACQAAIQAFQAPHQMARKQUQUOTATIONQUOTATIONMARKRRADICALREGIONALINDICATORREGISTERSHIFTERREHREJANGREVERSEDPERIRIGHTRIGHTJOININGRIGHTTOLEFTRIGHTTOLEFTEMBEDDINGRIGHTTOLEFTISOLATERIGHTTOLEFTOVERRIDERJNGRLERLIRLOROHINGYAYEHRUMIRUMINUMERALSYMBOLSRUNICRUNRSS&SASADSADHESAMARITANSAMRSARBSAURSAURASHTRASBSCSCONTINUESCRIPTSDSESEENSEGMENTSEPARATORSEMKATHSENTENCEBREAKSEPSEPARATORSGSHARADASHAVIANSHAWSHINSHRDSINGLEQUOTESINHSINHALASKSMSMALLSMALLFORMSSMALLFORMVARIANTSSMLSOSOFTDOTTEDSORASORASOMPENGSPSPACESPACESEPARATORSPACINGMARKSPACINGMODIFIERLETTERSSPECIALSSQSQRSQUARESTSTERMSUBSUNDSUNDANESESUNDANESESUPSUNDANESESUPPLEMENTSUPSUPARROWSASUPARROWSBSUPERSUPERANDSUBSUPERSCRIPTSANDSUBSCRIPTSSUPMATHOPERATORSSUPPLEMENTALARROWSASUPPLEMENTALARROWSBSUPPLEMENTALMATHEMATICALOPERATORSSUPPLEMENTALPUNCTUATIONSUPPLEMENTARYPRIVATEUSEAREAASUPPLEMENTARYPRIVATEUSEAREABSUPPUAASUPPUABSUPPUNCTUATIONSURROGATESWASHKAFSYSYLOSYLOTINAGRISYMBOLSYRCSYRIACSYRIACWAWTTAGALOGTAGBTAGBANWATAGSTAHTAILETAITHAMTAIVIETTAIXUANJINGTAIXUANJINGSYMBOLSTAKRTAKRITALETALUTAMILTAMLTAVTTAWTEHMARBUTATEHMARBUTAGOALTELUTELUGUTERMTERMINALPUNCTUATIONTETHTFNGTGLGTHAATHAANATHAITIBETANTIBTTIFINAGHTITLECASELETTERTONELETTERTONEMARKTOPTOPANDBOTTOMTOPANDBOTTOMANDRIGHTTOPANDLEFTTOPANDLEFTANDRIGHTTOPANDRIGHTTRAILINGJAMOTRANSPARENTTRANSPORTANDMAPTRANSPORTANDMAPSYMBOLSTRUEUUCASUCASEXTUGARUGARITICUIDEOUNASSIGNEDUNIFIEDCANADIANABORIGINALSYLLABICSUNIFIEDCANADIANABORIGINALSYLLABICSEXTENDEDUNIFIEDIDEOGRAPHUNKNOWNUPUPPERUPPERCASEUPPERCASELETTERVVAIVAIIVARIATIONSELECTORVARIATIONSELECTORSVARIATIONSELECTORSSUPPLEMENTVEDICEXTVEDICEXTENSIONSVERTVERTICALVERTICALFORMSVIRAMAVISARGAVISUALORDERLEFTVOWELVOWELDEPENDENTVOWELINDEPENDENTVOWELJAMOVRVSVSSUPWWAWWBWHITESPACEWIDEWJWORDWORDBREAKWORDJOINERWSWSPACEXDIGITXIDCXIDCONTINUEXIDSXIDSTARTXPEOXSUXXXYYEHYEHBARREEYEHWITHTAILYESYIYIIIYIJINGYIJINGHEXAGRAMSYMBOLSYIRADICALSYISYLLABLESYUDHYUDHHEZZ&ZAINZHAINZINHZLZPZSZWZWSPACEZYYYZZZZ      !""#$%&'"""()*+,-./0123456789:;<=>?@@ABCDEFGEHIEE@J@@KLMNOPQRESTUVWXYEE"""""""""""""""""""""""""""""""""""Z"""""""""""""""""""[\""""""""]""^_`abcdefghi"""""""""""""""""""""""jkkkkkkkkkkkkkkkkllllllllllllllllll""mnop""qrstuvwxyzL{|}~LLLLLL€L‚ƒL„L…LLL†LLL‡ˆ‰ŠLLLLLLLLL‹LLLLLLLLLLLLLLLLLL""""""ŒLLLLLLLL""""""""ŽLLLLLLL""""LLLLLLLLL‘’LLLLLLLLLLLLLLLE“”•–L—L˜™š›œžŸLLLLLLLLLLLL ¡LL¢£¤¥¦L§¨©ª«¬­®¯L"""""""""""""°""""""""""""""""±"²LLLLLLLLLLLLLLL""""²LLLLLLLLLLL³L´µLLLLLLLLLLLLlllllllllllllll¶       !"#$ %& ' ( ) *+ ,- ./ 0123456227 8922222:;<=>2 ?22222@AB2CD2EFG2HIIIIJIIIKLM22NOPQRSTUVWXYZ[TU\]^_`abUcdeYfSTUghiYjklmnop_qrsUtuvYwxsUyz{Y|xs2}~Y€‚2ƒ„…I†‡22ˆ‰ŠII‹ŒŽII‘’“”•2–—˜™ š›œII22žŸ ¡¢£¤ ¥22¦222222222222§¨22§22©ª«222ª222¬­®2¯22222°±2222222222222²2³´2222µ¶·¸2¹2º·»222¼½¾¿ÀÁ¿22Â22Ã22Ä2222Å2–ÆÇÈ2ɰ22ÊËÌÍÎÎ2Ï222ÐÑÒ¿¿ÓIIIIIÔ22ÕÖŸ×ØÙ2ÚB22ÛÜ22ÝÞßB2àIIIIáâãä åæç è éê ë ìíììíîìïðððñòóôõö÷øùúûüýþÿI      ÎÎÎÎÎÎÎÎÎÎÎII   ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎ ÎÎ!ÎÎÎÎÎÎ"Î#ÎÎÎÎÎ$% &ÎÎ'()*+,ÎÎÎ-¯IIIIIIIIII . /01 23 422256278888 9:;<IIIIÎ=ÎÎÎÎÎÎÎÎÎÎ>I?@ABC‡2222D±2222EF2ɇ2222GH23ÎÎ2ÎIJÎKLÎÎJÎÎLÎÎÎI222ÅÎÎÎÎ2222–III2M222222–ÎÎÎ22àN2OI PQ R2222STUVW XYZ[IIII\]2^_222`a22bc¿ dB2e2fg2–M22hijII22klmn2o222pqrstuv8IIIIIIIII22w¿22x2y22Êzzzzzzzz{{{{{{{{222222É222222|II}~€222222‚ƒ„22222…I2222†22ÃII‡ ˆé‰Š‹Œ2222222Ž‘’2“2G”•–—˜2«™ÉÉII22222223š  ›   œ?IIIÎΞ2–222eII2GŸ2 III2¡22¢£II ¤ 2222É¿IIIII¥22¦2§II2¨2©IIII222ªIIII«¬2­®¯2°222±2²2³2222´IIIIIIIII µ¶22·¸¹ºIÙ22»¼2´¿½2¾¿ÀIIIÙ22Á¿II22ÃÄ¿III222222GI      ÅÀ22GIIIII222´IIII2222°ÆËÇÈÉIIIIIIÊIIIIIIIÎÎÎÎÎÎÎ>ÎÎËÎÎÎÌÍÎÎÏÎÎÐIIÎÎÎÎÑIIIÎÎÎÎÎ Ò Ó ÔÕÖì רÙÚÛ Ó ÜÝ Þßàá â Ó ÔÕ ì ×á â Ó ã äåæç è éêëì í î ïðððñ2òóôõö÷øÊùÊIIIúÎÎ?ÎÎÎÎÎÎIû##IIüÎIÎÎÎ?ÎÎIIIIýÎþÎÎÿIIÎÎÎÎÎÎÎÎIÎÎÎÎIÎÎÎÎÎÎÎÎÎÎÎÎÎÐÎIIIIIIIIÎÎÎÎ IIIÎÎÎÎ>IIIÎÎÎÎÎÎÎ222227II222°22222ÉIIIIII I       I{{{{{{{    ! """""""" """ "  "  " " " "" # $$%"&%"""""""" "&  " "" '((((((((())(((((()))))))((*)))**))))))))++++++++ * ,-.,,)/ 00 " 1 "   2" " 3++4 """""" ,,,,1 05678,9:++++++++++++++;<=+<,,,,$$$$$$$$$$$$$>,,$?.,,,,,@@A BC+++++=AD$$$$E++$F$$$$$$$$$G+++H3++IJK++$$LMNE$$$$$$$+++++OP$$$$+++++F,,,,,,,$$$$$$$$E++++(Q,,$$$++J++++J+J++,.$$$$E+,.,,,,,,,,>$$$$$>,,,+++++++++++++O+R$$$$$$$$$$$RFST+++RSTSE+++$$$$$+U$$$P$$$:SP$$$>P>P$$$$$$$$$$>$$$>>,$$,FST+OVWVT>,,,V,,$P$+,$X,,:RP$$>,P>$P>$,OSTO,:O:+,:,,,P$>>,,,+$E,,,,,:RP$$$$P$P$$$$$$>$P$$,FST++:RVT,>,,,,,,,B,,,,,,,>$P$$,FTT+OVWVT,,,,R,,$PM,,,,,FP$$>,$>$$,P>>$,P>,$>,$$$$$$,,SRW,SWST,>,,V,,,,YCCXZ,,VSP$$$>$>$$$$$$$$$P$$,P+RSW+O++,,,:O$,,,,,,,Y,SP$$$>$$$P$$,FTSSWRWS+,,,VW,,,>P>,,,,,,$$$$$>PST+OSWST>,,,V,,,,,[$$$,SP$$$$$$$$>,$$$$P$$$$P,$$$>,O,VS+OOSSSS,S.,,,,,P$$$$$$$E$+++O,9$$$J+++=,,P>>P>>P,,,$$P$$$P$PP,$P$E$+++:F,$$>Q+++,,$$LC\\C+CCC333S$$$$P$$$$$$$$$>,:++++++R++=+$$E+++++:+++++++++OCCCCKCCZC\C.,,$$$$$]T+R+++TRTF$$$S+$$+FS^]SSS$E+F$$$$$$RTRSST]STC 1,,1,$$$$$?D$$$$$>$$,$$$>>$$,>$$,$$$>>$$,$$$$$$$>$$$$$$$$$>:+_`,CCCCC,,,$$>,,,,,a$$$$$$$$$$$$$?Gb$$$$$$$$$$$$cd,$$$$$?ef,,,,,,,$$$$$$>$$+O,,,,,$+=.,,,,$+,,,,,,>+,,,,,,$$+T+++SSSSRT+++++UBE,,,,,,,g<+A$h$$$$$$$$$$,,,,$$$$E>,,$$$,,,,,+RSTRS,,SRSST+,,Z,$$$$$$$,$$$$$$,,SSSSSSSS^$$$S,,,`,CCCCCCCCC$$$ERT,$$]R+++ORRT+++RSST++++O:U,++^$$$$$$$R++RRSSR^$$$,,\CCCC3++++CCCCZ,+^$$$$$$]++S+TS$$$$R+STT+S,,,,$$SSSS++++S+,7,P$$$$$(((,,,,+=++++++R+++F$E$$SF>,,,,(((((((--i((+++O,,,,,,,,,,++   , ,1111,jjjjk lm)k l), n) o),k lpqqqqqr@@ssstutuv@@wxyz{|} {~@@A@@@@@,|€|d((((((Q,,,++++++‚4ƒ4ƒ+++++O,,,,,,,C„C…C"  …C2 CCC„„„ † #$'C 2C‡eeeeeeeeeˆ‰eŠ,,,‹CCCC‹C‹CCC‹CCCCCCCC‹‹CCCCCCCCCCCCCCCCŒCCCCCCCC‹CCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,CCCZ,,,,CCCCCZ,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[CCCCCCCCCCCCCCCCC|Ž|Ž‹, 0k """" "( ‡CC…"‘+ ,,7_6,,6,$$$$,,,5.,,,,,,:$$$>,,,,$$$>$$$>ttxytgttUs,,CCCCC[CCCCC,,,,,CCCCCC,,’“C”•–eeee++S—((Ce˜?C$$$>:™šD$$$$$?(D,,P$$$$$$$$$$$$>CCCCCCCCCCCCCZCCCCCCC›$$h$$$$$$$$$$$œ$,, E4+++++U ,,,:$$$eeeee+,,,,)))š(((()  -""" *ž"k ,,,,,, 0,,,,,,(#$$$F$F$E$$$]TRCC,,CŸ,,,$$,,,,S$$$$$$$$$SSSSSSSSO,,,,+$$$G,,$$$++++$$$E+++++S,,,,,7$ES++SRS 5,,$$$$E++RTRTO,,,,$E$$$$R,,D$$LC],,F+FEF$$+E>,,,,,,,,,,,Ph$$$$$]+Sh¡O,,,,P$$>P$$>P$$>,,,,$]TSR T,$$,,,,,,$$$>,P$$¢¢¢¢¢¢¢¢££££££££$$$$$,,,k,,,,,6,,PF$$$$¤$$$$$$>$$>>$P>$$$$$$)))))))),,,,,,,,P$$$$$$$$$$$$$,$$$$$$$$$$$$$Ÿ,¥},,,¦§}¥}z¨.”}©B,,$$>$$$$$$$$$$$>N7|}$$$$$D$$$$$$$$$$$$$$(,$$$,$$$,$$$,$>,ªX‹Z,,,,N@C,$$$$$$P$$$$$$>$P.,«,[CCCCeeŠYCCCCCCCC`,,CCCCCC3,,,,,,,“$$$$f,,$$$$$$$7$$,,$$$$¬ee,,,,, $$$,>$$$$$$P>,>P$$$7$$$,7$$$$$,,7$$$$,,,$E+:O,,++$$P$P$$$$$,,+O,:,,,,.,,,$$$$$$­$$$,7$$$,$>,,$$$$>,,,`T^$$$$$$$$$$+++++++=,,ST+RT=®,,,,,,,+F$$$$$$$$$E++T+++O,,,,,,$]S++++R^$?.,,,$$$$$ETS+++T,,,,ef,,,,,,]SSSSSSSSSSSSSSW,,,,,,,:+I(((((($,,,,,,,CCCZ[CCCCC¯T+C¯SS°@@@±+++K3+++CCCCCCC++CCCCCCCC,C+K,,,,,,,,,,,,  k 0 ,0101 0 666 1 01 0 0 1 0 00, 0 , ! ! ! ! ! ,$$P$$$$$P>>PP$$$$>$$PP,,,>,PPPP$P>>PPPPPP>>P$>$$$>$$P$>>$$$$$P$$P$P$$P$$,,,,,,,[CCCCCCZ`,,,,,CCCCCCZ,,,,,,CCCCZ,,,C,,,,,,,Z,,,,,,,CCC[CCCCCCCCCCZ,CCZCCZ,,ZCCCCCCCCCCC[CZ,CCCC,,,,,,,,,[CCZ,[CCCCCN,,,,,,,@@@@@@@@£££££££,                        !"################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"""""#$%&'()*+,-./01223345678899:;<=>>?@AABCDDEEFGHIJKLMNOPQRRSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWXYYZ[\]^_`abcdefffffffffffffffffffffffffffffffffffffffghhhhhhhijjjjjjjjkkkkkkkkkkkkkkkkkkllllmnnnnnopqrstuvwxyz{|wwwwww}w~€ww‚wwwƒwww„…†‡wwwwwwwwwˆwwwwwwwwwwwwwwwwww‰‰‰‰‰‰‰‰Šwwwwwww‹‹‹‹‹‹‹‹ŒwwwwwwwŽwwwwwwwww‘‘wwwwwwwwwwwwww’’““”w•w––––––––wwwwwwwwwwww——ww˜™šš››œœœœœœžŸw                             ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¥wwwwwwwwwwwwwww¦¦¦¦§wwwwwwwwwww¨w©ªwwwwwwwwwwww««««««««««««««««¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬  !!!!!!!!""""""""""######$$$$$$$$%%%%%%%%&&''''''(((((((())******++,,--..////////0000000000011111222223334444445566777777777888888889999::::;;;;;<<<=>>>????????@@@@AAAABBBBBBBBCCCCCCCCDDDDDDDEEEFFFGGGHHHHHIIIIJJJJJJJKKKKKKKKLLLLLLLLMMMMNNOOOOOOOOOOPPPPPPPPQQRRRRRRSSSSSSSSTTTTTTTTTTTTUUUVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\]]^^^^^^^^___`````aaaaaabbccccccccddddddddeeeeeeeeeeeeeefgggghhhhhhiiiiiijjjkkkkkklmmnnnoppppppppqqqqqqqqrrrrrrrrrrrrssssttttttttuuuuuuuuuvvvvwwwxxxxxxxxxxxxyyyyyyzzzzzz{{||||||||||||||}}}~€€€€€€‚‚‚ƒƒƒ„„………………††††††‡‡ˆˆˆˆˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’’’’’’’“““““”””””””””””•–—˜˜™™ššššššššš›››››››››››››››œžžžžžžžžŸŸŸŸ     ¡¡¡¡¢¢¢££¤¤¤¤¥¥¥¦¦§§¨¨¨¨©©©©©ªªª«««¬¬¬¬­­®®¯¯°°±±±±±±²²²²²²³³´´´´µµ¶¶·····¸¸¹¹¹¹¹¹¹¹ººººº»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÆÆÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÈÉÉÊÊÊÊÊÊÊÊËËËËËËËËÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ   !"#$%%%%%&'()*+,-./0123456789:;;;<=;;;;;>;??;;;;@ABCDEFGHIJKLMNOP;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHQHHHHHHHHHHHHHHHHHHHRSSSSSSSSSTUUVWXYZ[\]^_`a bAAAAAAAAAAAAAAAAAAHHcdefgghijklmnopqArstuvAAAAAAwAxyzA{A|AAA}AAA~€AAAAAAAAA‚AAƒƒƒƒƒƒ„A…AAAAAAA††††††††‡AAAAAAAˆˆˆˆ‰AAAAAAAAAŠ‹ŒAAAAAAAAAAAAAAA;ŽA‘A’“”;;•;–AAAAAAAAAAAA—˜AA™š›œAžŸ ¡¢£¤¥?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{.|}~~~€..‚ƒ„…†..‡‡‡‡ˆ‡‰Š‡ˆ‡‹‹Œ..ŽŽŽŽ‘‘‘‘‘‘‘‘’’’’“”’’“’’•–—’’’–’’’˜’™’š›››››œžŸ    ¡¢£¤¥¦§¨©ª«««««¬­­®¯°°°°°±°°²³´µ¶¶·¸¹º»»¼»½¾««¿ÀÁÁÁÂÁÃÄÄÅ.....ÆÆÆÆÇÆÆÈÉÉÉÉÊÊÊËÌÌÌÍÎÏÏÏ....ÐÑÒÓÔÕÖרÙÚ Û ÛÜ Ý ÞÞß àáâãäåæ.çèéêëìí.æ.îïïïïïïïïðñ..........òòóòòóôôôôôôôõŽŽööö÷ø’ùúúúúû....üýüüüüüþüüüüüüüüüüüüüÿ.û    ‘‘‘‘  ì‘ ‘üüüÿüüüü........ !!"ñ###$%%%%&'2()))**+‘,----./..000123455556789:;ú.........88<=‘‘>‘?‘‘@üüüüüüAüüüüüüB..CDEFGHI.JK..LñÙMNOPîQR‘ STUVWXYZ[[..XXXXXXX\]^ _û...`abcccd..efghi...jkllmn..ooooopppqrs.....tuuvwx..yz{|....}}~....€‚ƒ„…††‡‡‡ˆ‰Š‹ŒŽ.........1‘.’’’’“”•–———˜™...šššš›œ..žŸ...              ¡.      ¢£¤¤¤¤¤¤¤¤¤¤¥.....¦....§§§§¨§§©ª§......«.......¬­®¯°±².. ³...í´âµ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈ...GûìäÊîî..æäûæ....ËÌæÍ´..ÎÏðìÐ.Îä½Ñ²ìÒ........ÓÔ...¬...üüüüüÕ..üüüÖüüüüüA......×..      !!!!!!!!!"""""""""""""#$$$$$$$$$$$$$$$$$$$$$$%&&&&&&&&&&&&&&'(((((((()*(((((((((((((((((+(((,-,---.,.,----------.---..------.,.,-.,-,-------------/0/001/1/0000000000100010/101001/1/0//011000000002323333232333333333343334323333333232343333333356566675756666666666766676566666675756665666666666668988:8:889::89:8:88888888:8:88:98888888888:;<;<<<=<=<<<<<<<<<<<=<<<<<;<<;<<<=<=<<;=<<<<<<<<<<<<>?>>>@>@>>>>>>>>>>>@>>>>>?>>>>>>@>@>>?@@>>>>>>>?@ABAAACACAAAAAAAAAAAAAAAAAAAACBAAACACAACBAAAAAAAAAABAAADEDDDDDDDDFDDDDDDDDDDDDEDDDDEDDDFFEDDFFDDDDDFGHHHHHHHHHHHHHHHHHHHHIHHHHHHJKKJKKJLLJLLLJLJJLJLLLLLLJLLLKKLLLLLLLLLLMMMMMMMMMMMMNMMMMMMMMMONMMMMMMMMMMMMMOMMMPQORRRRRRRRSSSSSSSSSSSTTSSSSSUSSVVVVVVVVWWWWWWWWWWWWXWWWWWXXWWXWWWWWXXWWWWWWWWWXWWWWWWWWWXYWWWWWWWXWWWWWZZZZZZZZZZ[\\\\\\\\]]]]]]]]]]]]]]^_____________`_abbbbbbcbbbcdddddddddde ffffffffffgggggghghgiiiiiiiiiiiiiiiiiiiijkjjjjljjjjjjjjjjjjjjjjjjjjjjl\\\mmmmmmmmmmmmmmnmmmmmmnmmmmmmooooooooooooooooopqqqqqqqqqqqqqqqqqqqqqqqqrqssssssssssssssstttttttttttttttuttttttuvttttttttttttwwwwwwwwwwwwwwwwwwwwxyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{|{}}}}}}}}yyyy~~~~ €‚ƒ„       … „  †††††††† ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆ ‰ ŠŠŠŠŠŠŠŠŠŠŠŠ‹Œ‹WWWXWWWXWWWXŽV‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“~”‘•––––––––––––––––––––—•–˜™VVVVVVVVVVVVVVš›VVVVVVVœ–––––––––––žŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ŸŸŸ ¡¡¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¤¤¤¤¤¤¤¤¤¤……¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¦¦¦§§§§§§§§§§¨§§§§§§((((((©©©©©©©©ªªªªªªªªªª«VVVVVV𬬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬­­­­­­­­­­­®­­­­­­­­­­­­­­RRRRRR¯¯¯¯¯¯¯¯¯°±¯¯²²²²²²²²²²²³YWWXYWWXYWWX²²²²²²²²²²²²VVVVVš™VVVVVVVV…´ ––––––––––––VVVVVVVVVVš µµµµµµ¶µµµµµµµµµµµµ·µµµµµµµµµ·µ¶µµµµµµµµµµµµ·  ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¹ºººººººº»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÆÆÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÈÇÇÈÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉËËËËËËËËËËËËËËÌÍÍÍÍÍÍÍÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÓÑÑÑÑÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÓÒÑÑÑÑÑÑÑÑÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕ×××××××××××××××ØØØØØØØØØÙØØØØÚÚÚÚÚÚÚÚÚÚÚÚÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞààààààààààáàààààààââââââââââââãâââââäääääääääääääääääåååååååååååååååæåæååççççççççççççççç褤¤¤éêêêêêêêêêêëêêêêêêêëìí ~        ´´´´´´´´´´´´´´´´´´´´´´´ î      žž##))77)))) BBBRRR___ )) ***+++,,---  ...///88866NNNN>>>CC]]DDDEE)))559997::::$$$$!!!!)!""""##"$%%%SSFFTT;;AAGGGHHIIIUUMMMOOOOVVV0000JJJKKK&&&'''111<<((22334444WWW@@@LLLbbaa====XXPPPYYZZZ[[[^^\\eee```dddff???QQQTcccc"!!    !"#$%&'()*+,-./01234567899999:99999999999999;<=>?999@ABC9DE999999999999999999999999999999999999999999999999999999999FGHIJKLMNOPQRS99999999999999999999999999999999999999TUVWXYZ[\]^_9`abc999999d9efg9h9i9999999jklm999999999n999999999999999999o9p99999999999999999999999q999999999999999999999999999999999999999r999999999stu999999999999999999999999999999999vwx999yz{|}~99999999999999999999999999999999999999999999€999999999999999999999999999999999‚9ƒ„9999999999999999999999999999  !!!"#$%&'()*+,-./01234'562789:;<=>?@ABCD;EFGHIJAKBLD;MNOPQRSTB;UFVWABCD;UFGPXJAYZ[\]Z^_`aSB;;bcd`eKAf;;bFd`egAhf;idjIAkfklmnopqI=rpstrWurvwdxyz{=rX|}t~€‚[[[[[[ƒC ZW„„…†<‡ˆr‰rŠ‹‡‡SŒur‡Ž=Grr‘r{‡’@“42‡”4‹•–—=<‹‹‹‹˜‹™š›‘šœžŸ ¡¢£¤¥Œ¦kl§¨©ª«W¬K­®¥I¥¯]°±±±±±±±±±±±²ª‹ ±±±±±±±³±±±±±±±±±±±‹´•µIu¥k¶‘ ·¸'‘yr¹42t‡>'Œ¥r@=¸ºr»}¼Q'½¾¾¾'¿r‘À‘ÀÁ!ÂÃÄÅ!KÀ‹k‘Æ=ÇÈÉÊËÌ ͱ±±±±±ÎkkkÏÐbÑ‹‹ ˆW ‹‘§‹r‹;Ò‹‹K¬Ó? @A0(?=:B<C:DE A@D(D0:? -0 D A -0> F?GDB(HI::JBD 9IF?:D0=IDK: 5I5LB?MN I ),  O H(,45PQQ  RSTUV WXW%Y%%@ @  @)Z[\]^^_^^_1`2 aa) @ :?IDb (:@ cd!!"!efdgX Whi jklm^no 29 (p,]:q%r(D:DI A  ?@ABC DEFGGGGGGHHHHIJJJJJAKKLMNOPQRSTUVWXYZ [\]^_`abcdefg hihjkhlhimnopqirs^Gtuvwxyz{|}~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€€€‚€~€€ƒH„JJ…†d-‡Fˆ‰Š‹d[ŒŽ[v‘’“”•h–—˜™Kš›            !"#$%&' $()*%%"+,-./  / 0$   " 1 $ " 222233333344444456-)7.)-&89: , .;1);<=65>6?6--+ 1$ @A  ""BC>----222D+6; C EB6FB#GHHHHHHGHHHHHHGHHGHHH3IJ4444"  K.  B+5&----------LM=NO PQQQQQQ             !"#!!$!%!!&'(!)*!!+,-./01234!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!56789:;<=>!!!?@ABC!!!DE!!!!F!!!!!!!!!GH!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!J!!!!KL!!!!!!!!!!!!!!!!MN!OPQR!!!!!!!!!!!!!!!!!!!!!!S!TUV!!!!!!!!!!!!!!!V!!!!!WX!!!!!!!!!!!!!!  !"#$%&'()*+)),-./0))12345677879:;<=>?@ABCDEFGHI>GJKLMNOPQRISTUVSWXYZ[\]^_`7abc7defghij7)klmnop))))))))))q)rst)u)vwx))y^))))))))))z{))|}~€)‚ƒ„))…)†)‡ˆ‰Š‹)Œ7Ž)‘’77“”•–—)˜)™š›77œžŸ ¡¢£¡¤¥¦§¨©ª«7¬­®¯°±77777777777²³77777777777´µ77¶·77¸¹7777º7»¼½¾¿ÀÁ)ÂÃÄÄÅÆ777777ÇÈ^)É^)pÊË))ÌÍ7Î)))))‡77))))))Ï7))))Ï7ÎÐÑÒÓÔ))ÕÖרÙÚ7ÛÜÝ)Þßàá2âãˆ:äå7)æçè)éêëìí7777)î)))))ïðñ)))ò))ó7ôõö))÷ø))ùÎ)ú)ûüýþÿ)))   7)))Í77)y777 7777ˆ) 7Î7)7)ƒ77‡77777‡ó77)77ˆ7777)‡‡7777))77777–O–– !7–ä"77777)#ƒ7)))Ì7777)))$7777)Ì777777)%777777))&'(777)7777777777*+,7777-77777./0123456789:./;1<=>5?@ABCD½EFGHIJKLMN77))))))Ã7)y))))))7777777OPPP7777Q     !" #"$!%&$'($$)*+,,,,,,,,,,,,-.'/0 1 2!"3 4,5 6789,,,,,,,,,,:;:$$$$$$<$=>?,,@A$$$$$$$$$$B,,,,,CDE$$$$$$$$F,G,HIJKLMNO$$$$$$$,,,,,,@P$$$$$Q,,RK$$$$$$$B,,)S$$$$$QT,,UUV$$$$$$UW$$X,,,,,,@,$$$$$$$$$$$$$QY,,,,U,$$QZP$P$9P$LL$$$$$W$+()Y,[[\]^Q_)9P<`L$$$$$W$Wa)I@][VbP+_Jc9P$^^$$$$$W$WP)Y,::VXQ_,[[Vd^Q_6eP<(W)aW`X<($$)d@dIVX]_9P$WW$$$$$W$$P)f,IIV;)dP$WW$$$$$W$$P)Y,IIV;gQ_a$$$$$$?@ABCDEFGHIJKLMNOO     !"#$%&'()*+,-./01&/234567891:8;<:=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdMefghijklmnopdqrsturvwxyz{|}~h€jQ‚ƒ„„…†‡ˆR‰Š‹DdrŒŽY‘’“”•^1–c—M˜…ƒ™šj›œž“Ÿ i¡¢£¤¥¦r§¨©Mªj«¬­®DZM¯j“r°r±²dd¢³´^Mdd—~µ‘ ~—¶d‹·‹ ¸j¦¹º»¼½¾¿ÀÁÂRºº€€ÃÃĽůÇÈɃZrþÿÿ ÿÿÿÿÿÿÿÃÿP ß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿ¿¶ÿÿÿÿÿÿÿþÀÿÿÿÿïþáœÿÿàÿÿÿÿüÿÿÿ0ÿÿÿüÿÿÿÿýðÿÿÿÿïÿßáÿþþîŸùÿÿýÅãŸY€°î‡ùÿÿýmÇ^?î¿ûÿÿýí㿟À°ìÇ=ÖÇÿÃÇîßýÿÿýïãß`ìßýÿß`@ÿÿÿçß]€üìÿüÿÿû/€_ÿ ÿÿÿ –%ðþ®ìÿ;_ ðÿþÿÿÿþÿÿÿþÿÿÿÿÿùçÁÿÿ@0¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿ‡ÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿÏÿÿ€ÿÿÿÿÿÿÿÿ?ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿþÿ€ÿÿïÿïÿóü¿ÿàüÿÿÿ?Þoÿÿ????ÿªÿÿß_ÜÏÿÜ€ÿ„ü/>P½ÿóàCÿÀÿÿÿÿx ÿ€ÿÿ€àþ>ÿÿààÿÿÿÿ?þÿÿÿÿÿ ÿðÿÿÿ€€ÿüÿÿÿÿyÿÿ»÷ÿÿüÿÿÿÿ÷ÿÿ?ÿÿ8ÿÿ<~~~ÿÿøÿÿÿ?ÿÿÿÿÿøàÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþ?ÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷–þ÷ „ê–ª–÷÷^ÿûÿîûÿ        !"#$"%&'()*+,-./0123456789:;<=>?@ABCDEFGH=>I@J673?@AB%&6CDþÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®¤ªJUUÒUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿ„8'>P=À Àÿÿê%À(UUUUTUTUUUjU(Uÿÿÿÿðÿÿ?ÿÿÿÐdÞ?ÿÿÿ°çß{_üðÿÿ?ðÿÿ?üÿÿðÿÿÿ       !"#$%&'()*+,-./01234567//$$889þÿÿ ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿïÿÿÿÿ Ï<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿ¿ ÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ€ÿ„ü/>P½òàCÀÿÿÿÿÿÿÿÿx ÿ?ÿÿÿüÿÿÿÿxÿøÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷    !"#$%&'()*+,-./0123  !"#$!%&$!'# ()#*+,-#(.#"#/0123456789:;<=!>??@@ABCDEFGHIJKL*MNOPQRSTUVWXYZ[\]^_`abcdefghiRjklmNn4opqrstudvwxyz{|N}~l,€‚ƒ „~N…†N‡ˆ‰Š‹Œ Ž€@@¡ÿÿÿÿÿÿÿÿ0°øþÿÿÿÿ¿¶ÿøÿÿÀ¿ÿ=€ÿÀÿø?Àÿÿ?ðÿÿþ!þ  †9#¾! @ ÀÁ=`@0\òÀò@? þßàÿþÿÿÿ@àýfÃd à °?@þ x‡€ @åøŸ€Ðø< @£ðÏ?÷ÿý!ðÿÿÿøð ààà`ø|ßÿ€ÿÿÿ0€€€€ <>~p €÷¿€D`ÿÿÀ?€ÿÈ~fÁ 0X !üÿÿÿ$ nð‡ÿx&€ïÀ(¿€ÿÿ€øÿç<ÿÿ        !"#$%&'()*+,-þÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿÿ@ Àÿÿê%À(UUUUTUTUUUjU(Uÿ       !"#$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢`[Uµªª-ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿÿßPÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ       !"#!$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢ÐVUµªª+ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿß@ÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ        !"#$%&'()*+,-./01þÿÿ ÿÿÿUUUUUUUªªVUUUUU«ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzU E@×þÿû€cUUU³æÿÿÿÿÿÿTUU«*UUUþÿÿÿ€¿ UULÿ?ÿÿ?ªÿÿÿœœœ@ Àÿÿê%À(UUUUTUTUUUjU(Uøÿ      !"#$%&'()*+,-./01þÿÿ ÿÿÿÿÿÿÿÿÿÿþÿßÿ÷ÿóÿ³ðÿÿÿýÿüÿÿß i‹&  Ï8@×ÿÿûÿÿÿÿÿãÿÿÿ·ïüÿÿÿþÿÿÿþÿÿÿÿ¿ "ÿÿÿOÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ@ @ÀÿÿÿÿÿÿÿÿÿÿmÀx ÿ?ÿÿÿüÿüÿÿÿþÿ8ÿøÿÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMM     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžkŸ ¡^¢y£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ –%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿøÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOP    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨•©Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß<À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿþàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_Ûÿÿÿøÿÿÿüÿÿàßÿüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNN     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžk kŸ ¡^¢ky£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß8@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ–%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿàÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿŠªÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQ    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨N©•Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß8À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿæàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_ÛÿÿÿøÿðÿÿÿÿÿüÿàŠªüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ      €€0xø|ÿÿÿøÿÿÿÿ    !"#$%&'()*+  !"#$%&'()$*+,-./0123456789::;;<=>?@ABCDE#FGHIJKLM NOPQRSPTUVWXYZ[\]^_`$a&bcdeaFfgFhijklmnÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿøÀûï>ðÿÿþ!þ P €†9#¾!Ð À@ €ÀÁ=`D0`„\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8‡€ @åøŸÐ< @£ðÏ÷ÿý!ð0ÿÿ€€ü€÷?D`ÿÿÀ?€ÿÈ~fÁ0@ ! nð‡ÿx€ïÀ(¿€ Ãøç<             !"#$%&'()*+,-./012222222223456789:;<222=>?@A2B2CD2222E2FG222H222I2222JK2222222LMNOPQRS222222T2UVWXYZ[\]^_2222222_22222  !"#$%&'()*+,!-./0123456789:;8<=>?@AB CDEFGHIJKLMNOPQRSTUVWXYZ[\Z]^_`abcdefghZijklmnopdqrstuvwxyz{|}~€‚ƒ„…†Y‡ˆ‰ Š‹ŒSŽ‘ˆh’‡ “”•‹Y–h—˜™š›fœžŸ f¡¢£¤Z¥¦§¨©ª«¬­®–¯°[±²³´µ¶·¸¹µº»Z ¼½¾¿ÀYÁÂõZZ]–ÄÅÆÇÈÉÊËÌ͈ÎÏÐÑÒÓfÔvÕÖרÙvÚ×ÛÆÜÝÜÞßàáhâãäåæŽ`€çèéêëìíîéïðñòóôlˆõöƒ‹lY÷øYùúZˆû]Óü–·ýþÿˆŽ\ÿÿÿÿÿÿÿÿßÿÿÿ|ð×ÿÿûÿÿÿüÿÿÿþÿÿÿþþÿÿÿÿ†@IÿÿÿÀÿÈÿÿÿþÿÿÿ?@`Âÿÿÿ?ýÿÿÿàÿÿ?ÿðÿÿ?ÿÿÿÿAýøÿÿÿÿÿÿëÞÿóÿÿþìŸùÿÿýÅ£Y°Ãÿÿè‡ùÿÿýmÃ^Àÿè¿ûÿÿýíãÃÿÿýí#°ÃÿÿèÇ=ÖÇÿƒÆÀÿÿîßýÿÿýï#Ãÿÿìßýÿÿýïc› @Ãÿÿÿÿ§Á]Ãÿ?þìÿüÿÿû/ÿÿ €€ÿ–%ðþ®ì _ÿóÿÿÿüÿÿ_ýÿþÿÿÿ€ À¿ßÿÿ™ÿÿÿ<þÿáÿ›ßÿß¿ ÿÿÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿcÿÿÿßÿÿOÀ¿ðÿÿÿÿÿÿÿÿÿÿÿÿ?xûñÿÿÿÿ?ÿÿÿÿÿÇÿÿÆÿÿ¿àÿ?ðÿÿÿÿÿ/èûÿÿÿðüÿÿÿÃôÿÿ¿\ ðÿ0øÿãÿÿÿÞoÿÿ????ÿªÿÿÿ?ÿÿßÿßÿÏïÿÿÜÿÿÿÿ€ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ€ÿÿÿÿÿÿÿÿûÿÿÿøàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿ»÷ÿÿŸÿÀÿü?Àÿÿ €ÿÿ7ìÿ¿ÿÃÿ÷/ÿóÿÿb>øÿÏ?~~~ßÿøÿÿÿ?ÿÿø ÿÿ_Ûÿÿÿøÿÿÿÿÿüÿÿÿ?ÿÿÿ÷ÿßÿüüü0ÿïÿÿÿÿ·ÿ?ÿ?‡ÿÿÿÿÿÿÿÿÿÿÿ¿ÿ?ÿ?ýÿÿÿÿ¿‘ÿÿ¿ÿÿÿÿÿÿÿƒÿÿÿÀïþÿÿÿÿ?þÿÿ?ÿÿÿÿÿýÿÿÿ€?üÿÿÿ‡ÙÿÿÿÿÀÿÿÿ?€ÿ×@ÿÿÿÿÿÿøÿþÿÿ_<ðÿÿÿÃÿÿ#ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿÿÏÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿþþÿþÿÀÿÿÿÿÿÿ¿ÿßÿÿÿøáÿ?      €@@> ÿƒ€À|À0      @@?€    @€ „ÿðà„            !"#$%&'()*+,-.    !"#$%&"'(")*+,-.PŒ@€ˆÿÿ0 á þ`8p<ìøÀ0€@àøÀÀ€à€÷€ü€?`     !""#"$%&"'()""""""""""*+,##--../"&01234@'3@``ÿbø„ü/>³ûñààó¶>Ãðÿ?ë/0°ÀðÁŒ”``Àÿøÿÿ0 PÿÿÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿÿÿ÷ÿÿÿÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿ~~ÿ~~ÿ~~     !  !"!#$%&'()*+,-. /012345678+9:9;*<=>?@>ABCDEFG5HIJ5@5KL#M ÿ¿¶ÿøÿþÀž!ÿÿÀÿÀøïðÿÌÿßà ÀŸ€‡#¿ŸÀÇ€ß`߀€_ÿ ò òþÿàÿþÿÿÿøyÀÃ…|0€Àÿÿÿÿ€àþÿàÿþ3€ÿðÿ?ÿÿÿÿÿðøðÿÀ€ÿþ0Aø ø@nðÿ?ÿøÿø?ÿÿÿ   Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?      !"#$%&'(  !"#$%&'()*+,-./0123456789:&;<==>?@ABCDEFG)HIJK@ÿÿÿÿÿÿÿÿà00øþÿûÿÿ¿ø‡€aÿÀÿø?ðÿÿ  €_ ÂÜ@€€¿ þ àŸø À?ÿ!ðÿÿðÿà ààà`€€ü€°€ÿÿÿx@0À€ÿÿ€ãøç<     €@€@ >`p €  ÿ ðÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿ0ÿÿÀÿÿÿÿÿÀ@€`€€0ÀÀ Àó ÿÿÿûÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀ€šÿÿÿÿÿÿÿÿÿÿÿ? €€0 ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿ    € @@  À À À À`@€€þ         !"#$%   !"@€P€0 „@`ÌÀ0€ÀˆÀ€àÄ€`8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ> À   þÿüxþZCˆ€ÿÿÿÿþÿïÿÿÿÿÿÿ?ðÿÿÿÿÀ`                    !"#$%&'()*+,-./0123456784449:44444;<=>?@4ABCDEFGHIJKLMNOPQRSTUVWWWXYZ[\]^_``a`b`c`````d```efghijklmnopq````````````Wr``stuvwxyz{|}~€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€    !"#$% &'()*+,- ./01 2 34 156 372 86 39 1:2 ;4<1 = > ? @AB1C 3D 1 4 1 EF GH IJ K L MNOP< QR STUVW Q X  YZ [ [ 1 1 \]^ X_ ` abc d e fghi j= kil m nl op qrs to uvwwxyz{|}~€ T‚ƒ„…† ‡ˆ‰ Š‹Œ Ž ‘’“X ”• – — ˜‹‰ —™š› œ ‹ x  ž ’Ÿ   d ¡  Œ w –¢ – l£ ¤ ¥ ¦§ ¨ s l © ªl - « ¬­® ¯2 D< ° ±²³´Xtµ¶·¸‰ ¹º» — W¼½¾¿ÀÁ2 Ât‰ l à - ÄÅ l Æ ÇÈ –- ÉÊË Ì Í Œ Î ¡ ‡ ÏÐÐÐÑ—‹ÒÓ’’ Ô … Õ“‹Ö Ò×ØÙ‹Ú Û ‰ ‹ Ü             ! """"""#$%&'((((((()##*+,((((-./012(3((((-""456""7 8"""('9 :;<;=< > = ;<; =?  @ @A= ;>E @ F  : >G =9 9=B;   HI<9E <<; ; <; :@ = =  J >; B :< = KL = 9; : <   A :9G<;A E9;  >B :H > 9E;= ; 9 M   NNOP QRST U VWXYZFZFSSSSF   M[\   [ ]   F F    F    ^ >   _ F F `a :: @ b > >; <9@@  ;EA;> =;= c""d"(((e(((fgh ijFk (((lmn Fop[ """q!"""r4""s #######t 9@ <; >9 =B  uv9< >wx [ yz((( F F{  F     |                                                   !"#$%&'(  !"#$%&''()*+,-./0123456789:;<=>?@A.BCDEFGHIJKLMNAOPQFRSTUV   !"#$%&''()*+$,--.&/0012+34#5678977:;<=>?@ABCDEFGHIJKL0M;NOPQM0R6M STSJ5 UVL9WX5YZ[9N\]91^_`a11;1b@^JMcd9&N;e5Lfg^h5^Mijklmbn0&1&9222223----3+-----))----))-------222262---222--222----23--2455455422-2222-222.-22--2.12 2- 22--2-22-22222-22-2-22--2--2-2-2222222222---2---22222-22 !""####$$%%%%----+&'('''''2222--21.2--2-225*-)2224-2-2222-2,13.//-222-2-22-++0+++++---   !"###########################################$#%&'()*+,-./01234##5   !! "#$%&'()*+!,-./012345675899:;<=!>?<=!@ABCDEFGHIJKLIIMNOOPQRSTUVWXYZ[\]^_`abcdeffghijklmnoppqrstufffvttwxyz{|}9fffffffffffff~€‚ƒ„…‚ƒ„†‡ffffˆ‰fˆffŠ‹tŒttttttŒŽŽŽŽŽfŽŽŽŽŽŽf‘’“Q”•QN–—˜™š›œœœžŸ ¡¢££££££¤¥¥¦§§§¨©ª£«¬­®¯°±²¥³´µ¶·¸¹º»¼½¾¿ÀÀÁÂÃÄÄÄÄÄÅÆÆÆÆÇÈÉÊËÌÍÍÎÏÐÐÐÐÐÑÐÐÐÒÓÔÕÐÐÐÖ×ÐØÙÚÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÜÐÐÐÕÐÝÞßàáâãäåäæf玎èéꎎëìíQ                !     "#$   %    & $$ ''()*+,-   .. /  01234567***+***8#9":;;<=>?@ABBCD;E=>FFFFG   $H# % $  !IIIIIJIIIIK#L,M$$$$$$. ! N% O"IPIIIIIIKQQQQQQQRQQQS7$  $! .;;T $ UVVVVVVVVUUUWUVVXYZ[\UWVUUU]W^^^^^________`aaaaaaaaabcccccd^^e______faccghaijkilih`_i`mnaojpi_jq_`j^^^rsstsssssuvwxxxxwxyz{{|[}~Z}~[}~}~[€‚‚‚‚‚‚‚ƒ„„„„„„„„„„…†„†„†„†‡‚ˆ„… ;;;;;‰;;;;;‰Š‹=‰;;B=;=;;;BŒ=;‰;‰;;BŒ;Ž;‰;;;;>;;;;;Ž‹=;Œ;Š‘=‹‹Œ;Œ;=;;B;;;;==B;’K“”QQ”#•                        !"#      !"#"$%&'()*+,-./01,23!456789:;<=>>?@A&BCDEFGHIJKLMNOLKPGKQKRSRGTUVWXXXXXYZZZZ[\]^A_`a"`bPc_Oa                                  !"""""""#$$$$$$$$$$%&$&$&$&'"($%    !"#-+-) ##!!'' 777 +--++- ###!!'  &  8 )++++++++7/7+--..)#! ,2**01$  "%( 345 # # # 77-++66 ## ' --+9  !"#$%&'()*+,-   !"#$%&'()*+,-.+/-0,1/-2+,3.4+56789+3:+.+;<=>?@ABCDEF4GHIJKGLL++MNOPQRSTUVWXYZ[5\Z]^_]`abcde`fgh]ijk]l9md]no]'pqrst,u4vwexyz,{e]|'}~]€'‚ƒ„iL,  !"#  $$% &'%$! ()*+  %   ++ % %++%, - % +% +./.0 ++,  %+-%  1% %%++2%%   % + %        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOYZ[\]^_`abcdefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefglmmmmmmmmmmmmmmmmHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHOOOOnopqrstuvwxyHz{|}HHHHHH~H€H‚HƒHHH„HHH…†‡ˆHHHHHHHHH‰HHHHHHHHHHHHHHHHHHŠH‹HHHHHHHHHHHHHHHHHHHHHHHŒŽHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH‘’“HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH”•–—H˜H™š›œHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHžŸHH ¡¢£¤H¥¦§¨©ª«¬­HHHHHHHHHHHHHHHHHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO®¯H°±HHHHHHHHHHHHHHHHHHHHHHHHHHHH      !"#$%&'()*% +,-./0000100023456789:;<=>?@A:;BCDEFG;HIJ?K9:;HLM?NOPQRSETUV;WXY?Z[V;\X]?^[V_`a?bcdefg0hijjklm00nopqrs00tu%v8wxyz{|}00jjjj~jjjj€‚‚‚‚ƒ„„„„„…†…‡ˆ‰ˆŠ‹wŒŽŽJ‘’“”‘•jjjjj–—Œ˜—™šw››œjžjjŸj ¡¢jjj£j¤——00000¥¦§¨©ª«¬%)­¦®¯%°0000±²³´µ¶¶·¸¹¹º»¼½¾¿ÀÁÂÃÄwÅÆÇÈÉÊËÌÍÎÏÎÐÑÒÓÔÕÖרÙÚÛÜÝÞß0à0áááááááááâááááÍááãáäåæçèéêëìíîïðñòóôõö÷øùáúûüýþÿw0000000000..€ß  0000       Þ              0             Þ                         !   "°#$0%&'.(à0000Z)*+,-¦.—/%01234456007´89jŸjjjj:; <=>000000000?—@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDBCBE‚F„„GHHHHHHHHßIJKLMNO0P00QR´STUV¹WXY Z [\]^._`abc‰d¸¸00àefàg000hwJ00.(à000ijk00¸—00000lmn00op0000q0000rstuvwxy000000000.«z{P|0«}~y—«1€000«4—00 ‚—000.0ƒ€„…†.00000y0000‡3ˆ«000000‰0000000šŠ‹Œ¸00000ßM¹‘Ž‘’“”Vw•–––—˜™š›œgžg000M        ÞŸ00 á¡ááá¢áá 0000£¤¥  ¦‰00  §¨   ! Þ ©ª0 §   «     ¬­   ®¯°±²( ³00000000´    µ000     000(       ¶00  !"""#$%$$&&'$$$$'&'()$*+,-.$$$$/////////////0$$/1&$$$$$&23 456 78-9--- '5'-$$$$$$$:&$$$&$&$$$$$$$$&&$$$5-; '+'&'&'&&&$$-5+5+&$$$+$$'$ 32 $$+'&$'&'&$55$+5+$+$$$'&&$$$ $$$$$+''&'$-++$&$$$$$$$ $$$$$$$5+5+$$$$$$'$-'&$&$'&&$'&$&$$$5$5$&$$+$$$$ &$$+'&&'$'55$$$+5$$$$$$$$'&'$-$$+5$$$&'&$$$$$$&'55&$$$+$$$$$<$'&$''$&$5$+55$&$$$$$=>>>>>>>>>>>>>>>>>>>>?$*>>>>>>>@ ;$$=??=??=$$$>>=>>>=>==$>=>>>>>>=>$>>??>>>$ $>> AABCD66E9,FF&$++5;-&AGHI$$ ; >>>'$$'$JJJJJJJJKKKKKKKKKKKKLLLLLLLLLLLL&$&&$&$&&$&&+$$$&$$$$$MN$;&5$$$$$)$$$$$$$$$$&$$$$$$>>;OMP>$ $$$6;6I&$$$$$$$$$&$6 >>>>>>>$>>?$$$$$>>>>>>$$>>>>>$$$ ?$>$>>>>>>>?>>>>>>?+--$$ ;;M&$-$$$$$Q;; $';---&$$$$5$$$$$$$$$$$$''''$&$'$& &;;;R;SR;TUVUVWXY!3333Z[\][M;;;^&$_N5$$$$$$$22`$$$abaa$$$$$$&$$$$&$$aaacaaadaeddaaaaaefdafeaefaefaafaefagacaaaU6FFFFFFFbFFFFFhhhhhhhhhhbFFF$$$$$i;Mj$$$')$$$$$$+&&UUUUUUU;;;;kUUFFFF;;9;Ml$$aaaaaaaaaaaaagaaaaa$$$$$aaaaaa$$mnaFFFFFaFFFFopaaaaaaaqaanrasttttaaaataaaaaaatttaaauaatv+w[rxttttaaaaatuanyr$$gaaaaaaaaaaaa$gaaaaaaaaaaaaaazaaaaaz$${{{{{{{{aaaaaanaaaaaaaaaaaz$aaaz$$$$j $$-$$$+;;$$$$$$$$$$--$$|$$$A6$$$$5$$$$;$$;$$$$$'JJJJJJ}$-;' $$$ $;>?$$$$$$$$$$$=>>;5$$$$'&'&'&$$$$$~~~~$$$$$$KKK€$LLLLLLLL$$‚‚‚‚‚‚‚‚$'$$ƒ„////1//////0//00/ƒ0/////$$$$$$$$'F$|$…†:‡ˆ$$$aa‰hhhhhhhm‰maaamN[6‰hhmaaazŠ‹$$&ŒiaaFammaaaaa[aaaaaa‰Žaaaaaa‰Ž‰pF]{{{{[$$$$&$aŠ‘&$$$$+’$'&';)$'$'$$$Q$$M$$$$$$&'&$&'Q$Q$$'$$$+5$$''$$5$+;;;;&$$$$Q;;;$&$$&$$$M$ -;;$$$$$$$5 ;;$$$$$$-M)$$$$$$$&$$$$$$“FpbFFp$$$$$$$+a$$$$$$$--$$$$$$&'&'&''''&'&&'&&&$$ '&&''&''$$$&$'''''&&''''''&&'&&'&&''''gaaaaaaz”$$&$$$$$•••••••••••••az$$$$$$aaaaz$$$z$$$$$$$aaagaaaaaacdaadaaazaaz$$zaaaaaaadddaaaaccdaaaaaaaaaagaz$daaaaaaacdaaaaaa$aaaa$$$$$$$$$gaaz$gaaaaa+$$$$$$$ $     $         %%%%        !!         & && &&& && "### !%%     && ''           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNK    !"#$%&'()$*+,-./01234567,85,69*:;<8=>?7@ABC#DEFGHIJGGKLMNOPQRS:+T:#UVW*<0$      !"#$% &%%#'(#)*+,$$+-./+0'**(1-+(--'*-+ ''2$  *(3 45 678 9('++(#*           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUUVWXYZ[\]^_`abcdefghi>jklm       !"#$%"#$%&'("#$)*"#$)*"#$)*+,-./012"#31245607"#89:;<=>?@ABCDEFGHIJKLMNOPCQRSTUVWXYPZ[\K]^__`abcDKdeQfg01hijklKgmno 9:pqrstuvwxyz{|}~€‚zƒ„g…†‡ˆ‰Š‹Œ"Ž"Ž"#‘’“”•012–—˜   1™#š›œ žŸž ¡¢£¤¥¦§¨©ª"#‘« ¬ ¬ ­1®F¯bC[°XXeIIPk±²!#%' !#%' .  (U^(U^ %' "$&%'(2?@ABCDEFGHIJKLMNOP##g's(^Ust%!(^2<F'2(%#'U^!!#%'  (!!(TUVWXYZ[\]^_`abcdefghijklmno PYbk(PUY^b(PUY^gk((((((Ãÿÿ?ÿÿÿ?y;xpüÿøÿÿùÿÿ?Â7:ð3üÿßSz0p€0¼þÿÿÿÿÏ¿ÿÿÿÿP|pˆ/<60ÿÿó~0P(¨  €       !"#$%%&&'()*+,-./0123456789:;<=>?@ABCDEFGHI,JE              !  "#$%%$ &' ( )* +,-. &/,(012  # 3 4( 5678! +,#9 : ' (%;                !"#$ %&'($ )&*($+,"-./0123456789:;<=>?@ABCDEFGHIJKLMNMNOLPQRSTU?VWXYZ[\]^_`abNcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽN‘’“”•–—˜™š›œ     !! ""#$% &'()*##+&& ,++-.& -/*,++012.$*34# *5"678$  9":;6< ) =>?@ABBCBBBBBBBBDEFGHIJ KLMNOPQRST6UVWXYXZ[#=\]^_`abcdeffghijcklEXmcnoOkpqrstuvwxyz{|}jc~ !€l‚ƒ„…†‡uˆY‚f‰klŠ‹ŒXŽYuQccc‘ ’T“ul”J•–c—˜Q-™ š›5œœXlžYœl?uŸ                                                      !"#$%&'()*+,-./0123456789:;<=>?@AA BBCDEFGHHHIJKKKLMMMMNOPQRSTUVWTUTUVWXYTUZ[TUTUTU\]^_`abc^defghiijjklmmmnnnoHHHHHIKKKKKLpqrs%tuvvvvwxRDDyz%{| }}}}}~~~~~      !"###$$%&'()'()'()*'()+,-./01123456789::;<:=>?@ABACDEFGGGHIIJKL!!!MNNNOPPQRSTUVWXYZ[\]^^^_`abcdefghijklmmnopqrstuvwxy---zzzzzzzz{{{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€‚ƒ„…†nnnnnnnnssssssssnnnnnnssssssnnnnssss‡‡ˆˆˆˆ‰‰ŠŠ‹‹ŒŒnnssŽŽ‘‘‘‘nn’ss““nn”vss••y––——˜™š›œžžžžžžžžŸŸŸŸŸŸŸŸŸŸ          ¡¢£¤¥¦§¨©ªª««««««««««««««««¬­®¯¯¯¯¯¯¯¯°°°°°°°°       !"#$%%&'()***+,,,,-./01211231111456789:;<<=>???*****+@ABCD /EFGHHHHH    !""#$%&'()*+,--------.//////////////////////0000000000000000123333333333333333333344567777533883399,::;;5<=>?@@@@@@@@AAAAAAAAAABCDEFGHIIJKLMMMMMMMM ‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0`ÆÿÿÿAâÿÿøÿÿÿ¶ÿÿÿ÷ÿÿÿûãÿÿªÿÿÿœÿÿÿÿÿÿ€ÿÿÿ‚ÿÿÿ£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿ(         !"#$%&'())*+,-.///0122223456787789:7;<=>?@ABCDEFGHIJKLMNNOPQQQ/////0RSTUV$W++XYZ[\]]]]]      !"#$$$%&&'()*+,-./01233333333455555555555555555555556777777777777777789:;<=>??????????????@ABC????DDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJKLMN??OOPQRSTUVWWWWXYZ[\??]]^_`ab??cc2defghiijjklmnoppppppppqqqqqqqqqqrstuvwxyyz{|}~€‚ƒ„…†‡ˆ‰‰‰‰‰‰‰‰ø¶¡fMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| ˆ düÿ‹A…B x Å A @ÌüÿCA…B u Å D zR| ˆÔüÿ 0ÐüÿDÌüÿ XÄüÿ lÀüÿ€Àüÿ ”¸üÿ ¨°üÿ¼¬üÿ Фüÿä”üÿøüÿ €üÿ. œüÿ4˜üÿ#H¨üÿJ(\àüÿÇA†A ƒC S  AÃAÆB ˆ|üÿ!,œŒüÿŠA†A ƒC0I  AÃAÆD ,Ìèüÿ‚A†A ƒC0D  AÃAÆA Dü<üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇDDxüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ,Œ´üÿ‚A†A ƒC0D  AÃAÆA ,¼üÿŠA†A ƒC0I  AÃAÆD ìdüÿ+|üÿ'üÿ( üÿr|<lüÿÍA…A ‡A†AƒC@i AÃA ÆAÇAÅD h AÃAÆ AÇAÅD l AÃAÆ AÇAÅD lAÃAÆ AÇAÅ|¼¼üÿÎA…A ‡A†AƒC@i AÃA ÆAÇAÅD i AÃAÆ AÇAÅC m AÃAÆ AÇAÅC mAÃAÆ AÇAÅ< üÿ 8Püÿ[A…A ‡A†AƒCOAÃA ÆAÇAÅ<Œ$üÿïA‡A †Aƒ}  ÃAÆAÇB hà AÆAÇ,ÌÔüÿBA†A ƒj ÃAÆC PÃAÆüèüÿ àüÿ$Ôüÿ8ÈüÿL¼üÿ`°üÿt¤üÿˆ˜üÿœŒüÿ€°€üÿTA…A ‡A†AƒC0Z AÃA ÆAÇAÅC o AÃAÆ AÇAÅA à AÃAÆ AÇAÅD g AÃAÆ AÇAÅA 4Püÿ7AƒCqAà ThüÿVAƒs ÃD ]ÃxœüÿŒüÿfC0Y D E¬ØüÿPÀÜüÿ5A…A ‡A†AƒCp¨ AÃA ÆAÇAÅA |AÃAÆ AÇAÅ4À üÿ\A†A ƒC0w  AÃAÆB Y AÃAÆ4Lä üÿ„A‡A †AƒC c A ÃAÆAÇD („0 üÿ4AƒC Y AÃB RAð8 üÿ4Ä8 üÿJA‡A †AƒC s A ÃAÆAÇD (üL üÿ/AƒC b AÃA EAÃ4(P üÿ!AƒC e AÃB z AÃA p AÃC ,`< üÿŠA†A ƒC0I  AÃAÆD ,˜ üÿ‚A†A ƒC0D  AÃAÆA DÀì üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ (üÿ8 Lüÿ0 @üÿC \ A V B lP ¤üÿ…A…A ‡A†AƒC`R AÃA ÆAÇAÅA c AÃAÆ AÇAÅC × AÃAÆ AÇAÅA À ¼üÿÔ ¸üÿdè ¸üÿÁA…A ‡A†AƒC@ AÃA ÆAÇAÅD K AÃAÆ AÇAÅA PAÃAÆ AÇAÅPP üÿ‰A…A ‡A†AƒC@f AÃA ÆAÇAÅC PAÃAÆ AÇAŤ LüÿC R(¼ LüÿHA†A ƒC0{  AÃAÆB 8è hüÿýA†A ƒC v  AÃAÆC `  AÃAÆB h$ ,üÿA…A ‡A†AƒC0™ AÃAÆ AÇAÅD | AÃA ÆAÇAÅD S AÃAÆ AÇAÅA h ÔüÿõA…A ‡A†AƒC0… AÃAÆ AÇAÅD u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA hü `üÿíA…A ‡A†AƒC0€ AÃAÆ AÇAÅA u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA <h äüÿLA…A ‡A†AƒC@u AÃA ÆAÇAÅA <¨ ðüÿOA…A ‡A†AƒC@{ AÃA ÆAÇAÅA è üÿAƒCYAà üÿC Z( üÿ A†A ƒC W AÃAÆ4L üüÿAƒC0g AÃD W AÃD W AÃD <„ ØüÿA…A ‡A†AƒC@ç AÃA ÆAÇAÅA hÄ ¬üÿA…A ‡A†AƒC0¡ AÃAÆ AÇAÅD B AÃA ÆAÇAÅB S AÃAÆ AÇAÅA l0`üÿ‚A‡A †AƒC0H A ÃAÆAÇC l Aà AÆAÇA  Aà AÆAÇB N Aà AÆAÇC H tüÿ>A†A ƒC0Y  AÃAÆD c  AÃAÆC N  AÃAÆD ìhüÿ hüÿAƒC e AÃB <$ÔüÿA…A ‡A†AƒC@Û AÃA ÆAÇAÅB d´üÿ4AƒC mAÄÈüÿ4AƒC mAÃD¤Üüÿ‡A‡A †AƒC0O A ÃAÆAÇD E Aà AÆAÇD DìüÿšA‡A †AƒC0s A ÃAÆAÇD N Aà AÆAÇC P4püÿeA…A ‡A†AƒCPs AÃA ÆAÇAÅB N AÃAÆ AÇAÅB <ˆ„!üÿAA…A ‡A†AƒC0ö AÃA ÆAÇAÅC 8Ȉ"üÿaA†A ƒC Q  AÃAÆD d  AÃAÆB 8°"üÿ]A†A ƒC R  AÃAÆC a  AÃAÆA (@Ô"üÿqA†A ƒC Q  AÃAÆD (l#üÿqA†A ƒC R  AÃAÆC 4˜d#üÿTA†A ƒC0B  AÃAÆC E AÃAÆ8Ѐ#üÿAA…A ‡A†AƒC uAÃA ÆAÇAÅ\ ˆ#üÿ³AƒC P AÃC w AÃD Q AÃB Z AÃE F AÃE F AÃE F AÃE 8lÜ#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇ8¨Ô#üÿ8A‡A †AƒS  ÃAÆAÇD Yà AÆAÇ8äÐ#üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇP È#üÿvA…A ‡A†AƒC@d AÃA ÆAÇAÅA } AÃAÆ AÇAÅC Ttì$üÿA…A ‡A†AƒCPQ AÃA ÆAÇAÅD q AÃAÆ AÇAÅC |̬%üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|L(&üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ4̤&üÿIAƒN ÃA P ÃH D ÃH D ÃH DÃ|¸&üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|„4'üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ<°'üÿÿA…A ‡A†AƒC@n AÃA ÆAÇAÅC hDp*üÿ A…A ‡A†AƒCpv AÃA ÆAÇAÅC e AÃAÆ AÇAÅA n AÃAÆ AÇAÅA X°4üÿÔA‡A †Aƒ[  ÃAÆAÇD p à AÆAÇB y à AÆAÇA }à AÆAÇX €4üÿåA‡A †Aƒ_  ÃAÆAÇD u à AÆAÇA ~ à AÆAÇD ~à AÆAÇdh 5üÿóA‡A †AƒAm A ÃAÆAÇD w Aà AÆAÇB x Aà AÆAÇA Aà AÆAǀИ5üÿXA…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB O AÃAÆ AÇAÅA R AÃAÆ AÇAÅB €Tl6üÿ`A…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB S AÃAÆ AÇAÅA V AÃAÆ AÇAÅB hØH7üÿüA‡A †AƒAm A ÃAÆAÇD | Aà AÆAÇA y Aà AÆAÇD @Aà AÆAÇ|DØ7üÿõA…A ‡A†AƒC@{ AÃA ÆAÇAÅB p AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|ÄP8üÿöA…A ‡A†AƒC@{ AÃA ÆAÇAÅB q AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅlDÈ8üÿÊA…A ‡A†Aƒj ÃA ÆAÇAÅC j ÃAÆ AÇAÅC n ÃAÆ AÇAÅC nÃAÆ AÇAÅ|´$9üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅ|48:üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅl´L;üÿËA…A ‡A†Aƒj ÃA ÆAÇAÅC k ÃAÆ AÇAÅB o ÃAÆ AÇAÅB oÃAÆ AÇAÅ<$¨;üÿcA…A ‡A†AƒCpC AÃA ÆAÇAÅA <dÌ<üÿšA…A ‡A†AƒCpY AÃA ÆAÇAÅA H¤(>üÿ‰A…A ‡A†Aƒi ÃA ÆAÇAÅD C ÃAÆ AÇAÅB <ðh>üÿkA‡A †Aƒ| à AÆAÇC [  ÃAÆAÇC 00”>üÿTA†A ƒa ÃAÆD Q ÃAÆB <d´>üÿsA‡A †AƒX  ÃAÆAÇC I à AÆAÇA 0¤è>üÿoA†A ƒU ÃAÆD I ÃAÆB 0Ø$?üÿoA†A ƒU ÃAÆD I ÃAÆB  `?üÿ d?üÿ1C U D T@x?üÿ%<TŒ?üÿôA…A ‡A†AƒC0V AÃA ÆAÇAÅC <”@@üÿºA…A ‡A†AƒCPZ AÃA ÆAÇAÅC Ô¼DüÿFC R C a C HôäDüÿ,A†A ƒC0k  AÃAÆB •  AÃAÆA S  AÃAÆC D@ÄEüÿ’A‡A †AƒCpq A ÃAÆAÇB | Aà AÆAÇA (ˆFüÿ/AƒC T AÃC QAÃT´Füÿ!A…A ‡A†AƒC`Y AÃA ÆAÇAÅA o AÃAÆ AÇAÅA < àGüÿ]A…A ‡A†AƒCPw AÃA ÆAÇAÅB €L Lüÿ_A…A ‡A†AƒC€¥ AÃA ÆAÇAÅA K AÃAÆ AÇAÅA © AÃAÆ AÇAÅA «AÃAÆ AÇAÅTÐ ÜQüÿHA…A ‡A†AƒCp] AÃA ÆAÇAÅA w AÃAÆ AÇAÅA l(!ÌSüÿøA…A ‡A†AƒCp‰ AÃA ÆAÇAÅD W AÃAÆ AÇAÅA M AÃAÆ AÇAÅC <˜!TYüÿiA…A ‡A†AƒC0b AÃA ÆAÇAÅC (Ø!€\üÿ"A†A ƒA\ AÃAÆ4"x\üÿ¸A‡A †AƒC u A ÃAÆAÇB h<"ø\üÿÆA…A ‡A†AƒC`q AÃA ÆAÇAÅD M AÃAÆ AÇAÅA oAÃAÆ AÇAÅd¨"T^üÿBA…A ‡A†AƒC`y AÃA ÆAÇAÅD Ò AÃAÆ AÇAÅA ^AÃAÆ AÇAÅd#0_üÿfA…A ‡A†AƒC`y AÃA ÆAÇAÅD ã AÃAÆ AÇAÅA qAÃAÆ AÇAÅhx#0`üÿžA…A ‡A†AƒC`q AÃA ÆAÇAÅD ' AÃAÆ AÇAÅA mAÃAÆ AÇAÅdä#daüÿVA…A ‡A†AƒC`s AÃA ÆAÇAÅB í AÃAÆ AÇAÅA _AÃAÆ AÇAÅTL$Tbüÿ/A…A ‡A†AƒC0n AÃA ÆAÇAÅC E AÃAÆ AÇAÅC <¤$,cüÿËA…A ‡A†AƒC0¸ AÃA ÆAÇAÅA Dä$¸cüÿÕA‡A †AƒC • A ÃAÆAÇB S Aà AÆAÇB ,%Hdüÿ @%@düÿ TT%8düÿ¯A…A ‡A†AƒCPê AÃA ÆAÇAÅC © AÃAÆ AÇAÅC h¬%iüÿêA…A ‡A†AƒF E AÃA ÆAÇAÅA x AÃAÆ AÇAÅD QAÃAÆ AÇAÅ &jüÿrC | A ^ B Q<&`jüÿVCv C Y\&˜jüÿVCu D YX|&Ðjüÿ¬A‡A †AƒC0l A ÃAÆAÇC N Aà AÆAÇC X Aà AÆAÇA „Ø& küÿ­A…A ‡A†AƒF°Q AÃA ÆAÇAÅA H AÃAÆ AÇAÅD % AÃAÆ AÇAÅC J AÃAÆ AÇAÅB T`'Hmüÿ˜A…A ‡A†AƒC` AÃAÆ AÇAÅA T AÃA ÆAÇAÅD (¸'ˆnüÿ3AƒC X AÃC QAÃ<ä'nüÿÙA…A ‡A†AƒC@… AÃA ÆAÇAÅD D$(,oüÿžA‡A †AƒC q A ÃAÆAÇB L Aà AÆAÇA Dl(„oüÿªA‡A †AƒC { A ÃAÆAÇD L Aà AÆAÇA T´(èoüÿA…A ‡A†AƒC@¡ AÃA ÆAÇAÅD p AÃAÆ AÇAÅD l )˜püÿ<A…A ‡A†AƒC0s AÃA ÆAÇAÅB P AÃAÆ AÇAÅD D AÃAÆ AÇAÅD <|)dqüÿdA…A ‡A†AƒC0S AÃA ÆAÇAÅB T¼)ˆqüÿ†A…A ‡A†AƒC0j AÃAÆ AÇAÅC E AÃA ÆAÇAÅA T*¸qüÿÔA…A ‡A†AƒC0N AÃA ÆAÇAÅC I AÃAÆ AÇAÅC Tl*4rüÿÀA…A ‡A†AƒC0A AÃA ÆAÇAÅD Y AÃAÆ AÇAÅC TÄ*œrüÿ]A…A ‡A†AƒCPJ AÃAÆ AÇAÅC E AÃA ÆAÇAÅC <+¤tüÿhA…A ‡A†AƒC0c AÃA ÆAÇAÅB <\+ÌtüÿtA…A ‡A†AƒC0d AÃA ÆAÇAÅA lœ+uüÿ3A…A ‡A†AƒCL AÃA ÆAÇAÅA u AÃAÆ AÇAÅC ‹ AÃAÆ AÇAÅA p ,ĆüÿìA…A ‡A†AƒFÐ4 AÃA ÆAÇAÅB  AÃAÆ AÇAÅB § AÃAÆ AÇAÅA @€,<Žüÿ[A‡A †AƒC j A ÃAÆAÇA _A ÃAÆAÇPÄ,TŽüÿŠA…A ‡A†AƒC@l AÃA ÆAÇAÅA MAÃAÆ AÇAÅD-ŒŽüÿqA‡A †AƒC H Aà AÆAÇC YA ÃAÆAÇ8`-¸Žüÿ¬A…A ‡A†AƒC0 AÃA ÆAÇAÅTœ-(üÿºA…A ‡A†AƒC0­ AÃAÆ AÇAÅD N AÃA ÆAÇAÅB |ô-ŒüÿùA…A ‡A†AƒC0u AÃA ÆAÇAÅD p AÃAÆ AÇAÅD x AÃAÆ AÇAÅD xAÃAÆ AÇAÅ|t.‘üÿúA…A ‡A†AƒC0u AÃA ÆAÇAÅD q AÃAÆ AÇAÅC y AÃAÆ AÇAÅC yAÃAÆ AÇAÅ<ô.„‘üÿîA…A ‡A†AƒC@X AÃA ÆAÇAÅA T4/4–üÿA…A ‡A†AƒCp{ AÃA ÆAÇAÅB [ AÃAÆ AÇAÅA DŒ/Ü—üÿ A‡A †AƒC Ÿ A ÃAÆAÇD [ Aà AÆAÇB 4Ô/ ˜üÿjA†A ƒC0~  AÃAÆC _ AÃAÆ< 0Ô˜üÿAƒC F AÃA E AÃB d AÃC QAÃDL0$™üÿ¨A‡A †AƒC@‰ A ÃAÆAÇB PAà AÆAÇ(”0„™üÿ6AƒC a AÃB LAÃ,À0™üÿwA†A ƒC0Y  AÃAÆD ð0Ø™üÿ4AƒC U AÃB P1è™üÿÏA…A ‡A†AƒC@k AÃA ÆAÇAÅB ^ AÃAÆ AÇAÅB @h1dšüÿOA‡A †AƒC r A ÃAÆAÇA OAà AÆAÇh¬1pšüÿ­A…A ‡A†AƒC@k AÃA ÆAÇAÅB J AÃAÆ AÇAÅB N AÃA ÆAÇAÅF 2´šüÿ,2´šüÿ@2´šüÿT2´šüÿh2´šüÿ|2´šüÿ2´šüÿ@¤2´šüÿSA‡A †AƒC r A ÃAÆAÇE OA ÃAÆAÇhè2Äšüÿ½A…A ‡A†AƒC@b AÃA ÆAÇAÅG S AÃA ÆAÇAÅA X AÃA ÆAÇAÅH TT3›üÿ@A…A ‡A†AƒC@Ü AÃA ÆAÇAÅA P AÃAÆ AÇAÅD |¬3œüÿKA…A ‡A†AƒC@© AÃA ÆAÇAÅD b AÃAÆ AÇAÅB T AÃAÆ AÇAÅD JAÃAÆ AÇAÅT,4Ìœüÿ|A…A ‡A†AƒC` AÃA ÆAÇAÅA P AÃAÆ AÇAÅD <„4ðüÿãA…A ‡A†AƒCPm AÃA ÆAÇAÅD TÄ4”žüÿhA…A ‡A†AƒC@ AÃA ÆAÇAÅA d AÃAÆ AÇAÅD 5¤ŸüÿKC ] D ] C ,<5ПüÿQAƒC b AÃA H AÃC Tl5ôŸüÿA…A ‡A†AƒC€B AÃA ÆAÇAÅC U AÃAÆ AÇAÅC Ä5,¡üÿHØ5 ¡üÿeA‡A †AƒC@* A ÃAÆAÇA _ Aà AÆAÇB œ$6<¢üÿòƒA…A ‡A†AƒFÀÄ AÃA ÆAÇAÅB J AÃAÆ AÇAÅB È AÃAÆ AÇAÅD Ð AÃAÆ AÇAÅD  AÃAÆ AÇAÅA TÄ6%ýÿAA…A ‡A†AƒCpÕ AÃA ÆAÇAÅD o AÃAÆ AÇAÅA H7|,ýÿYA‡A †AƒC0¯ A ÃAÆAÇD ¸ Aà AÆAÇA h7Œ.ýÿ7C T A S A ˆ7¤.ýÿ5C T A N B H¨7¼.ýÿ÷A‡A †AƒC | A ÃAÆAÇC @ Aà AÆAÇA ô7h/ýÿ8d/ýÿ=C Y D N B (8„/ýÿ l<8|/ýÿÒA…A ‡A†AƒFÀ_ AÃAÆ AÇAÅC Z AÃA ÆAÇAÅB  AÃAÆ AÇAÅC T¬8à2ýÿA…A ‡A†AƒF v AÃA ÆAÇAÅD j AÃAÆ AÇAÅB T9¨6ýÿ0A…A ‡A†AƒF°k AÃA ÆAÇAÅC X AÃAÆ AÇAÅD \9€8ýÿ)p9˜8ýÿ)„9°8ýÿ),˜9È8ýÿpA†A ƒC0N  AÃAÆC „È99ýÿì A…A ‡A†AƒF€  AÃA ÆAÇAÅB d AÃAÆ AÇAÅD l AÃAÆ AÇAÅD 7 AÃAÆ AÇAÅA P:lCýÿÂC`¶ C Ep:DýÿÂC`¶ C E:´DýÿÂC`¶ C E°:XEýÿÂC`¶ C E<Ð:üEýÿ9A…A ‡A†AƒCP_ AÃA ÆAÇAÅB T;øGýÿ©A…A ‡A†AƒC@… AÃA ÆAÇAÅA O AÃAÆ AÇAÅA zR| ˆ4LýÿU0xLýÿTD¸LýÿUXüLýÿWl@MýÿW€„MýÿW”ÈMýÿh¨Nýÿe¼pNýÿmAƒkÃØÄNýÿmAƒkÃôOýÿmAƒkÃlOýÿh$ÀOýÿh8PýÿhLhPýÿh`¼PýÿhtQýÿhˆdQýÿeœ¸Qýÿh° RýÿeÄ`RýÿhØ´RýÿeìSýÿh\Sýÿe°Sýÿh(Týÿh<XTýÿhP¬TýÿhdUýÿhxTUýÿhŒ¨Uýÿh üUýÿh´PVýÿhȤVýÿeÜøVýÿeðLWýÿh WýÿhôWýÿe,HXýÿe@œXýÿhTðXýÿhhDYýÿh|˜YýÿhìYýÿh¤@Zýÿh¸”ZýÿmAƒkÃÔèZýÿhè<[ýÿhü[ýÿhä[ýÿh$8\ýÿh8Œ\ýÿhLà\ýÿh`4]ýÿhtˆ]ýÿhˆÜ]ýÿhœ0^ýÿe°„^ýÿZÄÌ^ýÿTØ _ýÿTìL_ýÿW_ýÿWÔ_ýÿZ(`ýÿW<``ýÿUP¤`ýÿTdä`ýÿTx$aýÿhŒxaýÿU ¼aýÿW(´býÿ0AƒA b AÃC FAÃàbýÿôøaýÿ ðaýÿAU ðaýÿ'A[ D F(@øaýÿ5AƒA j AÃC CAÃ(lbýÿ9AƒA n AÃC CAÃ(˜býÿDAƒA w AÃB FAÃ(Ä,býÿ0AƒA b AÃC FAÃ$ð0býÿ§A†A ƒŠ ÃAÆC °býÿRAƒPÃ$4èbýÿ—A†A ƒƒ ÃAÆB zR| ˆˆNˆhˆ|ˆŒˆžˆ®ˆ¾ˆÔˆæˆþˆ‰&‰@‰V‰n‰|‰Œ‰ž‰®‰¾‰Ú‰ö‰Š(Š:ŠJŠZŠtŠ†Šœƒ´ƒ̃܃ðƒ„„6„D„V„f„t„„„Ž„š„¤„®„¶„À„ʄԄބæ„î„ø„……"…@…T…j…€……¤…¶…Ä…Ö…ä…ò…††2†@†P†b†t†††ž†²†Ɔ܆‡*‡8‡J‡\‡l‡„‡–‡¨‡¶‡ƇÖ‡ê‡þ‡ˆ$ˆ>ˆNˆhˆ|ˆŒˆžˆ®ˆ¾ˆÔˆæˆþˆ‰&‰@‰V‰n‰|‰Œ‰ž‰®‰¾‰Ú‰ö‰Š(Š:ŠJŠZŠtІŠÏDeleteCriticalSectionìEnterCriticalSectionþGetLastErrorGetModuleHandleAAGetProcAddressÞInitializeCriticalSection.LeaveCriticalSection•TlsGetValue½VirtualProtect¿VirtualQuery8__dllonexitF__mb_cur_max¿_errno!_isctype¡_pctype„fflush“freeÄmallocËmemmovetolowertoupper _iobGabortScallocyfwriteìvfprintfPyArg_ParseTuple PyArg_ParseTupleAndKeywordsPyBuffer_Release+PyBytes_FromObject,PyBytes_FromString0PyBytes_Type<PyCallable_CheckzPyDict_Contains{PyDict_CopyPyDict_GetItem†PyDict_New‡PyDict_NextˆPyDict_SetItem‰PyDict_SetItemString’PyErr_CheckSignals“PyErr_Clear—PyErr_Format›PyErr_NoMemoryPyErr_Occurred°PyErr_SetStringÍPyEval_RestoreThreadÎPyEval_SaveThreadäPyExc_IndexErrorñPyExc_RuntimeErrorùPyExc_TypeErrorPyExc_ValueErrorIPyImport_ImportModuleZPyList_Append`PyList_NewaPyList_ReversebPyList_SetItemiPyLong_AsLongoPyLong_AsUnsignedLonguPyLong_FromLong†PyMapping_Keys“PyMem_Free”PyMem_Malloc•PyMem_Realloc§PyModule_Create2©PyModule_GetDictñPyObject_CallöPyObject_CallObjectøPyObject_ClearWeakRefsþPyObject_FreePyObject_GetAttrStringPyObject_GetItem PyObject_InitPyObject_MallocPyObject_ReprPyObject_SizeRPySequence_GetSliceaPySet_ContainsiPySlice_GetIndicesExkPySlice_Type’PyThread_acquire_lock”PyThread_allocate_lock™PyThread_free_lockžPyThread_release_lock­PyTuple_New®PyTuple_Pack¯PyTuple_SetItem±PyTuple_Type¹PyType_Ready PyUnicodeUCS2_FromObjectPyUnicodeUCS2_FromStringPyUnicodeUCS2_FromUnicodePyUnicodeUCS2_Join1PyUnicode_Type:Py_BuildValueŠ_PyBytes_Join_PyUnicode_ToLowercase_Py_FalseStruct_Py_NoneStruct€€€€€€€€€€KERNEL32.dll€€€€€€€€€€€msvcr90.dll(€(€(€(€(€msvcrt.dll<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€python32.dllø¶¡fĶ¡f ¤f ¤f(`¤f¤fP 00(0=0ˆ0¹0È0Í0B1J1j1r11Ÿ1¶1½1Å1Ð1â1ø12+2A2Ì3ã3²8ó8¿b>x>‹>¾>Ö>Û>æ>÷>???&?+?6?J?O?Z?n?s?~?Œ?‘?š?¨?­?¸?È?Í?Ø?ú?ÿ?0Ì 000&04090B0M0\0a0l0y0~0ˆ0˜00¨0î0 1:1e1€1†1þ12:2e2y22ö2 3-3U3i3o3È3ò34E4_4‚4Ÿ4¶4Á4Õ495U5c6¥67b77´7"8W8Œ89œ9¢9»9í9:]:Œ:’:­:Ä: ;.;t;„;²;ê;I<‰<¿<è<7=u=¦=Ú=ó=ù=>$>>Š>Ï>í>?,?P?l?ƒ?Š??§?@<0'0d0x0¥0µ0Ï0ô01B1O11ï12 22*2Š2 3f3¨36‚7ï8ê;9>P c1`á=÷= >>p844$444Ê4ä4ì4ñ4ü4$51595E5M5R5]5¥5å5í567É778€4¹4B5,99%9.9;ÿ; <>>,>$? \¾0Ä0Ý0ã0-121„1‰12 22-2G2M2€22313V344°4À4Í4Ü4ì4ù485?5K6x6}6‘6±6š7Ù7}8³9*:‹:^;c<° [1K>À8_2Æ3Ö34G4X4Ž4¢4¸4Á4Ê4Ò4Û4ì5ž6ª6;8€8899+9x9C;Ðh1}6]7x7£7µ7à7é7ñ7ú7ˆ8ë89‡9µ9ß9ó9û9: :‘:Õ:Û:ð:; ;5;J;½;Ï;ê;Â<1=E=Y=m==•=©=,>N>v>©>Ý>?I?q?àt0,0C0^0x0œ0d1x1€1•1£1È172è2ú2A3V3r3Œ3©3Å3ê3ƒ4)545J5v55¦5Ó566:6‰6–6ž6§6727I7o7“7›7°7Ð7Ù7á7ê7¹8»;ï<ÿð H=c= 6§6 µ1½1+3§4ë5×70 ·6r?@ ¤6r=P ?v?`p1}1µ1½1Í1Õ1`8Ç:é;pT1p1623©3á3ì3t4e5‡5Ì5f6z6ž6…7ã7.88•8°8s9:&:Ž:º:Î; <=?§?â?€l-0‚0š0Ž1®1Â1`2Œ2¸2Ð2Õ2í24N5é5ø5@6L6 6=7°7¶7&8þ8E9u9‚9J:c: ;&;L;z;·<½<ëp>x>>ð>4? >>)>?>i>t>„>‘>§>Î>Ù>é>ö> ?9?D?T?a?w?ž?©?¹?Æ?Ü? ˜ 00$010G0q0y0‰0–0¬0Ù0ä0ô011>1I1Y1f1|1©1´1Ä1Ñ1ç122,292O2v22”2¡2·2Þ2é2ü2 33F3Q3d3q3‡3®3¹3Ì3Ù3ï34!444A4W44Œ4œ4©4¿4é4ô455'5N5V5i5v5Œ5¶5¾5Ñ5Þ5ô5!6,6<6I6_6†6‘6¤6±6Ç6î6ù6 77,7V7a7q7~7”7¾7É7Ü7é7ÿ7&818D8Q8g8Ž8™8¬8¹8Ï8ö899!979^9i9|9‰9Ÿ9Æ9Ñ9ä9ñ9:/:::M:]:s:ž:©:¼:É:ß:;;$;1;G;q;|;Œ;™;¯;Ù;ä;ô;<<>>F>Q>d>q>‡>®>¹>É>Ö>ì>?!?4?D?Q?r?}??š?§?Æ?Ñ?á?î?û?°<0%080E0R0r0}000ª0Ê0Õ0è0ø01&111D1Q1^1~1‰1œ1¨1´1Ö1á1ñ1þ1 2*252E2R2_2~2‰2œ2©2¿2æ2ñ2333>3I3\3i3v3 55(555A5I5­5¸5È5Õ5Ü5 66$616:6B6T6~6†6Ž6–6ž6¦6®6¶6¾67 7-737I7™7·7³8Æ8Ú8ã8è8ò8ý8999=9N9W9z9…99º9Ù9ù9&:@:^:~::Ÿ:¨:Á:Ó:Ý:ø: ;;1;C;O;„; ;Ø;ã;ì;ó;<'<3=F=N=V=^=f=n=v=Š=œ=À¤000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1Œ1`2d2l2p2t2|2€2„2Œ22”2œ2 2¤2¬2°2´2¼2À2Ä2Ì2Ð2Ô2Ü2à2ä2ì2ð2ô2ü233 3333 3$30343`3p3t3„3ˆ3˜3œ3¬3à3ä3ì3,4ä4è455 5555 5$5,50545<5@5D5L5P5T5\5`5d5l5p5t5|5€5„5Œ55”5œ5 5¤5¬5°5´5¼5À5Ä5Ì5Ð5Ô5Ü5à5ä5ð5ô566 60646D6H6X6€6„6Œ6”6˜6 6¨6¬6´6¼6À6È6 7à7ä7ì7ð7ô7ü78888@8P8Œ8`9d9l9p9t9€9„9 9°9ô9:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;8;<;@;D;H;P;T;X;`;d;h;p;t;x;|;€;„;Œ;;”;˜;œ; ;¨;¬;°;´;¸;¼;Ä;È;Ì;Ð;Ô;Ø;à;ä;è;ì;ô;ü;àÄ€:„::”: :¤:°:´:À:Ä:Ð:Ô:à:ä:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<ˆ333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|3€3„3ˆ3Œ33”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü3444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4€4„4ˆ4Œ44”4˜4œ4 4¤4¨4¬4°4´4¸4¼4À4Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4è4ì4ð4ô4ø4ü4555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ5Œ55”5˜5œ5 5¤5¨5¬5°5´5¸5¼5À5Ä5È5Ì5Ð5Ô5Ø5Ü5à5ä5è5ì5ð5ô5ø5ü5666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|6€6„6ˆ6Œ66”6˜6œ6 6¤6¨6¬6°6´6¸6¼6À6Ä6È6Ì6Ð6Ô6Ø6Ü6à6ä6è6ì6ð6ô6ø6ü6777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|7€7„7ˆ7Œ77”7˜7œ7 7¤7¨7¬7°7´7¸7¼7À7Ä7È7Ì7Ð7Ô7Ø7Ü7à7ä7è7ì7ð7ô7ø7ü7888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8€8„8ˆ8Œ88”8˜8œ8 8¤8¨8¬8°8´8¸8¼8À8Ä8È8Ì8Ð8Ô8Ø8Ü8à8ä8è8ì8ð8ô8ø8ü8999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|9€9„9ˆ9Œ99”9˜9œ9 9¤9¨9¬9°9´9¸9¼9À9Ä9È9Ì9Ð9Ô9Ø9Ü9à9ä9è9ì9ð9ô9ø9ü9::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>8?ˆÁÓúˆÐƒàévÿÿÿº€ˆÁÓúˆÐƒàébÿÿÿºpˆÁÓúˆÐƒàéNÿÿÿ‹T$‹D$ƒøvf…Ò”ÀÉD$‰T$éÿÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè¨ÿÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè]ÿÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mèÿÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$MèÙþÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè—þÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$MèYþÿÿ„À•À1øƒÄ[^_ÃvWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèKýÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$Mè ýÿÿ„À•À1øƒÄ[^_ÃvVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèÈüÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè…üÿÿ„À•ÀŠT$ë¾fVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèDüÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mèùûÿÿ„À•ÀŠT$ë¶f‹D$Pöƒúv=…t=( t=) ”ÀððËD$ƒøItƒøit=0t=1”ÀÃf°ðËD$‹T$‰ƒøItIÇBIƒøit!ÇBi=0uS¸¹ Ç 1ÃÇB0¸¹ Ç 1ÃvÇBiÇB0¸ …@Ç 1ÃÇB 0=1¸uÜÊH.Q÷€úTv ‹P …Òt>öÒÿ$•œ0Âff‹P(‹R…Òtè‹ëÒf‹ŠJ.ƒéF€ùwÕ‰ÐËP(‹J…ÉtÈ‹@Ãf€ùAw½¶Éÿ$ð1Âf‹ŠQ.€út€úDu£‰ÈÃfUWVSƒì,Š\$@ˆ\$‹˜œ ‹s ‹x8‹@4ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ërëC9ët¶‰$ÿÖ:D$uí‰Ú)ú‰ÐƒÄ,[^_]Ãv—,9ër ëƒÃ9Ýv ‹‰$ÿÖ:D$uì‰Ú)úÁú‰ÐƒÄ,[^_]ÃvW,O9ër ëƒÃ9Ýv·‰$ÿÖ:D$uë‰Ú)úÑú‰ÐƒÄ,[^_]ÃvUWVSƒì,Š\$@ˆ\$‹˜œ ‹s ‹x8‹@4ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ëwëK9ët¶Cÿ‰$ÿÖ:D$uì‰Ú)ú‰ÐƒÄ,[^_]Ãf—,9ëw ëƒë9Ýs‹Cü‰$ÿÖ:D$uë‰Ú)úÁú‰ÐƒÄ,[^_]ÃfW,O9ëw ëƒë9Ýs·Cþ‰$ÿÖ:D$uê‰Ú)úÑú‰ÐƒÄ,[^_]Ãf‹D$ 9D$”ÀÃUWVSƒì‹‹R‰$ƒút?‹Œ ‰T$~'‹r‹Z ‹HH1Ò‹<Ö‹lÖ‰9‰i‹<“‰yBƒÁ;$uå‹L$‹‰Œ ƒÄ[^_]ÃWVS‹‹s$…Òtx‹ …Étm¹ë0v<[»‹xTŸÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 r6‹Š9ÞÌ)ó›‹¸È ßÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 sÊ[^_Ã…ö~+‹PTƒÂ1ÉÇÇBÿÿÿÿÇBÇBÿÿÿÿAƒÂ49ñuÝ‹Kx…É~Å‹€È ƒÀ1ÒvÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿBƒÀ(9ÊuÝ[^_ÃVS‹ˆ° ‹I(‹\‘‹°Ä Þ;q w ‹t‘9´´ r1À[^Ãf˜Ð ;˜Ô –À[^Ãf‹D$‹@0@Ãv‹D$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿÃUWVSƒì‰Æ‰Ó1ÿ‹C,¨ …4€{.Zv‹ëëf¶S.ÿ$•ø2Âf‹‰ðèÇÿÿÿ‰Å‹S‰ðè»ÿÿÿf9ïs‰ïf9øv‰Ç‰øƒÈ f‰C,‰øƒÄ[^_]Ãf‹C(ƒxÿ•D$„Ž‹S‰ðè|ÿÿÿ‹S(‹‹ndTU½fƒ fƒøtfƒ €|$„fƒÿ‚Df9ïs‰ïf9øv‰Ç‹C, øƒÈ f‰C,‰øƒÄ[^_]Ë¿é%ÿÿÿ‹‰ðèÿÿÿ‰Å‹S‰ðèÿÿÿf9ïs‰ï·×·È‰Ö9Ê}‰Îƒþ޽9ʌ͉úƒÊ éµv‹C(‹h‹‰ðèÁþÿÿ‹S(‹‹NdQf‹ ‰ÎƒÎf‰2fƒøtƒÉf‰ E„Ðfƒÿs¿f9øw8‰øfƒÿs0¸ë)‹S‰ðènþÿÿ‰Å‹‰ðècþÿÿ‰Â‰øf9ïs‰èf9Âv‰Ð‰ÂƒÊ f‰S,ƒÄ[^_]Ãvfƒÿƒêþÿÿ¿éàþÿÿº0¿f‰S,‰øƒÄ[^_]Ã‰ÂƒÊ ‰Çëév¿é²þÿÿf‹‰ðèïýÿÿ‰Å‹S‰ðèãýÿÿ‹S(‹‹NdQfƒý„gþÿÿé^þÿÿfƒÿƒ1ÿÿÿ¿é'ÿÿÿƒàé þÿÿSƒì‰Ã…Àu ë&€Ìf‰C,öÄu ‹C…ÀtèÜÿÿÿ‹…Ût‹C,öÄtÚƒÄ[ÃS‹‰X‰XÇ@ …Ût‰ÚfŠJ.€ùVt€ù]u‹ëïv‰P9Ót[Ãv€{.Kwõ¶S.ÿ$•d4Âf‹‰P‹S ‰P [Ãf¡$`ÄfÿÃì,D$‰D$ D$‰D$ÇD$”5Âf‹D$4‰$ÿ„‚Äf…Àt4‹D$‰D$‹D$‰$èàóÿÿ„À•À¶À‰D$Ç$ª5Âfÿ˜ƒÄfƒÄ,Ãv1ÀƒÄ,ÃfÇD$ÇD$ª5Âf¡˜ƒÄfÿàUWVSƒì\D$L‰D$ D$H‰D$ÇD$¬5Âf‹D$t‰$ÿ„‚Äf…Àtx‹D$H¨ t|ÇD$`ÊÁfl$,‰l$‹D$L‰$‹T$ÿR0‰Ç‰$ÿô‚Äf‰Æ…ÀtC…ÿ~e1Ûë‰D$‰\$‰4$ÿü‚ÄfC9ûtJ‹D‰D$Ç$ª5Âfÿ˜ƒÄf…ÀuÑ‹H‰…Àtx1ö‰ðƒÄ\[^_]èuX¨€„xÿÿÿÇD$àÊÁfésÿÿÿv‹D$H%"@="@uÊD$<‰D$‹D$L‰$‹T$ÿR8H~±¡¬ƒÄf‰D$‰4$ÿð‚ÄfëvÇD$ ÊÁfé#ÿÿÿv‹F‰4$ÿP1ö‰ðƒÄ\[^_]ÃvVSƒì$‰Ã‰T$Ç$½5Âfÿ˜ƒÄf‰Æ…Àt6‰D$‰$ÿð‚Äf‹J‰…Òt ÷ÐÁèƒÄ$[^ËV‰4$‰D$ÿR‹D$ëá1ÀƒÄ$[^ÃWVSƒì‹\$ ‹|$$‰ƒûItcÇGIƒûitO¾¸ÇiÇ$iè.–9Øt ƒøIt‰·FÇ$Iè–9Øt ƒøit‰·F‰ðƒÄ[^_Ãv¾뻾¸ë§Sƒì‹D$ ‹\$$=ÿv ‰¸ƒÄ[É$èÈ•‰¸ƒÄ[ËD$=ÿw鬕ÃvWVSƒì‹\$ ‹|$$‰‰$舕9Øt$¾‰G‰$è|•9Øt‰·F‰ðƒÄ[^_Ãv‹G¾ë×fSƒì‹\$ ‰$èD•ƒøIt‰$è?•ƒøi”ÀƒÄ[ðƒÄ[ÃSƒì‹D$ ‹T$$·Øúÿw ‰ÁÁéƒùNv …Û”ÀƒÄ[Ãÿ$À5ÂfK”Àëìf¡<‚Äfƒ8t"ÇD$‰$èÞ”…À•À¶À9ÔÀƒÄ[áL‚Äf‹·P%ëÜf1Àƒú–À9ÔÀ뛉$è ƒëÀfƒú th1Àƒú ”Àë·¡<‚Äfƒ8…¢¡L‚Äf‹·P%f…À•À¶À9ÔÀƒÄ[Ãf¡<‚Äfƒ8…ž¡L‚Äf‹·P%ë̃ú_…7ÿÿÿ¸éOÿÿÿ¡<‚Äfƒ8…"¡L‚Äf‹·Pƒàëšf¡<‚Äfƒ8…z¡L‚Äf‹·Pƒàéwÿÿÿv¡<‚Äfƒ8…¡L‚Äf‹·P%WéQÿÿÿ¡<‚Äfƒ8…¡L‚Äf‹·Pƒàé/ÿÿÿvƒø"w'ÿ$…ü6Âf¡<‚Äfƒ8…A¡L‚Äf‹·Pƒà…Àuûÿÿ”ÀéPþÿÿƒê0ƒú wê°éAþÿÿ¡<‚Äfƒ8…¡L‚Äf‹·Pƒà ëÁ¡<‚Äfƒ8…¼¡L‚Äf‹·Pƒà룡<‚Äfƒ8…³¡L‚Äf‹·Pƒàë…ÇD$‰$èä’ésþÿÿvÇD$‰$èÌ’é[þÿÿvÇD$W‰$è´’éCþÿÿvÇD$‰$蜒é+þÿÿvÇD$‰$è„’éþÿÿvÇD$‰$èl’éûýÿÿÇD$‰$èW’éâþÿÿÇD$‰$èB’éÍþÿÿÇD$‰$è-’é¸þÿÿÇD$ ‰$è’é£þÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè¨üÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè]üÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mèüÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$MèÙûÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè—ûÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$MèYûÿÿ„À•À1øƒÄ[^_Ãv‹D$‹T$ƒøIt#ƒøit=0t=1t‰T$‰D$év‰¸ÃésŽvƒì‰$ÿ¤ƒÄf=êw =èr6°ƒÄÃ=ôv-ùƒøvé1ÀƒÄÃ=òsÛ-ìƒøvÑ1ÀëævƒøotÅwƒøet¾ƒøit¹ƒøat´1ÀëÉfƒøut©r¾-àƒøv1Àë²vUWVSƒìL‰Ã‰Ö‰Í‹¸  ‹P8…ö~n;p<Œ™Fÿ‰D$‰$ÿ׉D$Ç$Mè ëÿÿ„À•Â;s<|F1À‰é8Ñt+8Á”ÀƒÄL[^_]Ã|$( t ƒ|$(…¯ƒ|$8 …¤1ÀƒÄL[^_]Ãf1Ò;s<}º‰t$‹C8‰$ˆT$ÿ׉D$Ç$Mè™êÿÿ„À•ÀŠT$ë‘f‰t$‰$‰T$ÿ׉D$$Nÿ‰L$,‰L$‹C8‰$ÿ׉D$ ‹D$$‰$è0q‰D$(‹D$ ‰$è qƒø‹T$„ ƒø„ ƒø„ƒ|$(„ùƒ|$(„îƒ|$(„ãƒ|$(„1ÿÿÿƒ|$( „&ÿÿÿ‹D$,…Àˆ‰\$4‹\$,‰t$8‰éˆL$?‰Õf‰\$‰,$ÿ׉Ɖ$è•pƒøtƒø uKƒûÿu݉t$ ‰D$0‰ê‰\$,‹\$4‹t$8¶l$?ƒø „Í‹D$,…Àx ƒ|$ '„rF;s<œ‰éˆL$4‰Ý‰Óf‰t$‰$ÿ׉$è'pƒøtƒø uN9u<߉D$8‰Ú¶l$4ƒ|$0 „?þÿÿ‹\$,KˆG‰Ö‰êˆT$,‹l$0f‰\$‰4$ÿ׉$è×oƒøtƒý uKƒûÿuß¶l$,ƒø „7ƒ|$0„òƒ|$0 „çƒø„?ƒ|$0„Wƒ|$0 „pƒ|$0 …wƒ|$(„Êýÿÿƒ|$0u!ƒ|$( „¸ýÿÿƒ|$(„­ýÿÿƒ|$( „¢ýÿÿ‹D$ ‰D$Ç$MèZèÿÿˆÃ‹D$$‰D$Ç$MèDèÿÿ‰ê8Ó„nýÿÿ8ДÀé>ýÿÿƒ|$(„Yýÿÿ‹D$ ‰D$Ç$MèèÿÿˆÃ‹D$$‰D$Ç$Mèûçÿÿ‰ê8Ó„%ýÿÿ8”ÀƒÄL[^_]Ã|$(„ ýÿÿƒ|$0…ÿÿÿƒ|$( …øþÿÿ1Àéòüÿÿƒ|$( …(þÿÿ1Àéàüÿÿƒ|$0 t ƒ|$0…·þÿÿƒ|$( „Áüÿÿ¸ é¢þÿÿ‹D$0ƒè ƒø‡±þÿÿƒ|$(…¼þÿÿ1Àé—üÿÿ‹D$(ƒè ƒø‡¯þÿÿƒ|$8…¤þÿÿ1Àétüÿÿfƒ|$( …þÿÿ1Àé`üÿÿƒ|$0„~þÿÿƒ|$0 „sþÿÿƒ|$0…›þÿÿécþÿÿ‹D$$‰T$è+ûÿÿ„À‹T$„uýÿÿ°éòûÿÿÇD$0éaýÿÿ1ÀéïýÿÿÇD$8éýÿÿv1É‹T$‹D$éiûÿÿ¹‹T$‹D$éVûÿÿfUWVSƒì,‹|$@‹G0@‰$ÿlƒÄf‰Å…Àtq‹G$‰D$‹G ‰D$Ç$ˆ7Âf¡˜ƒÄf‰D$ÿÐ…Àt@‰E ‹G0…À~P1ö1ÛëfC‰D ƒÆ9_0~;‹G4ð‹P‰T$‹‰D$Ç$ˆ7ÂfÿT$…ÀuÒ‹EH‰E…Àt1í‰èƒÄ,[^_]ÃvÿE‰o8‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãvƒìƒéƒùw‹ øWÂf‰T$‰D$‰ $ÿ€ƒÄfƒÄùëãWVSƒì Ç$hÿlƒÄf‰Æ…ÀtL1Û‹=tƒÄfë‰D$‰\$‰4$ÿ×Cƒûht.·„@ìÁf‰D$¹ºD$èzÿÿÿ…ÀuÊ‹H‰…Àt 1ö‰ðƒÄ [^_Ãf‹F‰4$ÿP1ö‰ðƒÄ [^_Ãì€x9t ‰$ÿŒ‚ÄfƒÄÃfWVSƒì‰Ã‰Ö‹@ö@Wt1ŠC„À‰þ¨ „º„À‰Ž¨@„6C‰F,éµv‹@PÇBÿÿÿÿ…À„‹…À„üÇD$‰T$‰$ÿÐ…ÀˆãÆF9‹~‹‰F,…À„…ÿˆß‰$ÿHƒÄf‹SöBW…™9Ç„‘‰4$ÿŒ‚ÄfÇD$Q8Âf¡ä‚Äf‹‰$ÿЂÄf1ÀƒÄ[^_Ãv‹S$…Ò„%‰V,„À‰þ‹C‰F0ŠCÀèƒà‰F4ÆF8ÆF9°ƒÄ[^_Ãv‰$ÿ ƒÄf@td‹Cö@W„£ŠC¨ t¤éåþÿÿvÇF4‰F0ÆF8°ƒÄ[^_ÃÇD$8Âfé[ÿÿÿvC$éÅþÿÿ‰4$ÿŒ‚ÄfÇD$88Âfé:ÿÿÿf1ÀéCÿÿÿ‰4$ÿŒ‚ÄfÇD$)8Âf¡è‚Äf‹‰$ÿЂÄf1ÀéÿÿÿÇD$*3ÇD$Œ7ÂfÇ$Í7Âf謇ÇD$*3ÇD$Œ7ÂfÇ$µ7Âfè‡ÇD$+3ÇD$Œ7ÂfÇ$Í7Âfèt‡ÇD$*3ÇD$Œ7ÂfÇ$è7ÂfèX‡WVSƒìPˆÓT$èÃýÿÿ„Àtv‹D$HƒøtfƒøtHtVD$èýÿÿ¸ÿÿÿÿƒÄP[^_ÿ°Àf‹D$D…À~¶Û1öf‰t$‹D$@‰$ÿ×9ØtÅF9t$DèD$èKýÿÿ‹D$DƒÄP[^_ÿTÀf뾿€Àf붸ÿÿÿÿë¢fVSƒì$‰Ö‰$ÿì‚Äf‰Ã…Àt.‰t$‰$ÿ4ƒÄf‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ã1ÀëõVSƒì‰Ã‰Ö¡ `Äf…À„®ƒÃƒûv"ÇD$ð9Âf¡à‚Äf‹‰$ÿЂÄffƒÄ[^Ãfÿ$:ÂfÇD$9Âf¡à‚Äf‹‰$ÿЂÄfëÖf‹F‹@ ‰D$ÇD$X9Âf¡ä‚Äf‹‰$ÿÄ‚Äfë°‹F‹@ ‰D$ÇD$¨9Âf¡ä‚Äf‹‰$ÿÄ‚Äf댋F‹@ ‰D$ÇD$€9Âf¡ä‚Äf‹‰$ÿÄ‚ÄféeÿÿÿÇD$x8Âf¡ `Äf‰$ÿЂÄféIÿÿÿÇD$ 9Âf¡ä‚Äf‹‰$ÿЂÄfé+ÿÿÿvÇD$Ì9Âf¡Ü‚Äf‹‰$ÿЂÄfé ÿÿÿv…ö„¨‹F‹@ ‰D$ÇD$¬8Âf¡ä‚Äf‹‰$ÿÄ‚ÄféÙþÿÿÇD$@9Âf¡ `Äf‰$ÿЂÄfé½þÿÿÇD$Ú9Âf¡ `Äf‰$ÿЂÄfé¡þÿÿ¡È‚ÄfƒÄ[^ÿàÇD$Ž8Âf¡è‚Äf‹‰$ÿЂÄféwþÿÿvºf8Âf¸l8Âfèåýÿÿ£ `Äfé9þÿÿvÇD$ä8Âf¡ä‚Äf‹‰$ÿÄ‚Äfé;þÿÿvUWVSƒì‹\$0‹D$4…ÀˆÕ;C0Ì…À„€t@ý‹S44ò‹F‰$ÿô‚Äf‰Ç…À„—‹F…À„Œ1Û‹-˜ƒÄfëv‹W ‰šC9^vsÝF‹P‰T$‹‰D$Ç$ˆ7ÂfÿÕ…ÀuЋH‰…Àtk1ÿ‰øƒÄ[^_]ÃvÇ$ÿô‚Äf‰Ç…Àt$‹C$‰D$‹C ‰D$Ç$ˆ7Âfÿ˜ƒÄf…Àt¶‹W ‰‰øƒÄ[^_]Ãv1Ò¸òÿÿÿèýÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÎvUWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpt@ý‹{44÷‹F‰$ÿô‚Äf‰Ç…À„€‹N…Éty1Û‹-˜ƒÄfëv‹W ‰šC9^v`‹F‹D؉D$Ç$ª5ÂfÿÕ…ÀuÜ‹H‰…Àtc1ÿ‰øƒÄ[^_]ÃvÇ$ÿô‚Äf‰Ç…Àt‹C$‰D$Ç$ª5Âfÿ˜ƒÄf…Àt½‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿèüÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì‹\$0‹D$4…Àˆ±;C0¨…Àtht@ý‹C44ð‹F‰$ÿô‚Äf‰Ç…Àt|‹n…ítu1Û‹-˜ƒÄfëv‹W ‰šC9^v\‹F‹؉D$Ç$ª5ÂfÿÕ…ÀuÝ‹H‰…Àt`1ÿ‰øƒÄ[^_]ÃÇ$ÿô‚Äf‰Ç…Àt‹C ‰D$Ç$ª5Âfÿ˜ƒÄf…ÀtÀ‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿè ûÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì,‰Ã‰Õ…Àt*…Òt.‰Ç1ö¡ƒÄf‰D$‹G‰$ÿT$FƒÇ9îuî‰$ÿT$ƒÄ,[^_]áƒÄf‰D$ëæUWVSƒì,‰Ã‰T$…Àt.…Ò~2‰Æ1ÿ‹-ƒÄf‹F‰$ÿÕ‹F‰$ÿÕGƒÆ4;|$uæ‰$ÿÕƒÄ,[^_]Ë-ƒÄfëëSƒì‰Ã‹€¸1 t ÿØ‚Äf‰CƒÄ[Ãì‹€º1 t ‹@‰$ÿÔ‚ÄfƒÄÃfVSƒì‰Ã‰ÖèÒÿÿÿ‰4$ÿƒÄf‰ØƒÄ[^ë Sƒì(‰ÓÁë=`ÊÁf„¤=àÊÁfBÿ„¶ƒøwI‹<‚Äfƒ;tZÇD$‰ $‰L$è6€‹L$…ÀuPƒ;tUÇD$‰ $者À•ÀƒÄ([Ãvƒëƒûv¯‰L$‰$èÄêÿÿƒÄ([Ãv¡L‚Äf‹·Hƒà…Àt°°ƒÄ([Ãv¡L‚Äf‹·Hƒàë«Bÿƒøv@ƒëƒûv,‰L$‰$è8ÛÿÿëÊfƒøv#ƒëƒûv‰L$‰$èãÛÿÿë­‰ $è dë¢f‰ $èØ`Hƒø–ÀëvUWVSƒì,‹T$@‹R‰T$…Ò„Ê‹L$@‹Y‹q‹A0‰D$…À~c‹i4ÇD$f‹E…Àx9Ã~‰Ã‹E…Àx9Æ}‰Æ‹}…ÿt$‹E‹‹P1À…Éx9Ë~‰Ë…Òx9Ö}‰Ö@9øuçÿD$ƒÅ‹T$9T$uª‰t$‰\$‹L$‰ $ÿLƒÄf…Àt9‹L$@‹Q …Òt ‹ I‰ …Ét?‹T$@‰B ‰Z‹B…Àt ‹J‰…Òt‹L$@ÇA¡¬ƒÄfÿƒÄ,[^_]ËP‰$ÿRëÛ‹J‰$‰D$ÿQ‹D$ë®vUWVSƒì‹t$0‹D$4…Àˆá;F0Ø…À„ˆ|@ý‹F4<ø‹G‰$ÿô‚Äf‰Å…À„¥‹G…À„š1Ûë‹U ‰šC9_†…ÝG‹V‹H)щL$‹)ЉD$‹F ‰$ÿLƒÄf…Àu‹EH‰E…Àto1í‰èƒÄ[^_]ÃvÇ$ÿô‚Äf‰Å…Àt*‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿLƒÄf…Àt®‹U ‰‰èƒÄ[^_]Ã1Ò¸òÿÿÿèÜöÿÿ1í‰èƒÄ[^_]ËE‰,$ÿP1íëÐvWVSƒì ‰Ã€x ‹BtCö@W„ÿ‰×‹…Àt_‰|$‰$ÿð‚Äf‰Æ…Àˆ‹H‰…À„¿‰ðƒÄ [^_Ãfö@WuÁ‰$‰T$ÿ‚Äf‰Ç…À‹T$u®¸íÿÿÿèEöÿÿ¾íÿÿÿëÇf‹C…À„éÇ$ÿô‚Äf‰…Àt"‹@ ‹S‰ÇC‹‹@ ‰x1ö‰ðƒÄ [^_þ÷ÿÿÿ‹H‰…Àtz‹…Àt ‹J‰…Ò„ƒ‹C…Àt ‹J‰…Òtg1Ò‰ðèÂõÿÿ‰ðƒÄ [^_ËG‰<$ÿP‰ðƒÄ [^_Ãf‰$‰T$ÿ„ƒÄf‰Ç…À‹T$…èþÿÿ¸îÿÿÿèõÿÿ¾îÿÿÿéþþÿÿ‹G‰<$ÿPéxÿÿÿf‹P‰$ÿR뎋P‰$ÿRéoÿÿÿf‰{1öéÇþÿÿfVSƒì$‰Ã‹…À„ï€{…Å€{ uCÇ$h:Âfÿ”‚Äf‰Æ‹…ö„’‰D$‰4$ÿœƒÄf‹J‰…ÒtG‹‹ I‰ …ÉtXƒÄ$[^ÃvÇD$Ç$ÿŒƒÄf‰Æ‹…ötK‰D$‰4$ÿƒÄf‹J‰…Òu¹‹V‰4$‰D$ÿR‹D$‹‹ I‰ …Éu¨‹J‰$‰D$ÿQ‹D$ƒÄ$[^Ãf‹J‰…Òt1ÀƒÄ$[^Ãv‰$ÿø‚Äfé-ÿÿÿf‹P‰$ÿR1Àé[ÿÿÿ‹C…À…Pÿÿÿ€{ uÇ$h:Âfÿ”‚Äfé8ÿÿÿÇD$Ç$ÿŒƒÄféÿÿÿf‹D$‹@,‰D$¡¤‚ÄfÿàfSƒì‹\$ ‹C…Àt ‹J‰…Òtl‹C …Àt ‹J‰…ÒtP‹C‹J‰…Òt8‹C4…Àt ‰$ÿƒÄf‹C8…Àt‹J‰…Òu ‹P‰$ÿR‰\$ ¡0ƒÄfƒÄ[ÿà‹P‰$ÿR뽋P‰$ÿR륋P‰$ÿRë‰UWVSƒì,‰Ç‹€¬ …Àt ‰$ÿdƒÄf‹‡p …Àt"‹-ƒÄfëf‰Ø‹˜ ‰$ÿÕƒ¯€ @…Ûuè‹7‹Ÿˆ …Ût.‹-ƒÄfë‰Ã‹C‹S‰$‰D$ÿÕ‹S ‰$ÿÕ‰$ÿÕ‹D$…ÀuÚ‹Ÿ …Ût)‹-ƒÄfë‰Ë‹K‹V$‹C‰L$èø÷ÿÿ‰$ÿÕ‹L$…Éuß‹Vp…Ò„4‹V‹GHè‰÷ÿÿ‹Ft…À„‹V$‹GTè¿÷ÿÿ‹ŸØ …Ût5‹-ƒÄfë‰Ë‹K‹V‹C ‰L$èL÷ÿÿ‹V$‹Cè÷ÿÿ‰$ÿÕ‹L$…ÉuÔ‹FT…À~-1À1Û‹-ƒÄfv‹—à ‹T‰$‰D$ÿÕC‹D$ƒÀ9^Tà‹‡à …Àt ‰$ÿƒÄf‹‡È ‰D$…Àt>‹vx‰t$…öŽ“‹\$1ö‹-ƒÄf‹C‰$ÿÕ‹C‰$ÿÕFƒÃ(;t$uæ‹D$‰$ÿÕ‹‹J‰…ÒtN‹G‹J‰…Òt6€¿+ t ƒÇ‰<$ÿŒ‚ÄfƒÄ,[^_]ËGT‰Ftéîþÿÿ‹GH‰FpéÌþÿÿ‹P‰$ÿRë¿‹P‰$ÿRë§‹-ƒÄfë‹Sƒì‹\$ C èÐýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡0ƒÄfƒÄ[ÿàSƒì‹\$ C èœýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡0ƒÄfƒÄ[ÿàWVSƒì ‰Ã‰T$Ç$ª5Âfÿ˜ƒÄf‰Æ…Àt=‰$ÿDƒÄf‰Ç‹H‰…Àt5…ÿt%‰|$‰$ÿð‚Äf‹J‰…Òt'÷ÐÁèƒÄ [^_Ãv1ÀƒÄ [^_Ãv‹F‰4$ÿPëÀ‹W‰<$‰D$ÿR‹D$ëÆWVSƒì ‹t$0Ç$ÿô‚Äf‰Ã…Àtºi:Âfè½ßÿÿ„Àu)‹H‰…Àt 1ÀƒÄ [^_Ãv‹C‰$ÿP1ÀƒÄ [^_Ãf‹V ‰Øèÿÿÿ„Àtɺ…:Âf‰Øèvßÿÿ„Àt¹‹V$‰Øèüþÿÿ„Àt«ºˆ:Âf‰ØèXßÿÿ„Àt›‹V‹F$)ЉD$‹F )ЉD$‹F ‰$ÿLƒÄf‰Æ…À„pÿÿÿ‰$ÿDƒÄf‰Ç‹H‰…À„˜…ÿ„Pÿÿÿ‰|$‰$ÿð‚Äf‰Æ‹J‰…Ò„‚…öˆ,ÿÿÿº’:Âf‰ØèÙÞÿÿ„À„ÿÿÿÇD$h:ÂfÇ$½5Âfÿ˜ƒÄf‰Æ…À„ùþÿÿ‰\$‰$ÿƒÄf‹J‰…Òt?‹J‰…Ò…áþÿÿ‹S‰$‰D$ÿR‹D$éËþÿÿ‹F‰4$ÿPéZÿÿÿ‹G‰<$ÿPépÿÿÿ‹V‰4$‰D$ÿR‹D$ë®fUWVSƒì<‹t$PÇ$ÿô‚Äf‰Ã…Àtº”:Âfè Þÿÿ„Àu(‹H‰…Àt 1ÀƒÄ<[^_]ËC‰$ÿP1ÀƒÄ<[^_]ËF‰$‹-DƒÄfÿՉDžÀtĉD$‰$¡ð‚Äf‰D$ÿЋJ‰…Ò„I…Àx¡ÇD$$1À1ÿëPvº¡:Âf‰Øè Ýÿÿ„Àt€º®:Âf‰ØèÝÿÿ„À„lÿÿÿ‹D$$‹ÅÀXÂf‰ØèvÝÿÿ„À„RÿÿÿG‹D$$@‰D$$ƒø w'‹ÅÄXÂf…F tæ…ÿt£ºª:Âf‰ØèCÝÿÿ„Àu£éÿÿÿfÇD$$‰÷D$,‰D$ D$(‰D$D$$‰D$‹G4‰$ÿ°‚Äf…À„ º…:Âf‰ØèöÜÿÿ„À„Òþÿÿ‹D$(‰D$‰$ÿT$…Àˆ»þÿÿ‹D$,‰$ÿՉƅÀ„¨þÿÿºµ:Âf‰Øè¸Üÿÿ„À„”þÿÿ‰t$‰$ÿT$‹J‰…Òt…À‰fÿÿÿésþÿÿv‹V‰4$‰D$ÿR‹D$ëÝ‹W‰<$‰D$ÿR‹D$é¡þÿÿº·:Âf‰ØèVÜÿÿ„À„2þÿÿÇD$h:ÂfÇ$½5Âfÿ˜ƒÄf‰Æ…À„þÿÿ‰\$‰$ÿƒÄf‹J‰…Òt#‹J‰…Ò…ûýÿÿ‹S‰$‰D$ÿR‹D$éåýÿÿ‹V‰4$‰D$ÿR‹D$ëÊvUWVSƒì‹\$0‹s@…öŽ 1ÿ‹-ƒÄfë ‰4$ÿÕG9{@~/‹CD‹4¸‹F(‰$ÿÕöF-tá‹F‰$ÿÕ‹F‰$ÿÕ‰4$ÿÕG9{@Ñ‹CD‰$ÿÕ‹CL‰$ÿÕ‹CX‰$ÿÕ‹Cd‰$ÿÕ‹S‹Cpè»ðÿÿ‹S$‹Ctèüðÿÿ‹K…Ét ‰$ÿ,ƒÄf‹C…Àt ‹J‰…Òtx‹C,…Àt ‹J‰…Òt\‹C0…Àt ‹J‰…Òt@‹C4‹J‰…Òt(‹C8‹J‰…Òu ‹P‰$ÿR‰\$0¡0ƒÄfƒÄ[^_]ÿà‹P‰$ÿRëÍ‹P‰$ÿR뵋P‰$ÿR뙋P‰$ÿRézÿÿÿ‹-ƒÄféÿÿÿvVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F8‰$ÿ–  ƒø tƒè ƒø–ÀƒÄ[^Ã;^<}ȉ\$‹F8‰$ÿ–  ƒø •Àë²vVSƒì‹\$ ‹t$$9s< °ƒÄ[^Ãf‰t$‹C8‰$ÿ“  ƒø tƒè ƒø–ÀƒÄ[^Ã…öÎN‰t$‹C8‰$ÿ“  ƒø •Àë·vVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F8‰$ÿ–  ƒø t PöƒúvÕ=…tÎ=( tÇ=) ”Àë¿;^<}¸‰\$‹F8‰$ÿ–  ƒø •Àë¢vVSƒì‹\$ ‹t$$9s< °ƒÄ[^Ãf‰t$‹C8‰$ÿ“  ƒø t#PöƒúvÙ=…tÒ=( tË=) ”ÀëÃv…öºN‰t$‹C8‰$ÿ“  ƒø •Àë£vVSƒì$‹D$4‹\$89Øt;t$‰t$‰$‹D$0ÿP0ƒø~;\$tºëv;–tB9Âuö1ÀƒÄ$[^Ãf°ƒÄ$[^ÃUWVSƒì ‰Å‰Ó‰Ï1ö…Òu ë"v‹…Ût‰ù‰Ú‰èè:C/uêƒö‹…Ûuç‰ðƒÄ [^_]ÃvSƒìŠZ.ƒë €û:v 1ÀƒÄ[Ãf¶Ûÿ$¼:Âff‹Z$…Ûtä‹R(9 tz1Àëf9 ‚to@9ØuöëË‹B(9”ÀƒÄ[Ãv‰L$‹R(‹‰$ÿƒÄ[ËB(‹P;r9Ñ–Àë˜v‹RƒÄ[ëcv‹RƒÄ[錋RƒÄ[éÿÿÿ‹RƒÄ[ë v°é^ÿÿÿWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè+ÿÿÿ:C/uê°[^_Ã1À[^_ÃfWVS‰Ç‰Ó‰Îè ÿÿÿ:C/t1À[^_Ãv‰ñ‰Ú‰øèñþÿÿ:C/tç‹…Ûuê°[^_ÃWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè¿þÿÿ:C/tê1À[^_ð[^_ÃfUWVSƒì,‰D$‰Ó‰L$‹|$@…É~O1öŠC.ƒè <:v °ƒÄ,[^_]öÀÿ$…¨;Âff‹S$…Òt‹,·‹K(;)tÙ1Àëv9,tÍ@9ÐuöF;t$u·v1ÀƒÄ,[^_]Ãf‹ ·‹S‹D$èÝþÿÿ„ÀuŸF;t$uŽëØ‹ ·‹S‹D$èÉýÿÿ„ÀuƒF;t$…nÿÿÿ븋 ·‹S‹D$è ÿÿÿ„À…_ÿÿÿF;t$…Jÿÿÿ딋 ·‹S‹D$è±þÿÿ„À…;ÿÿÿF;t$…&ÿÿÿémÿÿÿ‹·‹C(‹H;‚Qÿÿÿ9ʆÿÿÿF;t$…üþÿÿéCÿÿÿv‹·‰D$‹C(‹‰$‹T$ÿ„À…áþÿÿF;t$…Ìþÿÿéÿÿÿv‹C(‹9·„ÀþÿÿF;t$…«þÿÿéòþÿÿfUWVSƒì<‰Ç‰Ót$ ‰t$‰ $ÿP0‰ÅŠC.ƒè3< w'¶Àÿ$…”<Âf‹[‰4$‰é‰Ú‰øèGþÿÿ:C/„ÁfÆD$ŠD$ƒÄ<[^_]Ãv‹[…Ûu ëãv‹…ÛtÚ‰4$‰é‰Ú‰øèþÿÿ:C/uçÆD$ŠD$ƒÄ<[^_]Ãf‹[ÆD$…Ûu ë«€t$‹…Ût ‰4$‰é‰Ú‰øèÉýÿÿ:C/uçëàf‹[…Ûu ë´v‹…Ût«‰4$‰é‰Ú‰øè ýÿÿ:C/tçéZÿÿÿf‰4$‰é‰Ú‰øè†ýÿÿ:C/„Aÿÿÿ‹…ÛuãéoÿÿÿfUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øè{þÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèBþÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øè~ýÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèEýÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfSŠZ.ƒë2€ûv1À[öÛÿ$Ì<Âff‹R[é³úÿÿv‹R[é¯ùÿÿv‹R[éûÿÿv‹R[éÃúÿÿvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øèGÿÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèÿÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèÑþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øèJþÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèÔýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰Ã‰Ö‹€  ‹S8€~.Aw¶~.ÿ$½ =Âfv;KD|=v1ÀƒÄ,[^_]Ãf;K@~ïI‰L$‰$ÿЋ›œ ‰Á‰ò‰Øè`ýÿÿ:F/”ÀëÎ;K@~ÇI‰L$‰$ÿЋ›œ ‰Á‰ò‰Øè(úÿÿ:F/”Àë¦;KD}Ÿë¯;K@~—I‰L$‰$ÿЋV(‹J;r`9È–Àf8F/”Àésÿÿÿ;K@ŽgÿÿÿI‰L$‰$ÿЋV(‹j‹:‹“œ \$‰\$‰$ÿR0…À~1Òv‹ “9Ïw 9Ír°ë­B9Âuë1Àë£v;KDÿÿÿ‰L$‰$ÿЋV(‹j‹:‹“œ \$‰\$‰$ÿR0…À~Ç1Ò‹ “9Ïw9Ís°B9Âuð1ÀéUÿÿÿ;KDÇþÿÿé,ÿÿÿf;K@Ž·þÿÿ‹›œ ‹I‰L$‰$ÿЉD$‹F(‹‰$ÿÓ:F/”ÀéŽþÿÿ;K@ŽƒþÿÿI‰L$‰$ÿЋV(‹›œ ‰Á‹‰ØèÉäÿÿ:F/”Àé\þÿÿf;KDOþÿÿëË;KDCþÿÿ‹›œ ‹ë‹;K@Ž/þÿÿI‰L$‰$ÿЋV(;”¶ҶF/9”Àéþÿÿ;K@Žþÿÿ‹~(‹?I‰L$‰$ÿЉ|$‰D$‹ƒœ ‰$èöôÿÿ:F/”ÀéÕýÿÿv;KDÇýÿÿ‹~(‹?ëÃ;KD·ýÿÿë‡;K@Ž«ýÿÿ‹›œ ‹[ I‰L$‰$ÿЉ$ÿÓ„À”Àé‹ýÿÿ;KDýÿÿ‹›œ ‹[ ëÓ;K@ŽkýÿÿI‰L$‰$ÿЃø •ÀéXýÿÿf9K@œÀéKýÿÿ9KDŸÀé?ýÿÿ9KDŽ3ýÿÿëÇUWVSƒì\‰Ã‰Ö‰Í‹zöG- u‹H8‰L$ ‹ˆ  ‰L$€.Kv‹‹T$p‰‰j°ƒÄ\[^_]Ãf¶G.ÿ$…>Âf‹W$‰T$$‰è+C@9ÂwE‹(‰é)щL$(…ÒtZ1Û‰t$,‹t$ ‰l$ ‹l$ë fC;\$$„Ý‹D$(؉D$‰4$ÿÕ;Ÿtá1ÀƒÄ\[^_]Ã;kD}ñ‰l$‹L$ ‰ $ÿT$ƒø tÝ‹F‹L$p‰n ‰i°ƒÄ\[^_]Ã;k@â1Àë¼;k@~µEÿ‰D$ë¿;kD|Ë1Àë¥;kD}ž‹ƒœ ‹X ‰l$‹L$ ‰ $ÿT$‰$ÿÓ„Àt¡1Àéxÿÿÿ;k@Žmÿÿÿ‹ƒœ ‹X Eÿ‰D$ëÊ‹ƒœ ‰l$‰$ÿP:G/„fÿÿÿ1Àé=ÿÿÿ‹D$p‰$‰é‰ú‰Øè…þÿÿ„À…EÿÿÿW‹L$p‰ $‰é‰Øèjþÿÿ„À…*ÿÿÿ1Àéÿÿÿ;kDöþÿÿ‰l$‹L$ ‰ $ÿT$‹W(;”¶ҶG/9„ôþÿÿ1ÀéËþÿÿ;kDÀþÿÿ‹G(‹‰l$‹L$ ‰ $‰T$ÿT$‹T$‰T$‰D$‹ƒœ ‰$è2òÿÿ:G/„©þÿÿ1Àé€þÿÿ;k@Žuþÿÿ‹G(‹Eÿ‰D$ë°;k@Ž^þÿÿEÿ‰D$é`ÿÿÿ‹ƒœ ‰l$‰$ÿP:G/„]þÿÿ1Àé4þÿÿ‹ƒœ ‰l$‰$ÿP:G/„=þÿÿ1Àéþÿÿ‹ƒœ ‰l$‰$ÿP:G/„þÿÿ1Àéôýÿÿ9k<„ þÿÿ‰l$‹L$ ‰ $ÿT$ƒø „õýÿÿ1ÀéÌýÿÿ‹ƒœ ‰l$‰$ÿP(„À…Öýÿÿ1Àé­ýÿÿ9k<„Æýÿÿ1Àéýÿÿ9k<„¶ýÿÿ9kd„­ýÿÿ1Àé„ýÿÿ9k<„ýÿÿ9kh„”ýÿÿ1Àékýÿÿ‹ƒœ ‰l$‰$ÿP :G/„týÿÿ1ÀéKýÿÿ‹ƒœ ‰l$‰$ÿP:G/„Týÿÿ1Àé+ýÿÿ;kD ýÿÿ‹ƒœ ‹‰l$‹L$ ‰ $ÿT$‰D$‹G(‹‰$ÿÓ:G/„ýÿÿ1Àéíüÿÿ;kDâüÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹›œ ‰Á‹‰Øè¯ßÿÿ„ÀéÖýÿÿ;k@ޝüÿÿEÿ‰D$ëÈ;k@Žüÿÿ‹ƒœ ‹Eÿ‰D$éuÿÿÿ;kD€üÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹J;rx9È–Àf8G/„{üÿÿ1ÀéRüÿÿ;kDGüÿÿ‰l$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒœ \$@‰\$‰$ÿP0‰Á…À~1Àf‹ƒ9T$w 9T$ r°ë•@9Èuç1Àë‹;k@ŽâûÿÿEÿ‰D$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒœ \$@‰\$‰$ÿP0‰Á…À~µ1Àf‹ƒ9T$w9T$ s˜@9Èuì1Àé%ÿÿÿ;k@Ž|ûÿÿEÿ‰D$éôþÿÿ9kX„‹ûÿÿ1Àébûÿÿ;kDWûÿÿ‰l$‹L$ ‰ $ÿT$‹›œ ‰Á‰ú‰ØèOõÿÿ:G/„Rûÿÿ1Àé)ûÿÿ;kDûÿÿ‰l$‹L$ ‰ $ÿT$‹›œ ‰Á‰ú‰Øèòÿÿ:G/„ûÿÿ1Àéðúÿÿ;k@ŽåúÿÿEÿ‰D$ëÂ;k@ŽÓúÿÿEÿ‰D$étÿÿÿ…í„ãúÿÿEÿ‰D$éÎüÿÿ‹ƒœ ‰l$‰$ÿP$„À…¿úÿÿ1Àé–úÿÿ…í„°úÿÿ1Àé‡úÿÿ‹ƒœ ‰l$‰$ÿP:G/„úÿÿ1Àégúÿÿ‹W$‹CD)è9‡Uúÿÿ‹O(…Ò„núÿÿê‰T$$‰ï‰è÷؉t$(‹t$ ‰l$ ‹l$ë G;|$$„ÿ‰|$‰4$ÿÕ;»tç1Àé úÿÿ‹O$‰L$$‹KD)é‹D$$…À„±ƒ|$$†ëº«ªªª‹D$$÷âÑê9ÑŒÐùÿÿ‹“œ ‰T$(‹J8‰L$4‹(‰|$,‰é‹D$$…À„¼1ÿ1À1Ò‰\$0‰Ó‰t$8‰Æ‰l$<ëfCG9þE;\$$„È9þ/‹D$09hDŽnùÿÿ‰l$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$4‰Æ1ÿ‹L$,‹™‰D$‹D¼@‰D$‹T$(‰$èÑìÿÿ„Àu™1Àé$ùÿÿ‹W$‹CD)è9‡ùÿÿ‹›œ ‰\$,‹O(…Ò„!ùÿÿê‰T$(‰ë‰è÷؉D$$‹|$ ‰t$ ‰l$0‹l$,ë C;\$(„¼‹T$$‹4š‰\$‰<$ÿT$‰t$‰D$‰,$èOìÿÿ„ÀuÏ1À颸ÿÿ‹O$‰ê+S@‰T$$…É„Fƒù†º«ªªª‰È÷âÑê9T$$Œnøÿÿ‹“œ ‹B8‰D$,‹(‰|$$…É„b‰Ï1À‰\$(‰t$0‰î‰l$4‰Õë:‹L$$‹T¹ü‰T$Xÿ‹Dœ@‰D$‰,$èÁëÿÿ„À„øÿÿO‰Ø…Û޾…ÿ„6…À‹D$(9p@ñ÷ÿÿFÿ‰D$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$,ë’‹O$‰L$$‰è+C@9Á‡º÷ÿÿ‹“œ ‹G(‰é+L$$‰L$(‹|$$…ÿ„¿÷ÿÿ1ۉ׉t$,‰l$0‰Åë vC;\$$tV‹t‹D$(؉D$‹L$ ‰ $ÿT$‰t$‰D$‰<$èüêÿÿ„ÀuÌ1ÀéO÷ÿÿNé<ÿÿÿ1ÒéÇþÿÿ1Òé`ýÿÿ‹t$,‹l$ éO÷ÿÿ‹t$,‹l$0éB÷ÿÿ‹t$(‹l$ é5÷ÿÿ‹t$ ‹l$0é(÷ÿÿºé‚þÿÿºéýÿÿ‰é‹F‹T$p‰‹F …À„köÿÿ‹D$p‰H°éböÿÿ‰ñ‹t$0‹l$4…Û~Ð1Àé¹öÿÿ‰ð‰é‹t$8‹l$<9Ç}¹1Àé¢öÿÿWVS‰Ã‰È‹t$¶|$ƒûtƒût>Kt[^_ÃvÐÖ9ðs%1Û€8 •Ãçÿ9ûtë1É€8 •Á9Ùu@9ðuï)Ð[^_ʲ9Øs)1Ƀ8 •Á‰Îçÿ9þtë1Ƀ8 •Á9ñuƒÀ9Ãwí)ÐÁø[^_ÃJr9Øs.1Éfƒ8 •Á‰Îçÿ9þtëv1Éfƒ8 •Á9ñuƒÀ9Ãwì)ÐÑø[^_ÃWVS‰Ã‰È‹t$¶|$ƒû„‹ƒûtBKt[^_ÃvÐÖ9ðv*1Û€xÿ •Ãçÿ9ûtëv1É€xÿ •Á9ÙuH9ðuî)Ð[^_ʲ9Øv.1Ƀxü •Á‰Îçÿ9þtëv1Ƀxü •Á9ñuƒè9Ãrì)ÐÁø[^_ÃvJr9Øv/1Éfƒxþ •Á‰Îçÿ9þtëf1Éfƒxþ •Á9ñuƒè9Ãrë)ÐÑø[^_ÃvWVSS‰Ã‰Ï‹D$‹t$ŠL$8L$ ”D$‹ƒû„ˆƒûtGKtZ[^_ÃvÐÖ9ðs,¶9ٔöۉ߶\$9ßtë¶9ٔöÛ9ûu@9ðuì)ÐZ[^_Â4²9ðs(1Û;”Éß¶\$9ßtëf1Û;”Ã9ûuƒÀ9Æwî)ÐÁøZ[^_ÃB4r9ðs0·9ٔöۉ߶\$9ßtëf·9ٔöÛ9ûuƒÀ9Æwê)ÐÑøZ[^_ÃUWVSƒì<‰Ã‹|$P‹l$T‹@8‰D$8L$X”Á‹ƒœ t$ ‰t$‹‰$ˆL$ÿP0‹S4ƒúŠL$„·ƒút^Jt ‰øƒÄ<[^_]Ã|$l$9ïs2‹T$ ‰T$Š…À~¶Û;\$t)1Òë;–tB9Âuö1Ò8ÑuG9ïu×+|$‰øƒÄ<[^_]òëä‹T$<º,ª9ïs1‹T$ ‰T$f‹…À~;\$t,1Òë;–t#B9Âuö1Ò8ÑuƒÇ9ýwÙ+|$Áÿ‰øƒÄ<[^_]òëà‹T$üÿÿ@ÁàèŠÖÿÿ‰Æ‰CT…À„üÿÿ‹E$@ Áá1À‰÷óªéýÿÿ‹T$,éwûÿÿUWVSƒì|‰D$(‰Ó‰ÎŠ„$˜ˆD$.Š„$ ˆD$/¶¬$¤¶¼$¨T$4‰ÈèŒÿÿ„Àu 1ÀƒÄ|[^_]Ãf¶T$l‹Cè·Õÿÿ„Àtkçÿ‰|$åÿ‰l$¶D$/‰D$‹„$œ‰D$¶D$.‰D$ ‹„$”‰D$‹„$‰D$D$4‰$‰ñ‰Ú‹D$(è”ùÿÿ„Àt °ƒÄ|[^_]ÃfD$4èߌÿÿ1ÀƒÄ|[^_]Ãì‹T$ ‹D$$…ÀxQ;B0L…Àt(D@ý‹J4Á‹P‰T$‹‰D$Ç$ˆ7Âfÿ˜ƒÄfƒÄËB$‰D$‹B ‰D$Ç$ˆ7Âfÿ˜ƒÄfƒÄÃ1Ò¸òÿÿÿèˆÿÿ1ÀƒÄÃfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹@‰D$ÇD$ª5Âf¡˜ƒÄfƒÄ ÿà‹B$ëäv1Ò¸òÿÿÿè0ÿÿ1ÀƒÄ Ãfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹‰D$ÇD$ª5Âf¡˜ƒÄfƒÄ ÿàf‹B ëãv1Ò¸òÿÿÿèØŽÿÿ1ÀƒÄ ÃfWVSƒì ‰Ã‰ÖIt‰ÐèDÔÿÿ‰Ç…À„Š…ö~'f‹fúÿwL1É1Àëf‰Áf‹Cfúÿw7ˆ@9ðuë‰t$‰|$Ç$ª?Âfÿ˜ƒÄf‰<$‰D$ÿƒÄf‹D$ƒÄ [^_Ãf‰<$ÿƒÄf1ÀƒÄ [^_Ãf‰T$‰D$Ç$ª?Âfÿ˜ƒÄfƒÄ [^_Ã1ÀëÃUWVSìŒD$|‰D$ D$x‰D$ÇD$­?Âf‹„$¤‰$ÿ„‚Äf…À„šöD$xu‹t$|ÿ‰ðÄŒ[^_]ÃT$0‹D$|車ÿÿ„À„k‹D$d‰D$ ƒø„ƃøt!H„ÊD$0èuŠÿÿ1ö‰ðÄŒ[^_]ÃfÇD$(°Àf‹D$x¨ u¨…¨¨€…¼¾`ÊÁfƒ|$ „ȃ|$ „­ƒ|$ „†ƒ|$ u™ÇD$dÀföÄ@‹D$`t@¯D$ è¡Òÿÿ‰Ã…À„qÿÿÿöD$y@„Ä‹v8‰t$,‹t$`…öŽz1í1ö|$l‰l$‹D$\‰$ÿT$(‰|$‰$ÿT$,‰D$…À~01Ò‰l$$‰õ‰Þ‰Ó‹Ÿ‰D$+‰D$‰4$ÿT$C;\$uä‰ó‰î‹l$$t$E9l$`£‹L$ ‰ò‰Ø€|$h„ˆèŸˆÿÿ‰Æ‰$ÿƒÄfD$0è?‰ÿÿ‰ðÄŒ[^_]Ãf1ö‰ðÄŒ[^_]Ën4‹t$`…ö~ª1ÿ‹t$(‰l$‹l$v‰|$‹D$\‰$ÿÖ‰$ÿT$‰D$‰|$‰$ÿÕG‹D$`9øÖ‰Æéhÿÿÿvèýÿÿ‰ÆésÿÿÿÇD$(€Àfé[þÿÿvÇD$(TÀféKþÿÿv¾ ÊÁféfþÿÿfÇD$¼Àfé|þÿÿv¾àÊÁféJþÿÿfÇD$Àfé`þÿÿvÇD$ ÇD$ÀféHþÿÿ1öéåþÿÿUWVSƒìL‰D$$‰T$(‰Î‹\$`‹l$d‹D$hƒèƒø‡?‹<…lXÂf‹…xXÂf‰D$,‹D$$‹€œ ‰D$ ‹@,9뾉l$‰õ‰Æë fC;\$„¡‰\$‰,$ÿ׉$ÿÖ„Àtã‰î‹l$‹T$ ‹R<‰T$‰\$‰4$ÿ×T$0‰T$‰$ÿT$‰D$…ÀŽÛC‰D$ 1ÿëvG;|$„’‹D¼0‰D$‰\$‰4$ÿT$,‹T$h‰T$‰l$‹D$ ‰$‰ñ‹T$(‹D$$èÿÿÿ…Àt¼ƒÄL[^_]Éî‹l$‹D$$€¸* u]‹L$h‰ê‰ðètûÿÿ‰Ã…Ût_‰\$‹T$(‰$ÿPƒÄf‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄL[^_]ÃvÇD$,dÀf¿TÀféÁþÿÿf‹L$h‰ê‰ðè†ÿÿ‰Ãë¡1Àë̸÷ÿÿÿëÅSƒì‰T$‰$ÿƒÄf‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿ謉ÿÿ‰ØƒÄ[ÃUWVSƒì,‰Æ‰ÍˆT$¸0èÏÿÿ‰Ã…Àth¹01À‰ßóª‹D$D‰C$…ÀuwÇC(ŠD$ˆC.‰èƒàˆC/Áå f‰k,‹D$@‰C ‹V<9V@|C‰F<…Àt)Áâ‹FDèVÿÿÿ…ÀtZ‰FD‹V@‰B‰V@‰ØƒÄ,[^_]ÃvÇF<º@ëÌf‹FDëÔvÁàèxÎÿÿ‰C(…Àu1À‰$‹5ƒÄfÿÖ‰$ÿÖ1Ûë¶v‹C(ëävWVSƒì‰Ã‹P9Sr~Š‹H¶ÂƒèƒøIwZ¾° XÂföÁt1ö¶Ò‹CÇD$‰4$èÞþÿÿ…ÀtM‹‹z‹H(‰9ƒÂ ‰‹S‹:…ÿt*‰B‰C…ötÿC ¸ƒÄ[^_Ã1ö멸ƒÄ[^_ÉëÕ¸ÿÿÿÿëݸ÷ÿÿÿëÖfWVSƒì‰Ã‹P 9S‚†Š‹H¶ÂƒèƒøIwb¾° XÂföÁt1ö¶Ò‹CÇD$‰4$è:þÿÿ…ÀtU‹H(‹‹z‰9‹z ‰yƒÂ‰‹S‹ …Ét,‰B‰C…ötÿC ¸ƒÄ[^_Ãv1ö롸ƒÄ[^_ÉëÓ¸ÿÿÿÿëÛ¸÷ÿÿÿëÔfUWVSƒì,‰Ã‰Õ‹‹H‹pµ ‰T$Â9S‚ΊˆD$¶ÀƒèƒøIvv1ÿ¶T$‹C‰t$‰<$èˆýÿÿ…À„¦‰ê„ÒufH,…öt‹h(‹;1Ò‹L— ‰L•B9òuó‹T$‹S‹:…ÿt`‰B‰CŠD$ƒèG<vs ¸ƒÄ,[^_]Ãv¾¸ XÂf¯þ뀋K …öt%ƒþv(º«ªªª‰ð÷âÑêʉS ¸ƒÄ,[^_]Ãv1Òëç‰럺ëܸÿÿÿÿ맸÷ÿÿÿë vUWVSƒì‰Ã‹Š‹H¶ÂƒèƒøI‡í¾° XÂföÁt1ö¶Ò‹CÇD$‰4$èüÿÿ‰Ç…À„僋C‹(…í„ljx‰{‹k ‹‹ƒè ƒø:v¸ÿÿÿÿƒÄ[^_]Ãÿ$…¼?Âfº‰Øèdþÿÿ…À„‹;SsÏ‹ƒøuÀƒÂ‰‹‰Glj{‰k …ötPE‰k ¸ƒÄ[^_]Ãv‰Øè!ÿÿÿƒøt¸ë‘f‰Øè]ýÿÿƒøt¨ëf‰Øè­üÿÿƒøt˜énÿÿÿv1öéÿÿÿ¸ƒÄ[^_]Ãv‰8é5ÿÿÿ1ÀéEÿÿÿ¸÷ÿÿÿé;ÿÿÿUWVSƒì‰Î‹\$0‰×JþƒùIwI¾ŠXÂf‰Í¯î‰ù¶Ñ‰t$‰,$1Éè^ûÿÿ…ÀtfH,…ö~‹x(1Òv‹ “‰ —B9òuõƒÄ[^_]Ã1íë¿UWVSƒì‰Ã…Àtk‹@(4•,0‹}B‰T$ …ÿt9 tM1Òë9L•tBB9úuõ‹S$•‰L$è®úÿÿ…À‹L$t,ÿC$‰C(Æ‹‹T$ Ú‰ C‰°ƒÄ[^_]Ãf°ƒÄ[^_]Ã1ÀëôfUWVSƒì‰Å‰×‰Î‹\$0…Ût;‹C,¨@u4ƒÈ@f‰C,ŠC.ƒè‰{‹)‰kDmÁà‰D$‹D$@‹‰D$‰<$èëÇC ÿÿÿÿ°ƒÄ,[^_]ËzëÊv1ÀƒÄ,[^_]ÃfWVSƒì‰Ç‰Ö‰ËIC‰$‰øèXÿÿÿ„Àt4KVC‰$‰øèAÿÿÿ„Àt‹C(‰F(‹C,‰F,‹C0‰F0°ƒÄ[^_Ãf‹V‰øèîiÿÿ‹V‰øèäiÿÿ1ÀƒÄ[^_ÃvUWVSƒì‰Å‹¸Ü ‹G‰D$…Àt~‹E‰D$‹@‰$…À~4‹]H‹O 1À1Ò‰|$ v‹4‹|‰4‰|‹t‰tBƒÀ;$uá‹|$ ‹D$‹P$…Ò~.1Û1ö‰$‰Ã‹ $O‹$UT1ÀèÿÿÿFƒ$49s$ã‹G‰D$‹‰…Ü ‹D$ƒÄ[^_]ÃUWVSƒì‰D$‰Ó‹‰$‹‰T$ ‹€Ü …À„ª‹h…턳‰]…Û„€‹D$ ‹@‰D$…À~-‹] ‹$‹JH1À1Ò‹4‹|‰4‰|‹t‰tBƒÀ;T$uà‹L$ ‹Y$…Û~91Û1ö‰Ïë FƒÃ49w$~'‰Ù‹$HT‹UÚ‹D$è5þÿÿ„ÀuÝ1ÀƒÄ[^_]Ãv‹$‰ªÜ °ƒÄ[^_]Ë$‹¨Ø …í…Pÿÿÿvº‹D$èªÀÿÿ‰Å…Àt·‹T$ ‹B@Áâ‹D$èŽÀÿÿ‰E ‹L$ ‹A$@Áâ‹D$èrÀÿÿ‰E‹U …ÒtQ…ÀtM‹L$ ‹A @Áá1ö‰×‰ðóª‹T$ ‹B$@ Áá‹U‰×‰ðóª‹$‹‚Ü ‰EÇE…Àt/‰hé¬þÿÿ‹D$èžgÿÿ‹U‹D$è’gÿÿ‰ê‹D$è‡gÿÿ1Àéÿÿÿ‹ $‰©Ø éwþÿÿfUWVSƒì‰Å‹D$0‹]8‰\$ 8L$8”D$ ‹½œ ‹2‹U4ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ërëC9ët¶ ‰ò‰øè+gÿÿ8D$ t鉨+D$ ƒÄ[^_]Ãv‹T$ ‚‹D$4,‚9ër ëƒÃ9Ýv‹ ‰ò‰øèîfÿÿ8D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹T$ B‹D$4,B9ër ëƒÃ9Ýv· ‰ò‰øè­fÿÿ8D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‹D$0‹]8‰\$ 8L$8”D$ ‹½œ ‹2‹U4ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ëwëK9ët¶Kÿ‰ò‰øè.fÿÿ8D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹T$ ‚‹D$4,‚9ëw ëƒë9Ýs‹Kü‰ò‰øèñeÿÿ8D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹T$ B‹D$4,B9ëw ëƒë9Ýs·Kþ‰ò‰øè°eÿÿ8D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰D$‰Ë‹|$@€z.Av 1ÀvƒÄ,[^_]öJ.ÿ$\DÂfÇD$‰Ù‹D$+H@9ùv‰ù‰ß)ω<$‰Ù‹D$è¯}ÿÿ)ÉØë½ÇD$‰Ù‹D$+H@9ùv‰ù‰ß)ω<$‰Ù‹D$è;{ÿÿ)ÉØëÇD$‹D$‹HD)Ù9ùv‰ùÙ‰ $‰Ù‹D$èzÿÿ)Øé^ÿÿÿfÇD$‹D$‹HD)Ù9ùv‰ùÙ‰ $‰Ù‹D$è%|ÿÿ)Øé.ÿÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‰Ù+H@‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èè—ÿÿ)ÉØéØþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$èG•ÿÿ)ÉØéžþÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èy“ÿÿ)Øéfþÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‹@D)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèc’ÿÿ)ØéþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$è3‘ÿÿ)ÉØéâýÿÿfŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$è—üÿÿ)ÉØé¦ýÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èaûÿÿ)ØénýÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èÿÿ)Øé6ýÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‰Ù+H@‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èè=Žÿÿ)ÉØéàüÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$裌ÿÿ)ÉØé¦üÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$è‹ÿÿ)Øénüÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‹@D)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèÓ‰ÿÿ)Øé$üÿÿ‰Ú‹D$+P@9úv‰ú‰Ù)ÑÇ$‰Ú‹D$èÃCÿÿ)ÉØéöûÿÿf‹D$‹HD)Ù9ùv‰ùÙÇ$‰Ú‹D$èÅBÿÿ)ØéÊûÿÿf‹D$‹P8‹p4ÇD$‰Ø‹L$+A@9øv‰ø‰ß)lj<$‰Ù‰ðèWˆÿÿ)ÉØéŽûÿÿf‰Ø‹L$+A@9ø†{ûÿÿ‰øétûÿÿ‹T$‹BD)Ø9ø†cûÿÿëæ‹D$‹P8‹p4ÇD$‹@D)Ø9øv‰ø؉$‰Ù‰ðè!‡ÿÿ)Øé.ûÿÿfUWVSƒì\‰D$LˆL$;‹*‹B‰D$4‹Z‹D$L‹‰D$,„Ét‹P`‰T$<‰×+x@9|$4~'1í‰èƒÄ\[^_]ËD$,‹@`‰D$<‹T$,‹zD)Ç9|$4Ù‹D$,‹€  ‰D$ ‹T$,‹r8‹‚œ ‹@4‰D$$‹D$LèÛ_ÿÿ‹D$,‹@4‰D$@ƒøƒÇD$@ÇD$(Àf9ß~‰ß‹D$@¯ÇèuŸÿÿ‰Ã…À„+‹T$,‹‹@8‹@ ‹¨‰D$H…À„9|$4‰ú÷Ú‰T$0f€|$;„Å‹D$0‰D$D…ÿ~91í‹T$<ЉD$‹D$è‰D$‰4$ÿT$ ‰$ÿT$$‰D$‰l$‰$ÿT$(E9ýuÔ‹D$@‰D$‰|$Ç$‰Ù‹T$H‹D$,èÒÍÿÿƒøte…ÀuOÿD$09|$4Žvÿÿÿ‰Å‰$ÿƒÄf‹D$Lè®^ÿÿ‰èƒÄ\[^_]Äÿþÿÿƒ|$@t6ƒ|$@…þÿÿÇD$(dÀféèþÿÿv‰|$D1Àé8ÿÿÿ‰Å‹D$D‹T$,B`ë¡ÇD$(¼Àfé½þÿÿ1íë‰$ÿƒÄf‹D$Lè>^ÿÿ½þÿÿÿé)þÿÿWVSƒì‰Æ‰ÓƒùŽ¥¡0ÄÁf‰$ÿ@ƒÄfÇD$ ÄÁf‰$ÿ<ƒÄf‰Ç…Àth‹C‰G‰G ÇG‰wÇG8ƒÿ‹V …Ò~N‹CHèö¿ÿÿ‰G4…Àto‹V ‰W0‹C@‰G‹CD‰G€»- tD‹C`‰G ‹C\‰G$‹CL‰G(‹CP‰G,‰øƒÄ[^_ÃvÇG4ë»vuB‹=¬ƒÄfÿ‰øƒÄ[^_ËC\‰G ‹C`‰G$ëºf‹H‰…Àt1ÿë·v‹G‰<$ÿP1ÿë§v1Ò‰Èè—Wÿÿ1ÿë—vVSƒì$‹t$0Š\$4ˆ\$‹¬ƒÄf9Þt …É~;H ~$€|$t51Ò1À‰T$‰D$‰4$ÿLƒÄfƒÄ$[^ÃfDIý‹B…Àt΋‹RëÒvÿ‰ØƒÄ$[^ÃfSƒì‰Ã‰È…Òxp;S0k…Òt?TRý‹K4Ñ‹ …Éx'‹R…Òx ‹C)‰T$)Á‰L$‹C ‰$ÿLƒÄfƒÄ[ÃÿƒÄ[ËS‹C$)ЉD$‹C )ЉD$‹C ‰$ÿLƒÄfƒÄ[Ãf1Ò¸òÿÿÿèœVÿÿ1ÀƒÄ[ÃWVSƒì0‹t$@¡¬ƒÄf‰D$,D$,‰D$ÇD$ üËÁfÇD$dEÂf‹D$H‰D$‹D$D‰$ÿˆ‚Äf…ÀtD‹F0‰$ÿlƒÄf‰Ç…Àt4‹^0…Û~-1Ûë v‰DŸ9^0~C‹L$,‰Ú‰ðèõþÿÿ…Àuå‹H‰…Àt 1ÿ‰øƒÄ0[^_ËG‰<$ÿP1ÿ‰øƒÄ0[^_ÃSƒì‰Ã‹‚¬ …Àt‰$ÿhƒÄf‹H‰…ÀtƒÄ[ËC‰$ÿPƒÄ[ÃfVSƒì$‹\$0‹C‹p0…ötA‹C,…Àx:‰D$Ç$ª5Âfÿ˜ƒÄf‰Æ‰D$‹C‹@0‰$ÿ¨‚Äf‹J‰…Òt…Àu ÿÀ‚Äf¡¬ƒÄfÿƒÄ$[^Ãv‹V‰4$‰D$ÿR‹D$ëÒSƒì‰$ÿƒÄf‰Ãƒøÿt‰ØƒÄ[ÃÿÌ‚Äf…Àtî1Ò¸ñÿÿÿè UÿÿëàUWVSƒì,‰Ã‰Ö‰ÍŠD$@ˆD$‰Èè°ÿÿÿ‰Çƒøÿt9…Àx‹9ø|‰øƒÄ,[^_]À|$t ‹|8…ÿàv¿ÿÿÿÿ‰øƒÄ,[^_]á̂Äf‰D$ÿÐ…ÀtÍ‹‹5À‚Äf‹x,…ÿt;ÿÖ‰l$‹‹@,‰$ÿ8ƒÄf‰Ã…Àt!è3ÿÿÿ‰Ç‹H‰…Àt ƒÿÿu„ÿT$…À„xÿÿÿÿÖ¿ÿÿÿÿélÿÿÿv‹C‰$ÿPëÕWVSƒì‰Ã‰×‰Î‹B÷@Tt$S0CÇ$‰ùèÿÿÿ‰D$‰$ÿÖƒÄ[^_øóÿÿÿèòSÿÿ1ÀƒÄ[^_ÃUWVSƒì,‰D$‰Ö‰L$‹j…íu ÇD$‹D$‰$ÿT$‰Ç‰øƒÄ,[^_]ÃýtK‰,$ÿlƒÄf‰Ç…Àtá…í~Ý1Ûë ‰DŸ C9ëtЋTž ‹L$‹D$èBÿÿÿ…Àuâ‹H‰…Àt%1ÿ‰øƒÄ,[^_]ËR ‹L$‹D$ƒÄ,[^_]éÿÿÿ‹G‰<$ÿP1ÿë€v¹œ3Àf‹T$‹D$é>ÿÿÿf¹°4Àf‹T$‹D$é*ÿÿÿf¹¨5Àf‹T$‹D$éÿÿÿf¹¼9Àf‹T$‹D$éÿÿÿf¹¨¡Àf‹T$‹D$éîþÿÿf¹¢Àf‹T$‹D$éÚþÿÿf¹t¢Àf‹T$‹D$éÆþÿÿfWVSƒì‰Ã‰×‰ÎŠL$ ‹B÷@Tt$S0C¶É‰ $‰ùèuýÿÿ‰ñ‰Â‰ØƒÄ[^_éHûÿÿ¸óÿÿÿèbRÿÿ1ÀƒÄ[^_ÃUWVSƒì,‹D$@‰D$‹t$D‹n…íu‹ ¬ƒÄf1Ò‹D$ƒÄ,[^_]éûÿÿfƒýtS‰,$ÿlƒÄf‰Ç…Àt:…í~61Ûë ‰DŸ C9ët)‹Tž Ç$‹ ¬ƒÄf‹D$è9ÿÿÿ…ÀuÙ‹H‰…Àt01ÿ‰øƒÄ,[^_]ËV ÇD$@‹ ¬ƒÄf‹D$ƒÄ,[^_]éÿþÿÿv‹G‰<$ÿP1ÿëÅvUWVSƒì,‰D$ÿ¬‚Äf‰Å…À„ËT$‹B‹@,…À„±‰$ÿ ƒÄf‰Ã…À„‘‹@…ÀŽÍ‹C ‹0…ött1ÿë…ÀxlG9{޲‹C ‹4¸…ötXÇ$‹ ¬ƒÄf‰ò‹D$èdþÿÿ…À„œ‰D$‰t$‰,$‰D$ÿ´‚Äf‹T$‹ I‰ …Éu¦‹J‰$‰D$ÿQ‹D$…Ày•‹H‰…Àt/‹EH‰E…Àt 1í‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãv‹C‰$ÿP‹EH‰E…ÀuÈëÒf‹H‰…Àu½‹C‰$ÿP벋H‰…Àu“‹F‰4$ÿPëˆUWVSƒì,‹t$@ÇD$nEÂf‹D$D‰$ÿ4ƒÄf‰Å…À„«‹F0@‰$ÿlƒÄf‰Ç…À„‰‹F0…Àx*1Ûf‹ ¬ƒÄf‰Ú‰ðèÙøÿÿ‰D$‰\$‰<$ÿtƒÄfC9^0}Ú‰ðèGþÿÿ‰Ã…Àt9‰D$‰|$‰,$ÿ$ƒÄf‹J‰…Òtc‹J‰…Òtt‹UJ‰U…Òt3ƒÄ,[^_]Ãv‹H‰…Àu ‹G‰<$ÿP‹EH‰E…Àtc1ÀƒÄ,[^_]ËU‰,$‰D$ÿR‹D$ƒÄ,[^_]Ãv‹S‰$‰D$ÿR‹D$‹J‰…ÒuŒ‹W‰<$‰D$ÿR‹D$‹UJ‰U…Ò…wÿÿÿ먋E‰,$ÿP1ÀƒÄ,[^_]ÃUWVSƒìL¡¬ƒÄf‰D$ûÿÿ1Ûééûÿÿvfƒ,ˆM‹O(‹W$„$‰D$‹CD‰D$‰4$‹t$D‹èyÿÿ‰Æ…öˆ·u9|$@…0þÿÿ‹T$@‹…À„xŒ$ø‰ $‹Œ$‰Øè½aÿÿ„À…äwFŠƒ- „À„Um;s@qùÿÿ1ÛéTûÿÿfÇD$‰,$‰ñ‰ú‰Øè‚]ÿÿ‰Æ9ÅŒ€úÿÿ1Ûé+ûÿÿ‹“  ‰T$l‹S8<ÀƒàHMÿ‰L$8NxA‰|$H‰\$P‰l$\‹|$l‰Õ‰Ãëv9t$8„YZÞx‰t$‰,$ÿ׃ø uä‹|$H‹\$P‹l$\FéúÿÿfÇD$‰,$‰ñ‰ú‰Øè²Yÿÿ‰Æ9Åðùÿÿ1Ûé›úÿÿÇD$‰,$‰ñ‰ú‰ØèÎ[ÿÿ‰Æ9ÅÈùÿÿ1ÛésúÿÿÇD$‰,$‰ñ‰ú‰Øè^Zÿÿ‰Æ9ÅŒ ùÿÿ1ÛéKúÿÿŠO/‹W(ÇD$‰l$‰4$‰ØèØpÿÿ‰Æ9Årùÿÿ1ÛéúÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@‰|$P‰Çë 9õ„@t$8‰t$‰$ÿ×8D$Huåé`ýÿÿŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@ ‰|$P‰Çë 9õ„t$8‰t$‰$ÿ×8D$Huåéýÿÿ„À„ˆ‹C<9Æý‹Cd9Æò1Ûémùÿÿv„À„<;s<„§øÿÿ1ÛéRùÿÿ‹‹  ‹S8<ÀƒàH‰D$8;s<„‚øÿÿ‰|$P‰\$H‰Ï‰Óë9õ„ˆXt$8‹T$H;r<„…X‰t$‰$ÿ׃ø uÙ‹|$P‹\$Hé@øÿÿ‹S8‹C4ÇD$‰,$‰ñèôiÿÿ‰Æ9ÅŒøÿÿ1ÛéÉøÿÿvfƒ,y ;³ „øÿÿ‰,$‰ñ‰ú‹D$Dè]—ÿÿ‰Æ…À‰ç÷ÿÿ1Ûé’øÿÿ‹S8‹C4ÇD$‰,$‰ñèÀhÿÿ‰Æ9ž÷ÿÿ1Ûéiøÿÿv‹O(‹S8‹C4‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èn‹„$…À…lðÿÿé·ýÿÿv‹„$‰E`‹S(¹‹D$DèEÙÿÿƒøŒ¦m„Šýÿÿ‹E`‰„$‹„$‹‰„$éðÿÿ‹„$‰E`‹C(‹8‹X‰\$4‹H‹D$D‹‹s`‰ò+S@9T$4:ýÿÿ‹ƒ¨ ‰D$L‹C8‰D$8‹D$D‰T$0‰L$,è,9ÿÿ‹‹@8‹@ ‹¸‰D$<…À‹T$0‹L$,„Kg‰Ï9Ñ~‰×9|$4+g)þ‰l$Hë^v‹T$8‰$ÿT$L‰é‰úèP/ÿÿ‰Å…í„g‰l$‹D$<‰$ÿPƒÄf‹MI‰M…É„ŸNƒø„ñN…À…ÈnOF9|$4Áf€»* ‹k4‰t$u•‹L$8‰ $ÿT$L‰é‰úèé£ÿÿ‰Å듺‹D$Dè‘ÿÿ„À„~k‹„ ÇD$…° ‰D$‰$蹋„$‹@(‹‰C‹„$‰C•´ ¹1À‰×óªÇ…Ä ‹„$‰…° ‹‰„$é„îÿÿ‹„$‰D$‰,$‹t$hÿV‹”$:B/„ó^öB- „¥ûÿÿŒ$„$‰$‹T$d‹D$Dè”ÿÿ„À„|l‹„$…À… îÿÿékûÿÿv‹C(‹0‹]Tº‹D$Dèÿÿ„À„Ojv†ƒ‹…„ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹… ‰C0‹”$‹B(‹x…ÿ… (1ÿ‹@…À„¥X1À‰ú„Ò„TS„À…Óe‹„$ø‰„$‹„$ü‰„$ébíÿÿ‹C(‹0‹‹D$DèªÍÿÿ„À„¦j‹]‹K…É~$‹EH1ÒvÇÿÿÿÿÇ@ÿÿÿÿÇ@ÿÿÿÿBƒÀ9Êuä‹K$…É~)‹ET1ÒÇ@Ç@ ÿÿÿÿÇ@Ç@ ÿÿÿÿBƒÀ49ÊuÜ‹\$T‹CX‹ð‹‰„$º‹D$DèãŽÿÿ„À…Ãìÿÿ»ðÿÿÿé‡ìÿÿ‹„$9D$XŒÛTöA- „íùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè‘ÿÿ„À„Žk‹„$…À…`ìÿÿé«ùÿÿv‹„$9D$XŒŒUöA- „ùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè¯ÿÿ„À„4j‹„$…À…ìÿÿéKùÿÿv‹´$Œ9´$„§\öC- „*ùÿÿŒ$„$‰$‹T$d‹D$D蘑ÿÿ„À„Oi‹„$…À…¥ëÿÿéðøÿÿ‹„$;„$Œ„~Q;Ed„uQöC- „ÉøÿÿŒ$„$‰$‹T$d‹D$Dè7‘ÿÿ„À„j‹„$…À…Dëÿÿéøÿÿv‹„$9D$XŒ¬VöA- „qøÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè“ÿÿ„À„Ti‹œ$…Û…äêÿÿé/øÿÿvº‹D$DèæŒÿÿ„À„@g‹…„ Š•2 ˆP‹…„ ‹• ‰‹D$DèÜ”ÿÿ„À„g‹| ‹» ‰|$4‹µŒ ‰t$<Š…0 ˆD$L‹½Ü ‹„$‰E`Æ…0 ‹„$‹PÇ$1É‹D$DèIæÿÿ‰Æ…Àˆ#g‹„$‹P(‰èèJÿÿ‰½Ü ŠT$Lˆ•0 ‹|$<‰½Œ ‹|$4‰» ‰| N…E÷ÿÿ‹„$‹‰„$‹E`‰„$éÖéÿÿ‹C(‹D@ý‹UH‹H…Ɉ^Z‹‰„$é®éÿÿ‹D$Dèá“ÿÿ„À„f‹µ ‰t$8‹| ‹» ‰|$4‹µŒ Š…0 ˆD$<‹½Ü ‰|$LÇE@‹„$Œ‰ED‹„$‰E`Æ…0 Š•2 ˆT$H‹„$‹PÇ$1É‹D$Dè)åÿÿ‰Ç…Àˆve‹„$‹P(ƒÂ‰èè'ÿÿ‹L$p‰MD‹D$X‰E@‹T$L‰•Ü ŠL$<ˆ0 ‰µŒ ‹D$4‰ƒ ‰| ‹„$€x/„NO„÷c‹E‹X…Û„õõÿÿ‹‰…Œ éèõÿÿ‹„$9D$pïVöA- „ÍõÿÿŒ$ÇD$„$‰$‹T$d‹D$DèïŒÿÿ„À„f‹”$…Ò…@èÿÿé‹õÿÿv‹C(‹D@ý‹UH‹x…ÿˆnõÿÿ‹p<þ‹\$h‹[8‰\$4‹„$ …ÀˆbN‹„$‰D$‹t$|‰4$ÿT$t”$܉T$‰$ÿT$4‰Ã‹„$ ‰D$‰4$ÿT$t”$ì‰T$‰$ÿT$4‰Æ‹”$ ‹„$;W 9Ë„$9D$pØ@1ÛÇ„$;´$Ž47‹„$9Ã~‹”$‹Œ”ì9Œ„Ü„À@‹„$ö@- „!\Œ$ÇD$”$‰T$‰t$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$D讉ÿÿ„À„¼[€¼$„¨Z‹„$9à …Û~ÿ„$‹”$ ;´$þþÿÿB‰”$ ;WŒöþÿÿÇ„$ ÿÿÿÿ9ÃÊóÿÿ9´$Œ½óÿÿ‹„$‹‰„$éXæÿÿ‹C(‹D@ý‹]HËp…öˆŽóÿÿ‹P4ò‹\$h‹[8‰\$4‹Œ$ …ɈêL‹„$H‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰Ã‹„$ H‰D$‹|$|‰<$ÿT$t”$܉T$‰$ÿT$4‰Ç‹”$ ‹„$f;ŽAX…Àް5‹„$…ÀŽ,?‹„$…À~H‹”$J‹Œ”Ü9Œ„ì„97‹„$ö@- „,ZŒ$ÇD$ÿÿÿÿ”$‰T$‰|$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$Dè݇ÿÿ„À„áY€¼$„Z‹„$…ÀŽ5‹”$ ‹Œ$…ÉÿÿÿJ‰”$ é ÿÿÿ‹„$;„$Œ„oG‰D$‹\$|‰$ÿT$tƒø „PG‹„$ö@- „ØñÿÿŒ$„$‰$‹T$d‹D$DèFŠÿÿ„À„ãc‹”$…Ò…Säÿÿéžñÿÿf‹„$‰D$‰,$‹t$hÿV(„À‹„$„H‹‰„$éäÿÿ‹C(‹0Ç$‹Œ$‰ò‹\$D‹è"dÿÿ„À…Bñÿÿ‹œ$‹C(‹P‹Œ$‹{…Ò…[1ÿ;x‚]‹”$¯{ ú‰”$‹‰„$é¦ãÿÿ‹C(‹0‹]Tº ‹D$D訅ÿÿ„À„j`v†ƒ‹…„ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹… ‰C0‹”$‹B(‹x…ÿ…j1ÿ‹@…À„rM1À‰ú„Ò„¹H„À…´[‹„$‰„$‹„$‰„$éðâÿÿ‹s,‹¼$f…öˆùS‹[$‰ø+D$X‰D$4…Û„ÈHƒû†±Tº«ªªª‰Ø÷âÑê;T$4~ æ „òïÿÿ‹t$h‹v8‰t$4‹„$ …Àˆ7IO‰|$‹\$|‰$ÿT$t”$܉T$‰$ÿT$4‰Æ‹„$…ÀŽg[‹Œ$‹”$ ‹Y(¼$Ü…ÒŽ$R…ÀŽ8;‹T“ü‰T$‹„„؉D$‹D$h‰$èe<ÿÿ„À„ ,‹”$ J‰”$ ‹„$H‰„$…À§ÿŒ$ëž‹C,‹Œ$f…Àˆ´R‹S$+L$X9Ê~ öÄ „ïÿÿ‹„$ …Àˆ¶T‹[(…À~x‹”$9T$XŒÀ0‹„$ö@- „óUÇD$ ÿÿÿÿ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$Dè*Šÿÿ„À„ÖU€¼$„¸U‹„$ …Àˆ‹œ$Ç„$ ÿÿÿÿ‹‰„$éáÿÿ‹C,‹Œ$f…ÀˆŽP‹S$+L$X9Ê~ öÄ „.îÿÿ‹„$ …Àˆ T‹[(ëef‹„$ö@- „ÛTÇD$ ÿÿÿÿ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$Dèf‰ÿÿ„À„”T€¼$„ T‹„$ …ÀŽS‹„$9D$X}ˆH‰D$‹t$|‰4$ÿT$t‹”$ J;“…gÿÿÿ‰Ð‰”$ ÿŒ$븋„$;„$Œ„F;Eh„FöC- „FíÿÿŒ$„$‰$‹T$d‹D$Dè´…ÿÿ„À„•^‹„$…À…Áßÿÿé íÿÿ‹„$‰D$‰,$‹\$hÿS ‹”$:B/„PNöB- „ÝìÿÿŒ$„$‰$‹T$d‹D$DèK…ÿÿ„À„6^‹„$…À…Xßÿÿé£ìÿÿv1Ò‹D$Dè¿ÿÿ„À„U\º ‹D$DèGÿÿ„À„5\‹„$‹‰„$éßÿÿ‹„$9D$pFöA- „GìÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèiƒÿÿ„À„ü]‹”$…Ò…ºÞÿÿéìÿÿ‹„$9D$p^LöA- „éëÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè ƒÿÿ„À„®\‹„$…À…\Þÿÿé§ëÿÿv‹„$9D$XŒâJöA- „‰ëÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè«‚ÿÿ„À„Š\‹„$…À…üÝÿÿéGëÿÿv‹C(‹‰T$8‹@‰D$4‹uHºV‹D$Dèëÿÿ„À„[‹T$8|Rýþ‹…„ ‹L$8‰H‹L$4‰H ‹J‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9Btÿ… ‰B‹A(‹X…Û…™K‹‰„$éNÝÿÿ‹C(‹0v†‹MT™‹K,ÇD$Ç$‰ò‹D$Dèžÿÿ„À„æY‹C(@‰C(‹½ ‹”$9{0„‰N‹J(‹y9ø‚«G„¤1ÿ‹A9C(‚\Y‹Œ$ƒÂ„$ø‰$‰èèÍBÿÿ„À•Á‰ú„Ò…z?„É…r?ÿK(éîéÿÿ‹¼$…ÿ…A‹‰„$éÜÿÿ‹„$‰D$‰,$‹\$hÿS‹”$:B/„¨KöB- „¢éÿÿŒ$„$‰$‹T$d‹D$Dè‚ÿÿ„À„ÓZ‹œ$…Û…Üÿÿéhéÿÿ‹C,‹”$f…ÀˆK‹s$‹|$p)×9þ~ öÄ „?éÿÿ‹„$ …ÀˆàN‹[(ëfv‹„$ö@- „ÑOÇD$ ”$‰T$”$ ‰T$‰$Œ$‹T$d‹D$Dèv„ÿÿ„À„ŠO€¼$„lO‹„$ 9ÆŽaN‹„$9D$p~ˆ‰D$‹D$|‰$ÿT$t‹”$ ;“…iÿÿÿB‰„$ ÿ„$빋s,‹¼$‰|$/ÿK(é%Ûÿÿ‹…Ü ‹XºY‹D$DèÖoÿÿ„À„zJ‹…„ ‰‹• ‰P…Û„‚-‰œ$‹D$DèÉwÿÿ„À„§J‹D$D‹‰D$L‰Ã‹‹@$‰D$4…À„]-‹³” …ö„ÐG‹~‰|$<…ÿ„×G‹D$4…ÀŽÊ@1Û1ö‰l$8‹l$L‹|$<ëFƒÃ4;t$4„¥@‹MTÙ‹WÚ‹D$DèC¬ÿÿ„ÀuÛ»÷ÿÿÿéËÌÿÿ‹„$9D$XŒ¯7öA- „2ÚÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèTqÿÿ„À„£L‹¼$…ÿ…¥ÌÿÿéðÙÿÿ‹„$9D$pR8öA- „ÕÙÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè÷pÿÿ„À„àJ‹”$…Ò…HÌÿÿé“Ùÿÿv‹„$9D$p­4öA- „uÙÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè—pÿÿ„À„L‹„$…À…èËÿÿé3Ùÿÿv‹„$‰E`‹C(‹‹p‰´$”‹p‹D$D‹‰„$œ‹x`‰¼$˜‰ù+H@‹„$”…À„}/ƒ¼$”†i=º«ªªª‹„$”÷âÑê9ÊÃØÿÿ‹¼$œ‹¿  ‰|$\‹¼$œ‹8‰|$l‹¼$œ‹‡œ ‹@8‰„$€‹4‰¼$ ƒÿƒx-Ç„$ Ç„$¨¤ÀfÇD$LÀf‰t$H‹D$DècÿÿƒÆ‰´$„‹„$ ¯ÆèTÿÿ‰Æ…À„7J‹¼$œ‹‹@8‹@ ‹˜‰„$¤…À„J‹T$H9”$”‹œ$˜)Ó‰\$Pœ$܉¬$¬v‹¼$˜9|$P»0‹l$H…í޶0‹¼$˜ÇD$<O‰|$‹l$l‰,$ÿT$\‰\$‰$ÿ”$€‰D$4D$<…À~3‹”$„+T$<1í‰|$8‰×‹«‰D$/‰D$‰4$ÿT$LE;l$4uä‹|$8;|$Pt ‹T$H9T$<|“‹l$<9¬$” ‹T$H9ÕŽ,*‹D$<;D$H~‹D$HG‰|$PH‰D$H‹l$H9¬$”Ž%ÿÿÿ‹¬$¬‰4$ÿƒÄf‹D$DèÜÿÿéãÖÿÿ‹„$‰E`‹S(1É‹D$Dèw²ÿÿƒøŒoF„¼Öÿÿ‹E`‰„$‹„$‹‰„$éMÉÿÿ‹„$9D$p2öA- „‚ÖÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè¤mÿÿ„À„I‹„$…À…õÈÿÿé@Öÿÿ‹„$‰E`‹C(‹‹p‰´$€‹p‹D$D‹‰„$”‹x`‰¼$„‹HD)ù‹„$€…À„å,ƒ¼$€†ƒ:º«ªªª‹„$€÷âÑê9ÊÓÕÿÿ‹¼$”‹¿  ‰|$P‹¼$”‹8‰|$\‹¼$”‹‡œ ‹@8‰D$l‹4‰¼$˜ƒÿƒÅ*Ç„$˜ÇD$<Àf‰t$8‹D$Dèÿÿ‰ðƒÀ¯„$˜è?Qÿÿ‰Ç…À„ìE‹´$”‹‹@8‹@ ‹˜‰„$œ…À„ËE‹T$89”$€á”$„‰T$Hœ$܉¬$ f‹l$H9¬$„Õ-‹D$8…ÀŽÉ-‹¬$„1öf‰l$‹L$\‰ $ÿT$P‰\$‰$ÿT$l‰D$4…À~,1Ò‰l$L‰õ‰Ö‹³‰D$.‰D$‰<$ÿT$‰´$9D$H‡:@‹S‹t$<‰V,‹S ‰V(‹•| ‹Š I‰Š …Éu‹’ …Òt‰•| 9D$H‚ºÏÿÿ‹„$‹‰„$éUÂÿÿ‹3‰ò‹D$D蟢ÿÿ…ötN‰èèïþÿ‹C‰… ‹E‹@$‰D$4ƒøt/‹½” ~1Û1ö‹OÙ‹UTÚ1Àè?¡ÿÿFƒÃ4;t$4u勉…” ‹…| ‹ J‰ …Ò…*Ïÿÿ‹€ …À„Ïÿÿ‰…| éÏÿÿ‹‰„$‹S R ŠÁá‹uTñ‰L$4‹y,‰¼$‹q(‰t$<‹p ‰t$8‹t$<¯t$8þ‹@(‹@‰D$LÇD$Ç$‰ñ‹D$DèO‚ÿÿ„À„u8‹”$‹B(‹L$<9H„‹L$L¯L$8ù‰L$<‹zŠO/ˆL$H‹‰D$LöG- „O‹|$8÷߉|$H‰÷+|$8´$ø‰l$\‰\$P‰óë9|$<„¢‹”$|$H‰þ‰$‰ù‹D$\èÛ&ÿÿ„Àt×Ç$‰ù‹T$L‹l$D‹EèÖ@ÿÿ„Àuº‹l$\‹\$P‰ò+”$ˆÛ5‹¼$‰|$8‹G(;P‡é=‹K‹|$4‰O,‹[ ‰_(‹| ‹» O‰» …ÿu‹› …Ût ‰| ‹\$8‹C(;P‚…Íÿÿ‹L$8‹‰„$‰´$éÀÿÿ‹MH‹CH@Ñ€{t‹s tvý ñ‹q…ötN‰q@Áà‹t$TFL€x‹t 9Btÿ ‹‰B‹C‰B‹…| ‹ J‰ …Ò…þÌÿÿ‹€ …À„ðÌÿÿ‰…| éåÌÿÿ‰èèUìþÿŠCˆ…2 ‹‰… ‹…| ‹ J‰ …Ò…±Ìÿÿ‹€ …À„£Ìÿÿ‰…| é˜Ìÿÿ‰èèížÿÿ‹…| ‹ J‰ …Ò…vÌÿÿ‹€ …À„hÌÿÿ‰…| é]Ìÿÿ‹}T‹s‹KÇD$Ç$‰ò‹D$DèÝÿÿ„À„ù5v†‡‹S ‰P(‹S‰P,‹S‰P0‹…| ‹ J‰ …Ò…ûËÿÿ‹€ …À„íËÿÿ‰…| éâËÿÿfÇD$‰\$…° ‰$覈‹…| ‹ J‰ …Ò…«Ëÿÿ‹€ …À„Ëÿÿ‰…| é’Ëÿÿf‹K4I ±‹uT Ž‹s ‰q(‹s‰q,‹[‰Y0‰‚ …À…aËÿÿ‹‚ …À„SËÿÿ‰…| éHËÿÿ‹D$D‹‹ƒ° ‹@(‰D$4‹³„ ‹N‰L$L‹>‰|$8‹F‰„$¼¾F‰D$P‰„$ľF‰„$ȾF‰„$Ô¾N‰Œ$ÀÿŒƒ´ ÿ‹À ‹T$4|‚‹)“Ä ÿ‹Ì ‹?)»Ð €¼$Š„ó ‹|$L;{X•D$HŠT$HˆT$<ŠT$Hˆ”$Ø…ÉŽ´‹T$P…Ò• T$<ˆ”$Øëf”$°‰Øèú>ÿÿ„À‹„$Ô…+ @‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$ ÿÿÿÿéÊÿÿv‹D$D‹‹ƒ° ‹x(‹³„ ‹N‰L$<‹‰L$L‹N‰L$8¾F‰D$4‰„$ľF‰„$ȾF‰„$̾F‰„$Ô¾V‰”$ÀÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Št ‹L$<;KX„Ⲉ”$Øë v”$°‰ØèV>ÿÿ„À‹„$Ô… @‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$ ÿÿÿÿéûÈÿÿv‹D$D‹‹ƒ° ‹x(‹³„ ‹V‰T$4‰”$´‹‰L$<‹F‰„$¼¾F‰„$Ô¾V‰”$ÀÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„Î‹T$4;SX•ˆ”$Øë v”$°‰Øèz<ÿÿ„À‹„$Ô…ó@‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$ ÿÿÿÿéÈÿÿv‹D$D‹‹ƒ° ‹x(‹³„ ‹N‰L$4‹öA-@„‹C@‰D$<ÇD$Lÿÿÿÿº‰Ø‰L$,è}èþÿ„À‹L$,„u‹D$<9D$4„gÿF‹“¸ B‰“¸ ‹ƒÀ @‰D$<‰ƒÀ ‹GƒÄ ÿƒÌ ‹GƒÐ ŠFˆƒ2 ‹F ‹@(‹x 9»¼ r;Pr‹P9“´ r ‹|$<;xs vƃ2 ‹D$L¯FD$4‰„$‰Œ$€½2 „=Æ…2 éöÆÿÿf‹K‹SÇD$Ç$‹D$Dèzzÿÿ„À„:1‹…| ‹ J‰ …Ò…³Æÿÿ‹€ …À„¥Æÿÿ‰…| éšÆÿÿf‰èèí˜ÿÿ‹…| ‹ J‰ …Ò…vÆÿÿ‹€ …À„hÆÿÿ‰…| é]Æÿÿ‹D$D‹‹ƒ° ‹x(‹³„ ‹F‰„$´‹‰”$°¾F‰„$ÔöB-@„{Ç„$Àÿÿÿÿ‹S@‰”$¸…Àx'ÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„y‹SX9”$´•ˆ”$Øë v”$°‰Øèz9ÿÿ„À‹„$Ô…@‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$éWÅÿÿv‰èèÅäþÿŠCˆ…2 ‹‰… ‹…| ‹ J‰ …Ò…!Åÿÿ‹€ …À„Åÿÿ‰…| éÅÿÿ‹ ‰Œ$‹K‰Œ$‰‚ …À…—·ÿÿ‹‚ …À„‰·ÿÿ‰…| é~·ÿÿf‹D$D‹‹ƒ° ‹x(‹³„ ‹V‰T$4‰”$´‹‰„$°¾F‰„$Ô¾V ‰”$ÀÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„õ‹T$4;SX•ˆ”$Øëf”$°‰Øè–7ÿÿ„À‹„$Ô…'@‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$éßÃÿÿv€¼$Š„3.‹M\‰Œ$€½- „/‹D$X9È„\-‹T$@ŠB.‰ñ‰ú‰èèÁÿÿ„À„á F9óuèÇ$‰ñ‹T$P‹\$D‹è´+ÿÿ„À„û;t$4|•é·þÿÿ‹T$8‹B(‹‹L$49L$X| ‹T$XB‰T$49t$4ÿöÿÿ‰l$L‹l$h‰|$8‰Ç‰\$lë v;t$4„¹‰ñ‹T$8‹D$Lè3ÿÿ„À„¢NFÿ‰D$‹\$|‰$ÿT$t‰|$‰D$‰,$èPÿÿ:D$\u¶Ç$‰ñ‹T$P‹\$D‹è+ÿÿ„Àuš‹l$L‹\$léþçÿÿ‹T$8‹B(‹‹L$49L$p ‹T$pJ‰T$49t$4ŽOöÿÿ‰l$L‹l$h‰|$8‰Ç‰\$lë v;t$4„ ‰ñ‹T$8‹D$Lèƒ ÿÿ„À„ò F‰t$‹\$|‰$ÿT$t‰|$‰D$‰,$è£ÿÿ:D$\u¹Ç$‰ñ‹T$P‹\$D‹èU*ÿÿ„ÀuéNÿÿÿ‹L$8‹A(‹‰D$L‹D$49D$p ‹T$pJ‰T$49t$4ަõÿÿ¶L$\‰L$8‰|$l‰\$\‹\$|ë v;t$4„ýÿÿ‰ñ‹T$l‰èèÙ ÿÿ„À„ÿüÿÿF‰t$‰$ÿT$t;D$L”À¶À;D$8uÅÇ$‰ñ‹T$P‹|$D‹èµ)ÿÿ„Àu©‹\$\鵿ÿÿ‹D$X9D$4~‰D$4;t$4Žõÿÿ‰\$L‹\$8‹K(‹S$„$‰D$‹\$4‰\$Fÿ‰$‹\$D‹èÂ'ÿÿ‰Ã…ÀxJ€.ué‰ñ‰ú‰èè) ÿÿ„À„Y N9óuèÇ$‰ñ‹T$P‹\$D‹è)ÿÿ„À„;t$4‚‹\$Lé‰ôÿÿ‹D$p9D$4~‰D$4;t$4qôÿÿ‰\$L‹\$8‹K(‹S$„$‰D$‹\$4‰\$F‰$‹\$D‹è»%ÿÿ‰Ã…Àx§€.„p9ÆuëF9ót‰ñ‰ú‰èè| ÿÿ„Àuì9Þ…zÿÿÿÇ$‰ñ‹T$P‹\$D‹èp(ÿÿ„À„i;t$4ŒuÿÿÿéKÿÿÿ‹T$8‹B$‹T$p)Â9T$4~‰T$4;t$4¼óÿÿD$4‰D$L‰\$\N‹\$L‰$‹T$8‹D$Dèu3ÿÿ‰Ã…Àˆ!ûÿÿ€.ué ‰ñ‰ú‰èèÝ ÿÿ„À„íF9óuèÇ$‰ñ‹T$P‹\$D‹èÐ'ÿÿ„À„þÿÿ;t$4|–éÓúÿÿ‹T$8‹B(‹‰D$L‹L$49L$X| ‹D$X@‰D$49t$4óÿÿ¶T$\‰T$8‰|$l‰\$\‹\$|ë ;t$4„ˆúÿÿ‰ñ‹T$l‰èèM ÿÿ„À„súÿÿNFÿ‰D$‰$ÿT$t;D$L”À¶À;D$8uÂÇ$‰ñ‹T$P‹|$D‹è&'ÿÿ„Àu¦élýÿÿ‹„$H‰D$‹t$|‰4$ÿT$t‰|$‰$ÿT$4‰Æ‰„$‹”$ é‘ÄÿÿÿŒ$é/ñÿÿ1Ûéx¦ÿÿ‰D$‹\$|‰$ÿT$t”$܉T$‰$ÿT$4‰Ãé¿ÿÿ@‰„$B‰”$鬿ÿÿ‹„$ H‰D$‹L$|‰ $ÿT$t”$܉T$‰$ÿT$4‰Ç‰„$éÀÿÿ¶Àÿ$…ØJÂf‹O$‰L$8‹D$Xȉñ9Æ}‰Á9L$<ŒÑöÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë*‹t$8ÆÇ$‰ñ‹T$L‹è&ÿÿ„À„ò N9Ï|+L$8‰<$‰ê‰ØèG1ÿÿ…ÀyËl$H‹\$<éröÿÿ‹W$‰T$8‹D$XЉñ9Æ}‰Á9L$<ŒSöÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë,v‹t$8ÆÇ$‰ñ‹T$L‹è†%ÿÿ„À„r N9Ï|”+L$8‰<$‰ê‰Øè'5ÿÿ…ÀyÃé{ÿÿÿ‹G$‰D$8‹D$p+D$89Æ~‰Æ9t$<Ûõÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë.v‰Æ+t$8Ç$‰ñ‹T$L‹è%ÿÿ„À„ú N9÷ÿÿÿ‹L$8ñ‰<$‰ê‰ØèS=ÿÿ…Ày¿éÿþÿÿ‹D$h‹@8‰D$H‹G$…À„O!1ÒÇD$8„$܉l$P‰t$\1í‰Ö‰\$l‰Ã‰\$‹G(‹°‰$ÿT$HÅF9w$wç‹t$\‰l$8‹l$P‹\$l‹D$8D$X9ð}‰ð9D$<Œõÿÿ‰l$H‹l$<‰\$<‹\$Dë.‹t$8ÆÇ$‰ñ‹T$L‹è:$ÿÿ„À„& F9ÅŒDþÿÿ‹O(‹W$´$‰t$‰l$+D$8‰$‹è!ÿÿ…Ày¬éþÿÿ‹T$h‹R8‰T$H‹G$…À„Y 1ÒÇD$8„$܉l$P‰t$\1í‰Ö‰\$l‰Ãf‰\$‹G(‹°‰$ÿT$HÅF9w$wç‹t$\‰l$8‹l$P‹\$l‹D$8‹L$p)Á‰È9ñ~‰ð9D$<ôÿÿ‰l$H‹l$<‰\$<‹\$Dë.‰Æ+t$8Ç$‰ñ‹T$L‹èN#ÿÿ„À„: Fÿ9ÅXýÿÿ‹O(‹W$´$‰t$‰l$D$8‰$‹è|!ÿÿ…Ày¬é,ýÿÿ‹G$‰D$8‹D$p+D$89Æ~‰Æ9t$<Œóÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë+‰Æ+t$8Ç$‰ñ‹T$L‹èÂ"ÿÿ„À„®N9÷Îüÿÿ‹L$8ñ‰<$‰ê‰Øèÿ@ÿÿ…Ày¿é³üÿÿ‹G(‹‰D$8¶|$H‰|$H‰ð‹t$|‰\$Pë ;|$<„ž‰øx‰D$‰4$ÿT$t;D$8”À¶À;D$HuÖÇ$‰ù‹T$L‹\$D‹è6"ÿÿ„Àuº‹\$P‰þé]áÿÿv‹G(‹‰D$8‰ð‹t$|‰\$Pë ;|$<„5‰øx‰D$‰4$ÿT$t‹\$8‰\$‰D$‹\$h‰$è üþÿ:D$HuÈÇ$‰ù‹T$L‹\$D‹è¿!ÿÿ„Àu¬ë‡‹G(‹8‰\$8ë ;t$<„N‰t$‹\$|‰$ÿT$t‰|$‰D$‹\$h‰$è¯ûþÿ:D$HuÌÇ$‰ñ‹T$L‹\$D‹èa!ÿÿ„Àu°‹\$8éŠàÿÿ‹G(‹8¶D$H‰D$8‰\$Hë ;t$<„äN‰t$‹\$|‰$ÿT$t9ø”À¶À;D$8uØÇ$‰ñ‹T$L‹\$D‹è!ÿÿ„Àu¼‹\$Hé)àÿÿv1Ûé ÿÿ1Û鈠ÿÿ‹|$P‰ÓéËŸÿÿ‹U‰,$‰D$0ÿR‹D$0éK±ÿÿ‹U‰,$‰D$0ÿR‹D$0éuÊÿÿ‹l$H{`‹D$Dè·éþÿ‹E`‰„$‹„$‹‰„$éT ÿÿ‹l$H){`‹D$Dèˆéþÿ‹E`‰„$‹„$‹‰„$é% ÿÿ»ðÿÿÿééŸÿÿ‹„$‹‰„$‰èè°ÿÿéÿŸÿÿ1ÛéÆŸÿÿ1Û鿟ÿÿ‹l$4‹\$TŠ›…ˆœ$‹éןÿÿH‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰ÃéÉïÿÿ‹„$„)ЉD$‰4$ÿ”$¨‹¬$ ‰l$‹l$<‰l$Ç$‰Á‹”$¤‹„$œè¤Wÿÿƒø„ý…À…eG‰|$P‹|$ÿÿ„À„{‹…„ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$éyœÿÿ‹l$L‹\$léèÿÿ‹T$@‹…À„Œ$ø‰ $‹Œ$‰ØèVÿÿ„À…}NŠƒ- „À„ ;s@ šÿÿ1Ûéí›ÿÿv1ÒéšÐÿÿ»ðÿÿÿéÙ›ÿÿö@- „Q©ÿÿŒ$„$‰$‹T$d‹D$Dè¿Aÿÿ„À„€‹„$…À…Ì›ÿÿé©ÿÿv1Òé2ÓÿÿöC- „©ÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè%@ÿÿ„À„Œ‹„$…À…v›ÿÿéÁ¨ÿÿöC- „¶¨ÿÿŒ$„$‰$‹T$d‹D$Dè$Aÿÿ„À„µ‹´$…ö…1›ÿÿé|¨ÿÿö@- „r¨ÿÿŒ$„$‰$‹T$d‹D$Dèà@ÿÿ„À„õ‹„$…À…íšÿÿé8¨ÿÿöC- „.¨ÿÿŒ$ÇD$„$‰$‹T$d‹D$DèP?ÿÿ„À„‹‹„$…À…¡šÿÿéì§ÿÿO„‹U‹J…Ét‹‰•Œ ‹‰„$éušÿÿ‹„$‹‰„$é`šÿÿ„À„¨§ÿÿ‹„$ø‰„$‹„$ü‰„$é7šÿÿ„À„§ÿÿ‹„$‰„$‹„$‰„$éšÿÿ‹‰„$éšÿÿ1ÒéE·ÿÿ‹‰„$éë™ÿÿ1Òéô¾ÿÿ‹l$H‹\$<é5Ùÿÿ‹\$Lé×ÿÿ‹¬$„1öé“Òÿÿ‹¼$˜ÇD$<é¹Ïÿÿ9D$p…ò¦ÿÿé3Åÿÿ‹‰”$ Ç„$Ç„$1À1ö1ÛéÒ±ÿÿÇ„$ Ç„$1À1Ò1öéϾÿÿ‰Ú‰œ$ Ç„$1À1öéí¶ÿÿ‹V‰”$ Ç„$Ç„$1À1ÿ1ÛéQ³ÿÿ‹„$‰„$‹„$‰„$éè˜ÿÿ1Û鯘ÿÿ‹„$ø‰„$‹„$ü‰„$éÀ˜ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‰Á‹‹D$hè=âþÿ‹Œ$:A/…þ¦ÿÿ‹A „$‹‰„$éq˜ÿÿ‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…C¹ÿÿ‹A „$‹‰„$é,˜ÿÿH‰D$‹t$|‰4$ÿT$tƒø „KÿŒ$‹„$‹‰„$é÷—ÿÿ‹B‰B‹L$4‹T$8‹D$DèXÿÿ„À„‹Œ$é]ÈÿÿH‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèfõþÿ‹Œ$:A/…óªÿÿ‹A „$‹‰„$é‚—ÿÿ‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hèõþÿ‹Œ$:A/…"Ëÿÿ‹A „$‹‰„$é9—ÿÿ‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚ 9Ø–À:A/…ËÍÿÿ‹A „$‹‰„$éï–ÿÿ‰D$‹\$|‰$ÿT$tƒø „Äÿ„$‹„$‹‰„$é»–ÿÿH‰D$‹t$|‰4$ÿT$t‰Á‹”$‹D$hèe÷þÿ‹Œ$:A/…Bªÿÿ‹A „$‹‰„$éq–ÿÿH‰D$‹\$|‰$ÿT$tƒø „9‹„$ö@- „—£ÿÿŒ$„$‰$‹T$d‹D$Dè<ÿÿ„À„<‹„$…À…–ÿÿé]£ÿÿº ‹D$Dè8ÿÿ„À„=‹…„ ‹”$‹R‰‹…„ ‹”$‰P‹„$ø‰„$‹„$ü‰„$鳕ÿÿƒÂ„$ø‰$‹Œ$‰èè¨ûþÿ„À•Àék²ÿÿ‹S(‹H‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è½ïþÿ‹Œ$:A/…¶¼ÿÿ‹A „$‹‰„$é=•ÿÿH‰D$‹\$|‰$ÿT$t‹Œ$‹Q(‹Z;‚L 9Ø–À8A/…Èÿÿ‹A „$‹‰„$éò”ÿÿƒÂ„$‰$‹Œ$‰èèçúþÿ„À•Àé8§ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‰Á‹‹D$hèKÞþÿ‹Œ$:A/…¬¢ÿÿ‹A „$‹‰„$é”ÿÿ‹•œ ‹Z H‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…> ÿŒ$‹„$‹‰„$é=”ÿÿ‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèèôþÿ‹Œ$:A/…}Çÿÿ‹A „$‹‰„$éô“ÿÿH‰D$‹t$|‰4$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…ɾÿÿ‹A „$‹‰„$颓ÿÿ‹•œ ‹Z ‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…V ÿ„$‹„$‹‰„$éa“ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~B1Év‹4Š9ów19÷r-°‹Œ$8A/…¼´ÿÿ‹A „$‹‰„$éç’ÿÿvA9ÁuÃ1ÀëÌ‹S(‹‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è íþÿ‹Œ$:A/…¤¹ÿÿ‹A „$‹‰„$é‹’ÿÿH‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…£Ÿÿÿ‹A „$‹‰„$éE’ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~?1É‹4Š9ów19÷r-°‹Œ$8A/…D³ÿÿ‹A „$‹‰„$éÏ‘ÿÿvA9ÁuÃ1ÀëÌ‹B‰B‹L$4‹T$8‹D$DèàQÿÿ„À„{‹Œ$é<´ÿÿ‰D$‹\$|‰$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…بÿÿ‹A „$‹‰„$éG‘ÿÿ‹‰„$é9‘ÿÿ‹‰„$é+‘ÿÿ9½ …¶ÿÿ‹„$ …À‰ùµÿÿ‹…$ ‰„$‹‰„$éõÿÿ9• …ä´ÿÿ‹Œ$ …ɉմÿÿ‹…$ ‰„$Ç„$ ÿÿÿÿ‹‰„$é´ÿÿ‹‰„$é¦ÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè5ÿÿ„À„‰‹„$…À…iÿÿé´ÿÿ9 …f¯ÿÿ‹”$ …Ò‰W¯ÿÿ‹…$ ‰„$Ç„$ ÿÿÿÿ‹‰„$é#ÿÿ;sDŽþÿÿ1Ûéáÿÿv‹œ$öC- „³‰l$4‰Ú…ÀŽâ œ$¼$ ¬$ë f‹”$ÇD$ÿÿÿÿŒ$‰L$‰t$ ‰l$‰|$‰$‰Ù‹T$d‹D$Dèä6ÿÿ„À„ €¼$„] ‹„$…À§ÿŒ$‹”$ésÿÿÿ‹‰„$é^ÿÿ‹C‰„$éOÿÿ€½0 …’œÿÿ驺ÿÿ‹‰„$é/ÿÿ‹‰„$é!ÿÿ‹‰„$éÿÿ9 …@­ÿÿ‹´$ …ö‰1­ÿÿ‹…$ ‰„$éÈ­ÿÿf9½ …û«ÿÿ‹„$ …À‰ì«ÿÿ‹…$ ‰„$‹‰„$鮎ÿÿ9• …T¿ÿÿ‹¼$ …ÿ‰E¿ÿÿ‹…$ ‰„$éÞ¿ÿÿ‹‰„$érŽÿÿ‹K,;Œ$…g±ÿÿ1ÿ銱ÿÿ‹Œ$9K,… ÀÿÿÆD$4é3Àÿÿ;sDŽŒÿÿ1Ûéÿÿÿ‹‰„$é"ŽÿÿºéÂÿÿºéƒÅÿÿºéP«ÿÿºé ³ÿÿÇ$‹Œ$‰ò‹|$D‹èÿÿ„À„v‹„$‹P(ÆD$4馿ÿÿ‰è‹¬$ ‹œ$”‰C`‰<$ÿƒÄf‹D$DèâÖþÿ‹E`‰„$‹„$‹‰„$éÿÿ‰ÆéÔáÿÿ‹\$8é3ÞÿÿÇ„$ ÿÿÿÿ…À¬šÿÿ‹Œ$…Éšÿÿ‹„$‹‰„$é8ÿÿ‰Æéqåÿÿ‰ÆéBàÿÿ‹\$HéåÝÿÿ‰Æéäÿÿ‰ÆéÏàÿÿ‰Æé¬äÿÿ‹œ$é3üÿÿÇ„$ 1Àé±ÿÿ‰”$ ‰Ðé<«ÿÿÇ„$ 1À饽ÿÿ‹œ$é†üÿÿ‰”$ ‰Ðéå«ÿÿ‹„$9D$pŽó™ÿÿ@‰„$Ç„$‹Œ$‹”$ 1À1öé÷±ÿÿ‹l$8‹|$<‹\$L‰»” éWìÿÿ‹¬$¬‹œ$œ‰{`‰4$ÿƒÄf‹D$DèƒÕþÿ‹E`‰„$‹„$‹‰„$é ŒÿÿÇ„$ ÿÿÿÿé`™ÿÿÇ„$ ÿÿÿÿéP™ÿÿ»ðÿÿÿéÄ‹ÿÿÇ„$ ÿÿÿÿé6™ÿÿ»ðÿÿÿ骋ÿÿÇ„$ ÿÿÿÿé™ÿÿÇ„$ ÿÿÿÿé ™ÿÿ‹Œ$ÇD$Ç$‰ò‹D$DèLÿÿ„À…ã˜ÿÿ»÷ÿÿÿéW‹ÿÿÇ„$ ÿÿÿÿéȘÿÿÇ„$ ÿÿÿÿ鸘ÿÿ»ðÿÿÿé,‹ÿÿÇ„$ ÿÿÿÿ鞘ÿÿ»ðÿÿÿé‹ÿÿÇ„$ ÿÿÿÿ鄘ÿÿÇ„$ ÿÿÿÿét˜ÿÿ»ðÿÿÿéèŠÿÿ»ðÿÿÿéÞŠÿÿÇ„$ ÿÿÿÿéP˜ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éàŠÿÿÇ„$ ÿÿÿÿé ˜ÿÿÇ„$¨ÌÀfÇD$L¼Àf鬿ÿÿ÷ÚéÊÿÿ‹F‰„$ éD¹ÿÿºS‹D$Dè¬,ÿÿ„À„Ý ‹…„ ‰p‹”$‰P‹… ‰C0‰S,‹„$‰„$‹„$‰„$éLŠÿÿÇ„$ ÿÿÿÿ…À‰—ÿÿéxûÿÿÇD$<¼ÀféýÁÿÿ‹Œ$éȹÿÿ‹Œ$éäžÿÿ‹‰„$ é··ÿÿ1ÀéêòÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éÚ‰ÿÿ‹‰„$ é§Ãÿÿ1Àé²ôÿÿ‹F‰„$ é¶±ÿÿÇ„$ ÿÿÿÿéö–ÿÿ»ðÿÿÿéj‰ÿÿÇ„$ ÿÿÿÿéÜ–ÿÿÇ„$ ÿÿÿÿéÌ–ÿÿ»ðÿÿÿé@‰ÿÿÇ„$ ÿÿÿÿé²–ÿÿ‹D$DèÒþÿ»þÿÿÿé‰ÿÿÇ„$ ÿÿÿÿ9ðŒŒ–ÿÿé4øÿÿÇ„$ ÿÿÿÿéw–ÿÿ‹D$8‰$‰Ú‰èè#mÿÿ‰Ã‹„$‹P(‹Œ$驵ÿÿ1ÛéÆˆÿÿÇ„$ ÿÿÿÿé8–ÿÿ»÷ÿÿÿ鬈ÿÿ»÷ÿÿÿ颈ÿÿÇ„$ ÿÿÿÿé–ÿÿ‰$‰ú‰èèÄlÿÿ‰Ç‹œ$‹C(9x†Ò¤ÿÿÇD$Ç$‹Œ$‰ò‹D$DèvIÿÿ„À…Ê•ÿÿ»÷ÿÿÿé>ˆÿÿ‹l$H‹D$Dè§Ñþÿ鮕ÿÿ‹D$Dè™Ñþÿ»þÿÿÿéˆÿÿ1Ûéˆÿÿ»÷ÿÿÿéˆÿÿÇ„$ ÿÿÿÿéz•ÿÿ»ðÿÿÿéî‡ÿÿÇ„$ ÿÿÿÿé`•ÿÿ»ðÿÿÿéÔ‡ÿÿ»ðÿÿÿéʇÿÿÇ„$ ÿÿÿÿé<•ÿÿÇ„$ ÿÿÿÿé,•ÿÿ‹l$H‹D$DèÑþÿé•ÿÿÇ„$ ÿÿÿÿé •ÿÿ»ðÿÿÿé~‡ÿÿº\‹D$Dèº)ÿÿ„À„k‹…„ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰PéÚ™ÿÿº[‹D$Dèg)ÿÿ„À„‹…„ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$éî†ÿÿ‹„$9D$X-”ÿÿH‰„$Ç„$‹Œ$‹”$ 1À1öél¤ÿÿ‹]TºZ‹D$Dèº(ÿÿ„À„{v†ƒ‹•„ ‹œ$‰‰r‹H,‰J‹H(‰J ‹”$‰P,‰x(é ¢ÿÿ„$ø‰$‹Œ$‹”$‰èèRìþÿ„À‹„$‹P(„¸ÿÿÆD$4é ¸ÿÿ1Ûéí…ÿÿ‹Œ$é&²ÿÿ‹Œ$é¼±ÿÿ„$‰$‹Œ$‹”$‰èèøëþÿ‹”$„À‹B(„¤¢ÿÿ¿霢ÿÿ1Ûé“…ÿÿ„$‰$‹Œ$‹”$‰èè¶ëþÿ‹”$‹J(„À„®¨ÿÿ¿馨ÿÿ‹\$L‹› ‰\$<…Û…)¸ÿÿº ‹D$DèZ'ÿÿ‰D$<…À„^¹ ‰Ç1Àóª‹\$4[ƒÁã‰Ú‹D$Dè+'ÿÿ‹|$<‰G…À„‰Ç‰Ù1Àóª‹|$<‰7ÇG…ö„‰~鸷ÿÿ„$ø‰$‹Œ$‹”$‰èèôêþÿ‹”$„À‹B(„.—ÿÿ¿é&—ÿÿ‹Œ$é ´ÿÿº!‹D$DèÆ&ÿÿ„À„‰‹…„ Š\$HˆX‹…„ ‹t$8‰0‹„$éþéÿÿ‰èèB±þÿŠ\$Hˆ2 ‹t$8‰µ 鱑ÿÿ»ðÿÿÿé%„ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé>óÿÿ‹l$4Ç„$ ÿÿÿÿé}‘ÿÿ‹l$4Ç„$ ÿÿÿÿéi‘ÿÿ»ðÿÿÿé݃ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé=õÿÿ÷Øé6Áÿÿ‹¬$¬‰Ç‰4$ÿƒÄf‹D$DèÍþÿ…ÿ‰÷ÿÿ‰ûé–ƒÿÿ1Ûéƒÿÿ‰s\‹„$ø‹´$üé ‚ÿÿ»ðÿÿÿéoƒÿÿ‰Ãéhƒÿÿ»÷ÿÿÿé^ƒÿÿ»÷ÿÿÿéTƒÿÿ»ðÿÿÿéJƒÿÿ1É齦ÿÿ»ðÿÿÿé9ƒÿÿ1Ûé2ƒÿÿ1ÀÇD$8éêßÿÿ1ÀÇD$8éóÞÿÿ»ðÿÿÿé ƒÿÿ»ðÿÿÿéƒÿÿ»÷ÿÿÿéö‚ÿÿ»÷ÿÿÿéì‚ÿÿ»ðÿÿÿéâ‚ÿÿ‰ÃéÛ‚ÿÿ»ðÿÿÿéÑ‚ÿÿ‰ÃéÊ‚ÿÿ»÷ÿÿÿéÀ‚ÿÿ»ðÿÿÿé¶‚ÿÿ»÷ÿÿÿ鬂ÿÿ»÷ÿÿÿ颂ÿÿ»ðÿÿÿ阂ÿÿ1Ûé‘‚ÿÿ1Û銂ÿÿ1Û郂ÿÿ1Ûé|‚ÿÿ»ðÿÿÿér‚ÿÿ»÷ÿÿÿéh‚ÿÿ‰Ãéa‚ÿÿ‰ù‹|$4‰W(éTÂÿÿ»ðÿÿÿéI‚ÿÿ»ðÿÿÿé?‚ÿÿ‹\$<‰C(éû¿ÿÿ»ðÿÿÿé)‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé ‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé÷ÿÿ»÷ÿÿÿéíÿÿ»ðÿÿÿéãÿÿ‰<$ÿƒÄf‹D$DèGËþÿ»þÿÿÿéÇÿÿ»ðÿÿÿé½ÿÿ»ðÿÿÿé³ÿÿ»ðÿÿÿé©ÿÿ»ðÿÿÿéŸÿÿ»ðÿÿÿé•ÿÿ»ðÿÿÿé‹ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéwÿÿ»ðÿÿÿémÿÿ»ðÿÿÿécÿÿ»ðÿÿÿéYÿÿ»ðÿÿÿéOÿÿ»ðÿÿÿéEÿÿ»ðÿÿÿé;ÿÿ»ðÿÿÿé1ÿÿ»ðÿÿÿé'ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéÿÿ»ðÿÿÿé ÿÿ»ðÿÿÿéÿ€ÿÿ»ðÿÿÿéõ€ÿÿ»ðÿÿÿéë€ÿÿ»ðÿÿÿéá€ÿÿ‰ú‹D$DèŒÊþÿ»÷ÿÿÿéÌ€ÿÿ»ðÿÿÿé€ÿÿ‹|$<‹\$L‰» é–³ÿÿ»ðÿÿÿ饀ÿÿ»÷ÿÿÿ雀ÿÿ»ðÿÿÿé‘€ÿÿ»ðÿÿÿ釀ÿÿ»ðÿÿÿé}€ÿÿ»ðÿÿÿés€ÿÿ‰4$ÿƒÄf‹D$Dè×Éþÿ»þÿÿÿéW€ÿÿ»ðÿÿÿéM€ÿÿ»ðÿÿÿéC€ÿÿ‹l$H‰Æ‹D$DèªÉþÿ…ö‰àÿÿ‰óé%€ÿÿ»ðÿÿÿé€ÿÿ‹l$H‰Æ‹D$Dè‚Éþÿ…ö‰Ãßÿÿ‰óéýÿÿ»ðÿÿÿéóÿÿ»ðÿÿÿééÿÿ»ðÿÿÿéßÿÿ»ðÿÿÿéÕÿÿ»ðÿÿÿéËÿÿ‹Œ$é­Éÿÿ»ðÿÿÿéµÿÿ»ðÿÿÿé«ÿÿUWVSƒì\‰D$$‰Ö‹(‰l$‹m‰l$4èÉþÿ‹l$€½- t)‹]`‹m@‰l$@9댆‰Ý+l$@‰l$H‹l$‹mD‰l$Dë+‹l$‹]`‹mD‰l$D9ëY‹l$D)݉l$H‹l$‹m@‰l$@‹l$4‹E öÄ•D$:öÄ€„ŠD$:ƒðˆD$9‹l$4€½„À÷Ћl$‰…Ô Š…0 ˆD$;1íÇD$(‹T$ƒÂl‰T$<‹L$Á´ ‰L$0‰ð¶ð‰t$Lf‹T$‰Z`ŠL$;ˆŠ0 ‹|$<‰º| Ç‚x ‹‚ˆ ‰‚Œ Ç‚„ ‰ZX‰Z\‰Ð‹‹J$…É~,‹@TƒÀ1ÉÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ4;J$|Ü‹zx…ÿ~5‹|$‹‡È ƒÀ1ÉfÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ(;Jx|Ü‹r…ö~,‹L$‹AH1ÉÇÿÿÿÿÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ9ñuÝ‹rT…ö~(‹|$‹‡à ƒÀ1ÉvÇÇ@ÿÿÿÿAƒÀ;JT|깋|$01Àóª‹T$Ç‚Ä Ç‚Ì Ç‚Ð Æ‚2 Ç‚ fÇ‚( ‹ŠÔ …É…ƒ‹L$H;Š˜ r …Éus€º0 tjÇD$,‹T$@‹D$‰P@‹L$D‰HD‹D$(…À…šƒ|$,„‹D$$èŒÆþÿ‹t$,…öyéõv‹D$$èsÆþÿÇD$,‹D$,ƒÄ\[^_]Ãv‹|$‹‹PÇ$‹L$L‹D$$èãxÿÿ‰D$,ƒøŒtÿÿÿ„nÿÿÿH„¹€|$:u€|$9„Uÿÿÿ‹D$‹P\9P`„Eÿÿÿ‹D$(…À„‹L$‹q\9Þ„‹D$$èßÅþÿ‹D$$‹‰D$‹‰T$ ‹T$ ‹B…À~|‹l$(ÇD$ÇD$ë.f‹E‰U‹KÁá‹s‰Çó¤ÿD$ƒD$ƒÅ‹D$‹|$ ;G}8‹\$‹L$YH‹‹S‰E‰U‹S;U v¶Áâ‹EèÇ5ÿÿ…Àtc‹S‰U ‰E럋D$$èÅþÿ‹l$‹]\‰è‹m`‹€Ô …À„‹L$‹Ð H‰Ô €|$9„½üÿÿ€¹- „‰i@‰YDé¥üÿÿ‹T$ ‹B…ÀŽf‹|$(1ö‹ƒÄf‹l$ ‹G‰$ÿÓFƒÇ;u|ï‹L$(‰ $ÿÓ‹D$$èÄþÿ‹D$@‹l$‰E@‹T$D‰UD‹D$$è’ÄþÿÇD$,÷ÿÿÿÿÌ‚Äf…À…þÿÿ1Ò‹D$,è¹¾þÿéþÿÿ‹—Ð …Ò…9þÿÿé›ýÿÿ;i`…gþÿÿ‹|$4‹_ …Û~*‹QH‹D$(1É‹89:…Iþÿÿ‹x9z…=þÿÿAƒÂƒÀ9Ùuß‹|$@‹L$‰y@‹D$D‰ADƒ|$,u‹|$‹‡Ð …À„‹T$‰r\‰j`‹D$$èÜÃþÿ‹D$$‹(‹U‹B…Àޝ1ÿ1ö‹ƒÄf‰\$‰Ó‹EH‹D8‰$ÿT$F‹CƒÇ9Æ|ç‹\$‹UH @Áá‰×‹t$(ó¤‹T$(‰$ÿÓ‹D$$èXÃþÿ‹l$ÇELÿÿÿÿÇEPÿÿÿÿ‹E‹HL‹x …ÿ~T‹EHº½ÿÿÿÿë2f‹X…Ûx/‹1‰Ó9õ}‹l$‰UL€y „¦‰UP‰õƒÀBƒÁ 9ß~‹0…öyʉӃÀBƒÁ 9ßí‹D$$èüÂþÿÇD$,‹D$,ƒÄ\[^_]Ë|$‰_@‰oDéúÿÿ‹D$$èÐÂþÿ‹D$$‹‰D$‹‰T$ ‹B@Áàè‚ÿÿ‰D$(…À„ðýÿÿ‹L$ ‹A @Áá‹|$(1Àóªé½üÿÿÆD$9éåùÿÿ‰õéXÿÿÿ‹ƒÄfé±ýÿÿ‹D$$ègÂþÿ‹l$$‹E‹(‹}…ÿ~I‹|$(1ö‹ƒÄfv‹G‰$ÿÓFƒÇ;u|ï‹D$(‰$ÿÓ‹D$$èÂþÿé¨þÿÿ‰Þéÿýÿÿ‹ƒÄfésþÿÿ‹ƒÄfëωÞé÷ýÿÿvWVSƒì ‰Ã@ ‰D$ÇD$T$‰ØèÆVÿÿƒ»P „-Œ‹‹L …É…ù‹ƒ@ 9ƒH |k‹“D €»9 „‰T$ÇD$‹C‰$ÿLƒÄf‰Æ…ö„¢‹ƒL @‰ƒL ‹S ;B ~ ǃL ‹T$‰Øè¨eÿÿ‰ðƒÄ [^_Ãv€»9 …Ï‹sP¿ë=ƒø…3€»; „¾‹Cl;Ch…²‹“D 9ò„Sÿÿÿø‰Clƃ< ºD$èž÷ÿÿ‰ƒP …Ày¬‹T$‰Øè%eÿÿ1öévÿÿÿf‹ST‹C ÇD$‹s‰4$è_cÿÿ‰Æé"ÿÿÿ‹T$‰Øèñdÿÿ‹5¨ƒÄfÿ‰ðƒÄ [^_ËCH‰D$‰T$‹C‰$ÿLƒÄf‰Æéèþÿÿf‹sL¿ÿÿÿÿékÿÿÿvÿƒH €»9 t]‹ƒD ‰D$‹Ch‰D$‹C‰$ÿLƒÄf‰Æ…À„Jÿÿÿ‹Cl‰ƒD €»; t4;Cht>ƃ< ‹ƒP …À…|þÿÿéBþÿÿ1öëî‹Ch‰D$‹ƒD ë¡Æƒ< ‹ƒP ëÏø‰Cl뻋T$‰Øèdÿÿ‹ƒP 1Òèò¹þÿ1öéWþÿÿvƒì‹D$ è˜ýÿÿ;¨ƒÄftƒÄËJ‰…Òt ¡¬ƒÄfÿƒÄËP‰$ÿRëêƒì‹D$ è`ýÿÿ;¨ƒÄftƒÄËJ‰…Òt1ÀƒÄËP‰$ÿR1ÀëßvWVSƒì‰Ã‰×p ‰t$ÇD$ T$èúSÿÿƒ»@ „Œ—‰ø¶ÐD$è­õÿÿ‰Á‰ƒ@ …Àˆ•‹C‰òè`ÿÿ‰Æ‰ø„Àu#‹Ch9Cl”ƒ< ‹T$‰Øècÿÿ‰ðƒÄ[^_Ãf€»8 tÔ€»9 ÀƒàHCh‰Clƃ< ëÅv‹T$‰ØèÑbÿÿ‹5¬ƒÄfÿ‰ðƒÄ[^_ËT$‰Øèµbÿÿ‹ƒ@ 1Ò蔸þÿ1öë•‹T$‰Øè™bÿÿ1ö놺‹D$éúþÿÿfƒìº‹D$ èçþÿÿ;¬ƒÄftƒÄÃv‹J‰…Òt1ÀƒÄËP‰$ÿR1ÀëÜv1Ò‹D$é­þÿÿUWVSìœ ‹¼$° ¡¬ƒÄf‰„$€ ‰„$„ Ç„$ˆ ‰„$Œ „$Œ ‰D$ „$ˆ ‰D$„$„ ‰D$„$€ ‰D$„$| ‰D$ÇD$ 8ËÁfÇD$ØKÂf‹„$¸ ‰D$‹„$´ ‰$ÿˆ‚Äf…À„à1Ò‹„$€ è2lÿÿ‰Ãƒøÿ„·ºÿÿÿ‹„$„ èlÿÿ‰Æƒøÿ„Û‹„$Œ èKlÿÿ…Àˆ—ÇD$ÇD$ÇD$‰D$ 1À‹¬$ˆ …í•À‰D$‰t$‰$‹Œ$| ‰úD$@è &ÿÿ„À„HD$@‰„$t Ç„$x Ç$ÿô‚Äf‰Å…À„ó€¼$m ÒƒâJ‰T$<‹„$ 9„$€Í9„$„ŒÀº„$t èóòÿÿƒøŒI„ ‹G …À…Í€¼$m „»‹„$ ‹”$œ‰T$‰D$‹„$| ‰$ÿLƒÄf‰Æ…À„ú‰t$‰,$ÿð‚Äf‹J‰…Ò„Y…ÀˆØ€¼$l „ó‹D$<„$œ‰„$ Æ„$p 9„$€Ž3ÿÿÿD$@èkÂþÿ‰èÄœ [^_]ÃfÿÌ‚Äf…À„;þÿÿf1í‰èÄœ [^_]Ãø„§‰$ÿlƒÄf‰Æ…ÀtS‹_ …ÛŽNÿÿÿ1Ûë‰Dž9_ Ž<ÿÿÿC‹”$ˆÇD$‹„$| ‰$‰Ù‹D$@èª]ÿÿ…ÀuÊ‹H‰…À„¥‹EH‰E…À„ºD$@è¹Áþÿ1í‰èÄœ [^_]Ãf‹„$ ;„$œ”„$p é?þÿÿ‹”$ˆÇD$‹„$| ‰$¹‹D$@è-]ÿÿ‰Æ…À…þÿÿ눋V‰4$‰D$8ÿR‹D$8é‘þÿÿf‹„$œ‹”$ é@þÿÿ‹F‰4$ÿPéMÿÿÿfÿÌ‚Äf…À„ýÿÿé½þÿÿ‹E‰,$ÿPé8ÿÿÿfUWVSìŒ ‹¼$  Ç„$x ¡¬ƒÄf‰„$| „$| ‰D$„$x ‰D$„$t ‰D$ÇD$ `ËÁfÇD$çKÂf‹„$¨ ‰D$‹„$¤ ‰$ÿˆ‚Äf…À„l‹„$x …À„ý‹„$| èÁhÿÿ…ÀˆIÇD$ÇD$ÇD$‰D$ ÇD$ÇD$ÿÿÿÇ$‹Œ$t ‰úD$8è˜"ÿÿ„À„üD$8‰„$l Ç„$p Ç$ÿô‚Äf‰Æ…À„³€¼$e …q‹D$t‰D$(ÇD$,1ÛÇD$$‹-ð‚Äf‹D$$;„$x &º„$l è_ïÿÿƒøŒî„€¼$g „.‹”$˜‹„$”9„¼$e „‰\$‰D$‹„$t ‰$ÿLƒÄf‰Ã…Û„”‰\$‰4$ÿÕ‹J‰…Ò„F…Àxz‹G …ÀŽ»ë…ÀxdC9_ Œò‹”$€ÇD$‹„$t ‰$‰Ù‹D$8è–Zÿÿ…Àt2‰D$‰4$‰D$ ÿÕ‹T$ ‹ I‰ …Éu°‹J‰$‰D$ ÿQ‹D$ …ÀyŸv‹H‰…À„ãD$8肾þÿ1ö‰ðÄŒ [^_]ÃvÇ„$x ÿÿÿéóýÿÿ‹\$tÇD$,ÿÿÿÿÇD$(éˆþÿÿv‹„$”€¼$e …áþÿÿ‰D$‰\$‹„$t ‰$ÿLƒÄf‰ÃéÜþÿÿ1ö‰ðÄŒ [^_]ÃÿD$$‹œ$˜€¼$g t3;œ$”„àÆ„$h é þÿÿ‹S‰$‰D$ ÿR‹D$ é¤þÿÿfÆ„$h éúýÿÿv‹F‰4$ÿPéÿÿÿf;\$(tT$,‰”$˜Æ„$h éÉýÿÿ€¼$e uR‹D$t‰D$‰\$‹„$t ‰$ÿLƒÄf‰Ã…Û„²þÿÿ‰\$‰4$ÿð‚Äf‹J‰…ÒtH…Àˆ”þÿÿD$8è#½þÿéžþÿÿ‰\$ÇD$‹„$t ‰$ÿLƒÄf‰Ã묋D$,؉„$˜éÿÿÿ‹S‰$‰D$ ÿR‹D$ ë¥UWVSìŒ ‰Ã¶¬$¤ ¶¼$¨ ¡¬ƒÄf‰„$t ‰„$x ‰„$| …Òt…É„n„$| ‰D$„$x ‰D$„$t ‰D$„$p ‰D$ÇD$ àËÁf‹„$  ‰D$‰L$‰$ÿˆ‚Äf…À„ô‹„$t 1ÒèHdÿÿ‰Æƒøÿ„ͺÿÿÿ‹„$x è,dÿÿ‰D$,@„Ñ‹„$| èadÿÿ…Àˆ«çÿ‰|$ÇD$ÇD$‰D$ ÇD$‹D$,‰D$‰4$‹Œ$p ‰ÚD$4è:ÿÿ„Àtdt$4‰´$h Ç„$l ‰è¶Ð„$h è[ëÿÿ…ÀˆË‰ÁT$4‰Øè2Vÿÿ‰ÃD$4èk»þÿ‰ØÄŒ [^_]ÃfÿÌ‚Äf…À„%ÿÿÿ1Û‰ØÄŒ [^_]ÃvÿÌ‚Äf…À„!ÿÿÿ1ÛëÞf‹5xƒÄf9r…ƒþÿÿ‹r‰t$(Nƒþ‡rþÿÿ‹J ‰Œ$p ƒ|$(„¸þÿÿ‹B‰„$t ƒ|$(„£þÿÿ‹J‰Œ$x ƒ|$(…Žþÿÿ‹R‰”$| éþÿÿfD$4诺þÿ1Ûé=ÿÿÿ‹D$‹T$‹L$ ÇD$ ÇD$ÇD$òKÂfé§ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$ÿKÂfé{ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$LÂféOýÿÿvVSƒì$‰Ã…ÀtaºLÂf¸7LÂfè­þÿ‰Æ…ÀtL‰\$‰$ÿ(ƒÄf‹J‰…Òt"‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ãf‹V‰4$‰D$ÿR‹D$ëË1ÀëàUWVSìÜ ‰Å‰Ó‰L$,”$€ ‰Èèä©þÿ„À„x¶”$¸ ‹Eèòþÿ„À„¾‹Œ$° ‰L$(1Ò‹„$ø èoaÿÿ‰Æƒøÿ„Œºÿÿÿ‹„$ü èSaÿÿ‰Çƒøÿ„H…öˆX‰t$0‹L$(9Τ…ÿˆ¨‰þ;|$(„€½„u‰ð+D$09Eh˜‹„$ð …Àu Ç„$ð ÿÿÿ‰$ÿœ‚Äf…À„Åÿ¸ÆD$9ÆD$:ÆD$8ÆD$;ÇD$‰D$ÇD$‹„$ ‰D$ÇD$ ‰t$‹L$0‰L$„$€ ‰$‹L$,‰êD$Lè6ÿÿ„À„2T$L‰”$È Ç„$Ì Ç„$À Ç„$¼ Š„$y ˆ„$Ä ‹L$,‹QöBW•„$Å „À…m1öÇD$<‹¼$ð …ÿÇD$0Ž º„$È è£çÿÿƒøŒ|„ã‹„$¨9ðtP€¼$y „'‰t$‰D$‹L$,‰ $ÿLƒÄf‰Æ…ö„>‰ò„$¼ è´þÿ‹J‰…Ò„E…Àˆ€|$8…v€|$9…K€|$:„x‹K‰L$(…ÉŽ1ÿë‹„$¨‹”$¬9ЄՀ¼$y „\‰D$‰T$‹L$,‰ $ÿLƒÄf‰Æ…ö„£¡¬ƒÄf9Æ„¢‰ò„$¼ èn³þÿ‹J‰…Ò„ý…ÀˆsG;|$(„–‹C ‹¸‹u ‹P;”ƒÄf„Æ;˜‚Äf„ºè©Tÿÿƒøÿ„ƒø„GÿÿÿŽ9ÆŒD@ý‹”$”‹H…É…X‹;P„5¡¬ƒÄfÿ‹J‰…Ò…tÿÿÿ‹P‰$ÿRG;|$(…kÿÿÿÿD$0‹´$¬€¼${ „o;´$¨„ Æ„$| ‹„$ð 9D$0…ýýÿÿŠ„$y „À„²1Ò9Ö„N„À„#‰t$ÇD$‹L$,‰ $ÿLƒÄf‰Æ…ö„O¼$¼ ‰ò‰øè%²þÿ‹J‰…Ò„Q…Àˆ*…Ût ‹H‰…À„*‰øè|³þÿ‰ÃD$LèUµþÿ…Ût=ö„$ô t5‹D$0‰D$‰\$Ç$=LÂfÿ˜ƒÄf‰Ãëf„$€ èT¥þÿ…Û…1Û‰ØÄÜ [^_]Ãö„$ô …Òº\‰Øèf§þÿƒøŽÍÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;éüÿÿÿÌ‚Äf…À„fûÿÿ„$€ èâ¤þÿ1Û‰ØÄÜ [^_]Ãv‹´$ˆÇD$<ÿÿÿÿé‰üÿÿ‹t$(ésûÿÿv‰L$0…ÿ‰Xûÿÿ|$(‰Nûÿÿ1öéSûÿÿv‹L$,ÿö„$ô …‹\$,„$€ èl¤þÿ‰ØÄÜ [^_]Ãvº{‰Øè”¦þÿƒø.ÿÿÿ…ð1ÀÆD$91ÛÆD$:ÆD$8ÆD$;é>ûÿÿÿÌ‚Äf…À…(ÿÿÿé¥úÿÿÿ‰ÆéÖüÿÿv‹V‰4$‰D$$ÿR‹D$$éíüÿÿf‰T$‰D$‹L$,‰ $ÿLƒÄf‰ÆéŸüÿÿ;´$¨”„$| é’ýÿÿ‰D$‰t$‹L$,‰ $ÿLƒÄf‰ÆéÔûÿÿÿÌ‚Äf…À…¾1Ò¸ôÿÿÿ覦þÿ‹„$¼ …Àt ‹J‰…Ò„Š‹„$À …Àt ‹J‰…Ò„bD$Lè³þÿ…Û„ùýÿÿ‹H‰…À…ìýÿÿ‹C‰$ÿP1Û‰ØÄÜ [^_]Éڄ$¼ èr¯þÿ…À‰²üÿÿë‚€|$;„¥üÿÿ¹T$L‰èèqMÿÿ‰Æ…À„]ÿÿÿ‰D$Ç$ÿpƒÄf…À„¯‰D$‰$‰D$$ÿ(ƒÄf‰Ç‹T$$‹H‰…À„­‹H‰…À„’…ÿ„ ÿÿÿ‰ú„$¼ èã®þÿ‹J‰…Ò„‹f…À‰üÿÿéáþÿÿv‹V‰4$‰D$$ÿR‹D$$é¥úÿÿf‰Ñ‰L$éýúÿÿ¹T$L‰èè´Lÿÿ‰D$(…À„žþÿÿ‹D$L‹@ @‰$ÿlƒÄf‰Ç…À„u‹D$L‹p …öx81ö‹ ¬ƒÄf‰L$4f‹L$4‰ò‹D$(èÝMÿÿ‰D$‰t$‰<$ÿtƒÄfF‹D$L9p }Ö‹D$(èESÿÿ‰Æ…À„ ‰D$‰|$‰$ÿ$ƒÄf‰Á‹H‰…À„‹H‰…À„Þ‹T$(‹H‰…À„µ…É„çýÿÿ‰Ê„$¼ ‰L$$è»­þÿ‹L$$‹J‰…Ò…Öþÿÿ‹Q‰ $‰D$$ÿR‹D$$éÀþÿÿ‹H‹éàþÿÿf‹D$<ð‰„$¬Æ„$| éäúÿÿft$(‰ž÷ÿÿÇD$0é¡÷ÿÿ‹P‰$ÿRéýÿÿf‹P‰$ÿRéhýÿÿf1Ò¸õÿÿÿèè£þÿé=ýÿÿv‹B‰$‰L$$ÿP‹L$$é5ÿÿÿf‹G‰<$‰L$$ÿP‹L$$é ÿÿÿf‹F‰4$‰L$$ÿP‹L$$éçþÿÿfÇD$‰L$Ç$=LÂfÿ˜ƒÄf‰Ãéàûÿÿ‹”$° éDúÿÿ„üÿÿ‰\$‰l$Ç$ÿpƒÄfèÐõÿÿ‰Ã…À„ªûÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é!÷ÿÿ‹F‰4$ÿPé`ýÿÿ‹B‰$ÿPéEýÿÿ‹W‰<$‰D$$ÿR‹D$$éaýÿÿ‹„$° ‰D$‰t$‹L$,‰ $ÿLƒÄf‰ÆéÕùÿÿ¼$¼ éöùÿÿ‹H‰…Àu ‹G‰<$ÿP‹T$(‹H‰…À…ýûÿÿ‹B‰$ÿPéïûÿÿ‹C‰$ÿPéÈùÿÿ‹V‰4$‰D$$ÿR‹D$$é™ùÿÿÇD$nEÂf‰$ÿ4ƒÄf‰Ã…À„¾úÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é5öÿÿ‹H‰…À…ˆûÿÿ‹F‰4$ÿPézûÿÿƒì\ÇD$@¡¬ƒÄf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ pËÁfÇD$@LÂf‹D$h‰D$‹D$d‰$ÿˆ‚Äf…ÀtG‹D$LèªVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`è^ôÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡¬ƒÄf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ŒËÁfÇD$@LÂf‹D$h‰D$‹D$d‰$ÿˆ‚Äf…ÀtG‹D$LèæUÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èšóÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡¬ƒÄf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ¨ËÁfÇD$MLÂf‹D$h‰D$‹D$d‰$ÿˆ‚Äf…ÀtG‹D$Lè"Uÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èÖòÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡¬ƒÄf‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÄËÁfÇD$MLÂf‹D$h‰D$‹D$d‰$ÿˆ‚Äf…ÀtG‹D$Lè^Tÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èòÿÿƒÄ\Ãf1ÀƒÄ\ÃfUWVSƒì<‹l$P‹\$Tº\‰Øèžþÿ…Àx ÿ‰ØƒÄ<[^_]É\$‹E‰D$Ç$ÿpƒÄfèKñÿÿ‰Ç…À„~ÇD$$ÇD$(ÆD$,‹E‹@ö@W•D$-‹G‰D$…ÀŽR1öëDfÿ…Û„¡¬ƒÄf9ă‰ÚD$$袧þÿ‹J‰…Ò„…ÀˆãF;t$„ ‹G ‹°‹U0‹C÷@Tu©‰Ø‰T$èæHÿÿƒøÿ‹T$„‘ƒøtTŽ”9ÂŒŒD@ý‹U4‹H…Éu]¡¬ƒÄfÿ‹J‰…Òu”‹P‰$ÿRë‰f‹S‰$‰D$ÿR‹D$éiÿÿÿf‹U‹E$)ЉD$‹E )ЉD$‹E ‰$ÿLƒÄf‰Ãéÿÿÿ‹U‹H)щL$‹ë×ÿÌ‚Äf…À…Ž1Ò¸òÿÿÿèjþÿ‹D$$…Àt ‹J‰…Òte‹D$(…Àt ‹J‰…ÒtH‹H‰…Àt#1ÛéIþÿÿ‹H‰…Àt#D$$èê§þÿ‰Ãé0þÿÿv‹G‰<$ÿP1Ûéþÿÿ‹G‰<$ÿPëÒ‹P‰$ÿRë­‹P‰$ÿRë1Ò¸õÿÿÿèÜœþÿémÿÿÿvUWVSƒì,ǘÁÁfXEÀfǬÁÁfðBÀfÇÔÁÁfÇØÁÁfDÂÁfÇèÁÁfÇôÁÁf`ÂÁfÇøÁÁf`ÃÁfÇüÁÁfàÃÁfÇ8ÄÁf´=ÀfÇLÄÁfTAÀfÇXÄÁfäÄÁfÇtÄÁfÇxÄÁfðÄÁfÇ”ÄÁfÅÁfǘÄÁf ÆÁfÇœÄÁf€ÆÁfÇÇÁf˜@ÀfÇTÇÁfÇXÇÁfÄÇÁfÇlÇÁfTÀfÇpÇÁf,yÁfÇtÇÁfàÇÁfÇxÇÁf@ÈÁfǘÈÁfd@ÀfÇÔÈÁfÇØÈÁfDÉÁfÇìÈÁflÀfÇðÈÁfìwÁfÇôÈÁf`ÉÁfÇøÈÁf ÉÁfÇ$€ÁÁf‹|ƒÄfÿÓ…ÀˆGÇ$ ÄÁfÿÓ…Àˆ6Ç$ÇÁfÿÓ…Àˆ%Ç$€ÈÁfÿÓ…ÀˆÇ `ÄfÇD$õÇ$àÉÁfÿƒÄf‰D$…À„݉$ÿ ƒÄf‰ÆÇ$´2‹=ƒÄfÿ׉ÅÀt"‰D$ÇD$YLÂf‰4$ÿ¸‚Äf‹H‰…À„»Ç$ÿ׉ÅÀt"‰D$ÇD$_LÂf‰4$ÿ¸‚Äf‹H‰…À„«Ç$ ÊÁfÿˆƒÄf‰Ã…Àt"‰D$ÇD$iLÂf‰4$ÿ¸‚Äf‹H‰…À„’Ç$`Äf1Ò1Û1À¶•"íÁf9Ú|Z@‰Â=Üuç4‰ðèÕßþÿ‰Å…À„1À‰ï‰ñóª1ÿ‰ø‰\$ëR¶C‰D$Ç$sLÂfÿ˜ƒÄf…Àts‰D$·† íÁf‹…Âf‰D$¶C‹D…‰$‹5¸‚ÄfÿÖG‰øÿÜ„û4…ž íÁf¶CT…‹…Àu”‰T$ÿ¬‚Äf‹T$‰¶C‹D……À…tÿÿÿ‹\$¡$`Äf…Àt ‹J‰…Ò„Š1öëfF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRF9Þuá‰,$ÿƒÄfÇD$‹D$ƒÄ,[^_]ÃÇD$‹D$ƒÄ,[^_]ËC‰$ÿPÇ$ÿ׉ÅÀ…8þÿÿéUþÿÿ‹C‰$ÿPéGþÿÿ‹P‰$ÿRéhÿÿÿ‹C‰$ÿPé`þÿÿ‹\$ÿ¬‚Äf£$`Äf…À„Cÿÿÿf1ÿ1À‰\$‰Ãë+‰D$·‡ Âf‹…Âf‰D$¡$`Äf‰$ÿÖC‰ßû‘t3Áç¶—£Âf‹T•‰T$¶‡¢Âf‰D$Ç$uLÂfÿ˜ƒÄf…Àu§é¾þÿÿ‹\$1öëF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRë߉,$ÿƒÄféÜþÿÿ‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€ ƒÂfÁà¶Œ@…Âf‰ÐÁèƒâÈ·Œ`‡Âf‰ÐÑè¶ŒÈà’ÂfÑà1ж„H`£ÂfÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€à¤ÂfÁà¶Œ§Âf‰ÐÁèƒâ¶ŒÈ`©Âf‰ÐÁè¶Œˆà®ÂfÁà1ж„ˆ`²ÂfËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€àµÂfÁà¶Œ¸Âf‰ÐÁèƒâÈ·ŒºÂf‰ÐÑè¶ŒÈÀÄÂfÑà1ж„H€ÓÂfÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€`ÕÂfÁà¶„€ÖÂf‰ÑÁéƒâÁà¶ŒàØÂf‰ÐÁè¶ŒH@áÂfÁà1ж„ˆ ãÂfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€åÂfÁà¶„ åÂf‰ÑÁéƒâÁà¶ŒçÂf‰ÐÁè¶Œˆ€êÂfÁà1ж„ˆíÂfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€`îÂfÁà¶Œ€ïÂf‰ÐÁèƒâÈ·ŒñÂf‰ÐÁ趌ȠöÂfÁà1ж„ˆ@ÃfËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€ÃfÁà¶ŒÀÃf‰ÐÁè¶Ò¶ŒÈÃf‰ÐÁè¶ŒÈ@ÃfÁáÁà1ÐÁ‰ÈÁè¶€àÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÀÃfÁà¶ŒàÃf‰ÐÁè¶Ò¶ŒÈ`Ãf‰ÐÁè¶ŒÈ@ÃfÁáÁà1ÐÁ‰ÈÁè¶€À ÃfƒáÓøƒàÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€è ÃfÁà¶”Ãf‰ØÁè ãÿ¶”Ð@Ãf‰ØÁèÁâ¶Œ€ÃfÁáÁà1ØÁ‰ÈÁè¶€€ÃfƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€ÈÃfÁà¶”àÃf‰ØÁè ãÿ¶”Ð Ãf‰ØÁèÁâ¶Œ`ÃfÁáÁà1ØÁ‰ÈÁè¶€@ÃfƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€TÃfÁà¶”€Ãf‰ØÁè ãÿ¶”ÐÀÃf‰ØÁèÁâ¶ŒÃfÁáÁà1ØÁ‰ÈÁè¶€ÃfƒáÓøƒà[Ãv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÃfÁà¶Œ@Ãf‰ÐÁè¶Ò¶ŒÈ Ãf‰ÐÁè¶ŒÈ@ÃfÁáÁà1ÐÁ‰ÈÁè¶€àÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ÃfÁà¶Œ`Ãf‰ÐÁè¶Ò¶ŒÈ Ãf‰ÐÁè¶ŒÈÃfÁáÁà1ÐÁ‰ÈÁè¶€ ÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€`ÃfÁà¶Œ Ãf‰ÐÁè¶Ò¶ŒÈàÃf‰ÐÁè¶ŒÈ ÃfÁáÁà1ÐÁ‰ÈÁè¶€ÀÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ÃfÁà¶ŒàÃf‰ÐÁè¶Ò¶ŒÈ Ãf‰ÐÁè¶ŒÈ` ÃfÁáÁà1ÐÁ‰ÈÁè¶€!ÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€à!ÃfÁà¶Œ "Ãf‰ÐÁè¶Ò¶ŒÈ`"Ãf‰ÐÁè¶ŒÈÀ"ÃfÁáÁà1ÐÁ‰ÈÁè¶€`#ÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@$ÃfÁà¶Œ€$Ãf‰ÐÁè¶Ò¶ŒÈÀ$Ãf‰ÐÁè¶ŒÈ %ÃfÁáÁà1ÐÁ‰ÈÁè¶€À%ÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ˆ&ÃfÁà¶Œ &Ãf‰ÐÁè¶Ò¶ŒÈ 'Ãf‰ÐÁè¶ŒÈ(ÃfÁáÁà1ÐÁ‰ÈÁè¶€€*ÃfƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€€-ÃfÁà¶ŒÀ-Ãf‰ÐÁè¶Ò¶ŒÈ@.Ãf‰ÐÁè¶ŒÈ@/ÃfÁáÁà1ÐÁ‰ÈÁè¶€à1ÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€45ÃfÁà¶Œ`5Ãf‰ÐÁè¶Ò¶ŒÈà5Ãf‰ÐÁè¶ŒÈÀ6ÃfÁáÁà1ÐÁ‰ÈÁè¶€@9ÃfƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€@<ÃfÁà¶Œ€<Ãf‰ÐÁè¶Ò¶ŒÈ=Ãf‰ÐÁè¶ŒÈ>ÃfÁáÁà1ÐÁ‰ÈÁè¶€ @ÃfƒáÓøƒàËT$‰ÑÁéâÿ?‰ÐÁè âÿ¶‰DÃf¶ŒÈ`DÃf‰ÐÁè¶Ò¶ŒÈ DÃf‰ÐÁè¶ŒÈEÃfÁáÁà1ÐÁ‰ÈÁè¶€€EÃfƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀEÃfÁà¶ŒFÃf‰ÐÁè¶Ò¶ŒÈ`FÃf‰ÐÁè¶ŒÈGÃfÁáÁà1ÐÁ‰ÈÁè¶€`HÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€JÃfÁà¶Œ@JÃf‰ÐÁè¶Ò¶ŒÈÀJÃf‰ÐÁè¶ŒÈÀKÃfÁáÁà1ÐÁ‰ÈÁè¶€ÀNÃfƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀRÃfÁà¶ŒSÃf‰ÐÁè¶Ò¶ŒÈ@SÃf‰ÐÁ趌ȀSÃfÁáÁà1ÐÁ‰ÈÁè¶€ TÃfƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰dTÃf¶„ÈuTÃf‰ÑÁé âÿÁà¶Œ TÃf‰ÐÁè¶ŒÈàTÃfÁáÁà1ÐÁ‰ÈÁè¶€ UÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€PUÃfÁà¶Œ€UÃf‰ÐÁè âÿ¶ŒÈ UÃf‰ÐÁ趌ȸUÃfÁáÁà1ÐÁ‰ÈÁè¶€àUÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€VÃfÁà¶Œ VÃf‰ÐÁè âÿ¶ŒÈ@VÃf‰ÐÁè¶ŒÈPVÃfÁáÁà1ÐÁ‰ÈÁè¶€`VÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€pVÃfÁà¶Œ VÃf‰ÐÁè âÿ¶ŒÈÀVÃf‰ÐÁè¶ŒÈWÃfÁáÁà1ÐÁ‰ÈÁè¶€`WÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ØWÃfÁà¶ŒXÃf‰ÐÁè âÿ¶ŒÈ XÃf‰ÐÁè¶ŒÈ`XÃfÁáÁà1ÐÁ‰ÈÁè¶€ XÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ðXÃfÁà¶Œ YÃf‰ÐÁè âÿ¶ŒÈ@YÃf‰ÐÁ趌ȀYÃfÁáÁà1ÐÁ‰ÈÁè¶€ÀYÃfƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€ZÃfÁà¶Œ`ZÃf‰ÐÁèƒâ¶ŒÈÀZÃf‰ÐÁè¶Œˆ`[ÃfÁáÁà1ÐÁ‰ÈÁè¶€ \ÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€à\ÃfÁà¶Œ ]Ãf‰ÐÁè¶Ò¶ŒÈ`]Ãf‰ÐÁ趌Ƞ]ÃfÁáÁà1ÐÁ‰ÈÁè¶€@^ÃfƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰_Ãf¶ŒÈ%_Ãf‰ÐÁè âÿ¶ŒÈ5_Ãf‰ÐÁè¶ŒÈM_ÃfÁáÁà1ÐÁ‰ÈÁè¶€€_ÃfƒáÓøƒàÃv‹T$‰ÑÁé·Ò‰ÐÁè âÿ¶‰°_Ãf¶ŒÈÁ_Ãf‰ÐÁè âÿ¶ŒÈÑ_Ãf‰ÐÁè¶ŒÈá_ÃfÁáÁà1ÐÁ‰ÈÁè¶€`ÃfƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ `ÃfÁà¶Œ``Ãf‰ÐÁè¶Ò¶ŒÈ `Ãf‰ÐÁè¶ŒÈ aÃfÁáÁà1ÐÁ‰ÈÁè¶€@bÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€xcÃfÁà¶Œ cÃf‰ÐÁè âÿ¶ŒÈàcÃf‰ÐÁè¶ŒÈ@dÃfÁáÁà1ÐÁ‰ÈÁè¶€ dÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ðdÃfÁà¶Œ eÃf‰ÐÁè¶Ò¶ŒÈ€eÃf‰ÐÁè¶ŒÈfÃfÁáÁà1ÐÁ‰ÈÁè¶€`gÃfƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€hÃfÁà¶ŒÀhÃf‰ÐÁè¶Ò¶ŒÈiÃf‰ÐÁè¶ŒÈ@iÃfÁáÁà1ÐÁ‰ÈÁè¶€ÀiÃfƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€jÃfÁà¶Œ@jÃf‰ÐÁè âÿ¶ŒÈ`jÃf‰ÐÁ趌ȠjÃfÁáÁà1ÐÁ‰ÈÁè¶€àjÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€XkÃfÁà¶„€kÃf‰ÑÁé¶ÒÁà¶Œ kÃf‰ÐÁè¶ŒÈÀkÃfÁáÁà1ÐÁ‰ÈÁè¶€ØkÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€äkÃfÁà¶ŒlÃf‰ÐÁè âÿ¶ŒÈ lÃf‰ÐÁè¶ŒÈ8lÃfÁáÁà1ÐÁ‰ÈÁè¶€PlÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€hlÃfÁà¶Œ€lÃf‰ÐÁè âÿ¶ŒÈÀlÃf‰ÐÁè¶ŒÈmÃfÁáÁà1ÐÁ‰ÈÁè¶€@mÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ˆmÃfÁà¶Œ mÃf‰ÐÁè âÿ¶ŒÈÀmÃf‰ÐÁè¶ŒÈÐmÃfÁáÁà1ÐÁ‰ÈÁè¶€àmÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ðmÃfÁà¶Œ nÃf‰ÐÁè âÿ¶ŒÈ@nÃf‰ÐÁè¶ŒÈPnÃfÁáÁà1ÐÁ‰ÈÁè¶€`nÃfƒáÓøƒàÃS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€pnÃfÁà¶” nÃf‰ØÁè ãÿ¶”ÐÀnÃf‰ØÁèÁâ¶ŒànÃfÁáÁà1ØÁ‰ÈÁè¶€oÃfƒáÓøƒà[Ãv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€oÃfÁà¶Œ@oÃf‰ÐÁè âÿ¶ŒÈ€oÃf‰ÐÁè¶ŒÈÀoÃfÁáÁà1ÐÁ‰ÈÁè¶€pÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€@pÃfÁà¶Œ`pÃf‰ÐÁè âÿ¶ŒÈ pÃf‰ÐÁè¶ŒÈàpÃfÁáÁà1ÐÁ‰ÈÁè¶€@qÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ qÃfÁà¶ŒàqÃf‰ÐÁè¶Ò¶ŒÈ rÃf‰ÐÁè¶ŒÈ`rÃfÁáÁà1ÐÁ‰ÈÁè¶€ rÃfƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€àrÃfÁà¶Œ sÃf‰ÐÁè¶Ò¶ŒÈ`sÃf‰ÐÁ趌ȠsÃfÁáÁà1ÐÁ‰ÈÁè¶€ tÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€„tÃfÁà¶Œ tÃf‰ÐÁè âÿ¶ŒÈÀtÃf‰ÐÁè¶ŒÈØtÃfÁáÁà1ÐÁ‰ÈÁè¶€ðtÃfƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰uÃf¶„ÈuÃf‰ÑÁé âÿÁà¶Œ@uÃf‰ÐÁè¶ŒÈ`uÃfÁáÁà1ÐÁ‰ÈÁè¶€xuÃfƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰uÃf¶„È¡uÃf‰ÑÁé âÿÁà¶ŒÀuÃf‰ÐÁè¶ŒÈàuÃfÁáÁà1ÐÁ‰ÈÁè¶€ vÃfƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€`vÃfÁà¶ŒÀvÃf‰ÐÁèƒâ¶ŒÈ wÃf‰ÐÁè¶Œˆ wÃfÁáÁà1ÐÁ‰ÈÁè¶€@xÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ÌxÃfÁà¶ŒàxÃf‰ÐÁè âÿ¶ŒÈ yÃf‰ÐÁè¶ŒÈ@yÃfÁáÁà1ÐÁ‰ÈÁè¶€`yÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ˆyÃfÁà¶Œ yÃf‰ÐÁè âÿ¶ŒÈÀyÃf‰ÐÁè¶ŒÈØyÃfÁáÁà1ÐÁ‰ÈÁè¶€zÃfƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ zÃfÁà¶Œ@zÃf‰ÐÁè¶Ò¶ŒÈ€zÃf‰ÐÁè¶ŒÈÀzÃfÁáÁà1ÐÁ‰ÈÁè¶€ {ÃfƒáÓøƒàÃv‹L$‰ÈÁè·É‰ÊÁê áÿ¶€\{ÃfÁà¶„€{Ãf‰ÊÁêƒáÁà¶”À{Ãf‰ÈÁèÁâ¶”@|ÃfÁà1ȶ„Ð}ÃfÃf‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€`}ÃfÁà¶Œ€~Ãf‰ÐÁèƒâ¶ŒÈ€€Ãf‰ÐÁè¶Œˆ „ÃfÁà1ж„ˆ ˆÃfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ ŠÃfÁà¶ŒÀŠÃf‰ÐÁèƒâ¶ŒÈ ‹Ãf‰ÐÁè¶ŒÈÃfÁà1ж„ˆÀÃfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€€‘ÃfÁà¶„ ’Ãf‰ÑÁéƒâÁà¶Œ`“Ãf‰ÐÁè¶ŒˆÀ–ÃfÁà1ж„ˆ€šÃfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€àœÃfÁà¶„žÃf‰ÑÁéƒâÁà¶ŒŸÃf‰ÐÁè¶Œˆ@¡ÃfÁà1ж„ˆà¢ÃfËL$‰ÈÁè·É‰ÊÁê áÿ¶€„£ÃfÁà¶„ £Ãf‰ÊÁêƒáÁà¶”À£Ãf‰ÈÁèÁâ¶”¤ÃfÁà1ȶ„Ð`¤ÃfÃf‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€€¥ÃfÁà¶„ ¦Ãf‰ÑÁéƒâÁà¶Œ@§Ãf‰ÐÁè¶Œˆ ªÃfÁà1ж„ˆ@¬ÃfËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€ ­ÃfÁà¶Œ@®Ãf‰ÐÁèƒâÈ·Œ ±Ãf‰ÐÑè¶ŒÈ@¼ÃfÑà1ж„HÊÃfÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@ËÃfÁà¶Œ`ÌÃf‰ÐÁèƒâ¶ŒÈàÍÃf‰ÐÁè¶Œˆ`ÐÃfÁà1ж„ÈÀÑÃfËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ ÓÃfÁà¶ŒÀÔÃf‰ÐÁèƒâ¶ŒÈ@ÖÃf‰ÐÁè¶ŒÈÀØÃfÁà1ж„ˆ@ÜÃfËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ ßÃfÁà¶Œ ßÃf‰ÐÁè âÿ¶ŒÈ`ßÃf‰ÐÁ趌ȠßÃfÁáÁà1ÐÁ‰ÈÁè¶€ àÃfƒáÓøƒàËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@áÃfÁà¶„àáÃf‰ÑÁéƒâÁà¶Œ`âÃf‰ÐÑè¶ŒÈÀãÃfÑà1ж„H æÃfÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ æÃfÁà¶„@çÃf‰ÑÁéƒâÁà¶ŒàçÃf‰ÐÁè¶Œˆ`éÃfÁà1ж„ˆàëÃfÃSQ‹\$ ‰$èçÿÿ…Àu‰$è‚äÿÿƒø ”À¶ÀZ[Ãf¸Z[øÃf1Àƒ|$–ÀÃP‹D$‰$èKäÿÿ…À•À¶ÀZÃP‹D$ƒø t‰$è.äÿÿƒø ”À¶ÀYÃv¸YÃSQ‹\$ ‰$èæíÿÿ…Àu‰$èþãÿÿº€ˆÁÓú1Àƒâ”ÀZ[Ãf1ÀZ[ÃvSP‹\$ ‰$èºÿÿÿ…Àu ‰$è†ÿÿÿ…Àt‰$èºãÿÿƒø•À¶À[[Ãf1À[[ÃvSQ‹\$ ‰$è æÿÿ…Àu*‰$èŠãÿÿºÀ@ˆÁÓúƒâu‰$è îÿÿ…À•À¶ÀZ[øZ[ÃSP‹\$ ‰$èRãÿÿƒø t‰$èaðÿÿ…À•À¶À[[Ãf¸[[ÃVS‹D$ ‹T$‰ÁÁé ‰Ææÿ‰óÁëæÿ¶‰€îÃfÁá¶œ ïÃf‰ñÁéÁã¶œàïÃfÁá1ñ¶ŒÙ`òÃf IÁá™ Âf‰‹‰ Âf…Ét'Á‰J‹K…Ét#Á‰J‹K…ÉtȉB ¸[^Ãf¸ëô¸ëì¸ëäS‹D$‰ÂÁê ‰Ããÿ‰ÙÁé¶Û¶’`öÃfÁâ¶Œ÷Ãf‰ÚÁêÁá¶Œ À÷ÃfÁâ1Ú¶”ÊàùÃf•@üÃf[ÃfVS‹D$ ‹\$‰ÂÁê ‰Ææÿ‰ñÁéæÿ¶’€ýÃfÁâ¶Œ þÃf‰òÁêÁá¶Œ àþÃfÁâ1ò¶”Ê ÄfÁâ‚€Âf‰‹‚„Âff…Àt!·À‰Cf‹‚†Âff…Àt·À‰C¸[^øëõ¸ëíÿ%T‚Äfÿ%P‚Äfÿ%X‚Äfÿ%D‚Äfÿ%8‚Äfÿ%d‚Äfÿ%`‚Äfÿ%H‚Äfÿ%@‚Äfÿ%\‚ÄfU‰åƒì‹E ƒøt…Àu‹U‰T$‰D$‹E‰$訸ɠvU‰åSƒì‹E ƒ=@`Äft Ç@`ÄfƒøtHt?¸ƒÄ[É f»ÄfûÄftäv‹…ÀtÿЃÃûÄfuí¸ƒÄ[É ‹E‰D$ÇD$‹E‰$èë¥U‰å1ÀÉÃU‰å¸É U‰åVSƒìu ‹l‚ÄfƒÃ@‰\$ ÇD$ÇD$Ç$$ÄfèL‰t$‹E‰D$‰$èAèDU‰åWVSƒìL‰Ã‰Ö…Éu eô[^_ÉÃvÇD$EȉD$‰$‰MÄè.ƒì …À‹MÄ„ˆ‹E܃ø@ttƒøtoUä‰T$ ÇD$@‹EÔ‰D$‹Eȉ$‰UÀ‰MÄèôƒì‹EÜ‹Mĉßó¤ƒø@‹UÀt„ƒø„{ÿÿÿ‰T$ ‹Eä‰D$‹EÔ‰D$‹Eȉ$蹃ìeô[^_ÉÃf‰ßó¤eô[^_ÉÉ\$ÇD$Ç$<ÄfèÐþÿÿU‰åWVSƒì,¡8`Äf…Àt ƒÄ,[^_ÉÃfÇ8`Äf¸ÐÄf-ÐÄfƒø~Ý»ÐÄfƒø ~a‹=ÐÄf…ÿu ‹5ÔÄf…öt=ûÐÄfs¶¾Àf}à‹Cð‹‰U้úè þÿÿƒÃûÐÄfr݃Ä,[^_ÉË ØÄf…Éu»ÜÄf‹…Òu®‹C…Àu§‹Cƒø…ƒÃ ûÐÄfƒJÿÿÿ¸ÀfC‹ ‹±Àf‹SâÿƒútFƒú tyƒútÇEä‰T$Ç$¤ÄfèÉýÿÿ¶8÷Ç€t$Ïÿÿÿ)ÏïÀf47‰uäë,v·8÷Ç€ua)ωùéÀfñ‰Mäƒútaƒú t#ƒúu+¹Uäèºýÿÿë‹)ÊêÀfò‰Uä¹UäèœýÿÿƒÃ ¸ÐÄf9؇8ÿÿÿé}þÿÿvÏÿÿ)ÏïÀf47‰uä¹UäècýÿÿëʼnD$Ç$pÄfèýÿÿU‰åƒì¡à!Âf‹…ÀtvÿСà!ÂfP‰à!Âf‹@…ÀuéÉÃvU‰åSƒì‹ü¾Áfƒûÿt"…Ût fÿü¾ÁfKuöÇ$ì»ÁfèîTþÿƒÄ[ÉÃ1Ûë‰ÃC‹…ü¾Áf…ÒuðëÈfU‰åƒì‹ <`Äf…ÉtÉÃfÇ<`ÄfÉë“U‰åVSƒì¡D`Äf…Àueø[^ÉÃÇ$H`ÄfèQ‹``Äf…Ût*‹‰$èòR‰Æèò…Àu …öt‹C‰4$ÿЋ[…Ûu×Ç$H`Äfè×Peø[^ÉÃvU‰åSƒì¡D`Äf…Àu1À‹]üÉÃÇD$ Ç$è`‰Ã…Àt7‹E‰‹E ‰CÇ$H`ÄfèkP¡``Äf‰C‰``ÄfÇ$H`ÄfèhS1À멸ÿÿÿÿë¢U‰åSƒì‹]¡D`Äf…Àu 1À‹]üÉÃfÇ$H`ÄfèQ‹``Äf…Òt‹9Øu ëB‹9Ùt‰Â‹B…ÀuñÇ$H`ÄfèR1À‹]üÉËH‰J‰$èþùÿÿÇ$H`ÄfèâRëÛ‹B£``Äf‰ÐëÝvU‰åƒì‹E ƒøt>rƒøuèzþÿÿ¸ÉÃvèkþÿÿ¡D`ÄfHuéÇD`ÄfÇ$H`Äfè‘PëÐf¡D`Äf…ÀtÇD`Äf¸ÉÃfÇ$H`ÄfèlRëÞÿ%x‚Äfÿ%|‚Äfÿ%p‚Äfÿ%t‚Äfÿ%‚Äfÿ%‚Äfÿ%0‚Äfÿ%,‚Äfÿ%‚Äfÿ%(‚Äfÿ%‚Äfÿ%$‚Äfÿ% ‚Äfÿ% ‚ÄfU‰åƒìè™RþÿÇ$ÀfèARþÿÉÃÿÿÿÿà¾ÁfÿÿÿÿxLÂf†LÂf”LÂfžLÂf¬LÂf¾LÂfÌLÂfØLÂfèLÂfõLÂfMÂfMÂf MÂf0MÂfDMÂf\MÂfpMÂf‡MÂf¡MÂf½MÂfÇMÂfÙMÂfíMÂfNÂfNÂf5NÂfGNÂfSNÂfkNÂfNÂf‹NÂfœNÂf¯NÂfÁNÂfÒNÂfÝNÂfìNÂfÿNÂfOÂf)OÂf5OÂfEOÂfYOÂfiOÂfyOÂfOÂf¥OÂf¹OÂfÑOÂfåOÂfùOÂfPÂfPÂf2PÂfEPÂfUPÂfiPÂfPÂf•PÂf¨PÂf¿PÂfÚPÂfñPÂfQÂfQÂf-QÂfAQÂfUQÂfkQÂfQÂf•QÂf¢QÂf³QÂfÈQÂfÙQÂfîQÂfÿQÂfRÂf%RÂf>RÂfSRÂflRÂfRÂfRÂf¡RÂf±RÂfÉRÂfÙRÂfïRÂfSÂfSÂf0SÂfASÂfRSÂfdSÂfˆCompiled regex objectsSÂfôƒÁf ÌÁfySÂfȃÁfÀÌÁfƒSÂfœƒÁf`ÍÁfŠSÂfÈ‘Áf@ÎÁfŽSÂf‘Áf`ÏÁf“SÂf@Áf€ÐÁf˜SÂf|ÁfÀÑÁfžSÂfL}ÁfÓÁf¤SÂfèÀf€ÓÁf®SÂfxyÁfÔÁf¶SÂfˆèÀfàÔÁf¿SÂføæÀfÖÁfÇSÂf„ÀfÐSÂfŒÀfÝSÂfèSÂf%TÂf +TÂfETÂf LTÂf{TÂf4ˆTÂf«TÂf =Àf¸TÂfëTÂf<HÀf äÀfMatch objectøTÂfDßÀfàÖÁfþTÂfÜÞÀf€ØÁfUÂfÈÞÀf@ÚÁfUÂf´ÞÀfÜÁfETÂfÛÀfÞÁf UÂfâÀfÀÞÁfUÂfðäÀfÀßÁf$UÂfŒ’Áf`àÁf+UÂfDáÀfáÁf3UÂf ÞÀf€áÁf MatchObject or None. Match zero or more characters at the beginning of the string.fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters against all of the string.search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Search through string looking for a match, and return a corresponding match object instance. Return None if no match is found.sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement repl.subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement format.subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement repl.subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement format.split(string, string, maxsplit=0, concurrent=None) --> list. Split string by the occurrences of pattern.splititer(string, maxsplit=0, concurrent=None) --> iterator. Return an iterator yielding the parts of a split string.findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list. Return a list of all matches of pattern in string. The matches may be overlapped if overlapped is True.finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator. Return an iterator over all matches for the RE pattern in string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a MatchObject.scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner. Return an scanner for the RE pattern in string. The matches may be overlapped if overlapped is True.group([group1, ...]) --> string or tuple of strings. Return one or more subgroups of the match. If there is a single argument, the result is a single string, or None if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the whole match is returned. Group 0 is the whole match.start([group1, ...]) --> int or tuple of ints. Return the index of the start of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the start of the whole match is returned. Group 0 is the whole match.end([group1, ...]) --> int or tuple of ints. Return the index of the end of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the end of the whole match is returned. Group 0 is the whole match.span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints. Return the span (a 2-tuple of the indices of the start and end) of one or more subgroups of the match. If there is a single argument, the result is a span, or (-1, -1) if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the span of the whole match is returned. Group 0 is the whole match.groups(default=None) --> tuple of strings. Return a tuple containing all the subgroups of the match. The argument is the default for groups that did not participate in the match.groupdict(default=None) --> dict. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name. The argument is the value to be given for groups that did not participate in the match.capturesdict() --> dict. Return a dictionary containing the captures of all the named subgroups of the match, keyed by the subgroup name.expand(template) --> string. Return the string obtained by doing backslash substitution on the template, as done by the sub() method.expandf(format) --> string. Return the string obtained by using the format, as done by the subf() method.captures([group1, ...]) --> list of strings or tuple of list of strings. Return the captures of one or more subgroups of the match. If there is a single argument, the result is a list of strings; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the captures of the whole match is returned. Group 0 is the whole match.starts([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the starts of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the starts of the captures of the whole match is returned. Group 0 is the whole match.ends([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the ends of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the ends of the captures of the whole match is returned. Group 0 is the whole match.spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints. Return the spans (a 2-tuple of the indices of the start and end) of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of spans; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the spans of the captures of the whole match is returned. Group 0 is the whole match.detach_string() Detaches the target string from the match object. The 'string' attribute will become None.match() --> MatchObject or None. Match at the current position in the string.search() --> MatchObject or None. Search from the current position in the string.split() --> string or None. Return the next part of the split string.0YÂfTÄÀf8YÂfèÀfFYÂfxÀfUYÂfx£Àf_YÂfø-ÀfuYÂf€ÀfˆYÂf Àft™ÁfÌ™Áf šÁfxšÁfКÁf(›Áf€›Áfè›ÁfPœÁfÀœÁf0Áf ÁfžÁfpžÁfØžÁf@ŸÁf¨ŸÁf Áfx Áfà ÁfH¡Áf°¡Áf¢Áf€¢Áfè¢ÁfP£Áf¸£Áf ¤Áfˆ¤Áfð¤ÁfX¥ÁfÀ¥Áf(¦Áf¦Áfø¦Áf`§ÁfȧÁf0¨Áf˜¨Áf©Áfh©ÁfЩÁf8ªÁf ªÁf«Áfp«Áfà«ÁfH¬Áf°¬Áf­Áf€­Áfè­ÁfP®Áf¸®Áf ¯Áfˆ¯Áfð¯ÁfX°Áf´°Áf±Áf\±Áf´±Áf ²Áfh²ÁfÀ²Áf³Áfl³ÁfÀ³Áf(´Áf€´ÁfØ´ÁfµÁfµÁfµÁf4µÁf\µÁf”µÁfеÁf¶Áfß0Ið°‡–—˜™šžPRTV€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯²³´¶·¼ÂÃÄÆÇÌÒÓÖ×âãäæçòóôö÷üûûûûûûûûûûûû9cAÊĽ%ɾ\¿)ÑäÝ㦠¶  ± ! ` " Ü ~ » | j}~dñ:‹eú‡¢pOŽastoaƒáÑ‹¼ÐbÖT€ìtV¯ŽÛ Ô k Ó 4!!!‘"h""i"ÿ#±#²#Æ$w$x$%#ѹ—•–˜Ÿš^]Þg³ ” š ™ › µ / ¨ ´³ ¶Ùª©­ÛQ|×Ï!’ "! "þ#%$c$Õ%Û&Ú&C':((4(@)¯*+,,ÿ-.†/ 0;151´2 34‡5ý6 7Ì8ç9Ò:®;D<é=è=I>H>}?|?~@@iAµAžB™BCCûD‘DïEîEŒFhGlG´G°H5I¸JßKàKúLÿLMPN=NÊOÉOñPèQüR÷SþS·TõUûUñVëV÷WöWòXìXöYüYóZðZø[ô[\ ]›]^_ÿ_$`ØaÖa—b•bôcùcUdTd{ezeDf@fXgWg:h~iëj$kqkylímìmVnooÎpÍpJqHqZrPrrsqsYtGttusv¼wCx˜y–yÎz{¡|œ|þ}n~N~vº€¯®‚‚Ÿƒ&„d„g…<†‡‡ ˆê‰é‰ÙŠ×Šè‹(Œ#Œ'e8Ž67ÅŒ‘‹‘‘L’N’“œ“±”¯”F•U•L–j——K˜I˜Ô™Ó™²š°š››ßœ¸·žŸ£ ¤¡x¢w¢Ð£ ¤F¥¦7§G¨«©ÉªU«“¬K­{®Ò¯î°í±…²H³Æ´XµW¶I·®¸­¸ô¹sºÙ»;¼È½¾ˆ¿ŠÀ‰ÀÅÁÐÂÏÂïÃwÄvÄÅÅ Æ Æ¢Ç¡Ç È ȃÉ‚ÉÞÊÝÊ­ˬËÖÌÕ̹͸ÍÎËÏÌÏÐÐÏÐùÑýÑÆÒ1Ó0Ó–Ô•Ô[ÕQÕ\ÖRÖ]×S×MØOØÙGÚVÚõÛ÷ÛöÜøÜ=‚m”¢ ”œµ·/.¨§   ­ ¬ Û Ú     QS|‰×ÏÎ!’“"# þý#"ÕÔCB @?¯°†ˆ   :!9!~"u"ë#ê#!$*$o%p%F&b&''«(¾(Q)“){)**,+++ÿ,þ,--´.³. //¶0µ07161É2Ê2U3T3’4…4ö5õ5ý6ü67’7€78899$::þ;ý;GË>ˆ?h?{@z@vAuAB BçCæC®D­DDEEECFDFºG¹G‚HtHŸI¨IÐJÏJ K KÒLÑL<M N‘N OOÆPÇPÅQÄQ¶R·R¼SÎTÍTgUfUèV VKW¶WHX¸XXYYWZyZI[R[s\‹\Ò]Ó]ô^ó^Ù_Ø_;``íaëaîbìbïc‚cÈdÌdÙeØeff€gVi¼½Íà0;†²!✡ñ ï ~ q ˜ ¤ ð  ñ  òâ62äßVi†²~câßœ¡ÝÑB Ë Í ‰ Vi†²âßÅÀñïÚ¿?>J ¤ 6 2 À ¼ ä ã _ ^ ½¼"åænj2,¥SB.ÌËÎÍ©¤šÜÇÝÒÞÓ® o‡jȱZ ` _ M ð é ) 0 « “ ¬È§«ªÆ¥©„q«Ç¦ªîô…r- .  f e  3  w x ~ Œ M T „         ! " ! # # $ $ % & & ' ' + ( 0 ) 5 * ; + @ , B - C . D / E 0 F 1 M 2 Q 3 R 4 S 5 T 6 U 7 V 8 ƒ 9 !Š ! " " # # $ $ % % & & ' ' ( (à )/ )¿ )Á *1 *½ * +¾ +2 +Ø ,ä ,4 ,× -È -6 -Ù .ò .7 .¦ /8 / /¢ 0š 09 0 1: 1“ 1Œ 2‹ 2< 2Ž 3¦ 3= 3» 4> 4£ 4º 5? 5ž 5\ 6_ 6A 6  7Ä 8'   p f ð $  S R æ å ë ê a ` E È í ê å K J [   Ò Õ â á ó ò   Ÿ ‹   [ W õ å   % ’ ” — Ö Ü Ÿ   Á é í ö ÷    - 1 2 3 r } Š   ç ó + 9 s ” • ž   ´ !µ "Á #à $Ë %û & ' ( ) *X + ,k -l .m /u 0v 1y 2z 3ƒ 4è 5 6ç 7; 8¬ 9( 3 k  À  £ š ¨  /  =iONa^˜—*/àßûüP_ˆ ‡ † ƒ 6 2 › “ C ? YZL>=kbùÔøÊÛÚÚㆺ²}r³Ÿ‘úÉúÇ€!_\ip o!"#`$„$0%;%s&F&œ'¡''62¶°¥¤    H    L *Km)J[lyI(kGxZ…j r!"w#"$~%%&„' ()*+ ,!-#.$/&0'1+20354;5@6B7C8D9E:F;MS?T@UAVBWCXDYE\F`GaHbIdJeKfLgMhNiOnPsQzRS†TU,VNW]XoYtZ{[€\‡]^-_O`^apbuc|deˆfg.hPi_jqkvl}m‚n‰op3qcrst¢¦O§(î)-+ , ï * g [VâNÅ3MRQPz u v { | ywx&'úøçæ¾¼^Y ùĻܛšÃÂ@ ?   D ?  A ‘ @=>ŽIEA@fedc¨°   ZaÛßÝlj¡>™–^ L 5!4!º""W#<#C$B$²%±%ã&á&]'K'c(d(&))Y*A*G+F+J,H,›-<.8.X/>/ª0©0×1¿1Á2À2[3C3Z4B4ä5E6U6m7n7l8k8)9<9Þ:Õ: ; ; §< ¿< Ã= Â= m> h> n? o? ¹@£@7A1A8B:BáCàCMDUDOEVEžF™F¥G¹H»IåJKŠL]MbN YÂf¥YÂf§YÂf©YÂf®YÂf³YÂf·YÂf»YÂf¿YÂfÃYÂfÇYÂfËYÂfÏYÂfÓYÂfÖYÂfÚYÂfßYÂfåYÂfìYÂföYÂfZÂfZÂf ZÂfZÂfZÂfZÂfZÂfZÂf#ZÂf&ZÂf+ZÂf/ZÂf3ZÂf6ZÂf9ZÂf>ZÂfAZÂfDZÂfIZÂfLZÂfOZÂfQZÂfUZÂfYZÂf\ZÂf`ZÂfeZÂfkZÂfoZÂfrZÂfvZÂfzZÂfZÂf…ZÂfˆZÂfŒZÂfZÂf”ZÂf˜ZÂfœZÂfŸZÂf£ZÂf§ZÂf«ZÂf¯ZÂf²ZÂf¶ZÂf¹ZÂf¼ZÂf¿ZÂfÂZÂfÅZÂfÇZÂfÌZÂfÐZÂfÔZÂfØZÂfÜZÂfßZÂfãZÂfèZÂfîZÂfñZÂfôZÂf÷ZÂfúZÂfýZÂf[Âf[Âf[Âf [Âf [Âf[Âf[Âf[Âf[Âf![Âf$[Âf'[Âf*[Âf1[Âf4[Âf7[Âf:[Âf=[Âf@[ÂfC[ÂfE[ÂfI[ÂfM[ÂfQ[ÂfT[ÂfX[Âf][Âfc[Âfe[Âfh[Âfl[Âfq[Âfw[Âfy[Âf}[Âf[Âf„[Âfˆ[Âf[Âf“[Âf•[Âf˜[Âfœ[Âf¡[Âf§[Âfª[Âf¬[Âf°[Âf³[Âf·[Âf¼[ÂfÂ[ÂfÅ[ÂfÇ[ÂfÍ[Âf×[Âfâ[Âfð[Âfõ[Âfø[Âfü[Âfÿ[Âf\Âf\Âf"\Âf'\Âf/\Âf5\Âf;\ÂfF\ÂfS\Âfo\Âf|\Âf†\Âf‰\Âf›\Âf·\ÂfË\ÂfÚ\ÂfÞ\Âfá\Âfæ\Âfí\Âfø\Âf]Âf]Âf ]ÂfD]ÂfQ]Âf[]Âfe]Âf~]Âf—]Âf¡]Âf²]Âf»]ÂfÀ]ÂfÅ]ÂfÌ]ÂfÒ]Âfà]Âfé]Âfì]Âfð]Âfõ]Âfù]Âfÿ]Âf ^Âf ^Âf.^Âf@^ÂfI^ÂfQ^ÂfV^ÂfX^Âf[^Âf^^Âfc^Âfl^Âfq^Âfw^Âf€^Âf^Âf›^Âf¡^Âf¦^Âf©^Âf¬^Âf°^Âf¶^ÂfÀ^ÂfË^ÂfÐ^ÂfØ^ÂfÝ^Âfã^Âfí^Âfù^Âfÿ^Âf _Âf_Âf_Âf_Âf_Âf"_Âf(_Âf6_Âf9_Âf>_ÂfG_ÂfS_Âfd_Âfk_Âfz_ÂfŠ_Âf•_Âf˜_Âf_Âf¤_Âf©_Âf±_ÂfÁ_ÂfÌ_ÂfØ_Âfâ_Âfï_Âfô_Âfý_Âf`Âf`Âf`Âf+`ÂfC`ÂfE`ÂfH`ÂfM`ÂfQ`Âfd`Âfv`Âf€`Âf˜`Âf`Âf¢`Âf©`Âf¸`Âf¾`ÂfÊ`ÂfØ`ÂfÛ`ÂfÞ`Âfâ`Âfè`Âfï`Âfö`Âfü`ÂfaÂf aÂfaÂfaÂfaÂf$aÂf+aÂf2aÂf8aÂf>aÂfDaÂfJaÂfPaÂfVaÂf\aÂfbaÂfhaÂfnaÂftaÂfzaÂf€aÂf†aÂfŒaÂf’aÂf˜aÂfžaÂf¤aÂfªaÂf°aÂf¶aÂf¼aÂfÂaÂfÈaÂfËaÂfÒaÂf×aÂfíaÂfbÂfbÂf/bÂfEbÂfJbÂfSbÂfVbÂf]bÂf`bÂfdbÂfnbÂf}bÂfŽbÂf¤bÂfÀbÂfåbÂfùbÂfcÂfcÂf cÂf(cÂf0cÂf?cÂfUcÂf`cÂfkcÂf„cÂfœcÂf¼cÂfÜcÂfücÂfdÂfdÂf$dÂf5dÂfFdÂfIdÂfLdÂfRdÂfUdÂfYdÂftdÂf˜dÂf¼dÂfÏdÂfÝdÂfödÂfýdÂfeÂf$eÂf+eÂf6eÂfEeÂf`eÂfueÂfeÂfeÂfœeÂf°eÂfÀeÂfÕeÂfäeÂf÷eÂffÂffÂffÂf$fÂf+fÂf7fÂfKfÂfNfÂfSfÂfVfÂfYfÂfcfÂftfÂf“fÂf¢fÂf²fÂf·fÂf¼fÂfÀfÂfÄfÂfÈfÂfÐfÂfáfÂfêfÂf÷fÂfgÂfgÂf(gÂf4gÂfGgÂf]gÂfbgÂfdgÂfggÂfkgÂfvgÂf{gÂf‹gÂfŽgÂf‘gÂf™gÂf§gÂf¹gÂfÓgÂf×gÂfâgÂfêgÂfïgÂfúgÂfhÂfhÂfhÂf"hÂf,hÂf9hÂfPhÂf`hÂffhÂfohÂfvhÂf‚hÂfŽhÂfšhÂf¦hÂf©hÂf®hÂf±hÂf½hÂf¿hÂfÂhÂfÑhÂfÖhÂfêhÂfôhÂf÷hÂfûhÂf iÂf$iÂfCiÂfWiÂfciÂfiÂf–iÂf´iÂfÂiÂfÅiÂfÈiÂfÍiÂfÖiÂfâiÂfïiÂfjÂfjÂfjÂf1jÂf@jÂfRjÂfejÂfhjÂftjÂfxjÂfjÂfˆjÂf•jÂf—jÂfjÂf¦jÂf©jÂf­jÂf±jÂf·jÂfÈjÂfÕjÂfèjÂfëjÂfðjÂf÷jÂfûjÂfkÂfkÂfkÂfkÂfkÂfkÂf#kÂf3kÂfFkÂfVkÂf[kÂfdkÂfpkÂfƒkÂf†kÂf‹kÂf–kÂf›kÂf kÂf§kÂf­kÂfºkÂfÏkÂfÞkÂfëkÂfòkÂføkÂflÂflÂflÂf#lÂf)lÂf0lÂf9lÂf>lÂfGlÂfLlÂfNlÂfQlÂfTlÂfXlÂfilÂfslÂf}lÂf˜lÂf§lÂf«lÂf°lÂf·lÂfÏlÂfÚlÂfîlÂfmÂfmÂf%mÂf*mÂf/mÂf7mÂf:mÂf?mÂfFmÂfSmÂfWmÂf_mÂfdmÂfhmÂfqmÂfŠmÂf›mÂfªmÂf¯mÂf¸mÂf»mÂf¿mÂfÂmÂfÉmÂfÌmÂfÐmÂfÛmÂfàmÂfìmÂf nÂfnÂfnÂf(nÂf-nÂf5nÂfHnÂfXnÂf[nÂfnnÂfnÂf•nÂf¢nÂf¬nÂf±nÂf¹nÂfÌnÂfÑnÂfÖnÂfënÂfoÂf oÂfoÂf#oÂf1oÂf8oÂfFoÂfIoÂfMoÂfVoÂf[oÂf`oÂfioÂfroÂfwoÂf€oÂfƒoÂf†oÂfŒoÂf˜oÂf¤oÂf±oÂf½oÂfÀoÂfÃoÂfÆoÂfÊoÂfÑoÂfÖoÂfÛoÂfãoÂfòoÂfþoÂfpÂf pÂfpÂf#pÂf(pÂf1pÂf=pÂfPpÂfkpÂfspÂfypÂf~pÂf‰pÂfpÂfœpÂf¡pÂf¦pÂf±pÂf¶pÂf¹pÂf»pÂf¾pÂfÂpÂfÉpÂfÎpÂfÒpÂf×pÂfÝpÂfäpÂfîpÂfÿpÂf qÂfqÂf&qÂf0qÂf:qÂfIqÂfaqÂfpqÂfqÂfŽqÂf“qÂf–qÂf™qÂf¥qÂfªqÂf·qÂfÃqÂfÏqÂfäqÂf÷qÂf rÂfrÂfrÂfrÂf0rÂf=rÂf@rÂfErÂfKrÂfPrÂfXrÂfirÂfzrÂf„rÂfrÂf›rÂf rÂf£rÂf¦rÂf©rÂf­rÂfÃrÂfÉrÂfÓrÂfãrÂfñrÂfõrÂfùrÂfýrÂfsÂfsÂfsÂfsÂfsÂf!sÂf&sÂf-sÂf2sÂf9sÂf;sÂf>sÂfFsÂfSsÂf]sÂfbsÂfjsÂfysÂf~sÂfƒsÂfsÂf°sÂfÆsÂfÔsÂfßsÂfâsÂfåsÂfèsÂfìsÂfósÂføsÂftÂftÂf)tÂf.tÂf3tÂfCtÂfWtÂf\tÂfftÂfmtÂfwtÂf{tÂfˆtÂf¬tÂfÎtÂfãtÂfuÂf'uÂf>uÂfOuÂf`uÂfpuÂf|uÂfŠuÂfuÂf’uÂf•uÂf¤uÂf´uÂfÃuÂf×uÂfçuÂfìuÂföuÂfûuÂfvÂfvÂfvÂf$vÂf5vÂf:vÂfyÂfLyÂf^yÂfdyÂfgyÂfjyÂfnyÂfryÂfuyÂfxyÂf}yÂf…yÂfŽyÂf›yÂf yÂf¥yÂf°yÂf¼yÂfÏyÂfìyÂfûyÂfþyÂf zÂfzÂfzÂf(zÂf>zÂfMzÂfPzÂf^zÂffzÂflzÂfwzÂf†zÂf‹zÂfŽzÂf’zÂf˜zÂf¤zÂf©zÂf®zÂf²zÂf·zÂf½zÂfÀzÂfÊzÂfØzÂfÚzÂfâzÂfôzÂf{Âf{Âf{Âf{Âf{Âf#{Âf0{Âf<{ÂfQ{Âfd{Âfx{Âf}{Âf{Âf…{Âf‰{Âf•{Âfš{Âf­{Âf³{Âf¸{Âfº{Âf½{ÂfÀ{ÂfÄ{ÂfÊ{ÂfÔ{ÂfÙ{ÂfÞ{Âfã{Âfî{Âfñ{Âfô{Âfþ{Âf|Âf|Âf |Âf|Âf!|Âf)|Âf7|Âf;|ÂfE|ÂfH|ÂfP|ÂfX|Âf]|Âfb|Âfg|Âfs|Âfx|Âf€|Âfƒ|Âf†|ÂfŒ|Âf—|Âf©|Âf­|Âf°|Âf»|ÂfÀ|ÂfÌ|ÂfÏ|ÂfÕ|Âfä|Âfð|Âf}Âf}Âf}Âf}Âf}Âf!}Âf'}Âf+}Âf0}Âf:}ÂfG}Âf[}Âf_}Âfj}Âfu}Âf{}Âf‡}Âf¡}Âf²}ÂfÆ}ÂfÜ}Âfþ}Âf~Âf3~ÂfP~ÂfX~Âf`~Âfo~Âfy~Âf‚~Âf…~ÂfŠ~Âf–~Âf~Âf¢~Âf©~Âf³~Âfµ~Âf½~ÂfÂ~ÂfË~ÂfÐ~ÂfÔ~ÂfÚ~Âfâ~Âfê~Âfö~Âf ÂfÂfÂfÂfÂf$Âf)Âf.Âf2Âf=ÂfLÂfQÂfXÂf]ÂfqÂfvÂf{Âf€Âf…ÂfŒÂf‘Âf™ÂfžÂf§Âf·ÂfÂÂfËÂfÏÂfÜÂfñÂfüÂf€Âf€Âf(€Âf4€ÂfD€Âf[€Âf`€Âfb€Âfg€Âfo€Âft€Âf}€Âfƒ€Âf€Âf´€Âf߀Âfð€Âfø€Âfû€ÂfÂf ÂfÂfÂf!Âf&Âf8ÂfKÂfhÂfqÂfÂf†ÂfÂfÂf¤Âf¬Âf¼ÂfÂÂfÑÂfâÂfìÂfïÂfòÂføÂfúÂfþÂf‚Âf ‚Âf‚Âf‚Âf‚Âf#‚Âf.‚Âf1‚Âf8‚Âf?‚ÂfD‚ÂfP‚ÂfU‚Âf^‚Âfc‚Âfh‚Âfk‚Âfm‚Âfq‚Âf{‚Âf‡‚Âf‹‚ÂfŽ‚Âf“‚Âfš‚Âf°‚Âf»‚ÂfÇ‚ÂfÌ‚ÂfÓ‚ÂfÕ‚ÂfØ‚ÂfÝ‚Âfã‚Âfè‚Âfë‚Âfî‚Âfñ‚Âfô‚Âfü‚ÂfƒÂf è ß ,àÿÿÿàÿÿÿÇàÿÿÿ¿ àÿÿÿ ç f ¿àÿÿÿF yÿÿÿÿ9ÿÿÿÿÿÿ‡ÿÿÿÔþÿÿôþÿÿÃÒÎÍOÊËÏaÓÑ£Õ‚ÖÚÙÛ8ÿÿÿÿþÿÿÿÿÿÿÿ±ÿÿÿŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*?*=ÿÿÿEG***.ÿÿÿ2ÿÿÿ3ÿÿÿ6ÿÿÿ5ÿÿÿ1ÿÿÿ(¥D¥/ÿÿÿ-ÿÿÿ÷)ý)+ÿÿÿ*ÿÿÿç)&ÿÿÿ»ÿÿÿ'ÿÿÿ¹ÿÿÿ%ÿÿÿTty&%@?C > ` 9\¬ÿÿÿ % Výÿÿ 6 P / }ÚÿÿÿÛÿÿÿ3àÿÿÿàÿÿÿ@àÿÿÿ<Œÿÿÿàÿÿÿàÿÿÿ6ùüÿÿàÿÿÿàÿÿÿàÿÿÿ0áÿÿÿàÿÿÿÿÿÿÿàÿÿÿàÿÿÿ]ÀÿÿÿÁÿÿÿÂÿÿÿâÿÿÿÇÿÿÿçÿÿÿ#ÑÿÿÿñÿÿÿÊÿÿÿêÿÿÿøÿÿÿªÿÿÿÊÿÿÿ°ÿÿÿÐÿÿÿ¤ÿÿÿÄÿÿÿÝÿÿÿ ÿÿÿÀÿÿÿùÿÿÿP°ÿÿÿñÿÿÿ0Ðÿÿÿ`Šæ;ÿÿÿÿ:ÅÿÿÿÆÿÿÿAâÿÿJVd€p~ ¶ÿÿÿ÷ÿÿÿ‡ãÿÿÛãÿÿûãÿÿªÿÿÿ½ãÿÿœÿÿÿÍãÿÿÿÿÿ€ÿÿÿ‚ÿÿÿƒâÿÿ£âÿÿ!ßÿÿAßÿÿšßÿÿºßÿÿäÿÿÿðÿÿÿæÿÿÿ ÖÿÿñÿÿÖÿÿÕÕÿÿØÕÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿ ãÿÿüuÿÿØZÿÿ¼Zÿÿ(Øÿÿÿ ”ÿÿÿs9ÿÿÿsn‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛzþÿÿ ŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?)âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0Þÿÿÿ‚`Òáÿÿ1Ýáÿÿßáÿÿ àáÿÿ Çáÿÿ¾ÆÿÿÿÕáÿÿsøÿÿÿuäÿÿsäÿÿqäÿÿoäÿÿB€ÿÿÿ¹xÿÿÿ¹ÿÿÿ¹ˆÿÿÿ¹Àÿÿÿ¹¸ÿÿÿ¹¾ÿÿÿ¹þãÿÿ¹øãÿÿ¹ûãÿÿBúãÿÿB¹¶ÿÿÿõãÿÿ¹ûãÿÿ²ÿÿÿ¹ôãÿÿ¹êãÿÿ¹ñãÿÿBðãÿÿB¹ªÿÿÿëãÿÿ¹çãÿÿæãÿÿããÿÿBâãÿÿBœÿÿÿããÿÿâãÿÿÝãÿÿßãÿÿBÞãÿÿBÿÿÿŠÿÿÿ¹Öãÿÿ¹Úãÿÿ¹ÓãÿÿBÒãÿÿB¹€ÿÿÿ‚ÿÿÿÍãÿÿ¹£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿfÿÿfeÿÿidÿÿlcÿÿfibÿÿflnÿÿtmÿÿta ÿÿv` ÿÿe_ ÿÿkh ÿÿv] ÿÿm( ¿Áflibgcc_s_dw2-1.dll__register_frame_infolibgcj-12.dll_Jv_RegisterClasses__deregister_frame_info@Àf,ÀfÀf ÀfüÀfìÀfTÀfÈÀf£ÀfÂÀf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf¸Àf£Àf£Àf£Àf¸ÀfÂÀf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£Àf£ÀfÂÀf£ÀfØÀf£ÀfØÀf£Àf£ÀfÂÀfªÀfªÀføÀføÀføÀføÀføÀføÀfªÀfªÀfªÀfªÀføÀføÀføÀføÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀføÀføÀføÀføÀføÀføÀføÀføÀfªÀfªÀfªÀfªÀfªÀfªÀfªÀføÀføÀføÀføÀføÀføÀføÀføÀføÀføÀføÀføÀføÀføÀføÀføÀf²ÀfçÀf²Àf²Àf²Àf²Àf²Àf²ÀfÀf²ÀfÄÀf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²ÀfüÀf²ÀfpÀf|ÀfüÀfÀf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²ÀfpÀfpÀfpÀfpÀfpÀfpÀf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²Àf²ÀféÀf²ÀféÀfÄÀf²ÀfÄÀfSÀfSÀfiÀfiÀfiÀfiÀfiÀfiÀfSÀfiÀfSÀfSÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfSÀfiÀfiÀfiÀfiÀfiÀfiÀfSÀfiÀfSÀfSÀfSÀfSÀfSÀfSÀfSÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfSÀfSÀfSÀfSÀfSÀfSÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfiÀfnn:has_property_valuennn:get_all_casesUx$Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àf¸#ÀfT$Àfì#Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àf $Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àfý"Àf#Àf#ÀfX#Àf#Àft#Àf„#Àf0$ÀfØ#Àfh#Àf¤$Àfý$Àfß$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf²$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$ÀfÁ$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf¤$Àf„$ÀfnnM:\projects\regex\regex_3\regex\_regex.cPyUnicode_Check(string)PyUnicode_IS_READY(string)((PyUnicodeObject*)(string))->data.anyexpected string or bufferbuffer is NULLbuffer has negative sizebuffer size mismatcherror_regex_coretoo much backtrackingconcurrent not int or Nonegroup indices must be integers or strings, not %.200sgroup indices must be integers or stringsinvalid RE codestring indices must be integersinvalid group referenceexpected bytes instance, %.200s foundexpected string instance, %.200s foundexpected str instance, %.200s foundno such groupinvalid replacementinternal error in regular expression engine2Àf$2ÀfH2Àfp2ÀfŒ2Àf¬2ÀfÌ2Àfü2Àf3ÀfÔ1Àf43Àfº1Àfº1Àfº1Àfº1Àfº1Àf@3Àfº1Àfä1Àfregex.Regex(, flags= | regex.=)$IÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀf4IÀfïHÀfïHÀfïHÀfHIÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀf\IÀfïHÀfïHÀfïHÀfhIÀfïHÀfïHÀfïHÀftIÀfïHÀfïHÀfïHÀf€IÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfïHÀfIÀfŒKÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀf\KÀfZJÀfZJÀfZJÀf0KÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfKÀfZJÀfZJÀfZJÀfäJÀfZJÀfZJÀfZJÀfÄJÀfZJÀfZJÀfZJÀf¨JÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfZJÀfpJÀfÜKÀfÜKÀføKÀføKÀftLÀftLÀføKÀføKÀfDLÀfDLÀføKÀføKÀf LÀf LÀfüNÀfÈNÀfÈNÀfüNÀfðNÀfÈNÀfÈNÀfðNÀfäNÀfÈNÀfÈNÀfäNÀfØNÀfÈNÀfÈNÀfØNÀf0QÀf0QÀfôSÀfèSÀfÜSÀf¼SÀf¨SÀf|SÀf0QÀf0QÀf0QÀf0QÀfpSÀf`SÀf$SÀføRÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀfäRÀfØRÀf¤RÀfpRÀf`RÀfRÀfÀQÀf”QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀf0QÀfŒQÀf(QÀfdQÀfÁf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf:>Áf KÁfJÁf6IÁfºHÁfBHÁfÄGÁfO|OOnO:findallO|nO:splitO|OOO:searchO|OOO:fullmatchO|OOO:match_compile_replacement_helperregexNnOO|nOOO:subnOO|nOOO:subMAGICCODE_SIZEcopyrightiiORE_OP_FAILURERE_OP_SUCCESSRE_OP_ANYRE_OP_ANY_ALLRE_OP_ANY_ALL_REVRE_OP_ANY_REVRE_OP_ANY_URE_OP_ANY_U_REVRE_OP_ATOMICRE_OP_BOUNDARYRE_OP_BRANCHRE_OP_CALL_REFRE_OP_CHARACTERRE_OP_CHARACTER_IGNRE_OP_CHARACTER_IGN_REVRE_OP_CHARACTER_REVRE_OP_DEFAULT_BOUNDARYRE_OP_DEFAULT_END_OF_WORDRE_OP_DEFAULT_START_OF_WORDRE_OP_ENDRE_OP_END_OF_LINERE_OP_END_OF_LINE_URE_OP_END_OF_STRINGRE_OP_END_OF_STRING_LINERE_OP_END_OF_STRING_LINE_URE_OP_END_OF_WORDRE_OP_FUZZYRE_OP_GRAPHEME_BOUNDARYRE_OP_GREEDY_REPEATRE_OP_GROUPRE_OP_GROUP_CALLRE_OP_GROUP_EXISTSRE_OP_LAZY_REPEATRE_OP_LOOKAROUNDRE_OP_NEXTRE_OP_PROPERTYRE_OP_PROPERTY_IGNRE_OP_PROPERTY_IGN_REVRE_OP_PROPERTY_REVRE_OP_RANGERE_OP_RANGE_IGNRE_OP_RANGE_IGN_REVRE_OP_RANGE_REVRE_OP_REF_GROUPRE_OP_REF_GROUP_FLDRE_OP_REF_GROUP_FLD_REVRE_OP_REF_GROUP_IGNRE_OP_REF_GROUP_IGN_REVRE_OP_REF_GROUP_REVRE_OP_SEARCH_ANCHORRE_OP_SET_DIFFRE_OP_SET_DIFF_IGNRE_OP_SET_DIFF_IGN_REVRE_OP_SET_DIFF_REVRE_OP_SET_INTERRE_OP_SET_INTER_IGNRE_OP_SET_INTER_IGN_REVRE_OP_SET_INTER_REVRE_OP_SET_SYM_DIFFRE_OP_SET_SYM_DIFF_IGNRE_OP_SET_SYM_DIFF_IGN_REVRE_OP_SET_SYM_DIFF_REVRE_OP_SET_UNIONRE_OP_SET_UNION_IGNRE_OP_SET_UNION_IGN_REVRE_OP_SET_UNION_REVRE_OP_START_OF_LINERE_OP_START_OF_LINE_URE_OP_START_OF_STRINGRE_OP_START_OF_WORDRE_OP_STRINGRE_OP_STRING_FLDRE_OP_STRING_FLD_REVRE_OP_STRING_IGNRE_OP_STRING_IGN_REVRE_OP_STRING_REVRE_OP_STRING_SETRE_OP_STRING_SET_FLDRE_OP_STRING_SET_FLD_REVRE_OP_STRING_SET_IGNRE_OP_STRING_SET_IGN_REVRE_OP_STRING_SET_REVRE_OP_BODY_ENDRE_OP_BODY_STARTRE_OP_END_FUZZYRE_OP_END_GREEDY_REPEATRE_OP_END_GROUPRE_OP_END_LAZY_REPEATRE_OP_GREEDY_REPEAT_ONERE_OP_GROUP_RETURNRE_OP_LAZY_REPEAT_ONERE_OP_MATCH_BODYRE_OP_MATCH_TAILRE_OP_START_GROUP_regex.Patternmatchfullmatchsearchsubsubfsubnsubfnsplitsplititerfindallfinditerscanner__copy____deepcopy__patternThe pattern string from which the regex object was compiled.flagsThe regex matching flags.groupsThe number of capturing groups in the pattern.named_listsThe named lists used by the regex.groupindexA dictionary mapping group names to group numbers._regex.Matchgroupstartendspangroupdictcapturesdictexpandexpandfcapturesstartsendsspansdetach_string__getitem__reThe regex object that produced this match object.posThe position at which the regex engine starting searching.endposThe final position beyond which the regex engine won't search.lastindexThe group number of the last matched capturing group, or None.lastgroupThe name of the last matched capturing group, or None.regsA tuple of the spans of the capturing groups.stringThe string that was searched, or None if it has been detached._regex.ScannerThe regex object that produced this scanner object._regex.SplitterThe regex object that produced this splitter object._regexoverlappedconcurrentmaxsplitcountrepldefaultÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÀfTÀf°ÀfÀfdÀf¼ÀfABDSFILMRTXV0V1W„XÂf€†XÂfˆXÂfŠXÂfŒXÂf@ŽXÂfXÂf’XÂf”XÂf–XÂf˜XÂf@šXÂf XÂf XÂfcompileget_code_sizeget_propertiesfold_caseget_expand_on_foldinghas_property_valueget_all_cases-1/2011/101/161/21/31/41/51/61/71/81/91010010001000010000010000000010000000000001031071111/2118121221291313/2130132141515/2161717/2181922/32/52020020002000020221214216216000218222202222242262282323023223323424240252627282933/163/23/43/53/83030030003000031323334353637383944/54040040004000041424343200044454647484955/25/65/85050050005000066060060006000077/27/8707007000700008808008000800008499/29090090009000091AABOVEABOVELEFTABOVERIGHTAEGEANNUMBERSAHEXAIAINALALAPHALCHEMICALALCHEMICALSYMBOLSALEFALETTERALNUMALPHAALPHABETICALPHABETICPFALPHABETICPRESENTATIONFORMSALPHANUMERICAMBIGUOUSANANCIENTGREEKMUSICANCIENTGREEKMUSICALNOTATIONANCIENTGREEKNUMBERSANCIENTSYMBOLSANYARARABARABICARABICEXTAARABICEXTENDEDAARABICLETTERARABICMATHARABICMATHEMATICALALPHABETICSYMBOLSARABICNUMBERARABICPFAARABICPFBARABICPRESENTATIONFORMSAARABICPRESENTATIONFORMSBARABICSUPARABICSUPPLEMENTARMENIANARMIARMNARROWSASCIIASCIIHEXDIGITASSIGNEDATATAATARATBATERMATTACHEDABOVEATTACHEDABOVERIGHTATTACHEDBELOWATTACHEDBELOWLEFTAVAGRAHAAVESTANAVSTBB2BABALIBALINESEBAMUBAMUMBAMUMSUPBAMUMSUPPLEMENTBASICLATINBATAKBATKBBBCBEHBELOWBELOWLEFTBELOWRIGHTBENGBENGALIBETHBIDICBIDICLASSBIDICONTROLBIDIMBIDIMIRROREDBINDUBKBLBLANKBLKBLOCKBLOCKELEMENTSBNBOPOBOPOMOFOBOPOMOFOEXTBOPOMOFOEXTENDEDBOTTOMBOTTOMANDRIGHTBOUNDARYNEUTRALBOXDRAWINGBRBRAHBRAHMIBRAIBRAILLEBRAILLEPATTERNSBREAKAFTERBREAKBEFOREBREAKBOTHBREAKSYMBOLSBUGIBUGINESEBUHDBUHIDBURUSHASKIYEHBARREEBYZANTINEMUSICBYZANTINEMUSICALSYMBOLSCC&CAKMCANCANADIANABORIGINALCANADIANSYLLABICSCANONICALCANONICALCOMBININGCLASSCANSCARICARIANCARRIAGERETURNCASEDCASEDLETTERCASEIGNORABLECBCCCCCCCC10CCC103CCC107CCC11CCC118CCC12CCC122CCC129CCC13CCC130CCC132CCC133CCC14CCC15CCC16CCC17CCC18CCC19CCC20CCC21CCC22CCC23CCC24CCC25CCC26CCC27CCC28CCC29CCC30CCC31CCC32CCC33CCC34CCC35CCC36CCC84CCC91CFCHAKMACHAMCHANGESWHENCASEFOLDEDCHANGESWHENCASEMAPPEDCHANGESWHENLOWERCASEDCHANGESWHENTITLECASEDCHANGESWHENUPPERCASEDCHERCHEROKEECICIRCLECJCJKCJKCOMPATCJKCOMPATFORMSCJKCOMPATIBILITYCJKCOMPATIBILITYFORMSCJKCOMPATIBILITYIDEOGRAPHSCJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENTCJKCOMPATIDEOGRAPHSCJKCOMPATIDEOGRAPHSSUPCJKEXTACJKEXTBCJKEXTCCJKEXTDCJKRADICALSSUPCJKRADICALSSUPPLEMENTCJKSTROKESCJKSYMBOLSCJKSYMBOLSANDPUNCTUATIONCJKUNIFIEDIDEOGRAPHSCJKUNIFIEDIDEOGRAPHSEXTENSIONACJKUNIFIEDIDEOGRAPHSEXTENSIONBCJKUNIFIEDIDEOGRAPHSEXTENSIONCCJKUNIFIEDIDEOGRAPHSEXTENSIONDCLCLOSECLOSEPARENTHESISCLOSEPUNCTUATIONCMCNCNTRLCOCOMCOMBININGDIACRITICALMARKSCOMBININGDIACRITICALMARKSFORSYMBOLSCOMBININGDIACRITICALMARKSSUPPLEMENTCOMBININGHALFMARKSCOMBININGMARKCOMBININGMARKSFORSYMBOLSCOMMONCOMMONINDICNUMBERFORMSCOMMONSEPARATORCOMPATCOMPATJAMOCOMPLEXCONTEXTCONDITIONALJAPANESESTARTERCONNECTORPUNCTUATIONCONSONANTCONSONANTDEADCONSONANTFINALCONSONANTHEADLETTERCONSONANTMEDIALCONSONANTPLACEHOLDERCONSONANTREPHACONSONANTSUBJOINEDCONTINGENTBREAKCONTROLCONTROLPICTURESCOPTCOPTICCOUNTINGRODCOUNTINGRODNUMERALSCPCPRTCRCSCUNEIFORMCUNEIFORMNUMBERSCUNEIFORMNUMBERSANDPUNCTUATIONCURRENCYSYMBOLCURRENCYSYMBOLSCWCFCWCMCWLCWTCWUCYPRIOTCYPRIOTSYLLABARYCYRILLICCYRILLICEXTACYRILLICEXTBCYRILLICEXTENDEDACYRILLICEXTENDEDBCYRILLICSUPCYRILLICSUPPLEMENTCYRILLICSUPPLEMENTARYCYRLDDADALDALATHRISHDASHDASHPUNCTUATIONDBDEDECIMALDECIMALNUMBERDECOMPOSITIONTYPEDEFAULTIGNORABLECODEPOINTDEPDEPRECATEDDESERETDEVADEVANAGARIDEVANAGARIEXTDEVANAGARIEXTENDEDDIDIADIACRITICDIACRITICALSDIACRITICALSFORSYMBOLSDIACRITICALSSUPDIGITDINGBATSDOMINODOMINOTILESDOUBLEABOVEDOUBLEBELOWDOUBLEQUOTEDQDSRTDTDUALJOININGEEAEASTASIANWIDTHEGYPEGYPTIANHIEROGLYPHSEMOTICONSENENCENCLOSEDALPHANUMENCLOSEDALPHANUMERICSENCLOSEDALPHANUMERICSUPPLEMENTENCLOSEDALPHANUMSUPENCLOSEDCJKENCLOSEDCJKLETTERSANDMONTHSENCLOSEDIDEOGRAPHICSUPENCLOSEDIDEOGRAPHICSUPPLEMENTENCLOSINGMARKESETETHIETHIOPICETHIOPICEXTETHIOPICEXTAETHIOPICEXTENDEDETHIOPICEXTENDEDAETHIOPICSUPETHIOPICSUPPLEMENTEUROPEANNUMBEREUROPEANSEPARATOREUROPEANTERMINATOREXEXCLAMATIONEXTEXTENDEXTENDEREXTENDNUMLETFFALSEFARSIYEHFEFEHFINFINALFINALPUNCTUATIONFINALSEMKATHFIRSTSTRONGISOLATEFOFONTFORMATFRAFRACTIONFSIFULLWIDTHGAFGAMALGCGCBGENERALCATEGORYGENERALPUNCTUATIONGEOMETRICSHAPESGEORGEORGIANGEORGIANSUPGEORGIANSUPPLEMENTGLGLAGGLAGOLITICGLUEGOTHGOTHICGRAPHGRAPHEMEBASEGRAPHEMECLUSTERBREAKGRAPHEMEEXTENDGRAPHEMELINKGRBASEGREEKGREEKANDCOPTICGREEKEXTGREEKEXTENDEDGREKGREXTGRLINKGUJARATIGUJRGURMUKHIGURUHH2H3HAHHALFANDFULLFORMSHALFMARKSHALFWIDTHHALFWIDTHANDFULLWIDTHFORMSHAMZAONHEHGOALHANHANGHANGULHANGULCOMPATIBILITYJAMOHANGULJAMOHANGULJAMOEXTENDEDAHANGULJAMOEXTENDEDBHANGULSYLLABLESHANGULSYLLABLETYPEHANIHANOHANUNOOHEHEBRHEBREWHEBREWLETTERHEHHEHGOALHETHHEXHEXDIGITHIGHPRIVATEUSESURROGATESHIGHPUSURROGATESHIGHSURROGATESHIRAHIRAGANAHLHSTHYHYPHENIDIDCIDCONTINUEIDEOIDEOGRAPHICIDEOGRAPHICDESCRIPTIONCHARACTERSIDSIDSBIDSBINARYOPERATORIDSTIDSTARTIDSTRINARYOPERATORIMPERIALARAMAICININDICMATRACATEGORYINDICNUMBERFORMSINDICSYLLABICCATEGORYINFIXNUMERICINHERITEDINITINITIALINITIALPUNCTUATIONINMCINSCINSCRIPTIONALPAHLAVIINSCRIPTIONALPARTHIANINSEPARABLEINSEPERABLEINVISIBLEIOTASUBSCRIPTIPAEXTIPAEXTENSIONSISISOISOLATEDITALJAMOJAMOEXTAJAMOEXTBJAVAJAVANESEJGJLJOINCJOINCAUSINGJOINCONTROLJOININGGROUPJOININGTYPEJTJVKAKAFKAITHIKALIKANAKANASUPKANASUPPLEMENTKANAVOICINGKANBUNKANGXIKANGXIRADICALSKANNADAKAPHKATAKANAKATAKANAEXTKATAKANAORHIRAGANAKATAKANAPHONETICEXTENSIONSKAYAHLIKHAPHKHARKHAROSHTHIKHMERKHMERSYMBOLSKHMRKNDAKNOTTEDHEHKTHIKVLL&LAMLAMADHLANALAOLAOOLATINLATIN1LATIN1SUPLATIN1SUPPLEMENTLATINEXTALATINEXTADDITIONALLATINEXTBLATINEXTCLATINEXTDLATINEXTENDEDALATINEXTENDEDADDITIONALLATINEXTENDEDBLATINEXTENDEDCLATINEXTENDEDDLATNLBLELEADINGJAMOLEFTLEFTANDRIGHTLEFTJOININGLEFTTORIGHTLEFTTORIGHTEMBEDDINGLEFTTORIGHTISOLATELEFTTORIGHTOVERRIDELEPCLEPCHALETTERLETTERLIKESYMBOLSLETTERNUMBERLFLIMBLIMBULINBLINEARBLINEARBIDEOGRAMSLINEARBSYLLABARYLINEBREAKLINEFEEDLINESEPARATORLISULLLMLOLOELOGICALORDEREXCEPTIONLOWERLOWERCASELOWERCASELETTERLOWSURROGATESLRELRILROLTLULVLVSYLLABLELVTLVTSYLLABLELYCILYCIANLYDILYDIANMM&MAHJONGMAHJONGTILESMALAYALAMMANDMANDAICMANDATORYBREAKMARKMATHMATHALPHANUMMATHEMATICALALPHANUMERICSYMBOLSMATHEMATICALOPERATORSMATHOPERATORSMATHSYMBOLMBMCMEMEDMEDIALMEEMMEETEIMAYEKMEETEIMAYEKEXTMEETEIMAYEKEXTENSIONSMERCMEROMEROITICCURSIVEMEROITICHIEROGLYPHSMIAOMIDLETTERMIDNUMMIDNUMLETMIMMISCARROWSMISCELLANEOUSMATHEMATICALSYMBOLSAMISCELLANEOUSMATHEMATICALSYMBOLSBMISCELLANEOUSSYMBOLSMISCELLANEOUSSYMBOLSANDARROWSMISCELLANEOUSSYMBOLSANDPICTOGRAPHSMISCELLANEOUSTECHNICALMISCMATHSYMBOLSAMISCMATHSYMBOLSBMISCPICTOGRAPHSMISCSYMBOLSMISCTECHNICALMLMLYMMNMODIFIERLETTERMODIFIERLETTERSMODIFIERSYMBOLMODIFIERTONELETTERSMODIFYINGLETTERMONGMONGOLIANMTEIMUSICMUSICALSYMBOLSMYANMARMYANMAREXTAMYANMAREXTENDEDAMYMRNN&NANANNARNARROWNBNCHARNDNEUTRALNEWLINENEWTAILUENEXTLINENKNKONKOONLNONOBLOCKNOBREAKNOJOININGGROUPNONCHARACTERCODEPOINTNONENONJOININGNONSPACINGMARKNONSTARTERNOONNOTAPPLICABLENOTREORDEREDNRNSNSMNTNUNUKTANUMBERNUMBERFORMSNUMERICNUMERICTYPENUMERICVALUENUNNVNYAOALPHAOCRODIOGAMOGHAMOGREXTOIDCOIDSOLCHIKIOLCKOLDITALICOLDPERSIANOLDSOUTHARABIANOLDTURKICOLETTEROLOWEROMATHONOPOPENPUNCTUATIONOPTICALCHARACTERRECOGNITIONORIYAORKHORYAOSMAOSMANYAOTHEROTHERALPHABETICOTHERDEFAULTIGNORABLECODEPOINTOTHERGRAPHEMEEXTENDOTHERIDCONTINUEOTHERIDSTARTOTHERLETTEROTHERLOWERCASEOTHERMATHOTHERNEUTRALOTHERNUMBEROTHERPUNCTUATIONOTHERSYMBOLOTHERUPPERCASEOUPPEROVOVERLAYOVERSTRUCKPP&PARAGRAPHSEPARATORPATSYNPATTERNSYNTAXPATTERNWHITESPACEPATWSPCPDPDFPDIPEPFPHAGPHAGSPAPHAISTOSPHAISTOSDISCPHLIPHNXPHOENICIANPHONETICEXTPHONETICEXTENSIONSPHONETICEXTENSIONSSUPPLEMENTPHONETICEXTSUPPIPLAYINGCARDSPLRDPOPOPDIRECTIONALFORMATPOPDIRECTIONALISOLATEPOSTFIXNUMERICPRPREFIXNUMERICPREPENDPRINTPRIVATEUSEPRIVATEUSEAREAPRTIPSPUAPUNCTPUNCTUATIONQAACQAAIQAFQAPHQMARKQUQUOTATIONQUOTATIONMARKRRADICALREGIONALINDICATORREGISTERSHIFTERREHREJANGREVERSEDPERIRIGHTRIGHTJOININGRIGHTTOLEFTRIGHTTOLEFTEMBEDDINGRIGHTTOLEFTISOLATERIGHTTOLEFTOVERRIDERJNGRLERLIRLOROHINGYAYEHRUMIRUMINUMERALSYMBOLSRUNICRUNRSS&SASADSADHESAMARITANSAMRSARBSAURSAURASHTRASBSCSCONTINUESCRIPTSDSESEENSEGMENTSEPARATORSEMKATHSENTENCEBREAKSEPSEPARATORSGSHARADASHAVIANSHAWSHINSHRDSINGLEQUOTESINHSINHALASKSMSMALLSMALLFORMSSMALLFORMVARIANTSSMLSOSOFTDOTTEDSORASORASOMPENGSPSPACESPACESEPARATORSPACINGMARKSPACINGMODIFIERLETTERSSPECIALSSQSQRSQUARESTSTERMSUBSUNDSUNDANESESUNDANESESUPSUNDANESESUPPLEMENTSUPSUPARROWSASUPARROWSBSUPERSUPERANDSUBSUPERSCRIPTSANDSUBSCRIPTSSUPMATHOPERATORSSUPPLEMENTALARROWSASUPPLEMENTALARROWSBSUPPLEMENTALMATHEMATICALOPERATORSSUPPLEMENTALPUNCTUATIONSUPPLEMENTARYPRIVATEUSEAREAASUPPLEMENTARYPRIVATEUSEAREABSUPPUAASUPPUABSUPPUNCTUATIONSURROGATESWASHKAFSYSYLOSYLOTINAGRISYMBOLSYRCSYRIACSYRIACWAWTTAGALOGTAGBTAGBANWATAGSTAHTAILETAITHAMTAIVIETTAIXUANJINGTAIXUANJINGSYMBOLSTAKRTAKRITALETALUTAMILTAMLTAVTTAWTEHMARBUTATEHMARBUTAGOALTELUTELUGUTERMTERMINALPUNCTUATIONTETHTFNGTGLGTHAATHAANATHAITIBETANTIBTTIFINAGHTITLECASELETTERTONELETTERTONEMARKTOPTOPANDBOTTOMTOPANDBOTTOMANDRIGHTTOPANDLEFTTOPANDLEFTANDRIGHTTOPANDRIGHTTRAILINGJAMOTRANSPARENTTRANSPORTANDMAPTRANSPORTANDMAPSYMBOLSTRUEUUCASUCASEXTUGARUGARITICUIDEOUNASSIGNEDUNIFIEDCANADIANABORIGINALSYLLABICSUNIFIEDCANADIANABORIGINALSYLLABICSEXTENDEDUNIFIEDIDEOGRAPHUNKNOWNUPUPPERUPPERCASEUPPERCASELETTERVVAIVAIIVARIATIONSELECTORVARIATIONSELECTORSVARIATIONSELECTORSSUPPLEMENTVEDICEXTVEDICEXTENSIONSVERTVERTICALVERTICALFORMSVIRAMAVISARGAVISUALORDERLEFTVOWELVOWELDEPENDENTVOWELINDEPENDENTVOWELJAMOVRVSVSSUPWWAWWBWHITESPACEWIDEWJWORDWORDBREAKWORDJOINERWSWSPACEXDIGITXIDCXIDCONTINUEXIDSXIDSTARTXPEOXSUXXXYYEHYEHBARREEYEHWITHTAILYESYIYIIIYIJINGYIJINGHEXAGRAMSYMBOLSYIRADICALSYISYLLABLESYUDHYUDHHEZZ&ZAINZHAINZINHZLZPZSZWZWSPACEZYYYZZZZ      !""#$%&'"""()*+,-./0123456789:;<=>?@@ABCDEFGEHIEE@J@@KLMNOPQRESTUVWXYEE"""""""""""""""""""""""""""""""""""Z"""""""""""""""""""[\""""""""]""^_`abcdefghi"""""""""""""""""""""""jkkkkkkkkkkkkkkkkllllllllllllllllll""mnop""qrstuvwxyzL{|}~LLLLLL€L‚ƒL„L…LLL†LLL‡ˆ‰ŠLLLLLLLLL‹LLLLLLLLLLLLLLLLLL""""""ŒLLLLLLLL""""""""ŽLLLLLLL""""LLLLLLLLL‘’LLLLLLLLLLLLLLLE“”•–L—L˜™š›œžŸLLLLLLLLLLLL ¡LL¢£¤¥¦L§¨©ª«¬­®¯L"""""""""""""°""""""""""""""""±"²LLLLLLLLLLLLLLL""""²LLLLLLLLLLL³L´µLLLLLLLLLLLLlllllllllllllll¶       !"#$ %& ' ( ) *+ ,- ./ 0123456227 8922222:;<=>2 ?22222@AB2CD2EFG2HIIIIJIIIKLM22NOPQRSTUVWXYZ[TU\]^_`abUcdeYfSTUghiYjklmnop_qrsUtuvYwxsUyz{Y|xs2}~Y€‚2ƒ„…I†‡22ˆ‰ŠII‹ŒŽII‘’“”•2–—˜™ š›œII22žŸ ¡¢£¤ ¥22¦222222222222§¨22§22©ª«222ª222¬­®2¯22222°±2222222222222²2³´2222µ¶·¸2¹2º·»222¼½¾¿ÀÁ¿22Â22Ã22Ä2222Å2–ÆÇÈ2ɰ22ÊËÌÍÎÎ2Ï222ÐÑÒ¿¿ÓIIIIIÔ22ÕÖŸ×ØÙ2ÚB22ÛÜ22ÝÞßB2àIIIIáâãä åæç è éê ë ìíììíîìïðððñòóôõö÷øùúûüýþÿI      ÎÎÎÎÎÎÎÎÎÎÎII   ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎ ÎÎ!ÎÎÎÎÎÎ"Î#ÎÎÎÎÎ$% &ÎÎ'()*+,ÎÎÎ-¯IIIIIIIIII . /01 23 422256278888 9:;<IIIIÎ=ÎÎÎÎÎÎÎÎÎÎ>I?@ABC‡2222D±2222EF2ɇ2222GH23ÎÎ2ÎIJÎKLÎÎJÎÎLÎÎÎI222ÅÎÎÎÎ2222–III2M222222–ÎÎÎ22àN2OI PQ R2222STUVW XYZ[IIII\]2^_222`a22bc¿ dB2e2fg2–M22hijII22klmn2o222pqrstuv8IIIIIIIII22w¿22x2y22Êzzzzzzzz{{{{{{{{222222É222222|II}~€222222‚ƒ„22222…I2222†22ÃII‡ ˆé‰Š‹Œ2222222Ž‘’2“2G”•–—˜2«™ÉÉII22222223š  ›   œ?IIIÎΞ2–222eII2GŸ2 III2¡22¢£II ¤ 2222É¿IIIII¥22¦2§II2¨2©IIII222ªIIII«¬2­®¯2°222±2²2³2222´IIIIIIIII µ¶22·¸¹ºIÙ22»¼2´¿½2¾¿ÀIIIÙ22Á¿II22ÃÄ¿III222222GI      ÅÀ22GIIIII222´IIII2222°ÆËÇÈÉIIIIIIÊIIIIIIIÎÎÎÎÎÎÎ>ÎÎËÎÎÎÌÍÎÎÏÎÎÐIIÎÎÎÎÑIIIÎÎÎÎÎ Ò Ó ÔÕÖì רÙÚÛ Ó ÜÝ Þßàá â Ó ÔÕ ì ×á â Ó ã äåæç è éêëì í î ïðððñ2òóôõö÷øÊùÊIIIúÎÎ?ÎÎÎÎÎÎIû##IIüÎIÎÎÎ?ÎÎIIIIýÎþÎÎÿIIÎÎÎÎÎÎÎÎIÎÎÎÎIÎÎÎÎÎÎÎÎÎÎÎÎÎÐÎIIIIIIIIÎÎÎÎ IIIÎÎÎÎ>IIIÎÎÎÎÎÎÎ222227II222°22222ÉIIIIII I       I{{{{{{{    ! """""""" """ "  "  " " " "" # $$%"&%"""""""" "&  " "" '((((((((())(((((()))))))((*)))**))))))))++++++++ * ,-.,,)/ 00 " 1 "   2" " 3++4 """""" ,,,,1 05678,9:++++++++++++++;<=+<,,,,$$$$$$$$$$$$$>,,$?.,,,,,@@A BC+++++=AD$$$$E++$F$$$$$$$$$G+++H3++IJK++$$LMNE$$$$$$$+++++OP$$$$+++++F,,,,,,,$$$$$$$$E++++(Q,,$$$++J++++J+J++,.$$$$E+,.,,,,,,,,>$$$$$>,,,+++++++++++++O+R$$$$$$$$$$$RFST+++RSTSE+++$$$$$+U$$$P$$$:SP$$$>P>P$$$$$$$$$$>$$$>>,$$,FST+OVWVT>,,,V,,$P$+,$X,,:RP$$>,P>$P>$,OSTO,:O:+,:,,,P$>>,,,+$E,,,,,:RP$$$$P$P$$$$$$>$P$$,FST++:RVT,>,,,,,,,B,,,,,,,>$P$$,FTT+OVWVT,,,,R,,$PM,,,,,FP$$>,$>$$,P>>$,P>,$>,$$$$$$,,SRW,SWST,>,,V,,,,YCCXZ,,VSP$$$>$>$$$$$$$$$P$$,P+RSW+O++,,,:O$,,,,,,,Y,SP$$$>$$$P$$,FTSSWRWS+,,,VW,,,>P>,,,,,,$$$$$>PST+OSWST>,,,V,,,,,[$$$,SP$$$$$$$$>,$$$$P$$$$P,$$$>,O,VS+OOSSSS,S.,,,,,P$$$$$$$E$+++O,9$$$J+++=,,P>>P>>P,,,$$P$$$P$PP,$P$E$+++:F,$$>Q+++,,$$LC\\C+CCC333S$$$$P$$$$$$$$$>,:++++++R++=+$$E+++++:+++++++++OCCCCKCCZC\C.,,$$$$$]T+R+++TRTF$$$S+$$+FS^]SSS$E+F$$$$$$RTRSST]STC 1,,1,$$$$$?D$$$$$>$$,$$$>>$$,>$$,$$$>>$$,$$$$$$$>$$$$$$$$$>:+_`,CCCCC,,,$$>,,,,,a$$$$$$$$$$$$$?Gb$$$$$$$$$$$$cd,$$$$$?ef,,,,,,,$$$$$$>$$+O,,,,,$+=.,,,,$+,,,,,,>+,,,,,,$$+T+++SSSSRT+++++UBE,,,,,,,g<+A$h$$$$$$$$$$,,,,$$$$E>,,$$$,,,,,+RSTRS,,SRSST+,,Z,$$$$$$$,$$$$$$,,SSSSSSSS^$$$S,,,`,CCCCCCCCC$$$ERT,$$]R+++ORRT+++RSST++++O:U,++^$$$$$$$R++RRSSR^$$$,,\CCCC3++++CCCCZ,+^$$$$$$]++S+TS$$$$R+STT+S,,,,$$SSSS++++S+,7,P$$$$$(((,,,,+=++++++R+++F$E$$SF>,,,,(((((((--i((+++O,,,,,,,,,,++   , ,1111,jjjjk lm)k l), n) o),k lpqqqqqr@@ssstutuv@@wxyz{|} {~@@A@@@@@,|€|d((((((Q,,,++++++‚4ƒ4ƒ+++++O,,,,,,,C„C…C"  …C2 CCC„„„ † #$'C 2C‡eeeeeeeeeˆ‰eŠ,,,‹CCCC‹C‹CCC‹CCCCCCCC‹‹CCCCCCCCCCCCCCCCŒCCCCCCCC‹CCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,CCCZ,,,,CCCCCZ,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[CCCCCCCCCCCCCCCCC|Ž|Ž‹, 0k """" "( ‡CC…"‘+ ,,7_6,,6,$$$$,,,5.,,,,,,:$$$>,,,,$$$>$$$>ttxytgttUs,,CCCCC[CCCCC,,,,,CCCCCC,,’“C”•–eeee++S—((Ce˜?C$$$>:™šD$$$$$?(D,,P$$$$$$$$$$$$>CCCCCCCCCCCCCZCCCCCCC›$$h$$$$$$$$$$$œ$,, E4+++++U ,,,:$$$eeeee+,,,,)))š(((()  -""" *ž"k ,,,,,, 0,,,,,,(#$$$F$F$E$$$]TRCC,,CŸ,,,$$,,,,S$$$$$$$$$SSSSSSSSO,,,,+$$$G,,$$$++++$$$E+++++S,,,,,7$ES++SRS 5,,$$$$E++RTRTO,,,,$E$$$$R,,D$$LC],,F+FEF$$+E>,,,,,,,,,,,Ph$$$$$]+Sh¡O,,,,P$$>P$$>P$$>,,,,$]TSR T,$$,,,,,,$$$>,P$$¢¢¢¢¢¢¢¢££££££££$$$$$,,,k,,,,,6,,PF$$$$¤$$$$$$>$$>>$P>$$$$$$)))))))),,,,,,,,P$$$$$$$$$$$$$,$$$$$$$$$$$$$Ÿ,¥},,,¦§}¥}z¨.”}©B,,$$>$$$$$$$$$$$>N7|}$$$$$D$$$$$$$$$$$$$$(,$$$,$$$,$$$,$>,ªX‹Z,,,,N@C,$$$$$$P$$$$$$>$P.,«,[CCCCeeŠYCCCCCCCC`,,CCCCCC3,,,,,,,“$$$$f,,$$$$$$$7$$,,$$$$¬ee,,,,, $$$,>$$$$$$P>,>P$$$7$$$,7$$$$$,,7$$$$,,,$E+:O,,++$$P$P$$$$$,,+O,:,,,,.,,,$$$$$$­$$$,7$$$,$>,,$$$$>,,,`T^$$$$$$$$$$+++++++=,,ST+RT=®,,,,,,,+F$$$$$$$$$E++T+++O,,,,,,$]S++++R^$?.,,,$$$$$ETS+++T,,,,ef,,,,,,]SSSSSSSSSSSSSSW,,,,,,,:+I(((((($,,,,,,,CCCZ[CCCCC¯T+C¯SS°@@@±+++K3+++CCCCCCC++CCCCCCCC,C+K,,,,,,,,,,,,  k 0 ,0101 0 666 1 01 0 0 1 0 00, 0 , ! ! ! ! ! ,$$P$$$$$P>>PP$$$$>$$PP,,,>,PPPP$P>>PPPPPP>>P$>$$$>$$P$>>$$$$$P$$P$P$$P$$,,,,,,,[CCCCCCZ`,,,,,CCCCCCZ,,,,,,CCCCZ,,,C,,,,,,,Z,,,,,,,CCC[CCCCCCCCCCZ,CCZCCZ,,ZCCCCCCCCCCC[CZ,CCCC,,,,,,,,,[CCZ,[CCCCCN,,,,,,,@@@@@@@@£££££££,                        !"################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"""""#$%&'()*+,-./01223345678899:;<=>>?@AABCDDEEFGHIJKLMNOPQRRSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWXYYZ[\]^_`abcdefffffffffffffffffffffffffffffffffffffffghhhhhhhijjjjjjjjkkkkkkkkkkkkkkkkkkllllmnnnnnopqrstuvwxyz{|wwwwww}w~€ww‚wwwƒwww„…†‡wwwwwwwwwˆwwwwwwwwwwwwwwwwww‰‰‰‰‰‰‰‰Šwwwwwww‹‹‹‹‹‹‹‹ŒwwwwwwwŽwwwwwwwww‘‘wwwwwwwwwwwwww’’““”w•w––––––––wwwwwwwwwwww——ww˜™šš››œœœœœœžŸw                             ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¥wwwwwwwwwwwwwww¦¦¦¦§wwwwwwwwwww¨w©ªwwwwwwwwwwww««««««««««««««««¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬  !!!!!!!!""""""""""######$$$$$$$$%%%%%%%%&&''''''(((((((())******++,,--..////////0000000000011111222223334444445566777777777888888889999::::;;;;;<<<=>>>????????@@@@AAAABBBBBBBBCCCCCCCCDDDDDDDEEEFFFGGGHHHHHIIIIJJJJJJJKKKKKKKKLLLLLLLLMMMMNNOOOOOOOOOOPPPPPPPPQQRRRRRRSSSSSSSSTTTTTTTTTTTTUUUVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\]]^^^^^^^^___`````aaaaaabbccccccccddddddddeeeeeeeeeeeeeefgggghhhhhhiiiiiijjjkkkkkklmmnnnoppppppppqqqqqqqqrrrrrrrrrrrrssssttttttttuuuuuuuuuvvvvwwwxxxxxxxxxxxxyyyyyyzzzzzz{{||||||||||||||}}}~€€€€€€‚‚‚ƒƒƒ„„………………††††††‡‡ˆˆˆˆˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’’’’’’’“““““”””””””””””•–—˜˜™™ššššššššš›››››››››››››››œžžžžžžžžŸŸŸŸ     ¡¡¡¡¢¢¢££¤¤¤¤¥¥¥¦¦§§¨¨¨¨©©©©©ªªª«««¬¬¬¬­­®®¯¯°°±±±±±±²²²²²²³³´´´´µµ¶¶·····¸¸¹¹¹¹¹¹¹¹ººººº»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÆÆÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÈÉÉÊÊÊÊÊÊÊÊËËËËËËËËÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ   !"#$%%%%%&'()*+,-./0123456789:;;;<=;;;;;>;??;;;;@ABCDEFGHIJKLMNOP;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHQHHHHHHHHHHHHHHHHHHHRSSSSSSSSSTUUVWXYZ[\]^_`a bAAAAAAAAAAAAAAAAAAHHcdefgghijklmnopqArstuvAAAAAAwAxyzA{A|AAA}AAA~€AAAAAAAAA‚AAƒƒƒƒƒƒ„A…AAAAAAA††††††††‡AAAAAAAˆˆˆˆ‰AAAAAAAAAŠ‹ŒAAAAAAAAAAAAAAA;ŽA‘A’“”;;•;–AAAAAAAAAAAA—˜AA™š›œAžŸ ¡¢£¤¥?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{.|}~~~€..‚ƒ„…†..‡‡‡‡ˆ‡‰Š‡ˆ‡‹‹Œ..ŽŽŽŽ‘‘‘‘‘‘‘‘’’’’“”’’“’’•–—’’’–’’’˜’™’š›››››œžŸ    ¡¢£¤¥¦§¨©ª«««««¬­­®¯°°°°°±°°²³´µ¶¶·¸¹º»»¼»½¾««¿ÀÁÁÁÂÁÃÄÄÅ.....ÆÆÆÆÇÆÆÈÉÉÉÉÊÊÊËÌÌÌÍÎÏÏÏ....ÐÑÒÓÔÕÖרÙÚ Û ÛÜ Ý ÞÞß àáâãäåæ.çèéêëìí.æ.îïïïïïïïïðñ..........òòóòòóôôôôôôôõŽŽööö÷ø’ùúúúúû....üýüüüüüþüüüüüüüüüüüüüÿ.û    ‘‘‘‘  ì‘ ‘üüüÿüüüü........ !!"ñ###$%%%%&'2()))**+‘,----./..000123455556789:;ú.........88<=‘‘>‘?‘‘@üüüüüüAüüüüüüB..CDEFGHI.JK..LñÙMNOPîQR‘ STUVWXYZ[[..XXXXXXX\]^ _û...`abcccd..efghi...jkllmn..ooooopppqrs.....tuuvwx..yz{|....}}~....€‚ƒ„…††‡‡‡ˆ‰Š‹ŒŽ.........1‘.’’’’“”•–———˜™...šššš›œ..žŸ...              ¡.      ¢£¤¤¤¤¤¤¤¤¤¤¥.....¦....§§§§¨§§©ª§......«.......¬­®¯°±².. ³...í´âµ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈ...GûìäÊîî..æäûæ....ËÌæÍ´..ÎÏðìÐ.Îä½Ñ²ìÒ........ÓÔ...¬...üüüüüÕ..üüüÖüüüüüA......×..      !!!!!!!!!"""""""""""""#$$$$$$$$$$$$$$$$$$$$$$%&&&&&&&&&&&&&&'(((((((()*(((((((((((((((((+(((,-,---.,.,----------.---..------.,.,-.,-,-------------/0/001/1/0000000000100010/101001/1/0//011000000002323333232333333333343334323333333232343333333356566675756666666666766676566666675756665666666666668988:8:889::89:8:88888888:8:88:98888888888:;<;<<<=<=<<<<<<<<<<<=<<<<<;<<;<<<=<=<<;=<<<<<<<<<<<<>?>>>@>@>>>>>>>>>>>@>>>>>?>>>>>>@>@>>?@@>>>>>>>?@ABAAACACAAAAAAAAAAAAAAAAAAAACBAAACACAACBAAAAAAAAAABAAADEDDDDDDDDFDDDDDDDDDDDDEDDDDEDDDFFEDDFFDDDDDFGHHHHHHHHHHHHHHHHHHHHIHHHHHHJKKJKKJLLJLLLJLJJLJLLLLLLJLLLKKLLLLLLLLLLMMMMMMMMMMMMNMMMMMMMMMONMMMMMMMMMMMMMOMMMPQORRRRRRRRSSSSSSSSSSSTTSSSSSUSSVVVVVVVVWWWWWWWWWWWWXWWWWWXXWWXWWWWWXXWWWWWWWWWXWWWWWWWWWXYWWWWWWWXWWWWWZZZZZZZZZZ[\\\\\\\\]]]]]]]]]]]]]]^_____________`_abbbbbbcbbbcdddddddddde ffffffffffgggggghghgiiiiiiiiiiiiiiiiiiiijkjjjjljjjjjjjjjjjjjjjjjjjjjjl\\\mmmmmmmmmmmmmmnmmmmmmnmmmmmmooooooooooooooooopqqqqqqqqqqqqqqqqqqqqqqqqrqssssssssssssssstttttttttttttttuttttttuvttttttttttttwwwwwwwwwwwwwwwwwwwwxyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{|{}}}}}}}}yyyy~~~~ €‚ƒ„       … „  †††††††† ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆ ‰ ŠŠŠŠŠŠŠŠŠŠŠŠ‹Œ‹WWWXWWWXWWWXŽV‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“~”‘•––––––––––––––––––––—•–˜™VVVVVVVVVVVVVVš›VVVVVVVœ–––––––––––žŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ŸŸŸ ¡¡¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¤¤¤¤¤¤¤¤¤¤……¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¦¦¦§§§§§§§§§§¨§§§§§§((((((©©©©©©©©ªªªªªªªªªª«VVVVVV𬬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬­­­­­­­­­­­®­­­­­­­­­­­­­­RRRRRR¯¯¯¯¯¯¯¯¯°±¯¯²²²²²²²²²²²³YWWXYWWXYWWX²²²²²²²²²²²²VVVVVš™VVVVVVVV…´ ––––––––––––VVVVVVVVVVš µµµµµµ¶µµµµµµµµµµµµ·µµµµµµµµµ·µ¶µµµµµµµµµµµµ·  ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¹ºººººººº»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÆÆÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÈÇÇÈÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉËËËËËËËËËËËËËËÌÍÍÍÍÍÍÍÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÓÑÑÑÑÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÓÒÑÑÑÑÑÑÑÑÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕ×××××××××××××××ØØØØØØØØØÙØØØØÚÚÚÚÚÚÚÚÚÚÚÚÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞààààààààààáàààààààââââââââââââãâââââäääääääääääääääääåååååååååååååååæåæååççççççççççççççç褤¤¤éêêêêêêêêêêëêêêêêêêëìí ~        ´´´´´´´´´´´´´´´´´´´´´´´ î      žž##))77)))) BBBRRR___ )) ***+++,,---  ...///88866NNNN>>>CC]]DDDEE)))559997::::$$$$!!!!)!""""##"$%%%SSFFTT;;AAGGGHHIIIUUMMMOOOOVVV0000JJJKKK&&&'''111<<((22334444WWW@@@LLLbbaa====XXPPPYYZZZ[[[^^\\eee```dddff???QQQTcccc"!!    !"#$%&'()*+,-./01234567899999:99999999999999;<=>?999@ABC9DE999999999999999999999999999999999999999999999999999999999FGHIJKLMNOPQRS99999999999999999999999999999999999999TUVWXYZ[\]^_9`abc999999d9efg9h9i9999999jklm999999999n999999999999999999o9p99999999999999999999999q999999999999999999999999999999999999999r999999999stu999999999999999999999999999999999vwx999yz{|}~99999999999999999999999999999999999999999999€999999999999999999999999999999999‚9ƒ„9999999999999999999999999999  !!!"#$%&'()*+,-./01234'562789:;<=>?@ABCD;EFGHIJAKBLD;MNOPQRSTB;UFVWABCD;UFGPXJAYZ[\]Z^_`aSB;;bcd`eKAf;;bFd`egAhf;idjIAkfklmnopqI=rpstrWurvwdxyz{=rX|}t~€‚[[[[[[ƒC ZW„„…†<‡ˆr‰rŠ‹‡‡SŒur‡Ž=Grr‘r{‡’@“42‡”4‹•–—=<‹‹‹‹˜‹™š›‘šœžŸ ¡¢£¤¥Œ¦kl§¨©ª«W¬K­®¥I¥¯]°±±±±±±±±±±±²ª‹ ±±±±±±±³±±±±±±±±±±±‹´•µIu¥k¶‘ ·¸'‘yr¹42t‡>'Œ¥r@=¸ºr»}¼Q'½¾¾¾'¿r‘À‘ÀÁ!ÂÃÄÅ!KÀ‹k‘Æ=ÇÈÉÊËÌ ͱ±±±±±ÎkkkÏÐbÑ‹‹ ˆW ‹‘§‹r‹;Ò‹‹K¬Ó? @A0(?=:B<C:DE A@D(D0:? -0 D A -0> F?GDB(HI::JBD 9IF?:D0=IDK: 5I5LB?MN I ),  O H(,45PQQ  RSTUV WXW%Y%%@ @  @)Z[\]^^_^^_1`2 aa) @ :?IDb (:@ cd!!"!efdgX Whi jklm^no 29 (p,]:q%r(D:DI A  ?@ABC DEFGGGGGGHHHHIJJJJJAKKLMNOPQRSTUVWXYZ [\]^_`abcdefg hihjkhlhimnopqirs^Gtuvwxyz{|}~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€€€‚€~€€ƒH„JJ…†d-‡Fˆ‰Š‹d[ŒŽ[v‘’“”•h–—˜™Kš›            !"#$%&' $()*%%"+,-./  / 0$   " 1 $ " 222233333344444456-)7.)-&89: , .;1);<=65>6?6--+ 1$ @A  ""BC>----222D+6; C EB6FB#GHHHHHHGHHHHHHGHHGHHH3IJ4444"  K.  B+5&----------LM=NO PQQQQQQ             !"#!!$!%!!&'(!)*!!+,-./01234!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!56789:;<=>!!!?@ABC!!!DE!!!!F!!!!!!!!!GH!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!J!!!!KL!!!!!!!!!!!!!!!!MN!OPQR!!!!!!!!!!!!!!!!!!!!!!S!TUV!!!!!!!!!!!!!!!V!!!!!WX!!!!!!!!!!!!!!  !"#$%&'()*+)),-./0))12345677879:;<=>?@ABCDEFGHI>GJKLMNOPQRISTUVSWXYZ[\]^_`7abc7defghij7)klmnop))))))))))q)rst)u)vwx))y^))))))))))z{))|}~€)‚ƒ„))…)†)‡ˆ‰Š‹)Œ7Ž)‘’77“”•–—)˜)™š›77œžŸ ¡¢£¡¤¥¦§¨©ª«7¬­®¯°±77777777777²³77777777777´µ77¶·77¸¹7777º7»¼½¾¿ÀÁ)ÂÃÄÄÅÆ777777ÇÈ^)É^)pÊË))ÌÍ7Î)))))‡77))))))Ï7))))Ï7ÎÐÑÒÓÔ))ÕÖרÙÚ7ÛÜÝ)Þßàá2âãˆ:äå7)æçè)éêëìí7777)î)))))ïðñ)))ò))ó7ôõö))÷ø))ùÎ)ú)ûüýþÿ)))   7)))Í77)y777 7777ˆ) 7Î7)7)ƒ77‡77777‡ó77)77ˆ7777)‡‡7777))77777–O–– !7–ä"77777)#ƒ7)))Ì7777)))$7777)Ì777777)%777777))&'(777)7777777777*+,7777-77777./0123456789:./;1<=>5?@ABCD½EFGHIJKLMN77))))))Ã7)y))))))7777777OPPP7777Q     !" #"$!%&$'($$)*+,,,,,,,,,,,,-.'/0 1 2!"3 4,5 6789,,,,,,,,,,:;:$$$$$$<$=>?,,@A$$$$$$$$$$B,,,,,CDE$$$$$$$$F,G,HIJKLMNO$$$$$$$,,,,,,@P$$$$$Q,,RK$$$$$$$B,,)S$$$$$QT,,UUV$$$$$$UW$$X,,,,,,@,$$$$$$$$$$$$$QY,,,,U,$$QZP$P$9P$LL$$$$$W$+()Y,[[\]^Q_)9P<`L$$$$$W$Wa)I@][VbP+_Jc9P$^^$$$$$W$WP)Y,::VXQ_,[[Vd^Q_6eP<(W)aW`X<($$)d@dIVX]_9P$WW$$$$$W$$P)f,IIV;)dP$WW$$$$$W$$P)Y,IIV;gQ_a$$$$$$?@ABCDEFGHIJKLMNOO     !"#$%&'()*+,-./01&/234567891:8;<:=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdMefghijklmnopdqrsturvwxyz{|}~h€jQ‚ƒ„„…†‡ˆR‰Š‹DdrŒŽY‘’“”•^1–c—M˜…ƒ™šj›œž“Ÿ i¡¢£¤¥¦r§¨©Mªj«¬­®DZM¯j“r°r±²dd¢³´^Mdd—~µ‘ ~—¶d‹·‹ ¸j¦¹º»¼½¾¿ÀÁÂRºº€€ÃÃĽůÇÈɃZrþÿÿ ÿÿÿÿÿÿÿÃÿP ß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿ¿¶ÿÿÿÿÿÿÿþÀÿÿÿÿïþáœÿÿàÿÿÿÿüÿÿÿ0ÿÿÿüÿÿÿÿýðÿÿÿÿïÿßáÿþþîŸùÿÿýÅãŸY€°î‡ùÿÿýmÇ^?î¿ûÿÿýí㿟À°ìÇ=ÖÇÿÃÇîßýÿÿýïãß`ìßýÿß`@ÿÿÿçß]€üìÿüÿÿû/€_ÿ ÿÿÿ –%ðþ®ìÿ;_ ðÿþÿÿÿþÿÿÿþÿÿÿÿÿùçÁÿÿ@0¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿ‡ÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿÏÿÿ€ÿÿÿÿÿÿÿÿ?ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿþÿ€ÿÿïÿïÿóü¿ÿàüÿÿÿ?Þoÿÿ????ÿªÿÿß_ÜÏÿÜ€ÿ„ü/>P½ÿóàCÿÀÿÿÿÿx ÿ€ÿÿ€àþ>ÿÿààÿÿÿÿ?þÿÿÿÿÿ ÿðÿÿÿ€€ÿüÿÿÿÿyÿÿ»÷ÿÿüÿÿÿÿ÷ÿÿ?ÿÿ8ÿÿ<~~~ÿÿøÿÿÿ?ÿÿÿÿÿøàÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþ?ÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷–þ÷ „ê–ª–÷÷^ÿûÿîûÿ        !"#$"%&'()*+,-./0123456789:;<=>?@ABCDEFGH=>I@J673?@AB%&6CDþÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®¤ªJUUÒUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿ„8'>P=À Àÿÿê%À(UUUUTUTUUUjU(Uÿÿÿÿðÿÿ?ÿÿÿÐdÞ?ÿÿÿ°çß{_üðÿÿ?ðÿÿ?üÿÿðÿÿÿ       !"#$%&'()*+,-./01234567//$$889þÿÿ ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿïÿÿÿÿ Ï<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿ¿ ÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ€ÿ„ü/>P½òàCÀÿÿÿÿÿÿÿÿx ÿ?ÿÿÿüÿÿÿÿxÿøÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷    !"#$%&'()*+,-./0123  !"#$!%&$!'# ()#*+,-#(.#"#/0123456789:;<=!>??@@ABCDEFGHIJKL*MNOPQRSTUVWXYZ[\]^_`abcdefghiRjklmNn4opqrstudvwxyz{|N}~l,€‚ƒ „~N…†N‡ˆ‰Š‹Œ Ž€@@¡ÿÿÿÿÿÿÿÿ0°øþÿÿÿÿ¿¶ÿøÿÿÀ¿ÿ=€ÿÀÿø?Àÿÿ?ðÿÿþ!þ  †9#¾! @ ÀÁ=`@0\òÀò@? þßàÿþÿÿÿ@àýfÃd à °?@þ x‡€ @åøŸ€Ðø< @£ðÏ?÷ÿý!ðÿÿÿøð ààà`ø|ßÿ€ÿÿÿ0€€€€ <>~p €÷¿€D`ÿÿÀ?€ÿÈ~fÁ 0X !üÿÿÿ$ nð‡ÿx&€ïÀ(¿€ÿÿ€øÿç<ÿÿ        !"#$%&'()*+,-þÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿÿ@ Àÿÿê%À(UUUUTUTUUUjU(Uÿ       !"#$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢`[Uµªª-ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿÿßPÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ       !"#!$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢ÐVUµªª+ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿß@ÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ        !"#$%&'()*+,-./01þÿÿ ÿÿÿUUUUUUUªªVUUUUU«ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzU E@×þÿû€cUUU³æÿÿÿÿÿÿTUU«*UUUþÿÿÿ€¿ UULÿ?ÿÿ?ªÿÿÿœœœ@ Àÿÿê%À(UUUUTUTUUUjU(Uøÿ      !"#$%&'()*+,-./01þÿÿ ÿÿÿÿÿÿÿÿÿÿþÿßÿ÷ÿóÿ³ðÿÿÿýÿüÿÿß i‹&  Ï8@×ÿÿûÿÿÿÿÿãÿÿÿ·ïüÿÿÿþÿÿÿþÿÿÿÿ¿ "ÿÿÿOÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ@ @ÀÿÿÿÿÿÿÿÿÿÿmÀx ÿ?ÿÿÿüÿüÿÿÿþÿ8ÿøÿÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMM     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžkŸ ¡^¢y£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ –%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿøÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOP    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨•©Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß<À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿþàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_Ûÿÿÿøÿÿÿüÿÿàßÿüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNN     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžk kŸ ¡^¢ky£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß8@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ–%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿàÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿŠªÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQ    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨N©•Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß8À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿæàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_ÛÿÿÿøÿðÿÿÿÿÿüÿàŠªüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ      €€0xø|ÿÿÿøÿÿÿÿ    !"#$%&'()*+  !"#$%&'()$*+,-./0123456789::;;<=>?@ABCDE#FGHIJKLM NOPQRSPTUVWXYZ[\]^_`$a&bcdeaFfgFhijklmnÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿøÀûï>ðÿÿþ!þ P €†9#¾!Ð À@ €ÀÁ=`D0`„\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8‡€ @åøŸÐ< @£ðÏ÷ÿý!ð0ÿÿ€€ü€÷?D`ÿÿÀ?€ÿÈ~fÁ0@ ! nð‡ÿx€ïÀ(¿€ Ãøç<             !"#$%&'()*+,-./012222222223456789:;<222=>?@A2B2CD2222E2FG222H222I2222JK2222222LMNOPQRS222222T2UVWXYZ[\]^_2222222_22222  !"#$%&'()*+,!-./0123456789:;8<=>?@AB CDEFGHIJKLMNOPQRSTUVWXYZ[\Z]^_`abcdefghZijklmnopdqrstuvwxyz{|}~€‚ƒ„…†Y‡ˆ‰ Š‹ŒSŽ‘ˆh’‡ “”•‹Y–h—˜™š›fœžŸ f¡¢£¤Z¥¦§¨©ª«¬­®–¯°[±²³´µ¶·¸¹µº»Z ¼½¾¿ÀYÁÂõZZ]–ÄÅÆÇÈÉÊËÌ͈ÎÏÐÑÒÓfÔvÕÖרÙvÚ×ÛÆÜÝÜÞßàáhâãäåæŽ`€çèéêëìíîéïðñòóôlˆõöƒ‹lY÷øYùúZˆû]Óü–·ýþÿˆŽ\ÿÿÿÿÿÿÿÿßÿÿÿ|ð×ÿÿûÿÿÿüÿÿÿþÿÿÿþþÿÿÿÿ†@IÿÿÿÀÿÈÿÿÿþÿÿÿ?@`Âÿÿÿ?ýÿÿÿàÿÿ?ÿðÿÿ?ÿÿÿÿAýøÿÿÿÿÿÿëÞÿóÿÿþìŸùÿÿýÅ£Y°Ãÿÿè‡ùÿÿýmÃ^Àÿè¿ûÿÿýíãÃÿÿýí#°ÃÿÿèÇ=ÖÇÿƒÆÀÿÿîßýÿÿýï#Ãÿÿìßýÿÿýïc› @Ãÿÿÿÿ§Á]Ãÿ?þìÿüÿÿû/ÿÿ €€ÿ–%ðþ®ì _ÿóÿÿÿüÿÿ_ýÿþÿÿÿ€ À¿ßÿÿ™ÿÿÿ<þÿáÿ›ßÿß¿ ÿÿÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿcÿÿÿßÿÿOÀ¿ðÿÿÿÿÿÿÿÿÿÿÿÿ?xûñÿÿÿÿ?ÿÿÿÿÿÇÿÿÆÿÿ¿àÿ?ðÿÿÿÿÿ/èûÿÿÿðüÿÿÿÃôÿÿ¿\ ðÿ0øÿãÿÿÿÞoÿÿ????ÿªÿÿÿ?ÿÿßÿßÿÏïÿÿÜÿÿÿÿ€ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ€ÿÿÿÿÿÿÿÿûÿÿÿøàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿ»÷ÿÿŸÿÀÿü?Àÿÿ €ÿÿ7ìÿ¿ÿÃÿ÷/ÿóÿÿb>øÿÏ?~~~ßÿøÿÿÿ?ÿÿø ÿÿ_Ûÿÿÿøÿÿÿÿÿüÿÿÿ?ÿÿÿ÷ÿßÿüüü0ÿïÿÿÿÿ·ÿ?ÿ?‡ÿÿÿÿÿÿÿÿÿÿÿ¿ÿ?ÿ?ýÿÿÿÿ¿‘ÿÿ¿ÿÿÿÿÿÿÿƒÿÿÿÀïþÿÿÿÿ?þÿÿ?ÿÿÿÿÿýÿÿÿ€?üÿÿÿ‡ÙÿÿÿÿÀÿÿÿ?€ÿ×@ÿÿÿÿÿÿøÿþÿÿ_<ðÿÿÿÃÿÿ#ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿÿÏÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿþþÿþÿÀÿÿÿÿÿÿ¿ÿßÿÿÿøáÿ?      €@@> ÿƒ€À|À0      @@?€    @€ „ÿðà„            !"#$%&'()*+,-.    !"#$%&"'(")*+,-.PŒ@€ˆÿÿ0 á þ`8p<ìøÀ0€@àøÀÀ€à€÷€ü€?`     !""#"$%&"'()""""""""""*+,##--../"&01234@'3@``ÿbø„ü/>³ûñààó¶>Ãðÿ?ë/0°ÀðÁŒ”``Àÿøÿÿ0 PÿÿÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿÿÿ÷ÿÿÿÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿ~~ÿ~~ÿ~~     !  !"!#$%&'()*+,-. /012345678+9:9;*<=>?@>ABCDEFG5HIJ5@5KL#M ÿ¿¶ÿøÿþÀž!ÿÿÀÿÀøïðÿÌÿßà ÀŸ€‡#¿ŸÀÇ€ß`߀€_ÿ ò òþÿàÿþÿÿÿøyÀÃ…|0€Àÿÿÿÿ€àþÿàÿþ3€ÿðÿ?ÿÿÿÿÿðøðÿÀ€ÿþ0Aø ø@nðÿ?ÿøÿø?ÿÿÿ   Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?      !"#$%&'(  !"#$%&'()*+,-./0123456789:&;<==>?@ABCDEFG)HIJK@ÿÿÿÿÿÿÿÿà00øþÿûÿÿ¿ø‡€aÿÀÿø?ðÿÿ  €_ ÂÜ@€€¿ þ àŸø À?ÿ!ðÿÿðÿà ààà`€€ü€°€ÿÿÿx@0À€ÿÿ€ãøç<     €@€@ >`p €  ÿ ðÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿ0ÿÿÀÿÿÿÿÿÀ@€`€€0ÀÀ Àó ÿÿÿûÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀ€šÿÿÿÿÿÿÿÿÿÿÿ? €€0 ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿ    € @@  À À À À`@€€þ         !"#$%   !"@€P€0 „@`ÌÀ0€ÀˆÀ€àÄ€`8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ> À   þÿüxþZCˆ€ÿÿÿÿþÿïÿÿÿÿÿÿ?ðÿÿÿÿÀ`                    !"#$%&'()*+,-./0123456784449:44444;<=>?@4ABCDEFGHIJKLMNOPQRSTUVWWWXYZ[\]^_``a`b`c`````d```efghijklmnopq````````````Wr``stuvwxyz{|}~€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€    !"#$% &'()*+,- ./01 2 34 156 372 86 39 1:2 ;4<1 = > ? @AB1C 3D 1 4 1 EF GH IJ K L MNOP< QR STUVW Q X  YZ [ [ 1 1 \]^ X_ ` abc d e fghi j= kil m nl op qrs to uvwwxyz{|}~€ T‚ƒ„…† ‡ˆ‰ Š‹Œ Ž ‘’“X ”• – — ˜‹‰ —™š› œ ‹ x  ž ’Ÿ   d ¡  Œ w –¢ – l£ ¤ ¥ ¦§ ¨ s l © ªl - « ¬­® ¯2 D< ° ±²³´Xtµ¶·¸‰ ¹º» — W¼½¾¿ÀÁ2 Ât‰ l à - ÄÅ l Æ ÇÈ –- ÉÊË Ì Í Œ Î ¡ ‡ ÏÐÐÐÑ—‹ÒÓ’’ Ô … Õ“‹Ö Ò×ØÙ‹Ú Û ‰ ‹ Ü             ! """"""#$%&'((((((()##*+,((((-./012(3((((-""456""7 8"""('9 :;<;=< > = ;<; =?  @ @A= ;>E @ F  : >G =9 9=B;   HI<9E <<; ; <; :@ = =  J >; B :< = KL = 9; : <   A :9G<;A E9;  >B :H > 9E;= ; 9 M   NNOP QRST U VWXYZFZFSSSSF   M[\   [ ]   F F    F    ^ >   _ F F `a :: @ b > >; <9@@  ;EA;> =;= c""d"(((e(((fgh ijFk (((lmn Fop[ """q!"""r4""s #######t 9@ <; >9 =B  uv9< >wx [ yz((( F F{  F     |                                                   !"#$%&'(  !"#$%&''()*+,-./0123456789:;<=>?@A.BCDEFGHIJKLMNAOPQFRSTUV   !"#$%&''()*+$,--.&/0012+34#5678977:;<=>?@ABCDEFGHIJKL0M;NOPQM0R6M STSJ5 UVL9WX5YZ[9N\]91^_`a11;1b@^JMcd9&N;e5Lfg^h5^Mijklmbn0&1&9222223----3+-----))----))-------222262---222--222----23--2455455422-2222-222.-22--2.12 2- 22--2-22-22222-22-2-22--2--2-2-2222222222---2---22222-22 !""####$$%%%%----+&'('''''2222--21.2--2-225*-)2224-2-2222-2,13.//-222-2-22-++0+++++---   !"###########################################$#%&'()*+,-./01234##5   !! "#$%&'()*+!,-./012345675899:;<=!>?<=!@ABCDEFGHIJKLIIMNOOPQRSTUVWXYZ[\]^_`abcdeffghijklmnoppqrstufffvttwxyz{|}9fffffffffffff~€‚ƒ„…‚ƒ„†‡ffffˆ‰fˆffŠ‹tŒttttttŒŽŽŽŽŽfŽŽŽŽŽŽf‘’“Q”•QN–—˜™š›œœœžŸ ¡¢££££££¤¥¥¦§§§¨©ª£«¬­®¯°±²¥³´µ¶·¸¹º»¼½¾¿ÀÀÁÂÃÄÄÄÄÄÅÆÆÆÆÇÈÉÊËÌÍÍÎÏÐÐÐÐÐÑÐÐÐÒÓÔÕÐÐÐÖ×ÐØÙÚÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÜÐÐÐÕÐÝÞßàáâãäåäæf玎èéꎎëìíQ                !     "#$   %    & $$ ''()*+,-   .. /  01234567***+***8#9":;;<=>?@ABBCD;E=>FFFFG   $H# % $  !IIIIIJIIIIK#L,M$$$$$$. ! N% O"IPIIIIIIKQQQQQQQRQQQS7$  $! .;;T $ UVVVVVVVVUUUWUVVXYZ[\UWVUUU]W^^^^^________`aaaaaaaaabcccccd^^e______faccghaijkilih`_i`mnaojpi_jq_`j^^^rsstsssssuvwxxxxwxyz{{|[}~Z}~[}~}~[€‚‚‚‚‚‚‚ƒ„„„„„„„„„„…†„†„†„†‡‚ˆ„… ;;;;;‰;;;;;‰Š‹=‰;;B=;=;;;BŒ=;‰;‰;;BŒ;Ž;‰;;;;>;;;;;Ž‹=;Œ;Š‘=‹‹Œ;Œ;=;;B;;;;==B;’K“”QQ”#•                        !"#      !"#"$%&'()*+,-./01,23!456789:;<=>>?@A&BCDEFGHIJKLMNOLKPGKQKRSRGTUVWXXXXXYZZZZ[\]^A_`a"`bPc_Oa                                  !"""""""#$$$$$$$$$$%&$&$&$&'"($%    !"#-+-) ##!!'' 777 +--++- ###!!'  &  8 )++++++++7/7+--..)#! ,2**01$  "%( 345 # # # 77-++66 ## ' --+9  !"#$%&'()*+,-   !"#$%&'()*+,-.+/-0,1/-2+,3.4+56789+3:+.+;<=>?@ABCDEF4GHIJKGLL++MNOPQRSTUVWXYZ[5\Z]^_]`abcde`fgh]ijk]l9md]no]'pqrst,u4vwexyz,{e]|'}~]€'‚ƒ„iL,  !"#  $$% &'%$! ()*+  %   ++ % %++%, - % +% +./.0 ++,  %+-%  1% %%++2%%   % + %        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOYZ[\]^_`abcdefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefglmmmmmmmmmmmmmmmmHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHOOOOnopqrstuvwxyHz{|}HHHHHH~H€H‚HƒHHH„HHH…†‡ˆHHHHHHHHH‰HHHHHHHHHHHHHHHHHHŠH‹HHHHHHHHHHHHHHHHHHHHHHHŒŽHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH‘’“HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH”•–—H˜H™š›œHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHžŸHH ¡¢£¤H¥¦§¨©ª«¬­HHHHHHHHHHHHHHHHHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO®¯H°±HHHHHHHHHHHHHHHHHHHHHHHHHHHH      !"#$%&'()*% +,-./0000100023456789:;<=>?@A:;BCDEFG;HIJ?K9:;HLM?NOPQRSETUV;WXY?Z[V;\X]?^[V_`a?bcdefg0hijjklm00nopqrs00tu%v8wxyz{|}00jjjj~jjjj€‚‚‚‚ƒ„„„„„…†…‡ˆ‰ˆŠ‹wŒŽŽJ‘’“”‘•jjjjj–—Œ˜—™šw››œjžjjŸj ¡¢jjj£j¤——00000¥¦§¨©ª«¬%)­¦®¯%°0000±²³´µ¶¶·¸¹¹º»¼½¾¿ÀÁÂÃÄwÅÆÇÈÉÊËÌÍÎÏÎÐÑÒÓÔÕÖרÙÚÛÜÝÞß0à0áááááááááâááááÍááãáäåæçèéêëìíîïðñòóôõö÷øùáúûüýþÿw0000000000..€ß  0000       Þ              0             Þ                         !   "°#$0%&'.(à0000Z)*+,-¦.—/%01234456007´89jŸjjjj:; <=>000000000?—@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDBCBE‚F„„GHHHHHHHHßIJKLMNO0P00QR´STUV¹WXY Z [\]^._`abc‰d¸¸00àefàg000hwJ00.(à000ijk00¸—00000lmn00op0000q0000rstuvwxy000000000.«z{P|0«}~y—«1€000«4—00 ‚—000.0ƒ€„…†.00000y0000‡3ˆ«000000‰0000000šŠ‹Œ¸00000ßM¹‘Ž‘’“”Vw•–––—˜™š›œgžg000M        ÞŸ00 á¡ááá¢áá 0000£¤¥  ¦‰00  §¨   ! Þ ©ª0 §   «     ¬­   ®¯°±²( ³00000000´    µ000     000(       ¶00  !"""#$%$$&&'$$$$'&'()$*+,-.$$$$/////////////0$$/1&$$$$$&23 456 78-9--- '5'-$$$$$$$:&$$$&$&$$$$$$$$&&$$$5-; '+'&'&'&&&$$-5+5+&$$$+$$'$ 32 $$+'&$'&'&$55$+5+$+$$$'&&$$$ $$$$$+''&'$-++$&$$$$$$$ $$$$$$$5+5+$$$$$$'$-'&$&$'&&$'&$&$$$5$5$&$$+$$$$ &$$+'&&'$'55$$$+5$$$$$$$$'&'$-$$+5$$$&'&$$$$$$&'55&$$$+$$$$$<$'&$''$&$5$+55$&$$$$$=>>>>>>>>>>>>>>>>>>>>?$*>>>>>>>@ ;$$=??=??=$$$>>=>>>=>==$>=>>>>>>=>$>>??>>>$ $>> AABCD66E9,FF&$++5;-&AGHI$$ ; >>>'$$'$JJJJJJJJKKKKKKKKKKKKLLLLLLLLLLLL&$&&$&$&&$&&+$$$&$$$$$MN$;&5$$$$$)$$$$$$$$$$&$$$$$$>>;OMP>$ $$$6;6I&$$$$$$$$$&$6 >>>>>>>$>>?$$$$$>>>>>>$$>>>>>$$$ ?$>$>>>>>>>?>>>>>>?+--$$ ;;M&$-$$$$$Q;; $';---&$$$$5$$$$$$$$$$$$''''$&$'$& &;;;R;SR;TUVUVWXY!3333Z[\][M;;;^&$_N5$$$$$$$22`$$$abaa$$$$$$&$$$$&$$aaacaaadaeddaaaaaefdafeaefaefaafaefagacaaaU6FFFFFFFbFFFFFhhhhhhhhhhbFFF$$$$$i;Mj$$$')$$$$$$+&&UUUUUUU;;;;kUUFFFF;;9;Ml$$aaaaaaaaaaaaagaaaaa$$$$$aaaaaa$$mnaFFFFFaFFFFopaaaaaaaqaanrasttttaaaataaaaaaatttaaauaatv+w[rxttttaaaaatuanyr$$gaaaaaaaaaaaa$gaaaaaaaaaaaaaazaaaaaz$${{{{{{{{aaaaaanaaaaaaaaaaaz$aaaz$$$$j $$-$$$+;;$$$$$$$$$$--$$|$$$A6$$$$5$$$$;$$;$$$$$'JJJJJJ}$-;' $$$ $;>?$$$$$$$$$$$=>>;5$$$$'&'&'&$$$$$~~~~$$$$$$KKK€$LLLLLLLL$$‚‚‚‚‚‚‚‚$'$$ƒ„////1//////0//00/ƒ0/////$$$$$$$$'F$|$…†:‡ˆ$$$aa‰hhhhhhhm‰maaamN[6‰hhmaaazŠ‹$$&ŒiaaFammaaaaa[aaaaaa‰Žaaaaaa‰Ž‰pF]{{{{[$$$$&$aŠ‘&$$$$+’$'&';)$'$'$$$Q$$M$$$$$$&'&$&'Q$Q$$'$$$+5$$''$$5$+;;;;&$$$$Q;;;$&$$&$$$M$ -;;$$$$$$$5 ;;$$$$$$-M)$$$$$$$&$$$$$$“FpbFFp$$$$$$$+a$$$$$$$--$$$$$$&'&'&''''&'&&'&&&$$ '&&''&''$$$&$'''''&&''''''&&'&&'&&''''gaaaaaaz”$$&$$$$$•••••••••••••az$$$$$$aaaaz$$$z$$$$$$$aaagaaaaaacdaadaaazaaz$$zaaaaaaadddaaaaccdaaaaaaaaaagaz$daaaaaaacdaaaaaa$aaaa$$$$$$$$$gaaz$gaaaaa+$$$$$$$ $     $         %%%%        !!         & && &&& && "### !%%     && ''           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNK    !"#$%&'()$*+,-./01234567,85,69*:;<8=>?7@ABC#DEFGHIJGGKLMNOPQRS:+T:#UVW*<0$      !"#$% &%%#'(#)*+,$$+-./+0'**(1-+(--'*-+ ''2$  *(3 45 678 9('++(#*           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUUVWXYZ[\]^_`abcdefghi>jklm       !"#$%"#$%&'("#$)*"#$)*"#$)*+,-./012"#31245607"#89:;<=>?@ABCDEFGHIJKLMNOPCQRSTUVWXYPZ[\K]^__`abcDKdeQfg01hijklKgmno 9:pqrstuvwxyz{|}~€‚zƒ„g…†‡ˆ‰Š‹Œ"Ž"Ž"#‘’“”•012–—˜   1™#š›œ žŸž ¡¢£¤¥¦§¨©ª"#‘« ¬ ¬ ­1®F¯bC[°XXeIIPk±²!#%' !#%' .  (U^(U^ %' "$&%'(2?@ABCDEFGHIJKLMNOP##g's(^Ust%!(^2<F'2(%#'U^!!#%'  (!!(TUVWXYZ[\]^_`abcdefghijklmno PYbk(PUY^b(PUY^gk((((((Ãÿÿ?ÿÿÿ?y;xpüÿøÿÿùÿÿ?Â7:ð3üÿßSz0p€0¼þÿÿÿÿÏ¿ÿÿÿÿP|pˆ/<60ÿÿó~0P(¨  €       !"#$%%&&'()*+,-./0123456789:;<=>?@ABCDEFGHI,JE              !  "#$%%$ &' ( )* +,-. &/,(012  # 3 4( 5678! +,#9 : ' (%;                !"#$ %&'($ )&*($+,"-./0123456789:;<=>?@ABCDEFGHIJKLMNMNOLPQRSTU?VWXYZ[\]^_`abNcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽN‘’“”•–—˜™š›œ     !! ""#$% &'()*##+&& ,++-.& -/*,++012.$*34# *5"678$  9":;6< ) =>?@ABBCBBBBBBBBDEFGHIJ KLMNOPQRST6UVWXYXZ[#=\]^_`abcdeffghijcklEXmcnoOkpqrstuvwxyz{|}jc~ !€l‚ƒ„…†‡uˆY‚f‰klŠ‹ŒXŽYuQccc‘ ’T“ul”J•–c—˜Q-™ š›5œœXlžYœl?uŸ                                                      !"#$%&'()*+,-./0123456789:;<=>?@AA BBCDEFGHHHIJKKKLMMMMNOPQRSTUVWTUTUVWXYTUZ[TUTUTU\]^_`abc^defghiijjklmmmnnnoHHHHHIKKKKKLpqrs%tuvvvvwxRDDyz%{| }}}}}~~~~~      !"###$$%&'()'()'()*'()+,-./01123456789::;<:=>?@ABACDEFGGGHIIJKL!!!MNNNOPPQRSTUVWXYZ[\]^^^_`abcdefghijklmmnopqrstuvwxy---zzzzzzzz{{{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€‚ƒ„…†nnnnnnnnssssssssnnnnnnssssssnnnnssss‡‡ˆˆˆˆ‰‰ŠŠ‹‹ŒŒnnssŽŽ‘‘‘‘nn’ss““nn”vss••y––——˜™š›œžžžžžžžžŸŸŸŸŸŸŸŸŸŸ          ¡¢£¤¥¦§¨©ªª««««««««««««««««¬­®¯¯¯¯¯¯¯¯°°°°°°°°       !"#$%%&'()***+,,,,-./01211231111456789:;<<=>???*****+@ABCD /EFGHHHHH    !""#$%&'()*+,--------.//////////////////////0000000000000000123333333333333333333344567777533883399,::;;5<=>?@@@@@@@@AAAAAAAAAABCDEFGHIIJKLMMMMMMMM ‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0`ÆÿÿÿAâÿÿøÿÿÿ¶ÿÿÿ÷ÿÿÿûãÿÿªÿÿÿœÿÿÿÿÿÿ€ÿÿÿ‚ÿÿÿ£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿ(         !"#$%&'())*+,-.///0122223456787789:7;<=>?@ABCDEFGHIJKLMNNOPQQQ/////0RSTUV$W++XYZ[\]]]]]      !"#$$$%&&'()*+,-./01233333333455555555555555555555556777777777777777789:;<=>??????????????@ABC????DDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJKLMN??OOPQRSTUVWWWWXYZ[\??]]^_`ab??cc2defghiijjklmnoppppppppqqqqqqqqqqrstuvwxyyz{|}~€‚ƒ„…†‡ˆ‰‰‰‰‰‰‰‰\¸ÁfMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| ˆ düÿ‹A…B x Å A @ÌüÿCA…B u Å D zR| ˆÔüÿ 0ÐüÿDÌüÿ XÄüÿ lÀüÿ€Àüÿ ”¸üÿ ¨°üÿ¼¬üÿ Фüÿä”üÿøüÿ €üÿ. œüÿ4˜üÿ#H¨üÿJ(\àüÿÇA†A ƒC S  AÃAÆB ˆ|üÿ!,œŒüÿŠA†A ƒC0I  AÃAÆD ,Ìèüÿ‚A†A ƒC0D  AÃAÆA Dü<üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇDDxüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ,Œ´üÿ‚A†A ƒC0D  AÃAÆA ,¼üÿŠA†A ƒC0I  AÃAÆD ìdüÿ+|üÿ'üÿ( üÿr|<lüÿÍA…A ‡A†AƒC@i AÃA ÆAÇAÅD h AÃAÆ AÇAÅD l AÃAÆ AÇAÅD lAÃAÆ AÇAÅ|¼¼üÿÎA…A ‡A†AƒC@i AÃA ÆAÇAÅD i AÃAÆ AÇAÅC m AÃAÆ AÇAÅC mAÃAÆ AÇAÅ< üÿ 8Püÿ[A…A ‡A†AƒCOAÃA ÆAÇAÅ<Œ$üÿïA‡A †Aƒ}  ÃAÆAÇB hà AÆAÇ,ÌÔüÿBA†A ƒj ÃAÆC PÃAÆüèüÿ àüÿ$Ôüÿ8ÈüÿL¼üÿ`°üÿt¤üÿˆ˜üÿœŒüÿ€°€üÿTA…A ‡A†AƒC0Z AÃA ÆAÇAÅC o AÃAÆ AÇAÅA à AÃAÆ AÇAÅD g AÃAÆ AÇAÅA 4Püÿ7AƒCqAà ThüÿVAƒs ÃD ]ÃxœüÿŒüÿfC0Y D E¬ØüÿPÀÜüÿ5A…A ‡A†AƒCp¨ AÃA ÆAÇAÅA |AÃAÆ AÇAÅ4À üÿ\A†A ƒC0w  AÃAÆB Y AÃAÆ4Lä üÿ„A‡A †AƒC c A ÃAÆAÇD („0 üÿ4AƒC Y AÃB RAð8 üÿ4Ä8 üÿJA‡A †AƒC s A ÃAÆAÇD (üL üÿ/AƒC b AÃA EAÃ4(P üÿ!AƒC e AÃB z AÃA p AÃC ,`< üÿŠA†A ƒC0I  AÃAÆD ,˜ üÿ‚A†A ƒC0D  AÃAÆA DÀì üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ (üÿ8 Lüÿ0 @üÿC \ A V B lP ¤üÿ…A…A ‡A†AƒC`R AÃA ÆAÇAÅA c AÃAÆ AÇAÅC × AÃAÆ AÇAÅA À ¼üÿÔ ¸üÿdè ¸üÿÁA…A ‡A†AƒC@ AÃA ÆAÇAÅD K AÃAÆ AÇAÅA PAÃAÆ AÇAÅP üÿ/C c B Dl (üÿ„A‡A †AƒC0d A ÃAÆAÇC PAà AÆAÇ´ düÿC RXÌ düÿ,A‡A †AƒC Ó A ÃAÆAÇD u Aà AÆAÇD { Aà AÆAÇB D( 4üÿ’A‡A †AƒC`q A ÃAÆAÇB | Aà AÆAÇA (p €üÿHA†A ƒC0{  AÃAÆB 8œ œüÿýA†A ƒC v  AÃAÆC `  AÃAÆB hØ `üÿA…A ‡A†AƒC0™ AÃAÆ AÇAÅD | AÃA ÆAÇAÅD S AÃAÆ AÇAÅA hD üÿõA…A ‡A†AƒC0… AÃAÆ AÇAÅD u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA h° ”üÿíA…A ‡A†AƒC0€ AÃAÆ AÇAÅA u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA < üÿLA…A ‡A†AƒC@u AÃA ÆAÇAÅA <\ $üÿOA…A ‡A†AƒC@{ AÃA ÆAÇAÅA œ 4üÿAƒCYAü 4üÿC Z(Ô <üÿ A†A ƒC W AÃAÆ40üÿAƒC0g AÃD W AÃD W AÃD <8 üÿA…A ‡A†AƒC@ç AÃA ÆAÇAÅA hxàüÿA…A ‡A†AƒC0¡ AÃAÆ AÇAÅD B AÃA ÆAÇAÅB S AÃAÆ AÇAÅA lä”üÿ‚A‡A †AƒC0H A ÃAÆAÇC l Aà AÆAÇA  Aà AÆAÇB N Aà AÆAÇC HT¨üÿ>A†A ƒC0Y  AÃAÆD c  AÃAÆC N  AÃAÆD  œüÿ ´œüÿAƒC e AÃB <ØüÿA…A ‡A†AƒC@Û AÃA ÆAÇAÅB èüÿ4AƒC mAÃ8üüÿ4AƒC mAÃDX üÿ‡A‡A †AƒC0O A ÃAÆAÇD E Aà AÆAÇD D P üÿšA‡A †AƒC0s A ÃAÆAÇD N Aà AÆAÇC Pè¤!üÿeA…A ‡A†AƒCPs AÃA ÆAÇAÅB N AÃAÆ AÇAÅB <<¸#üÿAA…A ‡A†AƒC0ö AÃA ÆAÇAÅC 8|¼$üÿaA†A ƒC Q  AÃAÆD d  AÃAÆB 8¸ä$üÿ]A†A ƒC R  AÃAÆC a  AÃAÆA (ô%üÿqA†A ƒC Q  AÃAÆD ( P%üÿqA†A ƒC R  AÃAÆC 4L˜%üÿTA†A ƒC0B  AÃAÆC E AÃAÆ8„´%üÿAA…A ‡A†AƒC uAÃA ÆAÇAÅ\À¼%üÿ³AƒC P AÃC w AÃD Q AÃB Z AÃE F AÃE F AÃE F AÃE 8 &üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇ8\&üÿ8A‡A †AƒS  ÃAÆAÇD Yà AÆAÇ8˜&üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇPÔü%üÿvA…A ‡A†AƒC@d AÃA ÆAÇAÅA } AÃAÆ AÇAÅC T( 'üÿA…A ‡A†AƒCPQ AÃA ÆAÇAÅD q AÃAÆ AÇAÅC |€à'üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|\(üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ4€Ø(üÿIAƒN ÃA P ÃH D ÃH D ÃH DÃ|¸ì(üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|8h)üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ<¸ä)üÿÿA…A ‡A†AƒC@n AÃA ÆAÇAÅC hø¤,üÿ A…A ‡A†AƒCpv AÃA ÆAÇAÅC e AÃAÆ AÇAÅA n AÃAÆ AÇAÅA Xd<6üÿÔA‡A †Aƒ[  ÃAÆAÇD p à AÆAÇB y à AÆAÇA }à AÆAÇXÀ´6üÿåA‡A †Aƒ_  ÃAÆAÇD u à AÆAÇA ~ à AÆAÇD ~à AÆAÇd@7üÿóA‡A †AƒAm A ÃAÆAÇD w Aà AÆAÇB x Aà AÆAÇA Aà AÆAÇ€„Ì7üÿXA…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB O AÃAÆ AÇAÅA R AÃAÆ AÇAÅB € 8üÿ`A…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB S AÃAÆ AÇAÅA V AÃAÆ AÇAÅB hŒ|9üÿüA‡A †AƒAm A ÃAÆAÇD | Aà AÆAÇA y Aà AÆAÇD @Aà AÆAÇ|ø :üÿõA…A ‡A†AƒC@{ AÃA ÆAÇAÅB p AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|x„:üÿöA…A ‡A†AƒC@{ AÃA ÆAÇAÅB q AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅløü:üÿÊA…A ‡A†Aƒj ÃA ÆAÇAÅC j ÃAÆ AÇAÅC n ÃAÆ AÇAÅC nÃAÆ AÇAÅ|hX;üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅ|èl<üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅlh€=üÿËA…A ‡A†Aƒj ÃA ÆAÇAÅC k ÃAÆ AÇAÅB o ÃAÆ AÇAÅB oÃAÆ AÇAÅ<ØÜ=üÿcA…A ‡A†AƒCpC AÃA ÆAÇAÅA <?üÿšA…A ‡A†AƒCpY AÃA ÆAÇAÅA HX\@üÿ‰A…A ‡A†Aƒi ÃA ÆAÇAÅD C ÃAÆ AÇAÅB <¤œ@üÿkA‡A †Aƒ| à AÆAÇC [  ÃAÆAÇC 0äÈ@üÿTA†A ƒa ÃAÆD Q ÃAÆB <è@üÿsA‡A †AƒX  ÃAÆAÇC I à AÆAÇA 0XAüÿoA†A ƒU ÃAÆD I ÃAÆB 0ŒXAüÿoA†A ƒU ÃAÆD I ÃAÆB À”AüÿÔ˜Aüÿ1C U D Tô¬Aüÿ%<ÀAüÿôA…A ‡A†AƒC0V AÃA ÆAÇAÅC <HtBüÿºA…A ‡A†AƒCPZ AÃA ÆAÇAÅC ˆðFüÿFC R C a C (¨Güÿ/AƒC T AÃC QAÃTÔGüÿ!A…A ‡A†AƒC`Y AÃA ÆAÇAÅA o AÃAÆ AÇAÅA <, èHüÿ]A…A ‡A†AƒCPw AÃA ÆAÇAÅB €l Müÿ_A…A ‡A†AƒC€¥ AÃA ÆAÇAÅA K AÃAÆ AÇAÅA © AÃAÆ AÇAÅA «AÃAÆ AÇAÅTð äRüÿHA…A ‡A†AƒCp] AÃA ÆAÇAÅA w AÃAÆ AÇAÅA lH!ÔTüÿøA…A ‡A†AƒCp‰ AÃA ÆAÇAÅD W AÃAÆ AÇAÅA M AÃAÆ AÇAÅC <¸!\ZüÿiA…A ‡A†AƒC0b AÃA ÆAÇAÅC (ø!ˆ]üÿ"A†A ƒA\ AÃAÆ4$"€]üÿ¸A‡A †AƒC u A ÃAÆAÇB h\"^üÿÆA…A ‡A†AƒC`q AÃA ÆAÇAÅD M AÃAÆ AÇAÅA oAÃAÆ AÇAÅdÈ"\_üÿBA…A ‡A†AƒC`y AÃA ÆAÇAÅD Ò AÃAÆ AÇAÅA ^AÃAÆ AÇAÅd0#8`üÿfA…A ‡A†AƒC`y AÃA ÆAÇAÅD ã AÃAÆ AÇAÅA qAÃAÆ AÇAÅh˜#8aüÿžA…A ‡A†AƒC`q AÃA ÆAÇAÅD ' AÃAÆ AÇAÅA mAÃAÆ AÇAÅd$lbüÿVA…A ‡A†AƒC`s AÃA ÆAÇAÅB í AÃAÆ AÇAÅA _AÃAÆ AÇAÅTl$\cüÿ/A…A ‡A†AƒC0n AÃA ÆAÇAÅC E AÃAÆ AÇAÅC <Ä$4düÿËA…A ‡A†AƒC0¸ AÃA ÆAÇAÅA D%ÀdüÿÕA‡A †AƒC • A ÃAÆAÇB S Aà AÆAÇB L%Peüÿ `%Heüÿ Tt%@eüÿ¯A…A ‡A†AƒCPê AÃA ÆAÇAÅC © AÃAÆ AÇAÅC hÌ%˜jüÿßA…A ‡A†AƒCB AÃA ÆAÇAÅC u AÃAÆ AÇAÅC NAÃAÆ AÇAÅ 8& küÿrC | A ^ B Q\&\küÿVCv C Y|&”küÿVCu D YXœ&Ìküÿ¬A‡A †AƒC0l A ÃAÆAÇC N Aà AÆAÇC X Aà AÆAÇA „ø&lüÿ´A…A ‡A†AƒF E AÃA ÆAÇAÅA E AÃAÆ AÇAÅC - AÃAÆ AÇAÅC J AÃAÆ AÇAÅB T€'Hnüÿ˜A…A ‡A†AƒC` AÃAÆ AÇAÅA T AÃA ÆAÇAÅD (Ø'ˆoüÿ3AƒC X AÃC QAÃ<(oüÿÙA…A ‡A†AƒC@… AÃA ÆAÇAÅD DD(,püÿžA‡A †AƒC q A ÃAÆAÇB L Aà AÆAÇA DŒ(„püÿªA‡A †AƒC { A ÃAÆAÇD L Aà AÆAÇA TÔ(èpüÿA…A ‡A†AƒC@¡ AÃA ÆAÇAÅD p AÃAÆ AÇAÅD l,)˜qüÿ<A…A ‡A†AƒC0s AÃA ÆAÇAÅB P AÃAÆ AÇAÅD D AÃAÆ AÇAÅD <œ)drüÿdA…A ‡A†AƒC0S AÃA ÆAÇAÅB TÜ)ˆrüÿ†A…A ‡A†AƒC0j AÃAÆ AÇAÅC E AÃA ÆAÇAÅA T4*¸rüÿÔA…A ‡A†AƒC0N AÃA ÆAÇAÅC I AÃAÆ AÇAÅC TŒ*4süÿÀA…A ‡A†AƒC0A AÃA ÆAÇAÅD Y AÃAÆ AÇAÅC Tä*œsüÿ]A…A ‡A†AƒCPJ AÃAÆ AÇAÅC E AÃA ÆAÇAÅC <<+¤uüÿhA…A ‡A†AƒC0c AÃA ÆAÇAÅB <|+ÌuüÿtA…A ‡A†AƒC0d AÃA ÆAÇAÅA l¼+vüÿ3A…A ‡A†AƒCL AÃA ÆAÇAÅA u AÃAÆ AÇAÅC ‹ AÃAÆ AÇAÅA p,,ćüÿìA…A ‡A†AƒFÐ4 AÃA ÆAÇAÅB  AÃAÆ AÇAÅB § AÃAÆ AÇAÅA @ ,<üÿ[A‡A †AƒC j A ÃAÆAÇA _A ÃAÆAÇPä,TüÿŠA…A ‡A†AƒC@l AÃA ÆAÇAÅA MAÃAÆ AÇAÅD8-ŒüÿqA‡A †AƒC H Aà AÆAÇC YA ÃAÆAÇ8€-¸üÿ¬A…A ‡A†AƒC0 AÃA ÆAÇAÅT¼-(üÿºA…A ‡A†AƒC0­ AÃAÆ AÇAÅD N AÃA ÆAÇAÅB |.Œ‘üÿùA…A ‡A†AƒC0u AÃA ÆAÇAÅD p AÃAÆ AÇAÅD x AÃAÆ AÇAÅD xAÃAÆ AÇAÅ|”.’üÿúA…A ‡A†AƒC0u AÃA ÆAÇAÅD q AÃAÆ AÇAÅC y AÃAÆ AÇAÅC yAÃAÆ AÇAÅ</„’üÿîA…A ‡A†AƒC@X AÃA ÆAÇAÅA TT/4—üÿA…A ‡A†AƒCp{ AÃA ÆAÇAÅB W AÃAÆ AÇAÅA D¬/ð˜üÿ A‡A †AƒC Ÿ A ÃAÆAÇD [ Aà AÆAÇB 4ô/´™üÿjA†A ƒC0~  AÃAÆC _ AÃAÆ<,0è™üÿAƒC F AÃA E AÃB d AÃC QAÃDl08šüÿ¨A‡A †AƒC@‰ A ÃAÆAÇB PAà AÆAÇ(´0˜šüÿ6AƒC a AÃB LAÃ,à0¤šüÿwA†A ƒC0Y  AÃAÆD 1ìšüÿ4AƒC U AÃB P41üšüÿÏA…A ‡A†AƒC@k AÃA ÆAÇAÅB ^ AÃAÆ AÇAÅB @ˆ1x›üÿOA‡A †AƒC r A ÃAÆAÇA OAà AÆAÇhÌ1„›üÿ­A…A ‡A†AƒC@k AÃA ÆAÇAÅB J AÃAÆ AÇAÅB N AÃA ÆAÇAÅF 82È›üÿL2È›üÿ`2È›üÿt2È›üÿˆ2È›üÿœ2È›üÿ°2È›üÿ@Ä2È›üÿSA‡A †AƒC r A ÃAÆAÇE OA ÃAÆAÇh3Ø›üÿ½A…A ‡A†AƒC@b AÃA ÆAÇAÅG S AÃA ÆAÇAÅA X AÃA ÆAÇAÅH Tt3,œüÿ@A…A ‡A†AƒC@Ü AÃA ÆAÇAÅA P AÃAÆ AÇAÅD |Ì3üÿKA…A ‡A†AƒC@© AÃA ÆAÇAÅD b AÃAÆ AÇAÅB T AÃAÆ AÇAÅD JAÃAÆ AÇAÅTL4àüÿ|A…A ‡A†AƒC` AÃA ÆAÇAÅA P AÃAÆ AÇAÅD <¤4ŸüÿãA…A ‡A†AƒCPm AÃA ÆAÇAÅD Tä4¨ŸüÿhA…A ‡A†AƒC@ AÃA ÆAÇAÅA d AÃAÆ AÇAÅD <5¸ üÿKC ] D ] C ,\5ä üÿQAƒC b AÃA H AÃC TŒ5¡üÿA…A ‡A†AƒC€B AÃA ÆAÇAÅC U AÃAÆ AÇAÅC ä5@¢üÿHø54¢üÿeA‡A †AƒC@* A ÃAÆAÇA _ Aà AÆAÇB œD6P£üÿ„A…A ‡A†AƒFÀÄ AÃA ÆAÇAÅB J AÃAÆ AÇAÅB È AÃAÆ AÇAÅD Ð AÃAÆ AÇAÅD  AÃAÆ AÇAÅA Tä6Ì&ýÿAA…A ‡A†AƒCpÕ AÃA ÆAÇAÅD o AÃAÆ AÇAÅA H<7¸-ýÿYA‡A †AƒC0¯ A ÃAÆAÇD ¸ Aà AÆAÇA ˆ7È/ýÿ7C T A S A ¨7à/ýÿ5C T A N B HÈ7ø/ýÿ÷A‡A †AƒC | A ÃAÆAÇC @ Aà AÆAÇA 8¤0ýÿ(8 0ýÿ=C Y D N B H8À0ýÿ l\8¸0ýÿÒA…A ‡A†AƒF°_ AÃAÆ AÇAÅC Z AÃA ÆAÇAÅB  AÃAÆ AÇAÅC TÌ84ýÿA…A ‡A†AƒF v AÃA ÆAÇAÅD j AÃAÆ AÇAÅB T$9ä7ýÿ0A…A ‡A†AƒF k AÃA ÆAÇAÅC X AÃAÆ AÇAÅD |9¼9ýÿ)9Ô9ýÿ)¤9ì9ýÿ),¸9:ýÿpA†A ƒC0N  AÃAÆC „è9D:ýÿì A…A ‡A†AƒFð  AÃA ÆAÇAÅB d AÃAÆ AÇAÅD l AÃAÆ AÇAÅD 7 AÃAÆ AÇAÅA p:¨DýÿÂC`¶ C E:LEýÿÂC`¶ C E°:ðEýÿÂC`¶ C EÐ:”FýÿÂC`¶ C E<ð:8Gýÿ9A…A ‡A†AƒCP_ AÃA ÆAÇAÅB T0;4Iýÿ©A…A ‡A†AƒC@… AÃA ÆAÇAÅA O AÃAÆ AÇAÅA zR| ˆpMýÿU0´MýÿTDôMýÿUX8NýÿWl|NýÿW€ÀNýÿW”Oýÿh¨XOýÿe¼¬OýÿmAƒkÃØPýÿmAƒkÃôTPýÿmAƒkèPýÿh$üPýÿh8PQýÿhL¤Qýÿh`øQýÿhtLRýÿhˆ RýÿeœôRýÿh°HSýÿeÄœSýÿhØðSýÿeìDTýÿh˜TýÿeìTýÿh(@Uýÿh<”UýÿhPèUýÿhd†T†b†r†„†–†¨†À†Ô†è†þ†‡$‡<‡L‡Z‡l‡~‡އ¦‡¸‡ʇ؇è‡ø‡ ˆ ˆ0ˆFˆ`ˆpˆŠˆžˆ®ˆÀˆЈàˆöˆ‰ ‰0‰H‰b‰x‰‰ž‰®‰À‰Љà‰ü‰Š,ŠDŠVŠhŠxŠˆŠœŠ¶ŠÈŠ´ƒ̃äƒôƒ„„6„N„\„n„~„Œ„œ„¦„°„¼„Æ„ЄØ„â„ì„ö„…………$…0…D…b…v…Œ…¢…²…Æ…Ø…æ…ø…††&†>†T†b†r†„†–†¨†À†Ô†è†þ†‡$‡<‡L‡Z‡l‡~‡އ¦‡¸‡ʇ؇è‡ø‡ ˆ ˆ0ˆFˆ`ˆpˆŠˆžˆ®ˆÀˆЈàˆöˆ‰ ‰0‰H‰b‰x‰‰ž‰®‰À‰Љà‰ü‰Š,ŠDŠVŠhŠxŠˆŠœŠ¶ŠÈŠÏDeleteCriticalSectionìEnterCriticalSectionþGetLastErrorGetModuleHandleAAGetProcAddressÞInitializeCriticalSection.LeaveCriticalSection•TlsGetValue½VirtualProtect¿VirtualQuery8__dllonexitF__mb_cur_max_assert¿_errno!_isctype¡_pctype„fflush“freeÄmallocËmemmovetolowertoupper _iobGabortScallocyfwriteìvfprintf PyArg_ParseTuple PyArg_ParseTupleAndKeywordsPyBuffer_Release,PyBytes_FromObject-PyBytes_FromString1PyBytes_Type=PyCallable_Check|PyDict_Contains}PyDict_CopyPyDict_GetItemˆPyDict_New‰PyDict_NextŠPyDict_SetItem‹PyDict_SetItemString”PyErr_CheckSignals•PyErr_Clear™PyErr_FormatžPyErr_NoMemory PyErr_OccurredµPyErr_SetStringÒPyEval_RestoreThreadÓPyEval_SaveThreadñPyExc_IndexErrorPyExc_RuntimeError PyExc_TypeErrorPyExc_ValueError`PyImport_ImportModulerPyList_AppendyPyList_NewzPyList_Reverse{PyList_SetItem‚PyLong_AsLongˆPyLong_AsUnsignedLongŽPyLong_FromLong PyMapping_Keys­PyMem_Free®PyMem_Malloc¯PyMem_ReallocÂPyModule_Create2ÄPyModule_GetDict PyObject_CallPyObject_CallObjectPyObject_ClearWeakRefsPyObject_Free#PyObject_GetAttrString%PyObject_GetItem+PyObject_Init1PyObject_Malloc5PyObject_Repr<PyObject_SizerPySequence_GetSlice‚PySet_Contains‹PySlice_GetIndicesExPySlice_Type·PyThread_acquire_lock¹PyThread_allocate_lock¾PyThread_free_lockÃPyThread_release_lockÒPyTuple_NewÓPyTuple_PackÔPyTuple_SetItemÖPyTuple_TypeßPyType_ReadyJPyUnicode_FromKindAndDataKPyUnicode_FromObjectMPyUnicode_FromStringOPyUnicode_FromUnicodeYPyUnicode_JoiniPyUnicode_TypesPy_BuildValueÀ_PyBytes_Joins_PyUnicode_Readyx_PyUnicode_ToLowercase_Py_FalseStruct˜_Py_NoneStruct€€€€€€€€€€KERNEL32.dll€€€€€€€€€€€€msvcr100.dll(€(€(€(€(€msvcrt.dll<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€python33.dll\¸Áf(¸Áf Äf Äf(`ÄfÄfP 00(0=0ˆ0¹0È0Í0B1J1j1r11Ÿ1¶1½1Å1Ð1â1ø12+2A2Ì3ã3²8ó8¿>3>Š>.?L?T?Y?d?µ?ô?0 00-050:0E0\0c0x00”0›0°0·0ý0=1E1`1s1¦1¾1Ã1Î1ß1è1í1ø12222272B2V2[2f2t2y2‚22•2 2°2µ2À2â2ç2ò23333!3*353D3I3T3a3f3p3€3…33Ö3ó3"4M4h4n4æ4ÿ4"5M5a5g5Þ5ó56=6Q6W6°6Ú6ÿ6-7G7j7‡7ž7©7½7!8=8K99ö9J:u:œ: ;?;t;<„<Š<£<Õ<ê\>l>š>Ò>1?q?§?Ð?@d0]0Ž0Â0Û0á0ð0 1g1r1·1Õ12282T2k2r2x2233L3`333·3Ü3ê3*474u4×4î4õ4û45r5ô5N66þ8j:×;Ò>P !1K4p É0ß0ó0ù0ü67 77-7@8ñ8_9€*5á5j6(<:E:M:V:Å<'=1=;=~=ˆ=’=?2?y>>¡>µ>É>Ý>`?‚?ª?Ý?à|060}0¥0S1`1w1’1¬1Ð1˜2¬2´2É2×2ü2k34.4u4Š4¦4À4Ý4ù45·5]6h6~6ª6µ6Ú67K7S7n7½7Ê7Ò7Û7J8f8}8£8Ç8Ï8ä89 999í9ï<#>3>š?ð > Ï7 Ø2à2K4Â57ó80 Ó7@Ž0À7ø>Pg0o0ž0`E0¤1'3/3À3 :à;P=pL{2Ì2’3Û45=5H5Ð5Á6ã6(7Â7Ö7ú7á8?9Š9é9ñ9 :Ï:k;‚;ê;<*=i=™=¡=¼=W>> ?€h)0ì01>1‰1Þ1ö1ê2 33¼3è34,414I4o5ª6E7T7œ7¨7ü7™8 99‚9Z:¡:Ñ:Þ:¦;¿;e<‚<¨<Ö<>>G>¿>/?8?ˆ?Ì?Ô?é?L00˜0­01T1\1q1Ô12 252Ì2#3¬3ý34Ñ4Õ4Û4ß4å4ï4ó4ù455 5555!5%5+5/55595?5I5M5S5W5]5a5g5k5q5u5{5…5‰55“5™55£5§5­5±5·5»5Á5Ë5Ï5Õ5Ù5ß5ã5é5í5ó5÷5þ566&676G6Z6`6u6„6˜6¡6É6Ò6æ6ì6þ677,7w7}7Œ7“7¨7Æ7Þ7ý7A8¾8Ã8ã8ê8ó8 99'9-9h9Ž9™9¬9¸9Ä9æ9ñ9:::::E:X:d:p:’::°:½:Ê:ê:õ:;;";B;M;`;m;z;;¨;¸;Å;Û;< <<*<@0>@>M>c>>˜>¨>µ>Ë>õ>???3?]?h?x?…?›?Å?Ð?à?í? 0*050E0R0h0•0 0°0½0Ó0ú011"181e1p1€11£1Í1Õ1å1ò1252@2P2]2s2š2¥2µ2Â2Ø233 3-3C3j3r3ˆ3•3«3Ò3Ý3ð3ý34:4E4X4e4{4¢4­4À4Í4ã4 55(555K5r5}555³5Ý5è5ø566E6P6`6m6ƒ6ª6²6Å6Ò6è677-7:7P7}7ˆ7˜7¥7»7â7í78 8#8J8U8e8r8ˆ8²8½8Í8Ú8ð89%989E9[9‚99 9­9Ã9ê9õ9::+:R:]:p:}:“:º:Å:Ø:å:û:";-;@;M;c;‹;–;©;¹;Ï;ú;<<%<; > >->C>j>r>ˆ>•>«>Õ>à>ð>ý>?:?E?X?e?{?¢?­?À?Í?ã?°d 00%020H0r0}00 0­0Î0Ù0é0ö01"1-1=1J1W1v11”1¡1®1Î1Ù1ì1ù12&212D2T2a2‚22 2­2º2Ú2å2ø23323=3M3Z3g3†3‘3¡3®3»3Ú3å3ø344B4M4`4l4x4š4¥4¸4Å4Ò4i6t6„6‘66¥6 77$71787e7p7€77–7ž7°7Ú7â7ê7ò7ú78 888"8h8q8‘8—8­8ý89:*:>:G:L:V:a:k:v:}:¡:²:»:Þ:é:ô:;=;];Š;¤;Â;â;ó;< <%<7+>6>E>O>c>r>z>‚>Š>’>š>¢>ª>²>º>Â>Ê>Ò>Ú>î>?À¤000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1Œ1`2d2l2p2t2|2€2„2Œ22”2œ2 2¤2¬2°2´2¼2À2Ä2Ì2Ð2Ô2Ü2à2ä2ì2ð2ô2ü233 3333 3$30343`3p3t3„3ˆ3˜3œ3¬3à3ä3ì3,4ä4è455 5555 5$5,50545<5@5D5L5P5T5\5`5d5l5p5t5|5€5„5Œ55”5œ5 5¤5¬5°5´5¼5À5Ä5Ì5Ð5Ô5Ü5à5ä5ð5ô566 60646D6H6X6€6„6Œ6”6˜6 6¨6¬6´6¼6À6È6 7à7ä7ì7ð7ô7ü78888@8P8Œ8`9d9l9p9t9€9„9 9°9ô9:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;8;<;@;D;H;P;T;X;`;d;h;p;t;x;|;€;„;Œ;;”;˜;œ; ;¨;¬;°;´;¸;¼;Ä;È;Ì;Ð;Ô;Ø;à;ä;è;ì;ô;ü;àÄ€:„::”: :¤:°:´:À:Ä:Ð:Ô:à:ä:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<ˆ333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|3€3„3ˆ3Œ33”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü3444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4€4„4ˆ4Œ44”4˜4œ4 4¤4¨4¬4°4´4¸4¼4À4Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4è4ì4ð4ô4ø4ü4555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ5Œ55”5˜5œ5 5¤5¨5¬5°5´5¸5¼5À5Ä5È5Ì5Ð5Ô5Ø5Ü5à5ä5è5ì5ð5ô5ø5ü5666 66666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|6€6„6ˆ6Œ66”6˜6œ6 6¤6¨6¬6°6´6¸6¼6À6Ä6È6Ì6Ð6Ô6Ø6Ü6à6ä6è6ì6ð6ô6ø6ü6777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|7€7„7ˆ7Œ77”7˜7œ7 7¤7¨7¬7°7´7¸7¼7À7Ä7È7Ì7Ð7Ô7Ø7Ü7à7ä7è7ì7ð7ô7ø7ü7888 88888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8€8„8ˆ8Œ88”8˜8œ8 8¤8¨8¬8°8´8¸8¼8À8Ä8È8Ì8Ð8Ô8Ø8Ü8à8ä8è8ì8ð8ô8ø8ü8999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|9€9„9ˆ9Œ99”9˜9œ9 9¤9¨9¬9°9´9¸9¼9À9Ä9È9Ì9Ð9Ô9Ø9Ü9à9ä9è9ì9ð9ô9ø9ü9::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?ˆÁÓúˆÐƒàévÿÿÿº€ˆÁÓúˆÐƒàébÿÿÿºpˆÁÓúˆÐƒàéNÿÿÿ‹T$‹D$ƒøvf…Ò”ÀÉD$‰T$éÿÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè¨ÿÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè]ÿÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mèÿÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$MèÙþÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè—þÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$MèYþÿÿ„À•À1øƒÄ[^_ÃvWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèKýÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$Mè ýÿÿ„À•À1øƒÄ[^_ÃvVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèÈüÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè…üÿÿ„À•ÀŠT$ë¾fVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$MèDüÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mèùûÿÿ„À•ÀŠT$ë¶f‹D$Pöƒúv=…t=( t=) ”ÀððËD$ƒøItƒøit=0t=1”ÀÃf°ðËD$‹T$‰ƒøItIÇBIƒøit!ÇBi=0uS¸¹ Ç 1ÃÇB0¸¹ Ç 1ÃvÇBiÇB0¸ …@Ç 1ÃÇB 0=1¸uÜÊH.Q÷€úTv ‹P …Òt>öÒÿ$•œ0ödf‹P(‹R…Òtè‹ëÒf‹ŠJ.ƒéF€ùwÕ‰ÐËP(‹J…ÉtÈ‹@Ãf€ùAw½¶Éÿ$ð1öd‹ŠQ.€út€úDu£‰ÈÃfUWVSƒì,Š\$@ˆ\$‹˜œ ‹s ‹x8‹@4ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ërëC9ët¶‰$ÿÖ:D$uí‰Ú)ú‰ÐƒÄ,[^_]Ãv—,9ër ëƒÃ9Ýv ‹‰$ÿÖ:D$uì‰Ú)úÁú‰ÐƒÄ,[^_]ÃvW,O9ër ëƒÃ9Ýv·‰$ÿÖ:D$uë‰Ú)úÑú‰ÐƒÄ,[^_]ÃvUWVSƒì,Š\$@ˆ\$‹˜œ ‹s ‹x8‹@4ƒøtyƒøt@Ht ‰ÐƒÄ,[^_]Ãv,9ëwëK9ët¶Cÿ‰$ÿÖ:D$uì‰Ú)ú‰ÐƒÄ,[^_]Ãf—,9ëw ëƒë9Ýs‹Cü‰$ÿÖ:D$uë‰Ú)úÁú‰ÐƒÄ,[^_]ÃfW,O9ëw ëƒë9Ýs·Cþ‰$ÿÖ:D$uê‰Ú)úÑú‰ÐƒÄ,[^_]Ãf‹D$ 9D$”ÀÃUWVSƒì‹‹R‰$ƒút?‹Œ ‰T$~'‹r‹Z ‹HH1Ò‹<Ö‹lÖ‰9‰i‹<“‰yBƒÁ;$uå‹L$‹‰Œ ƒÄ[^_]ÃWVS‹‹s$…Òtx‹ …Étm¹ë0v<[»‹xTŸÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 r6‹Š9ÞÌ)ó›‹¸È ßÇCÇC ÿÿÿÿÇCÇC ÿÿÿÿA9 sÊ[^_Ã…ö~+‹PTƒÂ1ÉÇÇBÿÿÿÿÇBÇBÿÿÿÿAƒÂ49ñuÝ‹Kx…É~Å‹€È ƒÀ1ÒvÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿBƒÀ(9ÊuÝ[^_ÃVS‹ˆ° ‹I(‹\‘‹°Ä Þ;q w ‹t‘9´´ r1À[^Ãf˜Ð ;˜Ô –À[^Ãf‹D$‹@0@Ãv‹D$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿËD$ÿÃUWVSƒì‰Æ‰Ó1ÿ‹C,¨ …4€{.Zv‹ëëf¶S.ÿ$•ø2öd‹‰ðèÇÿÿÿ‰Å‹S‰ðè»ÿÿÿf9ïs‰ïf9øv‰Ç‰øƒÈ f‰C,‰øƒÄ[^_]Ãf‹C(ƒxÿ•D$„Ž‹S‰ðè|ÿÿÿ‹S(‹‹ndTU½fƒ fƒøtfƒ €|$„fƒÿ‚Df9ïs‰ïf9øv‰Ç‹C, øƒÈ f‰C,‰øƒÄ[^_]Ë¿é%ÿÿÿ‹‰ðèÿÿÿ‰Å‹S‰ðèÿÿÿf9ïs‰ï·×·È‰Ö9Ê}‰Îƒþ޽9ʌ͉úƒÊ éµv‹C(‹h‹‰ðèÁþÿÿ‹S(‹‹NdQf‹ ‰ÎƒÎf‰2fƒøtƒÉf‰ E„Ðfƒÿs¿f9øw8‰øfƒÿs0¸ë)‹S‰ðènþÿÿ‰Å‹‰ðècþÿÿ‰Â‰øf9ïs‰èf9Âv‰Ð‰ÂƒÊ f‰S,ƒÄ[^_]Ãvfƒÿƒêþÿÿ¿éàþÿÿº0¿f‰S,‰øƒÄ[^_]Ã‰ÂƒÊ ‰Çëév¿é²þÿÿf‹‰ðèïýÿÿ‰Å‹S‰ðèãýÿÿ‹S(‹‹NdQfƒý„gþÿÿé^þÿÿfƒÿƒ1ÿÿÿ¿é'ÿÿÿƒàé þÿÿSƒì‰Ã…Àu ë&€Ìf‰C,öÄu ‹C…ÀtèÜÿÿÿ‹…Ût‹C,öÄtÚƒÄ[ÃS‹‰X‰XÇ@ …Ût‰ÚfŠJ.€ùVt€ù]u‹ëïv‰P9Ót[Ãv€{.Kwõ¶S.ÿ$•d4öd‹‰P‹S ‰P [Ãf¡$`ødÿÃì,D$‰D$ D$‰D$ÇD$”5öd‹D$4‰$ÿ„‚ød…Àt4‹D$‰D$‹D$‰$èàóÿÿ„À•À¶À‰D$Ç$ª5ödÿ˜ƒødƒÄ,Ãv1ÀƒÄ,ÃfÇD$ÇD$ª5öd¡˜ƒødÿàUWVSƒì\D$L‰D$ D$H‰D$ÇD$¬5öd‹D$t‰$ÿ„‚ød…Àtx‹D$H¨ t|ÇD$€Êõdl$,‰l$‹D$L‰$‹T$ÿR0‰Ç‰$ÿô‚ød‰Æ…ÀtC…ÿ~e1Ûë‰D$‰\$‰4$ÿü‚ødC9ûtJ‹D‰D$Ç$ª5ödÿ˜ƒød…ÀuÑ‹H‰…Àtx1ö‰ðƒÄ\[^_]èuX¨€„xÿÿÿÇD$Ëõdésÿÿÿv‹D$H%"@="@uÊD$<‰D$‹D$L‰$‹T$ÿR8H~±¡¬ƒød‰D$‰4$ÿð‚ødëvÇD$ÀÊõdé#ÿÿÿv‹F‰4$ÿP1ö‰ðƒÄ\[^_]ÃvVSƒì$‰Ã‰T$Ç$½5ödÿ˜ƒød‰Æ…Àt6‰D$‰$ÿð‚ød‹J‰…Òt ÷ÐÁèƒÄ$[^ËV‰4$‰D$ÿR‹D$ëá1ÀƒÄ$[^ÃWVSƒì‹\$ ‹|$$‰ƒûItcÇGIƒûitO¾¸ÇiÇ$i膕9Øt ƒøIt‰·FÇ$Ièu•9Øt ƒøit‰·F‰ðƒÄ[^_Ãv¾뻾¸ë§Sƒì‹D$ ‹\$$=ÿv ‰¸ƒÄ[É$è •‰¸ƒÄ[ËD$=ÿwé•ÃvWVSƒì‹\$ ‹|$$‰‰$èà”9Øt$¾‰G‰$èÔ”9Øt‰·F‰ðƒÄ[^_Ãv‹G¾ë×fSƒì‹\$ ‰$蜔ƒøIt‰$è—”ƒøi”ÀƒÄ[ðƒÄ[ÃSƒì‹D$ ‹T$$·Øúÿw ‰ÁÁéƒùNv …Û”ÀƒÄ[Ãÿ$À5ödK”Àëìf¡<‚ødƒ8t"ÇD$‰$è6”…À•À¶À9ÔÀƒÄ[áL‚ød‹·P%ëÜf1Àƒú–À9ÔÀ뛉$èx‚ëÀfƒú th1Àƒú ”Àë·¡<‚ødƒ8…¢¡L‚ød‹·P%f…À•À¶À9ÔÀƒÄ[Ãf¡<‚ødƒ8…ž¡L‚ød‹·P%ë̃ú_…7ÿÿÿ¸éOÿÿÿ¡<‚ødƒ8…"¡L‚ød‹·Pƒàëšf¡<‚ødƒ8…z¡L‚ød‹·Pƒàéwÿÿÿv¡<‚ødƒ8…¡L‚ød‹·P%WéQÿÿÿ¡<‚ødƒ8…¡L‚ød‹·Pƒàé/ÿÿÿvƒø"w'ÿ$…ü6öd¡<‚ødƒ8…A¡L‚ød‹·Pƒà…Àuûÿÿ”ÀéPþÿÿƒê0ƒú wê°éAþÿÿ¡<‚ødƒ8…¡L‚ød‹·Pƒà ëÁ¡<‚ødƒ8…¼¡L‚ød‹·Pƒà룡<‚ødƒ8…³¡L‚ød‹·Pƒàë…ÇD$‰$è<’ésþÿÿvÇD$‰$è$’é[þÿÿvÇD$W‰$è ’éCþÿÿvÇD$‰$èô‘é+þÿÿvÇD$‰$èÜ‘éþÿÿvÇD$‰$èÄ‘éûýÿÿÇD$‰$译éâþÿÿÇD$‰$èš‘éÍþÿÿÇD$‰$è…‘é¸þÿÿÇD$ ‰$èp‘é£þÿÿvVSƒì$‹t$0‹\$4…Û~CCÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè¨üÿÿ„À•Â;^<|1À„ÒtˆÂƒòˆÐƒÄ$[^Ãv1Ò;^<}ã‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$Mè]üÿÿ„À•ÀŠT$ë¶fVSƒì$‹t$0‹\$4…Û~;Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mèüÿÿ„À•Â;^<|1À„Òt1ÀƒÄ$[^Ã1Ò;^<}ë‰\$‹F8‰$ˆT$ÿ–  ‰D$Ç$MèÙûÿÿ„À•ÀŠT$ë¾fWVSƒì‹t$ ‹\$$…Û~:Cÿ‰D$‹F8‰$ÿ–  ‰D$Ç$Mè—ûÿÿ„À•À‰Ç;^<|1À1øƒÄ[^_Ã1ÿ;^<}î‰\$‹F8‰$ÿ–  ‰D$Ç$MèYûÿÿ„À•À1øƒÄ[^_Ãv‹D$‹T$ƒøIt#ƒøit=0t=1t‰T$‰D$é׎v‰¸ÃéËvƒì‰$ÿ¤ƒød=êw =èr6°ƒÄÃ=ôv-ùƒøvé1ÀƒÄÃ=òsÛ-ìƒøvÑ1ÀëævƒøotÅwƒøet¾ƒøit¹ƒøat´1ÀëÉfƒøut©r¾-àƒøv1Àë²vUWVSƒìL‰Ã‰Ö‰Í‹¸  ‹P8…ö~n;p<Œ™Fÿ‰D$‰$ÿ׉D$Ç$Mè ëÿÿ„À•Â;s<|F1À‰é8Ñt+8Á”ÀƒÄL[^_]Ã|$( t ƒ|$(…¯ƒ|$8 …¤1ÀƒÄL[^_]Ãf1Ò;s<}º‰t$‹C8‰$ˆT$ÿ׉D$Ç$Mè™êÿÿ„À•ÀŠT$ë‘f‰t$‰$‰T$ÿ׉D$$Nÿ‰L$,‰L$‹C8‰$ÿ׉D$ ‹D$$‰$èˆp‰D$(‹D$ ‰$èxpƒø‹T$„ ƒø„ ƒø„ƒ|$(„ùƒ|$(„îƒ|$(„ãƒ|$(„1ÿÿÿƒ|$( „&ÿÿÿ‹D$,…Àˆ‰\$4‹\$,‰t$8‰éˆL$?‰Õf‰\$‰,$ÿ׉Ɖ$èíoƒøtƒø uKƒûÿu݉t$ ‰D$0‰ê‰\$,‹\$4‹t$8¶l$?ƒø „Í‹D$,…Àx ƒ|$ '„rF;s<œ‰éˆL$4‰Ý‰Óf‰t$‰$ÿ׉$èoƒøtƒø uN9u<߉D$8‰Ú¶l$4ƒ|$0 „?þÿÿ‹\$,KˆG‰Ö‰êˆT$,‹l$0f‰\$‰4$ÿ׉$è/oƒøtƒý uKƒûÿuß¶l$,ƒø „7ƒ|$0„òƒ|$0 „çƒø„?ƒ|$0„Wƒ|$0 „pƒ|$0 …wƒ|$(„Êýÿÿƒ|$0u!ƒ|$( „¸ýÿÿƒ|$(„­ýÿÿƒ|$( „¢ýÿÿ‹D$ ‰D$Ç$MèZèÿÿˆÃ‹D$$‰D$Ç$MèDèÿÿ‰ê8Ó„nýÿÿ8ДÀé>ýÿÿƒ|$(„Yýÿÿ‹D$ ‰D$Ç$MèèÿÿˆÃ‹D$$‰D$Ç$Mèûçÿÿ‰ê8Ó„%ýÿÿ8”ÀƒÄL[^_]Ã|$(„ ýÿÿƒ|$0…ÿÿÿƒ|$( …øþÿÿ1Àéòüÿÿƒ|$( …(þÿÿ1Àéàüÿÿƒ|$0 t ƒ|$0…·þÿÿƒ|$( „Áüÿÿ¸ é¢þÿÿ‹D$0ƒè ƒø‡±þÿÿƒ|$(…¼þÿÿ1Àé—üÿÿ‹D$(ƒè ƒø‡¯þÿÿƒ|$8…¤þÿÿ1Àétüÿÿfƒ|$( …þÿÿ1Àé`üÿÿƒ|$0„~þÿÿƒ|$0 „sþÿÿƒ|$0…›þÿÿécþÿÿ‹D$$‰T$è+ûÿÿ„À‹T$„uýÿÿ°éòûÿÿÇD$0éaýÿÿ1ÀéïýÿÿÇD$8éýÿÿv1É‹T$‹D$éiûÿÿ¹‹T$‹D$éVûÿÿfUWVSƒì,‹|$@‹G0@‰$ÿlƒød‰Å…Àtq‹G$‰D$‹G ‰D$Ç$ˆ7öd¡˜ƒød‰D$ÿÐ…Àt@‰E ‹G0…À~P1ö1ÛëfC‰D ƒÆ9_0~;‹G4ð‹P‰T$‹‰D$Ç$ˆ7ödÿT$…ÀuÒ‹EH‰E…Àt1í‰èƒÄ,[^_]ÃvÿE‰o8‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãvƒìƒéƒùw‹ øWöd‰T$‰D$‰ $ÿ€ƒødƒÄùëãWVSƒì Ç$hÿlƒød‰Æ…ÀtL1Û‹=tƒødë‰D$‰\$‰4$ÿ×Cƒûht.·„`ìõd‰D$¹ºD$èzÿÿÿ…ÀuÊ‹H‰…Àt 1ö‰ðƒÄ [^_Ãf‹F‰4$ÿP1ö‰ðƒÄ [^_Ãì€x9t ‰$ÿŒ‚ødƒÄÃfWVSƒì‰Ã‰Ö‹@ö@Wt1ŠC„À‰þ¨ „º„À‰Ž¨@„6C‰F,éµv‹@PÇBÿÿÿÿ…À„‹…À„üÇD$‰T$‰$ÿÐ…ÀˆãÆF9‹~‹‰F,…À„…ÿˆß‰$ÿHƒød‹SöBW…™9Ç„‘‰4$ÿŒ‚ødÇD$Q8öd¡ä‚ød‹‰$ÿЂød1ÀƒÄ[^_Ãv‹S$…Ò„%‰V,„À‰þ‹C‰F0ŠCÀèƒà‰F4ÆF8ÆF9°ƒÄ[^_Ãv‰$ÿ ƒød@td‹Cö@W„£ŠC¨ t¤éåþÿÿvÇF4‰F0ÆF8°ƒÄ[^_ÃÇD$8ödé[ÿÿÿvC$éÅþÿÿ‰4$ÿŒ‚ødÇD$88ödé:ÿÿÿf1ÀéCÿÿÿ‰4$ÿŒ‚ødÇD$)8öd¡è‚ød‹‰$ÿЂød1ÀéÿÿÿÇD$*3ÇD$Œ7ödÇ$Í7ödè‡ÇD$*3ÇD$Œ7ödÇ$µ7ödèè†ÇD$+3ÇD$Œ7ödÇ$Í7ödè̆ÇD$*3ÇD$Œ7ödÇ$è7ödè°†WVSƒìPˆÓT$èÃýÿÿ„Àtv‹D$HƒøtfƒøtHtVD$èýÿÿ¸ÿÿÿÿƒÄP[^_ÿ°ôd‹D$D…À~¶Û1öf‰t$‹D$@‰$ÿ×9ØtÅF9t$DèD$èKýÿÿ‹D$DƒÄP[^_ÿTôd뾿€ôd붸ÿÿÿÿë¢fVSƒì$‰Ö‰$ÿì‚ød‰Ã…Àt.‰t$‰$ÿ4ƒød‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ã1ÀëõVSƒì‰Ã‰Ö¡ `ød…À„®ƒÃƒûv"ÇD$ð9öd¡à‚ød‹‰$ÿЂødfƒÄ[^Ãfÿ$:ödÇD$9öd¡à‚ød‹‰$ÿЂødëÖf‹F‹@ ‰D$ÇD$X9öd¡ä‚ød‹‰$ÿÄ‚ødë°‹F‹@ ‰D$ÇD$¨9öd¡ä‚ød‹‰$ÿÄ‚ød댋F‹@ ‰D$ÇD$€9öd¡ä‚ød‹‰$ÿÄ‚ødéeÿÿÿÇD$x8öd¡ `ød‰$ÿЂødéIÿÿÿÇD$ 9öd¡ä‚ød‹‰$ÿЂødé+ÿÿÿvÇD$Ì9öd¡Ü‚ød‹‰$ÿЂødé ÿÿÿv…ö„¨‹F‹@ ‰D$ÇD$¬8öd¡ä‚ød‹‰$ÿÄ‚ødéÙþÿÿÇD$@9öd¡ `ød‰$ÿЂødé½þÿÿÇD$Ú9öd¡ `ød‰$ÿЂødé¡þÿÿ¡È‚ødƒÄ[^ÿàÇD$Ž8öd¡è‚ød‹‰$ÿЂødéwþÿÿvºf8öd¸l8ödèåýÿÿ£ `ødé9þÿÿvÇD$ä8öd¡ä‚ød‹‰$ÿÄ‚ødé;þÿÿvUWVSƒì‹\$0‹D$4…ÀˆÕ;C0Ì…À„€t@ý‹S44ò‹F‰$ÿô‚ød‰Ç…À„—‹F…À„Œ1Û‹-˜ƒødëv‹W ‰šC9^vsÝF‹P‰T$‹‰D$Ç$ˆ7ödÿÕ…ÀuЋH‰…Àtk1ÿ‰øƒÄ[^_]ÃvÇ$ÿô‚ød‰Ç…Àt$‹C$‰D$‹C ‰D$Ç$ˆ7ödÿ˜ƒød…Àt¶‹W ‰‰øƒÄ[^_]Ãv1Ò¸òÿÿÿèýÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÎvUWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpt@ý‹{44÷‹F‰$ÿô‚ød‰Ç…À„€‹N…Éty1Û‹-˜ƒødëv‹W ‰šC9^v`‹F‹D؉D$Ç$ª5ödÿÕ…ÀuÜ‹H‰…Àtc1ÿ‰øƒÄ[^_]ÃvÇ$ÿô‚ød‰Ç…Àt‹C$‰D$Ç$ª5ödÿ˜ƒød…Àt½‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿèüÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì‹\$0‹D$4…Àˆ±;C0¨…Àtht@ý‹C44ð‹F‰$ÿô‚ød‰Ç…Àt|‹n…ítu1Û‹-˜ƒødëv‹W ‰šC9^v\‹F‹؉D$Ç$ª5ödÿÕ…ÀuÝ‹H‰…Àt`1ÿ‰øƒÄ[^_]ÃÇ$ÿô‚ød‰Ç…Àt‹C ‰D$Ç$ª5ödÿ˜ƒød…ÀtÀ‹W ‰‰øƒÄ[^_]Ãf1Ò¸òÿÿÿè ûÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÏvUWVSƒì,‰Ã‰Õ…Àt*…Òt.‰Ç1ö¡ƒød‰D$‹G‰$ÿT$FƒÇ9îuî‰$ÿT$ƒÄ,[^_]áƒød‰D$ëæUWVSƒì,‰Ã‰T$…Àt.…Ò~2‰Æ1ÿ‹-ƒød‹F‰$ÿÕ‹F‰$ÿÕGƒÆ4;|$uæ‰$ÿÕƒÄ,[^_]Ë-ƒødëëSƒì‰Ã‹€¸1 t ÿØ‚ød‰CƒÄ[Ãì‹€º1 t ‹@‰$ÿÔ‚ødƒÄÃfVSƒì‰Ã‰ÖèÒÿÿÿ‰4$ÿƒød‰ØƒÄ[^ë Sƒì(‰ÓÁë=€Êõd„¤=ËõdBÿ„¶ƒøwI‹<‚ødƒ;tZÇD$‰ $‰L$莋L$…ÀuPƒ;tUÇD$‰ $èq…À•ÀƒÄ([Ãvƒëƒûv¯‰L$‰$èÄêÿÿƒÄ([Ãv¡L‚ød‹·Hƒà…Àt°°ƒÄ([Ãv¡L‚ød‹·Hƒàë«Bÿƒøv@ƒëƒûv,‰L$‰$è8ÛÿÿëÊfƒøv#ƒëƒûv‰L$‰$èãÛÿÿë­‰ $èøcë¢f‰ $è0`Hƒø–Àëvƒì‹P;”ƒødt*;˜‚ødt"öBW‰$u ÿ‚ødƒÄÃvÿ„ƒødƒÄÃfÿƒÄÃfƒì‰L$‰T$‰$ÿLƒødƒÄë§vUWVSƒì,‹D$@‹@‰D$…À„À‹T$@‹Z‹J‹B0‰D$…À~c‹j4ÇD$f‹E…Àx9Ã~‰Ã‹E…Àx9Á}‰Á‹}…ÿt$‹E‹0‹P1À…öx9ó~‰ó…Òx9Ñ}‰Ñ@9øuçÿD$ƒÅ‹T$9T$uª‰Ú‹D$èGÿÿÿ…Àt9‹L$@‹Q …Òt ‹ I‰ …Ét?‹T$@‰B ‰Z‹B…Àt ‹J‰…Òt‹L$@ÇA¡¬ƒødÿƒÄ,[^_]ËP‰$ÿRëÛ‹J‰$‰D$ÿQ‹D$ë®UWVSƒì‹\$0‹D$4…Àˆ¹;C0°…Àtpl@ý‹C4,è‹E‰$ÿô‚ød‰Ç…À„‹E…Àtz1öë ‹W ‰²F9uviõU‹C‹J)Á‹)‹C èbþÿÿ…ÀuÒ‹H‰…Àta1ÿ‰øƒÄ[^_]ÃÇ$ÿô‚ød‰Ç…Àt‹C‹K$)Á‹S )‹C è þÿÿ…Àt¾‹W ‰‰øƒÄ[^_]Ã1Ò¸òÿÿÿè´öÿÿ1ÿ‰øƒÄ[^_]ËG‰<$ÿP1ÿëÐvWVSƒì ‰Ã€x t2¡”ƒød9Bt|‰$‰T$ÿ„ƒød‰Ç…À‹T$u6¸îÿÿÿè_öÿÿ¾îÿÿÿëK¡˜‚ød9BtJ‰$‰T$ÿ‚ød‰Ç…À‹T$„ý‹…Àt3‰|$‰$ÿð‚ød‰Æ…Àxg‹H‰…À„¹‰ðƒÄ [^_Ãÿ‰×‹…ÀuÍ‹C…À„¯Ç$ÿô‚ød‰…Àt$‹@ ‹S‰ÇC‹‹@ ‰x1ö‰ðƒÄ [^_Ãf¾÷ÿÿÿ‹H‰…Àt2‹…Àt ‹J‰…Òt/‹C…Àt ‹J‰…Òt+1Ò‰ðè‚õÿÿ‰ðƒÄ [^_ËG‰<$ÿPëËP‰$ÿRëÆ‹P‰$ÿRëÊ‹G‰<$ÿP‰ðƒÄ [^_Ãf‰{1öé)ÿÿÿ¸íÿÿÿè,õÿÿ¾íÿÿÿéÿÿÿfVSƒì$‰Ã‹…À„ï€{…Å€{ uCÇ$h:ödÿ”‚ød‰Æ‹…ö„’‰D$‰4$ÿœƒød‹J‰…ÒtG‹‹ I‰ …ÉtXƒÄ$[^ÃvÇD$Ç$ÿŒƒød‰Æ‹…ötK‰D$‰4$ÿƒød‹J‰…Òu¹‹V‰4$‰D$ÿR‹D$‹‹ I‰ …Éu¨‹J‰$‰D$ÿQ‹D$ƒÄ$[^Ãf‹J‰…Òt1ÀƒÄ$[^Ãv‰$ÿø‚ødé-ÿÿÿf‹P‰$ÿR1Àé[ÿÿÿ‹C…À…Pÿÿÿ€{ uÇ$h:ödÿ”‚ødé8ÿÿÿÇD$Ç$ÿŒƒødéÿÿÿf‹D$‹@,‰D$¡¤‚ødÿàfSƒì‹\$ ‹C…Àt ‹J‰…Òtl‹C …Àt ‹J‰…ÒtP‹C‹J‰…Òt8‹C4…Àt ‰$ÿƒød‹C8…Àt‹J‰…Òu ‹P‰$ÿR‰\$ ¡0ƒødƒÄ[ÿà‹P‰$ÿR뽋P‰$ÿR륋P‰$ÿRë‰UWVSƒì,‰Ç‹€¬ …Àt ‰$ÿdƒød‹‡p …Àt"‹-ƒødëf‰Ø‹˜ ‰$ÿÕƒ¯€ @…Ûuè‹7‹Ÿˆ …Ût.‹-ƒødë‰Ã‹C‹S‰$‰D$ÿÕ‹S ‰$ÿÕ‰$ÿÕ‹D$…ÀuÚ‹Ÿ …Ût)‹-ƒødë‰Ë‹K‹V$‹C‰L$èÜ÷ÿÿ‰$ÿÕ‹L$…Éuß‹Vp…Ò„4‹V‹GHèm÷ÿÿ‹Ft…À„‹V$‹GTè£÷ÿÿ‹ŸØ …Ût5‹-ƒødë‰Ë‹K‹V‹C ‰L$è0÷ÿÿ‹V$‹Cèq÷ÿÿ‰$ÿÕ‹L$…ÉuÔ‹FT…À~-1À1Û‹-ƒødv‹—à ‹T‰$‰D$ÿÕC‹D$ƒÀ9^Tà‹‡à …Àt ‰$ÿƒød‹‡È ‰D$…Àt>‹vx‰t$…öŽ“‹\$1ö‹-ƒød‹C‰$ÿÕ‹C‰$ÿÕFƒÃ(;t$uæ‹D$‰$ÿÕ‹‹J‰…ÒtN‹G‹J‰…Òt6€¿+ t ƒÇ‰<$ÿŒ‚ødƒÄ,[^_]ËGT‰Ftéîþÿÿ‹GH‰FpéÌþÿÿ‹P‰$ÿRë¿‹P‰$ÿRë§‹-ƒødë‹Sƒì‹\$ C èÐýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡0ƒødƒÄ[ÿàSƒì‹\$ C èœýÿÿ‹C‹J‰…Òu ‹P‰$ÿR‰\$ ¡0ƒødƒÄ[ÿàWVSƒì ‰Ã‰T$Ç$ª5ödÿ˜ƒød‰Æ…Àt=‰$ÿDƒød‰Ç‹H‰…Àt5…ÿt%‰|$‰$ÿð‚ød‹J‰…Òt'÷ÐÁèƒÄ [^_Ãv1ÀƒÄ [^_Ãv‹F‰4$ÿPëÀ‹W‰<$‰D$ÿR‹D$ëÆWVSƒì ‹t$0Ç$ÿô‚ød‰Ã…Àtºi:ödè¡ßÿÿ„Àu)‹H‰…Àt 1ÀƒÄ [^_Ãv‹C‰$ÿP1ÀƒÄ [^_Ãf‹V ‰Øèÿÿÿ„Àtɺ…:öd‰ØèZßÿÿ„Àt¹‹V$‰Øèüþÿÿ„Àt«ºˆ:öd‰Øè<ßÿÿ„Àt›‹F‹N$)Á‹V )‹F èÓöÿÿ‰Æ…Àt€‰$ÿDƒød‰Ç‹H‰…À„˜…ÿ„`ÿÿÿ‰|$‰$ÿð‚ød‰Æ‹J‰…Ò„‚…öˆ<ÿÿÿº’:öd‰ØèÍÞÿÿ„À„(ÿÿÿÇD$h:ödÇ$½5ödÿ˜ƒød‰Æ…À„ ÿÿÿ‰\$‰$ÿƒød‹J‰…Òt?‹J‰…Ò…ñþÿÿ‹S‰$‰D$ÿR‹D$éÛþÿÿ‹F‰4$ÿPéZÿÿÿ‹G‰<$ÿPépÿÿÿ‹V‰4$‰D$ÿR‹D$ë®fUWVSƒì<‹t$PÇ$ÿô‚ød‰Ã…Àtº”:ödèÞÿÿ„Àu(‹H‰…Àt 1ÀƒÄ<[^_]ËC‰$ÿP1ÀƒÄ<[^_]ËF‰$‹-DƒødÿՉDžÀtĉD$‰$¡ð‚ød‰D$ÿЋJ‰…Ò„I…Àx¡ÇD$$1À1ÿëPvº¡:öd‰Øè”Ýÿÿ„Àt€º®:öd‰Øè„Ýÿÿ„À„lÿÿÿ‹D$$‹ÅÀXöd‰ØèjÝÿÿ„À„RÿÿÿG‹D$$@‰D$$ƒø w'‹ÅÄXöd…F tæ…ÿt£ºª:öd‰Øè7Ýÿÿ„Àu£éÿÿÿfÇD$$‰÷D$,‰D$ D$(‰D$D$$‰D$‹G4‰$ÿ°‚ød…À„ º…:öd‰ØèêÜÿÿ„À„Òþÿÿ‹D$(‰D$‰$ÿT$…Àˆ»þÿÿ‹D$,‰$ÿՉƅÀ„¨þÿÿºµ:öd‰Øè¬Üÿÿ„À„”þÿÿ‰t$‰$ÿT$‹J‰…Òt…À‰fÿÿÿésþÿÿv‹V‰4$‰D$ÿR‹D$ëÝ‹W‰<$‰D$ÿR‹D$é¡þÿÿº·:öd‰ØèJÜÿÿ„À„2þÿÿÇD$h:ödÇ$½5ödÿ˜ƒød‰Æ…À„þÿÿ‰\$‰$ÿƒød‹J‰…Òt#‹J‰…Ò…ûýÿÿ‹S‰$‰D$ÿR‹D$éåýÿÿ‹V‰4$‰D$ÿR‹D$ëÊvUWVSƒì‹\$0‹s@…öŽ 1ÿ‹-ƒødë ‰4$ÿÕG9{@~/‹CD‹4¸‹F(‰$ÿÕöF-tá‹F‰$ÿÕ‹F‰$ÿÕ‰4$ÿÕG9{@Ñ‹CD‰$ÿÕ‹CL‰$ÿÕ‹CX‰$ÿÕ‹Cd‰$ÿÕ‹S‹Cpè¯ðÿÿ‹S$‹Ctèððÿÿ‹K…Ét ‰$ÿ,ƒød‹C…Àt ‹J‰…Òtx‹C,…Àt ‹J‰…Òt\‹C0…Àt ‹J‰…Òt@‹C4‹J‰…Òt(‹C8‹J‰…Òu ‹P‰$ÿR‰\$0¡0ƒødƒÄ[^_]ÿà‹P‰$ÿRëÍ‹P‰$ÿR뵋P‰$ÿR뙋P‰$ÿRézÿÿÿ‹-ƒødéÿÿÿvVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F8‰$ÿ–  ƒø tƒè ƒø–ÀƒÄ[^Ã;^<}ȉ\$‹F8‰$ÿ–  ƒø •Àë²vVSƒì‹\$ ‹t$$9s< °ƒÄ[^Ãf‰t$‹C8‰$ÿ“  ƒø tƒè ƒø–ÀƒÄ[^Ã…öÎN‰t$‹C8‰$ÿ“  ƒø •Àë·vVSƒì‹t$ ‹\$$…Ûu °ƒÄ[^ÃvCÿ‰D$‹F8‰$ÿ–  ƒø t PöƒúvÕ=…tÎ=( tÇ=) ”Àë¿;^<}¸‰\$‹F8‰$ÿ–  ƒø •Àë¢vVSƒì‹\$ ‹t$$9s< °ƒÄ[^Ãf‰t$‹C8‰$ÿ“  ƒø t#PöƒúvÙ=…tÒ=( tË=) ”ÀëÃv…öºN‰t$‹C8‰$ÿ“  ƒø •Àë£vVSƒì$‹D$4‹\$89Øt;t$‰t$‰$‹D$0ÿP0ƒø~;\$tºëv;–tB9Âuö1ÀƒÄ$[^Ãf°ƒÄ$[^ÃUWVSƒì ‰Å‰Ó‰Ï1ö…Òu ë"v‹…Ût‰ù‰Ú‰èè:C/uêƒö‹…Ûuç‰ðƒÄ [^_]ÃvSƒìŠZ.ƒë €û:v 1ÀƒÄ[Ãf¶Ûÿ$¼:ödf‹Z$…Ûtä‹R(9 tz1Àëf9 ‚to@9ØuöëË‹B(9”ÀƒÄ[Ãv‰L$‹R(‹‰$ÿƒÄ[ËB(‹P;r9Ñ–Àë˜v‹RƒÄ[ëcv‹RƒÄ[錋RƒÄ[éÿÿÿ‹RƒÄ[ë v°é^ÿÿÿWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè+ÿÿÿ:C/uê°[^_Ã1À[^_ÃfWVS‰Ç‰Ó‰Îè ÿÿÿ:C/t1À[^_Ãv‰ñ‰Ú‰øèñþÿÿ:C/tç‹…Ûuê°[^_ÃWVS‰Æ‰Ó‰Ï…Òu ë‹…Ût‰ù‰Ú‰ðè¿þÿÿ:C/tê1À[^_ð[^_ÃfUWVSƒì,‰D$‰Ó‰L$‹|$@…É~O1öŠC.ƒè <:v °ƒÄ,[^_]öÀÿ$…¨;ödf‹S$…Òt‹,·‹K(;)tÙ1Àëv9,tÍ@9ÐuöF;t$u·v1ÀƒÄ,[^_]Ãf‹ ·‹S‹D$èÝþÿÿ„ÀuŸF;t$uŽëØ‹ ·‹S‹D$èÉýÿÿ„ÀuƒF;t$…nÿÿÿ븋 ·‹S‹D$è ÿÿÿ„À…_ÿÿÿF;t$…Jÿÿÿ딋 ·‹S‹D$è±þÿÿ„À…;ÿÿÿF;t$…&ÿÿÿémÿÿÿ‹·‹C(‹H;‚Qÿÿÿ9ʆÿÿÿF;t$…üþÿÿéCÿÿÿv‹·‰D$‹C(‹‰$‹T$ÿ„À…áþÿÿF;t$…Ìþÿÿéÿÿÿv‹C(‹9·„ÀþÿÿF;t$…«þÿÿéòþÿÿfUWVSƒì<‰Ç‰Ót$ ‰t$‰ $ÿP0‰ÅŠC.ƒè3< w'¶Àÿ$…”<öd‹[‰4$‰é‰Ú‰øèGþÿÿ:C/„ÁfÆD$ŠD$ƒÄ<[^_]Ãv‹[…Ûu ëãv‹…ÛtÚ‰4$‰é‰Ú‰øèþÿÿ:C/uçÆD$ŠD$ƒÄ<[^_]Ãf‹[ÆD$…Ûu ë«€t$‹…Ût ‰4$‰é‰Ú‰øèÉýÿÿ:C/uçëàf‹[…Ûu ë´v‹…Ût«‰4$‰é‰Ú‰øè ýÿÿ:C/tçéZÿÿÿf‰4$‰é‰Ú‰øè†ýÿÿ:C/„Aÿÿÿ‹…ÛuãéoÿÿÿfUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øè{þÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèBþÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øè~ýÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèEýÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfSŠZ.ƒë2€ûv1À[öÛÿ$Ì<ödf‹R[é³úÿÿv‹R[é¯ùÿÿv‹R[éûÿÿv‹R[éÃúÿÿvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ër ëfC9ët¶ ‰ò‰øèGÿÿÿ:D$ t鉨+D$ ƒÄ[^_]Ãv‹L$ ,‘9ër ëƒÃ9Ýv‹ ‰ò‰øèÿÿÿ:D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹L$ A,Q9ër ëƒÃ9Ýv· ‰ò‰øèÑþÿÿ:D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‰Ö‰È‹T$0‹M8‰L$ ŠL$48N/”D$ ‹½œ ‹M4ƒù„ŠƒùtIIt ƒÄ[^_]Ãf‹\$ Ël$ Õ9ëw ëfK9ët¶Kÿ‰ò‰øèJþÿÿ:D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹L$ ,‘9ëw ëƒë9Ýs‹Kü‰ò‰øèþÿÿ:D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹L$ A,Q9ëw ëƒë9Ýs·Kþ‰ò‰øèÔýÿÿ:D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰Ã‰Ö‹€  ‹S8€~.Aw¶~.ÿ$½ =ödv;KD|=v1ÀƒÄ,[^_]Ãf;K@~ïI‰L$‰$ÿЋ›œ ‰Á‰ò‰Øè`ýÿÿ:F/”ÀëÎ;K@~ÇI‰L$‰$ÿЋ›œ ‰Á‰ò‰Øè(úÿÿ:F/”Àë¦;KD}Ÿë¯;K@~—I‰L$‰$ÿЋV(‹J;r`9È–Àf8F/”Àésÿÿÿ;K@ŽgÿÿÿI‰L$‰$ÿЋV(‹j‹:‹“œ \$‰\$‰$ÿR0…À~1Òv‹ “9Ïw 9Ír°ë­B9Âuë1Àë£v;KDÿÿÿ‰L$‰$ÿЋV(‹j‹:‹“œ \$‰\$‰$ÿR0…À~Ç1Ò‹ “9Ïw9Ís°B9Âuð1ÀéUÿÿÿ;KDÇþÿÿé,ÿÿÿf;K@Ž·þÿÿ‹›œ ‹I‰L$‰$ÿЉD$‹F(‹‰$ÿÓ:F/”ÀéŽþÿÿ;K@ŽƒþÿÿI‰L$‰$ÿЋV(‹›œ ‰Á‹‰Øè½äÿÿ:F/”Àé\þÿÿf;KDOþÿÿëË;KDCþÿÿ‹›œ ‹ë‹;K@Ž/þÿÿI‰L$‰$ÿЋV(;”¶ҶF/9”Àéþÿÿ;K@Žþÿÿ‹~(‹?I‰L$‰$ÿЉ|$‰D$‹ƒœ ‰$èöôÿÿ:F/”ÀéÕýÿÿv;KDÇýÿÿ‹~(‹?ëÃ;KD·ýÿÿë‡;K@Ž«ýÿÿ‹›œ ‹[ I‰L$‰$ÿЉ$ÿÓ„À”Àé‹ýÿÿ;KDýÿÿ‹›œ ‹[ ëÓ;K@ŽkýÿÿI‰L$‰$ÿЃø •ÀéXýÿÿf9K@œÀéKýÿÿ9KDŸÀé?ýÿÿ9KDŽ3ýÿÿëÇUWVSƒì\‰Ã‰Ö‰Í‹zöG- u‹H8‰L$ ‹ˆ  ‰L$€.Kv‹‹T$p‰‰j°ƒÄ\[^_]Ãf¶G.ÿ$…>öd‹W$‰T$$‰è+C@9ÂwE‹(‰é)щL$(…ÒtZ1Û‰t$,‹t$ ‰l$ ‹l$ë fC;\$$„Ý‹D$(؉D$‰4$ÿÕ;Ÿtá1ÀƒÄ\[^_]Ã;kD}ñ‰l$‹L$ ‰ $ÿT$ƒø tÝ‹F‹L$p‰n ‰i°ƒÄ\[^_]Ã;k@â1Àë¼;k@~µEÿ‰D$ë¿;kD|Ë1Àë¥;kD}ž‹ƒœ ‹X ‰l$‹L$ ‰ $ÿT$‰$ÿÓ„Àt¡1Àéxÿÿÿ;k@Žmÿÿÿ‹ƒœ ‹X Eÿ‰D$ëÊ‹ƒœ ‰l$‰$ÿP:G/„fÿÿÿ1Àé=ÿÿÿ‹D$p‰$‰é‰ú‰Øè…þÿÿ„À…EÿÿÿW‹L$p‰ $‰é‰Øèjþÿÿ„À…*ÿÿÿ1Àéÿÿÿ;kDöþÿÿ‰l$‹L$ ‰ $ÿT$‹W(;”¶ҶG/9„ôþÿÿ1ÀéËþÿÿ;kDÀþÿÿ‹G(‹‰l$‹L$ ‰ $‰T$ÿT$‹T$‰T$‰D$‹ƒœ ‰$è2òÿÿ:G/„©þÿÿ1Àé€þÿÿ;k@Žuþÿÿ‹G(‹Eÿ‰D$ë°;k@Ž^þÿÿEÿ‰D$é`ÿÿÿ‹ƒœ ‰l$‰$ÿP:G/„]þÿÿ1Àé4þÿÿ‹ƒœ ‰l$‰$ÿP:G/„=þÿÿ1Àéþÿÿ‹ƒœ ‰l$‰$ÿP:G/„þÿÿ1Àéôýÿÿ9k<„ þÿÿ‰l$‹L$ ‰ $ÿT$ƒø „õýÿÿ1ÀéÌýÿÿ‹ƒœ ‰l$‰$ÿP(„À…Öýÿÿ1Àé­ýÿÿ9k<„Æýÿÿ1Àéýÿÿ9k<„¶ýÿÿ9kd„­ýÿÿ1Àé„ýÿÿ9k<„ýÿÿ9kh„”ýÿÿ1Àékýÿÿ‹ƒœ ‰l$‰$ÿP :G/„týÿÿ1ÀéKýÿÿ‹ƒœ ‰l$‰$ÿP:G/„Týÿÿ1Àé+ýÿÿ;kD ýÿÿ‹ƒœ ‹‰l$‹L$ ‰ $ÿT$‰D$‹G(‹‰$ÿÓ:G/„ýÿÿ1Àéíüÿÿ;kDâüÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹›œ ‰Á‹‰Øè£ßÿÿ„ÀéÖýÿÿ;k@ޝüÿÿEÿ‰D$ëÈ;k@Žüÿÿ‹ƒœ ‹Eÿ‰D$éuÿÿÿ;kD€üÿÿ‰l$‹L$ ‰ $ÿT$‹W(‹J;rx9È–Àf8G/„{üÿÿ1ÀéRüÿÿ;kDGüÿÿ‰l$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒœ \$@‰\$‰$ÿP0‰Á…À~1Àf‹ƒ9T$w 9T$ r°ë•@9Èuç1Àë‹;k@ŽâûÿÿEÿ‰D$‹L$ ‰ $ÿT$‰Â‹G(‹H‰L$ ‹‰D$‹ƒœ \$@‰\$‰$ÿP0‰Á…À~µ1Àf‹ƒ9T$w9T$ s˜@9Èuì1Àé%ÿÿÿ;k@Ž|ûÿÿEÿ‰D$éôþÿÿ9kX„‹ûÿÿ1Àébûÿÿ;kDWûÿÿ‰l$‹L$ ‰ $ÿT$‹›œ ‰Á‰ú‰ØèOõÿÿ:G/„Rûÿÿ1Àé)ûÿÿ;kDûÿÿ‰l$‹L$ ‰ $ÿT$‹›œ ‰Á‰ú‰Øèòÿÿ:G/„ûÿÿ1Àéðúÿÿ;k@ŽåúÿÿEÿ‰D$ëÂ;k@ŽÓúÿÿEÿ‰D$étÿÿÿ…í„ãúÿÿEÿ‰D$éÎüÿÿ‹ƒœ ‰l$‰$ÿP$„À…¿úÿÿ1Àé–úÿÿ…í„°úÿÿ1Àé‡úÿÿ‹ƒœ ‰l$‰$ÿP:G/„úÿÿ1Àégúÿÿ‹W$‹CD)è9‡Uúÿÿ‹O(…Ò„núÿÿê‰T$$‰ï‰è÷؉t$(‹t$ ‰l$ ‹l$ë G;|$$„ÿ‰|$‰4$ÿÕ;»tç1Àé úÿÿ‹O$‰L$$‹KD)é‹D$$…À„±ƒ|$$†ëº«ªªª‹D$$÷âÑê9ÑŒÐùÿÿ‹“œ ‰T$(‹J8‰L$4‹(‰|$,‰é‹D$$…À„¼1ÿ1À1Ò‰\$0‰Ó‰t$8‰Æ‰l$<ëfCG9þE;\$$„È9þ/‹D$09hDŽnùÿÿ‰l$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$4‰Æ1ÿ‹L$,‹™‰D$‹D¼@‰D$‹T$(‰$èÑìÿÿ„Àu™1Àé$ùÿÿ‹W$‹CD)è9‡ùÿÿ‹›œ ‰\$,‹O(…Ò„!ùÿÿê‰T$(‰ë‰è÷؉D$$‹|$ ‰t$ ‰l$0‹l$,ë C;\$(„¼‹T$$‹4š‰\$‰<$ÿT$‰t$‰D$‰,$èOìÿÿ„ÀuÏ1À颸ÿÿ‹O$‰ê+S@‰T$$…É„Fƒù†º«ªªª‰È÷âÑê9T$$Œnøÿÿ‹“œ ‹B8‰D$,‹(‰|$$…É„b‰Ï1À‰\$(‰t$0‰î‰l$4‰Õë:‹L$$‹T¹ü‰T$Xÿ‹Dœ@‰D$‰,$èÁëÿÿ„À„øÿÿO‰Ø…Û޾…ÿ„6…À‹D$(9p@ñ÷ÿÿFÿ‰D$‹L$ ‰ $ÿT$T$@‰T$‰$ÿT$,ë’‹O$‰L$$‰è+C@9Á‡º÷ÿÿ‹“œ ‹G(‰é+L$$‰L$(‹|$$…ÿ„¿÷ÿÿ1ۉ׉t$,‰l$0‰Åë vC;\$$tV‹t‹D$(؉D$‹L$ ‰ $ÿT$‰t$‰D$‰<$èüêÿÿ„ÀuÌ1ÀéO÷ÿÿNé<ÿÿÿ1ÒéÇþÿÿ1Òé`ýÿÿ‹t$,‹l$ éO÷ÿÿ‹t$,‹l$0éB÷ÿÿ‹t$(‹l$ é5÷ÿÿ‹t$ ‹l$0é(÷ÿÿºé‚þÿÿºéýÿÿ‰é‹F‹T$p‰‹F …À„köÿÿ‹D$p‰H°éböÿÿ‰ñ‹t$0‹l$4…Û~Ð1Àé¹öÿÿ‰ð‰é‹t$8‹l$<9Ç}¹1Àé¢öÿÿWVS‰Ã‰È‹t$¶|$ƒûtƒût>Kt[^_ÃvÐÖ9ðs%1Û€8 •Ãçÿ9ûtë1É€8 •Á9Ùu@9ðuï)Ð[^_ʲ9Øs)1Ƀ8 •Á‰Îçÿ9þtë1Ƀ8 •Á9ñuƒÀ9Ãwí)ÐÁø[^_ÃJr9Øs.1Éfƒ8 •Á‰Îçÿ9þtëv1Éfƒ8 •Á9ñuƒÀ9Ãwì)ÐÑø[^_ÃWVS‰Ã‰È‹t$¶|$ƒû„‹ƒûtBKt[^_ÃvÐÖ9ðv*1Û€xÿ •Ãçÿ9ûtëv1É€xÿ •Á9ÙuH9ðuî)Ð[^_ʲ9Øv.1Ƀxü •Á‰Îçÿ9þtëv1Ƀxü •Á9ñuƒè9Ãrì)ÐÁø[^_ÃvJr9Øv/1Éfƒxþ •Á‰Îçÿ9þtëf1Éfƒxþ •Á9ñuƒè9Ãrë)ÐÑø[^_ÃvWVSS‰Ã‰Ï‹D$‹t$ŠL$8L$ ”D$‹ƒû„ˆƒûtGKtZ[^_ÃvÐÖ9ðs,¶9ٔöۉ߶\$9ßtë¶9ٔöÛ9ûu@9ðuì)ÐZ[^_Â4²9ðs(1Û;”Éß¶\$9ßtëf1Û;”Ã9ûuƒÀ9Æwî)ÐÁøZ[^_ÃB4r9ðs0·9ٔöۉ߶\$9ßtëf·9ٔöÛ9ûuƒÀ9Æwê)ÐÑøZ[^_ÃUWVSƒì<‰Ã‹|$P‹l$T‹@8‰D$8L$X”Á‹ƒœ t$ ‰t$‹‰$ˆL$ÿP0‹S4ƒúŠL$„·ƒút^Jt ‰øƒÄ<[^_]Ã|$l$9ïs2‹T$ ‰T$Š…À~¶Û;\$t)1Òë;–tB9Âuö1Ò8ÑuG9ïu×+|$‰øƒÄ<[^_]òëä‹T$<º,ª9ïs1‹T$ ‰T$f‹…À~;\$t,1Òë;–t#B9Âuö1Ò8ÑuƒÇ9ýwÙ+|$Áÿ‰øƒÄ<[^_]òëà‹T$üÿÿ@ÁàèŠÖÿÿ‰Æ‰CT…À„üÿÿ‹E$@ Áá1À‰÷óªéýÿÿ‹T$,éwûÿÿUWVSƒì|‰D$(‰Ó‰ÎŠ„$˜ˆD$.Š„$ ˆD$/¶¬$¤¶¼$¨T$4‰Èè€ÿÿ„Àu 1ÀƒÄ|[^_]Ãf¶T$l‹Cè·Õÿÿ„Àtkçÿ‰|$åÿ‰l$¶D$/‰D$‹„$œ‰D$¶D$.‰D$ ‹„$”‰D$‹„$‰D$D$4‰$‰ñ‰Ú‹D$(è”ùÿÿ„Àt °ƒÄ|[^_]ÃfD$4èÓŒÿÿ1ÀƒÄ|[^_]Ãì‹T$ ‹D$$…ÀxQ;B0L…Àt(D@ý‹J4Á‹P‰T$‹‰D$Ç$ˆ7ödÿ˜ƒødƒÄËB$‰D$‹B ‰D$Ç$ˆ7ödÿ˜ƒødƒÄÃ1Ò¸òÿÿÿè|ÿÿ1ÀƒÄÃfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹@‰D$ÇD$ª5öd¡˜ƒødƒÄ ÿà‹B$ëäv1Ò¸òÿÿÿè$ÿÿ1ÀƒÄ Ãfƒì ‹T$‹D$…Àx5;B00…Àt$D@ý‹J4Á‹‰D$ÇD$ª5öd¡˜ƒødƒÄ ÿàf‹B ëãv1Ò¸òÿÿÿèÌŽÿÿ1ÀƒÄ ÃfWVSƒì ‰Ã‰ÖIt‰ÐèDÔÿÿ‰Ç…À„Š…ö~'f‹fúÿwL1É1Àëf‰Áf‹Cfúÿw7ˆ@9ðuë‰t$‰|$Ç$ª?ödÿ˜ƒød‰<$‰D$ÿƒød‹D$ƒÄ [^_Ãf‰<$ÿƒød1ÀƒÄ [^_Ãf‰T$‰D$Ç$ª?ödÿ˜ƒødƒÄ [^_Ã1ÀëÃUWVSìŒD$|‰D$ D$x‰D$ÇD$­?öd‹„$¤‰$ÿ„‚ød…À„šöD$xu‹t$|ÿ‰ðÄŒ[^_]ÃT$0‹D$|诊ÿÿ„À„k‹D$d‰D$ ƒø„ƃøt!H„ÊD$0èiŠÿÿ1ö‰ðÄŒ[^_]ÃfÇD$(°ôd‹D$x¨ u¨…¨¨€…¼¾€Êõdƒ|$ „ȃ|$ „­ƒ|$ „†ƒ|$ u™ÇD$dôdöÄ@‹D$`t@¯D$ è¡Òÿÿ‰Ã…À„qÿÿÿöD$y@„Ä‹v8‰t$,‹t$`…öŽz1í1ö|$l‰l$‹D$\‰$ÿT$(‰|$‰$ÿT$,‰D$…À~01Ò‰l$$‰õ‰Þ‰Ó‹Ÿ‰D$+‰D$‰4$ÿT$C;\$uä‰ó‰î‹l$$t$E9l$`£‹L$ ‰ò‰Ø€|$h„ˆè“ˆÿÿ‰Æ‰$ÿƒødD$0è3‰ÿÿ‰ðÄŒ[^_]Ãf1ö‰ðÄŒ[^_]Ën4‹t$`…ö~ª1ÿ‹t$(‰l$‹l$v‰|$‹D$\‰$ÿÖ‰$ÿT$‰D$‰|$‰$ÿÕG‹D$`9øÖ‰Æéhÿÿÿvèýÿÿ‰ÆésÿÿÿÇD$(€ôdé[þÿÿvÇD$(TôdéKþÿÿv¾ÀÊõdéfþÿÿfÇD$¼ôdé|þÿÿv¾ËõdéJþÿÿfÇD$ôdé`þÿÿvÇD$ ÇD$ôdéHþÿÿ1öéåþÿÿUWVSƒìL‰D$$‰T$(‰Î‹\$`‹l$d‹D$hƒèƒø‡?‹<…lXöd‹…xXöd‰D$,‹D$$‹€œ ‰D$ ‹@,9뾉l$‰õ‰Æë fC;\$„¡‰\$‰,$ÿ׉$ÿÖ„Àtã‰î‹l$‹T$ ‹R<‰T$‰\$‰4$ÿ×T$0‰T$‰$ÿT$‰D$…ÀŽÛC‰D$ 1ÿëvG;|$„’‹D¼0‰D$‰\$‰4$ÿT$,‹T$h‰T$‰l$‹D$ ‰$‰ñ‹T$(‹D$$èÿÿÿ…Àt¼ƒÄL[^_]Éî‹l$‹D$$€¸* u]‹L$h‰ê‰ðètûÿÿ‰Ã…Ût_‰\$‹T$(‰$ÿPƒød‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄL[^_]ÃvÇD$,dôd¿TôdéÁþÿÿf‹L$h‰ê‰ðè†ÿÿ‰Ãë¡1Àë̸÷ÿÿÿëÅSƒì‰T$‰$ÿƒød‰Ã…Àt ‰ØƒÄ[Ãf1Ò¸÷ÿÿÿè ‰ÿÿ‰ØƒÄ[ÃUWVSƒì,‰Æ‰ÍˆT$¸0èÏÿÿ‰Ã…Àth¹01À‰ßóª‹D$D‰C$…ÀuwÇC(ŠD$ˆC.‰èƒàˆC/Áå f‰k,‹D$@‰C ‹V<9V@|C‰F<…Àt)Áâ‹FDèVÿÿÿ…ÀtZ‰FD‹V@‰B‰V@‰ØƒÄ,[^_]ÃvÇF<º@ëÌf‹FDëÔvÁàèxÎÿÿ‰C(…Àu1À‰$‹5ƒødÿÖ‰$ÿÖ1Ûë¶v‹C(ëävWVSƒì‰Ã‹P9Sr~Š‹H¶ÂƒèƒøIwZ¾° XödöÁt1ö¶Ò‹CÇD$‰4$èÞþÿÿ…ÀtM‹‹z‹H(‰9ƒÂ ‰‹S‹:…ÿt*‰B‰C…ötÿC ¸ƒÄ[^_Ã1ö멸ƒÄ[^_ÉëÕ¸ÿÿÿÿëݸ÷ÿÿÿëÖfWVSƒì‰Ã‹P 9S‚†Š‹H¶ÂƒèƒøIwb¾° XödöÁt1ö¶Ò‹CÇD$‰4$è:þÿÿ…ÀtU‹H(‹‹z‰9‹z ‰yƒÂ‰‹S‹ …Ét,‰B‰C…ötÿC ¸ƒÄ[^_Ãv1ö롸ƒÄ[^_ÉëÓ¸ÿÿÿÿëÛ¸÷ÿÿÿëÔfUWVSƒì,‰Ã‰Õ‹‹H‹pµ ‰T$Â9S‚ΊˆD$¶ÀƒèƒøIvv1ÿ¶T$‹C‰t$‰<$èˆýÿÿ…À„¦‰ê„ÒufH,…öt‹h(‹;1Ò‹L— ‰L•B9òuó‹T$‹S‹:…ÿt`‰B‰CŠD$ƒèG<vs ¸ƒÄ,[^_]Ãv¾¸ Xöd¯þ뀋K …öt%ƒþv(º«ªªª‰ð÷âÑêʉS ¸ƒÄ,[^_]Ãv1Òëç‰럺ëܸÿÿÿÿ맸÷ÿÿÿë vUWVSƒì‰Ã‹Š‹H¶ÂƒèƒøI‡í¾° XödöÁt1ö¶Ò‹CÇD$‰4$èüÿÿ‰Ç…À„僋C‹(…í„ljx‰{‹k ‹‹ƒè ƒø:v¸ÿÿÿÿƒÄ[^_]Ãÿ$…¼?ödº‰Øèdþÿÿ…À„‹;SsÏ‹ƒøuÀƒÂ‰‹‰Glj{‰k …ötPE‰k ¸ƒÄ[^_]Ãv‰Øè!ÿÿÿƒøt¸ë‘f‰Øè]ýÿÿƒøt¨ëf‰Øè­üÿÿƒøt˜énÿÿÿv1öéÿÿÿ¸ƒÄ[^_]Ãv‰8é5ÿÿÿ1ÀéEÿÿÿ¸÷ÿÿÿé;ÿÿÿUWVSƒì‰Î‹\$0‰×JþƒùIwI¾ŠXöd‰Í¯î‰ù¶Ñ‰t$‰,$1Éè^ûÿÿ…ÀtfH,…ö~‹x(1Òv‹ “‰ —B9òuõƒÄ[^_]Ã1íë¿UWVSƒì‰Ã…Àtk‹@(4•,0‹}B‰T$ …ÿt9 tM1Òë9L•tBB9úuõ‹S$•‰L$è®úÿÿ…À‹L$t,ÿC$‰C(Æ‹‹T$ Ú‰ C‰°ƒÄ[^_]Ãf°ƒÄ[^_]Ã1ÀëôfUWVSƒì‰Å‰×‰Î‹\$0…Ût;‹C,¨@u4ƒÈ@f‰C,ŠC.ƒè‰{‹)‰kDmÁà‰D$‹D$@‹‰D$‰<$èiêÇC ÿÿÿÿ°ƒÄ,[^_]ËzëÊv1ÀƒÄ,[^_]ÃfWVSƒì‰Ç‰Ö‰ËIC‰$‰øèXÿÿÿ„Àt4KVC‰$‰øèAÿÿÿ„Àt‹C(‰F(‹C,‰F,‹C0‰F0°ƒÄ[^_Ãf‹V‰øèâiÿÿ‹V‰øèØiÿÿ1ÀƒÄ[^_ÃvUWVSƒì‰Å‹¸Ü ‹G‰D$…Àt~‹E‰D$‹@‰$…À~4‹]H‹O 1À1Ò‰|$ v‹4‹|‰4‰|‹t‰tBƒÀ;$uá‹|$ ‹D$‹P$…Ò~.1Û1ö‰$‰Ã‹ $O‹$UT1ÀèÿÿÿFƒ$49s$ã‹G‰D$‹‰…Ü ‹D$ƒÄ[^_]ÃUWVSƒì‰D$‰Ó‹‰$‹‰T$ ‹€Ü …À„ª‹h…턳‰]…Û„€‹D$ ‹@‰D$…À~-‹] ‹$‹JH1À1Ò‹4‹|‰4‰|‹t‰tBƒÀ;T$uà‹L$ ‹Y$…Û~91Û1ö‰Ïë FƒÃ49w$~'‰Ù‹$HT‹UÚ‹D$è5þÿÿ„ÀuÝ1ÀƒÄ[^_]Ãv‹$‰ªÜ °ƒÄ[^_]Ë$‹¨Ø …í…Pÿÿÿvº‹D$èªÀÿÿ‰Å…Àt·‹T$ ‹B@Áâ‹D$èŽÀÿÿ‰E ‹L$ ‹A$@Áâ‹D$èrÀÿÿ‰E‹U …ÒtQ…ÀtM‹L$ ‹A @Áá1ö‰×‰ðóª‹T$ ‹B$@ Áá‹U‰×‰ðóª‹$‹‚Ü ‰EÇE…Àt/‰hé¬þÿÿ‹D$è’gÿÿ‹U‹D$è†gÿÿ‰ê‹D$è{gÿÿ1Àéÿÿÿ‹ $‰©Ø éwþÿÿfUWVSƒì‰Å‹D$0‹]8‰\$ 8L$8”D$ ‹½œ ‹2‹U4ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ërëC9ët¶ ‰ò‰øègÿÿ8D$ t鉨+D$ ƒÄ[^_]Ãv‹T$ ‚‹D$4,‚9ër ëƒÃ9Ýv‹ ‰ò‰øèâfÿÿ8D$ tè‰Ø+D$ ÁøƒÄ[^_]Ãv‹T$ B‹D$4,B9ër ëƒÃ9Ýv· ‰ò‰øè¡fÿÿ8D$ tç‰Ø+D$ ÑøƒÄ[^_]ÃvUWVSƒì‰Å‹D$0‹]8‰\$ 8L$8”D$ ‹½œ ‹2‹U4ƒú„‹ƒútFJt ƒÄ[^_]ÃvËl$ l$49ëwëK9ët¶Kÿ‰ò‰øè"fÿÿ8D$ tè‰Ø+D$ ƒÄ[^_]Ãf‹T$ ‚‹D$4,‚9ëw ëƒë9Ýs‹Kü‰ò‰øèåeÿÿ8D$ tç‰Ø+D$ ÁøƒÄ[^_]Ãf‹T$ B‹D$4,B9ëw ëƒë9Ýs·Kþ‰ò‰øè¤eÿÿ8D$ tæ‰Ø+D$ ÑøƒÄ[^_]ÃfUWVSƒì,‰D$‰Ë‹|$@€z.Av 1ÀvƒÄ,[^_]öJ.ÿ$\DödÇD$‰Ù‹D$+H@9ùv‰ù‰ß)ω<$‰Ù‹D$è¯}ÿÿ)ÉØë½ÇD$‰Ù‹D$+H@9ùv‰ù‰ß)ω<$‰Ù‹D$è;{ÿÿ)ÉØëÇD$‹D$‹HD)Ù9ùv‰ùÙ‰ $‰Ù‹D$èzÿÿ)Øé^ÿÿÿfÇD$‹D$‹HD)Ù9ùv‰ùÙ‰ $‰Ù‹D$è%|ÿÿ)Øé.ÿÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‰Ù+H@‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èè—ÿÿ)ÉØéØþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$èG•ÿÿ)ÉØéžþÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èy“ÿÿ)Øéfþÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‹@D)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèc’ÿÿ)ØéþÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$è3‘ÿÿ)ÉØéâýÿÿfŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$è—üÿÿ)ÉØé¦ýÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èaûÿÿ)ØénýÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$èÿÿ)Øé6ýÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‰Ù+H@‰L$9ùv‰|$‰Ø+D$‰D$‰\$ŠB/ˆ$‹L$‰ò‰èè=Žÿÿ)ÉØéàüÿÿŠJ/‹R(ÇD$‰Þ‹D$+p@9þv‰þ‰ß)÷‰|$‰$‹D$裌ÿÿ)ÉØé¦üÿÿfŠJ/‹R(ÇD$‹D$‹pD)Þ9þv‰þÞ‰t$‰$‹D$è‹ÿÿ)Øénüÿÿf‹J(‰L$‹D$‹p8‹h4ÇD$ ‹@D)Ø9øv‰ø؉D$‰\$ŠB/ˆ$‹L$‰ò‰èèÓ‰ÿÿ)Øé$üÿÿ‰Ú‹D$+P@9úv‰ú‰Ù)ÑÇ$‰Ú‹D$è·Cÿÿ)ÉØéöûÿÿf‹D$‹HD)Ù9ùv‰ùÙÇ$‰Ú‹D$è¹Bÿÿ)ØéÊûÿÿf‹D$‹P8‹p4ÇD$‰Ø‹L$+A@9øv‰ø‰ß)lj<$‰Ù‰ðèWˆÿÿ)ÉØéŽûÿÿf‰Ø‹L$+A@9ø†{ûÿÿ‰øétûÿÿ‹T$‹BD)Ø9ø†cûÿÿëæ‹D$‹P8‹p4ÇD$‹@D)Ø9øv‰ø؉$‰Ù‰ðè!‡ÿÿ)Øé.ûÿÿfUWVSƒì\‰D$LˆL$;‹*‹B‰D$4‹Z‹D$L‹‰D$,„Ét‹P`‰T$<‰×+x@9|$4~'1í‰èƒÄ\[^_]ËD$,‹@`‰D$<‹T$,‹zD)Ç9|$4Ù‹D$,‹€  ‰D$ ‹T$,‹r8‹‚œ ‹@4‰D$$‹D$LèÏ_ÿÿ‹D$,‹@4‰D$@ƒøƒÇD$@ÇD$(ôd9ß~‰ß‹D$@¯ÇèuŸÿÿ‰Ã…À„+‹T$,‹‹@8‹@ ‹¨‰D$H…À„9|$4‰ú÷Ú‰T$0f€|$;„Å‹D$0‰D$D…ÿ~91í‹T$<ЉD$‹D$è‰D$‰4$ÿT$ ‰$ÿT$$‰D$‰l$‰$ÿT$(E9ýuÔ‹D$@‰D$‰|$Ç$‰Ù‹T$H‹D$,èÒÍÿÿƒøte…ÀuOÿD$09|$4Žvÿÿÿ‰Å‰$ÿƒød‹D$Lè¢^ÿÿ‰èƒÄ\[^_]Äÿþÿÿƒ|$@t6ƒ|$@…þÿÿÇD$(dôdéèþÿÿv‰|$D1Àé8ÿÿÿ‰Å‹D$D‹T$,B`ë¡ÇD$(¼ôdé½þÿÿ1íë‰$ÿƒød‹D$Lè2^ÿÿ½þÿÿÿé)þÿÿWVSƒì‰Æ‰ÓƒùŽ¥¡0Äõd‰$ÿ@ƒødÇD$ Äõd‰$ÿ<ƒød‰Ç…Àth‹C‰G‰G ÇG‰wÇG8ƒÿ‹V …Ò~N‹CHèö¿ÿÿ‰G4…Àto‹V ‰W0‹C@‰G‹CD‰G€»- tD‹C`‰G ‹C\‰G$‹CL‰G(‹CP‰G,‰øƒÄ[^_ÃvÇG4ë»vuB‹=¬ƒødÿ‰øƒÄ[^_ËC\‰G ‹C`‰G$ëºf‹H‰…Àt1ÿë·v‹G‰<$ÿP1ÿë§v1Ò‰Èè‹Wÿÿ1ÿë—vWVSƒì‰×‹\$ ŠT$$ˆT$‹5¬ƒød9ót …É~;H ~€|$t21É1҉؃Ä[^_é‘^ÿÿDIýÇ‹x…ÿtÙ‹‹H‰ØƒÄ[^_ép^ÿÿÿ‰ðƒÄ[^_ÃVSS…ÒxU;P0P…Òt4\Rý‹p4Þ‹…Òx‹[…Ûx‹p‰Ù)ñ)ò‹@ [[^é)^ÿÿÿ‰ÈZ[^ËX‹H$)Ù‹P )Ú‹@ [[^é^ÿÿ1Ò¸òÿÿÿè°Vÿÿ1ɉÈZ[^ÃWVSƒì0‹t$@¡¬ƒød‰D$,D$,‰D$ÇD$ ÌõdÇD$dEöd‹D$H‰D$‹D$D‰$ÿˆ‚ød…ÀtD‹F0‰$ÿlƒød‰Ç…Àt4‹F0…À~-1Ûë v‰DŸ9^0~C‹L$,‰Ú‰ðèÿÿÿ…Àuå‹H‰…Àt 1ÿ‰øƒÄ0[^_ËG‰<$ÿP1ÿ‰øƒÄ0[^_ÃSƒì‰Ã‹‚¬ …Àt‰$ÿhƒød‹H‰…ÀtƒÄ[ËC‰$ÿPƒÄ[ÃfVSƒì$‹\$0‹C‹@0…ÀtA‹C,…Àx:‰D$Ç$ª5ödÿ˜ƒød‰Æ‰D$‹C‹@0‰$ÿ¨‚ød‹J‰…Òt…Àu ÿÀ‚ød¡¬ƒødÿƒÄ$[^Ãv‹V‰4$‰D$ÿR‹D$ëÒSƒì‰$ÿƒød‰Ãƒøÿt‰ØƒÄ[ÃÿÌ‚ød…Àtî1Ò¸ñÿÿÿèUÿÿëàUWVSƒì,‰Ã‰Ö‰ÍŠD$@ˆD$‰Èè°ÿÿÿ‰Çƒøÿt9…Àx‹9ø|‰øƒÄ,[^_]À|$t ‹|8…ÿàv¿ÿÿÿÿ‰øƒÄ,[^_]á̂ød‰D$ÿÐ…ÀtÍ‹‹5À‚ød‹@,…Àt;ÿÖ‰l$‹‹@,‰$ÿ8ƒød‰Ã…Àt!è3ÿÿÿ‰Ç‹H‰…Àt ƒÿÿu„ÿT$…À„xÿÿÿÿÖ¿ÿÿÿÿélÿÿÿv‹C‰$ÿPëÕWVSƒì‰Ã‰×‰Î‹B÷@Tt$S0CÇ$‰ùèÿÿÿ‰D$‰$ÿÖƒÄ[^_øóÿÿÿèTÿÿ1ÀƒÄ[^_ÃUWVSƒì,‰D$‰Ö‰L$‹j…íu ÇD$‹D$‰$ÿT$‰Ç‰øƒÄ,[^_]ÃýtK‰,$ÿlƒød‰Ç…Àtá…í~Ý1Ûë ‰DŸ C9ëtЋTž ‹L$‹D$èBÿÿÿ…Àuâ‹H‰…Àt%1ÿ‰øƒÄ,[^_]ËR ‹L$‹D$ƒÄ,[^_]éÿÿÿ‹G‰<$ÿP1ÿë€v¹œ3ôd‹T$‹D$é>ÿÿÿf¹°4ôd‹T$‹D$é*ÿÿÿf¹¨5ôd‹T$‹D$éÿÿÿf¹ :ôd‹T$‹D$éÿÿÿf¹´¡ôd‹T$‹D$éîþÿÿf¹(¢ôd‹T$‹D$éÚþÿÿf¹€¢ôd‹T$‹D$éÆþÿÿfWVSƒì‰Ã‰×‰ÎŠL$ ‹B÷@Tt$S0C¶É‰ $‰ùèuýÿÿ‰ñ‰Â‰ØƒÄ[^_éhûÿÿ¸óÿÿÿèvRÿÿ1ÀƒÄ[^_ÃUWVSƒì,‹D$@‰D$‹t$D‹n…íu‹ ¬ƒød1Ò‹D$ƒÄ,[^_]é"ûÿÿfƒýtS‰,$ÿlƒød‰Ç…Àt:…í~61Ûë ‰DŸ C9ët)‹Tž Ç$‹ ¬ƒød‹D$è9ÿÿÿ…ÀuÙ‹H‰…Àt01ÿ‰øƒÄ,[^_]ËV ÇD$@‹ ¬ƒød‹D$ƒÄ,[^_]éÿþÿÿv‹G‰<$ÿP1ÿëÅvUWVSƒì,‰D$ÿ¬‚ød‰Å…À„ËT$‹B‹@,…À„±‰$ÿ ƒød‰Ã…À„‘‹@…ÀŽÍ‹C ‹0…ött1ÿë…ÀxlG9{޲‹C ‹4¸…ötXÇ$‹ ¬ƒød‰ò‹D$èdþÿÿ…À„œ‰D$‰t$‰,$‰D$ÿ´‚ød‹T$‹ I‰ …Éu¦‹J‰$‰D$ÿQ‹D$…Ày•‹H‰…Àt/‹EH‰E…Àt 1í‰èƒÄ,[^_]ËE‰,$ÿP1í‰èƒÄ,[^_]Ãv‹C‰$ÿP‹EH‰E…ÀuÈëÒf‹H‰…Àu½‹C‰$ÿP벋H‰…Àu“‹F‰4$ÿPëˆUWVSƒì,‹t$@ÇD$nEöd‹D$D‰$ÿ4ƒød‰Å…À„«‹F0@‰$ÿlƒød‰Ç…À„‰‹F0…Àx*1Ûf‹ ¬ƒød‰Ú‰ðèùøÿÿ‰D$‰\$‰<$ÿtƒødC9^0}Ú‰ðèGþÿÿ‰Ã…Àt9‰D$‰|$‰,$ÿ$ƒød‹J‰…Òtc‹J‰…Òtt‹UJ‰U…Òt3ƒÄ,[^_]Ãv‹H‰…Àu ‹G‰<$ÿP‹EH‰E…Àtc1ÀƒÄ,[^_]ËU‰,$‰D$ÿR‹D$ƒÄ,[^_]Ãv‹S‰$‰D$ÿR‹D$‹J‰…ÒuŒ‹W‰<$‰D$ÿR‹D$‹UJ‰U…Ò…wÿÿÿ먋E‰,$ÿP1ÀƒÄ,[^_]ÃUWVSƒìL¡¬ƒød‰D$ûÿÿ1Ûééûÿÿvfƒ,ˆM‹O(‹W$„$‰D$‹CD‰D$‰4$‹t$D‹è/yÿÿ‰Æ…öˆ·u9|$@…0þÿÿ‹T$@‹…À„xŒ$ø‰ $‹Œ$‰ØèÝaÿÿ„À…äwFŠƒ- „À„Um;s@qùÿÿ1ÛéTûÿÿfÇD$‰,$‰ñ‰ú‰Øè¢]ÿÿ‰Æ9ÅŒ€úÿÿ1Ûé+ûÿÿ‹“  ‰T$l‹S8<ÀƒàHMÿ‰L$8NxA‰|$H‰\$P‰l$\‹|$l‰Õ‰Ãëv9t$8„YZÞx‰t$‰,$ÿ׃ø uä‹|$H‹\$P‹l$\FéúÿÿfÇD$‰,$‰ñ‰ú‰ØèÒYÿÿ‰Æ9Åðùÿÿ1Ûé›úÿÿÇD$‰,$‰ñ‰ú‰Øèî[ÿÿ‰Æ9ÅÈùÿÿ1ÛésúÿÿÇD$‰,$‰ñ‰ú‰Øè~Zÿÿ‰Æ9ÅŒ ùÿÿ1ÛéKúÿÿŠO/‹W(ÇD$‰l$‰4$‰Øèøpÿÿ‰Æ9Årùÿÿ1ÛéúÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@‰|$P‰Çë 9õ„@t$8‰t$‰$ÿ×8D$Huåé`ýÿÿŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@ ‰|$P‰Çë 9õ„t$8‰t$‰$ÿ×8D$Huåéýÿÿ„À„ˆ‹C<9Æý‹Cd9Æò1Ûémùÿÿv„À„<;s<„§øÿÿ1ÛéRùÿÿ‹‹  ‹S8<ÀƒàH‰D$8;s<„‚øÿÿ‰|$P‰\$H‰Ï‰Óë9õ„ˆXt$8‹T$H;r<„…X‰t$‰$ÿ׃ø uÙ‹|$P‹\$Hé@øÿÿ‹S8‹C4ÇD$‰,$‰ñèjÿÿ‰Æ9ÅŒøÿÿ1ÛéÉøÿÿvfƒ,y ;³ „øÿÿ‰,$‰ñ‰ú‹D$Dè}—ÿÿ‰Æ…À‰ç÷ÿÿ1Ûé’øÿÿ‹S8‹C4ÇD$‰,$‰ñèàhÿÿ‰Æ9ž÷ÿÿ1Ûéiøÿÿv‹O(‹S8‹C4‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8è\jÿÿ‰Æ9Å~÷ÿÿ1Ûé)øÿÿvŠO/ˆL$H<ÒƒâJ‰T$8‹ƒœ ‹@‰|$P‰Çë 9õ„Dt$8‰t$‰$ÿ×8D$HuåélûÿÿÇ$‰é‰ò‰Øè$ÿÿ‰Æ9ÅŒ÷ÿÿ1Ûé¿÷ÿÿ‹O(‹S8‹C4‰D$8ÇD$ ‰l$‰t$ŠG/ˆ$‹D$8èLpÿÿ‰Æ9ÅÖöÿÿ1Ûé÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè$oÿÿ‰Æ9ÅŒ¦öÿÿ1ÛéQ÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè”Úÿÿ‰Æ9ÅŒvöÿÿ1Ûé!÷ÿÿvŠO/‹W(ÇD$‰l$‰4$‰ØèhÙÿÿ‰Æ9ÅFöÿÿ1ÛéñöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øèìqÿÿ‰Æ9ÅŒöÿÿ1ÛéÁöÿÿvŠO/‹W(ÇD$‰l$‰4$‰Øè(pÿÿ‰Æ9Åæõÿÿ1Ûé‘öÿÿvŠW/ˆT$H<ɃáI‰L$8‹ƒœ ‹@‰|$P‰Çë 9õ„¤t$8‰t$‰$ÿ×8D$HuåéÔùÿÿŠW/ˆT$H<ɃáI‰L$8‹ƒœ ‹@‰|$P‰Çë 9õ„Xt$8‰t$‰$ÿ×8D$HuåéùÿÿŠO/‹W(ÇD$‰l$‰4$‰ØèXjÿÿ‰Æ9ÅŒ.õÿÿ1ÛéÙõÿÿvÇ$‰é‰ò‰Øè&!ÿÿ‰Æ9Åõÿÿ1Ûé³õÿÿŠO/‹W(ÇD$‰l$‰4$‰Øè¬hÿÿ‰Æ9ÅÚôÿÿ1Ûé…õÿÿv‰Æ9C@ŽÅôÿÿ1Ûépõÿÿf‹„$ø‰ñ‹´$üéþ÷ÿÿv‹l$4‰u`»‰ØÄ,[^_]Ãv‰Œ$é`õÿÿ1Ûé'õÿÿ‹s<9sD„hôÿÿ1Ûéõÿÿ…ö„Xôÿÿ1Ûéõÿÿ‹Cd9Æ~‹C<9Æ~ 1Ûéíôÿÿv‰Æ9CD-ôÿÿ1ÛéØôÿÿf9ÆŽ›÷ÿÿ1ÛéÇôÿÿ1Ûé¿ôÿÿ1Ûé·ôÿÿ1Ûé¯ôÿÿ1Ûé§ôÿÿ1ÛéŸôÿÿ1Ûé—ôÿÿ1Ûéôÿÿ;³ …§øÿÿ‹ƒ$ ‰„$é½øÿÿf;³ …·öÿÿ‹ƒ$ ‰„$éÍöÿÿ‹K`‹C@‰$‹D$Dè ÿÿ…Àˆ¬q‰ƒ ‹–€‰Á+J$‰‹$ ‹V|…ÒˆØõÿÿ‹C`9ÂÎõÿÿ‰Ðé¸ñÿÿ‹K`‹CD‰$‹D$Dè(„ÿÿ‰Â…ÀˆSq‰“ ‹†€‹@$Љƒ$ ‹F|…Àˆ†õÿÿ)‹C`9ÂŒ|õÿÿ‰Ðéuõÿÿ‹J(‹R$„$‰D$‹C@‰D$‹C`‰$‰Øègrÿÿ…Àˆþp‰ƒ ‹”$‰“$ ‹V|…Ò‰Oÿÿÿé"õÿÿ‹J(‹R$¼$‰|$‹CD‰D$‹C`‰$‰Øè³pÿÿ…Àˆ™p‰ƒ ‹”$‰“$ ‹V|…Òˆ×ôÿÿ)Љ‹C`9ÂŒËôÿÿ‰ÐéÄôÿÿ‹K`‹CD‰$‹D$DèÅ~ÿÿ‰Â…À‰ýþÿÿ1ÛéÚòÿÿ‹K`‹C@‰$‹D$D袑ÿÿ…Àˆ‡o‰ƒ ‹–€‰Ç+z$‰»$ ‹V|…Ò‰Šþÿÿé]ôÿÿ‹„$9D$XŒ/`öA- … b‹…( @f‰…( f…À„q<‹•| ‹‚ H ÀЉ„ €{ ]†r-»ÿÿÿÿ‰ØÄ,[^_]Ë„$‰D$‰,$‹\$hÿS‹”$:B/„¿cöB- t‰Œ$„$‰$‹T$d‹D$Dè˜ÿÿ„À„°p‹„$…À…òÿÿéOÿÿÿv‹„$9D$p]öA- „1ÿÿÿŒ$ÇD$„$‰$‹T$d‹D$Dès–ÿÿ„À„ p‹„$…À…¤ñÿÿéïþÿÿv‹„$9D$XŒËXöA- „ÑþÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè–ÿÿ„À„æo‹„$…À…Dñÿÿéþÿÿv‹„$‰D$‰,$‹t$hÿV‹”$:B/„öaöB- „]þÿÿŒ$„$‰$‹T$d‹D$Dèë–ÿÿ„À„ln‹„$…À…Øðÿÿé#þÿÿv‹„$‰D$‰,$‹\$hÿS‹”$:B/„{böB- „ñýÿÿŒ$„$‰$‹T$d‹D$Dè–ÿÿ„À„>n‹„$…À…lðÿÿé·ýÿÿv‹„$‰E`‹S(¹‹D$DèeÙÿÿƒøŒ¦m„Šýÿÿ‹E`‰„$‹„$‹‰„$éðÿÿ‹„$‰E`‹C(‹8‹X‰\$4‹H‹D$D‹‹s`‰ò+S@9T$4:ýÿÿ‹ƒ¨ ‰D$L‹C8‰D$8‹D$D‰T$0‰L$,è@9ÿÿ‹‹@8‹@ ‹¸‰D$<…À‹T$0‹L$,„Kg‰Ï9Ñ~‰×9|$4+g)þ‰l$Hë^v‹T$8‰$ÿT$L‰é‰úèd/ÿÿ‰Å…í„g‰l$‹D$<‰$ÿPƒød‹MI‰M…É„ŸNƒø„ñN…À…ÈnOF9|$4Áf€»* ‹k4‰t$u•‹L$8‰ $ÿT$L‰é‰úè ¤ÿÿ‰Å듺‹D$Dè3‘ÿÿ„À„~k‹„ ÇD$…° ‰D$‰$èo¸‹„$‹@(‹‰C‹„$‰C•´ ¹1À‰×óªÇ…Ä ‹„$‰…° ‹‰„$é„îÿÿ‹„$‰D$‰,$‹t$hÿV‹”$:B/„ó^öB- „¥ûÿÿŒ$„$‰$‹T$d‹D$Dè3”ÿÿ„À„|l‹„$…À… îÿÿékûÿÿv‹C(‹0‹]Tº‹D$Dè:ÿÿ„À„Ojv†ƒ‹…„ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹… ‰C0‹”$‹B(‹x…ÿ… (1ÿ‹@…À„¥X1À‰ú„Ò„TS„À…Óe‹„$ø‰„$‹„$ü‰„$ébíÿÿ‹C(‹0‹‹D$DèÊÍÿÿ„À„¦j‹]‹K…É~$‹EH1ÒvÇÿÿÿÿÇ@ÿÿÿÿÇ@ÿÿÿÿBƒÀ9Êuä‹K$…É~)‹ET1ÒÇ@Ç@ ÿÿÿÿÇ@Ç@ ÿÿÿÿBƒÀ49ÊuÜ‹\$T‹CX‹ð‹‰„$º‹D$Dèÿÿ„À…Ãìÿÿ»ðÿÿÿé‡ìÿÿ‹„$9D$XŒÛTöA- „íùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè/‘ÿÿ„À„Žk‹„$…À…`ìÿÿé«ùÿÿv‹„$9D$XŒŒUöA- „ùÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèÏÿÿ„À„4j‹„$…À…ìÿÿéKùÿÿv‹´$Œ9´$„§\öC- „*ùÿÿŒ$„$‰$‹T$d‹D$D踑ÿÿ„À„Oi‹„$…À…¥ëÿÿéðøÿÿ‹„$;„$Œ„~Q;Ed„uQöC- „ÉøÿÿŒ$„$‰$‹T$d‹D$DèW‘ÿÿ„À„j‹„$…À…Dëÿÿéøÿÿv‹„$9D$XŒ¬VöA- „qøÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè³ÿÿ„À„Ti‹œ$…Û…äêÿÿé/øÿÿvº‹D$Dèÿÿ„À„@g‹…„ Š•2 ˆP‹…„ ‹• ‰‹D$Dèü”ÿÿ„À„g‹| ‹» ‰|$4‹µŒ ‰t$<Š…0 ˆD$L‹½Ü ‹„$‰E`Æ…0 ‹„$‹PÇ$1É‹D$DèIæÿÿ‰Æ…Àˆ#g‹„$‹P(‰èè^ÿÿ‰½Ü ŠT$Lˆ•0 ‹|$<‰½Œ ‹|$4‰» ‰| N…E÷ÿÿ‹„$‹‰„$‹E`‰„$éÖéÿÿ‹C(‹D@ý‹UH‹H…Ɉ^Z‹‰„$é®éÿÿ‹D$Dè”ÿÿ„À„f‹µ ‰t$8‹| ‹» ‰|$4‹µŒ Š…0 ˆD$<‹½Ü ‰|$LÇE@‹„$Œ‰ED‹„$‰E`Æ…0 Š•2 ˆT$H‹„$‹PÇ$1É‹D$Dè)åÿÿ‰Ç…Àˆve‹„$‹P(ƒÂ‰èè;ÿÿ‹L$p‰MD‹D$X‰E@‹T$L‰•Ü ŠL$<ˆ0 ‰µŒ ‹D$4‰ƒ ‰| ‹„$€x/„NO„÷c‹E‹X…Û„õõÿÿ‹‰…Œ éèõÿÿ‹„$9D$pïVöA- „ÍõÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèÿÿ„À„f‹”$…Ò…@èÿÿé‹õÿÿv‹C(‹D@ý‹UH‹x…ÿˆnõÿÿ‹p<þ‹\$h‹[8‰\$4‹„$ …ÀˆbN‹„$‰D$‹t$|‰4$ÿT$t”$܉T$‰$ÿT$4‰Ã‹„$ ‰D$‰4$ÿT$t”$ì‰T$‰$ÿT$4‰Æ‹”$ ‹„$;W 9Ë„$9D$pØ@1ÛÇ„$;´$Ž47‹„$9Ã~‹”$‹Œ”ì9Œ„Ü„À@‹„$ö@- „!\Œ$ÇD$”$‰T$‰t$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$DèΉÿÿ„À„¼[€¼$„¨Z‹„$9à …Û~ÿ„$‹”$ ;´$þþÿÿB‰”$ ;WŒöþÿÿÇ„$ ÿÿÿÿ9ÃÊóÿÿ9´$Œ½óÿÿ‹„$‹‰„$éXæÿÿ‹C(‹D@ý‹]HËp…öˆŽóÿÿ‹P4ò‹\$h‹[8‰\$4‹Œ$ …ɈêL‹„$H‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰Ã‹„$ H‰D$‹|$|‰<$ÿT$t”$܉T$‰$ÿT$4‰Ç‹”$ ‹„$f;ŽAX…Àް5‹„$…ÀŽ,?‹„$…À~H‹”$J‹Œ”Ü9Œ„ì„97‹„$ö@- „,ZŒ$ÇD$ÿÿÿÿ”$‰T$‰|$”$‰T$”$ ‰T$ ‰\$”$‰T$‰$‹T$d‹D$Dèý‡ÿÿ„À„áY€¼$„Z‹„$…ÀŽ5‹”$ ‹Œ$…ÉÿÿÿJ‰”$ é ÿÿÿ‹„$;„$Œ„oG‰D$‹\$|‰$ÿT$tƒø „PG‹„$ö@- „ØñÿÿŒ$„$‰$‹T$d‹D$DèfŠÿÿ„À„ãc‹”$…Ò…Säÿÿéžñÿÿf‹„$‰D$‰,$‹t$hÿV(„À‹„$„H‹‰„$éäÿÿ‹C(‹0Ç$‹Œ$‰ò‹\$D‹èBdÿÿ„À…Bñÿÿ‹œ$‹C(‹P‹Œ$‹{…Ò…[1ÿ;x‚]‹”$¯{ ú‰”$‹‰„$é¦ãÿÿ‹C(‹0‹]Tº ‹D$DèÈ…ÿÿ„À„j`v†ƒ‹…„ ‰p‹S(‰P ‹S,‰P‹S0‰P‹Œ$‰HÇC(‰K,‹… ‰C0‹”$‹B(‹x…ÿ…j1ÿ‹@…À„rM1À‰ú„Ò„¹H„À…´[‹„$‰„$‹„$‰„$éðâÿÿ‹s,‹¼$f…öˆùS‹[$‰ø+D$X‰D$4…Û„ÈHƒû†±Tº«ªªª‰Ø÷âÑê;T$4~ æ „òïÿÿ‹t$h‹v8‰t$4‹„$ …Àˆ7IO‰|$‹\$|‰$ÿT$t”$܉T$‰$ÿT$4‰Æ‹„$…ÀŽg[‹Œ$‹”$ ‹Y(¼$Ü…ÒŽ$R…ÀŽ8;‹T“ü‰T$‹„„؉D$‹D$h‰$è…<ÿÿ„À„ ,‹”$ J‰”$ ‹„$H‰„$…À§ÿŒ$ëž‹C,‹Œ$f…Àˆ´R‹S$+L$X9Ê~ öÄ „ïÿÿ‹„$ …Àˆ¶T‹[(…À~x‹”$9T$XŒÀ0‹„$ö@- „óUÇD$ ÿÿÿÿ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$DèJŠÿÿ„À„ÖU€¼$„¸U‹„$ …Àˆ‹œ$Ç„$ ÿÿÿÿ‹‰„$éáÿÿ‹C,‹Œ$f…ÀˆŽP‹S$+L$X9Ê~ öÄ „.îÿÿ‹„$ …Àˆ T‹[(ëef‹„$ö@- „ÛTÇD$ ÿÿÿÿ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$D膉ÿÿ„À„”T€¼$„ T‹„$ …ÀŽS‹„$9D$X}ˆH‰D$‹t$|‰4$ÿT$t‹”$ J;“…gÿÿÿ‰Ð‰”$ ÿŒ$븋„$;„$Œ„F;Eh„FöC- „FíÿÿŒ$„$‰$‹T$d‹D$DèÔ…ÿÿ„À„•^‹„$…À…Áßÿÿé íÿÿ‹„$‰D$‰,$‹\$hÿS ‹”$:B/„PNöB- „ÝìÿÿŒ$„$‰$‹T$d‹D$Dèk…ÿÿ„À„6^‹„$…À…Xßÿÿé£ìÿÿv1Ò‹D$D轿ÿÿ„À„U\º ‹D$Dègÿÿ„À„5\‹„$‹‰„$éßÿÿ‹„$9D$pFöA- „GìÿÿŒ$ÇD$„$‰$‹T$d‹D$D艃ÿÿ„À„ü]‹”$…Ò…ºÞÿÿéìÿÿ‹„$9D$p^LöA- „éëÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè+ƒÿÿ„À„®\‹„$…À…\Þÿÿé§ëÿÿv‹„$9D$XŒâJöA- „‰ëÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$DèË‚ÿÿ„À„Š\‹„$…À…üÝÿÿéGëÿÿv‹C(‹‰T$8‹@‰D$4‹uHºV‹D$Dè €ÿÿ„À„[‹T$8|Rýþ‹…„ ‹L$8‰H‹L$4‰H ‹J‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9Btÿ… ‰B‹A(‹X…Û…™K‹‰„$éNÝÿÿ‹C(‹0v†‹MT™‹K,ÇD$Ç$‰ò‹D$Dè4žÿÿ„À„æY‹C(@‰C(‹½ ‹”$9{0„‰N‹J(‹y9ø‚«G„¤1ÿ‹A9C(‚\Y‹Œ$ƒÂ„$ø‰$‰èèíBÿÿ„À•Á‰ú„Ò…z?„É…r?ÿK(éîéÿÿ‹¼$…ÿ…A‹‰„$éÜÿÿ‹„$‰D$‰,$‹\$hÿS‹”$:B/„¨KöB- „¢éÿÿŒ$„$‰$‹T$d‹D$Dè0‚ÿÿ„À„ÓZ‹œ$…Û…Üÿÿéhéÿÿ‹C,‹”$f…ÀˆK‹s$‹|$p)×9þ~ öÄ „?éÿÿ‹„$ …ÀˆàN‹[(ëfv‹„$ö@- „ÑOÇD$ ”$‰T$”$ ‰T$‰$Œ$‹T$d‹D$Dè–„ÿÿ„À„ŠO€¼$„lO‹„$ 9ÆŽaN‹„$9D$p~ˆ‰D$‹D$|‰$ÿT$t‹”$ ;“…iÿÿÿB‰„$ ÿ„$빋s,‹¼$‰|$}ÿÿ„À„µT‹Œ$…É…+×ÿÿéväÿÿf‹„$9D$pŽ+<@‰„$‹‰„$éýÖÿÿ‹„$9D$X/;H‰„$‹‰„$éÖÖÿÿ‹„$‰E`‹C(‹8‹X‰\$4‹P‹D$D‹‹s`‰t$<‹sD+t$<9t$4ïãÿÿ‹ƒ¨ ‰D$L‹K8‰L$8‹D$D‰T$0èùÿÿ‹‹@8‹@ ‹¸…À‹T$0„M‰×9ò~‰÷9|$4€N‰l$H‰Æë^‹D$<‰D$‹T$8‰$ÿT$L‰é‰úè ÿÿ‰Å…í„ÈL‰l$‰4$ÿPƒød‹MI‰M…É„u5ƒø„‚5…À…°UO9|$4N€»* ‹k4u–‹L$<‰L$‹D$8‰$ÿT$L‰é‰úèÆŠÿÿ‰Å딄$ø‰$‹Œ$‰Ú‰èèÜ;ÿÿ„À…˜?‹„$‹@‰„$éŽÕÿÿ‹¼$‹D$D‹0ºTè¯wÿÿ„À„Z9‹†„ ‰x‰Ç@Š–2 ˆP‰X ‹C(‹P 9–¼ r!‹H9ޏ r‹X9ž´ r ‹x9¾À sƆ2 €½2 „™:Æ…2 éRâÿÿ‹„$9D$XŒý@öA- „7âÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dèyyÿÿ„À„èR‹„$…À…ªÔÿÿéõáÿÿ‹„$9EX„EE€½3 t!€¼$‰u€½- „È:9D$X…ºáÿÿ‰E`»é+Ôÿÿ‹„$9D$p\=öA- „‘áÿÿŒ$ÇD$„$‰$‹T$d‹D$DèÓxÿÿ„À„S‹„$…À…ÔÿÿéOáÿÿv‹„$…À…|=‹‰„$éßÓÿÿ‹„$‰D$‰,$‹t$hÿV$„À‹„$„8‹‰„$é­Óÿÿ‹C(‹0‹}TÇ$‹Œ$‰ò‹\$D‹èÒSÿÿ„À…Òàÿÿ‹„$‹P(‹J‰L$8‹Œ$‹X‰\$4ƒ|$8…1J1Û;Z‚˜G‰|$4‹|$Dë&v…Û„|GK‹„$‹P(‹Œ$9Z‡hG‹@ ¯ÃÁÇ$‰ò‹èMSÿÿ„ÀuÁ‹|$4ºX‹D$Dè'uÿÿ„À„RQv†‡‹•„ ‹Œ$‰ ‰r‹p,‰r‹p(‰r ‹”$‰P,‰X(¯Y Ú‰”$‹‰„$é˜Òÿÿ‹C(‹D@ý‹UH‹p…öˆÎßÿÿ‹x4÷‹UD‹„$öC- u)‹F+9ÂŒ©ßÿÿ‹„$ …Àˆ;H;F}y‹\$p;œ$œ#‹„$ö@- „+IÇD$ ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$Dèòzÿÿ„À„ÖI€¼$„¸I‹„$ ;F|‡Ç„$ ÿÿÿÿ‹„$‹‰„$é¬Ñÿÿ‹C(‹D@ý‹uHÆ‹p…öˆâÞÿÿ‹H4ñ‹”$‹E@öC- u)‹F+9ÂŒ½Þÿÿ‹„$ …Àˆ­F;~x‹\$X;œ$ŒQ"‹„$ö@- „dHÇD$ ÿÿÿÿ¼$‰|$”$ ‰T$‰$Œ$‹T$d‹D$Dèzÿÿ„À„ÑH€¼$„³H‹„$ ;ˆÇ„$ ÿÿÿÿ‹„$‹‰„$éÂÐÿÿ‹„$9D$XŒ…8öA- „÷ÝÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè9uÿÿ„À„¶O‹¼$…ÿ…jÐÿÿéµÝÿÿ‹„$9D$p±<öA- „™ÝÿÿŒ$ÇD$„$‰$‹T$d‹D$DèÛtÿÿ„À„TN‹´$…ö… ÐÿÿéWÝÿÿv‹C(‹‰T$8‹@‰D$4‹uHº]‹D$Dèrÿÿ„À„ÎL‹T$8|Rýþ‹…„ ‹L$8‰H‹L$4‰H ‹ ‰‹Œ$‹q(‹v‰óˆX‹r‰pÁç‹t$T~L‹„$€t 9tÿ… ‰‹A(‹@…À…x7‹‰„$éaÏÿÿ‹C,‹”$f…Àˆ @‹s$‹|$p)×9þ~ öÄ „ˆÜÿÿ‹„$ …ÀˆIB‹[(9Æ~x‹”$9T$p‘‹„$ö@- „¼CÇD$ Œ$‰L$”$ ‰T$‰$Œ$‹T$d‹D$DèÏwÿÿ„À„uC€¼$„WC‹„$ 9ƈ‹œ$Ç„$ ÿÿÿÿ‹‰„$éŠÎÿÿ‹C(‹0v†‹}TŸ‹K,ÇD$Ç$‰ò‹D$Dèpÿÿ„À„,K‹C(@‰C(‹• 9S0„ã?‹”$‹R(‹J9È‚/@A„(@ÆD$4‹B9C(r#‹Œ$Ç$‰ò‹|$D‹èBNÿÿ„À„„1É€|$4…F/„É…>/ÿK(é%Ûÿÿ‹…Ü ‹XºY‹D$Dèöoÿÿ„À„zJ‹…„ ‰‹• ‰P…Û„‚-‰œ$‹D$Dèéwÿÿ„À„§J‹D$D‹‰D$L‰Ã‹‹@$‰D$4…À„]-‹³” …ö„ÐG‹~‰|$<…ÿ„×G‹D$4…ÀŽÊ@1Û1ö‰l$8‹l$L‹|$<ëFƒÃ4;t$4„¥@‹MTÙ‹WÚ‹D$Dèc¬ÿÿ„ÀuÛ»÷ÿÿÿéËÌÿÿ‹„$9D$XŒ¯7öA- „2ÚÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dètqÿÿ„À„£L‹¼$…ÿ…¥ÌÿÿéðÙÿÿ‹„$9D$pR8öA- „ÕÙÿÿŒ$ÇD$„$‰$‹T$d‹D$Dèqÿÿ„À„àJ‹”$…Ò…HÌÿÿé“Ùÿÿv‹„$9D$p­4öA- „uÙÿÿŒ$ÇD$„$‰$‹T$d‹D$Dè·pÿÿ„À„L‹„$…À…èËÿÿé3Ùÿÿv‹„$‰E`‹C(‹‹p‰´$”‹p‹D$D‹‰„$œ‹x`‰¼$˜‰ù+H@‹„$”…À„}/ƒ¼$”†i=º«ªªª‹„$”÷âÑê9ÊÃØÿÿ‹¼$œ‹¿  ‰|$\‹¼$œ‹8‰|$l‹¼$œ‹‡œ ‹@8‰„$€‹4‰¼$ ƒÿƒx-Ç„$ Ç„$¨¤ôdÇD$Lôd‰t$H‹D$DèwÿÿƒÆ‰´$„‹„$ ¯Æè:Tÿÿ‰Æ…À„7J‹¼$œ‹‹@8‹@ ‹˜‰„$¤…À„J‹T$H9”$”‹œ$˜)Ó‰\$Pœ$܉¬$¬v‹¼$˜9|$P»0‹l$H…í޶0‹¼$˜ÇD$<O‰|$‹l$l‰,$ÿT$\‰\$‰$ÿ”$€‰D$4D$<…À~3‹”$„+T$<1í‰|$8‰×‹«‰D$/‰D$‰4$ÿT$LE;l$4uä‹|$8;|$Pt ‹T$H9T$<|“‹l$<9¬$” ‹T$H9ÕŽ,*‹D$<;D$H~‹D$HG‰|$PH‰D$H‹l$H9¬$”Ž%ÿÿÿ‹¬$¬‰4$ÿƒød‹D$DèðÿÿéãÖÿÿ‹„$‰E`‹S(1É‹D$Dè—²ÿÿƒøŒoF„¼Öÿÿ‹E`‰„$‹„$‹‰„$éMÉÿÿ‹„$9D$p2öA- „‚ÖÿÿŒ$ÇD$„$‰$‹T$d‹D$DèÄmÿÿ„À„I‹„$…À…õÈÿÿé@Öÿÿ‹„$‰E`‹C(‹‹p‰´$€‹p‹D$D‹‰„$”‹x`‰¼$„‹HD)ù‹„$€…À„å,ƒ¼$€†ƒ:º«ªªª‹„$€÷âÑê9ÊÓÕÿÿ‹¼$”‹¿  ‰|$P‹¼$”‹8‰|$\‹¼$”‹‡œ ‹@8‰D$l‹4‰¼$˜ƒÿƒÅ*Ç„$˜ÇD$<ôd‰t$8‹D$Dè•ÿÿ‰ðƒÀ¯„$˜è_Qÿÿ‰Ç…À„ìE‹´$”‹‹@8‹@ ‹˜‰„$œ…À„ËE‹T$89”$€á”$„‰T$Hœ$܉¬$ f‹l$H9¬$„Õ-‹D$8…ÀŽÉ-‹¬$„1öf‰l$‹L$\‰ $ÿT$P‰\$‰$ÿT$l‰D$4…À~,1Ò‰l$L‰õ‰Ö‹³‰D$.‰D$‰<$ÿT$‰´$9D$H‡:@‹S‹t$<‰V,‹S ‰V(‹•| ‹Š I‰Š …Éu‹’ …Òt‰•| 9D$H‚ºÏÿÿ‹„$‹‰„$éUÂÿÿ‹3‰ò‹D$Dè¿¢ÿÿ…ötN‰èèïþÿ‹C‰… ‹E‹@$‰D$4ƒøt/‹½” ~1Û1ö‹OÙ‹UTÚ1Àè_¡ÿÿFƒÃ4;t$4u勉…” ‹…| ‹ J‰ …Ò…*Ïÿÿ‹€ …À„Ïÿÿ‰…| éÏÿÿ‹‰„$‹S R ŠÁá‹uTñ‰L$4‹y,‰¼$‹q(‰t$<‹p ‰t$8‹t$<¯t$8þ‹@(‹@‰D$LÇD$Ç$‰ñ‹D$Dèo‚ÿÿ„À„u8‹”$‹B(‹L$<9H„‹L$L¯L$8ù‰L$<‹zŠO/ˆL$H‹‰D$LöG- „O‹|$8÷߉|$H‰÷+|$8´$ø‰l$\‰\$P‰óë9|$<„¢‹”$|$H‰þ‰$‰ù‹D$\èû&ÿÿ„Àt×Ç$‰ù‹T$L‹l$D‹Eèö@ÿÿ„Àuº‹l$\‹\$P‰ò+”$ˆÛ5‹¼$‰|$8‹G(;P‡é=‹K‹|$4‰O,‹[ ‰_(‹| ‹» O‰» …ÿu‹› …Ût ‰| ‹\$8‹C(;P‚…Íÿÿ‹L$8‹‰„$‰´$éÀÿÿ‹MH‹CH@Ñ€{t‹s tvý ñ‹q…ötN‰q@Áà‹t$TFL€x‹t 9Btÿ ‹‰B‹C‰B‹…| ‹ J‰ …Ò…þÌÿÿ‹€ …À„ðÌÿÿ‰…| éåÌÿÿ‰èèiìþÿŠCˆ…2 ‹‰… ‹…| ‹ J‰ …Ò…±Ìÿÿ‹€ …À„£Ìÿÿ‰…| é˜Ìÿÿ‰èè Ÿÿÿ‹…| ‹ J‰ …Ò…vÌÿÿ‹€ …À„hÌÿÿ‰…| é]Ìÿÿ‹}T‹s‹KÇD$Ç$‰ò‹D$Dèýÿÿ„À„ù5v†‡‹S ‰P(‹S‰P,‹S‰P0‹…| ‹ J‰ …Ò…ûËÿÿ‹€ …À„íËÿÿ‰…| éâËÿÿfÇD$‰\$…° ‰$舋…| ‹ J‰ …Ò…«Ëÿÿ‹€ …À„Ëÿÿ‰…| é’Ëÿÿf‹K4I ±‹uT Ž‹s ‰q(‹s‰q,‹[‰Y0‰‚ …À…aËÿÿ‹‚ …À„SËÿÿ‰…| éHËÿÿ‹D$D‹‹ƒ° ‹@(‰D$4‹³„ ‹N‰L$L‹>‰|$8‹F‰„$¼¾F‰D$P‰„$ľF‰„$ȾF‰„$Ô¾N‰Œ$ÀÿŒƒ´ ÿ‹À ‹T$4|‚‹)“Ä ÿ‹Ì ‹?)»Ð €¼$Š„ó ‹|$L;{X•D$HŠT$HˆT$<ŠT$Hˆ”$Ø…ÉŽ´‹T$P…Ò• T$<ˆ”$Øëf”$°‰Øè?ÿÿ„À‹„$Ô…+ @‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$ ÿÿÿÿéÊÿÿv‹D$D‹‹ƒ° ‹x(‹³„ ‹N‰L$<‹‰L$L‹N‰L$8¾F‰D$4‰„$ľF‰„$ȾF‰„$̾F‰„$Ô¾V‰”$ÀÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Št ‹L$<;KX„Ⲉ”$Øë v”$°‰Øèv>ÿÿ„À‹„$Ô… @‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$ ÿÿÿÿéûÈÿÿv‹D$D‹‹ƒ° ‹x(‹³„ ‹V‰T$4‰”$´‹‰L$<‹F‰„$¼¾F‰„$Ô¾V‰”$ÀÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„Î‹T$4;SX•ˆ”$Øë v”$°‰Øèš<ÿÿ„À‹„$Ô…ó@‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$ ÿÿÿÿéÈÿÿv‹D$D‹‹ƒ° ‹x(‹³„ ‹N‰L$4‹öA-@„‹C@‰D$<ÇD$Lÿÿÿÿº‰Ø‰L$,è‘èþÿ„À‹L$,„u‹D$<9D$4„gÿF‹“¸ B‰“¸ ‹ƒÀ @‰D$<‰ƒÀ ‹GƒÄ ÿƒÌ ‹GƒÐ ŠFˆƒ2 ‹F ‹@(‹x 9»¼ r;Pr‹P9“´ r ‹|$<;xs vƃ2 ‹D$L¯FD$4‰„$‰Œ$€½2 „=Æ…2 éöÆÿÿf‹K‹SÇD$Ç$‹D$Dèšzÿÿ„À„:1‹…| ‹ J‰ …Ò…³Æÿÿ‹€ …À„¥Æÿÿ‰…| éšÆÿÿf‰èè ™ÿÿ‹…| ‹ J‰ …Ò…vÆÿÿ‹€ …À„hÆÿÿ‰…| é]Æÿÿ‹D$D‹‹ƒ° ‹x(‹³„ ‹F‰„$´‹‰”$°¾F‰„$ÔöB-@„{Ç„$Àÿÿÿÿ‹S@‰”$¸…Àx'ÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„y‹SX9”$´•ˆ”$Øë v”$°‰Øèš9ÿÿ„À‹„$Ô…@‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$éWÅÿÿv‰èèÙäþÿŠCˆ…2 ‹‰… ‹…| ‹ J‰ …Ò…!Åÿÿ‹€ …À„Åÿÿ‰…| éÅÿÿ‹ ‰Œ$‹K‰Œ$‰‚ …À…—·ÿÿ‹‚ …À„‰·ÿÿ‰…| é~·ÿÿf‹D$D‹‹ƒ° ‹x(‹³„ ‹V‰T$4‰”$´‹‰„$°¾F‰„$Ô¾V ‰”$ÀÿŒƒ´ ÿ‹À T‡‹ )‹Ä ÿ‹Ì ‹)“Ð €¼$Š„õ‹T$4;SX•ˆ”$Øëf”$°‰Øè¶7ÿÿ„À‹„$Ô…'@‰„$Ôƒø~Ö‹ƒ| ‹ J‰ …Òu‹€ …Àt‰ƒ| Ç„$éßÃÿÿv€¼$Š„3.‹M\‰Œ$€½- „/‹D$X9È„\-‹T$@ŠB.‰ñ‰ú‰èèáÿÿ„À„á F9óuèÇ$‰ñ‹T$P‹\$D‹èÔ+ÿÿ„À„û;t$4|•é·þÿÿ‹T$8‹B(‹‹L$49L$X| ‹T$XB‰T$49t$4ÿöÿÿ‰l$L‹l$h‰|$8‰Ç‰\$lë v;t$4„¹‰ñ‹T$8‹D$LèSÿÿ„À„¢NFÿ‰D$‹\$|‰$ÿT$t‰|$‰D$‰,$èpÿÿ:D$\u¶Ç$‰ñ‹T$P‹\$D‹è"+ÿÿ„Àuš‹l$L‹\$léþçÿÿ‹T$8‹B(‹‹L$49L$p ‹T$pJ‰T$49t$4ŽOöÿÿ‰l$L‹l$h‰|$8‰Ç‰\$lë v;t$4„ ‰ñ‹T$8‹D$Lè£ ÿÿ„À„ò F‰t$‹\$|‰$ÿT$t‰|$‰D$‰,$èÃÿÿ:D$\u¹Ç$‰ñ‹T$P‹\$D‹èu*ÿÿ„ÀuéNÿÿÿ‹L$8‹A(‹‰D$L‹D$49D$p ‹T$pJ‰T$49t$4ަõÿÿ¶L$\‰L$8‰|$l‰\$\‹\$|ë v;t$4„ýÿÿ‰ñ‹T$l‰èèù ÿÿ„À„ÿüÿÿF‰t$‰$ÿT$t;D$L”À¶À;D$8uÅÇ$‰ñ‹T$P‹|$D‹èÕ)ÿÿ„Àu©‹\$\鵿ÿÿ‹D$X9D$4~‰D$4;t$4Žõÿÿ‰\$L‹\$8‹K(‹S$„$‰D$‹\$4‰\$Fÿ‰$‹\$D‹èâ'ÿÿ‰Ã…ÀxJ€.ué‰ñ‰ú‰èèI ÿÿ„À„Y N9óuèÇ$‰ñ‹T$P‹\$D‹è<)ÿÿ„À„;t$4‚‹\$Lé‰ôÿÿ‹D$p9D$4~‰D$4;t$4qôÿÿ‰\$L‹\$8‹K(‹S$„$‰D$‹\$4‰\$F‰$‹\$D‹èÛ%ÿÿ‰Ã…Àx§€.„p9ÆuëF9ót‰ñ‰ú‰èèœ ÿÿ„Àuì9Þ…zÿÿÿÇ$‰ñ‹T$P‹\$D‹è(ÿÿ„À„i;t$4ŒuÿÿÿéKÿÿÿ‹T$8‹B$‹T$p)Â9T$4~‰T$4;t$4¼óÿÿD$4‰D$L‰\$\N‹\$L‰$‹T$8‹D$Dè•3ÿÿ‰Ã…Àˆ!ûÿÿ€.ué ‰ñ‰ú‰èèý ÿÿ„À„íF9óuèÇ$‰ñ‹T$P‹\$D‹èð'ÿÿ„À„þÿÿ;t$4|–éÓúÿÿ‹T$8‹B(‹‰D$L‹L$49L$X| ‹D$X@‰D$49t$4óÿÿ¶T$\‰T$8‰|$l‰\$\‹\$|ë ;t$4„ˆúÿÿ‰ñ‹T$l‰èèm ÿÿ„À„súÿÿNFÿ‰D$‰$ÿT$t;D$L”À¶À;D$8uÂÇ$‰ñ‹T$P‹|$D‹èF'ÿÿ„Àu¦élýÿÿ‹„$H‰D$‹t$|‰4$ÿT$t‰|$‰$ÿT$4‰Æ‰„$‹”$ é‘ÄÿÿÿŒ$é/ñÿÿ1Ûéx¦ÿÿ‰D$‹\$|‰$ÿT$t”$܉T$‰$ÿT$4‰Ãé¿ÿÿ@‰„$B‰”$鬿ÿÿ‹„$ H‰D$‹L$|‰ $ÿT$t”$܉T$‰$ÿT$4‰Ç‰„$éÀÿÿ¶Àÿ$…ØJöd‹O$‰L$8‹D$Xȉñ9Æ}‰Á9L$<ŒÑöÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë*‹t$8ÆÇ$‰ñ‹T$L‹è&&ÿÿ„À„ò N9Ï|+L$8‰<$‰ê‰Øèg1ÿÿ…ÀyËl$H‹\$<éröÿÿ‹W$‰T$8‹D$XЉñ9Æ}‰Á9L$<ŒSöÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë,v‹t$8ÆÇ$‰ñ‹T$L‹è¦%ÿÿ„À„r N9Ï|”+L$8‰<$‰ê‰ØèG5ÿÿ…ÀyÃé{ÿÿÿ‹G$‰D$8‹D$p+D$89Æ~‰Æ9t$<Ûõÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë.v‰Æ+t$8Ç$‰ñ‹T$L‹è.%ÿÿ„À„ú N9÷ÿÿÿ‹L$8ñ‰<$‰ê‰Øès=ÿÿ…Ày¿éÿþÿÿ‹D$h‹@8‰D$H‹G$…À„O!1ÒÇD$8„$܉l$P‰t$\1í‰Ö‰\$l‰Ã‰\$‹G(‹°‰$ÿT$HÅF9w$wç‹t$\‰l$8‹l$P‹\$l‹D$8D$X9ð}‰ð9D$<Œõÿÿ‰l$H‹l$<‰\$<‹\$Dë.‹t$8ÆÇ$‰ñ‹T$L‹èZ$ÿÿ„À„& F9ÅŒDþÿÿ‹O(‹W$´$‰t$‰l$+D$8‰$‹è$!ÿÿ…Ày¬éþÿÿ‹T$h‹R8‰T$H‹G$…À„Y 1ÒÇD$8„$܉l$P‰t$\1í‰Ö‰\$l‰Ãf‰\$‹G(‹°‰$ÿT$HÅF9w$wç‹t$\‰l$8‹l$P‹\$l‹D$8‹L$p)Á‰È9ñ~‰ð9D$<ôÿÿ‰l$H‹l$<‰\$<‹\$Dë.‰Æ+t$8Ç$‰ñ‹T$L‹èn#ÿÿ„À„: Fÿ9ÅXýÿÿ‹O(‹W$´$‰t$‰l$D$8‰$‹èœ!ÿÿ…Ày¬é,ýÿÿ‹G$‰D$8‹D$p+D$89Æ~‰Æ9t$<Œóÿÿ‰l$H‰ý‹|$<‰\$<‹\$Dë+‰Æ+t$8Ç$‰ñ‹T$L‹èâ"ÿÿ„À„®N9÷Îüÿÿ‹L$8ñ‰<$‰ê‰ØèAÿÿ…Ày¿é³üÿÿ‹G(‹‰D$8¶|$H‰|$H‰ð‹t$|‰\$Pë ;|$<„ž‰øx‰D$‰4$ÿT$t;D$8”À¶À;D$HuÖÇ$‰ù‹T$L‹\$D‹èV"ÿÿ„Àuº‹\$P‰þé]áÿÿv‹G(‹‰D$8‰ð‹t$|‰\$Pë ;|$<„5‰øx‰D$‰4$ÿT$t‹\$8‰\$‰D$‹\$h‰$è-üþÿ:D$HuÈÇ$‰ù‹T$L‹\$D‹èß!ÿÿ„Àu¬ë‡‹G(‹8‰\$8ë ;t$<„N‰t$‹\$|‰$ÿT$t‰|$‰D$‹\$h‰$èÏûþÿ:D$HuÌÇ$‰ñ‹T$L‹\$D‹è!ÿÿ„Àu°‹\$8éŠàÿÿ‹G(‹8¶D$H‰D$8‰\$Hë ;t$<„äN‰t$‹\$|‰$ÿT$t9ø”À¶À;D$8uØÇ$‰ñ‹T$L‹\$D‹è !ÿÿ„Àu¼‹\$Hé)àÿÿv1Ûé ÿÿ1Û鈠ÿÿ‹|$P‰ÓéËŸÿÿ‹U‰,$‰D$0ÿR‹D$0éK±ÿÿ‹U‰,$‰D$0ÿR‹D$0éuÊÿÿ‹l$H{`‹D$DèËéþÿ‹E`‰„$‹„$‹‰„$éT ÿÿ‹l$H){`‹D$Dèœéþÿ‹E`‰„$‹„$‹‰„$é% ÿÿ»ðÿÿÿééŸÿÿ‹„$‹‰„$‰èèÐÿÿéÿŸÿÿ1ÛéÆŸÿÿ1Û鿟ÿÿ‹l$4‹\$TŠ›…ˆœ$‹éןÿÿH‰D$‹\$|‰$ÿT$t”$ì‰T$‰$ÿT$4‰ÃéÉïÿÿ‹„$„)ЉD$‰4$ÿ”$¨‹¬$ ‰l$‹l$<‰l$Ç$‰Á‹”$¤‹„$œèÄWÿÿƒø„ý…À…eG‰|$P‹|$ ÿŒ$‹„$‹‰„$é=”ÿÿ‰D$‹\$|‰$ÿT$t‰Á‹”$‹D$hèõþÿ‹Œ$:A/…}Çÿÿ‹A „$‹‰„$éô“ÿÿH‰D$‹t$|‰4$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…ɾÿÿ‹A „$‹‰„$颓ÿÿ‹•œ ‹Z ‰D$‹t$|‰4$ÿT$t‰$ÿÓ„À…V ÿ„$‹„$‹‰„$éa“ÿÿH‰D$‹\$|‰$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~B1Év‹4Š9ów19÷r-°‹Œ$8A/…¼´ÿÿ‹A „$‹‰„$éç’ÿÿvA9ÁuÃ1ÀëÌ‹S(‹‰D$‹t$|‰4$ÿT$t‰\$‰D$‹\$h‰$è+íþÿ‹Œ$:A/…¤¹ÿÿ‹A „$‹‰„$é‹’ÿÿH‰D$‹t$|‰4$ÿT$t‹Œ$‹Q(;”¶ҶA/9Â…£Ÿÿÿ‹A „$‹‰„$éE’ÿÿ‰D$‹t$|‰4$ÿT$t‹”$‹R(‹z‹”$܉T$‰$‰T$0‹t$hÿV0…À‹T$0~?1É‹4Š9ów19÷r-°‹Œ$8A/…D³ÿÿ‹A „$‹‰„$éÏ‘ÿÿvA9ÁuÃ1ÀëÌ‹B‰B‹L$4‹T$8‹D$DèRÿÿ„À„{‹Œ$é<´ÿÿ‰D$‹\$|‰$ÿT$t‰D$‹„$‹@(‹‰$ÿ”$‹Œ$:A/…بÿÿ‹A „$‹‰„$éG‘ÿÿ‹‰„$é9‘ÿÿ‹‰„$é+‘ÿÿ9½ …¶ÿÿ‹„$ …À‰ùµÿÿ‹…$ ‰„$‹‰„$éõÿÿ9• …ä´ÿÿ‹Œ$ …ɉմÿÿ‹…$ ‰„$Ç„$ ÿÿÿÿ‹‰„$é´ÿÿ‹‰„$é¦ÿÿŒ$ÇD$ÿÿÿÿ„$‰$‹T$d‹D$Dè85ÿÿ„À„‰‹„$…À…iÿÿé´ÿÿ9 …f¯ÿÿ‹”$ …Ò‰W¯ÿÿ‹…$ ‰„$Ç„$ ÿÿÿÿ‹‰„$é#ÿÿ;sDŽþÿÿ1Ûéáÿÿv‹œ$öC- „³‰l$4‰Ú…ÀŽâ œ$¼$ ¬$ë f‹”$ÇD$ÿÿÿÿŒ$‰L$‰t$ ‰l$‰|$‰$‰Ù‹T$d‹D$Dè7ÿÿ„À„ €¼$„] ‹„$…À§ÿŒ$‹”$ésÿÿÿ‹‰„$é^ÿÿ‹C‰„$éOÿÿ€½0 …’œÿÿ驺ÿÿ‹‰„$é/ÿÿ‹‰„$é!ÿÿ‹‰„$éÿÿ9 …@­ÿÿ‹´$ …ö‰1­ÿÿ‹…$ ‰„$éÈ­ÿÿf9½ …û«ÿÿ‹„$ …À‰ì«ÿÿ‹…$ ‰„$‹‰„$鮎ÿÿ9• …T¿ÿÿ‹¼$ …ÿ‰E¿ÿÿ‹…$ ‰„$éÞ¿ÿÿ‹‰„$érŽÿÿ‹K,;Œ$…g±ÿÿ1ÿ銱ÿÿ‹Œ$9K,… ÀÿÿÆD$4é3Àÿÿ;sDŽŒÿÿ1Ûéÿÿÿ‹‰„$é"ŽÿÿºéÂÿÿºéƒÅÿÿºéP«ÿÿºé ³ÿÿÇ$‹Œ$‰ò‹|$D‹è'ÿÿ„À„v‹„$‹P(ÆD$4馿ÿÿ‰è‹¬$ ‹œ$”‰C`‰<$ÿƒød‹D$DèöÖþÿ‹E`‰„$‹„$‹‰„$éÿÿ‰ÆéÔáÿÿ‹\$8é3ÞÿÿÇ„$ ÿÿÿÿ…À¬šÿÿ‹Œ$…Éšÿÿ‹„$‹‰„$é8ÿÿ‰Æéqåÿÿ‰ÆéBàÿÿ‹\$HéåÝÿÿ‰Æéäÿÿ‰ÆéÏàÿÿ‰Æé¬äÿÿ‹œ$é3üÿÿÇ„$ 1Àé±ÿÿ‰”$ ‰Ðé<«ÿÿÇ„$ 1À饽ÿÿ‹œ$é†üÿÿ‰”$ ‰Ðéå«ÿÿ‹„$9D$pŽó™ÿÿ@‰„$Ç„$‹Œ$‹”$ 1À1öé÷±ÿÿ‹l$8‹|$<‹\$L‰»” éWìÿÿ‹¬$¬‹œ$œ‰{`‰4$ÿƒød‹D$Dè—Õþÿ‹E`‰„$‹„$‹‰„$é ŒÿÿÇ„$ ÿÿÿÿé`™ÿÿÇ„$ ÿÿÿÿéP™ÿÿ»ðÿÿÿéÄ‹ÿÿÇ„$ ÿÿÿÿé6™ÿÿ»ðÿÿÿ骋ÿÿÇ„$ ÿÿÿÿé™ÿÿÇ„$ ÿÿÿÿé ™ÿÿ‹Œ$ÇD$Ç$‰ò‹D$Dè¯Lÿÿ„À…ã˜ÿÿ»÷ÿÿÿéW‹ÿÿÇ„$ ÿÿÿÿéȘÿÿÇ„$ ÿÿÿÿ鸘ÿÿ»ðÿÿÿé,‹ÿÿÇ„$ ÿÿÿÿ鞘ÿÿ»ðÿÿÿé‹ÿÿÇ„$ ÿÿÿÿ鄘ÿÿÇ„$ ÿÿÿÿét˜ÿÿ»ðÿÿÿéèŠÿÿ»ðÿÿÿéÞŠÿÿÇ„$ ÿÿÿÿéP˜ÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éàŠÿÿÇ„$ ÿÿÿÿé ˜ÿÿÇ„$¨ÌôdÇD$L¼ôd鬿ÿÿ÷ÚéÊÿÿ‹F‰„$ éD¹ÿÿºS‹D$DèÌ,ÿÿ„À„Ý ‹…„ ‰p‹”$‰P‹… ‰C0‰S,‹„$‰„$‹„$‰„$éLŠÿÿÇ„$ ÿÿÿÿ…À‰—ÿÿéxûÿÿÇD$<¼ôdéýÁÿÿ‹Œ$éȹÿÿ‹Œ$éäžÿÿ‹‰„$ é··ÿÿ1ÀéêòÿÿÇ„$ ÿÿÿÿ‹„$‹‰„$éÚ‰ÿÿ‹‰„$ é§Ãÿÿ1Àé²ôÿÿ‹F‰„$ é¶±ÿÿÇ„$ ÿÿÿÿéö–ÿÿ»ðÿÿÿéj‰ÿÿÇ„$ ÿÿÿÿéÜ–ÿÿÇ„$ ÿÿÿÿéÌ–ÿÿ»ðÿÿÿé@‰ÿÿÇ„$ ÿÿÿÿé²–ÿÿ‹D$Dè±Òþÿ»þÿÿÿé‰ÿÿÇ„$ ÿÿÿÿ9ðŒŒ–ÿÿé4øÿÿÇ„$ ÿÿÿÿéw–ÿÿ‹D$8‰$‰Ú‰èèCmÿÿ‰Ã‹„$‹P(‹Œ$驵ÿÿ1ÛéÆˆÿÿÇ„$ ÿÿÿÿé8–ÿÿ»÷ÿÿÿ鬈ÿÿ»÷ÿÿÿ颈ÿÿÇ„$ ÿÿÿÿé–ÿÿ‰$‰ú‰èèälÿÿ‰Ç‹œ$‹C(9x†Ò¤ÿÿÇD$Ç$‹Œ$‰ò‹D$Dè–Iÿÿ„À…Ê•ÿÿ»÷ÿÿÿé>ˆÿÿ‹l$H‹D$Dè»Ñþÿ鮕ÿÿ‹D$Dè­Ñþÿ»þÿÿÿéˆÿÿ1Ûéˆÿÿ»÷ÿÿÿéˆÿÿÇ„$ ÿÿÿÿéz•ÿÿ»ðÿÿÿéî‡ÿÿÇ„$ ÿÿÿÿé`•ÿÿ»ðÿÿÿéÔ‡ÿÿ»ðÿÿÿéʇÿÿÇ„$ ÿÿÿÿé<•ÿÿÇ„$ ÿÿÿÿé,•ÿÿ‹l$H‹D$Dè'Ñþÿé•ÿÿÇ„$ ÿÿÿÿé •ÿÿ»ðÿÿÿé~‡ÿÿº\‹D$DèÚ)ÿÿ„À„k‹…„ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰PéÚ™ÿÿº[‹D$Dè‡)ÿÿ„À„‹…„ ‹”$‹Œ$‰‰H‰p‹S(‰P ‹S,‰P‹S0‰P‹”$‰P‹„$ø‰„$‹„$ü‰„$éî†ÿÿ‹„$9D$X-”ÿÿH‰„$Ç„$‹Œ$‹”$ 1À1öél¤ÿÿ‹]TºZ‹D$DèÚ(ÿÿ„À„{v†ƒ‹•„ ‹œ$‰‰r‹H,‰J‹H(‰J ‹”$‰P,‰x(é ¢ÿÿ„$ø‰$‹Œ$‹”$‰èèrìþÿ„À‹„$‹P(„¸ÿÿÆD$4é ¸ÿÿ1Ûéí…ÿÿ‹Œ$é&²ÿÿ‹Œ$é¼±ÿÿ„$‰$‹Œ$‹”$‰èèìþÿ‹”$„À‹B(„¤¢ÿÿ¿霢ÿÿ1Ûé“…ÿÿ„$‰$‹Œ$‹”$‰èèÖëþÿ‹”$‹J(„À„®¨ÿÿ¿馨ÿÿ‹\$L‹› ‰\$<…Û…)¸ÿÿº ‹D$Dèz'ÿÿ‰D$<…À„^¹ ‰Ç1Àóª‹\$4[ƒÁã‰Ú‹D$DèK'ÿÿ‹|$<‰G…À„‰Ç‰Ù1Àóª‹|$<‰7ÇG…ö„‰~鸷ÿÿ„$ø‰$‹Œ$‹”$‰èèëþÿ‹”$„À‹B(„.—ÿÿ¿é&—ÿÿ‹Œ$é ´ÿÿº!‹D$Dèæ&ÿÿ„À„‰‹…„ Š\$HˆX‹…„ ‹t$8‰0‹„$éþéÿÿ‰èèV±þÿŠ\$Hˆ2 ‹t$8‰µ 鱑ÿÿ»ðÿÿÿé%„ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé>óÿÿ‹l$4Ç„$ ÿÿÿÿé}‘ÿÿ‹l$4Ç„$ ÿÿÿÿéi‘ÿÿ»ðÿÿÿé݃ÿÿ‹l$4‰ÓÇ„$ ÿÿÿÿé=õÿÿ÷Øé6Áÿÿ‹¬$¬‰Ç‰4$ÿƒød‹D$Dè/Íþÿ…ÿ‰÷ÿÿ‰ûé–ƒÿÿ1Ûéƒÿÿ‰s\‹„$ø‹´$üé ‚ÿÿ»ðÿÿÿéoƒÿÿ‰Ãéhƒÿÿ»÷ÿÿÿé^ƒÿÿ»÷ÿÿÿéTƒÿÿ»ðÿÿÿéJƒÿÿ1É齦ÿÿ»ðÿÿÿé9ƒÿÿ1Ûé2ƒÿÿ1ÀÇD$8éêßÿÿ1ÀÇD$8éóÞÿÿ»ðÿÿÿé ƒÿÿ»ðÿÿÿéƒÿÿ»÷ÿÿÿéö‚ÿÿ»÷ÿÿÿéì‚ÿÿ»ðÿÿÿéâ‚ÿÿ‰ÃéÛ‚ÿÿ»ðÿÿÿéÑ‚ÿÿ‰ÃéÊ‚ÿÿ»÷ÿÿÿéÀ‚ÿÿ»ðÿÿÿé¶‚ÿÿ»÷ÿÿÿ鬂ÿÿ»÷ÿÿÿ颂ÿÿ»ðÿÿÿ阂ÿÿ1Ûé‘‚ÿÿ1Û銂ÿÿ1Û郂ÿÿ1Ûé|‚ÿÿ»ðÿÿÿér‚ÿÿ»÷ÿÿÿéh‚ÿÿ‰Ãéa‚ÿÿ‰ù‹|$4‰W(éTÂÿÿ»ðÿÿÿéI‚ÿÿ»ðÿÿÿé?‚ÿÿ‹\$<‰C(éû¿ÿÿ»ðÿÿÿé)‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé ‚ÿÿ»ðÿÿÿé‚ÿÿ»ðÿÿÿé÷ÿÿ»÷ÿÿÿéíÿÿ»ðÿÿÿéãÿÿ‰<$ÿƒød‹D$Dè[Ëþÿ»þÿÿÿéÇÿÿ»ðÿÿÿé½ÿÿ»ðÿÿÿé³ÿÿ»ðÿÿÿé©ÿÿ»ðÿÿÿéŸÿÿ»ðÿÿÿé•ÿÿ»ðÿÿÿé‹ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéwÿÿ»ðÿÿÿémÿÿ»ðÿÿÿécÿÿ»ðÿÿÿéYÿÿ»ðÿÿÿéOÿÿ»ðÿÿÿéEÿÿ»ðÿÿÿé;ÿÿ»ðÿÿÿé1ÿÿ»ðÿÿÿé'ÿÿ»ðÿÿÿéÿÿ»ðÿÿÿéÿÿ»ðÿÿÿé ÿÿ»ðÿÿÿéÿ€ÿÿ»ðÿÿÿéõ€ÿÿ»ðÿÿÿéë€ÿÿ»ðÿÿÿéá€ÿÿ‰ú‹D$Dè Êþÿ»÷ÿÿÿéÌ€ÿÿ»ðÿÿÿé€ÿÿ‹|$<‹\$L‰» é–³ÿÿ»ðÿÿÿ饀ÿÿ»÷ÿÿÿ雀ÿÿ»ðÿÿÿé‘€ÿÿ»ðÿÿÿ釀ÿÿ»ðÿÿÿé}€ÿÿ»ðÿÿÿés€ÿÿ‰4$ÿƒød‹D$DèëÉþÿ»þÿÿÿéW€ÿÿ»ðÿÿÿéM€ÿÿ»ðÿÿÿéC€ÿÿ‹l$H‰Æ‹D$Dè¾Éþÿ…ö‰àÿÿ‰óé%€ÿÿ»ðÿÿÿé€ÿÿ‹l$H‰Æ‹D$Dè–Éþÿ…ö‰Ãßÿÿ‰óéýÿÿ»ðÿÿÿéóÿÿ»ðÿÿÿééÿÿ»ðÿÿÿéßÿÿ»ðÿÿÿéÕÿÿ»ðÿÿÿéËÿÿ‹Œ$é­Éÿÿ»ðÿÿÿéµÿÿ»ðÿÿÿé«ÿÿUWVSƒì\‰D$$‰Ö‹(‰l$‹m‰l$4èÉþÿ‹l$€½- t)‹]`‹m@‰l$@9댆‰Ý+l$@‰l$H‹l$‹mD‰l$Dë+‹l$‹]`‹mD‰l$D9ëY‹l$D)݉l$H‹l$‹m@‰l$@‹l$4‹E öÄ•D$:öÄ€„ŠD$:ƒðˆD$9‹l$4€½„À÷Ћl$‰…Ô Š…0 ˆD$;1íÇD$(‹T$ƒÂl‰T$<‹L$Á´ ‰L$0‰ð¶ð‰t$Lf‹T$‰Z`ŠL$;ˆŠ0 ‹|$<‰º| Ç‚x ‹‚ˆ ‰‚Œ Ç‚„ ‰ZX‰Z\‰Ð‹‹J$…É~,‹@TƒÀ1ÉÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ4;J$|Ü‹zx…ÿ~5‹|$‹‡È ƒÀ1ÉfÇÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ(;Jx|Ü‹r…ö~,‹L$‹AH1ÉÇÿÿÿÿÇ@ÿÿÿÿÇ@Ç@ÿÿÿÿAƒÀ9ñuÝ‹rT…ö~(‹|$‹‡à ƒÀ1ÉvÇÇ@ÿÿÿÿAƒÀ;JT|깋|$01Àóª‹T$Ç‚Ä Ç‚Ì Ç‚Ð Æ‚2 Ç‚ fÇ‚( ‹ŠÔ …É…ƒ‹L$H;Š˜ r …Éus€º0 tjÇD$,‹T$@‹D$‰P@‹L$D‰HD‹D$(…À…šƒ|$,„‹D$$è Æþÿ‹t$,…öyéõv‹D$$è‡ÆþÿÇD$,‹D$,ƒÄ\[^_]Ãv‹|$‹‹PÇ$‹L$L‹D$$èãxÿÿ‰D$,ƒøŒtÿÿÿ„nÿÿÿH„¹€|$:u€|$9„Uÿÿÿ‹D$‹P\9P`„Eÿÿÿ‹D$(…À„‹L$‹q\9Þ„‹D$$èóÅþÿ‹D$$‹‰D$‹‰T$ ‹T$ ‹B…À~|‹l$(ÇD$ÇD$ë.f‹E‰U‹KÁá‹s‰Çó¤ÿD$ƒD$ƒÅ‹D$‹|$ ;G}8‹\$‹L$YH‹‹S‰E‰U‹S;U v¶Áâ‹Eèç5ÿÿ…Àtc‹S‰U ‰E럋D$$è3Åþÿ‹l$‹]\‰è‹m`‹€Ô …À„‹L$‹Ð H‰Ô €|$9„½üÿÿ€¹- „‰i@‰YDé¥üÿÿ‹T$ ‹B…ÀŽf‹|$(1ö‹ƒød‹l$ ‹G‰$ÿÓFƒÇ;u|ï‹L$(‰ $ÿÓ‹D$$è¡Äþÿ‹D$@‹l$‰E@‹T$D‰UD‹D$$è¦ÄþÿÇD$,÷ÿÿÿÿÌ‚ød…À…þÿÿ1Ò‹D$,è;þÿéþÿÿ‹—Ð …Ò…9þÿÿé›ýÿÿ;i`…gþÿÿ‹|$4‹_ …Û~*‹QH‹D$(1É‹89:…Iþÿÿ‹x9z…=þÿÿAƒÂƒÀ9Ùuß‹|$@‹L$‰y@‹D$D‰ADƒ|$,u‹|$‹‡Ð …À„‹T$‰r\‰j`‹D$$èðÃþÿ‹D$$‹(‹U‹B…Àޝ1ÿ1ö‹ƒød‰\$‰Ó‹EH‹D8‰$ÿT$F‹CƒÇ9Æ|ç‹\$‹UH @Áá‰×‹t$(ó¤‹T$(‰$ÿÓ‹D$$èlÃþÿ‹l$ÇELÿÿÿÿÇEPÿÿÿÿ‹E‹HL‹x …ÿ~T‹EHº½ÿÿÿÿë2f‹X…Ûx/‹1‰Ó9õ}‹l$‰UL€y „¦‰UP‰õƒÀBƒÁ 9ß~‹0…öyʉӃÀBƒÁ 9ßí‹D$$èÃþÿÇD$,‹D$,ƒÄ\[^_]Ë|$‰_@‰oDéúÿÿ‹D$$èäÂþÿ‹D$$‹‰D$‹‰T$ ‹B@Áàè¢ÿÿ‰D$(…À„ðýÿÿ‹L$ ‹A @Áá‹|$(1Àóªé½üÿÿÆD$9éåùÿÿ‰õéXÿÿÿ‹ƒødé±ýÿÿ‹D$$è{Âþÿ‹l$$‹E‹(‹}…ÿ~I‹|$(1ö‹ƒødv‹G‰$ÿÓFƒÇ;u|ï‹D$(‰$ÿÓ‹D$$èÂþÿé¨þÿÿ‰Þéÿýÿÿ‹ƒødésþÿÿ‹ƒødëωÞé÷ýÿÿvWVSƒì ‰Ã@ ‰D$ÇD$T$‰ØèæVÿÿƒ»P „!Œé‹‹L …É…틃@ 9ƒH |_‹“D €»9 „‹C‰Ñ1Òè4Ãþÿ‰Ç…ÿ„¢‹ƒL @‰ƒL ‹S ;B ~ ǃL ‹T$‰Øè´eÿÿ‰øƒÄ [^_Ãv€»9 …Ë{P¾ë=ƒø…€»; „²‹Cl;Ch…¦‹“D 9ú„_ÿÿÿð‰Clƃ< ºD$èª÷ÿÿ‰ƒP …Ày¬‹T$‰Øè1eÿÿ1ÿévÿÿÿf‹ST‹C ÇD$‹s‰4$è‹cÿÿ‰Çé"ÿÿÿ‹T$‰Øèýdÿÿ‹=¨ƒødÿ‰øƒÄ [^_ËKH‹Cè-Âþÿ‰Çéôþÿÿf‹{L¾ÿÿÿÿéwÿÿÿvÿƒH €»9 tQ‹‹D ‹Sh‹CèôÁþÿ‰Ç…ÿ„bÿÿÿ‹Cl‰ƒD €»; t<;ChtFƃ< ‹ƒP …À…”þÿÿéfþÿÿ1ÿëî‹Kh‹“D ‹Cè£Áþÿ‰Çë­vƃ< ‹ƒP ëÇð‰Cl볋T$‰Øè/dÿÿ‹ƒP 1Òè"ºþÿ1ÿégþÿÿvƒì‹D$ è´ýÿÿ;¨ƒødtƒÄËJ‰…Òt ¡¬ƒødÿƒÄËP‰$ÿRëêƒì‹D$ è|ýÿÿ;¨ƒødtƒÄËJ‰…Òt1ÀƒÄËP‰$ÿR1ÀëßvWVSƒì‰Ã‰×p ‰t$ÇD$ T$è6Tÿÿƒ»@ „Œ—‰ø¶ÐD$èÉõÿÿ‰Á‰ƒ@ …Àˆ•‹C‰òè»`ÿÿ‰Æ‰ø„Àu#‹Ch9Cl”ƒ< ‹T$‰Øè+cÿÿ‰ðƒÄ[^_Ãf€»8 tÔ€»9 ÀƒàHCh‰Clƃ< ëÅv‹T$‰Øèíbÿÿ‹5¬ƒødÿ‰ðƒÄ[^_ËT$‰ØèÑbÿÿ‹ƒ@ 1Òèĸþÿ1öë•‹T$‰Øèµbÿÿ1ö놺‹D$éúþÿÿfƒìº‹D$ èçþÿÿ;¬ƒødtƒÄÃv‹J‰…Òt1ÀƒÄËP‰$ÿR1ÀëÜv1Ò‹D$é­þÿÿUWVSìœ ‹¼$° ¡¬ƒød‰„$€ ‰„$„ Ç„$ˆ ‰„$Œ „$Œ ‰D$ „$ˆ ‰D$„$„ ‰D$„$€ ‰D$„$| ‰D$ÇD$ XËõdÇD$ØKöd‹„$¸ ‰D$‹„$´ ‰$ÿˆ‚ød…À„Ô1Ò‹„$€ èNlÿÿ‰Ãƒøÿ„«ºÿÿÿ‹„$„ è2lÿÿ‰Æƒøÿ„Ï‹„$Œ èglÿÿ…Àˆ‹ÇD$ÇD$ÇD$‰D$ 1À‹¬$ˆ …í•À‰D$‰t$‰$‹Œ$| ‰úD$@è\&ÿÿ„À„<D$@‰„$t Ç„$x Ç$ÿô‚ød‰Å…À„瀼$m ÒƒâJ‰T$<‹„$ 9„$€Á9„$„Œ´º„$t èóÿÿƒøŒ=„”‹G …À…Á€¼$m „¯‹”$ ‹Œ$œ‹„$| èµ½þÿ‰Æ…À„ú‰t$‰,$ÿð‚ød‹J‰…Ò„Y…ÀˆØ€¼$l „ó‹D$<„$œ‰„$ Æ„$p 9„$€Ž?ÿÿÿD$@èÃÂþÿ‰èÄœ [^_]ÃfÿÌ‚ød…À„Gþÿÿf1í‰èÄœ [^_]Ãø„§‰$ÿlƒød‰Æ…ÀtS‹_ …ÛŽNÿÿÿ1Ûë‰Dž9_ Ž<ÿÿÿC‹”$ˆÇD$‹„$| ‰$‰Ù‹D$@èò]ÿÿ…ÀuÊ‹H‰…À„¥‹EH‰E…À„ºD$@èÂþÿ1í‰èÄœ [^_]Ãf‹„$ ;„$œ”„$p éKþÿÿ‹”$ˆÇD$‹„$| ‰$¹‹D$@èu]ÿÿ‰Æ…À…þÿÿ눋V‰4$‰D$8ÿR‹D$8é‘þÿÿf‹”$œ‹Œ$ éLþÿÿ‹F‰4$ÿPéMÿÿÿfÿÌ‚ød…À„#ýÿÿé½þÿÿ‹E‰,$ÿPé8ÿÿÿfUWVSìŒ ‹¼$  Ç„$x ¡¬ƒød‰„$| „$| ‰D$„$x ‰D$„$t ‰D$ÇD$ €ËõdÇD$çKöd‹„$¨ ‰D$‹„$¤ ‰$ÿˆ‚ød…À„\‹„$x …À„õ‹„$| èéhÿÿ…Àˆ9ÇD$ÇD$ÇD$‰D$ ÇD$ÇD$ÿÿÿÇ$‹Œ$t ‰úD$8èà"ÿÿ„À„ìD$8‰„$l Ç„$p Ç$ÿô‚ød‰Æ…À„™€¼$e …i‹D$t‰D$(ÇD$,1ÛÇD$$‹-ð‚ød‹D$$;„$x º„$l è‡ïÿÿƒøŒæ„ö€¼$g „&‹„$˜‹”$”9Є´€¼$e „‰Ù‹„$t è ºþÿ‰Ã…Û„–‰\$‰4$ÿÕ‹J‰…Ò„@…Àx|‹G …ÀŽ»ëf…ÀxdC9_ Œê‹”$€ÇD$‹„$t ‰$‰Ù‹D$8èæZÿÿ…Àt2‰D$‰4$‰D$ ÿÕ‹T$ ‹ I‰ …Éu°‹J‰$‰D$ ÿQ‹D$ …ÀyŸv‹H‰…À„ÛD$8èâ¾þÿ1ö‰ðÄŒ [^_]ÃvÇ„$x ÿÿÿéûýÿÿ‹\$tÇD$,ÿÿÿÿÇD$(éþÿÿv‹”$”€¼$e …éþÿÿ‰Ñ‰Ú‹„$t è¹þÿ‰Ãéâþÿÿ1ö‰ðÄŒ [^_]ÃÿD$$‹œ$˜€¼$g t3;œ$”„ÊÆ„$h é0þÿÿ‹S‰$‰D$ ÿR‹D$ éªþÿÿfÆ„$h é þÿÿv‹F‰4$ÿPéÿÿÿf;\$(tD$,‰„$˜Æ„$h éÙýÿÿ€¼$e uH‹L$t‰Ú‹„$t èN¸þÿ‰Ã…Û„Äþÿÿ‰\$‰4$ÿð‚ød‹J‰…Òt<…Àˆ¦þÿÿD$8蕽þÿé°þÿÿ‰Ù1Ò‹„$t è¸þÿ‰Ã븋D$,؉„$˜é$ÿÿÿ‹S‰$‰D$ ÿR‹D$ ë±vUWVSìŒ ‰Ã¶¬$¤ ¶¼$¨ ¡¬ƒød‰„$t ‰„$x ‰„$| …Òt…É„n„$| ‰D$„$x ‰D$„$t ‰D$„$p ‰D$ÇD$ Ìõd‹„$  ‰D$‰L$‰$ÿˆ‚ød…À„ô‹„$t 1Òè”dÿÿ‰Æƒøÿ„ͺÿÿÿ‹„$x èxdÿÿ‰D$,@„Ñ‹„$| è­dÿÿ…Àˆ«çÿ‰|$ÇD$ÇD$‰D$ ÇD$‹D$,‰D$‰4$‹Œ$p ‰ÚD$4è¦ÿÿ„Àtdt$4‰´$h Ç„$l ‰è¶Ð„$h è§ëÿÿ…ÀˆË‰ÁT$4‰ØèžVÿÿ‰ÃD$4èç»þÿ‰ØÄŒ [^_]ÃfÿÌ‚ød…À„%ÿÿÿ1Û‰ØÄŒ [^_]ÃvÿÌ‚ød…À„!ÿÿÿ1ÛëÞf‹5xƒød9r…ƒþÿÿ‹r‰t$(Nƒþ‡rþÿÿ‹J ‰Œ$p ƒ|$(„¸þÿÿ‹B‰„$t ƒ|$(„£þÿÿ‹J‰Œ$x ƒ|$(…Žþÿÿ‹R‰”$| éþÿÿfD$4è+»þÿ1Ûé=ÿÿÿ‹D$‹T$‹L$ ÇD$ ÇD$ÇD$òKödé§ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$ÿKödé{ýÿÿv‹D$‹T$‹L$ ÇD$ ÇD$ÇD$LödéOýÿÿvVSƒì$‰Ã…ÀtaºLöd¸7Lödèz­þÿ‰Æ…ÀtL‰\$‰$ÿ(ƒød‹J‰…Òt"‹J‰…Òu‹S‰$‰D$ÿR‹D$ƒÄ$[^Ãf‹V‰4$‰D$ÿR‹D$ëË1ÀëàUWVSìÜ ‰Å‰Ó‰L$,”$€ ‰ÈèDªþÿ„À„L¶”$¸ ‹Eè€òþÿ„À„’‹Œ$° ‰L$(1Ò‹„$ø è»aÿÿ‰Çƒøÿ„`ºÿÿÿ‹„$ü èŸaÿÿ‰Æƒøÿ„…ÿˆ ;|$(~…öˆ‚;t$(`€½„u ‰ð)ø9Ehv‹„$ð …Àu Ç„$ð ÿÿÿ‰$ÿœ‚ød…À„£ÿ¸ÆD$9ÆD$:ÆD$8ÆD$;ÇD$‰D$ÇD$‹„$ ‰D$ÇD$ ‰t$‰|$„$€ ‰$‹L$,‰êD$Lè°ÿÿ„À„T$L‰”$È Ç„$Ì Ç„$À Ç„$¼ Š„$y ˆ„$Ä ‹L$,‹QöBW•„$Å „À…O1öÇD$<‹¼$ð …ÿÇD$0Žøº„$È èýçÿÿƒøŒN„Ñ‹”$¨9òtF€¼$y „‰ñ‹D$,è²²þÿ‰Æ…ö„‰ò„$¼ è¶´þÿ‹J‰…Ò„5…Àˆ÷€|$8…R€|$9…7€|$:„T‹K‰L$(…ÉŽ1öëu‹„$¨‹”$¬9Єˀ¼$y „H‰Á‹D$,è!²þÿ‰Ç…ÿ„‰¡¬ƒød9Ç„¢‰ú„$¼ è´þÿ‹J‰…Ò„ó…ÀˆYF;t$(„˜‹C ‹°‹} ‹P;”ƒød„¼;˜‚ød„°èUÿÿƒøÿ„ƒø„QÿÿÿŽ9ÇŒùD@ý‹”$”‹H…É…:‹;P„¡¬ƒødÿ‹J‰…Ò…tÿÿÿ‹P‰$ÿRF;t$(…kÿÿÿvÿD$0‹´$¬€¼${ „[;´$¨„òÆ„$| ‹„$ð 9D$0…þÿÿŠ„$y „À„–1Ò9Ö„(„À„‰ñ1Ò‹D$,è×°þÿ‰Æ…ö„?¼$¼ ‰ò‰øèÙ²þÿ‹J‰…Ò„7…Àˆ…Ût ‹H‰…À„‰øè$´þÿ‰ÃD$Lèýµþÿ…Ût=ö„$ô t5‹T$0‰T$‰\$Ç$=Lödÿ˜ƒød‰Ãëf„$€ èà¥þÿ…Û…÷1Û‰ØÄÜ [^_]Ãö„$ô …Òº\‰Øèò§þÿƒø޽ÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;é8üÿÿÿÌ‚ød…À„’ûÿÿ„$€ èn¥þÿ1Û‰ØÄÜ [^_]Ãv‹´$ˆÇD$<ÿÿÿÿé§üÿÿ‹t$(é—ûÿÿv‹|$(…ö‰~ûÿÿt$(‰tûÿÿ1öéwûÿÿv‹L$,ÿö„$ô …ô‹\$,„$€ èø¤þÿ‰ØÄÜ [^_]Ãvº{‰Øè §þÿƒø.ÿÿÿ…Ö1ÀÆD$91ÛÆD$:ÆD$8ÆD$;é`ûÿÿÿÌ‚ød…À…(ÿÿÿéÑúÿÿèîþÿ‰ÇéÝüÿÿ‹W‰<$‰D$$ÿR‹D$$é÷üÿÿf‰Ñ‰Â‹D$,è×®þÿ‰Çé±üÿÿ;´$¨”„$| é¦ýÿÿ‰Ñ‰ò‹D$,诮þÿ‰ÆéøûÿÿÿÌ‚ød…À…ž1Ò¸ôÿÿÿèB§þÿ‹„$¼ …Àt ‹J‰…Ò„Ž‹„$À …Àt ‹J‰…Ò„†D$Lèͳþÿ…Û„ þÿÿ‹H‰…À…üýÿÿ‹C‰$ÿP1Û‰ØÄÜ [^_]Éڄ$¼ è6°þÿ…À‰Îüÿÿë‚€|$;„Áüÿÿ¹T$L‰èèNÿÿ‰Æ…À„]ÿÿÿ‰D$Ç$ÿpƒød…À„¥‰D$‰$‰D$$ÿ(ƒød‰Ç‹T$$‹H‰…À„­‹H‰…À„’…ÿ„ ÿÿÿ‰ú„$¼ 觯þÿ‹J‰…Ò„‹f…À‰0üÿÿéáþÿÿv‰Ñ‹D$,èa­þÿ‰Çé;ûÿÿf‹V‰4$‰D$$ÿR‹D$$éµúÿÿf‹H‹ëϹT$L‰èèLMÿÿ‰D$(…À„Žþÿÿ‹D$L‹@ @‰$ÿlƒød‰Ç…À„[‹D$L‹p …öx81ö‹ ¬ƒød‰L$4f‹L$4‰ò‹D$(èuNÿÿ‰D$‰t$‰<$ÿtƒødF‹D$L9p }Ö‹D$(è½Sÿÿ‰Æ…À„ó‰D$‰|$‰$ÿ$ƒød‰Á‹H‰…À„ó‹H‰…À„΋T$(‹H‰…À„¥…É„×ýÿÿ‰Ê„$¼ ‰L$$èo®þÿ‹L$$‹J‰…Ò…Æþÿÿ‹Q‰ $‰D$$ÿR‹D$$é°þÿÿ‹D$<ð‰„$¬Æ„$| éüúÿÿf|$(‰Ö÷ÿÿ1ÿéÙ÷ÿÿv1Ò¸õÿÿÿ褤þÿé]ýÿÿv‹P‰$ÿRédýÿÿf‹P‰$ÿRélýÿÿf‹B‰$‰L$$ÿP‹L$$éEÿÿÿf‹G‰<$‰L$$ÿP‹L$$éÿÿÿf‹F‰4$‰L$$ÿP‹L$$é÷þÿÿfÇD$‰L$Ç$=Lödÿ˜ƒød‰Ãéðûÿÿ‹”$° é`úÿÿ„üÿÿ‰\$‰l$Ç$ÿpƒødè öÿÿ‰Ã…À„ºûÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;éS÷ÿÿ‹F‰4$ÿPé`ýÿÿ‹B‰$ÿPéEýÿÿ‹W‰<$‰D$$ÿR‹D$$éaýÿÿ‹Œ$° ‰ò‹D$,è˪þÿ‰Æéïùÿÿ¼$¼ éúÿÿ‹H‰…Àu ‹G‰<$ÿP‹T$(‹H‰…À…üÿÿ‹B‰$ÿPéùûÿÿ‹C‰$ÿPéâùÿÿ‹V‰4$‰D$$ÿR‹D$$é³ùÿÿÇD$nEöd‰$ÿ4ƒød‰Ã…À„Øúÿÿ1ÀÆD$9ÆD$:ÆD$8ÆD$;éqöÿÿ‹H‰…À…’ûÿÿ‹F‰4$ÿPé„ûÿÿfƒì\ÇD$@¡¬ƒød‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ËõdÇD$@Löd‹D$h‰D$‹D$d‰$ÿˆ‚ød…ÀtG‹D$Lè:Wÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`è¢ôÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡¬ƒød‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ¬ËõdÇD$@Löd‹D$h‰D$‹D$d‰$ÿˆ‚ød…ÀtG‹D$LèvVÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èÞóÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡¬ƒød‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ ÈËõdÇD$MLöd‹D$h‰D$‹D$d‰$ÿˆ‚ød…ÀtG‹D$Lè²Uÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èóÿÿƒÄ\Ãf1ÀƒÄ\Ãfƒì\ÇD$@¡¬ƒød‰D$D‰D$H‰D$LD$L‰D$$D$H‰D$ D$D‰D$D$@‰D$D$<‰D$D$8‰D$ÇD$ äËõdÇD$MLöd‹D$h‰D$‹D$d‰$ÿˆ‚ød…ÀtG‹D$LèîTÿÿ…Àx:‰D$‹D$H‰D$ ‹D$D‰D$ÇD$‹D$@‰$‹L$<‹T$8‹D$`èVòÿÿƒÄ\Ãf1ÀƒÄ\ÃfUWVSƒì<‹\$P‹t$Tº\‰ð轞þÿ…Àx ÿ‰ðƒÄ<[^_]Ét$‹C‰D$Ç$ÿpƒødèñÿÿ‰Æ…À„tÇD$$ÇD$(ÆD$,‹C‹@ö@W•D$-‹F‰D$…ÀŽP1í‰÷ëYèÓIÿÿƒøÿ„êƒø„Ž'9ÆŒT@ý‹C4ЋB…À…–¡¬ƒødÿ‹J‰…Ò„šE;l$„ï‹G ‹¨‹s0‹P÷BTt’èÁ¥þÿ‰Æ…öt!¡¬ƒød9Æt¿‰òD$$è¨þÿ‹J‰…Òt …Ày´‰þërf‹V‰4$‰D$ÿR‹D$ëã‹C‹K$)Á‹S )‹C è«¥þÿ‰Æë¨v‹C‹J)Á‹)‹C è¥þÿ‰Æë‹P‰$ÿRéXÿÿÿf‰þÿÌ‚ød…Àu|1Ò¸òÿÿÿèžþÿ‹D$$…Àt ‹J‰…Òt{‹D$(…Àt ‹J‰…Òt^‹H‰…Àt)1öéSþÿÿf‰þ뼉þ‹H‰…Àt!D$$謨þÿ‰Æé2þÿÿ‹F‰4$ÿP1öé!þÿÿ‹F‰4$ÿPëÔ1Ò¸õÿÿÿèœþÿë‚f‹P‰$ÿRë—‹P‰$ÿRéwÿÿÿfUWVSƒì,ǘÁõddEôdǬÁõdüBôdÇÔÁõdÇØÁõdHÂõdÇèÁõdÇôÁõd`ÂõdÇøÁõd`ÃõdÇüÁõdàÃõdÇ8ÄõdÐ=ôdÇLÄõdpAôdÇXÄõdèÄõdÇtÄõdÇxÄõdôÄõdÇ”Äõd ÅõdǘÄõd@ÆõdÇœÄõd ÆõdÇ8Çõd´@ôdÇtÇõdÇxÇõdèÇõdÇŒÇõdTôdÇÇõdüxõdÇ”ÇõdÈõdǘÇõd`ÈõdǸÈõd€@ôdÇôÈõdÇøÈõdhÉõdÇ ÉõdlôdÇÉõd¼wõdÇÉõd€ÉõdÇÉõdÀÉõdÇ$€Áõd‹|ƒødÿÓ…ÀˆGÇ$ ÄõdÿÓ…Àˆ6Ç$ ÇõdÿÓ…Àˆ%Ç$ ÈõdÿÓ…ÀˆÇ `ødÇD$õÇ$Êõdÿƒød‰D$…À„݉$ÿ ƒød‰ÆÇ$´2‹=ƒødÿ׉ÅÀt"‰D$ÇD$YLöd‰4$ÿ¸‚ød‹H‰…À„»Ç$ÿ׉ÅÀt"‰D$ÇD$_Löd‰4$ÿ¸‚ød‹H‰…À„«Ç$@Êõdÿˆƒød‰Ã…Àt"‰D$ÇD$iLöd‰4$ÿ¸‚ød‹H‰…À„’Ç$`ød1Ò1Û1À¶•Bíõd9Ú|Z@‰Â=Üuç4‰ðè‰àþÿ‰Å…À„1À‰ï‰ñóª1ÿ‰ø‰\$ëR¶C‰D$Ç$sLödÿ˜ƒød…Àts‰D$·†@íõd‹… öd‰D$¶C‹D…‰$‹5¸‚ødÿÖG‰øÿÜ„û4…ž@íõd¶CT…‹…Àu”‰T$ÿ¬‚ød‹T$‰¶C‹D……À…tÿÿÿ‹\$¡$`ød…Àt ‹J‰…Ò„Š1öëfF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRF9Þuá‰,$ÿƒødÇD$‹D$ƒÄ,[^_]ÃÇD$‹D$ƒÄ,[^_]ËC‰$ÿPÇ$ÿ׉ÅÀ…8þÿÿéUþÿÿ‹C‰$ÿPéGþÿÿ‹P‰$ÿRéhÿÿÿ‹C‰$ÿPé`þÿÿ‹\$ÿ¬‚ød£$`ød…À„Cÿÿÿf1ÿ1À‰\$‰Ãë+‰D$·‡Àöd‹… öd‰D$¡$`ød‰$ÿÖC‰ßû‘t3Áç¶—Ãöd‹T•‰T$¶‡Âöd‰D$Ç$uLödÿ˜ƒød…Àu§é¾þÿÿ‹\$1öëF9Þt‹Dµ…Àtó‹J‰…Òuê‹P‰$ÿRë߉,$ÿƒødéÜþÿÿ‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€ ƒödÁà¶Œ@…öd‰ÐÁèƒâÈ·Œ`‡öd‰ÐÑè¶ŒÈà’ödÑà1ж„H`£ödÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€à¤ödÁà¶Œ§öd‰ÐÁèƒâ¶ŒÈ`©öd‰ÐÁè¶Œˆà®ödÁà1ж„ˆ`²ödËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€àµödÁà¶Œ¸öd‰ÐÁèƒâÈ·Œºöd‰ÐÑè¶ŒÈÀÄödÑà1ж„H€ÓödÃv‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€`ÕödÁà¶„€Ööd‰ÑÁéƒâÁà¶ŒàØöd‰ÐÁè¶ŒH@áödÁà1ж„ˆ ãödËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€åödÁà¶„ åöd‰ÑÁéƒâÁà¶Œçöd‰ÐÁè¶Œˆ€êödÁà1ж„ˆíödËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€`îödÁà¶Œ€ïöd‰ÐÁèƒâÈ·Œñöd‰ÐÁ趌ȠöödÁà1ж„ˆ@÷dËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€€÷dÁà¶ŒÀ÷d‰ÐÁè¶Ò¶ŒÈ÷d‰ÐÁè¶ŒÈ@÷dÁáÁà1ÐÁ‰ÈÁè¶€à÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€À÷dÁà¶Œà÷d‰ÐÁè¶Ò¶ŒÈ`÷d‰ÐÁè¶ŒÈ@÷dÁáÁà1ÐÁ‰ÈÁè¶€À ÷dƒáÓøƒàÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€è ÷dÁà¶”÷d‰ØÁè ãÿ¶”Ð@÷d‰ØÁèÁâ¶Œ€÷dÁáÁà1ØÁ‰ÈÁè¶€€÷dƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€È÷dÁà¶”à÷d‰ØÁè ãÿ¶”Ð ÷d‰ØÁèÁâ¶Œ`÷dÁáÁà1ØÁ‰ÈÁè¶€@÷dƒáÓøƒà[ÃvS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€T÷dÁà¶”€÷d‰ØÁè ãÿ¶”ÐÀ÷d‰ØÁèÁâ¶Œ÷dÁáÁà1ØÁ‰ÈÁè¶€÷dƒáÓøƒà[Ãv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€÷dÁà¶Œ@÷d‰ÐÁè¶Ò¶ŒÈ ÷d‰ÐÁè¶ŒÈ@÷dÁáÁà1ÐÁ‰ÈÁè¶€à÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ÷dÁà¶Œ`÷d‰ÐÁè¶Ò¶ŒÈ ÷d‰ÐÁè¶ŒÈ÷dÁáÁà1ÐÁ‰ÈÁè¶€ ÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€`÷dÁà¶Œ ÷d‰ÐÁè¶Ò¶ŒÈà÷d‰ÐÁè¶ŒÈ ÷dÁáÁà1ÐÁ‰ÈÁè¶€À÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ ÷dÁà¶Œà÷d‰ÐÁè¶Ò¶ŒÈ ÷d‰ÐÁè¶ŒÈ` ÷dÁáÁà1ÐÁ‰ÈÁè¶€!÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€à!÷dÁà¶Œ "÷d‰ÐÁè¶Ò¶ŒÈ`"÷d‰ÐÁè¶ŒÈÀ"÷dÁáÁà1ÐÁ‰ÈÁè¶€`#÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€@$÷dÁà¶Œ€$÷d‰ÐÁè¶Ò¶ŒÈÀ$÷d‰ÐÁè¶ŒÈ %÷dÁáÁà1ÐÁ‰ÈÁè¶€À%÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ˆ&÷dÁà¶Œ &÷d‰ÐÁè¶Ò¶ŒÈ '÷d‰ÐÁè¶ŒÈ(÷dÁáÁà1ÐÁ‰ÈÁè¶€€*÷dƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€€-÷dÁà¶ŒÀ-÷d‰ÐÁè¶Ò¶ŒÈ@.÷d‰ÐÁè¶ŒÈ@/÷dÁáÁà1ÐÁ‰ÈÁè¶€à1÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€45÷dÁà¶Œ`5÷d‰ÐÁè¶Ò¶ŒÈà5÷d‰ÐÁè¶ŒÈÀ6÷dÁáÁà1ÐÁ‰ÈÁè¶€@9÷dƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€@<÷dÁà¶Œ€<÷d‰ÐÁè¶Ò¶ŒÈ=÷d‰ÐÁè¶ŒÈ>÷dÁáÁà1ÐÁ‰ÈÁè¶€ @÷dƒáÓøƒàËT$‰ÑÁéâÿ?‰ÐÁè âÿ¶‰D÷d¶ŒÈ`D÷d‰ÐÁè¶Ò¶ŒÈ D÷d‰ÐÁè¶ŒÈE÷dÁáÁà1ÐÁ‰ÈÁè¶€€E÷dƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀE÷dÁà¶ŒF÷d‰ÐÁè¶Ò¶ŒÈ`F÷d‰ÐÁè¶ŒÈG÷dÁáÁà1ÐÁ‰ÈÁè¶€`H÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€J÷dÁà¶Œ@J÷d‰ÐÁè¶Ò¶ŒÈÀJ÷d‰ÐÁè¶ŒÈÀK÷dÁáÁà1ÐÁ‰ÈÁè¶€ÀN÷dƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ÀR÷dÁà¶ŒS÷d‰ÐÁè¶Ò¶ŒÈ@S÷d‰ÐÁ趌ȀS÷dÁáÁà1ÐÁ‰ÈÁè¶€ T÷dƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰dT÷d¶„ÈuT÷d‰ÑÁé âÿÁà¶Œ T÷d‰ÐÁè¶ŒÈàT÷dÁáÁà1ÐÁ‰ÈÁè¶€ U÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€PU÷dÁà¶Œ€U÷d‰ÐÁè âÿ¶ŒÈ U÷d‰ÐÁ趌ȸU÷dÁáÁà1ÐÁ‰ÈÁè¶€àU÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€V÷dÁà¶Œ V÷d‰ÐÁè âÿ¶ŒÈ@V÷d‰ÐÁè¶ŒÈPV÷dÁáÁà1ÐÁ‰ÈÁè¶€`V÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€pV÷dÁà¶Œ V÷d‰ÐÁè âÿ¶ŒÈÀV÷d‰ÐÁè¶ŒÈW÷dÁáÁà1ÐÁ‰ÈÁè¶€`W÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ØW÷dÁà¶ŒX÷d‰ÐÁè âÿ¶ŒÈ X÷d‰ÐÁè¶ŒÈ`X÷dÁáÁà1ÐÁ‰ÈÁè¶€ X÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ðX÷dÁà¶Œ Y÷d‰ÐÁè âÿ¶ŒÈ@Y÷d‰ÐÁ趌ȀY÷dÁáÁà1ÐÁ‰ÈÁè¶€ÀY÷dƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€Z÷dÁà¶Œ`Z÷d‰ÐÁèƒâ¶ŒÈÀZ÷d‰ÐÁè¶Œˆ`[÷dÁáÁà1ÐÁ‰ÈÁè¶€ \÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€à\÷dÁà¶Œ ]÷d‰ÐÁè¶Ò¶ŒÈ`]÷d‰ÐÁ趌Ƞ]÷dÁáÁà1ÐÁ‰ÈÁè¶€@^÷dƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰_÷d¶ŒÈ%_÷d‰ÐÁè âÿ¶ŒÈ5_÷d‰ÐÁè¶ŒÈM_÷dÁáÁà1ÐÁ‰ÈÁè¶€€_÷dƒáÓøƒàÃv‹T$‰ÑÁé·Ò‰ÐÁè âÿ¶‰°_÷d¶ŒÈÁ_÷d‰ÐÁè âÿ¶ŒÈÑ_÷d‰ÐÁè¶ŒÈá_÷dÁáÁà1ÐÁ‰ÈÁè¶€`÷dƒáÓøƒàÃv‹T$‰ÐÁèâÿ‰ÑÁé âÿ¶€ `÷dÁà¶Œ``÷d‰ÐÁè¶Ò¶ŒÈ `÷d‰ÐÁè¶ŒÈ a÷dÁáÁà1ÐÁ‰ÈÁè¶€@b÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€xc÷dÁà¶Œ c÷d‰ÐÁè âÿ¶ŒÈàc÷d‰ÐÁè¶ŒÈ@d÷dÁáÁà1ÐÁ‰ÈÁè¶€ d÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ðd÷dÁà¶Œ e÷d‰ÐÁè¶Ò¶ŒÈ€e÷d‰ÐÁè¶ŒÈf÷dÁáÁà1ÐÁ‰ÈÁè¶€`g÷dƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€h÷dÁà¶ŒÀh÷d‰ÐÁè¶Ò¶ŒÈi÷d‰ÐÁè¶ŒÈ@i÷dÁáÁà1ÐÁ‰ÈÁè¶€Ài÷dƒáÓøƒàÃv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€j÷dÁà¶Œ@j÷d‰ÐÁè âÿ¶ŒÈ`j÷d‰ÐÁ趌Ƞj÷dÁáÁà1ÐÁ‰ÈÁè¶€àj÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Xk÷dÁà¶„€k÷d‰ÑÁé¶ÒÁà¶Œ k÷d‰ÐÁè¶ŒÈÀk÷dÁáÁà1ÐÁ‰ÈÁè¶€Øk÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€äk÷dÁà¶Œl÷d‰ÐÁè âÿ¶ŒÈ l÷d‰ÐÁè¶ŒÈ8l÷dÁáÁà1ÐÁ‰ÈÁè¶€Pl÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€hl÷dÁà¶Œ€l÷d‰ÐÁè âÿ¶ŒÈÀl÷d‰ÐÁè¶ŒÈm÷dÁáÁà1ÐÁ‰ÈÁè¶€@m÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ˆm÷dÁà¶Œ m÷d‰ÐÁè âÿ¶ŒÈÀm÷d‰ÐÁè¶ŒÈÐm÷dÁáÁà1ÐÁ‰ÈÁè¶€àm÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ðm÷dÁà¶Œ n÷d‰ÐÁè âÿ¶ŒÈ@n÷d‰ÐÁè¶ŒÈPn÷dÁáÁà1ÐÁ‰ÈÁè¶€`n÷dƒáÓøƒàÃS‹\$‰ØÁè·Û‰ÚÁê ãÿ¶€pn÷dÁà¶” n÷d‰ØÁè ãÿ¶”ÐÀn÷d‰ØÁèÁâ¶Œàn÷dÁáÁà1ØÁ‰ÈÁè¶€o÷dƒáÓøƒà[Ãv‹T$‰ÐÁè·Ò‰ÑÁé âÿ¶€o÷dÁà¶Œ@o÷d‰ÐÁè âÿ¶ŒÈ€o÷d‰ÐÁè¶ŒÈÀo÷dÁáÁà1ÐÁ‰ÈÁè¶€p÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€@p÷dÁà¶Œ`p÷d‰ÐÁè âÿ¶ŒÈ p÷d‰ÐÁè¶ŒÈàp÷dÁáÁà1ÐÁ‰ÈÁè¶€@q÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€ q÷dÁà¶Œàq÷d‰ÐÁè¶Ò¶ŒÈ r÷d‰ÐÁè¶ŒÈ`r÷dÁáÁà1ÐÁ‰ÈÁè¶€ r÷dƒáÓøƒàËT$‰ÐÁèâÿ‰ÑÁé âÿ¶€àr÷dÁà¶Œ s÷d‰ÐÁè¶Ò¶ŒÈ`s÷d‰ÐÁ趌Ƞs÷dÁáÁà1ÐÁ‰ÈÁè¶€ t÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€„t÷dÁà¶Œ t÷d‰ÐÁè âÿ¶ŒÈÀt÷d‰ÐÁè¶ŒÈØt÷dÁáÁà1ÐÁ‰ÈÁè¶€ðt÷dƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰u÷d¶„Èu÷d‰ÑÁé âÿÁà¶Œ@u÷d‰ÐÁè¶ŒÈ`u÷dÁáÁà1ÐÁ‰ÈÁè¶€xu÷dƒáÓøƒàËT$‰ÑÁé·Ò‰ÐÁè âÿ¶‰u÷d¶„È¡u÷d‰ÑÁé âÿÁà¶ŒÀu÷d‰ÐÁè¶ŒÈàu÷dÁáÁà1ÐÁ‰ÈÁè¶€ v÷dƒáÓøƒàËT$‰ÐÁèâÿ?‰ÑÁé âÿ¶€`v÷dÁà¶ŒÀv÷d‰ÐÁèƒâ¶ŒÈ w÷d‰ÐÁè¶Œˆ w÷dÁáÁà1ÐÁ‰ÈÁè¶€@x÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€Ìx÷dÁà¶Œàx÷d‰ÐÁè âÿ¶ŒÈ y÷d‰ÐÁè¶ŒÈ@y÷dÁáÁà1ÐÁ‰ÈÁè¶€`y÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ˆy÷dÁà¶Œ y÷d‰ÐÁè âÿ¶ŒÈÀy÷d‰ÐÁè¶ŒÈØy÷dÁáÁà1ÐÁ‰ÈÁè¶€z÷dƒáÓøƒàËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ z÷dÁà¶Œ@z÷d‰ÐÁè¶Ò¶ŒÈ€z÷d‰ÐÁè¶ŒÈÀz÷dÁáÁà1ÐÁ‰ÈÁè¶€ {÷dƒáÓøƒàÃv‹L$‰ÈÁè·É‰ÊÁê áÿ¶€\{÷dÁà¶„€{÷d‰ÊÁêƒáÁà¶”À{÷d‰ÈÁèÁâ¶”@|÷dÁà1ȶ„Ð}÷dÃf‹T$‰ÐÁè âÿ‰ÑÁéƒâ¶€`}÷dÁà¶Œ€~÷d‰ÐÁèƒâ¶ŒÈ€€÷d‰ÐÁè¶Œˆ „÷dÁà1ж„ˆ ˆ÷dËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ Š÷dÁà¶ŒÀŠ÷d‰ÐÁèƒâ¶ŒÈ ‹÷d‰ÐÁè¶ŒÈ÷dÁà1ж„ˆÀ÷dËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€€‘÷dÁà¶„ ’÷d‰ÑÁéƒâÁà¶Œ`“÷d‰ÐÁè¶ŒˆÀ–÷dÁà1ж„ˆ€š÷dËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€àœ÷dÁà¶„ž÷d‰ÑÁéƒâÁà¶ŒŸ÷d‰ÐÁè¶Œˆ@¡÷dÁà1ж„ˆà¢÷dËL$‰ÈÁè·É‰ÊÁê áÿ¶€„£÷dÁà¶„ £÷d‰ÊÁêƒáÁà¶”À£÷d‰ÈÁèÁâ¶”¤÷dÁà1ȶ„Ð`¤÷dÃf‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€€¥÷dÁà¶„ ¦÷d‰ÑÁéƒâÁà¶Œ@§÷d‰ÐÁè¶Œˆ ª÷dÁà1ж„ˆ@¬÷dËT$‰ÐÁè âÿ‰ÑÁéƒâ¶€ ­÷dÁà¶Œ@®÷d‰ÐÁèƒâÈ·Œ ±÷d‰ÐÑè¶ŒÈ@¼÷dÑà1ж„HÊ÷dÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@Ë÷dÁà¶Œ`Ì÷d‰ÐÁèƒâ¶ŒÈàÍ÷d‰ÐÁè¶Œˆ`Ð÷dÁà1ж„ÈÀÑ÷dËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ Ó÷dÁà¶ŒÀÔ÷d‰ÐÁèƒâ¶ŒÈ@Ö÷d‰ÐÁè¶ŒÈÀØ÷dÁà1ж„ˆ@Ü÷dËT$‰ÐÁè·Ò‰ÑÁé âÿ¶€ ß÷dÁà¶Œ ß÷d‰ÐÁè âÿ¶ŒÈ`ß÷d‰ÐÁ趌Ƞß÷dÁáÁà1ÐÁ‰ÈÁè¶€ à÷dƒáÓøƒàËT$‰ÐÁè âÿ‰ÑÁé¶Ò¶€@á÷dÁà¶„àá÷d‰ÑÁéƒâÁà¶Œ`â÷d‰ÐÑè¶ŒÈÀã÷dÑà1ж„H æ÷dÃv‹T$‰ÐÁè âÿ‰ÑÁé¶Ò¶€ æ÷dÁà¶„@ç÷d‰ÑÁéƒâÁà¶Œàç÷d‰ÐÁè¶Œˆ`é÷dÁà1ж„ˆàë÷dÃSQ‹\$ ‰$èçÿÿ…Àu‰$è‚äÿÿƒø ”À¶ÀZ[Ãf¸Z[øÃf1Àƒ|$–ÀÃP‹D$‰$èKäÿÿ…À•À¶ÀZÃP‹D$ƒø t‰$è.äÿÿƒø ”À¶ÀYÃv¸YÃSQ‹\$ ‰$èæíÿÿ…Àu‰$èþãÿÿº€ˆÁÓú1Àƒâ”ÀZ[Ãf1ÀZ[ÃvSP‹\$ ‰$èºÿÿÿ…Àu ‰$è†ÿÿÿ…Àt‰$èºãÿÿƒø•À¶À[[Ãf1À[[ÃvSQ‹\$ ‰$è æÿÿ…Àu*‰$èŠãÿÿºÀ@ˆÁÓúƒâu‰$è îÿÿ…À•À¶ÀZ[øZ[ÃSP‹\$ ‰$èRãÿÿƒø t‰$èaðÿÿ…À•À¶À[[Ãf¸[[ÃVS‹D$ ‹T$‰ÁÁé ‰Ææÿ‰óÁëæÿ¶‰€î÷dÁá¶œ ï÷d‰ñÁéÁã¶œàï÷dÁá1ñ¶ŒÙ`ò÷d IÁá™@öd‰‹‰@öd…Ét'Á‰J‹K…Ét#Á‰J‹K…ÉtȉB ¸[^Ãf¸ëô¸ëì¸ëäS‹D$‰ÂÁê ‰Ããÿ‰ÙÁé¶Û¶’`ö÷dÁâ¶Œ÷÷d‰ÚÁêÁá¶Œ À÷÷dÁâ1Ú¶”Êàù÷d•@ü÷d[ÃfVS‹D$ ‹\$‰ÂÁê ‰Ææÿ‰ñÁéæÿ¶’€ý÷dÁâ¶Œ þ÷d‰òÁêÁá¶Œ àþ÷dÁâ1ò¶”Ê ødÁâ‚ öd‰‹‚¤ödf…Àt!·À‰Cf‹‚¦ödf…Àt·À‰C¸[^øëõ¸ëíÿ%T‚ødÿ%P‚ødÿ%X‚ødÿ%D‚ødÿ%8‚ødÿ%d‚ødÿ%`‚ødÿ%H‚ødÿ%@‚ødÿ%\‚ødU‰åƒì‹E ƒøt…Àu‹U‰T$‰D$‹E‰$訸ɠvU‰åSƒì‹E ƒ=@`ødt Ç@`ødƒøtHt?¸ƒÄ[É f»ødûødtäv‹…ÀtÿЃÃûøduí¸ƒÄ[É ‹E‰D$ÇD$‹E‰$èë¥U‰å1ÀÉÃU‰å¸É U‰åVSƒìu ‹l‚ødƒÃ@‰\$ ÇD$ÇD$Ç$$ødèL‰t$‹E‰D$‰$èAèDU‰åWVSƒìL‰Ã‰Ö…Éu eô[^_ÉÃvÇD$EȉD$‰$‰MÄè.ƒì …À‹MÄ„ˆ‹E܃ø@ttƒøtoUä‰T$ ÇD$@‹EÔ‰D$‹Eȉ$‰UÀ‰MÄèôƒì‹EÜ‹Mĉßó¤ƒø@‹UÀt„ƒø„{ÿÿÿ‰T$ ‹Eä‰D$‹EÔ‰D$‹Eȉ$蹃ìeô[^_ÉÃf‰ßó¤eô[^_ÉÉ\$ÇD$Ç$<ødèÐþÿÿU‰åWVSƒì,¡8`ød…Àt ƒÄ,[^_ÉÃfÇ8`ød¸Ðød-Ðødƒø~Ý»Ðødƒø ~a‹=Ðød…ÿu ‹5Ôød…öt=ûÐøds¶¾ôd}à‹Cð‹‰U้úè þÿÿƒÃûÐødr݃Ä,[^_ÉË Øød…Éu»Üød‹…Òu®‹C…Àu§‹Cƒø…ƒÃ ûÐødƒJÿÿÿ¸ôdC‹ ‹±ôd‹SâÿƒútFƒú tyƒútÇEä‰T$Ç$¤ødèÉýÿÿ¶8÷Ç€t$Ïÿÿÿ)Ïïôd47‰uäë,v·8÷Ç€ua)ωùéôdñ‰Mäƒútaƒú t#ƒúu+¹Uäèºýÿÿë‹)Êêôdò‰Uä¹UäèœýÿÿƒÃ ¸Ðød9؇8ÿÿÿé}þÿÿvÏÿÿ)Ïïôd47‰uä¹UäècýÿÿëʼnD$Ç$pødèýÿÿU‰åƒì¡"öd‹…ÀtvÿС"ödP‰"öd‹@…ÀuéÉÃvU‰åSƒì‹T¾õdƒûÿt"…Ût fÿT¾õdKuöÇ$D»õdè–UþÿƒÄ[ÉÃ1Ûë‰ÃC‹…T¾õd…ÒuðëÈfU‰åƒì‹ <`ød…ÉtÉÃfÇ<`ødÉë“U‰åVSƒì¡D`ød…Àueø[^ÉÃÇ$H`ødèQ‹``ød…Ût*‹‰$èòR‰Æèò…Àu …öt‹C‰4$ÿЋ[…Ûu×Ç$H`ødè×Peø[^ÉÃvU‰åSƒì¡D`ød…Àu1À‹]üÉÃÇD$ Ç$è`‰Ã…Àt7‹E‰‹E ‰CÇ$H`ødèkP¡``ød‰C‰``ødÇ$H`ødèhS1À멸ÿÿÿÿë¢U‰åSƒì‹]¡D`ød…Àu 1À‹]üÉÃfÇ$H`ødèQ‹``ød…Òt‹9Øu ëB‹9Ùt‰Â‹B…ÀuñÇ$H`ødèR1À‹]üÉËH‰J‰$èþùÿÿÇ$H`ødèâRëÛ‹B£``ød‰ÐëÝvU‰åƒì‹E ƒøt>rƒøuèzþÿÿ¸ÉÃvèkþÿÿ¡D`ødHuéÇD`ødÇ$H`ødè‘PëÐf¡D`ød…ÀtÇD`ød¸ÉÃfÇ$H`ødèlRëÞÿ%x‚ødÿ%|‚ødÿ%p‚ødÿ%t‚ødÿ%‚ødÿ%‚ødÿ%0‚ødÿ%,‚ødÿ%‚ødÿ%(‚ødÿ%‚ødÿ%$‚ødÿ% ‚ødÿ% ‚ødU‰åƒìèASþÿÇ$ôdèéRþÿÉÃÿÿÿÿ8¾õdÿÿÿÿxLöd†Löd”LödžLöd¬Löd¾LödÌLödØLödèLödõLödMödMöd Möd0MödDMöd\MödpMöd‡Möd¡Möd½MödÇMödÙMödíMödNödNöd5NödGNödSNödkNödNöd‹NödœNöd¯NödÁNödÒNödÝNödìNödÿNödOöd)Oöd5OödEOödYOödiOödyOödOöd¥Oöd¹OödÑOödåOödùOödPödPöd2PödEPödUPödiPödPöd•Pöd¨Pöd¿PödÚPödñPödQödQöd-QödAQödUQödkQödQöd•Qöd¢Qöd³QödÈQödÙQödîQödÿQödRöd%Röd>RödSRödlRödRödRöd¡Röd±RödÉRödÙRödïRödSödSöd0SödASödRSöddSödˆCompiled regex objectsSöd”ƒõd@ÌõdySödhƒõdàÌõdƒSöd<ƒõd€ÍõdŠSöd$‘õd`ÎõdŽSöd`õd€Ïõd“Södœõd Ðõd˜SödØŽõdàÑõdžSöd}õd Óõd¤Söd|èôd Óõd®SödHyõd Ôõd¶SödtèôdÕõd¿Södäæôd ÖõdÇSöd„ôdÐSödŒôdÝSödèSöd%Töd +TödETöd LTöd{Töd4ˆTöd«Töd¼=ôd¸TödëTöd<HôdøãôdMatch objectøTöd0ßôd×õdþTödÈÞôd ØõdUöd´Þôd`ÚõdUöd Þôd ÜõdETödôÚôd Þõd Uöd|âôdàÞõdUödÜäôdàßõd$Uödè‘õd€àõd+Uöd0áôd áõd3UödŒÞôd áõd MatchObject or None. Match zero or more characters at the beginning of the string.fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Match zero or more characters against all of the string.search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None. Search through string looking for a match, and return a corresponding match object instance. Return None if no match is found.sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement repl.subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern in string by the replacement format.subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement repl.subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs) Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of pattern with the replacement format.split(string, string, maxsplit=0, concurrent=None) --> list. Split string by the occurrences of pattern.splititer(string, maxsplit=0, concurrent=None) --> iterator. Return an iterator yielding the parts of a split string.findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list. Return a list of all matches of pattern in string. The matches may be overlapped if overlapped is True.finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator. Return an iterator over all matches for the RE pattern in string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a MatchObject.scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner. Return an scanner for the RE pattern in string. The matches may be overlapped if overlapped is True.group([group1, ...]) --> string or tuple of strings. Return one or more subgroups of the match. If there is a single argument, the result is a single string, or None if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the whole match is returned. Group 0 is the whole match.start([group1, ...]) --> int or tuple of ints. Return the index of the start of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the start of the whole match is returned. Group 0 is the whole match.end([group1, ...]) --> int or tuple of ints. Return the index of the end of one or more subgroups of the match. If there is a single argument, the result is an index, or -1 if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the index of the end of the whole match is returned. Group 0 is the whole match.span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints. Return the span (a 2-tuple of the indices of the start and end) of one or more subgroups of the match. If there is a single argument, the result is a span, or (-1, -1) if the group did not contribute to the match; if there are multiple arguments, the result is a tuple with one item per argument; if there are no arguments, the span of the whole match is returned. Group 0 is the whole match.groups(default=None) --> tuple of strings. Return a tuple containing all the subgroups of the match. The argument is the default for groups that did not participate in the match.groupdict(default=None) --> dict. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name. The argument is the value to be given for groups that did not participate in the match.capturesdict() --> dict. Return a dictionary containing the captures of all the named subgroups of the match, keyed by the subgroup name.expand(template) --> string. Return the string obtained by doing backslash substitution on the template, as done by the sub() method.expandf(format) --> string. Return the string obtained by using the format, as done by the subf() method.captures([group1, ...]) --> list of strings or tuple of list of strings. Return the captures of one or more subgroups of the match. If there is a single argument, the result is a list of strings; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the captures of the whole match is returned. Group 0 is the whole match.starts([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the starts of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the starts of the captures of the whole match is returned. Group 0 is the whole match.ends([group1, ...]) --> list of ints or tuple of list of ints. Return the indices of the ends of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of indices; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the indices of the ends of the captures of the whole match is returned. Group 0 is the whole match.spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints. Return the spans (a 2-tuple of the indices of the start and end) of the captures of one or more subgroups of the match. If there is a single argument, the result is a list of spans; if there are multiple arguments, the result is a tuple of lists with one item per argument; if there are no arguments, the spans of the captures of the whole match is returned. Group 0 is the whole match.detach_string() Detaches the target string from the match object. The 'string' attribute will become None.match() --> MatchObject or None. Match at the current position in the string.search() --> MatchObject or None. Search from the current position in the string.split() --> string or None. Return the next part of the split string.0Yöd`Äôd8YödèôdFYödxôdUYöd„£ôd_Yödø-ôduYöd€ôdˆYöd ôd̘õd$™õdx™õdЙõd(šõd€šõdØšõd@›õd¨›õdœõdˆœõdøœõd`õdÈõd0žõd˜žõdŸõdhŸõdПõd8 õd  õd¡õdp¡õdØ¡õd@¢õd¨¢õd£õdx£õdà£õdH¤õd°¤õd¥õd€¥õdè¥õdP¦õd¸¦õd §õdˆ§õdð§õdX¨õdÀ¨õd(©õd©õdø©õd`ªõdȪõd8«õd «õd¬õdp¬õdجõd@­õd¨­õd®õdx®õdà®õdH¯õd°¯õd °õd`°õd´°õd ±õdd±õdÀ±õd²õdp²õdIJõd³õd€³õdسõd0´õd`´õdh´õdt´õdŒ´õd´´õdì´õd(µõdlµõdß0Ið°‡–—˜™šžPRTV€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯²³´¶·¼ÂÃÄÆÇÌÒÓÖ×âãäæçòóôö÷üûûûûûûûûûûûû9cAÊĽ%ɾ\¿)ÑäÝ㦠¶  ± ! ` " Ü ~ » | j}~dñ:‹eú‡¢pOŽastoaƒáÑ‹¼ÐbÖT€ìtV¯ŽÛ Ô k Ó 4!!!‘"h""i"ÿ#±#²#Æ$w$x$%#ѹ—•–˜Ÿš^]Þg³ ” š ™ › µ / ¨ ´³ ¶Ùª©­ÛQ|×Ï!’ "! "þ#%$c$Õ%Û&Ú&C':((4(@)¯*+,,ÿ-.†/ 0;151´2 34‡5ý6 7Ì8ç9Ò:®;D<é=è=I>H>}?|?~@@iAµAžB™BCCûD‘DïEîEŒFhGlG´G°H5I¸JßKàKúLÿLMPN=NÊOÉOñPèQüR÷SþS·TõUûUñVëV÷WöWòXìXöYüYóZðZø[ô[\ ]›]^_ÿ_$`ØaÖa—b•bôcùcUdTd{ezeDf@fXgWg:h~iëj$kqkylímìmVnooÎpÍpJqHqZrPrrsqsYtGttusv¼wCx˜y–yÎz{¡|œ|þ}n~N~vº€¯®‚‚Ÿƒ&„d„g…<†‡‡ ˆê‰é‰ÙŠ×Šè‹(Œ#Œ'e8Ž67ÅŒ‘‹‘‘L’N’“œ“±”¯”F•U•L–j——K˜I˜Ô™Ó™²š°š››ßœ¸·žŸ£ ¤¡x¢w¢Ð£ ¤F¥¦7§G¨«©ÉªU«“¬K­{®Ò¯î°í±…²H³Æ´XµW¶I·®¸­¸ô¹sºÙ»;¼È½¾ˆ¿ŠÀ‰ÀÅÁÐÂÏÂïÃwÄvÄÅÅ Æ Æ¢Ç¡Ç È ȃÉ‚ÉÞÊÝÊ­ˬËÖÌÕ̹͸ÍÎËÏÌÏÐÐÏÐùÑýÑÆÒ1Ó0Ó–Ô•Ô[ÕQÕ\ÖRÖ]×S×MØOØÙGÚVÚõÛ÷ÛöÜøÜ=‚m”¢ ”œµ·/.¨§   ­ ¬ Û Ú     QS|‰×ÏÎ!’“"# þý#"ÕÔCB @?¯°†ˆ   :!9!~"u"ë#ê#!$*$o%p%F&b&''«(¾(Q)“){)**,+++ÿ,þ,--´.³. //¶0µ07161É2Ê2U3T3’4…4ö5õ5ý6ü67’7€78899$::þ;ý;GË>ˆ?h?{@z@vAuAB BçCæC®D­DDEEECFDFºG¹G‚HtHŸI¨IÐJÏJ K KÒLÑL<M N‘N OOÆPÇPÅQÄQ¶R·R¼SÎTÍTgUfUèV VKW¶WHX¸XXYYWZyZI[R[s\‹\Ò]Ó]ô^ó^Ù_Ø_;``íaëaîbìbïc‚cÈdÌdÙeØeff€gVi¼½Íà0;†²!✡ñ ï ~ q ˜ ¤ ð  ñ  òâ62äßVi†²~câßœ¡ÝÑB Ë Í ‰ Vi†²âßÅÀñïÚ¿?>J ¤ 6 2 À ¼ ä ã _ ^ ½¼"åænj2,¥SB.ÌËÎÍ©¤šÜÇÝÒÞÓ® o‡jȱZ ` _ M ð é ) 0 « “ ¬È§«ªÆ¥©„q«Ç¦ªîô…r- .  f e  3  w x ~ Œ M T „         ! " ! # # $ $ % & & ' ' + ( 0 ) 5 * ; + @ , B - C . D / E 0 F 1 M 2 Q 3 R 4 S 5 T 6 U 7 V 8 ƒ 9 !Š ! " " # # $ $ % % & & ' ' ( (à )/ )¿ )Á *1 *½ * +¾ +2 +Ø ,ä ,4 ,× -È -6 -Ù .ò .7 .¦ /8 / /¢ 0š 09 0 1: 1“ 1Œ 2‹ 2< 2Ž 3¦ 3= 3» 4> 4£ 4º 5? 5ž 5\ 6_ 6A 6  7Ä 8'   p f ð $  S R æ å ë ê a ` E È í ê å K J [   Ò Õ â á ó ò   Ÿ ‹   [ W õ å   % ’ ” — Ö Ü Ÿ   Á é í ö ÷    - 1 2 3 r } Š   ç ó + 9 s ” • ž   ´ !µ "Á #à $Ë %û & ' ( ) *X + ,k -l .m /u 0v 1y 2z 3ƒ 4è 5 6ç 7; 8¬ 9( 3 k  À  £ š ¨  /  =iONa^˜—*/àßûüP_ˆ ‡ † ƒ 6 2 › “ C ? YZL>=kbùÔøÊÛÚÚㆺ²}r³Ÿ‘úÉúÇ€!_\ip o!"#`$„$0%;%s&F&œ'¡''62¶°¥¤    H    L *Km)J[lyI(kGxZ…j r!"w#"$~%%&„' ()*+ ,!-#.$/&0'1+20354;5@6B7C8D9E:F;MS?T@UAVBWCXDYE\F`GaHbIdJeKfLgMhNiOnPsQzRS†TU,VNW]XoYtZ{[€\‡]^-_O`^apbuc|deˆfg.hPi_jqkvl}m‚n‰op3qcrst¢¦O§(î)-+ , ï * g [VâNÅ3MRQPz u v { | ywx&'úøçæ¾¼^Y ùĻܛšÃÂ@ ?   D ?  A ‘ @=>ŽIEA@fedc¨°   ZaÛßÝlj¡>™–^ L 5!4!º""W#<#C$B$²%±%ã&á&]'K'c(d(&))Y*A*G+F+J,H,›-<.8.X/>/ª0©0×1¿1Á2À2[3C3Z4B4ä5E6U6m7n7l8k8)9<9Þ:Õ: ; ; §< ¿< Ã= Â= m> h> n? o? ¹@£@7A1A8B:BáCàCMDUDOEVEžF™F¥G¹H»IåJKŠL]MbN Yöd¥Yöd§Yöd©Yöd®Yöd³Yöd·Yöd»Yöd¿YödÃYödÇYödËYödÏYödÓYödÖYödÚYödßYödåYödìYödöYödZödZöd ZödZödZödZödZödZöd#Zöd&Zöd+Zöd/Zöd3Zöd6Zöd9Zöd>ZödAZödDZödIZödLZödOZödQZödUZödYZöd\Zöd`ZödeZödkZödoZödrZödvZödzZödZöd…ZödˆZödŒZödZöd”Zöd˜ZödœZödŸZöd£Zöd§Zöd«Zöd¯Zöd²Zöd¶Zöd¹Zöd¼Zöd¿ZödÂZödÅZödÇZödÌZödÐZödÔZödØZödÜZödßZödãZödèZödîZödñZödôZöd÷ZödúZödýZöd[öd[öd[öd [öd [öd[öd[öd[öd[öd![öd$[öd'[öd*[öd1[öd4[öd7[öd:[öd=[öd@[ödC[ödE[ödI[ödM[ödQ[ödT[ödX[öd][ödc[öde[ödh[ödl[ödq[ödw[ödy[öd}[öd[öd„[ödˆ[öd[öd“[öd•[öd˜[ödœ[öd¡[öd§[ödª[öd¬[öd°[öd³[öd·[öd¼[ödÂ[ödÅ[ödÇ[ödÍ[öd×[ödâ[ödð[ödõ[ödø[ödü[ödÿ[öd\öd\öd"\öd'\öd/\öd5\öd;\ödF\ödS\ödo\öd|\öd†\öd‰\öd›\öd·\ödË\ödÚ\ödÞ\ödá\ödæ\ödí\ödø\öd]öd]öd ]ödD]ödQ]öd[]öde]öd~]öd—]öd¡]öd²]öd»]ödÀ]ödÅ]ödÌ]ödÒ]ödà]ödé]ödì]ödð]ödõ]ödù]ödÿ]öd ^öd ^öd.^öd@^ödI^ödQ^ödV^ödX^öd[^öd^^ödc^ödl^ödq^ödw^öd€^öd^öd›^öd¡^öd¦^öd©^öd¬^öd°^öd¶^ödÀ^ödË^ödÐ^ödØ^ödÝ^ödã^ödí^ödù^ödÿ^öd _öd_öd_öd_öd_öd"_öd(_öd6_öd9_öd>_ödG_ödS_ödd_ödk_ödz_ödŠ_öd•_öd˜_öd_öd¤_öd©_öd±_ödÁ_ödÌ_ödØ_ödâ_ödï_ödô_ödý_öd`öd`öd`öd+`ödC`ödE`ödH`ödM`ödQ`ödd`ödv`öd€`öd˜`öd`öd¢`öd©`öd¸`öd¾`ödÊ`ödØ`ödÛ`ödÞ`ödâ`ödè`ödï`ödö`ödü`ödaöd aödaödaödaöd$aöd+aöd2aöd8aöd>aödDaödJaödPaödVaöd\aödbaödhaödnaödtaödzaöd€aöd†aödŒaöd’aöd˜aödžaöd¤aödªaöd°aöd¶aöd¼aödÂaödÈaödËaödÒaöd×aödíaödbödböd/bödEbödJbödSbödVböd]böd`böddbödnböd}bödŽböd¤bödÀbödåbödùbödcödcöd cöd(cöd0cöd?cödUcöd`cödkcöd„cödœcöd¼cödÜcödücöddöddöd$död5dödFdödIdödLdödRdödUdödYdödtdöd˜död¼dödÏdödÝdödödödýdödeöd$eöd+eöd6eödEeöd`eödueödeödeödœeöd°eödÀeödÕeödäeöd÷eödfödfödföd$föd+föd7födKfödNfödSfödVfödYfödcfödtföd“föd¢föd²föd·föd¼födÀfödÄfödÈfödÐfödáfödêföd÷födgödgöd(göd4gödGgöd]gödbgöddgödggödkgödvgöd{göd‹gödŽgöd‘göd™göd§göd¹gödÓgöd×gödâgödêgödïgödúgödhödhödhöd"höd,höd9hödPhöd`hödfhödohödvhöd‚hödŽhödšhöd¦höd©höd®höd±höd½höd¿hödÂhödÑhödÖhödêhödôhöd÷hödûhöd iöd$iödCiödWiödciödiöd–iöd´iödÂiödÅiödÈiödÍiödÖiödâiödïiödjödjödjöd1jöd@jödRjödejödhjödtjödxjödjödˆjöd•jöd—jödjöd¦jöd©jöd­jöd±jöd·jödÈjödÕjödèjödëjödðjöd÷jödûjödködködködködködköd#köd3ködFködVköd[köddködpködƒköd†köd‹köd–köd›köd köd§köd­ködºködÏködÞködëködòködøködlödlödlöd#löd)löd0löd9löd>lödGlödLlödNlödQlödTlödXlödilödslöd}löd˜löd§löd«löd°löd·lödÏlödÚlödîlödmödmöd%möd*möd/möd7möd:möd?mödFmödSmödWmöd_möddmödhmödqmödŠmöd›mödªmöd¯möd¸möd»möd¿mödÂmödÉmödÌmödÐmödÛmödàmödìmöd nödnödnöd(nöd-nöd5nödHnödXnöd[nödnnödnöd•nöd¢nöd¬nöd±nöd¹nödÌnödÑnödÖnödënödoöd oödoöd#oöd1oöd8oödFoödIoödMoödVoöd[oöd`oödioödroödwoöd€oödƒoöd†oödŒoöd˜oöd¤oöd±oöd½oödÀoödÃoödÆoödÊoödÑoödÖoödÛoödãoödòoödþoödpöd pödpöd#pöd(pöd1pöd=pödPpödkpödspödypöd~pöd‰pödpödœpöd¡pöd¦pöd±pöd¶pöd¹pöd»pöd¾pödÂpödÉpödÎpödÒpöd×pödÝpödäpödîpödÿpöd qödqöd&qöd0qöd:qödIqödaqödpqödqödŽqöd“qöd–qöd™qöd¥qödªqöd·qödÃqödÏqödäqöd÷qöd rödrödrödröd0röd=röd@rödErödKrödPrödXrödirödzröd„rödröd›röd röd£röd¦röd©röd­rödÃrödÉrödÓrödãrödñrödõrödùrödýrödsödsödsödsödsöd!söd&söd-söd2söd9söd;söd>södFsödSsöd]södbsödjsödysöd~södƒsödsöd°södÆsödÔsödßsödâsödåsödèsödìsödósödøsödtödtöd)töd.töd3tödCtödWtöd\tödftödmtödwtöd{tödˆtöd¬tödÎtödãtöduöd'uöd>uödOuöd`uödpuöd|uödŠuöduöd’uöd•uöd¤uöd´uödÃuöd×uödçuödìuödöuödûuödvödvödvöd$vöd5vöd:vödyödLyöd^yöddyödgyödjyödnyödryöduyödxyöd}yöd…yödŽyöd›yöd yöd¥yöd°yöd¼yödÏyödìyödûyödþyöd zödzödzöd(zöd>zödMzödPzöd^zödfzödlzödwzöd†zöd‹zödŽzöd’zöd˜zöd¤zöd©zöd®zöd²zöd·zöd½zödÀzödÊzödØzödÚzödâzödôzöd{öd{öd{öd{öd{öd#{öd0{öd<{ödQ{ödd{ödx{öd}{öd{öd…{öd‰{öd•{ödš{öd­{öd³{öd¸{ödº{öd½{ödÀ{ödÄ{ödÊ{ödÔ{ödÙ{ödÞ{ödã{ödî{ödñ{ödô{ödþ{öd|öd|öd |öd|öd!|öd)|öd7|öd;|ödE|ödH|ödP|ödX|öd]|ödb|ödg|öds|ödx|öd€|ödƒ|öd†|ödŒ|öd—|öd©|öd­|öd°|öd»|ödÀ|ödÌ|ödÏ|ödÕ|ödä|ödð|öd}öd}öd}öd}öd}öd!}öd'}öd+}öd0}öd:}ödG}öd[}öd_}ödj}ödu}öd{}öd‡}öd¡}öd²}ödÆ}ödÜ}ödþ}öd~öd3~ödP~ödX~öd`~ödo~ödy~öd‚~öd…~ödŠ~öd–~öd~öd¢~öd©~öd³~ödµ~öd½~ödÂ~ödË~ödÐ~ödÔ~ödÚ~ödâ~ödê~ödö~öd ödödödödöd$öd)öd.öd2öd=ödLödQödXöd]ödqödvöd{öd€öd…ödŒöd‘öd™ödžöd§öd·ödÂödËödÏödÜödñödüöd€öd€öd(€öd4€ödD€öd[€öd`€ödb€ödg€ödo€ödt€öd}€ödƒ€öd€öd´€öd߀ödð€ödø€ödû€ödöd ödödöd!öd&öd8ödKödhödqödöd†ödödöd¤öd¬öd¼ödÂödÑödâödìödïödòödøödúödþöd‚öd ‚öd‚öd‚öd‚öd#‚öd.‚öd1‚öd8‚öd?‚ödD‚ödP‚ödU‚öd^‚ödc‚ödh‚ödk‚ödm‚ödq‚öd{‚öd‡‚öd‹‚ödŽ‚öd“‚ödš‚öd°‚öd»‚ödÇ‚ödÌ‚ödÓ‚ödÕ‚ödØ‚ödÝ‚ödã‚ödè‚ödë‚ödî‚ödñ‚ödô‚ödü‚ödƒöd è ß ,àÿÿÿàÿÿÿÇàÿÿÿ¿ àÿÿÿ ç f ¿àÿÿÿF yÿÿÿÿ9ÿÿÿÿÿÿ‡ÿÿÿÔþÿÿôþÿÿÃÒÎÍOÊËÏaÓÑ£Õ‚ÖÚÙÛ8ÿÿÿÿþÿÿÿÿÿÿÿ±ÿÿÿŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*?*=ÿÿÿEG***.ÿÿÿ2ÿÿÿ3ÿÿÿ6ÿÿÿ5ÿÿÿ1ÿÿÿ(¥D¥/ÿÿÿ-ÿÿÿ÷)ý)+ÿÿÿ*ÿÿÿç)&ÿÿÿ»ÿÿÿ'ÿÿÿ¹ÿÿÿ%ÿÿÿTty&%@?C > ` 9\¬ÿÿÿ % Výÿÿ 6 P / }ÚÿÿÿÛÿÿÿ3àÿÿÿàÿÿÿ@àÿÿÿ<Œÿÿÿàÿÿÿàÿÿÿ6ùüÿÿàÿÿÿàÿÿÿàÿÿÿ0áÿÿÿàÿÿÿÿÿÿÿàÿÿÿàÿÿÿ]ÀÿÿÿÁÿÿÿÂÿÿÿâÿÿÿÇÿÿÿçÿÿÿ#ÑÿÿÿñÿÿÿÊÿÿÿêÿÿÿøÿÿÿªÿÿÿÊÿÿÿ°ÿÿÿÐÿÿÿ¤ÿÿÿÄÿÿÿÝÿÿÿ ÿÿÿÀÿÿÿùÿÿÿP°ÿÿÿñÿÿÿ0Ðÿÿÿ`Šæ;ÿÿÿÿ:ÅÿÿÿÆÿÿÿAâÿÿJVd€p~ ¶ÿÿÿ÷ÿÿÿ‡ãÿÿÛãÿÿûãÿÿªÿÿÿ½ãÿÿœÿÿÿÍãÿÿÿÿÿ€ÿÿÿ‚ÿÿÿƒâÿÿ£âÿÿ!ßÿÿAßÿÿšßÿÿºßÿÿäÿÿÿðÿÿÿæÿÿÿ ÖÿÿñÿÿÖÿÿÕÕÿÿØÕÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿ ãÿÿüuÿÿØZÿÿ¼Zÿÿ(Øÿÿÿ ”ÿÿÿs9ÿÿÿsn‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛzþÿÿ ŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?)âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0Þÿÿÿ‚`Òáÿÿ1Ýáÿÿßáÿÿ àáÿÿ Çáÿÿ¾ÆÿÿÿÕáÿÿsøÿÿÿuäÿÿsäÿÿqäÿÿoäÿÿB€ÿÿÿ¹xÿÿÿ¹ÿÿÿ¹ˆÿÿÿ¹Àÿÿÿ¹¸ÿÿÿ¹¾ÿÿÿ¹þãÿÿ¹øãÿÿ¹ûãÿÿBúãÿÿB¹¶ÿÿÿõãÿÿ¹ûãÿÿ²ÿÿÿ¹ôãÿÿ¹êãÿÿ¹ñãÿÿBðãÿÿB¹ªÿÿÿëãÿÿ¹çãÿÿæãÿÿããÿÿBâãÿÿBœÿÿÿããÿÿâãÿÿÝãÿÿßãÿÿBÞãÿÿBÿÿÿŠÿÿÿ¹Öãÿÿ¹Úãÿÿ¹ÓãÿÿBÒãÿÿB¹€ÿÿÿ‚ÿÿÿÍãÿÿ¹£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿfÿÿfeÿÿidÿÿlcÿÿfibÿÿflnÿÿtmÿÿta ÿÿv` ÿÿe_ ÿÿkh ÿÿv] ÿÿm(d¾õdlibgcc_s_dw2-1.dll__register_frame_infolibgcj-12.dll_Jv_RegisterClasses__deregister_frame_info@ôd,ôdôd ôdüôdìôdTôdÈôd£ôdÂôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd¸ôd£ôd£ôd£ôd¸ôdÂôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôd£ôdÂôd£ôdØôd£ôdØôd£ôd£ôdÂôdªôdªôdøôdøôdøôdøôdøôdøôdªôdªôdªôdªôdøôdøôdøôdøôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdªôdøôdøôdøôdøôdøôdøôdøôdøôdªôdªôdªôdªôdªôdªôdªôdøôdøôdøôdøôdøôdøôdøôdøôdøôdøôdøôdøôdøôdøôdøôdøôd²ôdçôd²ôd²ôd²ôd²ôd²ôd²ôdôd²ôdÄôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôdüôd²ôdpôd|ôdüôdôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôdpôdpôdpôdpôdpôdpôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôd²ôdéôd²ôdéôdÄôd²ôdÄôdSôdSôdiôdiôdiôdiôdiôdiôdSôdiôdSôdSôdiôdiôdiôdiôdiôdiôdiôdSôdiôdiôdiôdiôdiôdiôdSôdiôdSôdSôdSôdSôdSôdSôdSôdiôdiôdiôdiôdiôdiôdiôdiôdSôdSôdSôdSôdSôdSôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdiôdnn:has_property_valuennn:get_all_casesUx$ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôd¸#ôdT$ôdì#ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôd $ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôdý"ôd#ôd#ôdX#ôd#ôdt#ôd„#ôd0$ôdØ#ôdh#ôd¤$ôdý$ôdß$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd²$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôdÁ$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd¤$ôd„$ôdnnM:\projects\regex\regex_3\regex\_regex.cPyUnicode_Check(string)PyUnicode_IS_READY(string)((PyUnicodeObject*)(string))->data.anyexpected string or bufferbuffer is NULLbuffer has negative sizebuffer size mismatcherror_regex_coretoo much backtrackingconcurrent not int or Nonegroup indices must be integers or strings, not %.200sgroup indices must be integers or stringsinvalid RE codestring indices must be integersinvalid group referenceexpected bytes instance, %.200s foundexpected string instance, %.200s foundexpected str instance, %.200s foundno such groupinvalid replacementinternal error in regular expression engine2ôd$2ôdH2ôdp2ôdŒ2ôd¬2ôdÌ2ôdü2ôd3ôdÔ1ôd43ôdº1ôdº1ôdº1ôdº1ôdº1ôd@3ôdº1ôdä1ôdregex.Regex(, flags= | regex.=)0IôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôd@IôdûHôdûHôdûHôdTIôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdhIôdûHôdûHôdûHôdtIôdûHôdûHôdûHôd€IôdûHôdûHôdûHôdŒIôdûHôdûHôdûHôdûHôdûHôdûHôdûHôdIôd˜KôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdfJôdhKôdfJôdfJôdfJôdõd[õdÄõd®õdì õd{õd õd× õdõdì$õdü!õdI$õdxýôdÁýôdþíôdþíôdNõdRõdèõdŽõd/õd õd õdþíôdþíôdØõd­úôdLúôdüùôdªùôdZùôdÐúôdP7õdfûôd`6õd`6õd`6õd`6õd`6õd`6õdØ5õdÐ4õd$6õd”4õd`6õd`6õd`6õd`6õdÐ4õdÐ4õdÐ4õdfûôdÐ4õdÐ4õdÐ4õdÐ4õdÐ4õdÐ4õdL/õdÐ4õdÐ.õdfûôd”.õdfûôdÐ.õdH.õdfûôd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd42õd 1õd 1õd42õd42õd42õdÐ4õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õd`6õdÐ4õdÐ4õdÐ4õdÐ4õd42õdä/õdä/õd42õd42õd42õdfûôdfûôdfûôdfûôdfûôdfûôdœ/õd84õd,3õdfûôdÀ-õdfûôd,õdˆ+õd*õdÈ)õdl)õdä(õd¸CõdCõdcBõdGFõdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õdî9õd«EõdÿDõd\DõdÃAõd#Aõd~@õd°LõdLLõdàKõdnKõd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õd&>õdõJõd Jõd"Iõd¦Hõd.Hõd°GõdO|OOnO:findallO|nO:splitO|OOO:searchO|OOO:fullmatchO|OOO:match_compile_replacement_helperregexNnOO|nOOO:subnOO|nOOO:subMAGICCODE_SIZEcopyrightiiORE_OP_FAILURERE_OP_SUCCESSRE_OP_ANYRE_OP_ANY_ALLRE_OP_ANY_ALL_REVRE_OP_ANY_REVRE_OP_ANY_URE_OP_ANY_U_REVRE_OP_ATOMICRE_OP_BOUNDARYRE_OP_BRANCHRE_OP_CALL_REFRE_OP_CHARACTERRE_OP_CHARACTER_IGNRE_OP_CHARACTER_IGN_REVRE_OP_CHARACTER_REVRE_OP_DEFAULT_BOUNDARYRE_OP_DEFAULT_END_OF_WORDRE_OP_DEFAULT_START_OF_WORDRE_OP_ENDRE_OP_END_OF_LINERE_OP_END_OF_LINE_URE_OP_END_OF_STRINGRE_OP_END_OF_STRING_LINERE_OP_END_OF_STRING_LINE_URE_OP_END_OF_WORDRE_OP_FUZZYRE_OP_GRAPHEME_BOUNDARYRE_OP_GREEDY_REPEATRE_OP_GROUPRE_OP_GROUP_CALLRE_OP_GROUP_EXISTSRE_OP_LAZY_REPEATRE_OP_LOOKAROUNDRE_OP_NEXTRE_OP_PROPERTYRE_OP_PROPERTY_IGNRE_OP_PROPERTY_IGN_REVRE_OP_PROPERTY_REVRE_OP_RANGERE_OP_RANGE_IGNRE_OP_RANGE_IGN_REVRE_OP_RANGE_REVRE_OP_REF_GROUPRE_OP_REF_GROUP_FLDRE_OP_REF_GROUP_FLD_REVRE_OP_REF_GROUP_IGNRE_OP_REF_GROUP_IGN_REVRE_OP_REF_GROUP_REVRE_OP_SEARCH_ANCHORRE_OP_SET_DIFFRE_OP_SET_DIFF_IGNRE_OP_SET_DIFF_IGN_REVRE_OP_SET_DIFF_REVRE_OP_SET_INTERRE_OP_SET_INTER_IGNRE_OP_SET_INTER_IGN_REVRE_OP_SET_INTER_REVRE_OP_SET_SYM_DIFFRE_OP_SET_SYM_DIFF_IGNRE_OP_SET_SYM_DIFF_IGN_REVRE_OP_SET_SYM_DIFF_REVRE_OP_SET_UNIONRE_OP_SET_UNION_IGNRE_OP_SET_UNION_IGN_REVRE_OP_SET_UNION_REVRE_OP_START_OF_LINERE_OP_START_OF_LINE_URE_OP_START_OF_STRINGRE_OP_START_OF_WORDRE_OP_STRINGRE_OP_STRING_FLDRE_OP_STRING_FLD_REVRE_OP_STRING_IGNRE_OP_STRING_IGN_REVRE_OP_STRING_REVRE_OP_STRING_SETRE_OP_STRING_SET_FLDRE_OP_STRING_SET_FLD_REVRE_OP_STRING_SET_IGNRE_OP_STRING_SET_IGN_REVRE_OP_STRING_SET_REVRE_OP_BODY_ENDRE_OP_BODY_STARTRE_OP_END_FUZZYRE_OP_END_GREEDY_REPEATRE_OP_END_GROUPRE_OP_END_LAZY_REPEATRE_OP_GREEDY_REPEAT_ONERE_OP_GROUP_RETURNRE_OP_LAZY_REPEAT_ONERE_OP_MATCH_BODYRE_OP_MATCH_TAILRE_OP_START_GROUP_regex.Patternmatchfullmatchsearchsubsubfsubnsubfnsplitsplititerfindallfinditerscanner__copy____deepcopy__patternThe pattern string from which the regex object was compiled.flagsThe regex matching flags.groupsThe number of capturing groups in the pattern.named_listsThe named lists used by the regex.groupindexA dictionary mapping group names to group numbers._regex.Matchgroupstartendspangroupdictcapturesdictexpandexpandfcapturesstartsendsspansdetach_string__getitem__reThe regex object that produced this match object.posThe position at which the regex engine starting searching.endposThe final position beyond which the regex engine won't search.lastindexThe group number of the last matched capturing group, or None.lastgroupThe name of the last matched capturing group, or None.regsA tuple of the spans of the capturing groups.stringThe string that was searched, or None if it has been detached._regex.ScannerThe regex object that produced this scanner object._regex.SplitterThe regex object that produced this splitter object._regexoverlappedconcurrentmaxsplitcountrepldefaultÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ôdTôd°ôdôddôd¼ôdABDSFILMRTXV0V1W„Xöd€†XödˆXödŠXödŒXöd@ŽXödXöd’Xöd”Xöd–Xöd˜Xöd@šXöd Xöd Xödcompileget_code_sizeget_propertiesfold_caseget_expand_on_foldinghas_property_valueget_all_cases-1/2011/101/161/21/31/41/51/61/71/81/91010010001000010000010000000010000000000001031071111/2118121221291313/2130132141515/2161717/2181922/32/52020020002000020221214216216000218222202222242262282323023223323424240252627282933/163/23/43/53/83030030003000031323334353637383944/54040040004000041424343200044454647484955/25/65/85050050005000066060060006000077/27/8707007000700008808008000800008499/29090090009000091AABOVEABOVELEFTABOVERIGHTAEGEANNUMBERSAHEXAIAINALALAPHALCHEMICALALCHEMICALSYMBOLSALEFALETTERALNUMALPHAALPHABETICALPHABETICPFALPHABETICPRESENTATIONFORMSALPHANUMERICAMBIGUOUSANANCIENTGREEKMUSICANCIENTGREEKMUSICALNOTATIONANCIENTGREEKNUMBERSANCIENTSYMBOLSANYARARABARABICARABICEXTAARABICEXTENDEDAARABICLETTERARABICMATHARABICMATHEMATICALALPHABETICSYMBOLSARABICNUMBERARABICPFAARABICPFBARABICPRESENTATIONFORMSAARABICPRESENTATIONFORMSBARABICSUPARABICSUPPLEMENTARMENIANARMIARMNARROWSASCIIASCIIHEXDIGITASSIGNEDATATAATARATBATERMATTACHEDABOVEATTACHEDABOVERIGHTATTACHEDBELOWATTACHEDBELOWLEFTAVAGRAHAAVESTANAVSTBB2BABALIBALINESEBAMUBAMUMBAMUMSUPBAMUMSUPPLEMENTBASICLATINBATAKBATKBBBCBEHBELOWBELOWLEFTBELOWRIGHTBENGBENGALIBETHBIDICBIDICLASSBIDICONTROLBIDIMBIDIMIRROREDBINDUBKBLBLANKBLKBLOCKBLOCKELEMENTSBNBOPOBOPOMOFOBOPOMOFOEXTBOPOMOFOEXTENDEDBOTTOMBOTTOMANDRIGHTBOUNDARYNEUTRALBOXDRAWINGBRBRAHBRAHMIBRAIBRAILLEBRAILLEPATTERNSBREAKAFTERBREAKBEFOREBREAKBOTHBREAKSYMBOLSBUGIBUGINESEBUHDBUHIDBURUSHASKIYEHBARREEBYZANTINEMUSICBYZANTINEMUSICALSYMBOLSCC&CAKMCANCANADIANABORIGINALCANADIANSYLLABICSCANONICALCANONICALCOMBININGCLASSCANSCARICARIANCARRIAGERETURNCASEDCASEDLETTERCASEIGNORABLECBCCCCCCCC10CCC103CCC107CCC11CCC118CCC12CCC122CCC129CCC13CCC130CCC132CCC133CCC14CCC15CCC16CCC17CCC18CCC19CCC20CCC21CCC22CCC23CCC24CCC25CCC26CCC27CCC28CCC29CCC30CCC31CCC32CCC33CCC34CCC35CCC36CCC84CCC91CFCHAKMACHAMCHANGESWHENCASEFOLDEDCHANGESWHENCASEMAPPEDCHANGESWHENLOWERCASEDCHANGESWHENTITLECASEDCHANGESWHENUPPERCASEDCHERCHEROKEECICIRCLECJCJKCJKCOMPATCJKCOMPATFORMSCJKCOMPATIBILITYCJKCOMPATIBILITYFORMSCJKCOMPATIBILITYIDEOGRAPHSCJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENTCJKCOMPATIDEOGRAPHSCJKCOMPATIDEOGRAPHSSUPCJKEXTACJKEXTBCJKEXTCCJKEXTDCJKRADICALSSUPCJKRADICALSSUPPLEMENTCJKSTROKESCJKSYMBOLSCJKSYMBOLSANDPUNCTUATIONCJKUNIFIEDIDEOGRAPHSCJKUNIFIEDIDEOGRAPHSEXTENSIONACJKUNIFIEDIDEOGRAPHSEXTENSIONBCJKUNIFIEDIDEOGRAPHSEXTENSIONCCJKUNIFIEDIDEOGRAPHSEXTENSIONDCLCLOSECLOSEPARENTHESISCLOSEPUNCTUATIONCMCNCNTRLCOCOMCOMBININGDIACRITICALMARKSCOMBININGDIACRITICALMARKSFORSYMBOLSCOMBININGDIACRITICALMARKSSUPPLEMENTCOMBININGHALFMARKSCOMBININGMARKCOMBININGMARKSFORSYMBOLSCOMMONCOMMONINDICNUMBERFORMSCOMMONSEPARATORCOMPATCOMPATJAMOCOMPLEXCONTEXTCONDITIONALJAPANESESTARTERCONNECTORPUNCTUATIONCONSONANTCONSONANTDEADCONSONANTFINALCONSONANTHEADLETTERCONSONANTMEDIALCONSONANTPLACEHOLDERCONSONANTREPHACONSONANTSUBJOINEDCONTINGENTBREAKCONTROLCONTROLPICTURESCOPTCOPTICCOUNTINGRODCOUNTINGRODNUMERALSCPCPRTCRCSCUNEIFORMCUNEIFORMNUMBERSCUNEIFORMNUMBERSANDPUNCTUATIONCURRENCYSYMBOLCURRENCYSYMBOLSCWCFCWCMCWLCWTCWUCYPRIOTCYPRIOTSYLLABARYCYRILLICCYRILLICEXTACYRILLICEXTBCYRILLICEXTENDEDACYRILLICEXTENDEDBCYRILLICSUPCYRILLICSUPPLEMENTCYRILLICSUPPLEMENTARYCYRLDDADALDALATHRISHDASHDASHPUNCTUATIONDBDEDECIMALDECIMALNUMBERDECOMPOSITIONTYPEDEFAULTIGNORABLECODEPOINTDEPDEPRECATEDDESERETDEVADEVANAGARIDEVANAGARIEXTDEVANAGARIEXTENDEDDIDIADIACRITICDIACRITICALSDIACRITICALSFORSYMBOLSDIACRITICALSSUPDIGITDINGBATSDOMINODOMINOTILESDOUBLEABOVEDOUBLEBELOWDOUBLEQUOTEDQDSRTDTDUALJOININGEEAEASTASIANWIDTHEGYPEGYPTIANHIEROGLYPHSEMOTICONSENENCENCLOSEDALPHANUMENCLOSEDALPHANUMERICSENCLOSEDALPHANUMERICSUPPLEMENTENCLOSEDALPHANUMSUPENCLOSEDCJKENCLOSEDCJKLETTERSANDMONTHSENCLOSEDIDEOGRAPHICSUPENCLOSEDIDEOGRAPHICSUPPLEMENTENCLOSINGMARKESETETHIETHIOPICETHIOPICEXTETHIOPICEXTAETHIOPICEXTENDEDETHIOPICEXTENDEDAETHIOPICSUPETHIOPICSUPPLEMENTEUROPEANNUMBEREUROPEANSEPARATOREUROPEANTERMINATOREXEXCLAMATIONEXTEXTENDEXTENDEREXTENDNUMLETFFALSEFARSIYEHFEFEHFINFINALFINALPUNCTUATIONFINALSEMKATHFIRSTSTRONGISOLATEFOFONTFORMATFRAFRACTIONFSIFULLWIDTHGAFGAMALGCGCBGENERALCATEGORYGENERALPUNCTUATIONGEOMETRICSHAPESGEORGEORGIANGEORGIANSUPGEORGIANSUPPLEMENTGLGLAGGLAGOLITICGLUEGOTHGOTHICGRAPHGRAPHEMEBASEGRAPHEMECLUSTERBREAKGRAPHEMEEXTENDGRAPHEMELINKGRBASEGREEKGREEKANDCOPTICGREEKEXTGREEKEXTENDEDGREKGREXTGRLINKGUJARATIGUJRGURMUKHIGURUHH2H3HAHHALFANDFULLFORMSHALFMARKSHALFWIDTHHALFWIDTHANDFULLWIDTHFORMSHAMZAONHEHGOALHANHANGHANGULHANGULCOMPATIBILITYJAMOHANGULJAMOHANGULJAMOEXTENDEDAHANGULJAMOEXTENDEDBHANGULSYLLABLESHANGULSYLLABLETYPEHANIHANOHANUNOOHEHEBRHEBREWHEBREWLETTERHEHHEHGOALHETHHEXHEXDIGITHIGHPRIVATEUSESURROGATESHIGHPUSURROGATESHIGHSURROGATESHIRAHIRAGANAHLHSTHYHYPHENIDIDCIDCONTINUEIDEOIDEOGRAPHICIDEOGRAPHICDESCRIPTIONCHARACTERSIDSIDSBIDSBINARYOPERATORIDSTIDSTARTIDSTRINARYOPERATORIMPERIALARAMAICININDICMATRACATEGORYINDICNUMBERFORMSINDICSYLLABICCATEGORYINFIXNUMERICINHERITEDINITINITIALINITIALPUNCTUATIONINMCINSCINSCRIPTIONALPAHLAVIINSCRIPTIONALPARTHIANINSEPARABLEINSEPERABLEINVISIBLEIOTASUBSCRIPTIPAEXTIPAEXTENSIONSISISOISOLATEDITALJAMOJAMOEXTAJAMOEXTBJAVAJAVANESEJGJLJOINCJOINCAUSINGJOINCONTROLJOININGGROUPJOININGTYPEJTJVKAKAFKAITHIKALIKANAKANASUPKANASUPPLEMENTKANAVOICINGKANBUNKANGXIKANGXIRADICALSKANNADAKAPHKATAKANAKATAKANAEXTKATAKANAORHIRAGANAKATAKANAPHONETICEXTENSIONSKAYAHLIKHAPHKHARKHAROSHTHIKHMERKHMERSYMBOLSKHMRKNDAKNOTTEDHEHKTHIKVLL&LAMLAMADHLANALAOLAOOLATINLATIN1LATIN1SUPLATIN1SUPPLEMENTLATINEXTALATINEXTADDITIONALLATINEXTBLATINEXTCLATINEXTDLATINEXTENDEDALATINEXTENDEDADDITIONALLATINEXTENDEDBLATINEXTENDEDCLATINEXTENDEDDLATNLBLELEADINGJAMOLEFTLEFTANDRIGHTLEFTJOININGLEFTTORIGHTLEFTTORIGHTEMBEDDINGLEFTTORIGHTISOLATELEFTTORIGHTOVERRIDELEPCLEPCHALETTERLETTERLIKESYMBOLSLETTERNUMBERLFLIMBLIMBULINBLINEARBLINEARBIDEOGRAMSLINEARBSYLLABARYLINEBREAKLINEFEEDLINESEPARATORLISULLLMLOLOELOGICALORDEREXCEPTIONLOWERLOWERCASELOWERCASELETTERLOWSURROGATESLRELRILROLTLULVLVSYLLABLELVTLVTSYLLABLELYCILYCIANLYDILYDIANMM&MAHJONGMAHJONGTILESMALAYALAMMANDMANDAICMANDATORYBREAKMARKMATHMATHALPHANUMMATHEMATICALALPHANUMERICSYMBOLSMATHEMATICALOPERATORSMATHOPERATORSMATHSYMBOLMBMCMEMEDMEDIALMEEMMEETEIMAYEKMEETEIMAYEKEXTMEETEIMAYEKEXTENSIONSMERCMEROMEROITICCURSIVEMEROITICHIEROGLYPHSMIAOMIDLETTERMIDNUMMIDNUMLETMIMMISCARROWSMISCELLANEOUSMATHEMATICALSYMBOLSAMISCELLANEOUSMATHEMATICALSYMBOLSBMISCELLANEOUSSYMBOLSMISCELLANEOUSSYMBOLSANDARROWSMISCELLANEOUSSYMBOLSANDPICTOGRAPHSMISCELLANEOUSTECHNICALMISCMATHSYMBOLSAMISCMATHSYMBOLSBMISCPICTOGRAPHSMISCSYMBOLSMISCTECHNICALMLMLYMMNMODIFIERLETTERMODIFIERLETTERSMODIFIERSYMBOLMODIFIERTONELETTERSMODIFYINGLETTERMONGMONGOLIANMTEIMUSICMUSICALSYMBOLSMYANMARMYANMAREXTAMYANMAREXTENDEDAMYMRNN&NANANNARNARROWNBNCHARNDNEUTRALNEWLINENEWTAILUENEXTLINENKNKONKOONLNONOBLOCKNOBREAKNOJOININGGROUPNONCHARACTERCODEPOINTNONENONJOININGNONSPACINGMARKNONSTARTERNOONNOTAPPLICABLENOTREORDEREDNRNSNSMNTNUNUKTANUMBERNUMBERFORMSNUMERICNUMERICTYPENUMERICVALUENUNNVNYAOALPHAOCRODIOGAMOGHAMOGREXTOIDCOIDSOLCHIKIOLCKOLDITALICOLDPERSIANOLDSOUTHARABIANOLDTURKICOLETTEROLOWEROMATHONOPOPENPUNCTUATIONOPTICALCHARACTERRECOGNITIONORIYAORKHORYAOSMAOSMANYAOTHEROTHERALPHABETICOTHERDEFAULTIGNORABLECODEPOINTOTHERGRAPHEMEEXTENDOTHERIDCONTINUEOTHERIDSTARTOTHERLETTEROTHERLOWERCASEOTHERMATHOTHERNEUTRALOTHERNUMBEROTHERPUNCTUATIONOTHERSYMBOLOTHERUPPERCASEOUPPEROVOVERLAYOVERSTRUCKPP&PARAGRAPHSEPARATORPATSYNPATTERNSYNTAXPATTERNWHITESPACEPATWSPCPDPDFPDIPEPFPHAGPHAGSPAPHAISTOSPHAISTOSDISCPHLIPHNXPHOENICIANPHONETICEXTPHONETICEXTENSIONSPHONETICEXTENSIONSSUPPLEMENTPHONETICEXTSUPPIPLAYINGCARDSPLRDPOPOPDIRECTIONALFORMATPOPDIRECTIONALISOLATEPOSTFIXNUMERICPRPREFIXNUMERICPREPENDPRINTPRIVATEUSEPRIVATEUSEAREAPRTIPSPUAPUNCTPUNCTUATIONQAACQAAIQAFQAPHQMARKQUQUOTATIONQUOTATIONMARKRRADICALREGIONALINDICATORREGISTERSHIFTERREHREJANGREVERSEDPERIRIGHTRIGHTJOININGRIGHTTOLEFTRIGHTTOLEFTEMBEDDINGRIGHTTOLEFTISOLATERIGHTTOLEFTOVERRIDERJNGRLERLIRLOROHINGYAYEHRUMIRUMINUMERALSYMBOLSRUNICRUNRSS&SASADSADHESAMARITANSAMRSARBSAURSAURASHTRASBSCSCONTINUESCRIPTSDSESEENSEGMENTSEPARATORSEMKATHSENTENCEBREAKSEPSEPARATORSGSHARADASHAVIANSHAWSHINSHRDSINGLEQUOTESINHSINHALASKSMSMALLSMALLFORMSSMALLFORMVARIANTSSMLSOSOFTDOTTEDSORASORASOMPENGSPSPACESPACESEPARATORSPACINGMARKSPACINGMODIFIERLETTERSSPECIALSSQSQRSQUARESTSTERMSUBSUNDSUNDANESESUNDANESESUPSUNDANESESUPPLEMENTSUPSUPARROWSASUPARROWSBSUPERSUPERANDSUBSUPERSCRIPTSANDSUBSCRIPTSSUPMATHOPERATORSSUPPLEMENTALARROWSASUPPLEMENTALARROWSBSUPPLEMENTALMATHEMATICALOPERATORSSUPPLEMENTALPUNCTUATIONSUPPLEMENTARYPRIVATEUSEAREAASUPPLEMENTARYPRIVATEUSEAREABSUPPUAASUPPUABSUPPUNCTUATIONSURROGATESWASHKAFSYSYLOSYLOTINAGRISYMBOLSYRCSYRIACSYRIACWAWTTAGALOGTAGBTAGBANWATAGSTAHTAILETAITHAMTAIVIETTAIXUANJINGTAIXUANJINGSYMBOLSTAKRTAKRITALETALUTAMILTAMLTAVTTAWTEHMARBUTATEHMARBUTAGOALTELUTELUGUTERMTERMINALPUNCTUATIONTETHTFNGTGLGTHAATHAANATHAITIBETANTIBTTIFINAGHTITLECASELETTERTONELETTERTONEMARKTOPTOPANDBOTTOMTOPANDBOTTOMANDRIGHTTOPANDLEFTTOPANDLEFTANDRIGHTTOPANDRIGHTTRAILINGJAMOTRANSPARENTTRANSPORTANDMAPTRANSPORTANDMAPSYMBOLSTRUEUUCASUCASEXTUGARUGARITICUIDEOUNASSIGNEDUNIFIEDCANADIANABORIGINALSYLLABICSUNIFIEDCANADIANABORIGINALSYLLABICSEXTENDEDUNIFIEDIDEOGRAPHUNKNOWNUPUPPERUPPERCASEUPPERCASELETTERVVAIVAIIVARIATIONSELECTORVARIATIONSELECTORSVARIATIONSELECTORSSUPPLEMENTVEDICEXTVEDICEXTENSIONSVERTVERTICALVERTICALFORMSVIRAMAVISARGAVISUALORDERLEFTVOWELVOWELDEPENDENTVOWELINDEPENDENTVOWELJAMOVRVSVSSUPWWAWWBWHITESPACEWIDEWJWORDWORDBREAKWORDJOINERWSWSPACEXDIGITXIDCXIDCONTINUEXIDSXIDSTARTXPEOXSUXXXYYEHYEHBARREEYEHWITHTAILYESYIYIIIYIJINGYIJINGHEXAGRAMSYMBOLSYIRADICALSYISYLLABLESYUDHYUDHHEZZ&ZAINZHAINZINHZLZPZSZWZWSPACEZYYYZZZZ      !""#$%&'"""()*+,-./0123456789:;<=>?@@ABCDEFGEHIEE@J@@KLMNOPQRESTUVWXYEE"""""""""""""""""""""""""""""""""""Z"""""""""""""""""""[\""""""""]""^_`abcdefghi"""""""""""""""""""""""jkkkkkkkkkkkkkkkkllllllllllllllllll""mnop""qrstuvwxyzL{|}~LLLLLL€L‚ƒL„L…LLL†LLL‡ˆ‰ŠLLLLLLLLL‹LLLLLLLLLLLLLLLLLL""""""ŒLLLLLLLL""""""""ŽLLLLLLL""""LLLLLLLLL‘’LLLLLLLLLLLLLLLE“”•–L—L˜™š›œžŸLLLLLLLLLLLL ¡LL¢£¤¥¦L§¨©ª«¬­®¯L"""""""""""""°""""""""""""""""±"²LLLLLLLLLLLLLLL""""²LLLLLLLLLLL³L´µLLLLLLLLLLLLlllllllllllllll¶       !"#$ %& ' ( ) *+ ,- ./ 0123456227 8922222:;<=>2 ?22222@AB2CD2EFG2HIIIIJIIIKLM22NOPQRSTUVWXYZ[TU\]^_`abUcdeYfSTUghiYjklmnop_qrsUtuvYwxsUyz{Y|xs2}~Y€‚2ƒ„…I†‡22ˆ‰ŠII‹ŒŽII‘’“”•2–—˜™ š›œII22žŸ ¡¢£¤ ¥22¦222222222222§¨22§22©ª«222ª222¬­®2¯22222°±2222222222222²2³´2222µ¶·¸2¹2º·»222¼½¾¿ÀÁ¿22Â22Ã22Ä2222Å2–ÆÇÈ2ɰ22ÊËÌÍÎÎ2Ï222ÐÑÒ¿¿ÓIIIIIÔ22ÕÖŸ×ØÙ2ÚB22ÛÜ22ÝÞßB2àIIIIáâãä åæç è éê ë ìíììíîìïðððñòóôõö÷øùúûüýþÿI      ÎÎÎÎÎÎÎÎÎÎÎII   ÎÎÎÎ ÎÎÎÎÎÎÎÎÎÎÎ ÎÎ!ÎÎÎÎÎÎ"Î#ÎÎÎÎÎ$% &ÎÎ'()*+,ÎÎÎ-¯IIIIIIIIII . /01 23 422256278888 9:;<IIIIÎ=ÎÎÎÎÎÎÎÎÎÎ>I?@ABC‡2222D±2222EF2ɇ2222GH23ÎÎ2ÎIJÎKLÎÎJÎÎLÎÎÎI222ÅÎÎÎÎ2222–III2M222222–ÎÎÎ22àN2OI PQ R2222STUVW XYZ[IIII\]2^_222`a22bc¿ dB2e2fg2–M22hijII22klmn2o222pqrstuv8IIIIIIIII22w¿22x2y22Êzzzzzzzz{{{{{{{{222222É222222|II}~€222222‚ƒ„22222…I2222†22ÃII‡ ˆé‰Š‹Œ2222222Ž‘’2“2G”•–—˜2«™ÉÉII22222223š  ›   œ?IIIÎΞ2–222eII2GŸ2 III2¡22¢£II ¤ 2222É¿IIIII¥22¦2§II2¨2©IIII222ªIIII«¬2­®¯2°222±2²2³2222´IIIIIIIII µ¶22·¸¹ºIÙ22»¼2´¿½2¾¿ÀIIIÙ22Á¿II22ÃÄ¿III222222GI      ÅÀ22GIIIII222´IIII2222°ÆËÇÈÉIIIIIIÊIIIIIIIÎÎÎÎÎÎÎ>ÎÎËÎÎÎÌÍÎÎÏÎÎÐIIÎÎÎÎÑIIIÎÎÎÎÎ Ò Ó ÔÕÖì רÙÚÛ Ó ÜÝ Þßàá â Ó ÔÕ ì ×á â Ó ã äåæç è éêëì í î ïðððñ2òóôõö÷øÊùÊIIIúÎÎ?ÎÎÎÎÎÎIû##IIüÎIÎÎÎ?ÎÎIIIIýÎþÎÎÿIIÎÎÎÎÎÎÎÎIÎÎÎÎIÎÎÎÎÎÎÎÎÎÎÎÎÎÐÎIIIIIIIIÎÎÎÎ IIIÎÎÎÎ>IIIÎÎÎÎÎÎÎ222227II222°22222ÉIIIIII I       I{{{{{{{    ! """""""" """ "  "  " " " "" # $$%"&%"""""""" "&  " "" '((((((((())(((((()))))))((*)))**))))))))++++++++ * ,-.,,)/ 00 " 1 "   2" " 3++4 """""" ,,,,1 05678,9:++++++++++++++;<=+<,,,,$$$$$$$$$$$$$>,,$?.,,,,,@@A BC+++++=AD$$$$E++$F$$$$$$$$$G+++H3++IJK++$$LMNE$$$$$$$+++++OP$$$$+++++F,,,,,,,$$$$$$$$E++++(Q,,$$$++J++++J+J++,.$$$$E+,.,,,,,,,,>$$$$$>,,,+++++++++++++O+R$$$$$$$$$$$RFST+++RSTSE+++$$$$$+U$$$P$$$:SP$$$>P>P$$$$$$$$$$>$$$>>,$$,FST+OVWVT>,,,V,,$P$+,$X,,:RP$$>,P>$P>$,OSTO,:O:+,:,,,P$>>,,,+$E,,,,,:RP$$$$P$P$$$$$$>$P$$,FST++:RVT,>,,,,,,,B,,,,,,,>$P$$,FTT+OVWVT,,,,R,,$PM,,,,,FP$$>,$>$$,P>>$,P>,$>,$$$$$$,,SRW,SWST,>,,V,,,,YCCXZ,,VSP$$$>$>$$$$$$$$$P$$,P+RSW+O++,,,:O$,,,,,,,Y,SP$$$>$$$P$$,FTSSWRWS+,,,VW,,,>P>,,,,,,$$$$$>PST+OSWST>,,,V,,,,,[$$$,SP$$$$$$$$>,$$$$P$$$$P,$$$>,O,VS+OOSSSS,S.,,,,,P$$$$$$$E$+++O,9$$$J+++=,,P>>P>>P,,,$$P$$$P$PP,$P$E$+++:F,$$>Q+++,,$$LC\\C+CCC333S$$$$P$$$$$$$$$>,:++++++R++=+$$E+++++:+++++++++OCCCCKCCZC\C.,,$$$$$]T+R+++TRTF$$$S+$$+FS^]SSS$E+F$$$$$$RTRSST]STC 1,,1,$$$$$?D$$$$$>$$,$$$>>$$,>$$,$$$>>$$,$$$$$$$>$$$$$$$$$>:+_`,CCCCC,,,$$>,,,,,a$$$$$$$$$$$$$?Gb$$$$$$$$$$$$cd,$$$$$?ef,,,,,,,$$$$$$>$$+O,,,,,$+=.,,,,$+,,,,,,>+,,,,,,$$+T+++SSSSRT+++++UBE,,,,,,,g<+A$h$$$$$$$$$$,,,,$$$$E>,,$$$,,,,,+RSTRS,,SRSST+,,Z,$$$$$$$,$$$$$$,,SSSSSSSS^$$$S,,,`,CCCCCCCCC$$$ERT,$$]R+++ORRT+++RSST++++O:U,++^$$$$$$$R++RRSSR^$$$,,\CCCC3++++CCCCZ,+^$$$$$$]++S+TS$$$$R+STT+S,,,,$$SSSS++++S+,7,P$$$$$(((,,,,+=++++++R+++F$E$$SF>,,,,(((((((--i((+++O,,,,,,,,,,++   , ,1111,jjjjk lm)k l), n) o),k lpqqqqqr@@ssstutuv@@wxyz{|} {~@@A@@@@@,|€|d((((((Q,,,++++++‚4ƒ4ƒ+++++O,,,,,,,C„C…C"  …C2 CCC„„„ † #$'C 2C‡eeeeeeeeeˆ‰eŠ,,,‹CCCC‹C‹CCC‹CCCCCCCC‹‹CCCCCCCCCCCCCCCCŒCCCCCCCC‹CCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,CCCZ,,,,CCCCCZ,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[CCCCCCCCCCCCCCCCC|Ž|Ž‹, 0k """" "( ‡CC…"‘+ ,,7_6,,6,$$$$,,,5.,,,,,,:$$$>,,,,$$$>$$$>ttxytgttUs,,CCCCC[CCCCC,,,,,CCCCCC,,’“C”•–eeee++S—((Ce˜?C$$$>:™šD$$$$$?(D,,P$$$$$$$$$$$$>CCCCCCCCCCCCCZCCCCCCC›$$h$$$$$$$$$$$œ$,, E4+++++U ,,,:$$$eeeee+,,,,)))š(((()  -""" *ž"k ,,,,,, 0,,,,,,(#$$$F$F$E$$$]TRCC,,CŸ,,,$$,,,,S$$$$$$$$$SSSSSSSSO,,,,+$$$G,,$$$++++$$$E+++++S,,,,,7$ES++SRS 5,,$$$$E++RTRTO,,,,$E$$$$R,,D$$LC],,F+FEF$$+E>,,,,,,,,,,,Ph$$$$$]+Sh¡O,,,,P$$>P$$>P$$>,,,,$]TSR T,$$,,,,,,$$$>,P$$¢¢¢¢¢¢¢¢££££££££$$$$$,,,k,,,,,6,,PF$$$$¤$$$$$$>$$>>$P>$$$$$$)))))))),,,,,,,,P$$$$$$$$$$$$$,$$$$$$$$$$$$$Ÿ,¥},,,¦§}¥}z¨.”}©B,,$$>$$$$$$$$$$$>N7|}$$$$$D$$$$$$$$$$$$$$(,$$$,$$$,$$$,$>,ªX‹Z,,,,N@C,$$$$$$P$$$$$$>$P.,«,[CCCCeeŠYCCCCCCCC`,,CCCCCC3,,,,,,,“$$$$f,,$$$$$$$7$$,,$$$$¬ee,,,,, $$$,>$$$$$$P>,>P$$$7$$$,7$$$$$,,7$$$$,,,$E+:O,,++$$P$P$$$$$,,+O,:,,,,.,,,$$$$$$­$$$,7$$$,$>,,$$$$>,,,`T^$$$$$$$$$$+++++++=,,ST+RT=®,,,,,,,+F$$$$$$$$$E++T+++O,,,,,,$]S++++R^$?.,,,$$$$$ETS+++T,,,,ef,,,,,,]SSSSSSSSSSSSSSW,,,,,,,:+I(((((($,,,,,,,CCCZ[CCCCC¯T+C¯SS°@@@±+++K3+++CCCCCCC++CCCCCCCC,C+K,,,,,,,,,,,,  k 0 ,0101 0 666 1 01 0 0 1 0 00, 0 , ! ! ! ! ! ,$$P$$$$$P>>PP$$$$>$$PP,,,>,PPPP$P>>PPPPPP>>P$>$$$>$$P$>>$$$$$P$$P$P$$P$$,,,,,,,[CCCCCCZ`,,,,,CCCCCCZ,,,,,,CCCCZ,,,C,,,,,,,Z,,,,,,,CCC[CCCCCCCCCCZ,CCZCCZ,,ZCCCCCCCCCCC[CZ,CCCC,,,,,,,,,[CCZ,[CCCCCN,,,,,,,@@@@@@@@£££££££,                        !"################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"""""#$%&'()*+,-./01223345678899:;<=>>?@AABCDDEEFGHIJKLMNOPQRRSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVVVVVVVVVVVWWWWWWWWWXYYZ[\]^_`abcdefffffffffffffffffffffffffffffffffffffffghhhhhhhijjjjjjjjkkkkkkkkkkkkkkkkkkllllmnnnnnopqrstuvwxyz{|wwwwww}w~€ww‚wwwƒwww„…†‡wwwwwwwwwˆwwwwwwwwwwwwwwwwww‰‰‰‰‰‰‰‰Šwwwwwww‹‹‹‹‹‹‹‹ŒwwwwwwwŽwwwwwwwww‘‘wwwwwwwwwwwwww’’““”w•w––––––––wwwwwwwwwwww——ww˜™šš››œœœœœœžŸw                             ¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¥wwwwwwwwwwwwwww¦¦¦¦§wwwwwwwwwww¨w©ªwwwwwwwwwwww««««««««««««««««¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬  !!!!!!!!""""""""""######$$$$$$$$%%%%%%%%&&''''''(((((((())******++,,--..////////0000000000011111222223334444445566777777777888888889999::::;;;;;<<<=>>>????????@@@@AAAABBBBBBBBCCCCCCCCDDDDDDDEEEFFFGGGHHHHHIIIIJJJJJJJKKKKKKKKLLLLLLLLMMMMNNOOOOOOOOOOPPPPPPPPQQRRRRRRSSSSSSSSTTTTTTTTTTTTUUUVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ[[[[[[[[\\\\\\]]^^^^^^^^___`````aaaaaabbccccccccddddddddeeeeeeeeeeeeeefgggghhhhhhiiiiiijjjkkkkkklmmnnnoppppppppqqqqqqqqrrrrrrrrrrrrssssttttttttuuuuuuuuuvvvvwwwxxxxxxxxxxxxyyyyyyzzzzzz{{||||||||||||||}}}~€€€€€€‚‚‚ƒƒƒ„„………………††††††‡‡ˆˆˆˆˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŽŽŽŽŽŽŽŽ‘‘‘‘‘‘‘‘’’’’’’’’“““““”””””””””””•–—˜˜™™ššššššššš›››››››››››››››œžžžžžžžžŸŸŸŸ     ¡¡¡¡¢¢¢££¤¤¤¤¥¥¥¦¦§§¨¨¨¨©©©©©ªªª«««¬¬¬¬­­®®¯¯°°±±±±±±²²²²²²³³´´´´µµ¶¶·····¸¸¹¹¹¹¹¹¹¹ººººº»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÀÁÁÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÆÆÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÈÉÉÊÊÊÊÊÊÊÊËËËËËËËËÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~€€€€‚‚‚‚ƒƒƒƒ„„„„…………††††‡‡‡‡ˆˆˆˆ‰‰‰‰ŠŠŠŠ‹‹‹‹ŒŒŒŒŽŽŽŽ‘‘‘‘’’’’““““””””••••––––————˜˜˜˜™™™™šššš››››œœœœžžžžŸŸŸŸ    ¡¡¡¡¢¢¢¢££££¤¤¤¤¥¥¥¥¦¦¦¦§§§§¨¨¨¨©©©©ªªªª««««¬¬¬¬­­­­®®®®¯¯¯¯°°°°±±±±²²²²³³³³´´´´µµµµ¶¶¶¶····¸¸¸¸¹¹¹¹ºººº»»»»¼¼¼¼½½½½¾¾¾¾¿¿¿¿ÀÀÀÀÁÁÁÁÂÂÂÂÃÃÃÃÄÄÄÄÅÅÅÅÆÆÆÆÇÇÇÇÈÈÈÈÉÉÉÉÊÊÊÊËËËËÌÌÌÌÍÍÍÍÎÎÎÎÏÏÏÏÐÐÐÐÑÑÑÑÒÒÒÒÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖÖ××××ØØØØÙÙÙÙÚÚÚÚÛÛÛÛÜÜÜÜ   !"#$%%%%%&'()*+,-./0123456789:;;;<=;;;;;>;??;;;;@ABCDEFGHIJKLMNOP;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHQHHHHHHHHHHHHHHHHHHHRSSSSSSSSSTUUVWXYZ[\]^_`a bAAAAAAAAAAAAAAAAAAHHcdefgghijklmnopqArstuvAAAAAAwAxyzA{A|AAA}AAA~€AAAAAAAAA‚AAƒƒƒƒƒƒ„A…AAAAAAA††††††††‡AAAAAAAˆˆˆˆ‰AAAAAAAAAŠ‹ŒAAAAAAAAAAAAAAA;ŽA‘A’“”;;•;–AAAAAAAAAAAA—˜AA™š›œAžŸ ¡¢£¤¥?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{.|}~~~€..‚ƒ„…†..‡‡‡‡ˆ‡‰Š‡ˆ‡‹‹Œ..ŽŽŽŽ‘‘‘‘‘‘‘‘’’’’“”’’“’’•–—’’’–’’’˜’™’š›››››œžŸ    ¡¢£¤¥¦§¨©ª«««««¬­­®¯°°°°°±°°²³´µ¶¶·¸¹º»»¼»½¾««¿ÀÁÁÁÂÁÃÄÄÅ.....ÆÆÆÆÇÆÆÈÉÉÉÉÊÊÊËÌÌÌÍÎÏÏÏ....ÐÑÒÓÔÕÖרÙÚ Û ÛÜ Ý ÞÞß àáâãäåæ.çèéêëìí.æ.îïïïïïïïïðñ..........òòóòòóôôôôôôôõŽŽööö÷ø’ùúúúúû....üýüüüüüþüüüüüüüüüüüüüÿ.û    ‘‘‘‘  ì‘ ‘üüüÿüüüü........ !!"ñ###$%%%%&'2()))**+‘,----./..000123455556789:;ú.........88<=‘‘>‘?‘‘@üüüüüüAüüüüüüB..CDEFGHI.JK..LñÙMNOPîQR‘ STUVWXYZ[[..XXXXXXX\]^ _û...`abcccd..efghi...jkllmn..ooooopppqrs.....tuuvwx..yz{|....}}~....€‚ƒ„…††‡‡‡ˆ‰Š‹ŒŽ.........1‘.’’’’“”•–———˜™...šššš›œ..žŸ...              ¡.      ¢£¤¤¤¤¤¤¤¤¤¤¥.....¦....§§§§¨§§©ª§......«.......¬­®¯°±².. ³...í´âµ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈ...GûìäÊîî..æäûæ....ËÌæÍ´..ÎÏðìÐ.Îä½Ñ²ìÒ........ÓÔ...¬...üüüüüÕ..üüüÖüüüüüA......×..      !!!!!!!!!"""""""""""""#$$$$$$$$$$$$$$$$$$$$$$%&&&&&&&&&&&&&&'(((((((()*(((((((((((((((((+(((,-,---.,.,----------.---..------.,.,-.,-,-------------/0/001/1/0000000000100010/101001/1/0//011000000002323333232333333333343334323333333232343333333356566675756666666666766676566666675756665666666666668988:8:889::89:8:88888888:8:88:98888888888:;<;<<<=<=<<<<<<<<<<<=<<<<<;<<;<<<=<=<<;=<<<<<<<<<<<<>?>>>@>@>>>>>>>>>>>@>>>>>?>>>>>>@>@>>?@@>>>>>>>?@ABAAACACAAAAAAAAAAAAAAAAAAAACBAAACACAACBAAAAAAAAAABAAADEDDDDDDDDFDDDDDDDDDDDDEDDDDEDDDFFEDDFFDDDDDFGHHHHHHHHHHHHHHHHHHHHIHHHHHHJKKJKKJLLJLLLJLJJLJLLLLLLJLLLKKLLLLLLLLLLMMMMMMMMMMMMNMMMMMMMMMONMMMMMMMMMMMMMOMMMPQORRRRRRRRSSSSSSSSSSSTTSSSSSUSSVVVVVVVVWWWWWWWWWWWWXWWWWWXXWWXWWWWWXXWWWWWWWWWXWWWWWWWWWXYWWWWWWWXWWWWWZZZZZZZZZZ[\\\\\\\\]]]]]]]]]]]]]]^_____________`_abbbbbbcbbbcdddddddddde ffffffffffgggggghghgiiiiiiiiiiiiiiiiiiiijkjjjjljjjjjjjjjjjjjjjjjjjjjjl\\\mmmmmmmmmmmmmmnmmmmmmnmmmmmmooooooooooooooooopqqqqqqqqqqqqqqqqqqqqqqqqrqssssssssssssssstttttttttttttttuttttttuvttttttttttttwwwwwwwwwwwwwwwwwwwwxyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{|{}}}}}}}}yyyy~~~~ €‚ƒ„       … „  †††††††† ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆ ‰ ŠŠŠŠŠŠŠŠŠŠŠŠ‹Œ‹WWWXWWWXWWWXŽV‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’“~”‘•––––––––––––––––––––—•–˜™VVVVVVVVVVVVVVš›VVVVVVVœ–––––––––––žŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ŸŸŸ ¡¡¡¡¡¡¡¡¢¢¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¤¤¤¤¤¤¤¤¤¤……¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¦¦¦§§§§§§§§§§¨§§§§§§((((((©©©©©©©©ªªªªªªªªªª«VVVVVV𬬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬­­­­­­­­­­­®­­­­­­­­­­­­­­RRRRRR¯¯¯¯¯¯¯¯¯°±¯¯²²²²²²²²²²²³YWWXYWWXYWWX²²²²²²²²²²²²VVVVVš™VVVVVVVV…´ ––––––––––––VVVVVVVVVVš µµµµµµ¶µµµµµµµµµµµµ·µµµµµµµµµ·µ¶µµµµµµµµµµµµ·  ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¹ºººººººº»¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼½¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¿ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÃÃÃÃÃÃÃÃÄÄÄÄÄÄÄÄÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÆÆÆÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÈÇÇÈÉÉÉÉÉÉÉÉÉÉÉÊÉÉÉÉËËËËËËËËËËËËËËÌÍÍÍÍÍÍÍÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÓÑÑÑÑÒÑÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÓÒÑÑÑÑÑÑÑÑÓÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕ×××××××××××××××ØØØØØØØØØÙØØØØÚÚÚÚÚÚÚÚÚÚÚÚÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞààààààààààáàààààààââââââââââââãâââââäääääääääääääääääåååååååååååååååæåæååççççççççççççççç褤¤¤éêêêêêêêêêêëêêêêêêêëìí ~        ´´´´´´´´´´´´´´´´´´´´´´´ î      žž##))77)))) BBBRRR___ )) ***+++,,---  ...///88866NNNN>>>CC]]DDDEE)))559997::::$$$$!!!!)!""""##"$%%%SSFFTT;;AAGGGHHIIIUUMMMOOOOVVV0000JJJKKK&&&'''111<<((22334444WWW@@@LLLbbaa====XXPPPYYZZZ[[[^^\\eee```dddff???QQQTcccc"!!    !"#$%&'()*+,-./01234567899999:99999999999999;<=>?999@ABC9DE999999999999999999999999999999999999999999999999999999999FGHIJKLMNOPQRS99999999999999999999999999999999999999TUVWXYZ[\]^_9`abc999999d9efg9h9i9999999jklm999999999n999999999999999999o9p99999999999999999999999q999999999999999999999999999999999999999r999999999stu999999999999999999999999999999999vwx999yz{|}~99999999999999999999999999999999999999999999€999999999999999999999999999999999‚9ƒ„9999999999999999999999999999  !!!"#$%&'()*+,-./01234'562789:;<=>?@ABCD;EFGHIJAKBLD;MNOPQRSTB;UFVWABCD;UFGPXJAYZ[\]Z^_`aSB;;bcd`eKAf;;bFd`egAhf;idjIAkfklmnopqI=rpstrWurvwdxyz{=rX|}t~€‚[[[[[[ƒC ZW„„…†<‡ˆr‰rŠ‹‡‡SŒur‡Ž=Grr‘r{‡’@“42‡”4‹•–—=<‹‹‹‹˜‹™š›‘šœžŸ ¡¢£¤¥Œ¦kl§¨©ª«W¬K­®¥I¥¯]°±±±±±±±±±±±²ª‹ ±±±±±±±³±±±±±±±±±±±‹´•µIu¥k¶‘ ·¸'‘yr¹42t‡>'Œ¥r@=¸ºr»}¼Q'½¾¾¾'¿r‘À‘ÀÁ!ÂÃÄÅ!KÀ‹k‘Æ=ÇÈÉÊËÌ ͱ±±±±±ÎkkkÏÐbÑ‹‹ ˆW ‹‘§‹r‹;Ò‹‹K¬Ó? @A0(?=:B<C:DE A@D(D0:? -0 D A -0> F?GDB(HI::JBD 9IF?:D0=IDK: 5I5LB?MN I ),  O H(,45PQQ  RSTUV WXW%Y%%@ @  @)Z[\]^^_^^_1`2 aa) @ :?IDb (:@ cd!!"!efdgX Whi jklm^no 29 (p,]:q%r(D:DI A  ?@ABC DEFGGGGGGHHHHIJJJJJAKKLMNOPQRSTUVWXYZ [\]^_`abcdefg hihjkhlhimnopqirs^Gtuvwxyz{|}~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€~€€‚€€€‚€~€€ƒH„JJ…†d-‡Fˆ‰Š‹d[ŒŽ[v‘’“”•h–—˜™Kš›            !"#$%&' $()*%%"+,-./  / 0$   " 1 $ " 222233333344444456-)7.)-&89: , .;1);<=65>6?6--+ 1$ @A  ""BC>----222D+6; C EB6FB#GHHHHHHGHHHHHHGHHGHHH3IJ4444"  K.  B+5&----------LM=NO PQQQQQQ             !"#!!$!%!!&'(!)*!!+,-./01234!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!56789:;<=>!!!?@ABC!!!DE!!!!F!!!!!!!!!GH!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!J!!!!KL!!!!!!!!!!!!!!!!MN!OPQR!!!!!!!!!!!!!!!!!!!!!!S!TUV!!!!!!!!!!!!!!!V!!!!!WX!!!!!!!!!!!!!!  !"#$%&'()*+)),-./0))12345677879:;<=>?@ABCDEFGHI>GJKLMNOPQRISTUVSWXYZ[\]^_`7abc7defghij7)klmnop))))))))))q)rst)u)vwx))y^))))))))))z{))|}~€)‚ƒ„))…)†)‡ˆ‰Š‹)Œ7Ž)‘’77“”•–—)˜)™š›77œžŸ ¡¢£¡¤¥¦§¨©ª«7¬­®¯°±77777777777²³77777777777´µ77¶·77¸¹7777º7»¼½¾¿ÀÁ)ÂÃÄÄÅÆ777777ÇÈ^)É^)pÊË))ÌÍ7Î)))))‡77))))))Ï7))))Ï7ÎÐÑÒÓÔ))ÕÖרÙÚ7ÛÜÝ)Þßàá2âãˆ:äå7)æçè)éêëìí7777)î)))))ïðñ)))ò))ó7ôõö))÷ø))ùÎ)ú)ûüýþÿ)))   7)))Í77)y777 7777ˆ) 7Î7)7)ƒ77‡77777‡ó77)77ˆ7777)‡‡7777))77777–O–– !7–ä"77777)#ƒ7)))Ì7777)))$7777)Ì777777)%777777))&'(777)7777777777*+,7777-77777./0123456789:./;1<=>5?@ABCD½EFGHIJKLMN77))))))Ã7)y))))))7777777OPPP7777Q     !" #"$!%&$'($$)*+,,,,,,,,,,,,-.'/0 1 2!"3 4,5 6789,,,,,,,,,,:;:$$$$$$<$=>?,,@A$$$$$$$$$$B,,,,,CDE$$$$$$$$F,G,HIJKLMNO$$$$$$$,,,,,,@P$$$$$Q,,RK$$$$$$$B,,)S$$$$$QT,,UUV$$$$$$UW$$X,,,,,,@,$$$$$$$$$$$$$QY,,,,U,$$QZP$P$9P$LL$$$$$W$+()Y,[[\]^Q_)9P<`L$$$$$W$Wa)I@][VbP+_Jc9P$^^$$$$$W$WP)Y,::VXQ_,[[Vd^Q_6eP<(W)aW`X<($$)d@dIVX]_9P$WW$$$$$W$$P)f,IIV;)dP$WW$$$$$W$$P)Y,IIV;gQ_a$$$$$$?@ABCDEFGHIJKLMNOO     !"#$%&'()*+,-./01&/234567891:8;<:=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdMefghijklmnopdqrsturvwxyz{|}~h€jQ‚ƒ„„…†‡ˆR‰Š‹DdrŒŽY‘’“”•^1–c—M˜…ƒ™šj›œž“Ÿ i¡¢£¤¥¦r§¨©Mªj«¬­®DZM¯j“r°r±²dd¢³´^Mdd—~µ‘ ~—¶d‹·‹ ¸j¦¹º»¼½¾¿ÀÁÂRºº€€ÃÃĽůÇÈɃZrþÿÿ ÿÿÿÿÿÿÿÃÿP ß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿ¿¶ÿÿÿÿÿÿÿþÀÿÿÿÿïþáœÿÿàÿÿÿÿüÿÿÿ0ÿÿÿüÿÿÿÿýðÿÿÿÿïÿßáÿþþîŸùÿÿýÅãŸY€°î‡ùÿÿýmÇ^?î¿ûÿÿýí㿟À°ìÇ=ÖÇÿÃÇîßýÿÿýïãß`ìßýÿß`@ÿÿÿçß]€üìÿüÿÿû/€_ÿ ÿÿÿ –%ðþ®ìÿ;_ ðÿþÿÿÿþÿÿÿþÿÿÿÿÿùçÁÿÿ@0¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿ‡ÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿÏÿÿ€ÿÿÿÿÿÿÿÿ?ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿþÿ€ÿÿïÿïÿóü¿ÿàüÿÿÿ?Þoÿÿ????ÿªÿÿß_ÜÏÿÜ€ÿ„ü/>P½ÿóàCÿÀÿÿÿÿx ÿ€ÿÿ€àþ>ÿÿààÿÿÿÿ?þÿÿÿÿÿ ÿðÿÿÿ€€ÿüÿÿÿÿyÿÿ»÷ÿÿüÿÿÿÿ÷ÿÿ?ÿÿ8ÿÿ<~~~ÿÿøÿÿÿ?ÿÿÿÿÿøàÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþ?ÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷–þ÷ „ê–ª–÷÷^ÿûÿîûÿ        !"#$"%&'()*+,-./0123456789:;<=>?@ABCDEFGH=>I@J673?@AB%&6CDþÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®¤ªJUUÒUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿ„8'>P=À Àÿÿê%À(UUUUTUTUUUjU(Uÿÿÿÿðÿÿ?ÿÿÿÐdÞ?ÿÿÿ°çß{_üðÿÿ?ðÿÿ?üÿÿðÿÿÿ       !"#$%&'()*+,-./01234567//$$889þÿÿ ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿïÿÿÿÿ Ï<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿ¿ ÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ€ÿ„ü/>P½òàCÀÿÿÿÿÿÿÿÿx ÿ?ÿÿÿüÿÿÿÿxÿøÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷    !"#$%&'()*+,-./0123  !"#$!%&$!'# ()#*+,-#(.#"#/0123456789:;<=!>??@@ABCDEFGHIJKL*MNOPQRSTUVWXYZ[\]^_`abcdefghiRjklmNn4opqrstudvwxyz{|N}~l,€‚ƒ „~N…†N‡ˆ‰Š‹Œ Ž€@@¡ÿÿÿÿÿÿÿÿ0°øþÿÿÿÿ¿¶ÿøÿÿÀ¿ÿ=€ÿÀÿø?Àÿÿ?ðÿÿþ!þ  †9#¾! @ ÀÁ=`@0\òÀò@? þßàÿþÿÿÿ@àýfÃd à °?@þ x‡€ @åøŸ€Ðø< @£ðÏ?÷ÿý!ðÿÿÿøð ààà`ø|ßÿ€ÿÿÿ0€€€€ <>~p €÷¿€D`ÿÿÀ?€ÿÈ~fÁ 0X !üÿÿÿ$ nð‡ÿx&€ïÀ(¿€ÿÿ€øÿç<ÿÿ        !"#$%&'()*+,-þÿÿÿÿUUUUUUUªªTUUUUU+ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzUE@×þÿû€UUUæÿÿÿÿÿÿTUU«*UUUþÿÿÿ¿ UU@ÿ?ÿÿ?ªÿÿ@ Àÿÿê%À(UUUUTUTUUUjU(Uÿ       !"#$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢`[Uµªª-ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿÿßPÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ       !"#!$%&'()*+,-./0123456þÿÿ €ÿÿÿªªªªªªªTU«ªªªªªÔ)$F*!Q¢ÐVUµªª+ª¨ª …ªß i‹&  Š8ðÿÿÿ㪪ª' ÿÿÿÿÿÿ¨ªªTÕªªªþÿÿÿÿ"ªªêÿ?ÿÿ?ÿÿÿ?ÿß@ÜÏÿÜ@ÿÿÿÿbH P¿ ª*ªªª¨ª¨ªªª”ª ªøÿÿÿÿÿ        !"#$%&'()*+,-./01þÿÿ ÿÿÿUUUUUUUªªVUUUUU«ÖÎÛ±ÕÒ®°­ªJUUÖUUUlzU E@×þÿû€cUUU³æÿÿÿÿÿÿTUU«*UUUþÿÿÿ€¿ UULÿ?ÿÿ?ªÿÿÿœœœ@ Àÿÿê%À(UUUUTUTUUUjU(Uøÿ      !"#$%&'()*+,-./01þÿÿ ÿÿÿÿÿÿÿÿÿÿþÿßÿ÷ÿóÿ³ðÿÿÿýÿüÿÿß i‹&  Ï8@×ÿÿûÿÿÿÿÿãÿÿÿ·ïüÿÿÿþÿÿÿþÿÿÿÿ¿ "ÿÿÿOÿÿ????ÿªÿÿÿ?ÿÿß_ÜÏÿÜ@ @ÀÿÿÿÿÿÿÿÿÿÿmÀx ÿ?ÿÿÿüÿüÿÿÿþÿ8ÿøÿÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMM     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžkŸ ¡^¢y£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß<@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ –%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿøÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿßÿÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOP    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨•©Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß<À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿþàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_Ûÿÿÿøÿÿÿüÿÿàßÿüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ             !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNN     !"#$%&'()*+,-./$-0123.456/457849:;<=>?>@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abScdYefghijklmnkopqrstuvwxyzK{b||}~Ld€R]EEk‚ƒ„[…†‡ˆ‰ŠY†Y‹Œ>^ Žw‘’“”•Š–—˜™š›œWžk kŸ ¡^¢ky£¤¥¦RS^§yk¨k©ª]]š«¬Y^]]wf[fwf>f­Š®ž/¯°±²³´µ¶·L¯¯xx¸¸²¹º»¼½bSkþÿÿ ÿÿÿÿÿÿÿÃÿPß8@×ÿÿûÿÿÿÿÿ¿ÿüÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÀþÿÿÿ/`Àœýÿÿÿàÿÿ?üÿÿÿ0ÿÿ?ÿÿÿýðÿÿÿÿÿÿ#ÿþþàŸùÿÿýÅ#@°à‡ùÿÿým^à¿ûÿÿýí#°èÇ=ÖÇÿàßýÿÿýï#@ÿÿÿ'@üàÿüÿÿû/ÿÿ–%ðþ®ì _ðÿþÿÿÿÿ€?ÿÿàÿ?þÿÿÿÿÿ ÿ€€ÿüÿÿÿÿyÿ»÷ÿÿü?ÿÿÿÿ€÷ÿÿÿÿb>8ÿ~~~ÿÿøÿÿÿÿÿÿ?ÿÿÿÿÿø ÿý_ÛÿÿÿøÿÿÿüÿÿŠªÀÿÿÿüüüÿïÿÿÿÿ·ÿ?ÿ?ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀïþÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQ    !"#$%&'()*+,!*-./012345,67896:;<=>?@ABCDEFGHIJKLMNOPQRSTU:VWXYZ[X\]^_`abcKdefghijklmn\aoNpqrstNuvwxyz{{|}~€i‚Oƒq„„…†‡Pˆ‰ŠAc‹‹NŒŽ‘’“”•\–—˜\K™qš›œžŸ ¡¢˜£¤¥¦§N¨N©•Wª«¬Kei­®¯°AX±K²i“N³N_´µcc£¶·¸Kcc¹€º2A»¼–a_но¿iÀÁÂÃÄżÆÇÈÉÊËÌÍP¼¼ÎÎÏÈÐÑÒÓÔqXNWÿþÿÿ‡þÿÿ ÿÿÿÿÿÿÿÃÿPÿÿß8À×ÿÿûÿÿÿÿÿ¿ÿûüÿÿÿþÿÿÿþÿÿÿÿÿÿ¿¶ÿÿÿÿÿÃÿÿÿÿïŸÿýÿŸÿÿÿçÿÿÿÿÿÿ?ÿ?ÿÿÿýðÿÿÏÿþþîŸùÿÿýÅóŸy€°Ïÿî‡ùÿÿýmÓ‡9^Àÿ?î¿ûÿÿýíó¿;ÏÿŸ9À°ÏÿìÇ=ÖÇÿÃÇ=Àÿîßýÿÿýïãß=`ìßýÿÿýïóß=`@Ïÿÿÿÿçß}€Ïÿüìÿüÿÿû/„_ÿ ÿÿÿÿÿ–%ðþ®ìÿ;_?ÿóÿ Âÿþÿÿÿþÿßÿÿþÿÿÿ@ÿÿÿÿÿÿ?¿ ÿÿÿÿÿ÷ÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿþÿÿÿÿÿŸÿÿÿÇÿßÿÿÿß ÿÿ0ÿ8ÿÿÿÿÿÿÿÿÿ?ÿÿÀÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿŸÿÿ€ÿÿøÿãÿÿ÷ÿÿÿðÿÿ????ÿªÿÿß_ÜÏÿÜ€€ÿâÿ„ü/?PýÿóàCÿÿÿÿøÿ€€àþÿ>ÿÿæàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿð¿ÿÿÿ€€ÿüÿÿÿÿyÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿ?ÿÿÿ 8ÿÿ|~~~ÿ7ÿÿÿøÿÿÿÿÿøàÿý_ÛÿÿÿøÿðÿÿÿÿÿüÿàŠªüüüÿïÿÿÿÿ·ÿ?ÿ? ÿÿÿ>?ýÿÿÿÿ¿‘ÿÿÿÀoðïþÿÿ‡ÿÿÿÿÿÿßÿÿÿÿÿÿ€ÿÿàãøç<ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿ      €€0xø|ÿÿÿøÿÿÿÿ    !"#$%&'()*+  !"#$%&'()$*+,-./0123456789::;;<=>?@ABCDE#FGHIJKLM NOPQRSPTUVWXYZ[\]^_`$a&bcdeaFfgFhijklmnÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿøÀûï>ðÿÿþ!þ P €†9#¾!Ð À@ €ÀÁ=`D0`„\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8‡€ @åøŸÐ< @£ðÏ÷ÿý!ð0ÿÿ€€ü€÷?D`ÿÿÀ?€ÿÈ~fÁ0@ ! nð‡ÿx€ïÀ(¿€ Ãøç<             !"#$%&'()*+,-./012222222223456789:;<222=>?@A2B2CD2222E2FG222H222I2222JK2222222LMNOPQRS222222T2UVWXYZ[\]^_2222222_22222  !"#$%&'()*+,!-./0123456789:;8<=>?@AB CDEFGHIJKLMNOPQRSTUVWXYZ[\Z]^_`abcdefghZijklmnopdqrstuvwxyz{|}~€‚ƒ„…†Y‡ˆ‰ Š‹ŒSŽ‘ˆh’‡ “”•‹Y–h—˜™š›fœžŸ f¡¢£¤Z¥¦§¨©ª«¬­®–¯°[±²³´µ¶·¸¹µº»Z ¼½¾¿ÀYÁÂõZZ]–ÄÅÆÇÈÉÊËÌ͈ÎÏÐÑÒÓfÔvÕÖרÙvÚ×ÛÆÜÝÜÞßàáhâãäåæŽ`€çèéêëìíîéïðñòóôlˆõöƒ‹lY÷øYùúZˆû]Óü–·ýþÿˆŽ\ÿÿÿÿÿÿÿÿßÿÿÿ|ð×ÿÿûÿÿÿüÿÿÿþÿÿÿþþÿÿÿÿ†@IÿÿÿÀÿÈÿÿÿþÿÿÿ?@`Âÿÿÿ?ýÿÿÿàÿÿ?ÿðÿÿ?ÿÿÿÿAýøÿÿÿÿÿÿëÞÿóÿÿþìŸùÿÿýÅ£Y°Ãÿÿè‡ùÿÿýmÃ^Àÿè¿ûÿÿýíãÃÿÿýí#°ÃÿÿèÇ=ÖÇÿƒÆÀÿÿîßýÿÿýï#Ãÿÿìßýÿÿýïc› @Ãÿÿÿÿ§Á]Ãÿ?þìÿüÿÿû/ÿÿ €€ÿ–%ðþ®ì _ÿóÿÿÿüÿÿ_ýÿþÿÿÿ€ À¿ßÿÿ™ÿÿÿ<þÿáÿ›ßÿß¿ ÿÿÿ==ÿ=ÿÿÿÿ==ÿÿÿÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿcÿÿÿßÿÿOÀ¿ðÿÿÿÿÿÿÿÿÿÿÿÿ?xûñÿÿÿÿ?ÿÿÿÿÿÇÿÿÆÿÿ¿àÿ?ðÿÿÿÿÿ/èûÿÿÿðüÿÿÿÃôÿÿ¿\ ðÿ0øÿãÿÿÿÞoÿÿ????ÿªÿÿÿ?ÿÿßÿßÿÏïÿÿÜÿÿÿÿ€ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ€ÿÿÿÿÿÿÿÿûÿÿÿøàÿÿÿÿ?þÿÿÿÿÿÿÿÿÿÿÿÀÿÿüÿÿ»÷ÿÿŸÿÀÿü?Àÿÿ €ÿÿ7ìÿ¿ÿÃÿ÷/ÿóÿÿb>øÿÏ?~~~ßÿøÿÿÿ?ÿÿø ÿÿ_Ûÿÿÿøÿÿÿÿÿüÿÿÿ?ÿÿÿ÷ÿßÿüüü0ÿïÿÿÿÿ·ÿ?ÿ?‡ÿÿÿÿÿÿÿÿÿÿÿ¿ÿ?ÿ?ýÿÿÿÿ¿‘ÿÿ¿ÿÿÿÿÿÿÿƒÿÿÿÀïþÿÿÿÿ?þÿÿ?ÿÿÿÿÿýÿÿÿ€?üÿÿÿ‡ÙÿÿÿÿÀÿÿÿ?€ÿ×@ÿÿÿÿÿÿøÿþÿÿ_<ðÿÿÿÃÿÿ#ÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿÿÏÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿþþÿþÿÀÿÿÿÿÿÿ¿ÿßÿÿÿøáÿ?      €@@> ÿƒ€À|À0      @@?€    @€ „ÿðà„            !"#$%&'()*+,-.    !"#$%&"'(")*+,-.PŒ@€ˆÿÿ0 á þ`8p<ìøÀ0€@àøÀÀ€à€÷€ü€?`     !""#"$%&"'()""""""""""*+,##--../"&01234@'3@``ÿbø„ü/>³ûñààó¶>Ãðÿ?ë/0°ÀðÁŒ”``Àÿøÿÿ0 PÿÿÿÿÿÿßÿÿÿÿßdÞÿëïÿÿÿ¿çßßÿÿÿ{_üýÿ?ÿÿÿýÿÿ÷ÿÿÿ÷ÿÿÿÿýÿÿ÷Ïÿÿ–þ÷ „ê–ª–÷÷^ÿûÿîûÿÿ~~ÿ~~ÿ~~     !  !"!#$%&'()*+,-. /012345678+9:9;*<=>?@>ABCDEFG5HIJ5@5KL#M ÿ¿¶ÿøÿþÀž!ÿÿÀÿÀøïðÿÌÿßà ÀŸ€‡#¿ŸÀÇ€ß`߀€_ÿ ò òþÿàÿþÿÿÿøyÀÃ…|0€Àÿÿÿÿ€àþÿàÿþ3€ÿðÿ?ÿÿÿÿÿðøðÿÀ€ÿþ0Aø ø@nðÿ?ÿøÿø?ÿÿÿ   Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?      !"#$%&'(  !"#$%&'()*+,-./0123456789:&;<==>?@ABCDEFG)HIJK@ÿÿÿÿÿÿÿÿà00øþÿûÿÿ¿ø‡€aÿÀÿø?ðÿÿ  €_ ÂÜ@€€¿ þ àŸø À?ÿ!ðÿÿðÿà ààà`€€ü€°€ÿÿÿx@0À€ÿÿ€ãøç<     €@€@ >`p €  ÿ ðÿÿÿÿÿÿÿøÿÿÿÿ€ÿÿÿÿÿÿ0ÿÿÀÿÿÿÿÿÀ@€`€€0ÀÀ Àó ÿÿÿûÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÀ€šÿÿÿÿÿÿÿÿÿÿÿ? €€0 ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ€üÿÿÿÿ    € @@  À À À À`@€€þ         !"#$%   !"@€P€0 „@`ÌÀ0€ÀˆÀ€àÄ€`8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ> À   þÿüxþZCˆ€ÿÿÿÿþÿïÿÿÿÿÿÿ?ðÿÿÿÿÀ`                    !"#$%&'()*+,-./0123456784449:44444;<=>?@4ABCDEFGHIJKLMNOPQRSTUVWWWXYZ[\]^_``a`b`c`````d```efghijklmnopq````````````Wr``stuvwxyz{|}~€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€    !"#$% &'()*+,- ./01 2 34 156 372 86 39 1:2 ;4<1 = > ? @AB1C 3D 1 4 1 EF GH IJ K L MNOP< QR STUVW Q X  YZ [ [ 1 1 \]^ X_ ` abc d e fghi j= kil m nl op qrs to uvwwxyz{|}~€ T‚ƒ„…† ‡ˆ‰ Š‹Œ Ž ‘’“X ”• – — ˜‹‰ —™š› œ ‹ x  ž ’Ÿ   d ¡  Œ w –¢ – l£ ¤ ¥ ¦§ ¨ s l © ªl - « ¬­® ¯2 D< ° ±²³´Xtµ¶·¸‰ ¹º» — W¼½¾¿ÀÁ2 Ât‰ l à - ÄÅ l Æ ÇÈ –- ÉÊË Ì Í Œ Î ¡ ‡ ÏÐÐÐÑ—‹ÒÓ’’ Ô … Õ“‹Ö Ò×ØÙ‹Ú Û ‰ ‹ Ü             ! """"""#$%&'((((((()##*+,((((-./012(3((((-""456""7 8"""('9 :;<;=< > = ;<; =?  @ @A= ;>E @ F  : >G =9 9=B;   HI<9E <<; ; <; :@ = =  J >; B :< = KL = 9; : <   A :9G<;A E9;  >B :H > 9E;= ; 9 M   NNOP QRST U VWXYZFZFSSSSF   M[\   [ ]   F F    F    ^ >   _ F F `a :: @ b > >; <9@@  ;EA;> =;= c""d"(((e(((fgh ijFk (((lmn Fop[ """q!"""r4""s #######t 9@ <; >9 =B  uv9< >wx [ yz((( F F{  F     |                                                   !"#$%&'(  !"#$%&''()*+,-./0123456789:;<=>?@A.BCDEFGHIJKLMNAOPQFRSTUV   !"#$%&''()*+$,--.&/0012+34#5678977:;<=>?@ABCDEFGHIJKL0M;NOPQM0R6M STSJ5 UVL9WX5YZ[9N\]91^_`a11;1b@^JMcd9&N;e5Lfg^h5^Mijklmbn0&1&9222223----3+-----))----))-------222262---222--222----23--2455455422-2222-222.-22--2.12 2- 22--2-22-22222-22-2-22--2--2-2-2222222222---2---22222-22 !""####$$%%%%----+&'('''''2222--21.2--2-225*-)2224-2-2222-2,13.//-222-2-22-++0+++++---   !"###########################################$#%&'()*+,-./01234##5   !! "#$%&'()*+!,-./012345675899:;<=!>?<=!@ABCDEFGHIJKLIIMNOOPQRSTUVWXYZ[\]^_`abcdeffghijklmnoppqrstufffvttwxyz{|}9fffffffffffff~€‚ƒ„…‚ƒ„†‡ffffˆ‰fˆffŠ‹tŒttttttŒŽŽŽŽŽfŽŽŽŽŽŽf‘’“Q”•QN–—˜™š›œœœžŸ ¡¢££££££¤¥¥¦§§§¨©ª£«¬­®¯°±²¥³´µ¶·¸¹º»¼½¾¿ÀÀÁÂÃÄÄÄÄÄÅÆÆÆÆÇÈÉÊËÌÍÍÎÏÐÐÐÐÐÑÐÐÐÒÓÔÕÐÐÐÖ×ÐØÙÚÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÛÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÜÐÐÐÕÐÝÞßàáâãäåäæf玎èéꎎëìíQ                !     "#$   %    & $$ ''()*+,-   .. /  01234567***+***8#9":;;<=>?@ABBCD;E=>FFFFG   $H# % $  !IIIIIJIIIIK#L,M$$$$$$. ! N% O"IPIIIIIIKQQQQQQQRQQQS7$  $! .;;T $ UVVVVVVVVUUUWUVVXYZ[\UWVUUU]W^^^^^________`aaaaaaaaabcccccd^^e______faccghaijkilih`_i`mnaojpi_jq_`j^^^rsstsssssuvwxxxxwxyz{{|[}~Z}~[}~}~[€‚‚‚‚‚‚‚ƒ„„„„„„„„„„…†„†„†„†‡‚ˆ„… ;;;;;‰;;;;;‰Š‹=‰;;B=;=;;;BŒ=;‰;‰;;BŒ;Ž;‰;;;;>;;;;;Ž‹=;Œ;Š‘=‹‹Œ;Œ;=;;B;;;;==B;’K“”QQ”#•                        !"#      !"#"$%&'()*+,-./01,23!456789:;<=>>?@A&BCDEFGHIJKLMNOLKPGKQKRSRGTUVWXXXXXYZZZZ[\]^A_`a"`bPc_Oa                                  !"""""""#$$$$$$$$$$%&$&$&$&'"($%    !"#-+-) ##!!'' 777 +--++- ###!!'  &  8 )++++++++7/7+--..)#! ,2**01$  "%( 345 # # # 77-++66 ## ' --+9  !"#$%&'()*+,-   !"#$%&'()*+,-.+/-0,1/-2+,3.4+56789+3:+.+;<=>?@ABCDEF4GHIJKGLL++MNOPQRSTUVWXYZ[5\Z]^_]`abcde`fgh]ijk]l9md]no]'pqrst,u4vwexyz,{e]|'}~]€'‚ƒ„iL,  !"#  $$% &'%$! ()*+  %   ++ % %++%, - % +% +./.0 ++,  %+-%  1% %%++2%%   % + %        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOYZ[\]^_`abcdefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefghijkefglmmmmmmmmmmmmmmmmHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHOOOOnopqrstuvwxyHz{|}HHHHHH~H€H‚HƒHHH„HHH…†‡ˆHHHHHHHHH‰HHHHHHHHHHHHHHHHHHŠH‹HHHHHHHHHHHHHHHHHHHHHHHŒŽHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH‘’“HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH”•–—H˜H™š›œHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHžŸHH ¡¢£¤H¥¦§¨©ª«¬­HHHHHHHHHHHHHHHHHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO®¯H°±HHHHHHHHHHHHHHHHHHHHHHHHHHHH      !"#$%&'()*% +,-./0000100023456789:;<=>?@A:;BCDEFG;HIJ?K9:;HLM?NOPQRSETUV;WXY?Z[V;\X]?^[V_`a?bcdefg0hijjklm00nopqrs00tu%v8wxyz{|}00jjjj~jjjj€‚‚‚‚ƒ„„„„„…†…‡ˆ‰ˆŠ‹wŒŽŽJ‘’“”‘•jjjjj–—Œ˜—™šw››œjžjjŸj ¡¢jjj£j¤——00000¥¦§¨©ª«¬%)­¦®¯%°0000±²³´µ¶¶·¸¹¹º»¼½¾¿ÀÁÂÃÄwÅÆÇÈÉÊËÌÍÎÏÎÐÑÒÓÔÕÖרÙÚÛÜÝÞß0à0áááááááááâááááÍááãáäåæçèéêëìíîïðñòóôõö÷øùáúûüýþÿw0000000000..€ß  0000       Þ              0             Þ                         !   "°#$0%&'.(à0000Z)*+,-¦.—/%01234456007´89jŸjjjj:; <=>000000000?—@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDB@ABCBDBCBE‚F„„GHHHHHHHHßIJKLMNO0P00QR´STUV¹WXY Z [\]^._`abc‰d¸¸00àefàg000hwJ00.(à000ijk00¸—00000lmn00op0000q0000rstuvwxy000000000.«z{P|0«}~y—«1€000«4—00 ‚—000.0ƒ€„…†.00000y0000‡3ˆ«000000‰0000000šŠ‹Œ¸00000ßM¹‘Ž‘’“”Vw•–––—˜™š›œgžg000M        ÞŸ00 á¡ááá¢áá 0000£¤¥  ¦‰00  §¨   ! Þ ©ª0 §   «     ¬­   ®¯°±²( ³00000000´    µ000     000(       ¶00  !"""#$%$$&&'$$$$'&'()$*+,-.$$$$/////////////0$$/1&$$$$$&23 456 78-9--- '5'-$$$$$$$:&$$$&$&$$$$$$$$&&$$$5-; '+'&'&'&&&$$-5+5+&$$$+$$'$ 32 $$+'&$'&'&$55$+5+$+$$$'&&$$$ $$$$$+''&'$-++$&$$$$$$$ $$$$$$$5+5+$$$$$$'$-'&$&$'&&$'&$&$$$5$5$&$$+$$$$ &$$+'&&'$'55$$$+5$$$$$$$$'&'$-$$+5$$$&'&$$$$$$&'55&$$$+$$$$$<$'&$''$&$5$+55$&$$$$$=>>>>>>>>>>>>>>>>>>>>?$*>>>>>>>@ ;$$=??=??=$$$>>=>>>=>==$>=>>>>>>=>$>>??>>>$ $>> AABCD66E9,FF&$++5;-&AGHI$$ ; >>>'$$'$JJJJJJJJKKKKKKKKKKKKLLLLLLLLLLLL&$&&$&$&&$&&+$$$&$$$$$MN$;&5$$$$$)$$$$$$$$$$&$$$$$$>>;OMP>$ $$$6;6I&$$$$$$$$$&$6 >>>>>>>$>>?$$$$$>>>>>>$$>>>>>$$$ ?$>$>>>>>>>?>>>>>>?+--$$ ;;M&$-$$$$$Q;; $';---&$$$$5$$$$$$$$$$$$''''$&$'$& &;;;R;SR;TUVUVWXY!3333Z[\][M;;;^&$_N5$$$$$$$22`$$$abaa$$$$$$&$$$$&$$aaacaaadaeddaaaaaefdafeaefaefaafaefagacaaaU6FFFFFFFbFFFFFhhhhhhhhhhbFFF$$$$$i;Mj$$$')$$$$$$+&&UUUUUUU;;;;kUUFFFF;;9;Ml$$aaaaaaaaaaaaagaaaaa$$$$$aaaaaa$$mnaFFFFFaFFFFopaaaaaaaqaanrasttttaaaataaaaaaatttaaauaatv+w[rxttttaaaaatuanyr$$gaaaaaaaaaaaa$gaaaaaaaaaaaaaazaaaaaz$${{{{{{{{aaaaaanaaaaaaaaaaaz$aaaz$$$$j $$-$$$+;;$$$$$$$$$$--$$|$$$A6$$$$5$$$$;$$;$$$$$'JJJJJJ}$-;' $$$ $;>?$$$$$$$$$$$=>>;5$$$$'&'&'&$$$$$~~~~$$$$$$KKK€$LLLLLLLL$$‚‚‚‚‚‚‚‚$'$$ƒ„////1//////0//00/ƒ0/////$$$$$$$$'F$|$…†:‡ˆ$$$aa‰hhhhhhhm‰maaamN[6‰hhmaaazŠ‹$$&ŒiaaFammaaaaa[aaaaaa‰Žaaaaaa‰Ž‰pF]{{{{[$$$$&$aŠ‘&$$$$+’$'&';)$'$'$$$Q$$M$$$$$$&'&$&'Q$Q$$'$$$+5$$''$$5$+;;;;&$$$$Q;;;$&$$&$$$M$ -;;$$$$$$$5 ;;$$$$$$-M)$$$$$$$&$$$$$$“FpbFFp$$$$$$$+a$$$$$$$--$$$$$$&'&'&''''&'&&'&&&$$ '&&''&''$$$&$'''''&&''''''&&'&&'&&''''gaaaaaaz”$$&$$$$$•••••••••••••az$$$$$$aaaaz$$$z$$$$$$$aaagaaaaaacdaadaaazaaz$$zaaaaaaadddaaaaccdaaaaaaaaaagaz$daaaaaaacdaaaaaa$aaaa$$$$$$$$$gaaz$gaaaaa+$$$$$$$ $     $         %%%%        !!         & && &&& && "### !%%     && ''           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNK    !"#$%&'()$*+,-./01234567,85,69*:;<8=>?7@ABC#DEFGHIJGGKLMNOPQRS:+T:#UVW*<0$      !"#$% &%%#'(#)*+,$$+-./+0'**(1-+(--'*-+ ''2$  *(3 45 678 9('++(#*           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUUVWXYZ[\]^_`abcdefghi>jklm       !"#$%"#$%&'("#$)*"#$)*"#$)*+,-./012"#31245607"#89:;<=>?@ABCDEFGHIJKLMNOPCQRSTUVWXYPZ[\K]^__`abcDKdeQfg01hijklKgmno 9:pqrstuvwxyz{|}~€‚zƒ„g…†‡ˆ‰Š‹Œ"Ž"Ž"#‘’“”•012–—˜   1™#š›œ žŸž ¡¢£¤¥¦§¨©ª"#‘« ¬ ¬ ­1®F¯bC[°XXeIIPk±²!#%' !#%' .  (U^(U^ %' "$&%'(2?@ABCDEFGHIJKLMNOP##g's(^Ust%!(^2<F'2(%#'U^!!#%'  (!!(TUVWXYZ[\]^_`abcdefghijklmno PYbk(PUY^b(PUY^gk((((((Ãÿÿ?ÿÿÿ?y;xpüÿøÿÿùÿÿ?Â7:ð3üÿßSz0p€0¼þÿÿÿÿÏ¿ÿÿÿÿP|pˆ/<60ÿÿó~0P(¨  €       !"#$%%&&'()*+,-./0123456789:;<=>?@ABCDEFGHI,JE              !  "#$%%$ &' ( )* +,-. &/,(012  # 3 4( 5678! +,#9 : ' (%;                !"#$ %&'($ )&*($+,"-./0123456789:;<=>?@ABCDEFGHIJKLMNMNOLPQRSTU?VWXYZ[\]^_`abNcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽN‘’“”•–—˜™š›œ     !! ""#$% &'()*##+&& ,++-.& -/*,++012.$*34# *5"678$  9":;6< ) =>?@ABBCBBBBBBBBDEFGHIJ KLMNOPQRST6UVWXYXZ[#=\]^_`abcdeffghijcklEXmcnoOkpqrstuvwxyz{|}jc~ !€l‚ƒ„…†‡uˆY‚f‰klŠ‹ŒXŽYuQccc‘ ’T“ul”J•–c—˜Q-™ š›5œœXlžYœl?uŸ                                                      !"#$%&'()*+,-./0123456789:;<=>?@AA BBCDEFGHHHIJKKKLMMMMNOPQRSTUVWTUTUVWXYTUZ[TUTUTU\]^_`abc^defghiijjklmmmnnnoHHHHHIKKKKKLpqrs%tuvvvvwxRDDyz%{| }}}}}~~~~~      !"###$$%&'()'()'()*'()+,-./01123456789::;<:=>?@ABACDEFGGGHIIJKL!!!MNNNOPPQRSTUVWXYZ[\]^^^_`abcdefghijklmmnopqrstuvwxy---zzzzzzzz{{{{{{{{|}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€‚ƒ„…†nnnnnnnnssssssssnnnnnnssssssnnnnssss‡‡ˆˆˆˆ‰‰ŠŠ‹‹ŒŒnnssŽŽ‘‘‘‘nn’ss““nn”vss••y––——˜™š›œžžžžžžžžŸŸŸŸŸŸŸŸŸŸ          ¡¢£¤¥¦§¨©ªª««««««««««««««««¬­®¯¯¯¯¯¯¯¯°°°°°°°°       !"#$%%&'()***+,,,,-./01211231111456789:;<<=>???*****+@ABCD /EFGHHHHH    !""#$%&'()*+,--------.//////////////////////0000000000000000123333333333333333333344567777533883399,::;;5<=>?@@@@@@@@AAAAAAAAAABCDEFGHIIJKLMMMMMMMM ‡ÿÿÿôþÿÿÒÎÍOÊËÏÓÑÕÖÚÙÛŸÿÿÿÈÿÿÿ~ÿÿÿ+*]ÿÿÿ(*=ÿÿÿEGt&%@?âÿÿÿçÿÿÿñÿÿÿêÿÿÿÊÿÿÿÐÿÿÿÄÿÿÿÀÿÿÿùÿÿÿP0`ÆÿÿÿAâÿÿøÿÿÿ¶ÿÿÿ÷ÿÿÿûãÿÿªÿÿÿœÿÿÿÿÿÿ€ÿÿÿ‚ÿÿÿ£âÿÿAßÿÿºßÿÿ ÖÿÿñÿÿÖÿÿäÕÿÿÖÿÿáÕÿÿâÕÿÿÁÕÿÿüuÿÿØZÿÿ¼Zÿÿ(         !"#$%&'())*+,-.///0122223456787789:7;<=>?@ABCDEFGHIJKLMNNOPQQQ/////0RSTUV$W++XYZ[\]]]]]      !"#$$$%&&'()*+,-./01233333333455555555555555555555556777777777777777789:;<=>??????????????@ABC????DDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJKLMN??OOPQRSTUVWWWWXYZ[\??]]^_`ab??cc2defghiijjklmnoppppppppqqqqqqqqqqrstuvwxyyz{|}~€‚ƒ„…†‡ˆ‰‰‰‰‰‰‰‰´·õdMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| ˆ düÿ‹A…B x Å A @ÌüÿCA…B u Å D zR| ˆÔüÿ 0ÐüÿDÌüÿ XÄüÿ lÀüÿ€Àüÿ ”¸üÿ ¨°üÿ¼¬üÿ Фüÿä”üÿøüÿ €üÿ. œüÿ4˜üÿ#H¨üÿJ(\àüÿÇA†A ƒC S  AÃAÆB ˆ|üÿ!,œŒüÿŠA†A ƒC0I  AÃAÆD ,Ìèüÿ‚A†A ƒC0D  AÃAÆA Dü<üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇDDxüÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ,Œ´üÿ‚A†A ƒC0D  AÃAÆA ,¼üÿŠA†A ƒC0I  AÃAÆD ìdüÿ+|üÿ'üÿ( üÿr|<lüÿÍA…A ‡A†AƒC@i AÃA ÆAÇAÅD h AÃAÆ AÇAÅD l AÃAÆ AÇAÅD lAÃAÆ AÇAÅ|¼¼üÿÎA…A ‡A†AƒC@i AÃA ÆAÇAÅD i AÃAÆ AÇAÅC m AÃAÆ AÇAÅC mAÃAÆ AÇAÅ< üÿ 8Püÿ[A…A ‡A†AƒCOAÃA ÆAÇAÅ<Œ$üÿïA‡A †Aƒ}  ÃAÆAÇB hà AÆAÇ,ÌÔüÿBA†A ƒj ÃAÆC PÃAÆüèüÿ àüÿ$Ôüÿ8ÈüÿL¼üÿ`°üÿt¤üÿˆ˜üÿœŒüÿ€°€üÿTA…A ‡A†AƒC0Z AÃA ÆAÇAÅC o AÃAÆ AÇAÅA à AÃAÆ AÇAÅD g AÃAÆ AÇAÅA 4Püÿ7AƒCqAà ThüÿVAƒs ÃD ]ÃxœüÿŒüÿfC0Y D E¬ØüÿPÀÜüÿ5A…A ‡A†AƒCp¨ AÃA ÆAÇAÅA |AÃAÆ AÇAÅ4À üÿ\A†A ƒC0w  AÃAÆB Y AÃAÆ4Lä üÿ„A‡A †AƒC c A ÃAÆAÇD („0 üÿ4AƒC Y AÃB RAð8 üÿ4Ä8 üÿJA‡A †AƒC s A ÃAÆAÇD (üL üÿ/AƒC b AÃA EAÃ4(P üÿ!AƒC e AÃB z AÃA p AÃC ,`< üÿŠA†A ƒC0I  AÃAÆD ,˜ üÿ‚A†A ƒC0D  AÃAÆA DÀì üÿA‡A †AƒC B A ÃAÆAÇA qAà AÆAÇ (üÿ8 Lüÿ0 @üÿC \ A V B lP ¤üÿ…A…A ‡A†AƒC`R AÃA ÆAÇAÅA c AÃAÆ AÇAÅC × AÃAÆ AÇAÅA À ¼üÿÔ ¸üÿdè ¸üÿÁA…A ‡A†AƒC@ AÃA ÆAÇAÅD K AÃAÆ AÇAÅA PAÃAÆ AÇAÅP üÿ/C c B Dl (üÿ„A‡A †AƒC0d A ÃAÆAÇC PAà AÆAÇ´ düÿC RXÌ düÿ,A‡A †AƒC Ó A ÃAÆAÇD u Aà AÆAÇD { Aà AÆAÇB D( 4üÿ’A‡A †AƒC`q A ÃAÆAÇB | Aà AÆAÇA (p €üÿHA†A ƒC0{  AÃAÆB 8œ œüÿýA†A ƒC v  AÃAÆC `  AÃAÆB hØ `üÿA…A ‡A†AƒC0™ AÃAÆ AÇAÅD | AÃA ÆAÇAÅD S AÃAÆ AÇAÅA hD üÿõA…A ‡A†AƒC0… AÃAÆ AÇAÅD u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA h° ”üÿíA…A ‡A†AƒC0€ AÃAÆ AÇAÅA u AÃA ÆAÇAÅC S AÃAÆ AÇAÅA < üÿLA…A ‡A†AƒC@u AÃA ÆAÇAÅA <\ $üÿOA…A ‡A†AƒC@{ AÃA ÆAÇAÅA œ 4üÿAƒCYAü 4üÿC Z(Ô <üÿ A†A ƒC W AÃAÆ40üÿAƒC0g AÃD W AÃD W AÃD 8 üÿ>C e D I C E\(üÿC T<t,üÿA…A ‡A†AƒC@Ý AÃA ÆAÇAÅA h´ôüÿõA…A ‡A†AƒC0‡ AÃAÆ AÇAÅB v AÃA ÆAÇAÅB S AÃAÆ AÇAÅA l €üÿvA‡A †AƒC0Š A ÃAÆAÇA F Aà AÆAÇC { Aà AÆAÇB r Aà AÆAÇC Hˆüÿ>A†A ƒC0Y  AÃAÆD c  AÃAÆC N  AÃAÆD Ü|üÿ ð|üÿAƒC e AÃB <èüÿA…A ‡A†AƒC@Û AÃA ÆAÇAÅB TÈüÿ4AƒC mAÃtÜüÿ4AƒC mAÃD”ðüÿ‡A‡A †AƒC0O A ÃAÆAÇD E Aà AÆAÇD DÜ0 üÿŠA‡A †AƒC0s A ÃAÆAÇD N Aà AÆAÇC P$t!üÿeA…A ‡A†AƒCPs AÃA ÆAÇAÅB N AÃAÆ AÇAÅB <xˆ#üÿAA…A ‡A†AƒC0ö AÃA ÆAÇAÅC 8¸Œ$üÿaA†A ƒC Q  AÃAÆD d  AÃAÆB 8ô´$üÿ]A†A ƒC R  AÃAÆC a  AÃAÆA (0Ø$üÿqA†A ƒC Q  AÃAÆD (\ %üÿqA†A ƒC R  AÃAÆC 4ˆh%üÿTA†A ƒC0B  AÃAÆC E AÃAÆ8À„%üÿAA…A ‡A†AƒC uAÃA ÆAÇAÅ\üŒ%üÿ³AƒC P AÃC w AÃD Q AÃB Z AÃE F AÃE F AÃE F AÃE 8\à%üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇ8˜Ø%üÿ8A‡A †AƒS  ÃAÆAÇD Yà AÆAÇ8ÔÔ%üÿ2A‡A †Aƒf à AÆAÇA C ÃAÆAÇPÌ%üÿvA…A ‡A†AƒC@d AÃA ÆAÇAÅA } AÃAÆ AÇAÅC Tdð&üÿA…A ‡A†AƒCPQ AÃA ÆAÇAÅD q AÃAÆ AÇAÅC |¼°'üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|<,(üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ4¼¨(üÿIAƒN ÃA P ÃH D ÃH D ÃH DÃ|ô¼(üÿùA…A ‡A†AƒC0z AÃA ÆAÇAÅC t AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|t8)üÿúA…A ‡A†AƒC0z AÃA ÆAÇAÅC u AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅ<ô´)üÿÿA…A ‡A†AƒC@n AÃA ÆAÇAÅC h4t,üÿ A…A ‡A†AƒCpv AÃA ÆAÇAÅC e AÃAÆ AÇAÅA n AÃAÆ AÇAÅA X  6üÿÔA‡A †Aƒ[  ÃAÆAÇD p à AÆAÇB y à AÆAÇA }à AÆAÇXü„6üÿåA‡A †Aƒ_  ÃAÆAÇD u à AÆAÇA ~ à AÆAÇD ~à AÆAÇdX7üÿóA‡A †AƒAm A ÃAÆAÇD w Aà AÆAÇB x Aà AÆAÇA Aà AÆAÇ€Àœ7üÿXA…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB O AÃAÆ AÇAÅA R AÃAÆ AÇAÅB €Dp8üÿ`A…A ‡A†AƒCPO AÃA ÆAÇAÅA G AÃAÆ AÇAÅB S AÃAÆ AÇAÅA V AÃAÆ AÇAÅB hÈL9üÿüA‡A †AƒAm A ÃAÆAÇD | Aà AÆAÇA y Aà AÆAÇD @Aà AÆAÇ|4Ü9üÿõA…A ‡A†AƒC@{ AÃA ÆAÇAÅB p AÃAÆ AÇAÅD t AÃAÆ AÇAÅD tAÃAÆ AÇAÅ|´T:üÿöA…A ‡A†AƒC@{ AÃA ÆAÇAÅB q AÃAÆ AÇAÅC u AÃAÆ AÇAÅC uAÃAÆ AÇAÅl4Ì:üÿÊA…A ‡A†Aƒj ÃA ÆAÇAÅC j ÃAÆ AÇAÅC n ÃAÆ AÇAÅC nÃAÆ AÇAÅ|¤(;üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅ|$<<üÿ”A…A ‡A†AƒCP| AÃA ÆAÇAÅA e AÃAÆ AÇAÅA j AÃAÆ AÇAÅA nAÃAÆ AÇAÅl¤P=üÿËA…A ‡A†Aƒj ÃA ÆAÇAÅC k ÃAÆ AÇAÅB o ÃAÆ AÇAÅB oÃAÆ AÇAÅ<¬=üÿcA…A ‡A†AƒCpC AÃA ÆAÇAÅA <TÐ>üÿšA…A ‡A†AƒCpY AÃA ÆAÇAÅA H”,@üÿ‰A…A ‡A†Aƒi ÃA ÆAÇAÅD C ÃAÆ AÇAÅB <àl@üÿkA‡A †Aƒ| à AÆAÇC [  ÃAÆAÇC 0 ˜@üÿTA†A ƒa ÃAÆD Q ÃAÆB <T¸@üÿsA‡A †AƒX  ÃAÆAÇC I à AÆAÇA 0”ì@üÿoA†A ƒU ÃAÆD I ÃAÆB 0È(AüÿoA†A ƒU ÃAÆD I ÃAÆB üdAüÿhAüÿ1C U D T0|Aüÿ%<DAüÿôA…A ‡A†AƒC0V AÃA ÆAÇAÅC <„DBüÿºA…A ‡A†AƒCPZ AÃA ÆAÇAÅC ÄÀFüÿFC R C a C (äèFüÿ/AƒC T AÃC QAÃT ìFüÿ!A…A ‡A†AƒC`Y AÃA ÆAÇAÅA o AÃAÆ AÇAÅA <h ¸Hüÿ]A…A ‡A†AƒCPw AÃA ÆAÇAÅB €¨ ØLüÿ_A…A ‡A†AƒC€¥ AÃA ÆAÇAÅA K AÃAÆ AÇAÅA © AÃAÆ AÇAÅA «AÃAÆ AÇAÅT,!´RüÿHA…A ‡A†AƒCp] AÃA ÆAÇAÅA w AÃAÆ AÇAÅA l„!¤TüÿøA…A ‡A†AƒCp‰ AÃA ÆAÇAÅD W AÃAÆ AÇAÅA M AÃAÆ AÇAÅC <ô!,ZüÿiA…A ‡A†AƒC0b AÃA ÆAÇAÅC (4"X]üÿ"A†A ƒA\ AÃAÆ4`"P]üÿ¸A‡A †AƒC u A ÃAÆAÇB h˜"Ð]üÿÆA…A ‡A†AƒC`q AÃA ÆAÇAÅD M AÃAÆ AÇAÅA oAÃAÆ AÇAÅd#,_üÿBA…A ‡A†AƒC`y AÃA ÆAÇAÅD Ò AÃAÆ AÇAÅA ^AÃAÆ AÇAÅdl#`üÿfA…A ‡A†AƒC`y AÃA ÆAÇAÅD ã AÃAÆ AÇAÅA qAÃAÆ AÇAÅhÔ#aüÿžA…A ‡A†AƒC`q AÃA ÆAÇAÅD ' AÃAÆ AÇAÅA mAÃAÆ AÇAÅd@$†T†b†r†„†–†¨†À†Ô†è†þ†‡$‡<‡L‡Z‡l‡~‡އ¦‡¸‡ʇ؇è‡ø‡ ˆ ˆ0ˆFˆ`ˆpˆŠˆžˆ®ˆÀˆЈàˆöˆ‰ ‰0‰H‰b‰x‰‰ž‰®‰À‰Љà‰ü‰Š,ŠDŠVŠhŠxŠˆŠœŠ¶ŠÈŠ´ƒ̃äƒôƒ„„6„N„\„n„~„Œ„œ„¦„°„¼„Æ„ЄØ„â„ì„ö„…………$…0…D…b…v…Œ…¢…²…Æ…Ø…æ…ø…††&†>†T†b†r†„†–†¨†À†Ô†è†þ†‡$‡<‡L‡Z‡l‡~‡އ¦‡¸‡ʇ؇è‡ø‡ ˆ ˆ0ˆFˆ`ˆpˆŠˆžˆ®ˆÀˆЈàˆöˆ‰ ‰0‰H‰b‰x‰‰ž‰®‰À‰Љà‰ü‰Š,ŠDŠVŠhŠxŠˆŠœŠ¶ŠÈŠÏDeleteCriticalSectionìEnterCriticalSectionþGetLastErrorGetModuleHandleAAGetProcAddressÞInitializeCriticalSection.LeaveCriticalSection•TlsGetValue½VirtualProtect¿VirtualQuery8__dllonexitF__mb_cur_max_assert¿_errno!_isctype¡_pctype„fflush“freeÄmallocËmemmovetolowertoupper _iobGabortScallocyfwriteìvfprintf PyArg_ParseTuple PyArg_ParseTupleAndKeywordsPyBuffer_Release.PyBytes_FromObject/PyBytes_FromString3PyBytes_Type>PyCallable_Check}PyDict_Contains~PyDict_Copy‚PyDict_GetItem‰PyDict_NewŠPyDict_NextŒPyDict_SetItemPyDict_SetItemString–PyErr_CheckSignals—PyErr_Clear›PyErr_Format PyErr_NoMemory¢PyErr_Occurred¸PyErr_SetStringØPyEval_RestoreThreadÙPyEval_SaveThread÷PyExc_IndexError PyExc_RuntimeErrorPyExc_TypeErrorPyExc_ValueErrorhPyImport_ImportModulezPyList_AppendPyList_New‚PyList_ReverseƒPyList_SetItemŠPyLong_AsLongPyLong_AsUnsignedLong–PyLong_FromLong¨PyMapping_KeysµPyMem_Free·PyMem_Malloc»PyMem_ReallocÐPyModule_Create2ÒPyModule_GetDictPyObject_Call"PyObject_CallObject$PyObject_ClearWeakRefs*PyObject_Free4PyObject_GetAttrString6PyObject_GetItem<PyObject_InitCPyObject_MallocGPyObject_ReprOPyObject_Size‰PySequence_GetSlice™PySet_Contains¢PySlice_GetIndicesEx¤PySlice_TypeÐPyThread_acquire_lockÒPyThread_allocate_lock×PyThread_free_lockÜPyThread_release_lockëPyTuple_NewìPyTuple_PackíPyTuple_SetItemïPyTuple_TypeøPyType_ReadycPyUnicode_FromKindAndDatadPyUnicode_FromObjectfPyUnicode_FromStringhPyUnicode_FromUnicoderPyUnicode_Join‚PyUnicode_TypeŒPy_BuildValueÝ_PyBytes_JoinŸ_PyUnicode_Ready¤_PyUnicode_ToLowercase»_Py_FalseStructÅ_Py_NoneStruct€€€€€€€€€€KERNEL32.dll€€€€€€€€€€€€msvcr100.dll(€(€(€(€(€msvcrt.dll<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€<€python34.dll´·õd€·õd ød ød(`ødødP 00(0=0ˆ0¹0È0Í0B1J1j1r11Ÿ1¶1½1Å1Ð1â1ø12+2A2Ì3ã3²8ó8¿>3>Š>.?L?T?Y?d?µ?ô?0 00-050:0E0\0c0x00”0›0°0·0ý0=1E1`1s1¦1¾1Ã1Î1ß1è1í1ø12222272B2V2[2f2t2y2‚22•2 2°2µ2À2â2ç2ò23333!3*353D3I3T3a3f3p3€3…33Ö3ó3"4M4h4n4æ4ÿ4"5M5a5g5Þ5ó56=6Q6W6°6Ú6ÿ6-7G7j7‡7ž7©7½7!8=8°8¸8É8Ö8ø8ß9B:©:;%;E;W;x;¶; <¦<¿<ñ<=a==–=±=È=>2>x>ˆ>¶>î>M??Ã?ì?@`;0y0ª0Þ0÷0ý0 1(1ƒ1Ž1Ó1ñ1 2D2`2w2~2„2›233X3l3™3©3Ã3è3ö364C44ã4ú4555~56Z6œ6 9v:ã;Þ>P -1W4p Õ0ë0ÿ017 77(797L8ý8k9€65í5v6(H:Q:Y:b:Ñ<3===G=Š=”=ž=?>?H?R?`? \X0æ1ì12 2U2Z2¬2±2,323?3U3o3u3¢3²3(4E4u4<5È5Ø5å5ô566(6d6k6w7¤7©7Ý7Æ89©9ß:V;·;Š<=° ‡2w?À8‹3ò45<5s5„5º5Î5ä5í5ö5þ567Ê7Ö7g9¬9¹9;:A:W:¤:o<Ð\32¥7…8¸8ã8õ8 9)919:9È9.:ÿ:;;0;@;±;õ;û;<#<)e>y>>¡>µ>É>L?n?–?É?ý?àx"0i0‘0?1L1c1~1˜1¼1„2˜2 2µ2Ã2è2W344a4v4’4¬4É4å4 5£5I6T6j6–6¡6Æ6ó677?7Z7©7¶7¾7Ç768R8i88³8»8Ð8ð8ù89 9Ù9Û<>>†?ð {> »7 Ä2Ì274®5ó6ß80 ¿7@z0¬7ä>PS0[0Š0`10133¬3ø9Ì;<=p@g2¸2~3Ç4ñ4)545¡6’7¦7Ê7±89Z9¹9Á9Ü9Ÿ:F;®;Ú;î<-=]=e=€=>S>€\­0)1~1–1Š2ª2¾2\3ˆ3´3Ì3Ñ3é35Ò67&7z7€8†8ö8Î9B: ;#;Ù;ö;’>ä>(?0?E?¨?ì?ô?˜ 0l0°0¸0Í001t1|1‘1(2¯2î2p3)4-43474=4G4K4Q4[4_4e4i4o4s4y4}4ƒ4‡44‘4—4¡4¥4«4¯4µ4¹4¿4Ã4É4Í4Ó4Ý4á4ç4ë4ñ4õ4û4ÿ45 5555#5'5-51575;5A5E5K5O5V5\5m5~55Ÿ5²5¸5Í5Ü5ð5ù5!6*6>6D6V6_6r6„6Ï6Õ6ä6ë67767U7™788;8B8K8e8t88…8À8æ8ñ8999>9I9Y9f9s9’99°9¼9È9ê9õ9::":B:M:`:m:z:š:¥:¸:Å:Ò:õ:;;;3;Z;e;u;‚;˜;Ã;Î;á;ñ;<3<> >#>M>X>h>u>‹>µ>À>Ð>Ý>ó>?(?8?E?[?‚???ª?À?í?ø? ”00+0R0]0m0z00½0È0Ø0å0û0%1-1=1J1`11˜1¨1µ1Ë1ò1ý1 2202]2h2x2…2›2Â2Ê2à2í23*353H3U3k3’33°3½3Ó3ú344%4;4b4m4€44£4Ê4Õ4è4õ4 555@5P5]5s55¨5¸5Å5Û56 66*6@6j6r6…6’6¨6Õ6à6ð6ý67:7E7X7e7{7¢7­7½7Ê7à7 88%828H8r8}888³8Ú8å8ø899B9M9`9m9ƒ9ª9µ9È9Õ9ë9::0:=:S:z:…:˜:¥:»:ã:î:;;';R;];p;};“;º;Å;Ø;å;û;%<0<@->8>H>U>k>’>>°>½>Ó>ú>??%?;?b?m?}?Š? ?Ê?Õ?è?ø?°T0&010A0N0[0z0…0•0¢0¯0Î0Ù0ì0ù01&111D1Q1^1~1‰1œ1¬1¹1Ú1å1ø12222=2P2\2h2Š2•2¥2²2¿2Þ2é2ù23323=3P3]3s3š3¥3¸3Ä3Ð3ò3ý344*4Á5Ì5Ü5é5õ5ý5a6l6|6‰66½6È6Ø6å6î6ö6727:7B7J7R7Z7b7j7r7z7À7É7é7ï78U8s8o9‚9–9Ÿ9¤9®9¹9Ã9Î9Õ9ù9 ::6:A:L:v:•:µ:â:ü:;:;K;[;d;};;™;´;È;Ö;í;ÿ; <@<\<”<Ÿ<¨<¯<Ï<ã<ï<=5=E=z=ƒ=Ž==§=»=Ê=Ò=Ú=â=ê=ò=ú=> >>>">*>2>F>X>À¤000 00000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¨0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1Œ1`2d2l2p2t2|2€2„2Œ22”2œ2 2¤2¬2°2´2¼2À2Ä2Ì2Ð2Ô2Ü2à2ä2ì2ð2ô2ü233 3333 3$30343`3p3t3„3ˆ3˜3œ3¬3à3ä3ì3,4è4ì4 5$5,50545<5@5D5L5P5T5\5`5d5l5p5t5|5€5„5Œ55”5œ5 5¤5¬5°5´5¼5À5Ä5Ì5Ð5Ô5Ü5à5ä5ì5ð5ô5ü56666 6$6@6P6T6d6h6x6 6¤6¬6´6¸6À6È6Ì6Ô6Ü6à6è6,788 8888 8$80848`8p8¬8€9„9Œ99”9 9¤9À9Ð9: :€:„:ˆ:Œ::”:˜:œ: :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;X;\;`;d;h;p;t;x;€;„;ˆ;;”;˜;œ; ;¤;¬;°;´;¸;¼;À;È;Ì;Ð;Ô;Ø;Ü;ä;è;ì;ð;ô;ø;<<< <<<àÄ :¤:°:´:À:Ä:Ð:Ô:à:ä:ð:ô:;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;œ; ;¤;¨;¬;°;´;¸;¼;À;Ä;È;Ì;Ð;Ô;Ø;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<<<@>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?...) Atomic non-capturing version of regular parentheses. (?flags-flags:...) Non-capturing version of regular parentheses with local flags. (?P...) The substring matched by the group is accessible by name. (?...) The substring matched by the group is accessible by name. (?P=name) Matches the text matched earlier by the group named name. (?#...) A comment; ignored. (?=...) Matches if ... matches next, but doesn't consume the string. (?!...) Matches if ... doesn't match next. (?<=...) Matches if preceded by .... (? Matches the text matched by the group named name. \G Matches the empty string, but only at the position where the search started. \L Named list. The list is provided as a keyword argument. \m Matches the empty string, but only at the start of a word. \M Matches the empty string, but only at the end of a word. \n Matches the newline character. \N{name} Matches the named character. \p{name=value} Matches the character if its property has the specified value. \P{name=value} Matches the character if its property hasn't the specified value. \r Matches the carriage-return character. \s Matches any whitespace character; equivalent to [ \t\n\r\f\v]. \S Matches any non-whitespace character; equivalent to [^\s]. \t Matches the tab character. \uXXXX Matches the Unicode codepoint with 4-digit hex code XXXX. \UXXXXXXXX Matches the Unicode codepoint with 8-digit hex code XXXXXXXX. \v Matches the vertical tab character. \w Matches any alphanumeric character; equivalent to [a-zA-Z0-9_] when matching a bytestring or a Unicode string with the ASCII flag, or the whole range of Unicode alphanumeric characters (letters plus digits plus underscore) when matching a Unicode string. With LOCALE, it will match the set [0-9_] plus characters defined as letters for the current locale. \W Matches the complement of \w; equivalent to [^\w]. \xXX Matches the character with 2-digit hex code XX. \X Matches a grapheme. \Z Matches only at the end of the string. \\ Matches a literal backslash. This module exports the following functions: match Match a regular expression pattern at the beginning of a string. fullmatch Match a regular expression pattern against all of a string. search Search a string for the presence of a pattern. sub Substitute occurrences of a pattern found in a string using a template string. subf Substitute occurrences of a pattern found in a string using a format string. subn Same as sub, but also return the number of substitutions made. subfn Same as subf, but also return the number of substitutions made. split Split a string by the occurrences of a pattern. VERSION1: will split at zero-width match; VERSION0: won't split at zero-width match. splititer Return an iterator yielding the parts of a split string. findall Find all occurrences of a pattern in a string. finditer Return an iterator yielding a match object for each match. compile Compile a pattern into a Pattern object. purge Clear the regular expression cache. escape Backslash all non-alphanumerics or special characters in a string. Most of the functions support a concurrent parameter: if True, the GIL will be released during matching, allowing other Python threads to run concurrently. If the string changes during matching, the behaviour is undefined. This parameter is not needed when working on the builtin (immutable) string classes. Some of the functions in this module take flags as optional parameters. Most of these flags can also be set within an RE: A a ASCII Make \w, \W, \b, \B, \d, and \D match the corresponding ASCII character categories. Default when matching a bytestring. B b BESTMATCH Find the best fuzzy match (default is first). D DEBUG Print the parsed pattern. F f FULLCASE Use full case-folding when performing case-insensitive matching in Unicode. I i IGNORECASE Perform case-insensitive matching. L L LOCALE Make \w, \W, \b, \B, \d, and \D dependent on the current locale. (One byte per character only.) M m MULTILINE "^" matches the beginning of lines (after a newline) as well as the string. "$" matches the end of lines (before a newline) as well as the end of the string. E e ENHANCEMATCH Attempt to improve the fit after finding the first fuzzy match. R r REVERSE Searches backwards. S s DOTALL "." matches any character at all, including the newline. U u UNICODE Make \w, \W, \b, \B, \d, and \D dependent on the Unicode locale. Default when matching a Unicode string. V0 V0 VERSION0 Turn on the old legacy behaviour. V1 V1 VERSION1 Turn on the new enhanced behaviour. This flag includes the FULLCASE flag. W w WORD Make \b and \B work with default Unicode word breaks and make ".", "^" and "$" work with Unicode line breaks. X x VERBOSE Ignore whitespace and comments for nicer looking REs. This module also defines an exception 'error'. """ # Public symbols. __all__ = ["compile", "escape", "findall", "finditer", "fullmatch", "match", "purge", "search", "split", "splititer", "sub", "subf", "subfn", "subn", "template", "Scanner", "A", "ASCII", "B", "BESTMATCH", "D", "DEBUG", "E", "ENHANCEMATCH", "S", "DOTALL", "F", "FULLCASE", "I", "IGNORECASE", "L", "LOCALE", "M", "MULTILINE", "R", "REVERSE", "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "X", "VERBOSE", "W", "WORD", "error", "Regex"] __version__ = "2.4.41" # -------------------------------------------------------------------- # Public interface. def match(pattern, string, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.""" return _compile(pattern, flags, kwargs).match(string, pos, endpos, concurrent) def fullmatch(pattern, string, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Try to apply the pattern against all of the string, returning a match object, or None if no match was found.""" return _compile(pattern, flags, kwargs).fullmatch(string, pos, endpos, concurrent) def search(pattern, string, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Search through string looking for a match to the pattern, returning a match object, or None if no match was found.""" return _compile(pattern, flags, kwargs).search(string, pos, endpos, concurrent) def sub(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).sub(repl, string, count, pos, endpos, concurrent) def subf(pattern, format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement format. format can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).subf(format, string, count, pos, endpos, concurrent) def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the replacement repl. number is the number of substitutions that were made. repl can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).subn(repl, string, count, pos, endpos, concurrent) def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the replacement format. number is the number of substitutions that were made. format can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags, kwargs).subfn(format, string, count, pos, endpos, concurrent) def split(pattern, string, maxsplit=0, flags=0, concurrent=None, **kwargs): """Split the source string by the occurrences of the pattern, returning a list containing the resulting substrings. If capturing parentheses are used in pattern, then the text of all groups in the pattern are also returned as part of the resulting list. If maxsplit is nonzero, at most maxsplit splits occur, and the remainder of the string is returned as the final element of the list.""" return _compile(pattern, flags, kwargs).split(string, maxsplit, concurrent) def splititer(pattern, string, maxsplit=0, flags=0, concurrent=None, **kwargs): "Return an iterator yielding the parts of a split string." return _compile(pattern, flags, kwargs).splititer(string, maxsplit, concurrent) def findall(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, concurrent=None, **kwargs): """Return a list of all matches in the string. The matches may be overlapped if overlapped is True. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.""" return _compile(pattern, flags, kwargs).findall(string, pos, endpos, overlapped, concurrent) def finditer(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, concurrent=None, **kwargs): """Return an iterator over all matches in the string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a match object. Empty matches are included in the result.""" return _compile(pattern, flags, kwargs).finditer(string, pos, endpos, overlapped, concurrent) def compile(pattern, flags=0, **kwargs): "Compile a regular expression pattern, returning a pattern object." return _compile(pattern, flags, kwargs) def purge(): "Clear the regular expression cache" _cache.clear() def template(pattern, flags=0): "Compile a template pattern, returning a pattern object." return _compile(pattern, flags | TEMPLATE) def escape(pattern, special_only=False): "Escape all non-alphanumeric characters or special characters in pattern." if isinstance(pattern, str): s = [] if special_only: for c in pattern: if c in _METACHARS: s.append("\\") s.append(c) elif c == "\x00": s.append("\\000") else: s.append(c) else: for c in pattern: if c in _ALNUM: s.append(c) elif c == "\x00": s.append("\\000") else: s.append("\\") s.append(c) return "".join(s) else: s = [] if special_only: for c in pattern: if chr(c) in _METACHARS: s.extend(b"\\") s.append(c) elif c == 0: s.extend(b"\\000") else: s.append(c) else: for c in pattern: if chr(c) in _ALNUM: s.append(c) elif c == 0: s.extend(b"\\000") else: s.extend(b"\\") s.append(c) return bytes(s) # -------------------------------------------------------------------- # Internals. import _regex_core import _regex from threading import RLock as _RLock from _regex_core import * from _regex_core import (_ALL_VERSIONS, _ALL_ENCODINGS, _FirstSetError, _UnscopedFlagSet, _check_group_features, _compile_firstset, _compile_replacement, _flatten_code, _fold_case, _get_required_string, _parse_pattern, _shrink_cache) from _regex_core import (ALNUM as _ALNUM, Info as _Info, OP as _OP, Source as _Source, Fuzzy as _Fuzzy) # Version 0 is the old behaviour, compatible with the original 're' module. # Version 1 is the new behaviour, which differs slightly. DEFAULT_VERSION = VERSION0 _METACHARS = frozenset("()[]{}?*+|^$\\.") _regex_core.DEFAULT_VERSION = DEFAULT_VERSION # Caches for the patterns and replacements. _cache = {} _cache_lock = _RLock() _named_args = {} _replacement_cache = {} # Maximum size of the cache. _MAXCACHE = 500 _MAXREPCACHE = 500 def _compile(pattern, flags=0, kwargs={}): "Compiles a regular expression to a PatternObject." try: # Do we know what keyword arguments are needed? args_key = pattern, type(pattern), flags args_needed = _named_args[args_key] # Are we being provided with its required keyword arguments? args_supplied = set() if args_needed: for k, v in args_needed: try: args_supplied.add((k, frozenset(kwargs[k]))) except KeyError: raise error("missing named list") args_supplied = frozenset(args_supplied) # Have we already seen this regular expression and named list? pattern_key = (pattern, type(pattern), flags, args_supplied, DEFAULT_VERSION) return _cache[pattern_key] except KeyError: # It's a new pattern, or new named list for a known pattern. pass # Guess the encoding from the class of the pattern string. if isinstance(pattern, str): guess_encoding = UNICODE elif isinstance(pattern, bytes): guess_encoding = ASCII elif isinstance(pattern, _pattern_type): if flags: raise ValueError("can't process flags argument with a compiled pattern") return pattern else: raise TypeError("first argument must be a string or compiled pattern") # Set the default version in the core code in case it has been changed. _regex_core.DEFAULT_VERSION = DEFAULT_VERSION caught_exception = None while True: try: source = _Source(pattern) info = _Info(flags, source.char_type, kwargs) info.guess_encoding = guess_encoding source.ignore_space = bool(info.flags & VERBOSE) parsed = _parse_pattern(source, info) break except _UnscopedFlagSet: # Remember the global flags for the next attempt. flags = info.global_flags except error as e: caught_exception = e if caught_exception: raise error(str(caught_exception)) if not source.at_end(): raise error("trailing characters in pattern at position {}".format(source.pos)) # Check the global flags for conflicts. version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version not in (0, VERSION0, VERSION1): raise ValueError("VERSION0 and VERSION1 flags are mutually incompatible") if (info.flags & _ALL_ENCODINGS) not in (0, ASCII, LOCALE, UNICODE): raise ValueError("ASCII, LOCALE and UNICODE flags are mutually incompatible") if isinstance(pattern, bytes) and (info.flags & UNICODE): raise ValueError("can't use UNICODE flag with a bytes pattern") if not (info.flags & _ALL_ENCODINGS): if isinstance(pattern, str): info.flags |= UNICODE else: info.flags |= ASCII reverse = bool(info.flags & REVERSE) fuzzy = isinstance(parsed, _Fuzzy) # Should we print the parsed pattern? if flags & DEBUG: parsed.dump(indent=0, reverse=reverse) # Fix the group references. parsed.fix_groups(reverse, False) # Optimise the parsed pattern. parsed = parsed.optimise(info) parsed = parsed.pack_characters(info) # Get the required string. req_offset, req_chars, req_flags = _get_required_string(parsed, info.flags) # Build the named lists. named_lists = {} named_list_indexes = [None] * len(info.named_lists_used) args_needed = set() for key, index in info.named_lists_used.items(): name, case_flags = key values = frozenset(kwargs[name]) if case_flags: items = frozenset(_fold_case(info, v) for v in values) else: items = values named_lists[name] = values named_list_indexes[index] = items args_needed.add((name, values)) # Check the features of the groups. _check_group_features(info, parsed) # Compile the parsed pattern. The result is a list of tuples. code = parsed.compile(reverse) # Is there a group call to the pattern as a whole? key = (0, reverse, fuzzy) ref = info.call_refs.get(key) if ref is not None: code = [(_OP.CALL_REF, ref)] + code + [(_OP.END, )] # Add the final 'success' opcode. code += [(_OP.SUCCESS, )] # Compile the additional copies of the groups that we need. for group, rev, fuz in info.additional_groups: code += group.compile(rev, fuz) # Flatten the code into a list of ints. code = _flatten_code(code) if not parsed.has_simple_start(): # Get the first set, if possible. try: fs_code = _compile_firstset(info, parsed.get_firstset(reverse)) fs_code = _flatten_code(fs_code) code = fs_code + code except _FirstSetError: pass # The named capture groups. index_group = dict((v, n) for n, v in info.group_index.items()) # Create the PatternObject. # # Local flags like IGNORECASE affect the code generation, but aren't needed # by the PatternObject itself. Conversely, global flags like LOCALE _don't_ # affect the code generation but _are_ needed by the PatternObject. compiled_pattern = _regex.compile(pattern, info.flags | version, code, info.group_index, index_group, named_lists, named_list_indexes, req_offset, req_chars, req_flags, info.group_count) # Do we need to reduce the size of the cache? if len(_cache) >= _MAXCACHE: with _cache_lock: _shrink_cache(_cache, _named_args, _MAXCACHE) args_needed = frozenset(args_needed) # Store this regular expression and named list. pattern_key = (pattern, type(pattern), flags, args_needed, DEFAULT_VERSION) _cache[pattern_key] = compiled_pattern # Store what keyword arguments are needed. _named_args[args_key] = args_needed return compiled_pattern def _compile_replacement_helper(pattern, template): "Compiles a replacement template." # This function is called by the _regex module. # Have we seen this before? key = pattern.pattern, pattern.flags, template compiled = _replacement_cache.get(key) if compiled is not None: return compiled if len(_replacement_cache) >= _MAXREPCACHE: _replacement_cache.clear() is_unicode = isinstance(template, str) source = _Source(template) if is_unicode: def make_string(char_codes): return "".join(chr(c) for c in char_codes) else: def make_string(char_codes): return bytes(char_codes) compiled = [] literal = [] while True: ch = source.get() if not ch: break if ch == "\\": # '_compile_replacement' will return either an int group reference # or a string literal. It returns items (plural) in order to handle # a 2-character literal (an invalid escape sequence). is_group, items = _compile_replacement(source, pattern, is_unicode) if is_group: # It's a group, so first flush the literal. if literal: compiled.append(make_string(literal)) literal = [] compiled.extend(items) else: literal.extend(items) else: literal.append(ord(ch)) # Flush the literal. if literal: compiled.append(make_string(literal)) _replacement_cache[key] = compiled return compiled # We define _pattern_type here after all the support objects have been defined. _pattern_type = type(_compile("", 0, {})) # We'll define an alias for the 'compile' function so that the repr of a # pattern object is eval-able. Regex = compile # Register myself for pickling. import copyreg as _copy_reg def _pickle(p): return _compile, (p.pattern, p.flags) _copy_reg.pickle(_pattern_type, _pickle, _compile) regex-2014.02.16/Python3/test_regex.py0000666000000000000000000045453712300213377015462 0ustar 00000000000000import regex import string from weakref import proxy import unittest import copy from test.support import run_unittest import sys # String subclasses for issue 18468. class StrSubclass(str): def __getitem__(self, index): return StrSubclass(super().__getitem__(index)) class BytesSubclass(bytes): def __getitem__(self, index): return BytesSubclass(super().__getitem__(index)) class RegexTests(unittest.TestCase): PATTERN_CLASS = "" FLAGS_WITH_COMPILED_PAT = "can't process flags argument with a compiled pattern" INVALID_GROUP_REF = "invalid group reference" MISSING_GT = "missing >" BAD_GROUP_NAME = "bad group name" MISSING_LT = "missing <" UNKNOWN_GROUP_I = "unknown group" UNKNOWN_GROUP = "unknown group" BAD_ESCAPE = "bad escape" BAD_OCTAL_ESCAPE = "bad octal escape" BAD_SET = "bad set" STR_PAT_ON_BYTES = "can't use a string pattern on a bytes-like object" BYTES_PAT_ON_STR = "can't use a bytes pattern on a string-like object" STR_PAT_BYTES_TEMPL = "expected str instance, bytes found" BYTES_PAT_STR_TEMPL = "expected bytes instance, str found" BYTES_PAT_UNI_FLAG = "can't use UNICODE flag with a bytes pattern" MIXED_FLAGS = "ASCII, LOCALE and UNICODE flags are mutually incompatible" MISSING_RPAREN = "missing \\)" # Need to escape parenthesis for unittest. TRAILING_CHARS = "trailing characters in pattern" BAD_CHAR_RANGE = "bad character range" NOTHING_TO_REPEAT = "nothing to repeat" OPEN_GROUP = "can't refer to an open group" DUPLICATE_GROUP = "duplicate group" CANT_TURN_OFF = "bad inline flags: can't turn flags off" UNDEF_CHAR_NAME = "undefined character name" def assertTypedEqual(self, actual, expect, msg=None): self.assertEqual(actual, expect, msg) def recurse(actual, expect): if isinstance(expect, (tuple, list)): for x, y in zip(actual, expect): recurse(x, y) else: self.assertIs(type(actual), type(expect), msg) recurse(actual, expect) def test_weakref(self): s = 'QabbbcR' x = regex.compile('ab+c') y = proxy(x) if x.findall('QabbbcR') != y.findall('QabbbcR'): self.fail() def test_search_star_plus(self): self.assertEqual(regex.search('a*', 'xxx').span(0), (0, 0)) self.assertEqual(regex.search('x*', 'axx').span(), (0, 0)) self.assertEqual(regex.search('x+', 'axx').span(0), (1, 3)) self.assertEqual(regex.search('x+', 'axx').span(), (1, 3)) self.assertEqual(regex.search('x', 'aaa'), None) self.assertEqual(regex.match('a*', 'xxx').span(0), (0, 0)) self.assertEqual(regex.match('a*', 'xxx').span(), (0, 0)) self.assertEqual(regex.match('x*', 'xxxa').span(0), (0, 3)) self.assertEqual(regex.match('x*', 'xxxa').span(), (0, 3)) self.assertEqual(regex.match('a+', 'xxx'), None) def bump_num(self, matchobj): int_value = int(matchobj[0]) return str(int_value + 1) def test_basic_regex_sub(self): self.assertEqual(regex.sub("(?i)b+", "x", "bbbb BBBB"), 'x x') self.assertEqual(regex.sub(r'\d+', self.bump_num, '08.2 -2 23x99y'), '9.3 -3 24x100y') self.assertEqual(regex.sub(r'\d+', self.bump_num, '08.2 -2 23x99y', 3), '9.3 -3 23x99y') self.assertEqual(regex.sub('.', lambda m: r"\n", 'x'), "\\n") self.assertEqual(regex.sub('.', r"\n", 'x'), "\n") self.assertEqual(regex.sub('(?Px)', r'\g\g', 'xx'), 'xxxx') self.assertEqual(regex.sub('(?Px)', r'\g\g<1>', 'xx'), 'xxxx') self.assertEqual(regex.sub('(?Px)', r'\g\g', 'xx'), 'xxxx') self.assertEqual(regex.sub('(?Px)', r'\g<1>\g<1>', 'xx'), 'xxxx') self.assertEqual(regex.sub('a', r'\t\n\v\r\f\a\b\B\Z\a\A\w\W\s\S\d\D', 'a'), "\t\n\v\r\f\a\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D") self.assertEqual(regex.sub('a', '\t\n\v\r\f\a', 'a'), "\t\n\v\r\f\a") self.assertEqual(regex.sub('a', '\t\n\v\r\f\a', 'a'), chr(9) + chr(10) + chr(11) + chr(13) + chr(12) + chr(7)) self.assertEqual(regex.sub(r'^\s*', 'X', 'test'), 'Xtest') self.assertEqual(regex.sub(r"x", r"\x0A", "x"), "\n") self.assertEqual(regex.sub(r"x", r"\u000A", "x"), "\n") self.assertEqual(regex.sub(r"x", r"\U0000000A", "x"), "\n") self.assertEqual(regex.sub(r"x", r"\N{LATIN CAPITAL LETTER A}", "x"), "A") self.assertEqual(regex.sub(br"x", br"\x0A", b"x"), b"\n") self.assertEqual(regex.sub(br"x", br"\u000A", b"x"), b"\\u000A") self.assertEqual(regex.sub(br"x", br"\U0000000A", b"x"), b"\\U0000000A") self.assertEqual(regex.sub(br"x", br"\N{LATIN CAPITAL LETTER A}", b"x"), b"\\N{LATIN CAPITAL LETTER A}") def test_bug_449964(self): # Fails for group followed by other escape. self.assertEqual(regex.sub(r'(?Px)', r'\g<1>\g<1>\b', 'xx'), "xx\bxx\b") def test_bug_449000(self): # Test for sub() on escaped characters. self.assertEqual(regex.sub(r'\r\n', r'\n', 'abc\r\ndef\r\n'), "abc\ndef\n") self.assertEqual(regex.sub('\r\n', r'\n', 'abc\r\ndef\r\n'), "abc\ndef\n") self.assertEqual(regex.sub(r'\r\n', '\n', 'abc\r\ndef\r\n'), "abc\ndef\n") self.assertEqual(regex.sub('\r\n', '\n', 'abc\r\ndef\r\n'), "abc\ndef\n") def test_bug_1661(self): # Verify that flags do not get silently ignored with compiled patterns pattern = regex.compile('.') self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.match(pattern, 'A', regex.I)) self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.search(pattern, 'A', regex.I)) self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.findall(pattern, 'A', regex.I)) self.assertRaisesRegex(ValueError, self.FLAGS_WITH_COMPILED_PAT, lambda: regex.compile(pattern, regex.I)) def test_bug_3629(self): # A regex that triggered a bug in the sre-code validator self.assertEqual(repr(type(regex.compile("(?P)(?(quote))"))), self.PATTERN_CLASS) def test_sub_template_numeric_escape(self): # Bug 776311 and friends. self.assertEqual(regex.sub('x', r'\0', 'x'), "\0") self.assertEqual(regex.sub('x', r'\000', 'x'), "\000") self.assertEqual(regex.sub('x', r'\001', 'x'), "\001") self.assertEqual(regex.sub('x', r'\008', 'x'), "\0" + "8") self.assertEqual(regex.sub('x', r'\009', 'x'), "\0" + "9") self.assertEqual(regex.sub('x', r'\111', 'x'), "\111") self.assertEqual(regex.sub('x', r'\117', 'x'), "\117") self.assertEqual(regex.sub('x', r'\1111', 'x'), "\1111") self.assertEqual(regex.sub('x', r'\1111', 'x'), "\111" + "1") self.assertEqual(regex.sub('x', r'\00', 'x'), '\x00') self.assertEqual(regex.sub('x', r'\07', 'x'), '\x07') self.assertEqual(regex.sub('x', r'\08', 'x'), "\0" + "8") self.assertEqual(regex.sub('x', r'\09', 'x'), "\0" + "9") self.assertEqual(regex.sub('x', r'\0a', 'x'), "\0" + "a") self.assertEqual(regex.sub('x', r'\400', 'x'), "\u0100") self.assertEqual(regex.sub('x', r'\777', 'x'), "\u01FF") self.assertEqual(regex.sub(b'x', br'\400', b'x'), b"\x00") self.assertEqual(regex.sub(b'x', br'\777', b'x'), b"\xFF") self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\1', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\8', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\9', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\11', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\18', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\1a', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\90', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\99', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\118', 'x')) # r'\11' + '8' self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\11a', 'x')) self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\181', 'x')) # r'\18' + '1' self.assertRaisesRegex(regex.error, self.INVALID_GROUP_REF, lambda: regex.sub('x', r'\800', 'x')) # r'\80' + '0' # In Python 2.3 (etc), these loop endlessly in sre_parser.py. self.assertEqual(regex.sub('(((((((((((x)))))))))))', r'\11', 'x'), 'x') self.assertEqual(regex.sub('((((((((((y))))))))))(.)', r'\118', 'xyz'), 'xz8') self.assertEqual(regex.sub('((((((((((y))))))))))(.)', r'\11a', 'xyz'), 'xza') def test_qualified_re_sub(self): self.assertEqual(regex.sub('a', 'b', 'aaaaa'), 'bbbbb') self.assertEqual(regex.sub('a', 'b', 'aaaaa', 1), 'baaaa') def test_bug_114660(self): self.assertEqual(regex.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there'), 'hello there') def test_bug_462270(self): # Test for empty sub() behaviour, see SF bug #462270 self.assertEqual(regex.sub('(?V0)x*', '-', 'abxd'), '-a-b-d-') self.assertEqual(regex.sub('(?V1)x*', '-', 'abxd'), '-a-b--d-') self.assertEqual(regex.sub('x+', '-', 'abxd'), 'ab-d') def test_bug_14462(self): # chr(255) is a valid identifier in Python 3. group_name = '\xFF' self.assertEqual(regex.search(r'(?P<' + group_name + '>a)', 'abc').group(group_name), 'a') def test_symbolic_refs(self): self.assertRaisesRegex(regex.error, self.MISSING_GT, lambda: regex.sub('(?Px)', r'\gx)', r'\g<', 'xx')) self.assertRaisesRegex(regex.error, self.MISSING_LT, lambda: regex.sub('(?Px)', r'\g', 'xx')) self.assertRaisesRegex(regex.error, self.BAD_GROUP_NAME, lambda: regex.sub('(?Px)', r'\g', 'xx')) self.assertRaisesRegex(regex.error, self.BAD_GROUP_NAME, lambda: regex.sub('(?Px)', r'\g<1a1>', 'xx')) self.assertRaisesRegex(IndexError, self.UNKNOWN_GROUP_I, lambda: regex.sub('(?Px)', r'\g', 'xx')) # The new behaviour of unmatched but valid groups is to treat them like # empty matches in the replacement template, like in Perl. self.assertEqual(regex.sub('(?Px)|(?Py)', r'\g', 'xx'), '') self.assertEqual(regex.sub('(?Px)|(?Py)', r'\2', 'xx'), '') # The old behaviour was to raise it as an IndexError. self.assertRaisesRegex(regex.error, self.BAD_GROUP_NAME, lambda: regex.sub('(?Px)', r'\g<-1>', 'xx')) def test_re_subn(self): self.assertEqual(regex.subn("(?i)b+", "x", "bbbb BBBB"), ('x x', 2)) self.assertEqual(regex.subn("b+", "x", "bbbb BBBB"), ('x BBBB', 1)) self.assertEqual(regex.subn("b+", "x", "xyz"), ('xyz', 0)) self.assertEqual(regex.subn("b*", "x", "xyz"), ('xxxyxzx', 4)) self.assertEqual(regex.subn("b*", "x", "xyz", 2), ('xxxyz', 2)) def test_re_split(self): self.assertEqual(regex.split(":", ":a:b::c"), ['', 'a', 'b', '', 'c']) self.assertEqual(regex.split(":*", ":a:b::c"), ['', 'a', 'b', 'c']) self.assertEqual(regex.split("(:*)", ":a:b::c"), ['', ':', 'a', ':', 'b', '::', 'c']) self.assertEqual(regex.split("(?::*)", ":a:b::c"), ['', 'a', 'b', 'c']) self.assertEqual(regex.split("(:)*", ":a:b::c"), ['', ':', 'a', ':', 'b', ':', 'c']) self.assertEqual(regex.split("([b:]+)", ":a:b::c"), ['', ':', 'a', ':b::', 'c']) self.assertEqual(regex.split("(b)|(:+)", ":a:b::c"), ['', None, ':', 'a', None, ':', '', 'b', None, '', None, '::', 'c']) self.assertEqual(regex.split("(?:b)|(?::+)", ":a:b::c"), ['', 'a', '', '', 'c']) self.assertEqual(regex.split("x", "xaxbxc"), ['', 'a', 'b', 'c']) self.assertEqual([m for m in regex.splititer("x", "xaxbxc")], ['', 'a', 'b', 'c']) self.assertEqual(regex.split("(?r)x", "xaxbxc"), ['c', 'b', 'a', '']) self.assertEqual([m for m in regex.splititer("(?r)x", "xaxbxc")], ['c', 'b', 'a', '']) self.assertEqual(regex.split("(x)|(y)", "xaxbxc"), ['', 'x', None, 'a', 'x', None, 'b', 'x', None, 'c']) self.assertEqual([m for m in regex.splititer("(x)|(y)", "xaxbxc")], ['', 'x', None, 'a', 'x', None, 'b', 'x', None, 'c']) self.assertEqual(regex.split("(?r)(x)|(y)", "xaxbxc"), ['c', 'x', None, 'b', 'x', None, 'a', 'x', None, '']) self.assertEqual([m for m in regex.splititer("(?r)(x)|(y)", "xaxbxc")], ['c', 'x', None, 'b', 'x', None, 'a', 'x', None, '']) self.assertEqual(regex.split(r"(?V1)\b", "a b c"), ['', 'a', ' ', 'b', ' ', 'c', '']) self.assertEqual(regex.split(r"(?V1)\m", "a b c"), ['', 'a ', 'b ', 'c']) self.assertEqual(regex.split(r"(?V1)\M", "a b c"), ['a', ' b', ' c', '']) def test_qualified_re_split(self): self.assertEqual(regex.split(":", ":a:b::c", 2), ['', 'a', 'b::c']) self.assertEqual(regex.split(':', 'a:b:c:d', 2), ['a', 'b', 'c:d']) self.assertEqual(regex.split("(:)", ":a:b::c", 2), ['', ':', 'a', ':', 'b::c']) self.assertEqual(regex.split("(:*)", ":a:b::c", 2), ['', ':', 'a', ':', 'b::c']) def test_re_findall(self): self.assertEqual(regex.findall(":+", "abc"), []) self.assertEqual(regex.findall(":+", "a:b::c:::d"), [':', '::', ':::']) self.assertEqual(regex.findall("(:+)", "a:b::c:::d"), [':', '::', ':::']) self.assertEqual(regex.findall("(:)(:*)", "a:b::c:::d"), [(':', ''), (':', ':'), (':', '::')]) self.assertEqual(regex.findall(r"\((?P.{0,5}?TEST)\)", "(MY TEST)"), ["MY TEST"]) self.assertEqual(regex.findall(r"\((?P.{0,3}?TEST)\)", "(MY TEST)"), ["MY TEST"]) self.assertEqual(regex.findall(r"\((?P.{0,3}?T)\)", "(MY T)"), ["MY T"]) self.assertEqual(regex.findall(r"[^a]{2}[A-Z]", "\n S"), [' S']) self.assertEqual(regex.findall(r"[^a]{2,3}[A-Z]", "\n S"), ['\n S']) self.assertEqual(regex.findall(r"[^a]{2,3}[A-Z]", "\n S"), [' S']) self.assertEqual(regex.findall(r"X(Y[^Y]+?){1,2}( |Q)+DEF", "XYABCYPPQ\nQ DEF"), [('YPPQ\n', ' ')]) self.assertEqual(regex.findall(r"(\nTest(\n+.+?){0,2}?)?\n+End", "\nTest\nxyz\nxyz\nEnd"), [('\nTest\nxyz\nxyz', '\nxyz')]) def test_bug_117612(self): self.assertEqual(regex.findall(r"(a|(b))", "aba"), [('a', ''), ('b', 'b'), ('a', '')]) def test_re_match(self): self.assertEqual(regex.match('a', 'a')[:], ('a',)) self.assertEqual(regex.match('(a)', 'a')[:], ('a', 'a')) self.assertEqual(regex.match(r'(a)', 'a')[0], 'a') self.assertEqual(regex.match(r'(a)', 'a')[1], 'a') self.assertEqual(regex.match(r'(a)', 'a').group(1, 1), ('a', 'a')) pat = regex.compile('((a)|(b))(c)?') self.assertEqual(pat.match('a')[:], ('a', 'a', 'a', None, None)) self.assertEqual(pat.match('b')[:], ('b', 'b', None, 'b', None)) self.assertEqual(pat.match('ac')[:], ('ac', 'a', 'a', None, 'c')) self.assertEqual(pat.match('bc')[:], ('bc', 'b', None, 'b', 'c')) self.assertEqual(pat.match('bc')[:], ('bc', 'b', None, 'b', 'c')) # A single group. m = regex.match('(a)', 'a') self.assertEqual(m.group(), 'a') self.assertEqual(m.group(0), 'a') self.assertEqual(m.group(1), 'a') self.assertEqual(m.group(1, 1), ('a', 'a')) pat = regex.compile('(?:(?Pa)|(?Pb))(?Pc)?') self.assertEqual(pat.match('a').group(1, 2, 3), ('a', None, None)) self.assertEqual(pat.match('b').group('a1', 'b2', 'c3'), (None, 'b', None)) self.assertEqual(pat.match('ac').group(1, 'b2', 3), ('a', None, 'c')) def test_re_groupref_exists(self): self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', '(a)')[:], ('(a)', '(', 'a')) self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', 'a')[:], ('a', None, 'a')) self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', 'a)'), None) self.assertEqual(regex.match(r'^(\()?([^()]+)(?(1)\))$', '(a'), None) self.assertEqual(regex.match('^(?:(a)|c)((?(1)b|d))$', 'ab')[:], ('ab', 'a', 'b')) self.assertEqual(regex.match('^(?:(a)|c)((?(1)b|d))$', 'cd')[:], ('cd', None, 'd')) self.assertEqual(regex.match('^(?:(a)|c)((?(1)|d))$', 'cd')[:], ('cd', None, 'd')) self.assertEqual(regex.match('^(?:(a)|c)((?(1)|d))$', 'a')[:], ('a', 'a', '')) # Tests for bug #1177831: exercise groups other than the first group. p = regex.compile('(?Pa)(?Pb)?((?(g2)c|d))') self.assertEqual(p.match('abc')[:], ('abc', 'a', 'b', 'c')) self.assertEqual(p.match('ad')[:], ('ad', 'a', None, 'd')) self.assertEqual(p.match('abd'), None) self.assertEqual(p.match('ac'), None) def test_re_groupref(self): self.assertEqual(regex.match(r'^(\|)?([^()]+)\1$', '|a|')[:], ('|a|', '|', 'a')) self.assertEqual(regex.match(r'^(\|)?([^()]+)\1?$', 'a')[:], ('a', None, 'a')) self.assertEqual(regex.match(r'^(\|)?([^()]+)\1$', 'a|'), None) self.assertEqual(regex.match(r'^(\|)?([^()]+)\1$', '|a'), None) self.assertEqual(regex.match(r'^(?:(a)|c)(\1)$', 'aa')[:], ('aa', 'a', 'a')) self.assertEqual(regex.match(r'^(?:(a)|c)(\1)?$', 'c')[:], ('c', None, None)) self.assertEqual(regex.findall("(?i)(.{1,40}?),(.{1,40}?)(?:;)+(.{1,80}).{1,40}?\\3(\ |;)+(.{1,80}?)\\1", "TEST, BEST; LEST ; Lest 123 Test, Best"), [('TEST', ' BEST', ' LEST', ' ', '123 ')]) def test_groupdict(self): self.assertEqual(regex.match('(?Pfirst) (?Psecond)', 'first second').groupdict(), {'first': 'first', 'second': 'second'}) def test_expand(self): self.assertEqual(regex.match("(?Pfirst) (?Psecond)", "first second").expand(r"\2 \1 \g \g"), 'second first second first') def test_repeat_minmax(self): self.assertEqual(regex.match(r"^(\w){1}$", "abc"), None) self.assertEqual(regex.match(r"^(\w){1}?$", "abc"), None) self.assertEqual(regex.match(r"^(\w){1,2}$", "abc"), None) self.assertEqual(regex.match(r"^(\w){1,2}?$", "abc"), None) self.assertEqual(regex.match(r"^(\w){3}$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,3}$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,4}$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){3,4}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){3}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,3}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){1,4}?$", "abc")[1], 'c') self.assertEqual(regex.match(r"^(\w){3,4}?$", "abc")[1], 'c') self.assertEqual(regex.match("^x{1}$", "xxx"), None) self.assertEqual(regex.match("^x{1}?$", "xxx"), None) self.assertEqual(regex.match("^x{1,2}$", "xxx"), None) self.assertEqual(regex.match("^x{1,2}?$", "xxx"), None) self.assertEqual(regex.match("^x{1}", "xxx")[0], 'x') self.assertEqual(regex.match("^x{1}?", "xxx")[0], 'x') self.assertEqual(regex.match("^x{0,1}", "xxx")[0], 'x') self.assertEqual(regex.match("^x{0,1}?", "xxx")[0], '') self.assertEqual(bool(regex.match("^x{3}$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,3}$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,4}$", "xxx")), True) self.assertEqual(bool(regex.match("^x{3,4}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{3}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,3}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{1,4}?$", "xxx")), True) self.assertEqual(bool(regex.match("^x{3,4}?$", "xxx")), True) self.assertEqual(regex.match("^x{}$", "xxx"), None) self.assertEqual(bool(regex.match("^x{}$", "x{}")), True) def test_getattr(self): self.assertEqual(regex.compile("(?i)(a)(b)").pattern, '(?i)(a)(b)') self.assertEqual(regex.compile("(?i)(a)(b)").flags, regex.I | regex.U | regex.DEFAULT_VERSION) self.assertEqual(regex.compile(b"(?i)(a)(b)").flags, regex.A | regex.I | regex.DEFAULT_VERSION) self.assertEqual(regex.compile("(?i)(a)(b)").groups, 2) self.assertEqual(regex.compile("(?i)(a)(b)").groupindex, {}) self.assertEqual(regex.compile("(?i)(?Pa)(?Pb)").groupindex, {'first': 1, 'other': 2}) self.assertEqual(regex.match("(a)", "a").pos, 0) self.assertEqual(regex.match("(a)", "a").endpos, 1) self.assertEqual(regex.search("b(c)", "abcdef").pos, 0) self.assertEqual(regex.search("b(c)", "abcdef").endpos, 6) self.assertEqual(regex.search("b(c)", "abcdef").span(), (1, 3)) self.assertEqual(regex.search("b(c)", "abcdef").span(1), (2, 3)) self.assertEqual(regex.match("(a)", "a").string, 'a') self.assertEqual(regex.match("(a)", "a").regs, ((0, 1), (0, 1))) self.assertEqual(repr(type(regex.match("(a)", "a").re)), self.PATTERN_CLASS) # Issue 14260. p = regex.compile(r'abc(?Pdef)') p.groupindex["n"] = 0 self.assertEqual(p.groupindex["n"], 1) def test_special_escapes(self): self.assertEqual(regex.search(r"\b(b.)\b", "abcd abc bcd bx")[1], 'bx') self.assertEqual(regex.search(r"\B(b.)\B", "abc bcd bc abxd")[1], 'bx') self.assertEqual(regex.search(br"\b(b.)\b", b"abcd abc bcd bx", regex.LOCALE)[1], b'bx') self.assertEqual(regex.search(br"\B(b.)\B", b"abc bcd bc abxd", regex.LOCALE)[1], b'bx') self.assertEqual(regex.search(r"\b(b.)\b", "abcd abc bcd bx", regex.UNICODE)[1], 'bx') self.assertEqual(regex.search(r"\B(b.)\B", "abc bcd bc abxd", regex.UNICODE)[1], 'bx') self.assertEqual(regex.search(r"^abc$", "\nabc\n", regex.M)[0], 'abc') self.assertEqual(regex.search(r"^\Aabc\Z$", "abc", regex.M)[0], 'abc') self.assertEqual(regex.search(r"^\Aabc\Z$", "\nabc\n", regex.M), None) self.assertEqual(regex.search(br"\b(b.)\b", b"abcd abc bcd bx")[1], b'bx') self.assertEqual(regex.search(br"\B(b.)\B", b"abc bcd bc abxd")[1], b'bx') self.assertEqual(regex.search(br"^abc$", b"\nabc\n", regex.M)[0], b'abc') self.assertEqual(regex.search(br"^\Aabc\Z$", b"abc", regex.M)[0], b'abc') self.assertEqual(regex.search(br"^\Aabc\Z$", b"\nabc\n", regex.M), None) self.assertEqual(regex.search(r"\d\D\w\W\s\S", "1aa! a")[0], '1aa! a') self.assertEqual(regex.search(br"\d\D\w\W\s\S", b"1aa! a", regex.LOCALE)[0], b'1aa! a') self.assertEqual(regex.search(r"\d\D\w\W\s\S", "1aa! a", regex.UNICODE)[0], '1aa! a') def test_bigcharset(self): self.assertEqual(regex.match(r"([\u2222\u2223])", "\u2222")[1], '\u2222') self.assertEqual(regex.match(r"([\u2222\u2223])", "\u2222", regex.UNICODE)[1], '\u2222') self.assertEqual("".join(regex.findall(".", "e\xe8\xe9\xea\xeb\u0113\u011b\u0117", flags=regex.UNICODE)), 'e\xe8\xe9\xea\xeb\u0113\u011b\u0117') self.assertEqual("".join(regex.findall(r"[e\xe8\xe9\xea\xeb\u0113\u011b\u0117]", "e\xe8\xe9\xea\xeb\u0113\u011b\u0117", flags=regex.UNICODE)), 'e\xe8\xe9\xea\xeb\u0113\u011b\u0117') self.assertEqual("".join(regex.findall(r"e|\xe8|\xe9|\xea|\xeb|\u0113|\u011b|\u0117", "e\xe8\xe9\xea\xeb\u0113\u011b\u0117", flags=regex.UNICODE)), 'e\xe8\xe9\xea\xeb\u0113\u011b\u0117') def test_anyall(self): self.assertEqual(regex.match("a.b", "a\nb", regex.DOTALL)[0], "a\nb") self.assertEqual(regex.match("a.*b", "a\n\nb", regex.DOTALL)[0], "a\n\nb") def test_non_consuming(self): self.assertEqual(regex.match(r"(a(?=\s[^a]))", "a b")[1], 'a') self.assertEqual(regex.match(r"(a(?=\s[^a]*))", "a b")[1], 'a') self.assertEqual(regex.match(r"(a(?=\s[abc]))", "a b")[1], 'a') self.assertEqual(regex.match(r"(a(?=\s[abc]*))", "a bc")[1], 'a') self.assertEqual(regex.match(r"(a)(?=\s\1)", "a a")[1], 'a') self.assertEqual(regex.match(r"(a)(?=\s\1*)", "a aa")[1], 'a') self.assertEqual(regex.match(r"(a)(?=\s(abc|a))", "a a")[1], 'a') self.assertEqual(regex.match(r"(a(?!\s[^a]))", "a a")[1], 'a') self.assertEqual(regex.match(r"(a(?!\s[abc]))", "a d")[1], 'a') self.assertEqual(regex.match(r"(a)(?!\s\1)", "a b")[1], 'a') self.assertEqual(regex.match(r"(a)(?!\s(abc|a))", "a b")[1], 'a') def test_ignore_case(self): self.assertEqual(regex.match("abc", "ABC", regex.I)[0], 'ABC') self.assertEqual(regex.match(b"abc", b"ABC", regex.I)[0], b'ABC') self.assertEqual(regex.match(r"(a\s[^a]*)", "a bb", regex.I)[1], 'a bb') self.assertEqual(regex.match(r"(a\s[abc])", "a b", regex.I)[1], 'a b') self.assertEqual(regex.match(r"(a\s[abc]*)", "a bb", regex.I)[1], 'a bb') self.assertEqual(regex.match(r"((a)\s\2)", "a a", regex.I)[1], 'a a') self.assertEqual(regex.match(r"((a)\s\2*)", "a aa", regex.I)[1], 'a aa') self.assertEqual(regex.match(r"((a)\s(abc|a))", "a a", regex.I)[1], 'a a') self.assertEqual(regex.match(r"((a)\s(abc|a)*)", "a aa", regex.I)[1], 'a aa') # Issue 3511. self.assertEqual(regex.match(r"[Z-a]", "_").span(), (0, 1)) self.assertEqual(regex.match(r"(?i)[Z-a]", "_").span(), (0, 1)) self.assertEqual(bool(regex.match(r"(?i)nao", "nAo")), True) self.assertEqual(bool(regex.match(r"(?i)n\xE3o", "n\xC3o")), True) self.assertEqual(bool(regex.match(r"(?i)n\xE3o", "N\xC3O")), True) self.assertEqual(bool(regex.match(r"(?i)s", "\u017F")), True) def test_case_folding(self): self.assertEqual(regex.search(r"(?fi)ss", "SS").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)SS", "ss").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)SS", "\N{LATIN SMALL LETTER SHARP S}").span(), (0, 1)) self.assertEqual(regex.search(r"(?fi)\N{LATIN SMALL LETTER SHARP S}", "SS").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)\N{LATIN SMALL LIGATURE ST}", "ST").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)ST", "\N{LATIN SMALL LIGATURE ST}").span(), (0, 1)) self.assertEqual(regex.search(r"(?fi)ST", "\N{LATIN SMALL LIGATURE LONG S T}").span(), (0, 1)) self.assertEqual(regex.search(r"(?fi)SST", "\N{LATIN SMALL LETTER SHARP S}t").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)SST", "s\N{LATIN SMALL LIGATURE LONG S T}").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)SST", "s\N{LATIN SMALL LIGATURE ST}").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)\N{LATIN SMALL LIGATURE ST}", "SST").span(), (1, 3)) self.assertEqual(regex.search(r"(?fi)SST", "s\N{LATIN SMALL LIGATURE ST}").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)FFI", "\N{LATIN SMALL LIGATURE FFI}").span(), (0, 1)) self.assertEqual(regex.search(r"(?fi)FFI", "\N{LATIN SMALL LIGATURE FF}i").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)FFI", "f\N{LATIN SMALL LIGATURE FI}").span(), (0, 2)) self.assertEqual(regex.search(r"(?fi)\N{LATIN SMALL LIGATURE FFI}", "FFI").span(), (0, 3)) self.assertEqual(regex.search(r"(?fi)\N{LATIN SMALL LIGATURE FF}i", "FFI").span(), (0, 3)) self.assertEqual(regex.search(r"(?fi)f\N{LATIN SMALL LIGATURE FI}", "FFI").span(), (0, 3)) sigma = "\u03A3\u03C3\u03C2" for ch1 in sigma: for ch2 in sigma: if not regex.match(r"(?fi)" + ch1, ch2): self.fail() self.assertEqual(bool(regex.search(r"(?iV1)ff", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)ff", "\uFB01\uFB00")), True) self.assertEqual(bool(regex.search(r"(?iV1)fi", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)fi", "\uFB01\uFB00")), True) self.assertEqual(bool(regex.search(r"(?iV1)fffi", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)f\uFB03", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)ff", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)fi", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)fffi", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)f\uFB03", "\uFB00\uFB01")), True) self.assertEqual(bool(regex.search(r"(?iV1)f\uFB01", "\uFB00i")), True) self.assertEqual(bool(regex.search(r"(?iV1)f\uFB01", "\uFB00i")), True) self.assertEqual(regex.findall(r"(?iV0)\m(?:word){e<=3}\M(?ne", "affine", options=["\N{LATIN SMALL LIGATURE FFI}"]).span(), (0, 6)) self.assertEqual(regex.search(r"(?fi)a\Lne", "a\N{LATIN SMALL LIGATURE FFI}ne", options=["ffi"]).span(), (0, 4)) def test_category(self): self.assertEqual(regex.match(r"(\s)", " ")[1], ' ') def test_not_literal(self): self.assertEqual(regex.search(r"\s([^a])", " b")[1], 'b') self.assertEqual(regex.search(r"\s([^a]*)", " bb")[1], 'bb') def test_search_coverage(self): self.assertEqual(regex.search(r"\s(b)", " b")[1], 'b') self.assertEqual(regex.search(r"a\s", "a ")[0], 'a ') def test_re_escape(self): p = "" self.assertEqual(regex.escape(p), p) for i in range(0, 256): p += chr(i) self.assertEqual(bool(regex.match(regex.escape(chr(i)), chr(i))), True) self.assertEqual(regex.match(regex.escape(chr(i)), chr(i)).span(), (0, 1)) pat = regex.compile(regex.escape(p)) self.assertEqual(pat.match(p).span(), (0, 256)) def test_re_escape_byte(self): p = b"" self.assertEqual(regex.escape(p), p) for i in range(0, 256): b = bytes([i]) p += b self.assertEqual(bool(regex.match(regex.escape(b), b)), True) self.assertEqual(regex.match(regex.escape(b), b).span(), (0, 1)) pat = regex.compile(regex.escape(p)) self.assertEqual(pat.match(p).span(), (0, 256)) def test_constants(self): if regex.I != regex.IGNORECASE: self.fail() if regex.L != regex.LOCALE: self.fail() if regex.M != regex.MULTILINE: self.fail() if regex.S != regex.DOTALL: self.fail() if regex.X != regex.VERBOSE: self.fail() def test_flags(self): for flag in [regex.I, regex.M, regex.X, regex.S, regex.L]: self.assertEqual(repr(type(regex.compile('^pattern$', flag))), self.PATTERN_CLASS) def test_sre_character_literals(self): for i in [0, 8, 16, 32, 64, 127, 128, 255]: self.assertEqual(bool(regex.match(r"\%03o" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"\%03o0" % i, chr(i) + "0")), True) self.assertEqual(bool(regex.match(r"\%03o8" % i, chr(i) + "8")), True) self.assertEqual(bool(regex.match(r"\x%02x" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"\x%02x0" % i, chr(i) + "0")), True) self.assertEqual(bool(regex.match(r"\x%02xz" % i, chr(i) + "z")), True) self.assertRaisesRegex(regex.error, self.UNKNOWN_GROUP, lambda: regex.match(r"\911", "")) def test_sre_character_class_literals(self): for i in [0, 8, 16, 32, 64, 127, 128, 255]: self.assertEqual(bool(regex.match(r"[\%03o]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\%03o0]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\%03o8]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\x%02x]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\x%02x0]" % i, chr(i))), True) self.assertEqual(bool(regex.match(r"[\x%02xz]" % i, chr(i))), True) self.assertRaisesRegex(regex.error, self.BAD_OCTAL_ESCAPE, lambda: regex.match(r"[\911]", "")) def test_bug_113254(self): self.assertEqual(regex.match(r'(a)|(b)', 'b').start(1), -1) self.assertEqual(regex.match(r'(a)|(b)', 'b').end(1), -1) self.assertEqual(regex.match(r'(a)|(b)', 'b').span(1), (-1, -1)) def test_bug_527371(self): # Bug described in patches 527371/672491. self.assertEqual(regex.match(r'(a)?a','a').lastindex, None) self.assertEqual(regex.match(r'(a)(b)?b','ab').lastindex, 1) self.assertEqual(regex.match(r'(?Pa)(?Pb)?b','ab').lastgroup, 'a') self.assertEqual(regex.match("(?Pa(b))", "ab").lastgroup, 'a') self.assertEqual(regex.match("((a))", "a").lastindex, 1) def test_bug_545855(self): # Bug 545855 -- This pattern failed to cause a compile error as it # should, instead provoking a TypeError. self.assertRaisesRegex(regex.error, self.BAD_SET, lambda: regex.compile('foo[a-')) def test_bug_418626(self): # Bugs 418626 at al. -- Testing Greg Chapman's addition of op code # SRE_OP_MIN_REPEAT_ONE for eliminating recursion on simple uses of # pattern '*?' on a long string. self.assertEqual(regex.match('.*?c', 10000 * 'ab' + 'cd').end(0), 20001) self.assertEqual(regex.match('.*?cd', 5000 * 'ab' + 'c' + 5000 * 'ab' + 'cde').end(0), 20003) self.assertEqual(regex.match('.*?cd', 20000 * 'abc' + 'de').end(0), 60001) # Non-simple '*?' still used to hit the recursion limit, before the # non-recursive scheme was implemented. self.assertEqual(regex.search('(a|b)*?c', 10000 * 'ab' + 'cd').end(0), 20001) def test_bug_612074(self): pat = "[" + regex.escape("\u2039") + "]" self.assertEqual(regex.compile(pat) and 1, 1) def test_stack_overflow(self): # Nasty cases that used to overflow the straightforward recursive # implementation of repeated groups. self.assertEqual(regex.match('(x)*', 50000 * 'x')[1], 'x') self.assertEqual(regex.match('(x)*y', 50000 * 'x' + 'y')[1], 'x') self.assertEqual(regex.match('(x)*?y', 50000 * 'x' + 'y')[1], 'x') def test_scanner(self): def s_ident(scanner, token): return token def s_operator(scanner, token): return "op%s" % token def s_float(scanner, token): return float(token) def s_int(scanner, token): return int(token) scanner = regex.Scanner([(r"[a-zA-Z_]\w*", s_ident), (r"\d+\.\d*", s_float), (r"\d+", s_int), (r"=|\+|-|\*|/", s_operator), (r"\s+", None), ]) self.assertEqual(repr(type(scanner.scanner.scanner("").pattern)), self.PATTERN_CLASS) self.assertEqual(scanner.scan("sum = 3*foo + 312.50 + bar"), (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5, 'op+', 'bar'], '')) def test_bug_448951(self): # Bug 448951 (similar to 429357, but with single char match). # (Also test greedy matches.) for op in '', '?', '*': self.assertEqual(regex.match(r'((.%s):)?z' % op, 'z')[:], ('z', None, None)) self.assertEqual(regex.match(r'((.%s):)?z' % op, 'a:z')[:], ('a:z', 'a:', 'a')) def test_bug_725106(self): # Capturing groups in alternatives in repeats. self.assertEqual(regex.match('^((a)|b)*', 'abc')[:], ('ab', 'b', 'a')) self.assertEqual(regex.match('^(([ab])|c)*', 'abc')[:], ('abc', 'c', 'b')) self.assertEqual(regex.match('^((d)|[ab])*', 'abc')[:], ('ab', 'b', None)) self.assertEqual(regex.match('^((a)c|[ab])*', 'abc')[:], ('ab', 'b', None)) self.assertEqual(regex.match('^((a)|b)*?c', 'abc')[:], ('abc', 'b', 'a')) self.assertEqual(regex.match('^(([ab])|c)*?d', 'abcd')[:], ('abcd', 'c', 'b')) self.assertEqual(regex.match('^((d)|[ab])*?c', 'abc')[:], ('abc', 'b', None)) self.assertEqual(regex.match('^((a)c|[ab])*?c', 'abc')[:], ('abc', 'b', None)) def test_bug_725149(self): # Mark_stack_base restoring before restoring marks. self.assertEqual(regex.match('(a)(?:(?=(b)*)c)*', 'abb')[:], ('a', 'a', None)) self.assertEqual(regex.match('(a)((?!(b)*))*', 'abb')[:], ('a', 'a', None, None)) def test_bug_764548(self): # Bug 764548, regex.compile() barfs on str/unicode subclasses. class my_unicode(str): pass pat = regex.compile(my_unicode("abc")) self.assertEqual(pat.match("xyz"), None) def test_finditer(self): it = regex.finditer(r":+", "a:b::c:::d") self.assertEqual([item[0] for item in it], [':', '::', ':::']) def test_bug_926075(self): if regex.compile('bug_926075') is regex.compile(b'bug_926075'): self.fail() def test_bug_931848(self): pattern = "[\u002E\u3002\uFF0E\uFF61]" self.assertEqual(regex.compile(pattern).split("a.b.c"), ['a', 'b', 'c']) def test_bug_581080(self): it = regex.finditer(r"\s", "a b") self.assertEqual(next(it).span(), (1, 2)) self.assertRaises(StopIteration, lambda: next(it)) scanner = regex.compile(r"\s").scanner("a b") self.assertEqual(scanner.search().span(), (1, 2)) self.assertEqual(scanner.search(), None) def test_bug_817234(self): it = regex.finditer(r".*", "asdf") self.assertEqual(next(it).span(), (0, 4)) self.assertEqual(next(it).span(), (4, 4)) self.assertRaises(StopIteration, lambda: next(it)) def test_empty_array(self): # SF buf 1647541. import array for typecode in 'bBuhHiIlLfd': a = array.array(typecode) self.assertEqual(regex.compile(b"bla").match(a), None) self.assertEqual(regex.compile(b"").match(a)[1 : ], ()) def test_inline_flags(self): # Bug #1700. upper_char = chr(0x1ea0) # Latin Capital Letter A with Dot Below lower_char = chr(0x1ea1) # Latin Small Letter A with Dot Below p = regex.compile(upper_char, regex.I | regex.U) self.assertEqual(bool(p.match(lower_char)), True) p = regex.compile(lower_char, regex.I | regex.U) self.assertEqual(bool(p.match(upper_char)), True) p = regex.compile('(?i)' + upper_char, regex.U) self.assertEqual(bool(p.match(lower_char)), True) p = regex.compile('(?i)' + lower_char, regex.U) self.assertEqual(bool(p.match(upper_char)), True) p = regex.compile('(?iu)' + upper_char) self.assertEqual(bool(p.match(lower_char)), True) p = regex.compile('(?iu)' + lower_char) self.assertEqual(bool(p.match(upper_char)), True) self.assertEqual(bool(regex.match(r"(?i)a", "A")), True) self.assertEqual(bool(regex.match(r"a(?i)", "A")), True) self.assertEqual(bool(regex.match(r"(?iV1)a", "A")), True) self.assertEqual(regex.match(r"a(?iV1)", "A"), None) def test_dollar_matches_twice(self): # $ matches the end of string, and just before the terminating \n. pattern = regex.compile('$') self.assertEqual(pattern.sub('#', 'a\nb\n'), 'a\nb#\n#') self.assertEqual(pattern.sub('#', 'a\nb\nc'), 'a\nb\nc#') self.assertEqual(pattern.sub('#', '\n'), '#\n#') pattern = regex.compile('$', regex.MULTILINE) self.assertEqual(pattern.sub('#', 'a\nb\n' ), 'a#\nb#\n#') self.assertEqual(pattern.sub('#', 'a\nb\nc'), 'a#\nb#\nc#') self.assertEqual(pattern.sub('#', '\n'), '#\n#') def test_bytes_str_mixing(self): # Mixing str and bytes is disallowed. pat = regex.compile('.') bpat = regex.compile(b'.') self.assertRaisesRegex(TypeError, self.STR_PAT_ON_BYTES, lambda: pat.match(b'b')) self.assertRaisesRegex(TypeError, self.BYTES_PAT_ON_STR, lambda: bpat.match('b')) self.assertRaisesRegex(TypeError, self.STR_PAT_BYTES_TEMPL, lambda: pat.sub(b'b', 'c')) self.assertRaisesRegex(TypeError, self.STR_PAT_ON_BYTES, lambda: pat.sub('b', b'c')) self.assertRaisesRegex(TypeError, self.STR_PAT_ON_BYTES, lambda: pat.sub(b'b', b'c')) self.assertRaisesRegex(TypeError, self.BYTES_PAT_ON_STR, lambda: bpat.sub(b'b', 'c')) self.assertRaisesRegex(TypeError, self.BYTES_PAT_STR_TEMPL, lambda: bpat.sub('b', b'c')) self.assertRaisesRegex(TypeError, self.BYTES_PAT_ON_STR, lambda: bpat.sub('b', 'c')) self.assertRaisesRegex(ValueError, self.BYTES_PAT_UNI_FLAG, lambda: regex.compile(b'\w', regex.UNICODE)) self.assertRaisesRegex(ValueError, self.BYTES_PAT_UNI_FLAG, lambda: regex.compile(b'(?u)\w')) self.assertRaisesRegex(ValueError, self.MIXED_FLAGS, lambda: regex.compile('\w', regex.UNICODE | regex.ASCII)) self.assertRaisesRegex(ValueError, self.MIXED_FLAGS, lambda: regex.compile('(?u)\w', regex.ASCII)) self.assertRaisesRegex(ValueError, self.MIXED_FLAGS, lambda: regex.compile('(?a)\w', regex.UNICODE)) self.assertRaisesRegex(ValueError, self.MIXED_FLAGS, lambda: regex.compile('(?au)\w')) def test_ascii_and_unicode_flag(self): # String patterns. for flags in (0, regex.UNICODE): pat = regex.compile('\xc0', flags | regex.IGNORECASE) self.assertEqual(bool(pat.match('\xe0')), True) pat = regex.compile('\w', flags) self.assertEqual(bool(pat.match('\xe0')), True) pat = regex.compile('\xc0', regex.ASCII | regex.IGNORECASE) self.assertEqual(pat.match('\xe0'), None) pat = regex.compile('(?a)\xc0', regex.IGNORECASE) self.assertEqual(pat.match('\xe0'), None) pat = regex.compile('\w', regex.ASCII) self.assertEqual(pat.match('\xe0'), None) pat = regex.compile('(?a)\w') self.assertEqual(pat.match('\xe0'), None) # Bytes patterns. for flags in (0, regex.ASCII): pat = regex.compile(b'\xc0', flags | regex.IGNORECASE) self.assertEqual(pat.match(b'\xe0'), None) pat = regex.compile(b'\w') self.assertEqual(pat.match(b'\xe0'), None) self.assertRaisesRegex(ValueError, self.MIXED_FLAGS, lambda: regex.compile('(?au)\w')) def test_subscripting_match(self): m = regex.match(r'(?\w)', 'xy') if not m: self.fail("Failed: expected match but returned None") elif not m or m[0] != m.group(0) or m[1] != m.group(1): self.fail("Failed") if not m: self.fail("Failed: expected match but returned None") elif m[:] != ('x', 'x'): self.fail("Failed: expected \"('x', 'x')\" but got {} instead".format(ascii(m[:]))) def test_new_named_groups(self): m0 = regex.match(r'(?P\w)', 'x') m1 = regex.match(r'(?\w)', 'x') if not (m0 and m1 and m0[:] == m1[:]): self.fail("Failed") def test_properties(self): self.assertEqual(regex.match(b'(?ai)\xC0', b'\xE0'), None) self.assertEqual(regex.match(br'(?ai)\xC0', b'\xE0'), None) self.assertEqual(regex.match(br'(?a)\w', b'\xE0'), None) self.assertEqual(bool(regex.match(r'\w', '\xE0')), True) # Dropped the following test. It's not possible to determine what the # correct result should be in the general case. # self.assertEqual(bool(regex.match(br'(?L)\w', b'\xE0')), # b'\xE0'.isalnum()) self.assertEqual(bool(regex.match(br'(?L)\d', b'0')), True) self.assertEqual(bool(regex.match(br'(?L)\s', b' ')), True) self.assertEqual(bool(regex.match(br'(?L)\w', b'a')), True) self.assertEqual(regex.match(br'(?L)\d', b'?'), None) self.assertEqual(regex.match(br'(?L)\s', b'?'), None) self.assertEqual(regex.match(br'(?L)\w', b'?'), None) self.assertEqual(regex.match(br'(?L)\D', b'0'), None) self.assertEqual(regex.match(br'(?L)\S', b' '), None) self.assertEqual(regex.match(br'(?L)\W', b'a'), None) self.assertEqual(bool(regex.match(br'(?L)\D', b'?')), True) self.assertEqual(bool(regex.match(br'(?L)\S', b'?')), True) self.assertEqual(bool(regex.match(br'(?L)\W', b'?')), True) self.assertEqual(bool(regex.match(r'\p{Cyrillic}', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{IsCyrillic}', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{Script=Cyrillic}', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{InCyrillic}', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{Block=Cyrillic}', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:Cyrillic:]]', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:IsCyrillic:]]', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:Script=Cyrillic:]]', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:InCyrillic:]]', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:Block=Cyrillic:]]', '\N{CYRILLIC CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\P{Cyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\P{IsCyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\P{Script=Cyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\P{InCyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\P{Block=Cyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{^Cyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{^IsCyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{^Script=Cyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{^InCyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\p{^Block=Cyrillic}', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:^Cyrillic:]]', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:^IsCyrillic:]]', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:^Script=Cyrillic:]]', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:^InCyrillic:]]', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'[[:^Block=Cyrillic:]]', '\N{LATIN CAPITAL LETTER A}')), True) self.assertEqual(bool(regex.match(r'\d', '0')), True) self.assertEqual(bool(regex.match(r'\s', ' ')), True) self.assertEqual(bool(regex.match(r'\w', 'A')), True) self.assertEqual(regex.match(r"\d", "?"), None) self.assertEqual(regex.match(r"\s", "?"), None) self.assertEqual(regex.match(r"\w", "?"), None) self.assertEqual(regex.match(r"\D", "0"), None) self.assertEqual(regex.match(r"\S", " "), None) self.assertEqual(regex.match(r"\W", "A"), None) self.assertEqual(bool(regex.match(r'\D', '?')), True) self.assertEqual(bool(regex.match(r'\S', '?')), True) self.assertEqual(bool(regex.match(r'\W', '?')), True) self.assertEqual(bool(regex.match(r'\p{L}', 'A')), True) self.assertEqual(bool(regex.match(r'\p{L}', 'a')), True) self.assertEqual(bool(regex.match(r'\p{Lu}', 'A')), True) self.assertEqual(bool(regex.match(r'\p{Ll}', 'a')), True) self.assertEqual(bool(regex.match(r'(?i)a', 'a')), True) self.assertEqual(bool(regex.match(r'(?i)a', 'A')), True) self.assertEqual(bool(regex.match(r'\w', '0')), True) self.assertEqual(bool(regex.match(r'\w', 'a')), True) self.assertEqual(bool(regex.match(r'\w', '_')), True) self.assertEqual(regex.match(r"\X", "\xE0").span(), (0, 1)) self.assertEqual(regex.match(r"\X", "a\u0300").span(), (0, 2)) self.assertEqual(regex.findall(r"\X", "a\xE0a\u0300e\xE9e\u0301"), ['a', '\xe0', 'a\u0300', 'e', '\xe9', 'e\u0301']) self.assertEqual(regex.findall(r"\X{3}", "a\xE0a\u0300e\xE9e\u0301"), ['a\xe0a\u0300', 'e\xe9e\u0301']) self.assertEqual(regex.findall(r"\X", "\r\r\n\u0301A\u0301"), ['\r', '\r\n', '\u0301', 'A\u0301']) self.assertEqual(bool(regex.match(r'\p{Ll}', 'a')), True) chars_u = "-09AZaz_\u0393\u03b3" chars_b = b"-09AZaz_" word_set = set("Ll Lm Lo Lt Lu Mc Me Mn Nd Nl No Pc".split()) tests = [ (r"\w", chars_u, "09AZaz_\u0393\u03b3"), (r"[[:word:]]", chars_u, "09AZaz_\u0393\u03b3"), (r"\W", chars_u, "-"), (r"[[:^word:]]", chars_u, "-"), (r"\d", chars_u, "09"), (r"[[:digit:]]", chars_u, "09"), (r"\D", chars_u, "-AZaz_\u0393\u03b3"), (r"[[:^digit:]]", chars_u, "-AZaz_\u0393\u03b3"), (r"[[:alpha:]]", chars_u, "AZaz\u0393\u03b3"), (r"[[:^alpha:]]", chars_u, "-09_"), (r"[[:alnum:]]", chars_u, "09AZaz\u0393\u03b3"), (r"[[:^alnum:]]", chars_u, "-_"), (r"[[:xdigit:]]", chars_u, "09Aa"), (r"[[:^xdigit:]]", chars_u, "-Zz_\u0393\u03b3"), (r"\p{InBasicLatin}", "a\xE1", "a"), (r"\P{InBasicLatin}", "a\xE1", "\xE1"), (r"(?i)\p{InBasicLatin}", "a\xE1", "a"), (r"(?i)\P{InBasicLatin}", "a\xE1", "\xE1"), (br"(?L)\w", chars_b, b"09AZaz_"), (br"(?L)[[:word:]]", chars_b, b"09AZaz_"), (br"(?L)\W", chars_b, b"-"), (br"(?L)[[:^word:]]", chars_b, b"-"), (br"(?L)\d", chars_b, b"09"), (br"(?L)[[:digit:]]", chars_b, b"09"), (br"(?L)\D", chars_b, b"-AZaz_"), (br"(?L)[[:^digit:]]", chars_b, b"-AZaz_"), (br"(?L)[[:alpha:]]", chars_b, b"AZaz"), (br"(?L)[[:^alpha:]]", chars_b, b"-09_"), (br"(?L)[[:alnum:]]", chars_b, b"09AZaz"), (br"(?L)[[:^alnum:]]", chars_b, b"-_"), (br"(?L)[[:xdigit:]]", chars_b, b"09Aa"), (br"(?L)[[:^xdigit:]]", chars_b, b"-Zz_"), (br"(?a)\w", chars_b, b"09AZaz_"), (br"(?a)[[:word:]]", chars_b, b"09AZaz_"), (br"(?a)\W", chars_b, b"-"), (br"(?a)[[:^word:]]", chars_b, b"-"), (br"(?a)\d", chars_b, b"09"), (br"(?a)[[:digit:]]", chars_b, b"09"), (br"(?a)\D", chars_b, b"-AZaz_"), (br"(?a)[[:^digit:]]", chars_b, b"-AZaz_"), (br"(?a)[[:alpha:]]", chars_b, b"AZaz"), (br"(?a)[[:^alpha:]]", chars_b, b"-09_"), (br"(?a)[[:alnum:]]", chars_b, b"09AZaz"), (br"(?a)[[:^alnum:]]", chars_b, b"-_"), (br"(?a)[[:xdigit:]]", chars_b, b"09Aa"), (br"(?a)[[:^xdigit:]]", chars_b, b"-Zz_"), ] for pattern, chars, expected in tests: try: if chars[ : 0].join(regex.findall(pattern, chars)) != expected: self.fail("Failed: {}".format(pattern)) except Exception as e: self.fail("Failed: {} raised {}".format(pattern, ascii(e))) self.assertEqual(bool(regex.match(r"\p{NumericValue=0}", "0")), True) self.assertEqual(bool(regex.match(r"\p{NumericValue=1/2}", "\N{VULGAR FRACTION ONE HALF}")), True) self.assertEqual(bool(regex.match(r"\p{NumericValue=0.5}", "\N{VULGAR FRACTION ONE HALF}")), True) def test_word_class(self): self.assertEqual(regex.findall(r"\w+", " \u0939\u093f\u0928\u094d\u0926\u0940,"), ['\u0939\u093f\u0928\u094d\u0926\u0940']) self.assertEqual(regex.findall(r"\W+", " \u0939\u093f\u0928\u094d\u0926\u0940,"), [' ', ',']) self.assertEqual(regex.split(r"(?V1)\b", " \u0939\u093f\u0928\u094d\u0926\u0940,"), [' ', '\u0939\u093f\u0928\u094d\u0926\u0940', ',']) self.assertEqual(regex.split(r"(?V1)\B", " \u0939\u093f\u0928\u094d\u0926\u0940,"), ['', ' \u0939', '\u093f', '\u0928', '\u094d', '\u0926', '\u0940,', '']) def test_search_anchor(self): self.assertEqual(regex.findall(r"\G\w{2}", "abcd ef"), ['ab', 'cd']) def test_search_reverse(self): self.assertEqual(regex.findall(r"(?r).", "abc"), ['c', 'b', 'a']) self.assertEqual(regex.findall(r"(?r).", "abc", overlapped=True), ['c', 'b', 'a']) self.assertEqual(regex.findall(r"(?r)..", "abcde"), ['de', 'bc']) self.assertEqual(regex.findall(r"(?r)..", "abcde", overlapped=True), ['de', 'cd', 'bc', 'ab']) self.assertEqual(regex.findall(r"(?r)(.)(-)(.)", "a-b-c", overlapped=True), [("b", "-", "c"), ("a", "-", "b")]) self.assertEqual([m[0] for m in regex.finditer(r"(?r).", "abc")], ['c', 'b', 'a']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde", overlapped=True)], ['de', 'cd', 'bc', 'ab']) self.assertEqual([m[0] for m in regex.finditer(r"(?r).", "abc")], ['c', 'b', 'a']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde", overlapped=True)], ['de', 'cd', 'bc', 'ab']) self.assertEqual(regex.findall(r"^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?V1)^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?r)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual(regex.findall(r"(?rV1)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"(?V1)^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"(?rV1)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual(regex.findall(r"\G\w{2}", "abcd ef"), ['ab', 'cd']) self.assertEqual(regex.findall(r".{2}(?<=\G.*)", "abcd"), ['ab', 'cd']) self.assertEqual(regex.findall(r"(?r)\G\w{2}", "abcd ef"), []) self.assertEqual(regex.findall(r"(?r)\w{2}\G", "abcd ef"), ['ef']) self.assertEqual(regex.findall(r"q*", "qqwe"), ['qq', '', '', '']) self.assertEqual(regex.findall(r"(?V1)q*", "qqwe"), ['qq', '', '', '']) self.assertEqual(regex.findall(r"(?r)q*", "qqwe"), ['', '', 'qq', '']) self.assertEqual(regex.findall(r"(?rV1)q*", "qqwe"), ['', '', 'qq', '']) self.assertEqual(regex.findall(".", "abcd", pos=1, endpos=3), ['b', 'c']) self.assertEqual(regex.findall(".", "abcd", pos=1, endpos=-1), ['b', 'c']) self.assertEqual([m[0] for m in regex.finditer(".", "abcd", pos=1, endpos=3)], ['b', 'c']) self.assertEqual([m[0] for m in regex.finditer(".", "abcd", pos=1, endpos=-1)], ['b', 'c']) self.assertEqual([m[0] for m in regex.finditer("(?r).", "abcd", pos=1, endpos=3)], ['c', 'b']) self.assertEqual([m[0] for m in regex.finditer("(?r).", "abcd", pos=1, endpos=-1)], ['c', 'b']) self.assertEqual(regex.findall("(?r).", "abcd", pos=1, endpos=3), ['c', 'b']) self.assertEqual(regex.findall("(?r).", "abcd", pos=1, endpos=-1), ['c', 'b']) self.assertEqual(regex.findall(r"[ab]", "aB", regex.I), ['a', 'B']) self.assertEqual(regex.findall(r"(?r)[ab]", "aB", regex.I), ['B', 'a']) self.assertEqual(regex.findall(r"(?r).{2}", "abc"), ['bc']) self.assertEqual(regex.findall(r"(?r).{2}", "abc", overlapped=True), ['bc', 'ab']) self.assertEqual(regex.findall(r"(\w+) (\w+)", "first second third fourth fifth"), [('first', 'second'), ('third', 'fourth')]) self.assertEqual(regex.findall(r"(?r)(\w+) (\w+)", "first second third fourth fifth"), [('fourth', 'fifth'), ('second', 'third')]) self.assertEqual([m[0] for m in regex.finditer(r"(?r).{2}", "abc")], ['bc']) self.assertEqual([m[0] for m in regex.finditer(r"(?r).{2}", "abc", overlapped=True)], ['bc', 'ab']) self.assertEqual([m[0] for m in regex.finditer(r"(\w+) (\w+)", "first second third fourth fifth")], ['first second', 'third fourth']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)(\w+) (\w+)", "first second third fourth fifth")], ['fourth fifth', 'second third']) self.assertEqual(regex.search("abcdef", "abcdef").span(), (0, 6)) self.assertEqual(regex.search("(?r)abcdef", "abcdef").span(), (0, 6)) self.assertEqual(regex.search("(?i)abcdef", "ABCDEF").span(), (0, 6)) self.assertEqual(regex.search("(?ir)abcdef", "ABCDEF").span(), (0, 6)) self.assertEqual(regex.sub(r"(.)", r"\1", "abc"), 'abc') self.assertEqual(regex.sub(r"(?r)(.)", r"\1", "abc"), 'abc') def test_atomic(self): # Issue 433030. self.assertEqual(regex.search(r"(?>a*)a", "aa"), None) def test_possessive(self): # Single-character non-possessive. self.assertEqual(regex.search(r"a?a", "a").span(), (0, 1)) self.assertEqual(regex.search(r"a*a", "aaa").span(), (0, 3)) self.assertEqual(regex.search(r"a+a", "aaa").span(), (0, 3)) self.assertEqual(regex.search(r"a{1,3}a", "aaa").span(), (0, 3)) # Multiple-character non-possessive. self.assertEqual(regex.search(r"(?:ab)?ab", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"(?:ab)*ab", "ababab").span(), (0, 6)) self.assertEqual(regex.search(r"(?:ab)+ab", "ababab").span(), (0, 6)) self.assertEqual(regex.search(r"(?:ab){1,3}ab", "ababab").span(), (0, 6)) # Single-character possessive. self.assertEqual(regex.search(r"a?+a", "a"), None) self.assertEqual(regex.search(r"a*+a", "aaa"), None) self.assertEqual(regex.search(r"a++a", "aaa"), None) self.assertEqual(regex.search(r"a{1,3}+a", "aaa"), None) # Multiple-character possessive. self.assertEqual(regex.search(r"(?:ab)?+ab", "ab"), None) self.assertEqual(regex.search(r"(?:ab)*+ab", "ababab"), None) self.assertEqual(regex.search(r"(?:ab)++ab", "ababab"), None) self.assertEqual(regex.search(r"(?:ab){1,3}+ab", "ababab"), None) def test_zerowidth(self): # Issue 3262. self.assertEqual(regex.split(r"\b", "a b"), ['a b']) self.assertEqual(regex.split(r"(?V1)\b", "a b"), ['', 'a', ' ', 'b', '']) # Issue 1647489. self.assertEqual(regex.findall(r"^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?r)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual(regex.findall(r"(?V1)^|\w+", "foo bar"), ['', 'foo', 'bar']) self.assertEqual([m[0] for m in regex.finditer(r"(?V1)^|\w+", "foo bar")], ['', 'foo', 'bar']) self.assertEqual(regex.findall(r"(?rV1)^|\w+", "foo bar"), ['bar', 'foo', '']) self.assertEqual([m[0] for m in regex.finditer(r"(?rV1)^|\w+", "foo bar")], ['bar', 'foo', '']) self.assertEqual(regex.split("", "xaxbxc"), ['xaxbxc']) self.assertEqual([m for m in regex.splititer("", "xaxbxc")], ['xaxbxc']) self.assertEqual(regex.split("(?r)", "xaxbxc"), ['xaxbxc']) self.assertEqual([m for m in regex.splititer("(?r)", "xaxbxc")], ['xaxbxc']) self.assertEqual(regex.split("(?V1)", "xaxbxc"), ['', 'x', 'a', 'x', 'b', 'x', 'c', '']) self.assertEqual([m for m in regex.splititer("(?V1)", "xaxbxc")], ['', 'x', 'a', 'x', 'b', 'x', 'c', '']) self.assertEqual(regex.split("(?rV1)", "xaxbxc"), ['', 'c', 'x', 'b', 'x', 'a', 'x', '']) self.assertEqual([m for m in regex.splititer("(?rV1)", "xaxbxc")], ['', 'c', 'x', 'b', 'x', 'a', 'x', '']) def test_scoped_and_inline_flags(self): # Issues 433028, 433024, 433027. self.assertEqual(regex.search(r"(?i)Ab", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"(?i:A)b", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"A(?i)b", "ab").span(), (0, 2)) self.assertEqual(regex.search(r"A(?iV1)b", "ab"), None) self.assertRaisesRegex(regex.error, self.CANT_TURN_OFF, lambda: regex.search(r"(?V0-i)Ab", "ab", flags=regex.I)) self.assertEqual(regex.search(r"(?V0)Ab", "ab"), None) self.assertEqual(regex.search(r"(?V1)Ab", "ab"), None) self.assertEqual(regex.search(r"(?V1-i)Ab", "ab", flags=regex.I), None) self.assertEqual(regex.search(r"(?-i:A)b", "ab", flags=regex.I), None) self.assertEqual(regex.search(r"A(?V1-i)b", "ab", flags=regex.I).span(), (0, 2)) def test_repeated_repeats(self): # Issue 2537. self.assertEqual(regex.search(r"(?:a+)+", "aaa").span(), (0, 3)) self.assertEqual(regex.search(r"(?:(?:ab)+c)+", "abcabc").span(), (0, 6)) def test_lookbehind(self): self.assertEqual(regex.search(r"123(?<=a\d+)", "a123").span(), (1, 4)) self.assertEqual(regex.search(r"123(?<=a\d+)", "b123"), None) self.assertEqual(regex.search(r"123(?[ \t]+\r*$)|(?P(?<=[^\n])\Z)') self.assertEqual(pat.subn(lambda m: '<' + m.lastgroup + '>', 'foobar '), ('foobar', 1)) self.assertEqual([m.group() for m in pat.finditer('foobar ')], [' ', '']) pat = regex.compile(r'(?mV1)(?P[ \t]+\r*$)|(?P(?<=[^\n])\Z)') self.assertEqual(pat.subn(lambda m: '<' + m.lastgroup + '>', 'foobar '), ('foobar', 2)) self.assertEqual([m.group() for m in pat.finditer('foobar ')], [' ', '']) def test_overlapped(self): self.assertEqual(regex.findall(r"..", "abcde"), ['ab', 'cd']) self.assertEqual(regex.findall(r"..", "abcde", overlapped=True), ['ab', 'bc', 'cd', 'de']) self.assertEqual(regex.findall(r"(?r)..", "abcde"), ['de', 'bc']) self.assertEqual(regex.findall(r"(?r)..", "abcde", overlapped=True), ['de', 'cd', 'bc', 'ab']) self.assertEqual(regex.findall(r"(.)(-)(.)", "a-b-c", overlapped=True), [("a", "-", "b"), ("b", "-", "c")]) self.assertEqual([m[0] for m in regex.finditer(r"..", "abcde")], ['ab', 'cd']) self.assertEqual([m[0] for m in regex.finditer(r"..", "abcde", overlapped=True)], ['ab', 'bc', 'cd', 'de']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde")], ['de', 'bc']) self.assertEqual([m[0] for m in regex.finditer(r"(?r)..", "abcde", overlapped=True)], ['de', 'cd', 'bc', 'ab']) self.assertEqual([m.groups() for m in regex.finditer(r"(.)(-)(.)", "a-b-c", overlapped=True)], [("a", "-", "b"), ("b", "-", "c")]) self.assertEqual([m.groups() for m in regex.finditer(r"(?r)(.)(-)(.)", "a-b-c", overlapped=True)], [("b", "-", "c"), ("a", "-", "b")]) def test_splititer(self): self.assertEqual(regex.split(r",", "a,b,,c,"), ['a', 'b', '', 'c', '']) self.assertEqual([m for m in regex.splititer(r",", "a,b,,c,")], ['a', 'b', '', 'c', '']) def test_grapheme(self): self.assertEqual(regex.match(r"\X", "\xE0").span(), (0, 1)) self.assertEqual(regex.match(r"\X", "a\u0300").span(), (0, 2)) self.assertEqual(regex.findall(r"\X", "a\xE0a\u0300e\xE9e\u0301"), ['a', '\xe0', 'a\u0300', 'e', '\xe9', 'e\u0301']) self.assertEqual(regex.findall(r"\X{3}", "a\xE0a\u0300e\xE9e\u0301"), ['a\xe0a\u0300', 'e\xe9e\u0301']) self.assertEqual(regex.findall(r"\X", "\r\r\n\u0301A\u0301"), ['\r', '\r\n', '\u0301', 'A\u0301']) def test_word_boundary(self): text = 'The quick ("brown") fox can\'t jump 32.3 feet, right?' self.assertEqual(regex.split(r'(?V1)\b', text), ['', 'The', ' ', 'quick', ' ("', 'brown', '") ', 'fox', ' ', 'can', "'", 't', ' ', 'jump', ' ', '32', '.', '3', ' ', 'feet', ', ', 'right', '?']) self.assertEqual(regex.split(r'(?V1w)\b', text), ['', 'The', ' ', 'quick', ' ', '(', '"', 'brown', '"', ')', ' ', 'fox', ' ', "can't", ' ', 'jump', ' ', '32.3', ' ', 'feet', ',', ' ', 'right', '?', '']) text = "The fox" self.assertEqual(regex.split(r'(?V1)\b', text), ['', 'The', ' ', 'fox', '']) self.assertEqual(regex.split(r'(?V1w)\b', text), ['', 'The', ' ', ' ', 'fox', '']) text = "can't aujourd'hui l'objectif" self.assertEqual(regex.split(r'(?V1)\b', text), ['', 'can', "'", 't', ' ', 'aujourd', "'", 'hui', ' ', 'l', "'", 'objectif', '']) self.assertEqual(regex.split(r'(?V1w)\b', text), ['', "can't", ' ', "aujourd'hui", ' ', "l'", 'objectif', '']) def test_line_boundary(self): self.assertEqual(regex.findall(r".+", "Line 1\nLine 2\n"), ["Line 1", "Line 2"]) self.assertEqual(regex.findall(r".+", "Line 1\rLine 2\r"), ["Line 1\rLine 2\r"]) self.assertEqual(regex.findall(r".+", "Line 1\r\nLine 2\r\n"), ["Line 1\r", "Line 2\r"]) self.assertEqual(regex.findall(r"(?w).+", "Line 1\nLine 2\n"), ["Line 1", "Line 2"]) self.assertEqual(regex.findall(r"(?w).+", "Line 1\rLine 2\r"), ["Line 1", "Line 2"]) self.assertEqual(regex.findall(r"(?w).+", "Line 1\r\nLine 2\r\n"), ["Line 1", "Line 2"]) self.assertEqual(regex.search(r"^abc", "abc").start(), 0) self.assertEqual(regex.search(r"^abc", "\nabc"), None) self.assertEqual(regex.search(r"^abc", "\rabc"), None) self.assertEqual(regex.search(r"(?w)^abc", "abc").start(), 0) self.assertEqual(regex.search(r"(?w)^abc", "\nabc"), None) self.assertEqual(regex.search(r"(?w)^abc", "\rabc"), None) self.assertEqual(regex.search(r"abc$", "abc").start(), 0) self.assertEqual(regex.search(r"abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"abc$", "abc\r"), None) self.assertEqual(regex.search(r"(?w)abc$", "abc").start(), 0) self.assertEqual(regex.search(r"(?w)abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"(?w)abc$", "abc\r").start(), 0) self.assertEqual(regex.search(r"(?m)^abc", "abc").start(), 0) self.assertEqual(regex.search(r"(?m)^abc", "\nabc").start(), 1) self.assertEqual(regex.search(r"(?m)^abc", "\rabc"), None) self.assertEqual(regex.search(r"(?mw)^abc", "abc").start(), 0) self.assertEqual(regex.search(r"(?mw)^abc", "\nabc").start(), 1) self.assertEqual(regex.search(r"(?mw)^abc", "\rabc").start(), 1) self.assertEqual(regex.search(r"(?m)abc$", "abc").start(), 0) self.assertEqual(regex.search(r"(?m)abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"(?m)abc$", "abc\r"), None) self.assertEqual(regex.search(r"(?mw)abc$", "abc").start(), 0) self.assertEqual(regex.search(r"(?mw)abc$", "abc\n").start(), 0) self.assertEqual(regex.search(r"(?mw)abc$", "abc\r").start(), 0) def test_branch_reset(self): self.assertEqual(regex.match(r"(?:(a)|(b))(c)", "ac").groups(), ('a', None, 'c')) self.assertEqual(regex.match(r"(?:(a)|(b))(c)", "bc").groups(), (None, 'b', 'c')) self.assertEqual(regex.match(r"(?:(?a)|(?b))(?c)", "ac").groups(), ('a', None, 'c')) self.assertEqual(regex.match(r"(?:(?a)|(?b))(?c)", "bc").groups(), (None, 'b', 'c')) self.assertEqual(regex.match(r"(?a)(?:(?b)|(?c))(?d)", "abd").groups(), ('a', 'b', None, 'd')) self.assertEqual(regex.match(r"(?a)(?:(?b)|(?c))(?d)", "acd").groups(), ('a', None, 'c', 'd')) self.assertEqual(regex.match(r"(a)(?:(b)|(c))(d)", "abd").groups(), ('a', 'b', None, 'd')) self.assertEqual(regex.match(r"(a)(?:(b)|(c))(d)", "acd").groups(), ('a', None, 'c', 'd')) self.assertEqual(regex.match(r"(a)(?|(b)|(b))(d)", "abd").groups(), ('a', 'b', 'd')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "ac").groups(), ('a', None, 'c')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "bc").groups(), (None, 'b', 'c')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "ac").groups(), ('a', 'c')) self.assertEqual(regex.match(r"(?|(?a)|(?b))(c)", "bc").groups(), ('b', 'c')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(?d))(e)", "abe").groups(), ('a', 'b', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(?d))(e)", "cde").groups(), ('d', 'c', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(d))(e)", "abe").groups(), ('a', 'b', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(?c)(d))(e)", "cde").groups(), ('d', 'c', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(d))(e)", "abe").groups(), ('a', 'b', 'e')) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(d))(e)", "cde").groups(), ('c', 'd', 'e')) # Hg issue 87. self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "abe").groups(), ("a", "b", "e")) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "abe").capturesdict(), {"a": ["a"], "b": ["b"]}) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "cde").groups(), ("d", None, "e")) self.assertEqual(regex.match(r"(?|(?a)(?b)|(c)(?d))(e)", "cde").capturesdict(), {"a": ["c", "d"], "b": []}) def test_set(self): self.assertEqual(regex.match(r"[a]", "a").span(), (0, 1)) self.assertEqual(regex.match(r"(?i)[a]", "A").span(), (0, 1)) self.assertEqual(regex.match(r"[a-b]", r"a").span(), (0, 1)) self.assertEqual(regex.match(r"(?i)[a-b]", r"A").span(), (0, 1)) self.assertEqual(regex.sub(r"(?V0)([][])", r"-", "a[b]c"), "a-b-c") self.assertEqual(regex.findall(r"[\p{Alpha}]", "a0"), ["a"]) self.assertEqual(regex.findall(r"(?i)[\p{Alpha}]", "A0"), ["A"]) self.assertEqual(regex.findall(r"[a\p{Alpha}]", "ab0"), ["a", "b"]) self.assertEqual(regex.findall(r"[a\P{Alpha}]", "ab0"), ["a", "0"]) self.assertEqual(regex.findall(r"(?i)[a\p{Alpha}]", "ab0"), ["a", "b"]) self.assertEqual(regex.findall(r"(?i)[a\P{Alpha}]", "ab0"), ["a", "0"]) self.assertEqual(regex.findall(r"[a-b\p{Alpha}]", "abC0"), ["a", "b", "C"]) self.assertEqual(regex.findall(r"(?i)[a-b\p{Alpha}]", "AbC0"), ["A", "b", "C"]) self.assertEqual(regex.findall(r"[\p{Alpha}]", "a0"), ["a"]) self.assertEqual(regex.findall(r"[\P{Alpha}]", "a0"), ["0"]) self.assertEqual(regex.findall(r"[^\p{Alpha}]", "a0"), ["0"]) self.assertEqual(regex.findall(r"[^\P{Alpha}]", "a0"), ["a"]) self.assertEqual("".join(regex.findall(r"[^\d-h]", "a^b12c-h")), 'a^bc') self.assertEqual("".join(regex.findall(r"[^\dh]", "a^b12c-h")), 'a^bc-') self.assertEqual("".join(regex.findall(r"[^h\s\db]", "a^b 12c-h")), 'a^c-') self.assertEqual("".join(regex.findall(r"[^b\w]", "a b")), ' ') self.assertEqual("".join(regex.findall(r"[^b\S]", "a b")), ' ') self.assertEqual("".join(regex.findall(r"[^8\d]", "a 1b2")), 'a b') all_chars = "".join(chr(c) for c in range(0x100)) self.assertEqual(len(regex.findall(r"\p{ASCII}", all_chars)), 128) self.assertEqual(len(regex.findall(r"\p{Letter}", all_chars)), 117) self.assertEqual(len(regex.findall(r"\p{Digit}", all_chars)), 10) # Set operators self.assertEqual(len(regex.findall(r"(?V1)[\p{ASCII}&&\p{Letter}]", all_chars)), 52) self.assertEqual(len(regex.findall(r"(?V1)[\p{ASCII}&&\p{Alnum}&&\p{Letter}]", all_chars)), 52) self.assertEqual(len(regex.findall(r"(?V1)[\p{ASCII}&&\p{Alnum}&&\p{Digit}]", all_chars)), 10) self.assertEqual(len(regex.findall(r"(?V1)[\p{ASCII}&&\p{Cc}]", all_chars)), 33) self.assertEqual(len(regex.findall(r"(?V1)[\p{ASCII}&&\p{Graph}]", all_chars)), 94) self.assertEqual(len(regex.findall(r"(?V1)[\p{ASCII}--\p{Cc}]", all_chars)), 95) self.assertEqual(len(regex.findall(r"[\p{Letter}\p{Digit}]", all_chars)), 127) self.assertEqual(len(regex.findall(r"(?V1)[\p{Letter}||\p{Digit}]", all_chars)), 127) self.assertEqual(len(regex.findall(r"\p{HexDigit}", all_chars)), 22) self.assertEqual(len(regex.findall(r"(?V1)[\p{HexDigit}~~\p{Digit}]", all_chars)), 12) self.assertEqual(len(regex.findall(r"(?V1)[\p{Digit}~~\p{HexDigit}]", all_chars)), 12) self.assertEqual(repr(type(regex.compile(r"(?V0)([][-])"))), self.PATTERN_CLASS) self.assertEqual(regex.findall(r"(?V1)[[a-z]--[aei]]", "abc"), ["b", "c"]) self.assertEqual(regex.findall(r"(?iV1)[[a-z]--[aei]]", "abc"), ["b", "c"]) self.assertEqual(regex.findall("(?V1)[\w--a]","abc"), ["b", "c"]) self.assertEqual(regex.findall("(?iV1)[\w--a]","abc"), ["b", "c"]) def test_various(self): tests = [ # Test ?P< and ?P= extensions. ('(?Pa)', '', '', regex.error, self.BAD_GROUP_NAME), # Begins with a digit. ('(?Pa)', '', '', regex.error, self.BAD_GROUP_NAME), # Begins with an illegal char. ('(?Pa)', '', '', regex.error, self.BAD_GROUP_NAME), # Begins with an illegal char. # Same tests, for the ?P= form. ('(?Pa)(?P=foo_123', 'aa', '', regex.error, self.MISSING_RPAREN), ('(?Pa)(?P=1)', 'aa', '', regex.error, self.BAD_GROUP_NAME), ('(?Pa)(?P=!)', 'aa', '', regex.error, self.BAD_GROUP_NAME), ('(?Pa)(?P=foo_124)', 'aa', '', regex.error, self.UNKNOWN_GROUP), # Backref to undefined group. ('(?Pa)', 'a', '1', ascii('a')), ('(?Pa)(?P=foo_123)', 'aa', '1', ascii('a')), # Mal-formed \g in pattern treated as literal for compatibility. (r'(?a)\ga)\g<1>', 'aa', '1', ascii('a')), (r'(?a)\g', 'aa', '', ascii(None)), (r'(?a)\g', 'aa', '', regex.error, self.UNKNOWN_GROUP), # Backref to undefined group. ('(?a)', 'a', '1', ascii('a')), (r'(?a)\g', 'aa', '1', ascii('a')), # Test octal escapes. ('\\1', 'a', '', regex.error, self.UNKNOWN_GROUP), # Backreference. ('[\\1]', '\1', '0', "'\\x01'"), # Character. ('\\09', chr(0) + '9', '0', ascii(chr(0) + '9')), ('\\141', 'a', '0', ascii('a')), ('(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\119', 'abcdefghijklk9', '0,11', ascii(('abcdefghijklk9', 'k'))), # Test \0 is handled everywhere. (r'\0', '\0', '0', ascii('\0')), (r'[\0a]', '\0', '0', ascii('\0')), (r'[a\0]', '\0', '0', ascii('\0')), (r'[^a\0]', '\0', '', ascii(None)), # Test various letter escapes. (r'\a[\b]\f\n\r\t\v', '\a\b\f\n\r\t\v', '0', ascii('\a\b\f\n\r\t\v')), (r'[\a][\b][\f][\n][\r][\t][\v]', '\a\b\f\n\r\t\v', '0', ascii('\a\b\f\n\r\t\v')), (r'\c\e\g\h\i\j\k\o\p\q\y\z', 'ceghijkopqyz', '0', ascii('ceghijkopqyz')), (r'\xff', '\377', '0', ascii(chr(255))), # New \x semantics. (r'\x00ffffffffffffff', '\377', '', ascii(None)), (r'\x00f', '\017', '', ascii(None)), (r'\x00fe', '\376', '', ascii(None)), (r'\x00ff', '\377', '', ascii(None)), (r'\t\n\v\r\f\a\g', '\t\n\v\r\f\ag', '0', ascii('\t\n\v\r\f\ag')), ('\t\n\v\r\f\a\g', '\t\n\v\r\f\ag', '0', ascii('\t\n\v\r\f\ag')), (r'\t\n\v\r\f\a', '\t\n\v\r\f\a', '0', ascii(chr(9) + chr(10) + chr(11) + chr(13) + chr(12) + chr(7))), (r'[\t][\n][\v][\r][\f][\b]', '\t\n\v\r\f\b', '0', ascii('\t\n\v\r\f\b')), (r"^\w+=(\\[\000-\277]|[^\n\\])*", "SRC=eval.c g.c blah blah blah \\\\\n\tapes.c", '0', ascii("SRC=eval.c g.c blah blah blah \\\\")), # Test that . only matches \n in DOTALL mode. ('a.b', 'acb', '0', ascii('acb')), ('a.b', 'a\nb', '', ascii(None)), ('a.*b', 'acc\nccb', '', ascii(None)), ('a.{4,5}b', 'acc\nccb', '', ascii(None)), ('a.b', 'a\rb', '0', ascii('a\rb')), # The new behaviour is that the inline flag affects only what follows. ('a.b(?s)', 'a\nb', '0', ascii('a\nb')), ('a.b(?sV1)', 'a\nb', '', ascii(None)), ('(?s)a.b', 'a\nb', '0', ascii('a\nb')), ('a.*(?s)b', 'acc\nccb', '0', ascii('acc\nccb')), ('a.*(?sV1)b', 'acc\nccb', '', ascii(None)), ('(?s)a.*b', 'acc\nccb', '0', ascii('acc\nccb')), ('(?s)a.{4,5}b', 'acc\nccb', '0', ascii('acc\nccb')), (')', '', '', regex.error, self.TRAILING_CHARS), # Unmatched right bracket. ('', '', '0', "''"), # Empty pattern. ('abc', 'abc', '0', ascii('abc')), ('abc', 'xbc', '', ascii(None)), ('abc', 'axc', '', ascii(None)), ('abc', 'abx', '', ascii(None)), ('abc', 'xabcy', '0', ascii('abc')), ('abc', 'ababc', '0', ascii('abc')), ('ab*c', 'abc', '0', ascii('abc')), ('ab*bc', 'abc', '0', ascii('abc')), ('ab*bc', 'abbc', '0', ascii('abbc')), ('ab*bc', 'abbbbc', '0', ascii('abbbbc')), ('ab+bc', 'abbc', '0', ascii('abbc')), ('ab+bc', 'abc', '', ascii(None)), ('ab+bc', 'abq', '', ascii(None)), ('ab+bc', 'abbbbc', '0', ascii('abbbbc')), ('ab?bc', 'abbc', '0', ascii('abbc')), ('ab?bc', 'abc', '0', ascii('abc')), ('ab?bc', 'abbbbc', '', ascii(None)), ('ab?c', 'abc', '0', ascii('abc')), ('^abc$', 'abc', '0', ascii('abc')), ('^abc$', 'abcc', '', ascii(None)), ('^abc', 'abcc', '0', ascii('abc')), ('^abc$', 'aabc', '', ascii(None)), ('abc$', 'aabc', '0', ascii('abc')), ('^', 'abc', '0', ascii('')), ('$', 'abc', '0', ascii('')), ('a.c', 'abc', '0', ascii('abc')), ('a.c', 'axc', '0', ascii('axc')), ('a.*c', 'axyzc', '0', ascii('axyzc')), ('a.*c', 'axyzd', '', ascii(None)), ('a[bc]d', 'abc', '', ascii(None)), ('a[bc]d', 'abd', '0', ascii('abd')), ('a[b-d]e', 'abd', '', ascii(None)), ('a[b-d]e', 'ace', '0', ascii('ace')), ('a[b-d]', 'aac', '0', ascii('ac')), ('a[-b]', 'a-', '0', ascii('a-')), ('a[\\-b]', 'a-', '0', ascii('a-')), ('a[b-]', 'a-', '0', ascii('a-')), ('a[]b', '-', '', regex.error, self.BAD_SET), ('a[', '-', '', regex.error, self.BAD_SET), ('a\\', '-', '', regex.error, self.BAD_ESCAPE), ('abc)', '-', '', regex.error, self.TRAILING_CHARS), ('(abc', '-', '', regex.error, self.MISSING_RPAREN), ('a]', 'a]', '0', ascii('a]')), ('a[]]b', 'a]b', '0', ascii('a]b')), ('a[]]b', 'a]b', '0', ascii('a]b')), ('a[^bc]d', 'aed', '0', ascii('aed')), ('a[^bc]d', 'abd', '', ascii(None)), ('a[^-b]c', 'adc', '0', ascii('adc')), ('a[^-b]c', 'a-c', '', ascii(None)), ('a[^]b]c', 'a]c', '', ascii(None)), ('a[^]b]c', 'adc', '0', ascii('adc')), ('\\ba\\b', 'a-', '0', ascii('a')), ('\\ba\\b', '-a', '0', ascii('a')), ('\\ba\\b', '-a-', '0', ascii('a')), ('\\by\\b', 'xy', '', ascii(None)), ('\\by\\b', 'yz', '', ascii(None)), ('\\by\\b', 'xyz', '', ascii(None)), ('x\\b', 'xyz', '', ascii(None)), ('x\\B', 'xyz', '0', ascii('x')), ('\\Bz', 'xyz', '0', ascii('z')), ('z\\B', 'xyz', '', ascii(None)), ('\\Bx', 'xyz', '', ascii(None)), ('\\Ba\\B', 'a-', '', ascii(None)), ('\\Ba\\B', '-a', '', ascii(None)), ('\\Ba\\B', '-a-', '', ascii(None)), ('\\By\\B', 'xy', '', ascii(None)), ('\\By\\B', 'yz', '', ascii(None)), ('\\By\\b', 'xy', '0', ascii('y')), ('\\by\\B', 'yz', '0', ascii('y')), ('\\By\\B', 'xyz', '0', ascii('y')), ('ab|cd', 'abc', '0', ascii('ab')), ('ab|cd', 'abcd', '0', ascii('ab')), ('()ef', 'def', '0,1', ascii(('ef', ''))), ('$b', 'b', '', ascii(None)), ('a\\(b', 'a(b', '', ascii(('a(b',))), ('a\\(*b', 'ab', '0', ascii('ab')), ('a\\(*b', 'a((b', '0', ascii('a((b')), ('a\\\\b', 'a\\b', '0', ascii('a\\b')), ('((a))', 'abc', '0,1,2', ascii(('a', 'a', 'a'))), ('(a)b(c)', 'abc', '0,1,2', ascii(('abc', 'a', 'c'))), ('a+b+c', 'aabbabc', '0', ascii('abc')), ('(a+|b)*', 'ab', '0,1', ascii(('ab', 'b'))), ('(a+|b)+', 'ab', '0,1', ascii(('ab', 'b'))), ('(a+|b)?', 'ab', '0,1', ascii(('a', 'a'))), (')(', '-', '', regex.error, self.TRAILING_CHARS), ('[^ab]*', 'cde', '0', ascii('cde')), ('abc', '', '', ascii(None)), ('a*', '', '0', ascii('')), ('a|b|c|d|e', 'e', '0', ascii('e')), ('(a|b|c|d|e)f', 'ef', '0,1', ascii(('ef', 'e'))), ('abcd*efg', 'abcdefg', '0', ascii('abcdefg')), ('ab*', 'xabyabbbz', '0', ascii('ab')), ('ab*', 'xayabbbz', '0', ascii('a')), ('(ab|cd)e', 'abcde', '0,1', ascii(('cde', 'cd'))), ('[abhgefdc]ij', 'hij', '0', ascii('hij')), ('^(ab|cd)e', 'abcde', '', ascii(None)), ('(abc|)ef', 'abcdef', '0,1', ascii(('ef', ''))), ('(a|b)c*d', 'abcd', '0,1', ascii(('bcd', 'b'))), ('(ab|ab*)bc', 'abc', '0,1', ascii(('abc', 'a'))), ('a([bc]*)c*', 'abc', '0,1', ascii(('abc', 'bc'))), ('a([bc]*)(c*d)', 'abcd', '0,1,2', ascii(('abcd', 'bc', 'd'))), ('a([bc]+)(c*d)', 'abcd', '0,1,2', ascii(('abcd', 'bc', 'd'))), ('a([bc]*)(c+d)', 'abcd', '0,1,2', ascii(('abcd', 'b', 'cd'))), ('a[bcd]*dcdcde', 'adcdcde', '0', ascii('adcdcde')), ('a[bcd]+dcdcde', 'adcdcde', '', ascii(None)), ('(ab|a)b*c', 'abc', '0,1', ascii(('abc', 'ab'))), ('((a)(b)c)(d)', 'abcd', '1,2,3,4', ascii(('abc', 'a', 'b', 'd'))), ('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', '0', ascii('alpha')), ('^a(bc+|b[eh])g|.h$', 'abh', '0,1', ascii(('bh', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'effgz', '0,1,2', ascii(('effgz', 'effgz', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'ij', '0,1,2', ascii(('ij', 'ij', 'j'))), ('(bc+d$|ef*g.|h?i(j|k))', 'effg', '', ascii(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'bcdd', '', ascii(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'reffgz', '0,1,2', ascii(('effgz', 'effgz', None))), ('(((((((((a)))))))))', 'a', '0', ascii('a')), ('multiple words of text', 'uh-uh', '', ascii(None)), ('multiple words', 'multiple words, yeah', '0', ascii('multiple words')), ('(.*)c(.*)', 'abcde', '0,1,2', ascii(('abcde', 'ab', 'de'))), ('\\((.*), (.*)\\)', '(a, b)', '2,1', ascii(('b', 'a'))), ('[k]', 'ab', '', ascii(None)), ('a[-]?c', 'ac', '0', ascii('ac')), ('(abc)\\1', 'abcabc', '1', ascii('abc')), ('([a-c]*)\\1', 'abcabc', '1', ascii('abc')), ('^(.+)?B', 'AB', '1', ascii('A')), ('(a+).\\1$', 'aaaaa', '0,1', ascii(('aaaaa', 'aa'))), ('^(a+).\\1$', 'aaaa', '', ascii(None)), ('(abc)\\1', 'abcabc', '0,1', ascii(('abcabc', 'abc'))), ('([a-c]+)\\1', 'abcabc', '0,1', ascii(('abcabc', 'abc'))), ('(a)\\1', 'aa', '0,1', ascii(('aa', 'a'))), ('(a+)\\1', 'aa', '0,1', ascii(('aa', 'a'))), ('(a+)+\\1', 'aa', '0,1', ascii(('aa', 'a'))), ('(a).+\\1', 'aba', '0,1', ascii(('aba', 'a'))), ('(a)ba*\\1', 'aba', '0,1', ascii(('aba', 'a'))), ('(aa|a)a\\1$', 'aaa', '0,1', ascii(('aaa', 'a'))), ('(a|aa)a\\1$', 'aaa', '0,1', ascii(('aaa', 'a'))), ('(a+)a\\1$', 'aaa', '0,1', ascii(('aaa', 'a'))), ('([abc]*)\\1', 'abcabc', '0,1', ascii(('abcabc', 'abc'))), ('(a)(b)c|ab', 'ab', '0,1,2', ascii(('ab', None, None))), ('(a)+x', 'aaax', '0,1', ascii(('aaax', 'a'))), ('([ac])+x', 'aacx', '0,1', ascii(('aacx', 'c'))), ('([^/]*/)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', '0,1', ascii(('d:msgs/tdir/sub1/', 'tdir/'))), ('([^.]*)\\.([^:]*):[T ]+(.*)', 'track1.title:TBlah blah blah', '0,1,2,3', ascii(('track1.title:TBlah blah blah', 'track1', 'title', 'Blah blah blah'))), ('([^N]*N)+', 'abNNxyzN', '0,1', ascii(('abNNxyzN', 'xyzN'))), ('([^N]*N)+', 'abNNxyz', '0,1', ascii(('abNN', 'N'))), ('([abc]*)x', 'abcx', '0,1', ascii(('abcx', 'abc'))), ('([abc]*)x', 'abc', '', ascii(None)), ('([xyz]*)x', 'abcx', '0,1', ascii(('x', ''))), ('(a)+b|aac', 'aac', '0,1', ascii(('aac', None))), # Test symbolic groups. ('(?Paaa)a', 'aaaa', '', regex.error, self.BAD_GROUP_NAME), ('(?Paaa)a', 'aaaa', '0,id', ascii(('aaaa', 'aaa'))), ('(?Paa)(?P=id)', 'aaaa', '0,id', ascii(('aaaa', 'aa'))), ('(?Paa)(?P=xd)', 'aaaa', '', regex.error, self.UNKNOWN_GROUP), # Character properties. (r"\g", "g", '0', ascii('g')), (r"\g<1>", "g", '', regex.error, self.UNKNOWN_GROUP), (r"(.)\g<1>", "gg", '0', ascii('gg')), (r"(.)\g<1>", "gg", '', ascii(('gg', 'g'))), (r"\N", "N", '0', ascii('N')), (r"\N{LATIN SMALL LETTER A}", "a", '0', ascii('a')), (r"\p", "p", '0', ascii('p')), (r"\p{Ll}", "a", '0', ascii('a')), (r"\P", "P", '0', ascii('P')), (r"\P{Lu}", "p", '0', ascii('p')), # All tests from Perl. ('abc', 'abc', '0', ascii('abc')), ('abc', 'xbc', '', ascii(None)), ('abc', 'axc', '', ascii(None)), ('abc', 'abx', '', ascii(None)), ('abc', 'xabcy', '0', ascii('abc')), ('abc', 'ababc', '0', ascii('abc')), ('ab*c', 'abc', '0', ascii('abc')), ('ab*bc', 'abc', '0', ascii('abc')), ('ab*bc', 'abbc', '0', ascii('abbc')), ('ab*bc', 'abbbbc', '0', ascii('abbbbc')), ('ab{0,}bc', 'abbbbc', '0', ascii('abbbbc')), ('ab+bc', 'abbc', '0', ascii('abbc')), ('ab+bc', 'abc', '', ascii(None)), ('ab+bc', 'abq', '', ascii(None)), ('ab{1,}bc', 'abq', '', ascii(None)), ('ab+bc', 'abbbbc', '0', ascii('abbbbc')), ('ab{1,}bc', 'abbbbc', '0', ascii('abbbbc')), ('ab{1,3}bc', 'abbbbc', '0', ascii('abbbbc')), ('ab{3,4}bc', 'abbbbc', '0', ascii('abbbbc')), ('ab{4,5}bc', 'abbbbc', '', ascii(None)), ('ab?bc', 'abbc', '0', ascii('abbc')), ('ab?bc', 'abc', '0', ascii('abc')), ('ab{0,1}bc', 'abc', '0', ascii('abc')), ('ab?bc', 'abbbbc', '', ascii(None)), ('ab?c', 'abc', '0', ascii('abc')), ('ab{0,1}c', 'abc', '0', ascii('abc')), ('^abc$', 'abc', '0', ascii('abc')), ('^abc$', 'abcc', '', ascii(None)), ('^abc', 'abcc', '0', ascii('abc')), ('^abc$', 'aabc', '', ascii(None)), ('abc$', 'aabc', '0', ascii('abc')), ('^', 'abc', '0', ascii('')), ('$', 'abc', '0', ascii('')), ('a.c', 'abc', '0', ascii('abc')), ('a.c', 'axc', '0', ascii('axc')), ('a.*c', 'axyzc', '0', ascii('axyzc')), ('a.*c', 'axyzd', '', ascii(None)), ('a[bc]d', 'abc', '', ascii(None)), ('a[bc]d', 'abd', '0', ascii('abd')), ('a[b-d]e', 'abd', '', ascii(None)), ('a[b-d]e', 'ace', '0', ascii('ace')), ('a[b-d]', 'aac', '0', ascii('ac')), ('a[-b]', 'a-', '0', ascii('a-')), ('a[b-]', 'a-', '0', ascii('a-')), ('a[b-a]', '-', '', regex.error, self.BAD_CHAR_RANGE), ('a[]b', '-', '', regex.error, self.BAD_SET), ('a[', '-', '', regex.error, self.BAD_SET), ('a]', 'a]', '0', ascii('a]')), ('a[]]b', 'a]b', '0', ascii('a]b')), ('a[^bc]d', 'aed', '0', ascii('aed')), ('a[^bc]d', 'abd', '', ascii(None)), ('a[^-b]c', 'adc', '0', ascii('adc')), ('a[^-b]c', 'a-c', '', ascii(None)), ('a[^]b]c', 'a]c', '', ascii(None)), ('a[^]b]c', 'adc', '0', ascii('adc')), ('ab|cd', 'abc', '0', ascii('ab')), ('ab|cd', 'abcd', '0', ascii('ab')), ('()ef', 'def', '0,1', ascii(('ef', ''))), ('*a', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(*)b', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('$b', 'b', '', ascii(None)), ('a\\', '-', '', regex.error, self.BAD_ESCAPE), ('a\\(b', 'a(b', '', ascii(('a(b',))), ('a\\(*b', 'ab', '0', ascii('ab')), ('a\\(*b', 'a((b', '0', ascii('a((b')), ('a\\\\b', 'a\\b', '0', ascii('a\\b')), ('abc)', '-', '', regex.error, self.TRAILING_CHARS), ('(abc', '-', '', regex.error, self.MISSING_RPAREN), ('((a))', 'abc', '0,1,2', ascii(('a', 'a', 'a'))), ('(a)b(c)', 'abc', '0,1,2', ascii(('abc', 'a', 'c'))), ('a+b+c', 'aabbabc', '0', ascii('abc')), ('a{1,}b{1,}c', 'aabbabc', '0', ascii('abc')), ('a**', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('a.+?c', 'abcabc', '0', ascii('abc')), ('(a+|b)*', 'ab', '0,1', ascii(('ab', 'b'))), ('(a+|b){0,}', 'ab', '0,1', ascii(('ab', 'b'))), ('(a+|b)+', 'ab', '0,1', ascii(('ab', 'b'))), ('(a+|b){1,}', 'ab', '0,1', ascii(('ab', 'b'))), ('(a+|b)?', 'ab', '0,1', ascii(('a', 'a'))), ('(a+|b){0,1}', 'ab', '0,1', ascii(('a', 'a'))), (')(', '-', '', regex.error, self.TRAILING_CHARS), ('[^ab]*', 'cde', '0', ascii('cde')), ('abc', '', '', ascii(None)), ('a*', '', '0', ascii('')), ('([abc])*d', 'abbbcd', '0,1', ascii(('abbbcd', 'c'))), ('([abc])*bcd', 'abcd', '0,1', ascii(('abcd', 'a'))), ('a|b|c|d|e', 'e', '0', ascii('e')), ('(a|b|c|d|e)f', 'ef', '0,1', ascii(('ef', 'e'))), ('abcd*efg', 'abcdefg', '0', ascii('abcdefg')), ('ab*', 'xabyabbbz', '0', ascii('ab')), ('ab*', 'xayabbbz', '0', ascii('a')), ('(ab|cd)e', 'abcde', '0,1', ascii(('cde', 'cd'))), ('[abhgefdc]ij', 'hij', '0', ascii('hij')), ('^(ab|cd)e', 'abcde', '', ascii(None)), ('(abc|)ef', 'abcdef', '0,1', ascii(('ef', ''))), ('(a|b)c*d', 'abcd', '0,1', ascii(('bcd', 'b'))), ('(ab|ab*)bc', 'abc', '0,1', ascii(('abc', 'a'))), ('a([bc]*)c*', 'abc', '0,1', ascii(('abc', 'bc'))), ('a([bc]*)(c*d)', 'abcd', '0,1,2', ascii(('abcd', 'bc', 'd'))), ('a([bc]+)(c*d)', 'abcd', '0,1,2', ascii(('abcd', 'bc', 'd'))), ('a([bc]*)(c+d)', 'abcd', '0,1,2', ascii(('abcd', 'b', 'cd'))), ('a[bcd]*dcdcde', 'adcdcde', '0', ascii('adcdcde')), ('a[bcd]+dcdcde', 'adcdcde', '', ascii(None)), ('(ab|a)b*c', 'abc', '0,1', ascii(('abc', 'ab'))), ('((a)(b)c)(d)', 'abcd', '1,2,3,4', ascii(('abc', 'a', 'b', 'd'))), ('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', '0', ascii('alpha')), ('^a(bc+|b[eh])g|.h$', 'abh', '0,1', ascii(('bh', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'effgz', '0,1,2', ascii(('effgz', 'effgz', None))), ('(bc+d$|ef*g.|h?i(j|k))', 'ij', '0,1,2', ascii(('ij', 'ij', 'j'))), ('(bc+d$|ef*g.|h?i(j|k))', 'effg', '', ascii(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'bcdd', '', ascii(None)), ('(bc+d$|ef*g.|h?i(j|k))', 'reffgz', '0,1,2', ascii(('effgz', 'effgz', None))), ('((((((((((a))))))))))', 'a', '10', ascii('a')), ('((((((((((a))))))))))\\10', 'aa', '0', ascii('aa')), # Python does not have the same rules for \\41 so this is a syntax error # ('((((((((((a))))))))))\\41', 'aa', '', ascii(None)), # ('((((((((((a))))))))))\\41', 'a!', '0', ascii('a!')), ('((((((((((a))))))))))\\41', '', '', regex.error, self.UNKNOWN_GROUP), ('(?i)((((((((((a))))))))))\\41', '', '', regex.error, self.UNKNOWN_GROUP), ('(((((((((a)))))))))', 'a', '0', ascii('a')), ('multiple words of text', 'uh-uh', '', ascii(None)), ('multiple words', 'multiple words, yeah', '0', ascii('multiple words')), ('(.*)c(.*)', 'abcde', '0,1,2', ascii(('abcde', 'ab', 'de'))), ('\\((.*), (.*)\\)', '(a, b)', '2,1', ascii(('b', 'a'))), ('[k]', 'ab', '', ascii(None)), ('a[-]?c', 'ac', '0', ascii('ac')), ('(abc)\\1', 'abcabc', '1', ascii('abc')), ('([a-c]*)\\1', 'abcabc', '1', ascii('abc')), ('(?i)abc', 'ABC', '0', ascii('ABC')), ('(?i)abc', 'XBC', '', ascii(None)), ('(?i)abc', 'AXC', '', ascii(None)), ('(?i)abc', 'ABX', '', ascii(None)), ('(?i)abc', 'XABCY', '0', ascii('ABC')), ('(?i)abc', 'ABABC', '0', ascii('ABC')), ('(?i)ab*c', 'ABC', '0', ascii('ABC')), ('(?i)ab*bc', 'ABC', '0', ascii('ABC')), ('(?i)ab*bc', 'ABBC', '0', ascii('ABBC')), ('(?i)ab*?bc', 'ABBBBC', '0', ascii('ABBBBC')), ('(?i)ab{0,}?bc', 'ABBBBC', '0', ascii('ABBBBC')), ('(?i)ab+?bc', 'ABBC', '0', ascii('ABBC')), ('(?i)ab+bc', 'ABC', '', ascii(None)), ('(?i)ab+bc', 'ABQ', '', ascii(None)), ('(?i)ab{1,}bc', 'ABQ', '', ascii(None)), ('(?i)ab+bc', 'ABBBBC', '0', ascii('ABBBBC')), ('(?i)ab{1,}?bc', 'ABBBBC', '0', ascii('ABBBBC')), ('(?i)ab{1,3}?bc', 'ABBBBC', '0', ascii('ABBBBC')), ('(?i)ab{3,4}?bc', 'ABBBBC', '0', ascii('ABBBBC')), ('(?i)ab{4,5}?bc', 'ABBBBC', '', ascii(None)), ('(?i)ab??bc', 'ABBC', '0', ascii('ABBC')), ('(?i)ab??bc', 'ABC', '0', ascii('ABC')), ('(?i)ab{0,1}?bc', 'ABC', '0', ascii('ABC')), ('(?i)ab??bc', 'ABBBBC', '', ascii(None)), ('(?i)ab??c', 'ABC', '0', ascii('ABC')), ('(?i)ab{0,1}?c', 'ABC', '0', ascii('ABC')), ('(?i)^abc$', 'ABC', '0', ascii('ABC')), ('(?i)^abc$', 'ABCC', '', ascii(None)), ('(?i)^abc', 'ABCC', '0', ascii('ABC')), ('(?i)^abc$', 'AABC', '', ascii(None)), ('(?i)abc$', 'AABC', '0', ascii('ABC')), ('(?i)^', 'ABC', '0', ascii('')), ('(?i)$', 'ABC', '0', ascii('')), ('(?i)a.c', 'ABC', '0', ascii('ABC')), ('(?i)a.c', 'AXC', '0', ascii('AXC')), ('(?i)a.*?c', 'AXYZC', '0', ascii('AXYZC')), ('(?i)a.*c', 'AXYZD', '', ascii(None)), ('(?i)a[bc]d', 'ABC', '', ascii(None)), ('(?i)a[bc]d', 'ABD', '0', ascii('ABD')), ('(?i)a[b-d]e', 'ABD', '', ascii(None)), ('(?i)a[b-d]e', 'ACE', '0', ascii('ACE')), ('(?i)a[b-d]', 'AAC', '0', ascii('AC')), ('(?i)a[-b]', 'A-', '0', ascii('A-')), ('(?i)a[b-]', 'A-', '0', ascii('A-')), ('(?i)a[b-a]', '-', '', regex.error, self.BAD_CHAR_RANGE), ('(?i)a[]b', '-', '', regex.error, self.BAD_SET), ('(?i)a[', '-', '', regex.error, self.BAD_SET), ('(?i)a]', 'A]', '0', ascii('A]')), ('(?i)a[]]b', 'A]B', '0', ascii('A]B')), ('(?i)a[^bc]d', 'AED', '0', ascii('AED')), ('(?i)a[^bc]d', 'ABD', '', ascii(None)), ('(?i)a[^-b]c', 'ADC', '0', ascii('ADC')), ('(?i)a[^-b]c', 'A-C', '', ascii(None)), ('(?i)a[^]b]c', 'A]C', '', ascii(None)), ('(?i)a[^]b]c', 'ADC', '0', ascii('ADC')), ('(?i)ab|cd', 'ABC', '0', ascii('AB')), ('(?i)ab|cd', 'ABCD', '0', ascii('AB')), ('(?i)()ef', 'DEF', '0,1', ascii(('EF', ''))), ('(?i)*a', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(?i)(*)b', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(?i)$b', 'B', '', ascii(None)), ('(?i)a\\', '-', '', regex.error, self.BAD_ESCAPE), ('(?i)a\\(b', 'A(B', '', ascii(('A(B',))), ('(?i)a\\(*b', 'AB', '0', ascii('AB')), ('(?i)a\\(*b', 'A((B', '0', ascii('A((B')), ('(?i)a\\\\b', 'A\\B', '0', ascii('A\\B')), ('(?i)abc)', '-', '', regex.error, self.TRAILING_CHARS), ('(?i)(abc', '-', '', regex.error, self.MISSING_RPAREN), ('(?i)((a))', 'ABC', '0,1,2', ascii(('A', 'A', 'A'))), ('(?i)(a)b(c)', 'ABC', '0,1,2', ascii(('ABC', 'A', 'C'))), ('(?i)a+b+c', 'AABBABC', '0', ascii('ABC')), ('(?i)a{1,}b{1,}c', 'AABBABC', '0', ascii('ABC')), ('(?i)a**', '-', '', regex.error, self.NOTHING_TO_REPEAT), ('(?i)a.+?c', 'ABCABC', '0', ascii('ABC')), ('(?i)a.*?c', 'ABCABC', '0', ascii('ABC')), ('(?i)a.{0,5}?c', 'ABCABC', '0', ascii('ABC')), ('(?i)(a+|b)*', 'AB', '0,1', ascii(('AB', 'B'))), ('(?i)(a+|b){0,}', 'AB', '0,1', ascii(('AB', 'B'))), ('(?i)(a+|b)+', 'AB', '0,1', ascii(('AB', 'B'))), ('(?i)(a+|b){1,}', 'AB', '0,1', ascii(('AB', 'B'))), ('(?i)(a+|b)?', 'AB', '0,1', ascii(('A', 'A'))), ('(?i)(a+|b){0,1}', 'AB', '0,1', ascii(('A', 'A'))), ('(?i)(a+|b){0,1}?', 'AB', '0,1', ascii(('', None))), ('(?i))(', '-', '', regex.error, self.TRAILING_CHARS), ('(?i)[^ab]*', 'CDE', '0', ascii('CDE')), ('(?i)abc', '', '', ascii(None)), ('(?i)a*', '', '0', ascii('')), ('(?i)([abc])*d', 'ABBBCD', '0,1', ascii(('ABBBCD', 'C'))), ('(?i)([abc])*bcd', 'ABCD', '0,1', ascii(('ABCD', 'A'))), ('(?i)a|b|c|d|e', 'E', '0', ascii('E')), ('(?i)(a|b|c|d|e)f', 'EF', '0,1', ascii(('EF', 'E'))), ('(?i)abcd*efg', 'ABCDEFG', '0', ascii('ABCDEFG')), ('(?i)ab*', 'XABYABBBZ', '0', ascii('AB')), ('(?i)ab*', 'XAYABBBZ', '0', ascii('A')), ('(?i)(ab|cd)e', 'ABCDE', '0,1', ascii(('CDE', 'CD'))), ('(?i)[abhgefdc]ij', 'HIJ', '0', ascii('HIJ')), ('(?i)^(ab|cd)e', 'ABCDE', '', ascii(None)), ('(?i)(abc|)ef', 'ABCDEF', '0,1', ascii(('EF', ''))), ('(?i)(a|b)c*d', 'ABCD', '0,1', ascii(('BCD', 'B'))), ('(?i)(ab|ab*)bc', 'ABC', '0,1', ascii(('ABC', 'A'))), ('(?i)a([bc]*)c*', 'ABC', '0,1', ascii(('ABC', 'BC'))), ('(?i)a([bc]*)(c*d)', 'ABCD', '0,1,2', ascii(('ABCD', 'BC', 'D'))), ('(?i)a([bc]+)(c*d)', 'ABCD', '0,1,2', ascii(('ABCD', 'BC', 'D'))), ('(?i)a([bc]*)(c+d)', 'ABCD', '0,1,2', ascii(('ABCD', 'B', 'CD'))), ('(?i)a[bcd]*dcdcde', 'ADCDCDE', '0', ascii('ADCDCDE')), ('(?i)a[bcd]+dcdcde', 'ADCDCDE', '', ascii(None)), ('(?i)(ab|a)b*c', 'ABC', '0,1', ascii(('ABC', 'AB'))), ('(?i)((a)(b)c)(d)', 'ABCD', '1,2,3,4', ascii(('ABC', 'A', 'B', 'D'))), ('(?i)[a-zA-Z_][a-zA-Z0-9_]*', 'ALPHA', '0', ascii('ALPHA')), ('(?i)^a(bc+|b[eh])g|.h$', 'ABH', '0,1', ascii(('BH', None))), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'EFFGZ', '0,1,2', ascii(('EFFGZ', 'EFFGZ', None))), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'IJ', '0,1,2', ascii(('IJ', 'IJ', 'J'))), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'EFFG', '', ascii(None)), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'BCDD', '', ascii(None)), ('(?i)(bc+d$|ef*g.|h?i(j|k))', 'REFFGZ', '0,1,2', ascii(('EFFGZ', 'EFFGZ', None))), ('(?i)((((((((((a))))))))))', 'A', '10', ascii('A')), ('(?i)((((((((((a))))))))))\\10', 'AA', '0', ascii('AA')), #('(?i)((((((((((a))))))))))\\41', 'AA', '', ascii(None)), #('(?i)((((((((((a))))))))))\\41', 'A!', '0', ascii('A!')), ('(?i)(((((((((a)))))))))', 'A', '0', ascii('A')), ('(?i)(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))', 'A', '1', ascii('A')), ('(?i)(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))', 'C', '1', ascii('C')), ('(?i)multiple words of text', 'UH-UH', '', ascii(None)), ('(?i)multiple words', 'MULTIPLE WORDS, YEAH', '0', ascii('MULTIPLE WORDS')), ('(?i)(.*)c(.*)', 'ABCDE', '0,1,2', ascii(('ABCDE', 'AB', 'DE'))), ('(?i)\\((.*), (.*)\\)', '(A, B)', '2,1', ascii(('B', 'A'))), ('(?i)[k]', 'AB', '', ascii(None)), # ('(?i)abcd', 'ABCD', SUCCEED, 'found+"-"+\\found+"-"+\\\\found', ascii(ABCD-$&-\\ABCD)), # ('(?i)a(bc)d', 'ABCD', SUCCEED, 'g1+"-"+\\g1+"-"+\\\\g1', ascii(BC-$1-\\BC)), ('(?i)a[-]?c', 'AC', '0', ascii('AC')), ('(?i)(abc)\\1', 'ABCABC', '1', ascii('ABC')), ('(?i)([a-c]*)\\1', 'ABCABC', '1', ascii('ABC')), ('a(?!b).', 'abad', '0', ascii('ad')), ('a(?=d).', 'abad', '0', ascii('ad')), ('a(?=c|d).', 'abad', '0', ascii('ad')), ('a(?:b|c|d)(.)', 'ace', '1', ascii('e')), ('a(?:b|c|d)*(.)', 'ace', '1', ascii('e')), ('a(?:b|c|d)+?(.)', 'ace', '1', ascii('e')), ('a(?:b|(c|e){1,2}?|d)+?(.)', 'ace', '1,2', ascii(('c', 'e'))), # Lookbehind: split by : but not if it is escaped by -. ('(?]*?b', 'a>b', '', ascii(None)), # Bug 490573: minimizing repeat problem. (r'^a*?$', 'foo', '', ascii(None)), # Bug 470582: nested groups problem. (r'^((a)c)?(ab)$', 'ab', '1,2,3', ascii((None, None, 'ab'))), # Another minimizing repeat problem (capturing groups in assertions). ('^([ab]*?)(?=(b)?)c', 'abc', '1,2', ascii(('ab', None))), ('^([ab]*?)(?!(b))c', 'abc', '1,2', ascii(('ab', None))), ('^([ab]*?)(?(.){0,2})d", "abcd").captures(1), ['b', 'c']) self.assertEqual(regex.search(r"(.)+", "a").captures(1), ['a']) def test_guards(self): m = regex.search(r"(X.*?Y\s*){3}(X\s*)+AB:", "XY\nX Y\nX Y\nXY\nXX AB:") self.assertEqual(m.span(0, 1, 2), ((3, 21), (12, 15), (16, 18))) m = regex.search(r"(X.*?Y\s*){3,}(X\s*)+AB:", "XY\nX Y\nX Y\nXY\nXX AB:") self.assertEqual(m.span(0, 1, 2), ((0, 21), (12, 15), (16, 18))) m = regex.search(r'\d{4}(\s*\w)?\W*((?!\d)\w){2}', "9999XX") self.assertEqual(m.span(0, 1, 2), ((0, 6), (-1, -1), (5, 6))) m = regex.search(r'A\s*?.*?(\n+.*?\s*?){0,2}\(X', 'A\n1\nS\n1 (X') self.assertEqual(m.span(0, 1), ((0, 10), (5, 8))) m = regex.search('Derde\s*:', 'aaaaaa:\nDerde:') self.assertEqual(m.span(), (8, 14)) m = regex.search('Derde\s*:', 'aaaaa:\nDerde:') self.assertEqual(m.span(), (7, 13)) def test_turkic(self): # Turkish has dotted and dotless I/i. pairs = "I=i;I=\u0131;i=\u0130" all_chars = set() matching = set() for pair in pairs.split(";"): ch1, ch2 = pair.split("=") all_chars.update((ch1, ch2)) matching.add((ch1, ch1)) matching.add((ch1, ch2)) matching.add((ch2, ch1)) matching.add((ch2, ch2)) for ch1 in all_chars: for ch2 in all_chars: m = regex.match(r"(?i)\A" + ch1 + r"\Z", ch2) if m: if (ch1, ch2) not in matching: self.fail("{} matching {}".format(ascii(ch1), ascii(ch2))) else: if (ch1, ch2) in matching: self.fail("{} not matching {}".format(ascii(ch1), ascii(ch2))) def test_named_lists(self): options = ["one", "two", "three"] self.assertEqual(regex.match(r"333\L444", "333one444", bar=options).group(), "333one444") self.assertEqual(regex.match(r"(?i)333\L444", "333TWO444", bar=options).group(), "333TWO444") self.assertEqual(regex.match(r"333\L444", "333four444", bar=options), None) options = [b"one", b"two", b"three"] self.assertEqual(regex.match(br"333\L444", b"333one444", bar=options).group(), b"333one444") self.assertEqual(regex.match(br"(?i)333\L444", b"333TWO444", bar=options).group(), b"333TWO444") self.assertEqual(regex.match(br"333\L444", b"333four444", bar=options), None) self.assertEqual(repr(type(regex.compile(r"3\L4\L+5", bar=["one", "two", "three"]))), self.PATTERN_CLASS) self.assertEqual(regex.findall(r"^\L", "solid QWERT", options=set(['good', 'brilliant', '+s\\ol[i}d'])), []) self.assertEqual(regex.findall(r"^\L", "+solid QWERT", options=set(['good', 'brilliant', '+solid'])), ['+solid']) options = ["STRASSE"] self.assertEqual(regex.match(r"(?fi)\L", "stra\N{LATIN SMALL LETTER SHARP S}e", words=options).span(), (0, 6)) options = ["STRASSE", "stress"] self.assertEqual(regex.match(r"(?fi)\L", "stra\N{LATIN SMALL LETTER SHARP S}e", words=options).span(), (0, 6)) options = ["stra\N{LATIN SMALL LETTER SHARP S}e"] self.assertEqual(regex.match(r"(?fi)\L", "STRASSE", words=options).span(), (0, 7)) options = ["kit"] self.assertEqual(regex.search(r"(?i)\L", "SKITS", words=options).span(), (1, 4)) self.assertEqual(regex.search(r"(?i)\L", "SK\N{LATIN CAPITAL LETTER I WITH DOT ABOVE}TS", words=options).span(), (1, 4)) self.assertEqual(regex.search(r"(?fi)\b(\w+) +\1\b", " stra\N{LATIN SMALL LETTER SHARP S}e STRASSE ").span(), (1, 15)) self.assertEqual(regex.search(r"(?fi)\b(\w+) +\1\b", " STRASSE stra\N{LATIN SMALL LETTER SHARP S}e ").span(), (1, 15)) self.assertEqual(regex.search(r"^\L$", "", options=[]).span(), (0, 0)) def test_fuzzy(self): # Some tests borrowed from TRE library tests. self.assertEqual(repr(type(regex.compile('(fou){s,e<=1}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(fuu){s}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(fuu){s,e}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(anaconda){1i+1d<1,s<=1}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(anaconda){1i+1d<1,s<=1,e<=10}'))), self.PATTERN_CLASS) self.assertEqual(repr(type(regex.compile('(anaconda){s<=1,e<=1,1i+1d<1}'))), self.PATTERN_CLASS) text = 'molasses anaconda foo bar baz smith anderson ' self.assertEqual(regex.search('(znacnda){s<=1,e<=3,1i+1d<1}', text), None) self.assertEqual(regex.search('(znacnda){s<=1,e<=3,1i+1d<2}', text).span(0, 1), ((9, 17), (9, 17))) self.assertEqual(regex.search('(ananda){1i+1d<2}', text), None) self.assertEqual(regex.search(r"(?:\bznacnda){e<=2}", text)[0], "anaconda") self.assertEqual(regex.search(r"(?:\bnacnda){e<=2}", text)[0], "anaconda") text = 'anaconda foo bar baz smith anderson' self.assertEqual(regex.search('(fuu){i<=3,d<=3,e<=5}', text).span(0, 1), ((0, 0), (0, 0))) self.assertEqual(regex.search('(?b)(fuu){i<=3,d<=3,e<=5}', text).span(0, 1), ((9, 10), (9, 10))) self.assertEqual(regex.search('(fuu){i<=2,d<=2,e<=5}', text).span(0, 1), ((7, 10), (7, 10))) self.assertEqual(regex.search('(?e)(fuu){i<=2,d<=2,e<=5}', text).span(0, 1), ((9, 10), (9, 10))) self.assertEqual(regex.search('(fuu){i<=3,d<=3,e}', text).span(0, 1), ((0, 0), (0, 0))) self.assertEqual(regex.search('(?b)(fuu){i<=3,d<=3,e}', text).span(0, 1), ((9, 10), (9, 10))) self.assertEqual(repr(type(regex.compile('(approximate){s<=3,1i+1d<3}'))), self.PATTERN_CLASS) # No cost limit. self.assertEqual(regex.search('(foobar){e}', 'xirefoabralfobarxie').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('(?e)(foobar){e}', 'xirefoabralfobarxie').span(0, 1), ((0, 3), (0, 3))) self.assertEqual(regex.search('(?b)(foobar){e}', 'xirefoabralfobarxie').span(0, 1), ((11, 16), (11, 16))) # At most two errors. self.assertEqual(regex.search('(foobar){e<=2}', 'xirefoabrzlfd').span(0, 1), ((4, 9), (4, 9))) self.assertEqual(regex.search('(foobar){e<=2}', 'xirefoabzlfd'), None) # At most two inserts or substitutions and max two errors total. self.assertEqual(regex.search('(foobar){i<=2,s<=2,e<=2}', 'oobargoobaploowap').span(0, 1), ((5, 11), (5, 11))) # Find best whole word match for "foobar". self.assertEqual(regex.search('\\b(foobar){e}\\b', 'zfoobarz').span(0, 1), ((0, 8), (0, 8))) self.assertEqual(regex.search('\\b(foobar){e}\\b', 'boing zfoobarz goobar woop').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('(?b)\\b(foobar){e}\\b', 'boing zfoobarz goobar woop').span(0, 1), ((15, 21), (15, 21))) # Match whole string, allow only 1 error. self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobar').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xfoobar').span(0, 1), ((0, 7), (0, 7))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobarx').span(0, 1), ((0, 7), (0, 7))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'fooxbar').span(0, 1), ((0, 7), (0, 7))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foxbar').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xoobar').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobax').span(0, 1), ((0, 6), (0, 6))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'oobar').span(0, 1), ((0, 5), (0, 5))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'fobar').span(0, 1), ((0, 5), (0, 5))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'fooba').span(0, 1), ((0, 5), (0, 5))) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xfoobarx'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foobarxx'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xxfoobar'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'xfoxbar'), None) self.assertEqual(regex.search('^(foobar){e<=1}$', 'foxbarx'), None) # At most one insert, two deletes, and three substitutions. # Additionally, deletes cost two and substitutes one, and total # cost must be less than 4. self.assertEqual(regex.search('(foobar){i<=1,d<=2,s<=3,2d+1s<4}', '3oifaowefbaoraofuiebofasebfaobfaorfeoaro').span(0, 1), ((6, 13), (6, 13))) self.assertEqual(regex.search('(?b)(foobar){i<=1,d<=2,s<=3,2d+1s<4}', '3oifaowefbaoraofuiebofasebfaobfaorfeoaro').span(0, 1), ((26, 33), (26, 33))) # Partially fuzzy matches. self.assertEqual(regex.search('foo(bar){e<=1}zap', 'foobarzap').span(0, 1), ((0, 9), (3, 6))) self.assertEqual(regex.search('foo(bar){e<=1}zap', 'fobarzap'), None) self.assertEqual(regex.search('foo(bar){e<=1}zap', 'foobrzap').span(0, 1), ((0, 8), (3, 5))) text = ('www.cnn.com 64.236.16.20\nwww.slashdot.org 66.35.250.150\n' 'For useful information, use www.slashdot.org\nthis is demo data!\n') self.assertEqual(regex.search(r'(?s)^.*(dot.org){e}.*$', text).span(0, 1), ((0, 120), (120, 120))) self.assertEqual(regex.search(r'(?es)^.*(dot.org){e}.*$', text).span(0, 1), ((0, 120), (93, 100))) self.assertEqual(regex.search(r'^.*(dot.org){e}.*$', text).span(0, 1), ((0, 119), (24, 101))) # Behaviour is unexpected, but arguably not wrong. It first finds the # best match, then the best in what follows, etc. self.assertEqual(regex.findall(r"\b\L{e<=1}\b", " book cot dog desk ", words="cat dog".split()), ["cot", "dog"]) self.assertEqual(regex.findall(r"\b\L{e<=1}\b", " book dog cot desk ", words="cat dog".split()), [" dog", "cot"]) self.assertEqual(regex.findall(r"(?e)\b\L{e<=1}\b", " book dog cot desk ", words="cat dog".split()), ["dog", "cot"]) self.assertEqual(regex.findall(r"(?r)\b\L{e<=1}\b", " book cot dog desk ", words="cat dog".split()), ["dog ", "cot"]) self.assertEqual(regex.findall(r"(?er)\b\L{e<=1}\b", " book cot dog desk ", words="cat dog".split()), ["dog", "cot"]) self.assertEqual(regex.findall(r"(?r)\b\L{e<=1}\b", " book dog cot desk ", words="cat dog".split()), ["cot", "dog"]) self.assertEqual(regex.findall(br"\b\L{e<=1}\b", b" book cot dog desk ", words=b"cat dog".split()), [b"cot", b"dog"]) self.assertEqual(regex.findall(br"\b\L{e<=1}\b", b" book dog cot desk ", words=b"cat dog".split()), [b" dog", b"cot"]) self.assertEqual(regex.findall(br"(?e)\b\L{e<=1}\b", b" book dog cot desk ", words=b"cat dog".split()), [b"dog", b"cot"]) self.assertEqual(regex.findall(br"(?r)\b\L{e<=1}\b", b" book cot dog desk ", words=b"cat dog".split()), [b"dog ", b"cot"]) self.assertEqual(regex.findall(br"(?er)\b\L{e<=1}\b", b" book cot dog desk ", words=b"cat dog".split()), [b"dog", b"cot"]) self.assertEqual(regex.findall(br"(?r)\b\L{e<=1}\b", b" book dog cot desk ", words=b"cat dog".split()), [b"cot", b"dog"]) self.assertEqual(regex.search(r"(\w+) (\1{e<=1})", "foo fou").groups(), ("foo", "fou")) self.assertEqual(regex.search(r"(?r)(\2{e<=1}) (\w+)", "foo fou").groups(), ("foo", "fou")) self.assertEqual(regex.search(br"(\w+) (\1{e<=1})", b"foo fou").groups(), (b"foo", b"fou")) self.assertEqual(regex.findall(r"(?:(?:QR)+){e}","abcde"), ["abcde", ""]) self.assertEqual(regex.findall(r"(?:Q+){e}","abc"), ["abc", ""]) # Hg issue 41. self.assertEqual(regex.match(r"(?:service detection){0[^()]+)|(?R))*\)", "(ab(cd)ef)")[ : ], ("(ab(cd)ef)", "ef")) self.assertEqual(regex.search(r"\(((?>[^()]+)|(?R))*\)", "(ab(cd)ef)").captures(1), ["ab", "cd", "(cd)", "ef"]) self.assertEqual(regex.search(r"(?r)\(((?R)|(?>[^()]+))*\)", "(ab(cd)ef)")[ : ], ("(ab(cd)ef)", "ab")) self.assertEqual(regex.search(r"(?r)\(((?R)|(?>[^()]+))*\)", "(ab(cd)ef)").captures(1), ["ef", "cd", "(cd)", "ab"]) self.assertEqual(regex.search(r"\(([^()]+|(?R))*\)", "some text (a(b(c)d)e) more text")[ : ], ("(a(b(c)d)e)", "e")) self.assertEqual(regex.search(r"(?r)\(((?R)|[^()]+)*\)", "some text (a(b(c)d)e) more text")[ : ], ("(a(b(c)d)e)", "a")) self.assertEqual(regex.search(r"(foo(\(((?:(?>[^()]+)|(?2))*)\)))", "foo(bar(baz)+baz(bop))")[ : ], ("foo(bar(baz)+baz(bop))", "foo(bar(baz)+baz(bop))", "(bar(baz)+baz(bop))", "bar(baz)+baz(bop)")) self.assertEqual(regex.search(r"(?r)(foo(\(((?:(?2)|(?>[^()]+))*)\)))", "foo(bar(baz)+baz(bop))")[ : ], ("foo(bar(baz)+baz(bop))", "foo(bar(baz)+baz(bop))", "(bar(baz)+baz(bop))", "bar(baz)+baz(bop)")) rgx = regex.compile(r"""^\s*(<\s*([a-zA-Z:]+)(?:\s*[a-zA-Z:]*\s*=\s*(?:'[^']*'|"[^"]*"))*\s*(/\s*)?>(?:[^<>]*|(?1))*(?(3)|<\s*/\s*\2\s*>))\s*$""") self.assertEqual(bool(rgx.search('')), True) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), True) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), False) self.assertEqual(bool(rgx.search('')), True) self.assertEqual(bool(rgx.search('< fooo / >')), True) # The next regex should and does match. Perl 5.14 agrees. #self.assertEqual(bool(rgx.search('foo')), False) self.assertEqual(bool(rgx.search('foo')), False) self.assertEqual(bool(rgx.search('foo')), True) self.assertEqual(bool(rgx.search('foo')), True) self.assertEqual(bool(rgx.search('')), True) def test_copy(self): # PatternObjects are immutable, therefore there's no need to clone them. r = regex.compile("a") self.assert_(copy.copy(r) is r) self.assert_(copy.deepcopy(r) is r) # MatchObjects are normally mutable because the target string can be # detached. However, after the target string has been detached, a # MatchObject becomes immutable, so there's no need to clone it. m = r.match("a") self.assert_(copy.copy(m) is not m) self.assert_(copy.deepcopy(m) is not m) self.assert_(m.string is not None) m2 = copy.copy(m) m2.detach_string() self.assert_(m.string is not None) self.assert_(m2.string is None) # The following behaviour matches that of the re module. it = regex.finditer(".", "ab") it2 = copy.copy(it) self.assertEqual(next(it).group(), "a") self.assertEqual(next(it2).group(), "b") # The following behaviour matches that of the re module. it = regex.finditer(".", "ab") it2 = copy.deepcopy(it) self.assertEqual(next(it).group(), "a") self.assertEqual(next(it2).group(), "b") # The following behaviour is designed to match that of copying 'finditer'. it = regex.splititer(" ", "a b") it2 = copy.copy(it) self.assertEqual(next(it), "a") self.assertEqual(next(it2), "b") # The following behaviour is designed to match that of copying 'finditer'. it = regex.splititer(" ", "a b") it2 = copy.deepcopy(it) self.assertEqual(next(it), "a") self.assertEqual(next(it2), "b") def test_format(self): self.assertEqual(regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar"), "foo bar => bar foo") self.assertEqual(regex.subf(r"(?\w+) (?\w+)", "{word2} {word1}", "foo bar"), "bar foo") self.assertEqual(regex.subfn(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar"), ("foo bar => bar foo", 1)) self.assertEqual(regex.subfn(r"(?\w+) (?\w+)", "{word2} {word1}", "foo bar"), ("bar foo", 1)) self.assertEqual(regex.match(r"(\w+) (\w+)", "foo bar").expandf("{0} => {2} {1}"), "foo bar => bar foo") def test_fullmatch(self): self.assertEqual(bool(regex.fullmatch(r"abc", "abc")), True) self.assertEqual(bool(regex.fullmatch(r"abc", "abcx")), False) self.assertEqual(bool(regex.fullmatch(r"abc", "abcx", endpos=3)), True) self.assertEqual(bool(regex.fullmatch(r"abc", "xabc", pos=1)), True) self.assertEqual(bool(regex.fullmatch(r"abc", "xabcy", pos=1)), False) self.assertEqual(bool(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4)), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "abc")), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "abcx")), False) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "abcx", endpos=3)), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "xabc", pos=1)), True) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "xabcy", pos=1)), False) self.assertEqual(bool(regex.fullmatch(r"(?r)abc", "xabcy", pos=1, endpos=4)), True) def test_issue_18468(self): # Applies only after Python 3.4 for compatibility with re. if (sys.version_info.major, sys.version_info.minor) < (3, 4): return self.assertTypedEqual(regex.sub('y', 'a', 'xyz'), 'xaz') self.assertTypedEqual(regex.sub('y', StrSubclass('a'), StrSubclass('xyz')), 'xaz') self.assertTypedEqual(regex.sub(b'y', b'a', b'xyz'), b'xaz') self.assertTypedEqual(regex.sub(b'y', BytesSubclass(b'a'), BytesSubclass(b'xyz')), b'xaz') self.assertTypedEqual(regex.sub(b'y', bytearray(b'a'), bytearray(b'xyz')), b'xaz') self.assertTypedEqual(regex.sub(b'y', memoryview(b'a'), memoryview(b'xyz')), b'xaz') for string in ":a:b::c", StrSubclass(":a:b::c"): self.assertTypedEqual(regex.split(":", string), ['', 'a', 'b', '', 'c']) self.assertTypedEqual(regex.split(":*", string), ['', 'a', 'b', 'c']) self.assertTypedEqual(regex.split("(:*)", string), ['', ':', 'a', ':', 'b', '::', 'c']) for string in (b":a:b::c", BytesSubclass(b":a:b::c"), bytearray(b":a:b::c"), memoryview(b":a:b::c")): self.assertTypedEqual(regex.split(b":", string), [b'', b'a', b'b', b'', b'c']) self.assertTypedEqual(regex.split(b":*", string), [b'', b'a', b'b', b'c']) self.assertTypedEqual(regex.split(b"(:*)", string), [b'', b':', b'a', b':', b'b', b'::', b'c']) for string in "a:b::c:::d", StrSubclass("a:b::c:::d"): self.assertTypedEqual(regex.findall(":+", string), [":", "::", ":::"]) self.assertTypedEqual(regex.findall("(:+)", string), [":", "::", ":::"]) self.assertTypedEqual(regex.findall("(:)(:*)", string), [(":", ""), (":", ":"), (":", "::")]) for string in (b"a:b::c:::d", BytesSubclass(b"a:b::c:::d"), bytearray(b"a:b::c:::d"), memoryview(b"a:b::c:::d")): self.assertTypedEqual(regex.findall(b":+", string), [b":", b"::", b":::"]) self.assertTypedEqual(regex.findall(b"(:+)", string), [b":", b"::", b":::"]) self.assertTypedEqual(regex.findall(b"(:)(:*)", string), [(b":", b""), (b":", b":"), (b":", b"::")]) for string in 'a', StrSubclass('a'): self.assertEqual(regex.match('a', string).groups(), ()) self.assertEqual(regex.match('(a)', string).groups(), ('a',)) self.assertEqual(regex.match('(a)', string).group(0), 'a') self.assertEqual(regex.match('(a)', string).group(1), 'a') self.assertEqual(regex.match('(a)', string).group(1, 1), ('a', 'a')) for string in (b'a', BytesSubclass(b'a'), bytearray(b'a'), memoryview(b'a')): self.assertEqual(regex.match(b'a', string).groups(), ()) self.assertEqual(regex.match(b'(a)', string).groups(), (b'a',)) self.assertEqual(regex.match(b'(a)', string).group(0), b'a') self.assertEqual(regex.match(b'(a)', string).group(1), b'a') self.assertEqual(regex.match(b'(a)', string).group(1, 1), (b'a', b'a')) def test_hg_bugs(self): # Hg issue 28. self.assertEqual(bool(regex.compile("(?>b)", flags=regex.V1)), True) # Hg issue 29. self.assertEqual(bool(regex.compile("^((?>\w+)|(?>\s+))*$", flags=regex.V1)), True) # Hg issue 31. self.assertEqual(regex.findall(r"\((?:(?>[^()]+)|(?R))*\)", "a(bcd(e)f)g(h)"), ['(bcd(e)f)', '(h)']) self.assertEqual(regex.findall(r"\((?:(?:[^()]+)|(?R))*\)", "a(bcd(e)f)g(h)"), ['(bcd(e)f)', '(h)']) self.assertEqual(regex.findall(r"\((?:(?>[^()]+)|(?R))*\)", "a(b(cd)e)f)g)h"), ['(b(cd)e)']) self.assertEqual(regex.findall(r"\((?:(?>[^()]+)|(?R))*\)", "a(bc(d(e)f)gh"), ['(d(e)f)']) self.assertEqual(regex.findall(r"(?r)\((?:(?>[^()]+)|(?R))*\)", "a(bc(d(e)f)gh"), ['(d(e)f)']) self.assertEqual([m.group() for m in regex.finditer(r"\((?:[^()]*+|(?0))*\)", "a(b(c(de)fg)h")], ['(c(de)fg)']) # Hg issue 32. self.assertEqual(regex.search("a(bc)d", "abcd", regex.I | regex.V1).group(0), "abcd") # Hg issue 33. self.assertEqual(regex.search("([\da-f:]+)$", "E", regex.I | regex.V1).group(0), "E") self.assertEqual(regex.search("([\da-f:]+)$", "e", regex.I | regex.V1).group(0), "e") # Hg issue 34. self.assertEqual(regex.search("^(?=ab(de))(abd)(e)", "abde").groups(), ('de', 'abd', 'e')) # Hg issue 35. self.assertEqual(bool(regex.match(r"\ ", " ", flags=regex.X)), True) # Hg issue 36. self.assertEqual(regex.search(r"^(a|)\1{2}b", "b").group(0, 1), ('b', '')) # Hg issue 37. self.assertEqual(regex.search("^(a){0,0}", "abc").group(0, 1), ('', None)) # Hg issue 38. self.assertEqual(regex.search("(?>.*/)b", "a/b").group(0), "a/b") # Hg issue 39. self.assertEqual(regex.search(r"(?V0)((?i)blah)\s+\1", "blah BLAH").group(0, 1), ("blah BLAH", "blah")) self.assertEqual(regex.search(r"(?V1)((?i)blah)\s+\1", "blah BLAH"), None) # Hg issue 40. self.assertEqual(regex.search(r"(\()?[^()]+(?(1)\)|)", "(abcd").group(0), "abcd") # Hg issue 42. self.assertEqual(regex.search("(a*)*", "a").span(1), (1, 1)) self.assertEqual(regex.search("(a*)*", "aa").span(1), (2, 2)) self.assertEqual(regex.search("(a*)*", "aaa").span(1), (3, 3)) # Hg issue 43. self.assertEqual(regex.search("a(?#xxx)*", "aaa").group(), "aaa") # Hg issue 44. self.assertEqual(regex.search("(?=abc){3}abc", "abcabcabc").span(), (0, 3)) # Hg issue 45. self.assertEqual(regex.search("^(?:a(?:(?:))+)+", "a").span(), (0, 1)) self.assertEqual(regex.search("^(?:a(?:(?:))+)+", "aa").span(), (0, 2)) # Hg issue 46. self.assertEqual(regex.search("a(?x: b c )d", "abcd").group(0), "abcd") # Hg issue 47. self.assertEqual(regex.search("a#comment\n*", "aaa", flags=regex.X).group(0), "aaa") # Hg issue 48. self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){1}", "aaaaaaaaaa").span(0, 1), ((0, 1), (0, 1))) self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){2}", "aaaaaaaaaa").span(0, 1), ((0, 3), (1, 3))) self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){3}", "aaaaaaaaaa").span(0, 1), ((0, 6), (3, 6))) self.assertEqual(regex.search(r"(?V1)(a(?(1)\1)){4}", "aaaaaaaaaa").span(0, 1), ((0, 10), (6, 10))) # Hg issue 49. self.assertEqual(regex.search("(?V1)(a)(?<=b(?1))", "baz").group(0), "a") # Hg issue 50. self.assertEqual(regex.findall(r'(?fi)\L', 'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05', keywords=['post','pos']), ['POST', 'Post', 'post', 'po\u017Ft', 'po\uFB06', 'po\uFB05']) self.assertEqual(regex.findall(r'(?fi)pos|post', 'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05'), ['POS', 'Pos', 'pos', 'po\u017F', 'po\uFB06', 'po\uFB05']) self.assertEqual(regex.findall(r'(?fi)post|pos', 'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05'), ['POST', 'Post', 'post', 'po\u017Ft', 'po\uFB06', 'po\uFB05']) self.assertEqual(regex.findall(r'(?fi)post|another', 'POST, Post, post, po\u017Ft, po\uFB06, and po\uFB05'), ['POST', 'Post', 'post', 'po\u017Ft', 'po\uFB06', 'po\uFB05']) # Hg issue 51. self.assertEqual(regex.search("(?V1)((a)(?1)|(?2))", "a").group(0, 1, 2), ('a', 'a', None)) # Hg issue 52. self.assertEqual(regex.search(r"(?V1)(\1xx|){6}", "xx").span(0, 1), ((0, 2), (2, 2))) # Hg issue 53. self.assertEqual(regex.search("(a|)+", "a").group(0, 1), ("a", "")) # Hg issue 54. self.assertEqual(regex.search(r"(a|)*\d", "a" * 80), None) # Hg issue 55. self.assertEqual(regex.search("^(?:a?b?)*$", "ac"), None) # Hg issue 58. self.assertRaisesRegex(regex.error, self.UNDEF_CHAR_NAME, lambda: regex.compile("\\N{1}")) # Hg issue 59. self.assertEqual(regex.search("\\Z", "a\na\n").span(0), (4, 4)) # Hg issue 60. self.assertEqual(regex.search("(q1|.)*(q2|.)*(x(a|bc)*y){2,}", "xayxay").group(0), "xayxay") # Hg issue 61. self.assertEqual(regex.search("(?i)[^a]", "A"), None) # Hg issue 63. self.assertEqual(regex.search("(?i)[[:ascii:]]", "\N{KELVIN SIGN}"), None) # Hg issue 66. self.assertEqual(regex.search("((a|b(?1)c){3,5})", "baaaaca").group(0, 1, 2), ('aaaa', 'aaaa', 'a')) # Hg issue 71. self.assertEqual(regex.findall(r"(?<=:\S+ )\w+", ":9 abc :10 def"), ['abc', 'def']) self.assertEqual(regex.findall(r"(?<=:\S* )\w+", ":9 abc :10 def"), ['abc', 'def']) self.assertEqual(regex.findall(r"(?<=:\S+? )\w+", ":9 abc :10 def"), ['abc', 'def']) self.assertEqual(regex.findall(r"(?<=:\S*? )\w+", ":9 abc :10 def"), ['abc', 'def']) # Hg issue 73. self.assertEqual(regex.search(r"(?:fe)?male", "female").group(), "female") self.assertEqual([m.group() for m in regex.finditer(r"(fe)?male: h(?(1)(er)|(is)) (\w+)", "female: her dog; male: his cat. asdsasda")], ['female: her dog', 'male: his cat']) # Hg issue 78. self.assertEqual(regex.search(r'(?\((?:[^()]++|(?&rec))*\))', 'aaa(((1+0)+1)+1)bbb').captures('rec'), ['(1+0)', '((1+0)+1)', '(((1+0)+1)+1)']) # Hg issue 80. self.assertRaisesRegex(regex.error, self.BAD_ESCAPE, lambda: regex.sub('x', '\\', 'x'), ) # Hg issue 82. fz = "(CAGCCTCCCATTTCAGAATATACATCC){1a(?b))', "ab").spans("x"), [(1, 2), (0, 2)]) # Hg issue 91. # Check that the replacement cache works. self.assertEqual(regex.sub(r'(-)', lambda m: m.expand(r'x'), 'a-b-c'), 'axbxc') # Hg issue 94. rx = regex.compile(r'\bt(est){i<2}', flags=regex.V1) self.assertEqual(rx.search("Some text"), None) self.assertEqual(rx.findall("Some text"), []) # Hg issue 95. self.assertRaisesRegex(regex.error, '^nothing to repeat at position 3$', lambda: regex.compile(r'.???')) # Hg issue 97. self.assertEquals(regex.escape('foo!?'), 'foo\\!\\?') self.assertEquals(regex.escape('foo!?', special_only=True), 'foo!\\?') self.assertEquals(regex.escape(b'foo!?'), b'foo\\!\\?') self.assertEquals(regex.escape(b'foo!?', special_only=True), b'foo!\\?') # Hg issue 100. self.assertEquals(regex.search('^([^z]*(?:WWWi|W))?$', 'WWWi').groups(), ('WWWi', )) self.assertEquals(regex.search('^([^z]*(?:WWWi|w))?$', 'WWWi').groups(), ('WWWi', )) self.assertEquals(regex.search('^([^z]*?(?:WWWi|W))?$', 'WWWi').groups(), ('WWWi', )) # Hg issue 101. pat = regex.compile(r'xxx', flags=regex.FULLCASE | regex.UNICODE) self.assertEquals([x.group() for x in pat.finditer('yxxx')], ['xxx']) self.assertEquals(pat.findall('yxxx'), ['xxx']) raw = 'yxxx' self.assertEquals([x.group() for x in pat.finditer(raw)], ['xxx']) self.assertEquals(pat.findall(raw), ['xxx']) pat = regex.compile(r'xxx', flags=regex.FULLCASE | regex.IGNORECASE | regex.UNICODE) self.assertEquals([x.group() for x in pat.finditer('yxxx')], ['xxx']) self.assertEquals(pat.findall('yxxx'), ['xxx']) raw = 'yxxx' self.assertEquals([x.group() for x in pat.finditer(raw)], ['xxx']) self.assertEquals(pat.findall(raw), ['xxx']) # Hg issue 106. self.assertEquals(regex.sub('(?V0).*', 'x', 'test'), 'x') self.assertEquals(regex.sub('(?V1).*', 'x', 'test'), 'xx') self.assertEquals(regex.sub('(?V0).*?', '|', 'test'), '|t|e|s|t|') self.assertEquals(regex.sub('(?V1).*?', '|', 'test'), '|||||||||') if sys.version_info < (3, 2, 0): # In Python 3.1 it's called assertRaisesRegexp. RegexTests.assertRaisesRegex = RegexTests.assertRaisesRegexp def test_main(): run_unittest(RegexTests) if __name__ == "__main__": test_main() regex-2014.02.16/Python3/_regex.c0000666000000000000000000226521112300213253014334 0ustar 00000000000000/* Secret Labs' Regular Expression Engine * * regular expression matching engine * * partial history: * 1999-10-24 fl created (based on existing template matcher code) * 2000-03-06 fl first alpha, sort of * 2000-08-01 fl fixes for 1.6b1 * 2000-08-07 fl use PyOS_CheckStack() if available * 2000-09-20 fl added expand method * 2001-03-20 fl lots of fixes for 2.1b2 * 2001-04-15 fl export copyright as Python attribute, not global * 2001-04-28 fl added __copy__ methods (work in progress) * 2001-05-14 fl fixes for 1.5.2 compatibility * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) * 2001-10-20 fl added split primitive; reenable unicode for 1.6/2.0/2.1 * 2001-10-21 fl added sub/subn primitive * 2001-10-24 fl added finditer primitive (for 2.2 only) * 2001-12-07 fl fixed memory leak in sub/subn (Guido van Rossum) * 2002-11-09 fl fixed empty sub/subn return type * 2003-04-18 mvl fully support 4-byte codes * 2003-10-17 gn implemented non recursive scheme * 2009-07-26 mrab completely re-designed matcher code * 2011-11-18 mrab added support for PEP 393 strings * * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * * This version of the SRE library can be redistributed under CNRI's * Python 1.6 license. For any other use, please contact Secret Labs * AB (info@pythonware.com). * * Portions of this engine have been developed in cooperation with * CNRI. Hewlett-Packard provided funding for 1.6 integration and * other compatibility work. */ /* #define VERBOSE */ #if defined(VERBOSE) #define TRACE(X) printf X; #else #define TRACE(X) #endif #include "Python.h" #include "structmember.h" /* offsetof */ #include #include "_regex.h" #include "pyport.h" #include "pythread.h" #define RE_MIN(X, Y) ((X) <= (Y) ? (X) : (Y)) #define RE_MAX(X, Y) ((X) >= (Y) ? (X) : (Y)) #if PY_VERSION_HEX < 0x03030000 typedef unsigned char Py_UCS1; typedef unsigned short Py_UCS2; #endif typedef RE_UINT32 RE_CODE; /* Case-sensitive letters in the General Category. */ #define RE_PROP_GC_LU ((RE_PROP_GC << 16) | RE_PROP_LU) #define RE_PROP_GC_LL ((RE_PROP_GC << 16) | RE_PROP_LL) #define RE_PROP_GC_LT ((RE_PROP_GC << 16) | RE_PROP_LT) /* Unlimited repeat count. */ #define RE_UNLIMITED (~(RE_CODE)0) /* The status of a node. */ typedef unsigned short RE_STATUS_T; /* Whether to match concurrently, i.e. release the GIL while matching. */ #define RE_CONC_NO 0 #define RE_CONC_YES 1 #define RE_CONC_DEFAULT 2 /* Flags for the kind of 'sub' call: 'sub', 'subn', 'subf', 'subfn'. */ #define RE_SUB 0x0 #define RE_SUBN 0x1 #define RE_SUBF 0x2 /* The name of this module, minus the leading underscore. */ #define RE_MODULE "regex" #define RE_MODULE_UPPER "REGEX" /* Error codes. */ #define RE_ERROR_SUCCESS 1 /* Successful match. */ #define RE_ERROR_FAILURE 0 /* Unsuccessful match. */ #define RE_ERROR_ILLEGAL -1 /* Illegal code. */ #define RE_ERROR_INTERNAL -2 /* Internal error. */ #define RE_ERROR_CONCURRENT -3 /* "concurrent" invalid. */ #define RE_ERROR_MEMORY -9 /* Out of memory. */ #define RE_ERROR_INTERRUPTED -10 /* Signal handler raised exception. */ #define RE_ERROR_REPLACEMENT -11 /* Invalid replacement string. */ #define RE_ERROR_INVALID_GROUP_REF -12 /* Invalid group reference. */ #define RE_ERROR_GROUP_INDEX_TYPE -13 /* Group index type error. */ #define RE_ERROR_NO_SUCH_GROUP -14 /* No such group. */ #define RE_ERROR_INDEX -15 /* String index. */ #define RE_ERROR_BACKTRACKING -16 /* Too much backtracking. */ #define RE_ERROR_NOT_STRING -17 /* Not a string. */ #define RE_ERROR_NOT_UNICODE -18 /* Not a Unicode string. */ #define RE_ERROR_NOT_BYTES -19 /* Not a bytestring. */ /* The number of backtrack entries per allocated block. */ #define RE_BACKTRACK_BLOCK_SIZE 64 /* The maximum number of backtrack entries to allocate. */ #define RE_MAX_BACKTRACK_ALLOC (1024 * 1024) /* The initial maximum capacity of the guard block. */ #define RE_INIT_GUARDS_BLOCK_SIZE 16 /* The initial maximum capacity of the node list. */ #define RE_INIT_NODE_LIST_SIZE 16 /* The size increment for various allocation lists. */ #define RE_LIST_SIZE_INC 16 /* The initial maximum capacity of the capture groups. */ #define RE_INIT_CAPTURE_SIZE 16 /* Node bitflags. */ #define RE_POSITIVE_OP 0x1 #define RE_ZEROWIDTH_OP 0x2 #define RE_FUZZY_OP 0x4 #define RE_REVERSE_OP 0x8 #define RE_REQUIRED_OP 0x10 /* Guards against further matching can occur at the start of the body and the * tail of a repeat containing a repeat. */ #define RE_STATUS_BODY 0x1 #define RE_STATUS_TAIL 0x2 /* Whether a guard is added depends on whether there's a repeat in the body of * the repeat or a group reference in the body or tail of the repeat. */ #define RE_STATUS_NEITHER 0x0 #define RE_STATUS_REPEAT 0x4 #define RE_STATUS_LIMITED 0x8 #define RE_STATUS_REF 0x10 #define RE_STATUS_VISITED_AG 0x20 #define RE_STATUS_VISITED_REP 0x40 /* Whether a string node has been initialised for fast searching. */ #define RE_STATUS_FAST_INIT 0x80 /* Whether a node us being used. (Additional nodes may be created while the * pattern is being built. */ #define RE_STATUS_USED 0x100 /* Whether a node is a string node. */ #define RE_STATUS_STRING 0x200 /* Whether a repeat node is within another repeat. */ #define RE_STATUS_INNER 0x400 /* Various flags stored in a node status member. */ #define RE_STATUS_SHIFT 11 #define RE_STATUS_FUZZY (RE_FUZZY_OP << RE_STATUS_SHIFT) #define RE_STATUS_REVERSE (RE_REVERSE_OP << RE_STATUS_SHIFT) #define RE_STATUS_REQUIRED (RE_REQUIRED_OP << RE_STATUS_SHIFT) /* The different error types for fuzzy matching. */ #define RE_FUZZY_SUB 0 #define RE_FUZZY_INS 1 #define RE_FUZZY_DEL 2 #define RE_FUZZY_ERR 3 #define RE_FUZZY_COUNT 3 #define RE_FUZZY_THRESHOLD 10 /* The various values in a FUZZY node. */ #define RE_FUZZY_VAL_MAX_SUB 1 #define RE_FUZZY_VAL_MAX_INS 2 #define RE_FUZZY_VAL_MAX_DEL 3 #define RE_FUZZY_VAL_MAX_ERR 4 #define RE_FUZZY_VAL_SUB_COST 5 #define RE_FUZZY_VAL_INS_COST 6 #define RE_FUZZY_VAL_DEL_COST 7 #define RE_FUZZY_VAL_MAX_COST 8 #define RE_FUZZY_VAL_MAX_BASE 1 #define RE_FUZZY_VAL_COST_BASE 5 /* The various values in a END_FUZZY node. */ #define RE_FUZZY_VAL_MIN_SUB 1 #define RE_FUZZY_VAL_MIN_INS 2 #define RE_FUZZY_VAL_MIN_DEL 3 #define RE_FUZZY_VAL_MIN_ERR 4 /* The flags which will be set for full Unicode case folding. */ #define RE_FULL_CASE_FOLDING (RE_FLAG_UNICODE | RE_FLAG_FULLCASE | RE_FLAG_IGNORECASE) /* The shortest string prefix for which we'll use a fast string search. */ #define RE_MIN_FAST_LENGTH 5 static char copyright[] = " RE 2.3.0 Copyright (c) 1997-2002 by Secret Labs AB "; /* The exception to raise on error. */ static PyObject* error_exception; /* The dictionary of Unicode properties. */ static PyObject* property_dict; typedef struct RE_State* RE_StatePtr; /* Handlers for ASCII, locale and Unicode. */ typedef struct RE_EncodingTable { BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); BOOL (*at_boundary)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_word_start)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_word_end)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_default_boundary)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_default_word_start)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_default_word_end)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_grapheme_boundary)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*is_line_sep)(Py_UCS4 ch); BOOL (*at_line_start)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*at_line_end)(RE_StatePtr state, Py_ssize_t text_pos); BOOL (*possible_turkic)(Py_UCS4 ch); int (*all_cases)(Py_UCS4 ch, Py_UCS4* codepoints); Py_UCS4 (*simple_case_fold)(Py_UCS4 ch); int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); int (*all_turkic_i)(Py_UCS4 ch, Py_UCS4* cases); } RE_EncodingTable; /* Position within the regex and text. */ typedef struct RE_Position { struct RE_Node* node; Py_ssize_t text_pos; } RE_Position; /* Info about fuzzy matching. */ typedef struct RE_FuzzyInfo { struct RE_Node* node; size_t counts[RE_FUZZY_COUNT + 1]; /* Add 1 for total errors. */ size_t total_cost; } RE_FuzzyInfo; /* Storage for backtrack data. */ typedef struct RE_BacktrackData { union { struct { size_t capture_change; BOOL too_few_errors; } atomic; struct { RE_Position position; } branch; struct { RE_FuzzyInfo fuzzy_info; Py_ssize_t text_pos; RE_UINT32 index; } fuzzy; struct { RE_Position position; Py_ssize_t count; struct RE_Node* fuzzy_node; BOOL too_few_errors; } fuzzy_insert; struct { RE_Position position; RE_INT8 fuzzy_type; RE_INT8 step; } fuzzy_one; struct { RE_Position position; Py_ssize_t string_pos; size_t string_len; RE_INT8 fuzzy_type; RE_INT8 folded_pos; RE_INT8 folded_len; RE_INT8 gfolded_pos; RE_INT8 gfolded_len; RE_INT8 step; } fuzzy_string; struct { RE_Position position; RE_INT8 fuzzy_type; } fuzzy_zero; struct { Py_ssize_t text_pos; Py_ssize_t current_capture; RE_UINT32 private_index; RE_UINT32 public_index; BOOL capture; } group; struct { struct RE_Node* node; size_t capture_change; } group_call; struct { size_t capture_change; BOOL too_few_errors; } lookaround; struct { RE_Position position; Py_ssize_t text_pos; size_t count; Py_ssize_t start; size_t capture_change; RE_UINT32 index; } repeat; struct { size_t* capture_counts; } saved; }; RE_UINT8 op; } RE_BacktrackData; /* Storage for backtrack data is allocated in blocks for speed. */ typedef struct RE_BacktrackBlock { RE_BacktrackData items[RE_BACKTRACK_BLOCK_SIZE]; struct RE_BacktrackBlock* previous; struct RE_BacktrackBlock* next; size_t capacity; size_t count; } RE_BacktrackBlock; /* Storage for saved groups. */ typedef struct RE_SavedGroups { struct RE_SavedGroups* previous; struct RE_SavedGroups* next; struct RE_GroupSpan* spans; size_t* counts; } RE_SavedGroups; /* Storage for info around a recursive by 'basic'match'. */ typedef struct RE_Info { RE_BacktrackBlock* current_backtrack_block; size_t backtrack_count; RE_SavedGroups* current_saved_groups; size_t captures_count; struct RE_GroupCallFrame* current_group_call_frame; BOOL must_advance; } RE_Info; /* Storage for the next node. */ typedef struct RE_NextNode { struct RE_Node* node; struct RE_Node* test; struct RE_Node* match_next; Py_ssize_t match_step; } RE_NextNode; /* A pattern node. */ typedef struct RE_Node { RE_NextNode next_1; union { struct { RE_NextNode next_2; } nonstring; struct { /* Used only if (node->status & RE_STATUS_STRING) is true. */ Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; } string; }; Py_ssize_t step; size_t value_count; RE_CODE* values; RE_STATUS_T status; RE_UINT8 op; BOOL match; } RE_Node; /* Info about a group's span. */ typedef struct RE_GroupSpan { Py_ssize_t start; Py_ssize_t end; } RE_GroupSpan; /* Span of a guard (inclusive range). */ typedef struct RE_GuardSpan { Py_ssize_t low; Py_ssize_t high; BOOL protect; } RE_GuardSpan; /* Spans guarded against further matching. */ typedef struct RE_GuardList { size_t capacity; size_t count; RE_GuardSpan* spans; Py_ssize_t last_text_pos; size_t last_low; } RE_GuardList; /* Info about a group in a context. */ typedef struct RE_GroupData { RE_GroupSpan span; size_t capture_count; size_t capture_capacity; Py_ssize_t current_capture; RE_GroupSpan* captures; } RE_GroupData; /* Info about a repeat. */ typedef struct RE_RepeatData { RE_GuardList body_guard_list; RE_GuardList tail_guard_list; size_t count; Py_ssize_t start; size_t capture_change; } RE_RepeatData; /* Storage for saved repeats. */ typedef struct RE_SavedRepeats { struct RE_SavedRepeats* previous; struct RE_SavedRepeats* next; RE_RepeatData* repeats; } RE_SavedRepeats; /* Guards for fuzzy sections. */ typedef struct RE_FuzzyGuards { RE_GuardList body_guard_list; RE_GuardList tail_guard_list; } RE_FuzzyGuards; /* Info about a capture group. */ typedef struct RE_GroupInfo { Py_ssize_t end_index; RE_Node* node; BOOL referenced; BOOL has_name; BOOL called; } RE_GroupInfo; /* Info about a call_ref. */ typedef struct RE_CallRefInfo { RE_Node* node; BOOL defined; BOOL used; } RE_CallRefInfo; /* Info about a repeat. */ typedef struct RE_RepeatInfo { RE_STATUS_T status; } RE_RepeatInfo; /* Stack frame for a group call. */ typedef struct RE_GroupCallFrame { struct RE_GroupCallFrame* previous; struct RE_GroupCallFrame* next; RE_Node* node; RE_GroupData* groups; RE_RepeatData* repeats; } RE_GroupCallFrame; /* Info about a string argument. */ typedef struct RE_StringInfo { Py_buffer view; /* View of the string if it's a buffer object. */ void* characters; /* Pointer to the characters of the string. */ Py_ssize_t length; /* Length of the string. */ Py_ssize_t charsize; /* Size of the characters in the string. */ BOOL is_unicode; /* Whether the string is Unicode. */ BOOL should_release; /* Whether the buffer should be released. */ } RE_StringInfo; /* Info about where the next match was found, starting from a certain search * position. This is used when a pattern starts with a BRANCH. */ #define MAX_SEARCH_POSITIONS 7 typedef struct { Py_ssize_t start_pos; Py_ssize_t match_pos; } RE_SearchPosition; /* The state object used during matching. */ typedef struct RE_State { struct PatternObject* pattern; /* Parent PatternObject. */ /* Info about the string being matched. */ PyObject* string; Py_buffer view; /* View of the string if it's a buffer object. */ Py_ssize_t charsize; void* text; Py_ssize_t text_length; /* The slice of the string being searched. */ Py_ssize_t slice_start; Py_ssize_t slice_end; /* Info about the capture groups. */ RE_GroupData* groups; Py_ssize_t lastindex; Py_ssize_t lastgroup; /* Info about the repeats. */ RE_RepeatData* repeats; Py_ssize_t search_anchor; /* Where the last match finished. */ Py_ssize_t match_pos; /* The start position of the match. */ Py_ssize_t text_pos; /* The current position of the match. */ Py_ssize_t final_newline; /* The index of newline at end of string, or -1. */ Py_ssize_t final_line_sep; /* The index of line separator at end of string, or -1. */ /* Storage for backtrack info. */ RE_BacktrackBlock backtrack_block; RE_BacktrackBlock* current_backtrack_block; size_t backtrack_allocated; RE_BacktrackData* backtrack; /* Storage for saved capture groups. */ RE_SavedGroups* first_saved_groups; RE_SavedGroups* current_saved_groups; RE_SavedRepeats* first_saved_repeats; RE_SavedRepeats* current_saved_repeats; size_t min_width; /* The minimum width of the string to match (assuming it's not a fuzzy pattern). */ RE_EncodingTable* encoding; /* The 'encoding' of the string being searched. */ Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* (*point_to)(void* text, Py_ssize_t pos); PyThread_type_lock lock; /* A lock for accessing the state across threads. */ RE_FuzzyInfo fuzzy_info; /* Info about fuzzy matching. */ RE_FuzzyGuards* fuzzy_guards; /* The guards for a fuzzy match. */ size_t total_errors; /* The total number of errors of a fuzzy match. */ size_t total_cost; /* The total cost of a fuzzy match. */ size_t max_cost; /* The maximum permitted fuzzy cost. */ /* The group call stack. */ RE_GroupCallFrame* first_group_call_frame; RE_GroupCallFrame* current_group_call_frame; RE_GuardList* group_call_guard_list; RE_SearchPosition search_positions[MAX_SEARCH_POSITIONS]; /* Where the search matches next. */ size_t capture_change; /* Incremented every time a captive group changes. */ Py_ssize_t req_pos; /* The position where the required string matched. */ Py_ssize_t req_end; /* The end position where the required string matched. */ RE_UINT16 iterations; /* The number of iterations the matching engine has performed since checking for KeyboardInterrupt. */ BOOL is_unicode; /* Whether the string to be matched is Unicode. */ BOOL should_release; /* Whether the buffer should be released. */ BOOL overlapped; /* Whether the matches can be overlapped. */ BOOL reverse; /* Whether it's a reverse pattern. */ BOOL visible_captures; /* Whether the 'captures' method will be visible. */ BOOL version_0; /* Whether to perform version_0 behaviour (same as re module). */ BOOL must_advance; /* Whether the end of the match must advance past its start. */ BOOL is_multithreaded; /* Whether to release the GIL while matching. */ BOOL too_few_errors; /* Whether there were too few fuzzy errors. */ BOOL match_all; /* Whether to match all of the string ('fullmatch'). */ } RE_State; /* Storage for the regex state and thread state. * * Scanner objects can sometimes be shared across threads, which means that * their RE_State structs are also shared. This isn't safe when the GIL is * released, so in such instances we have a lock (mutex) in the RE_State struct * to protect it during matching. We also need a thread-safe place to store the * thread state when releasing the GIL. */ typedef struct RE_SafeState { RE_State* re_state; PyThreadState* thread_state; } RE_SafeState; /* The PatternObject created from a regular expression. */ typedef struct PatternObject { PyObject_HEAD PyObject* pattern; /* Pattern source (or None). */ Py_ssize_t flags; /* Flags used when compiling pattern source. */ PyObject* weakreflist; /* List of weak references */ /* Nodes into which the regular expression is compiled. */ RE_Node* start_node; RE_Node* start_test; Py_ssize_t true_group_count; /* The true number of capture groups. */ Py_ssize_t public_group_count; /* The number of public capture groups. */ Py_ssize_t repeat_count; /* The number of repeats. */ Py_ssize_t group_end_index; /* The number of group closures. */ PyObject* groupindex; PyObject* indexgroup; PyObject* named_lists; PyObject* named_list_indexes; /* Storage for the pattern nodes. */ Py_ssize_t node_capacity; Py_ssize_t node_count; RE_Node** node_list; /* Info about the capture groups. */ Py_ssize_t group_info_capacity; RE_GroupInfo* group_info; /* Info about the call_refs. */ Py_ssize_t call_ref_info_capacity; Py_ssize_t call_ref_info_count; RE_CallRefInfo* call_ref_info; Py_ssize_t pattern_call_ref; /* Info about the repeats. */ Py_ssize_t repeat_info_capacity; RE_RepeatInfo* repeat_info; size_t min_width; /* The minimum width of the string to match (assuming it isn't a fuzzy pattern). */ RE_EncodingTable* encoding; /* Encoding handlers. */ RE_GroupData* groups_storage; RE_RepeatData* repeats_storage; Py_ssize_t fuzzy_count; /* The number of fuzzy sections. */ Py_ssize_t req_offset; /* The offset to the required string. */ RE_Node* req_string; /* The required string. */ BOOL is_fuzzy; /* Whether it's a fuzzy pattern. */ BOOL do_search_start; /* Whether to do an initial search. */ BOOL recursive; /* Whether the entire pattern is recursive. */ } PatternObject; /* The MatchObject created when a match is found. */ typedef struct MatchObject { PyObject_HEAD PyObject* string; /* Link to the target string or NULL if detached. */ PyObject* substring; /* Link to (a substring of) the target string. */ Py_ssize_t substring_offset; /* Offset into the target string. */ PatternObject* pattern; /* Link to the regex (pattern) object. */ Py_ssize_t pos; /* Start of current slice. */ Py_ssize_t endpos; /* End of current slice. */ Py_ssize_t match_start; /* Start of matched slice. */ Py_ssize_t match_end; /* End of matched slice. */ Py_ssize_t lastindex; /* Last group seen by the engine (-1 if none). */ Py_ssize_t lastgroup; /* Last named group seen by the engine (-1 if none). */ Py_ssize_t group_count; /* The number of groups. */ RE_GroupData* groups; /* The capture groups. */ PyObject* regs; } MatchObject; /* The ScannerObject. */ typedef struct ScannerObject { PyObject_HEAD PatternObject* pattern; RE_State state; int status; } ScannerObject; /* The SplitterObject. */ typedef struct SplitterObject { PyObject_HEAD PatternObject* pattern; RE_State state; Py_ssize_t maxsplit; Py_ssize_t last_pos; Py_ssize_t split_count; Py_ssize_t index; int status; } SplitterObject; /* Info used when compiling a pattern to nodes. */ typedef struct RE_CompileArgs { RE_CODE* code; /* The start of the compiled pattern. */ RE_CODE* end_code; /* The end of the compiled pattern. */ PatternObject* pattern; /* The pattern object. */ size_t min_width; /* The minimum width of the string to match (assuming it isn't a fuzzy pattern). */ RE_Node* start; /* The start node. */ RE_Node* end; /* The end node. */ size_t repeat_depth; /* The nesting depth of the repeat. */ BOOL forward; /* Whether it's a forward (not reverse) pattern. */ BOOL visible_captures; /* Whether all of the captures will be visible. */ BOOL has_captures; /* Whether the pattern has capture groups. */ BOOL is_fuzzy; /* Whether the pattern (or some part of it) is fuzzy. */ BOOL within_fuzzy; /* Whether the subpattern is within a fuzzy section. */ } RE_CompileArgs; /* The string slices which will be concatenated to make the result string of * the 'sub' method. * * This allows us to avoid creating a list of slices if there of fewer than 2 * of them. Empty strings aren't recorded, so if 'list' and 'item' are both * NULL then the result is an empty string. */ typedef struct JoinInfo { PyObject* list; /* The list of slices if there are more than 2 of them. */ PyObject* item; /* The slice if there is only 1 of them. */ BOOL reversed; /* Whether the slices have been found in reverse order. */ BOOL is_unicode; /* Whether the string is Unicode. */ } JoinInfo; typedef struct { RE_Node* new_node; Py_ssize_t new_text_pos; Py_ssize_t limit; Py_ssize_t new_string_pos; int step; int new_folded_pos; int folded_len; int new_gfolded_pos; int new_group_pos; int fuzzy_type; BOOL permit_insertion; } RE_FuzzyData; /* Function types for getting info from a MatchObject. */ typedef PyObject* (*RE_GetByIndexFunc)(MatchObject* self, Py_ssize_t index); Py_LOCAL_INLINE(Py_ssize_t) abs_ssize_t(Py_ssize_t x) { return x >= 0 ? x : -x; } /* Gets a character at the given position assuming 1 byte per character. */ static Py_UCS4 bytes1_char_at(void* text, Py_ssize_t pos) { return *((Py_UCS1*)text + pos); } /* Sets a character at the given position assuming 1 byte per character. */ static void bytes1_set_char_at(void* text, Py_ssize_t pos, Py_UCS4 ch) { *((Py_UCS1*)text + pos) = (Py_UCS1)ch; } /* Gets a pointer to the character at the given position assuming 1 byte per * character. */ static void* bytes1_point_to(void* text, Py_ssize_t pos) { return (Py_UCS1*)text + pos; } /* Gets a character at the given position assuming 2 bytes per character. */ static Py_UCS4 bytes2_char_at(void* text, Py_ssize_t pos) { return *((Py_UCS2*)text + pos); } /* Sets a character at the given position assuming 2 bytes per character. */ static void bytes2_set_char_at(void* text, Py_ssize_t pos, Py_UCS4 ch) { *((Py_UCS2*)text + pos) = (Py_UCS2)ch; } /* Gets a pointer to the character at the given position assuming 2 bytes per * character. */ static void* bytes2_point_to(void* text, Py_ssize_t pos) { return (Py_UCS2*)text + pos; } /* Gets a character at the given position assuming 4 bytes per character. */ static Py_UCS4 bytes4_char_at(void* text, Py_ssize_t pos) { return *((Py_UCS4*)text + pos); } /* Sets a character at the given position assuming 4 bytes per character. */ static void bytes4_set_char_at(void* text, Py_ssize_t pos, Py_UCS4 ch) { *((Py_UCS4*)text + pos) = (Py_UCS4)ch; } /* Gets a pointer to the character at the given position assuming 4 bytes per * character. */ static void* bytes4_point_to(void* text, Py_ssize_t pos) { return (Py_UCS4*)text + pos; } /* Default for whether the current text position is on a boundary. */ static BOOL at_boundary_always(RE_State* state, Py_ssize_t text_pos) { return TRUE; } /* ASCII-specific. */ static BOOL unicode_has_property(RE_CODE property, Py_UCS4 ch); /* Checks whether a character has the given property. */ static BOOL ascii_has_property(RE_CODE property, Py_UCS4 ch) { if (ch > RE_ASCII_MAX) { /* Outside the ASCII range. */ RE_UINT32 value; value = property & 0xFFFF; return value == 0; } return unicode_has_property(property, ch); } /* Checks whether the current text position is on a word boundary. */ static BOOL ascii_at_boundary(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before != after; } /* Checks whether the current text position is at the start of a word. */ static BOOL ascii_at_word_start(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return !before && after; } /* Checks whether the current text position is at the end of a word. */ static BOOL ascii_at_word_end(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && ascii_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before && !after; } /* Checks whether a character is a line separator. */ static BOOL ascii_is_line_sep(Py_UCS4 ch) { return 0x0A <= ch && ch <= 0x0D; } /* Checks whether the current text position is at the start of a line. */ static BOOL ascii_at_line_start(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos == 0) return TRUE; ch = state->char_at(state->text, text_pos - 1); if (ch == 0x0D) /* No line break inside CRLF. */ return text_pos >= state->text_length || state->char_at(state->text, text_pos) != 0x0A; return 0x0A <= ch && ch <= 0x0D; } /* Checks whether the current text position is at the end of a line. */ static BOOL ascii_at_line_end(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos >= state->text_length) return TRUE; ch = state->char_at(state->text, text_pos); if (ch == 0x0A) /* No line break inside CRLF. */ return text_pos >= 1 || state->char_at(state->text, text_pos - 1) != 0x0D; return 0x0A <= ch && ch <= 0x0D; } /* Checks whether a character could be Turkic (variants of I/i). For ASCII, it * won't be. */ static BOOL ascii_possible_turkic(Py_UCS4 ch) { return FALSE; } /* Gets all the cases of a character. */ static int ascii_all_cases(Py_UCS4 ch, Py_UCS4* codepoints) { int count; count = 0; codepoints[count++] = ch; if (('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z')) /* It's a letter, so add the other case. */ codepoints[count++] = ch ^ 0x20; return count; } /* Returns a character with its case folded. */ static Py_UCS4 ascii_simple_case_fold(Py_UCS4 ch) { if ('A' <= ch && ch <= 'Z') /* Uppercase folds to lowercase. */ return ch ^ 0x20; return ch; } /* Returns a character with its case folded. */ static int ascii_full_case_fold(Py_UCS4 ch, Py_UCS4* folded) { if ('A' <= ch && ch <= 'Z') /* Uppercase folds to lowercase. */ folded[0] = ch ^ 0x20; else folded[0] = ch; return 1; } /* Gets all the case variants of Turkic 'I'. The given character will be listed * first. */ static int ascii_all_turkic_i(Py_UCS4 ch, Py_UCS4* cases) { int count; count = 0; cases[count++] = ch; if (ch != 'I') cases[count++] = 'I'; if (ch != 'i') cases[count++] = 'i'; return count; } /* The handlers for ASCII characters. */ static RE_EncodingTable ascii_encoding = { ascii_has_property, ascii_at_boundary, ascii_at_word_start, ascii_at_word_end, ascii_at_boundary, /* No special "default word boundary" for ASCII. */ ascii_at_word_start, /* No special "default start of word" for ASCII. */ ascii_at_word_end, /* No special "default end of a word" for ASCII. */ at_boundary_always, /* No special "grapheme boundary" for ASCII. */ ascii_is_line_sep, ascii_at_line_start, ascii_at_line_end, ascii_possible_turkic, ascii_all_cases, ascii_simple_case_fold, ascii_full_case_fold, ascii_all_turkic_i, }; /* Locale-specific. */ /* Checks whether a character has the given property. */ static BOOL locale_has_property(RE_CODE property, Py_UCS4 ch) { RE_UINT32 value; RE_UINT32 v; value = property & 0xFFFF; if (ch > RE_LOCALE_MAX) /* Outside the locale range. */ return value == 0; switch (property >> 16) { case RE_PROP_ALNUM >> 16: v = isalnum(ch) != 0; break; case RE_PROP_ALPHA >> 16: v = isalpha(ch) != 0; break; case RE_PROP_ANY >> 16: v = 1; break; case RE_PROP_ASCII >> 16: v = ch <= RE_ASCII_MAX; break; case RE_PROP_ASSIGNED >> 16: v = ch <= RE_LOCALE_MAX; break; case RE_PROP_BLANK >> 16: v = ch == '\t' || ch == ' '; break; case RE_PROP_GC: switch (property) { case RE_PROP_CNTRL: v = iscntrl(ch) ? value : 0xFFFF; break; case RE_PROP_DIGIT: v = isdigit(ch) ? value : 0xFFFF; break; case RE_PROP_GC_LL: v = islower(ch) ? value : 0xFFFF; break; case RE_PROP_GC_LU: v = isupper(ch) ? value : 0xFFFF; break; case RE_PROP_PUNCT: v = ispunct(ch) ? value : 0xFFFF; break; default: v = 0xFFFF; break; } break; case RE_PROP_GRAPH >> 16: v = isgraph(ch) != 0; break; case RE_PROP_LOWER >> 16: v = islower(ch) != 0; break; case RE_PROP_PRINT >> 16: v = isprint(ch) != 0; break; case RE_PROP_SPACE >> 16: v = isspace(ch) != 0; break; case RE_PROP_UPPER >> 16: v = isupper(ch) != 0; break; case RE_PROP_WORD >> 16: v = ch == '_' || isalnum(ch) != 0; break; case RE_PROP_XDIGIT >> 16: v = re_get_hex_digit(ch) != 0; break; default: v = 0; break; } return v == value; } /* Checks whether the current text position is on a word boundary. */ static BOOL locale_at_boundary(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before != after; } /* Checks whether the current text position is at the start of a word. */ static BOOL locale_at_word_start(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return !before && after; } /* Checks whether the current text position is at the end of a word. */ static BOOL locale_at_word_end(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && locale_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before && !after; } /* Checks whether a character could be Turkic (variants of I/i). */ static BOOL locale_possible_turkic(Py_UCS4 ch) { return toupper(ch) == 'I' || tolower(ch) == 'i'; } /* Gets all the cases of a character. */ static int locale_all_cases(Py_UCS4 ch, Py_UCS4* codepoints) { int count; Py_UCS4 other; count = 0; codepoints[count++] = ch; other = toupper(ch); if (other != ch) codepoints[count++] = other; other = tolower(ch); if (other != ch) codepoints[count++] = other; return count; } /* Returns a character with its case folded. */ static Py_UCS4 locale_simple_case_fold(Py_UCS4 ch) { if (ch <= RE_LOCALE_MAX) return tolower(ch); return ch; } /* Returns a character with its case folded. */ static int locale_full_case_fold(Py_UCS4 ch, Py_UCS4* folded) { if (ch <= RE_LOCALE_MAX) folded[0] = tolower(ch); else folded[0] = ch; return 1; } /* Gets all the case variants of Turkic 'I'. The given character will be listed * first. */ static int locale_all_turkic_i(Py_UCS4 ch, Py_UCS4* cases) { int count; Py_UCS4 other; count = 0; cases[count++] = ch; if (ch != 'I') cases[count++] = 'I'; if (ch != 'i') cases[count++] = 'i'; /* Uppercase 'i' will be either dotted (Turkic) or dotless (non-Turkic). */ other = toupper('i'); if (other != ch && other != 'I') cases[count++] = other; /* Lowercase 'I' will be either dotless (Turkic) or dotted (non-Turkic). */ other = tolower('I'); if (other != ch && other != 'i') cases[count++] = other; return count; } /* The handlers for locale characters. */ static RE_EncodingTable locale_encoding = { locale_has_property, locale_at_boundary, locale_at_word_start, locale_at_word_end, locale_at_boundary, /* No special "default word boundary" for locale. */ locale_at_word_start, /* No special "default start of a word" for locale. */ locale_at_word_end, /* No special "default end of a word" for locale. */ at_boundary_always, /* No special "grapheme boundary" for locale. */ ascii_is_line_sep, /* Assume locale line separators are same as ASCII. */ ascii_at_line_start, /* Assume locale line separators are same as ASCII. */ ascii_at_line_end, /* Assume locale line separators are same as ASCII. */ locale_possible_turkic, locale_all_cases, locale_simple_case_fold, locale_full_case_fold, locale_all_turkic_i, }; /* Unicode-specific. */ /* Checks whether a Unicode character has the given property. */ static BOOL unicode_has_property(RE_CODE property, Py_UCS4 ch) { RE_UINT32 prop; RE_UINT32 value; RE_UINT32 v; prop = property >> 16; if (prop >= sizeof(re_get_property) / sizeof(re_get_property[0])) return FALSE; value = property & 0xFFFF; v = re_get_property[prop](ch); if (v == value) return TRUE; if (prop == RE_PROP_GC) { switch (value) { case RE_PROP_C: return (RE_PROP_C_MASK & (1 << v)) != 0; case RE_PROP_L: return (RE_PROP_L_MASK & (1 << v)) != 0; case RE_PROP_M: return (RE_PROP_M_MASK & (1 << v)) != 0; case RE_PROP_N: return (RE_PROP_N_MASK & (1 << v)) != 0; case RE_PROP_P: return (RE_PROP_P_MASK & (1 << v)) != 0; case RE_PROP_S: return (RE_PROP_S_MASK & (1 << v)) != 0; case RE_PROP_Z: return (RE_PROP_Z_MASK & (1 << v)) != 0; } } return FALSE; } /* Checks whether the current text position is on a word boundary. */ static BOOL unicode_at_boundary(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before != after; } /* Checks whether the current text position is at the start of a word. */ static BOOL unicode_at_word_start(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return !before && after; } /* Checks whether the current text position is at the end of a word. */ static BOOL unicode_at_word_end(RE_State* state, Py_ssize_t text_pos) { BOOL before; BOOL after; before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, state->char_at(state->text, text_pos)); return before && !after; } /* Checks whether a character is a Unicode vowel. * * Only a limited number are treated as vowels. */ Py_LOCAL_INLINE(BOOL) is_unicode_vowel(Py_UCS4 ch) { switch (Py_UNICODE_TOLOWER(ch)) { case 'a': case 0xE0: case 0xE1: case 0xE2: case 'e': case 0xE8: case 0xE9: case 0xEA: case 'i': case 0xEC: case 0xED: case 0xEE: case 'o': case 0xF2: case 0xF3: case 0xF4: case 'u': case 0xF9: case 0xFA: case 0xFB: return TRUE; default: return FALSE; } } /* Checks whether the current text position is on a default word boundary. * * The rules are defined here: * http://www.unicode.org/reports/tr29/#Default_Word_Boundaries */ static BOOL unicode_at_default_boundary(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; int prop; int prop_m1; Py_ssize_t pos_m1; Py_ssize_t pos_m2; int prop_m2; Py_ssize_t pos_p0; int prop_p0; Py_ssize_t pos_p1; int prop_p1; /* Break at the start and end of the text. */ if (text_pos <= 0 || text_pos >= state->text_length) return TRUE; char_at = state->char_at; text = state->text; prop = (int)re_get_word_break(char_at(text, text_pos)); prop_m1 = (int)re_get_word_break(char_at(text, text_pos - 1)); /* Don't break within CRLF. */ if (prop_m1 == RE_BREAK_CR && prop == RE_BREAK_LF) return FALSE; /* Otherwise break before and after Newlines (including CR and LF). */ if (prop_m1 == RE_BREAK_NEWLINE || prop_m1 == RE_BREAK_CR || prop_m1 == RE_BREAK_LF || prop == RE_BREAK_NEWLINE || prop == RE_BREAK_CR || prop == RE_BREAK_LF) return TRUE; /* Get the property of the previous character. */ pos_m1 = text_pos - 1; prop_m1 = RE_BREAK_OTHER; while (pos_m1 >= 0) { prop_m1 = (int)re_get_word_break(char_at(text, pos_m1)); if (prop_m1 != RE_BREAK_EXTEND && prop_m1 != RE_BREAK_FORMAT) break; --pos_m1; } /* Get the property of the preceding character. */ pos_m2 = pos_m1 - 1; prop_m2 = RE_BREAK_OTHER; while (pos_m2 >= 0) { prop_m2 = (int)re_get_word_break(char_at(text, pos_m2)); if (prop_m2 != RE_BREAK_EXTEND && prop_m2 != RE_BREAK_FORMAT) break; --pos_m2; } /* Get the property of the next character. */ pos_p0 = text_pos; prop_p0 = prop; while (pos_p0 < state->text_length) { prop_p0 = (int)re_get_word_break(char_at(text, pos_p0)); if (prop_p0 != RE_BREAK_EXTEND && prop_p0 != RE_BREAK_FORMAT) break; ++pos_p0; } /* Get the property of the following character. */ pos_p1 = pos_p0 + 1; prop_p1 = RE_BREAK_OTHER; while (pos_p1 < state->text_length) { prop_p1 = (int)re_get_word_break(char_at(text, pos_p1)); if (prop_p1 != RE_BREAK_EXTEND && prop_p1 != RE_BREAK_FORMAT) break; ++pos_p1; } /* Don't break between most letters. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER) && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER)) return FALSE; /* Break between apostrophe and vowels (French, Italian). */ if (pos_m1 >= 0 && char_at(text, pos_m1) == '\'' && is_unicode_vowel(char_at(text, text_pos))) return TRUE; /* Don't break letters across certain punctuation. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER) && (prop_p0 == RE_BREAK_MIDLETTER || prop_p0 == RE_BREAK_MIDNUMLET || prop_p0 == RE_BREAK_SINGLEQUOTE) && (prop_p1 == RE_BREAK_ALETTER || prop_p1 == RE_BREAK_HEBREWLETTER)) return FALSE; if ((prop_m2 == RE_BREAK_ALETTER || prop_m2 == RE_BREAK_HEBREWLETTER) && (prop_m1 == RE_BREAK_MIDLETTER || prop_m1 == RE_BREAK_MIDNUMLET || prop_m1 == RE_BREAK_SINGLEQUOTE) && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER)) return FALSE; if (prop_m1 == RE_BREAK_HEBREWLETTER && prop_p0 == RE_BREAK_SINGLEQUOTE) return FALSE; if (prop_m1 == RE_BREAK_HEBREWLETTER && prop_p0 == RE_BREAK_DOUBLEQUOTE && prop_p1 == RE_BREAK_HEBREWLETTER) return FALSE; if (prop_m2 == RE_BREAK_HEBREWLETTER && prop_m1 == RE_BREAK_DOUBLEQUOTE && prop_p0 == RE_BREAK_HEBREWLETTER) return FALSE; /* Don't break within sequences of digits, or digits adjacent to letters * ("3a", or "A3"). */ if (prop_m1 == RE_BREAK_NUMERIC && prop_p0 == RE_BREAK_NUMERIC) return FALSE; if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER) && prop_p0 == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER)) return FALSE; /* Don't break within sequences, such as "3.2" or "3,456.789". */ if (prop_m2 == RE_BREAK_NUMERIC && (prop_m1 == RE_BREAK_MIDNUM || prop_m1 == RE_BREAK_MIDNUMLET || prop_m1 == RE_BREAK_SINGLEQUOTE) && prop_p0 == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && (prop_p0 == RE_BREAK_MIDNUM || prop_p0 == RE_BREAK_MIDNUMLET || prop_p0 == RE_BREAK_SINGLEQUOTE) && prop_p1 == RE_BREAK_NUMERIC) return FALSE; /* Don't break between Katakana. */ if (prop_m1 == RE_BREAK_KATAKANA && prop_p0 == RE_BREAK_KATAKANA) return FALSE; /* Don't break from extenders. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_HEBREWLETTER || prop_m1 == RE_BREAK_NUMERIC || prop_m1 == RE_BREAK_KATAKANA || prop_m1 == RE_BREAK_EXTENDNUMLET) && prop_p0 == RE_BREAK_EXTENDNUMLET) return FALSE; if (prop_m1 == RE_BREAK_EXTENDNUMLET && (prop_p0 == RE_BREAK_ALETTER || prop_p0 == RE_BREAK_HEBREWLETTER || prop_p0 == RE_BREAK_NUMERIC || prop_p0 == RE_BREAK_KATAKANA)) return FALSE; /* Don't break between regional indicator symbols. */ if (prop_m1 == RE_BREAK_REGIONALINDICATOR && prop_p0 == RE_BREAK_REGIONALINDICATOR) return FALSE; /* Otherwise, break everywhere (including around ideographs). */ return TRUE; } /* Checks whether the current text position is at the start/end of a word. */ Py_LOCAL_INLINE(BOOL) unicode_at_default_word_start_or_end(RE_State* state, Py_ssize_t text_pos, BOOL at_start) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; BOOL before; BOOL after; Py_UCS4 char_0; Py_UCS4 char_m1; int prop; int prop_m1; Py_ssize_t pos_m1; Py_UCS4 char_p1; Py_ssize_t pos_p1; int prop_p1; Py_ssize_t pos_m2; Py_UCS4 char_m2; int prop_m2; char_at = state->char_at; text = state->text; /* At the start or end of the text. */ if (text_pos <= 0 || text_pos >= state->text_length) { before = text_pos > 0 && unicode_has_property(RE_PROP_WORD, char_at(state->text, text_pos - 1)); after = text_pos < state->text_length && unicode_has_property(RE_PROP_WORD, char_at(state->text, text_pos)); return before != at_start && after == at_start; } char_0 = char_at(state->text, text_pos); char_m1 = char_at(state->text, text_pos - 1); prop = (int)re_get_word_break(char_0); prop_m1 = (int)re_get_word_break(char_m1); /* No break within CRLF. */ if (prop_m1 == RE_BREAK_CR && prop == RE_BREAK_LF) return FALSE; /* Break before and after Newlines (including CR and LF). */ if (prop_m1 == RE_BREAK_NEWLINE || prop_m1 == RE_BREAK_CR || prop_m1 == RE_BREAK_LF || prop == RE_BREAK_NEWLINE || prop == RE_BREAK_CR || prop == RE_BREAK_LF) { before = unicode_has_property(RE_PROP_WORD, char_m1); after = unicode_has_property(RE_PROP_WORD, char_0); return before != at_start && after == at_start; } /* No break just before Format or Extend characters. */ if (prop == RE_BREAK_EXTEND || prop == RE_BREAK_FORMAT) return FALSE; /* Get the property of the previous character. */ pos_m1 = text_pos - 1; prop_m1 = RE_BREAK_OTHER; while (pos_m1 >= 0) { char_m1 = char_at(text, pos_m1); prop_m1 = (int)re_get_word_break(char_m1); if (prop_m1 != RE_BREAK_EXTEND && prop_m1 != RE_BREAK_FORMAT) break; --pos_m1; } /* No break between most letters. */ if (prop_m1 == RE_BREAK_ALETTER && prop == RE_BREAK_ALETTER) return FALSE; if (pos_m1 >= 0 && char_m1 == '\'' && is_unicode_vowel(char_0)) return TRUE; pos_p1 = text_pos + 1; prop_p1 = RE_BREAK_OTHER; while (pos_p1 < state->text_length) { char_p1 = char_at(text, pos_p1); prop_p1 = (int)re_get_word_break(char_p1); if (prop_p1 != RE_BREAK_EXTEND && prop_p1 != RE_BREAK_FORMAT) break; --pos_p1; } /* No break letters across certain punctuation. */ if (prop_m1 == RE_BREAK_ALETTER && (prop == RE_BREAK_MIDLETTER || prop == RE_BREAK_MIDNUMLET) && prop_p1 == RE_BREAK_ALETTER) return FALSE; pos_m2 = pos_m1 - 1; prop_m2 = RE_BREAK_OTHER; while (pos_m2 >= 0) { char_m2 = char_at(text, pos_m2); prop_m2 = (int)re_get_word_break(char_m2); if (prop_m2 != RE_BREAK_EXTEND && prop_m1 != RE_BREAK_FORMAT) break; --pos_m2; } if (prop_m2 == RE_BREAK_ALETTER && (prop_m1 == RE_BREAK_MIDLETTER || prop_m1 == RE_BREAK_MIDNUMLET) && prop == RE_BREAK_ALETTER) return FALSE; /* No break within sequences of digits, or digits adjacent to letters * ("3a", or "A3"). */ if ((prop_m1 == RE_BREAK_NUMERIC || prop_m1 == RE_BREAK_ALETTER) && prop == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && prop == RE_BREAK_ALETTER) return FALSE; /* No break within sequences, such as "3.2" or "3,456.789". */ if (prop_m2 == RE_BREAK_NUMERIC && (prop_m1 == RE_BREAK_MIDNUM || prop_m1 == RE_BREAK_MIDNUMLET) && prop == RE_BREAK_NUMERIC) return FALSE; if (prop_m1 == RE_BREAK_NUMERIC && (prop == RE_BREAK_MIDNUM || prop == RE_BREAK_MIDNUMLET) && prop_p1 == RE_BREAK_NUMERIC) return FALSE; /* No break between Katakana. */ if (prop_m1 == RE_BREAK_KATAKANA && prop == RE_BREAK_KATAKANA) return FALSE; /* No break from extenders. */ if ((prop_m1 == RE_BREAK_ALETTER || prop_m1 == RE_BREAK_NUMERIC || prop_m1 == RE_BREAK_KATAKANA || prop_m1 == RE_BREAK_EXTENDNUMLET) && prop == RE_BREAK_EXTENDNUMLET) return FALSE; if (prop_m1 == RE_BREAK_EXTENDNUMLET && (prop == RE_BREAK_ALETTER || prop == RE_BREAK_NUMERIC || prop == RE_BREAK_KATAKANA)) return FALSE; /* Otherwise, break everywhere (including around ideographs). */ before = unicode_has_property(RE_PROP_WORD, char_m1); after = unicode_has_property(RE_PROP_WORD, char_0); return before != at_start && after == at_start; } /* Checks whether the current text position is at the start of a word. */ static BOOL unicode_at_default_word_start(RE_State* state, Py_ssize_t text_pos) { return unicode_at_default_word_start_or_end(state, text_pos, TRUE); } /* Checks whether the current text position is at the end of a word. */ static BOOL unicode_at_default_word_end(RE_State* state, Py_ssize_t text_pos) { return unicode_at_default_word_start_or_end(state, text_pos, FALSE); } /* Checks whether the current text position is on a grapheme boundary. * * The rules are defined here: * http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries */ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; int prop; int prop_m1; /* Break at the start and end of the text. */ if (text_pos <= 0 || text_pos >= state->text_length) return TRUE; char_at = state->char_at; text = state->text; prop = (int)re_get_grapheme_cluster_break(char_at(text, text_pos)); prop_m1 = (int)re_get_grapheme_cluster_break(char_at(text, text_pos - 1)); /* Don't break within CRLF. */ if (prop_m1 == RE_GBREAK_CR && prop == RE_GBREAK_LF) return FALSE; /* Otherwise break before and after controls (including CR and LF). */ if (prop_m1 == RE_GBREAK_CONTROL || prop_m1 == RE_GBREAK_CR || prop_m1 == RE_GBREAK_LF || prop == RE_GBREAK_CONTROL || prop == RE_GBREAK_CR || prop == RE_GBREAK_LF) return TRUE; /* Don't break Hangul syllable sequences. */ if (prop_m1 == RE_GBREAK_L && (prop == RE_GBREAK_L || prop == RE_GBREAK_V || prop == RE_GBREAK_LV || prop == RE_GBREAK_LVT)) return FALSE; if ((prop_m1 == RE_GBREAK_LV || prop_m1 == RE_GBREAK_V) && (prop == RE_GBREAK_V || prop == RE_GBREAK_T)) return FALSE; if ((prop_m1 == RE_GBREAK_LVT || prop_m1 == RE_GBREAK_T) && (prop == RE_GBREAK_T)) return FALSE; /* Don't break between regional indicator symbols. */ if (prop_m1 == RE_GBREAK_REGIONALINDICATOR && prop == RE_GBREAK_REGIONALINDICATOR) return FALSE; /* Don't break just before Extend characters. */ if (prop == RE_GBREAK_EXTEND) return FALSE; /* Don't break before SpacingMarks, or after Prepend characters. */ if (prop == RE_GBREAK_SPACINGMARK) return FALSE; if (prop_m1 == RE_GBREAK_PREPEND) return FALSE; /* Otherwise, break everywhere. */ return TRUE; } /* Checks whether a character is a line separator. */ static BOOL unicode_is_line_sep(Py_UCS4 ch) { return (0x0A <= ch && ch <= 0x0D) || ch == 0x85 || ch == 0x2028 || ch == 0x2029; } /* Checks whether the current text position is at the start of a line. */ static BOOL unicode_at_line_start(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos == 0) return TRUE; ch = state->char_at(state->text, text_pos - 1); if (ch == 0x0D) /* No line break inside CRLF. */ return text_pos >= state->text_length || state->char_at(state->text, text_pos) != 0x0A; return (0x0A <= ch && ch <= 0x0D) || ch == 0x85 || ch == 0x2028 || ch == 0x2029; } /* Checks whether the current text position is at the end of a line. */ static BOOL unicode_at_line_end(RE_State* state, Py_ssize_t text_pos) { Py_UCS4 ch; if (text_pos >= state->text_length) return TRUE; ch = state->char_at(state->text, text_pos); if (ch == 0x0A) /* No line break inside CRLF. */ return text_pos >= 1 || state->char_at(state->text, text_pos - 1) != 0x0D; return (0x0A <= ch && ch <= 0x0D) || ch == 0x85 || ch == 0x2028 || ch == 0x2029; } /* Checks whether a character could be Turkic (variants of I/i). */ static BOOL unicode_possible_turkic(Py_UCS4 ch) { return ch == 'I' || ch == 'i' || ch == 0x0130 || ch == 0x0131; } /* Gets all the cases of a character. */ static int unicode_all_cases(Py_UCS4 ch, Py_UCS4* codepoints) { return re_get_all_cases(ch, codepoints); } /* Returns a character with its case folded, unless it could be Turkic * (variants of I/i). */ static Py_UCS4 unicode_simple_case_fold(Py_UCS4 ch) { /* Is it a possible Turkic character? If so, pass it through unchanged. */ if (ch == 'I' || ch == 'i' || ch == 0x0130 || ch == 0x0131) return ch; return (Py_UCS4)re_get_simple_case_folding(ch); } /* Returns a character with its case folded, unless it could be Turkic * (variants of I/i). */ static int unicode_full_case_fold(Py_UCS4 ch, Py_UCS4* folded) { /* Is it a possible Turkic character? If so, pass it through unchanged. */ if (ch == 'I' || ch == 'i' || ch == 0x0130 || ch == 0x0131) { folded[0] = ch; return 1; } return re_get_full_case_folding(ch, folded); } /* Gets all the case variants of Turkic 'I'. */ static int unicode_all_turkic_i(Py_UCS4 ch, Py_UCS4* cases) { int count; count = 0; cases[count++] = ch; if (ch != 'I') cases[count++] = 'I'; if (ch != 'i') cases[count++] = 'i'; if (ch != 0x130) cases[count++] = 0x130; if (ch != 0x131) cases[count++] = 0x131; return count; } /* The handlers for Unicode characters. */ static RE_EncodingTable unicode_encoding = { unicode_has_property, unicode_at_boundary, unicode_at_word_start, unicode_at_word_end, unicode_at_default_boundary, unicode_at_default_word_start, unicode_at_default_word_end, unicode_at_grapheme_boundary, unicode_is_line_sep, unicode_at_line_start, unicode_at_line_end, unicode_possible_turkic, unicode_all_cases, unicode_simple_case_fold, unicode_full_case_fold, unicode_all_turkic_i, }; Py_LOCAL_INLINE(PyObject*) get_object(char* module_name, char* object_name); /* Sets the error message. */ Py_LOCAL_INLINE(void) set_error(int status, PyObject* object) { TRACE(("<>\n")) if (!error_exception) error_exception = get_object("_" RE_MODULE "_core", "error"); switch (status) { case RE_ERROR_BACKTRACKING: PyErr_SetString(error_exception, "too much backtracking"); break; case RE_ERROR_CONCURRENT: PyErr_SetString(PyExc_ValueError, "concurrent not int or None"); break; case RE_ERROR_GROUP_INDEX_TYPE: if (object) PyErr_Format(PyExc_TypeError, "group indices must be integers or strings, not %.200s", object->ob_type->tp_name); else PyErr_Format(PyExc_TypeError, "group indices must be integers or strings"); break; case RE_ERROR_ILLEGAL: PyErr_SetString(PyExc_RuntimeError, "invalid RE code"); break; case RE_ERROR_INDEX: PyErr_SetString(PyExc_TypeError, "string indices must be integers"); break; case RE_ERROR_INTERRUPTED: /* An exception has already been raised, so let it fly. */ break; case RE_ERROR_INVALID_GROUP_REF: PyErr_SetString(error_exception, "invalid group reference"); break; case RE_ERROR_MEMORY: PyErr_NoMemory(); break; case RE_ERROR_NOT_BYTES: PyErr_Format(PyExc_TypeError, "expected bytes instance, %.200s found", object->ob_type->tp_name); break; case RE_ERROR_NOT_STRING: PyErr_Format(PyExc_TypeError, "expected string instance, %.200s found", object->ob_type->tp_name); break; case RE_ERROR_NOT_UNICODE: PyErr_Format(PyExc_TypeError, "expected str instance, %.200s found", object->ob_type->tp_name); break; case RE_ERROR_NO_SUCH_GROUP: PyErr_SetString(PyExc_IndexError, "no such group"); break; case RE_ERROR_REPLACEMENT: PyErr_SetString(error_exception, "invalid replacement"); break; default: /* Other error codes indicate compiler/engine bugs. */ PyErr_SetString(PyExc_RuntimeError, "internal error in regular expression engine"); break; } } /* Allocates memory. * * Sets the Python error handler and returns NULL if the allocation fails. */ Py_LOCAL_INLINE(void*) re_alloc(size_t size) { void* new_ptr; new_ptr = PyMem_Malloc(size); if (!new_ptr) set_error(RE_ERROR_MEMORY, NULL); return new_ptr; } /* Reallocates memory. * * Sets the Python error handler and returns NULL if the reallocation fails. */ Py_LOCAL_INLINE(void*) re_realloc(void* ptr, size_t size) { void* new_ptr; new_ptr = PyMem_Realloc(ptr, size); if (!new_ptr) set_error(RE_ERROR_MEMORY, NULL); return new_ptr; } /* Deallocates memory. */ Py_LOCAL_INLINE(void) re_dealloc(void* ptr) { PyMem_Free(ptr); } /* Releases the GIL if multithreading is enabled. */ Py_LOCAL_INLINE(void) release_GIL(RE_SafeState* safe_state) { if (safe_state->re_state->is_multithreaded) safe_state->thread_state = PyEval_SaveThread(); } /* Acquires the GIL if multithreading is enabled. */ Py_LOCAL_INLINE(void) acquire_GIL(RE_SafeState* safe_state) { if (safe_state->re_state->is_multithreaded) PyEval_RestoreThread(safe_state->thread_state); } /* Allocates memory, holding the GIL during the allocation. * * Sets the Python error handler and returns NULL if the allocation fails. */ Py_LOCAL_INLINE(void*) safe_alloc(RE_SafeState* safe_state, size_t size) { void* new_ptr; acquire_GIL(safe_state); new_ptr = re_alloc(size); release_GIL(safe_state); return new_ptr; } /* Reallocates memory, holding the GIL during the reallocation. * * Sets the Python error handler and returns NULL if the reallocation fails. */ Py_LOCAL_INLINE(void*) safe_realloc(RE_SafeState* safe_state, void* ptr, size_t size) { void* new_ptr; acquire_GIL(safe_state); new_ptr = re_realloc(ptr, size); release_GIL(safe_state); return new_ptr; } /* Deallocates memory, holding the GIL during the deallocation. */ Py_LOCAL_INLINE(void) safe_dealloc(RE_SafeState* safe_state, void* ptr) { acquire_GIL(safe_state); re_dealloc(ptr); release_GIL(safe_state); } /* Checks for KeyboardInterrupt, holding the GIL during the check. */ Py_LOCAL_INLINE(BOOL) safe_check_signals(RE_SafeState* safe_state) { BOOL result; acquire_GIL(safe_state); result = (BOOL)PyErr_CheckSignals(); release_GIL(safe_state); return result; } /* Checks whether a character is in a range. */ Py_LOCAL_INLINE(BOOL) in_range(Py_UCS4 lower, Py_UCS4 upper, Py_UCS4 ch) { return lower <= ch && ch <= upper; } /* Checks whether 2 characters are the same, ignoring case. */ static BOOL same_char_ign(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2) { Py_UCS4 cases[RE_MAX_CASES]; int count; int i; if (ch1 == ch2) return TRUE; count = encoding->all_cases(ch1, cases); for (i = 1; i < count; i++) { if (cases[i] == ch2) return TRUE; } return FALSE; } /* Checks whether a character has or hasn't the given property, ignoring case. */ Py_LOCAL_INLINE(BOOL) has_property_ign(RE_EncodingTable* encoding, RE_CODE property, Py_UCS4 ch) { RE_UINT32 prop; prop = property >> 16; /* We need to do special handling of case-sensitive properties according to * the 'encoding'. */ if (encoding == &unicode_encoding) { /* We are working with Unicode. */ if (property == RE_PROP_GC_LU || property == RE_PROP_GC_LL || property == RE_PROP_GC_LT) { RE_UINT32 value; value = re_get_general_category(ch); return value == RE_PROP_LU || value == RE_PROP_LL || value == RE_PROP_LT; } else if (prop == RE_PROP_UPPERCASE || prop == RE_PROP_LOWERCASE) return (BOOL)re_get_cased(ch); /* The property is case-insensitive. */ return unicode_has_property(property, ch); } else if (encoding == &ascii_encoding) { /* We are working with ASCII. */ if (property == RE_PROP_GC_LU || property == RE_PROP_GC_LL || property == RE_PROP_GC_LT) { RE_UINT32 value; value = re_get_general_category(ch); return value == RE_PROP_LU || value == RE_PROP_LL || value == RE_PROP_LT; } else if (prop == RE_PROP_UPPERCASE || prop == RE_PROP_LOWERCASE) return (BOOL)re_get_cased(ch); /* The property is case-insensitive. */ return ascii_has_property(property, ch); } else { /* We are working with Locale. */ if (property == RE_PROP_GC_LU || property == RE_PROP_GC_LL || property == RE_PROP_GC_LT) return (isupper(ch) || islower(ch)) != 0; else if (prop == RE_PROP_UPPERCASE || prop == RE_PROP_LOWERCASE) return (isupper(ch) || islower(ch)) != 0; /* The property is case-insensitive. */ return locale_has_property(property, ch); } } /* Checks whether a character is in a range, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_range_ign(RE_EncodingTable* encoding, Py_UCS4 lower, Py_UCS4 upper, Py_UCS4 ch) { Py_UCS4 cases[RE_MAX_CASES]; int count; int i; count = encoding->all_cases(ch, cases); for (i = 0; i < count; i++) { if (in_range(lower, upper, cases[i])) return TRUE; } return FALSE; } Py_LOCAL_INLINE(BOOL) in_set_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); Py_LOCAL_INLINE(BOOL) in_set_inter(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); Py_LOCAL_INLINE(BOOL) in_set_sym_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); Py_LOCAL_INLINE(BOOL) in_set_union(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch); /* Checks whether a character matches a set member. */ Py_LOCAL_INLINE(BOOL) matches_member(RE_EncodingTable* encoding, RE_Node* member, Py_UCS4 ch) { switch (member->op) { case RE_OP_CHARACTER: /* values are: char_code */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) return ch == member->values[0]; case RE_OP_PROPERTY: /* values are: property */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) return encoding->has_property(member->values[0], ch); case RE_OP_RANGE: /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[member->op], member->match, member->values[0], member->values[1])) return in_range(member->values[0], member->values[1], ch); case RE_OP_SET_DIFF: TRACE(("%s\n", re_op_text[member->op])) return in_set_diff(encoding, member, ch); case RE_OP_SET_INTER: TRACE(("%s\n", re_op_text[member->op])) return in_set_inter(encoding, member, ch); case RE_OP_SET_SYM_DIFF: TRACE(("%s\n", re_op_text[member->op])) return in_set_sym_diff(encoding, member, ch); case RE_OP_SET_UNION: TRACE(("%s\n", re_op_text[member->op])) return in_set_union(encoding, member, ch); case RE_OP_STRING: { /* values are: char_code, char_code, ... */ size_t i; TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->value_count)) for (i = 0; i < member->value_count; i++) { if (ch == member->values[i]) return TRUE; } return FALSE; } default: return FALSE; } } /* Checks whether a character matches a set member, ignoring case. */ Py_LOCAL_INLINE(BOOL) matches_member_ign(RE_EncodingTable* encoding, RE_Node* member, int case_count, Py_UCS4* cases) { int i; for (i = 0; i < case_count; i++) { switch (member->op) { case RE_OP_CHARACTER: /* values are: char_code */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) if (cases[i] == member->values[0]) return TRUE; break; case RE_OP_PROPERTY: /* values are: property */ TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->values[0])) if (encoding->has_property(member->values[0], cases[i])) return TRUE; break; case RE_OP_RANGE: /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[member->op], member->match, member->values[0], member->values[1])) if (in_range(member->values[0], member->values[1], cases[i])) return TRUE; break; case RE_OP_SET_DIFF: TRACE(("%s\n", re_op_text[member->op])) if (in_set_diff(encoding, member, cases[i])) return TRUE; break; case RE_OP_SET_INTER: TRACE(("%s\n", re_op_text[member->op])) if (in_set_inter(encoding, member, cases[i])) return TRUE; break; case RE_OP_SET_SYM_DIFF: TRACE(("%s\n", re_op_text[member->op])) if (in_set_sym_diff(encoding, member, cases[i])) return TRUE; break; case RE_OP_SET_UNION: TRACE(("%s\n", re_op_text[member->op])) if (in_set_union(encoding, member, cases[i])) return TRUE; break; case RE_OP_STRING: { size_t j; TRACE(("%s %d %d\n", re_op_text[member->op], member->match, member->value_count)) for (j = 0; j < member->value_count; j++) { if (cases[i] == member->values[j]) return TRUE; } break; } default: return TRUE; } } return FALSE; } /* Checks whether a character is in a set difference. */ Py_LOCAL_INLINE(BOOL) in_set_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; member = node->nonstring.next_2.node; if (matches_member(encoding, member, ch) != member->match) return FALSE; member = member->next_1.node; while (member) { if (matches_member(encoding, member, ch) == member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set difference, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_diff_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; member = node->nonstring.next_2.node; if (matches_member_ign(encoding, member, case_count, cases) != member->match) return FALSE; member = member->next_1.node; while (member) { if (matches_member_ign(encoding, member, case_count, cases) == member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set intersection. */ Py_LOCAL_INLINE(BOOL) in_set_inter(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member(encoding, member, ch) != member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set intersection, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_inter_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member_ign(encoding, member, case_count, cases) != member->match) return FALSE; member = member->next_1.node; } return TRUE; } /* Checks whether a character is in a set symmetric difference. */ Py_LOCAL_INLINE(BOOL) in_set_sym_diff(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; BOOL result; member = node->nonstring.next_2.node; result = FALSE; while (member) { if (matches_member(encoding, member, ch) == member->match) result = !result; member = member->next_1.node; } return result; } /* Checks whether a character is in a set symmetric difference, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_sym_diff_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; BOOL result; member = node->nonstring.next_2.node; result = FALSE; while (member) { if (matches_member_ign(encoding, member, case_count, cases) == member->match) result = !result; member = member->next_1.node; } return result; } /* Checks whether a character is in a set union. */ Py_LOCAL_INLINE(BOOL) in_set_union(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member(encoding, member, ch) == member->match) return TRUE; member = member->next_1.node; } return FALSE; } /* Checks whether a character is in a set union, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_union_ign(RE_EncodingTable* encoding, RE_Node* node, int case_count, Py_UCS4* cases) { RE_Node* member; member = node->nonstring.next_2.node; while (member) { if (matches_member_ign(encoding, member, case_count, cases) == member->match) return TRUE; member = member->next_1.node; } return FALSE; } /* Checks whether a character is in a set. */ Py_LOCAL_INLINE(BOOL) in_set(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { switch (node->op) { case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_REV: return in_set_diff(encoding, node, ch); case RE_OP_SET_INTER: case RE_OP_SET_INTER_REV: return in_set_inter(encoding, node, ch); case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_REV: return in_set_sym_diff(encoding, node, ch); case RE_OP_SET_UNION: case RE_OP_SET_UNION_REV: return in_set_union(encoding, node, ch); } return FALSE; } /* Checks whether a character is in a set, ignoring case. */ Py_LOCAL_INLINE(BOOL) in_set_ign(RE_EncodingTable* encoding, RE_Node* node, Py_UCS4 ch) { Py_UCS4 cases[RE_MAX_CASES]; int case_count; case_count = encoding->all_cases(ch, cases); switch (node->op) { case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: return in_set_diff_ign(encoding, node, case_count, cases); case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: return in_set_inter_ign(encoding, node, case_count, cases); case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: return in_set_sym_diff_ign(encoding, node, case_count, cases); case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: return in_set_union_ign(encoding, node, case_count, cases); } return FALSE; } /* Resets a guard list. */ Py_LOCAL_INLINE(void) reset_guard_list(RE_GuardList* guard_list) { guard_list->count = 0; guard_list->last_text_pos = -1; } /* Initialises the state for a match. */ Py_LOCAL_INLINE(void) init_match(RE_State* state) { Py_ssize_t i; /* Reset the backtrack. */ state->current_backtrack_block = &state->backtrack_block; state->current_backtrack_block->count = 0; state->current_saved_groups = state->first_saved_groups; state->backtrack = NULL; state->search_anchor = state->text_pos; state->match_pos = state->text_pos; /* Reset the guards for the repeats. */ for (i = 0; i < state->pattern->repeat_count; i++) { reset_guard_list(&state->repeats[i].body_guard_list); reset_guard_list(&state->repeats[i].tail_guard_list); } /* Reset the guards for the fuzzy sections. */ for (i = 0; i < state->pattern->fuzzy_count; i++) { reset_guard_list(&state->fuzzy_guards[i].body_guard_list); reset_guard_list(&state->fuzzy_guards[i].tail_guard_list); } for (i = 0; i < state->pattern->true_group_count; i++) { RE_GroupData* group; group = &state->groups[i]; group->span.start = -1; group->span.end = -1; group->capture_count = 0; group->current_capture = -1; } /* Reset the guards for the group calls. */ for (i = 0; i < state->pattern->call_ref_info_count; i++) reset_guard_list(&state->group_call_guard_list[i]); /* Clear the counts and cost for matching. */ memset(state->fuzzy_info.counts, 0, sizeof(state->fuzzy_info.counts)); state->fuzzy_info.total_cost = 0; state->total_errors = 0; state->total_cost = 0; state->too_few_errors = FALSE; state->capture_change = 0; state->iterations = 0; } /* Adds a new backtrack entry. */ Py_LOCAL_INLINE(BOOL) add_backtrack(RE_SafeState* safe_state, RE_UINT8 op) { RE_State* state; RE_BacktrackBlock* current; state = safe_state->re_state; current = state->current_backtrack_block; if (current->count >= current->capacity) { if (!current->next) { RE_BacktrackBlock* next; /* Is there too much backtracking? */ if (state->backtrack_allocated >= RE_MAX_BACKTRACK_ALLOC) return FALSE; next = (RE_BacktrackBlock*)safe_alloc(safe_state, sizeof(RE_BacktrackBlock)); if (!next) return FALSE; next->previous = current; next->next = NULL; next->capacity = RE_BACKTRACK_BLOCK_SIZE; current->next = next; state->backtrack_allocated += RE_BACKTRACK_BLOCK_SIZE; } current = current->next; current->count = 0; state->current_backtrack_block = current; } state->backtrack = ¤t->items[current->count++]; state->backtrack->op = op; return TRUE; } /* Gets the last backtrack entry. * * It'll never be called when there are _no_ entries. */ Py_LOCAL_INLINE(RE_BacktrackData*) last_backtrack(RE_State* state) { RE_BacktrackBlock* current; current = state->current_backtrack_block; state->backtrack = ¤t->items[current->count - 1]; return state->backtrack; } /* Discards the last backtrack entry. * * It'll never be called to discard the _only_ entry. */ Py_LOCAL_INLINE(void) discard_backtrack(RE_State* state) { RE_BacktrackBlock* current; current = state->current_backtrack_block; --current->count; if (current->count == 0 && current->previous) state->current_backtrack_block = current->previous; } /* Copies a repeat guard list. */ Py_LOCAL_INLINE(BOOL) copy_guard_data(RE_SafeState* safe_state, RE_GuardList* dst, RE_GuardList* src) { if (dst->capacity < src->count) { RE_GuardSpan* new_spans; if (!safe_state) return FALSE; dst->capacity = src->count; new_spans = (RE_GuardSpan*)safe_realloc(safe_state, dst->spans, dst->capacity * sizeof(RE_GuardSpan)); if (!new_spans) return FALSE; dst->spans = new_spans; } dst->count = src->count; memmove(dst->spans, src->spans, dst->count * sizeof(RE_GuardSpan)); dst->last_text_pos = -1; return TRUE; } /* Copies a repeat. */ Py_LOCAL_INLINE(BOOL) copy_repeat_data(RE_SafeState* safe_state, RE_RepeatData* dst, RE_RepeatData* src) { if (!copy_guard_data(safe_state, &dst->body_guard_list, &src->body_guard_list) || !copy_guard_data(safe_state, &dst->tail_guard_list, &src->tail_guard_list)) { safe_dealloc(safe_state, dst->body_guard_list.spans); safe_dealloc(safe_state, dst->tail_guard_list.spans); return FALSE; } dst->count = src->count; dst->start = src->start; dst->capture_change = src->capture_change; return TRUE; } /* Pushes a return node onto the group call stack. */ Py_LOCAL_INLINE(BOOL) push_group_return(RE_SafeState* safe_state, RE_Node* return_node) { RE_State* state; PatternObject* pattern; RE_GroupCallFrame* frame; state = safe_state->re_state; pattern = state->pattern; if (state->current_group_call_frame && state->current_group_call_frame->next) /* Advance to the next allocated frame. */ frame = state->current_group_call_frame->next; else if (!state->current_group_call_frame && state->first_group_call_frame) /* Advance to the first allocated frame. */ frame = state->first_group_call_frame; else { /* Create a new frame. */ frame = (RE_GroupCallFrame*)safe_alloc(safe_state, sizeof(RE_GroupCallFrame)); if (!frame) return FALSE; frame->groups = (RE_GroupData*)safe_alloc(safe_state, pattern->true_group_count * sizeof(RE_GroupData)); frame->repeats = (RE_RepeatData*)safe_alloc(safe_state, pattern->repeat_count * sizeof(RE_RepeatData)); if (!frame->groups || !frame->repeats) { safe_dealloc(safe_state, frame->groups); safe_dealloc(safe_state, frame->repeats); safe_dealloc(safe_state, frame); return FALSE; } memset(frame->groups, 0, pattern->true_group_count * sizeof(RE_GroupData)); memset(frame->repeats, 0, pattern->repeat_count * sizeof(RE_RepeatData)); frame->previous = state->current_group_call_frame; frame->next = NULL; if (frame->previous) frame->previous->next = frame; else state->first_group_call_frame = frame; } frame->node = return_node; /* Push the groups and guards. */ if (return_node) { Py_ssize_t g; Py_ssize_t r; for (g = 0; g < pattern->true_group_count; g++) { frame->groups[g].span = state->groups[g].span; frame->groups[g].current_capture = state->groups[g].current_capture; } for (r = 0; r < pattern->repeat_count; r++) { if (!copy_repeat_data(safe_state, &frame->repeats[r], &state->repeats[r])) return FALSE; } } state->current_group_call_frame = frame; return TRUE; } /* Pops a return node from the group call stack. */ Py_LOCAL_INLINE(RE_Node*) pop_group_return(RE_State* state) { RE_GroupCallFrame* frame; frame = state->current_group_call_frame; /* Pop the groups and repeats. */ if (frame->node) { PatternObject* pattern; Py_ssize_t g; Py_ssize_t r; pattern = state->pattern; for (g = 0; g < pattern->true_group_count; g++) { state->groups[g].span = frame->groups[g].span; state->groups[g].current_capture = frame->groups[g].current_capture; } for (r = 0; r < pattern->repeat_count; r++) copy_repeat_data(NULL, &state->repeats[r], &frame->repeats[r]); } /* Withdraw to previous frame. */ state->current_group_call_frame = frame->previous; return frame->node; } /* Returns the return node from the top of the group call stack. */ Py_LOCAL_INLINE(RE_Node*) top_group_return(RE_State* state) { RE_GroupCallFrame* frame; frame = state->current_group_call_frame; return frame->node; } /* Checks whether the node is a firstset. */ Py_LOCAL_INLINE(BOOL) is_firstset(RE_Node* node) { if (node->step != 0) return FALSE; switch (node->op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: return TRUE; default: return FALSE; } } /* Locates the start node for testing ahead. */ Py_LOCAL_INLINE(RE_Node*) locate_test_start(RE_Node* node) { for (;;) { switch (node->op) { case RE_OP_BOUNDARY: switch (node->next_1.node->op) { case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: return node->next_1.node; default: return node; } case RE_OP_CALL_REF: case RE_OP_END_GROUP: case RE_OP_START_GROUP: node = node->next_1.node; break; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: if (node->values[1] == 0) return node; node = node->next_1.node; break; case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: if (node->values[1] == 0) return node; return node->nonstring.next_2.node; case RE_OP_LOOKAROUND: node = node->next_1.node; break; default: if (is_firstset(node)) { switch (node->next_1.node->op) { case RE_OP_END_OF_STRING: case RE_OP_START_OF_STRING: return node->next_1.node; } } return node; } } } /* Checks whether a character matches any of a set of case characters. */ Py_LOCAL_INLINE(BOOL) any_case(Py_UCS4 ch, int case_count, Py_UCS4* cases) { int i; for (i = 0; i < case_count; i++) { if (ch == cases[i]) return TRUE; } return FALSE; } /* Matches many ANYs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] != '\n') == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] != '\n') == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] != '\n') == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many ANYs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY_REV(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] != '\n') == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] != '\n') == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] != '\n') == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many ANY_Us. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY_U(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { BOOL (*is_line_sep)(Py_UCS4 ch); void* text; is_line_sep = state->encoding->is_line_sep; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && is_line_sep(text_ptr[0]) != match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && is_line_sep(text_ptr[0]) != match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && is_line_sep(text_ptr[0]) != match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many ANY_Us backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_ANY_U_REV(RE_State* state, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { BOOL (*is_line_sep)(Py_UCS4 ch); void* text; is_line_sep = state->encoding->is_line_sep; text = state->text; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && is_line_sep(text_ptr[-1]) != match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && is_line_sep(text_ptr[-1]) != match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && is_line_sep(text_ptr[-1]) != match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 ch; text = state->text; match = node->match == match; ch = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] == ch) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] == ch) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && (text_ptr[0] == ch) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; match = node->match == match; case_count = state->encoding->all_cases(node->values[0], cases); switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && any_case(text_ptr[0], case_count, cases) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && any_case(text_ptr[0], case_count, cases) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && any_case(text_ptr[0], case_count, cases) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; match = node->match == match; case_count = state->encoding->all_cases(node->values[0], cases); switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && any_case(text_ptr[-1], case_count, cases) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && any_case(text_ptr[-1], case_count, cases) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && any_case(text_ptr[-1], case_count, cases) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many CHARACTERs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_CHARACTER_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 ch; text = state->text; match = node->match == match; ch = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] == ch) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] == ch) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && (text_ptr[-1] == ch) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); RE_CODE property; text = state->text; match = node->match == match; has_property = state->encoding->has_property; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && has_property(property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && has_property(property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && has_property(property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; RE_CODE property; text = state->text; match = node->match == match; encoding = state->encoding; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && has_property_ign(encoding, property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && has_property_ign(encoding, property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && has_property_ign(encoding, property, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; RE_CODE property; text = state->text; match = node->match == match; encoding = state->encoding; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && has_property_ign(encoding, property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && has_property_ign(encoding, property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && has_property_ign(encoding, property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many PROPERTYs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_PROPERTY_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); RE_CODE property; text = state->text; match = node->match == match; has_property = state->encoding->has_property; property = node->values[0]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && has_property(property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && has_property(property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && has_property(property, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 lower; Py_UCS4 upper; text = state->text; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_range(lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_range(lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_range(lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; Py_UCS4 lower; Py_UCS4 upper; text = state->text; encoding = state->encoding; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; Py_UCS4 lower; Py_UCS4 upper; text = state->text; encoding = state->encoding; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_range_ign(encoding, lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many RANGEs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_RANGE_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; Py_UCS4 lower; Py_UCS4 upper; text = state->text; match = node->match == match; lower = node->values[0]; upper = node->values[1]; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_range(lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_range(lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_range(lower, upper, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_set(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_set(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_set(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET_IGN(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr < limit_ptr && in_set_ign(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr < limit_ptr && in_set_ign(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr < limit_ptr && in_set_ign(encoding, node, text_ptr[0]) == match) ++text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET_IGN_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_set_ign(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_set_ign(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_set_ign(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Matches many SETs backwards. */ Py_LOCAL_INLINE(Py_ssize_t) match_many_SET_REV(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, BOOL match) { void* text; RE_EncodingTable* encoding; text = state->text; match = node->match == match; encoding = state->encoding; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr > limit_ptr && in_set(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS1*)text; break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr > limit_ptr && in_set(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS2*)text; break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr > limit_ptr && in_set(encoding, node, text_ptr[-1]) == match) --text_ptr; text_pos = text_ptr - (Py_UCS4*)text; break; } } return text_pos; } /* Counts a repeated character pattern. */ Py_LOCAL_INLINE(size_t) count_one(RE_State* state, RE_Node* node, Py_ssize_t text_pos, size_t max_count) { if (max_count < 1) return 0; switch (node->op) { case RE_OP_ANY: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_ANY(state, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_ANY_ALL: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return max_count; case RE_OP_ANY_ALL_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return max_count; case RE_OP_ANY_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_ANY_REV(state, text_pos, text_pos - max_count, TRUE); case RE_OP_ANY_U: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_ANY_U(state, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_ANY_U_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_ANY_U_REV(state, text_pos, text_pos - max_count, TRUE); case RE_OP_CHARACTER: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_CHARACTER(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_CHARACTER_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_CHARACTER_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_CHARACTER_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_CHARACTER_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_CHARACTER_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_CHARACTER_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_PROPERTY: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_PROPERTY(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_PROPERTY_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_PROPERTY_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_PROPERTY_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_PROPERTY_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_PROPERTY_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_PROPERTY_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_RANGE: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_RANGE(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_RANGE_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_RANGE_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_RANGE_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_RANGE_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_RANGE_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_RANGE_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_SET_DIFF: case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_SET(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_SET_DIFF_IGN: case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: max_count = RE_MIN(max_count, (size_t)(state->slice_end - text_pos)); return match_many_SET_IGN(state, node, text_pos, text_pos + max_count, TRUE) - text_pos; case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_SET_IGN_REV(state, node, text_pos, text_pos - max_count, TRUE); case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: max_count = RE_MIN(max_count, (size_t)(text_pos - state->slice_start)); return text_pos - match_many_SET_REV(state, node, text_pos, text_pos - max_count, TRUE); } return 0; } /* Tries to match a character pattern. */ Py_LOCAL_INLINE(BOOL) match_one(RE_State* state, RE_Node* node, Py_ssize_t text_pos) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; char_at = state->char_at; text = state->text; switch (node->op) { case RE_OP_ANY: return text_pos < state->slice_end && char_at(text, text_pos) != '\n'; case RE_OP_ANY_ALL: return text_pos < state->slice_end; case RE_OP_ANY_ALL_REV: return text_pos > state->slice_start; case RE_OP_ANY_REV: return text_pos > state->slice_start && char_at(text, text_pos - 1) != '\n'; case RE_OP_ANY_U: return text_pos < state->slice_end && !state->encoding->is_line_sep(char_at(text, text_pos)); case RE_OP_ANY_U_REV: return text_pos > state->slice_start && !state->encoding->is_line_sep(char_at(text, text_pos - 1)); case RE_OP_CHARACTER: return text_pos < state->slice_end && (char_at(text, text_pos) == node->values[0]) == node->match; case RE_OP_CHARACTER_IGN: return text_pos < state->slice_end && same_char_ign(state->encoding, char_at(text, text_pos), node->values[0]) == node->match; case RE_OP_CHARACTER_IGN_REV: return text_pos > state->slice_start && same_char_ign(state->encoding, char_at(text, text_pos - 1), node->values[0]) == node->match; case RE_OP_CHARACTER_REV: return text_pos > state->slice_start && (char_at(text, text_pos - 1) == node->values[0]) == node->match; case RE_OP_PROPERTY: return text_pos < state->slice_end && state->encoding->has_property(node->values[0], char_at(text, text_pos)) == node->match; case RE_OP_PROPERTY_IGN: return text_pos < state->slice_end && has_property_ign(state->encoding, node->values[0], char_at(text, text_pos)) == node->match; case RE_OP_PROPERTY_IGN_REV: return text_pos > state->slice_start && has_property_ign(state->encoding, node->values[0], char_at(text, text_pos - 1)) == node->match; case RE_OP_PROPERTY_REV: return text_pos > state->slice_start && state->encoding->has_property(node->values[0], char_at(text, text_pos - 1)) == node->match; case RE_OP_RANGE: return text_pos < state->slice_end && in_range(node->values[0], node->values[1], char_at(text, text_pos)) == node->match; case RE_OP_RANGE_IGN: return text_pos < state->slice_end && in_range_ign(state->encoding, node->values[0], node->values[1], char_at(text, text_pos)) == node->match; case RE_OP_RANGE_IGN_REV: return text_pos > state->slice_start && in_range_ign(state->encoding, node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match; case RE_OP_RANGE_REV: return text_pos > state->slice_start && in_range(node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match; case RE_OP_SET_DIFF: case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: return text_pos < state->slice_end && in_set(state->encoding, node, char_at(text, text_pos)) == node->match; case RE_OP_SET_DIFF_IGN: case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: return text_pos < state->slice_end && in_set_ign(state->encoding, node, char_at(text, text_pos)) == node->match; case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: return text_pos > state->slice_start && in_set_ign(state->encoding, node, char_at(text, text_pos - 1)) == node->match; case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: return text_pos > state->slice_start && in_set(state->encoding, node, char_at(text, text_pos - 1)) == node->match; } return FALSE; } /* Performs a simple string search. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; Py_UCS4 first_char; text = state->text; length = node->value_count; values = node->values; first_char = values[0]; limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text; } ++text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text; } ++text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text; } ++text_ptr; } break; } } return -1; } /* Performs a simple string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search_ign(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; RE_EncodingTable* encoding; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; length = node->value_count; values = node->values; encoding = state->encoding; case_count = encoding->all_cases(values[0], cases); limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text; } ++text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text; } ++text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text; } ++text_ptr; } break; } } return -1; } /* Performs a simple string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search_ign_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; RE_EncodingTable* encoding; Py_UCS4 cases[RE_MAX_CASES]; int case_count; text = state->text; length = node->value_count; values = node->values; encoding = state->encoding; case_count = encoding->all_cases(values[0], cases); text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; } --text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; } --text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { if (any_case(text_ptr[0], case_count, cases)) { size_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; } --text_ptr; } break; } } return -1; } /* Performs a simple string search backwards. */ Py_LOCAL_INLINE(Py_ssize_t) simple_string_search_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; size_t length; RE_CODE* values; Py_UCS4 first_char; text = state->text; length = node->value_count; values = node->values; first_char = values[0]; text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; } --text_ptr; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; } --text_ptr; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { if (text_ptr[0] == first_char) { size_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; } --text_ptr; } break; } } return -1; } /* Performs a Boyer-Moore fast string search. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_ssize_t last_pos; Py_UCS4 check_char; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; last_pos = length - 1; check_char = values[last_pos]; limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (ch == check_char) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && text_ptr[pos] == values[pos]) --pos; if (pos < 0) return text_ptr - (Py_UCS1*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (ch == check_char) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && text_ptr[pos] == values[pos]) --pos; if (pos < 0) return text_ptr - (Py_UCS2*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (ch == check_char) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && text_ptr[pos] == values[pos]) --pos; if (pos < 0) return text_ptr - (Py_UCS4*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Performs a Boyer-Moore fast string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search_ign(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_EncodingTable* encoding; void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_ssize_t last_pos; Py_UCS4 cases[RE_MAX_CASES]; int case_count; encoding = state->encoding; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; last_pos = length - 1; case_count = encoding->all_cases(values[last_pos], cases); limit -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && same_char_ign(encoding, text_ptr[pos], values[pos])) --pos; if (pos < 0) return text_ptr - (Py_UCS1*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && same_char_ign(encoding, text_ptr[pos], values[pos])) --pos; if (pos < 0) return text_ptr - (Py_UCS2*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr <= limit_ptr) { Py_UCS4 ch; ch = text_ptr[last_pos]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = last_pos - 1; while (pos >= 0 && same_char_ign(encoding, text_ptr[pos], values[pos])) --pos; if (pos < 0) return text_ptr - (Py_UCS4*)text; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Performs a Boyer-Moore fast string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search_ign_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_EncodingTable* encoding; void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_UCS4 cases[RE_MAX_CASES]; int case_count; encoding = state->encoding; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; case_count = encoding->all_cases(values[0], cases); text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (any_case(ch, case_count, cases)) { Py_ssize_t pos; pos = 1; while (pos < length && same_char_ign(encoding, text_ptr[pos], values[pos])) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Performs a Boyer-Moore fast string search backwards. */ Py_LOCAL_INLINE(Py_ssize_t) fast_string_search_rev(RE_State* state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { void* text; Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad_character_offset; Py_ssize_t* good_suffix_offset; Py_UCS4 check_char; text = state->text; length = (Py_ssize_t)node->value_count; values = node->values; good_suffix_offset = node->string.good_suffix_offset; bad_character_offset = node->string.bad_character_offset; check_char = values[0]; text_pos -= length; switch (state->charsize) { case 1: { Py_UCS1* text_ptr; Py_UCS1* limit_ptr; text_ptr = (Py_UCS1*)text + text_pos; limit_ptr = (Py_UCS1*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (ch == check_char) { Py_ssize_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS1*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 2: { Py_UCS2* text_ptr; Py_UCS2* limit_ptr; text_ptr = (Py_UCS2*)text + text_pos; limit_ptr = (Py_UCS2*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (ch == check_char) { Py_ssize_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS2*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } case 4: { Py_UCS4* text_ptr; Py_UCS4* limit_ptr; text_ptr = (Py_UCS4*)text + text_pos; limit_ptr = (Py_UCS4*)text + limit; while (text_ptr >= limit_ptr) { Py_UCS4 ch; ch = text_ptr[0]; if (ch == check_char) { Py_ssize_t pos; pos = 1; while (pos < length && text_ptr[pos] == values[pos]) ++pos; if (pos >= length) return text_ptr - (Py_UCS4*)text + length; text_ptr += good_suffix_offset[pos]; } else text_ptr += bad_character_offset[ch & 0xFF]; } break; } } return -1; } /* Check whether 2 characters are the same. */ static BOOL same_char(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2) { return ch1 == ch2; } /* Build the tables for a Boyer-Moore fast string search. */ Py_LOCAL_INLINE(BOOL) build_fast_tables(RE_EncodingTable* encoding, RE_Node* node, BOOL ignore) { Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad; Py_ssize_t* good; Py_UCS4 ch; Py_ssize_t last_pos; Py_ssize_t pos; BOOL (*is_same_char)(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2); Py_ssize_t suffix_len; BOOL saved_start; Py_ssize_t s; Py_ssize_t i; Py_ssize_t s_start; Py_UCS4 codepoints[RE_MAX_CASES]; length = (Py_ssize_t)node->value_count; if (length < RE_MIN_FAST_LENGTH) return TRUE; values = node->values; bad = (Py_ssize_t*)re_alloc(256 * sizeof(bad[0])); good = (Py_ssize_t*)re_alloc(length * sizeof(good[0])); if (!bad || !good) { re_dealloc(bad); re_dealloc(good); return FALSE; } for (ch = 0; ch < 0x100; ch++) bad[ch] = length; last_pos = length - 1; for (pos = 0; pos < last_pos; pos++) { Py_ssize_t offset; offset = last_pos - pos; ch = values[pos]; if (ignore) { int count; int i; count = encoding->all_cases(ch, codepoints); for (i = 0; i < count; i++) bad[codepoints[i] & 0xFF] = offset; } else bad[ch & 0xFF] = offset; } is_same_char = ignore ? same_char_ign : same_char; suffix_len = 2; pos = length - suffix_len; saved_start = FALSE; s = pos - 1; i = suffix_len - 1; s_start = s; while (pos >= 0) { /* Look for another occurrence of the suffix. */ while (i > 0) { /* Have we dropped off the end of the string? */ if (s + i < 0) break; if (is_same_char(encoding, values[s + i], values[pos + i])) /* It still matches. */ --i; else { /* Start again further along. */ --s; i = suffix_len - 1; } } if (s >= 0 && is_same_char(encoding, values[s], values[pos])) { /* We haven't dropped off the end of the string, and the suffix has * matched this far, so this is a good starting point for the next * iteration. */ --s; if (!saved_start) { s_start = s; saved_start = TRUE; } } else { /* Calculate the suffix offset. */ good[pos] = pos - s; /* Extend the suffix and start searching for _this_ one. */ --pos; ++suffix_len; /* Where's a good place to start searching? */ if (saved_start) { s = s_start; saved_start = FALSE; } else --s; /* Can we short-circuit the searching? */ if (s < 0) break; } i = suffix_len - 1; } /* Fill-in any remaining entries. */ while (pos >= 0) { good[pos] = pos - s; --pos; --s; } node->string.bad_character_offset = bad; node->string.good_suffix_offset = good; return TRUE; } /* Build the tables for a Boyer-Moore fast string search backwards. */ Py_LOCAL_INLINE(BOOL) build_fast_tables_rev(RE_EncodingTable* encoding, RE_Node* node, BOOL ignore) { Py_ssize_t length; RE_CODE* values; Py_ssize_t* bad; Py_ssize_t* good; Py_UCS4 ch; Py_ssize_t last_pos; Py_ssize_t pos; BOOL (*is_same_char)(RE_EncodingTable* encoding, Py_UCS4 ch1, Py_UCS4 ch2); Py_ssize_t suffix_len; BOOL saved_start; Py_ssize_t s; Py_ssize_t i; Py_ssize_t s_start; Py_UCS4 codepoints[RE_MAX_CASES]; length = (Py_ssize_t)node->value_count; if (length < RE_MIN_FAST_LENGTH) return TRUE; values = node->values; bad = (Py_ssize_t*)re_alloc(256 * sizeof(bad[0])); good = (Py_ssize_t*)re_alloc(length * sizeof(good[0])); if (!bad || !good) { re_dealloc(bad); re_dealloc(good); return FALSE; } for (ch = 0; ch < 0x100; ch++) bad[ch] = -length; last_pos = length - 1; for (pos = last_pos; pos > 0; pos--) { Py_ssize_t offset; offset = -pos; ch = values[pos]; if (ignore) { int count; int i; count = encoding->all_cases(ch, codepoints); for (i = 0; i < count; i++) bad[codepoints[i] & 0xFF] = offset; } else bad[ch & 0xFF] = offset; } is_same_char = ignore ? same_char_ign : same_char; suffix_len = 2; pos = suffix_len - 1; saved_start = FALSE; s = pos + 1; i = suffix_len - 1; s_start = s; while (pos < length) { /* Look for another occurrence of the suffix. */ while (i > 0) { /* Have we dropped off the end of the string? */ if (s - i >= length) break; if (is_same_char(encoding, values[s - i], values[pos - i])) /* It still matches. */ --i; else { /* Start again further along. */ ++s; i = suffix_len - 1; } } if (s < length && is_same_char(encoding, values[s], values[pos])) { /* We haven't dropped off the end of the string, and the suffix has * matched this far, so this is a good starting point for the next * iteration. */ ++s; if (!saved_start) { s_start = s; saved_start = TRUE; } } else { /* Calculate the suffix offset. */ good[pos] = pos - s; /* Extend the suffix and start searching for _this_ one. */ ++pos; ++suffix_len; /* Where's a good place to start searching? */ if (saved_start) { s = s_start; saved_start = FALSE; } else ++s; /* Can we short-circuit the searching? */ if (s >= length) break; } i = suffix_len - 1; } /* Fill-in any remaining entries. */ while (pos < length) { good[pos] = pos - s; ++pos; ++s; } node->string.bad_character_offset = bad; node->string.good_suffix_offset = good; return TRUE; } /* Performs a string search. */ Py_LOCAL_INLINE(Py_ssize_t) string_search(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos + (Py_ssize_t)node->value_count > limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables(state->encoding, node, FALSE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search(state, node, text_pos, limit); else found_pos = simple_string_search(state, node, text_pos, limit); return found_pos; } /* Performs a string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_fld(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, Py_ssize_t* new_pos) { RE_State* state; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; RE_CODE* values; Py_ssize_t start_pos; int folded_pos; int folded_len; Py_ssize_t length; Py_ssize_t string_pos; Py_UCS4 folded[RE_MAX_FOLDED]; int case_count; Py_UCS4 cases[RE_MAX_CASES]; state = safe_state->re_state; encoding = state->encoding; full_case_fold = encoding->full_case_fold; char_at = state->char_at; text = state->text; values = node->values; start_pos = text_pos; folded_pos = 0; folded_len = 0; length = node->value_count; string_pos = 0; /* We'll special-case the first character of the string. */ case_count = encoding->all_cases(values[0], cases); while (string_pos < length || folded_pos < folded_len) { if (folded_pos >= folded_len) { fetch: if (text_pos >= limit) return -1; folded_len = full_case_fold(char_at(text, text_pos), folded); folded_pos = 0; } if (string_pos == 0) { int i; for (i = 0; i < case_count; i++) { if (folded[0] == cases[i]) goto match; } ++start_pos; text_pos = start_pos; goto fetch; } else if (same_char_ign(encoding, values[string_pos], folded[folded_pos])) { match: ++string_pos; ++folded_pos; if (folded_pos >= folded_len) ++text_pos; } else { ++start_pos; text_pos = start_pos; folded_pos = 0; folded_len = 0; string_pos = 0; } } if (new_pos) *new_pos = text_pos; return start_pos; } /* Performs a string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_fld_rev(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit, Py_ssize_t* new_pos) { RE_State* state; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; RE_CODE* values; Py_ssize_t start_pos; int folded_pos; int folded_len; Py_ssize_t length; Py_ssize_t string_pos; Py_UCS4 folded[RE_MAX_FOLDED]; int case_count; Py_UCS4 cases[RE_MAX_CASES]; state = safe_state->re_state; encoding = state->encoding; full_case_fold = encoding->full_case_fold; char_at = state->char_at; text = state->text; values = node->values; start_pos = text_pos; folded_pos = 0; folded_len = 0; length = node->value_count; string_pos = length; /* We'll special-case the last character of the string. */ case_count = encoding->all_cases(values[length - 1], cases); while (string_pos > 0 || folded_pos > 0) { if (folded_pos <= 0) { fetch: if (text_pos <= limit) return -1; folded_len = full_case_fold(char_at(text, text_pos - 1), folded); folded_pos = folded_len; } if (string_pos == length) { int i; for (i = 0; i < case_count; i++) { if (folded[folded_len - 1] == cases[i]) goto match; } --start_pos; text_pos = start_pos; goto fetch; } else if (same_char_ign(encoding, values[string_pos - 1], folded[folded_pos - 1])) { match: --string_pos; --folded_pos; if (folded_pos <= 0) --text_pos; } else { --start_pos; text_pos = start_pos; folded_pos = 0; folded_len = 0; string_pos = length; } } if (new_pos) *new_pos = text_pos; return start_pos; } /* Performs a string search, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_ign(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos + (Py_ssize_t)node->value_count > limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables(state->encoding, node, TRUE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search_ign(state, node, text_pos, limit); else found_pos = simple_string_search_ign(state, node, text_pos, limit); return found_pos; } /* Performs a string search backwards, ignoring case. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_ign_rev(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos - (Py_ssize_t)node->value_count < limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables_rev(state->encoding, node, TRUE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search_ign_rev(state, node, text_pos, limit); else found_pos = simple_string_search_ign_rev(state, node, text_pos, limit); return found_pos; } /* Performs a string search backwards. */ Py_LOCAL_INLINE(Py_ssize_t) string_search_rev(RE_SafeState* safe_state, RE_Node* node, Py_ssize_t text_pos, Py_ssize_t limit) { RE_State* state; Py_ssize_t found_pos; state = safe_state->re_state; /* Can the string fit the available space? */ if (text_pos - (Py_ssize_t)node->value_count < limit) return -1; /* Has the node been initialised for fast searching, if necessary? */ if (!(node->status & RE_STATUS_FAST_INIT)) { /* Ideally the pattern should immutable and shareable across threads. * Internally, however, it isn't. For safety we need to hold the GIL. */ acquire_GIL(safe_state); /* Double-check because of multithreading. */ if (!(node->status & RE_STATUS_FAST_INIT)) { build_fast_tables_rev(state->encoding, node, FALSE); node->status |= RE_STATUS_FAST_INIT; } release_GIL(safe_state); } if (node->string.bad_character_offset) found_pos = fast_string_search_rev(state, node, text_pos, limit); else found_pos = simple_string_search_rev(state, node, text_pos, limit); return found_pos; } /* Returns how many characters there could be before full case-folding. */ Py_LOCAL_INLINE(size_t) possible_unfolded_length(size_t length) { if (length == 0) return 0; if (length < RE_MAX_FOLDED) return 1; return length / RE_MAX_FOLDED; } /* Tries a match at the current text position. * * Returns TRUE and the next node and text position if the match succeeds. */ Py_LOCAL_INLINE(BOOL) try_match(RE_State* state, RE_NextNode* next, Py_ssize_t text_pos, RE_Position* next_position) { RE_Node* test; void* text; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); test = next->test; if (test->status & RE_STATUS_FUZZY) { next_position->node = next->node; next_position->text_pos = text_pos; return TRUE; } text = state->text; char_at = state->char_at; switch (test->op) { case RE_OP_ANY: /* Any character, except a newline. */ if (text_pos >= state->slice_end || char_at(text, text_pos) == '\n') return FALSE; break; case RE_OP_ANY_ALL: /* Any character at all. */ if (text_pos >= state->slice_end) return FALSE; break; case RE_OP_ANY_ALL_REV: /* Any character at all. */ if (text_pos <= state->slice_start) return FALSE; break; case RE_OP_ANY_REV: /* Any character, except a newline. */ if (text_pos <= state->slice_start || char_at(text, text_pos - 1) == '\n') return FALSE; break; case RE_OP_ANY_U: /* Any character, except a line separator. */ if (text_pos >= state->slice_end || state->encoding->is_line_sep(char_at(text, text_pos))) return FALSE; break; case RE_OP_ANY_U_REV: /* Any character, except a line separator. */ if (text_pos <= state->slice_start || state->encoding->is_line_sep(char_at(text, text_pos - 1))) return FALSE; break; case RE_OP_BOUNDARY: /* At a word boundary. */ if (state->encoding->at_boundary(state, text_pos) != test->match) return FALSE; break; case RE_OP_BRANCH: /* 2-way branch. */ if (!try_match(state, &test->next_1, text_pos, next_position) && !try_match(state, &test->nonstring.next_2, text_pos, next_position)) return FALSE; break; case RE_OP_CHARACTER: /* A character literal. */ if (text_pos >= state->slice_end || (char_at(text, text_pos) == test->values[0]) != test->match) return FALSE; break; case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ if (text_pos >= state->slice_end || same_char_ign(state->encoding, char_at(text, text_pos), test->values[0]) != test->match) return FALSE; break; case RE_OP_CHARACTER_IGN_REV: /* A character literal, ignoring case. */ if (text_pos <= state->slice_start || same_char_ign(state->encoding, char_at(text, text_pos - 1), test->values[0]) != test->match) return FALSE; break; case RE_OP_CHARACTER_REV: /* A character literal. */ if (text_pos <= state->slice_start || (char_at(text, text_pos - 1) == test->values[0]) != test->match) return FALSE; break; case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ if (state->encoding->at_default_boundary(state, text_pos) != test->match) return FALSE; break; case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ if (state->encoding->at_default_word_end(state, text_pos) != test->match) return FALSE; break; case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ if (state->encoding->at_default_word_start(state, text_pos) != test->match) return FALSE; break; case RE_OP_END_OF_LINE: /* At the end of a line. */ if (text_pos != state->text_length && char_at(text, text_pos) != '\n') return FALSE; break; case RE_OP_END_OF_LINE_U: /* At the end of a line. */ if (!state->encoding->at_line_end(state, text_pos)) return FALSE; break; case RE_OP_END_OF_STRING: /* At the end of the string. */ if (text_pos != state->text_length) return FALSE; break; case RE_OP_END_OF_STRING_LINE: /* At the end of the string or the final newline. */ if (text_pos != state->text_length && text_pos != state->final_newline) return FALSE; break; case RE_OP_END_OF_STRING_LINE_U: /* At the end of the string or the final newline. */ if (text_pos != state->text_length && text_pos != state->final_line_sep) return FALSE; break; case RE_OP_END_OF_WORD: /* At end of a word. */ if (state->encoding->at_word_end(state, text_pos) != test->match) return FALSE; break; case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ if (state->encoding->at_grapheme_boundary(state, text_pos) != test->match) return FALSE; break; case RE_OP_PROPERTY: /* A character property. */ /* values are: property */ if (text_pos >= state->slice_end || state->encoding->has_property(test->values[0], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_PROPERTY_IGN: /* A character property, ignoring case. */ /* values are: property */ if (text_pos >= state->slice_end || !has_property_ign(state->encoding, test->values[0], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_PROPERTY_IGN_REV: /* A character property, ignoring case. */ /* values are: property */ if (text_pos <= state->slice_start || !has_property_ign(state->encoding, test->values[0], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_PROPERTY_REV: /* A character property. */ /* values are: property */ if (text_pos <= state->slice_start || state->encoding->has_property(test->values[0], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_RANGE: /* A range. */ /* values are: range */ if (text_pos >= state->slice_end || in_range(test->values[0], test->values[1], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_RANGE_IGN: /* A range, ignoring case. */ /* values are: range */ if (text_pos >= state->slice_end || in_range_ign(state->encoding, test->values[0], test->values[1], char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_RANGE_IGN_REV: /* A range, ignoring case. */ /* values are: range */ if (text_pos <= state->slice_start || in_range_ign(state->encoding, test->values[0], test->values[1], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_RANGE_REV: /* A range. */ /* values are: range */ if (text_pos <= state->slice_start || in_range(test->values[0], test->values[1], char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ if (text_pos != state->search_anchor) return FALSE; break; case RE_OP_SET_DIFF: /* Character set. */ case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: if (text_pos >= state->slice_end || in_set(state->encoding, test, char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_SET_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: if (text_pos >= state->slice_end || in_set_ign(state->encoding, test, char_at(text, text_pos)) != test->match) return FALSE; break; case RE_OP_SET_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: if (text_pos <= state->slice_start || in_set_ign(state->encoding, test, char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_SET_DIFF_REV: /* Character set. */ case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: if (text_pos <= state->slice_start || in_set(state->encoding, test, char_at(text, text_pos - 1)) != test->match) return FALSE; break; case RE_OP_START_OF_LINE: /* At the start of a line. */ if (text_pos != 0 && char_at(text, text_pos - 1) != '\n') return FALSE; break; case RE_OP_START_OF_LINE_U: /* At the start of a line. */ if (!state->encoding->at_line_start(state, text_pos)) return FALSE; break; case RE_OP_START_OF_STRING: /* At the start of the string. */ if (text_pos != 0) return FALSE; break; case RE_OP_START_OF_WORD: /* At start of a word. */ if (state->encoding->at_word_start(state, text_pos) != test->match) return FALSE; break; case RE_OP_STRING: /* A string literal. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_CODE* values; size_t i; length = test->value_count; available = state->slice_end - text_pos; if (length > available) return FALSE; char_at = state->char_at; values = test->values; for (i = 0; i < length; i++) { if (char_at(text, text_pos + i) != values[i]) return FALSE; } break; } case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ { size_t length; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t pos; size_t string_pos; RE_CODE* values; int folded_len; int folded_pos; Py_UCS4 folded[RE_MAX_FOLDED]; length = test->value_count; available = state->slice_end - text_pos; if ((Py_ssize_t)possible_unfolded_length(length) > available) return FALSE; char_at = state->char_at; encoding = state->encoding; full_case_fold = encoding->full_case_fold; pos = text_pos; string_pos = 0; values = test->values; folded_len = 0; folded_pos = 0; while (string_pos < length) { if (folded_pos >= folded_len) { if (pos >= state->slice_end) return FALSE; folded_len = full_case_fold(char_at(text, pos), folded); folded_pos = 0; } if (!same_char_ign(encoding, folded[folded_pos], values[string_pos])) return FALSE; ++string_pos; ++folded_pos; if (folded_pos >= folded_len) ++pos; } if (folded_pos < folded_len) return FALSE; next_position->node = next->match_next; if (next->match_step == 0) next_position->text_pos = text_pos; else next_position->text_pos = pos; return TRUE; } case RE_OP_STRING_FLD_REV: /* A string literal, ignoring case. */ { size_t length; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t pos; size_t string_pos; RE_CODE* values; int folded_len; int folded_pos; Py_UCS4 folded[RE_MAX_FOLDED]; length = test->value_count; available = text_pos - state->slice_start; if ((Py_ssize_t)possible_unfolded_length(length) > available) return FALSE; char_at = state->char_at; encoding = state->encoding; full_case_fold = encoding->full_case_fold; pos = text_pos; string_pos = length; values = test->values; folded_len = 0; folded_pos = folded_len; while (string_pos > 0) { if (folded_pos <= 0) { if (pos <= state->slice_start) return FALSE; folded_len = full_case_fold(char_at(text, pos - 1), folded); folded_pos = folded_len; } if (!same_char_ign(encoding, folded[folded_pos - 1], values[string_pos - 1])) return FALSE; --string_pos; --folded_pos; if (folded_pos <= 0) --pos; } if (folded_pos > 0) return FALSE; next_position->node = next->match_next; if (next->match_step == 0) next_position->text_pos = text_pos; else next_position->text_pos = pos; return TRUE; } case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; RE_CODE* values; size_t i; length = test->value_count; available = state->slice_end - text_pos; if (length > available) return FALSE; char_at = state->char_at; encoding = state->encoding; values = test->values; for (i = 0; i < length; i++) { if (!same_char_ign(encoding, char_at(text, text_pos + i), values[i])) return FALSE; } break; } case RE_OP_STRING_IGN_REV: /* A string literal, ignoring case. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_EncodingTable* encoding; RE_CODE* values; size_t i; length = test->value_count; available = text_pos - state->slice_start; if (length > available) return FALSE; char_at = state->char_at; encoding = state->encoding; values = test->values; text_pos -= length; for (i = 0; i < length; i++) { if (!same_char_ign(encoding, char_at(text, text_pos + i), values[i])) return FALSE; } text_pos += length; break; } case RE_OP_STRING_REV: /* A string literal. */ { size_t length; size_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); RE_CODE* values; size_t i; length = test->value_count; available = text_pos - state->slice_start; if (length > available) return FALSE; char_at = state->char_at; values = test->values; text_pos -= length; for (i = 0; i < length; i++) { if (char_at(text, text_pos + i) != values[i]) return FALSE; } text_pos += length; break; } default: next_position->node = next->node; next_position->text_pos = text_pos; return TRUE; } next_position->node = next->match_next; next_position->text_pos = text_pos + next->match_step; return TRUE; } Py_LOCAL_INLINE(BOOL) search_start(RE_SafeState* safe_state, RE_NextNode* next, RE_Position* new_position, int search_index); /* Searches for the start of a match. */ Py_LOCAL_INLINE(BOOL) search_start(RE_SafeState* safe_state, RE_NextNode* next, RE_Position* new_position, int search_index) { RE_State* state; Py_ssize_t text_pos; RE_Node* test; RE_Node* node; Py_ssize_t start_pos; Py_ssize_t step; Py_ssize_t limit; RE_SearchPosition* info; state = safe_state->re_state; start_pos = state->text_pos; TRACE(("<> at %d\n", start_pos)) test = next->test; node = next->node; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; limit = state->slice_start; step = -1; } else { if (start_pos > state->slice_end) return FALSE; limit = state->slice_end; step = 1; } if (test->status & RE_STATUS_FUZZY) { /* Don't call 'search_start' again. */ state->pattern->do_search_start = FALSE; state->match_pos = start_pos; new_position->node = node; new_position->text_pos = start_pos; return TRUE; } again: if (!state->pattern->is_fuzzy) { if (state->reverse) { if (start_pos - (Py_ssize_t)state->min_width < limit) return FALSE; } else { if (start_pos + (Py_ssize_t)state->min_width > limit) return FALSE; } } if (search_index < MAX_SEARCH_POSITIONS) { info = &state->search_positions[search_index]; if (state->reverse) { if (info->start_pos >= 0 && info->start_pos >= start_pos && start_pos >= info->match_pos) { state->match_pos = info->match_pos; new_position->text_pos = state->match_pos; new_position->node = node; return TRUE; } } else { if (info->start_pos >= 0 && info->start_pos <= start_pos && start_pos <= info->match_pos) { state->match_pos = info->match_pos; new_position->text_pos = state->match_pos; new_position->node = node; return TRUE; } } } else info = NULL; switch (test->op) { case RE_OP_ANY: /* Any character, except a newline. */ start_pos = match_many_ANY(state, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_ANY_ALL: /* Any character at all. */ break; case RE_OP_ANY_ALL_REV: /* Any character at all backwards. */ break; case RE_OP_ANY_REV: /* Any character backwards, except a newline. */ start_pos = match_many_ANY_REV(state, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_ANY_U: /* Any character, except a line separator. */ start_pos = match_many_ANY_U(state, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_ANY_U_REV: /* Any character backwards, except a line separator. */ start_pos = match_many_ANY_U_REV(state, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_BOUNDARY: /* At a word boundary. */ { BOOL match; Py_ssize_t step; BOOL (*at_boundary)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_boundary = state->encoding->at_boundary; for (;;) { if (at_boundary(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_CHARACTER: /* A character literal. */ start_pos = match_many_CHARACTER(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ start_pos = match_many_CHARACTER_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_CHARACTER_IGN_REV: /* A character literal backwards, ignoring case. */ start_pos = match_many_CHARACTER_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_CHARACTER_REV: /* A character literal backwards. */ start_pos = match_many_CHARACTER_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ { BOOL match; Py_ssize_t step; BOOL (*at_default_boundary)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_default_boundary = state->encoding->at_default_boundary; for (;;) { if (at_default_boundary(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_default_word_end)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_default_word_end = state->encoding->at_default_word_end; for (;;) { if (at_default_word_end(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_default_word_start)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_default_word_start = state->encoding->at_default_word_start; for (;;) { if (at_default_word_start(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_END_OF_LINE: /* At the end of a line. */ { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t step; char_at = state->char_at; text = state->text; text_pos = start_pos; step = state->reverse ? -1 : 1; for (;;) { if (text_pos == state->text_length || char_at(text, text_pos) == '\n') break; if (text_pos == limit) return FALSE; text_pos += step; } start_pos = text_pos; break; } case RE_OP_END_OF_STRING: /* At the end of the string. */ if (state->reverse) { if (start_pos != state->text_length) return FALSE; } else { if (state->slice_end != state->text_length) return FALSE; } start_pos = state->text_length; break; case RE_OP_END_OF_STRING_LINE: /* At end of string or final newline. */ if (state->reverse) { if (start_pos >= state->text_length) start_pos = state->text_length; else if (start_pos >= state->final_newline) start_pos = state->final_newline; else return FALSE; if (start_pos < state->slice_start) return FALSE; } else { if (start_pos <= state->final_newline) start_pos = state->final_newline; else if (start_pos <= state->text_length) start_pos = state->text_length; else return FALSE; if (start_pos > state->slice_end) return FALSE; } break; case RE_OP_END_OF_WORD: /* At end of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_word_end)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_word_end = state->encoding->at_word_end; for (;;) { if (at_word_end(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ { BOOL match; Py_ssize_t step; BOOL (*at_boundary)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_boundary = state->encoding->at_grapheme_boundary; for (;;) { if (at_boundary(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_PROPERTY: /* A character property. */ start_pos = match_many_PROPERTY(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_PROPERTY_IGN: /* A character property, ignoring case. */ start_pos = match_many_PROPERTY_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_PROPERTY_IGN_REV: /* A character property backwards, ignoring case. */ start_pos = match_many_PROPERTY_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_PROPERTY_REV: /* A character property backwards. */ start_pos = match_many_PROPERTY_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_RANGE: /* A range. */ start_pos = match_many_RANGE(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_RANGE_IGN: /* A range, ignoring case. */ start_pos = match_many_RANGE_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_RANGE_IGN_REV: /* A range backwards, ignoring case. */ start_pos = match_many_RANGE_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_RANGE_REV: /* A range backwards. */ start_pos = match_many_RANGE_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ if (state->reverse) { if (start_pos < state->search_anchor) return FALSE; } else { if (start_pos > state->search_anchor) return FALSE; } start_pos = state->search_anchor; break; case RE_OP_SET_DIFF: /* A set. */ case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: start_pos = match_many_SET(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_SET_DIFF_IGN: /* A set, ignoring case. */ case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: start_pos = match_many_SET_IGN(state, test, start_pos, limit, FALSE); if (start_pos >= limit) return FALSE; break; case RE_OP_SET_DIFF_IGN_REV: /* A set backwards, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: start_pos = match_many_SET_IGN_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_SET_DIFF_REV: /* A set backwards. */ case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: start_pos = match_many_SET_REV(state, test, start_pos, limit, FALSE); if (start_pos <= limit) return FALSE; break; case RE_OP_START_OF_LINE: /* At the start of a line. */ { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t step; Py_ssize_t text_pos; char_at = state->char_at; text = state->text; step = state->reverse ? -1 : 1; text_pos = start_pos - 1; --limit; for (;;) { if (text_pos < 0 || char_at(text, text_pos) == '\n') break; if (text_pos == limit) return FALSE; text_pos += step; } ++text_pos; ++limit; start_pos = text_pos; break; } case RE_OP_START_OF_STRING: /* At the start of the string. */ if (state->reverse) { if (state->slice_start != 0) return FALSE; } else { if (start_pos != 0) return FALSE; } start_pos = 0; break; case RE_OP_START_OF_WORD: /* At start of a word. */ { BOOL match; Py_ssize_t step; BOOL (*at_word_start)(RE_State* state, Py_ssize_t start_pos); match = test->match; step = state->reverse ? -1 : 1; at_word_start = state->encoding->at_word_start; for (;;) { if (at_word_start(state, start_pos) == match) break; if (start_pos == limit) return FALSE; start_pos += step; } break; } case RE_OP_STRING: /* A string literal. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ { Py_ssize_t new_pos; if ((test->status & RE_STATUS_REQUIRED) && start_pos == state->req_pos) new_pos = state->req_end; else start_pos = string_search_fld(safe_state, test, start_pos, state->slice_end, &new_pos); if (start_pos < 0) return FALSE; /* Can we look further ahead? */ if (test == node) { if (test->next_1.node && !try_match(state, &test->next_1, new_pos, new_position)) { ++start_pos; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; } else { if (start_pos > state->slice_end) return FALSE; } goto again; } /* It's a possible match. */ state->match_pos = start_pos; return TRUE; } break; } case RE_OP_STRING_FLD_REV: /* A string literal backwards, ignoring case. */ { Py_ssize_t new_pos; if ((test->status & RE_STATUS_REQUIRED) && start_pos == state->req_pos) new_pos = state->req_end; else start_pos = string_search_fld_rev(safe_state, test, start_pos, state->slice_start, &new_pos); if (start_pos < 0) return FALSE; /* Can we look further ahead? */ if (test == node) { if (test->next_1.node && !try_match(state, &test->next_1, new_pos, new_position)) { --start_pos; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; } else { if (start_pos > state->slice_end) return FALSE; } goto again; } /* It's a possible match. */ state->match_pos = start_pos; return TRUE; } break; } case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search_ign(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; case RE_OP_STRING_IGN_REV: /* A string literal backwards, ignoring case. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search_ign_rev(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; case RE_OP_STRING_REV: /* A string literal backwards. */ if (!(test->status & RE_STATUS_REQUIRED) || start_pos != state->req_pos) { start_pos = string_search_rev(safe_state, test, start_pos, limit); if (start_pos < 0) return FALSE; } break; default: /* Don't call 'search_start' again. */ state->pattern->do_search_start = FALSE; state->match_pos = start_pos; new_position->node = node; new_position->text_pos = start_pos; return TRUE; } text_pos = start_pos; /* Can we look further ahead? */ if (test == node) { text_pos += test->step; if (test->next_1.node && !try_match(state, &test->next_1, text_pos, new_position)) { start_pos += step; if (state->reverse) { if (start_pos < state->slice_start) return FALSE; } else { if (start_pos > state->slice_end) return FALSE; } goto again; } } else { new_position->node = node; new_position->text_pos = start_pos; } /* It's a possible match. */ state->match_pos = start_pos; if (info) { info->start_pos = state->text_pos; info->match_pos = state->match_pos; } return TRUE; } /* Saves a capture group. */ Py_LOCAL_INLINE(BOOL) save_capture(RE_SafeState* safe_state, size_t private_index, size_t public_index) { RE_State* state; RE_GroupData* private_group; RE_GroupData* public_group; state = safe_state->re_state; /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ private_group = &state->groups[private_index - 1]; public_group = &state->groups[public_index - 1]; /* Will the repeated captures ever be visible? */ if (!state->visible_captures) { public_group->captures[0] = private_group->span; public_group->capture_count = 1; return TRUE; } if (public_group->capture_count >= public_group->capture_capacity) { size_t new_capacity; RE_GroupSpan* new_captures; new_capacity = public_group->capture_capacity * 2; new_capacity = RE_MAX(new_capacity, RE_INIT_CAPTURE_SIZE); new_captures = (RE_GroupSpan*)safe_realloc(safe_state, public_group->captures,new_capacity * sizeof(RE_GroupSpan)); if (!new_captures) return FALSE; public_group->captures = new_captures; public_group->capture_capacity = new_capacity; } public_group->captures[public_group->capture_count++] = private_group->span; return TRUE; } /* Unsaves a capture group. */ Py_LOCAL_INLINE(void) unsave_capture(RE_State* state, size_t private_index, size_t public_index) { /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ if (state->groups[public_index - 1].capture_count > 0) --state->groups[public_index - 1].capture_count; } /* Pushes the groups for backtracking. */ Py_LOCAL_INLINE(BOOL) push_groups(RE_SafeState* safe_state) { RE_State* state; Py_ssize_t group_count; RE_SavedGroups* current; Py_ssize_t g; state = safe_state->re_state; group_count = state->pattern->true_group_count; if (group_count == 0) return TRUE; current = state->current_saved_groups; if (current && current->next) current = current->next; else if (!current && state->first_saved_groups) current = state->first_saved_groups; else { RE_SavedGroups* new_block; new_block = (RE_SavedGroups*)safe_alloc(safe_state, sizeof(RE_SavedGroups)); if (!new_block) return FALSE; new_block->spans = (RE_GroupSpan*)safe_alloc(safe_state, group_count * sizeof(RE_GroupSpan)); new_block->counts = (size_t*)safe_alloc(safe_state, group_count * sizeof(size_t)); if (!new_block->spans || !new_block->counts) { safe_dealloc(safe_state, new_block->spans); safe_dealloc(safe_state, new_block->counts); safe_dealloc(safe_state, new_block); return FALSE; } new_block->previous = current; new_block->next = NULL; if (new_block->previous) new_block->previous->next = new_block; else state->first_saved_groups = new_block; current = new_block; } for (g = 0; g < group_count; g++) { current->spans[g] = state->groups[g].span; current->counts[g] = state->groups[g].capture_count; } state->current_saved_groups = current; return TRUE; } /* Pops the groups for backtracking. */ Py_LOCAL_INLINE(void) pop_groups(RE_State* state) { Py_ssize_t group_count; RE_SavedGroups* current; Py_ssize_t g; group_count = state->pattern->true_group_count; if (group_count == 0) return; current = state->current_saved_groups; for (g = 0; g < group_count; g++) { state->groups[g].span = current->spans[g]; state->groups[g].capture_count = current->counts[g]; } state->current_saved_groups = current->previous; } /* Drops the groups for backtracking. */ Py_LOCAL_INLINE(void) drop_groups(RE_State* state) { if (state->pattern->true_group_count != 0) state->current_saved_groups = state->current_saved_groups->previous; } /* Pushes the repeats for backtracking. */ Py_LOCAL_INLINE(BOOL) push_repeats(RE_SafeState* safe_state) { RE_State* state; PatternObject* pattern; Py_ssize_t repeat_count; RE_SavedRepeats* current; Py_ssize_t r; state = safe_state->re_state; pattern = state->pattern; repeat_count = pattern->repeat_count; if (repeat_count == 0) return TRUE; current = state->current_saved_repeats; if (current && current->next) current = current->next; else if (!current && state->first_saved_repeats) current = state->first_saved_repeats; else { RE_SavedRepeats* new_block; new_block = (RE_SavedRepeats*)safe_alloc(safe_state, sizeof(RE_SavedRepeats)); if (!new_block) return FALSE; memset(new_block, 0, sizeof(RE_SavedRepeats)); new_block->repeats = (RE_RepeatData*)safe_alloc(safe_state, repeat_count * sizeof(RE_RepeatData)); if (!new_block->repeats) { safe_dealloc(safe_state, new_block); return FALSE; } memset(new_block->repeats, 0, repeat_count * sizeof(RE_RepeatData)); new_block->previous = current; new_block->next = NULL; if (new_block->previous) new_block->previous->next = new_block; else state->first_saved_repeats = new_block; current = new_block; } for (r = 0; r < repeat_count; r++) { if (!copy_repeat_data(safe_state, ¤t->repeats[r], &state->repeats[r])) return FALSE; } state->current_saved_repeats = current; return TRUE; } /* Pops the repeats for backtracking. */ Py_LOCAL_INLINE(void) pop_repeats(RE_State* state) { PatternObject* pattern; Py_ssize_t repeat_count; RE_SavedRepeats* current; Py_ssize_t r; pattern = state->pattern; repeat_count = pattern->repeat_count; if (repeat_count == 0) return; current = state->current_saved_repeats; for (r = 0; r < repeat_count; r++) copy_repeat_data(NULL, &state->repeats[r], ¤t->repeats[r]); state->current_saved_repeats = current->previous; } /* Saves state info before a recusive call by 'basic_match'. */ Py_LOCAL_INLINE(void) save_info(RE_State* state, RE_Info* info) { info->current_backtrack_block = state->current_backtrack_block; info->backtrack_count = info->current_backtrack_block->count; info->current_saved_groups = state->current_saved_groups; info->must_advance = state->must_advance; info->current_group_call_frame = state->current_group_call_frame; } /* Restores state info after a recusive call by 'basic_match'. */ Py_LOCAL_INLINE(void) restore_info(RE_State* state, RE_Info* info) { state->current_group_call_frame = info->current_group_call_frame; state->must_advance = info->must_advance; state->current_saved_groups = info->current_saved_groups; info->current_backtrack_block->count = info->backtrack_count; state->current_backtrack_block = info->current_backtrack_block; } /* Inserts a new span in a guard list. */ Py_LOCAL_INLINE(BOOL) insert_guard_span(RE_SafeState* safe_state, RE_GuardList* guard_list, Py_ssize_t index) { size_t n; if (guard_list->count >= guard_list->capacity) { size_t new_capacity; RE_GuardSpan* new_spans; new_capacity = guard_list->capacity * 2; if (new_capacity == 0) new_capacity = RE_INIT_GUARDS_BLOCK_SIZE; new_spans = (RE_GuardSpan*)safe_realloc(safe_state, guard_list->spans, new_capacity * sizeof(RE_GuardSpan)); if (!new_spans) return FALSE; guard_list->capacity = new_capacity; guard_list->spans = new_spans; } n = guard_list->count - index; if (n > 0) memmove(guard_list->spans + index + 1, guard_list->spans + index, n * sizeof(RE_GuardSpan)); ++guard_list->count; return TRUE; } /* Deletes a span in a guard list. */ Py_LOCAL_INLINE(void) delete_guard_span(RE_GuardList* guard_list, Py_ssize_t index) { size_t n; n = guard_list->count - index - 1; if (n > 0) memmove(guard_list->spans + index, guard_list->spans + index + 1, n * sizeof(RE_GuardSpan)); --guard_list->count; } /* Checks whether a position is guarded against further matching. */ Py_LOCAL_INLINE(BOOL) is_guarded(RE_GuardList* guard_list, Py_ssize_t text_pos) { size_t low; size_t high; /* Is this position in the guard list? */ low = 0; high = guard_list->count; while (low < high) { size_t mid; RE_GuardSpan* span; mid = (low + high) / 2; span = &guard_list->spans[mid]; if (text_pos < span->low) high = mid; else if (text_pos > span->high) low = mid + 1; else return span->protect; } guard_list->last_text_pos = text_pos; guard_list->last_low = low; return FALSE; } /* Guards a position against further matching. */ Py_LOCAL_INLINE(BOOL) guard(RE_SafeState* safe_state, RE_GuardList* guard_list, Py_ssize_t text_pos, BOOL protect) { size_t low; size_t high; /* Where should be new position be added? */ if (text_pos == guard_list->last_text_pos) low = guard_list->last_low; else { low = 0; high = guard_list->count; while (low < high) { size_t mid; RE_GuardSpan* span; mid = (low + high) / 2; span = &guard_list->spans[mid]; if (text_pos < span->low) high = mid; else if (text_pos > span->high) low = mid + 1; else return TRUE; } } /* Add the position to the guard list. */ if (low > 0 && guard_list->spans[low - 1].high + 1 == text_pos && guard_list->spans[low - 1].protect == protect) { /* The new position is just above this span. */ if (low < guard_list->count && guard_list->spans[low].low - 1 == text_pos && guard_list->spans[low].protect == protect) { /* The new position joins 2 spans */ guard_list->spans[low - 1].high = guard_list->spans[low].high; delete_guard_span(guard_list, low); } else /* Extend the span. */ guard_list->spans[low - 1].high = text_pos; } else if (low < guard_list->count && guard_list->spans[low].low - 1 == text_pos && guard_list->spans[low].protect == protect) /* The new position is just below this span. */ /* Extend the span. */ guard_list->spans[low].low = text_pos; else { /* Insert a new span. */ if (!insert_guard_span(safe_state, guard_list, low)) return FALSE; guard_list->spans[low].low = text_pos; guard_list->spans[low].high = text_pos; guard_list->spans[low].protect = protect; } guard_list->last_text_pos = -1; return TRUE; } /* Guards a position against further matching for a repeat. */ Py_LOCAL_INLINE(BOOL) guard_repeat(RE_SafeState* safe_state, size_t index, Py_ssize_t text_pos, RE_STATUS_T guard_type, BOOL protect) { RE_State* state; RE_GuardList* guard_list; state = safe_state->re_state; /* Is a guard active here? */ if (!(state->pattern->repeat_info[index].status & guard_type)) return TRUE; /* Which guard list? */ if (guard_type & RE_STATUS_BODY) guard_list = &state->repeats[index].body_guard_list; else guard_list = &state->repeats[index].tail_guard_list; return guard(safe_state, guard_list, text_pos, protect); } /* Checks whether a position is guarded against further matching for a repeat. */ Py_LOCAL_INLINE(BOOL) is_repeat_guarded(RE_SafeState* safe_state, size_t index, Py_ssize_t text_pos, RE_STATUS_T guard_type) { RE_State* state; RE_GuardList* guard_list; state = safe_state->re_state; /* Is a guard active here? */ if (!(state->pattern->repeat_info[index].status & guard_type)) return FALSE; /* Which guard list? */ if (guard_type == RE_STATUS_BODY) guard_list = &state->repeats[index].body_guard_list; else guard_list = &state->repeats[index].tail_guard_list; return is_guarded(guard_list, text_pos); } /* Resets the guards inside atomic subpatterns and lookarounds. */ Py_LOCAL_INLINE(void) reset_guards(RE_State* state, RE_CODE* values) { PatternObject* pattern; Py_ssize_t repeat_count; pattern = state->pattern; repeat_count = (size_t)pattern->repeat_count; if (values) { size_t i; for (i = 1; i <= values[0]; i++) { Py_ssize_t index; index = (Py_ssize_t)values[i]; if (index < repeat_count) { reset_guard_list(&state->repeats[index].body_guard_list); reset_guard_list(&state->repeats[index].tail_guard_list); } else { index -= repeat_count; reset_guard_list(&state->fuzzy_guards[index].body_guard_list); reset_guard_list(&state->fuzzy_guards[index].tail_guard_list); } } } else { Py_ssize_t index; Py_ssize_t fuzzy_count; for (index = 0; index < repeat_count; index++) { reset_guard_list(&state->repeats[index].body_guard_list); reset_guard_list(&state->repeats[index].tail_guard_list); } fuzzy_count = pattern->fuzzy_count; for (index = 0; index < fuzzy_count; index++) { reset_guard_list(&state->fuzzy_guards[index].body_guard_list); reset_guard_list(&state->fuzzy_guards[index].tail_guard_list); } } } /* Builds a Unicode string. */ Py_LOCAL_INLINE(PyObject*) build_unicode_value(void* buffer, Py_ssize_t len, Py_ssize_t buffer_charsize) { #if PY_VERSION_HEX >= 0x03030000 int kind; switch (buffer_charsize) { case 1: kind = PyUnicode_1BYTE_KIND; break; case 2: kind = PyUnicode_2BYTE_KIND; break; case 4: kind = PyUnicode_4BYTE_KIND; break; default: kind = PyUnicode_1BYTE_KIND; break; } return PyUnicode_FromKindAndData(kind, buffer, len); #else return PyUnicode_FromUnicode(buffer, len); #endif } /* Builds a bytestring. Returns NULL if any member is too wide. */ Py_LOCAL_INLINE(PyObject*) build_bytes_value(void* buffer, Py_ssize_t len, Py_ssize_t buffer_charsize) { Py_UCS1* byte_buffer; Py_ssize_t i; PyObject* result; if (buffer_charsize == 1) return Py_BuildValue("y#", buffer, len); byte_buffer = re_alloc(len); if (!byte_buffer) return NULL; for (i = 0; i < len; i++) { Py_UCS2 c = ((Py_UCS2*)buffer)[i]; if (c > 0xFF) goto too_wide; byte_buffer[i] = (Py_UCS1)c; } result = Py_BuildValue("y#", byte_buffer, len); re_dealloc(byte_buffer); return result; too_wide: re_dealloc(byte_buffer); return NULL; } /* Looks for a string in a string set, ignoring case. */ Py_LOCAL_INLINE(int) string_set_contains_ign(RE_State* state, PyObject* string_set, void* buffer, Py_ssize_t index, Py_ssize_t len, Py_ssize_t buffer_charsize) { Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); RE_EncodingTable* encoding; BOOL (*possible_turkic)(Py_UCS4 ch); Py_UCS4 codepoints[4]; switch (buffer_charsize) { case 1: char_at = bytes1_char_at; set_char_at = bytes1_set_char_at; break; case 2: char_at = bytes2_char_at; set_char_at = bytes2_set_char_at; break; case 4: char_at = bytes4_char_at; set_char_at = bytes4_set_char_at; break; default: char_at = bytes1_char_at; set_char_at = bytes1_set_char_at; break; } encoding = state->encoding; possible_turkic = encoding->possible_turkic; /* Look for a possible Turkic 'I'. */ while (index < len && !possible_turkic(char_at(buffer, index))) ++index; if (index < len) { /* Possible Turkic 'I'. */ int count; int i; /* Try all the alternatives to the 'I'. */ count = encoding->all_turkic_i(char_at(buffer, index), codepoints); for (i = 0; i < count; i++) { int status; set_char_at(buffer, index, codepoints[i]); /* Recurse for the remainder of the string. */ status = string_set_contains_ign(state, string_set, buffer, index + 1, len, buffer_charsize); if (status != 0) return status; } return 0; } else { /* No Turkic 'I'. */ PyObject* string; int status; if (state->is_unicode) string = build_unicode_value(buffer, len, buffer_charsize); else string = build_bytes_value(buffer, len, buffer_charsize); if (!string) return RE_ERROR_MEMORY; status = PySet_Contains(string_set, string); Py_DECREF(string); return status; } } /* Tries to match a string at the current position with a member of a string * set, ignoring case, for a forwards or reverse search. */ Py_LOCAL_INLINE(int) string_set_match_ign_fwdrev(RE_SafeState* safe_state, RE_Node* node, BOOL reverse) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; RE_EncodingTable* encoding; Py_UCS4 (*simple_case_fold)(Py_UCS4 ch); Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* folded; PyObject* string_set; int status; Py_ssize_t len; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = reverse ? state->text_pos - state->slice_start : state->slice_end - state->text_pos; if (min_len > available) /* Too few characters for any match. */ return 0; max_len = RE_MIN(max_len, available); char_at = state->char_at; text = state->text; text_pos = state->text_pos; encoding = state->encoding; simple_case_fold = encoding->simple_case_fold; acquire_GIL(safe_state); #if PY_VERSION_HEX >= 0x03030000 /* The folded string needs to be at least 2 bytes per character. */ folded_charsize = RE_MAX(state->charsize, sizeof(Py_UCS2)); #else /* The folded string will have the same width as the original string. */ folded_charsize = state->charsize; #endif switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; break; case 2: set_char_at = bytes2_set_char_at; break; case 4: set_char_at = bytes4_set_char_at; break; default: return 0; } /* Allocate a buffer for the folded string. */ folded = re_alloc(max_len * folded_charsize); if (!folded) goto error; /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ for (len = max_len; status == 0 && len >= min_len; len--) { Py_ssize_t offset; Py_ssize_t inc_len; int i; if (reverse) { offset = -len; inc_len = -len; } else { offset = 0; inc_len = len; } for (i = 0; i < len; i++) { Py_UCS4 ch; ch = simple_case_fold(char_at(text, text_pos + offset + i)); set_char_at(folded, i, ch); } status = string_set_contains_ign(state, string_set, folded, 0, len, folded_charsize); if (status == 1) /* Advance past the match. */ state->text_pos += inc_len; } re_dealloc(folded); release_GIL(safe_state); return status; error: re_dealloc(folded); release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set. */ Py_LOCAL_INLINE(int) string_set_match(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; void* (*point_to)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; PyObject* string_set; int status; Py_ssize_t len; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->slice_end - state->text_pos; if (min_len > available) /* Too few characters for any match. */ return 0; max_len = RE_MIN(max_len, available); point_to = state->point_to; text = state->text; text_pos = state->text_pos; acquire_GIL(safe_state); /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ for (len = max_len; status == 0 && len >= min_len; len--) { PyObject* string; if (state->is_unicode) string = build_unicode_value(point_to(text, text_pos), len, state->charsize); else string = build_bytes_value(point_to(text, text_pos), len, state->charsize); if (!string) goto error; status = PySet_Contains(string_set, string); Py_DECREF(string); if (status == 1) /* Advance past the match. */ state->text_pos += len; } release_GIL(safe_state); return status; error: release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set, ignoring case. */ Py_LOCAL_INLINE(int) string_set_match_fld(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t buf_size; Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* folded; PyObject* string_set; int status; Py_ssize_t end_fetch; Py_ssize_t len; Py_UCS4 codepoints[RE_MAX_FOLDED]; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->slice_end - state->text_pos; if ((Py_ssize_t)possible_unfolded_length(min_len) > available) /* Too few characters for any match. */ return 0; char_at = state->char_at; text = state->text; text_pos = state->text_pos; encoding = state->encoding; full_case_fold = encoding->full_case_fold; #if PY_VERSION_HEX >= 0x03030000 /* The folded string needs to be at least 2 bytes per character. */ folded_charsize = RE_MAX(state->charsize, sizeof(Py_UCS2)); #else /* The folded string will have the same width as the original string. */ folded_charsize = state->charsize; #endif switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; break; case 2: set_char_at = bytes2_set_char_at; break; case 4: set_char_at = bytes4_set_char_at; break; default: return 0; } acquire_GIL(safe_state); /* Allocate a buffer for the folded string, plus a little extra. */ buf_size = max_len + RE_MAX_FOLDED; folded = re_alloc(buf_size * folded_charsize); if (!folded) goto error; /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ end_fetch = text_pos + max_len; for (len = max_len; status == 0 && len >= min_len; len--) { Py_ssize_t pos; int folded_len; pos = text_pos; folded_len = 0; /* Fetch until we have enough characters. */ while (pos < end_fetch && folded_len < len) { int count; int i; count = full_case_fold(char_at(text, pos), codepoints); for (i = 0; i < count; i++) { Py_UCS4 ch; ch = codepoints[i]; set_char_at(folded, folded_len + i, ch); } folded_len += count; ++pos; } /* Do we have an acceptable number? */ if (min_len <= folded_len && folded_len <= len) { status = string_set_contains_ign(state, string_set, folded, 0, folded_len, folded_charsize); if (status == 1) /* Advance past the match. */ state->text_pos = pos; } /* If we got fewer than expected, next time we want still fewer. */ len = RE_MIN(len, folded_len); /* Fetch one fewer next time. */ end_fetch = pos - 1; } re_dealloc(folded); release_GIL(safe_state); return status; error: re_dealloc(folded); release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set, ignoring case. */ Py_LOCAL_INLINE(int) string_set_match_fld_rev(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; RE_EncodingTable* encoding; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t buf_size; Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); void* (*point_to)(void* text, Py_ssize_t pos); void* folded; PyObject* string_set; int status; Py_ssize_t end_fetch; Py_ssize_t len; Py_UCS4 codepoints[RE_MAX_FOLDED]; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->text_pos - state->slice_start; if ((Py_ssize_t)possible_unfolded_length(min_len) > available) /* Too few characters for any match. */ return 0; char_at = state->char_at; text = state->text; text_pos = state->text_pos; encoding = state->encoding; full_case_fold = encoding->full_case_fold; #if PY_VERSION_HEX >= 0x03030000 /* The folded string needs to be at least 2 bytes per character. */ folded_charsize = RE_MAX(state->charsize, sizeof(Py_UCS2)); #else /* The folded string will have the same width as the original string. */ folded_charsize = state->charsize; #endif switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; point_to = bytes1_point_to; break; case 2: set_char_at = bytes2_set_char_at; point_to = bytes2_point_to; break; case 4: set_char_at = bytes4_set_char_at; point_to = bytes4_point_to; break; default: return 0; } acquire_GIL(safe_state); /* Allocate a buffer for the folded string, plus a little extra. */ buf_size = max_len + RE_MAX_FOLDED; folded = re_alloc(buf_size * folded_charsize); if (!folded) goto error; /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ end_fetch = text_pos - max_len; for (len = max_len; status == 0 && len >= min_len; len--) { Py_ssize_t pos; int folded_len; pos = text_pos; folded_len = 0; /* Fetch until we have enough characters. */ while (pos > end_fetch && folded_len < len) { int count; int i; count = full_case_fold(char_at(text, pos - 1), codepoints); folded_len += count; for (i = 0; i < count; i++) { Py_UCS4 ch; ch = codepoints[i]; set_char_at(folded, buf_size - folded_len + i, ch); } --pos; } /* Do we have an acceptable number? */ if (min_len <= folded_len && folded_len <= len) { status = string_set_contains_ign(state, string_set, point_to(folded, buf_size - len), 0, folded_len, folded_charsize); if (status == 1) /* Advance past the match. */ state->text_pos = pos; } /* If we got fewer than expected, next time we want still fewer. */ len = RE_MIN(len, folded_len); /* Fetch one fewer next time. */ end_fetch = pos + 1; } re_dealloc(folded); release_GIL(safe_state); return status; error: re_dealloc(folded); release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Tries to match a string at the current position with a member of a string * set, ignoring case, for a forwards search. */ Py_LOCAL_INLINE(int) string_set_match_ign(RE_SafeState* safe_state, RE_Node* node) { return string_set_match_ign_fwdrev(safe_state, node, FALSE); } /* Tries to match a string at the current position with a member of a string * set, ignoring case, for a reverse search. */ Py_LOCAL_INLINE(int) string_set_match_ign_rev(RE_SafeState* safe_state, RE_Node* node) { return string_set_match_ign_fwdrev(safe_state, node, TRUE); } /* Tries to match a string at the current position with a member of a string * set. */ Py_LOCAL_INLINE(int) string_set_match_rev(RE_SafeState* safe_state, RE_Node* node) { Py_ssize_t index; Py_ssize_t min_len; Py_ssize_t max_len; RE_State* state; Py_ssize_t available; void* (*point_to)(void* text, Py_ssize_t pos); void* text; Py_ssize_t text_pos; PyObject* string_set; int status; Py_ssize_t len; index = node->values[0]; min_len = (Py_ssize_t)node->values[1]; max_len = (Py_ssize_t)node->values[2]; state = safe_state->re_state; available = state->text_pos - state->slice_start; if (min_len > available) /* Too few characters for any match. */ return 0; max_len = RE_MIN(max_len, available); point_to = state->point_to; text = state->text; text_pos = state->text_pos; acquire_GIL(safe_state); /* Fetch the string set. */ string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, index); if (!string_set) goto error; status = 0; /* Attempt matches for a decreasing length. */ for (len = max_len; status == 0 && len >= min_len; len--) { PyObject* string; if (state->is_unicode) string = build_unicode_value(point_to(text, text_pos - len), len, state->charsize); else string = build_bytes_value(point_to(text, text_pos - len), len, state->charsize); if (!string) goto error; status = PySet_Contains(string_set, string); Py_DECREF(string); if (status == 1) /* Advance past the match. */ state->text_pos -= len; } release_GIL(safe_state); return status; error: release_GIL(safe_state); return RE_ERROR_INTERNAL; } /* Checks whether any additional fuzzy error is permitted. */ Py_LOCAL_INLINE(BOOL) any_error_permitted(RE_State* state) { RE_FuzzyInfo* fuzzy_info; RE_CODE* values; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; return fuzzy_info->total_cost <= values[RE_FUZZY_VAL_MAX_COST] && fuzzy_info->counts[RE_FUZZY_ERR] < values[RE_FUZZY_VAL_MAX_ERR] && state->total_cost <= state->max_cost; } /* Checks whether this additional fuzzy error is permitted. */ Py_LOCAL_INLINE(BOOL) this_error_permitted(RE_State* state, int fuzzy_type) { RE_FuzzyInfo* fuzzy_info; RE_CODE* values; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; return fuzzy_info->total_cost + values[RE_FUZZY_VAL_COST_BASE + fuzzy_type] <= values[RE_FUZZY_VAL_MAX_COST] && fuzzy_info->counts[fuzzy_type] < values[RE_FUZZY_VAL_MAX_BASE + fuzzy_type] && state->total_cost + values[RE_FUZZY_VAL_COST_BASE + fuzzy_type] <= state->max_cost; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_one(RE_State* state, RE_FuzzyData* data) { Py_ssize_t new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_node = data->new_node->next_1.node; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_text_pos + data->step; if (data->permit_insertion && state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_text_pos + data->step; if (state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; data->new_node = data->new_node->next_1.node; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a single-character item. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_one(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *node = NULL; return TRUE; } data.new_text_pos = *text_pos; data.new_node = *node; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_one(state, &data)) goto found; } *node = NULL; return TRUE; found: if (!add_backtrack(safe_state, (*node)->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_one.position.text_pos = *text_pos; bt_data->fuzzy_one.position.node = *node; bt_data->fuzzy_one.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_one.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } /* Retries a fuzzy match of a single-character item. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_one(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; data.new_text_pos = bt_data->fuzzy_one.position.text_pos; data.new_node = bt_data->fuzzy_one.position.node; data.fuzzy_type = bt_data->fuzzy_one.fuzzy_type; data.step = bt_data->fuzzy_one.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_one(state, &data)) goto found; } discard_backtrack(state); *node = NULL; return TRUE; found: bt_data->fuzzy_one.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_zero(RE_State* state, RE_FuzzyData* data) { if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_node = data->new_node->next_1.node; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ if (data->permit_insertion && data->new_text_pos != data->limit) { data->new_text_pos += data->step; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ if (data->new_text_pos != data->limit) { data->new_node = data->new_node->next_1.node; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a zero-width item. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_zero(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *node = NULL; return TRUE; } data.new_text_pos = *text_pos; data.new_node = *node; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; if (data.new_node->status & RE_STATUS_REVERSE) { data.step = -1; data.limit = state->slice_start; } else { data.step = 1; data.limit = state->slice_end; } /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_zero(state, &data)) goto found; } *node = NULL; return TRUE; found: if (!add_backtrack(safe_state, (*node)->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_zero.position.text_pos = *text_pos; bt_data->fuzzy_zero.position.node = *node; bt_data->fuzzy_zero.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } /* Retries a fuzzy match of a zero-width item. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_zero(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; data.new_text_pos = bt_data->fuzzy_zero.position.text_pos; data.new_node = bt_data->fuzzy_zero.position.node; data.fuzzy_type = bt_data->fuzzy_zero.fuzzy_type; if (data.new_node->status & RE_STATUS_REVERSE) { data.step = -1; data.limit = state->slice_start; } else { data.step = 1; data.limit = state->slice_end; } if (data.fuzzy_type >= 0) { --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; } /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_zero(state, &data)) goto found; } discard_backtrack(state); *node = NULL; return TRUE; found: bt_data->fuzzy_zero.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = data.new_node; return TRUE; } /* Tries a fuzzy insertion. */ Py_LOCAL_INLINE(BOOL) fuzzy_insert(RE_SafeState* safe_state, Py_ssize_t text_pos, RE_Node* node) { RE_State* state; RE_BacktrackData* bt_data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; state = safe_state->re_state; /* No insertion or deletion. */ if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_insert.position.text_pos = text_pos; bt_data->fuzzy_insert.position.node = node; bt_data->fuzzy_insert.count = 0; bt_data->fuzzy_insert.too_few_errors = state->too_few_errors; bt_data->fuzzy_insert.fuzzy_node = node; /* END_FUZZY node. */ /* Check whether there are too few errors. */ fuzzy_info = &state->fuzzy_info; /* The node in this case is the END_FUZZY node. */ values = node->values; if (fuzzy_info->counts[RE_FUZZY_DEL] < values[RE_FUZZY_VAL_MIN_DEL] || fuzzy_info->counts[RE_FUZZY_INS] < values[RE_FUZZY_VAL_MIN_INS] || fuzzy_info->counts[RE_FUZZY_SUB] < values[RE_FUZZY_VAL_MIN_SUB] || fuzzy_info->counts[RE_FUZZY_ERR] < values[RE_FUZZY_VAL_MIN_ERR]) state->too_few_errors = TRUE; return TRUE; } /* Retries a fuzzy insertion. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_insert(RE_SafeState* safe_state, Py_ssize_t* text_pos, RE_Node** node) { RE_State* state; RE_FuzzyInfo* fuzzy_info; RE_BacktrackData* bt_data; Py_ssize_t new_text_pos; RE_Node* new_node; int step; Py_ssize_t limit; RE_Node* fuzzy_node; RE_CODE* values; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; new_text_pos = bt_data->fuzzy_insert.position.text_pos; new_node = bt_data->fuzzy_insert.position.node; if (new_node->status & RE_STATUS_REVERSE) { step = -1; limit = state->slice_start; } else { step = 1; limit = state->slice_end; } /* Could the character at text_pos have been inserted? */ if (!this_error_permitted(state, RE_FUZZY_INS) || new_text_pos == limit) { Py_ssize_t count; count = bt_data->fuzzy_insert.count; fuzzy_info->counts[RE_FUZZY_INS] -= count; fuzzy_info->counts[RE_FUZZY_ERR] -= count; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_INS_COST] * count; state->total_errors -= count; state->total_cost -= values[RE_FUZZY_VAL_INS_COST] * count; state->too_few_errors = bt_data->fuzzy_insert.too_few_errors; discard_backtrack(state); *node = NULL; return TRUE; } ++bt_data->fuzzy_insert.count; ++fuzzy_info->counts[RE_FUZZY_INS]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_INS_COST]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_INS_COST]; /* Check whether there are too few errors. */ state->too_few_errors = bt_data->fuzzy_insert.too_few_errors; fuzzy_node = bt_data->fuzzy_insert.fuzzy_node; /* END_FUZZY node. */ values = fuzzy_node->values; if (fuzzy_info->counts[RE_FUZZY_DEL] < values[RE_FUZZY_VAL_MIN_DEL] || fuzzy_info->counts[RE_FUZZY_INS] < values[RE_FUZZY_VAL_MIN_INS] || fuzzy_info->counts[RE_FUZZY_SUB] < values[RE_FUZZY_VAL_MIN_SUB] || fuzzy_info->counts[RE_FUZZY_ERR] < values[RE_FUZZY_VAL_MIN_ERR]) state->too_few_errors = TRUE; *text_pos = new_text_pos + step * bt_data->fuzzy_insert.count; *node = new_node; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_string(RE_State* state, RE_FuzzyData* data) { Py_ssize_t new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_string_pos += data->step; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_text_pos + data->step; if (data->permit_insertion && state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_text_pos + data->step; if (state->slice_start <= new_pos && new_pos <= state->slice_end) { data->new_text_pos = new_pos; data->new_string_pos += data->step; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a string. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_string(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, BOOL* matched, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *matched = FALSE; return TRUE; } data.new_text_pos = *text_pos; data.new_string_pos = *string_pos; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string(state, &data)) goto found; } *matched = FALSE; return TRUE; found: if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_string.position.text_pos = *text_pos; bt_data->fuzzy_string.position.node = node; bt_data->fuzzy_string.string_pos = *string_pos; bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_string.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *string_pos = data.new_string_pos; *matched = TRUE; return TRUE; } /* Retries a fuzzy match of a string. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_string(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, Py_ssize_t* string_pos, BOOL* matched) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; RE_Node* new_node; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; data.new_text_pos = bt_data->fuzzy_string.position.text_pos; new_node = bt_data->fuzzy_string.position.node; data.new_string_pos = bt_data->fuzzy_string.string_pos; data.fuzzy_type = bt_data->fuzzy_string.fuzzy_type; data.step = bt_data->fuzzy_string.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || data.new_text_pos != state->search_anchor; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string(state, &data)) goto found; } discard_backtrack(state); *matched = FALSE; return TRUE; found: bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = data.new_text_pos; *node = new_node; *string_pos = data.new_string_pos; *matched = TRUE; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_string_fld(RE_State* state, RE_FuzzyData* data) { int new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_string_pos += data->step; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_folded_pos + data->step; if (data->permit_insertion && 0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_folded_pos + data->step; if (0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; data->new_string_pos += data->step; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a string, ignoring case. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_string_fld(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, int* folded_pos, int folded_len, BOOL* matched, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; Py_ssize_t new_text_pos; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *matched = FALSE; return TRUE; } new_text_pos = *text_pos; data.new_string_pos = *string_pos; data.new_folded_pos = *folded_pos; data.folded_len = folded_len; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor; if (step > 0) data.permit_insertion |= data.new_folded_pos != 0; else data.permit_insertion |= data.new_folded_pos != folded_len; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld(state, &data)) goto found; } *matched = FALSE; return TRUE; found: if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_string.position.text_pos = *text_pos; bt_data->fuzzy_string.position.node = node; bt_data->fuzzy_string.string_pos = *string_pos; bt_data->fuzzy_string.folded_pos = (RE_INT8)(*folded_pos); bt_data->fuzzy_string.folded_len = (RE_INT8)folded_len; bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_string.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *string_pos = data.new_string_pos; *folded_pos = data.new_folded_pos; *matched = TRUE; return TRUE; } /* Retries a fuzzy match of a string, ignoring case. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_string_fld(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, Py_ssize_t* string_pos, int* folded_pos, BOOL* matched) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; Py_ssize_t new_text_pos; RE_Node* new_node; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; new_text_pos = bt_data->fuzzy_string.position.text_pos; new_node = bt_data->fuzzy_string.position.node; data.new_string_pos = bt_data->fuzzy_string.string_pos; data.new_folded_pos = bt_data->fuzzy_string.folded_pos; data.folded_len = bt_data->fuzzy_string.folded_len; data.fuzzy_type = bt_data->fuzzy_string.fuzzy_type; data.step = bt_data->fuzzy_string.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor; if (data.step > 0) data.permit_insertion |= data.new_folded_pos != 0; else data.permit_insertion |= data.new_folded_pos != bt_data->fuzzy_string.folded_len; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld(state, &data)) goto found; } discard_backtrack(state); *matched = FALSE; return TRUE; found: bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *node = new_node; *string_pos = data.new_string_pos; *folded_pos = data.new_folded_pos; *matched = TRUE; return TRUE; } Py_LOCAL_INLINE(BOOL) next_fuzzy_match_string_fld2(RE_State* state, RE_FuzzyData* data) { int new_pos; if (this_error_permitted(state, data->fuzzy_type)) { switch (data->fuzzy_type) { case RE_FUZZY_DEL: /* Could a character at text_pos have been deleted? */ data->new_gfolded_pos += data->step; return TRUE; case RE_FUZZY_INS: /* Could the character at text_pos have been inserted? */ new_pos = data->new_folded_pos + data->step; if (data->permit_insertion && 0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; return TRUE; } break; case RE_FUZZY_SUB: /* Could the character at text_pos have been substituted? */ new_pos = data->new_folded_pos + data->step; if (0 <= new_pos && new_pos <= data->folded_len) { data->new_folded_pos = new_pos; data->new_gfolded_pos += data->step; return TRUE; } break; } } return FALSE; } /* Tries a fuzzy match of a group reference, ignoring case. */ Py_LOCAL_INLINE(BOOL) fuzzy_match_string_fld2(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, int* folded_pos, int folded_len, Py_ssize_t* group_pos, int* gfolded_pos, int gfolded_len, BOOL* matched, int step) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; Py_ssize_t new_text_pos; Py_ssize_t new_group_pos; RE_BacktrackData* bt_data; state = safe_state->re_state; if (!any_error_permitted(state)) { *matched = FALSE; return TRUE; } new_text_pos = *text_pos; data.new_folded_pos = *folded_pos; data.folded_len = folded_len; new_group_pos = *group_pos; data.new_gfolded_pos = *gfolded_pos; data.step = step; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor; if (step > 0) data.permit_insertion |= data.new_folded_pos != 0; else data.permit_insertion |= data.new_folded_pos != folded_len; for (data.fuzzy_type = 0; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld2(state, &data)) goto found; } *matched = FALSE; return TRUE; found: if (!add_backtrack(safe_state, node->op)) return FALSE; bt_data = state->backtrack; bt_data->fuzzy_string.position.text_pos = *text_pos; bt_data->fuzzy_string.position.node = node; bt_data->fuzzy_string.string_pos = *group_pos; bt_data->fuzzy_string.folded_pos = (RE_INT8)(*folded_pos); bt_data->fuzzy_string.folded_len = (RE_INT8)folded_len; bt_data->fuzzy_string.gfolded_pos = (RE_INT8)(*gfolded_pos); bt_data->fuzzy_string.gfolded_len = (RE_INT8)gfolded_len; bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; bt_data->fuzzy_string.step = (RE_INT8)step; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *group_pos = new_group_pos; *folded_pos = data.new_folded_pos; *gfolded_pos = data.new_gfolded_pos; *matched = TRUE; return TRUE; } /* Retries a fuzzy match of a group reference, ignoring case. */ Py_LOCAL_INLINE(BOOL) retry_fuzzy_match_string_fld2(RE_SafeState* safe_state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, int* folded_pos, Py_ssize_t* group_pos, int* gfolded_pos, BOOL* matched) { RE_State* state; RE_FuzzyData data; RE_FuzzyInfo* fuzzy_info; RE_CODE* values; RE_BacktrackData* bt_data; Py_ssize_t new_text_pos; Py_ssize_t new_group_pos; RE_Node* new_node; state = safe_state->re_state; fuzzy_info = &state->fuzzy_info; values = fuzzy_info->node->values; bt_data = state->backtrack; new_text_pos = bt_data->fuzzy_string.position.text_pos; new_node = bt_data->fuzzy_string.position.node; new_group_pos = bt_data->fuzzy_string.string_pos; data.new_folded_pos = bt_data->fuzzy_string.folded_pos; data.folded_len = bt_data->fuzzy_string.folded_len; data.new_gfolded_pos = bt_data->fuzzy_string.gfolded_pos; data.fuzzy_type = bt_data->fuzzy_string.fuzzy_type; data.step = bt_data->fuzzy_string.step; --fuzzy_info->counts[data.fuzzy_type]; --fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; --state->total_errors; state->total_cost -= values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; /* Permit insertion except initially when searching (it's better just to * start searching one character later). */ data.permit_insertion = !search || new_text_pos != state->search_anchor || data.new_folded_pos != bt_data->fuzzy_string.folded_len; for (++data.fuzzy_type; data.fuzzy_type < RE_FUZZY_COUNT; data.fuzzy_type++) { if (next_fuzzy_match_string_fld2(state, &data)) goto found; } discard_backtrack(state); *matched = FALSE; return TRUE; found: bt_data->fuzzy_string.fuzzy_type = (RE_INT8)data.fuzzy_type; ++fuzzy_info->counts[data.fuzzy_type]; ++fuzzy_info->counts[RE_FUZZY_ERR]; fuzzy_info->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; ++state->total_errors; state->total_cost += values[RE_FUZZY_VAL_COST_BASE + data.fuzzy_type]; *text_pos = new_text_pos; *node = new_node; *group_pos = new_group_pos; *folded_pos = data.new_folded_pos; *gfolded_pos = data.new_gfolded_pos; *matched = TRUE; return TRUE; } /* Locates the required string, if there's one. */ Py_LOCAL_INLINE(Py_ssize_t) locate_required_string(RE_SafeState* safe_state) { RE_State* state; PatternObject* pattern; Py_ssize_t found_pos; Py_ssize_t end_pos; state = safe_state->re_state; pattern = state->pattern; /* We haven't matched the required string yet. */ state->req_pos = -1; if (!pattern->req_string) /* There isn't a required string, so start matching from the current * position. */ return state->text_pos; /* Search for the required string and calculate where to start matching. */ switch (pattern->req_string->op) { case RE_OP_STRING: found_pos = string_search(safe_state, pattern->req_string, state->text_pos, state->slice_end); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos + pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos -= pattern->req_offset; if (found_pos >= state->text_pos) return found_pos; } break; case RE_OP_STRING_FLD: found_pos = string_search_fld(safe_state, pattern->req_string, state->text_pos, state->slice_end, &end_pos); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = end_pos; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos -= pattern->req_offset; if (found_pos >= state->text_pos) return found_pos; } break; case RE_OP_STRING_FLD_REV: found_pos = string_search_fld_rev(safe_state, pattern->req_string, state->text_pos, state->slice_start, &end_pos); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = end_pos; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos += pattern->req_offset; if (found_pos <= state->text_pos) return found_pos; } break; case RE_OP_STRING_IGN: found_pos = string_search_ign(safe_state, pattern->req_string, state->text_pos, state->slice_end); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos + pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos -= pattern->req_offset; if (found_pos >= state->text_pos) return found_pos; } break; case RE_OP_STRING_IGN_REV: found_pos = string_search_ign_rev(safe_state, pattern->req_string, state->text_pos, state->slice_start); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos - pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos += pattern->req_offset; if (found_pos <= state->text_pos) return found_pos; } break; case RE_OP_STRING_REV: found_pos = string_search_rev(safe_state, pattern->req_string, state->text_pos, state->slice_start); if (found_pos < 0) /* The required string wasn't found. */ return -1; /* Record where the required string matched. */ state->req_pos = found_pos; state->req_end = found_pos - pattern->req_string->value_count; if (pattern->req_offset >= 0) { /* Step back from the required string to where we should start * matching. */ found_pos += pattern->req_offset; if (found_pos <= state->text_pos) return found_pos; } break; } /* Start matching from the current position. */ return state->text_pos; } /* Performs a depth-first match or search from the context. */ Py_LOCAL_INLINE(int) basic_match(RE_SafeState* safe_state, RE_Node* start_node, BOOL search, BOOL recursive_call) { RE_State* state; Py_ssize_t slice_start; Py_ssize_t slice_end; Py_ssize_t text_pos; RE_EncodingTable* encoding; PatternObject* pattern; Py_ssize_t text_length; RE_NextNode start_pair; void* text; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); BOOL (*has_property)(RE_CODE property, Py_UCS4 ch); Py_ssize_t pattern_step; /* The overall step of the pattern (forwards or backwards). */ Py_ssize_t string_pos; BOOL do_search_start; Py_ssize_t found_pos; int folded_pos; int gfolded_pos; RE_Node* node; TRACE(("<>\n")) state = safe_state->re_state; slice_start = state->slice_start; slice_end = state->slice_end; text_pos = state->text_pos; encoding = state->encoding; pattern = state->pattern; text_length = state->text_length; /* Look beyond any initial group node. */ start_pair.node = start_node; if (recursive_call) start_pair.test = locate_test_start(start_node); else start_pair.test = pattern->start_test; /* Is the pattern anchored to the start or end of the string? */ switch (start_pair.test->op) { case RE_OP_END_OF_STRING: if (state->reverse) { /* Searching backwards. */ if (text_pos != text_length) return RE_ERROR_FAILURE; /* Don't bother to search further because it's anchored. */ search = FALSE; } break; case RE_OP_START_OF_STRING: if (!state->reverse) { /* Searching forwards. */ if (text_pos != 0) return RE_ERROR_FAILURE; /* Don't bother to search further because it's anchored. */ search = FALSE; } break; } text = state->text; char_at = state->char_at; has_property = encoding->has_property; pattern_step = state->reverse ? -1 : 1; string_pos = -1; do_search_start = pattern->do_search_start; /* Add a backtrack entry for failure. */ if (!add_backtrack(safe_state, RE_OP_FAILURE)) return RE_ERROR_BACKTRACKING; start_match: /* If we're searching, advance along the string until there could be a * match. */ if (pattern->pattern_call_ref >= 0) { RE_GuardList* guard_list; guard_list = &state->group_call_guard_list[pattern->pattern_call_ref]; guard_list->count = 0; guard_list->last_text_pos = -1; } /* Locate the required string, if there's one, unless this is a recursive * call of 'basic_match'. */ if (!pattern->req_string || recursive_call) found_pos = state->text_pos; else { found_pos = locate_required_string(safe_state); if (found_pos < 0) return RE_ERROR_FAILURE; } if (search) { state->text_pos = found_pos; if (do_search_start) { RE_Position new_position; next_match_1: /* 'search_start' will clear 'do_search_start' if it can't perform * a fast search for the next possible match. This enables us to * avoid the overhead of the call subsequently. */ if (!search_start(safe_state, &start_pair, &new_position, 0)) return RE_ERROR_FAILURE; node = new_position.node; text_pos = new_position.text_pos; if (node->op == RE_OP_SUCCESS) { /* Must the match advance past its start? */ if (text_pos != state->search_anchor || !state->must_advance) { state->text_pos = text_pos; return RE_ERROR_SUCCESS; } state->text_pos = state->match_pos + pattern_step; goto next_match_1; } /* 'do_search_start' may have been cleared. */ do_search_start = pattern->do_search_start; } else { /* Avoiding 'search_start', which we've found can't perform a fast * search for the next possible match. */ node = start_node; text_pos = state->text_pos; next_match_2: if (state->reverse) { if (text_pos < slice_start) return RE_ERROR_FAILURE; } else { if (text_pos > slice_end) return RE_ERROR_FAILURE; } state->match_pos = text_pos; if (node->op == RE_OP_SUCCESS) { /* Must the match advance past its start? */ if (text_pos != state->search_anchor || !state->must_advance) { BOOL success; if (state->match_all && !recursive_call) { /* We want to match all of the slice. */ if (state->reverse) success = text_pos == slice_start; else success = text_pos == slice_end; } else success = TRUE; if (success) { state->text_pos = text_pos; return RE_ERROR_SUCCESS; } } text_pos = state->match_pos + pattern_step; goto next_match_2; } } } else { /* The start position is anchored to the current position. */ if (found_pos != state->text_pos) return RE_ERROR_FAILURE; node = start_node; } advance: /* The main matching loop. */ for (;;) { TRACE(("%d|", text_pos)) /* Should we abort the matching? */ ++state->iterations; if (state->iterations == 0 && safe_check_signals(safe_state)) return RE_ERROR_INTERRUPTED; switch (node->op) { case RE_OP_ANY: /* Any character, except a newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos < slice_end && char_at(text, text_pos) != '\n') { ++text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_ALL: /* Any character at all. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos < slice_end) { ++text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_ALL_REV: /* Any character at all backwards. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos > slice_start) { --text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_REV: /* Any character backwards, except a newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos > slice_start && char_at(text, text_pos - 1) != '\n') { --text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_U: /* Any character, except a line separator. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos < slice_end && !state->encoding->is_line_sep(char_at(text, text_pos))) { ++text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ANY_U_REV: /* Any character backwards, except a line separator. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos > slice_start && !state->encoding->is_line_sep(char_at(text, text_pos - 1))) { --text_pos; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_ATOMIC: /* Atomic subpattern. */ { RE_Info info; int status; TRACE(("%s\n", re_op_text[node->op])) if (!add_backtrack(safe_state, RE_OP_ATOMIC)) return RE_ERROR_BACKTRACKING; state->backtrack->atomic.too_few_errors = state->too_few_errors; state->backtrack->atomic.capture_change = state->capture_change; /* Save the groups. */ if (!push_groups(safe_state)) return RE_ERROR_MEMORY; save_info(state, &info); state->text_pos = text_pos; state->must_advance = FALSE; status = basic_match(safe_state, node->nonstring.next_2.node, FALSE, TRUE); if (status < 0) return status; reset_guards(state, node->values); restore_info(state, &info); if (status != RE_ERROR_SUCCESS) goto backtrack; node = node->next_1.node; text_pos = state->text_pos; break; } case RE_OP_BOUNDARY: /* At a word boundary. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_boundary(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_BRANCH: /* 2-way branch. */ { RE_Position next_position; TRACE(("%s\n", re_op_text[node->op])) if (try_match(state, &node->next_1, text_pos, &next_position)) { if (!add_backtrack(safe_state, RE_OP_BRANCH)) return RE_ERROR_BACKTRACKING; state->backtrack->branch.position.node = node->nonstring.next_2.node; state->backtrack->branch.position.text_pos = text_pos; node = next_position.node; text_pos = next_position.text_pos; } else node = node->nonstring.next_2.node; break; } case RE_OP_CALL_REF: /* A group call reference. */ { TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) if (!push_group_return(safe_state, NULL)) return RE_ERROR_MEMORY; if (!add_backtrack(safe_state, RE_OP_CALL_REF)) return RE_ERROR_BACKTRACKING; node = node->next_1.node; break; } case RE_OP_CHARACTER: /* A character literal. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && (char_at(text, text_pos) == node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && same_char_ign(encoding, char_at(text, text_pos), node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_CHARACTER_IGN_REV: /* A character literal backwards, ignoring case. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && same_char_ign(encoding, char_at(text, text_pos - 1), node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_CHARACTER_REV: /* A character literal backwards. */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && (char_at(text, text_pos - 1) == node->values[0]) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_default_boundary(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_default_word_end(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_default_word_start(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_FUZZY: /* End of fuzzy matching. */ TRACE(("%s\n", re_op_text[node->op])) if (!fuzzy_insert(safe_state, text_pos, node)) return RE_ERROR_BACKTRACKING; /* If there were too few errors, in the fuzzy section, try again. */ if (state->too_few_errors) { state->too_few_errors = FALSE; goto backtrack; } node = node->next_1.node; break; case RE_OP_END_GREEDY_REPEAT: /* End of a greedy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; BOOL changed; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* The body has matched successfully at this position. */ if (!guard_repeat(safe_state, index, rp_data->start, RE_STATUS_BODY, FALSE)) return RE_ERROR_MEMORY; ++rp_data->count; /* Have we advanced through the text or has a capture group change? */ changed = rp_data->capture_change != state->capture_change || text_pos != rp_data->start; /* The counts are of type size_t, so the format needs to specify * that. */ TRACE(("min is %" PY_FORMAT_SIZE_T "u, max is %" PY_FORMAT_SIZE_T "u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ try_body = changed && (rp_data->count < node->values[2] || ~node->values[2] == 0) && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = (!changed || rp_data->count >= node->values[1]) && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_TAIL) && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) { /* Neither the body nor the tail could match. */ --rp_data->count; goto backtrack; } /* Record info in case we backtrack into the body. */ if (!add_backtrack(safe_state, RE_OP_BODY_END)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count - 1; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the body * takes precedence. If the body fails to match then we * want to try the tail before backtracking further. */ /* Record backtracking info for matching the tail. */ if (!add_backtrack(safe_state, RE_OP_MATCH_TAIL)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_tail_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; } /* Record backtracking info in case the body fails to match. */ if (!add_backtrack(safe_state, RE_OP_BODY_START)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.text_pos = text_pos; rp_data->capture_change = state->capture_change; rp_data->start = text_pos; /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_END_GROUP: /* End of a capture group. */ { RE_CODE private_index; RE_CODE public_index; RE_GroupData* group; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[1])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). */ private_index = node->values[0]; public_index = node->values[1]; group = &state->groups[private_index - 1]; if (!add_backtrack(safe_state, RE_OP_END_GROUP)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->group.private_index = private_index; bt_data->group.public_index = public_index; bt_data->group.text_pos = group->span.end; bt_data->group.capture = (BOOL)node->values[2]; bt_data->group.current_capture = group->current_capture; if (pattern->group_info[private_index - 1].referenced && group->span.end != text_pos) ++state->capture_change; group->span.end = text_pos; /* Save the capture? */ if (node->values[2]) { group->current_capture = group->capture_count; if (!save_capture(safe_state, private_index, public_index)) return RE_ERROR_MEMORY; } node = node->next_1.node; break; } case RE_OP_END_LAZY_REPEAT: /* End of a lazy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; BOOL changed; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* The body has matched successfully at this position. */ if (!guard_repeat(safe_state, index, rp_data->start, RE_STATUS_BODY, FALSE)) return RE_ERROR_MEMORY; ++rp_data->count; /* Have we advanced through the text or has a capture group change? */ changed = rp_data->capture_change != state->capture_change || text_pos != rp_data->start; /* The counts are of type size_t, so the format needs to specify * that. */ TRACE(("min is %" PY_FORMAT_SIZE_T "u, max is %" PY_FORMAT_SIZE_T "u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ try_body = changed && (rp_data->count < node->values[2] || ~node->values[2] == 0) && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = (!changed || rp_data->count >= node->values[1]) && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) { /* Neither the body nor the tail could match. */ --rp_data->count; goto backtrack; } /* Record info in case we backtrack into the body. */ if (!add_backtrack(safe_state, RE_OP_BODY_END)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count - 1; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the tail * takes precedence. If the tail fails to match then we * want to try the body before backtracking further. */ /* Record backtracking info for matching the body. */ if (!add_backtrack(safe_state, RE_OP_MATCH_BODY)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_body_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } else { /* Only the body could match. */ /* Record backtracking info in case the body fails to * match. */ if (!add_backtrack(safe_state, RE_OP_BODY_START)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.text_pos = text_pos; rp_data->capture_change = state->capture_change; rp_data->start = text_pos; /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_END_OF_LINE: /* At the end of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length || char_at(text, text_pos) == '\n') node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_LINE_U: /* At the end of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (encoding->at_line_end(state, text_pos)) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_STRING: /* At the end of the string. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_STRING_LINE: /* At end of string or final newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length || text_pos == state->final_newline) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_STRING_LINE_U: /* At end of string or final newline. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == text_length || text_pos == state->final_line_sep) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_END_OF_WORD: /* At end of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_word_end(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_FUZZY: /* Fuzzy matching. */ { RE_FuzzyInfo* fuzzy_info; RE_BacktrackData* bt_data; TRACE(("%s\n", re_op_text[node->op])) fuzzy_info = &state->fuzzy_info; /* Save the current fuzzy info. */ if (!add_backtrack(safe_state, RE_OP_FUZZY)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; memmove(&bt_data->fuzzy.fuzzy_info, fuzzy_info, sizeof(RE_FuzzyInfo)); bt_data->fuzzy.index = node->values[0]; bt_data->fuzzy.text_pos = text_pos; /* Initialise the new fuzzy info. */ memset(fuzzy_info->counts, 0, 4 * sizeof(fuzzy_info->counts[0])); fuzzy_info->total_cost = 0; fuzzy_info->node = node; node = node->next_1.node; break; } case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_grapheme_boundary(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_GREEDY_REPEAT: /* Greedy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; RE_BacktrackData* bt_data; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* We might need to backtrack into the head, so save the current * repeat. */ if (!add_backtrack(safe_state, RE_OP_GREEDY_REPEAT)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Initialise the new repeat. */ rp_data->count = 0; rp_data->start = text_pos; rp_data->capture_change = state->capture_change; /* Could the body or tail match? */ try_body = node->values[2] > 0 && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = node->values[1] == 0 && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) /* Neither the body nor the tail could match. */ goto backtrack; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the body * takes precedence. If the body fails to match then we * want to try the tail before backtracking further. */ /* Record backtracking info for matching the tail. */ if (!add_backtrack(safe_state, RE_OP_MATCH_TAIL)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_tail_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; } /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_GREEDY_REPEAT_ONE: /* Greedy repeat for one character. */ { RE_CODE index; RE_RepeatData* rp_data; size_t count; BOOL match; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; if (is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY)) goto backtrack; /* Count how many times the character repeats, up to the maximum. */ count = count_one(state, node->nonstring.next_2.node, text_pos, (size_t)node->values[2]); /* Unmatch until it's not guarded. */ match = FALSE; for (;;) { if (count < node->values[1]) /* The number of repeats is below the minimum. */ break; if (!is_repeat_guarded(safe_state, index, text_pos + (Py_ssize_t)count * node->step, RE_STATUS_TAIL)) { /* It's not guarded at this position. */ match = TRUE; break; } if (count == 0) break; --count; } if (!match) { /* The repeat has failed to match at this position. */ if (!guard_repeat(safe_state, index, text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; goto backtrack; } /* Record the backtracking info. */ if (!add_backtrack(safe_state, RE_OP_GREEDY_REPEAT_ONE)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position.node = node; bt_data->repeat.index = index; bt_data->repeat.text_pos = rp_data->start; bt_data->repeat.count = rp_data->count; rp_data->start = text_pos; rp_data->count = count; /* Advance into the tail. */ text_pos += (Py_ssize_t)count * node->step; node = node->next_1.node; break; } case RE_OP_GROUP_CALL: /* Group call. */ { RE_CODE index; Py_ssize_t g; Py_ssize_t r; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) index = node->values[0]; /* Save the capture groups and repeat guards. */ if (!push_group_return(safe_state, node->next_1.node)) return RE_ERROR_MEMORY; /* Clear the capture groups for the group call. They'll be restored * on return. */ for (g = 0; g < state->pattern->true_group_count; g++) { RE_GroupData* group; group = &state->groups[g]; group->span.start = -1; group->span.end = -1; group->current_capture = -1; } /* Clear the repeat guards for the group call. They'll be restored * on return. */ for (r = 0; r < state->pattern->repeat_count; r++) { RE_RepeatData* repeat; repeat = &state->repeats[r]; repeat->body_guard_list.count = 0; repeat->body_guard_list.last_text_pos = -1; repeat->tail_guard_list.count = 0; repeat->tail_guard_list.last_text_pos = -1; } /* Call a group, skipping its CALL_REF node. */ node = pattern->call_ref_info[index].node->next_1.node; if (!add_backtrack(safe_state, RE_OP_GROUP_CALL)) return RE_ERROR_BACKTRACKING; break; } case RE_OP_GROUP_EXISTS: /* Capture group exists. */ { RE_GroupData* group; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ group = &state->groups[node->values[0] - 1]; if (group->current_capture >= 0) node = node->next_1.node; else node = node->nonstring.next_2.node; break; } case RE_OP_GROUP_RETURN: /* Group return. */ { RE_Node* return_node; RE_BacktrackData* bt_data; TRACE(("%s\n", re_op_text[node->op])) return_node = top_group_return(state); if (!add_backtrack(safe_state, RE_OP_GROUP_RETURN)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->group_call.node = return_node; bt_data->group_call.capture_change = state->capture_change; if (return_node) { /* The group was called. */ node = return_node; /* Save the groups. */ if (!push_groups(safe_state)) return RE_ERROR_MEMORY; /* Save the repeats. */ if (!push_repeats(safe_state)) return RE_ERROR_MEMORY; } else /* The group was not called. */ node = node->next_1.node; pop_group_return(state); break; } case RE_OP_LAZY_REPEAT: /* Lazy repeat. */ { RE_CODE index; RE_RepeatData* rp_data; RE_BacktrackData* bt_data; BOOL try_body; RE_Position next_body_position; BOOL try_tail; RE_Position next_tail_position; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; /* We might need to backtrack into the head, so save the current * repeat. */ if (!add_backtrack(safe_state, RE_OP_LAZY_REPEAT)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Initialise the new repeat. */ rp_data->count = 0; rp_data->start = text_pos; rp_data->capture_change = state->capture_change; /* Could the body or tail match? */ try_body = node->values[2] > 0 && !is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY) && try_match(state, &node->next_1, text_pos, &next_body_position); try_tail = node->values[1] == 0 && try_match(state, &node->nonstring.next_2, text_pos, &next_tail_position); if (!try_body && !try_tail) /* Neither the body nor the tail could match. */ goto backtrack; if (try_body) { if (try_tail) { /* Both the body and the tail could match, but the tail * takes precedence. If the tail fails to match then we * want to try the body before backtracking further. */ /* Record backtracking info for matching the tail. */ if (!add_backtrack(safe_state, RE_OP_MATCH_BODY)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position = next_body_position; bt_data->repeat.index = index; bt_data->repeat.count = rp_data->count; bt_data->repeat.start = rp_data->start; bt_data->repeat.capture_change = rp_data->capture_change; bt_data->repeat.text_pos = text_pos; /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } else { /* Advance into the body. */ node = next_body_position.node; text_pos = next_body_position.text_pos; } } else { /* Only the tail could match. */ /* Advance into the tail. */ node = next_tail_position.node; text_pos = next_tail_position.text_pos; } break; } case RE_OP_LAZY_REPEAT_ONE: /* Lazy repeat for one character. */ { RE_CODE index; RE_RepeatData* rp_data; size_t count; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Repeat indexes are 0-based. */ index = node->values[0]; rp_data = &state->repeats[index]; if (is_repeat_guarded(safe_state, index, text_pos, RE_STATUS_BODY)) goto backtrack; /* Count how many times the character repeats, up to the minimum. */ count = count_one(state, node->nonstring.next_2.node, text_pos, (size_t)node->values[1]); /* Have we matched at least the minimum? */ if (count < node->values[1]) { /* The repeat has failed to match at this position. */ if (!guard_repeat(safe_state, index, text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; goto backtrack; } if (count < node->values[2]) { /* The match is shorter than the maximum, so we might need to * backtrack the repeat to consume more. */ RE_BacktrackData* bt_data; /* Get the offset to the repeat values in the context. */ rp_data = &state->repeats[index]; if (!add_backtrack(safe_state, RE_OP_LAZY_REPEAT_ONE)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->repeat.position.node = node; bt_data->repeat.index = index; bt_data->repeat.text_pos = rp_data->start; bt_data->repeat.count = rp_data->count; rp_data->start = text_pos; rp_data->count = count; } /* Advance into the tail. */ text_pos += (Py_ssize_t)count * node->step; node = node->next_1.node; break; } case RE_OP_LOOKAROUND: /* Lookaround. */ { RE_Info info; size_t capture_change; BOOL too_few_errors; int status; TRACE(("%s %d\n", re_op_text[node->op], node->match)) /* Save the groups. */ if (!push_groups(safe_state)) return RE_ERROR_MEMORY; capture_change = state->capture_change; /* Save the other info. */ save_info(state, &info); state->slice_start = 0; state->slice_end = text_length; state->text_pos = text_pos; state->must_advance = FALSE; too_few_errors = state->too_few_errors; status = basic_match(safe_state, node->nonstring.next_2.node, FALSE, TRUE); if (status < 0) return status; reset_guards(state, node->values + 1); state->slice_end = slice_end; state->slice_start = slice_start; /* Restore the other info. */ restore_info(state, &info); if (node->match) { /* It's a positive lookaround. */ if (status == RE_ERROR_SUCCESS) { /* It succeeded, so the groups and certain flags may have * changed. */ if (!add_backtrack(safe_state, RE_OP_LOOKAROUND)) return RE_ERROR_BACKTRACKING; /* We'll restore the groups and flags on backtracking. */ state->backtrack->lookaround.too_few_errors = too_few_errors; state->backtrack->lookaround.capture_change = capture_change; } else { /* It failed, so the groups and certain flags haven't * changed. */ drop_groups(state); goto backtrack; } } else { /* It's a negative lookaround. */ if (status == RE_ERROR_SUCCESS) { /* It succeeded, so the groups and certain flags may have * changed. We need to restore them. */ pop_groups(state); state->too_few_errors = too_few_errors; state->capture_change = capture_change; goto backtrack; } else /* It failed, so the groups and certain flags haven't * changed. */ drop_groups(state); } node = node->next_1.node; break; } case RE_OP_PROPERTY: /* A property. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && has_property(node->values[0], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_PROPERTY_IGN: /* A property, ignoring case. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos < slice_end && has_property_ign(encoding, node->values[0], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_PROPERTY_IGN_REV: /* A property backwards, ignoring case. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && has_property_ign(encoding, node->values[0], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_PROPERTY_REV: /* A property backwards. */ /* values are: property */ TRACE(("%s %d %d\n", re_op_text[node->op], node->match, node->values[0])) if (text_pos > slice_start && has_property(node->values[0], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE: /* A range. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos < slice_end && in_range(node->values[0], node->values[1], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE_IGN: /* A range, ignoring case. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos < slice_end && in_range_ign(encoding, node->values[0], node->values[1], char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE_IGN_REV: /* A range backwards, ignoring case. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos > slice_start && in_range_ign(encoding, node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_RANGE_REV: /* A range backwards. */ /* values are: lower, upper */ TRACE(("%s %d %d %d\n", re_op_text[node->op], node->match, node->values[0], node->values[1])) if (text_pos > slice_start && in_range(node->values[0], node->values[1], char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_REF_GROUP: /* Reference to a capture group. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = state->slice_end - text_pos; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->start; /* Try comparing. */ while (string_pos < span->end) { if (text_pos < slice_end && char_at(text, text_pos) == char_at(text, string_pos)) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_FLD: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); int folded_len; int gfolded_len; Py_UCS4 folded[RE_MAX_FOLDED]; Py_UCS4 gfolded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = span->start; folded_pos = 0; folded_len = 0; gfolded_pos = 0; gfolded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos), folded); gfolded_len = full_case_fold(char_at(text, string_pos), gfolded); } /* Try comparing. */ while (string_pos < span->end) { /* Case-fold at current position in text. */ if (folded_pos >= folded_len) { if (text_pos < slice_end) folded_len = full_case_fold(char_at(text, text_pos), folded); else folded_len = 0; folded_pos = 0; } /* Case-fold at current position in group. */ if (gfolded_pos >= gfolded_len) { gfolded_len = full_case_fold(char_at(text, string_pos), gfolded); gfolded_pos = 0; } if (folded_pos < folded_len && folded[folded_pos] == gfolded[gfolded_pos]) { ++folded_pos; ++gfolded_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld2(safe_state, search, &text_pos, node, &folded_pos, folded_len, &string_pos, &gfolded_pos, gfolded_len, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } if (folded_pos >= folded_len && folded_len > 0) ++text_pos; if (gfolded_pos >= gfolded_len) ++string_pos; } string_pos = -1; if (folded_pos < folded_len || gfolded_pos < gfolded_len) goto backtrack; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_FLD_REV: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); int folded_len; int gfolded_len; Py_UCS4 folded[RE_MAX_FOLDED]; Py_UCS4 gfolded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = span->end; folded_pos = 0; folded_len = 0; gfolded_pos = 0; gfolded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos - 1), folded); gfolded_len = full_case_fold(char_at(text, string_pos - 1), gfolded); } /* Try comparing. */ while (string_pos > span->start) { /* Case-fold at current position in text. */ if (folded_pos <= 0) { if (text_pos > slice_start) folded_len = full_case_fold(char_at(text, text_pos - 1), folded); else folded_len = 0; folded_pos = folded_len; } /* Case-fold at current position in group. */ if (gfolded_pos <= 0) { gfolded_len = full_case_fold(char_at(text, string_pos - 1), gfolded); gfolded_pos = gfolded_len; } if (folded_pos > 0 && folded[folded_pos - 1] == gfolded[gfolded_pos - 1]) { --folded_pos; --gfolded_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld2(safe_state, search, &text_pos, node, &folded_pos, folded_len, &string_pos, &gfolded_pos, gfolded_len, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } if (folded_pos <= 0 && folded_len > 0) --text_pos; if (gfolded_pos <= 0) --string_pos; } string_pos = -1; if (folded_pos > 0 || gfolded_pos > 0) goto backtrack; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_IGN: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = state->slice_end - text_pos; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->start; /* Try comparing. */ while (string_pos < span->end) { if (text_pos < slice_end && same_char_ign(encoding, char_at(text, text_pos), char_at(text, string_pos))) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_IGN_REV: /* Reference to a capture group, ignoring case. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = text_pos - state->slice_start; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->end; /* Try comparing. */ while (string_pos > span->start) { if (text_pos > slice_start && same_char_ign(encoding, char_at(text, text_pos - 1), char_at(text, string_pos - 1))) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_REF_GROUP_REV: /* Reference to a capture group. */ { RE_GroupData* group; RE_GroupSpan* span; Py_ssize_t available; TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). * * Check whether the captured text, if any, exists at this position * in the string. */ /* Did the group capture anything? */ group = &state->groups[node->values[0] - 1]; if (group->current_capture < 0) goto backtrack; span = &group->captures[group->current_capture]; /* Are there enough characters? */ available = text_pos - state->slice_start; if (!(node->status & RE_STATUS_FUZZY) && span->end - span->start > available) goto backtrack; if (string_pos < 0) string_pos = span->end; /* Try comparing. */ while (string_pos > span->start) { if (text_pos > slice_start && char_at(text, text_pos - 1) == char_at(text, string_pos - 1)) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ TRACE(("%s %d\n", re_op_text[node->op], node->values[0])) if (text_pos == state->search_anchor) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF: /* Character set. */ case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos < slice_end && in_set(encoding, node, char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION_IGN: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos < slice_end && in_set_ign(encoding, node, char_at(text, text_pos)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, 1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_UNION_IGN_REV: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos > slice_start && in_set_ign(encoding, node, char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_SET_DIFF_REV: /* Character set. */ case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_REV: TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (text_pos > slice_start && in_set(encoding, node, char_at(text, text_pos - 1)) == node->match) { text_pos += node->step; node = node->next_1.node; } else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_one(safe_state, search, &text_pos, &node, -1)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_GROUP: /* Start of a capture group. */ { RE_CODE private_index; RE_CODE public_index; RE_GroupData* group; RE_BacktrackData* bt_data; TRACE(("%s %d\n", re_op_text[node->op], node->values[1])) /* Capture group indexes are 1-based (excluding group 0, which is * the entire matched string). */ private_index = node->values[0]; public_index = node->values[1]; group = &state->groups[private_index - 1]; if (!add_backtrack(safe_state, RE_OP_START_GROUP)) return RE_ERROR_BACKTRACKING; bt_data = state->backtrack; bt_data->group.private_index = private_index; bt_data->group.public_index = public_index; bt_data->group.text_pos = group->span.start; bt_data->group.capture = (BOOL)node->values[2]; bt_data->group.current_capture = group->current_capture; if (pattern->group_info[private_index - 1].referenced && group->span.start != text_pos) ++state->capture_change; group->span.start = text_pos; /* Save the capture? */ if (node->values[2]) { group->current_capture = group->capture_count; if (!save_capture(safe_state, private_index, public_index)) return RE_ERROR_MEMORY; } node = node->next_1.node; break; } case RE_OP_START_OF_LINE: /* At the start of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == 0 || char_at(text, text_pos - 1) == '\n') node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_OF_LINE_U: /* At the start of a line. */ TRACE(("%s\n", re_op_text[node->op])) if (encoding->at_line_start(state, text_pos)) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_OF_STRING: /* At the start of the string. */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == 0) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_START_OF_WORD: /* At start of a word. */ TRACE(("%s %d\n", re_op_text[node->op], node->match)) if (encoding->at_word_start(state, text_pos) == node->match) node = node->next_1.node; else if (node->status & RE_STATUS_FUZZY) { if (!fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (!node) goto backtrack; } else goto backtrack; break; case RE_OP_STRING: /* A string literal. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = slice_end - text_pos; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = 0; values = node->values; /* Try comparing. */ while (string_pos < length) { if (text_pos < slice_end && char_at(text, text_pos) == values[string_pos]) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); RE_CODE* values; int folded_len; Py_UCS4 folded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = slice_end - text_pos; if ((Py_ssize_t)possible_unfolded_length(length) > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = 0; folded_pos = 0; folded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos), folded); if (folded_pos >= folded_len) { if (text_pos >= slice_end) goto backtrack; ++text_pos; folded_pos = 0; folded_len = 0; } } values = node->values; /* Try comparing. */ while (string_pos < length) { if (folded_pos >= folded_len) { folded_len = full_case_fold(char_at(text, text_pos), folded); folded_pos = 0; } if (same_char_ign(encoding, folded[folded_pos], values[string_pos])) { ++string_pos; ++folded_pos; if (folded_pos >= folded_len) ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos >= folded_len) ++text_pos; } else { string_pos = -1; goto backtrack; } } if (node->status & RE_STATUS_FUZZY) { while (folded_pos < folded_len) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos >= folded_len) ++text_pos; } } string_pos = -1; if (folded_pos < folded_len) goto backtrack; } /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_FLD_REV: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); RE_CODE* values; int folded_len; Py_UCS4 folded[RE_MAX_FOLDED]; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = text_pos - slice_start; if ((Py_ssize_t)possible_unfolded_length(length) > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; full_case_fold = encoding->full_case_fold; if (string_pos < 0) { string_pos = length; folded_pos = 0; folded_len = 0; } else { folded_len = full_case_fold(char_at(text, text_pos - 1), folded); if (folded_pos <= 0) { if (text_pos <= slice_start) goto backtrack; --text_pos; folded_pos = 0; folded_len = 0; } } values = node->values; /* Try comparing. */ while (string_pos > 0) { if (folded_pos <= 0) { folded_len = full_case_fold(char_at(text, text_pos - 1), folded); folded_pos = folded_len; } if (same_char_ign(encoding, folded[folded_pos - 1], values[string_pos - 1])) { --string_pos; --folded_pos; if (folded_pos <= 0) --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos <= 0) --text_pos; } else { string_pos = -1; goto backtrack; } } if (node->status & RE_STATUS_FUZZY) { while (folded_pos > 0) { BOOL matched; if (!fuzzy_match_string_fld(safe_state, search, &text_pos, node, &string_pos, &folded_pos, folded_len, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } if (folded_pos <= 0) --text_pos; } } string_pos = -1; if (folded_pos > 0) goto backtrack; } /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = slice_end - text_pos; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = 0; values = node->values; /* Try comparing. */ while (string_pos < length) { if (text_pos < slice_end && same_char_ign(encoding, char_at(text, text_pos), values[string_pos])) { ++string_pos; ++text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, 1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_IGN_REV: /* A string literal, ignoring case. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = text_pos - slice_start; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = length; values = node->values; /* Try comparing. */ while (string_pos > 0) { if (text_pos > slice_start && same_char_ign(encoding, char_at(text, text_pos - 1), values[string_pos - 1])) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_REV: /* A string literal. */ { Py_ssize_t length; Py_ssize_t available; RE_CODE* values; TRACE(("%s %d\n", re_op_text[node->op], node->value_count)) if ((node->status & RE_STATUS_REQUIRED) && text_pos == state->req_pos && string_pos < 0) text_pos = state->req_end; else { /* Are there enough characters to match? */ length = node->value_count; available = text_pos - slice_start; if (length > available && !(node->status & RE_STATUS_FUZZY)) goto backtrack; if (string_pos < 0) string_pos = length; values = node->values; /* Try comparing. */ while (string_pos > 0) { if (text_pos > slice_start && char_at(text, text_pos - 1) == values[string_pos - 1]) { --string_pos; --text_pos; } else if (node->status & RE_STATUS_FUZZY) { BOOL matched; if (!fuzzy_match_string(safe_state, search, &text_pos, node, &string_pos, &matched, -1)) return RE_ERROR_BACKTRACKING; if (!matched) { string_pos = -1; goto backtrack; } } else { string_pos = -1; goto backtrack; } } } string_pos = -1; /* Successful match. */ node = node->next_1.node; break; } case RE_OP_STRING_SET: /* Member of a string set. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_FLD: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_fld(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_FLD_REV: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_fld_rev(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_IGN: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_ign(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_IGN_REV: /* Member of a string set, ignoring case. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_ign_rev(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_STRING_SET_REV: /* Member of a string set. */ { int status; TRACE(("%s\n", re_op_text[node->op])) state->text_pos = text_pos; status = string_set_match_rev(safe_state, node); if (status < 0) return status; if (status == 0) goto backtrack; text_pos = state->text_pos; node = node->next_1.node; break; } case RE_OP_SUCCESS: /* Success. */ /* Must the match advance past its start? */ TRACE(("%s\n", re_op_text[node->op])) if (text_pos == state->search_anchor && state->must_advance) goto backtrack; if (state->match_all && !recursive_call) { /* We want to match all of the slice. */ if (state->reverse) { if (text_pos != slice_start) goto backtrack; } else { if (text_pos != slice_end) goto backtrack; } } state->text_pos = text_pos; return RE_ERROR_SUCCESS; default: /* Illegal opcode! */ TRACE(("UNKNOWN OP %d\n", node->op)) return RE_ERROR_ILLEGAL; } } backtrack: for (;;) { RE_BacktrackData* bt_data; TRACE(("BACKTRACK ")) /* Should we abort the matching? */ ++state->iterations; if (state->iterations == 0 && safe_check_signals(safe_state)) return RE_ERROR_INTERRUPTED; bt_data = last_backtrack(state); switch (bt_data->op) { case RE_OP_ANY: /* Any character, except a newline. */ case RE_OP_ANY_ALL: /* Any character at all. */ case RE_OP_ANY_ALL_REV: /* Any character at all. */ case RE_OP_ANY_REV: /* Any character, except a newline. */ case RE_OP_ANY_U: /* Any character, except a line separator. */ case RE_OP_ANY_U_REV: /* Any character, except a line separator. */ case RE_OP_CHARACTER: /* A character literal. */ case RE_OP_CHARACTER_IGN: /* A character literal, ignoring case. */ case RE_OP_CHARACTER_IGN_REV: /* A character literal, ignoring case. */ case RE_OP_CHARACTER_REV: /* A character literal. */ case RE_OP_PROPERTY: /* A property. */ case RE_OP_PROPERTY_IGN: /* A property, ignoring case. */ case RE_OP_PROPERTY_IGN_REV: /* A property, ignoring case. */ case RE_OP_PROPERTY_REV: /* A property. */ case RE_OP_RANGE: /* A range. */ case RE_OP_RANGE_IGN: /* A range, ignoring case. */ case RE_OP_RANGE_IGN_REV: /* A range, ignoring case. */ case RE_OP_RANGE_REV: /* A range. */ case RE_OP_SET_DIFF: /* Character set. */ case RE_OP_SET_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_DIFF_REV: /* Character set. */ case RE_OP_SET_INTER: /* Character set. */ case RE_OP_SET_INTER_IGN: /* Character set, ignoring case. */ case RE_OP_SET_INTER_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_INTER_REV: /* Character set. */ case RE_OP_SET_SYM_DIFF: /* Character set. */ case RE_OP_SET_SYM_DIFF_IGN: /* Character set, ignoring case. */ case RE_OP_SET_SYM_DIFF_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_SYM_DIFF_REV: /* Character set. */ case RE_OP_SET_UNION: /* Character set. */ case RE_OP_SET_UNION_IGN: /* Character set, ignoring case. */ case RE_OP_SET_UNION_IGN_REV: /* Character set, ignoring case. */ case RE_OP_SET_UNION_REV: /* Character set. */ TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_one(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (node) goto advance; break; case RE_OP_ATOMIC: /* Atomic subpattern. */ TRACE(("%s\n", re_op_text[bt_data->op])) /* Restore the groups and certain flags and then backtrack. */ pop_groups(state); state->too_few_errors = bt_data->atomic.too_few_errors; state->capture_change = bt_data->atomic.capture_change; discard_backtrack(state); break; case RE_OP_BODY_END: { RE_RepeatData* rp_data; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* We're backtracking into the body. */ rp_data = &state->repeats[bt_data->repeat.index]; /* Restore the repeat info. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; discard_backtrack(state); break; } case RE_OP_BODY_START: { TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* The body may have failed to match at this position. */ if (!guard_repeat(safe_state, bt_data->repeat.index, bt_data->repeat.text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; discard_backtrack(state); break; } case RE_OP_BOUNDARY: /* At a word boundary. */ case RE_OP_DEFAULT_BOUNDARY: /* At a default word boundary. */ case RE_OP_DEFAULT_END_OF_WORD: /* At a default end of a word. */ case RE_OP_DEFAULT_START_OF_WORD: /* At a default start of a word. */ case RE_OP_END_OF_LINE: /* At the end of a line. */ case RE_OP_END_OF_LINE_U: /* At the end of a line. */ case RE_OP_END_OF_STRING: /* At the end of the string. */ case RE_OP_END_OF_STRING_LINE: /* At end of string or final newline. */ case RE_OP_END_OF_STRING_LINE_U: /* At end of string or final newline. */ case RE_OP_END_OF_WORD: /* At end of a word. */ case RE_OP_GRAPHEME_BOUNDARY: /* At a grapheme boundary. */ case RE_OP_SEARCH_ANCHOR: /* At the start of the search. */ case RE_OP_START_OF_LINE: /* At the start of a line. */ case RE_OP_START_OF_LINE_U: /* At the start of a line. */ case RE_OP_START_OF_STRING: /* At the start of the string. */ case RE_OP_START_OF_WORD: /* At start of a word. */ TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_zero(safe_state, search, &text_pos, &node)) return RE_ERROR_BACKTRACKING; if (node) goto advance; break; case RE_OP_BRANCH: /* 2-way branch. */ TRACE(("%s\n", re_op_text[bt_data->op])) node = bt_data->branch.position.node; text_pos = bt_data->branch.position.text_pos; discard_backtrack(state); goto advance; case RE_OP_CALL_REF: /* A group call ref. */ TRACE(("%s\n", re_op_text[bt_data->op])) pop_group_return(state); discard_backtrack(state); break; case RE_OP_END_FUZZY: /* End of fuzzy matching. */ TRACE(("%s\n", re_op_text[bt_data->op])) /* We need to retry the fuzzy match. */ if (!retry_fuzzy_insert(safe_state, &text_pos, &node)) return RE_ERROR_BACKTRACKING; /* If there were too few errors, in the fuzzy section, try again. */ if (state->too_few_errors) { state->too_few_errors = FALSE; goto backtrack; } if (node) { node = node->next_1.node; goto advance; } break; case RE_OP_END_GROUP: /* End of a capture group. */ { RE_CODE private_index; RE_GroupData* group; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->group.public_index)) private_index = bt_data->group.private_index; group = &state->groups[private_index - 1]; /* Unsave the capture? */ if (bt_data->group.capture) unsave_capture(state, bt_data->group.private_index, bt_data->group.public_index); if (pattern->group_info[private_index - 1].referenced && group->span.end != bt_data->group.text_pos) --state->capture_change; group->span.end = bt_data->group.text_pos; group->current_capture = bt_data->group.current_capture; discard_backtrack(state); break; } case RE_OP_FAILURE: { Py_ssize_t end_pos; TRACE(("%s\n", re_op_text[bt_data->op])) /* Do we have to advance? */ if (!search) return RE_ERROR_FAILURE; /* Can we advance? */ text_pos = state->match_pos; end_pos = state->reverse ? slice_start : slice_end; if (text_pos == end_pos) return RE_ERROR_FAILURE; /* Skip over any repeated leading characters. */ switch (start_node->op) { case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: { size_t count; /* How many characters did the repeat actually match? */ count = count_one(state, start_node->nonstring.next_2.node, text_pos, (size_t)start_node->values[2]); /* If it's fewer than the maximum then skip over those * characters. */ if (count < start_node->values[2]) text_pos += (Py_ssize_t)count * pattern_step; break; } } /* Advance and try to match again. */ state->text_pos = text_pos + pattern_step; goto start_match; } case RE_OP_FUZZY: /* Fuzzy matching. */ { RE_FuzzyInfo* fuzzy_info; TRACE(("%s\n", re_op_text[bt_data->op])) /* Restore the previous fuzzy info. */ fuzzy_info = &state->fuzzy_info; memmove(fuzzy_info, &bt_data->fuzzy.fuzzy_info, sizeof(RE_FuzzyInfo)); discard_backtrack(state); break; } case RE_OP_GREEDY_REPEAT: /* Greedy repeat. */ case RE_OP_LAZY_REPEAT: /* Lazy repeat. */ { RE_RepeatData* rp_data; TRACE(("%s\n", re_op_text[bt_data->op])) /* The repeat failed to match. */ rp_data = &state->repeats[bt_data->repeat.index]; /* The body may have failed to match at this position. */ if (!guard_repeat(safe_state, bt_data->repeat.index, bt_data->repeat.text_pos, RE_STATUS_BODY, TRUE)) return RE_ERROR_MEMORY; /* Restore the previous repeat. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; discard_backtrack(state); break; } case RE_OP_GREEDY_REPEAT_ONE: /* Greedy repeat for one character. */ { RE_RepeatData* rp_data; size_t count; Py_ssize_t step; Py_ssize_t pos; Py_ssize_t limit; RE_Node* test; BOOL match; BOOL m; size_t index; TRACE(("%s\n", re_op_text[bt_data->op])) node = bt_data->repeat.position.node; rp_data = &state->repeats[bt_data->repeat.index]; /* Unmatch one character at a time until the tail could match or we * have reached the minimum. */ text_pos = rp_data->start; count = rp_data->count; step = node->step; pos = text_pos + (Py_ssize_t)count * step; limit = text_pos + (Py_ssize_t)node->values[1] * step; /* The tail failed to match at this position. */ if (!guard_repeat(safe_state, bt_data->repeat.index, pos, RE_STATUS_TAIL, TRUE)) return RE_ERROR_MEMORY; if (count == node->values[1]) { /* We've backtracked the repeat as far as we can. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); break; } test = node->next_1.test; m = test->match; index = node->values[0]; match = FALSE; if (test->status & RE_STATUS_FUZZY) { for (;;) { RE_Position next_position; pos -= step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } } else { /* A repeated single-character match is often followed by a * literal, so checking specially for it can be a good * optimisation when working with long strings. */ switch (test->op) { case RE_OP_CHARACTER: { Py_UCS4 ch; ch = test->values[0]; for (;;) { --pos; if ((char_at(text, pos) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_CHARACTER_IGN: { Py_UCS4 ch; ch = test->values[0]; for (;;) { --pos; if (same_char_ign(encoding, char_at(text, pos), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_CHARACTER_IGN_REV: { Py_UCS4 ch; ch = test->values[0]; for (;;) { ++pos; if (same_char_ign(encoding, char_at(text, pos - 1), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_CHARACTER_REV: { Py_UCS4 ch; ch = test->values[0]; for (;;) { ++pos; if ((char_at(text, pos - 1) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } case RE_OP_STRING: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MIN(pos, slice_end - length); for (;;) { Py_ssize_t found; if (pos < limit) break; found = string_search_rev(safe_state, test, pos + length, limit); if (found < 0) break; pos = found - length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } --pos; } break; } case RE_OP_STRING_FLD: { int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); size_t folded_length; size_t i; Py_UCS4 folded[RE_MAX_FOLDED]; full_case_fold = encoding->full_case_fold; folded_length = 0; for (i = 0; i < test->value_count; i++) folded_length += full_case_fold(test->values[i], folded); /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MIN(pos, slice_end - (Py_ssize_t)folded_length); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos < limit) break; found = string_search_fld_rev(safe_state, test, pos + folded_length, limit, &new_pos); if (found < 0) break; pos = found - folded_length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } --pos; } break; } case RE_OP_STRING_FLD_REV: { int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); size_t folded_length; size_t i; Py_UCS4 folded[RE_MAX_FOLDED]; full_case_fold = encoding->full_case_fold; folded_length = 0; for (i = 0; i < test->value_count; i++) folded_length += full_case_fold(test->values[i], folded); /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MAX(pos, slice_start + (Py_ssize_t)folded_length); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos > limit) break; found = string_search_fld(safe_state, test, pos - folded_length, limit, &new_pos); if (found < 0) break; pos = found + folded_length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } ++pos; } break; } case RE_OP_STRING_IGN: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MIN(pos, slice_end - length); for (;;) { Py_ssize_t found; if (pos < limit) break; found = string_search_ign_rev(safe_state, test, pos + length, limit); if (found < 0) break; pos = found - length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } --pos; } break; } case RE_OP_STRING_IGN_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MAX(pos, slice_start + length); for (;;) { Py_ssize_t found; if (pos > limit) break; found = string_search_ign(safe_state, test, pos - length, limit); if (found < 0) break; pos = found + length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } ++pos; } break; } case RE_OP_STRING_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ pos = RE_MAX(pos, slice_start + length); for (;;) { Py_ssize_t found; if (pos > limit) break; found = string_search(safe_state, test, pos - length, limit); if (found < 0) break; pos = found + length; if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } ++pos; } break; } default: for (;;) { RE_Position next_position; pos -= step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } } if (match) { count = abs_ssize_t(pos - text_pos); /* The tail could match. */ if (count > node->values[1]) /* The match is longer than the minimum, so we might need * to backtrack the repeat again to consume less. */ rp_data->count = count; else { /* We've reached or passed the minimum, so we won't need to * backtrack the repeat again. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); /* Have we passed the minimum? */ if (count < node->values[1]) goto backtrack; } node = node->next_1.node; text_pos = pos; goto advance; } else { /* We've backtracked the repeat as far as we can. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); } break; } case RE_OP_GROUP_CALL: /* Group call. */ TRACE(("%s\n", re_op_text[bt_data->op])) pop_group_return(state); discard_backtrack(state); break; case RE_OP_GROUP_RETURN: /* Group return. */ { RE_Node* return_node; TRACE(("%s\n", re_op_text[bt_data->op])) return_node = bt_data->group_call.node; push_group_return(safe_state, return_node); if (return_node) { /* Restore the groups. */ pop_groups(state); state->capture_change = bt_data->group_call.capture_change; /* Restore the repeats. */ pop_repeats(state); } discard_backtrack(state); break; } case RE_OP_LAZY_REPEAT_ONE: /* Lazy repeat for one character. */ { RE_RepeatData* rp_data; size_t count; Py_ssize_t step; Py_ssize_t pos; size_t available; size_t max_count; Py_ssize_t limit; RE_Node* repeated; RE_Node* test; BOOL match; BOOL m; size_t index; TRACE(("%s\n", re_op_text[bt_data->op])) node = bt_data->repeat.position.node; rp_data = &state->repeats[bt_data->repeat.index]; /* Match one character at a time until the tail could match or we * have reached the maximum. */ text_pos = rp_data->start; count = rp_data->count; step = node->step; pos = text_pos + (Py_ssize_t)count * step; available = step > 0 ? slice_end - text_pos : text_pos - slice_start; max_count = RE_MIN(node->values[2], available); limit = text_pos + (Py_ssize_t)max_count * step; repeated = node->nonstring.next_2.node; test = node->next_1.test; m = test->match; index = node->values[0]; match = FALSE; if (test->status & RE_STATUS_FUZZY) { for (;;) { RE_Position next_position; if (!match_one(state, repeated, pos)) break; pos += step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } } else { /* A repeated single-character match is often followed by a * literal, so checking specially for it can be a good * optimisation when working with long strings. */ switch (test->op) { case RE_OP_CHARACTER: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MIN(limit, slice_end - 1); for (;;) { if (pos >= limit) break; if (!match_one(state, repeated, pos)) break; ++pos; if ((char_at(text, pos) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_CHARACTER_IGN: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MIN(limit, slice_end - 1); for (;;) { if (pos >= limit) break; if (!match_one(state, repeated, pos)) break; ++pos; if (same_char_ign(encoding, char_at(text, pos), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_CHARACTER_IGN_REV: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MAX(limit, slice_start + 1); for (;;) { if (pos <= limit) break; if (!match_one(state, repeated, pos)) break; --pos; if (same_char_ign(encoding, char_at(text, pos - 1), ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_CHARACTER_REV: { Py_UCS4 ch; ch = test->values[0]; /* The tail is a character. We don't want to go off the end * of the slice. */ limit = RE_MAX(limit, slice_start + 1); for (;;) { if (pos <= limit) break; if (!match_one(state, repeated, pos)) break; --pos; if ((char_at(text, pos - 1) == ch) == m && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_end - length); for (;;) { Py_ssize_t found; if (pos >= limit) break; /* Look for the tail string. */ found = string_search(safe_state, test, pos + 1, limit + length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) ++pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_FLD: { /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_end); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos >= limit) break; /* Look for the tail string. */ found = string_search_fld(safe_state, test, pos + 1, limit, &new_pos); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) ++pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_FLD_REV: { /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_start); for (;;) { Py_ssize_t found; Py_ssize_t new_pos; if (pos <= limit) break; /* Look for the tail string. */ found = string_search_fld_rev(safe_state, test, pos - 1, limit, &new_pos); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) --pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_IGN: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MIN(limit, slice_end - length); for (;;) { Py_ssize_t found; if (pos >= limit) break; /* Look for the tail string. */ found = string_search_ign(safe_state, test, pos + 1, limit + length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) ++pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_IGN_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MAX(limit, slice_start + length); for (;;) { Py_ssize_t found; if (pos <= limit) break; /* Look for the tail string. */ found = string_search_ign_rev(safe_state, test, pos - 1, limit - length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) --pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } case RE_OP_STRING_REV: { Py_ssize_t length; length = test->value_count; /* The tail is a string. We don't want to go off the end of * the slice. */ limit = RE_MAX(limit, slice_start + length); for (;;) { Py_ssize_t found; if (pos <= limit) break; /* Look for the tail string. */ found = string_search_rev(safe_state, test, pos - 1, limit - length); if (found < 0) break; if (repeated->op == RE_OP_ANY_ALL) /* Anything can precede the tail. */ pos = found; else { /* Check that what precedes the tail will match. */ while (pos != found && match_one(state, repeated, pos)) --pos; if (pos != found) /* Something preceding the tail didn't match. */ break; } if (!is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } } break; } default: for (;;) { RE_Position next_position; if (!match_one(state, repeated, pos)) break; pos += step; if (try_match(state, &node->next_1, pos, &next_position) && !is_repeat_guarded(safe_state, index, pos, RE_STATUS_TAIL)) { match = TRUE; break; } if (pos == limit) break; } break; } } if (match) { /* The tail could match. */ count = abs_ssize_t(pos - text_pos); text_pos = pos; if (count < max_count) { /* The match is shorter than the maximum, so we might need * to backtrack the repeat again to consume more. */ rp_data->count = count; } else { /* We've reached or passed the maximum, so we won't need to * backtrack the repeat again. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); /* Have we passed the maximum? */ if (count > max_count) goto backtrack; } node = node->next_1.node; goto advance; } else { /* The tail couldn't match. */ rp_data->start = bt_data->repeat.text_pos; rp_data->count = bt_data->repeat.count; discard_backtrack(state); } break; } case RE_OP_LOOKAROUND: /* Lookaround. */ TRACE(("%s\n", re_op_text[bt_data->op])) /* Restore the groups and certain flags and then backtrack. */ pop_groups(state); state->too_few_errors = bt_data->lookaround.too_few_errors; state->capture_change = bt_data->lookaround.capture_change; discard_backtrack(state); break; case RE_OP_MATCH_BODY: { RE_RepeatData* rp_data; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* We want to match the body. */ rp_data = &state->repeats[bt_data->repeat.index]; /* Restore the repeat info. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; /* Record backtracking info in case the body fails to match. */ bt_data->op = RE_OP_BODY_START; /* Advance into the body. */ node = bt_data->repeat.position.node; text_pos = bt_data->repeat.position.text_pos; goto advance; } case RE_OP_MATCH_TAIL: { RE_RepeatData* rp_data; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->repeat.index)) /* We want to match the tail. */ rp_data = &state->repeats[bt_data->repeat.index]; /* Restore the repeat info. */ rp_data->count = bt_data->repeat.count; rp_data->start = bt_data->repeat.start; rp_data->capture_change = bt_data->repeat.capture_change; /* Advance into the tail. */ node = bt_data->repeat.position.node; text_pos = bt_data->repeat.position.text_pos; discard_backtrack(state); goto advance; } case RE_OP_REF_GROUP: /* Reference to a capture group. */ case RE_OP_REF_GROUP_IGN: /* Reference to a capture group, ignoring case. */ case RE_OP_REF_GROUP_IGN_REV: /* Reference to a capture group backwards, ignoring case. */ case RE_OP_REF_GROUP_REV: /* Reference to a capture group backwards. */ case RE_OP_STRING: /* A string literal. */ case RE_OP_STRING_IGN: /* A string literal, ignoring case. */ case RE_OP_STRING_IGN_REV: /* A string literal backwards, ignoring case. */ case RE_OP_STRING_REV: /* A string literal backwards. */ { BOOL matched; TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_string(safe_state, search, &text_pos, &node, &string_pos, &matched)) return RE_ERROR_BACKTRACKING; if (matched) goto advance; string_pos = -1; break; } case RE_OP_REF_GROUP_FLD: /* Reference to a capture group, ignoring case. */ case RE_OP_REF_GROUP_FLD_REV: /* Reference to a capture group backwards, ignoring case. */ { BOOL matched; TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_string_fld2(safe_state, search, &text_pos, &node, &folded_pos, &string_pos, &gfolded_pos, &matched)) return RE_ERROR_BACKTRACKING; if (matched) goto advance; string_pos = -1; break; } case RE_OP_START_GROUP: /* Start of a capture group. */ { RE_CODE private_index; RE_GroupData* group; TRACE(("%s %d\n", re_op_text[bt_data->op], bt_data->group.public_index)) private_index = bt_data->group.private_index; group = &state->groups[private_index - 1]; /* Unsave the capture? */ if (bt_data->group.capture) unsave_capture(state, bt_data->group.private_index, bt_data->group.public_index); if (pattern->group_info[private_index - 1].referenced && group->span.start != bt_data->group.text_pos) --state->capture_change; group->span.start = bt_data->group.text_pos; group->current_capture = bt_data->group.current_capture; discard_backtrack(state); break; } case RE_OP_STRING_FLD: /* A string literal, ignoring case. */ case RE_OP_STRING_FLD_REV: /* A string literal backwards, ignoring case. */ { BOOL matched; TRACE(("%s\n", re_op_text[bt_data->op])) if (!retry_fuzzy_match_string_fld(safe_state, search, &text_pos, &node, &string_pos, &folded_pos, &matched)) return RE_ERROR_BACKTRACKING; if (matched) goto advance; string_pos = -1; break; } default: TRACE(("UNKNOWN OP %d\n", bt_data->op)) return RE_ERROR_ILLEGAL; } } } /* Saves group data for fuzzy matching. */ Py_LOCAL_INLINE(RE_GroupData*) save_groups(RE_SafeState* safe_state, RE_GroupData* saved_groups) { RE_State* state; PatternObject* pattern; Py_ssize_t g; /* Re-acquire the GIL. */ acquire_GIL(safe_state); state = safe_state->re_state; pattern = state->pattern; if (!saved_groups) { saved_groups = (RE_GroupData*)re_alloc(pattern->true_group_count * sizeof(RE_GroupData)); if (!saved_groups) goto error; memset(saved_groups, 0, pattern->true_group_count * sizeof(RE_GroupData)); } for (g = 0; g < pattern->true_group_count; g++) { RE_GroupData* orig; RE_GroupData* copy; orig = &state->groups[g]; copy = &saved_groups[g]; copy->span = orig->span; if (orig->capture_count > copy->capture_capacity) { RE_GroupSpan* cap_copy; cap_copy = (RE_GroupSpan*)re_realloc(copy->captures, orig->capture_count * sizeof(RE_GroupSpan)); if (!cap_copy) goto error; copy->capture_capacity = orig->capture_count; copy->captures = cap_copy; } copy->capture_count = orig->capture_count; Py_MEMCPY(copy->captures, orig->captures, orig->capture_count * sizeof(RE_GroupSpan)); } /* Release the GIL. */ release_GIL(safe_state); return saved_groups; error: if (saved_groups) { for (g = 0; g < pattern->true_group_count; g++) re_dealloc(saved_groups[g].captures); re_dealloc(saved_groups); } /* Release the GIL. */ release_GIL(safe_state); return NULL; } /* Restores group data for fuzzy matching. */ Py_LOCAL_INLINE(void) restore_groups(RE_SafeState* safe_state, RE_GroupData* saved_groups) { RE_State* state; PatternObject* pattern; Py_ssize_t g; /* Re-acquire the GIL. */ acquire_GIL(safe_state); state = safe_state->re_state; pattern = state->pattern; for (g = 0; g < pattern->true_group_count; g++) re_dealloc(state->groups[g].captures); Py_MEMCPY(state->groups, saved_groups, pattern->true_group_count * sizeof(RE_GroupData)); re_dealloc(saved_groups); /* Release the GIL. */ release_GIL(safe_state); } /* Discards group data for fuzzy matching. */ Py_LOCAL_INLINE(void) discard_groups(RE_SafeState* safe_state, RE_GroupData* saved_groups) { RE_State* state; PatternObject* pattern; Py_ssize_t g; /* Re-acquire the GIL. */ acquire_GIL(safe_state); state = safe_state->re_state; pattern = state->pattern; for (g = 0; g < pattern->true_group_count; g++) re_dealloc(saved_groups[g].captures); re_dealloc(saved_groups); /* Release the GIL. */ release_GIL(safe_state); } /* Performs a match or search from the current text position. * * The state can sometimes be shared across threads. In such instances there's * a lock (mutex) on it. The lock is held for the duration of matching. */ Py_LOCAL_INLINE(int) do_match(RE_SafeState* safe_state, BOOL search) { RE_State* state; PatternObject* pattern; size_t available; BOOL get_best; BOOL enhance_match; BOOL must_advance; RE_GroupData* best_groups; Py_ssize_t best_match_pos; Py_ssize_t best_text_pos = 0; /* Initialise to stop compiler warning. */ int status; Py_ssize_t slice_start; Py_ssize_t slice_end; TRACE(("<>\n")) state = safe_state->re_state; pattern = state->pattern; /* Release the GIL. */ release_GIL(safe_state); /* Is there enough to search? */ if (state->reverse) { if (state->text_pos < state->slice_start) { acquire_GIL(safe_state); return FALSE; } available = state->text_pos - state->slice_start; } else { if (state->text_pos > state->slice_end) { acquire_GIL(safe_state); return FALSE; } available = state->slice_end - state->text_pos; } get_best = (pattern->flags & RE_FLAG_BESTMATCH) != 0; enhance_match = (pattern->flags & RE_FLAG_ENHANCEMATCH) != 0 && !get_best; /* The maximum permitted cost. */ state->max_cost = pattern->is_fuzzy ? RE_UNLIMITED : 0; best_groups = NULL; best_match_pos = state->text_pos; must_advance = state->must_advance; slice_start = state->slice_start; slice_end = state->slice_end; for (;;) { /* If there's a better match, it won't start earlier in the string than * the current best match, so there's no need to start earlier than * that match. */ state->text_pos = best_match_pos; state->must_advance = must_advance; /* Initialise the state. */ init_match(state); status = RE_ERROR_SUCCESS; if (state->max_cost == 0) { /* An exact match. */ if (available < state->min_width || (available == 0 && state->must_advance)) status = RE_ERROR_FAILURE; } if (status == RE_ERROR_SUCCESS) status = basic_match(safe_state, state->pattern->start_node, search, FALSE); /* Has an error occurred? */ if (status < 0) break; if (status == RE_ERROR_FAILURE || (status == RE_ERROR_SUCCESS && state->total_cost == 0)) break; if (!get_best && !enhance_match) break; if (!get_best && state->text_pos == state->match_pos) /* We want the first match. The match is already zero-width, so the * cost can't get any lower (because the fit can't get any better). */ break; if (best_groups) { BOOL same; Py_ssize_t g; /* Did we get the same match as the best so far? */ same = state->match_pos == best_match_pos && state->text_pos == best_text_pos; for (g = 0; same && g < pattern->public_group_count; g++) { same = state->groups[g].span.start == best_groups[g].span.start && state->groups[g].span.end == best_groups[g].span.end; } if (same) break; } /* Save the best result so far. */ best_groups = save_groups(safe_state, best_groups); if (!best_groups) { status = RE_ERROR_MEMORY; break; } best_match_pos = state->match_pos; best_text_pos = state->text_pos; if (state->max_cost == 0) break; /* Reduce the maximum permitted cost and try again. */ state->max_cost = state->total_cost - 1; if (enhance_match) { if (state->reverse) { state->slice_start = state->text_pos; state->slice_end = state->match_pos; } else { state->slice_start = state->match_pos; state->slice_end = state->text_pos; } } } state->slice_start = slice_start; state->slice_end = slice_end; if (best_groups) { if (status == RE_ERROR_SUCCESS && state->total_cost == 0) /* We have a perfect match, so the previous best match. */ discard_groups(safe_state, best_groups); else { /* Restore the previous best match. */ status = RE_ERROR_SUCCESS; state->match_pos = best_match_pos; state->text_pos = best_text_pos; restore_groups(safe_state, best_groups); } } if (status == RE_ERROR_SUCCESS) { Py_ssize_t max_end_index; PatternObject* pattern; RE_GroupInfo* group_info; Py_ssize_t g; /* Store the results. */ state->lastindex = -1; state->lastgroup = -1; max_end_index = -1; /* Store the capture groups. */ pattern = state->pattern; group_info = pattern->group_info; for (g = 0; g < pattern->public_group_count; g++) { RE_GroupSpan* span; span = &state->groups[g].span; /* The string positions are of type Py_ssize_t, so the format needs * to specify that. */ TRACE(("group %d from %" PY_FORMAT_SIZE_T "d to %" PY_FORMAT_SIZE_T "d\n", g + 1, span->start, span->end)) if (span->start >= 0 && span->end >= 0 && group_info[g].end_index > max_end_index) { max_end_index = group_info[g].end_index; state->lastindex = g + 1; if (group_info[g].has_name) state->lastgroup = g + 1; } } } /* Re-acquire the GIL. */ acquire_GIL(safe_state); if (status < 0 && !PyErr_Occurred()) set_error(status, NULL); return status; } /* Gets a string from a Python object. * * If the function returns true and str_info->should_release is true then it's * the responsibility of the caller to release the buffer when it's no longer * needed. */ Py_LOCAL_INLINE(BOOL) get_string(PyObject* string, RE_StringInfo* str_info) { /* Given a Python object, return a data pointer, a length (in characters), * and a character size. Return FALSE if the object is not a string (or not * compatible). */ PyBufferProcs* buffer; Py_ssize_t bytes; Py_ssize_t size; /* Unicode objects do not support the buffer API. So, get the data directly * instead. */ if (PyUnicode_Check(string)) { /* Unicode strings doesn't always support the buffer interface. */ #if PY_VERSION_HEX >= 0x03030000 if (PyUnicode_READY(string) == -1) return FALSE; str_info->characters = (void*)PyUnicode_DATA(string); str_info->length = PyUnicode_GET_LENGTH(string); str_info->charsize = PyUnicode_KIND(string); #else str_info->characters = (void*)PyUnicode_AS_DATA(string); str_info->length = PyUnicode_GET_SIZE(string); str_info->charsize = sizeof(Py_UNICODE); #endif str_info->is_unicode = TRUE; str_info->should_release = FALSE; return TRUE; } /* Get pointer to string buffer. */ buffer = Py_TYPE(string)->tp_as_buffer; str_info->view.len = -1; if (!buffer) { PyErr_SetString(PyExc_TypeError, "expected string or buffer"); return FALSE; } if (!buffer->bf_getbuffer || (*buffer->bf_getbuffer)(string, &str_info->view, PyBUF_SIMPLE) < 0) { PyErr_SetString(PyExc_TypeError, "expected string or buffer"); return FALSE; } str_info->should_release = TRUE; /* Determine buffer size. */ bytes = str_info->view.len; str_info->characters = str_info->view.buf; if (str_info->characters == NULL) { PyBuffer_Release(&str_info->view); PyErr_SetString(PyExc_ValueError, "buffer is NULL"); return FALSE; } if (bytes < 0) { PyBuffer_Release(&str_info->view); PyErr_SetString(PyExc_TypeError, "buffer has negative size"); return FALSE; } /* Determine character size. */ size = PyObject_Size(string); if (PyBytes_Check(string) || bytes == size) str_info->charsize = 1; else { PyBuffer_Release(&str_info->view); PyErr_SetString(PyExc_TypeError, "buffer size mismatch"); return FALSE; } str_info->length = size; str_info->is_unicode = FALSE; return TRUE; } /* Deallocates the groups storage. */ Py_LOCAL_INLINE(void) dealloc_groups(RE_GroupData* groups, size_t group_count) { size_t g; if (!groups) return; for (g = 0; g < group_count; g++) re_dealloc(groups[g].captures); re_dealloc(groups); } /* Initialises a state object. */ Py_LOCAL_INLINE(BOOL) state_init_2(RE_State* state, PatternObject* pattern, PyObject* string, RE_StringInfo* str_info, Py_ssize_t start, Py_ssize_t end, BOOL overlapped, int concurrent, BOOL use_lock, BOOL visible_captures, BOOL match_all) { Py_ssize_t final_pos; int i; state->groups = NULL; state->repeats = NULL; state->visible_captures = visible_captures; state->match_all = match_all; state->backtrack_block.previous = NULL; state->backtrack_block.next = NULL; state->backtrack_block.capacity = RE_BACKTRACK_BLOCK_SIZE; state->backtrack_allocated = RE_BACKTRACK_BLOCK_SIZE; state->first_saved_groups = NULL; state->current_saved_groups = NULL; state->first_saved_repeats = NULL; state->current_saved_repeats = NULL; state->lock = NULL; state->fuzzy_guards = NULL; state->first_group_call_frame = NULL; state->current_group_call_frame = NULL; state->group_call_guard_list = NULL; state->req_pos = -1; /* The call guards used by recursive patterns. */ if (pattern->call_ref_info_count > 0) { state->group_call_guard_list = (RE_GuardList*)re_alloc(pattern->call_ref_info_count * sizeof(RE_GuardList)); if (!state->group_call_guard_list) goto error; memset(state->group_call_guard_list, 0, pattern->call_ref_info_count * sizeof(RE_GuardList)); } /* The capture groups. */ if (pattern->true_group_count) { Py_ssize_t g; if (pattern->groups_storage) { state->groups = pattern->groups_storage; pattern->groups_storage = NULL; } else { state->groups = (RE_GroupData*)re_alloc(pattern->true_group_count * sizeof(RE_GroupData)); if (!state->groups) goto error; memset(state->groups, 0, pattern->true_group_count * sizeof(RE_GroupData)); for (g = 0; g < pattern->true_group_count; g++) { RE_GroupSpan* captures; captures = (RE_GroupSpan*)re_alloc(sizeof(RE_GroupSpan)); if (!captures) { Py_ssize_t i; for (i = 0; i < g; i++) re_dealloc(state->groups[i].captures); goto error; } state->groups[g].captures = captures; state->groups[g].capture_capacity = 1; } } } /* Adjust boundaries. */ if (start < 0) start += str_info->length; if (start < 0) start = 0; else if (start > str_info->length) start = str_info->length; if (end < 0) end += str_info->length; if (end < 0) end = 0; else if (end > str_info->length) end = str_info->length; state->overlapped = overlapped; state->min_width = pattern->min_width; /* Initialise the getters and setters for the character size. */ state->charsize = str_info->charsize; state->is_unicode = str_info->is_unicode; /* Are we using a buffer object? If so, we need to copy the info. */ state->should_release = str_info->should_release; if (state->should_release) state->view = str_info->view; switch (state->charsize) { case 1: state->char_at = bytes1_char_at; state->set_char_at = bytes1_set_char_at; state->point_to = bytes1_point_to; break; case 2: state->char_at = bytes2_char_at; state->set_char_at = bytes2_set_char_at; state->point_to = bytes2_point_to; break; case 4: state->char_at = bytes4_char_at; state->set_char_at = bytes4_set_char_at; state->point_to = bytes4_point_to; break; default: goto error; } state->encoding = pattern->encoding; /* The state object contains a reference to the string and also a pointer * to its contents. * * The documentation says that the end of the slice behaves like the end of * the string. */ state->text = str_info->characters; state->text_length = end; state->reverse = (pattern->flags & RE_FLAG_REVERSE) != 0; state->slice_start = start; state->slice_end = state->text_length; state->text_pos = state->reverse ? state->slice_end : state->slice_start; /* Point to the final newline and line separator if it's at the end of the * string, otherwise just -1. */ state->final_newline = -1; state->final_line_sep = -1; final_pos = state->text_length - 1; if (final_pos >= 0) { Py_UCS4 ch; ch = state->char_at(state->text, final_pos); if (ch == 0x0A) { /* The string ends with LF. */ state->final_newline = final_pos; state->final_line_sep = final_pos; /* Does the string end with CR/LF? */ --final_pos; if (final_pos >= 0 && state->char_at(state->text, final_pos) == 0x0D) state->final_line_sep = final_pos; } else { /* The string doesn't end with LF, but it could be another kind of * line separator. */ if (state->encoding->is_line_sep(ch)) state->final_line_sep = final_pos; } } /* If the 'new' behaviour is enabled then split correctly on zero-width * matches. */ state->version_0 = (pattern->flags & RE_FLAG_VERSION1) == 0; state->must_advance = FALSE; state->pattern = pattern; state->string = string; if (pattern->repeat_count) { if (pattern->repeats_storage) { state->repeats = pattern->repeats_storage; pattern->repeats_storage = NULL; } else { state->repeats = (RE_RepeatData*)re_alloc(pattern->repeat_count * sizeof(RE_RepeatData)); if (!state->repeats) goto error; memset(state->repeats, 0, pattern->repeat_count * sizeof(RE_RepeatData)); } } if (pattern->fuzzy_count) { state->fuzzy_guards = (RE_FuzzyGuards*)re_alloc(pattern->fuzzy_count * sizeof(RE_FuzzyGuards)); if (!state->fuzzy_guards) goto error; memset(state->fuzzy_guards, 0, pattern->fuzzy_count * sizeof(RE_FuzzyGuards)); } Py_INCREF(state->pattern); Py_INCREF(state->string); /* Multithreading is allowed during matching when explicitly enabled or on * immutable strings. */ switch (concurrent) { case RE_CONC_NO: state->is_multithreaded = FALSE; break; case RE_CONC_YES: state->is_multithreaded = TRUE; break; default: state->is_multithreaded = PyUnicode_Check(string) || PyBytes_Check(string); break; } /* A state struct can sometimes be shared across threads. In such * instances, if multithreading is enabled we need to protect the state * with a lock (mutex) during matching. */ if (state->is_multithreaded && use_lock) state->lock = PyThread_allocate_lock(); for (i = 0; i < MAX_SEARCH_POSITIONS; i++) state->search_positions[i].start_pos = -1; return TRUE; error: re_dealloc(state->group_call_guard_list); re_dealloc(state->repeats); dealloc_groups(state->groups, pattern->true_group_count); re_dealloc(state->fuzzy_guards); state->repeats = NULL; state->groups = NULL; state->fuzzy_guards = NULL; return FALSE; } /* Checks that the string has the same charsize as the pattern. */ Py_LOCAL_INLINE(BOOL) check_compatible(PatternObject* pattern, BOOL unicode) { if (PyBytes_Check(pattern->pattern)) { if (unicode) { PyErr_SetString(PyExc_TypeError, "can't use a bytes pattern on a string-like object"); return FALSE; } } else { if (!unicode) { PyErr_SetString(PyExc_TypeError, "can't use a string pattern on a bytes-like object"); return FALSE; } } return TRUE; } /* Releases the string's buffer, if necessary. */ Py_LOCAL_INLINE(void) release_buffer(RE_StringInfo* str_info) { if (str_info->should_release) PyBuffer_Release(&str_info->view); } /* Initialises a state object. */ Py_LOCAL_INLINE(BOOL) state_init(RE_State* state, PatternObject* pattern, PyObject* string, Py_ssize_t start, Py_ssize_t end, BOOL overlapped, int concurrent, BOOL use_lock, BOOL visible_captures, BOOL match_all) { RE_StringInfo str_info; /* Get the string to search or match. */ if (!get_string(string, &str_info)) return FALSE; /* If we fail to initialise the state then we need to release the buffer if * the string is a buffer object. */ if (!check_compatible(pattern, str_info.is_unicode)) { release_buffer(&str_info); return FALSE; } if (!state_init_2(state, pattern, string, &str_info, start, end, overlapped, concurrent, use_lock, visible_captures, match_all)) { release_buffer(&str_info); return FALSE; } /* The state has been initialised successfully, so now the state has the * responsibility of releasing the buffer if the string is a buffer object. */ return TRUE; } /* Deallocates repeat data. */ Py_LOCAL_INLINE(void) dealloc_repeats(RE_RepeatData* repeats, Py_ssize_t repeat_count) { Py_ssize_t i; if (!repeats) return; for (i = 0; i < repeat_count; i++) { re_dealloc(repeats[i].body_guard_list.spans); re_dealloc(repeats[i].tail_guard_list.spans); } re_dealloc(repeats); } /* Deallocates fuzzy guards. */ Py_LOCAL_INLINE(void) dealloc_fuzzy_guards(RE_FuzzyGuards* guards, Py_ssize_t fuzzy_count) { Py_ssize_t i; if (!guards) return; for (i = 0; i < fuzzy_count; i++) { re_dealloc(guards[i].body_guard_list.spans); re_dealloc(guards[i].tail_guard_list.spans); } re_dealloc(guards); } /* Finalises a state object, discarding its contents. */ Py_LOCAL_INLINE(void) state_fini(RE_State* state) { RE_BacktrackBlock* current; PatternObject* pattern; RE_SavedGroups* saved_groups; RE_SavedRepeats* saved_repeats; RE_GroupCallFrame* frame; Py_ssize_t i; /* Discard the lock (mutex) if there's one. */ if (state->lock) PyThread_free_lock(state->lock); /* Deallocate the backtrack blocks. */ current = state->backtrack_block.next; while (current) { RE_BacktrackBlock* next; next = current->next; re_dealloc(current); state->backtrack_allocated -= RE_BACKTRACK_BLOCK_SIZE; current = next; } pattern = state->pattern; saved_groups = state->first_saved_groups; while (saved_groups) { RE_SavedGroups* next; next = saved_groups->next; re_dealloc(saved_groups->spans); re_dealloc(saved_groups->counts); re_dealloc(saved_groups); saved_groups = next; } saved_repeats = state->first_saved_repeats; while (saved_repeats) { RE_SavedRepeats* next; next = saved_repeats->next; dealloc_repeats(saved_repeats->repeats, pattern->repeat_count); re_dealloc(saved_repeats); saved_repeats = next; } if (pattern->groups_storage) dealloc_groups(state->groups, pattern->true_group_count); else pattern->groups_storage = state->groups; if (pattern->repeats_storage) dealloc_repeats(state->repeats, pattern->repeat_count); else pattern->repeats_storage = state->repeats; frame = state->first_group_call_frame; while (frame) { RE_GroupCallFrame* next; next = frame->next; dealloc_groups(frame->groups, pattern->true_group_count); dealloc_repeats(frame->repeats, pattern->repeat_count); re_dealloc(frame); frame = next; } for (i = 0; i < pattern->call_ref_info_count; i++) re_dealloc(state->group_call_guard_list[i].spans); if (state->group_call_guard_list) re_dealloc(state->group_call_guard_list); if (state->fuzzy_guards) dealloc_fuzzy_guards(state->fuzzy_guards, pattern->fuzzy_count); Py_DECREF(state->pattern); Py_DECREF(state->string); if (state->should_release) PyBuffer_Release(&state->view); } /* Converts a string index to an integer. * * If the index is None then the default will be returned. */ Py_LOCAL_INLINE(Py_ssize_t) as_string_index(PyObject* obj, Py_ssize_t def) { Py_ssize_t value; if (obj == Py_None) return def; value = PyLong_AsLong(obj); if (value != -1 || !PyErr_Occurred()) return value; set_error(RE_ERROR_INDEX, NULL); return 0; } /* Deallocates a MatchObject. */ static void match_dealloc(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; Py_XDECREF(self->string); Py_XDECREF(self->substring); Py_DECREF(self->pattern); if (self->groups) re_dealloc(self->groups); Py_XDECREF(self->regs); PyObject_DEL(self); } #if PY_VERSION_HEX >= 0x03040000 /* Ensures that the string is the immutable Unicode string or bytestring. */ Py_LOCAL_INLINE(PyObject*) ensure_immutable(PyObject* string) { if (PyUnicode_CheckExact(string) || PyBytes_CheckExact(string)) { Py_INCREF(string); return string; } if (PyUnicode_Check(string)) return PyUnicode_FromObject(string); return PyBytes_FromObject(string); } /* Gets a slice from a string, returning either a Unicode string or a * bytestring. */ Py_LOCAL_INLINE(PyObject*) get_slice(PyObject* string, Py_ssize_t start, Py_ssize_t end) { return ensure_immutable(PySequence_GetSlice(string, start, end)); } #else /* Gets a slice from a string. */ Py_LOCAL_INLINE(PyObject*) get_slice(PyObject* string, Py_ssize_t start, Py_ssize_t end) { return PySequence_GetSlice(string, start, end); } #endif /* Gets a MatchObject's group by integer index. */ Py_LOCAL_INLINE(PyObject*) match_get_group_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; if (span->start < 0 || span->end < 0) { /* Return default value if the string or group is undefined. */ Py_INCREF(def); return def; } return get_slice(self->substring, span->start - self->substring_offset, span->end - self->substring_offset); } /* Gets a MatchObject's start by integer index. */ static PyObject* match_get_start_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return Py_BuildValue("n", self->match_start); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; return Py_BuildValue("n", span->start); } /* Gets a MatchObject's starts by integer index. */ static PyObject* match_get_starts_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* item; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; item = Py_BuildValue("n", self->match_start); if (!item) goto error; PyList_SET_ITEM(result, 0, item); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { item = Py_BuildValue("n", group->captures[i].start); if (!item) goto error; PyList_SET_ITEM(result, i, item); } return result; error: Py_DECREF(result); return NULL; } /* Gets a MatchObject's end by integer index. */ static PyObject* match_get_end_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return Py_BuildValue("n", self->match_end); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; return Py_BuildValue("n", span->end); } /* Gets a MatchObject's ends by integer index. */ static PyObject* match_get_ends_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* item; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; item = Py_BuildValue("n", self->match_end); if (!item) goto error; PyList_SET_ITEM(result, 0, item); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { item = Py_BuildValue("n", group->captures[i].end); if (!item) goto error; PyList_SET_ITEM(result, i, item); } return result; error: Py_DECREF(result); return NULL; } /* Gets a MatchObject's span by integer index. */ static PyObject* match_get_span_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupSpan* span; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) return Py_BuildValue("nn", self->match_start, self->match_end); /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ span = &self->groups[index - 1].span; return Py_BuildValue("nn", span->start, span->end); } /* Gets a MatchObject's spans by integer index. */ static PyObject* match_get_spans_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* item; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; item = Py_BuildValue("nn", self->match_start, self->match_end); if (!item) goto error; PyList_SET_ITEM(result, 0, item); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { item = Py_BuildValue("nn", group->captures[i].start, group->captures[i].end); if (!item) goto error; PyList_SET_ITEM(result, i, item); } return result; error: Py_DECREF(result); return NULL; } /* Gets a MatchObject's captures by integer index. */ static PyObject* match_get_captures_by_index(MatchObject* self, Py_ssize_t index) { RE_GroupData* group; PyObject* result; PyObject* slice; size_t i; if (index < 0 || index > (Py_ssize_t)self->group_count) { /* Raise error if we were given a bad group number. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } if (index == 0) { result = PyList_New(1); if (!result) return NULL; slice = get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); if (!slice) goto error; PyList_SET_ITEM(result, 0, slice); return result; } /* Capture group indexes are 1-based (excluding group 0, which is the * entire matched string). */ group = &self->groups[index - 1]; result = PyList_New(group->capture_count); if (!result) return NULL; for (i = 0; i < group->capture_count; i++) { slice = get_slice(self->substring, group->captures[i].start - self->substring_offset, group->captures[i].end - self->substring_offset); if (!slice) goto error; PyList_SET_ITEM(result, i, slice); } return result; error: Py_DECREF(result); return NULL; } /* Converts a group index to an integer. */ Py_LOCAL_INLINE(Py_ssize_t) as_group_index(PyObject* obj) { Py_ssize_t value; value = PyLong_AsLong(obj); if (value != -1 || !PyErr_Occurred()) return value; set_error(RE_ERROR_INDEX, NULL); return -1; } /* Gets a MatchObject's group index. * * The supplied index can be an integer or a string (group name) object. */ Py_LOCAL_INLINE(Py_ssize_t) match_get_group_index(MatchObject* self, PyObject* index, BOOL allow_neg) { Py_ssize_t group; /* Is the index an integer? */ group = as_group_index(index); if (group != -1 || !PyErr_Occurred()) { Py_ssize_t min_group = 0; /* Adjust negative indices where valid and allowed. */ if (group < 0 && allow_neg) { group += (Py_ssize_t)self->group_count + 1; min_group = 1; } if (min_group <= group && group <= (Py_ssize_t)self->group_count) return group; return -1; } /* The index might be a group name. */ if (self->pattern->groupindex) { /* Look up the name. */ PyErr_Clear(); index = PyObject_GetItem(self->pattern->groupindex, index); if (index) { /* Check that we have an integer. */ group = as_group_index(index); Py_DECREF(index); if (group != -1 || !PyErr_Occurred()) return group; } } PyErr_Clear(); return -1; } /* Gets a MatchObject's group by object index. */ Py_LOCAL_INLINE(PyObject*) match_get_group(MatchObject* self, PyObject* index, PyObject* def, BOOL allow_neg) { /* Check that the index is an integer or a string. */ if (PyLong_Check(index) || PyUnicode_Check(index) || PyBytes_Check(index)) return match_get_group_by_index(self, match_get_group_index(self, index, allow_neg), def); set_error(RE_ERROR_GROUP_INDEX_TYPE, index); return NULL; } /* Gets info from a MatchObject by object index. */ static PyObject* get_by_arg(MatchObject* self, PyObject* index, RE_GetByIndexFunc get_by_index) { /* Check that the index is an integer or a string. */ if (PyLong_Check(index) || PyUnicode_Check(index) || PyBytes_Check(index)) return get_by_index(self, match_get_group_index(self, index, FALSE)); set_error(RE_ERROR_GROUP_INDEX_TYPE, index); return NULL; } /* MatchObject's 'group' method. */ static PyObject* match_group(MatchObject* self, PyObject* args) { Py_ssize_t size; PyObject* result; Py_ssize_t i; size = PyTuple_GET_SIZE(args); switch (size) { case 0: /* group() */ result = match_get_group_by_index(self, 0, Py_None); break; case 1: /* group(x) */ result = match_get_group(self, PyTuple_GET_ITEM(args, 0), Py_None, FALSE); break; default: /* group(x, y, z, ...) */ /* Fetch multiple items. */ result = PyTuple_New(size); if (!result) return NULL; for (i = 0; i < size; i++) { PyObject* item = match_get_group(self, PyTuple_GET_ITEM(args, i), Py_None, FALSE); if (!item) { Py_DECREF(result); return NULL; } PyTuple_SET_ITEM(result, i, item); } break; } return result; } /* Generic method for getting info from a MatchObject. */ static PyObject* get_from_match(MatchObject* self, PyObject* args, RE_GetByIndexFunc get_by_index) { Py_ssize_t size; PyObject* result; Py_ssize_t i; size = PyTuple_GET_SIZE(args); switch (size) { case 0: /* get() */ result = get_by_index(self, 0); break; case 1: /* get(x) */ result = get_by_arg(self, PyTuple_GET_ITEM(args, 0), get_by_index); break; default: /* get(x, y, z, ...) */ /* Fetch multiple items. */ result = PyTuple_New(size); if (!result) return NULL; for (i = 0; i < size; i++) { PyObject* item = get_by_arg(self, PyTuple_GET_ITEM(args, i), get_by_index); if (!item) { Py_DECREF(result); return NULL; } PyTuple_SET_ITEM(result, i, item); } break; } return result; } /* MatchObject's 'start' method. */ static PyObject* match_start(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_start_by_index); } /* MatchObject's 'starts' method. */ static PyObject* match_starts(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_starts_by_index); } /* MatchObject's 'end' method. */ static PyObject* match_end(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_end_by_index); } /* MatchObject's 'ends' method. */ static PyObject* match_ends(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_ends_by_index); } /* MatchObject's 'span' method. */ static PyObject* match_span(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_span_by_index); } /* MatchObject's 'spans' method. */ static PyObject* match_spans(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_spans_by_index); } /* MatchObject's 'captures' method. */ static PyObject* match_captures(MatchObject* self, PyObject* args) { return get_from_match(self, args, match_get_captures_by_index); } /* MatchObject's 'groups' method. */ static PyObject* match_groups(MatchObject* self, PyObject* args, PyObject* kwargs) { PyObject* result; Py_ssize_t g; PyObject* def = Py_None; static char* kwlist[] = { "default", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:groups", kwlist, &def)) return NULL; result = PyTuple_New(self->group_count); if (!result) return NULL; /* Group 0 is the entire matched portion of the string. */ for (g = 0; g < self->group_count; g++) { PyObject* item; item = match_get_group_by_index(self, g + 1, def); if (!item) { Py_DECREF(result); return NULL; } PyTuple_SET_ITEM(result, g, item); } return result; } /* MatchObject's 'groupdict' method. */ static PyObject* match_groupdict(MatchObject* self, PyObject* args, PyObject* kwargs) { PyObject* result; PyObject* keys; Py_ssize_t g; PyObject* def = Py_None; static char* kwlist[] = { "default", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:groupdict", kwlist, &def)) return NULL; result = PyDict_New(); if (!result || !self->pattern->groupindex) return result; keys = PyMapping_Keys(self->pattern->groupindex); if (!keys) goto failed; for (g = 0; g < PyList_GET_SIZE(keys); g++) { PyObject* key; PyObject* value; int status; key = PyList_GET_ITEM(keys, g); if (!key) goto failed; value = match_get_group(self, key, def, FALSE); if (!value) { Py_DECREF(key); goto failed; } status = PyDict_SetItem(result, key, value); Py_DECREF(value); if (status < 0) goto failed; } Py_DECREF(keys); return result; failed: Py_XDECREF(keys); Py_DECREF(result); return NULL; } /* MatchObject's 'capturesdict' method. */ static PyObject* match_capturesdict(MatchObject* self) { PyObject* result; PyObject* keys; Py_ssize_t g; result = PyDict_New(); if (!result || !self->pattern->groupindex) return result; keys = PyMapping_Keys(self->pattern->groupindex); if (!keys) goto failed; for (g = 0; g < PyList_GET_SIZE(keys); g++) { PyObject* key; Py_ssize_t group; PyObject* captures; int status; key = PyList_GET_ITEM(keys, g); if (!key) goto failed; group = match_get_group_index(self, key, FALSE); if (group < 0) { Py_DECREF(key); goto failed; } captures = match_get_captures_by_index(self, group); if (!captures) { Py_DECREF(key); goto failed; } status = PyDict_SetItem(result, key, captures); Py_DECREF(captures); if (status < 0) goto failed; } Py_DECREF(keys); return result; failed: Py_XDECREF(keys); Py_DECREF(result); return NULL; } /* Gets a Python object by name from a named module. */ Py_LOCAL_INLINE(PyObject*) get_object(char* module_name, char* object_name) { PyObject* module; PyObject* object; module = PyImport_ImportModule(module_name); if (!module) return NULL; object = PyObject_GetAttrString(module, object_name); Py_DECREF(module); return object; } /* Calls a function in a module. */ Py_LOCAL_INLINE(PyObject*) call(char* module_name, char* function_name, PyObject* args) { PyObject* function; PyObject* result; if (!args) return NULL; function = get_object(module_name, function_name); if (!function) return NULL; result = PyObject_CallObject(function, args); Py_DECREF(function); Py_DECREF(args); return result; } /* Gets a replacement item from the replacement list. * * The replacement item could be a string literal or a group. */ Py_LOCAL_INLINE(PyObject*) get_match_replacement(MatchObject* self, PyObject* item, Py_ssize_t group_count) { Py_ssize_t index; #if PY_VERSION_HEX >= 0x03040000 if (PyUnicode_Check(item) || PyBytes_Check(item)) { /* It's a literal, which can be added directly to the list. */ return ensure_immutable(item); } #else if (PyUnicode_Check(item) || PyBytes_Check(item)) { /* It's a literal, which can be added directly to the list. */ Py_INCREF(item); return item; } #endif /* Is it a group reference? */ index = as_group_index(item); if (index == -1 && PyErr_Occurred()) { /* Not a group either! */ set_error(RE_ERROR_REPLACEMENT, NULL); return NULL; } if (index == 0) { /* The entire matched portion of the string. */ return get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); } else if (index >= 1 && index <= group_count) { /* A group. If it didn't match then return None instead. */ RE_GroupData* group; group = &self->groups[index - 1]; if (group->capture_count > 0) return get_slice(self->substring, group->span.start - self->substring_offset, group->span.end - self->substring_offset); else { Py_INCREF(Py_None); return Py_None; } } else { /* No such group. */ set_error(RE_ERROR_NO_SUCH_GROUP, NULL); return NULL; } } /* Adds an item to be joined. */ Py_LOCAL_INLINE(int) add_item(JoinInfo* join_info, PyObject* item) { PyObject* new_item; int status; if (join_info->is_unicode) { #if PY_VERSION_HEX >= 0x03040000 if (PyUnicode_CheckExact(item)) { #else if (PyUnicode_Check(item)) { #endif new_item = item; Py_INCREF(new_item); } else { new_item = PyUnicode_FromObject(item); if (!new_item) { set_error(RE_ERROR_NOT_UNICODE, item); return RE_ERROR_NOT_UNICODE; } } } else { #if PY_VERSION_HEX >= 0x03040000 if (PyBytes_CheckExact(item)) { #else if (PyBytes_Check(item)) { #endif new_item = item; Py_INCREF(new_item); } else { new_item = PyBytes_FromObject(item); if (!new_item) { set_error(RE_ERROR_NOT_BYTES, item); return RE_ERROR_NOT_BYTES; } } } /* If the list already exists then just add the item to it. */ if (join_info->list) { status = PyList_Append(join_info->list, new_item); if (status < 0) goto error; Py_DECREF(new_item); return status; } /* If we already have an item then we now have 2(!) and we need to put them * into a list. */ if (join_info->item) { join_info->list = PyList_New(2); if (!join_info->list) { status = RE_ERROR_MEMORY; goto error; } PyList_SET_ITEM(join_info->list, 0, join_info->item); join_info->item = NULL; PyList_SET_ITEM(join_info->list, 1, new_item); return 0; } /* This is the first item. */ join_info->item = new_item; return 0; error: Py_DECREF(new_item); Py_XDECREF(join_info->list); Py_XDECREF(join_info->item); set_error(status, NULL); return status; } /* Joins together a list of strings for pattern_subx. */ Py_LOCAL_INLINE(PyObject*) join_list_info(JoinInfo* join_info) { /* If the list already exists then just do the join. */ if (join_info->list) { PyObject* joiner; PyObject* result; if (join_info->reversed) /* The list needs to be reversed before being joined. */ PyList_Reverse(join_info->list); if (join_info->is_unicode) { /* Concatenate the Unicode strings. */ joiner = PyUnicode_FromUnicode(NULL, 0); if (!joiner) { Py_DECREF(join_info->list); return NULL; } result = PyUnicode_Join(joiner, join_info->list); } else { joiner = PyBytes_FromString(""); if (!joiner) { Py_DECREF(join_info->list); return NULL; } /* Concatenate the bytestrings. */ result = _PyBytes_Join(joiner, join_info->list); } Py_DECREF(joiner); Py_DECREF(join_info->list); return result; } /* If we have only 1 item, so we'll just return it. */ if (join_info->item) return join_info->item; /* There are no items, so return an empty string. */ if (join_info->is_unicode) return PyUnicode_FromUnicode(NULL, 0); else return PyBytes_FromString(""); } /* Checks whether a string replacement is a literal. * * To keep it simple we'll say that a literal is a string which can be used * as-is. * * Returns its length if it is a literal, otherwise -1. */ Py_LOCAL_INLINE(Py_ssize_t) check_replacement_string(PyObject* str_replacement, unsigned char special_char) { RE_StringInfo str_info; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); Py_ssize_t pos; if (!get_string(str_replacement, &str_info)) return -1; switch (str_info.charsize) { case 1: char_at = bytes1_char_at; break; case 2: char_at = bytes2_char_at; break; case 4: char_at = bytes4_char_at; break; default: release_buffer(&str_info); return -1; } for (pos = 0; pos < str_info.length; pos++) { if (char_at(str_info.characters, pos) == special_char) { release_buffer(&str_info); return -1; } } release_buffer(&str_info); return str_info.length; } /* MatchObject's 'expand' method. */ static PyObject* match_expand(MatchObject* self, PyObject* str_template) { Py_ssize_t literal_length; PyObject* replacement; JoinInfo join_info; Py_ssize_t size; Py_ssize_t i; /* Is the template just a literal? */ literal_length = check_replacement_string(str_template, '\\'); if (literal_length >= 0) { /* It's a literal. */ Py_INCREF(str_template); return str_template; } /* Hand the template to the template compiler. */ replacement = call(RE_MODULE, "_compile_replacement_helper", PyTuple_Pack(2, self->pattern, str_template)); if (!replacement) return NULL; join_info.list = NULL; join_info.item = NULL; join_info.reversed = FALSE; join_info.is_unicode = PyUnicode_Check(self->string); /* Add each part of the template to the list. */ size = PyList_GET_SIZE(replacement); for (i = 0; i < size; i++) { PyObject* item; PyObject* str_item; item = PyList_GET_ITEM(replacement, i); str_item = get_match_replacement(self, item, self->group_count); if (!str_item) goto error; /* Add to the list. */ if (str_item == Py_None) Py_DECREF(str_item); else { int status; status = add_item(&join_info, str_item); Py_DECREF(str_item); if (status < 0) goto error; } } Py_DECREF(replacement); /* Convert the list to a single string (also cleans up join_info). */ return join_list_info(&join_info); error: Py_XDECREF(join_info.list); Py_XDECREF(join_info.item); Py_DECREF(replacement); return NULL; } /* Gets a MatchObject's group dictionary. */ static PyObject* match_get_group_dict(MatchObject* self) { PyObject* result; PyObject* keys; Py_ssize_t g; result = PyDict_New(); if (!result || !self->pattern->groupindex) return result; keys = PyMapping_Keys(self->pattern->groupindex); if (!keys) goto failed; for (g = 0; g < PyList_GET_SIZE(keys); g++) { int status; PyObject* key; PyObject* value; key = PyList_GET_ITEM(keys, g); if (!key) goto failed; value = match_get_group(self, key, Py_None, FALSE); if (!value) { Py_DECREF(key); goto failed; } status = PyDict_SetItem(result, key, value); Py_DECREF(value); if (status < 0) goto failed; } Py_DECREF(keys); return result; failed: Py_XDECREF(keys); Py_DECREF(result); return NULL; } /* MatchObject's 'expandf' method. */ static PyObject* match_expandf(MatchObject* self, PyObject* str_template) { PyObject* format_func; PyObject* args = NULL; Py_ssize_t g; PyObject* kwargs = NULL; PyObject* result; format_func = PyObject_GetAttrString(str_template, "format"); if (!format_func) return NULL; args = PyTuple_New(self->group_count + 1); if (!args) goto error; for (g = 0; g < self->group_count + 1; g++) PyTuple_SetItem(args, g, match_get_group_by_index(self, g, Py_None)); kwargs = match_get_group_dict(self); if (!kwargs) goto error; result = PyObject_Call(format_func, args, kwargs); Py_DECREF(kwargs); Py_DECREF(args); Py_DECREF(format_func); return result; error: Py_XDECREF(args); Py_DECREF(format_func); return NULL; } Py_LOCAL_INLINE(PyObject*) make_match_copy(MatchObject* self); /* MatchObject's '__copy__' method. */ static PyObject* match_copy(MatchObject* self, PyObject *unused) { return make_match_copy(self); } /* MatchObject's '__deepcopy__' method. */ static PyObject* match_deepcopy(MatchObject* self, PyObject* memo) { return make_match_copy(self); } /* MatchObject's 'regs' attribute. */ static PyObject* match_regs(MatchObject* self) { PyObject* regs; PyObject* item; Py_ssize_t g; regs = PyTuple_New(self->group_count + 1); if (!regs) return NULL; item = Py_BuildValue("nn", self->match_start, self->match_end); if (!item) { Py_DECREF(regs); return NULL; } PyTuple_SET_ITEM(regs, 0, item); for (g = 0; g < self->group_count; g++) { RE_GroupSpan* span; span = &self->groups[g].span; item = Py_BuildValue("nn", span->start, span->end); if (!item) { Py_DECREF(regs); return NULL; } PyTuple_SET_ITEM(regs, g + 1, item); } Py_INCREF(regs); self->regs = regs; return regs; } /* MatchObject's slice method. */ Py_LOCAL_INLINE(PyObject*) match_get_group_slice(MatchObject* self, PyObject* slice) { Py_ssize_t start; Py_ssize_t end; Py_ssize_t step; Py_ssize_t slice_length; #if PY_VERSION_HEX >= 0x03020000 if (PySlice_GetIndicesEx(slice, self->group_count + 1, &start, &end, &step, &slice_length) < 0) #else if (PySlice_GetIndicesEx((PySliceObject*)slice, self->group_count + 1, &start, &end, &step, &slice_length) < 0) #endif return NULL; if (slice_length <= 0) return PyTuple_New(0); else { PyObject* result; Py_ssize_t cur; Py_ssize_t i; result = PyTuple_New(slice_length); if (!result) return NULL; cur = start; for (i = 0; i < slice_length; i++) { PyTuple_SetItem(result, i, match_get_group_by_index(self, cur, Py_None)); cur += step; } return result; } } /* MatchObject's length method. */ static Py_ssize_t match_length(MatchObject* self) { return self->group_count + 1; } /* MatchObject's '__getitem__' method. */ static PyObject* match_getitem(MatchObject* self, PyObject* item) { if (PySlice_Check(item)) return match_get_group_slice(self, item); return match_get_group(self, item, Py_None, TRUE); } /* Determines the portion of the target string which is covered by the group * captures. */ Py_LOCAL_INLINE(void) determine_target_substring(MatchObject* match, Py_ssize_t* slice_start, Py_ssize_t* slice_end) { Py_ssize_t start; Py_ssize_t end; Py_ssize_t g; start = match->pos; end = match->endpos; for (g = 0; g < match->group_count; g++) { RE_GroupSpan* span; size_t c; span = &match->groups[g].span; if (span->start >= 0 && span->start < start) start = span->start; if (span->end >= 0 && span->end > end) end = span->end; for (c = 0; c < match->groups[g].capture_count; c++) { RE_GroupSpan* span; span = match->groups[g].captures; if (span->start >= 0 && span->start < start) start = span->start; if (span->end >= 0 && span->end > end) end = span->end; } } *slice_start = start; *slice_end = end; } /* MatchObject's 'detach_string' method. */ static PyObject* match_detach_string(MatchObject* self, PyObject* unused) { if (self->string) { Py_ssize_t start; Py_ssize_t end; PyObject* substring; determine_target_substring(self, &start, &end); substring = get_slice(self->string, start, end); if (substring) { Py_XDECREF(self->substring); self->substring = substring; self->substring_offset = start; Py_XDECREF(self->string); self->string = NULL; } } Py_INCREF(Py_None); return Py_None; } /* The documentation of a MatchObject. */ PyDoc_STRVAR(match_group_doc, "group([group1, ...]) --> string or tuple of strings.\n\ Return one or more subgroups of the match. If there is a single argument,\n\ the result is a single string, or None if the group did not contribute to\n\ the match; if there are multiple arguments, the result is a tuple with one\n\ item per argument; if there are no arguments, the whole match is returned.\n\ Group 0 is the whole match."); PyDoc_STRVAR(match_start_doc, "start([group1, ...]) --> int or tuple of ints.\n\ Return the index of the start of one or more subgroups of the match. If\n\ there is a single argument, the result is an index, or -1 if the group did\n\ not contribute to the match; if there are multiple arguments, the result is\n\ a tuple with one item per argument; if there are no arguments, the index of\n\ the start of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_end_doc, "end([group1, ...]) --> int or tuple of ints.\n\ Return the index of the end of one or more subgroups of the match. If there\n\ is a single argument, the result is an index, or -1 if the group did not\n\ contribute to the match; if there are multiple arguments, the result is a\n\ tuple with one item per argument; if there are no arguments, the index of\n\ the end of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_span_doc, "span([group1, ...]) --> 2-tuple of int or tuple of 2-tuple of ints.\n\ Return the span (a 2-tuple of the indices of the start and end) of one or\n\ more subgroups of the match. If there is a single argument, the result is a\n\ span, or (-1, -1) if the group did not contribute to the match; if there are\n\ multiple arguments, the result is a tuple with one item per argument; if\n\ there are no arguments, the span of the whole match is returned. Group 0 is\n\ the whole match."); PyDoc_STRVAR(match_groups_doc, "groups(default=None) --> tuple of strings.\n\ Return a tuple containing all the subgroups of the match. The argument is\n\ the default for groups that did not participate in the match."); PyDoc_STRVAR(match_groupdict_doc, "groupdict(default=None) --> dict.\n\ Return a dictionary containing all the named subgroups of the match, keyed\n\ by the subgroup name. The argument is the value to be given for groups that\n\ did not participate in the match."); PyDoc_STRVAR(match_capturesdict_doc, "capturesdict() --> dict.\n\ Return a dictionary containing the captures of all the named subgroups of the\n\ match, keyed by the subgroup name."); PyDoc_STRVAR(match_expand_doc, "expand(template) --> string.\n\ Return the string obtained by doing backslash substitution on the template,\n\ as done by the sub() method."); PyDoc_STRVAR(match_expandf_doc, "expandf(format) --> string.\n\ Return the string obtained by using the format, as done by the subf()\n\ method."); PyDoc_STRVAR(match_captures_doc, "captures([group1, ...]) --> list of strings or tuple of list of strings.\n\ Return the captures of one or more subgroups of the match. If there is a\n\ single argument, the result is a list of strings; if there are multiple\n\ arguments, the result is a tuple of lists with one item per argument; if\n\ there are no arguments, the captures of the whole match is returned. Group\n\ 0 is the whole match."); PyDoc_STRVAR(match_starts_doc, "starts([group1, ...]) --> list of ints or tuple of list of ints.\n\ Return the indices of the starts of the captures of one or more subgroups of\n\ the match. If there is a single argument, the result is a list of indices;\n\ if there are multiple arguments, the result is a tuple of lists with one\n\ item per argument; if there are no arguments, the indices of the starts of\n\ the captures of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_ends_doc, "ends([group1, ...]) --> list of ints or tuple of list of ints.\n\ Return the indices of the ends of the captures of one or more subgroups of\n\ the match. If there is a single argument, the result is a list of indices;\n\ if there are multiple arguments, the result is a tuple of lists with one\n\ item per argument; if there are no arguments, the indices of the ends of the\n\ captures of the whole match is returned. Group 0 is the whole match."); PyDoc_STRVAR(match_spans_doc, "spans([group1, ...]) --> list of 2-tuple of ints or tuple of list of 2-tuple of ints.\n\ Return the spans (a 2-tuple of the indices of the start and end) of the\n\ captures of one or more subgroups of the match. If there is a single\n\ argument, the result is a list of spans; if there are multiple arguments,\n\ the result is a tuple of lists with one item per argument; if there are no\n\ arguments, the spans of the captures of the whole match is returned. Group\n\ 0 is the whole match."); PyDoc_STRVAR(match_detach_string_doc, "detach_string()\n\ Detaches the target string from the match object. The 'string' attribute\n\ will become None."); /* MatchObject's methods. */ static PyMethodDef match_methods[] = { {"group", (PyCFunction)match_group, METH_VARARGS, match_group_doc}, {"start", (PyCFunction)match_start, METH_VARARGS, match_start_doc}, {"end", (PyCFunction)match_end, METH_VARARGS, match_end_doc}, {"span", (PyCFunction)match_span, METH_VARARGS, match_span_doc}, {"groups", (PyCFunction)match_groups, METH_VARARGS|METH_KEYWORDS, match_groups_doc}, {"groupdict", (PyCFunction)match_groupdict, METH_VARARGS|METH_KEYWORDS, match_groupdict_doc}, {"capturesdict", (PyCFunction)match_capturesdict, METH_NOARGS, match_capturesdict_doc}, {"expand", (PyCFunction)match_expand, METH_O, match_expand_doc}, {"expandf", (PyCFunction)match_expandf, METH_O, match_expandf_doc}, {"captures", (PyCFunction)match_captures, METH_VARARGS, match_captures_doc}, {"starts", (PyCFunction)match_starts, METH_VARARGS, match_starts_doc}, {"ends", (PyCFunction)match_ends, METH_VARARGS, match_ends_doc}, {"spans", (PyCFunction)match_spans, METH_VARARGS, match_spans_doc}, {"detach_string", (PyCFunction)match_detach_string, METH_NOARGS, match_detach_string_doc}, {"__copy__", (PyCFunction)match_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)match_deepcopy, METH_O}, {"__getitem__", (PyCFunction)match_getitem, METH_O|METH_COEXIST}, {NULL, NULL} }; PyDoc_STRVAR(match_doc, "Match object"); /* MatchObject's 'lastindex' attribute. */ static PyObject* match_lastindex(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; if (self->lastindex >= 0) return Py_BuildValue("n", self->lastindex); Py_INCREF(Py_None); return Py_None; } /* MatchObject's 'lastgroup' attribute. */ static PyObject* match_lastgroup(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; if (self->pattern->indexgroup && self->lastgroup >= 0) { PyObject* index = Py_BuildValue("n", self->lastgroup); PyObject* result = PyDict_GetItem(self->pattern->indexgroup, index); Py_DECREF(index); if (result) { Py_INCREF(result); return result; } PyErr_Clear(); } Py_INCREF(Py_None); return Py_None; } /* MatchObject's 'string' attribute. */ static PyObject* match_string(PyObject* self_) { MatchObject* self; self = (MatchObject*)self_; if (self->string) { Py_INCREF(self->string); return self->string; } else { Py_INCREF(Py_None); return Py_None; } } static PyGetSetDef match_getset[] = { {"lastindex", (getter)match_lastindex, (setter)NULL, "The group number of the last matched capturing group, or None."}, {"lastgroup", (getter)match_lastgroup, (setter)NULL, "The name of the last matched capturing group, or None."}, {"regs", (getter)match_regs, (setter)NULL, "A tuple of the spans of the capturing groups."}, {"string", (getter)match_string, (setter)NULL, "The string that was searched, or None if it has been detached."}, {NULL} /* Sentinel */ }; static PyMemberDef match_members[] = { {"re", T_OBJECT, offsetof(MatchObject, pattern), READONLY, "The regex object that produced this match object."}, {"pos", T_PYSSIZET, offsetof(MatchObject, pos), READONLY, "The position at which the regex engine starting searching."}, {"endpos", T_PYSSIZET, offsetof(MatchObject, endpos), READONLY, "The final position beyond which the regex engine won't search."}, {NULL} /* Sentinel */ }; static PyMappingMethods match_as_mapping = { (lenfunc)match_length, /* mp_length */ (binaryfunc)match_getitem, /* mp_subscript */ 0, /* mp_ass_subscript */ }; static PyTypeObject Match_Type = { PyVarObject_HEAD_INIT(NULL,0) "_" RE_MODULE "." "Match", sizeof(MatchObject) }; /* Copies the groups. */ Py_LOCAL_INLINE(RE_GroupData*) copy_groups(RE_GroupData* groups, Py_ssize_t group_count) { Py_ssize_t span_count; Py_ssize_t g; RE_GroupData* groups_copy; RE_GroupSpan* spans_copy; Py_ssize_t offset; /* Calculate the total size of the group info. */ span_count = 0; for (g = 0; g < group_count; g++) span_count += groups[g].capture_count; /* Allocate the storage for the group info in a single block. */ groups_copy = (RE_GroupData*)re_alloc(group_count * sizeof(RE_GroupData) + span_count * sizeof(RE_GroupSpan)); if (!groups_copy) return NULL; /* The storage for the spans comes after the other group info. */ spans_copy = (RE_GroupSpan*)&groups_copy[group_count]; /* There's no need to initialise the spans info. */ memset(groups_copy, 0, group_count * sizeof(RE_GroupData)); offset = 0; for (g = 0; g < group_count; g++) { RE_GroupData* orig; RE_GroupData* copy; orig = &groups[g]; copy = &groups_copy[g]; copy->span = orig->span; copy->captures = &spans_copy[offset]; offset += orig->capture_count; if (orig->capture_count > 0) { Py_MEMCPY(copy->captures, orig->captures, orig->capture_count * sizeof(RE_GroupSpan)); copy->capture_capacity = orig->capture_count; copy->capture_count = orig->capture_count; } } return groups_copy; } /* Makes a copy of a MatchObject. */ Py_LOCAL_INLINE(PyObject*) make_match_copy(MatchObject* self) { MatchObject* match; if (!self->string) { /* The target string has been detached, so the MatchObject is now * immutable. */ Py_INCREF(self); return (PyObject*)self; } /* Create a MatchObject. */ match = PyObject_NEW(MatchObject, &Match_Type); if (!match) return NULL; match->string = self->string; match->substring = self->substring; match->substring_offset = self->substring_offset; match->pattern = self->pattern; match->regs = self->regs; Py_INCREF(match->string); Py_INCREF(match->substring); Py_INCREF(match->pattern); /* Copy the groups to the MatchObject. */ if (self->group_count > 0) { match->groups = copy_groups(self->groups, self->group_count); if (!match->groups) { Py_DECREF(match); return NULL; } } else match->groups = NULL; match->group_count = self->group_count; match->pos = self->pos; match->endpos = self->endpos; match->match_start = self->match_start; match->match_end = self->match_end; match->lastindex = match->lastindex; match->lastgroup = match->lastgroup; return (PyObject*)match; } /* Creates a new MatchObject. */ Py_LOCAL_INLINE(PyObject*) pattern_new_match(PatternObject* pattern, RE_State* state, int status) { /* Create MatchObject (from state object). */ if (status > 0) { MatchObject* match; /* Create a MatchObject. */ match = PyObject_NEW(MatchObject, &Match_Type); if (!match) return NULL; match->string = state->string; match->substring = state->string; match->substring_offset = 0; match->pattern = pattern; match->regs = NULL; Py_INCREF(match->string); Py_INCREF(match->substring); Py_INCREF(match->pattern); /* Copy the groups to the MatchObject. */ if (pattern->public_group_count > 0) { match->groups = copy_groups(state->groups, pattern->public_group_count); if (!match->groups) { Py_DECREF(match); return NULL; } } else match->groups = NULL; match->group_count = pattern->public_group_count; match->pos = state->slice_start; match->endpos = state->slice_end; if (state->reverse) { match->match_start = state->text_pos; match->match_end = state->match_pos; } else { match->match_start = state->match_pos; match->match_end = state->text_pos; } match->lastindex = state->lastindex; match->lastgroup = state->lastgroup; return (PyObject*)match; } else if (status == 0) { /* No match. */ Py_INCREF(Py_None); return Py_None; } else { /* Internal error. */ set_error(status, NULL); return NULL; } } /* Gets the text of a capture group from a state. */ Py_LOCAL_INLINE(PyObject*) state_get_group(RE_State* state, Py_ssize_t index, PyObject* string, BOOL empty) { RE_GroupData* group; Py_ssize_t start; Py_ssize_t end; group = &state->groups[index - 1]; if (string != Py_None && index >= 1 && index <= (Py_ssize_t)state->pattern->public_group_count && group->capture_count > 0) { start = group->span.start; end = group->span.end; } else { if (empty) /* Want an empty string. */ start = end = 0; else { Py_INCREF(Py_None); return Py_None; } } return get_slice(string, start, end); } /* Acquires the lock (mutex) on the state if there's one. * * It also increments the owner's refcount just to ensure that it won't be * destroyed by another thread. */ Py_LOCAL_INLINE(void) acquire_state_lock(PyObject* owner, RE_SafeState* safe_state) { RE_State* state; state = safe_state->re_state; if (state->lock) { /* In order to avoid deadlock we need to release the GIL while trying * to acquire the lock. */ Py_INCREF(owner); if (!PyThread_acquire_lock(state->lock, 0)) { release_GIL(safe_state); PyThread_acquire_lock(state->lock, 1); acquire_GIL(safe_state); } } } /* Releases the lock (mutex) on the state if there's one. * * It also decrements the owner's refcount, which was incremented when the lock * was acquired. */ Py_LOCAL_INLINE(void) release_state_lock(PyObject* owner, RE_SafeState* safe_state) { RE_State* state; state = safe_state->re_state; if (state->lock) { PyThread_release_lock(state->lock); Py_DECREF(owner); } } /* Implements the functionality of ScanObject's search and match methods. */ static PyObject* scanner_search_or_match(ScannerObject* self, BOOL search) { RE_State* state; RE_SafeState safe_state; PyObject* match; state = &self->state; /* Initialise the "safe state" structure. */ safe_state.re_state = state; safe_state.thread_state = NULL; /* Acquire the state lock in case we're sharing the scanner object across * threads. */ acquire_state_lock((PyObject*)self, &safe_state); if (self->status == 0) { /* No match. */ release_state_lock((PyObject*)self, &safe_state); Py_INCREF(Py_None); return Py_None; } else if (self->status < 0) { /* Internal error. */ release_state_lock((PyObject*)self, &safe_state); set_error(self->status, NULL); return NULL; } /* Look for another match. */ self->status = do_match(&safe_state, search); if (self->status < 0) { /* Internal error. */ release_state_lock((PyObject*)self, &safe_state); return NULL; } /* Create the match object. */ match = pattern_new_match(self->pattern, state, self->status); if (search && state->overlapped) { /* Advance one character. */ Py_ssize_t step; step = state->reverse ? -1 : 1; state->text_pos = state->match_pos + step; state->must_advance = FALSE; } else /* Continue from where we left off, but don't allow 2 contiguous * zero-width matches. */ state->must_advance = state->text_pos == state->match_pos; /* Release the state lock. */ release_state_lock((PyObject*)self, &safe_state); return match; } /* ScannerObject's 'match' method. */ static PyObject* scanner_match(ScannerObject* self, PyObject* unused) { return scanner_search_or_match(self, FALSE); } /* ScannerObject's 'search' method. */ static PyObject* scanner_search(ScannerObject* self, PyObject *unused) { return scanner_search_or_match(self, TRUE); } /* Returns an iterator for a ScannerObject. * * The iterator is actually the ScannerObject itself. */ static PyObject* scanner_iter(PyObject* self) { Py_INCREF(self); return self; } /* Gets the next result from a scanner iterator. */ static PyObject* scanner_iternext(PyObject* self) { PyObject* match; match = scanner_search((ScannerObject*)self, NULL); if (match == Py_None) { /* No match. */ Py_DECREF(match); return NULL; } return match; } /* Makes a copy of a ScannerObject. * * It actually doesn't make a copy, just returns the original object. */ Py_LOCAL_INLINE(PyObject*) make_scanner_copy(ScannerObject* self) { Py_INCREF(self); return (PyObject*)self; } /* ScannerObject's '__copy__' method. */ static PyObject* scanner_copy(ScannerObject* self, PyObject *unused) { return make_scanner_copy(self); } /* ScannerObject's '__deepcopy__' method. */ static PyObject* scanner_deepcopy(ScannerObject* self, PyObject* memo) { return make_scanner_copy(self); } /* The documentation of a ScannerObject. */ PyDoc_STRVAR(scanner_match_doc, "match() --> MatchObject or None.\n\ Match at the current position in the string."); PyDoc_STRVAR(scanner_search_doc, "search() --> MatchObject or None.\n\ Search from the current position in the string."); /* ScannerObject's methods. */ static PyMethodDef scanner_methods[] = { {"match", (PyCFunction)scanner_match, METH_NOARGS, scanner_match_doc}, {"search", (PyCFunction)scanner_search, METH_NOARGS, scanner_search_doc}, {"__copy__", (PyCFunction)scanner_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)scanner_deepcopy, METH_O}, {NULL, NULL} }; PyDoc_STRVAR(scanner_doc, "Scanner object"); /* Deallocates a ScannerObject. */ static void scanner_dealloc(PyObject* self_) { ScannerObject* self; self = (ScannerObject*)self_; state_fini(&self->state); Py_DECREF(self->pattern); PyObject_DEL(self); } static PyMemberDef scanner_members[] = { {"pattern", T_OBJECT, offsetof(ScannerObject, pattern), READONLY, "The regex object that produced this scanner object."}, {NULL} /* Sentinel */ }; static PyTypeObject Scanner_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_" RE_MODULE "." "Scanner", sizeof(ScannerObject) }; /* Decodes a 'concurrent' argument. */ Py_LOCAL_INLINE(int) decode_concurrent(PyObject* concurrent) { Py_ssize_t value; if (concurrent == Py_None) return RE_CONC_DEFAULT; value = PyLong_AsLong(concurrent); if (value == -1 && PyErr_Occurred()) { set_error(RE_ERROR_CONCURRENT, NULL); return -1; } return value ? RE_CONC_YES : RE_CONC_NO; } /* Creates a new ScannerObject. */ static PyObject* pattern_scanner(PatternObject* pattern, PyObject* args, PyObject* kwargs) { /* Create search state object. */ ScannerObject* self; Py_ssize_t start; Py_ssize_t end; int conc; PyObject* string; PyObject* pos = Py_None; PyObject* endpos = Py_None; Py_ssize_t overlapped = FALSE; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "pos", "endpos", "overlapped", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOnO:scanner", kwlist, &string, &pos, &endpos, &overlapped, &concurrent)) return NULL; start = as_string_index(pos, 0); if (start == -1 && PyErr_Occurred()) return NULL; end = as_string_index(endpos, PY_SSIZE_T_MAX); if (end == -1 && PyErr_Occurred()) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* Create a scanner object. */ self = PyObject_NEW(ScannerObject, &Scanner_Type); if (!self) return NULL; self->pattern = pattern; Py_INCREF(self->pattern); /* The MatchObject, and therefore repeated captures, will be visible. */ if (!state_init(&self->state, pattern, string, start, end, overlapped != 0, conc, TRUE, TRUE, FALSE)) { PyObject_DEL(self); return NULL; } self->status = 1; return (PyObject*) self; } /* Performs the split for the SplitterObject. */ static PyObject* next_split_part(SplitterObject* self) { RE_State* state; RE_SafeState safe_state; PyObject* result = NULL; /* Initialise to stop compiler warning. */ state = &self->state; /* Initialise the "safe state" structure. */ safe_state.re_state = state; safe_state.thread_state = NULL; /* Acquire the state lock in case we're sharing the splitter object across * threads. */ acquire_state_lock((PyObject*)self, &safe_state); if (self->status == 0) { /* Finished. */ release_state_lock((PyObject*)self, &safe_state); result = Py_False; Py_INCREF(result); return result; } else if (self->status < 0) { /* Internal error. */ release_state_lock((PyObject*)self, &safe_state); set_error(self->status, NULL); return NULL; } if (self->index == 0) { if (self->split_count < self->maxsplit) { Py_ssize_t step; Py_ssize_t end_pos; if (state->reverse) { step = -1; end_pos = state->slice_start; } else { step = 1; end_pos = state->slice_end; } retry: self->status = do_match(&safe_state, TRUE); if (self->status < 0) goto error; if (self->status == RE_ERROR_SUCCESS) { if (state->version_0) { /* Version 0 behaviour is to advance one character if the * split was zero-width. Unfortunately, this can give an * incorrect result. GvR wants this behaviour to be * retained so as not to break any existing software which * might rely on it. */ if (state->text_pos == state->match_pos) { if (self->last_pos == end_pos) goto no_match; /* Advance one character. */ state->text_pos += step; state->must_advance = FALSE; goto retry; } } ++self->split_count; /* Get segment before this match. */ if (state->reverse) result = get_slice(state->string, state->match_pos, self->last_pos); else result = get_slice(state->string, self->last_pos, state->match_pos); if (!result) goto error; self->last_pos = state->text_pos; /* Version 0 behaviour is to advance one character if the match * was zero-width. Unfortunately, this can give an incorrect * result. GvR wants this behaviour to be retained so as not to * break any existing software which might rely on it. */ if (state->version_0) { if (state->text_pos == state->match_pos) /* Advance one character. */ state->text_pos += step; state->must_advance = FALSE; } else /* Continue from where we left off, but don't allow a * contiguous zero-width match. */ state->must_advance = TRUE; } } else goto no_match; if (self->status == RE_ERROR_FAILURE) { no_match: /* Get segment following last match (even if empty). */ if (state->reverse) result = get_slice(state->string, 0, self->last_pos); else result = get_slice(state->string, self->last_pos, state->text_length); if (!result) goto error; } } else { /* Add group. */ result = state_get_group(state, self->index, state->string, FALSE); if (!result) goto error; } ++self->index; if (self->index > (Py_ssize_t)state->pattern->public_group_count) self->index = 0; /* Release the state lock. */ release_state_lock((PyObject*)self, &safe_state); return result; error: /* Release the state lock. */ release_state_lock((PyObject*)self, &safe_state); return NULL; } /* SplitterObject's 'split' method. */ static PyObject* splitter_split(SplitterObject* self, PyObject *unused) { PyObject* result; result = next_split_part(self); if (result == Py_False) { /* The sentinel. */ Py_DECREF(Py_False); Py_INCREF(Py_None); return Py_None; } return result; } /* Returns an iterator for a SplitterObject. * * The iterator is actually the SplitterObject itself. */ static PyObject* splitter_iter(PyObject* self) { Py_INCREF(self); return self; } /* Gets the next result from a splitter iterator. */ static PyObject* splitter_iternext(PyObject* self) { PyObject* result; result = next_split_part((SplitterObject*)self); if (result == Py_False) { /* No match. */ Py_DECREF(result); return NULL; } return result; } /* Makes a copy of a SplitterObject. * * It actually doesn't make a copy, just returns the original object. */ Py_LOCAL_INLINE(PyObject*) make_splitter_copy(SplitterObject* self) { Py_INCREF(self); return (PyObject*)self; } /* SplitterObject's '__copy__' method. */ static PyObject* splitter_copy(SplitterObject* self, PyObject *unused) { return make_splitter_copy(self); } /* SplitterObject's '__deepcopy__' method. */ static PyObject* splitter_deepcopy(SplitterObject* self, PyObject* memo) { return make_splitter_copy(self); } /* The documentation of a SplitterObject. */ PyDoc_STRVAR(splitter_split_doc, "split() --> string or None.\n\ Return the next part of the split string."); /* SplitterObject's methods. */ static PyMethodDef splitter_methods[] = { {"split", (PyCFunction)splitter_split, METH_NOARGS, splitter_split_doc}, {"__copy__", (PyCFunction)splitter_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)splitter_deepcopy, METH_O}, {NULL, NULL} }; PyDoc_STRVAR(splitter_doc, "Splitter object"); /* Deallocates a SplitterObject. */ static void splitter_dealloc(PyObject* self_) { SplitterObject* self; self = (SplitterObject*)self_; state_fini(&self->state); Py_DECREF(self->pattern); PyObject_DEL(self); } static PyMemberDef splitter_members[] = { {"pattern", T_OBJECT, offsetof(SplitterObject, pattern), READONLY, "The regex object that produced this splitter object."}, {NULL} /* Sentinel */ }; static PyTypeObject Splitter_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_" RE_MODULE "." "Splitter", sizeof(SplitterObject) }; /* Creates a new SplitterObject. */ static PyObject* pattern_splitter(PatternObject* pattern, PyObject* args, PyObject* kwargs) { /* Create split state object. */ int conc; SplitterObject* self; RE_State* state; PyObject* string; Py_ssize_t maxsplit = 0; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "maxsplit", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO:splitter", kwlist, &string, &maxsplit, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* Create a splitter object. */ self = PyObject_NEW(SplitterObject, &Splitter_Type); if (!self) return NULL; self->pattern = pattern; Py_INCREF(self->pattern); if (maxsplit == 0) maxsplit = PY_SSIZE_T_MAX; state = &self->state; /* The MatchObject, and therefore repeated captures, will not be visible. */ if (!state_init(state, pattern, string, 0, PY_SSIZE_T_MAX, FALSE, conc, TRUE, FALSE, FALSE)) { PyObject_DEL(self); return NULL; } self->maxsplit = maxsplit; self->last_pos = state->reverse ? state->text_length : 0; self->split_count = 0; self->index = 0; self->status = 1; return (PyObject*) self; } /* Implements the functionality of PatternObject's search and match methods. */ static PyObject* pattern_search_or_match(PatternObject* self, PyObject* args, PyObject* kwargs, char* args_desc, BOOL search, BOOL match_all) { Py_ssize_t start; Py_ssize_t end; int conc; RE_State state; RE_SafeState safe_state; int status; PyObject* match; PyObject* string; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "pos", "endpos", "concurrent", NULL }; /* When working with a short string, such as a line from a file, the * relative cost of PyArg_ParseTupleAndKeywords can be significant, and * it's worth not using it when there are only positional arguments. */ Py_ssize_t arg_count; if (args && !kwargs && PyTuple_CheckExact(args)) arg_count = PyTuple_GET_SIZE(args); else arg_count = -1; if (1 <= arg_count && arg_count <= 4) { string = PyTuple_GET_ITEM(args, 0); if (arg_count >= 2) pos = PyTuple_GET_ITEM(args, 1); if (arg_count >= 3) endpos = PyTuple_GET_ITEM(args, 2); if (arg_count >= 4) concurrent = PyTuple_GET_ITEM(args, 3); } else if (!PyArg_ParseTupleAndKeywords(args, kwargs, args_desc, kwlist, &string, &pos, &endpos, &concurrent)) return NULL; start = as_string_index(pos, 0); if (start == -1 && PyErr_Occurred()) return NULL; end = as_string_index(endpos, PY_SSIZE_T_MAX); if (end == -1 && PyErr_Occurred()) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* The MatchObject, and therefore repeated captures, will be visible. */ if (!state_init(&state, self, string, start, end, FALSE, conc, FALSE, TRUE, match_all)) return NULL; /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; status = do_match(&safe_state, search); if (status < 0) { state_fini(&state); return NULL; } /* Create the match object. */ match = pattern_new_match(self, &state, status); state_fini(&state); return match; } /* PatternObject's 'match' method. */ static PyObject* pattern_match(PatternObject* self, PyObject* args, PyObject* kwargs) { return pattern_search_or_match(self, args, kwargs, "O|OOO:match", FALSE, FALSE); } /* PatternObject's 'fullmatch' method. */ static PyObject* pattern_fullmatch(PatternObject* self, PyObject* args, PyObject* kwargs) { return pattern_search_or_match(self, args, kwargs, "O|OOO:fullmatch", FALSE, TRUE); } /* PatternObject's 'search' method. */ static PyObject* pattern_search(PatternObject* self, PyObject* args, PyObject* kwargs) { return pattern_search_or_match(self, args, kwargs, "O|OOO:search", TRUE, FALSE); } /* Gets the limits of the matching. */ Py_LOCAL_INLINE(BOOL) get_limits(PyObject* pos, PyObject* endpos, Py_ssize_t length, Py_ssize_t* start, Py_ssize_t* end) { Py_ssize_t s; Py_ssize_t e; s = as_string_index(pos, 0); if (s == -1 && PyErr_Occurred()) return FALSE; e = as_string_index(endpos, PY_SSIZE_T_MAX); if (e == -1 && PyErr_Occurred()) return FALSE; /* Adjust boundaries. */ if (s < 0) s += length; if (s < 0) s = 0; else if (s > length) s = length; if (e < 0) e += length; if (e < 0) e = 0; else if (e > length) e = length; *start = s; *end = e; return TRUE; } /* Gets a replacement item from the replacement list. * * The replacement item could be a string literal or a group. * * It can return None to represent an empty string. */ Py_LOCAL_INLINE(PyObject*) get_sub_replacement(PyObject* item, PyObject* string, RE_State* state, Py_ssize_t group_count) { Py_ssize_t index; #if PY_VERSION_HEX >= 0x03040000 if (PyUnicode_CheckExact(item) || PyBytes_CheckExact(item)) { /* It's a literal, which can be added directly to the list. */ return ensure_immutable(item); } #else if (PyUnicode_CheckExact(item) || PyBytes_CheckExact(item)) { /* It's a literal, which can be added directly to the list. */ Py_INCREF(item); return item; } #endif /* Is it a group reference? */ index = as_group_index(item); if (index == -1 && PyErr_Occurred()) { /* Not a group either! */ set_error(RE_ERROR_REPLACEMENT, NULL); return NULL; } if (index == 0) { /* The entire matched portion of the string. */ if (state->match_pos == state->text_pos) { /* Return None for "". */ Py_INCREF(Py_None); return Py_None; } if (state->reverse) return get_slice(string, state->text_pos, state->match_pos); else return get_slice(string, state->match_pos, state->text_pos); } else if (1 <= index && index <= group_count) { /* A group. */ RE_GroupData* group; group = &state->groups[index - 1]; if (group->capture_count == 0 && group->span.start != group->span.end) { /* The group didn't match or is "", so return None for "". */ Py_INCREF(Py_None); return Py_None; } return get_slice(string, group->span.start, group->span.end); } else { /* No such group. */ set_error(RE_ERROR_INVALID_GROUP_REF, NULL); return NULL; } } /* PatternObject's 'subx' method. */ Py_LOCAL_INLINE(PyObject*) pattern_subx(PatternObject* self, PyObject* str_template, PyObject* string, Py_ssize_t maxsub, int sub_type, PyObject* pos, PyObject* endpos, int concurrent) { RE_StringInfo str_info; Py_ssize_t start; Py_ssize_t end; BOOL is_callable = FALSE; BOOL is_literal = FALSE; BOOL is_template = FALSE; PyObject* replacement = NULL; BOOL is_format = FALSE; RE_State state; RE_SafeState safe_state; JoinInfo join_info; Py_ssize_t sub_count; Py_ssize_t last_pos; PyObject* item; Py_ssize_t end_pos; Py_ssize_t step; /* Get the string. */ if (!get_string(string, &str_info)) return NULL; if (!check_compatible(self, str_info.is_unicode)) { release_buffer(&str_info); return NULL; } /* Get the limits of the search. */ if (!get_limits(pos, endpos, str_info.length, &start, &end)) { release_buffer(&str_info); return NULL; } /* If the pattern is too long for the string, then take a shortcut, unless * it's a fuzzy pattern. */ if (!self->is_fuzzy && (Py_ssize_t)self->min_width > end - start) { PyObject* result; Py_INCREF(string); if (sub_type & RE_SUBN) result = Py_BuildValue("Nn", string, 0); else result = string; release_buffer(&str_info); return result; } if (maxsub == 0) maxsub = PY_SSIZE_T_MAX; /* sub/subn takes either a function or a string template. */ if (PyCallable_Check(str_template)) { /* It's callable. */ is_callable = TRUE; replacement = str_template; Py_INCREF(replacement); } else if (sub_type & RE_SUBF) { /* Is it a literal format? * * To keep it simple we'll say that a literal is a string which can be * used as-is, so no placeholders. */ Py_ssize_t literal_length; literal_length = check_replacement_string(str_template, '{'); if (literal_length > 0) { /* It's a literal. */ is_literal = TRUE; replacement = str_template; Py_INCREF(replacement); } else if (literal_length < 0) { /* It isn't a literal, so get the 'format' method. */ is_format = TRUE; replacement = PyObject_GetAttrString(str_template, "format"); if (!replacement) { release_buffer(&str_info); return NULL; } } } else { /* Is it a literal template? * * To keep it simple we'll say that a literal is a string which can be * used as-is, so no backslashes. */ Py_ssize_t literal_length; literal_length = check_replacement_string(str_template, '\\'); if (literal_length > 0) { /* It's a literal. */ is_literal = TRUE; replacement = str_template; Py_INCREF(replacement); } else if (literal_length < 0 ) { /* It isn't a literal, so hand it over to the template compiler. */ is_template = TRUE; replacement = call(RE_MODULE, "_compile_replacement_helper", PyTuple_Pack(2, self, str_template)); if (!replacement) { release_buffer(&str_info); return NULL; } } } /* The MatchObject, and therefore repeated captures, will be visible only * if the replacement is callable. */ if (!state_init_2(&state, self, string, &str_info, start, end, FALSE, concurrent, FALSE, is_callable, FALSE)) { release_buffer(&str_info); Py_XDECREF(replacement); return NULL; } /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; join_info.item = NULL; join_info.list = NULL; join_info.reversed = state.reverse; join_info.is_unicode = PyUnicode_Check(string); sub_count = 0; last_pos = state.reverse ? state.text_length : 0; step = state.reverse ? -1 : 1; while (sub_count < maxsub) { int status; status = do_match(&safe_state, TRUE); if (status < 0) goto error; if (status == 0) break; /* Append the segment before this match. */ if (state.match_pos != last_pos) { if (state.reverse) item = get_slice(string, state.match_pos, last_pos); else item = get_slice(string, last_pos, state.match_pos); if (!item) goto error; /* Add to the list. */ status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; } /* Add this match. */ if (is_literal) { /* The replacement is a literal string. */ status = add_item(&join_info, replacement); if (status < 0) goto error; } else if (is_format) { /* The replacement is a format string. */ MatchObject* match; PyObject* args; Py_ssize_t g; PyObject* kwargs; /* We need to create the arguments for the 'format' method. We'll * start by creating a MatchObject. */ match = (MatchObject*)pattern_new_match(self, &state, 1); if (!match) goto error; /* The args are a tuple of the capture group matches. */ args = PyTuple_New(state.pattern->public_group_count + 1); if (!args) { Py_DECREF(match); goto error; } for (g = 0; g < state.pattern->public_group_count + 1; g++) PyTuple_SetItem(args, g, match_get_group_by_index(match, g, Py_None)); /* The kwargs are a dict of the named capture group matches. */ kwargs = match_get_group_dict(match); if (!kwargs) { Py_DECREF(args); Py_DECREF(match); goto error; } /* Call the 'format' method. */ item = PyObject_Call(replacement, args, kwargs); Py_DECREF(kwargs); Py_DECREF(args); Py_DECREF(match); if (!item) goto error; /* Add the result to the list. */ status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; } else if (is_template) { /* The replacement is a list template. */ Py_ssize_t size; Py_ssize_t i; /* Add each part of the template to the list. */ size = PyList_GET_SIZE(replacement); for (i = 0; i < size; i++) { PyObject* item; PyObject* str_item; item = PyList_GET_ITEM(replacement, i); str_item = get_sub_replacement(item, string, &state, self->public_group_count); if (!str_item) goto error; /* Add the result to the list. */ if (str_item == Py_None) /* None for "". */ Py_DECREF(str_item); else { status = add_item(&join_info, str_item); Py_DECREF(str_item); if (status < 0) goto error; } } } else if (is_callable) { /* Pass a MatchObject to the replacement function. */ PyObject* match; PyObject* args; /* We need to create a MatchObject to pass to the replacement * function. */ match = pattern_new_match(self, &state, 1); if (!match) goto error; /* The args for the replacement function. */ args = PyTuple_Pack(1, match); if (!args) { Py_DECREF(match); goto error; } /* Call the replacement function. */ item = PyObject_CallObject(replacement, args); Py_DECREF(args); Py_DECREF(match); if (!item) goto error; /* Add the result to the list. */ status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; } ++sub_count; last_pos = state.text_pos; if (state.version_0) { /* Always advance after a zero-width match. */ if (state.match_pos == state.text_pos) { state.text_pos += step; state.must_advance = FALSE; } else state.must_advance = TRUE; } else /* Continue from where we left off, but don't allow a contiguous * zero-width match. */ state.must_advance = state.match_pos == state.text_pos; } /* Get the segment following the last match. We use 'length' instead of * 'text_length' because the latter is truncated to 'slice_end', a * documented idiosyncracy of the 're' module. */ end_pos = state.reverse ? 0 : str_info.length; if (last_pos != end_pos) { int status; /* The segment is part of the original string. */ if (state.reverse) item = get_slice(string, 0, last_pos); else item = get_slice(string, last_pos, str_info.length); if (!item) goto error; status = add_item(&join_info, item); Py_DECREF(item); if (status < 0) goto error; } Py_XDECREF(replacement); /* Convert the list to a single string (also cleans up join_info). */ item = join_list_info(&join_info); state_fini(&state); if (!item) return NULL; if (sub_type & RE_SUBN) return Py_BuildValue("Nn", item, sub_count); return item; error: Py_XDECREF(join_info.list); Py_XDECREF(join_info.item); state_fini(&state); Py_XDECREF(replacement); return NULL; } /* PatternObject's 'sub' method. */ static PyObject* pattern_sub(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* replacement; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "repl", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:sub", kwlist, &replacement, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, replacement, string, count, RE_SUB, pos, endpos, conc); } /* PatternObject's 'subf' method. */ static PyObject* pattern_subf(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* format; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "format", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:sub", kwlist, &format, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, format, string, count, RE_SUBF, pos, endpos, conc); } /* PatternObject's 'subn' method. */ static PyObject* pattern_subn(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* replacement; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "repl", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:subn", kwlist, &replacement, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, replacement, string, count, RE_SUBN, pos, endpos, conc); } /* PatternObject's 'subfn' method. */ static PyObject* pattern_subfn(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; PyObject* format; PyObject* string; Py_ssize_t count = 0; PyObject* pos = Py_None; PyObject* endpos = Py_None; PyObject* concurrent = Py_None; static char* kwlist[] = { "format", "string", "count", "pos", "endpos", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nOOO:subn", kwlist, &format, &string, &count, &pos, &endpos, &concurrent)) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; return pattern_subx(self, format, string, count, RE_SUBF | RE_SUBN, pos, endpos, conc); } /* PatternObject's 'split' method. */ static PyObject* pattern_split(PatternObject* self, PyObject* args, PyObject* kwargs) { int conc; RE_State state; RE_SafeState safe_state; PyObject* list; PyObject* item; int status; Py_ssize_t split_count; Py_ssize_t g; Py_ssize_t start_pos; Py_ssize_t end_pos; Py_ssize_t step; Py_ssize_t last_pos; PyObject* string; Py_ssize_t maxsplit = 0; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "maxsplit", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO:split", kwlist, &string, &maxsplit, &concurrent)) return NULL; if (maxsplit == 0) maxsplit = PY_SSIZE_T_MAX; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* The MatchObject, and therefore repeated captures, will not be visible. */ if (!state_init(&state, self, string, 0, PY_SSIZE_T_MAX, FALSE, conc, FALSE, FALSE, FALSE)) return NULL; /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; list = PyList_New(0); if (!list) { state_fini(&state); return NULL; } split_count = 0; if (state.reverse) { start_pos = state.text_length; end_pos = 0; step = -1; } else { start_pos = 0; end_pos = state.text_length; step = 1; } last_pos = start_pos; while (split_count < maxsplit) { status = do_match(&safe_state, TRUE); if (status < 0) goto error; if (status == 0) /* No more matches. */ break; if (state.version_0) { /* Version 0 behaviour is to advance one character if the split was * zero-width. Unfortunately, this can give an incorrect result. * GvR wants this behaviour to be retained so as not to break any * existing software which might rely on it. */ if (state.text_pos == state.match_pos) { if (last_pos == end_pos) break; /* Advance one character. */ state.text_pos += step; state.must_advance = FALSE; continue; } } /* Get segment before this match. */ if (state.reverse) item = get_slice(string, state.match_pos, last_pos); else item = get_slice(string, last_pos, state.match_pos); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; /* Add groups (if any). */ for (g = 1; g <= self->public_group_count; g++) { item = state_get_group(&state, g, string, FALSE); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; } ++split_count; last_pos = state.text_pos; /* Version 0 behaviour is to advance one character if the match was * zero-width. Unfortunately, this can give an incorrect result. GvR * wants this behaviour to be retained so as not to break any existing * software which might rely on it. */ if (state.version_0) { if (state.text_pos == state.match_pos) /* Advance one character. */ state.text_pos += step; state.must_advance = FALSE; } else /* Continue from where we left off, but don't allow a contiguous * zero-width match. */ state.must_advance = TRUE; } /* Get segment following last match (even if empty). */ if (state.reverse) item = get_slice(string, 0, last_pos); else item = get_slice(string, last_pos, state.text_length); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; state_fini(&state); return list; error: Py_DECREF(list); state_fini(&state); return NULL; } /* PatternObject's 'splititer' method. */ static PyObject* pattern_splititer(PatternObject* pattern, PyObject* args, PyObject* kwargs) { return pattern_splitter(pattern, args, kwargs); } /* PatternObject's 'findall' method. */ static PyObject* pattern_findall(PatternObject* self, PyObject* args, PyObject* kwargs) { Py_ssize_t start; Py_ssize_t end; RE_State state; int conc; RE_SafeState safe_state; PyObject* list; Py_ssize_t step; int status; Py_ssize_t g; Py_ssize_t b; Py_ssize_t e; PyObject* string; PyObject* pos = Py_None; PyObject* endpos = Py_None; Py_ssize_t overlapped = FALSE; PyObject* concurrent = Py_None; static char* kwlist[] = { "string", "pos", "endpos", "overlapped", "concurrent", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOnO:findall", kwlist, &string, &pos, &endpos, &overlapped, &concurrent)) return NULL; start = as_string_index(pos, 0); if (start == -1 && PyErr_Occurred()) return NULL; end = as_string_index(endpos, PY_SSIZE_T_MAX); if (end == -1 && PyErr_Occurred()) return NULL; conc = decode_concurrent(concurrent); if (conc < 0) return NULL; /* The MatchObject, and therefore repeated captures, will not be visible. */ if (!state_init(&state, self, string, start, end, overlapped != 0, conc, FALSE, FALSE, FALSE)) return NULL; /* Initialise the "safe state" structure. */ safe_state.re_state = &state; safe_state.thread_state = NULL; list = PyList_New(0); if (!list) { state_fini(&state); return NULL; } step = state.reverse ? -1 : 1; while (state.slice_start <= state.text_pos && state.text_pos <= state.slice_end) { PyObject* item; status = do_match(&safe_state, TRUE); if (status < 0) goto error; if (status == 0) break; /* Don't bother to build a MatchObject. */ switch (self->public_group_count) { case 0: if (state.reverse) { b = state.text_pos; e = state.match_pos; } else { b = state.match_pos; e = state.text_pos; } item = get_slice(string, b, e); if (!item) goto error; break; case 1: item = state_get_group(&state, 1, string, TRUE); if (!item) goto error; break; default: item = PyTuple_New(self->public_group_count); if (!item) goto error; for (g = 0; g < self->public_group_count; g++) { PyObject* o = state_get_group(&state, g + 1, string, TRUE); if (!o) { Py_DECREF(item); goto error; } PyTuple_SET_ITEM(item, g, o); } break; } status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; if (state.overlapped) { /* Advance one character. */ state.text_pos = state.match_pos + step; state.must_advance = FALSE; } else /* Continue from where we left off, but don't allow 2 contiguous * zero-width matches. */ state.must_advance = state.text_pos == state.match_pos; } state_fini(&state); return list; error: Py_DECREF(list); state_fini(&state); return NULL; } /* PatternObject's 'finditer' method. */ static PyObject* pattern_finditer(PatternObject* pattern, PyObject* args, PyObject* kwargs) { return pattern_scanner(pattern, args, kwargs); } /* Makes a copy of a PatternObject. */ Py_LOCAL_INLINE(PyObject*) make_pattern_copy(PatternObject* self) { Py_INCREF(self); return (PyObject*)self; } /* PatternObject's '__copy__' method. */ static PyObject* pattern_copy(PatternObject* self, PyObject *unused) { return make_pattern_copy(self); } /* PatternObject's '__deepcopy__' method. */ static PyObject* pattern_deepcopy(PatternObject* self, PyObject* memo) { return make_pattern_copy(self); } /* The documentation of a PatternObject. */ PyDoc_STRVAR(pattern_match_doc, "match(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None.\n\ Match zero or more characters at the beginning of the string."); PyDoc_STRVAR(pattern_fullmatch_doc, "fullmatch(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None.\n\ Match zero or more characters against all of the string."); PyDoc_STRVAR(pattern_search_doc, "search(string, pos=None, endpos=None, concurrent=None) --> MatchObject or None.\n\ Search through string looking for a match, and return a corresponding\n\ match object instance. Return None if no match is found."); PyDoc_STRVAR(pattern_sub_doc, "sub(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring\n\ Return the string obtained by replacing the leftmost (or rightmost with a\n\ reverse pattern) non-overlapping occurrences of pattern in string by the\n\ replacement repl."); PyDoc_STRVAR(pattern_subf_doc, "subf(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> newstring\n\ Return the string obtained by replacing the leftmost (or rightmost with a\n\ reverse pattern) non-overlapping occurrences of pattern in string by the\n\ replacement format."); PyDoc_STRVAR(pattern_subn_doc, "subn(repl, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs)\n\ Return the tuple (new_string, number_of_subs_made) found by replacing the\n\ leftmost (or rightmost with a reverse pattern) non-overlapping occurrences\n\ of pattern with the replacement repl."); PyDoc_STRVAR(pattern_subfn_doc, "subfn(format, string, count=0, flags=0, pos=None, endpos=None, concurrent=None) --> (newstring, number of subs)\n\ Return the tuple (new_string, number_of_subs_made) found by replacing the\n\ leftmost (or rightmost with a reverse pattern) non-overlapping occurrences\n\ of pattern with the replacement format."); PyDoc_STRVAR(pattern_split_doc, "split(string, string, maxsplit=0, concurrent=None) --> list.\n\ Split string by the occurrences of pattern."); PyDoc_STRVAR(pattern_splititer_doc, "splititer(string, maxsplit=0, concurrent=None) --> iterator.\n\ Return an iterator yielding the parts of a split string."); PyDoc_STRVAR(pattern_findall_doc, "findall(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> list.\n\ Return a list of all matches of pattern in string. The matches may be\n\ overlapped if overlapped is True."); PyDoc_STRVAR(pattern_finditer_doc, "finditer(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> iterator.\n\ Return an iterator over all matches for the RE pattern in string. The\n\ matches may be overlapped if overlapped is True. For each match, the\n\ iterator returns a MatchObject."); PyDoc_STRVAR(pattern_scanner_doc, "scanner(string, pos=None, endpos=None, overlapped=False, concurrent=None) --> scanner.\n\ Return an scanner for the RE pattern in string. The matches may be overlapped\n\ if overlapped is True."); /* The methods of a PatternObject. */ static PyMethodDef pattern_methods[] = { {"match", (PyCFunction)pattern_match, METH_VARARGS|METH_KEYWORDS, pattern_match_doc}, {"fullmatch", (PyCFunction)pattern_fullmatch, METH_VARARGS|METH_KEYWORDS, pattern_fullmatch_doc}, {"search", (PyCFunction)pattern_search, METH_VARARGS|METH_KEYWORDS, pattern_search_doc}, {"sub", (PyCFunction)pattern_sub, METH_VARARGS|METH_KEYWORDS, pattern_sub_doc}, {"subf", (PyCFunction)pattern_subf, METH_VARARGS|METH_KEYWORDS, pattern_subf_doc}, {"subn", (PyCFunction)pattern_subn, METH_VARARGS|METH_KEYWORDS, pattern_subn_doc}, {"subfn", (PyCFunction)pattern_subfn, METH_VARARGS|METH_KEYWORDS, pattern_subfn_doc}, {"split", (PyCFunction)pattern_split, METH_VARARGS|METH_KEYWORDS, pattern_split_doc}, {"splititer", (PyCFunction)pattern_splititer, METH_VARARGS|METH_KEYWORDS, pattern_splititer_doc}, {"findall", (PyCFunction)pattern_findall, METH_VARARGS|METH_KEYWORDS, pattern_findall_doc}, {"finditer", (PyCFunction)pattern_finditer, METH_VARARGS|METH_KEYWORDS, pattern_finditer_doc}, {"scanner", (PyCFunction)pattern_scanner, METH_VARARGS|METH_KEYWORDS, pattern_scanner_doc}, {"__copy__", (PyCFunction)pattern_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction)pattern_deepcopy, METH_O}, {NULL, NULL} }; PyDoc_STRVAR(pattern_doc, "Compiled regex object"); /* Deallocates a PatternObject. */ static void pattern_dealloc(PyObject* self_) { PatternObject* self; Py_ssize_t i; self = (PatternObject*)self_; /* Discard the nodes. */ for (i = 0; i < self->node_count; i++) { RE_Node* node; node = self->node_list[i]; re_dealloc(node->values); if (node->status & RE_STATUS_STRING) { re_dealloc(node->string.bad_character_offset); re_dealloc(node->string.good_suffix_offset); } re_dealloc(node); } re_dealloc(self->node_list); /* Discard the group info. */ re_dealloc(self->group_info); /* Discard the call_ref info. */ re_dealloc(self->call_ref_info); /* Discard the repeat info. */ re_dealloc(self->repeat_info); dealloc_groups(self->groups_storage, self->true_group_count); dealloc_repeats(self->repeats_storage, self->repeat_count); if (self->weakreflist) PyObject_ClearWeakRefs((PyObject*)self); Py_XDECREF(self->pattern); Py_XDECREF(self->groupindex); Py_XDECREF(self->indexgroup); Py_DECREF(self->named_lists); Py_DECREF(self->named_list_indexes); PyObject_DEL(self); } typedef struct RE_FlagName { char* name; int value; } RE_FlagName; /* We won't bother about the U flag in Python 3. */ static RE_FlagName flag_names[] = { {"A", RE_FLAG_ASCII}, {"B", RE_FLAG_BESTMATCH}, {"D", RE_FLAG_DEBUG}, {"S", RE_FLAG_DOTALL}, {"F", RE_FLAG_FULLCASE}, {"I", RE_FLAG_IGNORECASE}, {"L", RE_FLAG_LOCALE}, {"M", RE_FLAG_MULTILINE}, {"R", RE_FLAG_REVERSE}, {"T", RE_FLAG_TEMPLATE}, {"X", RE_FLAG_VERBOSE}, {"V0", RE_FLAG_VERSION0}, {"V1", RE_FLAG_VERSION1}, {"W", RE_FLAG_WORD}, }; /* Appends a string to a list. */ Py_LOCAL_INLINE(BOOL) append_string(PyObject* list, char* string) { PyObject* item; int status; item = Py_BuildValue("U", string); if (!item) return FALSE; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) return FALSE; return TRUE; } /* Appends a (decimal) integer to a list. */ Py_LOCAL_INLINE(BOOL) append_integer(PyObject* list, Py_ssize_t value) { PyObject* int_obj; PyObject* repr_obj; int status; int_obj = Py_BuildValue("n", value); if (!int_obj) return FALSE; repr_obj = PyObject_Repr(int_obj); Py_DECREF(int_obj); if (!repr_obj) return FALSE; status = PyList_Append(list, repr_obj); Py_DECREF(repr_obj); if (status < 0) return FALSE; return TRUE; } /* MatchObject's '__repr__' method. */ static PyObject* match_repr(PyObject* self_) { MatchObject* self; PyObject* list; PyObject* matched_substring; PyObject* matched_repr; int status; PyObject* separator; PyObject* result; self = (MatchObject*)self_; list = PyList_New(0); if (!list) return NULL; if (!append_string(list, "match_start)) goto error; if (! append_string(list, ", ")) goto error; if (!append_integer(list, self->match_end)) goto error; if (!append_string(list, "), match=")) goto error; matched_substring = get_slice(self->substring, self->match_start - self->substring_offset, self->match_end - self->substring_offset); if (!matched_substring) goto error; matched_repr = PyObject_Repr(matched_substring); Py_DECREF(matched_substring); if (!matched_repr) goto error; status = PyList_Append(list, matched_repr); Py_DECREF(matched_repr); if (status < 0) goto error; if (! append_string(list, ">")) goto error; separator = Py_BuildValue("U", ""); if (!separator) goto error; result = PyUnicode_Join(separator, list); Py_DECREF(separator); Py_DECREF(list); return result; error: Py_DECREF(list); return NULL; } /* PatternObject's '__repr__' method. */ static PyObject* pattern_repr(PyObject* self_) { PatternObject* self; PyObject* list; PyObject* item; int status; int flag_count; Py_ssize_t i; PyObject *key; PyObject *value; PyObject* separator; PyObject* result; self = (PatternObject*)self_; list = PyList_New(0); if (!list) return NULL; if (!append_string(list, "regex.Regex(")) goto error; item = PyObject_Repr(self->pattern); if (!item) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; flag_count = 0; for (i = 0; i < sizeof(flag_names) / sizeof(flag_names[0]); i++) { if (self->flags & flag_names[i].value) { if (flag_count == 0) { if (!append_string(list, ", flags=")) goto error; } else { if (!append_string(list, " | ")) goto error; } if (!append_string(list, "regex.")) goto error; if (!append_string(list, flag_names[i].name)) goto error; ++flag_count; } } i = 0; while (PyDict_Next(self->named_lists, &i, &key, &value)) { if (!append_string(list, ", ")) goto error; status = PyList_Append(list, key); if (status < 0) goto error; item = PyObject_Repr(value); if (!item) goto error; if (!append_string(list, "=")) goto error; status = PyList_Append(list, item); Py_DECREF(item); if (status < 0) goto error; } if (!append_string(list, ")")) goto error; separator = Py_BuildValue("U", ""); if (!separator) goto error; result = PyUnicode_Join(separator, list); Py_DECREF(separator); Py_DECREF(list); return result; error: Py_DECREF(list); return NULL; } /* PatternObject's 'groupindex' method. */ static PyObject* pattern_groupindex(PyObject* self_) { PatternObject* self; self = (PatternObject*)self_; return PyDict_Copy(self->groupindex); } static PyGetSetDef pattern_getset[] = { {"groupindex", (getter)pattern_groupindex, (setter)NULL, "A dictionary mapping group names to group numbers."}, {NULL} /* Sentinel */ }; static PyMemberDef pattern_members[] = { {"pattern", T_OBJECT, offsetof(PatternObject, pattern), READONLY, "The pattern string from which the regex object was compiled."}, {"flags", T_PYSSIZET, offsetof(PatternObject, flags), READONLY, "The regex matching flags."}, {"groups", T_PYSSIZET, offsetof(PatternObject, public_group_count), READONLY, "The number of capturing groups in the pattern."}, {"named_lists", T_OBJECT, offsetof(PatternObject, named_lists), READONLY, "The named lists used by the regex."}, {NULL} /* Sentinel */ }; static PyTypeObject Pattern_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_" RE_MODULE "." "Pattern", sizeof(PatternObject) }; /* Building the nodes is made simpler by allowing branches to have a single * exit. These need to be removed. */ Py_LOCAL_INLINE(void) skip_one_way_branches(PatternObject* pattern) { BOOL modified; /* If a node refers to a 1-way branch then make the former refer to the * latter's destination. Repeat until they're all done. */ do { Py_ssize_t i; modified = FALSE; for (i = 0; i < pattern->node_count; i++) { RE_Node* node; RE_Node* next; node = pattern->node_list[i]; /* Check the first destination. */ next = node->next_1.node; if (next && next->op == RE_OP_BRANCH && !next->nonstring.next_2.node) { node->next_1.node = next->next_1.node; modified = TRUE; } /* Check the second destination. */ next = node->nonstring.next_2.node; if (next && next->op == RE_OP_BRANCH && !next->nonstring.next_2.node) { node->nonstring.next_2.node = next->next_1.node; modified = TRUE; } } } while (modified); /* The start node might be a 1-way branch. Skip over it because it'll be * removed. It might even be the first in a chain. */ while (pattern->start_node->op == RE_OP_BRANCH && !pattern->start_node->nonstring.next_2.node) pattern->start_node = pattern->start_node->next_1.node; } /* Adds guards to repeats which are followed by a reference to a group. * * Returns whether a guard was added for a node at or after the given node. */ Py_LOCAL_INLINE(RE_STATUS_T) add_repeat_guards(PatternObject* pattern, RE_Node* node) { RE_STATUS_T result; result = RE_STATUS_NEITHER; for (;;) { if (node->status & RE_STATUS_VISITED_AG) return node->status & (RE_STATUS_REPEAT | RE_STATUS_REF); switch (node->op) { case RE_OP_ATOMIC: case RE_OP_LOOKAROUND: { RE_STATUS_T body_result; RE_STATUS_T tail_result; RE_STATUS_T status; body_result = add_repeat_guards(pattern, node->nonstring.next_2.node); tail_result = add_repeat_guards(pattern, node->next_1.node); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, body_result), tail_result); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_BRANCH: { RE_STATUS_T branch_1_result; RE_STATUS_T branch_2_result; RE_STATUS_T status; branch_1_result = add_repeat_guards(pattern, node->next_1.node); branch_2_result = add_repeat_guards(pattern, node->nonstring.next_2.node); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, branch_1_result), branch_2_result); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_END_GREEDY_REPEAT: case RE_OP_END_LAZY_REPEAT: node->status |= RE_STATUS_VISITED_AG; return result; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: { BOOL limited; RE_STATUS_T body_result; RE_STATUS_T tail_result; RE_RepeatInfo* repeat_info; RE_STATUS_T status; limited = node->values[2] != RE_UNLIMITED; if (limited) body_result = RE_STATUS_LIMITED; else body_result = add_repeat_guards(pattern, node->next_1.node); tail_result = add_repeat_guards(pattern, node->nonstring.next_2.node); repeat_info = &pattern->repeat_info[node->values[0]]; if (body_result != RE_STATUS_REF) repeat_info->status |= RE_STATUS_BODY; if (tail_result != RE_STATUS_REF) repeat_info->status |= RE_STATUS_TAIL; if (limited) result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_LIMITED); else result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_REPEAT); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, body_result), tail_result); node->status |= RE_STATUS_VISITED_AG | status; return status; } case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: { BOOL limited; RE_STATUS_T tail_result; RE_RepeatInfo* repeat_info; RE_STATUS_T status; limited = node->values[2] != RE_UNLIMITED; tail_result = add_repeat_guards(pattern, node->next_1.node); repeat_info = &pattern->repeat_info[node->values[0]]; repeat_info->status |= RE_STATUS_BODY; if (tail_result != RE_STATUS_REF) repeat_info->status |= RE_STATUS_TAIL; if (limited) result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_LIMITED); else result = (RE_STATUS_T)RE_MAX(result, RE_STATUS_REPEAT); status = (RE_STATUS_T)RE_MAX(RE_MAX(result, RE_STATUS_REPEAT), tail_result); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_GROUP_EXISTS: { RE_STATUS_T branch_1_result; RE_STATUS_T branch_2_result; RE_STATUS_T status; branch_1_result = add_repeat_guards(pattern, node->next_1.node); branch_2_result = add_repeat_guards(pattern, node->nonstring.next_2.node); status = (RE_STATUS_T)RE_MAX(RE_MAX(RE_MAX(result, branch_1_result), branch_2_result), RE_STATUS_REF); node->status = RE_STATUS_VISITED_AG | status; return status; } case RE_OP_GROUP_CALL: case RE_OP_REF_GROUP: case RE_OP_REF_GROUP_FLD: case RE_OP_REF_GROUP_FLD_REV: case RE_OP_REF_GROUP_IGN: case RE_OP_REF_GROUP_IGN_REV: case RE_OP_REF_GROUP_REV: result = RE_STATUS_REF; node = node->next_1.node; break; case RE_OP_SUCCESS: node->status = RE_STATUS_VISITED_AG | result; return result; default: node = node->next_1.node; break; } } } /* Adds an index to a node's values unless it's already present. * * 'offset' is the offset of the index count within the values. */ Py_LOCAL_INLINE(BOOL) add_index(RE_Node* node, size_t offset, RE_CODE index) { size_t index_count; size_t first_index; size_t i; RE_CODE* new_values; if (!node) return TRUE; index_count = node->values[offset]; first_index = offset + 1; /* Is the index already present? */ for (i = 0; i < index_count; i++) { if (node->values[first_index + i] == index) return TRUE; } /* Allocate more space for the new index. */ new_values = re_realloc(node->values, (node->value_count + 1) * sizeof(RE_CODE)); if (!new_values) return FALSE; ++node->value_count; node->values = new_values; node->values[first_index + node->values[offset]++] = index; return TRUE; } /* Records the index of every repeat and fuzzy section within atomic * subpatterns and lookarounds. */ Py_LOCAL_INLINE(BOOL) record_subpattern_repeats_and_fuzzy_sections(RE_Node* parent_node, size_t offset, size_t repeat_count, RE_Node* node) { while (node) { if (node->status & RE_STATUS_VISITED_REP) return TRUE; node->status |= RE_STATUS_VISITED_REP; switch (node->op) { case RE_OP_ATOMIC: if (!record_subpattern_repeats_and_fuzzy_sections(node, 0, repeat_count, node->nonstring.next_2.node)) return FALSE; node = node->next_1.node; break; case RE_OP_BRANCH: if (!record_subpattern_repeats_and_fuzzy_sections(parent_node, offset, repeat_count, node->next_1.node)) return FALSE; node = node->nonstring.next_2.node; break; case RE_OP_END_FUZZY: node = node->next_1.node; break; case RE_OP_END_GREEDY_REPEAT: case RE_OP_END_LAZY_REPEAT: return TRUE; case RE_OP_FUZZY: /* Record the fuzzy index. */ if (!add_index(parent_node, offset, (RE_CODE)repeat_count + node->values[0])) return FALSE; node = node->next_1.node; break; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: /* Record the repeat index. */ if (!add_index(parent_node, offset, node->values[0])) return FALSE; if (!record_subpattern_repeats_and_fuzzy_sections(parent_node, offset, repeat_count, node->next_1.node)) return FALSE; node = node->nonstring.next_2.node; break; case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: /* Record the repeat index. */ if (!add_index(parent_node, offset, node->values[0])) return FALSE; node = node->next_1.node; break; case RE_OP_GROUP_EXISTS: if (!record_subpattern_repeats_and_fuzzy_sections(parent_node, offset, repeat_count, node->next_1.node)) return FALSE; node = node->nonstring.next_2.node; break; case RE_OP_LOOKAROUND: if (!record_subpattern_repeats_and_fuzzy_sections(node, 1, repeat_count, node->nonstring.next_2.node)) return FALSE; node = node->next_1.node; break; default: node = node->next_1.node; break; } } return TRUE; } /* Marks nodes which are being used as used. */ Py_LOCAL_INLINE(void) use_nodes(RE_Node* node) { while (node && !(node->status & RE_STATUS_USED)) { node->status |= RE_STATUS_USED; if (!(node->status & RE_STATUS_STRING)) { if (node->nonstring.next_2.node) use_nodes(node->nonstring.next_2.node); } node = node->next_1.node; } } /* Discards any unused nodes. * * Optimising the nodes might result in some nodes no longer being used. */ Py_LOCAL_INLINE(void) discard_unused_nodes(PatternObject* pattern) { size_t new_count; Py_ssize_t i; /* Mark the nodes which are being used. */ use_nodes(pattern->start_node); for (i = 0; i < pattern->call_ref_info_capacity; i++) use_nodes(pattern->call_ref_info[i].node); new_count = 0; for (i = 0; i < pattern->node_count; i++) { RE_Node* node; node = pattern->node_list[i]; if (node->status & RE_STATUS_USED) pattern->node_list[new_count++] = node; else { re_dealloc(node->values); if (node->status & RE_STATUS_STRING) { re_dealloc(node->string.bad_character_offset); re_dealloc(node->string.good_suffix_offset); } re_dealloc(node); } } pattern->node_count = new_count; } /* Marks all the group which are named. */ Py_LOCAL_INLINE(BOOL) mark_named_groups(PatternObject* pattern) { Py_ssize_t i; for (i = 0; i < pattern->public_group_count; i++) { RE_GroupInfo* group_info; PyObject* index; group_info = &pattern->group_info[i]; index = Py_BuildValue("n", i + 1); if (!index) return FALSE; group_info->has_name = (BOOL)PyDict_Contains(pattern->indexgroup, index); Py_DECREF(index); } return TRUE; } /* Gets the test node. * * The test node lets the matcher look ahead in the pattern, allowing it to * avoid the cost of housekeeping, only to find that what follows doesn't match * anyway. */ Py_LOCAL_INLINE(void) set_test_node(RE_NextNode* next) { RE_Node* node = next->node; RE_Node* test; next->test = node; next->match_next = node; next->match_step = 0; if (!node) return; test = node; while (test->op == RE_OP_END_GROUP || test->op == RE_OP_START_GROUP) test = test->next_1.node; next->test = test; if (test != node) return; switch (test->op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: case RE_OP_BOUNDARY: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_DEFAULT_BOUNDARY: case RE_OP_DEFAULT_END_OF_WORD: case RE_OP_DEFAULT_START_OF_WORD: case RE_OP_END_OF_LINE: case RE_OP_END_OF_LINE_U: case RE_OP_END_OF_STRING: case RE_OP_END_OF_STRING_LINE: case RE_OP_END_OF_STRING_LINE_U: case RE_OP_END_OF_WORD: case RE_OP_GRAPHEME_BOUNDARY: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SEARCH_ANCHOR: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: case RE_OP_START_OF_LINE: case RE_OP_START_OF_LINE_U: case RE_OP_START_OF_STRING: case RE_OP_START_OF_WORD: case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: next->match_next = test->next_1.node; next->match_step = test->step; break; case RE_OP_GREEDY_REPEAT_ONE: case RE_OP_LAZY_REPEAT_ONE: if (test->values[1] > 0) next->test = test; break; } } /* Sets the test nodes. */ Py_LOCAL_INLINE(void) set_test_nodes(PatternObject* pattern) { RE_Node** node_list; Py_ssize_t i; node_list = pattern->node_list; for (i = 0; i < pattern->node_count; i++) { RE_Node* node; node = node_list[i]; set_test_node(&node->next_1); if (!(node->status & RE_STATUS_STRING)) set_test_node(&node->nonstring.next_2); } } /* Optimises the pattern. */ Py_LOCAL_INLINE(BOOL) optimise_pattern(PatternObject* pattern) { Py_ssize_t i; /* Building the nodes is made simpler by allowing branches to have a single * exit. These need to be removed. */ skip_one_way_branches(pattern); /* Add position guards for repeat bodies containing a reference to a group * or repeat tails followed at some point by a reference to a group. */ add_repeat_guards(pattern, pattern->start_node); /* Record the index of repeats and fuzzy sections within the body of atomic * and lookaround nodes. */ if (!record_subpattern_repeats_and_fuzzy_sections(NULL, 0, pattern->repeat_count, pattern->start_node)) return FALSE; for (i = 0; i < pattern->call_ref_info_count; i++) { RE_Node* node; node = pattern->call_ref_info[i].node; if (!record_subpattern_repeats_and_fuzzy_sections(NULL, 0, pattern->repeat_count, node)) return FALSE; } /* Discard any unused nodes. */ discard_unused_nodes(pattern); /* Set the test nodes. */ set_test_nodes(pattern); /* Mark all the group that are named. */ if (!mark_named_groups(pattern)) return FALSE; return TRUE; } /* Creates a new pattern node. */ Py_LOCAL_INLINE(RE_Node*) create_node(PatternObject* pattern, RE_UINT8 op, RE_CODE flags, Py_ssize_t step, size_t value_count) { RE_Node* node; node = (RE_Node*)re_alloc(sizeof(*node)); if (!node) return NULL; memset(node, 0, sizeof(RE_Node)); node->value_count = value_count; if (node->value_count > 0) { node->values = (RE_CODE*)re_alloc(node->value_count * sizeof(RE_CODE)); if (!node->values) goto error; } else node->values = NULL; node->op = op; node->match = (flags & RE_POSITIVE_OP) != 0; node->status = (RE_STATUS_T)(flags << RE_STATUS_SHIFT); node->step = step; /* Ensure that there's enough storage to record the new node. */ if (pattern->node_count >= pattern->node_capacity) { RE_Node** new_node_list; pattern->node_capacity *= 2; if (pattern->node_capacity == 0) pattern->node_capacity = RE_INIT_NODE_LIST_SIZE; new_node_list = (RE_Node**)re_realloc(pattern->node_list, pattern->node_capacity * sizeof(RE_Node*)); if (!new_node_list) goto error; pattern->node_list = new_node_list; } /* Record the new node. */ pattern->node_list[pattern->node_count++] = node; return node; error: re_dealloc(node->values); re_dealloc(node); return NULL; } /* Adds a node as a next node for another node. */ Py_LOCAL_INLINE(void) add_node(RE_Node* node_1, RE_Node* node_2) { if (!node_1->next_1.node) node_1->next_1.node = node_2; else node_1->nonstring.next_2.node = node_2; } /* Ensures that the entry for a group's details actually exists. */ Py_LOCAL_INLINE(BOOL) ensure_group(PatternObject* pattern, Py_ssize_t group) { Py_ssize_t old_capacity; Py_ssize_t new_capacity; RE_GroupInfo* new_group_info; if (group <= pattern->true_group_count) /* We already have an entry for the group. */ return TRUE; /* Increase the storage capacity to include the new entry if it's * insufficient. */ old_capacity = pattern->group_info_capacity; new_capacity = pattern->group_info_capacity; while (group > new_capacity) new_capacity += RE_LIST_SIZE_INC; if (new_capacity > old_capacity) { new_group_info = (RE_GroupInfo*)re_realloc(pattern->group_info, new_capacity * sizeof(RE_GroupInfo)); if (!new_group_info) return FALSE; memset(new_group_info + old_capacity, 0, (new_capacity - old_capacity) * sizeof(RE_GroupInfo)); pattern->group_info = new_group_info; pattern->group_info_capacity = new_capacity; } pattern->true_group_count = group; return TRUE; } /* Records that there's a reference to a group. */ Py_LOCAL_INLINE(BOOL) record_ref_group(PatternObject* pattern, RE_CODE group) { if (!ensure_group(pattern, group)) return FALSE; pattern->group_info[group - 1].referenced = TRUE; return TRUE; } /* Records that there's a new group. */ Py_LOCAL_INLINE(BOOL) record_group(PatternObject* pattern, RE_CODE group, RE_Node* node) { if (!ensure_group(pattern, group)) return FALSE; if (group >= 1) { RE_GroupInfo* info; info = &pattern->group_info[group - 1]; info->end_index = pattern->true_group_count; info->node = node; } return TRUE; } /* Records that a group has closed. */ Py_LOCAL_INLINE(void) record_group_end(PatternObject* pattern, RE_CODE group) { if (group >= 1) pattern->group_info[group - 1].end_index = ++pattern->group_end_index; } /* Ensures that the entry for a call_ref's details actually exists. */ Py_LOCAL_INLINE(BOOL) ensure_call_ref(PatternObject* pattern, Py_ssize_t call_ref) { Py_ssize_t old_capacity; Py_ssize_t new_capacity; RE_CallRefInfo* new_call_ref_info; if (call_ref < pattern->call_ref_info_count) /* We already have an entry for the call_ref. */ return TRUE; /* Increase the storage capacity to include the new entry if it's * insufficient. */ old_capacity = pattern->call_ref_info_capacity; new_capacity = pattern->call_ref_info_capacity; while (call_ref >= new_capacity) new_capacity += RE_LIST_SIZE_INC; if (new_capacity > old_capacity) { new_call_ref_info = (RE_CallRefInfo*)re_realloc(pattern->call_ref_info, new_capacity * sizeof(RE_CallRefInfo)); if (!new_call_ref_info) return FALSE; memset(new_call_ref_info + old_capacity, 0, (new_capacity - old_capacity) * sizeof(RE_CallRefInfo)); pattern->call_ref_info = new_call_ref_info; pattern->call_ref_info_capacity = new_capacity; } pattern->call_ref_info_count = 1 + call_ref; return TRUE; } /* Records that a call_ref is defined. */ Py_LOCAL_INLINE(BOOL) record_call_ref_defined(PatternObject* pattern, RE_CODE call_ref, RE_Node* node) { if (!ensure_call_ref(pattern, call_ref)) return FALSE; pattern->call_ref_info[call_ref].defined = TRUE; pattern->call_ref_info[call_ref].node = node; return TRUE; } /* Records that a call_ref is used. */ Py_LOCAL_INLINE(BOOL) record_call_ref_used(PatternObject* pattern, RE_CODE call_ref) { if (!ensure_call_ref(pattern, call_ref)) return FALSE; pattern->call_ref_info[call_ref].used = TRUE; return TRUE; } /* Checks whether a node matches one and only one character. */ Py_LOCAL_INLINE(BOOL) sequence_matches_one(RE_Node* node) { while (node->op == RE_OP_BRANCH && !node->nonstring.next_2.node) node = node->next_1.node; if (node->next_1.node || (node->status & RE_STATUS_FUZZY)) return FALSE; switch (node->op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_REV: return TRUE; default: return FALSE; } } /* Records a repeat. */ Py_LOCAL_INLINE(BOOL) record_repeat(PatternObject* pattern, Py_ssize_t index, size_t repeat_depth) { Py_ssize_t old_capacity; Py_ssize_t new_capacity; /* Increase the storage capacity to include the new entry if it's * insufficient. */ old_capacity = pattern->repeat_info_capacity; new_capacity = pattern->repeat_info_capacity; while (index >= new_capacity) new_capacity += RE_LIST_SIZE_INC; if (new_capacity > old_capacity) { RE_RepeatInfo* new_repeat_info; new_repeat_info = (RE_RepeatInfo*)re_realloc(pattern->repeat_info, new_capacity * sizeof(RE_RepeatInfo)); if (!new_repeat_info) return FALSE; memset(new_repeat_info + old_capacity, 0, (new_capacity - old_capacity) * sizeof(RE_RepeatInfo)); pattern->repeat_info = new_repeat_info; pattern->repeat_info_capacity = new_capacity; } if (index >= pattern->repeat_count) pattern->repeat_count = index + 1; if (repeat_depth > 0) pattern->repeat_info[index].status |= RE_STATUS_INNER; return TRUE; } Py_LOCAL_INLINE(Py_ssize_t) get_step(RE_CODE op) { switch (op) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_U: case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_IGN: return 1; case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U_REV: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: return -1; } return 0; } Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args); /* Builds an ANY node. */ Py_LOCAL_INLINE(int) build_ANY(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; /* codes: opcode, flags. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); /* Create the node. */ node = create_node(args->pattern, op, flags, step, 0); if (!node) return RE_ERROR_MEMORY; args->code += 2; /* Append the node. */ add_node(args->end, node); args->end = node; ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a FUZZY node. */ Py_LOCAL_INLINE(int) build_FUZZY(RE_CompileArgs* args) { RE_CODE flags; RE_Node* start_node; RE_Node* end_node; RE_CODE index; RE_CompileArgs subargs; int status; /* codes: opcode, flags, constraints, sequence, end. */ if (args->code + 13 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; /* Create nodes for the start and end of the fuzzy sequence. */ start_node = create_node(args->pattern, RE_OP_FUZZY, flags, 0, 9); end_node = create_node(args->pattern, RE_OP_END_FUZZY, flags, 0, 5); if (!start_node || !end_node) return RE_ERROR_MEMORY; index = (RE_CODE)args->pattern->fuzzy_count++; start_node->values[0] = index; end_node->values[0] = index; /* The constraints consist of 4 pairs of limits and the cost equation. */ end_node->values[RE_FUZZY_VAL_MIN_DEL] = args->code[2]; /* Deletion minimum. */ end_node->values[RE_FUZZY_VAL_MIN_INS] = args->code[4]; /* Insertion minimum. */ end_node->values[RE_FUZZY_VAL_MIN_SUB] = args->code[6]; /* Substitution minimum. */ end_node->values[RE_FUZZY_VAL_MIN_ERR] = args->code[8]; /* Error minimum. */ start_node->values[RE_FUZZY_VAL_MAX_DEL] = args->code[3]; /* Deletion maximum. */ start_node->values[RE_FUZZY_VAL_MAX_INS] = args->code[5]; /* Insertion maximum. */ start_node->values[RE_FUZZY_VAL_MAX_SUB] = args->code[7]; /* Substitution maximum. */ start_node->values[RE_FUZZY_VAL_MAX_ERR] = args->code[9]; /* Error maximum. */ start_node->values[RE_FUZZY_VAL_DEL_COST] = args->code[10]; /* Deletion cost. */ start_node->values[RE_FUZZY_VAL_INS_COST] = args->code[11]; /* Insertion cost. */ start_node->values[RE_FUZZY_VAL_SUB_COST] = args->code[12]; /* Substitution cost. */ start_node->values[RE_FUZZY_VAL_MAX_COST] = args->code[13]; /* Total cost. */ args->code += 14; subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = TRUE; subargs.within_fuzzy = TRUE; /* Compile the sequence and check that we've reached the end of the * subpattern. */ status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; ++args->code; /* Append the fuzzy sequence. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); args->end = end_node; args->is_fuzzy = TRUE; return RE_ERROR_SUCCESS; } /* Builds an ATOMIC node. */ Py_LOCAL_INLINE(int) build_ATOMIC(RE_CompileArgs* args) { RE_Node* atomic_node; RE_CompileArgs subargs; RE_Node* success_node; int status; /* codes: opcode, sequence, end. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; atomic_node = create_node(args->pattern, RE_OP_ATOMIC, 0, 0, 1); if (!atomic_node) return RE_ERROR_MEMORY; /* The number of repeat indexes. */ atomic_node->values[0] = 0; ++args->code; subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; /* Compile the sequence and check that we've reached the end of the * subpattern. */ status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; /* Create the success node to terminate the subpattern. */ success_node = create_node(subargs.pattern, RE_OP_SUCCESS, 0, 0, 0); if (!success_node) return RE_ERROR_MEMORY; /* Append the SUCCESS node. */ add_node(subargs.end, success_node); /* Insert the subpattern. */ atomic_node->nonstring.next_2.node = subargs.start; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Append the node. */ add_node(args->end, atomic_node); args->end = atomic_node; return RE_ERROR_SUCCESS; } /* Builds a BOUNDARY node. */ Py_LOCAL_INLINE(int) build_BOUNDARY(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; RE_Node* node; /* codes: opcode, flags. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; args->code += 2; /* Create the node. */ node = create_node(args->pattern, op, flags, 0, 0); if (!node) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a BRANCH node. */ Py_LOCAL_INLINE(int) build_BRANCH(RE_CompileArgs* args) { RE_Node* branch_node; RE_Node* join_node; size_t smallest_min_width; RE_CompileArgs subargs; int status; /* codes: opcode, branch, next, branch, end. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; /* Create nodes for the start and end of the branch sequence. */ branch_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); join_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!branch_node || !join_node) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, branch_node); args->end = join_node; smallest_min_width = ~(size_t)0; subargs = *args; /* A branch in the regular expression is compiled into a series of 2-way * branches. */ do { RE_Node* next_branch_node; /* Skip over the 'BRANCH' or 'NEXT' opcode. */ ++subargs.code; /* Compile the sequence until the next 'BRANCH' or 'NEXT' opcode. */ subargs.min_width = 0; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; smallest_min_width = RE_MIN(smallest_min_width, subargs.min_width); args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; /* Append the sequence. */ add_node(branch_node, subargs.start); add_node(subargs.end, join_node); /* Create a start node for the next sequence and append it. */ next_branch_node = create_node(subargs.pattern, RE_OP_BRANCH, 0, 0, 0); if (!next_branch_node) return RE_ERROR_MEMORY; add_node(branch_node, next_branch_node); branch_node = next_branch_node; } while (subargs.code < subargs.end_code && subargs.code[0] == RE_OP_NEXT); /* We should have reached the end of the branch. */ if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; ++args->code; args->min_width += smallest_min_width; return RE_ERROR_SUCCESS; } /* Builds a CALL_REF node. */ Py_LOCAL_INLINE(int) build_CALL_REF(RE_CompileArgs* args) { RE_CODE call_ref; RE_Node* start_node; RE_Node* end_node; RE_CompileArgs subargs; int status; /* codes: opcode, call_ref. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; call_ref = args->code[1]; args->code += 2; /* Create nodes for the start and end of the subpattern. */ start_node = create_node(args->pattern, RE_OP_CALL_REF, 0, 0, 1); end_node = create_node(args->pattern, RE_OP_GROUP_RETURN, 0, 0, 0); if (!start_node || !end_node) return RE_ERROR_MEMORY; start_node->values[0] = call_ref; /* Compile the sequence and check that we've reached the end of the * subpattern. */ subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Record that we defined a call_ref. */ if (!record_call_ref_defined(args->pattern, call_ref, start_node)) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); args->end = end_node; return RE_ERROR_SUCCESS; } /* Builds a CHARACTER or PROPERTY node. */ Py_LOCAL_INLINE(int) build_CHARACTER_or_PROPERTY(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; /* codes: opcode, flags, value. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); if (flags & RE_ZEROWIDTH_OP) step = 0; /* Create the node. */ node = create_node(args->pattern, op, flags, step, 1); if (!node) return RE_ERROR_MEMORY; node->values[0] = args->code[2]; args->code += 3; /* Append the node. */ add_node(args->end, node); args->end = node; if (step != 0) ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a GROUP node. */ Py_LOCAL_INLINE(int) build_GROUP(RE_CompileArgs* args) { RE_CODE private_group; RE_CODE public_group; RE_Node* start_node; RE_Node* end_node; RE_CompileArgs subargs; int status; /* codes: opcode, private_group, public_group. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; private_group = args->code[1]; public_group = args->code[2]; args->code += 3; /* Create nodes for the start and end of the capture group. */ start_node = create_node(args->pattern, args->forward ? RE_OP_START_GROUP : RE_OP_END_GROUP, 0, 0, 3); end_node = create_node(args->pattern, args->forward ? RE_OP_END_GROUP : RE_OP_START_GROUP, 0, 0, 3); if (!start_node || !end_node) return RE_ERROR_MEMORY; start_node->values[0] = private_group; end_node->values[0] = private_group; start_node->values[1] = public_group; end_node->values[1] = public_group; /* Signal that the capture should be saved when it's complete. */ start_node->values[2] = 0; end_node->values[2] = 1; /* Record that we have a new capture group. */ if (!record_group(args->pattern, private_group, start_node)) return RE_ERROR_MEMORY; /* Compile the sequence and check that we've reached the end of the capture * group. */ subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures || subargs.visible_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Record that the capture group has closed. */ record_group_end(args->pattern, private_group); /* Append the capture group. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); args->end = end_node; return RE_ERROR_SUCCESS; } /* Builds a GROUP_CALL node. */ Py_LOCAL_INLINE(int) build_GROUP_CALL(RE_CompileArgs* args) { RE_CODE call_ref; RE_Node* node; /* codes: opcode, call_ref. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; call_ref = args->code[1]; /* Create the node. */ node = create_node(args->pattern, RE_OP_GROUP_CALL, 0, 0, 1); if (!node) return RE_ERROR_MEMORY; node->values[0] = call_ref; args->code += 2; /* Record that we used a call_ref. */ if (!record_call_ref_used(args->pattern, call_ref)) return RE_ERROR_MEMORY; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a GROUP_EXISTS node. */ Py_LOCAL_INLINE(int) build_GROUP_EXISTS(RE_CompileArgs* args) { RE_CODE group; RE_Node* start_node; RE_Node* end_node; RE_CompileArgs subargs; size_t min_width; int status; /* codes: opcode, sequence, next, sequence, end. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; group = args->code[1]; args->code += 2; /* Create nodes for the start and end of the structure. */ start_node = create_node(args->pattern, RE_OP_GROUP_EXISTS, 0, 0, 1); end_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!start_node || !end_node) return RE_ERROR_MEMORY; start_node->values[0] = group; subargs = *args; subargs.min_width = 0; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; min_width = subargs.min_width; /* Append the start node. */ add_node(args->end, start_node); add_node(start_node, subargs.start); add_node(subargs.end, end_node); if (args->code[0] == RE_OP_NEXT) { ++args->code; subargs.code = args->code; subargs.min_width = 0; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; min_width = RE_MIN(min_width, subargs.min_width); add_node(start_node, subargs.start); add_node(subargs.end, end_node); } else { add_node(start_node, end_node); min_width = 0; } args->min_width += min_width; if (args->code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; ++args->code; args->end = end_node; return RE_ERROR_SUCCESS; } /* Builds a LOOKAROUND node. */ Py_LOCAL_INLINE(int) build_LOOKAROUND(RE_CompileArgs* args) { RE_CODE flags; BOOL forward; RE_Node* lookaround_node; RE_Node* success_node; RE_CompileArgs subargs; int status; /* codes: opcode, flags, forward, sequence, end. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; forward = (BOOL)args->code[2]; /* Create a node for the lookaround. */ lookaround_node = create_node(args->pattern, RE_OP_LOOKAROUND, flags, 0, 2); if (!lookaround_node) return RE_ERROR_MEMORY; /* The number of repeat indexes. */ lookaround_node->values[1] = 0; args->code += 3; /* Compile the sequence and check that we've reached the end of the * subpattern. */ subargs = *args; subargs.forward = forward; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; lookaround_node->values[0] = subargs.has_captures; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Create the 'SUCCESS' node and append it to the subpattern. */ success_node = create_node(args->pattern, RE_OP_SUCCESS, 0, 0, 0); if (!success_node) return RE_ERROR_MEMORY; /* Append the SUCCESS node. */ add_node(subargs.end, success_node); /* Insert the subpattern into the node. */ lookaround_node->nonstring.next_2.node = subargs.start; /* Append the lookaround. */ add_node(args->end, lookaround_node); args->end = lookaround_node; return RE_ERROR_SUCCESS; } /* Builds a RANGE node. */ Py_LOCAL_INLINE(int) build_RANGE(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; /* codes: opcode, flags, lower, upper. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); if (flags & RE_ZEROWIDTH_OP) step = 0; /* Create the node. */ node = create_node(args->pattern, op, flags, step, 2); if (!node) return RE_ERROR_MEMORY; node->values[0] = args->code[2]; node->values[1] = args->code[3]; args->code += 4; /* Append the node. */ add_node(args->end, node); args->end = node; if (step != 0) ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a REF_GROUP node. */ Py_LOCAL_INLINE(int) build_REF_GROUP(RE_CompileArgs* args) { RE_CODE flags; RE_CODE group; RE_Node* node; /* codes: opcode, flags, group. */ if (args->code + 2 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; group = args->code[2]; node = create_node(args->pattern, (RE_UINT8)args->code[0], flags, 0, 1); if (!node) return RE_ERROR_MEMORY; node->values[0] = group; args->code += 3; /* Record that we have a reference to a group. */ if (!record_ref_group(args->pattern, group)) return RE_ERROR_MEMORY; /* Append the reference. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a REPEAT node. */ Py_LOCAL_INLINE(int) build_REPEAT(RE_CompileArgs* args) { BOOL greedy; RE_CODE min_count; RE_CODE max_count; int status; /* codes: opcode, min_count, max_count, sequence, end. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; /* This includes special cases such as optional items, which we'll check * for and treat specially. They don't need repeat counts, which helps us * avoid unnecessary work when matching. */ greedy = args->code[0] == RE_OP_GREEDY_REPEAT; min_count = args->code[1]; max_count = args->code[2]; if (min_count > max_count) return RE_ERROR_ILLEGAL; args->code += 3; if (min_count == 0 && max_count == 1) { /* Optional sequence. */ RE_Node* branch_node; RE_Node* join_node; RE_CompileArgs subargs; /* Create the start and end nodes. */ branch_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); join_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!branch_node || !join_node) return RE_ERROR_MEMORY; /* Compile the sequence and check that we've reached the end of it. */ subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; if (greedy) { /* It's a greedy option. */ add_node(branch_node, subargs.start); add_node(branch_node, join_node); } else { /* It's a lazy option. */ add_node(branch_node, join_node); add_node(branch_node, subargs.start); } add_node(subargs.end, join_node); /* Append the optional sequence. */ add_node(args->end, branch_node); args->end = join_node; } else if (min_count == 1 && max_count == 1) { /* Singly-repeated sequence. */ RE_CompileArgs subargs; subargs = *args; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width = subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Append the sequence. */ add_node(args->end, subargs.start); args->end = subargs.end; } else { RE_CODE index; RE_Node* repeat_node; RE_CompileArgs subargs; index = (RE_CODE)args->pattern->repeat_count; /* Create the nodes for the repeat. */ repeat_node = create_node(args->pattern, greedy ? RE_OP_GREEDY_REPEAT : RE_OP_LAZY_REPEAT, 0, args->forward ? 1 : -1, 4); if (!repeat_node || !record_repeat(args->pattern, index, args->repeat_depth)) return RE_ERROR_MEMORY; repeat_node->values[0] = index; repeat_node->values[1] = min_count; repeat_node->values[2] = max_count; repeat_node->values[3] = args->forward; if (args->within_fuzzy) args->pattern->repeat_info[index].status |= RE_STATUS_BODY; /* Compile the 'body' and check that we've reached the end of it. */ subargs = *args; subargs.min_width = 0; subargs.visible_captures = TRUE; subargs.has_captures = FALSE; subargs.is_fuzzy = FALSE; ++subargs.repeat_depth; status = build_sequence(&subargs); if (status != RE_ERROR_SUCCESS) return status; if (subargs.code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; args->code = subargs.code; args->min_width += min_count * subargs.min_width; args->has_captures |= subargs.has_captures; args->is_fuzzy |= subargs.is_fuzzy; ++args->code; /* Is it a repeat of something which will match a single character? * * If it's in a fuzzy section then it won't be optimised as a * single-character repeat. */ if (sequence_matches_one(subargs.start)) { repeat_node->op = greedy ? RE_OP_GREEDY_REPEAT_ONE : RE_OP_LAZY_REPEAT_ONE; /* Append the new sequence. */ add_node(args->end, repeat_node); repeat_node->nonstring.next_2.node = subargs.start; args->end = repeat_node; } else { RE_Node* end_repeat_node; RE_Node* end_node; end_repeat_node = create_node(args->pattern, greedy ? RE_OP_END_GREEDY_REPEAT : RE_OP_END_LAZY_REPEAT, 0, args->forward ? 1 : -1, 4); if (!end_repeat_node) return RE_ERROR_MEMORY; end_repeat_node->values[0] = repeat_node->values[0]; end_repeat_node->values[1] = repeat_node->values[1]; end_repeat_node->values[2] = repeat_node->values[2]; end_repeat_node->values[3] = args->forward; end_node = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); if (!end_node) return RE_ERROR_MEMORY; /* Append the new sequence. */ add_node(args->end, repeat_node); add_node(repeat_node, subargs.start); add_node(repeat_node, end_node); add_node(subargs.end, end_repeat_node); add_node(end_repeat_node, subargs.start); add_node(end_repeat_node, end_node); args->end = end_node; } } return RE_ERROR_SUCCESS; } /* Builds a STRING node. */ Py_LOCAL_INLINE(int) build_STRING(RE_CompileArgs* args, BOOL is_charset) { RE_CODE flags; RE_CODE length; RE_UINT8 op; Py_ssize_t step; RE_Node* node; RE_CODE i; /* codes: opcode, flags, length, characters. */ flags = args->code[1]; length = args->code[2]; if (args->code + 3 + length > args->end_code) return RE_ERROR_ILLEGAL; op = (RE_UINT8)args->code[0]; step = get_step(op); /* Create the node. */ node = create_node(args->pattern, op, flags, step * (Py_ssize_t)length, length); if (!node) return RE_ERROR_MEMORY; if (!is_charset) node->status |= RE_STATUS_STRING; for (i = 0; i < length; i++) node->values[i] = args->code[3 + i]; args->code += 3 + length; /* Append the node. */ add_node(args->end, node); args->end = node; /* Because of full case-folding, one character in the text could match * multiple characters in the pattern. */ if (op == RE_OP_STRING_FLD || op == RE_OP_STRING_FLD_REV) args->min_width += possible_unfolded_length(length); else args->min_width += length; return RE_ERROR_SUCCESS; } /* Builds a SET node. */ Py_LOCAL_INLINE(int) build_SET(RE_CompileArgs* args) { RE_UINT8 op; RE_CODE flags; Py_ssize_t step; RE_Node* node; size_t saved_min_width; int status; /* codes: opcode, flags, members. */ op = (RE_UINT8)args->code[0]; flags = args->code[1]; step = get_step(op); if (flags & RE_ZEROWIDTH_OP) step = 0; node = create_node(args->pattern, op, flags, step, 0); if (!node) return RE_ERROR_MEMORY; args->code += 2; /* Append the node. */ add_node(args->end, node); args->end = node; saved_min_width = args->min_width; /* Compile the character set. */ do { switch (args->code[0]) { case RE_OP_CHARACTER: case RE_OP_PROPERTY: status = build_CHARACTER_or_PROPERTY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_RANGE: status = build_RANGE(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_SET_DIFF: case RE_OP_SET_INTER: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_UNION: status = build_SET(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_STRING: /* A set of characters. */ if (!build_STRING(args, TRUE)) return FALSE; break; default: /* Illegal opcode for a character set. */ return RE_ERROR_ILLEGAL; } } while (args->code < args->end_code && args->code[0] != RE_OP_END); /* Check that we've reached the end correctly. (The last opcode should be * 'END'.) */ if (args->code >= args->end_code || args->code[0] != RE_OP_END) return RE_ERROR_ILLEGAL; ++args->code; /* At this point the set's members are in the main sequence. They need to * be moved out-of-line. */ node->nonstring.next_2.node = node->next_1.node; node->next_1.node = NULL; args->end = node; args->min_width = saved_min_width; if (step != 0) ++args->min_width; return RE_ERROR_SUCCESS; } /* Builds a STRING_SET node. */ Py_LOCAL_INLINE(int) build_STRING_SET(RE_CompileArgs* args) { RE_CODE index; RE_CODE min_len; RE_CODE max_len; RE_Node* node; /* codes: opcode, index, min_len, max_len. */ if (args->code + 3 > args->end_code) return RE_ERROR_ILLEGAL; index = args->code[1]; min_len = args->code[2]; max_len = args->code[3]; node = create_node(args->pattern, (RE_UINT8)args->code[0], 0, 0, 3); if (!node) return RE_ERROR_MEMORY; node->values[0] = index; node->values[1] = min_len; node->values[2] = max_len; args->code += 4; /* Append the reference. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a SUCCESS node . */ Py_LOCAL_INLINE(int) build_SUCCESS(RE_CompileArgs* args) { RE_Node* node; /* code: opcode. */ /* Create the node. */ node = create_node(args->pattern, RE_OP_SUCCESS, 0, 0, 0); if (!node) return RE_ERROR_MEMORY; ++args->code; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a zero-width node. */ Py_LOCAL_INLINE(int) build_zerowidth(RE_CompileArgs* args) { RE_CODE flags; RE_Node* node; /* codes: opcode, flags. */ if (args->code + 1 > args->end_code) return RE_ERROR_ILLEGAL; flags = args->code[1]; /* Create the node. */ node = create_node(args->pattern, (RE_UINT8)args->code[0], flags, 0, 0); if (!node) return RE_ERROR_MEMORY; args->code += 2; /* Append the node. */ add_node(args->end, node); args->end = node; return RE_ERROR_SUCCESS; } /* Builds a sequence of nodes from regular expression code. */ Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args) { int status; /* Guarantee that there's something to attach to. */ args->start = create_node(args->pattern, RE_OP_BRANCH, 0, 0, 0); args->end = args->start; /* The sequence should end with an opcode we don't understand. If it * doesn't then the code is illegal. */ while (args->code < args->end_code) { /* The following code groups opcodes by format, not function. */ switch (args->code[0]) { case RE_OP_ANY: case RE_OP_ANY_ALL: case RE_OP_ANY_ALL_REV: case RE_OP_ANY_REV: case RE_OP_ANY_U: case RE_OP_ANY_U_REV: /* A simple opcode with no trailing codewords and width of 1. */ status = build_ANY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_ATOMIC: /* An atomic sequence. */ status = build_ATOMIC(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_BOUNDARY: case RE_OP_DEFAULT_BOUNDARY: case RE_OP_DEFAULT_END_OF_WORD: case RE_OP_DEFAULT_START_OF_WORD: case RE_OP_END_OF_WORD: case RE_OP_GRAPHEME_BOUNDARY: case RE_OP_START_OF_WORD: /* A word or grapheme boundary. */ status = build_BOUNDARY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_BRANCH: /* A 2-way branch. */ status = build_BRANCH(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_CALL_REF: /* A group call ref. */ status = build_CALL_REF(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_CHARACTER: case RE_OP_CHARACTER_IGN: case RE_OP_CHARACTER_IGN_REV: case RE_OP_CHARACTER_REV: case RE_OP_PROPERTY: case RE_OP_PROPERTY_IGN: case RE_OP_PROPERTY_IGN_REV: case RE_OP_PROPERTY_REV: /* A character literal or a property. */ status = build_CHARACTER_or_PROPERTY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_END_OF_LINE: case RE_OP_END_OF_LINE_U: case RE_OP_END_OF_STRING: case RE_OP_END_OF_STRING_LINE: case RE_OP_END_OF_STRING_LINE_U: case RE_OP_SEARCH_ANCHOR: case RE_OP_START_OF_LINE: case RE_OP_START_OF_LINE_U: case RE_OP_START_OF_STRING: /* A simple opcode with no trailing codewords and width of 0. */ status = build_zerowidth(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_FUZZY: /* A fuzzy sequence. */ status = build_FUZZY(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GREEDY_REPEAT: case RE_OP_LAZY_REPEAT: /* A repeated sequence. */ status = build_REPEAT(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GROUP: /* A capture group. */ status = build_GROUP(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GROUP_CALL: /* A group call. */ status = build_GROUP_CALL(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_GROUP_EXISTS: /* A conditional sequence. */ status = build_GROUP_EXISTS(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_LOOKAROUND: /* A lookaround. */ status = build_LOOKAROUND(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_RANGE: case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: /* A range. */ status = build_RANGE(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_REF_GROUP: case RE_OP_REF_GROUP_FLD: case RE_OP_REF_GROUP_FLD_REV: case RE_OP_REF_GROUP_IGN: case RE_OP_REF_GROUP_IGN_REV: case RE_OP_REF_GROUP_REV: /* A reference to a group. */ status = build_REF_GROUP(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_SET_DIFF: case RE_OP_SET_DIFF_IGN: case RE_OP_SET_DIFF_IGN_REV: case RE_OP_SET_DIFF_REV: case RE_OP_SET_INTER: case RE_OP_SET_INTER_IGN: case RE_OP_SET_INTER_IGN_REV: case RE_OP_SET_INTER_REV: case RE_OP_SET_SYM_DIFF: case RE_OP_SET_SYM_DIFF_IGN: case RE_OP_SET_SYM_DIFF_IGN_REV: case RE_OP_SET_SYM_DIFF_REV: case RE_OP_SET_UNION: case RE_OP_SET_UNION_IGN: case RE_OP_SET_UNION_IGN_REV: case RE_OP_SET_UNION_REV: /* A set. */ status = build_SET(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_STRING: case RE_OP_STRING_FLD: case RE_OP_STRING_FLD_REV: case RE_OP_STRING_IGN: case RE_OP_STRING_IGN_REV: case RE_OP_STRING_REV: /* A string literal. */ if (!build_STRING(args, FALSE)) return FALSE; break; case RE_OP_STRING_SET: case RE_OP_STRING_SET_FLD: case RE_OP_STRING_SET_FLD_REV: case RE_OP_STRING_SET_IGN: case RE_OP_STRING_SET_IGN_REV: case RE_OP_STRING_SET_REV: /* A reference to a list. */ status = build_STRING_SET(args); if (status != RE_ERROR_SUCCESS) return status; break; case RE_OP_SUCCESS: /* Success. */ status = build_SUCCESS(args); if (status != RE_ERROR_SUCCESS) return status; break; default: /* We've found an opcode which we don't recognise. We'll leave it * for the caller. */ return RE_ERROR_SUCCESS; } } /* If we're here then we should be at the end of the code, otherwise we * have an error. */ return args->code == args->end_code; } /* Compiles the regular expression code to 'nodes'. * * Various details about the regular expression are discovered during * compilation and stored in the PatternObject. */ Py_LOCAL_INLINE(BOOL) compile_to_nodes(RE_CODE* code, RE_CODE* end_code, PatternObject* pattern) { RE_CompileArgs args; int status; /* Compile a regex sequence and then check that we've reached the end * correctly. (The last opcode should be 'SUCCESS'.) * * If successful, 'start' and 'end' will point to the start and end nodes * of the compiled sequence. */ args.code = code; args.end_code = end_code; args.pattern = pattern; args.forward = (pattern->flags & RE_FLAG_REVERSE) == 0; args.min_width = 0; args.visible_captures = FALSE; args.has_captures = FALSE; args.repeat_depth = 0; args.is_fuzzy = FALSE; args.within_fuzzy = FALSE; status = build_sequence(&args); if (status == RE_ERROR_ILLEGAL) set_error(RE_ERROR_ILLEGAL, NULL); if (status != RE_ERROR_SUCCESS) return FALSE; pattern->min_width = args.min_width; pattern->is_fuzzy = args.is_fuzzy; pattern->do_search_start = TRUE; pattern->start_node = args.start; /* Optimise the pattern. */ if (!optimise_pattern(pattern)) return FALSE; pattern->start_test = locate_test_start(pattern->start_node); /* Get the call_ref for the entire pattern, if any. */ if (pattern->start_node->op == RE_OP_CALL_REF) pattern->pattern_call_ref = pattern->start_node->values[0]; else pattern->pattern_call_ref = -1; return TRUE; } /* Gets the required characters for a regex. * * In the event of an error, it just pretends that there are no required * characters. */ Py_LOCAL_INLINE(void) get_required_chars(PyObject* required_chars, RE_CODE** req_chars, Py_ssize_t* req_length) { Py_ssize_t len; RE_CODE* chars; Py_ssize_t i; *req_chars = NULL; *req_length = 0; len = PyTuple_GET_SIZE(required_chars); if (len < 1 || PyErr_Occurred()) { PyErr_Clear(); return; } chars = (RE_CODE*)re_alloc(len * sizeof(RE_CODE)); if (!chars) goto error; for (i = 0; i < len; i++) { PyObject* o = PyTuple_GET_ITEM(required_chars, i); size_t value; value = PyLong_AsUnsignedLong(o); if (value == -1 && PyErr_Occurred()) goto error; chars[i] = (RE_CODE)value; if (chars[i] != value) goto error; } *req_chars = chars; *req_length = len; return; error: PyErr_Clear(); re_dealloc(chars); } /* Makes a STRING node. */ Py_LOCAL_INLINE(RE_Node*) make_STRING_node(PatternObject* pattern, RE_UINT8 op, Py_ssize_t length, RE_CODE* chars) { Py_ssize_t step; RE_Node* node; Py_ssize_t i; step = get_step(op); /* Create the node. */ node = create_node(pattern, op, 0, step * length, length); if (!node) return NULL; node->status |= RE_STATUS_STRING; for (i = 0; i < length; i++) node->values[i] = chars[i]; return node; } /* Compiles regular expression code to a PatternObject. * * The regular expression code is provided as a list and is then compiled to * 'nodes'. Various details about the regular expression are discovered during * compilation and stored in the PatternObject. */ static PyObject* re_compile(PyObject* self_, PyObject* args) { PyObject* pattern; Py_ssize_t flags = 0; PyObject* code_list; PyObject* groupindex; PyObject* indexgroup; PyObject* named_lists; PyObject* named_list_indexes; Py_ssize_t req_offset; PyObject* required_chars; Py_ssize_t req_length; RE_CODE* req_chars; Py_ssize_t req_flags; Py_ssize_t public_group_count; Py_ssize_t code_len; RE_CODE* code; Py_ssize_t i; PatternObject* self; BOOL ascii; BOOL locale; BOOL unicode; BOOL ok; if (!PyArg_ParseTuple(args, "OnOOOOOnOnn:re_compile", &pattern, &flags, &code_list, &groupindex, &indexgroup, &named_lists, &named_list_indexes, &req_offset, &required_chars, &req_flags, &public_group_count)) return NULL; /* Read the regex code. */ code_len = PyList_GET_SIZE(code_list); code = (RE_CODE*)re_alloc(code_len * sizeof(RE_CODE)); if (!code) return NULL; for (i = 0; i < code_len; i++) { PyObject* o = PyList_GET_ITEM(code_list, i); size_t value; value = PyLong_AsUnsignedLong(o); if (value == -1 && PyErr_Occurred()) goto error; code[i] = (RE_CODE)value; if (code[i] != value) goto error; } /* Get the required characters. */ get_required_chars(required_chars, &req_chars, &req_length); /* Create the PatternObject. */ self = PyObject_NEW(PatternObject, &Pattern_Type); if (!self) { set_error(RE_ERROR_MEMORY, NULL); re_dealloc(req_chars); re_dealloc(code); return NULL; } /* Initialise the PatternObject. */ self->pattern = pattern; self->flags = flags; self->weakreflist = NULL; self->start_node = NULL; self->repeat_count = 0; self->true_group_count = 0; self->public_group_count = public_group_count; self->group_end_index = 0; self->groupindex = groupindex; self->indexgroup = indexgroup; self->named_lists = named_lists; self->named_list_indexes = named_list_indexes; self->node_capacity = 0; self->node_count = 0; self->node_list = NULL; self->group_info_capacity = 0; self->group_info = NULL; self->call_ref_info_capacity = 0; self->call_ref_info_count = 0; self->call_ref_info = NULL; self->repeat_info_capacity = 0; self->repeat_info = NULL; self->groups_storage = NULL; self->repeats_storage = NULL; self->fuzzy_count = 0; self->recursive = FALSE; self->req_offset = req_offset; self->req_string = NULL; Py_INCREF(self->pattern); Py_INCREF(self->groupindex); Py_INCREF(self->indexgroup); Py_INCREF(self->named_lists); Py_INCREF(self->named_list_indexes); /* Initialise the character encoding. */ unicode = (flags & RE_FLAG_UNICODE) != 0; locale = (flags & RE_FLAG_LOCALE) != 0; ascii = (flags & RE_FLAG_ASCII) != 0; if (!unicode && !locale && !ascii) { if (PyBytes_Check(self->pattern)) ascii = RE_FLAG_ASCII; else unicode = RE_FLAG_UNICODE; } if (unicode) self->encoding = &unicode_encoding; else if (locale) self->encoding = &locale_encoding; else if (ascii) self->encoding = &ascii_encoding; /* Compile the regular expression code to nodes. */ ok = compile_to_nodes(code, code + code_len, self); /* We no longer need the regular expression code. */ re_dealloc(code); if (!ok) { Py_DECREF(self); re_dealloc(req_chars); return NULL; } /* Make a node for the required string, if there's one. */ if (req_chars) { /* Remove the FULLCASE flag if it's not a Unicode pattern. */ if (!(self->flags & RE_FLAG_UNICODE)) req_flags &= ~RE_FLAG_FULLCASE; if (self->flags & RE_FLAG_REVERSE) { switch (req_flags) { case 0: self->req_string = make_STRING_node(self, RE_OP_STRING_REV, req_length, req_chars); break; case RE_FLAG_IGNORECASE | RE_FLAG_FULLCASE: self->req_string = make_STRING_node(self, RE_OP_STRING_FLD_REV, req_length, req_chars); break; case RE_FLAG_IGNORECASE: self->req_string = make_STRING_node(self, RE_OP_STRING_IGN_REV, req_length, req_chars); break; } } else { switch (req_flags) { case 0: self->req_string = make_STRING_node(self, RE_OP_STRING, req_length, req_chars); break; case RE_FLAG_IGNORECASE | RE_FLAG_FULLCASE: self->req_string = make_STRING_node(self, RE_OP_STRING_FLD, req_length, req_chars); break; case RE_FLAG_IGNORECASE: self->req_string = make_STRING_node(self, RE_OP_STRING_IGN, req_length, req_chars); break; } } re_dealloc(req_chars); } return (PyObject*)self; error: re_dealloc(code); set_error(RE_ERROR_ILLEGAL, NULL); return NULL; } /* Gets the size of the codewords. */ static PyObject* get_code_size(PyObject* self, PyObject* unused) { return Py_BuildValue("n", sizeof(RE_CODE)); } /* Gets the property dict. */ static PyObject* get_properties(PyObject* self_, PyObject* args) { Py_INCREF(property_dict); return property_dict; } /* Folds the case of a string. */ static PyObject* fold_case(PyObject* self_, PyObject* args) { RE_StringInfo str_info; Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); Py_ssize_t folded_charsize; void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); RE_EncodingTable* encoding; Py_ssize_t buf_size; void* folded; Py_ssize_t folded_len; PyObject* result; Py_ssize_t flags; PyObject* string; if (!PyArg_ParseTuple(args, "nO:fold_case", &flags, &string)) return NULL; if (!(flags & RE_FLAG_IGNORECASE)) { Py_INCREF(string); return string; } /* Get the string. */ if (!get_string(string, &str_info)) return NULL; /* Get the function for reading from the original string. */ switch (str_info.charsize) { case 1: char_at = bytes1_char_at; break; case 2: char_at = bytes2_char_at; break; case 4: char_at = bytes4_char_at; break; default: release_buffer(&str_info); return NULL; } /* What's the encoding? */ if (flags & RE_FLAG_UNICODE) encoding = &unicode_encoding; else if (flags & RE_FLAG_LOCALE) encoding = &locale_encoding; else if (flags & RE_FLAG_ASCII) encoding = &ascii_encoding; else encoding = &unicode_encoding; #if PY_VERSION_HEX >= 0x03030000 /* Initially assume that the folded string will have the same width as the * original string (usually true). */ folded_charsize = str_info.charsize; /* When folding a Unicode string, some codepoints in the range U+00..U+FF * are transformed to codepoints in the range U+0100..U+FFFF. */ if (encoding == &unicode_encoding && str_info.charsize == 1) folded_charsize = 2; #else /* The folded string will have the same width as the original string. */ folded_charsize = str_info.charsize; #endif /* Get the function for writing to the folded string. */ switch (folded_charsize) { case 1: set_char_at = bytes1_set_char_at; break; case 2: set_char_at = bytes2_set_char_at; break; case 4: set_char_at = bytes4_set_char_at; break; default: release_buffer(&str_info); return NULL; } /* Allocate a buffer for the folded string. */ if (flags & RE_FLAG_FULLCASE) /* When using full case-folding with Unicode, some single codepoints * are transformed to sequences of codepoints. */ buf_size = str_info.length * RE_MAX_FOLDED; else buf_size = str_info.length; folded = re_alloc(buf_size * folded_charsize); if (!folded) { release_buffer(&str_info); return NULL; } /* Fold the case of the string. */ folded_len = 0; if (flags & RE_FLAG_FULLCASE) { /* Full case-folding. */ int (*full_case_fold)(Py_UCS4 ch, Py_UCS4* folded); Py_ssize_t i; Py_UCS4 codepoints[RE_MAX_FOLDED]; full_case_fold = encoding->full_case_fold; for (i = 0; i < str_info.length; i++) { int count; int j; count = full_case_fold(char_at(str_info.characters, i), codepoints); for (j = 0; j < count; j++) set_char_at(folded, folded_len + j, codepoints[j]); folded_len += count; } } else { /* Simple case-folding. */ Py_UCS4 (*simple_case_fold)(Py_UCS4 ch); Py_ssize_t i; simple_case_fold = encoding->simple_case_fold; for (i = 0; i < str_info.length; i++) { Py_UCS4 ch; ch = simple_case_fold(char_at(str_info.characters, i)); set_char_at(folded, i, ch); } folded_len = str_info.length; } /* Build the result string. */ if (str_info.is_unicode) result = build_unicode_value(folded, folded_len, folded_charsize); else result = build_bytes_value(folded, folded_len, folded_charsize); re_dealloc(folded); /* Release the original string's buffer. */ release_buffer(&str_info); return result; } /* Returns a tuple of the Unicode characters which expand on full case-folding. */ static PyObject* get_expand_on_folding(PyObject* self, PyObject* unused) { int count; int i; PyObject* result; /* How many characters are there? */ count = sizeof(re_expand_on_folding) / sizeof(re_expand_on_folding[0]); /* Put all the characters in a tuple. */ result = PyTuple_New(count); if (!result) goto error; for (i = 0; i < count; i++) { #if PY_VERSION_HEX >= 0x03030000 Py_UCS4 codepoint; #else Py_UNICODE codepoint; #endif PyObject* item; codepoint = re_expand_on_folding[i]; item = build_unicode_value(&codepoint, 1, sizeof(codepoint)); if (!item) goto error; PyTuple_SetItem(result, i, item); } return result; error: Py_XDECREF(result); return NULL; } /* Returns whether a character has a given value for a Unicode property. */ static PyObject* has_property_value(PyObject* self_, PyObject* args) { BOOL v; Py_ssize_t property_value; Py_ssize_t character; if (!PyArg_ParseTuple(args, "nn:has_property_value", &property_value, &character)) return NULL; v = unicode_has_property((RE_CODE)property_value, (Py_UCS4)character) ? 1 : 0; return Py_BuildValue("n", v); } /* Returns a list all the simple cases of a character. * * If full case-folding is turned on and the character also expands on full * case-folding, a None is appended to the list. */ static PyObject* get_all_cases(PyObject* self_, PyObject* args) { RE_EncodingTable* encoding; int count; Py_UCS4 cases[RE_MAX_CASES]; Py_UCS4 folded[RE_MAX_FOLDED]; PyObject* result; int i; Py_ssize_t flags; Py_ssize_t character; if (!PyArg_ParseTuple(args, "nn:get_all_cases", &flags, &character)) return NULL; /* What's the encoding? */ if (flags & RE_FLAG_UNICODE) encoding = &unicode_encoding; else if (flags & RE_FLAG_LOCALE) encoding = &locale_encoding; else if (flags & RE_FLAG_ASCII) encoding = &ascii_encoding; else encoding = &unicode_encoding; /* Get all the simple cases. */ count = encoding->all_cases((Py_UCS4)character, cases); result = PyList_New(count); if (!result) goto error; for (i = 0; i < count; i++) { PyObject* item; item = Py_BuildValue("n", cases[i]); if (!item) goto error; PyList_SetItem(result, i, item); } /* If the character also expands on full case-folding, append a None. */ if ((flags & RE_FULL_CASE_FOLDING) == RE_FULL_CASE_FOLDING) { count = encoding->full_case_fold((Py_UCS4)character, folded); if (count > 1) PyList_Append(result, Py_None); } return result; error: Py_XDECREF(result); return NULL; } /* The table of the module's functions. */ static PyMethodDef _functions[] = { {"compile", (PyCFunction)re_compile, METH_VARARGS}, {"get_code_size", (PyCFunction)get_code_size, METH_NOARGS}, {"get_properties", (PyCFunction)get_properties, METH_VARARGS}, {"fold_case", (PyCFunction)fold_case, METH_VARARGS}, {"get_expand_on_folding", (PyCFunction)get_expand_on_folding, METH_NOARGS}, {"has_property_value", (PyCFunction)has_property_value, METH_VARARGS}, {"get_all_cases", (PyCFunction)get_all_cases, METH_VARARGS}, {NULL, NULL} }; /* Initialises the property dictionary. */ static BOOL init_property_dict(void) { int value_set_count; int i; PyObject** value_dicts; property_dict = NULL; /* How many value sets are there? */ value_set_count = 0; for (i = 0; i < sizeof(re_property_values) / sizeof(re_property_values[0]); i++) { RE_PropertyValue* value; value = &re_property_values[i]; if (value->value_set >= value_set_count) value_set_count = value->value_set + 1; } /* Quick references for the value sets. */ value_dicts = (PyObject**)re_alloc(value_set_count * sizeof(value_dicts[0])); if (!value_dicts) return FALSE; memset(value_dicts, 0, value_set_count * sizeof(value_dicts[0])); /* Build the property values dictionaries. */ for (i = 0; i < sizeof(re_property_values) / sizeof(re_property_values[0]); i++) { RE_PropertyValue* value; PyObject* v; value = &re_property_values[i]; if (!value_dicts[value->value_set]) { value_dicts[value->value_set] = PyDict_New(); if (!value_dicts[value->value_set]) goto error; } v = Py_BuildValue("i", value->id); if (!v) goto error; PyDict_SetItemString(value_dicts[value->value_set], re_strings[value->name], v); } /* Build the property dictionary. */ property_dict = PyDict_New(); if (!property_dict) goto error; for (i = 0; i < sizeof(re_properties) / sizeof(re_properties[0]); i++) { RE_Property* property; PyObject* v; property = &re_properties[i]; v = Py_BuildValue("iO", property->id, value_dicts[property->value_set]); if (!v) goto error; PyDict_SetItemString(property_dict, re_strings[property->name], v); } /* DECREF the value sets. Any unused ones will be deallocated. */ for (i = 0; i < value_set_count; i++) Py_XDECREF(value_dicts[i]); re_dealloc(value_dicts); return TRUE; error: Py_XDECREF(property_dict); /* DECREF the value sets. */ for (i = 0; i < value_set_count; i++) Py_XDECREF(value_dicts[i]); re_dealloc(value_dicts); return FALSE; } /* The module definition. */ static struct PyModuleDef remodule = { PyModuleDef_HEAD_INIT, "_" RE_MODULE, NULL, -1, _functions, NULL, NULL, NULL, NULL }; /* Initialises the module. */ PyMODINIT_FUNC PyInit__regex(void) { PyObject* m; PyObject* d; PyObject* x; #if defined(VERBOSE) /* Unbuffered in case it crashes! */ setvbuf(stdout, NULL, _IONBF, 0); #endif /* Initialise Pattern_Type. */ Pattern_Type.tp_dealloc = pattern_dealloc; Pattern_Type.tp_repr = pattern_repr; Pattern_Type.tp_flags = Py_TPFLAGS_DEFAULT; Pattern_Type.tp_doc = pattern_doc; Pattern_Type.tp_weaklistoffset = offsetof(PatternObject, weakreflist); Pattern_Type.tp_methods = pattern_methods; Pattern_Type.tp_members = pattern_members; Pattern_Type.tp_getset = pattern_getset; /* Initialise Match_Type. */ Match_Type.tp_dealloc = match_dealloc; Match_Type.tp_repr = match_repr; Match_Type.tp_as_mapping = &match_as_mapping; Match_Type.tp_flags = Py_TPFLAGS_DEFAULT; Match_Type.tp_doc = match_doc; Match_Type.tp_methods = match_methods; Match_Type.tp_members = match_members; Match_Type.tp_getset = match_getset; /* Initialise Scanner_Type. */ Scanner_Type.tp_dealloc = scanner_dealloc; Scanner_Type.tp_flags = Py_TPFLAGS_DEFAULT; Scanner_Type.tp_doc = scanner_doc; Scanner_Type.tp_iter = scanner_iter; Scanner_Type.tp_iternext = scanner_iternext; Scanner_Type.tp_methods = scanner_methods; Scanner_Type.tp_members = scanner_members; /* Initialise Splitter_Type. */ Splitter_Type.tp_dealloc = splitter_dealloc; Splitter_Type.tp_flags = Py_TPFLAGS_DEFAULT; Splitter_Type.tp_doc = splitter_doc; Splitter_Type.tp_iter = splitter_iter; Splitter_Type.tp_iternext = splitter_iternext; Splitter_Type.tp_methods = splitter_methods; Splitter_Type.tp_members = splitter_members; /* Initialize object types */ if (PyType_Ready(&Pattern_Type) < 0) return NULL; if (PyType_Ready(&Match_Type) < 0) return NULL; if (PyType_Ready(&Scanner_Type) < 0) return NULL; if (PyType_Ready(&Splitter_Type) < 0) return NULL; error_exception = NULL; m = PyModule_Create(&remodule); if (!m) return NULL; d = PyModule_GetDict(m); x = PyLong_FromLong(RE_MAGIC); if (x) { PyDict_SetItemString(d, "MAGIC", x); Py_DECREF(x); } x = PyLong_FromLong(sizeof(RE_CODE)); if (x) { PyDict_SetItemString(d, "CODE_SIZE", x); Py_DECREF(x); } x = PyUnicode_FromString(copyright); if (x) { PyDict_SetItemString(d, "copyright", x); Py_DECREF(x); } /* Initialise the property dictionary. */ if (!init_property_dict()) return NULL; return m; } /* vim:ts=4:sw=4:et */ regex-2014.02.16/Python3/_regex.h0000666000000000000000000001401612226112662014343 0ustar 00000000000000/* * Secret Labs' Regular Expression Engine * * regular expression matching engine * * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * * NOTE: This file is generated by regex.py. If you need * to change anything in here, edit regex.py and run it. * * 2010-01-16 mrab Re-written */ /* Supports Unicode version 6.3.0. */ #define RE_MAGIC 20100116 #include "_regex_unicode.h" /* Operators. */ #define RE_OP_FAILURE 0 #define RE_OP_SUCCESS 1 #define RE_OP_ANY 2 #define RE_OP_ANY_ALL 3 #define RE_OP_ANY_ALL_REV 4 #define RE_OP_ANY_REV 5 #define RE_OP_ANY_U 6 #define RE_OP_ANY_U_REV 7 #define RE_OP_ATOMIC 8 #define RE_OP_BOUNDARY 9 #define RE_OP_BRANCH 10 #define RE_OP_CALL_REF 11 #define RE_OP_CHARACTER 12 #define RE_OP_CHARACTER_IGN 13 #define RE_OP_CHARACTER_IGN_REV 14 #define RE_OP_CHARACTER_REV 15 #define RE_OP_DEFAULT_BOUNDARY 16 #define RE_OP_DEFAULT_END_OF_WORD 17 #define RE_OP_DEFAULT_START_OF_WORD 18 #define RE_OP_END 19 #define RE_OP_END_OF_LINE 20 #define RE_OP_END_OF_LINE_U 21 #define RE_OP_END_OF_STRING 22 #define RE_OP_END_OF_STRING_LINE 23 #define RE_OP_END_OF_STRING_LINE_U 24 #define RE_OP_END_OF_WORD 25 #define RE_OP_FUZZY 26 #define RE_OP_GRAPHEME_BOUNDARY 27 #define RE_OP_GREEDY_REPEAT 28 #define RE_OP_GROUP 29 #define RE_OP_GROUP_CALL 30 #define RE_OP_GROUP_EXISTS 31 #define RE_OP_LAZY_REPEAT 32 #define RE_OP_LOOKAROUND 33 #define RE_OP_NEXT 34 #define RE_OP_PROPERTY 35 #define RE_OP_PROPERTY_IGN 36 #define RE_OP_PROPERTY_IGN_REV 37 #define RE_OP_PROPERTY_REV 38 #define RE_OP_RANGE 39 #define RE_OP_RANGE_IGN 40 #define RE_OP_RANGE_IGN_REV 41 #define RE_OP_RANGE_REV 42 #define RE_OP_REF_GROUP 43 #define RE_OP_REF_GROUP_FLD 44 #define RE_OP_REF_GROUP_FLD_REV 45 #define RE_OP_REF_GROUP_IGN 46 #define RE_OP_REF_GROUP_IGN_REV 47 #define RE_OP_REF_GROUP_REV 48 #define RE_OP_SEARCH_ANCHOR 49 #define RE_OP_SET_DIFF 50 #define RE_OP_SET_DIFF_IGN 51 #define RE_OP_SET_DIFF_IGN_REV 52 #define RE_OP_SET_DIFF_REV 53 #define RE_OP_SET_INTER 54 #define RE_OP_SET_INTER_IGN 55 #define RE_OP_SET_INTER_IGN_REV 56 #define RE_OP_SET_INTER_REV 57 #define RE_OP_SET_SYM_DIFF 58 #define RE_OP_SET_SYM_DIFF_IGN 59 #define RE_OP_SET_SYM_DIFF_IGN_REV 60 #define RE_OP_SET_SYM_DIFF_REV 61 #define RE_OP_SET_UNION 62 #define RE_OP_SET_UNION_IGN 63 #define RE_OP_SET_UNION_IGN_REV 64 #define RE_OP_SET_UNION_REV 65 #define RE_OP_START_OF_LINE 66 #define RE_OP_START_OF_LINE_U 67 #define RE_OP_START_OF_STRING 68 #define RE_OP_START_OF_WORD 69 #define RE_OP_STRING 70 #define RE_OP_STRING_FLD 71 #define RE_OP_STRING_FLD_REV 72 #define RE_OP_STRING_IGN 73 #define RE_OP_STRING_IGN_REV 74 #define RE_OP_STRING_REV 75 #define RE_OP_STRING_SET 76 #define RE_OP_STRING_SET_FLD 77 #define RE_OP_STRING_SET_FLD_REV 78 #define RE_OP_STRING_SET_IGN 79 #define RE_OP_STRING_SET_IGN_REV 80 #define RE_OP_STRING_SET_REV 81 #define RE_OP_BODY_END 82 #define RE_OP_BODY_START 83 #define RE_OP_END_FUZZY 84 #define RE_OP_END_GREEDY_REPEAT 85 #define RE_OP_END_GROUP 86 #define RE_OP_END_LAZY_REPEAT 87 #define RE_OP_GREEDY_REPEAT_ONE 88 #define RE_OP_GROUP_RETURN 89 #define RE_OP_LAZY_REPEAT_ONE 90 #define RE_OP_MATCH_BODY 91 #define RE_OP_MATCH_TAIL 92 #define RE_OP_START_GROUP 93 char* re_op_text[] = { "RE_OP_FAILURE", "RE_OP_SUCCESS", "RE_OP_ANY", "RE_OP_ANY_ALL", "RE_OP_ANY_ALL_REV", "RE_OP_ANY_REV", "RE_OP_ANY_U", "RE_OP_ANY_U_REV", "RE_OP_ATOMIC", "RE_OP_BOUNDARY", "RE_OP_BRANCH", "RE_OP_CALL_REF", "RE_OP_CHARACTER", "RE_OP_CHARACTER_IGN", "RE_OP_CHARACTER_IGN_REV", "RE_OP_CHARACTER_REV", "RE_OP_DEFAULT_BOUNDARY", "RE_OP_DEFAULT_END_OF_WORD", "RE_OP_DEFAULT_START_OF_WORD", "RE_OP_END", "RE_OP_END_OF_LINE", "RE_OP_END_OF_LINE_U", "RE_OP_END_OF_STRING", "RE_OP_END_OF_STRING_LINE", "RE_OP_END_OF_STRING_LINE_U", "RE_OP_END_OF_WORD", "RE_OP_FUZZY", "RE_OP_GRAPHEME_BOUNDARY", "RE_OP_GREEDY_REPEAT", "RE_OP_GROUP", "RE_OP_GROUP_CALL", "RE_OP_GROUP_EXISTS", "RE_OP_LAZY_REPEAT", "RE_OP_LOOKAROUND", "RE_OP_NEXT", "RE_OP_PROPERTY", "RE_OP_PROPERTY_IGN", "RE_OP_PROPERTY_IGN_REV", "RE_OP_PROPERTY_REV", "RE_OP_RANGE", "RE_OP_RANGE_IGN", "RE_OP_RANGE_IGN_REV", "RE_OP_RANGE_REV", "RE_OP_REF_GROUP", "RE_OP_REF_GROUP_FLD", "RE_OP_REF_GROUP_FLD_REV", "RE_OP_REF_GROUP_IGN", "RE_OP_REF_GROUP_IGN_REV", "RE_OP_REF_GROUP_REV", "RE_OP_SEARCH_ANCHOR", "RE_OP_SET_DIFF", "RE_OP_SET_DIFF_IGN", "RE_OP_SET_DIFF_IGN_REV", "RE_OP_SET_DIFF_REV", "RE_OP_SET_INTER", "RE_OP_SET_INTER_IGN", "RE_OP_SET_INTER_IGN_REV", "RE_OP_SET_INTER_REV", "RE_OP_SET_SYM_DIFF", "RE_OP_SET_SYM_DIFF_IGN", "RE_OP_SET_SYM_DIFF_IGN_REV", "RE_OP_SET_SYM_DIFF_REV", "RE_OP_SET_UNION", "RE_OP_SET_UNION_IGN", "RE_OP_SET_UNION_IGN_REV", "RE_OP_SET_UNION_REV", "RE_OP_START_OF_LINE", "RE_OP_START_OF_LINE_U", "RE_OP_START_OF_STRING", "RE_OP_START_OF_WORD", "RE_OP_STRING", "RE_OP_STRING_FLD", "RE_OP_STRING_FLD_REV", "RE_OP_STRING_IGN", "RE_OP_STRING_IGN_REV", "RE_OP_STRING_REV", "RE_OP_STRING_SET", "RE_OP_STRING_SET_FLD", "RE_OP_STRING_SET_FLD_REV", "RE_OP_STRING_SET_IGN", "RE_OP_STRING_SET_IGN_REV", "RE_OP_STRING_SET_REV", "RE_OP_BODY_END", "RE_OP_BODY_START", "RE_OP_END_FUZZY", "RE_OP_END_GREEDY_REPEAT", "RE_OP_END_GROUP", "RE_OP_END_LAZY_REPEAT", "RE_OP_GREEDY_REPEAT_ONE", "RE_OP_GROUP_RETURN", "RE_OP_LAZY_REPEAT_ONE", "RE_OP_MATCH_BODY", "RE_OP_MATCH_TAIL", "RE_OP_START_GROUP", }; #define RE_FLAG_ASCII 0x80 #define RE_FLAG_BESTMATCH 0x1000 #define RE_FLAG_DEBUG 0x200 #define RE_FLAG_DOTALL 0x10 #define RE_FLAG_ENHANCEMATCH 0x8000 #define RE_FLAG_FULLCASE 0x4000 #define RE_FLAG_IGNORECASE 0x2 #define RE_FLAG_LOCALE 0x4 #define RE_FLAG_MULTILINE 0x8 #define RE_FLAG_REVERSE 0x400 #define RE_FLAG_TEMPLATE 0x1 #define RE_FLAG_UNICODE 0x20 #define RE_FLAG_VERBOSE 0x40 #define RE_FLAG_VERSION0 0x2000 #define RE_FLAG_VERSION1 0x100 #define RE_FLAG_WORD 0x800 regex-2014.02.16/Python3/_regex_core.py0000666000000000000000000036536612300213377015573 0ustar 00000000000000# # Secret Labs' Regular Expression Engine core module # # Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. # # This version of the SRE library can be redistributed under CNRI's # Python 1.6 license. For any other use, please contact Secret Labs # AB (info@pythonware.com). # # Portions of this engine have been developed in cooperation with # CNRI. Hewlett-Packard provided funding for 1.6 integration and # other compatibility work. # # 2010-01-16 mrab Python front-end re-written and extended import string import sys import unicodedata from collections import defaultdict import _regex __all__ = ["A", "ASCII", "B", "BESTMATCH", "D", "DEBUG", "E", "ENHANCEMATCH", "F", "FULLCASE", "I", "IGNORECASE", "L", "LOCALE", "M", "MULTILINE", "R", "REVERSE", "S", "DOTALL", "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "W", "WORD", "X", "VERBOSE", "error", "Scanner"] # The regex exception. class error(Exception): def __init__(self, message, set_error=False): Exception.__init__(self, message) self.set_error = set_error # The exception for when a positional flag has been turned on in the old # behaviour. class _UnscopedFlagSet(Exception): pass # The exception for when parsing fails and we want to try something else. class ParseError(Exception): pass # The exception for when there isn't a valid first set. class _FirstSetError(Exception): pass # Flags. A = ASCII = 0x80 # Assume ASCII locale. B = BESTMATCH = 0x1000 # Best fuzzy match. D = DEBUG = 0x200 # Print parsed pattern. E = ENHANCEMATCH = 0x8000 # Attempt to improve the fit after finding the first # fuzzy match. F = FULLCASE = 0x4000 # Unicode full case-folding. I = IGNORECASE = 0x2 # Ignore case. L = LOCALE = 0x4 # Assume current 8-bit locale. M = MULTILINE = 0x8 # Make anchors look for newline. R = REVERSE = 0x400 # Search backwards. S = DOTALL = 0x10 # Make dot match newline. U = UNICODE = 0x20 # Assume Unicode locale. V0 = VERSION0 = 0x2000 # Old legacy behaviour. V1 = VERSION1 = 0x100 # New enhanced behaviour. W = WORD = 0x800 # Default Unicode word breaks. X = VERBOSE = 0x40 # Ignore whitespace and comments. T = TEMPLATE = 0x1 # Template (present because re module has it). DEFAULT_VERSION = VERSION1 _ALL_VERSIONS = VERSION0 | VERSION1 _ALL_ENCODINGS = ASCII | LOCALE | UNICODE # The default flags for the various versions. DEFAULT_FLAGS = {VERSION0: 0, VERSION1: FULLCASE} # The mask for the flags. GLOBAL_FLAGS = (_ALL_ENCODINGS | _ALL_VERSIONS | BESTMATCH | DEBUG | ENHANCEMATCH | REVERSE) SCOPED_FLAGS = FULLCASE | IGNORECASE | MULTILINE | DOTALL | WORD | VERBOSE ALPHA = frozenset(string.ascii_letters) DIGITS = frozenset(string.digits) ALNUM = ALPHA | DIGITS OCT_DIGITS = frozenset(string.octdigits) HEX_DIGITS = frozenset(string.hexdigits) SPECIAL_CHARS = frozenset("()|?*+{^$.[\\#") | frozenset([""]) NAMED_CHAR_PART = ALNUM | frozenset(" -") PROPERTY_NAME_PART = ALNUM | frozenset(" &_-.") SET_OPS = ("||", "~~", "&&", "--") # The width of the code words inside the regex engine. BYTES_PER_CODE = _regex.get_code_size() BITS_PER_CODE = BYTES_PER_CODE * 8 # The repeat count which represents infinity. UNLIMITED = (1 << BITS_PER_CODE) - 1 # The regular expression flags. REGEX_FLAGS = {"a": ASCII, "b": BESTMATCH, "e": ENHANCEMATCH, "f": FULLCASE, "i": IGNORECASE, "L": LOCALE, "m": MULTILINE, "r": REVERSE, "s": DOTALL, "u": UNICODE, "V0": VERSION0, "V1": VERSION1, "w": WORD, "x": VERBOSE} # The case flags. CASE_FLAGS = FULLCASE | IGNORECASE NOCASE = 0 FULLIGNORECASE = FULLCASE | IGNORECASE FULL_CASE_FOLDING = UNICODE | FULLIGNORECASE # The number of digits in hexadecimal escapes. HEX_ESCAPES = {"x": 2, "u": 4, "U": 8} # A singleton which indicates a comment within a pattern. COMMENT = object() # The names of the opcodes. OPCODES = """ FAILURE SUCCESS ANY ANY_ALL ANY_ALL_REV ANY_REV ANY_U ANY_U_REV ATOMIC BOUNDARY BRANCH CALL_REF CHARACTER CHARACTER_IGN CHARACTER_IGN_REV CHARACTER_REV DEFAULT_BOUNDARY DEFAULT_END_OF_WORD DEFAULT_START_OF_WORD END END_OF_LINE END_OF_LINE_U END_OF_STRING END_OF_STRING_LINE END_OF_STRING_LINE_U END_OF_WORD FUZZY GRAPHEME_BOUNDARY GREEDY_REPEAT GROUP GROUP_CALL GROUP_EXISTS LAZY_REPEAT LOOKAROUND NEXT PROPERTY PROPERTY_IGN PROPERTY_IGN_REV PROPERTY_REV RANGE RANGE_IGN RANGE_IGN_REV RANGE_REV REF_GROUP REF_GROUP_FLD REF_GROUP_FLD_REV REF_GROUP_IGN REF_GROUP_IGN_REV REF_GROUP_REV SEARCH_ANCHOR SET_DIFF SET_DIFF_IGN SET_DIFF_IGN_REV SET_DIFF_REV SET_INTER SET_INTER_IGN SET_INTER_IGN_REV SET_INTER_REV SET_SYM_DIFF SET_SYM_DIFF_IGN SET_SYM_DIFF_IGN_REV SET_SYM_DIFF_REV SET_UNION SET_UNION_IGN SET_UNION_IGN_REV SET_UNION_REV START_OF_LINE START_OF_LINE_U START_OF_STRING START_OF_WORD STRING STRING_FLD STRING_FLD_REV STRING_IGN STRING_IGN_REV STRING_REV STRING_SET STRING_SET_FLD STRING_SET_FLD_REV STRING_SET_IGN STRING_SET_IGN_REV STRING_SET_REV """ # Define the opcodes in a namespace. class Namespace: pass OP = Namespace() for i, op in enumerate(OPCODES.split()): setattr(OP, op, i) def _shrink_cache(cache_dict, args_dict, max_length, divisor=5): """Make room in the given cache. Args: cache_dict: The cache dictionary to modify. args_dict: The dictionary of named list args used by patterns. max_length: Maximum # of entries in cache_dict before it is shrunk. divisor: Cache will shrink to max_length - 1/divisor*max_length items. """ # Toss out a fraction of the entries at random to make room for new ones. # A random algorithm was chosen as opposed to simply cache_dict.popitem() # as popitem could penalize the same regular expression repeatedly based # on its internal hash value. Being random should spread the cache miss # love around. cache_keys = tuple(cache_dict.keys()) overage = len(cache_keys) - max_length if overage < 0: # Cache is already within limits. Normally this should not happen # but it could due to multithreading. return number_to_toss = max_length // divisor + overage # The import is done here to avoid a circular dependency. import random if not hasattr(random, 'sample'): # Do nothing while resolving the circular dependency: # re->random->warnings->tokenize->string->re return for doomed_key in random.sample(cache_keys, number_to_toss): try: del cache_dict[doomed_key] except KeyError: # Ignore problems if the cache changed from another thread. pass # Rebuild the arguments dictionary. args_dict.clear() for pattern, pattern_type, flags, args, default_version in cache_dict: args_dict[pattern, pattern_type, flags, default_version] = args def _fold_case(info, string): "Folds the case of a string." flags = info.flags if (flags & _ALL_ENCODINGS) == 0: flags |= info.guess_encoding return _regex.fold_case(flags, string) def is_cased(info, char): "Checks whether a character is cased." return len(_regex.get_all_cases(info.flags, char)) > 1 def _compile_firstset(info, fs): "Compiles the firstset for the pattern." if not fs or None in fs: return [] # If we ignore the case, for simplicity we won't build a firstset. members = set() for i in fs: if i.case_flags: if isinstance(i, Character): if is_cased(info, i.value): return [] elif isinstance(i, SetBase): return [] members.add(i.with_flags(case_flags=NOCASE)) # Build the firstset. fs = SetUnion(info, list(members), zerowidth=True) fs = fs.optimise(info, in_set=True) # Compile the firstset. return fs.compile(bool(info.flags & REVERSE)) def _flatten_code(code): "Flattens the code from a list of tuples." flat_code = [] for c in code: flat_code.extend(c) return flat_code def make_character(info, value, in_set=False): "Makes a character literal." if in_set: # A character set is built case-sensitively. return Character(value) return Character(value, case_flags=info.flags & CASE_FLAGS) def make_ref_group(info, name, position): "Makes a group reference." return RefGroup(info, name, position, case_flags=info.flags & CASE_FLAGS) def make_string_set(info, name): "Makes a string set." return StringSet(info, name, case_flags=info.flags & CASE_FLAGS) def make_property(info, prop, in_set): "Makes a property." if in_set: return prop return prop.with_flags(case_flags=info.flags & CASE_FLAGS) def _parse_pattern(source, info): "Parses a pattern, eg. 'a|b|c'." branches = [parse_sequence(source, info)] while source.match("|"): branches.append(parse_sequence(source, info)) if len(branches) == 1: return branches[0] return Branch(branches) def parse_sequence(source, info): "Parses a sequence, eg. 'abc'." sequence = [] item = parse_item(source, info) while item: sequence.append(item) item = parse_item(source, info) return make_sequence(sequence) def PossessiveRepeat(element, min_count, max_count): "Builds a possessive repeat." return Atomic(GreedyRepeat(element, min_count, max_count)) def parse_item(source, info): "Parses an item, which might be repeated. Returns None if there's no item." element = parse_element(source, info) counts = parse_quantifier(source, info) if counts: min_count, max_count = counts saved_pos = source.pos ch = source.get() if ch == "?": # The "?" suffix that means it's a lazy repeat. repeated = LazyRepeat elif ch == "+": # The "+" suffix that means it's a possessive repeat. repeated = PossessiveRepeat else: # No suffix means that it's a greedy repeat. source.pos = saved_pos repeated = GreedyRepeat if element.is_empty() or min_count == max_count == 1: return element return repeated(element, min_count, max_count) # No quantifier, but maybe there's a fuzzy constraint. constraints = parse_fuzzy(source) if not constraints: # No fuzzy constraint. return element # If a group is marked as fuzzy then put all of the fuzzy part in the # group. if isinstance(element, Group): element.subpattern = Fuzzy(element.subpattern, constraints) return element return Fuzzy(element, constraints) _QUANTIFIERS = {"?": (0, 1), "*": (0, None), "+": (1, None)} def parse_quantifier(source, info): "Parses a quantifier." while True: saved_pos = source.pos ch = source.get() q = _QUANTIFIERS.get(ch) if q: # It's a quantifier. return q if ch == "{": # Looks like a limited repeated element, eg. 'a{2,3}'. counts = parse_limited_quantifier(source) if counts: return counts elif ch == "(" and source.match("?#"): # A comment. parse_comment(source) continue # Neither a quantifier nor a comment. break # Parse it later, perhaps as a literal. source.pos = saved_pos return None def is_above_limit(count): "Checks whether a count is above the maximum." return count is not None and count >= UNLIMITED def parse_limited_quantifier(source): "Parses a limited quantifier." saved_pos = source.pos min_count = parse_count(source) if source.match(","): max_count = parse_count(source) # No minimum means 0 and no maximum means unlimited. min_count = int(min_count or 0) max_count = int(max_count) if max_count else None if max_count is not None and min_count > max_count: raise error("min repeat greater than max repeat at position {}".format(saved_pos)) else: if not min_count: source.pos = saved_pos return None min_count = max_count = int(min_count) if is_above_limit(min_count) or is_above_limit(max_count): raise error("repeat count too big at position {}".format(saved_pos)) if not source.match ("}"): source.pos = saved_pos return None return min_count, max_count def parse_fuzzy(source): "Parses a fuzzy setting, if present." saved_pos = source.pos if not source.match("{"): source.pos = saved_pos return None constraints = {} try: parse_fuzzy_item(source, constraints) while source.match(","): parse_fuzzy_item(source, constraints) except ParseError: source.pos = saved_pos return None if not source.match("}"): raise error("expected }} at position {}".format(source.pos)) return constraints def parse_fuzzy_item(source, constraints): "Parses a fuzzy setting item." saved_pos = source.pos try: parse_cost_constraint(source, constraints) except ParseError: source.pos = saved_pos parse_cost_equation(source, constraints) def parse_cost_constraint(source, constraints): "Parses a cost constraint." saved_pos = source.pos ch = source.get() if ch in ALPHA: # Syntax: constraint [("<=" | "<") cost] constraint = parse_constraint(source, constraints, ch) max_inc = parse_fuzzy_compare(source) if max_inc is None: # No maximum cost. constraints[constraint] = 0, None else: # There's a maximum cost. cost_pos = source.pos max_cost = int(parse_count(source)) # Inclusive or exclusive limit? if not max_inc: max_cost -= 1 if max_cost < 0: raise error("bad fuzzy cost limit at position {}".format(cost_pos)) constraints[constraint] = 0, max_cost elif ch in DIGITS: # Syntax: cost ("<=" | "<") constraint ("<=" | "<") cost source.pos = saved_pos try: # Minimum cost. min_cost = int(parse_count(source)) min_inc = parse_fuzzy_compare(source) if min_inc is None: raise ParseError() constraint = parse_constraint(source, constraints, source.get()) max_inc = parse_fuzzy_compare(source) if max_inc is None: raise ParseError() # Maximum cost. cost_pos = source.pos max_cost = int(parse_count(source)) # Inclusive or exclusive limits? if not min_inc: min_cost += 1 if not max_inc: max_cost -= 1 if not 0 <= min_cost <= max_cost: raise error("bad fuzzy cost limit at position {}".format(cost_pos)) constraints[constraint] = min_cost, max_cost except ValueError: raise ParseError() else: raise ParseError() def parse_constraint(source, constraints, ch): "Parses a constraint." if ch not in "deis": raise error("bad fuzzy constraint at position {}".format(source.pos)) if ch in constraints: raise error("repeated fuzzy constraint at position {}".format(source.pos)) return ch def parse_fuzzy_compare(source): "Parses a cost comparator." if source.match("<="): return True elif source.match("<"): return False else: return None def parse_cost_equation(source, constraints): "Parses a cost equation." if "cost" in constraints: raise error("more than one cost equation at position {}".format(source.pos)) cost = {} parse_cost_term(source, cost) while source.match("+"): parse_cost_term(source, cost) max_inc = parse_fuzzy_compare(source) if max_inc is None: raise error("missing fuzzy cost limit at position {}".format(source.pos)) max_cost = int(parse_count(source)) if not max_inc: max_cost -= 1 if max_cost < 0: raise error("bad fuzzy cost limit at position {}".format(source.pos)) cost["max"] = max_cost constraints["cost"] = cost def parse_cost_term(source, cost): "Parses a cost equation term." coeff = parse_count(source) ch = source.get() if ch not in "dis": raise ParseError() if ch in cost: raise error("repeated fuzzy cost at position {}".format(source.pos)) cost[ch] = int(coeff or 1) def parse_count(source): "Parses a quantifier's count, which can be empty." return source.get_while(DIGITS) def parse_element(source, info): """Parses an element. An element might actually be a flag, eg. '(?i)', in which case it returns None. """ while True: saved_pos = source.pos ch = source.get() if ch in SPECIAL_CHARS: if ch in ")|": # The end of a sequence. At the end of the pattern ch is "". source.pos = saved_pos return None elif ch == "\\": # An escape sequence outside a set. return parse_escape(source, info, False) elif ch == "(": # A parenthesised subpattern or a flag. element = parse_paren(source, info) if element and element is not COMMENT: return element elif ch == ".": # Any character. if info.flags & DOTALL: return AnyAll() elif info.flags & WORD: return AnyU() else: return Any() elif ch == "[": # A character set. return parse_set(source, info) elif ch == "^": # The start of a line or the string. if info.flags & MULTILINE: if info.flags & WORD: return StartOfLineU() else: return StartOfLine() else: return StartOfString() elif ch == "$": # The end of a line or the string. if info.flags & MULTILINE: if info.flags & WORD: return EndOfLineU() else: return EndOfLine() else: if info.flags & WORD: return EndOfStringLineU() else: return EndOfStringLine() elif ch == "{": # Looks like a limited quantifier. saved_pos_2 = source.pos source.pos = saved_pos counts = parse_quantifier(source, info) if counts: # A quantifier where we expected an element. raise error("nothing to repeat at position {}".format(saved_pos_2)) # Not a quantifier, so it's a literal. source.pos = saved_pos_2 return make_character(info, ord(ch)) elif ch in "?*+": # A quantifier where we expected an element. raise error("nothing to repeat at position {}".format(saved_pos)) else: # A literal. return make_character(info, ord(ch)) else: # A literal. return make_character(info, ord(ch)) def parse_paren(source, info): "Parses a parenthesised subpattern or a flag." saved_pos = source.pos ch = source.get() if ch == "?": # (?... saved_pos_2 = source.pos ch = source.get() if ch == "<": # (?<... saved_pos_3 = source.pos ch = source.get() if ch in ("=", "!"): # (?<=... or (?") saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) info.close_group() return Group(info, group, subpattern) if ch in ("=", "!"): # (?=... or (?!...: lookahead. return parse_lookaround(source, info, False, ch == "=") if ch == "P": # (?P...: a Python extension. return parse_extension(source, info) if ch == "#": # (?#...: a comment. return parse_comment(source) if ch == "(": # (?(...: a conditional subpattern. return parse_conditional(source, info) if ch == ">": # (?>...: an atomic subpattern. return parse_atomic(source, info) if ch == "|": # (?|...: a common/reset groups branch. return parse_common(source, info) if ch == "R" or "0" <= ch <= "9": # (?R...: probably a call to a group. return parse_call_group(source, info, ch, saved_pos_2) if ch == "&": # (?&...: a call to a named group. return parse_call_named_group(source, info, saved_pos_2) # (?...: probably a flags subpattern. source.pos = saved_pos_2 return parse_flags_subpattern(source, info) # (...: an unnamed capture group. source.pos = saved_pos group = info.open_group() saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) info.close_group() return Group(info, group, subpattern) def parse_extension(source, info): "Parses a Python extension." saved_pos = source.pos ch = source.get() if ch == "<": # (?P<...: a named capture group. name = parse_name(source) group = info.open_group(name) source.expect(">") saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) info.close_group() return Group(info, group, subpattern) if ch == "=": # (?P=...: a named group reference. name = parse_name(source) source.expect(")") if info.is_open_group(name): raise error("can't refer to an open group at position {}".format(saved_pos)) return make_ref_group(info, name, saved_pos) if ch == ">" or ch == "&": # (?P>...: a call to a group. return parse_call_named_group(source, info, saved_pos) source.pos = saved_pos raise error("unknown extension at position {}".format(saved_pos)) def parse_comment(source): "Parses a comment." source.skip_while(set(")"), include=False) source.expect(")") return COMMENT def parse_lookaround(source, info, behind, positive): "Parses a lookaround." saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) return LookAround(behind, positive, subpattern) def parse_conditional(source, info): "Parses a conditional subpattern." saved_flags = info.flags saved_pos = source.pos try: group = parse_name(source, True) source.expect(")") yes_branch = parse_sequence(source, info) if source.match("|"): no_branch = parse_sequence(source, info) else: no_branch = Sequence() source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) if yes_branch.is_empty() and no_branch.is_empty(): return Sequence() return Conditional(info, group, yes_branch, no_branch, saved_pos) def parse_atomic(source, info): "Parses an atomic subpattern." saved_flags = info.flags try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) return Atomic(subpattern) def parse_common(source, info): "Parses a common groups branch." # Capture group numbers in different branches can reuse the group numbers. initial_group_count = info.group_count branches = [parse_sequence(source, info)] final_group_count = info.group_count while source.match("|"): info.group_count = initial_group_count branches.append(parse_sequence(source, info)) final_group_count = max(final_group_count, info.group_count) info.group_count = final_group_count source.expect(")") if len(branches) == 1: return branches[0] return Branch(branches) def parse_call_group(source, info, ch, pos): "Parses a call to a group." if ch == "R": group = "0" else: group = ch + source.get_while(DIGITS) source.expect(")") return CallGroup(info, group, pos) def parse_call_named_group(source, info, pos): "Parses a call to a named group." group = parse_name(source) source.expect(")") return CallGroup(info, group, pos) def parse_flag_set(source): "Parses a set of inline flags." flags = 0 try: while True: saved_pos = source.pos ch = source.get() if ch == "V": ch += source.get() flags |= REGEX_FLAGS[ch] except KeyError: source.pos = saved_pos return flags def parse_flags(source, info): "Parses flags being turned on/off." flags_on = parse_flag_set(source) if source.match("-"): flags_off = parse_flag_set(source) if not flags_off: raise error("bad inline flags: no flags after '-' at position {}".format(source.pos)) else: flags_off = 0 return flags_on, flags_off def parse_subpattern(source, info, flags_on, flags_off): "Parses a subpattern with scoped flags." saved_flags = info.flags info.flags = (info.flags | flags_on) & ~flags_off source.ignore_space = bool(info.flags & VERBOSE) try: subpattern = _parse_pattern(source, info) source.expect(")") finally: info.flags = saved_flags source.ignore_space = bool(info.flags & VERBOSE) return subpattern def parse_positional_flags(source, info, flags_on, flags_off): "Parses positional flags." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version == VERSION0: # Positional flags are global and can only be turned on. if flags_off: raise error("bad inline flags: can't turn flags off at position {}".format(source.pos)) new_global_flags = flags_on & ~info.global_flags if new_global_flags: info.global_flags |= new_global_flags # A global has been turned on, so reparse the pattern. raise _UnscopedFlagSet(info.global_flags) else: info.flags = (info.flags | flags_on) & ~flags_off source.ignore_space = bool(info.flags & VERBOSE) return None def parse_flags_subpattern(source, info): """Parses a flags subpattern. It could be inline flags or a subpattern possibly with local flags. """ flags_on, flags_off = parse_flags(source, info) if flags_off & GLOBAL_FLAGS: raise error("bad inline flags: can't turn off global flag at position {}".format(source.pos)) if flags_on & flags_off: raise error("bad inline flags: flag turned on and off at position {}".format(source.pos)) # Handle flags which are global in all regex behaviours. new_global_flags = (flags_on & ~info.global_flags) & GLOBAL_FLAGS if new_global_flags: info.global_flags |= new_global_flags # A global has been turned on, so reparse the pattern. raise _UnscopedFlagSet(info.global_flags) # Ensure that from now on we have only scoped flags. flags_on &= ~GLOBAL_FLAGS if source.match(":"): return parse_subpattern(source, info, flags_on, flags_off) if source.match(")"): return parse_positional_flags(source, info, flags_on, flags_off) raise error("unknown extension at position {}".format(source.pos)) def parse_name(source, allow_numeric=False): "Parses a name." name = source.get_while(set(")>"), include=False) if not name: raise error("bad group name at position {}".format(source.pos)) if name.isdigit(): if not allow_numeric: raise error("bad group name at position {}".format(source.pos)) else: if not name.isidentifier(): raise error("bad group name at position {}".format(source.pos)) return name def is_octal(string): "Checks whether a string is octal." return all(ch in OCT_DIGITS for ch in string) def is_decimal(string): "Checks whether a string is decimal." return all(ch in DIGITS for ch in string) def is_hexadecimal(string): "Checks whether a string is hexadecimal." return all(ch in HEX_DIGITS for ch in string) def parse_escape(source, info, in_set): "Parses an escape sequence." saved_ignore = source.ignore_space source.ignore_space = False ch = source.get() source.ignore_space = saved_ignore if not ch: # A backslash at the end of the pattern. raise error("bad escape at position {}".format(source.pos)) if ch in HEX_ESCAPES: # A hexadecimal escape sequence. return parse_hex_escape(source, info, HEX_ESCAPES[ch], in_set) elif ch == "g" and not in_set: # A group reference. saved_pos = source.pos try: return parse_group_ref(source, info) except error: # Invalid as a group reference, so assume it's a literal. source.pos = saved_pos return make_character(info, ord(ch), in_set) elif ch == "G" and not in_set: # A search anchor. return SearchAnchor() elif ch == "L" and not in_set: # A string set. return parse_string_set(source, info) elif ch == "N": # A named codepoint. return parse_named_char(source, info, in_set) elif ch in "pP": # A Unicode property, positive or negative. return parse_property(source, info, ch == "p", in_set) elif ch == "X" and not in_set: # A grapheme cluster. return Grapheme() elif ch in ALPHA: # An alphabetic escape sequence. # Positional escapes aren't allowed inside a character set. if not in_set: if info.flags & WORD: value = WORD_POSITION_ESCAPES.get(ch) else: value = POSITION_ESCAPES.get(ch) if value: return value value = CHARSET_ESCAPES.get(ch) if value: return value value = CHARACTER_ESCAPES.get(ch) if value: return Character(ord(value)) return make_character(info, ord(ch), in_set) elif ch in DIGITS: # A numeric escape sequence. return parse_numeric_escape(source, info, ch, in_set) else: # A literal. return make_character(info, ord(ch), in_set) def parse_numeric_escape(source, info, ch, in_set): "Parses a numeric escape sequence." if in_set or ch == "0": # Octal escape sequence, max 3 digits. return parse_octal_escape(source, info, [ch], in_set) # At least 1 digit, so either octal escape or group. digits = ch saved_pos = source.pos ch = source.get() if ch in DIGITS: # At least 2 digits, so either octal escape or group. digits += ch saved_pos = source.pos ch = source.get() if is_octal(digits) and ch in OCT_DIGITS: # 3 octal digits, so octal escape sequence. encoding = info.flags & _ALL_ENCODINGS if encoding == ASCII or encoding == LOCALE: octal_mask = 0xFF else: octal_mask = 0x1FF value = int(digits + ch, 8) & octal_mask return make_character(info, value) # Group reference. source.pos = saved_pos if info.is_open_group(digits): raise error("can't refer to an open group at position {}".format(source.pos)) return make_ref_group(info, digits, source.pos) def parse_octal_escape(source, info, digits, in_set): "Parses an octal escape sequence." saved_pos = source.pos ch = source.get() while len(digits) < 3 and ch in OCT_DIGITS: digits.append(ch) saved_pos = source.pos ch = source.get() source.pos = saved_pos try: value = int("".join(digits), 8) return make_character(info, value, in_set) except ValueError: raise error("bad octal escape at position {}".format(source.pos)) def parse_hex_escape(source, info, expected_len, in_set): "Parses a hex escape sequence." digits = [] for i in range(expected_len): ch = source.get() if ch not in HEX_DIGITS: raise error("bad hex escape at position {}".format(source.pos)) digits.append(ch) value = int("".join(digits), 16) return make_character(info, value, in_set) def parse_group_ref(source, info): "Parses a group reference." source.expect("<") saved_pos = source.pos name = parse_name(source, True) source.expect(">") if info.is_open_group(name): raise error("can't refer to an open group at position {}".format(source.pos)) return make_ref_group(info, name, saved_pos) def parse_string_set(source, info): "Parses a string set reference." source.expect("<") name = parse_name(source, True) source.expect(">") if name is None or name not in info.kwargs: raise error("undefined named list at position {}".format(source.pos)) return make_string_set(info, name) def parse_named_char(source, info, in_set): "Parses a named character." saved_pos = source.pos if source.match("{"): name = source.get_while(NAMED_CHAR_PART) if source.match("}"): try: value = unicodedata.lookup(name) return make_character(info, ord(value), in_set) except KeyError: raise error("undefined character name at position {}".format(source.pos)) source.pos = saved_pos return make_character(info, ord("N"), in_set) def parse_property(source, info, positive, in_set): "Parses a Unicode property." saved_pos = source.pos ch = source.get() if ch == "{": negate = source.match("^") prop_name, name = parse_property_name(source) if source.match("}"): # It's correctly delimited. prop = lookup_property(prop_name, name, positive != negate) return make_property(info, prop, in_set) elif ch and ch in "CLMNPSZ": # An abbreviated property, eg \pL. prop = lookup_property(None, ch, positive) return make_property(info, prop, in_set) # Not a property, so treat as a literal "p" or "P". source.pos = saved_pos ch = "p" if positive else "P" return make_character(info, ord(ch), in_set) def parse_property_name(source): "Parses a property name, which may be qualified." name = source.get_while(PROPERTY_NAME_PART) saved_pos = source.pos ch = source.get() if ch and ch in ":=": prop_name = name name = source.get_while(ALNUM | set(" &_-./")).strip() if name: # Name after the ":" or "=", so it's a qualified name. saved_pos = source.pos else: # No name after the ":" or "=", so assume it's an unqualified name. prop_name, name = None, prop_name else: prop_name = None source.pos = saved_pos return prop_name, name def parse_set(source, info): "Parses a character set." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION saved_ignore = source.ignore_space source.ignore_space = False # Negative set? negate = source.match("^") try: if version == VERSION0: item = parse_set_imp_union(source, info) else: item = parse_set_union(source, info) if not source.match("]"): raise error("missing ] at position {}".format(source.pos)) finally: source.ignore_space = saved_ignore if negate: item = item.with_flags(positive=not item.positive) item = item.with_flags(case_flags=info.flags & CASE_FLAGS) return item def parse_set_union(source, info): "Parses a set union ([x||y])." items = [parse_set_symm_diff(source, info)] while source.match("||"): items.append(parse_set_symm_diff(source, info)) if len(items) == 1: return items[0] return SetUnion(info, items) def parse_set_symm_diff(source, info): "Parses a set symmetric difference ([x~~y])." items = [parse_set_inter(source, info)] while source.match("~~"): items.append(parse_set_inter(source, info)) if len(items) == 1: return items[0] return SetSymDiff(info, items) def parse_set_inter(source, info): "Parses a set intersection ([x&&y])." items = [parse_set_diff(source, info)] while source.match("&&"): items.append(parse_set_diff(source, info)) if len(items) == 1: return items[0] return SetInter(info, items) def parse_set_diff(source, info): "Parses a set difference ([x--y])." items = [parse_set_imp_union(source, info)] while source.match("--"): items.append(parse_set_imp_union(source, info)) if len(items) == 1: return items[0] return SetDiff(info, items) def parse_set_imp_union(source, info): "Parses a set implicit union ([xy])." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION items = [parse_set_member(source, info)] while True: saved_pos = source.pos if source.match("]"): # End of the set. source.pos = saved_pos break if version == VERSION1 and any(source.match(op) for op in SET_OPS): # The new behaviour has set operators. source.pos = saved_pos break items.append(parse_set_member(source, info)) if len(items) == 1: return items[0] return SetUnion(info, items) def parse_set_member(source, info): "Parses a member in a character set." # Parse a set item. start = parse_set_item(source, info) if (not isinstance(start, Character) or not start.positive or not source.match("-")): # It's not the start of a range. return start # It looks like the start of a range of characters. saved_pos = source.pos if source.match("]"): # We've reached the end of the set, so return both the character and # hyphen. source.pos = saved_pos return SetUnion(info, [start, Character(ord("-"))]) # Parse a set item. end = parse_set_item(source, info) if not isinstance(end, Character) or not end.positive: # It's not a range, so return the character, hyphen and property. return SetUnion(info, [start, Character(ord("-")), end]) # It _is_ a range. if start.value > end.value: raise error("bad character range at position {}".format(source.pos)) if start.value == end.value: return start return Range(start.value, end.value) def parse_set_item(source, info): "Parses an item in a character set." version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if source.match("\\"): # An escape sequence in a set. return parse_escape(source, info, True) saved_pos = source.pos if source.match("[:"): # Looks like a POSIX character class. try: return parse_posix_class(source, info) except ParseError: # Not a POSIX character class. source.pos = saved_pos if version == VERSION1 and source.match("["): # It's the start of a nested set. # Negative set? negate = source.match("^") item = parse_set_union(source, info) if not source.match("]"): raise error("missing ] at position {}".format(source.pos)) if negate: item = item.with_flags(positive=not item.positive) return item ch = source.get() if not ch: raise error("bad set at position {}".format(source.pos), True) return Character(ord(ch)) def parse_posix_class(source, info): "Parses a POSIX character class." negate = source.match("^") prop_name, name = parse_property_name(source) if not source.match(":]"): raise ParseError() return lookup_property(prop_name, name, positive=not negate) def float_to_rational(flt): "Converts a float to a rational pair." int_part = int(flt) error = flt - int_part if abs(error) < 0.0001: return int_part, 1 den, num = float_to_rational(1.0 / error) return int_part * den + num, den def numeric_to_rational(numeric): "Converts a numeric string to a rational string, if possible." if numeric[0] == "-": sign, numeric = numeric[0], numeric[1 : ] else: sign = "" parts = numeric.split("/") if len(parts) == 2: num, den = float_to_rational(float(parts[0]) / float(parts[1])) elif len(parts) == 1: num, den = float_to_rational(float(parts[0])) else: raise ValueError() result = "{}{}/{}".format(sign, num, den) if result.endswith("/1"): return result[ : -2] return result def standardise_name(name): "Standardises a property or value name." try: return numeric_to_rational("".join(name)) except (ValueError, ZeroDivisionError): return "".join(ch for ch in name if ch not in "_- ").upper() def lookup_property(property, value, positive): "Looks up a property." # Normalise the names (which may still be lists). property = standardise_name(property) if property else None value = standardise_name(value) if property: # Both the property and the value are provided. prop = PROPERTIES.get(property) if not prop: raise error("unknown property at position {}".format(source.pos)) prop_id, value_dict = prop val_id = value_dict.get(value) if val_id is None: raise error("unknown property value at position {}".format(source.pos)) if "YES" in value_dict and val_id == 0: positive, val_id = not positive, 1 return Property((prop_id << 16) | val_id, positive) # Only the value is provided. # It might be the name of a GC, script or block value. for property in ("GC", "SCRIPT", "BLOCK"): prop_id, value_dict = PROPERTIES.get(property) val_id = value_dict.get(value) if val_id is not None: return Property((prop_id << 16) | val_id, positive) # It might be the name of a binary property. prop = PROPERTIES.get(value) if prop: prop_id, value_dict = prop if "YES" in value_dict: return Property((prop_id << 16) | 1, positive) # It might be the name of a binary property starting with a prefix. if value.startswith("IS"): prop = PROPERTIES.get(value[2 : ]) if prop: prop_id, value_dict = prop if "YES" in value_dict: return Property((prop_id << 16) | 1, positive) # It might be the name of a script or block starting with a prefix. for prefix, property in (("IS", "SCRIPT"), ("IN", "BLOCK")): if value.startswith(prefix): prop_id, value_dict = PROPERTIES.get(property) val_id = value_dict.get(value[2 : ]) if val_id is not None: return Property((prop_id << 16) | val_id, positive) # Unknown property. raise error("unknown property at position {}".format(source.pos)) def _compile_replacement(source, pattern, is_unicode): "Compiles a replacement template escape sequence." ch = source.get() if ch in ALPHA: # An alphabetic escape sequence. value = CHARACTER_ESCAPES.get(ch) if value: return False, [ord(value)] if ch in HEX_ESCAPES and (ch == "x" or is_unicode): # A hexadecimal escape sequence. return False, [parse_repl_hex_escape(source, HEX_ESCAPES[ch])] if ch == "g": # A group preference. return True, [compile_repl_group(source, pattern)] if ch == "N" and is_unicode: # A named character. value = parse_repl_named_char(source) if value is not None: return False, [value] return False, [ord("\\"), ord(ch)] if isinstance(source.sep, bytes): octal_mask = 0xFF else: octal_mask = 0x1FF if ch == "0": # An octal escape sequence. digits = ch while len(digits) < 3: saved_pos = source.pos ch = source.get() if ch not in OCT_DIGITS: source.pos = saved_pos break digits += ch return False, [int(digits, 8) & octal_mask] if ch in DIGITS: # Either an octal escape sequence (3 digits) or a group reference (max # 2 digits). digits = ch saved_pos = source.pos ch = source.get() if ch in DIGITS: digits += ch saved_pos = source.pos ch = source.get() if ch and is_octal(digits + ch): # An octal escape sequence. return False, [int(digits + ch, 8) & octal_mask] # A group reference. source.pos = saved_pos return True, [int(digits)] if ch == "\\": # An escaped backslash is a backslash. return False, [ord("\\")] if not ch: # A trailing backslash. raise error("bad escape at position {}".format(source.pos)) # An escaped non-backslash is a backslash followed by the literal. return False, [ord("\\"), ord(ch)] def parse_repl_hex_escape(source, expected_len): "Parses a hex escape sequence in a replacement string." digits = [] for i in range(expected_len): ch = source.get() if ch not in HEX_DIGITS: raise error("bad hex escape at position {}".format(source.pos)) digits.append(ch) return int("".join(digits), 16) def parse_repl_named_char(source): "Parses a named character in a replacement string." saved_pos = source.pos if source.match("{"): name = source.get_while(ALPHA | set(" ")) if source.match("}"): try: value = unicodedata.lookup(name) return ord(value) except KeyError: raise error("undefined character name at position {}".format(source.pos)) source.pos = saved_pos return None def compile_repl_group(source, pattern): "Compiles a replacement template group reference." source.expect("<") name = parse_name(source, True) source.expect(">") if name.isdigit(): index = int(name) if not 0 <= index <= pattern.groups: raise error("invalid group at position {}".format(source.pos)) return index try: return pattern.groupindex[name] except KeyError: raise IndexError("unknown group") # The regular expression is parsed into a syntax tree. The different types of # node are defined below. INDENT = " " POSITIVE_OP = 0x1 ZEROWIDTH_OP = 0x2 FUZZY_OP = 0x4 REVERSE_OP = 0x8 REQUIRED_OP = 0x10 POS_TEXT = {False: "NON-MATCH", True: "MATCH"} CASE_TEXT = {NOCASE: "", IGNORECASE: " SIMPLE_IGNORE_CASE", FULLCASE: "", FULLIGNORECASE: " FULL_IGNORE_CASE"} def make_sequence(items): if len(items) == 1: return items[0] return Sequence(items) # Common base class for all nodes. class RegexBase: def __init__(self): self._key = self.__class__ def with_flags(self, positive=None, case_flags=None, zerowidth=None): if positive is None: positive = self.positive else: positive = bool(positive) if case_flags is None: case_flags = self.case_flags else: case_flags = case_flags & CASE_FLAGS if zerowidth is None: zerowidth = self.zerowidth else: zerowidth = bool(zerowidth) if (positive == self.positive and case_flags == self.case_flags and zerowidth == self.zerowidth): return self return self.rebuild(positive, case_flags, zerowidth) def fix_groups(self, reverse, fuzzy): pass def optimise(self, info): return self def pack_characters(self, info): return self def remove_captures(self): return self def is_atomic(self): return True def can_be_affix(self): return True def contains_group(self): return False def get_firstset(self, reverse): raise _FirstSetError() def has_simple_start(self): return False def is_empty(self): return False def __hash__(self): return hash(self._key) def __eq__(self, other): return type(self) is type(other) and self._key == other._key def __ne__(self, other): return not self.__eq__(other) def get_required_string(self, reverse): return self.max_width(), None # Base class for zero-width nodes. class ZeroWidthBase(RegexBase): def __init__(self, positive=True): RegexBase.__init__(self) self.positive = bool(positive) self._key = self.__class__, self.positive def get_firstset(self, reverse): return set([None]) def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if fuzzy: flags |= FUZZY_OP if reverse: flags |= REVERSE_OP return [(self._opcode, flags)] def dump(self, indent=0, reverse=False): print("{}{} {}".format(INDENT * indent, self._op_name, POS_TEXT[self.positive])) def max_width(self): return 0 class Any(RegexBase): _opcode = {False: OP.ANY, True: OP.ANY_REV} _op_name = "ANY" def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if fuzzy: flags |= FUZZY_OP return [(self._opcode[reverse], flags)] def dump(self, indent=0, reverse=False): print("{}{}".format(INDENT * indent, self._op_name)) def max_width(self): return 1 class AnyAll(Any): _opcode = {False: OP.ANY_ALL, True: OP.ANY_ALL_REV} _op_name = "ANY_ALL" class AnyU(Any): _opcode = {False: OP.ANY_U, True: OP.ANY_U_REV} _op_name = "ANY_U" class Atomic(RegexBase): def __init__(self, subpattern): RegexBase.__init__(self) self.subpattern = subpattern def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(reverse, fuzzy) def optimise(self, info): self.subpattern = self.subpattern.optimise(info) if self.subpattern.is_empty(): return self.subpattern return self def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): self.subpattern = self.subpattern.remove_captures() return self def can_be_affix(self): return self.subpattern.can_be_affix() def contains_group(self): return self.subpattern.contains_group() def get_firstset(self, reverse): return self.subpattern.get_firstset(reverse) def has_simple_start(self): return self.subpattern.has_simple_start() def compile(self, reverse=False, fuzzy=False): return ([(OP.ATOMIC, )] + self.subpattern.compile(reverse, fuzzy) + [(OP.END, )]) def dump(self, indent=0, reverse=False): print("{}ATOMIC".format(INDENT * indent)) self.subpattern.dump(indent + 1, reverse) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return (type(self) is type(other) and self.subpattern == other.subpattern) def max_width(self): return self.subpattern.max_width() def get_required_string(self, reverse): return self.subpattern.get_required_string(reverse) class Boundary(ZeroWidthBase): _opcode = OP.BOUNDARY _op_name = "BOUNDARY" class Branch(RegexBase): def __init__(self, branches): RegexBase.__init__(self) self.branches = branches def fix_groups(self, reverse, fuzzy): for b in self.branches: b.fix_groups(reverse, fuzzy) def optimise(self, info): # Flatten branches within branches. branches = Branch._flatten_branches(info, self.branches) # Move any common prefix or suffix out of the branches. prefix, branches = Branch._split_common_prefix(info, branches) suffix, branches = Branch._split_common_suffix(info, branches) # Merge branches starting with the same character. (If a character # prefix doesn't match in one branch, it won't match in any of the # others starting with that same character.) branches = Branch._merge_common_prefixes(info, branches) # Try to reduce adjacent single-character branches to sets. branches = Branch._reduce_to_set(info, branches) if len(branches) > 1: sequence = prefix + [Branch(branches)] + suffix else: sequence = prefix + branches + suffix return make_sequence(sequence) def pack_characters(self, info): self.branches = [b.pack_characters(info) for b in self.branches] return self def remove_captures(self): self.branches = [b.remove_captures() for b in self.branches] return self def is_atomic(self): return all(b.is_atomic() for b in self.branches) def can_be_affix(self): return all(b.can_be_affix() for b in self.branches) def contains_group(self): return any(b.contains_group() for b in self.branches) def get_firstset(self, reverse): fs = set() for b in self.branches: fs |= b.get_firstset(reverse) return fs or set([None]) def compile(self, reverse=False, fuzzy=False): code = [(OP.BRANCH, )] for b in self.branches: code.extend(b.compile(reverse, fuzzy)) code.append((OP.NEXT, )) code[-1] = (OP.END, ) return code def dump(self, indent=0, reverse=False): print("{}BRANCH".format(INDENT * indent)) self.branches[0].dump(indent + 1, reverse) for b in self.branches[1 : ]: print("{}OR".format(INDENT * indent)) b.dump(indent + 1, reverse) @staticmethod def _flatten_branches(info, branches): # Flatten the branches so that there aren't branches of branches. new_branches = [] for b in branches: b = b.optimise(info) if isinstance(b, Branch): new_branches.extend(b.branches) else: new_branches.append(b) return new_branches @staticmethod def _split_common_prefix(info, branches): # Common leading items can be moved out of the branches. # Get the items in the branches. alternatives = [] for b in branches: if isinstance(b, Sequence): alternatives.append(b.items) else: alternatives.append([b]) # What is the maximum possible length of the prefix? max_count = min(len(a) for a in alternatives) # What is the longest common prefix? prefix = alternatives[0] pos = 0 end_pos = max_count while pos < end_pos and prefix[pos].can_be_affix() and all(a[pos] == prefix[pos] for a in alternatives): pos += 1 count = pos if info.flags & UNICODE: # We need to check that we're not splitting a sequence of # characters which could form part of full case-folding. count = pos while count > 0 and not all(Branch._can_split(a, count) for a in alternatives): count -= 1 # No common prefix is possible. if count == 0: return [], branches # Rebuild the branches. new_branches = [] for a in alternatives: new_branches.append(make_sequence(a[count : ])) return prefix[ : count], new_branches @staticmethod def _split_common_suffix(info, branches): # Common trailing items can be moved out of the branches. # Get the items in the branches. alternatives = [] for b in branches: if isinstance(b, Sequence): alternatives.append(b.items) else: alternatives.append([b]) # What is the maximum possible length of the suffix? max_count = min(len(a) for a in alternatives) # What is the longest common suffix? suffix = alternatives[0] pos = -1 end_pos = -1 - max_count while pos > end_pos and suffix[pos].can_be_affix() and all(a[pos] == suffix[pos] for a in alternatives): pos -= 1 count = -1 - pos if info.flags & UNICODE: # We need to check that we're not splitting a sequence of # characters which could form part of full case-folding. while count > 0 and not all(Branch._can_split_rev(a, count) for a in alternatives): count -= 1 # No common suffix is possible. if count == 0: return [], branches # Rebuild the branches. new_branches = [] for a in alternatives: new_branches.append(make_sequence(a[ : -count])) return suffix[-count : ], new_branches @staticmethod def _can_split(items, count): # Check the characters either side of the proposed split. if not Branch._is_full_case(items, count - 1): return True if not Branch._is_full_case(items, count): return True # Check whether a 1-1 split would be OK. if Branch._is_folded(items[count - 1 : count + 1]): return False # Check whether a 1-2 split would be OK. if (Branch._is_full_case(items, count + 2) and Branch._is_folded(items[count - 1 : count + 2])): return False # Check whether a 2-1 split would be OK. if (Branch._is_full_case(items, count - 2) and Branch._is_folded(items[count - 2 : count + 1])): return False return True @staticmethod def _can_split_rev(items, count): end = len(items) # Check the characters either side of the proposed split. if not Branch._is_full_case(items, end - count): return True if not Branch._is_full_case(items, end - count - 1): return True # Check whether a 1-1 split would be OK. if Branch._is_folded(items[end - count - 1 : end - count + 1]): return False # Check whether a 1-2 split would be OK. if (Branch._is_full_case(items, end - count + 2) and Branch._is_folded(items[end - count - 1 : end - count + 2])): return False # Check whether a 2-1 split would be OK. if (Branch._is_full_case(items, end - count - 2) and Branch._is_folded(items[end - count - 2 : end - count + 1])): return False return True @staticmethod def _merge_common_prefixes(info, branches): # Branches with the same case-sensitive character prefix can be grouped # together if they are separated only by other branches with a # character prefix. prefixed = defaultdict(list) order = {} new_branches = [] for b in branches: if Branch._is_simple_character(b): # Branch starts with a simple character. prefixed[b.value].append([b]) order.setdefault(b.value, len(order)) elif (isinstance(b, Sequence) and b.items and Branch._is_simple_character(b.items[0])): # Branch starts with a simple character. prefixed[b.items[0].value].append(b.items) order.setdefault(b.items[0].value, len(order)) else: Branch._flush_char_prefix(info, prefixed, order, new_branches) new_branches.append(b) Branch._flush_char_prefix(info, prefixed, order, new_branches) return new_branches @staticmethod def _is_simple_character(c): return isinstance(c, Character) and c.positive and not c.case_flags @staticmethod def _reduce_to_set(info, branches): # Can the branches be reduced to a set? new_branches = [] items = set() case_flags = NOCASE for b in branches: if isinstance(b, (Character, Property, SetBase)): # Branch starts with a single character. if b.case_flags != case_flags: # Different case sensitivity, so flush. Branch._flush_set_members(info, items, case_flags, new_branches) case_flags = b.case_flags items.add(b.with_flags(case_flags=NOCASE)) else: Branch._flush_set_members(info, items, case_flags, new_branches) new_branches.append(b) Branch._flush_set_members(info, items, case_flags, new_branches) return new_branches @staticmethod def _flush_char_prefix(info, prefixed, order, new_branches): # Flush the prefixed branches. if not prefixed: return for value, branches in sorted(prefixed.items(), key=lambda pair: order[pair[0]]): if len(branches) == 1: new_branches.append(make_sequence(branches[0])) else: subbranches = [] optional = False for b in branches: if len(b) > 1: subbranches.append(make_sequence(b[1 : ])) elif not optional: subbranches.append(Sequence()) optional = True sequence = Sequence([Character(value), Branch(subbranches)]) new_branches.append(sequence.optimise(info)) prefixed.clear() order.clear() @staticmethod def _flush_set_members(info, items, case_flags, new_branches): # Flush the set members. if not items: return if len(items) == 1: item = list(items)[0] else: item = SetUnion(info, list(items)).optimise(info) new_branches.append(item.with_flags(case_flags=case_flags)) items.clear() @staticmethod def _is_full_case(items, i): if not 0 <= i < len(items): return False item = items[i] return (isinstance(item, Character) and item.positive and (item.case_flags & FULLIGNORECASE) == FULLIGNORECASE) @staticmethod def _is_folded(items): if len(items) < 2: return False for i in items: if (not isinstance(i, Character) or not i.positive or not i.case_flags): return False folded = "".join(chr(i.value) for i in items) folded = _regex.fold_case(FULL_CASE_FOLDING, folded) # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() for c in expanding_chars: if folded == _regex.fold_case(FULL_CASE_FOLDING, c): return True return False def is_empty(self): return all(b.is_empty() for b in self.branches) def __eq__(self, other): return type(self) is type(other) and self.branches == other.branches def max_width(self): return max(b.max_width() for b in self.branches) class CallGroup(RegexBase): def __init__(self, info, group, position): RegexBase.__init__(self) self.info = info self.group = group self.position = position self._key = self.__class__, self.group def fix_groups(self, reverse, fuzzy): try: self.group = int(self.group) except ValueError: try: self.group = self.info.group_index[self.group] except KeyError: raise error("unknown group at position {}".format(self.position)) if not 0 <= self.group <= self.info.group_count: raise error("unknown group at position {}".format(self.position)) if self.group > 0 and self.info.open_group_count[self.group] > 1: raise error("ambiguous group reference at position {}".format(self.position)) self.info.group_calls.append((self, reverse, fuzzy)) self._key = self.__class__, self.group def remove_captures(self): raise error("group reference not allowed at position {}".format(self.position)) def compile(self, reverse=False, fuzzy=False): return [(OP.GROUP_CALL, self.call_ref)] def dump(self, indent=0, reverse=False): print("{}GROUP_CALL {}".format(INDENT * indent, self.group)) def __eq__(self, other): return type(self) is type(other) and self.group == other.group def max_width(self): return UNLIMITED class Character(RegexBase): _opcode = {(NOCASE, False): OP.CHARACTER, (IGNORECASE, False): OP.CHARACTER_IGN, (FULLCASE, False): OP.CHARACTER, (FULLIGNORECASE, False): OP.CHARACTER_IGN, (NOCASE, True): OP.CHARACTER_REV, (IGNORECASE, True): OP.CHARACTER_IGN_REV, (FULLCASE, True): OP.CHARACTER_REV, (FULLIGNORECASE, True): OP.CHARACTER_IGN_REV} def __init__(self, value, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.value = value self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) if (self.positive and (self.case_flags & FULLIGNORECASE) == FULLIGNORECASE): self.folded = _regex.fold_case(FULL_CASE_FOLDING, chr(self.value)) else: self.folded = chr(self.value) self._key = (self.__class__, self.value, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return Character(self.value, positive, case_flags, zerowidth) def optimise(self, info, in_set=False): return self def get_firstset(self, reverse): return set([self]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP code = PrecompiledCode([self._opcode[self.case_flags, reverse], flags, self.value]) if len(self.folded) > 1: # The character expands on full case-folding. code = Branch([code, String([ord(c) for c in self.folded], case_flags=self.case_flags)]) return code.compile(reverse, fuzzy) def dump(self, indent=0, reverse=False): display = ascii(chr(self.value)).lstrip("bu") print("{}CHARACTER {} {}{}".format(INDENT * indent, POS_TEXT[self.positive], display, CASE_TEXT[self.case_flags])) def matches(self, ch): return (ch == self.value) == self.positive def max_width(self): return len(self.folded) def get_required_string(self, reverse): if not self.positive: return 1, None self.folded_characters = tuple(ord(c) for c in self.folded) return 0, self class Conditional(RegexBase): def __init__(self, info, group, yes_item, no_item, position): RegexBase.__init__(self) self.info = info self.group = group self.yes_item = yes_item self.no_item = no_item self.position = position def fix_groups(self, reverse, fuzzy): try: self.group = int(self.group) except ValueError: try: self.group = self.info.group_index[self.group] except KeyError: raise error("unknown group at position {}".format(self.position)) if not 1 <= self.group <= self.info.group_count: raise error("unknown group at position {}".format(self.position)) self.yes_item.fix_groups(reverse, fuzzy) self.no_item.fix_groups(reverse, fuzzy) def optimise(self, info): yes_item = self.yes_item.optimise(info) no_item = self.no_item.optimise(info) return Conditional(info, self.group, yes_item, no_item, self.position) def pack_characters(self, info): self.yes_item = self.yes_item.pack_characters(info) self.no_item = self.no_item.pack_characters(info) return self def remove_captures(self): self.yes_item = self.yes_item.remove_captures() self.no_item = self.no_item.remove_captures() def is_atomic(self): return self.yes_item.is_atomic() and self.no_item.is_atomic() def can_be_affix(self): return self.yes_item.can_be_affix() and self.no_item.can_be_affix() def contains_group(self): return self.yes_item.contains_group() or self.no_item.contains_group() def get_firstset(self, reverse): return (self.yes_item.get_firstset(reverse) | self.no_item.get_firstset(reverse)) def compile(self, reverse=False, fuzzy=False): code = [(OP.GROUP_EXISTS, self.group)] code.extend(self.yes_item.compile(reverse, fuzzy)) add_code = self.no_item.compile(reverse, fuzzy) if add_code: code.append((OP.NEXT, )) code.extend(add_code) code.append((OP.END, )) return code def dump(self, indent=0, reverse=False): print("{}GROUP_EXISTS {}".format(INDENT * indent, self.group)) self.yes_item.dump(indent + 1, reverse) if self.no_item: print("{}OR".format(INDENT * indent)) self.no_item.dump(indent + 1, reverse) def is_empty(self): return self.yes_item.is_empty() and self.no_item.is_empty() def __eq__(self, other): return type(self) is type(other) and (self.group, self.yes_item, self.no_item) == (other.group, other.yes_item, other.no_item) def max_width(self): return max(self.yes_item.max_width(), self.no_item.max_width()) class DefaultBoundary(ZeroWidthBase): _opcode = OP.DEFAULT_BOUNDARY _op_name = "DEFAULT_BOUNDARY" class DefaultEndOfWord(ZeroWidthBase): _opcode = OP.DEFAULT_END_OF_WORD _op_name = "DEFAULT_END_OF_WORD" class DefaultStartOfWord(ZeroWidthBase): _opcode = OP.DEFAULT_START_OF_WORD _op_name = "DEFAULT_START_OF_WORD" class EndOfLine(ZeroWidthBase): _opcode = OP.END_OF_LINE _op_name = "END_OF_LINE" class EndOfLineU(EndOfLine): _opcode = OP.END_OF_LINE_U _op_name = "END_OF_LINE_U" class EndOfString(ZeroWidthBase): _opcode = OP.END_OF_STRING _op_name = "END_OF_STRING" class EndOfStringLine(ZeroWidthBase): _opcode = OP.END_OF_STRING_LINE _op_name = "END_OF_STRING_LINE" class EndOfStringLineU(EndOfStringLine): _opcode = OP.END_OF_STRING_LINE_U _op_name = "END_OF_STRING_LINE_U" class EndOfWord(ZeroWidthBase): _opcode = OP.END_OF_WORD _op_name = "END_OF_WORD" class Fuzzy(RegexBase): def __init__(self, subpattern, constraints=None): RegexBase.__init__(self) if constraints is None: constraints = {} self.subpattern = subpattern self.constraints = constraints # If an error type is mentioned in the cost equation, then its maximum # defaults to unlimited. if "cost" in constraints: for e in "dis": if e in constraints["cost"]: constraints.setdefault(e, (0, None)) # If any error type is mentioned, then all the error maxima default to # 0, otherwise they default to unlimited. if set(constraints) & set("dis"): for e in "dis": constraints.setdefault(e, (0, 0)) else: for e in "dis": constraints.setdefault(e, (0, None)) # The maximum of the generic error type defaults to unlimited. constraints.setdefault("e", (0, None)) # The cost equation defaults to equal costs. Also, the cost of any # error type not mentioned in the cost equation defaults to 0. if "cost" in constraints: for e in "dis": constraints["cost"].setdefault(e, 0) else: constraints["cost"] = {"d": 1, "i": 1, "s": 1, "max": constraints["e"][1]} def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(reverse, True) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): self.subpattern = self.subpattern.remove_captures() return self def is_atomic(self): return self.subpattern.is_atomic() def contains_group(self): return self.subpattern.contains_group() def compile(self, reverse=False, fuzzy=False): # The individual limits. arguments = [] for e in "dise": v = self.constraints[e] arguments.append(v[0]) arguments.append(UNLIMITED if v[1] is None else v[1]) # The coeffs of the cost equation. for e in "dis": arguments.append(self.constraints["cost"][e]) # The maximum of the cost equation. v = self.constraints["cost"]["max"] arguments.append(UNLIMITED if v is None else v) flags = 0 if reverse: flags |= REVERSE_OP return ([(OP.FUZZY, flags) + tuple(arguments)] + self.subpattern.compile(reverse, True) + [(OP.END,)]) def dump(self, indent=0, reverse=False): constraints = self._constraints_to_string() if constraints: constraints = " " + constraints print("{}FUZZY{}".format(INDENT * indent, constraints)) self.subpattern.dump(indent + 1, reverse) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return (type(self) is type(other) and self.subpattern == other.subpattern) def max_width(self): return UNLIMITED def _constraints_to_string(self): constraints = [] for name in "ids": min, max = self.constraints[name] if max == 0: continue con = "" if min > 0: con = "{}<=".format(min) con += name if max is not None: con += "<={}".format(max) constraints.append(con) cost = [] for name in "ids": coeff = self.constraints["cost"][name] if coeff > 0: cost.append("{}{}".format(coeff, name)) limit = self.constraints["cost"]["max"] if limit is not None and limit > 0: cost = "{}<={}".format("+".join(cost), limit) constraints.append(cost) return ",".join(constraints) class Grapheme(RegexBase): def compile(self, reverse=False, fuzzy=False): # Match at least 1 character until a grapheme boundary is reached. Note # that this is the same whether matching forwards or backwards. character_matcher = LazyRepeat(AnyAll(), 1, None).compile(reverse, fuzzy) boundary_matcher = [(OP.GRAPHEME_BOUNDARY, 1)] return character_matcher + boundary_matcher def dump(self, indent=0, reverse=False): print("{}GRAPHEME".format(INDENT * indent)) def max_width(self): return UNLIMITED class GreedyRepeat(RegexBase): _opcode = OP.GREEDY_REPEAT _op_name = "GREEDY_REPEAT" def __init__(self, subpattern, min_count, max_count): RegexBase.__init__(self) self.subpattern = subpattern self.min_count = min_count self.max_count = max_count def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(reverse, fuzzy) def optimise(self, info): subpattern = self.subpattern.optimise(info) return type(self)(subpattern, self.min_count, self.max_count) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): self.subpattern = self.subpattern.remove_captures() return self def is_atomic(self): return self.min_count == self.max_count and self.subpattern.is_atomic() def contains_group(self): return self.subpattern.contains_group() def get_firstset(self, reverse): fs = self.subpattern.get_firstset(reverse) if self.min_count == 0: fs.add(None) return fs def compile(self, reverse=False, fuzzy=False): repeat = [self._opcode, self.min_count] if self.max_count is None: repeat.append(UNLIMITED) else: repeat.append(self.max_count) subpattern = self.subpattern.compile(reverse, fuzzy) if not subpattern: return [] return ([tuple(repeat)] + subpattern + [(OP.END, )]) def dump(self, indent=0, reverse=False): if self.max_count is None: limit = "INF" else: limit = self.max_count print("{}{} {} {}".format(INDENT * indent, self._op_name, self.min_count, limit)) self.subpattern.dump(indent + 1, reverse) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return type(self) is type(other) and (self.subpattern, self.min_count, self.max_count) == (other.subpattern, other.min_count, other.max_count) def max_width(self): if self.max_count is None: return UNLIMITED return self.subpattern.max_width() * self.max_count def get_required_string(self, reverse): max_count = UNLIMITED if self.max_count is None else self.max_count if self.min_count == 0: w = self.subpattern.max_width() * max_count return min(w, UNLIMITED), None ofs, req = self.subpattern.get_required_string(reverse) if req: return ofs, req w = self.subpattern.max_width() * max_count return min(w, UNLIMITED), None class Group(RegexBase): def __init__(self, info, group, subpattern): RegexBase.__init__(self) self.info = info self.group = group self.subpattern = subpattern self.call_ref = None def fix_groups(self, reverse, fuzzy): self.info.defined_groups[self.group] = (self, reverse, fuzzy) self.subpattern.fix_groups(reverse, fuzzy) def optimise(self, info): subpattern = self.subpattern.optimise(info) return Group(self.info, self.group, subpattern) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): return self.subpattern.remove_captures() def is_atomic(self): return self.subpattern.is_atomic() def can_be_affix(self): return False def contains_group(self): return True def get_firstset(self, reverse): return self.subpattern.get_firstset(reverse) def has_simple_start(self): return self.subpattern.has_simple_start() def compile(self, reverse=False, fuzzy=False): code = [] key = self.group, reverse, fuzzy ref = self.info.call_refs.get(key) if ref is not None: code += [(OP.CALL_REF, ref)] public_group = private_group = self.group if private_group < 0: public_group = self.info.private_groups[private_group] private_group = self.info.group_count - private_group code += ([(OP.GROUP, private_group, public_group)] + self.subpattern.compile(reverse, fuzzy) + [(OP.END, )]) if ref is not None: code += [(OP.END, )] return code def dump(self, indent=0, reverse=False): group = self.group if group < 0: group = private_groups[group] print("{}GROUP {}".format(INDENT * indent, group)) self.subpattern.dump(indent + 1, reverse) def __eq__(self, other): return (type(self) is type(other) and (self.group, self.subpattern) == (other.group, other.subpattern)) def max_width(self): return self.subpattern.max_width() def get_required_string(self, reverse): return self.subpattern.get_required_string(reverse) class LazyRepeat(GreedyRepeat): _opcode = OP.LAZY_REPEAT _op_name = "LAZY_REPEAT" class LookAround(RegexBase): _dir_text = {False: "AHEAD", True: "BEHIND"} def __new__(cls, behind, positive, subpattern): if positive and subpattern.is_empty(): return subpattern return RegexBase.__new__(cls) def __init__(self, behind, positive, subpattern): RegexBase.__init__(self) self.behind = bool(behind) self.positive = bool(positive) self.subpattern = subpattern def fix_groups(self, reverse, fuzzy): self.subpattern.fix_groups(self.behind, fuzzy) def optimise(self, info): subpattern = self.subpattern.optimise(info) return LookAround(self.behind, self.positive, subpattern) def pack_characters(self, info): self.subpattern = self.subpattern.pack_characters(info) return self def remove_captures(self): return self.subpattern.remove_captures() def is_atomic(self): return self.subpattern.is_atomic() def can_be_affix(self): return self.subpattern.can_be_affix() def contains_group(self): return self.subpattern.contains_group() def compile(self, reverse=False, fuzzy=False): return ([(OP.LOOKAROUND, int(self.positive), int(not self.behind))] + self.subpattern.compile(self.behind) + [(OP.END, )]) def dump(self, indent=0, reverse=False): print("{}LOOK{} {}".format(INDENT * indent, self._dir_text[self.behind], POS_TEXT[self.positive])) self.subpattern.dump(indent + 1, self.behind) def is_empty(self): return self.subpattern.is_empty() def __eq__(self, other): return type(self) is type(other) and (self.behind, self.positive, self.subpattern) == (other.behind, other.positive, other.subpattern) def max_width(self): return 0 class PrecompiledCode(RegexBase): def __init__(self, code): self.code = code def compile(self, reverse=False, fuzzy=False): return [tuple(self.code)] class Property(RegexBase): _opcode = {(NOCASE, False): OP.PROPERTY, (IGNORECASE, False): OP.PROPERTY_IGN, (FULLCASE, False): OP.PROPERTY, (FULLIGNORECASE, False): OP.PROPERTY_IGN, (NOCASE, True): OP.PROPERTY_REV, (IGNORECASE, True): OP.PROPERTY_IGN_REV, (FULLCASE, True): OP.PROPERTY_REV, (FULLIGNORECASE, True): OP.PROPERTY_IGN_REV} def __init__(self, value, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.value = value self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) self._key = (self.__class__, self.value, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return Property(self.value, positive, case_flags, zerowidth) def optimise(self, info, in_set=False): return self def get_firstset(self, reverse): return set([self]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP return [(self._opcode[self.case_flags, reverse], flags, self.value)] def dump(self, indent=0, reverse=False): prop = PROPERTY_NAMES[self.value >> 16] name, value = prop[0], prop[1][self.value & 0xFFFF] print("{}PROPERTY {} {}:{}{}".format(INDENT * indent, POS_TEXT[self.positive], name, value, CASE_TEXT[self.case_flags])) def matches(self, ch): return _regex.has_property_value(self.value, ch) == self.positive def max_width(self): return 1 class Range(RegexBase): _opcode = {(NOCASE, False): OP.RANGE, (IGNORECASE, False): OP.RANGE_IGN, (FULLCASE, False): OP.RANGE, (FULLIGNORECASE, False): OP.RANGE_IGN, (NOCASE, True): OP.RANGE_REV, (IGNORECASE, True): OP.RANGE_IGN_REV, (FULLCASE, True): OP.RANGE_REV, (FULLIGNORECASE, True): OP.RANGE_IGN_REV} _op_name = "RANGE" def __init__(self, lower, upper, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.lower = lower self.upper = upper self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) self._key = (self.__class__, self.lower, self.upper, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return Range(self.lower, self.upper, positive, case_flags, zerowidth) def optimise(self, info, in_set=False): # Is the range case-sensitive? if not self.positive or not (self.case_flags & IGNORECASE) or in_set: return self # Is full case-folding possible? if (not (info.flags & UNICODE) or (self.case_flags & FULLIGNORECASE) != FULLIGNORECASE): return self # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() # Get the folded characters in the range. items = [] for ch in expanding_chars: if self.lower <= ord(ch) <= self.upper: folded = _regex.fold_case(FULL_CASE_FOLDING, ch) items.append(String([ord(c) for c in folded], case_flags=self.case_flags)) if not items: # We can fall back to simple case-folding. return self if len(items) < self.upper - self.lower + 1: # Not all the characters are covered by the full case-folding. items.insert(0, self) return Branch(items) def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP return [(self._opcode[self.case_flags, reverse], flags, self.lower, self.upper)] def dump(self, indent=0, reverse=False): display_lower = ascii(chr(self.lower)).lstrip("bu") display_upper = ascii(chr(self.upper)).lstrip("bu") print("{}RANGE {} {} {}{}".format(INDENT * indent, POS_TEXT[self.positive], display_lower, display_upper, CASE_TEXT[self.case_flags])) def matches(self, ch): return (self.lower <= ch <= self.upper) == self.positive def max_width(self): return 1 class RefGroup(RegexBase): _opcode = {(NOCASE, False): OP.REF_GROUP, (IGNORECASE, False): OP.REF_GROUP_IGN, (FULLCASE, False): OP.REF_GROUP, (FULLIGNORECASE, False): OP.REF_GROUP_FLD, (NOCASE, True): OP.REF_GROUP_REV, (IGNORECASE, True): OP.REF_GROUP_IGN_REV, (FULLCASE, True): OP.REF_GROUP_REV, (FULLIGNORECASE, True): OP.REF_GROUP_FLD_REV} def __init__(self, info, group, position, case_flags=NOCASE): RegexBase.__init__(self) self.info = info self.group = group self.position = position self.case_flags = case_flags self._key = self.__class__, self.group, self.case_flags def fix_groups(self, reverse, fuzzy): try: self.group = int(self.group) except ValueError: try: self.group = self.info.group_index[self.group] except KeyError: raise error("unknown group at position {}".format(self.position)) if not 1 <= self.group <= self.info.group_count: raise error("unknown group at position {}".format(self.position)) self._key = self.__class__, self.group, self.case_flags def remove_captures(self): raise error("group reference not allowed at position {}".format(self.position)) def compile(self, reverse=False, fuzzy=False): flags = 0 if fuzzy: flags |= FUZZY_OP return [(self._opcode[self.case_flags, reverse], flags, self.group)] def dump(self, indent=0, reverse=False): print("{}REF_GROUP {}{}".format(INDENT * indent, self.group, CASE_TEXT[self.case_flags])) def max_width(self): return UNLIMITED class SearchAnchor(ZeroWidthBase): _opcode = OP.SEARCH_ANCHOR _op_name = "SEARCH_ANCHOR" class Sequence(RegexBase): def __init__(self, items=None): RegexBase.__init__(self) if items is None: items = [] self.items = items def fix_groups(self, reverse, fuzzy): for s in self.items: s.fix_groups(reverse, fuzzy) def optimise(self, info): # Flatten the sequences. items = [] for s in self.items: s = s.optimise(info) if isinstance(s, Sequence): items.extend(s.items) else: items.append(s) return make_sequence(items) def pack_characters(self, info): "Packs sequences of characters into strings." items = [] characters = [] case_flags = NOCASE for s in self.items: if type(s) is Character and s.positive: if s.case_flags != case_flags: # Different case sensitivity, so flush, unless neither the # previous nor the new character are cased. if case_flags or is_cased(info, s.value): Sequence._flush_characters(info, characters, case_flags, items) case_flags = s.case_flags characters.append(s.value) elif type(s) is String: if s.case_flags != case_flags: # Different case sensitivity, so flush, unless the neither # the previous nor the new string are cased. if not s.case_flags or any(is_cased(info, c) for c in characters): Sequence._flush_characters(info, characters, case_flags, items) case_flags = s.case_flags characters.extend(s.characters) else: Sequence._flush_characters(info, characters, case_flags, items) items.append(s.pack_characters(info)) Sequence._flush_characters(info, characters, case_flags, items) return make_sequence(items) def remove_captures(self): self.items = [s.remove_captures() for s in self.items] return self def is_atomic(self): return all(s.is_atomic() for s in self.items) def can_be_affix(self): return False def contains_group(self): return any(s.contains_group() for s in self.items) def get_firstset(self, reverse): fs = set() items = self.items if reverse: items.reverse() for s in items: fs |= s.get_firstset(reverse) if None not in fs: return fs fs.discard(None) return fs | set([None]) def has_simple_start(self): return self.items and self.items[0].has_simple_start() def compile(self, reverse=False, fuzzy=False): seq = self.items if reverse: seq = seq[::-1] code = [] for s in seq: code.extend(s.compile(reverse, fuzzy)) return code def dump(self, indent=0, reverse=False): for s in self.items: s.dump(indent, reverse) @staticmethod def _flush_characters(info, characters, case_flags, items): if not characters: return # Disregard case_flags if all of the characters are case-less. if case_flags & IGNORECASE: if not any(is_cased(info, c) for c in characters): case_flags = NOCASE if len(characters) == 1: items.append(Character(characters[0], case_flags=case_flags)) else: items.append(String(characters, case_flags=case_flags)) characters[:] = [] def is_empty(self): return all(i.is_empty() for i in self.items) def __eq__(self, other): return type(self) is type(other) and self.items == other.items def max_width(self): return sum(s.max_width() for s in self.items) def get_required_string(self, reverse): seq = self.items if reverse: seq = seq[::-1] offset = 0 for s in seq: ofs, req = s.get_required_string(reverse) offset += ofs if req: return offset, req return offset, None class SetBase(RegexBase): def __init__(self, info, items, positive=True, case_flags=NOCASE, zerowidth=False): RegexBase.__init__(self) self.info = info self.items = tuple(items) self.positive = bool(positive) self.case_flags = case_flags self.zerowidth = bool(zerowidth) self.char_width = 1 self._key = (self.__class__, self.items, self.positive, self.case_flags, self.zerowidth) def rebuild(self, positive, case_flags, zerowidth): return type(self)(self.info, self.items, positive, case_flags, zerowidth).optimise(self.info) def get_firstset(self, reverse): return set([self]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP code = [(self._opcode[self.case_flags, reverse], flags)] for m in self.items: code.extend(m.compile()) code.append((OP.END, )) return code def dump(self, indent=0, reverse=False): print("{}{} {}{}".format(INDENT * indent, self._op_name, POS_TEXT[self.positive], CASE_TEXT[self.case_flags])) for i in self.items: i.dump(indent + 1) def _handle_case_folding(self, info, in_set): # Is the set case-sensitive? if not self.positive or not (self.case_flags & IGNORECASE) or in_set: return self # Is full case-folding possible? if (not (self.info.flags & UNICODE) or (self.case_flags & FULLIGNORECASE) != FULLIGNORECASE): return self # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() # Get the folded characters in the set. items = [] seen = set() for ch in expanding_chars: if self.matches(ord(ch)): folded = _regex.fold_case(FULL_CASE_FOLDING, ch) if folded not in seen: items.append(String([ord(c) for c in folded], case_flags=self.case_flags)) seen.add(folded) if not items: # We can fall back to simple case-folding. return self return Branch([self] + items) def max_width(self): # Is the set case-sensitive? if not self.positive or not (self.case_flags & IGNORECASE): return 1 # Is full case-folding possible? if (not (self.info.flags & UNICODE) or (self.case_flags & FULLIGNORECASE) != FULLIGNORECASE): return 1 # Get the characters which expand to multiple codepoints on folding. expanding_chars = _regex.get_expand_on_folding() # Get the folded characters in the set. seen = set() for ch in expanding_chars: if self.matches(ord(ch)): folded = _regex.fold_case(FULL_CASE_FOLDING, ch) seen.add(folded) if not seen: return 1 return max(len(folded) for folded in seen) class SetDiff(SetBase): _opcode = {(NOCASE, False): OP.SET_DIFF, (IGNORECASE, False): OP.SET_DIFF_IGN, (FULLCASE, False): OP.SET_DIFF, (FULLIGNORECASE, False): OP.SET_DIFF_IGN, (NOCASE, True): OP.SET_DIFF_REV, (IGNORECASE, True): OP.SET_DIFF_IGN_REV, (FULLCASE, True): OP.SET_DIFF_REV, (FULLIGNORECASE, True): OP.SET_DIFF_IGN_REV} _op_name = "SET_DIFF" def optimise(self, info, in_set=False): items = self.items if len(items) > 2: items = [items[0], SetUnion(info, items[1 : ])] if len(items) == 1: return items[0].with_flags(case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(m.optimise(info, in_set=True) for m in items) return self._handle_case_folding(info, in_set) def matches(self, ch): m = self.items[0].matches(ch) and not self.items[1].matches(ch) return m == self.positive class SetInter(SetBase): _opcode = {(NOCASE, False): OP.SET_INTER, (IGNORECASE, False): OP.SET_INTER_IGN, (FULLCASE, False): OP.SET_INTER, (FULLIGNORECASE, False): OP.SET_INTER_IGN, (NOCASE, True): OP.SET_INTER_REV, (IGNORECASE, True): OP.SET_INTER_IGN_REV, (FULLCASE, True): OP.SET_INTER_REV, (FULLIGNORECASE, True): OP.SET_INTER_IGN_REV} _op_name = "SET_INTER" def optimise(self, info, in_set=False): items = [] for m in self.items: m = m.optimise(info, in_set=True) if isinstance(m, SetInter) and m.positive: # Intersection in intersection. items.extend(m.items) else: items.append(m) if len(items) == 1: return items[0].with_flags(case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(items) return self._handle_case_folding(info, in_set) def matches(self, ch): m = all(i.matches(ch) for i in self.items) return m == self.positive class SetSymDiff(SetBase): _opcode = {(NOCASE, False): OP.SET_SYM_DIFF, (IGNORECASE, False): OP.SET_SYM_DIFF_IGN, (FULLCASE, False): OP.SET_SYM_DIFF, (FULLIGNORECASE, False): OP.SET_SYM_DIFF_IGN, (NOCASE, True): OP.SET_SYM_DIFF_REV, (IGNORECASE, True): OP.SET_SYM_DIFF_IGN_REV, (FULLCASE, True): OP.SET_SYM_DIFF_REV, (FULLIGNORECASE, True): OP.SET_SYM_DIFF_IGN_REV} _op_name = "SET_SYM_DIFF" def optimise(self, info, in_set=False): items = [] for m in self.items: m = m.optimise(info, in_set=True) if isinstance(m, SetSymDiff) and m.positive: # Symmetric difference in symmetric difference. items.extend(m.items) else: items.append(m) if len(items) == 1: return items[0].with_flags(case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(items) return self._handle_case_folding(info, in_set) def matches(self, ch): m = False for i in self.items: m = m != i.matches(ch) return m == self.positive class SetUnion(SetBase): _opcode = {(NOCASE, False): OP.SET_UNION, (IGNORECASE, False): OP.SET_UNION_IGN, (FULLCASE, False): OP.SET_UNION, (FULLIGNORECASE, False): OP.SET_UNION_IGN, (NOCASE, True): OP.SET_UNION_REV, (IGNORECASE, True): OP.SET_UNION_IGN_REV, (FULLCASE, True): OP.SET_UNION_REV, (FULLIGNORECASE, True): OP.SET_UNION_IGN_REV} _op_name = "SET_UNION" def optimise(self, info, in_set=False): items = [] for m in self.items: m = m.optimise(info, in_set=True) if isinstance(m, SetUnion) and m.positive: # Union in union. items.extend(m.items) else: items.append(m) if len(items) == 1: i = items[0] return i.with_flags(positive=i.positive == self.positive, case_flags=self.case_flags, zerowidth=self.zerowidth).optimise(info, in_set) self.items = tuple(items) return self._handle_case_folding(info, in_set) def compile(self, reverse=False, fuzzy=False): flags = 0 if self.positive: flags |= POSITIVE_OP if self.zerowidth: flags |= ZEROWIDTH_OP if fuzzy: flags |= FUZZY_OP characters, others = defaultdict(list), [] for m in self.items: if isinstance(m, Character): characters[m.positive].append(m.value) else: others.append(m) code = [(self._opcode[self.case_flags, reverse], flags)] for positive, values in characters.items(): flags = 0 if positive: flags |= POSITIVE_OP if len(values) == 1: code.append((OP.CHARACTER, flags, values[0])) else: code.append((OP.STRING, flags, len(values)) + tuple(values)) for m in others: code.extend(m.compile()) code.append((OP.END, )) return code def matches(self, ch): m = any(i.matches(ch) for i in self.items) return m == self.positive class StartOfLine(ZeroWidthBase): _opcode = OP.START_OF_LINE _op_name = "START_OF_LINE" class StartOfLineU(StartOfLine): _opcode = OP.START_OF_LINE_U _op_name = "START_OF_LINE_U" class StartOfString(ZeroWidthBase): _opcode = OP.START_OF_STRING _op_name = "START_OF_STRING" class StartOfWord(ZeroWidthBase): _opcode = OP.START_OF_WORD _op_name = "START_OF_WORD" class String(RegexBase): _opcode = {(NOCASE, False): OP.STRING, (IGNORECASE, False): OP.STRING_IGN, (FULLCASE, False): OP.STRING, (FULLIGNORECASE, False): OP.STRING_FLD, (NOCASE, True): OP.STRING_REV, (IGNORECASE, True): OP.STRING_IGN_REV, (FULLCASE, True): OP.STRING_REV, (FULLIGNORECASE, True): OP.STRING_FLD_REV} def __init__(self, characters, case_flags=NOCASE): self.characters = tuple(characters) self.case_flags = case_flags if (self.case_flags & FULLIGNORECASE) == FULLIGNORECASE: folded_characters = [] for char in self.characters: folded = _regex.fold_case(FULL_CASE_FOLDING, chr(char)) folded_characters.extend(ord(c) for c in folded) else: folded_characters = self.characters self.folded_characters = tuple(folded_characters) self.required = False self._key = self.__class__, self.characters, self.case_flags def get_firstset(self, reverse): if reverse: pos = -1 else: pos = 0 return set([Character(self.characters[pos], case_flags=self.case_flags)]) def has_simple_start(self): return True def compile(self, reverse=False, fuzzy=False): flags = 0 if fuzzy: flags |= FUZZY_OP if self.required: flags |= REQUIRED_OP return [(self._opcode[self.case_flags, reverse], flags, len(self.folded_characters)) + self.folded_characters] def dump(self, indent=0, reverse=False): display = ascii("".join(chr(c) for c in self.characters)).lstrip("bu") print("{}STRING {}{}".format(INDENT * indent, display, CASE_TEXT[self.case_flags])) def max_width(self): return len(self.folded_characters) def get_required_string(self, reverse): return 0, self class StringSet(RegexBase): _opcode = {(NOCASE, False): OP.STRING_SET, (IGNORECASE, False): OP.STRING_SET_IGN, (FULLCASE, False): OP.STRING_SET, (FULLIGNORECASE, False): OP.STRING_SET_FLD, (NOCASE, True): OP.STRING_SET_REV, (IGNORECASE, True): OP.STRING_SET_IGN_REV, (FULLCASE, True): OP.STRING_SET_REV, (FULLIGNORECASE, True): OP.STRING_SET_FLD_REV} def __init__(self, info, name, case_flags=NOCASE): self.info = info self.name = name self.case_flags = case_flags self._key = self.__class__, self.name, self.case_flags self.set_key = (name, self.case_flags) if self.set_key not in info.named_lists_used: info.named_lists_used[self.set_key] = len(info.named_lists_used) def compile(self, reverse=False, fuzzy=False): index = self.info.named_lists_used[self.set_key] items = self.info.kwargs[self.name] case_flags = self.case_flags if not items: return [] encoding = self.info.flags & _ALL_ENCODINGS fold_flags = encoding | case_flags if fuzzy: choices = [self._folded(fold_flags, i) for i in items] # Sort from longest to shortest. choices.sort(key=lambda s: (-len(s), s)) branches = [] for string in choices: branches.append(Sequence([Character(c, case_flags=case_flags) for c in string])) if len(branches) > 1: branch = Branch(branches) else: branch = branches[0] branch = branch.optimise(self.info).pack_characters(self.info) return branch.compile(reverse, fuzzy) else: min_len = min(len(i) for i in items) max_len = max(len(self._folded(fold_flags, i)) for i in items) return [(self._opcode[case_flags, reverse], index, min_len, max_len)] def dump(self, indent=0, reverse=False): print("{}STRING_SET {}{}".format(INDENT * indent, self.name, CASE_TEXT[self.case_flags])) def _folded(self, fold_flags, item): if isinstance(item, str): return [ord(c) for c in _regex.fold_case(fold_flags, item)] else: return list(item) def _flatten(self, s): # Flattens the branches. if isinstance(s, Branch): for b in s.branches: self._flatten(b) elif isinstance(s, Sequence) and s.items: seq = s.items while isinstance(seq[-1], Sequence): seq[-1 : ] = seq[-1].items n = 0 while n < len(seq) and isinstance(seq[n], Character): n += 1 if n > 1: seq[ : n] = [String([c.value for c in seq[ : n]], case_flags=self.case_flags)] self._flatten(seq[-1]) def max_width(self): if not self.info.kwargs[self.name]: return 0 if self.case_flags & IGNORECASE: fold_flags = (self.info.flags & _ALL_ENCODINGS) | self.case_flags return max(len(_regex.fold_case(fold_flags, i)) for i in self.info.kwargs[self.name]) else: return max(len(i) for i in self.info.kwargs[self.name]) class Source: "Scanner for the regular expression source string." def __init__(self, string): if isinstance(string, str): self.string = string self.char_type = chr else: self.string = string.decode("latin-1") self.char_type = lambda c: bytes([c]) self.pos = 0 self.ignore_space = False self.sep = string[ : 0] def get(self): string = self.string pos = self.pos try: if self.ignore_space: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) else: break ch = string[pos] self.pos = pos + 1 return ch except IndexError: # We've reached the end of the string. self.pos = pos return string[ : 0] except ValueError: # The comment extended to the end of the string. self.pos = len(string) return string[ : 0] def get_many(self, count=1): string = self.string pos = self.pos try: if self.ignore_space: substring = [] while len(substring) < count: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) else: break substring.append(string[pos]) pos += 1 substring = "".join(substring) else: substring = string[pos : pos + count] pos += len(substring) self.pos = pos return substring except IndexError: # We've reached the end of the string. self.pos = len(string) return "".join(substring) except ValueError: # The comment extended to the end of the string. self.pos = len(string) return "".join(substring) def get_while(self, test_set, include=True): string = self.string pos = self.pos if self.ignore_space: try: substring = [] while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) elif (string[pos] in test_set) == include: substring.append(string[pos]) pos += 1 else: break self.pos = pos except IndexError: # We've reached the end of the string. self.pos = len(string) except ValueError: # The comment extended to the end of the string. self.pos = len(string) return "".join(substring) else: try: while (string[pos] in test_set) == include: pos += 1 substring = string[self.pos : pos] self.pos = pos return substring except IndexError: # We've reached the end of the string. substring = string[self.pos : pos] self.pos = pos return substring def skip_while(self, test_set, include=True): string = self.string pos = self.pos try: if self.ignore_space: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) elif (string[pos] in test_set) == include: pos += 1 else: break else: while (string[pos] in test_set) == include: pos += 1 self.pos = pos except IndexError: # We've reached the end of the string. self.pos = len(string) except ValueError: # The comment extended to the end of the string. self.pos = len(string) def match(self, substring): string = self.string pos = self.pos if self.ignore_space: try: for c in substring: while True: if string[pos].isspace(): # Skip over the whitespace. pos += 1 elif string[pos] == "#": # Skip over the comment to the end of the line. pos = string.index("\n", pos) else: break if string[pos] != c: return False pos += 1 self.pos = pos return True except IndexError: # We've reached the end of the string. return False except ValueError: # The comment extended to the end of the string. return False else: if not string.startswith(substring, pos): return False self.pos = pos + len(substring) return True def expect(self, substring): if not self.match(substring): raise error("missing {} at position {}".format(substring, self.pos)) def at_end(self): string = self.string pos = self.pos try: if self.ignore_space: while True: if string[pos].isspace(): pos += 1 elif string[pos] == "#": pos = string.index("\n", pos) else: break return pos >= len(string) except IndexError: # We've reached the end of the string. return True except ValueError: # The comment extended to the end of the string. return True class Info: "Info about the regular expression." def __init__(self, flags=0, char_type=None, kwargs={}): flags |= DEFAULT_FLAGS[(flags & _ALL_VERSIONS) or DEFAULT_VERSION] self.flags = flags self.global_flags = flags self.kwargs = kwargs self.group_count = 0 self.group_index = {} self.group_name = {} self.char_type = char_type self.named_lists_used = {} self.open_groups = [] self.open_group_count = {} self.defined_groups = {} self.group_calls = [] self.private_groups = {} def open_group(self, name=None): group = self.group_index.get(name) if group is None: while True: self.group_count += 1 if name is None or self.group_count not in self.group_name: break group = self.group_count if name: self.group_index[name] = group self.group_name[group] = name if group in self.open_groups: # We have a nested named group. We'll assign it a private group # number, initially negative until we can assign a proper # (positive) number. group_alias = -(len(self.private_groups) + 1) self.private_groups[group_alias] = group group = group_alias self.open_groups.append(group) self.open_group_count[group] = self.open_group_count.get(group, 0) + 1 return group def close_group(self): self.open_groups.pop() def is_open_group(self, name): # In version 1, a group reference can refer to an open group. We'll # just pretend the group isn't open. version = (self.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version == VERSION1: return False if name.isdigit(): group = int(name) else: group = self.group_index.get(name) return group in self.open_groups def _check_group_features(info, parsed): """Checks whether the reverse and fuzzy features of the group calls match the groups which they call.""" call_refs = {} additional_groups = [] for call, reverse, fuzzy in info.group_calls: # Look up the reference of this group call. key = (call.group, reverse, fuzzy) ref = call_refs.get(key) if ref is None: # This group doesn't have a reference yet, so look up its features. if call.group == 0: # Calling the pattern as a whole. rev = bool(info.flags & REVERSE) fuz = isinstance(parsed, Fuzzy) if (rev, fuz) != (reverse, fuzzy): # The pattern as a whole doesn't have the features we want, # so we'll need to make a copy of it with the desired # features. additional_groups.append((parsed, reverse, fuzzy)) else: # Calling a capture group. def_info = info.defined_groups[call.group] group = def_info[0] if def_info[1 : ] != (reverse, fuzzy): # The group doesn't have the features we want, so we'll # need to make a copy of it with the desired features. additional_groups.append((group, reverse, fuzzy)) ref = len(call_refs) call_refs[key] = ref call.call_ref = ref info.call_refs = call_refs info.additional_groups = additional_groups def _get_required_string(parsed, flags): "Gets the required string and related info of a parsed pattern." req_offset, required = parsed.get_required_string(bool(flags & REVERSE)) if required: required.required = True if req_offset >= UNLIMITED: req_offset = -1 req_flags = required.case_flags if not (flags & UNICODE): req_flags &= ~UNICODE req_chars = required.folded_characters else: req_offset = 0 req_chars = () req_flags = 0 return req_offset, req_chars, req_flags class Scanner: def __init__(self, lexicon, flags=0): self.lexicon = lexicon # Combine phrases into a compound pattern. patterns = [] for phrase, action in lexicon: # Parse the regular expression. source = Source(phrase) info = Info(flags, source.char_type) source.ignore_space = bool(info.flags & VERBOSE) parsed = _parse_pattern(source, info) if not source.at_end(): raise error("trailing characters at position {}".format(source.pos)) # We want to forbid capture groups within each phrase. patterns.append(parsed.remove_captures()) # Combine all the subpatterns into one pattern. info = Info(flags) patterns = [Group(info, g + 1, p) for g, p in enumerate(patterns)] parsed = Branch(patterns) # Optimise the compound pattern. parsed = parsed.optimise(info) parsed = parsed.pack_characters(info) # Get the required string. req_offset, req_chars, req_flags = _get_required_string(parsed, info.flags) # Check the features of the groups. _check_group_features(info, parsed) # Complain if there are any group calls. They are not supported by the # Scanner class. if info.call_refs: raise error("recursive regex not supported by Scanner") reverse = bool(info.flags & REVERSE) # Compile the compound pattern. The result is a list of tuples. code = parsed.compile(reverse) + [(OP.SUCCESS, )] # Flatten the code into a list of ints. code = _flatten_code(code) if not parsed.has_simple_start(): # Get the first set, if possible. try: fs_code = _compile_firstset(info, parsed.get_firstset(reverse)) fs_code = _flatten_code(fs_code) code = fs_code + code except _FirstSetError: pass # Check the global flags for conflicts. version = (info.flags & _ALL_VERSIONS) or DEFAULT_VERSION if version not in (0, VERSION0, VERSION1): raise ValueError("VERSION0 and VERSION1 flags are mutually incompatible") # Create the PatternObject. # # Local flags like IGNORECASE affect the code generation, but aren't # needed by the PatternObject itself. Conversely, global flags like # LOCALE _don't_ affect the code generation but _are_ needed by the # PatternObject. self.scanner = _regex.compile(None, (flags & GLOBAL_FLAGS) | version, code, {}, {}, {}, [], req_offset, req_chars, req_flags, len(patterns)) def scan(self, string): result = [] append = result.append match = self.scanner.scanner(string).match i = 0 while True: m = match() if not m: break j = m.end() if i == j: break action = self.lexicon[m.lastindex - 1][1] if hasattr(action, '__call__'): self.match = m action = action(self, m.group()) if action is not None: append(action) i = j return result, string[i : ] # Get the known properties dict. PROPERTIES = _regex.get_properties() # Build the inverse of the properties dict. PROPERTY_NAMES = {} for prop_name, (prop_id, values) in PROPERTIES.items(): name, prop_values = PROPERTY_NAMES.get(prop_id, ("", {})) name = max(name, prop_name, key=len) PROPERTY_NAMES[prop_id] = name, prop_values for val_name, val_id in values.items(): prop_values[val_id] = max(prop_values.get(val_id, ""), val_name, key=len) # Character escape sequences. CHARACTER_ESCAPES = { "a": "\a", "b": "\b", "f": "\f", "n": "\n", "r": "\r", "t": "\t", "v": "\v", } # Predefined character set escape sequences. CHARSET_ESCAPES = { "d": lookup_property(None, "DIGIT", True), "D": lookup_property(None, "DIGIT", False), "s": lookup_property(None, "SPACE", True), "S": lookup_property(None, "SPACE", False), "w": lookup_property(None, "WORD", True), "W": lookup_property(None, "WORD", False), } # Positional escape sequences. POSITION_ESCAPES = { "A": StartOfString(), "b": Boundary(), "B": Boundary(False), "m": StartOfWord(), "M": EndOfWord(), "Z": EndOfString(), } # Positional escape sequences when WORD flag set. WORD_POSITION_ESCAPES = dict(POSITION_ESCAPES) WORD_POSITION_ESCAPES.update({ "b": DefaultBoundary(), "B": DefaultBoundary(False), "m": DefaultStartOfWord(), "M": DefaultEndOfWord(), }) regex-2014.02.16/Python3/_regex_unicode.c0000666000000000000000000211563112300206543016046 0ustar 00000000000000/* For Unicode version 6.3.0 */ #include "_regex_unicode.h" #define RE_BLANK_MASK ((1 << RE_PROP_ZL) | (1 << RE_PROP_ZP)) #define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN)) #define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC)) typedef struct RE_AllCases { RE_INT32 diffs[RE_MAX_CASES - 1]; } RE_AllCases; typedef struct RE_FullCaseFolding { RE_INT32 diff; RE_UINT16 codepoints[RE_MAX_FOLDED - 1]; } RE_FullCaseFolding; /* strings. */ char* re_strings[] = { "-1/2", "0", "1", "1/10", "1/16", "1/2", "1/3", "1/4", "1/5", "1/6", "1/7", "1/8", "1/9", "10", "100", "1000", "10000", "100000", "100000000", "1000000000000", "103", "107", "11", "11/2", "118", "12", "122", "129", "13", "13/2", "130", "132", "14", "15", "15/2", "16", "17", "17/2", "18", "19", "2", "2/3", "2/5", "20", "200", "2000", "20000", "202", "21", "214", "216", "216000", "218", "22", "220", "222", "224", "226", "228", "23", "230", "232", "233", "234", "24", "240", "25", "26", "27", "28", "29", "3", "3/16", "3/2", "3/4", "3/5", "3/8", "30", "300", "3000", "30000", "31", "32", "33", "34", "35", "36", "37", "38", "39", "4", "4/5", "40", "400", "4000", "40000", "41", "42", "43", "432000", "44", "45", "46", "47", "48", "49", "5", "5/2", "5/6", "5/8", "50", "500", "5000", "50000", "6", "60", "600", "6000", "60000", "7", "7/2", "7/8", "70", "700", "7000", "70000", "8", "80", "800", "8000", "80000", "84", "9", "9/2", "90", "900", "9000", "90000", "91", "A", "ABOVE", "ABOVELEFT", "ABOVERIGHT", "AEGEANNUMBERS", "AHEX", "AI", "AIN", "AL", "ALAPH", "ALCHEMICAL", "ALCHEMICALSYMBOLS", "ALEF", "ALETTER", "ALNUM", "ALPHA", "ALPHABETIC", "ALPHABETICPF", "ALPHABETICPRESENTATIONFORMS", "ALPHANUMERIC", "AMBIGUOUS", "AN", "ANCIENTGREEKMUSIC", "ANCIENTGREEKMUSICALNOTATION", "ANCIENTGREEKNUMBERS", "ANCIENTSYMBOLS", "ANY", "AR", "ARAB", "ARABIC", "ARABICEXTA", "ARABICEXTENDEDA", "ARABICLETTER", "ARABICMATH", "ARABICMATHEMATICALALPHABETICSYMBOLS", "ARABICNUMBER", "ARABICPFA", "ARABICPFB", "ARABICPRESENTATIONFORMSA", "ARABICPRESENTATIONFORMSB", "ARABICSUP", "ARABICSUPPLEMENT", "ARMENIAN", "ARMI", "ARMN", "ARROWS", "ASCII", "ASCIIHEXDIGIT", "ASSIGNED", "AT", "ATA", "ATAR", "ATB", "ATERM", "ATTACHEDABOVE", "ATTACHEDABOVERIGHT", "ATTACHEDBELOW", "ATTACHEDBELOWLEFT", "AVAGRAHA", "AVESTAN", "AVST", "B", "B2", "BA", "BALI", "BALINESE", "BAMU", "BAMUM", "BAMUMSUP", "BAMUMSUPPLEMENT", "BASICLATIN", "BATAK", "BATK", "BB", "BC", "BEH", "BELOW", "BELOWLEFT", "BELOWRIGHT", "BENG", "BENGALI", "BETH", "BIDIC", "BIDICLASS", "BIDICONTROL", "BIDIM", "BIDIMIRRORED", "BINDU", "BK", "BL", "BLANK", "BLK", "BLOCK", "BLOCKELEMENTS", "BN", "BOPO", "BOPOMOFO", "BOPOMOFOEXT", "BOPOMOFOEXTENDED", "BOTTOM", "BOTTOMANDRIGHT", "BOUNDARYNEUTRAL", "BOXDRAWING", "BR", "BRAH", "BRAHMI", "BRAI", "BRAILLE", "BRAILLEPATTERNS", "BREAKAFTER", "BREAKBEFORE", "BREAKBOTH", "BREAKSYMBOLS", "BUGI", "BUGINESE", "BUHD", "BUHID", "BURUSHASKIYEHBARREE", "BYZANTINEMUSIC", "BYZANTINEMUSICALSYMBOLS", "C", "C&", "CAKM", "CAN", "CANADIANABORIGINAL", "CANADIANSYLLABICS", "CANONICAL", "CANONICALCOMBININGCLASS", "CANS", "CARI", "CARIAN", "CARRIAGERETURN", "CASED", "CASEDLETTER", "CASEIGNORABLE", "CB", "CC", "CCC", "CCC10", "CCC103", "CCC107", "CCC11", "CCC118", "CCC12", "CCC122", "CCC129", "CCC13", "CCC130", "CCC132", "CCC133", "CCC14", "CCC15", "CCC16", "CCC17", "CCC18", "CCC19", "CCC20", "CCC21", "CCC22", "CCC23", "CCC24", "CCC25", "CCC26", "CCC27", "CCC28", "CCC29", "CCC30", "CCC31", "CCC32", "CCC33", "CCC34", "CCC35", "CCC36", "CCC84", "CCC91", "CF", "CHAKMA", "CHAM", "CHANGESWHENCASEFOLDED", "CHANGESWHENCASEMAPPED", "CHANGESWHENLOWERCASED", "CHANGESWHENTITLECASED", "CHANGESWHENUPPERCASED", "CHER", "CHEROKEE", "CI", "CIRCLE", "CJ", "CJK", "CJKCOMPAT", "CJKCOMPATFORMS", "CJKCOMPATIBILITY", "CJKCOMPATIBILITYFORMS", "CJKCOMPATIBILITYIDEOGRAPHS", "CJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENT", "CJKCOMPATIDEOGRAPHS", "CJKCOMPATIDEOGRAPHSSUP", "CJKEXTA", "CJKEXTB", "CJKEXTC", "CJKEXTD", "CJKRADICALSSUP", "CJKRADICALSSUPPLEMENT", "CJKSTROKES", "CJKSYMBOLS", "CJKSYMBOLSANDPUNCTUATION", "CJKUNIFIEDIDEOGRAPHS", "CJKUNIFIEDIDEOGRAPHSEXTENSIONA", "CJKUNIFIEDIDEOGRAPHSEXTENSIONB", "CJKUNIFIEDIDEOGRAPHSEXTENSIONC", "CJKUNIFIEDIDEOGRAPHSEXTENSIOND", "CL", "CLOSE", "CLOSEPARENTHESIS", "CLOSEPUNCTUATION", "CM", "CN", "CNTRL", "CO", "COM", "COMBININGDIACRITICALMARKS", "COMBININGDIACRITICALMARKSFORSYMBOLS", "COMBININGDIACRITICALMARKSSUPPLEMENT", "COMBININGHALFMARKS", "COMBININGMARK", "COMBININGMARKSFORSYMBOLS", "COMMON", "COMMONINDICNUMBERFORMS", "COMMONSEPARATOR", "COMPAT", "COMPATJAMO", "COMPLEXCONTEXT", "CONDITIONALJAPANESESTARTER", "CONNECTORPUNCTUATION", "CONSONANT", "CONSONANTDEAD", "CONSONANTFINAL", "CONSONANTHEADLETTER", "CONSONANTMEDIAL", "CONSONANTPLACEHOLDER", "CONSONANTREPHA", "CONSONANTSUBJOINED", "CONTINGENTBREAK", "CONTROL", "CONTROLPICTURES", "COPT", "COPTIC", "COUNTINGROD", "COUNTINGRODNUMERALS", "CP", "CPRT", "CR", "CS", "CUNEIFORM", "CUNEIFORMNUMBERS", "CUNEIFORMNUMBERSANDPUNCTUATION", "CURRENCYSYMBOL", "CURRENCYSYMBOLS", "CWCF", "CWCM", "CWL", "CWT", "CWU", "CYPRIOT", "CYPRIOTSYLLABARY", "CYRILLIC", "CYRILLICEXTA", "CYRILLICEXTB", "CYRILLICEXTENDEDA", "CYRILLICEXTENDEDB", "CYRILLICSUP", "CYRILLICSUPPLEMENT", "CYRILLICSUPPLEMENTARY", "CYRL", "D", "DA", "DAL", "DALATHRISH", "DASH", "DASHPUNCTUATION", "DB", "DE", "DECIMAL", "DECIMALNUMBER", "DECOMPOSITIONTYPE", "DEFAULTIGNORABLECODEPOINT", "DEP", "DEPRECATED", "DESERET", "DEVA", "DEVANAGARI", "DEVANAGARIEXT", "DEVANAGARIEXTENDED", "DI", "DIA", "DIACRITIC", "DIACRITICALS", "DIACRITICALSFORSYMBOLS", "DIACRITICALSSUP", "DIGIT", "DINGBATS", "DOMINO", "DOMINOTILES", "DOUBLEABOVE", "DOUBLEBELOW", "DOUBLEQUOTE", "DQ", "DSRT", "DT", "DUALJOINING", "E", "EA", "EASTASIANWIDTH", "EGYP", "EGYPTIANHIEROGLYPHS", "EMOTICONS", "EN", "ENC", "ENCLOSEDALPHANUM", "ENCLOSEDALPHANUMERICS", "ENCLOSEDALPHANUMERICSUPPLEMENT", "ENCLOSEDALPHANUMSUP", "ENCLOSEDCJK", "ENCLOSEDCJKLETTERSANDMONTHS", "ENCLOSEDIDEOGRAPHICSUP", "ENCLOSEDIDEOGRAPHICSUPPLEMENT", "ENCLOSINGMARK", "ES", "ET", "ETHI", "ETHIOPIC", "ETHIOPICEXT", "ETHIOPICEXTA", "ETHIOPICEXTENDED", "ETHIOPICEXTENDEDA", "ETHIOPICSUP", "ETHIOPICSUPPLEMENT", "EUROPEANNUMBER", "EUROPEANSEPARATOR", "EUROPEANTERMINATOR", "EX", "EXCLAMATION", "EXT", "EXTEND", "EXTENDER", "EXTENDNUMLET", "F", "FALSE", "FARSIYEH", "FE", "FEH", "FIN", "FINAL", "FINALPUNCTUATION", "FINALSEMKATH", "FIRSTSTRONGISOLATE", "FO", "FONT", "FORMAT", "FRA", "FRACTION", "FSI", "FULLWIDTH", "GAF", "GAMAL", "GC", "GCB", "GENERALCATEGORY", "GENERALPUNCTUATION", "GEOMETRICSHAPES", "GEOR", "GEORGIAN", "GEORGIANSUP", "GEORGIANSUPPLEMENT", "GL", "GLAG", "GLAGOLITIC", "GLUE", "GOTH", "GOTHIC", "GRAPH", "GRAPHEMEBASE", "GRAPHEMECLUSTERBREAK", "GRAPHEMEEXTEND", "GRAPHEMELINK", "GRBASE", "GREEK", "GREEKANDCOPTIC", "GREEKEXT", "GREEKEXTENDED", "GREK", "GREXT", "GRLINK", "GUJARATI", "GUJR", "GURMUKHI", "GURU", "H", "H2", "H3", "HAH", "HALFANDFULLFORMS", "HALFMARKS", "HALFWIDTH", "HALFWIDTHANDFULLWIDTHFORMS", "HAMZAONHEHGOAL", "HAN", "HANG", "HANGUL", "HANGULCOMPATIBILITYJAMO", "HANGULJAMO", "HANGULJAMOEXTENDEDA", "HANGULJAMOEXTENDEDB", "HANGULSYLLABLES", "HANGULSYLLABLETYPE", "HANI", "HANO", "HANUNOO", "HE", "HEBR", "HEBREW", "HEBREWLETTER", "HEH", "HEHGOAL", "HETH", "HEX", "HEXDIGIT", "HIGHPRIVATEUSESURROGATES", "HIGHPUSURROGATES", "HIGHSURROGATES", "HIRA", "HIRAGANA", "HL", "HST", "HY", "HYPHEN", "ID", "IDC", "IDCONTINUE", "IDEO", "IDEOGRAPHIC", "IDEOGRAPHICDESCRIPTIONCHARACTERS", "IDS", "IDSB", "IDSBINARYOPERATOR", "IDST", "IDSTART", "IDSTRINARYOPERATOR", "IMPERIALARAMAIC", "IN", "INDICMATRACATEGORY", "INDICNUMBERFORMS", "INDICSYLLABICCATEGORY", "INFIXNUMERIC", "INHERITED", "INIT", "INITIAL", "INITIALPUNCTUATION", "INMC", "INSC", "INSCRIPTIONALPAHLAVI", "INSCRIPTIONALPARTHIAN", "INSEPARABLE", "INSEPERABLE", "INVISIBLE", "IOTASUBSCRIPT", "IPAEXT", "IPAEXTENSIONS", "IS", "ISO", "ISOLATED", "ITAL", "JAMO", "JAMOEXTA", "JAMOEXTB", "JAVA", "JAVANESE", "JG", "JL", "JOINC", "JOINCAUSING", "JOINCONTROL", "JOININGGROUP", "JOININGTYPE", "JT", "JV", "KA", "KAF", "KAITHI", "KALI", "KANA", "KANASUP", "KANASUPPLEMENT", "KANAVOICING", "KANBUN", "KANGXI", "KANGXIRADICALS", "KANNADA", "KAPH", "KATAKANA", "KATAKANAEXT", "KATAKANAORHIRAGANA", "KATAKANAPHONETICEXTENSIONS", "KAYAHLI", "KHAPH", "KHAR", "KHAROSHTHI", "KHMER", "KHMERSYMBOLS", "KHMR", "KNDA", "KNOTTEDHEH", "KTHI", "KV", "L", "L&", "LAM", "LAMADH", "LANA", "LAO", "LAOO", "LATIN", "LATIN1", "LATIN1SUP", "LATIN1SUPPLEMENT", "LATINEXTA", "LATINEXTADDITIONAL", "LATINEXTB", "LATINEXTC", "LATINEXTD", "LATINEXTENDEDA", "LATINEXTENDEDADDITIONAL", "LATINEXTENDEDB", "LATINEXTENDEDC", "LATINEXTENDEDD", "LATN", "LB", "LE", "LEADINGJAMO", "LEFT", "LEFTANDRIGHT", "LEFTJOINING", "LEFTTORIGHT", "LEFTTORIGHTEMBEDDING", "LEFTTORIGHTISOLATE", "LEFTTORIGHTOVERRIDE", "LEPC", "LEPCHA", "LETTER", "LETTERLIKESYMBOLS", "LETTERNUMBER", "LF", "LIMB", "LIMBU", "LINB", "LINEARB", "LINEARBIDEOGRAMS", "LINEARBSYLLABARY", "LINEBREAK", "LINEFEED", "LINESEPARATOR", "LISU", "LL", "LM", "LO", "LOE", "LOGICALORDEREXCEPTION", "LOWER", "LOWERCASE", "LOWERCASELETTER", "LOWSURROGATES", "LRE", "LRI", "LRO", "LT", "LU", "LV", "LVSYLLABLE", "LVT", "LVTSYLLABLE", "LYCI", "LYCIAN", "LYDI", "LYDIAN", "M", "M&", "MAHJONG", "MAHJONGTILES", "MALAYALAM", "MAND", "MANDAIC", "MANDATORYBREAK", "MARK", "MATH", "MATHALPHANUM", "MATHEMATICALALPHANUMERICSYMBOLS", "MATHEMATICALOPERATORS", "MATHOPERATORS", "MATHSYMBOL", "MB", "MC", "ME", "MED", "MEDIAL", "MEEM", "MEETEIMAYEK", "MEETEIMAYEKEXT", "MEETEIMAYEKEXTENSIONS", "MERC", "MERO", "MEROITICCURSIVE", "MEROITICHIEROGLYPHS", "MIAO", "MIDLETTER", "MIDNUM", "MIDNUMLET", "MIM", "MISCARROWS", "MISCELLANEOUSMATHEMATICALSYMBOLSA", "MISCELLANEOUSMATHEMATICALSYMBOLSB", "MISCELLANEOUSSYMBOLS", "MISCELLANEOUSSYMBOLSANDARROWS", "MISCELLANEOUSSYMBOLSANDPICTOGRAPHS", "MISCELLANEOUSTECHNICAL", "MISCMATHSYMBOLSA", "MISCMATHSYMBOLSB", "MISCPICTOGRAPHS", "MISCSYMBOLS", "MISCTECHNICAL", "ML", "MLYM", "MN", "MODIFIERLETTER", "MODIFIERLETTERS", "MODIFIERSYMBOL", "MODIFIERTONELETTERS", "MODIFYINGLETTER", "MONG", "MONGOLIAN", "MTEI", "MUSIC", "MUSICALSYMBOLS", "MYANMAR", "MYANMAREXTA", "MYANMAREXTENDEDA", "MYMR", "N", "N&", "NA", "NAN", "NAR", "NARROW", "NB", "NCHAR", "ND", "NEUTRAL", "NEWLINE", "NEWTAILUE", "NEXTLINE", "NK", "NKO", "NKOO", "NL", "NO", "NOBLOCK", "NOBREAK", "NOJOININGGROUP", "NONCHARACTERCODEPOINT", "NONE", "NONJOINING", "NONSPACINGMARK", "NONSTARTER", "NOON", "NOTAPPLICABLE", "NOTREORDERED", "NR", "NS", "NSM", "NT", "NU", "NUKTA", "NUMBER", "NUMBERFORMS", "NUMERIC", "NUMERICTYPE", "NUMERICVALUE", "NUN", "NV", "NYA", "OALPHA", "OCR", "ODI", "OGAM", "OGHAM", "OGREXT", "OIDC", "OIDS", "OLCHIKI", "OLCK", "OLDITALIC", "OLDPERSIAN", "OLDSOUTHARABIAN", "OLDTURKIC", "OLETTER", "OLOWER", "OMATH", "ON", "OP", "OPENPUNCTUATION", "OPTICALCHARACTERRECOGNITION", "ORIYA", "ORKH", "ORYA", "OSMA", "OSMANYA", "OTHER", "OTHERALPHABETIC", "OTHERDEFAULTIGNORABLECODEPOINT", "OTHERGRAPHEMEEXTEND", "OTHERIDCONTINUE", "OTHERIDSTART", "OTHERLETTER", "OTHERLOWERCASE", "OTHERMATH", "OTHERNEUTRAL", "OTHERNUMBER", "OTHERPUNCTUATION", "OTHERSYMBOL", "OTHERUPPERCASE", "OUPPER", "OV", "OVERLAY", "OVERSTRUCK", "P", "P&", "PARAGRAPHSEPARATOR", "PATSYN", "PATTERNSYNTAX", "PATTERNWHITESPACE", "PATWS", "PC", "PD", "PDF", "PDI", "PE", "PF", "PHAG", "PHAGSPA", "PHAISTOS", "PHAISTOSDISC", "PHLI", "PHNX", "PHOENICIAN", "PHONETICEXT", "PHONETICEXTENSIONS", "PHONETICEXTENSIONSSUPPLEMENT", "PHONETICEXTSUP", "PI", "PLAYINGCARDS", "PLRD", "PO", "POPDIRECTIONALFORMAT", "POPDIRECTIONALISOLATE", "POSTFIXNUMERIC", "PR", "PREFIXNUMERIC", "PREPEND", "PRINT", "PRIVATEUSE", "PRIVATEUSEAREA", "PRTI", "PS", "PUA", "PUNCT", "PUNCTUATION", "QAAC", "QAAI", "QAF", "QAPH", "QMARK", "QU", "QUOTATION", "QUOTATIONMARK", "R", "RADICAL", "REGIONALINDICATOR", "REGISTERSHIFTER", "REH", "REJANG", "REVERSEDPE", "RI", "RIGHT", "RIGHTJOINING", "RIGHTTOLEFT", "RIGHTTOLEFTEMBEDDING", "RIGHTTOLEFTISOLATE", "RIGHTTOLEFTOVERRIDE", "RJNG", "RLE", "RLI", "RLO", "ROHINGYAYEH", "RUMI", "RUMINUMERALSYMBOLS", "RUNIC", "RUNR", "S", "S&", "SA", "SAD", "SADHE", "SAMARITAN", "SAMR", "SARB", "SAUR", "SAURASHTRA", "SB", "SC", "SCONTINUE", "SCRIPT", "SD", "SE", "SEEN", "SEGMENTSEPARATOR", "SEMKATH", "SENTENCEBREAK", "SEP", "SEPARATOR", "SG", "SHARADA", "SHAVIAN", "SHAW", "SHIN", "SHRD", "SINGLEQUOTE", "SINH", "SINHALA", "SK", "SM", "SMALL", "SMALLFORMS", "SMALLFORMVARIANTS", "SML", "SO", "SOFTDOTTED", "SORA", "SORASOMPENG", "SP", "SPACE", "SPACESEPARATOR", "SPACINGMARK", "SPACINGMODIFIERLETTERS", "SPECIALS", "SQ", "SQR", "SQUARE", "ST", "STERM", "SUB", "SUND", "SUNDANESE", "SUNDANESESUP", "SUNDANESESUPPLEMENT", "SUP", "SUPARROWSA", "SUPARROWSB", "SUPER", "SUPERANDSUB", "SUPERSCRIPTSANDSUBSCRIPTS", "SUPMATHOPERATORS", "SUPPLEMENTALARROWSA", "SUPPLEMENTALARROWSB", "SUPPLEMENTALMATHEMATICALOPERATORS", "SUPPLEMENTALPUNCTUATION", "SUPPLEMENTARYPRIVATEUSEAREAA", "SUPPLEMENTARYPRIVATEUSEAREAB", "SUPPUAA", "SUPPUAB", "SUPPUNCTUATION", "SURROGATE", "SWASHKAF", "SY", "SYLO", "SYLOTINAGRI", "SYMBOL", "SYRC", "SYRIAC", "SYRIACWAW", "T", "TAGALOG", "TAGB", "TAGBANWA", "TAGS", "TAH", "TAILE", "TAITHAM", "TAIVIET", "TAIXUANJING", "TAIXUANJINGSYMBOLS", "TAKR", "TAKRI", "TALE", "TALU", "TAMIL", "TAML", "TAVT", "TAW", "TEHMARBUTA", "TEHMARBUTAGOAL", "TELU", "TELUGU", "TERM", "TERMINALPUNCTUATION", "TETH", "TFNG", "TGLG", "THAA", "THAANA", "THAI", "TIBETAN", "TIBT", "TIFINAGH", "TITLECASELETTER", "TONELETTER", "TONEMARK", "TOP", "TOPANDBOTTOM", "TOPANDBOTTOMANDRIGHT", "TOPANDLEFT", "TOPANDLEFTANDRIGHT", "TOPANDRIGHT", "TRAILINGJAMO", "TRANSPARENT", "TRANSPORTANDMAP", "TRANSPORTANDMAPSYMBOLS", "TRUE", "U", "UCAS", "UCASEXT", "UGAR", "UGARITIC", "UIDEO", "UNASSIGNED", "UNIFIEDCANADIANABORIGINALSYLLABICS", "UNIFIEDCANADIANABORIGINALSYLLABICSEXTENDED", "UNIFIEDIDEOGRAPH", "UNKNOWN", "UP", "UPPER", "UPPERCASE", "UPPERCASELETTER", "V", "VAI", "VAII", "VARIATIONSELECTOR", "VARIATIONSELECTORS", "VARIATIONSELECTORSSUPPLEMENT", "VEDICEXT", "VEDICEXTENSIONS", "VERT", "VERTICAL", "VERTICALFORMS", "VIRAMA", "VISARGA", "VISUALORDERLEFT", "VOWEL", "VOWELDEPENDENT", "VOWELINDEPENDENT", "VOWELJAMO", "VR", "VS", "VSSUP", "W", "WAW", "WB", "WHITESPACE", "WIDE", "WJ", "WORD", "WORDBREAK", "WORDJOINER", "WS", "WSPACE", "XDIGIT", "XIDC", "XIDCONTINUE", "XIDS", "XIDSTART", "XPEO", "XSUX", "XX", "Y", "YEH", "YEHBARREE", "YEHWITHTAIL", "YES", "YI", "YIII", "YIJING", "YIJINGHEXAGRAMSYMBOLS", "YIRADICALS", "YISYLLABLES", "YUDH", "YUDHHE", "Z", "Z&", "ZAIN", "ZHAIN", "ZINH", "ZL", "ZP", "ZS", "ZW", "ZWSPACE", "ZYYY", "ZZZZ", }; /* strings: 10575 bytes. */ /* properties. */ RE_Property re_properties[] = { { 506, 0, 0}, { 504, 0, 0}, { 231, 1, 1}, { 230, 1, 1}, { 958, 2, 2}, { 956, 2, 2}, {1118, 3, 3}, {1113, 3, 3}, { 521, 4, 4}, { 505, 4, 4}, { 964, 5, 5}, { 955, 5, 5}, { 732, 6, 6}, { 155, 7, 6}, { 154, 7, 6}, { 707, 8, 6}, { 706, 8, 6}, {1088, 9, 6}, {1087, 9, 6}, { 271, 10, 6}, { 273, 11, 6}, { 324, 11, 6}, { 319, 12, 6}, { 399, 12, 6}, { 321, 13, 6}, { 401, 13, 6}, { 320, 14, 6}, { 400, 14, 6}, { 317, 15, 6}, { 397, 15, 6}, { 318, 16, 6}, { 398, 16, 6}, { 585, 17, 6}, { 581, 17, 6}, { 577, 18, 6}, { 576, 18, 6}, {1126, 19, 6}, {1125, 19, 6}, {1124, 20, 6}, {1123, 20, 6}, { 424, 21, 6}, { 432, 21, 6}, { 522, 22, 6}, { 530, 22, 6}, { 520, 23, 6}, { 524, 23, 6}, { 523, 24, 6}, { 531, 24, 6}, {1114, 25, 6}, {1121, 25, 6}, { 987, 25, 6}, { 223, 26, 6}, { 221, 26, 6}, { 620, 27, 6}, { 618, 27, 6}, { 417, 28, 6}, { 574, 29, 6}, { 921, 30, 6}, { 918, 30, 6}, {1051, 31, 6}, {1050, 31, 6}, { 862, 32, 6}, { 844, 32, 6}, { 565, 33, 6}, { 564, 33, 6}, { 186, 34, 6}, { 144, 34, 6}, { 855, 35, 6}, { 828, 35, 6}, { 579, 36, 6}, { 578, 36, 6}, { 434, 37, 6}, { 433, 37, 6}, { 483, 38, 6}, { 481, 38, 6}, { 861, 39, 6}, { 843, 39, 6}, { 867, 40, 6}, { 868, 40, 6}, { 806, 41, 6}, { 792, 41, 6}, { 857, 42, 6}, { 833, 42, 6}, { 583, 43, 6}, { 582, 43, 6}, { 586, 44, 6}, { 584, 44, 6}, { 923, 45, 6}, {1084, 46, 6}, {1080, 46, 6}, { 856, 47, 6}, { 830, 47, 6}, { 426, 48, 6}, { 425, 48, 6}, { 983, 49, 6}, { 959, 49, 6}, { 705, 50, 6}, { 704, 50, 6}, { 859, 51, 6}, { 835, 51, 6}, { 858, 52, 6}, { 834, 52, 6}, { 996, 53, 6}, {1093, 54, 6}, {1109, 54, 6}, { 877, 55, 6}, { 878, 55, 6}, { 876, 56, 6}, { 875, 56, 6}, { 553, 57, 7}, { 572, 57, 7}, { 222, 58, 8}, { 213, 58, 8}, { 266, 59, 9}, { 276, 59, 9}, { 423, 60, 10}, { 447, 60, 10}, { 451, 61, 11}, { 450, 61, 11}, { 621, 62, 12}, { 616, 62, 12}, { 622, 63, 13}, { 623, 63, 13}, { 697, 64, 14}, { 675, 64, 14}, { 823, 65, 15}, { 817, 65, 15}, { 824, 66, 16}, { 826, 66, 16}, { 225, 67, 6}, { 224, 67, 6}, { 589, 68, 17}, { 597, 68, 17}, { 591, 69, 18}, { 598, 69, 18}, { 158, 70, 6}, { 153, 70, 6}, { 165, 71, 6}, { 185, 72, 6}, { 187, 73, 6}, { 229, 74, 6}, { 519, 75, 6}, { 906, 76, 6}, {1117, 77, 6}, {1122, 78, 6}, }; /* properties: 580 bytes. */ /* property values. */ RE_PropertyValue re_property_values[] = { {1081, 0, 0}, { 355, 0, 0}, {1089, 0, 1}, { 714, 0, 1}, { 708, 0, 2}, { 701, 0, 2}, {1061, 0, 3}, { 713, 0, 3}, { 771, 0, 4}, { 702, 0, 4}, { 860, 0, 5}, { 703, 0, 5}, { 809, 0, 6}, { 770, 0, 6}, { 465, 0, 7}, { 740, 0, 7}, { 989, 0, 8}, { 739, 0, 8}, { 422, 0, 9}, { 438, 0, 9}, { 793, 0, 9}, { 689, 0, 10}, { 801, 0, 10}, { 864, 0, 11}, { 802, 0, 11}, { 988, 0, 12}, {1150, 0, 12}, { 699, 0, 13}, {1148, 0, 13}, { 874, 0, 14}, {1149, 0, 14}, { 382, 0, 15}, { 356, 0, 15}, { 275, 0, 15}, { 497, 0, 16}, { 314, 0, 16}, { 907, 0, 17}, { 357, 0, 17}, {1018, 0, 18}, { 391, 0, 18}, { 418, 0, 19}, { 880, 0, 19}, { 847, 0, 20}, { 910, 0, 20}, { 353, 0, 21}, { 883, 0, 21}, { 372, 0, 22}, { 879, 0, 22}, { 865, 0, 23}, { 899, 0, 23}, { 737, 0, 24}, { 977, 0, 24}, { 395, 0, 25}, { 956, 0, 25}, { 773, 0, 26}, { 976, 0, 26}, { 866, 0, 27}, { 982, 0, 27}, { 596, 0, 28}, { 896, 0, 28}, { 492, 0, 29}, { 884, 0, 29}, { 854, 0, 30}, { 259, 0, 30}, { 260, 0, 30}, { 687, 0, 31}, { 654, 0, 31}, { 653, 0, 31}, { 731, 0, 32}, { 724, 0, 32}, { 363, 0, 32}, { 723, 0, 32}, { 820, 0, 33}, { 785, 0, 33}, { 786, 0, 33}, { 913, 0, 34}, { 872, 0, 34}, { 912, 0, 34}, { 873, 0, 34}, {1023, 0, 35}, { 945, 0, 35}, { 946, 0, 35}, { 966, 0, 36}, {1143, 0, 36}, {1144, 0, 36}, { 272, 0, 37}, { 803, 1, 0}, { 791, 1, 0}, { 209, 1, 1}, { 185, 1, 1}, { 663, 1, 2}, { 661, 1, 2}, { 662, 1, 2}, { 669, 1, 3}, { 664, 1, 3}, { 671, 1, 4}, { 666, 1, 4}, { 606, 1, 5}, { 605, 1, 5}, { 990, 1, 6}, { 772, 1, 6}, { 359, 1, 7}, { 435, 1, 7}, { 526, 1, 8}, { 525, 1, 8}, { 404, 1, 9}, { 410, 1, 10}, { 409, 1, 10}, { 411, 1, 10}, { 181, 1, 11}, { 559, 1, 12}, { 168, 1, 13}, {1025, 1, 14}, { 180, 1, 15}, { 179, 1, 15}, {1056, 1, 16}, { 799, 1, 17}, { 950, 1, 18}, { 729, 1, 19}, { 170, 1, 20}, { 169, 1, 20}, { 429, 1, 21}, { 219, 1, 22}, { 534, 1, 23}, { 532, 1, 24}, { 849, 1, 25}, {1042, 1, 26}, {1049, 1, 27}, { 636, 1, 28}, { 727, 1, 29}, { 975, 1, 30}, {1057, 1, 31}, { 658, 1, 32}, {1058, 1, 33}, { 781, 1, 34}, { 510, 1, 35}, { 549, 1, 36}, { 611, 1, 36}, { 469, 1, 37}, { 475, 1, 38}, { 474, 1, 38}, { 323, 1, 39}, {1082, 1, 40}, { 264, 1, 40}, {1076, 1, 40}, { 832, 1, 41}, { 943, 1, 42}, {1028, 1, 43}, { 556, 1, 44}, { 255, 1, 45}, {1030, 1, 46}, { 646, 1, 47}, { 777, 1, 48}, {1083, 1, 49}, {1077, 1, 49}, { 692, 1, 50}, {1033, 1, 51}, { 796, 1, 52}, { 647, 1, 53}, { 253, 1, 54}, {1034, 1, 55}, { 204, 1, 56}, { 999, 1, 57}, { 210, 1, 58}, { 686, 1, 59}, { 836, 1, 60}, {1001, 1, 61}, {1000, 1, 61}, {1097, 1, 62}, {1096, 1, 62}, { 893, 1, 63}, { 892, 1, 63}, { 894, 1, 64}, { 895, 1, 64}, { 361, 1, 65}, { 437, 1, 65}, { 670, 1, 66}, { 665, 1, 66}, { 528, 1, 67}, { 527, 1, 67}, { 507, 1, 68}, { 913, 1, 68}, {1007, 1, 69}, {1006, 1, 69}, { 396, 1, 70}, { 360, 1, 71}, { 364, 1, 71}, { 436, 1, 71}, { 688, 1, 72}, { 821, 1, 73}, { 184, 1, 74}, { 735, 1, 75}, { 736, 1, 75}, { 762, 1, 76}, { 767, 1, 76}, { 383, 1, 77}, { 848, 1, 78}, { 829, 1, 78}, { 458, 1, 79}, { 457, 1, 79}, { 241, 1, 80}, { 232, 1, 81}, { 508, 1, 82}, { 759, 1, 83}, { 766, 1, 83}, { 439, 1, 84}, { 757, 1, 85}, { 763, 1, 85}, {1009, 1, 86}, {1003, 1, 86}, { 247, 1, 87}, { 246, 1, 87}, {1010, 1, 88}, {1004, 1, 88}, { 758, 1, 89}, { 764, 1, 89}, {1011, 1, 90}, {1008, 1, 90}, { 760, 1, 91}, { 756, 1, 91}, { 515, 1, 92}, { 672, 1, 93}, { 667, 1, 93}, { 385, 1, 94}, { 512, 1, 95}, { 511, 1, 95}, {1060, 1, 96}, { 472, 1, 97}, { 470, 1, 97}, { 407, 1, 98}, { 405, 1, 98}, {1012, 1, 99}, {1017, 1, 99}, { 341, 1, 100}, { 340, 1, 100}, { 635, 1, 101}, { 634, 1, 101}, { 580, 1, 102}, { 576, 1, 102}, { 344, 1, 103}, { 343, 1, 103}, { 570, 1, 104}, { 638, 1, 105}, { 235, 1, 106}, { 548, 1, 107}, { 369, 1, 107}, { 633, 1, 108}, { 237, 1, 109}, { 236, 1, 109}, { 342, 1, 110}, { 641, 1, 111}, { 639, 1, 111}, { 462, 1, 112}, { 461, 1, 112}, { 330, 1, 113}, { 328, 1, 113}, { 346, 1, 114}, { 336, 1, 114}, {1138, 1, 115}, {1137, 1, 115}, { 345, 1, 116}, { 327, 1, 116}, {1140, 1, 117}, {1139, 1, 118}, { 700, 1, 119}, {1091, 1, 120}, { 408, 1, 121}, { 406, 1, 121}, { 206, 1, 122}, { 774, 1, 123}, { 673, 1, 124}, { 668, 1, 124}, {1022, 1, 125}, { 366, 1, 126}, { 590, 1, 126}, { 886, 1, 127}, { 954, 1, 128}, { 431, 1, 129}, { 430, 1, 129}, { 642, 1, 130}, { 927, 1, 131}, { 550, 1, 132}, { 612, 1, 132}, { 615, 1, 133}, { 316, 1, 134}, { 783, 1, 135}, { 782, 1, 135}, {1035, 1, 136}, { 746, 1, 137}, { 745, 1, 137}, { 473, 1, 138}, { 471, 1, 138}, { 744, 1, 139}, { 552, 1, 140}, { 547, 1, 140}, { 551, 1, 141}, { 613, 1, 141}, { 568, 1, 142}, { 566, 1, 143}, { 567, 1, 143}, { 709, 1, 144}, { 908, 1, 145}, { 907, 1, 145}, { 911, 1, 145}, { 332, 1, 146}, { 334, 1, 146}, { 157, 1, 147}, { 156, 1, 147}, { 177, 1, 148}, { 175, 1, 148}, {1094, 1, 149}, {1109, 1, 149}, {1100, 1, 150}, { 362, 1, 151}, { 541, 1, 151}, { 331, 1, 152}, { 329, 1, 152}, { 980, 1, 153}, { 979, 1, 153}, { 178, 1, 154}, { 176, 1, 154}, { 543, 1, 155}, { 540, 1, 155}, { 991, 1, 156}, { 696, 1, 157}, { 695, 1, 158}, { 143, 1, 159}, { 163, 1, 160}, { 164, 1, 161}, { 888, 1, 162}, { 887, 1, 162}, { 720, 1, 163}, { 269, 1, 164}, { 838, 1, 165}, { 518, 1, 166}, {1079, 1, 167}, { 839, 1, 168}, { 427, 1, 169}, { 969, 1, 170}, { 853, 1, 171}, { 403, 1, 172}, { 587, 1, 173}, { 891, 1, 174}, { 722, 1, 175}, { 750, 1, 176}, { 749, 1, 177}, { 645, 1, 178}, { 840, 1, 179}, { 198, 1, 180}, { 600, 1, 181}, { 599, 1, 182}, { 841, 1, 183}, { 942, 1, 184}, { 941, 1, 184}, { 244, 1, 185}, { 627, 1, 186}, { 985, 1, 187}, { 315, 1, 188}, { 968, 1, 189}, {1039, 1, 190}, { 392, 1, 191}, { 394, 1, 192}, { 393, 1, 192}, { 453, 1, 193}, { 208, 1, 194}, { 207, 1, 194}, { 751, 1, 195}, { 631, 1, 196}, { 630, 1, 196}, { 258, 1, 197}, { 257, 1, 197}, { 780, 1, 198}, { 779, 1, 198}, { 162, 1, 199}, { 161, 1, 199}, {1037, 1, 200}, {1036, 1, 200}, { 387, 1, 201}, { 386, 1, 201}, { 734, 1, 202}, { 733, 1, 202}, { 173, 1, 203}, { 172, 1, 203}, { 726, 1, 204}, { 725, 1, 204}, { 441, 1, 205}, { 440, 1, 205}, { 897, 1, 206}, { 459, 1, 207}, { 460, 1, 207}, { 464, 1, 208}, { 463, 1, 208}, { 761, 1, 209}, { 765, 1, 209}, { 454, 1, 210}, {1073, 1, 211}, {1072, 1, 211}, { 150, 1, 212}, { 149, 1, 212}, { 347, 1, 213}, { 337, 1, 213}, { 348, 1, 214}, { 338, 1, 214}, { 349, 1, 215}, { 339, 1, 215}, { 333, 1, 216}, { 335, 1, 216}, {1031, 1, 217}, {1095, 1, 218}, {1110, 1, 218}, {1013, 1, 219}, {1015, 1, 219}, {1014, 1, 220}, {1016, 1, 220}, {1085, 2, 0}, {1154, 2, 0}, { 365, 2, 1}, {1153, 2, 1}, { 660, 2, 2}, { 674, 2, 2}, { 525, 2, 3}, { 529, 2, 3}, { 404, 2, 4}, { 412, 2, 4}, { 181, 2, 5}, { 183, 2, 5}, { 559, 2, 6}, { 558, 2, 6}, { 168, 2, 7}, { 167, 2, 7}, {1025, 2, 8}, {1024, 2, 8}, {1056, 2, 9}, {1055, 2, 9}, { 429, 2, 10}, { 428, 2, 10}, { 219, 2, 11}, { 218, 2, 11}, { 534, 2, 12}, { 535, 2, 12}, { 532, 2, 13}, { 533, 2, 13}, { 849, 2, 14}, { 851, 2, 14}, {1042, 2, 15}, {1043, 2, 15}, {1049, 2, 16}, {1048, 2, 16}, { 636, 2, 17}, { 649, 2, 17}, { 727, 2, 18}, { 769, 2, 18}, { 975, 2, 19}, { 974, 2, 19}, {1057, 2, 20}, { 658, 2, 21}, { 659, 2, 21}, {1058, 2, 22}, {1059, 2, 22}, { 781, 2, 23}, { 784, 2, 23}, { 510, 2, 24}, { 509, 2, 24}, { 547, 2, 25}, { 546, 2, 25}, { 469, 2, 26}, { 468, 2, 26}, { 323, 2, 27}, { 322, 2, 27}, { 263, 2, 28}, { 267, 2, 28}, { 832, 2, 29}, { 831, 2, 29}, { 943, 2, 30}, { 944, 2, 30}, { 646, 2, 31}, { 648, 2, 31}, { 777, 2, 32}, { 776, 2, 32}, { 570, 2, 33}, { 569, 2, 33}, { 638, 2, 34}, { 629, 2, 34}, { 235, 2, 35}, { 234, 2, 35}, { 545, 2, 36}, { 554, 2, 36}, {1135, 2, 37}, {1136, 2, 37}, { 838, 2, 38}, { 610, 2, 38}, { 518, 2, 39}, { 517, 2, 39}, { 427, 2, 40}, { 446, 2, 40}, { 593, 2, 41}, { 915, 2, 41}, {1147, 2, 41}, {1028, 2, 42}, {1054, 2, 42}, { 556, 2, 43}, { 555, 2, 43}, { 255, 2, 44}, { 254, 2, 44}, {1030, 2, 45}, {1029, 2, 45}, { 692, 2, 46}, { 691, 2, 46}, {1033, 2, 47}, {1040, 2, 47}, { 694, 2, 48}, { 693, 2, 48}, {1079, 2, 49}, {1078, 2, 49}, { 969, 2, 50}, { 970, 2, 50}, { 853, 2, 51}, { 852, 2, 51}, { 402, 2, 52}, { 389, 2, 52}, { 246, 2, 53}, { 245, 2, 53}, { 253, 2, 54}, { 252, 2, 54}, { 385, 2, 55}, { 914, 2, 55}, { 384, 2, 55}, { 796, 2, 56}, {1041, 2, 56}, { 515, 2, 57}, { 514, 2, 57}, {1060, 2, 58}, {1053, 2, 58}, {1022, 2, 59}, {1021, 2, 59}, { 839, 2, 60}, {1127, 2, 60}, { 645, 2, 61}, { 644, 2, 61}, { 204, 2, 62}, { 203, 2, 62}, { 392, 2, 63}, {1128, 2, 63}, { 891, 2, 64}, { 890, 2, 64}, { 886, 2, 65}, { 885, 2, 65}, { 799, 2, 66}, { 800, 2, 66}, { 999, 2, 67}, { 998, 2, 67}, { 686, 2, 68}, { 685, 2, 68}, { 836, 2, 69}, { 837, 2, 69}, {1091, 2, 70}, {1092, 2, 70}, { 954, 2, 71}, { 953, 2, 71}, { 642, 2, 72}, { 628, 2, 72}, { 927, 2, 73}, { 936, 2, 73}, { 720, 2, 74}, { 719, 2, 74}, { 269, 2, 75}, { 268, 2, 75}, { 722, 2, 76}, { 721, 2, 76}, { 316, 2, 77}, {1034, 2, 78}, { 657, 2, 78}, {1035, 2, 79}, {1044, 2, 79}, { 198, 2, 80}, { 199, 2, 80}, { 453, 2, 81}, { 452, 2, 81}, { 950, 2, 82}, { 951, 2, 82}, { 700, 2, 83}, { 206, 2, 84}, { 205, 2, 84}, { 615, 2, 85}, { 614, 2, 85}, { 744, 2, 86}, { 778, 2, 86}, { 587, 2, 87}, { 182, 2, 87}, { 840, 2, 88}, { 952, 2, 88}, { 600, 2, 89}, { 909, 2, 89}, { 599, 2, 90}, { 889, 2, 90}, { 841, 2, 91}, { 850, 2, 91}, { 627, 2, 92}, { 651, 2, 92}, { 210, 2, 93}, { 211, 2, 93}, { 244, 2, 94}, { 243, 2, 94}, { 729, 2, 95}, { 728, 2, 95}, { 315, 2, 96}, { 261, 2, 96}, { 749, 2, 97}, { 747, 2, 97}, { 750, 2, 98}, { 748, 2, 98}, { 751, 2, 99}, { 898, 2, 99}, { 968, 2, 100}, { 972, 2, 100}, { 985, 2, 101}, { 984, 2, 101}, {1039, 2, 102}, {1038, 2, 102}, { 640, 2, 103}, { 854, 3, 0}, {1129, 3, 0}, { 444, 3, 1}, { 445, 3, 1}, { 973, 3, 2}, { 992, 3, 2}, { 560, 3, 3}, { 571, 3, 3}, { 390, 3, 4}, { 690, 3, 5}, { 795, 3, 6}, { 801, 3, 6}, { 482, 3, 7}, { 924, 3, 8}, { 929, 3, 8}, { 497, 3, 9}, { 495, 3, 9}, { 638, 3, 10}, { 625, 3, 10}, { 152, 3, 11}, { 676, 3, 11}, { 752, 3, 12}, { 768, 3, 12}, { 753, 3, 13}, { 770, 3, 13}, { 754, 3, 14}, { 738, 3, 14}, { 822, 3, 15}, { 818, 3, 15}, { 484, 3, 16}, { 479, 3, 16}, { 854, 4, 0}, {1129, 4, 0}, { 390, 4, 1}, { 690, 4, 2}, { 382, 4, 3}, { 355, 4, 3}, { 482, 4, 4}, { 479, 4, 4}, { 924, 4, 5}, { 929, 4, 5}, { 989, 4, 6}, { 977, 4, 6}, { 653, 4, 7}, {1090, 4, 8}, {1027, 4, 9}, { 715, 4, 10}, { 717, 4, 11}, { 905, 4, 12}, { 854, 5, 0}, {1129, 5, 0}, { 390, 5, 1}, { 690, 5, 2}, { 482, 5, 3}, { 479, 5, 3}, { 965, 5, 4}, { 960, 5, 4}, { 497, 5, 5}, { 495, 5, 5}, { 986, 5, 6}, { 706, 5, 7}, { 703, 5, 7}, {1087, 5, 8}, {1086, 5, 8}, { 842, 5, 9}, { 676, 5, 9}, { 822, 5, 10}, { 818, 5, 10}, { 192, 5, 11}, { 188, 5, 11}, { 996, 5, 12}, { 995, 5, 12}, { 351, 5, 13}, { 350, 5, 13}, { 957, 5, 14}, { 956, 5, 14}, { 802, 6, 0}, { 485, 6, 0}, { 486, 6, 0}, { 785, 6, 0}, {1134, 6, 1}, {1027, 6, 1}, {1130, 6, 1}, {1074, 6, 1}, { 812, 7, 0}, { 787, 7, 0}, { 677, 7, 1}, { 653, 7, 1}, {1107, 7, 2}, {1090, 7, 2}, {1070, 7, 3}, {1027, 7, 3}, { 716, 7, 4}, { 715, 7, 4}, { 718, 7, 5}, { 717, 7, 5}, { 681, 8, 0}, { 653, 8, 0}, { 932, 8, 1}, { 922, 8, 1}, { 476, 8, 2}, { 455, 8, 2}, { 477, 8, 3}, { 466, 8, 3}, { 478, 8, 4}, { 467, 8, 4}, { 174, 8, 5}, { 160, 8, 5}, { 367, 8, 6}, { 391, 8, 6}, { 874, 8, 7}, { 200, 8, 7}, { 962, 8, 8}, { 945, 8, 8}, {1114, 8, 9}, {1120, 8, 9}, { 863, 8, 10}, { 845, 8, 10}, { 240, 8, 11}, { 233, 8, 11}, { 809, 8, 12}, { 816, 8, 12}, { 171, 8, 13}, { 147, 8, 13}, { 684, 8, 14}, { 712, 8, 14}, { 935, 8, 15}, { 939, 8, 15}, { 682, 8, 16}, { 710, 8, 16}, { 933, 8, 17}, { 937, 8, 17}, { 900, 8, 18}, { 881, 8, 18}, { 683, 8, 19}, { 711, 8, 19}, { 934, 8, 20}, { 938, 8, 20}, { 494, 8, 21}, { 500, 8, 21}, { 901, 8, 22}, { 882, 8, 22}, { 813, 9, 0}, { 814, 9, 0}, { 1, 9, 0}, { 870, 9, 1}, { 869, 9, 1}, { 2, 9, 1}, { 819, 9, 2}, { 798, 9, 2}, { 119, 9, 2}, { 632, 9, 3}, { 126, 9, 3}, { 652, 9, 3}, {1101, 9, 4}, {1108, 9, 4}, { 132, 9, 4}, { 277, 9, 5}, { 13, 9, 5}, { 280, 9, 6}, { 22, 9, 6}, { 282, 9, 7}, { 25, 9, 7}, { 285, 9, 8}, { 28, 9, 8}, { 289, 9, 9}, { 32, 9, 9}, { 290, 9, 10}, { 33, 9, 10}, { 291, 9, 11}, { 35, 9, 11}, { 292, 9, 12}, { 36, 9, 12}, { 293, 9, 13}, { 38, 9, 13}, { 294, 9, 14}, { 39, 9, 14}, { 295, 9, 15}, { 43, 9, 15}, { 296, 9, 16}, { 48, 9, 16}, { 297, 9, 17}, { 53, 9, 17}, { 298, 9, 18}, { 59, 9, 18}, { 299, 9, 19}, { 64, 9, 19}, { 300, 9, 20}, { 66, 9, 20}, { 301, 9, 21}, { 67, 9, 21}, { 302, 9, 22}, { 68, 9, 22}, { 303, 9, 23}, { 69, 9, 23}, { 304, 9, 24}, { 70, 9, 24}, { 305, 9, 25}, { 77, 9, 25}, { 306, 9, 26}, { 81, 9, 26}, { 307, 9, 27}, { 82, 9, 27}, { 308, 9, 28}, { 83, 9, 28}, { 309, 9, 29}, { 84, 9, 29}, { 310, 9, 30}, { 85, 9, 30}, { 311, 9, 31}, { 86, 9, 31}, { 312, 9, 32}, { 131, 9, 32}, { 313, 9, 33}, { 138, 9, 33}, { 278, 9, 34}, { 20, 9, 34}, { 279, 9, 35}, { 21, 9, 35}, { 281, 9, 36}, { 24, 9, 36}, { 283, 9, 37}, { 26, 9, 37}, { 284, 9, 38}, { 27, 9, 38}, { 286, 9, 39}, { 30, 9, 39}, { 287, 9, 40}, { 31, 9, 40}, { 195, 9, 41}, { 47, 9, 41}, { 191, 9, 41}, { 193, 9, 42}, { 49, 9, 42}, { 189, 9, 42}, { 194, 9, 43}, { 190, 9, 43}, { 50, 9, 43}, { 216, 9, 44}, { 228, 9, 44}, { 52, 9, 44}, { 215, 9, 45}, { 200, 9, 45}, { 54, 9, 45}, { 217, 9, 46}, { 242, 9, 46}, { 55, 9, 46}, { 678, 9, 47}, { 56, 9, 47}, { 653, 9, 47}, { 930, 9, 48}, { 922, 9, 48}, { 57, 9, 48}, { 141, 9, 49}, { 58, 9, 49}, { 147, 9, 49}, { 140, 9, 50}, { 139, 9, 50}, { 60, 9, 50}, { 142, 9, 51}, { 166, 9, 51}, { 61, 9, 51}, { 443, 9, 52}, { 62, 9, 52}, { 419, 9, 52}, { 442, 9, 53}, { 63, 9, 53}, { 414, 9, 53}, { 604, 9, 54}, { 607, 9, 54}, { 65, 9, 54}, { 288, 9, 55}, { 196, 9, 56}, { 807, 10, 0}, { 265, 10, 1}, { 262, 10, 1}, { 368, 10, 2}, { 358, 10, 2}, { 496, 10, 3}, { 804, 10, 4}, { 791, 10, 4}, { 595, 10, 5}, { 594, 10, 5}, { 742, 10, 6}, { 741, 10, 6}, { 491, 10, 7}, { 490, 10, 7}, { 609, 10, 8}, { 608, 10, 8}, { 325, 10, 9}, { 456, 10, 9}, {1005, 10, 10}, {1002, 10, 10}, { 997, 10, 11}, {1099, 10, 12}, {1098, 10, 12}, {1115, 10, 13}, { 790, 10, 14}, { 789, 10, 14}, { 978, 10, 15}, { 981, 10, 15}, { 994, 10, 16}, { 993, 10, 16}, { 499, 10, 17}, { 498, 10, 17}, { 794, 11, 0}, { 785, 11, 0}, { 159, 11, 1}, { 139, 11, 1}, { 542, 11, 2}, { 536, 11, 2}, {1115, 11, 3}, {1111, 11, 3}, { 501, 11, 4}, { 485, 11, 4}, { 790, 11, 5}, { 787, 11, 5}, { 805, 12, 0}, { 146, 12, 1}, { 148, 12, 2}, { 151, 12, 3}, { 214, 12, 4}, { 220, 12, 5}, { 415, 12, 6}, { 416, 12, 7}, { 449, 12, 8}, { 489, 12, 9}, { 493, 12, 10}, { 502, 12, 11}, { 503, 12, 12}, { 539, 12, 13}, { 544, 12, 14}, {1047, 12, 14}, { 557, 12, 15}, { 561, 12, 16}, { 562, 12, 17}, { 563, 12, 18}, { 626, 12, 19}, { 637, 12, 20}, { 650, 12, 21}, { 655, 12, 22}, { 656, 12, 23}, { 743, 12, 24}, { 755, 12, 25}, { 811, 12, 26}, { 825, 12, 27}, { 883, 12, 28}, { 916, 12, 29}, { 917, 12, 30}, { 926, 12, 31}, { 928, 12, 32}, { 948, 12, 33}, { 949, 12, 34}, { 961, 12, 35}, { 963, 12, 36}, { 971, 12, 37}, {1019, 12, 38}, {1032, 12, 39}, {1045, 12, 40}, {1046, 12, 41}, {1052, 12, 42}, {1112, 12, 43}, {1026, 12, 44}, {1131, 12, 45}, {1132, 12, 46}, {1133, 12, 47}, {1141, 12, 48}, {1142, 12, 49}, {1145, 12, 50}, {1146, 12, 51}, { 643, 12, 52}, { 488, 12, 53}, { 256, 12, 54}, { 487, 12, 55}, { 827, 12, 56}, { 940, 12, 57}, { 808, 13, 0}, {1075, 13, 0}, { 619, 13, 1}, { 259, 13, 1}, { 448, 13, 2}, { 413, 13, 2}, { 931, 13, 3}, { 922, 13, 3}, { 680, 13, 4}, { 653, 13, 4}, {1071, 13, 5}, {1027, 13, 5}, {1085, 14, 0}, {1129, 14, 0}, { 847, 14, 1}, { 846, 14, 1}, { 353, 14, 2}, { 350, 14, 2}, { 920, 14, 3}, { 919, 14, 3}, { 516, 14, 4}, { 513, 14, 4}, { 810, 14, 5}, { 815, 14, 5}, { 480, 14, 6}, { 479, 14, 6}, { 251, 14, 7}, {1020, 14, 7}, { 592, 14, 8}, { 607, 14, 8}, { 904, 14, 9}, { 903, 14, 9}, { 902, 14, 10}, { 899, 14, 10}, { 822, 14, 11}, { 818, 14, 11}, { 155, 14, 12}, { 147, 14, 12}, { 579, 14, 13}, { 575, 14, 13}, { 601, 14, 14}, { 602, 14, 14}, { 588, 14, 14}, { 574, 14, 15}, { 573, 14, 15}, { 363, 14, 16}, { 354, 14, 16}, { 249, 14, 17}, { 212, 14, 17}, { 248, 14, 18}, { 202, 14, 18}, { 987, 14, 19}, { 986, 14, 19}, { 730, 14, 20}, { 227, 14, 20}, { 270, 14, 21}, { 390, 14, 21}, { 698, 14, 22}, { 690, 14, 22}, { 381, 14, 23}, { 274, 14, 23}, { 370, 14, 24}, { 947, 14, 24}, { 159, 14, 25}, { 145, 14, 25}, { 250, 14, 26}, { 201, 14, 26}, {1018, 14, 27}, { 967, 14, 27}, {1152, 14, 28}, {1151, 14, 28}, { 797, 14, 29}, { 801, 14, 29}, {1119, 14, 30}, {1116, 14, 30}, { 617, 14, 31}, { 624, 14, 32}, { 623, 14, 33}, { 537, 14, 34}, { 538, 14, 35}, { 352, 14, 36}, { 388, 14, 36}, { 560, 14, 37}, { 571, 14, 37}, { 371, 14, 38}, { 326, 14, 38}, { 924, 14, 39}, { 929, 14, 39}, { 807, 15, 0}, { 822, 15, 1}, { 818, 15, 1}, { 438, 15, 2}, { 432, 15, 2}, { 421, 15, 3}, { 420, 15, 3}, { 788, 16, 0}, { 0, 16, 1}, { 1, 16, 2}, { 4, 16, 3}, { 3, 16, 4}, { 12, 16, 5}, { 11, 16, 6}, { 10, 16, 7}, { 9, 16, 8}, { 72, 16, 9}, { 8, 16, 10}, { 7, 16, 11}, { 6, 16, 12}, { 76, 16, 13}, { 42, 16, 14}, { 5, 16, 15}, { 75, 16, 16}, { 109, 16, 17}, { 41, 16, 18}, { 74, 16, 19}, { 91, 16, 20}, { 108, 16, 21}, { 121, 16, 22}, { 2, 16, 23}, { 73, 16, 24}, { 40, 16, 25}, { 107, 16, 26}, { 71, 16, 27}, { 120, 16, 28}, { 90, 16, 29}, { 133, 16, 30}, { 106, 16, 31}, { 23, 16, 32}, { 114, 16, 33}, { 29, 16, 34}, { 119, 16, 35}, { 34, 16, 36}, { 126, 16, 37}, { 37, 16, 38}, { 132, 16, 39}, { 13, 16, 40}, { 22, 16, 41}, { 25, 16, 42}, { 28, 16, 43}, { 32, 16, 44}, { 33, 16, 45}, { 35, 16, 46}, { 36, 16, 47}, { 38, 16, 48}, { 39, 16, 49}, { 43, 16, 50}, { 48, 16, 51}, { 53, 16, 52}, { 59, 16, 53}, { 64, 16, 54}, { 66, 16, 55}, { 67, 16, 56}, { 68, 16, 57}, { 69, 16, 58}, { 70, 16, 59}, { 77, 16, 60}, { 81, 16, 61}, { 82, 16, 62}, { 83, 16, 63}, { 84, 16, 64}, { 85, 16, 65}, { 86, 16, 66}, { 87, 16, 67}, { 88, 16, 68}, { 89, 16, 69}, { 92, 16, 70}, { 96, 16, 71}, { 97, 16, 72}, { 98, 16, 73}, { 100, 16, 74}, { 101, 16, 75}, { 102, 16, 76}, { 103, 16, 77}, { 104, 16, 78}, { 105, 16, 79}, { 110, 16, 80}, { 115, 16, 81}, { 122, 16, 82}, { 127, 16, 83}, { 134, 16, 84}, { 14, 16, 85}, { 44, 16, 86}, { 78, 16, 87}, { 93, 16, 88}, { 111, 16, 89}, { 116, 16, 90}, { 123, 16, 91}, { 128, 16, 92}, { 135, 16, 93}, { 15, 16, 94}, { 45, 16, 95}, { 79, 16, 96}, { 94, 16, 97}, { 112, 16, 98}, { 117, 16, 99}, { 124, 16, 100}, { 129, 16, 101}, { 136, 16, 102}, { 16, 16, 103}, { 46, 16, 104}, { 80, 16, 105}, { 95, 16, 106}, { 113, 16, 107}, { 118, 16, 108}, { 125, 16, 109}, { 130, 16, 110}, { 137, 16, 111}, { 17, 16, 112}, { 51, 16, 113}, { 99, 16, 114}, { 18, 16, 115}, { 19, 16, 116}, { 787, 17, 0}, { 930, 17, 1}, { 678, 17, 2}, {1103, 17, 3}, { 679, 17, 4}, {1064, 17, 5}, { 238, 17, 6}, {1065, 17, 7}, {1069, 17, 8}, {1067, 17, 9}, {1068, 17, 10}, { 239, 17, 11}, {1066, 17, 12}, { 871, 17, 13}, { 603, 17, 14}, { 854, 18, 0}, { 226, 18, 1}, {1102, 18, 2}, { 197, 18, 3}, { 819, 18, 4}, {1101, 18, 5}, {1106, 18, 6}, {1105, 18, 7}, {1104, 18, 8}, { 378, 18, 9}, { 373, 18, 10}, { 374, 18, 11}, { 379, 18, 12}, { 380, 18, 13}, { 377, 18, 14}, { 375, 18, 15}, { 376, 18, 16}, { 775, 18, 17}, {1062, 18, 18}, {1063, 18, 19}, { 925, 18, 20}, }; /* property values: 4976 bytes. */ /* Codepoints which expand on full case-folding. */ RE_UINT16 re_expand_on_folding[] = { 223, 304, 329, 496, 912, 944, 1415, 7830, 7831, 7832, 7833, 7834, 7838, 8016, 8018, 8020, 8022, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8114, 8115, 8116, 8118, 8119, 8124, 8130, 8131, 8132, 8134, 8135, 8140, 8146, 8147, 8150, 8151, 8162, 8163, 8164, 8166, 8167, 8178, 8179, 8180, 8182, 8183, 8188, 64256, 64257, 64258, 64259, 64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279, }; /* expand_on_folding: 208 bytes. */ /* General_Category. */ static RE_UINT8 re_general_category_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 14, 14, 14, 15, 16, 17, 18, 19, 20, 19, 21, 19, 19, 19, 19, 19, 19, 22, 19, 19, 19, 19, 19, 19, 19, 19, 23, 19, 19, 19, 24, 19, 19, 25, 26, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 7, 28, 29, 19, 19, 19, 19, 19, 19, 19, 30, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 31, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 32, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 32, }; static RE_UINT8 re_general_category_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 69, 72, 73, 69, 69, 64, 74, 64, 64, 75, 76, 77, 78, 79, 80, 81, 82, 69, 83, 84, 85, 86, 87, 88, 89, 69, 69, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 90, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 91, 92, 34, 34, 34, 34, 34, 34, 34, 34, 93, 34, 34, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 34, 34, 109, 110, 111, 112, 34, 34, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 76, 123, 124, 125, 126, 127, 76, 76, 76, 76, 76, 76, 128, 76, 129, 130, 131, 76, 132, 76, 133, 76, 76, 76, 134, 76, 76, 76, 135, 136, 137, 138, 76, 76, 76, 76, 76, 76, 76, 76, 76, 139, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 34, 34, 140, 76, 141, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 34, 34, 34, 34, 142, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 143, 76, 76, 76, 76, 76, 76, 76, 76, 76, 144, 145, 146, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 69, 147, 148, 149, 150, 76, 151, 76, 152, 153, 154, 155, 156, 157, 158, 159, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 160, 161, 76, 76, 162, 163, 164, 165, 166, 76, 167, 168, 169, 170, 171, 172, 173, 174, 175, 76, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 176, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 177, 34, 178, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 34, 34, 34, 34, 178, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 179, 76, 180, 181, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 182, }; static RE_UINT16 re_general_category_stage_3[] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, 13, 13, 42, 43, 9, 44, 45, 11, 46, 47, 32, 48, 49, 50, 51, 52, 53, 54, 50, 50, 55, 32, 56, 57, 50, 50, 50, 50, 50, 58, 59, 60, 61, 62, 50, 32, 63, 50, 50, 50, 50, 50, 64, 65, 66, 50, 67, 68, 50, 69, 70, 71, 50, 72, 73, 73, 73, 73, 74, 73, 73, 73, 75, 76, 77, 50, 50, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 84, 85, 92, 93, 94, 95, 96, 97, 98, 85, 99, 100, 101, 89, 102, 83, 84, 85, 103, 104, 105, 89, 106, 107, 108, 109, 110, 111, 112, 95, 113, 114, 115, 85, 116, 117, 118, 89, 119, 120, 115, 85, 121, 122, 123, 89, 124, 120, 115, 50, 125, 126, 127, 89, 128, 129, 130, 50, 131, 132, 133, 73, 134, 135, 50, 50, 136, 137, 138, 73, 73, 139, 140, 141, 142, 143, 144, 73, 73, 145, 146, 147, 148, 149, 50, 150, 151, 152, 153, 32, 154, 155, 156, 73, 73, 50, 50, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 50, 50, 166, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 167, 168, 50, 50, 167, 50, 50, 169, 170, 171, 50, 50, 50, 170, 50, 50, 50, 172, 173, 174, 50, 175, 50, 50, 50, 50, 50, 176, 177, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 178, 50, 179, 180, 50, 50, 50, 50, 181, 182, 183, 184, 50, 185, 50, 186, 183, 187, 50, 50, 50, 188, 189, 190, 191, 192, 193, 191, 50, 50, 194, 50, 50, 195, 50, 50, 196, 50, 50, 50, 50, 197, 50, 150, 198, 199, 200, 50, 201, 176, 50, 50, 202, 203, 204, 205, 206, 206, 50, 207, 50, 50, 50, 208, 209, 210, 191, 191, 211, 73, 73, 73, 73, 73, 212, 50, 50, 213, 214, 159, 215, 216, 217, 50, 218, 66, 50, 50, 219, 220, 50, 50, 221, 222, 223, 66, 50, 224, 73, 73, 73, 73, 225, 226, 227, 228, 11, 11, 229, 27, 27, 27, 230, 231, 11, 232, 27, 27, 32, 32, 233, 234, 13, 13, 13, 13, 13, 13, 13, 13, 13, 235, 13, 13, 13, 13, 13, 13, 236, 237, 236, 236, 237, 238, 236, 239, 240, 240, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 73, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 267, 268, 269, 270, 206, 271, 272, 206, 273, 274, 274, 274, 274, 274, 274, 274, 274, 275, 206, 276, 206, 206, 206, 206, 277, 206, 278, 274, 279, 206, 280, 281, 282, 206, 206, 283, 73, 284, 73, 266, 266, 266, 285, 206, 206, 206, 206, 286, 266, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 287, 288, 206, 206, 289, 206, 206, 206, 206, 206, 206, 290, 206, 291, 206, 206, 206, 206, 206, 292, 293, 266, 294, 206, 206, 295, 274, 296, 274, 297, 298, 274, 274, 274, 299, 274, 300, 206, 206, 206, 274, 301, 175, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 9, 9, 302, 11, 11, 303, 304, 305, 13, 13, 13, 13, 13, 13, 306, 307, 11, 11, 308, 50, 50, 50, 309, 310, 50, 311, 312, 312, 312, 312, 32, 32, 313, 314, 315, 316, 73, 73, 73, 73, 206, 317, 206, 206, 206, 206, 206, 282, 206, 206, 206, 206, 206, 318, 73, 319, 320, 321, 322, 323, 135, 50, 50, 50, 50, 324, 177, 50, 50, 50, 50, 325, 326, 50, 201, 135, 50, 50, 50, 50, 327, 328, 50, 51, 206, 206, 282, 50, 206, 329, 330, 206, 331, 332, 206, 206, 330, 206, 206, 332, 206, 206, 206, 329, 50, 50, 50, 197, 206, 206, 206, 206, 50, 50, 50, 50, 150, 73, 73, 73, 50, 333, 50, 50, 50, 50, 50, 50, 150, 206, 206, 206, 283, 50, 50, 224, 334, 50, 335, 73, 13, 13, 336, 337, 13, 338, 50, 50, 50, 50, 339, 340, 31, 341, 342, 343, 13, 13, 13, 344, 345, 346, 347, 73, 73, 73, 73, 348, 349, 50, 350, 351, 50, 50, 50, 352, 353, 50, 50, 354, 355, 191, 32, 356, 66, 50, 357, 50, 358, 359, 50, 150, 77, 50, 50, 360, 361, 362, 73, 73, 50, 50, 363, 364, 365, 366, 50, 367, 50, 50, 50, 368, 369, 370, 371, 372, 373, 374, 312, 73, 73, 73, 73, 73, 73, 73, 73, 73, 50, 50, 375, 191, 50, 50, 376, 50, 377, 50, 50, 202, 378, 378, 378, 378, 378, 378, 378, 378, 379, 379, 379, 379, 379, 379, 379, 379, 50, 50, 50, 50, 50, 50, 201, 50, 50, 50, 50, 50, 50, 380, 73, 73, 381, 382, 383, 384, 385, 50, 50, 50, 50, 50, 50, 386, 387, 388, 50, 50, 50, 50, 50, 389, 73, 50, 50, 50, 50, 390, 50, 50, 195, 73, 73, 391, 32, 392, 233, 393, 394, 395, 396, 397, 50, 50, 50, 50, 50, 50, 50, 398, 399, 2, 3, 4, 5, 400, 401, 402, 50, 403, 50, 327, 404, 405, 406, 407, 408, 50, 171, 409, 201, 201, 73, 73, 50, 50, 50, 50, 50, 50, 50, 51, 410, 266, 266, 411, 267, 267, 267, 412, 413, 319, 73, 73, 73, 206, 206, 414, 50, 150, 50, 50, 50, 101, 73, 73, 50, 327, 415, 50, 416, 73, 73, 73, 50, 417, 50, 50, 418, 419, 73, 73, 9, 9, 420, 11, 11, 50, 50, 50, 50, 201, 191, 73, 73, 73, 73, 73, 421, 50, 50, 422, 50, 423, 73, 73, 50, 424, 50, 425, 73, 73, 73, 73, 50, 50, 50, 426, 73, 73, 73, 73, 427, 428, 50, 429, 430, 431, 50, 432, 50, 50, 50, 433, 50, 434, 50, 435, 50, 50, 50, 50, 436, 73, 73, 73, 73, 73, 73, 73, 73, 73, 266, 437, 438, 50, 50, 439, 440, 441, 442, 73, 217, 50, 50, 443, 444, 50, 436, 191, 445, 50, 446, 447, 448, 73, 73, 73, 217, 50, 50, 449, 450, 191, 73, 73, 50, 50, 451, 452, 191, 73, 73, 73, 50, 50, 50, 50, 50, 50, 327, 73, 267, 267, 267, 267, 267, 267, 453, 448, 50, 50, 327, 73, 73, 73, 73, 73, 50, 50, 50, 436, 73, 73, 73, 73, 50, 50, 50, 50, 176, 454, 203, 455, 456, 457, 73, 73, 73, 73, 73, 73, 458, 73, 73, 73, 73, 73, 73, 73, 206, 206, 206, 206, 206, 206, 206, 318, 206, 206, 459, 206, 206, 206, 460, 461, 462, 206, 463, 206, 206, 464, 73, 73, 206, 206, 206, 206, 465, 73, 73, 73, 206, 206, 206, 206, 206, 283, 266, 466, 9, 467, 11, 468, 469, 470, 236, 9, 471, 472, 473, 474, 475, 9, 467, 11, 476, 477, 11, 478, 479, 480, 481, 9, 482, 11, 9, 467, 11, 468, 469, 11, 236, 9, 471, 481, 9, 482, 11, 9, 467, 11, 483, 9, 484, 485, 486, 487, 11, 488, 9, 489, 490, 491, 492, 11, 493, 9, 494, 11, 495, 496, 496, 496, 497, 50, 498, 499, 500, 501, 502, 503, 504, 202, 505, 202, 73, 73, 73, 506, 206, 206, 319, 206, 206, 206, 206, 206, 206, 282, 329, 507, 291, 291, 73, 73, 508, 206, 329, 206, 206, 206, 319, 206, 206, 284, 73, 73, 73, 73, 509, 206, 510, 206, 206, 284, 511, 512, 73, 73, 206, 206, 513, 514, 206, 206, 206, 515, 206, 282, 206, 206, 516, 73, 206, 513, 206, 206, 206, 329, 517, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 518, 206, 206, 206, 464, 282, 206, 519, 73, 73, 73, 73, 73, 73, 73, 73, 520, 206, 206, 206, 206, 521, 73, 73, 73, 206, 206, 206, 206, 318, 73, 73, 73, 206, 206, 206, 206, 206, 206, 206, 282, 50, 50, 50, 50, 50, 311, 73, 73, 50, 50, 50, 176, 50, 50, 50, 50, 50, 201, 73, 73, 73, 73, 73, 73, 522, 73, 523, 523, 523, 523, 523, 523, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 73, 379, 379, 379, 379, 379, 379, 379, 524, }; static RE_UINT8 re_general_category_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 46, 44, 44, 41, 47, 11, 48, 48, 11, 34, 11, 11, 11, 11, 11, 11, 11, 11, 49, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 50, 34, 32, 34, 11, 32, 51, 43, 43, 52, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, 32, 44, 44, 44, 44, 49, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 48, 53, 2, 2, 2, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 55, 56, 44, 57, 58, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 59, 60, 61, 43, 60, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 44, 44, 36, 63, 46, 44, 44, 44, 44, 44, 64, 64, 65, 8, 9, 66, 2, 67, 43, 43, 43, 43, 43, 61, 65, 2, 68, 36, 36, 36, 36, 69, 43, 43, 7, 7, 7, 7, 7, 2, 2, 36, 70, 36, 36, 36, 36, 36, 36, 36, 36, 36, 71, 43, 43, 43, 72, 51, 43, 43, 73, 74, 75, 43, 43, 36, 7, 7, 7, 7, 7, 36, 76, 77, 2, 2, 2, 2, 2, 2, 2, 78, 69, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 79, 80, 36, 36, 36, 36, 43, 43, 43, 43, 43, 70, 44, 44, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 69, 43, 43, 43, 43, 40, 21, 2, 81, 44, 44, 36, 36, 36, 43, 43, 74, 43, 43, 43, 43, 74, 43, 74, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 46, 36, 36, 36, 36, 69, 43, 44, 46, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 62, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 79, 43, 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 82, 70, 83, 84, 43, 43, 43, 82, 83, 84, 83, 69, 43, 43, 43, 36, 36, 36, 36, 36, 43, 2, 7, 7, 7, 7, 7, 85, 36, 36, 36, 80, 36, 36, 36, 58, 83, 80, 36, 36, 36, 62, 80, 62, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 62, 62, 44, 36, 36, 44, 70, 83, 84, 43, 79, 86, 87, 86, 84, 62, 44, 44, 44, 86, 44, 44, 36, 80, 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 88, 44, 44, 58, 82, 80, 36, 36, 62, 44, 80, 62, 36, 80, 62, 36, 44, 79, 83, 84, 79, 44, 58, 79, 58, 43, 44, 58, 44, 44, 44, 80, 36, 62, 62, 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 69, 44, 44, 44, 44, 44, 58, 82, 80, 36, 36, 36, 36, 80, 36, 80, 36, 36, 36, 36, 36, 36, 62, 36, 80, 36, 36, 44, 70, 83, 84, 43, 43, 58, 82, 86, 84, 44, 62, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 44, 44, 44, 44, 62, 36, 80, 36, 36, 44, 70, 84, 84, 43, 79, 86, 87, 86, 84, 44, 44, 44, 44, 82, 44, 44, 36, 80, 77, 27, 27, 27, 44, 44, 44, 44, 44, 70, 80, 36, 36, 62, 44, 36, 62, 36, 36, 44, 80, 62, 62, 36, 44, 80, 62, 44, 36, 62, 44, 36, 36, 36, 36, 36, 36, 44, 44, 83, 82, 87, 44, 83, 87, 83, 84, 44, 62, 44, 44, 86, 44, 44, 44, 44, 27, 89, 67, 67, 88, 90, 44, 44, 86, 83, 80, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 44, 80, 43, 82, 83, 87, 43, 79, 43, 43, 44, 44, 44, 58, 79, 36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 89, 44, 83, 80, 36, 36, 36, 62, 36, 36, 36, 80, 36, 36, 44, 70, 84, 83, 83, 87, 82, 87, 83, 43, 44, 44, 44, 86, 87, 44, 44, 44, 62, 80, 62, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 62, 80, 83, 84, 43, 79, 83, 87, 83, 84, 62, 44, 44, 44, 86, 44, 44, 44, 44, 27, 27, 27, 44, 91, 36, 36, 36, 44, 83, 80, 36, 36, 36, 36, 36, 36, 36, 36, 62, 44, 36, 36, 36, 36, 80, 36, 36, 36, 36, 80, 44, 36, 36, 36, 62, 44, 79, 44, 86, 83, 43, 79, 79, 83, 83, 83, 83, 44, 83, 46, 44, 44, 44, 44, 44, 80, 36, 36, 36, 36, 36, 36, 36, 69, 36, 43, 43, 43, 79, 44, 57, 36, 36, 36, 74, 43, 43, 43, 61, 7, 7, 7, 7, 7, 2, 44, 44, 80, 62, 62, 80, 62, 62, 80, 44, 44, 44, 36, 36, 80, 36, 36, 36, 80, 36, 80, 80, 44, 36, 80, 36, 69, 36, 43, 43, 43, 58, 70, 44, 36, 36, 62, 81, 43, 43, 43, 44, 7, 7, 7, 7, 7, 44, 36, 36, 76, 67, 2, 2, 2, 2, 2, 2, 2, 92, 92, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 51, 51, 51, 4, 4, 83, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 44, 58, 43, 43, 43, 43, 43, 43, 82, 43, 43, 61, 43, 36, 36, 69, 43, 43, 43, 43, 43, 58, 43, 43, 43, 43, 43, 43, 43, 43, 43, 79, 67, 67, 67, 67, 75, 67, 67, 90, 67, 2, 2, 92, 67, 21, 46, 44, 44, 36, 36, 36, 36, 36, 93, 84, 43, 82, 43, 43, 43, 84, 82, 84, 70, 7, 7, 7, 7, 7, 2, 2, 2, 36, 36, 36, 83, 43, 36, 36, 43, 70, 83, 94, 93, 83, 83, 83, 36, 69, 43, 70, 36, 36, 36, 36, 36, 36, 82, 84, 82, 83, 83, 84, 93, 7, 7, 7, 7, 7, 83, 84, 67, 11, 11, 11, 49, 44, 44, 49, 44, 36, 36, 36, 36, 36, 63, 68, 36, 36, 36, 36, 36, 62, 36, 36, 44, 36, 36, 36, 62, 62, 36, 36, 44, 62, 36, 36, 44, 36, 36, 36, 62, 62, 36, 36, 44, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 58, 43, 2, 2, 2, 2, 95, 27, 27, 27, 27, 27, 27, 27, 27, 27, 96, 44, 67, 67, 67, 67, 67, 44, 44, 44, 36, 36, 62, 44, 44, 44, 44, 44, 97, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 63, 71, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 99, 100, 44, 36, 36, 36, 36, 36, 63, 2, 101, 102, 44, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 62, 36, 36, 43, 79, 44, 44, 44, 44, 44, 36, 43, 61, 46, 44, 44, 44, 44, 36, 43, 44, 44, 44, 44, 44, 44, 62, 43, 44, 44, 44, 44, 44, 44, 36, 36, 43, 84, 43, 43, 43, 83, 83, 83, 83, 82, 84, 43, 43, 43, 43, 43, 2, 85, 2, 66, 69, 44, 7, 7, 7, 7, 7, 44, 44, 44, 27, 27, 27, 27, 27, 44, 44, 44, 2, 2, 2, 103, 2, 60, 43, 65, 36, 104, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 69, 62, 44, 44, 36, 36, 36, 44, 44, 44, 44, 44, 43, 82, 83, 84, 82, 83, 44, 44, 83, 82, 83, 83, 84, 43, 44, 44, 90, 44, 2, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 36, 36, 36, 36, 44, 44, 83, 83, 83, 83, 83, 83, 83, 83, 94, 36, 36, 36, 83, 44, 44, 44, 7, 7, 7, 7, 7, 96, 44, 67, 67, 67, 67, 67, 67, 67, 67, 67, 36, 36, 36, 69, 82, 84, 44, 2, 36, 36, 93, 82, 43, 43, 43, 79, 82, 82, 84, 43, 43, 43, 82, 83, 83, 84, 43, 43, 43, 43, 79, 58, 2, 2, 2, 85, 2, 2, 2, 44, 43, 43, 94, 36, 36, 36, 36, 36, 36, 36, 82, 43, 43, 82, 82, 83, 83, 82, 94, 36, 36, 36, 44, 44, 92, 67, 67, 67, 67, 51, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44, 43, 94, 36, 36, 36, 36, 36, 36, 93, 43, 43, 83, 43, 84, 83, 36, 36, 36, 36, 82, 43, 83, 84, 84, 43, 83, 44, 44, 44, 44, 2, 2, 36, 36, 83, 83, 83, 83, 43, 43, 43, 43, 83, 43, 44, 55, 2, 2, 7, 7, 7, 7, 7, 44, 80, 36, 36, 36, 36, 36, 40, 40, 40, 2, 2, 2, 2, 2, 44, 44, 44, 44, 43, 61, 43, 43, 43, 43, 43, 43, 82, 43, 43, 43, 70, 36, 69, 36, 36, 83, 70, 62, 44, 44, 44, 44, 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16, 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16, 105, 40, 40, 43, 43, 43, 79, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44, 16, 16, 16, 16, 49, 49, 49, 49, 16, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16, 16, 106, 106, 106, 106, 16, 16, 107, 16, 11, 11, 108, 109, 41, 16, 107, 16, 11, 11, 108, 41, 16, 16, 44, 16, 11, 11, 110, 41, 16, 16, 16, 16, 11, 11, 111, 41, 44, 16, 107, 16, 11, 11, 108, 112, 113, 113, 113, 113, 113, 114, 64, 64, 115, 115, 115, 2, 116, 117, 116, 117, 2, 2, 2, 2, 118, 64, 64, 119, 2, 2, 2, 2, 120, 121, 2, 122, 123, 2, 124, 125, 2, 2, 2, 2, 2, 9, 123, 2, 2, 2, 2, 126, 64, 64, 65, 64, 64, 64, 64, 64, 127, 44, 27, 27, 27, 8, 124, 128, 27, 27, 27, 27, 27, 8, 124, 100, 40, 40, 40, 40, 40, 40, 81, 44, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 129, 44, 44, 43, 43, 43, 43, 43, 43, 130, 52, 131, 52, 131, 43, 43, 43, 43, 43, 79, 44, 44, 44, 44, 44, 44, 44, 67, 132, 67, 133, 67, 34, 11, 16, 11, 32, 133, 67, 50, 11, 11, 67, 67, 67, 132, 132, 132, 11, 11, 134, 11, 11, 35, 36, 39, 67, 16, 11, 8, 8, 50, 16, 16, 26, 67, 135, 27, 27, 27, 27, 27, 27, 27, 27, 101, 101, 101, 101, 101, 101, 101, 101, 101, 136, 137, 101, 138, 44, 44, 44, 8, 8, 139, 67, 67, 8, 67, 67, 139, 26, 67, 139, 67, 67, 67, 139, 67, 67, 67, 67, 67, 67, 67, 8, 67, 139, 139, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67, 140, 141, 67, 67, 67, 67, 67, 67, 67, 67, 139, 67, 67, 67, 67, 67, 67, 26, 8, 8, 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 44, 44, 44, 44, 67, 67, 67, 67, 67, 90, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67, 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, 67, 67, 67, 67, 67, 67, 67, 26, 91, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 4, 4, 4, 4, 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 8, 8, 124, 142, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 8, 124, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 8, 8, 8, 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 139, 26, 8, 8, 144, 44, 11, 11, 11, 11, 11, 11, 11, 48, 16, 16, 16, 16, 16, 16, 16, 107, 32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11, 32, 32, 135, 67, 67, 133, 34, 145, 43, 32, 44, 44, 55, 2, 95, 2, 16, 16, 16, 54, 44, 44, 54, 44, 36, 36, 36, 36, 44, 44, 44, 53, 46, 44, 44, 44, 44, 44, 44, 58, 36, 36, 36, 62, 44, 44, 44, 44, 36, 36, 36, 62, 36, 36, 36, 62, 2, 116, 116, 2, 120, 121, 116, 2, 2, 2, 2, 6, 2, 103, 116, 2, 116, 4, 4, 4, 4, 2, 2, 85, 2, 2, 2, 2, 2, 115, 44, 44, 67, 67, 67, 67, 67, 91, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44, 1, 2, 146, 147, 4, 4, 4, 4, 4, 67, 4, 4, 4, 4, 148, 149, 150, 101, 101, 101, 101, 43, 43, 83, 151, 40, 40, 67, 101, 152, 63, 67, 36, 36, 36, 62, 58, 153, 154, 68, 36, 36, 36, 36, 36, 63, 40, 68, 44, 44, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, 155, 27, 27, 27, 27, 27, 27, 27, 36, 36, 104, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 156, 2, 7, 7, 7, 7, 7, 36, 44, 44, 32, 32, 32, 32, 32, 32, 32, 69, 52, 157, 43, 43, 43, 43, 43, 85, 32, 32, 32, 32, 44, 44, 44, 58, 36, 36, 36, 101, 101, 101, 101, 101, 43, 2, 2, 2, 44, 44, 44, 44, 41, 41, 41, 154, 40, 40, 40, 40, 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42, 158, 34, 107, 32, 32, 44, 44, 44, 44, 44, 44, 32, 32, 32, 32, 32, 48, 44, 44, 44, 44, 44, 44, 40, 35, 36, 36, 36, 70, 36, 70, 36, 69, 36, 36, 36, 93, 84, 82, 67, 67, 44, 44, 27, 27, 27, 67, 159, 44, 44, 44, 36, 36, 2, 2, 44, 44, 44, 44, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 83, 83, 83, 83, 83, 83, 83, 79, 44, 44, 44, 44, 2, 43, 36, 36, 36, 2, 71, 44, 44, 36, 36, 36, 43, 43, 43, 43, 2, 36, 36, 36, 69, 43, 43, 43, 43, 43, 83, 44, 44, 44, 44, 44, 55, 36, 69, 83, 43, 43, 83, 82, 83, 160, 2, 2, 2, 2, 2, 2, 53, 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 36, 36, 69, 43, 43, 82, 84, 82, 84, 79, 44, 44, 44, 44, 36, 69, 36, 36, 36, 36, 82, 44, 7, 7, 7, 7, 7, 44, 2, 2, 68, 36, 36, 76, 67, 93, 44, 44, 70, 43, 70, 69, 70, 36, 36, 43, 69, 62, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 80, 104, 2, 36, 36, 36, 36, 36, 93, 43, 83, 2, 104, 161, 79, 44, 44, 44, 44, 80, 36, 36, 62, 80, 36, 36, 62, 80, 36, 36, 62, 44, 44, 44, 44, 36, 93, 84, 83, 82, 160, 84, 44, 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 62, 44, 80, 36, 36, 162, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163, 36, 36, 36, 36, 36, 44, 44, 44, 16, 16, 16, 107, 44, 44, 44, 44, 44, 54, 16, 16, 44, 44, 80, 70, 36, 36, 36, 36, 164, 36, 36, 36, 36, 36, 36, 62, 36, 36, 62, 62, 36, 80, 62, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 4, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 159, 44, 2, 2, 2, 165, 125, 44, 44, 44, 6, 166, 167, 143, 143, 143, 143, 143, 143, 143, 125, 165, 125, 2, 122, 168, 2, 46, 2, 2, 148, 143, 143, 125, 2, 169, 8, 144, 66, 2, 44, 44, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 62, 78, 55, 2, 3, 2, 4, 5, 6, 2, 16, 16, 16, 16, 16, 17, 18, 124, 125, 4, 2, 36, 36, 36, 36, 36, 68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 62, 44, 20, 170, 88, 129, 26, 8, 139, 90, 44, 44, 44, 44, 78, 64, 67, 44, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 62, 36, 80, 2, 46, 44, 171, 27, 27, 27, 27, 27, 27, 44, 91, 67, 67, 67, 67, 101, 101, 138, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 96, 44, 44, 67, 67, 67, 67, 67, 67, 51, 44, 27, 27, 44, 44, 44, 44, 44, 44, 147, 36, 36, 36, 36, 102, 44, 44, 36, 36, 36, 36, 36, 36, 36, 55, 36, 36, 44, 44, 36, 36, 36, 36, 172, 101, 101, 44, 44, 44, 44, 44, 11, 11, 11, 11, 16, 16, 16, 16, 36, 36, 36, 44, 62, 36, 36, 36, 36, 36, 36, 80, 62, 44, 62, 80, 36, 36, 36, 55, 27, 27, 27, 27, 36, 36, 36, 27, 27, 27, 44, 55, 36, 36, 36, 36, 36, 44, 44, 55, 36, 36, 36, 36, 44, 44, 44, 36, 69, 43, 58, 79, 44, 44, 43, 43, 36, 36, 80, 36, 80, 36, 36, 36, 36, 36, 44, 44, 43, 79, 44, 58, 27, 27, 27, 27, 44, 44, 44, 44, 2, 2, 2, 2, 46, 44, 44, 44, 36, 36, 36, 36, 36, 36, 173, 30, 36, 36, 36, 44, 55, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27, 36, 62, 44, 44, 27, 27, 27, 27, 36, 36, 36, 36, 62, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27, 96, 84, 94, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 61, 2, 2, 2, 44, 44, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 7, 7, 7, 83, 84, 43, 82, 84, 61, 174, 2, 2, 44, 44, 44, 44, 44, 44, 44, 43, 70, 36, 36, 36, 36, 36, 36, 36, 36, 36, 69, 43, 43, 84, 43, 43, 43, 79, 7, 7, 7, 7, 7, 2, 2, 44, 44, 44, 44, 44, 44, 36, 93, 83, 43, 43, 43, 43, 82, 94, 36, 63, 2, 46, 44, 44, 44, 36, 36, 36, 36, 36, 69, 84, 83, 43, 43, 43, 84, 44, 44, 44, 44, 101, 102, 44, 44, 44, 44, 44, 44, 93, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 87, 44, 44, 44, 44, 44, 44, 44, 58, 43, 73, 40, 40, 40, 40, 40, 40, 36, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 91, 67, 67, 67, 67, 67, 175, 84, 43, 67, 175, 83, 83, 176, 64, 64, 64, 177, 43, 43, 43, 75, 51, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67, 67, 67, 67, 67, 67, 67, 67, 44, 67, 43, 75, 44, 44, 44, 44, 44, 27, 44, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 16, 16, 107, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 48, 11, 44, 48, 49, 48, 49, 11, 48, 11, 11, 11, 11, 16, 16, 54, 54, 16, 16, 16, 54, 16, 16, 16, 16, 16, 16, 16, 11, 49, 11, 48, 49, 11, 11, 11, 48, 11, 11, 11, 48, 16, 16, 16, 16, 16, 11, 49, 11, 48, 11, 11, 48, 48, 44, 11, 11, 11, 48, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7, 7, 7, 7, 7, 7, 7, 7, 7, 36, 36, 80, 36, 36, 36, 36, 36, 80, 62, 62, 80, 80, 36, 36, 36, 36, 62, 36, 36, 80, 80, 44, 44, 44, 62, 44, 80, 80, 80, 80, 36, 80, 62, 62, 80, 80, 80, 80, 80, 80, 62, 62, 80, 36, 62, 36, 36, 36, 62, 36, 36, 80, 36, 62, 62, 36, 36, 36, 36, 36, 80, 36, 36, 80, 36, 80, 36, 36, 80, 36, 36, 8, 44, 44, 44, 44, 44, 44, 44, 91, 67, 67, 67, 67, 67, 67, 90, 27, 27, 27, 27, 27, 96, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 90, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, 90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 91, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, 67, 67, 90, 67, 67, 90, 44, 44, 90, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 91, 67, 90, 44, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 44, 44, 44, 91, 67, 67, 90, 44, 91, 67, 67, 67, 67, 67, 78, 44, 44, 44, 44, 44, 44, 44, 64, 64, 64, 64, 64, 64, 64, 64, 163, 163, 163, 163, 163, 163, 163, 44, }; static RE_UINT8 re_general_category_stage_5[] = { 15, 15, 12, 23, 23, 23, 25, 23, 20, 21, 23, 24, 23, 19, 9, 9, 24, 24, 24, 23, 23, 1, 1, 1, 1, 20, 23, 21, 26, 22, 26, 2, 2, 2, 2, 20, 24, 21, 24, 15, 25, 25, 27, 23, 26, 27, 5, 28, 24, 16, 27, 26, 27, 24, 11, 11, 26, 11, 5, 29, 11, 23, 1, 24, 1, 2, 2, 24, 2, 1, 2, 5, 5, 5, 1, 3, 3, 2, 5, 2, 4, 4, 26, 26, 4, 26, 6, 6, 0, 0, 4, 2, 23, 0, 1, 23, 1, 0, 0, 1, 24, 1, 27, 6, 7, 7, 0, 4, 0, 2, 0, 23, 19, 0, 0, 25, 0, 6, 19, 6, 23, 6, 6, 23, 5, 0, 5, 23, 16, 16, 16, 0, 23, 25, 27, 27, 4, 5, 5, 6, 6, 5, 23, 5, 6, 16, 6, 4, 4, 6, 6, 27, 5, 27, 27, 5, 0, 16, 6, 0, 0, 5, 4, 0, 6, 8, 8, 8, 8, 6, 23, 4, 0, 8, 8, 0, 27, 25, 11, 27, 27, 0, 0, 27, 23, 27, 5, 8, 8, 5, 23, 11, 11, 0, 19, 5, 12, 5, 5, 20, 21, 0, 10, 10, 10, 0, 19, 23, 5, 4, 2, 4, 3, 3, 2, 0, 3, 26, 2, 26, 0, 26, 1, 26, 26, 0, 12, 12, 12, 16, 19, 19, 28, 29, 20, 28, 13, 14, 16, 12, 23, 28, 29, 23, 23, 22, 22, 23, 24, 20, 21, 23, 23, 12, 11, 4, 21, 4, 25, 0, 6, 7, 7, 6, 1, 27, 27, 1, 27, 2, 2, 27, 10, 1, 2, 10, 10, 11, 24, 27, 27, 20, 21, 27, 21, 24, 21, 20, 24, 0, 2, 6, 27, 4, 5, 10, 19, 20, 21, 21, 27, 10, 19, 4, 10, 4, 6, 26, 26, 4, 27, 11, 4, 23, 7, 23, 26, 1, 25, 27, 8, 23, 4, 8, 18, 18, 17, 17, 5, 24, 23, 20, 19, 22, 22, 20, 22, 22, 24, 19, 24, 26, 0, 11, 23, 10, 5, 11, 23, 16, 27, 8, 8, 16, 16, 6, }; /* General_Category: 8556 bytes. */ RE_UINT32 re_get_general_category(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 11; code = ch ^ (f << 11); pos = (RE_UINT32)re_general_category_stage_1[f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_general_category_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_general_category_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_general_category_stage_4[pos + f] << 1; value = re_general_category_stage_5[pos + code]; return value; } /* Block. */ static RE_UINT8 re_block_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, 12, 12, 12, 12, 13, 14, 15, 15, 15, 16, 17, 18, 19, 20, 21, 20, 22, 20, 20, 20, 20, 20, 20, 23, 20, 20, 20, 20, 20, 20, 20, 20, 24, 20, 20, 20, 25, 20, 20, 26, 27, 20, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 30, 31, 32, 20, 20, 20, 20, 20, 20, 20, 33, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 34, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, }; static RE_UINT8 re_block_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 31, 32, 32, 32, 33, 34, 34, 34, 34, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 51, 52, 53, 54, 55, 56, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 65, 66, 67, 68, 68, 69, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 82, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 89, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 104, 104, 104, 104, 104, 104, 104, 105, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 109, 110, 110, 110, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 119, 119, 119, 119, 119, 119, 125, 119, 126, 127, 128, 119, 129, 119, 130, 119, 119, 119, 131, 119, 119, 119, 132, 133, 134, 135, 119, 119, 119, 119, 119, 119, 119, 119, 119, 136, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 137, 137, 137, 137, 137, 137, 137, 137, 138, 119, 119, 119, 119, 119, 119, 119, 139, 139, 139, 139, 139, 139, 139, 139, 140, 119, 119, 119, 119, 119, 119, 119, 141, 141, 141, 141, 142, 119, 119, 119, 119, 119, 119, 119, 119, 119, 143, 144, 145, 145, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 146, 146, 147, 147, 148, 119, 149, 119, 150, 150, 150, 150, 150, 150, 150, 150, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 151, 151, 119, 119, 152, 153, 154, 154, 155, 155, 156, 156, 156, 156, 156, 156, 157, 158, 159, 119, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 163, 164, 165, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 166, 166, 166, 166, 167, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 168, 119, 169, 170, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, }; static RE_UINT8 re_block_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 52, 52, 53, 53, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 19, 19, 19, 19, 19, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 19, 19, 19, 19, 61, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 86, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 19, 102, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 106, 106, 106, 107, 107, 107, 107, 107, 107, 108, 109, 109, 110, 110, 110, 111, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 126, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 129, 129, 130, 130, 130, 131, 131, 131, 132, 132, 133, 133, 133, 133, 133, 133, 19, 19, 134, 134, 134, 134, 134, 134, 135, 135, 136, 136, 136, 136, 136, 136, 137, 137, 138, 138, 138, 19, 19, 19, 19, 19, 19, 19, 19, 19, 139, 139, 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, 144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 150, 151, 152, 152, 153, 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, 162, 19, 19, 19, 19, 19, 19, 19, 19, 163, 163, 164, 164, 164, 164, 19, 19, 165, 165, 165, 166, 166, 19, 19, 19, 167, 167, 168, 168, 168, 168, 19, 19, 169, 169, 169, 169, 169, 170, 170, 170, 171, 171, 171, 19, 19, 19, 19, 19, 172, 172, 172, 172, 173, 173, 19, 19, 174, 174, 175, 175, 19, 19, 19, 19, 176, 176, 177, 177, 177, 177, 177, 177, 178, 178, 178, 178, 178, 178, 179, 179, 180, 180, 180, 180, 181, 181, 182, 182, 183, 183, 183, 183, 183, 19, 19, 19, 19, 19, 19, 19, 19, 19, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, 186, 186, 186, 186, 186, 187, 187, 187, 188, 188, 188, 188, 188, 19, 19, 19, 189, 189, 189, 189, 189, 189, 19, 19, 190, 190, 190, 190, 190, 19, 19, 19, 191, 191, 191, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 19, 19, 19, 19, 19, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 19, 19, 19, 19, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 19, 19, 19, 19, 19, 19, 196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 19, 19, 19, 200, 200, 200, 200, 200, 200, 201, 201, 202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 203, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, 19, 19, 19, 211, 211, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 19, 19, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 19, 19, 19, 19, 19, 19, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 19, 19, 19, 19, 19, 19, 217, 217, 217, 217, 217, 217, 217, 217, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 19, 219, 219, 219, 219, 219, 219, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220, }; static RE_UINT8 re_block_stage_4[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 100, 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108, 109, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 121, 121, 121, 121, 122, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125, 126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133, 134, 134, 134, 134, 135, 135, 135, 135, 136, 136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, 141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 144, 144, 144, 144, 145, 145, 145, 145, 146, 146, 146, 146, 147, 147, 147, 147, 148, 148, 148, 148, 149, 149, 149, 149, 150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153, 154, 154, 154, 154, 155, 155, 155, 155, 156, 156, 156, 156, 157, 157, 157, 157, 158, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, 162, 162, 163, 163, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165, 166, 166, 166, 166, 167, 167, 167, 167, 168, 168, 168, 168, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171, 172, 172, 172, 172, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178, 179, 179, 179, 179, 180, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 188, 188, 189, 189, 189, 189, 190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193, 194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197, 198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201, 202, 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 207, 207, 207, 207, 208, 208, 208, 208, 209, 209, 209, 209, 210, 210, 210, 210, 211, 211, 211, 211, 212, 212, 212, 212, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, 216, 216, 216, 216, 217, 217, 217, 217, 218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, }; static RE_UINT8 re_block_stage_5[] = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 0, 0, 0, 0, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 100, 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108, 109, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 121, 121, 121, 121, 122, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125, 126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133, 134, 134, 134, 134, 135, 135, 135, 135, 136, 136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, 141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 144, 144, 144, 144, 145, 145, 145, 145, 146, 146, 146, 146, 147, 147, 147, 147, 148, 148, 148, 148, 149, 149, 149, 149, 150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153, 154, 154, 154, 154, 155, 155, 155, 155, 156, 156, 156, 156, 157, 157, 157, 157, 158, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, 162, 162, 163, 163, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165, 166, 166, 166, 166, 167, 167, 167, 167, 168, 168, 168, 168, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171, 172, 172, 172, 172, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178, 179, 179, 179, 179, 180, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 188, 188, 189, 189, 189, 189, 190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193, 194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197, 198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201, 202, 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 207, 207, 207, 207, 208, 208, 208, 208, 209, 209, 209, 209, 210, 210, 210, 210, 211, 211, 211, 211, 212, 212, 212, 212, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, 216, 216, 216, 216, 217, 217, 217, 217, 218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, }; /* Block: 4288 bytes. */ RE_UINT32 re_get_block(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 11; code = ch ^ (f << 11); pos = (RE_UINT32)re_block_stage_1[f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_block_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_block_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_block_stage_4[pos + f] << 2; value = re_block_stage_5[pos + code]; return value; } /* Script. */ static RE_UINT8 re_script_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15, 16, 17, 18, 14, 19, 14, 20, 14, 14, 14, 14, 14, 14, 21, 14, 14, 14, 14, 14, 14, 14, 14, 22, 14, 14, 14, 23, 14, 14, 24, 25, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 26, 7, 27, 28, 14, 14, 14, 14, 14, 14, 14, 29, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 30, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, }; static RE_UINT8 re_script_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 60, 61, 59, 59, 59, 59, 59, 62, 59, 63, 63, 59, 59, 59, 59, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 59, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 81, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 85, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 98, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 72, 72, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 65, 114, 115, 116, 117, 118, 65, 65, 65, 65, 65, 65, 119, 65, 120, 121, 122, 65, 123, 65, 124, 65, 65, 65, 125, 65, 65, 65, 126, 127, 128, 129, 65, 65, 65, 65, 65, 65, 65, 65, 65, 130, 65, 65, 131, 131, 131, 131, 131, 131, 132, 65, 133, 65, 65, 65, 65, 65, 65, 65, 134, 134, 134, 134, 134, 134, 134, 134, 135, 65, 65, 65, 65, 65, 65, 65, 136, 136, 136, 136, 137, 65, 65, 65, 65, 65, 65, 65, 65, 65, 138, 139, 140, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 59, 141, 142, 143, 144, 65, 145, 65, 146, 147, 148, 59, 59, 149, 59, 150, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 151, 152, 65, 65, 153, 154, 155, 156, 157, 65, 158, 159, 160, 161, 162, 163, 164, 165, 60, 65, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 166, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 167, 72, 168, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 72, 72, 72, 72, 168, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 169, 65, 170, 171, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, }; static RE_UINT16 re_script_stage_3[] = { 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 11, 11, 11, 13, 11, 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 17, 18, 19, 17, 18, 20, 21, 22, 22, 23, 22, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 28, 28, 28, 28, 28, 33, 28, 28, 34, 35, 35, 35, 36, 28, 28, 28, 37, 37, 37, 38, 39, 39, 39, 40, 41, 41, 42, 43, 44, 45, 46, 46, 46, 46, 47, 46, 46, 46, 48, 49, 50, 50, 50, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 46, 124, 125, 126, 126, 127, 126, 128, 46, 46, 129, 130, 131, 132, 133, 134, 46, 46, 135, 135, 135, 135, 136, 135, 137, 138, 135, 136, 135, 139, 139, 140, 46, 46, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 143, 142, 142, 144, 145, 145, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 147, 148, 146, 146, 147, 146, 146, 149, 150, 151, 146, 146, 146, 150, 146, 146, 146, 152, 146, 153, 146, 154, 155, 155, 155, 155, 155, 156, 157, 157, 157, 157, 157, 157, 157, 157, 158, 159, 160, 160, 160, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 171, 171, 171, 172, 173, 173, 174, 175, 176, 176, 176, 176, 176, 177, 176, 176, 178, 157, 157, 157, 157, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 187, 188, 187, 189, 190, 171, 171, 191, 192, 193, 193, 193, 194, 193, 195, 196, 196, 197, 46, 46, 46, 46, 46, 198, 198, 198, 198, 199, 198, 198, 200, 201, 201, 201, 201, 202, 202, 202, 203, 204, 204, 204, 205, 206, 207, 207, 207, 46, 46, 46, 46, 208, 209, 210, 211, 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 217, 218, 11, 219, 11, 11, 219, 220, 11, 221, 11, 11, 11, 222, 222, 223, 11, 224, 225, 0, 0, 0, 0, 0, 226, 227, 228, 229, 0, 230, 46, 8, 8, 231, 0, 0, 232, 233, 234, 0, 4, 4, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 237, 46, 230, 46, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 239, 239, 239, 239, 239, 239, 239, 239, 0, 0, 0, 0, 240, 241, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 242, 242, 243, 242, 242, 243, 4, 4, 244, 244, 244, 244, 244, 244, 244, 245, 142, 142, 143, 246, 246, 246, 247, 248, 146, 249, 250, 250, 250, 250, 14, 14, 0, 0, 0, 251, 46, 46, 46, 46, 252, 253, 252, 252, 252, 252, 252, 254, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 255, 46, 251, 256, 0, 257, 258, 259, 260, 260, 260, 260, 261, 262, 263, 263, 263, 263, 264, 265, 266, 267, 268, 145, 145, 145, 145, 269, 0, 266, 270, 0, 0, 236, 263, 145, 269, 0, 0, 0, 0, 145, 271, 0, 0, 0, 0, 0, 263, 263, 272, 263, 263, 263, 263, 263, 273, 0, 0, 252, 252, 252, 255, 0, 0, 0, 0, 252, 252, 252, 252, 274, 46, 46, 46, 275, 275, 275, 275, 275, 275, 275, 275, 276, 275, 275, 275, 277, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 280, 46, 14, 14, 14, 14, 14, 281, 282, 282, 282, 282, 282, 283, 0, 0, 284, 4, 4, 4, 4, 4, 285, 286, 287, 46, 46, 46, 46, 288, 289, 289, 290, 241, 291, 291, 291, 292, 293, 293, 293, 293, 294, 295, 50, 296, 297, 297, 297, 298, 298, 299, 145, 300, 301, 301, 301, 301, 302, 303, 46, 46, 304, 304, 304, 305, 306, 307, 141, 308, 309, 309, 309, 309, 310, 311, 312, 313, 314, 315, 250, 46, 46, 46, 46, 46, 46, 46, 46, 46, 312, 312, 316, 317, 145, 145, 318, 145, 319, 145, 145, 320, 252, 252, 252, 252, 252, 252, 321, 252, 252, 252, 252, 252, 252, 322, 46, 46, 323, 324, 22, 325, 326, 28, 28, 28, 28, 28, 28, 28, 327, 328, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 329, 46, 28, 28, 28, 28, 330, 28, 28, 331, 46, 46, 332, 8, 241, 217, 0, 0, 333, 334, 335, 28, 28, 28, 28, 28, 28, 28, 336, 238, 0, 1, 2, 1, 2, 337, 262, 263, 338, 145, 269, 339, 340, 341, 342, 343, 344, 345, 346, 347, 347, 46, 46, 344, 344, 344, 344, 344, 344, 344, 348, 349, 0, 0, 350, 11, 11, 11, 11, 351, 251, 46, 46, 46, 0, 0, 352, 353, 354, 355, 355, 355, 356, 46, 46, 357, 358, 359, 360, 361, 46, 46, 46, 362, 363, 364, 364, 365, 366, 46, 46, 367, 367, 367, 367, 367, 368, 368, 368, 369, 370, 371, 46, 46, 46, 46, 46, 372, 373, 373, 374, 375, 376, 46, 46, 377, 378, 379, 380, 46, 46, 46, 46, 381, 381, 382, 383, 46, 46, 46, 46, 384, 385, 386, 387, 388, 389, 390, 390, 391, 391, 391, 392, 393, 394, 395, 396, 397, 397, 397, 397, 398, 46, 46, 46, 46, 46, 46, 46, 46, 46, 28, 49, 399, 399, 399, 399, 400, 401, 399, 46, 402, 402, 402, 402, 403, 404, 405, 406, 407, 407, 407, 408, 409, 46, 46, 46, 410, 410, 410, 410, 411, 412, 46, 46, 413, 413, 413, 414, 415, 46, 46, 46, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 417, 46, 416, 416, 416, 416, 416, 416, 418, 419, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 421, 46, 46, 46, 46, 46, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 422, 46, 46, 46, 46, 423, 423, 423, 423, 424, 423, 423, 425, 426, 423, 46, 46, 46, 46, 46, 46, 427, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 429, 0, 0, 0, 430, 431, 432, 0, 433, 0, 0, 434, 46, 46, 11, 11, 11, 11, 435, 46, 46, 46, 0, 0, 0, 0, 0, 237, 0, 436, 0, 0, 0, 0, 0, 226, 0, 0, 0, 437, 438, 439, 440, 0, 0, 0, 441, 442, 0, 443, 444, 445, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 448, 28, 449, 450, 451, 452, 453, 454, 455, 456, 457, 456, 46, 46, 46, 327, 0, 0, 251, 0, 0, 0, 0, 0, 0, 236, 228, 458, 238, 238, 46, 46, 230, 0, 228, 0, 0, 0, 251, 0, 0, 230, 46, 46, 46, 46, 459, 0, 460, 0, 0, 230, 461, 436, 46, 46, 0, 0, 462, 463, 0, 0, 0, 240, 0, 236, 0, 0, 464, 46, 0, 462, 0, 0, 0, 228, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, 0, 434, 236, 0, 466, 46, 46, 46, 46, 46, 46, 46, 46, 467, 0, 0, 0, 0, 468, 46, 46, 46, 0, 0, 0, 0, 428, 46, 46, 46, 252, 252, 252, 252, 252, 469, 46, 46, 252, 252, 252, 470, 252, 252, 252, 252, 252, 321, 46, 46, 46, 46, 46, 46, 471, 46, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 46, }; static RE_UINT8 re_script_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 2, 2, 3, 0, 0, 4, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 7, 6, 8, 6, 6, 9, 8, 8, 10, 10, 6, 11, 11, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 16, 14, 14, 14, 14, 14, 14, 14, 14, 8, 8, 8, 8, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 17, 18, 18, 18, 18, 18, 18, 18, 20, 19, 8, 17, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 8, 8, 8, 8, 22, 22, 22, 22, 22, 23, 8, 8, 22, 22, 23, 8, 8, 8, 8, 8, 24, 24, 25, 24, 24, 24, 26, 24, 24, 24, 24, 24, 24, 27, 25, 27, 24, 24, 24, 24, 24, 24, 24, 24, 26, 24, 24, 24, 24, 28, 5, 5, 5, 5, 5, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 24, 24, 24, 29, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 27, 24, 30, 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 31, 30, 33, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 8, 8, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 8, 36, 36, 36, 36, 36, 36, 36, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 8, 39, 8, 8, 8, 8, 8, 8, 8, 8, 25, 24, 24, 24, 24, 24, 25, 8, 8, 8, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 40, 40, 40, 40, 40, 40, 40, 40, 41, 42, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 43, 40, 40, 40, 44, 45, 44, 45, 45, 45, 46, 44, 46, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 45, 45, 45, 46, 46, 8, 45, 45, 8, 45, 45, 45, 45, 46, 44, 46, 44, 45, 46, 8, 8, 8, 44, 8, 8, 45, 44, 45, 45, 8, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 8, 8, 47, 48, 47, 48, 48, 49, 8, 47, 49, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 48, 48, 48, 49, 48, 47, 49, 48, 8, 49, 48, 48, 49, 8, 47, 49, 47, 48, 8, 47, 8, 8, 8, 47, 48, 49, 49, 8, 8, 8, 48, 48, 48, 48, 48, 48, 48, 48, 8, 8, 8, 8, 8, 50, 51, 50, 51, 51, 51, 51, 50, 51, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 51, 51, 51, 52, 51, 50, 51, 51, 8, 51, 51, 51, 51, 51, 50, 51, 50, 51, 8, 52, 8, 8, 8, 8, 8, 8, 8, 51, 51, 8, 51, 51, 51, 51, 51, 51, 8, 8, 8, 8, 8, 8, 8, 53, 54, 53, 54, 54, 54, 55, 53, 55, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 54, 54, 55, 54, 53, 54, 54, 8, 54, 54, 54, 54, 55, 53, 55, 53, 54, 8, 8, 8, 8, 54, 8, 8, 54, 53, 54, 54, 8, 54, 54, 54, 54, 54, 54, 54, 54, 54, 8, 8, 8, 8, 8, 56, 57, 56, 56, 58, 8, 56, 58, 56, 56, 8, 57, 58, 58, 56, 8, 57, 58, 8, 56, 58, 8, 56, 56, 56, 56, 56, 56, 8, 8, 56, 56, 58, 8, 56, 58, 56, 56, 8, 58, 8, 8, 57, 8, 8, 8, 8, 8, 8, 8, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 58, 8, 8, 59, 60, 59, 60, 60, 60, 61, 60, 61, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 60, 60, 60, 60, 60, 59, 60, 60, 8, 59, 60, 60, 60, 61, 60, 61, 60, 60, 8, 8, 8, 59, 61, 60, 8, 8, 8, 60, 60, 8, 60, 60, 60, 60, 60, 8, 8, 8, 8, 60, 60, 60, 60, 8, 62, 63, 62, 62, 62, 64, 62, 64, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 64, 62, 62, 62, 62, 62, 63, 62, 62, 8, 62, 62, 62, 62, 64, 62, 64, 62, 62, 8, 8, 8, 63, 64, 8, 8, 8, 64, 62, 62, 8, 62, 62, 62, 62, 62, 63, 64, 8, 8, 8, 8, 8, 8, 8, 65, 66, 65, 65, 65, 67, 65, 67, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 66, 65, 65, 65, 67, 65, 67, 65, 65, 67, 8, 8, 8, 66, 8, 8, 8, 8, 65, 65, 8, 65, 65, 65, 65, 65, 65, 65, 65, 8, 66, 65, 65, 65, 8, 68, 69, 68, 68, 68, 68, 68, 68, 68, 68, 70, 8, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 68, 68, 68, 68, 69, 8, 68, 68, 68, 70, 8, 70, 8, 69, 68, 68, 70, 70, 68, 68, 68, 68, 8, 68, 70, 8, 8, 8, 8, 8, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 8, 20, 72, 72, 72, 72, 72, 72, 8, 8, 74, 75, 75, 74, 75, 75, 74, 8, 8, 8, 76, 76, 74, 76, 76, 76, 74, 76, 74, 74, 8, 76, 74, 76, 76, 76, 76, 76, 76, 74, 76, 8, 76, 76, 75, 75, 76, 76, 76, 8, 76, 76, 76, 76, 76, 8, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 77, 77, 77, 77, 77, 77, 77, 77, 77, 79, 8, 78, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 79, 77, 77, 77, 80, 0, 81, 79, 8, 8, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 8, 8, 84, 8, 83, 83, 83, 83, 83, 85, 83, 83, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 87, 87, 8, 87, 87, 87, 88, 88, 87, 87, 8, 88, 87, 87, 8, 87, 87, 87, 88, 88, 87, 87, 8, 87, 87, 87, 87, 87, 87, 87, 88, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 89, 87, 87, 87, 87, 87, 87, 87, 88, 8, 87, 87, 87, 87, 87, 8, 8, 8, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 8, 8, 8, 8, 8, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, 8, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 0, 95, 97, 8, 8, 8, 8, 8, 8, 8, 98, 98, 98, 98, 98, 98, 99, 98, 98, 98, 99, 8, 8, 8, 8, 8, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 9, 8, 8, 8, 8, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 8, 8, 8, 8, 8, 8, 103, 103, 103, 103, 103, 103, 104, 103, 104, 103, 8, 8, 8, 8, 8, 8, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 8, 105, 105, 105, 105, 105, 8, 8, 8, 106, 0, 107, 106, 106, 106, 106, 108, 106, 106, 106, 106, 106, 8, 8, 8, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 8, 8, 8, 8, 106, 106, 106, 106, 106, 108, 8, 8, 92, 92, 92, 8, 8, 8, 8, 8, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 8, 109, 109, 109, 109, 109, 109, 8, 8, 110, 8, 109, 109, 109, 109, 109, 109, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 8, 111, 111, 112, 8, 8, 8, 8, 8, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 8, 8, 113, 113, 113, 113, 113, 8, 8, 8, 113, 113, 113, 113, 113, 114, 8, 113, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 8, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 116, 116, 116, 116, 116, 116, 117, 118, 116, 116, 116, 116, 116, 8, 8, 8, 116, 116, 116, 116, 116, 116, 116, 8, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 8, 8, 119, 119, 119, 119, 119, 119, 120, 8, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 8, 8, 8, 8, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 8, 124, 123, 123, 123, 123, 123, 123, 123, 8, 124, 123, 125, 125, 125, 125, 125, 125, 125, 125, 121, 121, 121, 121, 8, 8, 8, 8, 5, 126, 5, 5, 5, 5, 5, 5, 126, 5, 5, 5, 126, 0, 127, 0, 0, 0, 126, 9, 8, 8, 8, 8, 2, 2, 2, 6, 6, 128, 2, 2, 2, 2, 2, 2, 2, 2, 129, 6, 6, 2, 2, 6, 6, 130, 2, 2, 2, 2, 2, 2, 131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 129, 5, 5, 5, 132, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 6, 6, 6, 8, 6, 6, 6, 8, 6, 6, 6, 6, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 12, 6, 8, 6, 11, 6, 6, 6, 6, 11, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 9, 2, 2, 2, 2, 2, 2, 133, 8, 0, 0, 0, 0, 0, 9, 8, 8, 132, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 10, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 2, 3, 8, 8, 8, 0, 0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 9, 8, 8, 8, 8, 20, 0, 0, 0, 0, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, 8, 8, 8, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 8, 8, 137, 13, 13, 13, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 8, 8, 8, 139, 140, 8, 8, 8, 8, 8, 8, 139, 87, 87, 87, 88, 8, 8, 8, 8, 87, 87, 87, 88, 87, 87, 87, 88, 0, 0, 0, 0, 0, 0, 8, 8, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 141, 141, 141, 141, 8, 8, 8, 8, 8, 8, 141, 141, 141, 8, 8, 8, 8, 8, 0, 0, 143, 143, 0, 0, 0, 0, 143, 141, 141, 141, 141, 5, 5, 86, 0, 0, 0, 0, 141, 141, 0, 0, 144, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 146, 147, 126, 148, 145, 149, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 149, 150, 8, 8, 152, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 153, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 154, 4, 4, 4, 4, 4, 155, 8, 8, 86, 86, 86, 86, 86, 86, 86, 156, 150, 150, 150, 150, 150, 150, 150, 157, 150, 150, 150, 150, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 158, 8, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 8, 159, 159, 159, 160, 8, 8, 8, 8, 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 8, 8, 14, 14, 14, 14, 8, 8, 8, 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 8, 8, 8, 8, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 2, 133, 2, 2, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 133, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 8, 8, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 8, 8, 8, 8, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 168, 8, 8, 8, 8, 167, 167, 167, 167, 167, 167, 8, 8, 8, 40, 40, 40, 40, 40, 40, 8, 8, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 8, 8, 8, 8, 8, 171, 86, 86, 86, 86, 86, 86, 154, 8, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 20, 172, 172, 172, 172, 172, 8, 8, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 8, 8, 8, 8, 173, 173, 173, 173, 173, 173, 173, 8, 173, 173, 173, 173, 173, 8, 173, 173, 82, 82, 82, 82, 82, 82, 8, 8, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 177, 175, 175, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 8, 8, 8, 8, 89, 87, 87, 88, 89, 87, 87, 88, 89, 87, 87, 88, 8, 8, 8, 8, 178, 178, 178, 178, 178, 178, 178, 8, 178, 178, 178, 178, 178, 8, 8, 8, 86, 86, 8, 8, 8, 8, 8, 8, 86, 86, 86, 154, 8, 153, 86, 86, 86, 86, 86, 86, 86, 86, 8, 8, 141, 141, 141, 141, 141, 141, 141, 8, 141, 141, 141, 141, 141, 8, 8, 8, 2, 2, 2, 133, 8, 8, 8, 8, 8, 17, 18, 18, 8, 8, 21, 22, 22, 22, 22, 23, 22, 22, 23, 23, 22, 21, 23, 22, 22, 22, 22, 22, 24, 8, 8, 8, 8, 8, 8, 8, 8, 180, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 8, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 8, 8, 8, 8, 24, 24, 24, 24, 24, 24, 27, 8, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 24, 24, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 20, 0, 0, 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 0, 8, 86, 86, 86, 8, 86, 86, 86, 8, 86, 86, 86, 8, 86, 154, 8, 0, 0, 0, 9, 0, 0, 0, 9, 8, 8, 8, 8, 20, 0, 0, 8, 181, 181, 181, 181, 181, 181, 182, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 183, 181, 181, 181, 181, 181, 181, 181, 181, 181, 183, 181, 182, 181, 181, 181, 181, 181, 181, 181, 8, 181, 181, 181, 181, 181, 183, 8, 8, 0, 9, 8, 20, 0, 0, 0, 0, 0, 0, 8, 20, 0, 0, 0, 0, 6, 6, 6, 6, 6, 11, 8, 8, 0, 0, 0, 0, 0, 0, 127, 8, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 185, 8, 186, 186, 186, 186, 186, 186, 186, 186, 187, 8, 8, 8, 8, 8, 8, 8, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, 188, 188, 8, 8, 8, 8, 8, 8, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 191, 8, 8, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 8, 8, 194, 194, 194, 194, 194, 194, 194, 8, 8, 8, 8, 8, 195, 195, 195, 195, 195, 195, 195, 195, 196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 8, 197, 197, 197, 197, 197, 8, 8, 8, 198, 198, 198, 8, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 200, 199, 8, 199, 200, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 202, 201, 201, 201, 201, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 8, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 8, 8, 206, 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 8, 8, 8, 208, 209, 209, 210, 211, 8, 8, 209, 209, 209, 209, 210, 209, 210, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 8, 8, 209, 211, 8, 210, 209, 209, 209, 209, 8, 8, 8, 8, 209, 209, 209, 209, 211, 8, 8, 8, 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 8, 214, 213, 213, 213, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 8, 215, 215, 215, 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, 217, 8, 8, 216, 216, 216, 216, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 219, 8, 8, 8, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 8, 8, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221, 221, 8, 8, 8, 8, 8, 8, 8, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 223, 8, 8, 8, 222, 222, 222, 222, 222, 8, 8, 8, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 224, 224, 224, 224, 224, 224, 224, 8, 8, 8, 8, 8, 8, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 8, 8, 8, 226, 226, 226, 226, 226, 8, 8, 8, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 8, 8, 8, 8, 228, 228, 228, 228, 228, 8, 8, 8, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 230, 229, 230, 8, 8, 8, 8, 8, 8, 229, 229, 8, 8, 8, 8, 8, 8, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 232, 164, 164, 164, 164, 233, 8, 8, 8, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 235, 8, 8, 8, 8, 8, 234, 234, 234, 234, 234, 234, 234, 235, 8, 8, 8, 8, 8, 8, 8, 236, 237, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, 9, 20, 0, 0, 0, 0, 0, 0, 127, 5, 0, 0, 0, 0, 0, 0, 0, 0, 127, 5, 5, 5, 126, 127, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 6, 6, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 9, 0, 8, 9, 20, 9, 20, 0, 9, 0, 0, 0, 0, 0, 0, 20, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 20, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 0, 9, 9, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 24, 24, 180, 24, 24, 24, 24, 24, 180, 25, 25, 180, 180, 24, 24, 24, 24, 25, 24, 24, 180, 180, 8, 8, 8, 25, 8, 180, 180, 180, 180, 24, 180, 25, 25, 180, 180, 180, 180, 180, 180, 25, 25, 180, 24, 25, 24, 24, 24, 25, 24, 24, 180, 24, 25, 25, 24, 24, 24, 24, 24, 180, 24, 24, 24, 24, 24, 24, 24, 24, 8, 8, 180, 24, 180, 24, 24, 180, 24, 24, 20, 0, 0, 0, 0, 0, 0, 9, 8, 8, 8, 0, 0, 0, 0, 0, 238, 9, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 9, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 8, 8, 0, 0, 0, 0, 20, 0, 9, 8, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, 0, 0, 9, 8, 20, 0, 0, 0, 0, 0, 141, 141, 141, 158, 8, 8, 8, 8, 141, 141, 158, 8, 8, 8, 8, 8, 20, 8, 8, 8, 8, 8, 8, 8, }; static RE_UINT8 re_script_stage_5[] = { 1, 1, 1, 2, 2, 2, 2, 1, 35, 35, 41, 41, 3, 3, 1, 3, 0, 0, 1, 0, 3, 1, 3, 0, 0, 3, 55, 55, 4, 4, 4, 41, 41, 4, 0, 5, 5, 5, 5, 0, 0, 1, 0, 6, 6, 6, 6, 0, 7, 7, 7, 0, 1, 7, 7, 1, 7, 41, 41, 7, 8, 8, 0, 8, 8, 0, 9, 9, 66, 66, 66, 0, 82, 82, 82, 0, 95, 95, 95, 0, 10, 10, 10, 41, 41, 10, 0, 10, 0, 11, 11, 11, 11, 0, 0, 12, 12, 12, 12, 0, 0, 13, 13, 13, 13, 0, 0, 14, 14, 14, 14, 0, 15, 15, 0, 15, 15, 0, 0, 16, 16, 16, 16, 0, 17, 17, 0, 17, 17, 0, 18, 18, 0, 18, 18, 0, 19, 19, 0, 19, 19, 0, 0, 20, 20, 20, 20, 0, 0, 21, 21, 0, 21, 21, 22, 22, 0, 22, 22, 0, 22, 1, 1, 22, 23, 23, 24, 24, 0, 24, 24, 1, 25, 25, 26, 26, 26, 0, 0, 26, 27, 27, 27, 0, 28, 28, 29, 29, 29, 0, 30, 30, 30, 1, 30, 0, 42, 42, 42, 0, 43, 43, 43, 1, 44, 44, 45, 45, 45, 0, 31, 31, 32, 32, 32, 1, 32, 0, 46, 46, 46, 0, 47, 47, 47, 0, 56, 56, 56, 0, 54, 54, 78, 78, 78, 0, 0, 78, 62, 62, 62, 0, 67, 67, 93, 93, 68, 68, 0, 68, 69, 69, 41, 1, 1, 41, 3, 4, 2, 3, 3, 2, 4, 2, 41, 0, 2, 0, 53, 53, 57, 57, 57, 0, 0, 55, 58, 58, 0, 58, 58, 0, 36, 36, 0, 36, 1, 36, 0, 33, 33, 33, 33, 0, 0, 41, 1, 33, 1, 34, 34, 34, 34, 1, 0, 35, 0, 25, 25, 0, 35, 0, 25, 1, 34, 0, 36, 0, 37, 37, 37, 0, 83, 83, 70, 70, 0, 4, 84, 84, 59, 59, 65, 65, 71, 71, 71, 0, 72, 72, 73, 73, 0, 73, 85, 85, 77, 77, 77, 0, 79, 79, 79, 0, 0, 79, 86, 86, 86, 0, 0, 7, 48, 48, 0, 48, 48, 0, 74, 74, 74, 0, 75, 75, 75, 0, 38, 38, 38, 0, 39, 39, 39, 0, 49, 49, 0, 49, 60, 60, 40, 40, 50, 50, 51, 51, 52, 52, 52, 0, 0, 52, 87, 87, 0, 87, 64, 64, 0, 64, 76, 76, 0, 76, 98, 98, 97, 97, 61, 61, 0, 61, 61, 0, 88, 88, 80, 80, 0, 80, 89, 89, 90, 90, 90, 0, 91, 91, 91, 0, 94, 94, 92, 92, 101, 101, 101, 0, 96, 96, 96, 0, 100, 100, 100, 0, 102, 102, 63, 63, 63, 0, 81, 81, 81, 0, 84, 0, 99, 99, 99, 0, 0, 99, 34, 33, 33, 1, }; /* Script: 8046 bytes. */ RE_UINT32 re_get_script(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 11; code = ch ^ (f << 11); pos = (RE_UINT32)re_script_stage_1[f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_script_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_script_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_script_stage_4[pos + f] << 1; value = re_script_stage_5[pos + code]; return value; } /* Word_Break. */ static RE_UINT8 re_word_break_stage_1[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6, 7, 4, 8, 9, 10, 11, 12, 4, 4, 13, 4, 4, 4, 4, 14, 4, 15, 16, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_word_break_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 2, 2, 31, 32, 33, 34, 35, 2, 2, 2, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 2, 50, 2, 2, 51, 52, 53, 54, 55, 56, 57, 57, 57, 57, 57, 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 59, 60, 61, 62, 63, 57, 57, 57, 64, 65, 66, 67, 57, 68, 69, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 83, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 84, 85, 2, 2, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 57, 96, 97, 98, 2, 99, 57, 57, 57, 57, 57, 57, 100, 57, 101, 102, 103, 57, 104, 57, 105, 57, 57, 57, 57, 57, 57, 57, 106, 107, 108, 109, 57, 57, 57, 57, 57, 57, 57, 57, 57, 110, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 111, 57, 112, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 113, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 114, 57, 57, 57, 57, 57, 57, 57, 57, 57, 115, 116, 117, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 118, 119, 120, 57, 57, 57, 121, 122, 123, 2, 2, 124, 125, 126, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 127, 128, 57, 57, 57, 57, 57, 129, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 130, 57, 131, 132, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, }; static RE_UINT8 re_word_break_stage_3[] = { 0, 1, 0, 0, 2, 3, 4, 5, 6, 7, 7, 8, 6, 7, 7, 9, 10, 0, 0, 0, 0, 11, 12, 13, 7, 7, 14, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 7, 16, 0, 17, 18, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 22, 23, 7, 7, 24, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 26, 27, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 6, 7, 7, 7, 14, 28, 6, 7, 7, 7, 7, 29, 30, 19, 19, 19, 19, 31, 32, 0, 33, 33, 33, 34, 35, 0, 36, 37, 19, 38, 7, 7, 7, 7, 7, 39, 19, 19, 4, 40, 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 43, 44, 45, 4, 46, 0, 47, 48, 7, 7, 7, 19, 19, 19, 49, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 50, 19, 51, 0, 4, 52, 7, 7, 7, 39, 53, 54, 7, 7, 50, 55, 56, 57, 0, 0, 7, 7, 7, 58, 0, 0, 0, 0, 0, 0, 0, 0, 59, 17, 0, 0, 0, 0, 0, 0, 60, 19, 19, 61, 62, 7, 7, 7, 7, 7, 7, 63, 19, 19, 64, 7, 65, 4, 6, 6, 66, 67, 68, 7, 7, 59, 69, 70, 71, 72, 73, 74, 65, 4, 75, 0, 66, 76, 68, 7, 7, 59, 77, 78, 79, 80, 81, 82, 83, 4, 84, 0, 66, 25, 24, 7, 7, 59, 85, 70, 31, 86, 87, 0, 65, 4, 0, 0, 66, 67, 68, 7, 7, 59, 85, 70, 71, 80, 88, 74, 65, 4, 28, 0, 89, 90, 91, 92, 93, 90, 7, 94, 95, 96, 97, 0, 83, 4, 0, 0, 66, 20, 59, 7, 7, 59, 98, 99, 100, 96, 101, 75, 65, 4, 0, 0, 102, 20, 59, 7, 7, 59, 98, 70, 100, 96, 101, 103, 65, 4, 104, 0, 102, 20, 59, 7, 7, 7, 7, 105, 100, 106, 73, 0, 65, 4, 0, 107, 102, 7, 14, 107, 7, 7, 24, 108, 14, 109, 110, 19, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 112, 113, 73, 61, 4, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 115, 0, 116, 4, 114, 0, 0, 0, 0, 87, 0, 0, 117, 4, 114, 118, 119, 7, 6, 7, 7, 7, 17, 30, 19, 100, 120, 19, 30, 19, 19, 19, 121, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 19, 61, 4, 114, 88, 124, 125, 116, 126, 0, 127, 31, 4, 128, 7, 7, 7, 7, 25, 129, 7, 7, 7, 7, 7, 130, 7, 7, 7, 7, 7, 7, 7, 7, 7, 91, 14, 91, 7, 7, 7, 7, 7, 91, 7, 7, 7, 7, 91, 14, 91, 7, 14, 7, 7, 7, 7, 7, 7, 7, 91, 7, 7, 7, 7, 7, 7, 7, 7, 131, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 17, 0, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 67, 7, 7, 6, 7, 7, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 90, 87, 0, 7, 20, 132, 0, 7, 7, 132, 0, 7, 7, 133, 0, 7, 20, 134, 0, 0, 0, 0, 0, 0, 0, 60, 19, 19, 19, 135, 136, 4, 114, 0, 0, 0, 137, 4, 114, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 138, 7, 7, 7, 7, 7, 7, 7, 7, 139, 0, 7, 7, 7, 17, 19, 135, 19, 135, 83, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 140, 117, 4, 114, 0, 0, 0, 0, 7, 7, 141, 135, 0, 0, 0, 0, 0, 0, 142, 61, 19, 19, 19, 71, 4, 114, 4, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 7, 7, 7, 7, 7, 144, 19, 143, 145, 4, 114, 0, 123, 135, 0, 146, 7, 7, 7, 64, 147, 4, 52, 7, 7, 7, 7, 50, 19, 135, 0, 7, 7, 7, 7, 144, 19, 19, 0, 4, 148, 4, 52, 7, 7, 7, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 19, 19, 150, 151, 0, 7, 7, 7, 7, 7, 7, 7, 7, 19, 19, 19, 19, 61, 0, 0, 60, 7, 7, 139, 139, 7, 7, 7, 7, 139, 139, 7, 152, 7, 7, 7, 139, 7, 7, 7, 7, 7, 7, 20, 153, 154, 17, 155, 145, 7, 17, 154, 17, 0, 156, 0, 157, 158, 159, 0, 160, 161, 0, 162, 0, 163, 164, 28, 165, 0, 0, 7, 17, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 140, 0, 166, 107, 108, 167, 18, 168, 7, 169, 170, 171, 0, 0, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 7, 7, 7, 7, 7, 7, 75, 0, 0, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 17, 173, 174, 0, 7, 7, 7, 7, 25, 129, 7, 7, 7, 7, 7, 7, 7, 165, 0, 73, 7, 7, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 19, 19, 19, 19, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 127, 175, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, 170, 7, 7, 7, 7, 139, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 0, 0, 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 177, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 177, 177, 177, 177, 179, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 0, 0, 0, 0, 0, 7, 17, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 139, 7, 17, 7, 7, 4, 180, 0, 0, 7, 7, 7, 7, 7, 141, 149, 181, 7, 7, 7, 73, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 117, 0, 0, 0, 165, 7, 107, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 182, 145, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 183, 184, 7, 7, 39, 0, 0, 0, 7, 7, 7, 7, 7, 7, 145, 0, 27, 7, 7, 7, 7, 7, 144, 19, 121, 0, 4, 114, 19, 19, 27, 185, 4, 52, 7, 7, 50, 116, 7, 7, 141, 19, 135, 0, 7, 7, 7, 17, 62, 7, 7, 7, 7, 7, 39, 19, 140, 165, 4, 114, 0, 0, 0, 0, 7, 7, 7, 7, 7, 64, 61, 0, 184, 186, 4, 114, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 125, 188, 81, 0, 0, 0, 7, 39, 189, 0, 190, 190, 190, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 39, 191, 4, 114, 7, 7, 7, 7, 145, 0, 7, 7, 14, 192, 7, 7, 7, 7, 7, 145, 14, 0, 192, 193, 33, 194, 195, 196, 197, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 75, 0, 0, 0, 192, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 139, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 107, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 145, 19, 19, 198, 0, 61, 0, 199, 0, 0, 200, 201, 0, 0, 0, 20, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 202, 203, 3, 0, 204, 6, 7, 7, 8, 6, 7, 7, 9, 205, 177, 177, 177, 177, 177, 177, 206, 7, 7, 7, 14, 107, 107, 107, 207, 0, 0, 0, 208, 7, 98, 7, 7, 14, 7, 7, 209, 7, 139, 7, 139, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 7, 7, 7, 17, 7, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 7, 7, 7, 14, 0, 0, 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 7, 7, 7, 139, 7, 7, 7, 7, 145, 7, 167, 0, 0, 0, 0, 0, 7, 7, 7, 139, 4, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 59, 7, 7, 7, 7, 25, 210, 7, 7, 139, 0, 0, 0, 0, 0, 7, 7, 139, 0, 7, 7, 7, 75, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 172, 0, 0, 0, 0, 0, 0, 0, 0, 211, 60, 98, 6, 7, 7, 145, 79, 0, 0, 0, 0, 7, 7, 7, 17, 7, 7, 7, 7, 7, 7, 139, 0, 7, 7, 139, 0, 7, 7, 9, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 0, 146, 7, 7, 7, 7, 7, 7, 19, 61, 0, 0, 0, 83, 4, 0, 0, 146, 7, 7, 7, 7, 7, 19, 212, 0, 0, 7, 7, 7, 87, 4, 114, 146, 7, 7, 7, 141, 19, 213, 4, 0, 0, 0, 0, 0, 0, 0, 0, 146, 7, 7, 7, 7, 7, 39, 19, 214, 0, 4, 114, 0, 0, 0, 0, 7, 7, 7, 7, 7, 39, 19, 0, 4, 114, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 0, 0, 0, 7, 7, 7, 7, 7, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 87, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 17, 0, 64, 19, 19, 19, 19, 61, 0, 73, 146, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 216, 217, 218, 219, 135, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 20, 7, 7, 7, 7, 7, 7, 7, 7, 20, 222, 223, 7, 224, 98, 7, 7, 7, 7, 7, 7, 7, 25, 225, 20, 20, 7, 7, 7, 226, 153, 107, 59, 7, 7, 7, 7, 7, 7, 7, 7, 7, 139, 7, 7, 7, 59, 7, 7, 130, 7, 7, 7, 130, 7, 7, 20, 7, 7, 7, 20, 7, 7, 14, 7, 7, 7, 14, 7, 7, 7, 59, 7, 7, 7, 59, 7, 7, 130, 227, 4, 4, 4, 4, 4, 4, 98, 7, 7, 7, 228, 6, 130, 229, 166, 230, 228, 152, 228, 130, 130, 82, 7, 24, 7, 145, 231, 24, 7, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, 233, 233, 234, 0, 0, 0, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, }; static RE_UINT8 re_word_break_stage_4[] = { 0, 0, 1, 2, 3, 4, 0, 5, 6, 6, 7, 0, 8, 9, 9, 9, 10, 11, 10, 0, 0, 12, 13, 14, 0, 15, 13, 0, 9, 10, 16, 17, 16, 18, 9, 19, 0, 20, 21, 21, 9, 22, 17, 23, 0, 24, 10, 22, 25, 9, 9, 25, 26, 21, 27, 9, 28, 0, 29, 0, 30, 21, 21, 31, 32, 31, 33, 33, 34, 0, 35, 36, 37, 38, 0, 39, 40, 38, 41, 21, 42, 43, 44, 9, 9, 45, 21, 46, 21, 47, 48, 27, 49, 50, 0, 51, 52, 9, 40, 8, 9, 53, 54, 0, 49, 9, 21, 16, 55, 0, 56, 21, 21, 57, 57, 58, 57, 0, 22, 9, 0, 21, 21, 40, 21, 9, 53, 59, 57, 21, 53, 60, 30, 8, 9, 50, 50, 9, 20, 17, 16, 59, 21, 61, 61, 62, 0, 63, 0, 25, 16, 0, 10, 64, 22, 65, 16, 48, 40, 63, 61, 58, 66, 0, 8, 20, 0, 60, 27, 67, 22, 8, 31, 58, 19, 0, 0, 68, 69, 8, 10, 17, 22, 16, 65, 22, 64, 19, 16, 68, 40, 68, 48, 58, 19, 63, 9, 8, 16, 45, 21, 48, 0, 32, 68, 8, 0, 13, 65, 0, 10, 45, 48, 62, 17, 9, 9, 28, 70, 63, 21, 71, 68, 0, 66, 21, 40, 0, 72, 0, 31, 73, 21, 58, 58, 0, 0, 74, 66, 68, 9, 57, 21, 73, 0, 70, 63, 21, 58, 68, 48, 61, 30, 73, 68, 21, 75, 58, 0, 28, 10, 9, 10, 30, 53, 73, 53, 0, 76, 0, 21, 0, 0, 66, 63, 77, 78, 0, 9, 16, 73, 0, 9, 41, 0, 30, 21, 44, 9, 21, 9, 0, 79, 9, 21, 27, 72, 8, 40, 21, 44, 52, 53, 80, 81, 81, 9, 20, 17, 22, 9, 17, 0, 82, 83, 0, 0, 84, 85, 86, 0, 11, 87, 88, 0, 87, 37, 89, 37, 37, 0, 64, 13, 64, 8, 16, 22, 25, 16, 9, 0, 8, 16, 13, 0, 17, 64, 41, 27, 0, 90, 91, 92, 93, 94, 94, 95, 94, 94, 95, 49, 0, 21, 96, 50, 10, 97, 97, 41, 9, 64, 0, 9, 58, 63, 0, 73, 68, 17, 98, 8, 10, 40, 58, 64, 9, 0, 99, 100, 33, 33, 34, 33, 101, 102, 100, 103, 88, 11, 87, 0, 104, 5, 105, 9, 106, 0, 107, 108, 0, 0, 109, 94, 110, 17, 19, 111, 0, 10, 25, 19, 50, 57, 32, 40, 14, 21, 112, 44, 19, 93, 0, 58, 30, 113, 37, 114, 21, 40, 30, 68, 58, 68, 73, 13, 65, 8, 22, 25, 8, 10, 8, 25, 10, 9, 60, 65, 50, 81, 0, 81, 8, 8, 8, 0, 115, 116, 116, 14, 0, }; static RE_UINT8 re_word_break_stage_5[] = { 0, 0, 0, 0, 0, 0, 5, 6, 6, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 13, 0, 14, 0, 15, 15, 15, 15, 15, 15, 12, 13, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 16, 0, 6, 0, 0, 0, 0, 11, 0, 0, 9, 0, 0, 0, 11, 0, 12, 11, 11, 0, 0, 0, 0, 11, 11, 0, 0, 0, 12, 11, 0, 0, 0, 11, 0, 11, 0, 7, 7, 7, 7, 11, 0, 11, 11, 11, 11, 13, 0, 0, 0, 11, 12, 11, 11, 0, 11, 11, 11, 0, 7, 7, 7, 11, 11, 0, 11, 0, 0, 0, 13, 0, 0, 0, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 11, 12, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 13, 13, 0, 0, 7, 7, 7, 0, 11, 11, 11, 7, 15, 15, 0, 15, 13, 0, 11, 11, 7, 11, 11, 11, 0, 11, 7, 7, 7, 9, 0, 7, 7, 11, 11, 7, 7, 0, 7, 7, 15, 15, 11, 11, 11, 0, 0, 11, 0, 0, 0, 9, 11, 7, 11, 11, 11, 11, 7, 7, 7, 11, 0, 0, 13, 0, 11, 0, 7, 7, 11, 7, 11, 7, 7, 7, 7, 7, 0, 0, 7, 11, 7, 7, 0, 0, 15, 15, 7, 0, 0, 7, 7, 7, 11, 0, 0, 0, 0, 7, 0, 0, 0, 11, 0, 11, 11, 0, 0, 7, 0, 0, 11, 7, 0, 0, 0, 0, 7, 7, 0, 0, 7, 11, 0, 0, 7, 0, 7, 0, 7, 0, 15, 15, 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 15, 15, 7, 7, 11, 0, 7, 7, 7, 7, 9, 0, 11, 7, 11, 0, 7, 7, 7, 11, 7, 11, 11, 0, 0, 11, 0, 11, 7, 7, 9, 9, 14, 14, 0, 0, 14, 0, 0, 12, 6, 6, 9, 9, 9, 9, 9, 0, 16, 0, 0, 0, 13, 0, 0, 0, 9, 0, 9, 9, 0, 10, 10, 10, 10, 10, 0, 0, 0, 7, 7, 10, 10, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 7, 7, 0, 11, 11, 11, 7, 11, 11, 7, 7, 0, 0, 3, 7, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 3, 0, 3, 13, 0, 0, 12, 0, 16, 16, 16, 13, 12, 0, 0, 11, 0, 0, 9, 0, 0, 0, 14, 0, 0, 12, 13, 0, 0, 10, 10, 10, 10, 7, 7, 0, 9, 9, 9, 7, 0, 15, 15, 7, 7, 7, 9, 9, 9, 9, 7, 0, 0, 8, 8, 8, 8, 8, 8, }; /* Word_Break: 3946 bytes. */ RE_UINT32 re_get_word_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_word_break_stage_1[f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_word_break_stage_2[pos + f] << 4; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_word_break_stage_3[pos + f] << 1; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_word_break_stage_4[pos + f] << 2; value = re_word_break_stage_5[pos + code]; return value; } /* Grapheme_Cluster_Break. */ static RE_UINT8 re_grapheme_cluster_break_stage_1[] = { 0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 7, 2, 2, 8, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_grapheme_cluster_break_stage_2[] = { 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 1, 1, 1, 18, 19, 20, 21, 22, 23, 24, 1, 1, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 27, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, 1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 35, 36, 37, 38, 39, 40, 34, 41, 42, 42, 42, 42, 42, 42, 42, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 43, 1, 1, 44, 45, 1, 46, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 1, 1, 48, 49, 1, 1, 1, 1, 50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_grapheme_cluster_break_stage_3[] = { 0, 1, 2, 2, 2, 2, 2, 3, 1, 1, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 5, 8, 9, 2, 2, 2, 10, 11, 2, 2, 12, 5, 2, 13, 2, 2, 2, 2, 2, 14, 15, 2, 3, 16, 2, 5, 17, 2, 2, 2, 2, 2, 18, 13, 2, 2, 12, 19, 2, 20, 21, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 23, 24, 25, 2, 2, 26, 27, 28, 29, 2, 30, 2, 2, 31, 32, 33, 29, 2, 34, 2, 2, 35, 36, 16, 2, 37, 34, 2, 2, 35, 38, 2, 29, 2, 30, 2, 2, 39, 32, 40, 29, 2, 41, 2, 2, 42, 43, 33, 2, 2, 44, 2, 2, 45, 46, 47, 29, 2, 48, 2, 2, 49, 50, 47, 29, 2, 48, 2, 2, 42, 51, 33, 29, 2, 48, 2, 2, 2, 52, 53, 2, 48, 2, 2, 2, 54, 55, 2, 2, 2, 2, 2, 2, 56, 57, 2, 2, 2, 2, 58, 2, 59, 2, 2, 2, 60, 61, 62, 5, 63, 64, 2, 2, 2, 2, 2, 65, 66, 2, 67, 13, 68, 69, 70, 2, 2, 2, 2, 2, 2, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 73, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 65, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 75, 2, 75, 2, 29, 2, 29, 2, 2, 2, 76, 77, 78, 2, 2, 79, 2, 2, 2, 2, 2, 2, 2, 2, 2, 80, 2, 2, 2, 2, 2, 2, 2, 81, 82, 2, 2, 2, 2, 2, 2, 2, 83, 2, 2, 2, 2, 2, 84, 2, 2, 2, 85, 86, 87, 2, 2, 2, 2, 2, 2, 2, 2, 88, 2, 2, 89, 90, 2, 12, 19, 91, 2, 92, 2, 2, 2, 93, 94, 2, 2, 95, 96, 2, 2, 2, 2, 2, 2, 2, 2, 2, 97, 98, 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 100, 101, 102, 2, 103, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 5, 5, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 104, 105, 2, 2, 2, 2, 2, 2, 2, 104, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 106, 2, 2, 2, 2, 2, 2, 107, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 104, 108, 2, 104, 2, 2, 2, 2, 2, 105, 109, 2, 110, 2, 2, 2, 2, 2, 111, 2, 2, 112, 113, 2, 5, 105, 2, 2, 114, 2, 115, 94, 71, 116, 25, 2, 2, 117, 118, 2, 2, 2, 2, 2, 119, 120, 121, 2, 2, 2, 2, 2, 2, 122, 16, 2, 123, 124, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 2, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 131, 72, 132, 74, 74, 133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 100, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 2, 2, 2, 2, 2, 135, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 136, 2, 2, 137, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 138, 2, 2, 139, 100, 2, 2, 2, 91, 2, 2, 140, 2, 2, 2, 2, 141, 2, 142, 143, 2, 2, 2, 2, 91, 2, 2, 144, 118, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 145, 146, 2, 2, 2, 2, 2, 2, 2, 2, 2, 147, 148, 149, 104, 141, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 150, 151, 152, 2, 153, 2, 2, 2, 2, 2, 2, 2, 2, 2, 75, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 154, 155, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, }; static RE_UINT8 re_grapheme_cluster_break_stage_4[] = { 0, 0, 1, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 5, 6, 6, 6, 6, 7, 6, 8, 3, 9, 6, 6, 6, 6, 6, 6, 10, 11, 10, 3, 3, 0, 12, 3, 3, 6, 6, 13, 12, 3, 3, 7, 6, 14, 3, 3, 3, 3, 15, 6, 16, 6, 17, 18, 8, 19, 3, 3, 3, 6, 6, 13, 3, 3, 15, 6, 6, 6, 3, 3, 3, 3, 15, 10, 6, 6, 9, 9, 8, 3, 3, 9, 3, 3, 6, 6, 6, 6, 6, 6, 13, 20, 3, 3, 3, 3, 3, 21, 22, 23, 6, 24, 25, 9, 6, 3, 3, 15, 3, 3, 3, 26, 3, 3, 3, 3, 3, 3, 27, 23, 28, 29, 30, 3, 7, 3, 3, 31, 3, 3, 3, 3, 3, 3, 22, 32, 7, 17, 8, 8, 19, 3, 3, 23, 10, 33, 30, 3, 3, 3, 18, 3, 15, 3, 3, 34, 3, 3, 3, 3, 3, 3, 21, 35, 36, 37, 30, 38, 3, 3, 3, 3, 3, 3, 15, 24, 39, 18, 8, 3, 11, 3, 3, 36, 3, 3, 3, 3, 3, 3, 40, 41, 42, 37, 8, 23, 22, 37, 30, 3, 3, 34, 7, 43, 44, 45, 46, 47, 6, 13, 3, 3, 7, 6, 13, 47, 6, 10, 14, 3, 3, 6, 8, 3, 3, 8, 3, 3, 48, 19, 36, 9, 6, 6, 20, 6, 18, 3, 9, 6, 6, 9, 6, 6, 6, 6, 14, 3, 34, 3, 3, 3, 3, 3, 9, 49, 6, 31, 32, 3, 36, 8, 15, 9, 14, 3, 3, 34, 32, 3, 19, 3, 3, 3, 19, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 15, 14, 3, 3, 3, 53, 6, 54, 45, 41, 23, 6, 6, 3, 3, 19, 3, 3, 7, 55, 3, 3, 19, 3, 20, 46, 24, 3, 41, 45, 23, 3, 3, 38, 56, 3, 3, 7, 57, 3, 3, 58, 6, 13, 44, 9, 6, 24, 46, 6, 6, 17, 6, 59, 3, 3, 3, 49, 20, 24, 41, 59, 3, 3, 60, 3, 3, 3, 61, 54, 53, 62, 3, 21, 54, 63, 54, 3, 3, 3, 3, 45, 45, 6, 6, 43, 3, 3, 13, 6, 6, 6, 49, 6, 14, 19, 36, 14, 3, 3, 6, 13, 3, 3, 3, 3, 3, 6, 3, 3, 4, 64, 3, 3, 0, 65, 3, 3, 3, 7, 8, 3, 3, 3, 3, 3, 15, 6, 3, 3, 11, 3, 13, 6, 6, 8, 34, 34, 7, 3, 66, 67, 3, 3, 62, 3, 3, 3, 3, 45, 45, 45, 45, 14, 3, 3, 3, 15, 6, 8, 3, 7, 6, 6, 50, 50, 50, 68, 7, 43, 54, 24, 59, 3, 3, 3, 3, 3, 9, 20, 67, 32, 3, 3, 7, 3, 3, 69, 18, 17, 14, 15, 3, 3, 66, 54, 3, 70, 3, 3, 66, 25, 35, 30, 71, 72, 72, 72, 72, 72, 72, 71, 72, 72, 72, 72, 72, 72, 71, 72, 72, 71, 72, 72, 72, 3, 3, 3, 51, 73, 74, 52, 52, 52, 52, 3, 3, 3, 3, 34, 0, 0, 0, 3, 9, 11, 3, 6, 3, 3, 13, 7, 75, 3, 3, 3, 3, 3, 6, 6, 46, 20, 32, 5, 13, 3, 3, 3, 3, 7, 6, 23, 6, 14, 3, 3, 66, 43, 6, 20, 3, 3, 7, 25, 6, 53, 3, 3, 38, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 76, 3, 77, 8, 61, 78, 0, 79, 6, 13, 9, 6, 3, 3, 3, 15, 8, 3, 80, 81, 81, 81, 81, 81, 81, }; static RE_UINT8 re_grapheme_cluster_break_stage_5[] = { 3, 3, 3, 3, 3, 3, 2, 3, 3, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 4, 0, 0, 0, 4, 4, 4, 4, 4, 0, 4, 0, 4, 4, 0, 3, 0, 0, 0, 4, 4, 4, 0, 4, 0, 0, 0, 0, 0, 4, 4, 4, 3, 0, 4, 4, 0, 0, 4, 4, 0, 4, 4, 0, 4, 0, 0, 4, 4, 4, 6, 0, 0, 4, 6, 4, 0, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 4, 6, 6, 0, 4, 6, 6, 4, 0, 4, 6, 4, 0, 0, 6, 6, 0, 0, 6, 6, 4, 0, 0, 0, 4, 4, 6, 6, 4, 4, 0, 4, 6, 0, 6, 0, 0, 4, 0, 4, 6, 6, 0, 0, 0, 6, 6, 6, 0, 6, 6, 0, 6, 6, 6, 6, 0, 4, 4, 4, 0, 6, 4, 6, 6, 4, 6, 6, 0, 4, 6, 6, 6, 4, 4, 4, 0, 4, 0, 6, 6, 6, 6, 6, 6, 6, 4, 0, 4, 0, 6, 0, 4, 0, 4, 4, 6, 4, 4, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 4, 4, 6, 4, 4, 4, 6, 6, 4, 4, 3, 0, 0, 0, 6, 0, 4, 6, 6, 4, 0, 6, 4, 6, 6, 0, 0, 0, 4, 4, 6, 0, 0, 6, 4, 4, 6, 6, 0, 0, 6, 4, 6, 4, 4, 4, 3, 3, 3, 3, 3, 0, 0, 0, 0, 6, 6, 4, 4, 6, 7, 0, 0, 0, 4, 6, 0, 0, 0, 6, 4, 0, 10, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 0, 0, 0, 0, 9, 6, 4, 6, 0, 6, 6, 6, 0, 0, 4, 6, 4, 4, 4, 4, 3, 3, 3, 3, 4, 0, 0, 5, 5, 5, 5, 5, 5, }; /* Grapheme_Cluster_Break: 2336 bytes. */ RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_grapheme_cluster_break_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_cluster_break_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_grapheme_cluster_break_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_grapheme_cluster_break_stage_4[pos + f] << 2; value = re_grapheme_cluster_break_stage_5[pos + code]; return value; } /* Sentence_Break. */ static RE_UINT8 re_sentence_break_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, 11, 12, 13, 14, 9, 9, 15, 9, 9, 9, 9, 16, 9, 17, 18, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 19, 20, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static RE_UINT8 re_sentence_break_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 17, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 33, 33, 36, 33, 37, 33, 33, 38, 39, 40, 33, 41, 42, 33, 33, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 43, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 44, 17, 17, 17, 17, 45, 17, 46, 47, 48, 49, 50, 51, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 52, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 53, 54, 17, 55, 56, 57, 58, 59, 60, 61, 62, 33, 33, 33, 63, 64, 65, 66, 67, 33, 33, 33, 68, 69, 33, 33, 33, 33, 70, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 17, 71, 72, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 17, 17, 73, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 74, 33, 33, 33, 33, 75, 76, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 77, 78, 33, 79, 80, 81, 82, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 83, 33, 17, 17, 17, 17, 17, 17, 84, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 85, 86, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 17, 86, 33, 33, 33, 33, 33, 87, 88, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, }; static RE_UINT16 re_sentence_break_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 8, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 24, 25, 26, 27, 28, 29, 30, 18, 8, 31, 8, 32, 8, 8, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 41, 41, 44, 45, 46, 47, 48, 41, 41, 49, 50, 51, 52, 53, 54, 55, 55, 56, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 62, 71, 74, 75, 76, 77, 78, 79, 80, 81, 82, 73, 83, 84, 85, 86, 83, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 55, 97, 98, 99, 55, 100, 101, 102, 103, 104, 105, 106, 55, 41, 107, 108, 109, 110, 29, 111, 112, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 113, 41, 114, 115, 116, 41, 117, 41, 118, 119, 120, 41, 41, 121, 94, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 122, 123, 41, 41, 124, 125, 126, 127, 128, 41, 129, 130, 131, 132, 41, 41, 133, 41, 134, 41, 135, 136, 137, 138, 139, 41, 140, 141, 55, 142, 41, 143, 144, 145, 146, 55, 55, 147, 129, 148, 149, 150, 151, 41, 152, 41, 153, 154, 155, 55, 55, 156, 157, 18, 18, 18, 18, 18, 18, 23, 158, 8, 8, 8, 8, 159, 8, 8, 8, 160, 161, 162, 163, 161, 164, 165, 166, 167, 168, 169, 170, 171, 55, 172, 173, 174, 175, 176, 30, 177, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 178, 179, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 180, 30, 181, 55, 55, 182, 183, 55, 55, 184, 185, 55, 55, 55, 55, 186, 55, 187, 188, 29, 189, 190, 191, 8, 8, 8, 192, 18, 193, 41, 194, 195, 196, 196, 23, 197, 198, 55, 55, 55, 55, 55, 55, 199, 200, 94, 41, 201, 94, 41, 112, 202, 203, 41, 41, 204, 205, 55, 206, 41, 41, 41, 41, 41, 135, 55, 55, 41, 41, 41, 41, 41, 41, 207, 55, 41, 41, 41, 41, 207, 55, 206, 208, 209, 210, 8, 211, 212, 41, 41, 213, 214, 215, 8, 216, 217, 218, 55, 219, 220, 221, 41, 222, 223, 129, 224, 225, 50, 226, 227, 136, 58, 228, 229, 55, 41, 230, 231, 232, 41, 233, 234, 235, 236, 237, 55, 55, 55, 55, 41, 238, 41, 41, 41, 41, 41, 239, 240, 241, 41, 41, 41, 242, 41, 41, 243, 55, 244, 245, 246, 41, 41, 247, 248, 41, 41, 249, 206, 41, 250, 41, 251, 252, 253, 254, 255, 256, 41, 41, 41, 257, 258, 2, 259, 260, 261, 262, 263, 264, 265, 266, 267, 55, 41, 41, 41, 205, 55, 55, 41, 121, 55, 55, 55, 268, 55, 55, 55, 55, 136, 41, 269, 55, 262, 206, 270, 55, 271, 41, 272, 55, 29, 273, 274, 41, 271, 131, 55, 55, 275, 276, 135, 55, 55, 55, 55, 55, 135, 243, 55, 55, 41, 277, 55, 55, 278, 279, 280, 136, 55, 55, 55, 55, 41, 135, 135, 281, 55, 55, 55, 55, 41, 41, 282, 55, 55, 55, 55, 55, 150, 283, 284, 79, 150, 285, 286, 287, 150, 288, 289, 55, 150, 228, 290, 55, 55, 55, 55, 55, 41, 291, 131, 55, 41, 41, 41, 204, 55, 55, 55, 55, 41, 41, 41, 292, 55, 55, 55, 55, 41, 204, 55, 55, 55, 55, 55, 55, 41, 293, 55, 55, 55, 55, 55, 55, 41, 41, 294, 295, 296, 55, 55, 55, 297, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 298, 299, 300, 55, 55, 55, 55, 301, 55, 55, 55, 55, 55, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 302, 303, 315, 305, 316, 317, 318, 309, 319, 320, 321, 322, 323, 324, 189, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 55, 55, 41, 41, 41, 41, 41, 41, 195, 55, 41, 121, 41, 41, 41, 41, 41, 41, 271, 55, 55, 55, 55, 55, 55, 55, 335, 336, 336, 336, 55, 55, 55, 55, 23, 23, 23, 23, 23, 23, 23, 337, }; static RE_UINT8 re_sentence_break_stage_4[] = { 0, 0, 1, 2, 0, 0, 0, 0, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 11, 11, 11, 12, 13, 14, 15, 15, 15, 15, 15, 16, 13, 0, 17, 0, 0, 0, 0, 0, 0, 18, 0, 19, 20, 0, 21, 19, 0, 11, 11, 11, 11, 11, 22, 11, 23, 15, 15, 15, 15, 15, 24, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 28, 29, 30, 31, 32, 33, 28, 31, 34, 28, 25, 31, 29, 31, 32, 26, 35, 34, 36, 28, 31, 26, 26, 26, 26, 27, 25, 25, 25, 25, 30, 31, 25, 25, 25, 25, 25, 25, 25, 15, 33, 30, 26, 23, 25, 25, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 37, 15, 15, 15, 15, 15, 15, 15, 15, 38, 36, 39, 40, 36, 36, 41, 0, 0, 0, 15, 42, 0, 43, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 25, 45, 46, 39, 0, 47, 22, 48, 32, 11, 11, 11, 49, 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, 50, 33, 34, 25, 25, 25, 25, 25, 25, 15, 51, 30, 32, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 52, 44, 53, 25, 25, 25, 25, 25, 28, 26, 26, 29, 25, 25, 25, 25, 25, 25, 0, 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 22, 54, 55, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 56, 0, 57, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 58, 59, 58, 0, 0, 36, 36, 36, 36, 36, 36, 60, 0, 36, 0, 0, 0, 61, 62, 0, 63, 44, 44, 64, 65, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 66, 44, 44, 44, 44, 44, 7, 7, 67, 68, 69, 36, 36, 36, 36, 36, 36, 36, 36, 70, 44, 71, 44, 72, 73, 74, 7, 7, 75, 76, 77, 0, 0, 78, 79, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, 44, 44, 64, 80, 36, 36, 36, 36, 36, 81, 44, 44, 82, 0, 0, 0, 7, 7, 75, 36, 36, 36, 36, 36, 36, 36, 66, 44, 44, 41, 83, 0, 36, 36, 36, 36, 36, 81, 84, 44, 44, 85, 85, 86, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 36, 36, 88, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 64, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 81, 89, 44, 44, 44, 44, 85, 44, 36, 36, 81, 90, 7, 7, 80, 36, 80, 36, 57, 80, 36, 76, 76, 36, 36, 36, 36, 36, 87, 36, 43, 40, 41, 89, 44, 91, 91, 92, 0, 93, 0, 94, 81, 95, 7, 7, 41, 0, 0, 0, 57, 80, 60, 96, 76, 36, 36, 36, 36, 36, 87, 36, 87, 97, 41, 73, 64, 93, 91, 86, 98, 0, 80, 43, 0, 95, 7, 7, 74, 99, 0, 0, 57, 80, 36, 94, 94, 36, 36, 36, 36, 36, 87, 36, 87, 80, 41, 89, 44, 58, 58, 86, 88, 0, 0, 0, 81, 95, 7, 7, 0, 0, 0, 0, 44, 91, 91, 86, 0, 100, 0, 94, 81, 95, 7, 7, 54, 0, 0, 0, 101, 80, 60, 40, 87, 41, 97, 87, 96, 88, 60, 40, 36, 36, 41, 100, 64, 100, 73, 86, 88, 93, 0, 0, 0, 95, 7, 7, 0, 0, 0, 0, 57, 80, 36, 87, 87, 36, 36, 36, 36, 36, 87, 36, 36, 80, 41, 102, 44, 73, 73, 86, 0, 59, 41, 0, 100, 80, 36, 87, 87, 36, 36, 36, 36, 36, 87, 36, 36, 80, 41, 89, 44, 73, 73, 86, 0, 59, 0, 103, 81, 95, 7, 7, 97, 0, 0, 0, 36, 36, 36, 36, 36, 36, 60, 102, 44, 73, 73, 92, 0, 93, 0, 0, 81, 95, 7, 7, 0, 0, 40, 36, 100, 80, 36, 36, 36, 60, 40, 36, 36, 36, 36, 36, 94, 36, 36, 54, 36, 60, 104, 93, 44, 105, 44, 44, 0, 0, 0, 0, 100, 0, 0, 0, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 79, 44, 64, 0, 36, 66, 44, 64, 7, 7, 106, 0, 97, 76, 43, 54, 0, 36, 80, 36, 80, 107, 40, 80, 79, 44, 58, 82, 36, 43, 44, 86, 7, 7, 106, 36, 88, 0, 0, 0, 0, 0, 86, 0, 7, 7, 106, 0, 0, 108, 109, 110, 36, 36, 80, 36, 36, 36, 36, 36, 36, 36, 36, 88, 57, 44, 44, 44, 44, 73, 36, 85, 44, 44, 57, 44, 44, 44, 44, 44, 44, 44, 44, 111, 0, 104, 0, 0, 0, 0, 0, 0, 36, 36, 66, 44, 44, 44, 44, 112, 7, 7, 113, 0, 36, 81, 74, 81, 89, 72, 44, 74, 85, 69, 36, 36, 81, 44, 44, 84, 7, 7, 114, 86, 11, 49, 0, 115, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 36, 36, 36, 87, 41, 36, 60, 87, 41, 36, 36, 87, 41, 36, 36, 36, 36, 36, 36, 36, 36, 87, 41, 36, 60, 87, 41, 36, 36, 36, 60, 36, 36, 36, 36, 36, 36, 87, 41, 36, 36, 36, 36, 36, 36, 36, 36, 60, 57, 116, 9, 117, 0, 0, 0, 0, 0, 36, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 36, 88, 0, 0, 36, 36, 36, 118, 36, 36, 36, 36, 119, 36, 36, 36, 36, 36, 120, 121, 36, 36, 60, 40, 88, 0, 0, 0, 36, 36, 36, 87, 81, 111, 0, 0, 36, 36, 36, 36, 81, 122, 0, 0, 36, 36, 36, 36, 81, 0, 0, 0, 36, 36, 36, 87, 123, 0, 0, 0, 36, 36, 36, 36, 36, 44, 44, 44, 44, 44, 44, 44, 44, 96, 0, 99, 7, 7, 106, 0, 0, 0, 0, 0, 124, 0, 125, 126, 7, 7, 106, 0, 36, 36, 36, 36, 36, 36, 0, 0, 36, 36, 127, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, 44, 0, 44, 44, 44, 0, 0, 90, 7, 7, 36, 36, 36, 36, 36, 36, 36, 41, 36, 88, 0, 0, 36, 36, 36, 0, 44, 44, 44, 44, 69, 36, 86, 0, 7, 7, 106, 0, 36, 36, 36, 36, 36, 66, 44, 0, 36, 36, 36, 36, 36, 85, 44, 64, 44, 44, 44, 44, 44, 44, 44, 91, 7, 7, 106, 0, 7, 7, 106, 0, 0, 96, 128, 0, 0, 0, 0, 0, 44, 69, 36, 36, 36, 36, 36, 36, 44, 69, 36, 0, 7, 7, 113, 129, 0, 0, 93, 44, 44, 0, 0, 0, 112, 36, 36, 36, 36, 36, 36, 36, 85, 44, 44, 74, 7, 7, 75, 36, 36, 81, 44, 44, 44, 0, 0, 0, 36, 44, 44, 44, 44, 44, 9, 117, 7, 7, 106, 80, 7, 7, 75, 36, 36, 36, 36, 36, 36, 36, 36, 130, 0, 0, 0, 0, 64, 44, 44, 44, 44, 44, 69, 79, 81, 131, 0, 0, 44, 64, 0, 0, 0, 0, 0, 44, 25, 25, 25, 25, 25, 34, 15, 27, 15, 15, 11, 11, 15, 39, 11, 132, 15, 15, 11, 11, 15, 15, 11, 11, 15, 39, 11, 132, 15, 15, 133, 133, 15, 15, 11, 11, 15, 15, 15, 39, 15, 15, 11, 11, 15, 134, 11, 135, 46, 134, 11, 136, 15, 46, 11, 0, 15, 15, 11, 136, 46, 134, 11, 136, 137, 137, 138, 139, 140, 141, 142, 142, 0, 143, 144, 145, 0, 0, 146, 147, 0, 148, 147, 0, 0, 0, 0, 149, 61, 150, 61, 61, 21, 0, 0, 151, 0, 0, 0, 146, 15, 15, 15, 42, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 111, 0, 0, 0, 47, 152, 153, 154, 23, 115, 10, 132, 0, 155, 48, 156, 11, 38, 157, 33, 0, 158, 39, 159, 0, 0, 0, 0, 160, 38, 88, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 11, 11, 15, 15, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 162, 0, 0, 142, 142, 142, 5, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 163, 142, 142, 0, 0, 0, 0, 4, 142, 142, 142, 142, 142, 121, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 5, 11, 11, 11, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 31, 164, 26, 32, 25, 29, 15, 33, 25, 42, 152, 165, 53, 0, 0, 0, 15, 166, 0, 21, 36, 36, 36, 36, 36, 36, 0, 96, 0, 0, 0, 93, 36, 36, 36, 36, 36, 60, 0, 0, 36, 60, 36, 60, 36, 60, 36, 60, 142, 142, 142, 5, 0, 0, 0, 5, 142, 142, 5, 167, 0, 0, 0, 0, 168, 80, 142, 142, 5, 142, 142, 169, 80, 36, 81, 44, 80, 41, 36, 88, 36, 36, 36, 36, 36, 60, 59, 80, 0, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 80, 36, 36, 36, 36, 36, 36, 60, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 60, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 88, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 170, 36, 36, 36, 171, 36, 36, 36, 36, 7, 7, 75, 0, 0, 0, 0, 0, 25, 25, 25, 172, 64, 44, 44, 173, 25, 25, 25, 25, 25, 25, 0, 93, 36, 36, 36, 36, 174, 9, 0, 0, 0, 0, 0, 0, 0, 96, 36, 36, 175, 25, 25, 25, 27, 25, 25, 25, 25, 25, 25, 25, 15, 15, 26, 30, 25, 25, 176, 177, 25, 0, 0, 0, 25, 25, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 36, 180, 180, 66, 36, 36, 36, 36, 36, 66, 44, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 129, 0, 0, 74, 36, 36, 36, 36, 36, 36, 36, 44, 111, 0, 129, 7, 7, 106, 0, 44, 44, 44, 44, 74, 36, 96, 0, 36, 81, 44, 174, 36, 36, 36, 36, 36, 66, 44, 44, 44, 0, 0, 0, 36, 36, 36, 36, 66, 44, 44, 44, 111, 0, 147, 96, 7, 7, 106, 0, 36, 36, 85, 44, 44, 64, 0, 0, 66, 36, 36, 86, 7, 7, 106, 181, 36, 36, 36, 36, 36, 60, 182, 0, 36, 36, 36, 36, 89, 72, 69, 81, 127, 0, 0, 0, 0, 0, 96, 41, 36, 36, 66, 44, 183, 184, 0, 0, 80, 60, 80, 60, 80, 60, 0, 0, 36, 60, 36, 60, 0, 0, 0, 0, 66, 44, 185, 86, 7, 7, 106, 0, 36, 0, 0, 0, 36, 36, 36, 36, 36, 60, 96, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 41, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 15, 24, 0, 0, 186, 15, 0, 187, 36, 36, 87, 36, 36, 60, 36, 43, 94, 87, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 96, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 188, 36, 36, 36, 36, 40, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 0, 44, 44, 44, 44, 189, 4, 121, 0, 44, 64, 0, 0, 190, 169, 142, 142, 142, 191, 121, 0, 6, 192, 193, 162, 140, 0, 0, 0, 36, 87, 36, 36, 36, 36, 36, 36, 36, 36, 36, 194, 56, 0, 5, 6, 0, 0, 195, 9, 14, 15, 15, 15, 15, 15, 16, 196, 197, 198, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 81, 36, 36, 36, 36, 36, 36, 36, 60, 40, 36, 40, 36, 40, 36, 40, 88, 0, 0, 0, 0, 0, 0, 199, 0, 36, 36, 36, 80, 36, 36, 36, 36, 36, 60, 36, 36, 36, 36, 60, 94, 36, 36, 36, 41, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 98, 36, 36, 36, 36, 88, 0, 0, 0, 36, 36, 60, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 41, 36, 0, 36, 36, 80, 41, 0, 0, 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 36, 36, 36, 36, 36, 41, 87, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 94, 88, 76, 36, 36, 36, 36, 36, 36, 0, 40, 85, 59, 0, 44, 36, 80, 80, 36, 36, 36, 36, 36, 36, 0, 64, 93, 0, 0, 0, 0, 0, 129, 0, 0, 36, 36, 36, 36, 60, 0, 0, 0, 36, 36, 88, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 44, 44, 44, 185, 117, 0, 0, 0, 0, 0, 36, 36, 36, 36, 44, 44, 64, 200, 147, 0, 0, 0, 36, 36, 36, 36, 36, 36, 88, 0, 7, 7, 106, 0, 36, 66, 44, 44, 44, 201, 7, 7, 181, 0, 0, 0, 0, 0, 0, 0, 69, 202, 0, 0, 7, 7, 106, 0, 36, 36, 66, 44, 44, 44, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 88, 0, 36, 88, 0, 0, 85, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 64, 0, 0, 0, 93, 112, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 57, 86, 57, 203, 61, 204, 44, 64, 57, 44, 0, 0, 0, 0, 0, 0, 0, 100, 86, 0, 0, 0, 0, 100, 111, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 134, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 48, 47, 205, 10, 48, 11, 154, 166, 14, 15, 14, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 49, 22, 10, 11, 48, 11, 206, 15, 15, 15, 15, 15, 15, 49, 22, 11, 155, 161, 11, 206, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 154, 15, 15, 15, 15, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 154, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 15, 39, 11, 11, 11, 11, 11, 11, 206, 15, 15, 15, 15, 15, 24, 15, 33, 11, 11, 11, 11, 11, 22, 15, 15, 15, 15, 15, 15, 134, 15, 11, 11, 11, 11, 11, 11, 206, 15, 15, 15, 15, 15, 24, 15, 33, 11, 11, 15, 15, 134, 15, 11, 11, 11, 11, 11, 11, 206, 15, 15, 15, 15, 15, 24, 15, 27, 95, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 36, 80, 36, 36, 36, 36, 36, 36, 97, 76, 80, 36, 60, 36, 107, 0, 103, 96, 107, 80, 97, 76, 107, 107, 97, 76, 60, 36, 60, 36, 80, 43, 36, 36, 94, 36, 36, 36, 36, 0, 80, 80, 94, 36, 36, 36, 36, 0, 20, 0, 0, 0, 0, 0, 0, 0, 61, 61, 61, 61, 61, 61, 61, 61, 44, 44, 44, 44, 0, 0, 0, 0, }; static RE_UINT8 re_sentence_break_stage_5[] = { 0, 0, 0, 0, 0, 6, 2, 6, 6, 1, 0, 0, 6, 12, 13, 0, 0, 0, 0, 13, 13, 13, 0, 0, 14, 14, 11, 0, 10, 10, 10, 10, 10, 10, 14, 0, 0, 0, 0, 12, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 0, 13, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 13, 0, 4, 0, 0, 6, 0, 0, 0, 0, 0, 7, 13, 0, 5, 0, 0, 0, 7, 0, 0, 8, 8, 8, 0, 8, 8, 8, 7, 7, 7, 7, 0, 8, 7, 8, 7, 7, 8, 7, 8, 7, 7, 8, 7, 8, 8, 7, 8, 7, 8, 7, 7, 7, 8, 8, 7, 8, 7, 8, 8, 7, 8, 8, 8, 7, 7, 8, 8, 8, 7, 7, 7, 8, 7, 7, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 9, 9, 9, 7, 7, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 7, 0, 0, 0, 9, 0, 9, 0, 3, 3, 3, 3, 9, 0, 8, 7, 0, 0, 7, 7, 0, 0, 8, 0, 8, 0, 8, 8, 8, 8, 0, 8, 7, 7, 7, 8, 8, 7, 0, 8, 8, 7, 0, 3, 3, 3, 8, 7, 0, 9, 0, 0, 12, 14, 12, 0, 0, 12, 0, 0, 0, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3, 0, 9, 9, 9, 0, 5, 5, 5, 5, 5, 0, 0, 0, 14, 14, 0, 0, 3, 3, 3, 0, 5, 0, 0, 12, 9, 9, 9, 3, 10, 10, 0, 10, 10, 0, 9, 9, 3, 9, 9, 9, 12, 9, 3, 3, 3, 5, 0, 3, 3, 9, 9, 3, 3, 0, 3, 3, 3, 3, 9, 9, 10, 10, 9, 9, 9, 0, 0, 9, 12, 12, 12, 0, 0, 0, 0, 5, 9, 3, 9, 9, 0, 9, 9, 9, 9, 9, 3, 3, 3, 9, 0, 0, 14, 12, 9, 0, 3, 3, 9, 3, 9, 3, 3, 3, 3, 3, 0, 0, 9, 0, 9, 9, 9, 0, 0, 0, 3, 9, 3, 3, 12, 12, 10, 10, 3, 0, 0, 3, 3, 3, 9, 0, 0, 0, 0, 3, 9, 9, 0, 9, 0, 0, 10, 10, 0, 0, 0, 9, 0, 9, 9, 0, 0, 3, 0, 0, 9, 3, 0, 0, 0, 0, 3, 3, 0, 0, 3, 9, 0, 9, 3, 3, 0, 0, 9, 0, 0, 0, 3, 0, 3, 0, 3, 0, 10, 10, 0, 0, 0, 9, 0, 9, 0, 3, 0, 3, 0, 3, 13, 13, 13, 13, 3, 3, 3, 0, 0, 0, 3, 3, 3, 9, 10, 10, 12, 12, 10, 10, 3, 3, 0, 8, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 9, 0, 12, 9, 6, 9, 9, 9, 9, 9, 9, 13, 13, 0, 0, 0, 3, 12, 12, 0, 9, 0, 3, 3, 0, 0, 14, 12, 14, 12, 0, 3, 3, 3, 5, 0, 9, 3, 9, 0, 12, 12, 12, 12, 0, 0, 12, 12, 9, 9, 12, 12, 3, 9, 9, 0, 8, 8, 0, 0, 0, 8, 0, 8, 7, 0, 7, 7, 8, 0, 7, 0, 8, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 5, 3, 3, 5, 5, 0, 0, 0, 14, 14, 0, 0, 0, 13, 13, 13, 13, 11, 0, 0, 0, 4, 4, 5, 5, 5, 5, 5, 6, 0, 13, 13, 0, 12, 12, 0, 0, 0, 13, 13, 12, 0, 0, 0, 6, 5, 0, 5, 5, 0, 13, 13, 7, 0, 0, 0, 8, 0, 0, 7, 8, 8, 8, 7, 7, 8, 0, 8, 0, 8, 8, 0, 7, 9, 7, 0, 0, 0, 8, 7, 7, 0, 0, 7, 0, 9, 9, 9, 8, 0, 0, 8, 8, 13, 13, 13, 0, 0, 0, 13, 13, 8, 7, 7, 8, 7, 8, 7, 3, 7, 7, 0, 7, 0, 0, 12, 9, 6, 14, 12, 0, 0, 13, 13, 13, 9, 9, 0, 12, 9, 0, 12, 12, 8, 7, 9, 3, 3, 3, 0, 9, 3, 3, 0, 12, 0, 0, 8, 7, 9, 0, 0, 8, 7, 8, 7, 0, 8, 7, 8, 0, 7, 7, 7, 9, 9, 9, 3, 9, 0, 12, 12, 12, 0, 0, 9, 3, 12, 12, 9, 9, 9, 3, 3, 0, 3, 3, 3, 12, 0, 0, 0, 7, 0, 9, 3, 9, 9, 9, 13, 13, 14, 14, 0, 14, 0, 14, 14, 0, 13, 0, 0, 13, 0, 14, 12, 12, 14, 13, 13, 13, 9, 0, 0, 5, 0, 0, 14, 0, 0, 13, 0, 13, 13, 12, 13, 13, 14, 0, 9, 9, 0, 5, 5, 5, 0, 5, 12, 12, 3, 0, 10, 10, 9, 12, 12, 0, 3, 3, 3, 5, 5, 5, 5, 3, 0, 8, 8, 0, 8, 0, 7, 7, }; /* Sentence_Break: 5596 bytes. */ RE_UINT32 re_get_sentence_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_sentence_break_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_sentence_break_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_sentence_break_stage_3[pos + f] << 3; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_sentence_break_stage_4[pos + f] << 2; value = re_sentence_break_stage_5[pos + code]; return value; } /* Math. */ static RE_UINT8 re_math_stage_1[] = { 0, 1, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_math_stage_2[] = { 0, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 6, 1, 1, }; static RE_UINT8 re_math_stage_3[] = { 0, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, 6, 6, 11, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 13, 14, 1, 1, 1, 1, 15, 16, 17, 18, 1, 1, 1, 1, 1, 1, 19, 1, }; static RE_UINT8 re_math_stage_4[] = { 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 0, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 25, 0, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 31, 32, 33, 34, 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 0, 19, 37, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 40, 23, 23, 41, 23, 42, 43, 44, 23, 45, 46, 47, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 48, 23, 23, 23, 23, 23, 23, 23, 23, 49, 23, 44, 50, 51, 52, 53, 54, 0, 55, }; static RE_UINT8 re_math_stage_5[] = { 0, 0, 0, 0, 0, 8, 0, 112, 0, 0, 0, 64, 0, 0, 0, 80, 0, 16, 2, 0, 0, 0, 128, 0, 0, 0, 39, 0, 0, 0, 115, 0, 192, 1, 0, 0, 0, 0, 64, 0, 0, 0, 28, 0, 17, 0, 4, 0, 30, 0, 0, 124, 0, 124, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 63, 16, 179, 251, 241, 255, 11, 0, 0, 0, 0, 255, 255, 255, 126, 195, 240, 255, 255, 255, 47, 48, 0, 240, 255, 255, 255, 255, 255, 0, 15, 0, 0, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 248, 255, 255, 191, 0, 0, 0, 1, 240, 7, 0, 0, 0, 3, 192, 255, 240, 195, 140, 15, 0, 148, 31, 0, 255, 96, 0, 0, 0, 5, 0, 0, 0, 15, 224, 0, 0, 159, 31, 0, 0, 0, 2, 0, 0, 126, 1, 0, 0, 4, 30, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0, }; /* Math: 538 bytes. */ RE_UINT32 re_get_math(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_math_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_math_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_math_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_math_stage_4[pos + f] << 5; pos += code; value = (re_math_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Alphabetic. */ static RE_UINT8 re_alphabetic_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_alphabetic_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_alphabetic_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, 53, 54, 55, 56, 57, 31, 31, 31, 58, 59, 60, 61, 62, 31, 31, 31, 63, 64, 31, 31, 31, 31, 65, 31, 1, 1, 1, 66, 67, 31, 31, 31, 1, 1, 1, 1, 68, 31, 31, 31, 1, 1, 69, 31, 31, 31, 31, 70, 71, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 72, 73, 74, 75, 31, 31, 31, 31, 31, 31, 76, 31, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 78, 79, 31, 31, 31, 31, 31, 31, 31, 1, 1, 79, 31, 31, 31, 31, 31, }; static RE_UINT8 re_alphabetic_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 7, 8, 9, 10, 4, 11, 4, 4, 4, 4, 12, 4, 4, 4, 4, 13, 14, 15, 16, 17, 18, 19, 20, 4, 21, 22, 4, 4, 23, 24, 25, 4, 26, 4, 4, 27, 28, 29, 30, 31, 32, 0, 0, 33, 0, 34, 4, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 38, 47, 50, 51, 52, 53, 54, 0, 55, 56, 57, 49, 58, 56, 59, 60, 58, 61, 62, 63, 64, 65, 66, 67, 15, 68, 69, 0, 70, 71, 72, 0, 73, 0, 74, 75, 76, 77, 0, 0, 4, 78, 25, 79, 80, 4, 81, 82, 4, 4, 83, 4, 84, 85, 86, 4, 87, 4, 88, 0, 89, 4, 4, 90, 15, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 91, 1, 4, 4, 92, 93, 94, 94, 95, 4, 96, 97, 0, 0, 4, 4, 98, 4, 99, 4, 100, 77, 101, 25, 102, 4, 103, 104, 0, 105, 4, 106, 107, 0, 108, 0, 0, 4, 109, 110, 0, 4, 111, 4, 112, 4, 100, 113, 114, 0, 0, 0, 115, 4, 4, 4, 4, 4, 4, 0, 0, 116, 4, 117, 114, 4, 118, 119, 120, 0, 0, 0, 121, 122, 0, 0, 0, 123, 124, 125, 4, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 4, 104, 4, 128, 106, 4, 4, 4, 4, 129, 4, 81, 4, 130, 131, 132, 132, 4, 0, 133, 0, 0, 0, 0, 0, 0, 134, 135, 15, 4, 136, 15, 4, 82, 137, 138, 4, 4, 139, 68, 0, 25, 4, 4, 4, 4, 4, 100, 0, 0, 4, 4, 4, 4, 4, 4, 31, 0, 4, 4, 4, 4, 31, 0, 25, 114, 140, 141, 4, 142, 143, 4, 4, 89, 144, 145, 4, 4, 146, 147, 0, 148, 149, 16, 4, 94, 4, 4, 49, 150, 28, 99, 151, 77, 4, 152, 133, 0, 4, 131, 153, 154, 4, 106, 155, 156, 157, 158, 0, 0, 0, 0, 4, 147, 4, 4, 4, 4, 4, 159, 160, 105, 4, 4, 4, 161, 4, 4, 162, 0, 163, 164, 165, 4, 4, 27, 166, 4, 4, 114, 25, 4, 167, 4, 16, 168, 0, 0, 0, 169, 4, 4, 4, 77, 0, 1, 1, 170, 4, 106, 171, 0, 172, 173, 174, 0, 4, 4, 4, 68, 0, 0, 4, 90, 0, 0, 0, 0, 0, 0, 0, 0, 77, 4, 175, 0, 106, 25, 147, 0, 114, 4, 176, 0, 4, 4, 4, 4, 114, 0, 0, 0, 177, 178, 100, 0, 0, 0, 0, 0, 100, 162, 0, 0, 4, 179, 0, 0, 180, 94, 0, 77, 0, 0, 0, 0, 4, 100, 100, 151, 0, 0, 0, 0, 4, 4, 126, 0, 0, 0, 0, 0, 4, 4, 181, 0, 145, 32, 25, 126, 4, 151, 0, 0, 4, 4, 182, 0, 0, 0, 0, 0, 4, 100, 0, 0, 4, 4, 4, 139, 0, 0, 0, 0, 4, 4, 4, 183, 0, 0, 0, 0, 4, 139, 0, 0, 0, 0, 0, 0, 4, 32, 0, 0, 0, 0, 0, 0, 4, 4, 184, 106, 166, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 4, 4, 186, 4, 187, 188, 189, 4, 190, 191, 192, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 193, 194, 82, 186, 186, 128, 128, 195, 195, 196, 0, 189, 197, 198, 199, 200, 201, 0, 0, 4, 4, 4, 4, 4, 4, 131, 0, 4, 90, 4, 4, 4, 4, 4, 4, 114, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_alphabetic_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 32, 0, 0, 0, 0, 0, 223, 60, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 7, 7, 0, 0, 0, 255, 7, 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, 254, 225, 0, 156, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, 253, 31, 0, 0, 240, 3, 255, 127, 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 254, 238, 159, 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 0, 238, 135, 249, 255, 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, 238, 191, 251, 255, 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 0, 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 29, 129, 0, 238, 223, 253, 255, 255, 253, 239, 227, 223, 29, 96, 3, 236, 223, 253, 255, 223, 29, 96, 64, 15, 0, 6, 0, 255, 255, 255, 231, 223, 93, 128, 0, 15, 0, 0, 252, 236, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, 255, 255, 255, 7, 127, 32, 0, 0, 150, 37, 240, 254, 174, 236, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, 231, 193, 255, 255, 127, 64, 0, 48, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 135, 255, 255, 0, 0, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, 255, 1, 128, 16, 255, 255, 255, 0, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 255, 15, 255, 255, 255, 127, 254, 255, 31, 0, 128, 0, 0, 0, 255, 255, 239, 255, 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, 0, 224, 0, 252, 255, 255, 255, 63, 0, 222, 111, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 255, 255, 127, 0, 127, 127, 127, 127, 0, 128, 0, 0, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, 255, 255, 255, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 255, 7, 0, 0, 0, 0, 0, 255, 187, 247, 255, 255, 0, 0, 252, 8, 255, 255, 7, 0, 255, 255, 247, 255, 255, 63, 0, 0, 255, 255, 127, 4, 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, 127, 127, 0, 0, 15, 0, 255, 255, 127, 248, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 111, 240, 239, 254, 63, 0, 0, 0, 30, 0, 0, 0, 7, 0, 0, 0, 31, 0, 255, 255, 3, 0, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* Alphabetic: 1817 bytes. */ RE_UINT32 re_get_alphabetic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_alphabetic_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_alphabetic_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_alphabetic_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_alphabetic_stage_4[pos + f] << 5; pos += code; value = (re_alphabetic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Lowercase. */ static RE_UINT8 re_lowercase_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_lowercase_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_lowercase_stage_3[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 3, 7, 3, 3, 3, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 3, 11, 3, 3, 12, 3, 3, 3, 3, 3, 3, 3, 13, 14, 3, 3, 3, 3, }; static RE_UINT8 re_lowercase_stage_4[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, 0, 26, 15, 5, 27, 5, 28, 5, 5, 29, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 5, 5, 5, 5, 32, 5, 5, 5, 33, 34, 35, 36, 34, 37, 38, 39, 0, 0, 0, 40, 41, 0, 0, 0, 42, 43, 44, 26, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 47, 48, 5, 5, 5, 49, 15, 50, 0, 0, 0, 0, 0, 0, 0, 0, 5, 51, 52, 0, 0, 0, 0, 53, 5, 54, 55, 56, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 63, 31, 64, 65, 66, 67, 68, 69, 70, 71, 72, 61, 62, 73, 31, 64, 74, 60, 67, 75, 76, 77, 78, 74, 79, 26, 80, 67, 81, 0, }; static RE_UINT8 re_lowercase_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 0, 0, 0, 128, 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 85, 85, 171, 170, 170, 170, 170, 170, 212, 41, 49, 36, 78, 42, 45, 81, 230, 64, 82, 85, 181, 170, 170, 41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 138, 60, 0, 0, 1, 0, 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 25, 0, 0, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 0, 0, 0, 254, 255, 255, 255, 255, 0, 0, 0, 170, 170, 234, 191, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, 255, 0, 220, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 196, 8, 0, 0, 128, 16, 50, 192, 67, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 218, 63, 26, 80, 8, 0, 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 0, 168, 170, 171, 170, 170, 170, 255, 149, 170, 80, 10, 0, 170, 2, 0, 0, 0, 0, 0, 7, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 223, 255, 252, 255, 255, 15, 0, 0, 192, 235, 239, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 255, 255, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 255, 255, 255, 0, 192, 255, 255, 0, 0, 192, 255, 63, 0, 0, 0, 252, 255, 255, 247, 3, 0, 0, 240, 255, 255, 223, 15, 255, 127, 63, 0, 255, 253, 0, 0, 247, 11, 0, 0, }; /* Lowercase: 697 bytes. */ RE_UINT32 re_get_lowercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_lowercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_lowercase_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_lowercase_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_lowercase_stage_4[pos + f] << 5; pos += code; value = (re_lowercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Uppercase. */ static RE_UINT8 re_uppercase_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_uppercase_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_uppercase_stage_3[] = { 0, 1, 2, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 5, 6, 3, 7, 3, 3, 3, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 3, 3, 11, 3, 3, 3, 3, 3, 3, 3, 12, 13, 3, 3, 3, 3, }; static RE_UINT8 re_uppercase_stage_4[] = { 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 25, 3, 3, 3, 26, 27, 28, 29, 0, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 19, 36, 0, 0, 0, 0, 0, 0, 0, 0, 37, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 38, 0, 39, 3, 3, 3, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 42, 0, 0, 0, 0, 43, 3, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 18, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 48, 49, 50, 51, 61, 62, 54, 55, 51, 63, 64, 65, 66, 37, 38, 54, 67, 68, 0, }; static RE_UINT8 re_uppercase_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, 213, 210, 174, 17, 144, 164, 170, 74, 85, 85, 210, 85, 85, 85, 5, 108, 122, 85, 0, 0, 0, 0, 69, 0, 64, 215, 254, 255, 251, 15, 0, 0, 0, 128, 28, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, 85, 0, 254, 255, 255, 255, 127, 0, 191, 32, 0, 0, 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 31, 0, 15, 132, 56, 39, 62, 80, 61, 15, 192, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 0, 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 5, 0, 85, 5, 0, 0, 255, 0, 0, 0, 255, 255, 255, 3, 0, 0, 240, 255, 255, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 208, 100, 222, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 176, 231, 223, 31, 0, 0, 0, 123, 95, 252, 1, 0, 0, 240, 255, 255, 63, 0, 0, 0, 3, 0, 0, 240, 255, 255, 63, 0, 1, 0, 0, 0, 252, 255, 255, 7, 0, 0, 0, 240, 255, 255, 31, 0, 255, 1, 0, 0, 0, 4, 0, 0, }; /* Uppercase: 629 bytes. */ RE_UINT32 re_get_uppercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_uppercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_uppercase_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_uppercase_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_uppercase_stage_4[pos + f] << 5; pos += code; value = (re_uppercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Cased. */ static RE_UINT8 re_cased_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_cased_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_cased_stage_3[] = { 0, 1, 2, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 6, 7, 3, 8, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 11, 3, 12, 3, 3, 13, 3, 3, 3, 3, 3, 3, 3, 14, 15, 3, 3, 3, 3, }; static RE_UINT8 re_cased_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 5, 6, 4, 4, 4, 4, 4, 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, 4, 15, 4, 4, 4, 4, 16, 4, 4, 4, 4, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 22, 4, 23, 24, 4, 25, 26, 27, 0, 0, 0, 28, 29, 0, 0, 0, 30, 31, 32, 4, 33, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 35, 0, 0, 0, 0, 0, 0, 0, 0, 4, 36, 37, 4, 4, 4, 4, 38, 4, 21, 0, 0, 0, 0, 0, 0, 0, 0, 4, 39, 40, 0, 0, 0, 0, 41, 4, 4, 42, 43, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 4, 4, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 47, 4, 48, 49, 50, 4, 51, 52, 53, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, 55, 5, 47, 47, 36, 36, 56, 56, 57, 0, }; static RE_UINT8 re_cased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 207, 60, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, 191, 32, 0, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 31, 242, 224, 67, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, 255, 63, 0, 0, 255, 255, 255, 0, 252, 255, 255, 255, 255, 120, 15, 0, 255, 7, 0, 0, 0, 0, 0, 7, 127, 0, 248, 0, 255, 255, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, }; /* Cased: 617 bytes. */ RE_UINT32 re_get_cased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_cased_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_cased_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_cased_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_cased_stage_4[pos + f] << 5; pos += code; value = (re_cased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Case_Ignorable. */ static RE_UINT8 re_case_ignorable_stage_1[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, }; static RE_UINT8 re_case_ignorable_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 11, 12, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }; static RE_UINT8 re_case_ignorable_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 1, 17, 1, 1, 1, 18, 19, 20, 21, 22, 23, 24, 1, 25, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 28, 29, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 32, 1, 33, 34, 35, 36, 37, 38, 1, 1, 1, 1, 1, 1, 1, 39, 1, 1, 40, 41, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 43, 1, 1, 1, 1, 1, 44, 45, 1, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 48, 49, 1, 1, 1, 1, 1, 50, 51, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_case_ignorable_stage_4[] = { 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 6, 6, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 14, 15, 0, 16, 17, 0, 0, 18, 19, 20, 5, 21, 0, 0, 22, 0, 23, 24, 25, 26, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 33, 37, 38, 36, 33, 39, 35, 32, 40, 41, 35, 42, 0, 43, 0, 0, 44, 45, 35, 0, 40, 46, 35, 0, 0, 34, 35, 0, 0, 47, 0, 0, 48, 49, 0, 0, 50, 51, 0, 52, 53, 0, 54, 55, 56, 57, 0, 0, 58, 59, 60, 61, 0, 0, 33, 0, 0, 62, 0, 0, 0, 0, 0, 63, 63, 64, 64, 0, 65, 66, 0, 67, 0, 68, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 71, 0, 72, 73, 0, 74, 0, 0, 75, 76, 42, 77, 78, 79, 0, 80, 0, 81, 0, 82, 0, 0, 83, 84, 0, 85, 6, 86, 87, 6, 6, 88, 0, 0, 0, 0, 0, 89, 90, 91, 92, 93, 0, 94, 95, 0, 5, 96, 0, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 101, 102, 0, 0, 103, 0, 0, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 106, 0, 0, 107, 108, 0, 0, 109, 6, 78, 0, 17, 110, 0, 0, 52, 111, 112, 0, 0, 0, 0, 113, 114, 0, 115, 116, 0, 28, 117, 100, 0, 0, 118, 119, 17, 0, 120, 121, 122, 0, 0, 0, 0, 0, 0, 0, 123, 2, 0, 0, 0, 0, 124, 78, 0, 125, 126, 127, 0, 0, 0, 0, 108, 1, 2, 3, 17, 44, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 129, 130, 131, 0, 0, 0, 0, 0, 0, 32, 132, 126, 0, 78, 133, 0, 0, 28, 134, 0, 0, 78, 135, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 138, 139, 140, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 32, 6, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 142, }; static RE_UINT8 re_case_ignorable_stage_5[] = { 0, 0, 0, 0, 128, 64, 0, 4, 0, 0, 0, 64, 1, 0, 0, 0, 0, 161, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 48, 4, 176, 0, 0, 0, 248, 3, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 16, 0, 31, 0, 255, 23, 1, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 191, 255, 61, 0, 0, 0, 128, 2, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 4, 0, 0, 192, 255, 255, 63, 0, 0, 0, 0, 0, 14, 240, 255, 255, 127, 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 16, 30, 32, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 0, 0, 0, 144, 30, 32, 64, 0, 4, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 192, 193, 61, 96, 0, 64, 48, 0, 0, 0, 4, 92, 0, 0, 0, 242, 7, 192, 127, 0, 0, 0, 0, 242, 27, 64, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 143, 32, 0, 120, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 128, 0, 0, 0, 15, 0, 0, 0, 0, 0, 208, 23, 0, 248, 15, 0, 3, 0, 0, 0, 60, 11, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 0, 63, 0, 0, 247, 255, 253, 33, 16, 0, 0, 240, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 127, 0, 0, 240, 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, 0, 248, 0, 3, 144, 124, 0, 0, 223, 255, 2, 128, 0, 0, 255, 31, 255, 255, 1, 0, 0, 0, 0, 48, 0, 128, 3, 0, 0, 128, 0, 128, 0, 128, 0, 0, 32, 0, 0, 0, 0, 60, 62, 8, 0, 0, 0, 126, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, 0, 128, 247, 191, 0, 0, 0, 128, 0, 0, 3, 0, 0, 7, 0, 0, 68, 8, 0, 0, 96, 0, 0, 0, 16, 0, 0, 0, 255, 255, 3, 0, 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 19, 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, 2, 0, 0, 32, 0, 48, 88, 0, 32, 33, 0, 0, 0, 0, 252, 255, 255, 255, 8, 0, 127, 0, 0, 0, 0, 0, 36, 0, 8, 0, 0, 14, 0, 0, 0, 32, 110, 240, 0, 0, 0, 0, 0, 135, 0, 0, 0, 255, 0, 0, 120, 38, 128, 239, 31, 0, 0, 0, 192, 127, 0, 40, 191, 0, 0, 128, 255, 255, 128, 3, 248, 255, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 0, 0, }; /* Case_Ignorable: 1254 bytes. */ RE_UINT32 re_get_case_ignorable(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_case_ignorable_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_case_ignorable_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_case_ignorable_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_case_ignorable_stage_4[pos + f] << 5; pos += code; value = (re_case_ignorable_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Lowercased. */ static RE_UINT8 re_changes_when_lowercased_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_lowercased_stage_2[] = { 0, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_lowercased_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 15, 6, 6, 6, 6, 16, 6, 6, 6, }; static RE_UINT8 re_changes_when_lowercased_stage_4[] = { 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 24, 0, 3, 3, 3, 3, 25, 3, 3, 3, 26, 27, 28, 29, 27, 30, 31, 32, 0, 33, 0, 19, 34, 0, 0, 0, 0, 0, 0, 0, 0, 35, 19, 0, 18, 36, 0, 37, 3, 3, 3, 38, 0, 0, 3, 39, 40, 0, 0, 0, 0, 41, 3, 42, 43, 44, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 18, 45, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_lowercased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, 122, 85, 0, 0, 0, 0, 69, 0, 64, 215, 254, 255, 251, 15, 0, 0, 0, 128, 0, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, 85, 0, 254, 255, 255, 255, 127, 0, 191, 32, 0, 0, 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, 0, 255, 0, 31, 0, 31, 0, 15, 0, 31, 0, 31, 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 0, 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 5, 0, 85, 5, 0, 0, 255, 0, 0, 0, }; /* Changes_When_Lowercased: 490 bytes. */ RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_lowercased_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_lowercased_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_lowercased_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_lowercased_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_lowercased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Uppercased. */ static RE_UINT8 re_changes_when_uppercased_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_uppercased_stage_2[] = { 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_uppercased_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 13, 6, 6, 6, 6, 6, 6, 6, 6, 14, 15, 6, 6, 6, 16, 6, 6, 6, 17, 6, 6, 6, 6, 18, 6, 6, 6, }; static RE_UINT8 re_changes_when_uppercased_stage_4[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 5, 5, 5, 5, 31, 5, 5, 5, 32, 33, 34, 35, 24, 36, 37, 38, 0, 0, 39, 23, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 41, 0, 23, 42, 43, 5, 5, 5, 44, 24, 45, 0, 0, 0, 0, 0, 0, 0, 0, 5, 46, 47, 0, 0, 0, 0, 48, 5, 49, 50, 51, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_uppercased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 96, 91, 85, 181, 170, 170, 45, 170, 168, 170, 10, 144, 133, 170, 223, 10, 105, 139, 38, 32, 9, 31, 4, 0, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 39, 9, 0, 0, 255, 255, 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 0, 0, 0, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 34, 170, 170, 234, 15, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 255, 223, 80, 220, 16, 207, 0, 255, 0, 220, 16, 0, 64, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 0, 168, 170, 168, 170, 170, 170, 0, 148, 170, 16, 10, 0, 170, 2, 0, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, }; /* Changes_When_Uppercased: 534 bytes. */ RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_uppercased_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_uppercased_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_uppercased_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_uppercased_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_uppercased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Titlecased. */ static RE_UINT8 re_changes_when_titlecased_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_titlecased_stage_2[] = { 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_titlecased_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 13, 6, 6, 6, 6, 6, 6, 6, 6, 14, 15, 6, 6, 6, 16, 6, 6, 6, 17, 6, 6, 6, 6, 18, 6, 6, 6, }; static RE_UINT8 re_changes_when_titlecased_stage_4[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 5, 5, 5, 5, 31, 5, 5, 5, 32, 33, 34, 35, 33, 36, 37, 38, 0, 0, 39, 23, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 41, 0, 23, 42, 43, 5, 5, 5, 44, 24, 45, 0, 0, 0, 0, 0, 0, 0, 0, 5, 46, 47, 0, 0, 0, 0, 48, 5, 49, 50, 51, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_titlecased_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 208, 86, 85, 181, 170, 170, 43, 170, 168, 170, 10, 144, 133, 170, 223, 10, 105, 139, 38, 32, 9, 31, 4, 0, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 39, 9, 0, 0, 255, 255, 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 0, 0, 0, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 34, 170, 170, 234, 15, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, 255, 0, 220, 0, 0, 64, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 0, 168, 170, 168, 170, 170, 170, 0, 148, 170, 16, 10, 0, 170, 2, 0, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, }; /* Changes_When_Titlecased: 534 bytes. */ RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_titlecased_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_titlecased_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_titlecased_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_titlecased_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_titlecased_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Casefolded. */ static RE_UINT8 re_changes_when_casefolded_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_casefolded_stage_2[] = { 0, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_casefolded_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 15, 6, 6, 6, 16, 6, 6, 6, 6, 17, 6, 6, 6, }; static RE_UINT8 re_changes_when_casefolded_stage_4[] = { 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 27, 0, 4, 4, 4, 4, 28, 4, 4, 4, 29, 30, 31, 32, 20, 33, 34, 35, 0, 36, 0, 21, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 21, 0, 20, 39, 0, 40, 4, 4, 4, 41, 0, 0, 4, 42, 43, 0, 0, 0, 0, 44, 4, 45, 46, 47, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 49, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_casefolded_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, 85, 85, 85, 85, 85, 85, 85, 170, 170, 86, 85, 85, 85, 85, 85, 171, 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, 122, 85, 0, 0, 32, 0, 0, 0, 0, 0, 69, 0, 64, 215, 254, 255, 251, 15, 0, 0, 4, 128, 99, 85, 85, 85, 179, 230, 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, 85, 0, 254, 255, 255, 255, 127, 0, 128, 0, 0, 0, 191, 32, 0, 0, 85, 85, 21, 76, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, 255, 255, 156, 31, 156, 31, 0, 15, 0, 31, 156, 31, 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 0, 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 5, 0, 85, 5, 0, 0, 127, 0, 248, 0, 255, 0, 0, 0, }; /* Changes_When_Casefolded: 514 bytes. */ RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_casefolded_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_casefolded_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_casefolded_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_casefolded_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_casefolded_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Changes_When_Casemapped. */ static RE_UINT8 re_changes_when_casemapped_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_changes_when_casemapped_stage_2[] = { 0, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_changes_when_casemapped_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 10, 6, 11, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 17, 6, 6, 6, 18, 6, 6, 6, 6, 19, 6, 6, 6, }; static RE_UINT8 re_changes_when_casemapped_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 5, 4, 4, 6, 7, 8, 4, 4, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 4, 4, 4, 4, 19, 4, 4, 4, 4, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 0, 0, 0, 0, 25, 0, 0, 0, 0, 4, 4, 4, 4, 26, 4, 4, 4, 27, 4, 28, 29, 4, 30, 31, 32, 0, 33, 34, 4, 35, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 37, 4, 38, 39, 40, 4, 4, 4, 41, 4, 24, 0, 0, 0, 0, 0, 0, 0, 0, 4, 42, 43, 0, 0, 0, 0, 44, 4, 45, 46, 47, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 4, 4, 49, 0, 0, 0, 0, 0, }; static RE_UINT8 re_changes_when_casemapped_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179, 240, 255, 255, 255, 253, 255, 15, 252, 255, 255, 223, 10, 105, 139, 38, 32, 9, 31, 4, 0, 32, 0, 0, 0, 0, 0, 207, 56, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 183, 239, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, 191, 32, 0, 0, 0, 0, 0, 34, 255, 255, 255, 79, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 64, 12, 4, 0, 0, 64, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192, 15, 120, 12, 0, 255, 63, 0, 0, 255, 255, 255, 0, 252, 255, 252, 255, 255, 255, 0, 254, 255, 56, 15, 0, 255, 7, 0, 0, 127, 0, 248, 0, 255, 255, 0, 0, }; /* Changes_When_Casemapped: 530 bytes. */ RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_changes_when_casemapped_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_changes_when_casemapped_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_changes_when_casemapped_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_changes_when_casemapped_stage_4[pos + f] << 5; pos += code; value = (re_changes_when_casemapped_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* ID_Start. */ static RE_UINT8 re_id_start_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_id_start_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_id_start_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, 51, 52, 53, 54, 55, 31, 31, 31, 56, 57, 58, 59, 60, 31, 31, 31, 61, 62, 31, 31, 31, 31, 63, 31, 1, 1, 1, 64, 65, 31, 31, 31, 1, 1, 1, 1, 66, 31, 31, 31, 1, 1, 67, 31, 31, 31, 31, 68, 69, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 70, 71, 72, 73, 31, 31, 31, 31, 31, 31, 74, 31, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, 1, 76, 77, 31, 31, 31, 31, 31, 31, 31, 1, 1, 77, 31, 31, 31, 31, 31, }; static RE_UINT8 re_id_start_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 14, 15, 0, 16, 17, 0, 4, 18, 19, 4, 4, 20, 21, 22, 23, 24, 4, 4, 25, 26, 27, 28, 29, 30, 0, 0, 31, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 36, 45, 48, 49, 50, 51, 46, 0, 52, 53, 54, 47, 52, 53, 55, 56, 52, 57, 58, 59, 60, 61, 62, 0, 14, 63, 62, 0, 64, 65, 66, 0, 67, 0, 68, 69, 70, 0, 0, 0, 4, 71, 72, 73, 74, 4, 75, 76, 4, 4, 77, 4, 78, 79, 80, 4, 81, 4, 82, 0, 23, 4, 4, 83, 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 84, 1, 4, 4, 85, 86, 87, 87, 88, 4, 89, 90, 0, 0, 4, 4, 91, 4, 92, 4, 93, 94, 0, 16, 95, 4, 96, 97, 0, 98, 4, 83, 0, 0, 99, 0, 0, 100, 89, 101, 0, 102, 103, 4, 104, 4, 105, 106, 107, 0, 0, 0, 108, 4, 4, 4, 4, 4, 4, 0, 0, 109, 4, 110, 107, 4, 111, 112, 113, 0, 0, 0, 114, 115, 0, 0, 0, 116, 117, 118, 4, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 120, 121, 4, 4, 4, 4, 122, 4, 75, 4, 123, 98, 124, 124, 0, 125, 126, 14, 4, 127, 14, 4, 76, 100, 128, 4, 4, 129, 82, 0, 16, 4, 4, 4, 4, 4, 93, 0, 0, 4, 4, 4, 4, 4, 4, 69, 0, 4, 4, 4, 4, 69, 0, 16, 107, 130, 131, 4, 132, 91, 4, 4, 23, 133, 134, 4, 4, 135, 18, 0, 136, 137, 138, 4, 89, 134, 89, 0, 139, 26, 140, 62, 94, 32, 141, 142, 0, 4, 119, 143, 144, 4, 145, 146, 147, 148, 149, 0, 0, 0, 0, 4, 138, 4, 4, 4, 4, 4, 150, 151, 152, 4, 4, 4, 153, 4, 4, 154, 0, 155, 156, 157, 4, 4, 87, 158, 4, 4, 107, 16, 4, 159, 4, 15, 160, 0, 0, 0, 161, 4, 4, 4, 94, 0, 1, 1, 162, 4, 121, 163, 0, 164, 165, 166, 0, 4, 4, 4, 82, 0, 0, 4, 83, 0, 0, 0, 0, 0, 0, 0, 0, 94, 4, 167, 0, 121, 16, 18, 0, 107, 4, 168, 0, 4, 4, 4, 4, 107, 0, 0, 0, 169, 170, 93, 0, 0, 0, 0, 0, 93, 154, 0, 0, 4, 171, 0, 0, 172, 89, 0, 94, 0, 0, 0, 0, 4, 93, 93, 141, 0, 0, 0, 0, 4, 4, 119, 0, 0, 0, 0, 0, 102, 91, 0, 0, 102, 23, 16, 119, 102, 62, 0, 0, 102, 141, 173, 0, 0, 0, 0, 0, 4, 18, 0, 0, 4, 4, 4, 129, 0, 0, 0, 0, 4, 4, 4, 138, 0, 0, 0, 0, 4, 129, 0, 0, 0, 0, 0, 0, 4, 30, 0, 0, 0, 0, 0, 0, 4, 4, 174, 0, 158, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 4, 4, 175, 4, 176, 177, 178, 4, 179, 180, 181, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 182, 183, 76, 175, 175, 120, 120, 184, 184, 143, 0, 178, 185, 186, 187, 188, 189, 0, 0, 4, 4, 4, 4, 4, 4, 98, 0, 4, 83, 4, 4, 4, 4, 4, 4, 107, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_id_start_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 60, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 7, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, 16, 1, 0, 0, 255, 255, 255, 1, 253, 31, 0, 0, 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 254, 224, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 0, 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 3, 0, 0, 0, 64, 3, 0, 6, 0, 255, 255, 255, 39, 0, 64, 0, 0, 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, 255, 255, 13, 0, 150, 37, 240, 254, 174, 236, 13, 32, 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 255, 255, 0, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 31, 255, 63, 31, 0, 255, 15, 0, 0, 254, 0, 0, 0, 255, 255, 127, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, 0, 222, 99, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 248, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 0, 0, 0, 255, 187, 247, 255, 255, 7, 0, 0, 0, 0, 0, 252, 8, 63, 0, 255, 255, 255, 255, 7, 0, 0, 128, 0, 0, 247, 15, 0, 0, 255, 255, 127, 4, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, 127, 127, 0, 0, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 1, 0, 239, 254, 30, 0, 0, 0, 31, 0, 1, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* ID_Start: 1753 bytes. */ RE_UINT32 re_get_id_start(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_id_start_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_id_start_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_id_start_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_id_start_stage_4[pos + f] << 5; pos += code; value = (re_id_start_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* ID_Continue. */ static RE_UINT8 re_id_continue_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, }; static RE_UINT8 re_id_continue_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_id_continue_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, 51, 52, 53, 54, 55, 31, 31, 31, 56, 57, 58, 59, 60, 31, 31, 31, 61, 62, 31, 31, 31, 31, 63, 31, 1, 1, 1, 64, 65, 31, 31, 31, 1, 1, 1, 1, 66, 31, 31, 31, 1, 1, 67, 31, 31, 31, 31, 68, 69, 31, 31, 31, 31, 31, 31, 31, 31, 70, 71, 31, 72, 73, 74, 75, 31, 31, 31, 31, 31, 31, 76, 31, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 78, 79, 31, 31, 31, 31, 31, 31, 31, 1, 1, 79, 31, 31, 31, 31, 31, 31, 80, 31, 31, 31, 31, 31, 31, }; static RE_UINT8 re_id_continue_stage_4[] = { 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 16, 14, 17, 18, 19, 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, 6, 28, 29, 0, 0, 30, 0, 31, 6, 6, 6, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 42, 45, 46, 47, 48, 49, 50, 51, 52, 53, 44, 54, 55, 56, 57, 54, 58, 59, 60, 61, 62, 63, 64, 16, 65, 66, 0, 67, 68, 69, 0, 70, 71, 72, 73, 74, 75, 76, 0, 6, 6, 77, 6, 78, 6, 79, 80, 6, 6, 81, 6, 82, 83, 84, 6, 85, 6, 58, 86, 87, 6, 6, 88, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, 3, 6, 6, 90, 91, 88, 92, 93, 6, 6, 94, 95, 96, 6, 6, 97, 6, 98, 6, 99, 75, 100, 101, 102, 6, 103, 104, 0, 29, 6, 105, 106, 107, 108, 0, 0, 6, 6, 109, 110, 6, 6, 6, 92, 6, 97, 111, 78, 0, 0, 112, 113, 6, 6, 6, 6, 6, 6, 6, 114, 115, 6, 116, 78, 6, 117, 118, 119, 0, 120, 121, 122, 123, 0, 123, 124, 125, 126, 127, 6, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 129, 105, 6, 6, 6, 6, 130, 6, 79, 6, 131, 113, 132, 132, 6, 133, 134, 16, 6, 135, 16, 6, 80, 136, 137, 6, 6, 138, 65, 0, 24, 6, 6, 6, 6, 6, 99, 0, 0, 6, 6, 6, 6, 6, 6, 139, 0, 6, 6, 6, 6, 139, 0, 24, 78, 140, 141, 6, 142, 143, 6, 6, 26, 144, 145, 6, 6, 146, 147, 0, 148, 6, 149, 6, 92, 6, 6, 150, 151, 6, 152, 92, 75, 6, 6, 153, 0, 6, 113, 154, 155, 6, 6, 156, 157, 158, 159, 0, 0, 0, 0, 6, 160, 6, 6, 6, 6, 6, 161, 162, 29, 6, 6, 6, 152, 6, 6, 163, 0, 164, 165, 166, 6, 6, 26, 167, 6, 6, 78, 24, 6, 168, 6, 149, 169, 87, 170, 171, 172, 6, 6, 6, 75, 1, 2, 3, 101, 6, 105, 173, 0, 174, 175, 176, 0, 6, 6, 6, 65, 0, 0, 6, 88, 0, 0, 0, 177, 0, 0, 0, 0, 75, 6, 178, 0, 105, 24, 147, 0, 78, 6, 179, 0, 6, 6, 6, 6, 78, 95, 0, 0, 180, 181, 99, 0, 0, 0, 0, 0, 99, 163, 0, 0, 6, 182, 0, 0, 183, 184, 0, 75, 0, 0, 0, 0, 6, 99, 99, 185, 0, 0, 0, 0, 6, 6, 128, 0, 0, 0, 0, 0, 6, 6, 186, 50, 6, 65, 24, 187, 6, 188, 0, 0, 6, 6, 150, 0, 0, 0, 0, 0, 6, 97, 95, 0, 6, 6, 6, 138, 0, 0, 0, 0, 6, 6, 6, 189, 0, 0, 0, 0, 6, 138, 0, 0, 0, 0, 0, 0, 6, 190, 0, 0, 0, 0, 0, 0, 6, 6, 191, 105, 192, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, 196, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 6, 6, 188, 6, 198, 199, 200, 6, 201, 202, 203, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 204, 205, 80, 188, 188, 129, 129, 206, 206, 207, 6, 200, 208, 209, 210, 211, 212, 0, 0, 6, 6, 6, 6, 6, 6, 113, 0, 6, 88, 6, 6, 6, 6, 6, 6, 78, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 87, }; static RE_UINT8 re_id_continue_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 255, 255, 223, 60, 192, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 251, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 7, 7, 0, 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 4, 255, 63, 0, 0, 255, 255, 255, 15, 253, 31, 0, 0, 240, 255, 255, 127, 207, 255, 254, 254, 238, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, 207, 255, 3, 0, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, 207, 255, 0, 0, 159, 57, 192, 176, 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 0, 0, 238, 223, 253, 255, 255, 253, 239, 227, 223, 61, 96, 3, 236, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 255, 255, 255, 231, 223, 125, 128, 0, 207, 255, 0, 252, 236, 255, 127, 252, 255, 255, 251, 47, 127, 132, 95, 255, 0, 0, 12, 0, 255, 255, 255, 7, 255, 127, 255, 3, 150, 37, 240, 254, 174, 236, 255, 59, 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 0, 254, 3, 0, 255, 255, 0, 0, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 0, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 127, 255, 255, 255, 159, 255, 3, 255, 3, 128, 0, 0, 0, 255, 15, 255, 3, 0, 248, 15, 0, 255, 227, 255, 255, 0, 0, 247, 255, 255, 255, 127, 0, 127, 0, 0, 240, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 31, 248, 15, 0, 255, 128, 0, 128, 127, 127, 127, 127, 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 254, 224, 255, 255, 255, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, 255, 255, 240, 191, 255, 255, 255, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 255, 7, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 31, 0, 255, 3, 255, 255, 255, 8, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, 255, 255, 127, 12, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, 127, 127, 0, 0, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 127, 0, 24, 0, 0, 224, 0, 0, 0, 0, 223, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 15, 135, 255, 255, 7, 0, 127, 0, 0, 0, 255, 1, 255, 3, 255, 255, 223, 255, 7, 0, 0, 0, 255, 255, 255, 1, 31, 0, 255, 255, 0, 128, 255, 255, 3, 0, 0, 0, 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* ID_Continue: 1894 bytes. */ RE_UINT32 re_get_id_continue(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_id_continue_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_id_continue_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_id_continue_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_id_continue_stage_4[pos + f] << 5; pos += code; value = (re_id_continue_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* XID_Start. */ static RE_UINT8 re_xid_start_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_xid_start_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_xid_start_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 31, 31, 31, 57, 58, 59, 60, 61, 31, 31, 31, 62, 63, 31, 31, 31, 31, 64, 31, 1, 1, 1, 65, 66, 31, 31, 31, 1, 1, 1, 1, 67, 31, 31, 31, 1, 1, 68, 31, 31, 31, 31, 69, 70, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 71, 72, 73, 74, 31, 31, 31, 31, 31, 31, 75, 31, 1, 1, 1, 1, 1, 1, 76, 1, 1, 1, 1, 1, 1, 1, 1, 77, 78, 31, 31, 31, 31, 31, 31, 31, 1, 1, 78, 31, 31, 31, 31, 31, }; static RE_UINT8 re_xid_start_stage_4[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 14, 15, 0, 16, 17, 0, 4, 18, 19, 4, 4, 20, 21, 22, 23, 24, 4, 4, 25, 26, 27, 28, 29, 30, 0, 0, 31, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 36, 45, 48, 49, 50, 51, 46, 0, 52, 53, 54, 47, 52, 53, 55, 56, 52, 57, 58, 59, 60, 61, 62, 0, 14, 63, 62, 0, 64, 65, 66, 0, 67, 0, 68, 69, 70, 0, 0, 0, 4, 71, 72, 73, 74, 4, 75, 76, 4, 4, 77, 4, 78, 79, 80, 4, 81, 4, 82, 0, 23, 4, 4, 83, 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 84, 1, 4, 4, 85, 86, 87, 87, 88, 4, 89, 90, 0, 0, 4, 4, 91, 4, 92, 4, 93, 94, 0, 16, 95, 4, 96, 97, 0, 98, 4, 83, 0, 0, 99, 0, 0, 100, 89, 101, 0, 102, 103, 4, 104, 4, 105, 106, 107, 0, 0, 0, 108, 4, 4, 4, 4, 4, 4, 0, 0, 109, 4, 110, 107, 4, 111, 112, 113, 0, 0, 0, 114, 115, 0, 0, 0, 116, 117, 118, 4, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 120, 121, 4, 4, 4, 4, 122, 4, 75, 4, 123, 98, 124, 124, 0, 125, 126, 14, 4, 127, 14, 4, 76, 100, 128, 4, 4, 129, 82, 0, 16, 4, 4, 4, 4, 4, 93, 0, 0, 4, 4, 4, 4, 4, 4, 69, 0, 4, 4, 4, 4, 69, 0, 16, 107, 130, 131, 4, 132, 91, 4, 4, 23, 133, 134, 4, 4, 135, 18, 0, 136, 137, 138, 4, 89, 134, 89, 0, 139, 26, 140, 62, 94, 32, 141, 142, 0, 4, 119, 143, 144, 4, 145, 146, 147, 148, 149, 0, 0, 0, 0, 4, 138, 4, 4, 4, 4, 4, 150, 151, 152, 4, 4, 4, 153, 4, 4, 154, 0, 155, 156, 157, 4, 4, 87, 158, 4, 4, 4, 107, 32, 4, 4, 4, 4, 4, 107, 16, 4, 159, 4, 15, 160, 0, 0, 0, 161, 4, 4, 4, 94, 0, 1, 1, 162, 107, 121, 163, 0, 164, 165, 166, 0, 4, 4, 4, 82, 0, 0, 4, 83, 0, 0, 0, 0, 0, 0, 0, 0, 94, 4, 167, 0, 121, 16, 18, 0, 107, 4, 168, 0, 4, 4, 4, 4, 107, 0, 0, 0, 169, 170, 93, 0, 0, 0, 0, 0, 93, 154, 0, 0, 4, 171, 0, 0, 172, 89, 0, 94, 0, 0, 0, 0, 4, 93, 93, 141, 0, 0, 0, 0, 4, 4, 119, 0, 0, 0, 0, 0, 102, 91, 0, 0, 102, 23, 16, 119, 102, 62, 0, 0, 102, 141, 173, 0, 0, 0, 0, 0, 4, 18, 0, 0, 4, 4, 4, 129, 0, 0, 0, 0, 4, 4, 4, 138, 0, 0, 0, 0, 4, 129, 0, 0, 0, 0, 0, 0, 4, 30, 0, 0, 0, 0, 0, 0, 4, 4, 174, 0, 158, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 4, 4, 175, 4, 176, 177, 178, 4, 179, 180, 181, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 182, 183, 76, 175, 175, 120, 120, 184, 184, 143, 0, 178, 185, 186, 187, 188, 189, 0, 0, 4, 4, 4, 4, 4, 4, 98, 0, 4, 83, 4, 4, 4, 4, 4, 4, 107, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_xid_start_stage_5[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 56, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 7, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, 16, 1, 0, 0, 255, 255, 255, 1, 253, 31, 0, 0, 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 254, 224, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 0, 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 3, 0, 0, 0, 64, 3, 0, 6, 0, 255, 255, 255, 39, 0, 64, 0, 0, 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, 255, 255, 5, 0, 150, 37, 240, 254, 174, 236, 5, 32, 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 255, 255, 0, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 31, 255, 63, 31, 0, 255, 15, 0, 0, 254, 0, 0, 0, 255, 255, 127, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, 0, 222, 99, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 0, 0, 0, 255, 187, 247, 255, 255, 7, 0, 0, 0, 0, 0, 252, 8, 63, 0, 255, 255, 255, 255, 7, 0, 0, 128, 0, 0, 247, 15, 0, 0, 255, 255, 127, 4, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, 127, 127, 0, 0, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 3, 0, 0, 138, 170, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 1, 0, 239, 254, 30, 0, 0, 0, 31, 0, 1, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* XID_Start: 1761 bytes. */ RE_UINT32 re_get_xid_start(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_xid_start_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_xid_start_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_xid_start_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_xid_start_stage_4[pos + f] << 5; pos += code; value = (re_xid_start_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* XID_Continue. */ static RE_UINT8 re_xid_continue_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, }; static RE_UINT8 re_xid_continue_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 13, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 25, 26, 13, 13, 13, 13, 13, 13, 13, 27, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_xid_continue_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 31, 31, 31, 57, 58, 59, 60, 61, 31, 31, 31, 62, 63, 31, 31, 31, 31, 64, 31, 1, 1, 1, 65, 66, 31, 31, 31, 1, 1, 1, 1, 67, 31, 31, 31, 1, 1, 68, 31, 31, 31, 31, 69, 70, 31, 31, 31, 31, 31, 31, 31, 31, 71, 72, 31, 73, 74, 75, 76, 31, 31, 31, 31, 31, 31, 77, 31, 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 79, 80, 31, 31, 31, 31, 31, 31, 31, 1, 1, 80, 31, 31, 31, 31, 31, 31, 81, 31, 31, 31, 31, 31, 31, }; static RE_UINT8 re_xid_continue_stage_4[] = { 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 16, 14, 17, 18, 19, 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, 6, 28, 29, 0, 0, 30, 0, 31, 6, 6, 6, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 42, 45, 46, 47, 48, 49, 50, 51, 52, 53, 44, 54, 55, 56, 57, 54, 58, 59, 60, 61, 62, 63, 64, 16, 65, 66, 0, 67, 68, 69, 0, 70, 71, 72, 73, 74, 75, 76, 0, 6, 6, 77, 6, 78, 6, 79, 80, 6, 6, 81, 6, 82, 83, 84, 6, 85, 6, 58, 86, 87, 6, 6, 88, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, 3, 6, 6, 90, 91, 88, 92, 93, 6, 6, 94, 95, 96, 6, 6, 97, 6, 98, 6, 99, 75, 100, 101, 102, 6, 103, 104, 0, 29, 6, 105, 106, 107, 108, 0, 0, 6, 6, 109, 110, 6, 6, 6, 92, 6, 97, 111, 78, 0, 0, 112, 113, 6, 6, 6, 6, 6, 6, 6, 114, 115, 6, 116, 78, 6, 117, 118, 119, 0, 120, 121, 122, 123, 0, 123, 124, 125, 126, 127, 6, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 129, 105, 6, 6, 6, 6, 130, 6, 79, 6, 131, 113, 132, 132, 6, 133, 134, 16, 6, 135, 16, 6, 80, 136, 137, 6, 6, 138, 65, 0, 24, 6, 6, 6, 6, 6, 99, 0, 0, 6, 6, 6, 6, 6, 6, 139, 0, 6, 6, 6, 6, 139, 0, 24, 78, 140, 141, 6, 142, 143, 6, 6, 26, 144, 145, 6, 6, 146, 147, 0, 148, 6, 149, 6, 92, 6, 6, 150, 151, 6, 152, 92, 75, 6, 6, 153, 0, 6, 113, 154, 155, 6, 6, 156, 157, 158, 159, 0, 0, 0, 0, 6, 160, 6, 6, 6, 6, 6, 161, 162, 29, 6, 6, 6, 152, 6, 6, 163, 0, 164, 165, 166, 6, 6, 26, 167, 6, 6, 6, 78, 168, 6, 6, 6, 6, 6, 78, 24, 6, 169, 6, 149, 1, 87, 170, 171, 172, 6, 6, 6, 75, 1, 2, 3, 101, 6, 105, 173, 0, 174, 175, 176, 0, 6, 6, 6, 65, 0, 0, 6, 88, 0, 0, 0, 177, 0, 0, 0, 0, 75, 6, 178, 0, 105, 24, 147, 0, 78, 6, 179, 0, 6, 6, 6, 6, 78, 95, 0, 0, 180, 181, 99, 0, 0, 0, 0, 0, 99, 163, 0, 0, 6, 182, 0, 0, 183, 184, 0, 75, 0, 0, 0, 0, 6, 99, 99, 185, 0, 0, 0, 0, 6, 6, 128, 0, 0, 0, 0, 0, 6, 6, 186, 50, 6, 65, 24, 187, 6, 188, 0, 0, 6, 6, 150, 0, 0, 0, 0, 0, 6, 97, 95, 0, 6, 6, 6, 138, 0, 0, 0, 0, 6, 6, 6, 189, 0, 0, 0, 0, 6, 138, 0, 0, 0, 0, 0, 0, 6, 190, 0, 0, 0, 0, 0, 0, 6, 6, 191, 105, 192, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, 196, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 6, 6, 188, 6, 198, 199, 200, 6, 201, 202, 203, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 204, 205, 80, 188, 188, 129, 129, 206, 206, 207, 6, 200, 208, 209, 210, 211, 212, 0, 0, 6, 6, 6, 6, 6, 6, 113, 0, 6, 88, 6, 6, 6, 6, 6, 6, 78, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 87, }; static RE_UINT8 re_xid_continue_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 255, 255, 223, 56, 192, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 251, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 2, 254, 255, 255, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 7, 7, 0, 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 4, 255, 63, 0, 0, 255, 255, 255, 15, 253, 31, 0, 0, 240, 255, 255, 127, 207, 255, 254, 254, 238, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, 207, 255, 3, 0, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, 207, 255, 0, 0, 159, 57, 192, 176, 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 0, 0, 238, 223, 253, 255, 255, 253, 239, 227, 223, 61, 96, 3, 236, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 255, 255, 255, 231, 223, 125, 128, 0, 207, 255, 0, 252, 236, 255, 127, 252, 255, 255, 251, 47, 127, 132, 95, 255, 0, 0, 12, 0, 255, 255, 255, 7, 255, 127, 255, 3, 150, 37, 240, 254, 174, 236, 255, 59, 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 0, 254, 3, 0, 255, 255, 0, 0, 255, 255, 31, 0, 255, 159, 255, 255, 255, 199, 1, 0, 255, 223, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 0, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 127, 255, 255, 255, 159, 255, 3, 255, 3, 128, 0, 0, 0, 255, 15, 255, 3, 0, 248, 15, 0, 255, 227, 255, 255, 0, 0, 247, 255, 255, 255, 127, 0, 127, 0, 0, 240, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, 31, 248, 15, 0, 255, 128, 0, 128, 127, 127, 127, 127, 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 230, 224, 255, 255, 255, 255, 63, 254, 255, 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, 255, 255, 240, 191, 255, 255, 255, 128, 0, 0, 128, 255, 252, 255, 255, 255, 255, 121, 15, 0, 255, 7, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 31, 0, 255, 3, 255, 255, 255, 8, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, 255, 255, 127, 12, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, 127, 127, 0, 0, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 240, 255, 255, 255, 255, 255, 252, 255, 127, 0, 24, 0, 0, 224, 0, 0, 0, 0, 138, 170, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, 255, 255, 1, 0, 15, 255, 62, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 15, 135, 255, 255, 7, 0, 127, 0, 0, 0, 255, 1, 255, 3, 255, 255, 223, 255, 7, 0, 0, 0, 255, 255, 255, 1, 31, 0, 255, 255, 0, 128, 255, 255, 3, 0, 0, 0, 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* XID_Continue: 1902 bytes. */ RE_UINT32 re_get_xid_continue(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_xid_continue_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_xid_continue_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_xid_continue_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_xid_continue_stage_4[pos + f] << 5; pos += code; value = (re_xid_continue_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Default_Ignorable_Code_Point. */ static RE_UINT8 re_default_ignorable_code_point_stage_1[] = { 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_default_ignorable_code_point_stage_2[] = { 0, 1, 2, 3, 4, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 7, 1, 1, 1, 1, 1, 8, 8, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_default_ignorable_code_point_stage_3[] = { 0, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 10, 1, 11, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, }; static RE_UINT8 re_default_ignorable_code_point_stage_4[] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, }; static RE_UINT8 re_default_ignorable_code_point_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 128, 0, 0, 0, 0, 0, 16, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 48, 0, 0, 120, 0, 0, 0, 248, 0, 0, 0, 124, 0, 0, 255, 255, 0, 0, 16, 0, 0, 0, 0, 0, 255, 1, 0, 0, 248, 7, 255, 255, 255, 255, }; /* Default_Ignorable_Code_Point: 344 bytes. */ RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 14; code = ch ^ (f << 14); pos = (RE_UINT32)re_default_ignorable_code_point_stage_1[f] << 3; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_default_ignorable_code_point_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_default_ignorable_code_point_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_default_ignorable_code_point_stage_4[pos + f] << 5; pos += code; value = (re_default_ignorable_code_point_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Grapheme_Extend. */ static RE_UINT8 re_grapheme_extend_stage_1[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, }; static RE_UINT8 re_grapheme_extend_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 11, 12, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }; static RE_UINT8 re_grapheme_extend_stage_3[] = { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 34, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 41, 42, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_grapheme_extend_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, 7, 0, 8, 9, 0, 0, 10, 11, 12, 13, 14, 0, 0, 15, 0, 16, 17, 18, 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 24, 28, 29, 30, 31, 28, 29, 32, 24, 25, 33, 34, 24, 35, 36, 37, 0, 0, 38, 39, 24, 0, 40, 41, 24, 0, 36, 27, 24, 0, 0, 42, 0, 0, 43, 44, 0, 0, 45, 46, 0, 47, 48, 0, 49, 50, 51, 52, 0, 0, 53, 54, 55, 56, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 58, 58, 59, 59, 0, 60, 61, 0, 62, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 65, 0, 66, 67, 0, 0, 0, 0, 68, 69, 35, 16, 70, 71, 0, 72, 0, 73, 0, 0, 0, 0, 74, 75, 0, 0, 0, 0, 0, 0, 1, 76, 77, 0, 0, 0, 0, 0, 13, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 1, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 0, 83, 80, 0, 0, 84, 85, 86, 0, 0, 0, 0, 87, 88, 0, 89, 90, 0, 21, 91, 0, 0, 0, 92, 93, 0, 0, 94, 25, 95, 0, 0, 0, 0, 0, 0, 0, 96, 36, 0, 0, 0, 0, 0, 0, 0, 2, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 100, 0, 0, 0, 0, 0, 0, 25, 101, 97, 0, 70, 102, 0, 0, 21, 103, 0, 0, 70, 104, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 107, 108, 109, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, }; static RE_UINT8 re_grapheme_extend_stage_5[] = { 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 248, 3, 0, 0, 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, 0, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 159, 159, 61, 0, 0, 0, 0, 2, 0, 0, 0, 255, 255, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 15, 0, 0, 0, 192, 251, 239, 62, 0, 0, 0, 0, 0, 14, 240, 255, 255, 127, 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 80, 30, 32, 128, 0, 6, 0, 0, 0, 0, 0, 0, 16, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 0, 0, 0, 208, 30, 32, 192, 0, 4, 0, 0, 0, 0, 0, 0, 64, 1, 32, 128, 0, 0, 0, 0, 192, 193, 61, 96, 0, 0, 0, 0, 144, 68, 48, 96, 0, 0, 132, 92, 128, 0, 0, 242, 7, 128, 127, 0, 0, 0, 0, 242, 27, 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 15, 32, 0, 56, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 15, 0, 0, 0, 0, 0, 208, 23, 3, 0, 0, 0, 60, 11, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 247, 255, 253, 33, 16, 0, 127, 0, 0, 240, 0, 48, 0, 0, 255, 255, 1, 0, 0, 128, 3, 0, 0, 0, 0, 128, 0, 252, 0, 0, 0, 0, 0, 6, 0, 128, 247, 63, 0, 0, 3, 0, 68, 8, 0, 0, 96, 0, 0, 0, 16, 0, 0, 0, 255, 255, 3, 0, 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 19, 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, 0, 48, 64, 0, 32, 33, 0, 0, 127, 0, 0, 0, 0, 0, 0, 32, 110, 240, 0, 0, 0, 0, 0, 135, 0, 0, 0, 255, 0, 0, 120, 6, 128, 239, 31, 0, 0, 0, 192, 127, 0, 40, 191, 0, 0, 128, 7, 0, 160, 195, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, }; /* Grapheme_Extend: 1062 bytes. */ RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_grapheme_extend_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_grapheme_extend_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_extend_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_grapheme_extend_stage_4[pos + f] << 5; pos += code; value = (re_grapheme_extend_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Grapheme_Base. */ static RE_UINT8 re_grapheme_base_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_grapheme_base_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, 15, 16, 17, 13, 18, 13, 19, 13, 13, 13, 13, 13, 13, 20, 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 22, 13, 13, 23, 24, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 26, 27, 13, 13, 13, 13, 13, 13, 13, 28, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }; static RE_UINT8 re_grapheme_base_stage_3[] = { 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 16, 17, 1, 1, 18, 19, 20, 21, 22, 23, 24, 25, 1, 26, 27, 28, 1, 29, 30, 1, 1, 31, 1, 1, 1, 32, 33, 34, 35, 36, 37, 38, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 42, 1, 43, 44, 45, 46, 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 1, 51, 52, 1, 53, 54, 55, 56, 57, 58, 59, 60, 50, 50, 50, 61, 62, 63, 64, 65, 50, 66, 50, 67, 68, 50, 50, 50, 50, 69, 50, 1, 1, 1, 70, 71, 50, 50, 50, 1, 1, 1, 1, 72, 50, 50, 50, 1, 1, 73, 50, 50, 50, 50, 74, 75, 50, 50, 50, 50, 50, 50, 50, 76, 77, 78, 79, 80, 81, 82, 83, 50, 50, 50, 50, 50, 50, 84, 50, 85, 86, 87, 88, 89, 90, 91, 92, 1, 1, 1, 1, 1, 1, 93, 1, 1, 1, 1, 1, 1, 1, 1, 94, 95, 50, 50, 50, 50, 50, 50, 50, 1, 1, 95, 50, 50, 50, 50, 50, }; static RE_UINT8 re_grapheme_base_stage_4[] = { 0, 1, 1, 2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 8, 9, 10, 11, 12, 13, 14, 15, 1, 16, 17, 1, 1, 18, 19, 20, 21, 22, 1, 1, 23, 1, 24, 25, 26, 27, 0, 0, 28, 0, 0, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 56, 60, 61, 62, 63, 64, 65, 66, 10, 67, 68, 0, 69, 70, 71, 0, 72, 73, 74, 75, 76, 77, 78, 0, 1, 79, 80, 81, 82, 1, 83, 1, 1, 1, 84, 1, 85, 86, 87, 1, 88, 1, 89, 90, 91, 1, 1, 92, 1, 1, 1, 1, 90, 1, 1, 93, 94, 95, 96, 97, 1, 98, 99, 100, 101, 1, 1, 102, 1, 103, 1, 104, 90, 105, 106, 107, 1, 108, 109, 1, 110, 1, 111, 112, 100, 113, 0, 0, 114, 115, 116, 117, 118, 119, 1, 120, 1, 121, 122, 1, 0, 0, 123, 124, 1, 1, 1, 1, 1, 1, 0, 0, 125, 1, 126, 127, 1, 128, 129, 130, 131, 132, 1, 133, 134, 89, 0, 0, 1, 1, 1, 1, 135, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 136, 1, 137, 16, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 138, 0, 0, 0, 0, 0, 1, 139, 2, 1, 1, 1, 1, 140, 1, 83, 1, 141, 142, 143, 143, 0, 1, 144, 0, 0, 145, 1, 1, 136, 1, 1, 1, 1, 1, 1, 104, 146, 1, 135, 10, 1, 147, 1, 1, 1, 148, 149, 1, 1, 139, 89, 1, 150, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 104, 1, 1, 1, 1, 1, 1, 1, 1, 151, 0, 1, 1, 1, 1, 152, 1, 153, 1, 1, 154, 1, 155, 102, 1, 1, 156, 1, 1, 1, 1, 157, 16, 0, 158, 159, 160, 1, 102, 1, 1, 161, 162, 1, 163, 164, 90, 29, 165, 166, 0, 1, 167, 168, 144, 1, 169, 170, 171, 172, 173, 0, 0, 0, 0, 1, 174, 1, 1, 1, 1, 1, 150, 175, 144, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 176, 1, 1, 91, 0, 177, 178, 179, 1, 1, 1, 180, 1, 1, 1, 181, 1, 182, 1, 183, 184, 185, 181, 186, 187, 1, 1, 1, 90, 10, 1, 1, 1, 127, 2, 188, 189, 190, 191, 192, 0, 1, 1, 1, 89, 193, 194, 1, 1, 195, 0, 181, 90, 0, 0, 0, 0, 90, 1, 93, 0, 2, 150, 16, 0, 196, 1, 197, 0, 1, 1, 1, 1, 127, 198, 0, 0, 199, 200, 201, 0, 0, 0, 0, 0, 202, 203, 0, 0, 1, 204, 0, 0, 205, 136, 206, 1, 0, 0, 0, 0, 1, 207, 208, 209, 0, 0, 0, 0, 1, 1, 210, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 211, 102, 212, 21, 118, 213, 214, 215, 29, 216, 217, 0, 118, 218, 215, 0, 0, 0, 0, 0, 1, 219, 198, 0, 1, 1, 1, 220, 0, 0, 0, 0, 1, 1, 1, 221, 0, 0, 0, 0, 1, 220, 0, 0, 0, 0, 0, 0, 1, 222, 0, 0, 0, 0, 0, 0, 1, 1, 223, 2, 224, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 104, 1, 226, 1, 227, 228, 229, 127, 0, 1, 1, 230, 0, 0, 0, 0, 0, 1, 1, 142, 96, 0, 0, 0, 0, 1, 1, 128, 1, 231, 232, 233, 1, 234, 235, 236, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 237, 1, 1, 1, 1, 1, 1, 1, 1, 238, 1, 233, 239, 240, 241, 242, 243, 0, 244, 1, 108, 1, 1, 136, 245, 246, 0, 131, 139, 1, 108, 89, 0, 0, 247, 248, 89, 249, 0, 0, 0, 0, 0, 1, 250, 1, 90, 136, 1, 251, 93, 1, 2, 211, 1, 1, 1, 1, 252, 1, 127, 150, 183, 0, 0, 0, 253, 1, 1, 254, 0, 1, 1, 255, 0, 1, 1, 1, 136, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 142, 0, 1, 92, 1, 1, 1, 1, 1, 1, 127, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_grapheme_base_stage_5[] = { 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 223, 255, 255, 0, 0, 255, 124, 240, 215, 255, 255, 251, 255, 255, 255, 7, 252, 255, 255, 255, 0, 254, 255, 255, 255, 127, 254, 254, 255, 255, 255, 255, 134, 0, 0, 0, 0, 0, 64, 73, 0, 255, 255, 255, 7, 31, 0, 192, 255, 0, 200, 255, 7, 0, 0, 255, 255, 254, 255, 255, 255, 63, 64, 96, 194, 255, 255, 255, 63, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 63, 0, 2, 0, 255, 7, 240, 7, 255, 255, 63, 4, 16, 1, 255, 127, 255, 255, 255, 65, 253, 31, 0, 0, 248, 255, 255, 255, 255, 255, 255, 235, 1, 222, 1, 255, 243, 255, 255, 254, 236, 159, 249, 255, 255, 253, 197, 163, 129, 89, 0, 176, 195, 255, 255, 15, 232, 135, 249, 255, 255, 253, 109, 195, 1, 0, 0, 94, 192, 255, 28, 0, 232, 191, 251, 255, 255, 253, 237, 227, 1, 26, 1, 0, 195, 255, 3, 0, 255, 253, 237, 35, 129, 25, 0, 176, 195, 255, 255, 0, 232, 199, 61, 214, 24, 199, 255, 131, 198, 29, 1, 0, 192, 255, 255, 7, 238, 223, 253, 255, 255, 253, 239, 35, 30, 0, 0, 3, 195, 255, 0, 255, 236, 223, 253, 255, 255, 253, 239, 99, 155, 13, 0, 64, 195, 255, 6, 0, 255, 255, 255, 167, 193, 93, 0, 0, 195, 255, 63, 254, 236, 255, 127, 252, 255, 255, 251, 47, 127, 0, 3, 127, 0, 0, 28, 0, 255, 255, 13, 128, 127, 128, 255, 15, 150, 37, 240, 254, 174, 236, 13, 32, 95, 0, 255, 243, 255, 255, 255, 252, 255, 255, 95, 253, 255, 254, 255, 255, 255, 31, 0, 128, 32, 31, 0, 0, 0, 0, 0, 192, 191, 223, 255, 7, 255, 31, 2, 153, 255, 255, 255, 60, 254, 255, 225, 255, 155, 223, 255, 223, 191, 32, 255, 255, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 31, 0, 255, 255, 1, 0, 255, 223, 3, 0, 255, 255, 99, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 79, 192, 191, 1, 240, 31, 255, 3, 255, 3, 255, 7, 255, 3, 255, 255, 255, 0, 255, 5, 255, 255, 255, 255, 63, 0, 120, 14, 251, 1, 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, 255, 255, 127, 198, 255, 255, 191, 0, 26, 224, 7, 0, 255, 63, 0, 0, 240, 255, 255, 255, 255, 255, 47, 232, 251, 15, 255, 255, 255, 7, 240, 31, 252, 255, 255, 255, 195, 244, 255, 255, 191, 92, 12, 240, 255, 15, 48, 248, 255, 227, 255, 255, 255, 0, 8, 0, 2, 222, 111, 0, 255, 255, 63, 63, 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, 255, 7, 255, 255, 255, 128, 255, 255, 0, 0, 243, 255, 255, 127, 255, 31, 255, 3, 255, 255, 255, 255, 15, 0, 127, 0, 0, 0, 255, 31, 255, 3, 255, 127, 255, 255, 255, 127, 12, 254, 255, 128, 1, 0, 255, 255, 127, 0, 127, 127, 127, 127, 255, 255, 255, 15, 255, 255, 255, 251, 0, 0, 255, 15, 255, 255, 127, 248, 224, 255, 255, 255, 255, 63, 254, 255, 15, 0, 255, 255, 255, 31, 0, 0, 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, 255, 127, 8, 192, 255, 255, 252, 0, 255, 127, 15, 0, 0, 0, 0, 255, 187, 247, 255, 255, 159, 15, 255, 3, 15, 192, 255, 3, 0, 0, 252, 15, 63, 192, 255, 255, 127, 0, 12, 128, 255, 255, 55, 236, 255, 191, 255, 195, 255, 129, 25, 0, 247, 47, 255, 243, 255, 255, 98, 62, 5, 0, 0, 248, 255, 207, 63, 0, 126, 126, 126, 0, 127, 127, 0, 0, 223, 30, 255, 3, 127, 248, 255, 255, 255, 63, 255, 255, 127, 0, 248, 160, 255, 255, 127, 95, 219, 255, 255, 255, 3, 0, 248, 255, 0, 0, 255, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 63, 0, 0, 255, 3, 255, 255, 247, 255, 127, 15, 223, 255, 252, 252, 252, 28, 127, 127, 0, 48, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 135, 255, 255, 255, 255, 255, 143, 255, 255, 7, 255, 15, 255, 255, 255, 191, 15, 255, 63, 0, 255, 3, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, 255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 192, 1, 0, 239, 254, 255, 0, 255, 1, 255, 255, 63, 254, 255, 255, 63, 255, 255, 255, 7, 255, 255, 1, 0, 0, 253, 255, 255, 255, 128, 63, 252, 255, 255, 255, 135, 217, 3, 0, 255, 255, 255, 1, 255, 3, 127, 16, 192, 255, 15, 0, 0, 0, 255, 255, 63, 128, 255, 215, 64, 0, 255, 127, 0, 0, 7, 0, 15, 0, 255, 255, 255, 1, 31, 0, 255, 255, 0, 0, 248, 255, 3, 0, 0, 0, 127, 254, 255, 255, 95, 60, 0, 0, 24, 240, 255, 255, 255, 195, 255, 255, 35, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0, 255, 127, 254, 127, 254, 255, 254, 255, 192, 255, 255, 255, 7, 0, 255, 255, 255, 1, 3, 0, 1, 0, 191, 255, 223, 7, 0, 0, 255, 255, 255, 30, 0, 0, 0, 248, 225, 255, 0, 0, 63, 0, 0, 0, }; /* Grapheme_Base: 2169 bytes. */ RE_UINT32 re_get_grapheme_base(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_grapheme_base_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_grapheme_base_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_base_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_grapheme_base_stage_4[pos + f] << 5; pos += code; value = (re_grapheme_base_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Grapheme_Link. */ static RE_UINT8 re_grapheme_link_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_grapheme_link_stage_2[] = { 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_grapheme_link_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 17, 0, }; static RE_UINT8 re_grapheme_link_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0, 13, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 14, 0, 0, }; static RE_UINT8 re_grapheme_link_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 6, 0, 0, 16, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 0, 0, 0, 0, 128, 64, 0, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 2, 0, 0, 24, 0, }; /* Grapheme_Link: 374 bytes. */ RE_UINT32 re_get_grapheme_link(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_grapheme_link_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_grapheme_link_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_grapheme_link_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_grapheme_link_stage_4[pos + f] << 5; pos += code; value = (re_grapheme_link_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* White_Space. */ static RE_UINT8 re_white_space_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_white_space_stage_2[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_white_space_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_white_space_stage_4[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 4, 5, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_white_space_stage_5[] = { 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 255, 7, 0, 0, 0, 131, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, }; /* White_Space: 169 bytes. */ RE_UINT32 re_get_white_space(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_white_space_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_white_space_stage_2[pos + f] << 4; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_white_space_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_white_space_stage_4[pos + f] << 6; pos += code; value = (re_white_space_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Bidi_Control. */ static RE_UINT8 re_bidi_control_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_bidi_control_stage_2[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_bidi_control_stage_3[] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_bidi_control_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_bidi_control_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 192, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, }; /* Bidi_Control: 129 bytes. */ RE_UINT32 re_get_bidi_control(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_bidi_control_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_bidi_control_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_bidi_control_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_bidi_control_stage_4[pos + f] << 6; pos += code; value = (re_bidi_control_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Join_Control. */ static RE_UINT8 re_join_control_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_join_control_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_join_control_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_join_control_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_join_control_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, }; /* Join_Control: 97 bytes. */ RE_UINT32 re_get_join_control(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_join_control_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_join_control_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_join_control_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_join_control_stage_4[pos + f] << 6; pos += code; value = (re_join_control_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Dash. */ static RE_UINT8 re_dash_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_dash_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_dash_stage_3[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, }; static RE_UINT8 re_dash_stage_4[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 10, 1, 11, 1, 1, 1, 1, 1, 12, 13, 1, 1, 14, 1, 1, 1, }; static RE_UINT8 re_dash_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 4, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, }; /* Dash: 297 bytes. */ RE_UINT32 re_get_dash(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_dash_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_dash_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_dash_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_dash_stage_4[pos + f] << 6; pos += code; value = (re_dash_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Hyphen. */ static RE_UINT8 re_hyphen_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hyphen_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_hyphen_stage_3[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, }; static RE_UINT8 re_hyphen_stage_4[] = { 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, 9, 1, 1, }; static RE_UINT8 re_hyphen_stage_5[] = { 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, }; /* Hyphen: 241 bytes. */ RE_UINT32 re_get_hyphen(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_hyphen_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_hyphen_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_hyphen_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_hyphen_stage_4[pos + f] << 6; pos += code; value = (re_hyphen_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Quotation_Mark. */ static RE_UINT8 re_quotation_mark_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_quotation_mark_stage_2[] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_quotation_mark_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, }; static RE_UINT8 re_quotation_mark_stage_4[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 6, 7, 1, 1, }; static RE_UINT8 re_quotation_mark_stage_5[] = { 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 255, 0, 0, 0, 6, 0, 240, 0, 224, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, }; /* Quotation_Mark: 193 bytes. */ RE_UINT32 re_get_quotation_mark(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_quotation_mark_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_quotation_mark_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_quotation_mark_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_quotation_mark_stage_4[pos + f] << 6; pos += code; value = (re_quotation_mark_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Terminal_Punctuation. */ static RE_UINT8 re_terminal_punctuation_stage_1[] = { 0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_terminal_punctuation_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, 9, 16, 9, 17, 9, 9, 9, 9, 18, 9, 9, 9, 9, 9, 9, }; static RE_UINT8 re_terminal_punctuation_stage_3[] = { 0, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 4, 5, 6, 7, 8, 9, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 12, 1, 13, 1, 1, 1, 1, 1, 14, 1, 1, 1, 1, 1, 15, 16, 1, 17, 18, 1, 19, 1, 1, 20, 21, 1, 22, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 1, 1, 25, 1, 1, 1, 1, 1, 1, 1, 1, 26, 1, 1, 27, 28, 1, 1, 29, 30, 31, 32, 33, 34, 1, 35, 1, 1, 1, 1, 36, 1, 37, 1, 1, 1, 1, 1, 1, 1, 1, 38, 39, 1, 40, 1, 1, 1, 41, 1, 42, 43, 44, 45, 1, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_terminal_punctuation_stage_4[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 4, 0, 5, 0, 6, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 9, 0, 10, 2, 0, 0, 0, 0, 11, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 18, 0, 19, 0, 0, 0, 0, 0, 11, 0, 0, 20, 0, 0, 0, 0, 21, 0, 0, 22, 0, 23, 0, 24, 25, 0, 0, 26, 0, 0, 27, 0, 0, 0, 0, 0, 0, 23, 28, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 0, 0, 25, 0, 0, 0, 33, 0, 0, 0, 34, 35, 0, 0, 0, 36, 0, 0, 37, 0, 1, 0, 0, 38, 34, 0, 39, 0, 0, 0, 40, 0, 34, 0, 0, 0, 0, 41, 0, 0, 0, 0, 42, 0, 0, 23, 43, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 46, }; static RE_UINT8 re_terminal_punctuation_stage_5[] = { 0, 0, 0, 0, 2, 80, 0, 140, 0, 0, 0, 64, 128, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 16, 0, 136, 0, 0, 16, 0, 255, 23, 0, 0, 0, 0, 0, 3, 0, 0, 255, 127, 48, 0, 0, 0, 0, 0, 0, 12, 0, 225, 7, 0, 0, 12, 0, 0, 254, 1, 0, 0, 0, 96, 0, 0, 0, 56, 0, 0, 0, 0, 112, 4, 60, 3, 0, 0, 0, 15, 0, 0, 0, 0, 0, 236, 0, 0, 0, 248, 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 0, 6, 0, 0, 0, 0, 224, 0, 0, 0, 0, 248, 0, 0, 0, 192, 0, 0, 192, 0, 0, 0, 128, 0, 0, 0, 0, 0, 224, 0, 0, 0, 128, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 247, 0, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 0, 0, 252, 128, 63, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, 96, 0, 0, 0, 0, 0, 15, 0, }; /* Terminal_Punctuation: 676 bytes. */ RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 14; code = ch ^ (f << 14); pos = (RE_UINT32)re_terminal_punctuation_stage_1[f] << 4; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_terminal_punctuation_stage_2[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_terminal_punctuation_stage_3[pos + f] << 2; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_terminal_punctuation_stage_4[pos + f] << 5; pos += code; value = (re_terminal_punctuation_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Math. */ static RE_UINT8 re_other_math_stage_1[] = { 0, 1, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_other_math_stage_2[] = { 0, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 6, 1, 1, }; static RE_UINT8 re_other_math_stage_3[] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 1, 5, 1, 6, 7, 8, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 11, 1, 1, 1, 1, 12, 13, 14, 15, 1, 1, 1, 1, 1, 1, 16, 1, }; static RE_UINT8 re_other_math_stage_4[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 0, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 0, 0, 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, 22, 23, 24, 25, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 28, 0, 0, 0, 0, 29, 0, 30, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 34, 35, 34, 36, 37, 38, 34, 39, 40, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 42, 43, 44, 35, 35, 45, 45, 46, 46, 47, 34, 38, 48, 49, 50, 51, 52, 0, 0, }; static RE_UINT8 re_other_math_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 39, 0, 0, 0, 51, 0, 0, 0, 64, 0, 0, 0, 28, 0, 1, 0, 0, 0, 30, 0, 0, 96, 0, 96, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 62, 16, 179, 251, 241, 224, 3, 0, 0, 0, 0, 224, 243, 182, 62, 195, 240, 255, 63, 235, 47, 48, 0, 0, 0, 0, 15, 0, 0, 0, 0, 176, 0, 0, 0, 1, 0, 4, 0, 0, 0, 3, 192, 127, 240, 193, 140, 15, 0, 148, 31, 0, 0, 96, 0, 0, 0, 5, 0, 0, 0, 15, 96, 0, 0, 192, 255, 0, 0, 248, 255, 255, 1, 0, 0, 0, 15, 0, 0, 0, 48, 10, 1, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 255, 255, 247, 255, 127, 255, 255, 255, 253, 255, 255, 247, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, }; /* Other_Math: 502 bytes. */ RE_UINT32 re_get_other_math(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_other_math_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_other_math_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_other_math_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_other_math_stage_4[pos + f] << 5; pos += code; value = (re_other_math_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Hex_Digit. */ static RE_UINT8 re_hex_digit_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hex_digit_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hex_digit_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, }; static RE_UINT8 re_hex_digit_stage_4[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, }; static RE_UINT8 re_hex_digit_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, }; /* Hex_Digit: 129 bytes. */ RE_UINT32 re_get_hex_digit(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_hex_digit_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_hex_digit_stage_2[pos + f] << 3; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_hex_digit_stage_3[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_hex_digit_stage_4[pos + f] << 7; pos += code; value = (re_hex_digit_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* ASCII_Hex_Digit. */ static RE_UINT8 re_ascii_hex_digit_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_4[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ascii_hex_digit_stage_5[] = { 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* ASCII_Hex_Digit: 97 bytes. */ RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ascii_hex_digit_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_ascii_hex_digit_stage_2[pos + f] << 3; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_ascii_hex_digit_stage_3[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_ascii_hex_digit_stage_4[pos + f] << 7; pos += code; value = (re_ascii_hex_digit_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Alphabetic. */ static RE_UINT8 re_other_alphabetic_stage_1[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_other_alphabetic_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 10, 11, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_other_alphabetic_stage_3[] = { 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 14, 0, 0, 0, 15, 16, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 33, }; static RE_UINT8 re_other_alphabetic_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 5, 6, 0, 0, 7, 8, 9, 10, 0, 0, 0, 11, 0, 0, 12, 13, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 18, 19, 20, 22, 23, 19, 20, 24, 18, 19, 20, 25, 18, 26, 20, 27, 0, 19, 20, 28, 18, 18, 20, 28, 18, 18, 20, 29, 18, 18, 0, 30, 31, 0, 32, 33, 0, 0, 34, 33, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 39, 40, 41, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 31, 31, 31, 31, 0, 43, 44, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 0, 0, 0, 10, 47, 0, 48, 0, 49, 50, 0, 0, 0, 0, 51, 52, 15, 0, 53, 54, 0, 55, 0, 56, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 43, 57, 58, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 59, 42, 0, 0, 0, 0, 60, 0, 0, 61, 62, 15, 0, 0, 63, 64, 0, 15, 62, 0, 0, 0, 65, 66, 0, 0, 67, 0, 68, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 53, 72, 73, 0, 26, 74, 0, 0, 53, 64, 0, 0, 53, 75, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 35, 77, 0, 0, 0, 0, }; static RE_UINT8 re_other_alphabetic_stage_5[] = { 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, 0, 248, 255, 254, 0, 0, 1, 0, 0, 0, 192, 31, 158, 33, 0, 0, 0, 0, 2, 0, 0, 0, 255, 255, 192, 255, 1, 0, 0, 0, 192, 248, 239, 30, 0, 0, 240, 3, 255, 127, 15, 0, 0, 0, 0, 0, 0, 204, 255, 223, 224, 0, 12, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 192, 159, 25, 128, 0, 135, 25, 2, 0, 0, 0, 35, 0, 191, 27, 0, 0, 159, 25, 192, 0, 4, 0, 0, 0, 199, 29, 128, 0, 223, 29, 96, 0, 223, 29, 128, 0, 0, 128, 95, 255, 0, 0, 12, 0, 0, 0, 242, 7, 0, 32, 0, 0, 0, 0, 242, 27, 0, 0, 254, 255, 3, 224, 255, 254, 255, 255, 255, 31, 0, 248, 127, 121, 0, 0, 192, 195, 133, 1, 30, 0, 124, 0, 0, 48, 0, 0, 0, 128, 0, 0, 192, 255, 255, 1, 0, 0, 0, 2, 0, 0, 255, 15, 255, 1, 1, 3, 0, 0, 0, 0, 128, 15, 0, 0, 224, 127, 254, 255, 31, 0, 31, 0, 0, 0, 0, 0, 224, 255, 7, 0, 0, 0, 254, 51, 0, 0, 128, 255, 3, 0, 240, 255, 63, 0, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 240, 15, 248, 0, 0, 0, 3, 0, 0, 0, 0, 0, 240, 255, 192, 7, 0, 0, 128, 255, 7, 0, 0, 254, 127, 0, 8, 48, 0, 0, 0, 0, 157, 65, 0, 248, 32, 0, 248, 7, 0, 0, 0, 0, 0, 64, 110, 240, 0, 0, 0, 0, 0, 255, 63, 0, 0, 0, 0, 0, 255, 1, 0, 0, 248, 255, 0, 248, 63, 0, 255, 255, 255, 127, }; /* Other_Alphabetic: 786 bytes. */ RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_other_alphabetic_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_other_alphabetic_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_other_alphabetic_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_other_alphabetic_stage_4[pos + f] << 5; pos += code; value = (re_other_alphabetic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Ideographic. */ static RE_UINT8 re_ideographic_stage_1[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ideographic_stage_2[] = { 0, 0, 0, 1, 2, 3, 3, 3, 3, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 0, 0, 0, 8, }; static RE_UINT8 re_ideographic_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 5, 6, 0, 0, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 8, 9, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0, 0, }; static RE_UINT8 re_ideographic_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 2, 2, 2, 2, 2, 5, 2, 6, 0, 0, 0, 0, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 9, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_ideographic_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 254, 3, 0, 7, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 255, 31, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 255, 255, 127, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 0, 0, 0, 0, }; /* Ideographic: 297 bytes. */ RE_UINT32 re_get_ideographic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ideographic_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_ideographic_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_ideographic_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_ideographic_stage_4[pos + f] << 6; pos += code; value = (re_ideographic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Diacritic. */ static RE_UINT8 re_diacritic_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_diacritic_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 4, 4, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_diacritic_stage_3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 1, 1, 1, 1, 1, 17, 1, 18, 19, 20, 21, 22, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 25, 1, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 28, 29, 30, 31, 32, 1, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 36, 37, 1, 1, 1, 1, 38, 1, 1, 1, 1, 1, 1, 1, 1, 39, 1, 40, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_diacritic_stage_4[] = { 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 0, 0, 0, 14, 0, 0, 0, 15, 16, 0, 4, 17, 0, 0, 18, 0, 19, 20, 0, 0, 0, 0, 0, 0, 21, 0, 22, 23, 24, 0, 22, 25, 0, 0, 22, 25, 0, 0, 22, 25, 0, 0, 22, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 22, 25, 0, 0, 0, 25, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 28, 0, 20, 29, 0, 0, 30, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 37, 38, 39, 0, 40, 0, 0, 0, 41, 0, 42, 0, 0, 4, 43, 0, 44, 5, 17, 0, 0, 45, 46, 0, 0, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, 22, 0, 0, 0, 54, 0, 0, 0, 55, 56, 57, 0, 0, 58, 0, 0, 20, 0, 0, 0, 0, 0, 0, 38, 59, 0, 60, 61, 0, 0, 61, 2, 0, 0, 0, 0, 62, 0, 15, 63, 64, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 1, 2, 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 73, 74, 75, 0, 0, }; static RE_UINT8 re_diacritic_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 129, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224, 7, 0, 48, 4, 48, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, 251, 255, 255, 191, 22, 0, 0, 0, 0, 248, 135, 1, 0, 0, 0, 128, 97, 28, 0, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 0, 0, 0, 0, 3, 240, 255, 255, 127, 0, 0, 0, 16, 0, 32, 30, 0, 0, 0, 2, 0, 0, 32, 0, 0, 0, 4, 0, 0, 128, 95, 0, 0, 0, 31, 0, 0, 0, 0, 160, 194, 220, 0, 0, 0, 64, 0, 0, 0, 0, 0, 128, 6, 128, 191, 0, 12, 0, 254, 15, 32, 0, 0, 0, 14, 0, 0, 224, 159, 0, 0, 16, 0, 16, 0, 0, 0, 0, 248, 15, 0, 0, 12, 0, 0, 0, 0, 192, 0, 0, 0, 0, 63, 255, 33, 16, 0, 0, 240, 255, 255, 240, 255, 0, 0, 0, 0, 0, 224, 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, 0, 128, 3, 0, 0, 128, 0, 0, 0, 252, 0, 0, 0, 0, 0, 30, 0, 128, 0, 176, 0, 0, 3, 0, 0, 0, 128, 255, 3, 0, 0, 0, 0, 1, 0, 0, 255, 255, 3, 0, 0, 120, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, 64, 0, 0, 48, 0, 0, 127, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 192, 8, 0, 0, 0, 0, 0, 0, 6, 0, 0, 24, 0, 0, 128, 255, 255, 128, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, }; /* Diacritic: 849 bytes. */ RE_UINT32 re_get_diacritic(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_diacritic_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_diacritic_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_diacritic_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_diacritic_stage_4[pos + f] << 5; pos += code; value = (re_diacritic_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Extender. */ static RE_UINT8 re_extender_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_extender_stage_2[] = { 0, 1, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_extender_stage_3[] = { 0, 1, 2, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 7, 1, 8, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 11, 1, 1, 12, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, }; static RE_UINT8 re_extender_stage_4[] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 10, 0, 0, 0, 0, 11, 12, 0, 0, 13, 0, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 18, 0, 0, 19, 20, 0, 0, 0, 18, 0, 0, 0, 0, }; static RE_UINT8 re_extender_stage_5[] = { 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 4, 0, 0, 8, 0, 0, 0, 128, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 8, 32, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 96, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, 0, 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32, 0, 0, 24, 0, }; /* Extender: 349 bytes. */ RE_UINT32 re_get_extender(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_extender_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_extender_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_extender_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_extender_stage_4[pos + f] << 5; pos += code; value = (re_extender_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Lowercase. */ static RE_UINT8 re_other_lowercase_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_lowercase_stage_2[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_other_lowercase_stage_3[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 4, 2, 5, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, }; static RE_UINT8 re_other_lowercase_stage_4[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 8, 9, 0, 0, 10, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 14, }; static RE_UINT8 re_other_lowercase_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, }; /* Other_Lowercase: 273 bytes. */ RE_UINT32 re_get_other_lowercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_lowercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_lowercase_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_lowercase_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_lowercase_stage_4[pos + f] << 6; pos += code; value = (re_other_lowercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Uppercase. */ static RE_UINT8 re_other_uppercase_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_uppercase_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_uppercase_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_uppercase_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, }; static RE_UINT8 re_other_uppercase_stage_5[] = { 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 192, 255, }; /* Other_Uppercase: 117 bytes. */ RE_UINT32 re_get_other_uppercase(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_uppercase_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_uppercase_stage_2[pos + f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_other_uppercase_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_other_uppercase_stage_4[pos + f] << 5; pos += code; value = (re_other_uppercase_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Noncharacter_Code_Point. */ static RE_UINT8 re_noncharacter_code_point_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_noncharacter_code_point_stage_2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, }; static RE_UINT8 re_noncharacter_code_point_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 2, }; static RE_UINT8 re_noncharacter_code_point_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, }; static RE_UINT8 re_noncharacter_code_point_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, }; /* Noncharacter_Code_Point: 121 bytes. */ RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_noncharacter_code_point_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_noncharacter_code_point_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_noncharacter_code_point_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_noncharacter_code_point_stage_4[pos + f] << 6; pos += code; value = (re_noncharacter_code_point_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Grapheme_Extend. */ static RE_UINT8 re_other_grapheme_extend_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_other_grapheme_extend_stage_2[] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_grapheme_extend_stage_3[] = { 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_grapheme_extend_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 0, 3, 1, 2, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 8, 0, 0, }; static RE_UINT8 re_other_grapheme_extend_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 128, 0, 0, 0, 0, 0, 4, 0, 96, 0, 0, 0, 0, 0, 0, 128, 0, 128, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 32, 192, 7, 0, }; /* Other_Grapheme_Extend: 249 bytes. */ RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_grapheme_extend_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_grapheme_extend_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_grapheme_extend_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_grapheme_extend_stage_4[pos + f] << 6; pos += code; value = (re_other_grapheme_extend_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* IDS_Binary_Operator. */ static RE_UINT8 re_ids_binary_operator_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ids_binary_operator_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_ids_binary_operator_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_binary_operator_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_binary_operator_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 15, }; /* IDS_Binary_Operator: 97 bytes. */ RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ids_binary_operator_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_ids_binary_operator_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_ids_binary_operator_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_ids_binary_operator_stage_4[pos + f] << 6; pos += code; value = (re_ids_binary_operator_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* IDS_Trinary_Operator. */ static RE_UINT8 re_ids_trinary_operator_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_ids_trinary_operator_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_ids_trinary_operator_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_trinary_operator_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_ids_trinary_operator_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, }; /* IDS_Trinary_Operator: 97 bytes. */ RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_ids_trinary_operator_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_ids_trinary_operator_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_ids_trinary_operator_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_ids_trinary_operator_stage_4[pos + f] << 6; pos += code; value = (re_ids_trinary_operator_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Radical. */ static RE_UINT8 re_radical_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_radical_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_radical_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; static RE_UINT8 re_radical_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 0, }; static RE_UINT8 re_radical_stage_5[] = { 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 15, 0, 255, 255, 63, 0, }; /* Radical: 117 bytes. */ RE_UINT32 re_get_radical(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_radical_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_radical_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_radical_stage_3[pos + f] << 4; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_radical_stage_4[pos + f] << 5; pos += code; value = (re_radical_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Unified_Ideograph. */ static RE_UINT8 re_unified_ideograph_stage_1[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_unified_ideograph_stage_2[] = { 0, 0, 0, 1, 2, 3, 3, 3, 3, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 0, 0, 0, 0, }; static RE_UINT8 re_unified_ideograph_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 4, 0, 0, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 6, 7, 0, 0, 0, }; static RE_UINT8 re_unified_ideograph_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 3, 4, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_unified_ideograph_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 255, 31, 0, 0, 0, 0, 0, 0, 0, 192, 26, 128, 154, 3, 0, 0, 255, 255, 127, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 0, 0, 0, 0, }; /* Unified_Ideograph: 257 bytes. */ RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_unified_ideograph_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_unified_ideograph_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_unified_ideograph_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_unified_ideograph_stage_4[pos + f] << 6; pos += code; value = (re_unified_ideograph_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_Default_Ignorable_Code_Point. */ static RE_UINT8 re_other_default_ignorable_code_point_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_3[] = { 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 8, 8, 8, 8, 8, 8, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 9, 9, 0, 0, 0, 10, 9, 9, 9, 9, 9, 9, 9, 9, }; static RE_UINT8 re_other_default_ignorable_code_point_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 1, 253, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, }; /* Other_Default_Ignorable_Code_Point: 281 bytes. */ RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_4[pos + f] << 6; pos += code; value = (re_other_default_ignorable_code_point_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Deprecated. */ static RE_UINT8 re_deprecated_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, }; static RE_UINT8 re_deprecated_stage_2[] = { 0, 1, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_deprecated_stage_3[] = { 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_deprecated_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 7, 8, 8, 8, 0, 0, 0, 0, }; static RE_UINT8 re_deprecated_stage_5[] = { 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 8, 0, 0, 0, 128, 2, 24, 0, 0, 0, 0, 252, 0, 0, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, 255, 255, }; /* Deprecated: 230 bytes. */ RE_UINT32 re_get_deprecated(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_deprecated_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_deprecated_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_deprecated_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_deprecated_stage_4[pos + f] << 5; pos += code; value = (re_deprecated_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Soft_Dotted. */ static RE_UINT8 re_soft_dotted_stage_1[] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_soft_dotted_stage_2[] = { 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, }; static RE_UINT8 re_soft_dotted_stage_3[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 5, 8, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 5, 5, 5, 5, 5, 11, 12, 13, 5, }; static RE_UINT8 re_soft_dotted_stage_4[] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 0, 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 17, 18, 0, 19, 20, 0, 21, 0, 22, 23, 0, 24, 0, 17, 18, 0, 19, 20, 0, 21, 0, 0, 0, }; static RE_UINT8 re_soft_dotted_stage_5[] = { 0, 0, 0, 0, 0, 6, 0, 0, 0, 128, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 64, 1, 4, 0, 0, 0, 0, 0, 64, 0, 16, 1, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 192, 0, 0, 0, 0, 0, 0, 12, 0, 192, 0, 0, }; /* Soft_Dotted: 342 bytes. */ RE_UINT32 re_get_soft_dotted(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 15; code = ch ^ (f << 15); pos = (RE_UINT32)re_soft_dotted_stage_1[f] << 4; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_soft_dotted_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_soft_dotted_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_soft_dotted_stage_4[pos + f] << 5; pos += code; value = (re_soft_dotted_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Logical_Order_Exception. */ static RE_UINT8 re_logical_order_exception_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_logical_order_exception_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_logical_order_exception_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, }; static RE_UINT8 re_logical_order_exception_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, }; static RE_UINT8 re_logical_order_exception_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 26, }; /* Logical_Order_Exception: 121 bytes. */ RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_logical_order_exception_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_logical_order_exception_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_logical_order_exception_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_logical_order_exception_stage_4[pos + f] << 6; pos += code; value = (re_logical_order_exception_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_ID_Start. */ static RE_UINT8 re_other_id_start_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_id_start_stage_2[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_id_start_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_id_start_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, }; static RE_UINT8 re_other_id_start_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 64, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, }; /* Other_ID_Start: 113 bytes. */ RE_UINT32 re_get_other_id_start(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_id_start_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_other_id_start_stage_2[pos + f] << 4; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_id_start_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_id_start_stage_4[pos + f] << 6; pos += code; value = (re_other_id_start_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Other_ID_Continue. */ static RE_UINT8 re_other_id_continue_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_id_continue_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_other_id_continue_stage_3[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_other_id_continue_stage_4[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, }; static RE_UINT8 re_other_id_continue_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, }; /* Other_ID_Continue: 145 bytes. */ RE_UINT32 re_get_other_id_continue(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_other_id_continue_stage_1[f] << 3; f = code >> 13; code ^= f << 13; pos = (RE_UINT32)re_other_id_continue_stage_2[pos + f] << 4; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_other_id_continue_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_other_id_continue_stage_4[pos + f] << 6; pos += code; value = (re_other_id_continue_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* STerm. */ static RE_UINT8 re_sterm_stage_1[] = { 0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_sterm_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 3, 9, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 11, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; static RE_UINT8 re_sterm_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 11, 1, 12, 1, 13, 1, 14, 1, 1, 15, 16, 1, 17, 1, 1, 1, 1, 1, 1, 1, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 1, 1, 1, 20, 1, 1, 1, 1, 1, 1, 1, 1, 21, 1, 1, 22, 23, 1, 1, 24, 25, 26, 27, 28, 29, 1, 30, 1, 1, 1, 1, 31, 1, 32, 1, 1, 1, 1, 1, 33, 1, 1, 1, 34, 35, 36, 37, 1, 1, 1, 1, }; static RE_UINT8 re_sterm_stage_4[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 9, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 12, 0, 0, 13, 0, 0, 0, 0, 0, 8, 0, 0, 14, 0, 0, 0, 0, 15, 0, 0, 16, 0, 17, 0, 18, 19, 0, 0, 11, 0, 0, 20, 0, 0, 0, 0, 0, 0, 4, 21, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 21, 0, 0, 24, 0, 0, 0, 0, 25, 0, 0, 0, 26, 0, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 29, 0, 1, 0, 0, 30, 0, 0, 23, 0, 0, 0, 31, 0, 0, 17, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, }; static RE_UINT8 re_sterm_stage_5[] = { 0, 0, 0, 0, 2, 64, 0, 128, 0, 0, 0, 80, 0, 2, 0, 0, 0, 0, 0, 128, 0, 0, 16, 0, 7, 0, 0, 0, 0, 0, 0, 2, 48, 0, 0, 0, 0, 12, 0, 0, 132, 1, 0, 0, 0, 64, 0, 0, 0, 0, 96, 0, 8, 2, 0, 0, 0, 15, 0, 0, 0, 0, 0, 204, 0, 0, 0, 24, 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 4, 0, 0, 0, 0, 192, 0, 0, 0, 0, 136, 0, 0, 0, 192, 0, 0, 128, 0, 0, 0, 3, 0, 0, 0, 0, 0, 224, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 196, 0, 2, 0, 0, 0, 128, 1, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, 96, 0, 0, 0, }; /* STerm: 568 bytes. */ RE_UINT32 re_get_sterm(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 14; code = ch ^ (f << 14); pos = (RE_UINT32)re_sterm_stage_1[f] << 4; f = code >> 10; code ^= f << 10; pos = (RE_UINT32)re_sterm_stage_2[pos + f] << 3; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_sterm_stage_3[pos + f] << 2; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_sterm_stage_4[pos + f] << 5; pos += code; value = (re_sterm_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Variation_Selector. */ static RE_UINT8 re_variation_selector_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, }; static RE_UINT8 re_variation_selector_stage_2[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_variation_selector_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_variation_selector_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, }; static RE_UINT8 re_variation_selector_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, }; /* Variation_Selector: 169 bytes. */ RE_UINT32 re_get_variation_selector(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_variation_selector_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_variation_selector_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_variation_selector_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_variation_selector_stage_4[pos + f] << 6; pos += code; value = (re_variation_selector_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Pattern_White_Space. */ static RE_UINT8 re_pattern_white_space_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_2[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_4[] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_white_space_stage_5[] = { 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 3, 0, 0, }; /* Pattern_White_Space: 129 bytes. */ RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_pattern_white_space_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_pattern_white_space_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_pattern_white_space_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_pattern_white_space_stage_4[pos + f] << 6; pos += code; value = (re_pattern_white_space_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Pattern_Syntax. */ static RE_UINT8 re_pattern_syntax_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_syntax_stage_2[] = { 0, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_pattern_syntax_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 4, 4, 6, 4, 4, 4, 4, 1, 1, 7, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 10, 1, }; static RE_UINT8 re_pattern_syntax_stage_4[] = { 0, 1, 2, 2, 0, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 9, 10, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, }; static RE_UINT8 re_pattern_syntax_stage_5[] = { 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 120, 254, 90, 67, 136, 0, 0, 128, 0, 0, 0, 255, 255, 255, 0, 255, 127, 254, 255, 239, 127, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 240, 255, 14, 255, 255, 255, 1, 0, 1, 0, 0, 0, 0, 192, 96, 0, 0, 0, }; /* Pattern_Syntax: 277 bytes. */ RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_pattern_syntax_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_pattern_syntax_stage_2[pos + f] << 3; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_pattern_syntax_stage_3[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_pattern_syntax_stage_4[pos + f] << 5; pos += code; value = (re_pattern_syntax_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Hangul_Syllable_Type. */ static RE_UINT8 re_hangul_syllable_type_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_hangul_syllable_type_stage_2[] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_hangul_syllable_type_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 11, }; static RE_UINT8 re_hangul_syllable_type_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 4, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 5, 6, 6, 7, 6, 6, 6, 6, 5, 6, 6, 8, 0, 2, 2, 9, 10, 3, 3, 3, 3, 3, 11, }; static RE_UINT8 re_hangul_syllable_type_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 0, 0, 0, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, }; /* Hangul_Syllable_Type: 497 bytes. */ RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_hangul_syllable_type_stage_1[f] << 5; f = code >> 11; code ^= f << 11; pos = (RE_UINT32)re_hangul_syllable_type_stage_2[pos + f] << 4; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_hangul_syllable_type_stage_3[pos + f] << 4; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_hangul_syllable_type_stage_4[pos + f] << 3; value = re_hangul_syllable_type_stage_5[pos + code]; return value; } /* Bidi_Class. */ static RE_UINT8 re_bidi_class_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 7, 8, 9, 5, 5, 5, 5, 10, 5, 5, 5, 5, 5, 5, 11, 12, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, }; static RE_UINT8 re_bidi_class_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2, 2, 2, 2, 30, 31, 32, 2, 2, 2, 2, 33, 34, 35, 36, 37, 38, 39, 40, 2, 41, 42, 43, 44, 2, 45, 2, 2, 2, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 52, 52, 52, 57, 58, 52, 2, 2, 52, 52, 52, 52, 59, 2, 2, 60, 61, 62, 63, 64, 52, 65, 66, 67, 2, 68, 69, 70, 71, 72, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 73, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 2, 2, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 2, 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 87, 87, 87, 88, 89, 90, 91, 92, 93, 2, 2, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 96, 96, 97, 96, 98, 96, 99, 96, 96, 96, 96, 96, 100, 96, 96, 96, 101, 102, 103, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 105, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 106, 2, 2, 107, 108, 109, 2, 110, 2, 2, 2, 2, 2, 2, 111, 112, 113, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 87, 114, 96, 96, 115, 116, 117, 2, 2, 2, 118, 119, 120, 121, 122, 123, 124, 125, 126, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 127, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 127, 128, 128, 129, 130, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static RE_UINT8 re_bidi_class_stage_3[] = { 0, 1, 2, 3, 4, 5, 4, 6, 7, 8, 9, 10, 11, 12, 11, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 14, 14, 15, 16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 11, 11, 11, 11, 11, 11, 20, 21, 11, 11, 11, 11, 11, 11, 11, 22, 23, 17, 24, 25, 26, 26, 26, 27, 28, 29, 29, 30, 17, 31, 32, 29, 29, 29, 29, 29, 33, 34, 35, 29, 36, 29, 17, 28, 29, 29, 29, 29, 29, 37, 32, 26, 26, 38, 39, 26, 40, 41, 26, 26, 42, 26, 26, 26, 26, 29, 29, 29, 29, 43, 44, 45, 11, 11, 46, 47, 48, 49, 11, 50, 11, 11, 51, 52, 11, 49, 53, 54, 11, 11, 51, 55, 50, 11, 56, 54, 11, 11, 51, 57, 11, 49, 58, 50, 11, 11, 59, 52, 60, 49, 11, 61, 11, 11, 11, 62, 11, 11, 63, 11, 11, 11, 64, 65, 66, 49, 67, 11, 11, 11, 51, 68, 11, 49, 11, 11, 11, 11, 11, 52, 11, 49, 11, 11, 11, 11, 11, 69, 70, 11, 11, 11, 11, 11, 71, 72, 11, 11, 11, 11, 11, 11, 73, 74, 11, 11, 11, 11, 75, 11, 76, 11, 11, 11, 77, 78, 79, 17, 80, 60, 11, 11, 11, 11, 11, 81, 82, 11, 83, 84, 85, 86, 87, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 81, 11, 11, 11, 88, 11, 11, 11, 11, 11, 11, 4, 11, 11, 11, 11, 11, 11, 11, 89, 90, 11, 11, 11, 11, 11, 11, 11, 91, 11, 91, 11, 49, 11, 49, 11, 11, 11, 92, 93, 94, 11, 88, 95, 11, 11, 11, 11, 11, 11, 11, 11, 11, 96, 11, 11, 11, 11, 11, 11, 11, 97, 98, 99, 11, 11, 11, 11, 11, 11, 11, 11, 100, 16, 16, 11, 101, 11, 11, 11, 102, 103, 104, 105, 11, 11, 106, 61, 11, 107, 105, 108, 11, 109, 11, 11, 11, 110, 108, 11, 11, 111, 112, 11, 11, 11, 11, 11, 11, 11, 11, 11, 113, 114, 115, 11, 11, 11, 11, 17, 17, 116, 111, 11, 11, 11, 117, 118, 119, 119, 120, 121, 16, 122, 123, 124, 125, 126, 127, 128, 11, 129, 129, 129, 17, 17, 84, 130, 131, 132, 133, 134, 16, 11, 11, 135, 16, 16, 16, 16, 16, 16, 16, 16, 136, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 137, 11, 11, 11, 5, 16, 138, 16, 16, 16, 16, 16, 139, 16, 16, 140, 11, 141, 11, 16, 16, 142, 143, 11, 11, 11, 11, 144, 16, 16, 16, 145, 16, 16, 16, 16, 16, 146, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 147, 88, 11, 11, 11, 11, 11, 11, 11, 11, 148, 149, 11, 11, 11, 11, 11, 11, 11, 150, 11, 11, 11, 11, 11, 11, 17, 17, 16, 16, 16, 151, 11, 11, 11, 11, 16, 152, 16, 16, 16, 16, 16, 139, 16, 16, 16, 16, 16, 137, 11, 151, 153, 16, 154, 155, 11, 11, 11, 11, 11, 156, 4, 11, 11, 11, 11, 157, 11, 11, 11, 11, 16, 16, 139, 11, 11, 120, 11, 11, 11, 16, 11, 158, 11, 11, 11, 146, 159, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 160, 11, 11, 11, 11, 11, 100, 11, 161, 11, 11, 11, 11, 16, 16, 16, 16, 11, 16, 16, 16, 140, 11, 11, 11, 119, 11, 11, 11, 11, 11, 150, 162, 11, 150, 11, 11, 11, 11, 11, 108, 16, 16, 163, 11, 11, 11, 11, 11, 164, 11, 11, 11, 11, 11, 11, 11, 165, 11, 166, 167, 11, 11, 11, 168, 11, 11, 11, 11, 115, 11, 17, 108, 11, 11, 169, 11, 170, 108, 11, 11, 45, 11, 11, 171, 11, 11, 11, 11, 11, 11, 172, 173, 174, 11, 11, 11, 11, 11, 11, 175, 50, 11, 68, 60, 11, 11, 11, 11, 11, 11, 176, 11, 11, 177, 178, 26, 26, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 179, 29, 29, 29, 29, 29, 29, 29, 29, 29, 8, 8, 180, 17, 88, 116, 16, 16, 181, 182, 29, 29, 29, 29, 29, 29, 29, 29, 183, 184, 3, 4, 5, 4, 5, 137, 11, 11, 11, 11, 11, 11, 11, 185, 186, 187, 11, 11, 11, 16, 16, 16, 16, 141, 151, 11, 11, 11, 11, 11, 87, 26, 26, 26, 26, 26, 26, 26, 26, 26, 188, 26, 26, 26, 26, 26, 26, 189, 26, 26, 190, 26, 26, 26, 26, 26, 26, 26, 191, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 192, 193, 50, 11, 11, 194, 116, 14, 137, 11, 108, 11, 11, 195, 11, 11, 11, 11, 45, 11, 196, 197, 11, 11, 11, 11, 108, 11, 11, 198, 11, 11, 11, 11, 11, 11, 199, 200, 11, 11, 11, 11, 150, 45, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 201, 202, 203, 11, 204, 11, 11, 11, 11, 11, 16, 16, 16, 16, 205, 11, 11, 11, 16, 16, 16, 16, 16, 140, 11, 11, 11, 11, 11, 11, 11, 157, 11, 11, 11, 206, 11, 11, 161, 11, 11, 11, 135, 11, 11, 11, 207, 208, 208, 208, 29, 29, 29, 29, 29, 29, 29, 209, 16, 16, 151, 16, 16, 16, 16, 16, 16, 139, 210, 211, 146, 146, 11, 11, 212, 11, 11, 11, 11, 11, 133, 11, 16, 16, 4, 213, 16, 16, 16, 147, 16, 139, 16, 16, 214, 11, 16, 4, 16, 16, 16, 210, 215, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 216, 16, 16, 16, 217, 139, 16, 218, 11, 11, 11, 11, 11, 11, 11, 11, 5, 16, 16, 16, 16, 219, 11, 11, 11, 16, 16, 16, 16, 137, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 139, 11, 11, 11, 11, 11, 11, 11, 220, 8, 8, 8, 8, 8, 8, 8, 8, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 8, }; static RE_UINT8 re_bidi_class_stage_4[] = { 0, 0, 1, 2, 0, 0, 0, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 12, 12, 12, 12, 13, 10, 12, 12, 13, 14, 0, 15, 0, 0, 0, 0, 0, 0, 16, 5, 17, 18, 19, 20, 21, 10, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, 22, 12, 23, 10, 10, 10, 12, 24, 10, 17, 10, 10, 10, 10, 25, 25, 25, 25, 12, 26, 12, 27, 12, 17, 12, 12, 12, 27, 12, 12, 28, 25, 29, 12, 12, 12, 27, 30, 31, 25, 25, 25, 25, 25, 25, 32, 33, 32, 34, 34, 34, 34, 34, 34, 35, 36, 37, 38, 25, 25, 39, 40, 40, 40, 40, 40, 40, 40, 41, 25, 35, 35, 42, 43, 44, 40, 40, 40, 40, 45, 25, 46, 25, 47, 48, 49, 8, 8, 50, 40, 51, 40, 40, 40, 40, 45, 25, 25, 34, 34, 52, 25, 25, 53, 54, 34, 34, 55, 32, 25, 25, 31, 31, 56, 34, 34, 31, 34, 40, 25, 25, 25, 25, 25, 25, 39, 57, 12, 12, 12, 12, 12, 58, 59, 60, 25, 59, 61, 60, 25, 12, 12, 62, 12, 12, 12, 61, 12, 12, 12, 12, 12, 12, 59, 60, 59, 12, 61, 63, 12, 30, 12, 64, 12, 12, 12, 64, 28, 65, 29, 29, 61, 12, 12, 60, 66, 59, 61, 67, 12, 12, 12, 12, 12, 12, 65, 12, 58, 12, 12, 58, 12, 12, 12, 59, 12, 12, 61, 13, 10, 68, 12, 12, 12, 12, 62, 59, 62, 69, 29, 12, 64, 12, 12, 12, 12, 10, 70, 12, 12, 12, 29, 12, 12, 58, 12, 62, 71, 12, 12, 61, 25, 57, 30, 12, 28, 25, 57, 61, 25, 66, 59, 12, 12, 25, 29, 12, 12, 29, 12, 12, 72, 73, 26, 60, 25, 25, 57, 25, 69, 12, 60, 25, 25, 60, 25, 25, 25, 25, 59, 12, 12, 12, 60, 69, 25, 64, 64, 12, 12, 29, 62, 59, 12, 12, 12, 60, 59, 12, 12, 58, 64, 12, 61, 12, 12, 12, 61, 10, 10, 26, 12, 74, 12, 12, 12, 12, 12, 13, 11, 62, 59, 12, 12, 12, 66, 25, 29, 12, 58, 60, 25, 25, 12, 30, 61, 10, 10, 75, 76, 12, 12, 61, 12, 57, 28, 59, 12, 58, 12, 60, 12, 11, 26, 12, 12, 12, 12, 12, 23, 12, 28, 65, 12, 12, 58, 25, 57, 71, 60, 25, 59, 28, 25, 25, 65, 25, 12, 12, 12, 12, 69, 57, 59, 12, 12, 28, 25, 29, 12, 12, 12, 62, 29, 66, 12, 12, 58, 29, 72, 12, 12, 12, 25, 25, 62, 12, 12, 57, 25, 25, 25, 69, 25, 59, 61, 12, 59, 12, 12, 25, 57, 12, 12, 12, 12, 12, 77, 26, 12, 12, 24, 12, 12, 12, 24, 12, 12, 12, 22, 78, 78, 79, 80, 10, 10, 81, 82, 83, 84, 10, 10, 10, 85, 10, 10, 10, 10, 10, 86, 0, 87, 88, 0, 89, 8, 90, 70, 8, 8, 90, 70, 83, 83, 83, 83, 17, 70, 26, 12, 12, 20, 11, 23, 10, 77, 91, 92, 12, 12, 23, 12, 10, 11, 23, 26, 12, 12, 91, 12, 93, 10, 10, 10, 10, 26, 12, 12, 10, 20, 10, 10, 10, 12, 12, 12, 10, 70, 12, 12, 10, 10, 70, 12, 10, 10, 8, 8, 8, 8, 8, 12, 12, 12, 23, 10, 10, 10, 10, 24, 24, 10, 10, 10, 10, 10, 10, 11, 12, 24, 70, 28, 29, 12, 24, 10, 12, 12, 12, 28, 10, 10, 10, 12, 10, 10, 17, 10, 94, 11, 10, 10, 11, 12, 62, 29, 11, 23, 12, 24, 12, 12, 95, 11, 12, 12, 13, 12, 12, 12, 12, 70, 12, 12, 12, 10, 12, 13, 70, 12, 12, 12, 12, 13, 96, 25, 25, 97, 26, 12, 12, 12, 12, 12, 11, 12, 58, 58, 28, 12, 12, 64, 10, 12, 12, 12, 98, 12, 12, 10, 12, 12, 12, 62, 25, 29, 12, 28, 25, 25, 28, 62, 29, 59, 12, 12, 60, 57, 64, 64, 12, 12, 28, 12, 12, 59, 69, 65, 59, 62, 12, 61, 59, 61, 12, 12, 12, 99, 34, 34, 100, 34, 40, 40, 40, 101, 40, 40, 40, 102, 103, 104, 10, 105, 106, 70, 107, 12, 40, 40, 40, 108, 109, 5, 6, 7, 5, 110, 10, 70, 0, 0, 111, 112, 91, 12, 12, 12, 34, 34, 34, 113, 31, 33, 34, 25, 34, 34, 114, 52, 34, 34, 115, 10, 35, 35, 35, 35, 35, 35, 35, 116, 12, 12, 25, 25, 28, 57, 64, 12, 12, 28, 25, 60, 25, 59, 12, 12, 12, 62, 25, 57, 12, 12, 28, 61, 25, 66, 12, 12, 12, 28, 29, 12, 117, 0, 118, 25, 57, 60, 25, 12, 12, 12, 62, 29, 119, 120, 12, 12, 12, 91, 12, 12, 13, 12, 12, 121, 8, 8, 8, 8, 122, 40, 40, 40, 10, 10, 10, 70, 24, 10, 10, 70, 8, 8, 123, 12, 10, 17, 10, 10, 10, 20, 70, 12, 20, 10, 10, 10, 10, 10, 24, 11, 10, 10, 10, 26, 10, 10, 12, 12, 11, 24, 10, 10, 12, 12, 12, 124, }; static RE_UINT8 re_bidi_class_stage_5[] = { 11, 11, 11, 11, 11, 8, 7, 8, 9, 7, 11, 11, 7, 7, 7, 8, 9, 10, 10, 4, 4, 4, 10, 10, 10, 10, 10, 3, 6, 3, 6, 6, 2, 2, 2, 2, 2, 2, 6, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 11, 11, 7, 11, 11, 6, 10, 4, 4, 10, 10, 0, 10, 10, 11, 10, 10, 4, 4, 2, 2, 10, 0, 10, 10, 10, 2, 0, 10, 0, 10, 10, 0, 0, 0, 10, 10, 0, 10, 10, 10, 12, 12, 12, 12, 10, 10, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0, 4, 1, 12, 12, 12, 12, 12, 1, 12, 1, 12, 12, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 13, 10, 10, 13, 4, 4, 13, 6, 13, 10, 10, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 12, 5, 5, 4, 5, 5, 13, 13, 13, 12, 13, 13, 13, 13, 13, 12, 12, 12, 5, 10, 12, 12, 13, 13, 12, 12, 10, 12, 12, 12, 12, 13, 13, 2, 2, 13, 13, 13, 12, 13, 13, 1, 1, 1, 12, 1, 1, 10, 10, 10, 10, 1, 1, 1, 1, 12, 12, 12, 12, 1, 1, 12, 12, 12, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 12, 12, 12, 0, 12, 0, 0, 0, 0, 12, 12, 0, 0, 4, 4, 0, 12, 12, 0, 12, 0, 0, 12, 12, 12, 0, 12, 0, 4, 0, 0, 10, 4, 10, 0, 12, 0, 12, 12, 10, 10, 10, 0, 12, 0, 12, 0, 0, 12, 0, 12, 0, 12, 10, 10, 9, 0, 0, 0, 10, 10, 10, 12, 12, 12, 11, 0, 0, 10, 0, 10, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 0, 1, 9, 7, 16, 17, 18, 14, 15, 6, 4, 4, 4, 4, 4, 10, 10, 10, 6, 10, 10, 10, 10, 10, 10, 9, 11, 11, 19, 20, 21, 22, 11, 11, 2, 0, 0, 0, 2, 2, 3, 3, 0, 10, 0, 0, 0, 0, 4, 0, 10, 10, 3, 4, 9, 10, 10, 10, 0, 12, 12, 10, 12, 12, 12, 10, 12, 12, 10, 10, 4, 4, 0, 0, 0, 1, 12, 1, 1, 3, 1, 1, 13, 13, 10, 10, 13, 10, 13, 13, 6, 10, 6, 0, 10, 6, 10, 10, 10, 10, 10, 4, 10, 10, 3, 3, 10, 4, 4, 10, 13, 13, 13, 11, 0, 10, 10, 4, 10, 4, 4, 0, 11, 10, 10, 10, 10, 10, 11, 11, 1, 1, 1, 10, 12, 12, 12, 1, 1, 10, 10, 10, 5, 5, 5, 1, 0, 0, 0, 11, 11, 11, 11, 12, 10, 10, 12, 12, 12, 10, 0, 0, 0, 0, 2, 2, 10, 10, 13, 13, 2, 2, 2, 0, 0, 0, 11, 11, }; /* Bidi_Class: 3216 bytes. */ RE_UINT32 re_get_bidi_class(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_bidi_class_stage_1[f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_bidi_class_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_bidi_class_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_bidi_class_stage_4[pos + f] << 2; value = re_bidi_class_stage_5[pos + code]; return value; } /* Canonical_Combining_Class. */ static RE_UINT8 re_canonical_combining_class_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_canonical_combining_class_stage_2[] = { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_canonical_combining_class_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 0, 0, 0, 21, 0, 22, 23, 0, 0, 22, 24, 0, 0, 22, 24, 0, 0, 22, 24, 0, 0, 22, 24, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 22, 24, 0, 0, 0, 24, 0, 0, 0, 26, 0, 0, 27, 28, 0, 0, 29, 30, 0, 31, 32, 0, 33, 34, 0, 35, 0, 0, 36, 0, 0, 37, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 39, 39, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 43, 0, 0, 44, 0, 0, 0, 0, 0, 45, 46, 47, 0, 48, 0, 49, 0, 50, 0, 0, 0, 0, 51, 52, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 58, 0, 0, 0, 59, 0, 60, 0, 0, 61, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 64, 65, 0, 0, 0, 0, 0, 46, 66, 0, 67, 68, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, 0, 24, 74, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 79, 0, 0, 80, 81, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 83, 84, 85, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, }; static RE_UINT8 re_canonical_combining_class_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 0, 0, 0, 0, 19, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0, 38, 47, 1, 1, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 21, 43, 51, 52, 21, 35, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 55, 0, 58, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 67, 68, 69, 70, 71, 72, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 59, 0, 0, 78, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 19, 81, 0, 77, 0, 0, 0, 0, 48, 1, 82, 0, 0, 0, 0, 0, 54, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 84, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 53, 9, 12, 4, 85, 8, 86, 76, 0, 57, 0, 0, 21, 1, 21, 87, 88, 1, 1, 1, 1, 53, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 90, 1, 91, 57, 78, 92, 93, 4, 57, 0, 0, 0, 0, 0, 0, 19, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 19, 0, 1, 1, 49, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 49, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 49, 0, 0, 0, 0, 0, 98, 64, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 57, 38, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 1, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 94, 0, 0, 0, 0, 0, 0, 104, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 77, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 106, 107, 108, 109, 0, 98, 4, 110, 48, 23, 0, 0, 0, 0, 0, 0, 0, 38, 49, 0, 0, 0, 0, 38, 57, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_canonical_combining_class_stage_5[] = { 0, 0, 0, 0, 50, 50, 50, 50, 50, 51, 45, 45, 45, 45, 51, 43, 45, 45, 45, 45, 45, 41, 41, 45, 45, 45, 45, 41, 41, 45, 45, 45, 1, 1, 1, 1, 1, 45, 45, 45, 45, 50, 50, 50, 50, 54, 50, 45, 45, 45, 50, 50, 50, 45, 45, 0, 50, 50, 50, 45, 45, 45, 45, 50, 51, 45, 45, 50, 52, 53, 53, 52, 53, 53, 52, 50, 0, 0, 0, 50, 0, 45, 50, 50, 50, 50, 45, 50, 50, 50, 46, 45, 50, 50, 45, 45, 50, 46, 49, 50, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 0, 18, 0, 19, 20, 0, 50, 45, 0, 13, 25, 26, 27, 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 29, 50, 50, 45, 45, 50, 45, 50, 50, 45, 30, 0, 0, 0, 0, 0, 50, 50, 50, 0, 0, 50, 50, 0, 45, 50, 50, 45, 0, 0, 0, 31, 0, 0, 50, 45, 50, 50, 45, 45, 50, 45, 45, 50, 45, 50, 45, 50, 50, 0, 50, 50, 0, 50, 0, 50, 50, 50, 50, 50, 0, 0, 0, 45, 45, 45, 50, 45, 45, 45, 22, 23, 24, 50, 50, 50, 50, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 50, 45, 50, 50, 0, 0, 0, 0, 32, 33, 0, 0, 0, 4, 0, 34, 34, 4, 0, 35, 35, 35, 35, 36, 36, 0, 0, 37, 37, 37, 37, 45, 45, 0, 0, 0, 45, 0, 45, 0, 43, 0, 0, 0, 38, 39, 0, 40, 0, 0, 0, 0, 0, 39, 39, 39, 39, 0, 0, 39, 0, 50, 50, 4, 0, 50, 50, 0, 0, 45, 0, 0, 0, 0, 2, 0, 4, 4, 0, 0, 45, 0, 0, 4, 0, 0, 0, 0, 50, 0, 0, 0, 49, 0, 0, 0, 46, 50, 45, 45, 0, 0, 0, 50, 0, 0, 45, 0, 0, 4, 4, 0, 0, 2, 0, 50, 0, 1, 1, 1, 0, 0, 0, 50, 53, 42, 45, 41, 50, 50, 50, 52, 45, 50, 45, 50, 50, 1, 1, 1, 1, 1, 50, 0, 1, 1, 50, 45, 50, 1, 1, 0, 0, 0, 4, 0, 0, 44, 49, 51, 46, 47, 47, 0, 3, 3, 0, 0, 0, 0, 45, 50, 0, 50, 50, 45, 0, 0, 50, 0, 0, 21, 0, 0, 45, 0, 50, 50, 1, 45, 0, 0, 4, 2, 0, 0, 0, 4, 2, 0, 43, 43, 1, 1, 1, 0, 0, 0, 48, 43, 43, 43, 43, 43, 0, 45, 45, 45, 0, }; /* Canonical_Combining_Class: 1828 bytes. */ RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_canonical_combining_class_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_canonical_combining_class_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_canonical_combining_class_stage_3[pos + f] << 3; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_canonical_combining_class_stage_4[pos + f] << 2; value = re_canonical_combining_class_stage_5[pos + code]; return value; } /* Decomposition_Type. */ static RE_UINT8 re_decomposition_type_stage_1[] = { 0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 7, 8, 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_decomposition_type_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 17, 18, 19, 20, 21, 22, 23, 24, 7, 7, 7, 7, 7, 25, 7, 26, 27, 28, 29, 30, 31, 32, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 34, 7, 7, 7, 7, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 37, 38, 39, 40, 41, 42, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 44, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 45, 7, 7, 46, 47, 48, 49, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 50, 7, 7, 51, 52, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 35, 53, 7, 7, 7, 7, 7, }; static RE_UINT8 re_decomposition_type_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 3, 5, 6, 7, 8, 9, 10, 11, 8, 12, 0, 0, 13, 14, 15, 16, 17, 18, 6, 19, 20, 21, 0, 0, 0, 0, 0, 0, 0, 22, 0, 23, 24, 0, 0, 0, 0, 0, 25, 0, 0, 26, 27, 14, 28, 14, 29, 30, 0, 31, 32, 33, 0, 33, 0, 32, 0, 34, 0, 0, 0, 0, 35, 36, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 41, 0, 0, 0, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 57, 0, 58, 0, 0, 59, 0, 0, 0, 60, 61, 33, 62, 63, 60, 61, 33, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 71, 72, 73, 74, 75, 0, 76, 73, 73, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 77, 6, 6, 6, 6, 6, 78, 6, 79, 6, 6, 79, 80, 6, 81, 6, 6, 6, 82, 83, 84, 6, 85, 86, 87, 88, 89, 90, 91, 0, 92, 93, 94, 95, 0, 0, 0, 0, 0, 96, 97, 98, 99, 100, 101, 102, 102, 103, 104, 105, 0, 106, 0, 0, 0, 107, 0, 108, 109, 110, 0, 111, 112, 112, 0, 113, 0, 0, 0, 114, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 102, 102, 102, 118, 116, 116, 119, 0, 120, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 57, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 126, 0, 0, 127, 0, 0, 128, 129, 130, 131, 132, 0, 133, 129, 130, 131, 132, 0, 134, 0, 0, 0, 135, 102, 102, 102, 102, 136, 137, 0, 0, 0, 0, 0, 0, 102, 136, 102, 102, 138, 139, 116, 140, 116, 116, 116, 116, 141, 116, 116, 140, 142, 142, 142, 142, 142, 143, 102, 144, 142, 142, 142, 142, 142, 142, 102, 145, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 147, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 21, 0, 0, 0, 0, 0, 81, 148, 149, 6, 6, 6, 81, 6, 6, 6, 6, 6, 6, 78, 0, 0, 150, 151, 152, 153, 154, 155, 156, 156, 157, 156, 158, 159, 0, 160, 161, 162, 163, 163, 163, 163, 163, 163, 164, 165, 165, 166, 167, 167, 167, 168, 169, 170, 163, 171, 172, 173, 0, 174, 175, 176, 177, 178, 165, 179, 180, 0, 0, 181, 0, 182, 0, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 196, 196, 196, 196, 197, 198, 198, 198, 198, 199, 200, 201, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 204, 0, 0, 0, 0, 0, 0, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 206, 0, 0, 0, 0, 207, 14, 0, 0, 0, 208, 208, 208, 208, 208, 209, 208, 208, 208, 210, 211, 212, 213, 208, 208, 208, 214, 215, 208, 216, 217, 218, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 219, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 220, 208, 208, 208, 213, 208, 221, 222, 223, 224, 225, 226, 227, 228, 229, 228, 0, 0, 0, 0, 230, 102, 231, 142, 142, 0, 232, 0, 0, 233, 0, 0, 0, 0, 0, 0, 234, 142, 142, 235, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_decomposition_type_stage_4[] = { 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 8, 8, 10, 11, 10, 12, 10, 11, 10, 9, 8, 8, 8, 8, 13, 8, 8, 8, 8, 12, 8, 8, 14, 8, 10, 15, 16, 8, 17, 8, 12, 8, 8, 8, 8, 8, 8, 15, 12, 0, 0, 18, 19, 0, 0, 0, 0, 20, 20, 21, 8, 8, 8, 22, 8, 13, 8, 8, 23, 12, 8, 8, 8, 8, 8, 13, 0, 13, 8, 8, 8, 0, 0, 0, 24, 24, 25, 0, 0, 0, 20, 5, 24, 25, 0, 0, 9, 19, 0, 0, 0, 19, 26, 27, 0, 21, 11, 22, 0, 0, 13, 8, 0, 0, 13, 11, 28, 29, 0, 0, 30, 5, 31, 0, 9, 18, 0, 11, 0, 0, 32, 0, 0, 13, 0, 0, 33, 0, 0, 0, 8, 13, 13, 8, 13, 8, 13, 8, 8, 12, 12, 0, 0, 3, 0, 0, 13, 11, 0, 0, 0, 34, 35, 0, 36, 0, 0, 0, 18, 0, 0, 0, 32, 19, 0, 0, 0, 0, 8, 8, 0, 0, 18, 19, 0, 0, 0, 9, 18, 27, 0, 0, 0, 0, 10, 27, 0, 0, 37, 19, 0, 0, 0, 12, 0, 19, 0, 0, 0, 0, 13, 19, 0, 0, 19, 0, 19, 18, 22, 0, 0, 0, 27, 11, 3, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 18, 0, 0, 32, 27, 18, 0, 19, 18, 38, 17, 0, 32, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 25, 0, 27, 36, 36, 27, 0, 0, 0, 0, 0, 18, 32, 9, 0, 0, 0, 0, 0, 0, 39, 24, 24, 39, 24, 24, 24, 24, 40, 24, 24, 24, 24, 41, 42, 43, 0, 0, 0, 25, 0, 0, 0, 44, 24, 8, 8, 45, 0, 8, 8, 12, 0, 8, 12, 8, 12, 8, 8, 46, 46, 8, 8, 8, 12, 8, 22, 8, 47, 21, 22, 8, 8, 8, 13, 8, 10, 13, 22, 8, 48, 49, 50, 30, 0, 51, 3, 0, 0, 0, 30, 0, 52, 3, 53, 0, 54, 0, 3, 5, 0, 0, 3, 0, 3, 55, 24, 24, 24, 42, 42, 42, 43, 42, 42, 42, 56, 0, 0, 35, 0, 57, 34, 58, 59, 59, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 59, 69, 61, 62, 0, 70, 70, 70, 70, 20, 20, 20, 20, 0, 0, 71, 0, 0, 0, 13, 0, 0, 0, 0, 27, 0, 0, 0, 10, 0, 19, 32, 19, 0, 36, 0, 72, 35, 0, 0, 0, 32, 37, 32, 0, 36, 0, 0, 10, 12, 12, 12, 0, 0, 0, 0, 8, 8, 0, 13, 12, 0, 0, 33, 0, 73, 73, 73, 73, 73, 20, 20, 20, 20, 74, 73, 73, 73, 73, 75, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0, 0, 0, 19, 0, 0, 0, 76, 0, 0, 0, 44, 0, 0, 0, 3, 20, 5, 0, 0, 77, 0, 0, 0, 0, 26, 30, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 46, 32, 0, 9, 22, 33, 12, 0, 19, 3, 78, 0, 37, 11, 79, 34, 20, 20, 20, 20, 20, 20, 30, 4, 24, 24, 24, 20, 73, 0, 0, 80, 73, 73, 73, 73, 73, 73, 75, 20, 20, 20, 81, 81, 81, 81, 81, 81, 81, 20, 20, 82, 81, 81, 81, 20, 20, 20, 83, 25, 0, 0, 0, 0, 0, 55, 0, 36, 10, 8, 11, 36, 33, 13, 8, 20, 30, 0, 0, 3, 20, 0, 46, 59, 59, 84, 8, 8, 11, 8, 36, 9, 22, 8, 15, 85, 86, 86, 86, 86, 86, 86, 86, 86, 85, 85, 85, 87, 85, 86, 86, 88, 0, 0, 0, 89, 90, 91, 92, 85, 87, 86, 85, 85, 85, 93, 87, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 99, 99, 99, 99, 99, 100, 94, 94, 101, 95, 95, 95, 95, 95, 95, 102, 97, 99, 99, 103, 104, 97, 105, 106, 107, 105, 108, 105, 104, 96, 95, 105, 96, 109, 110, 97, 111, 106, 112, 105, 95, 106, 113, 95, 96, 106, 0, 0, 94, 94, 94, 114, 115, 115, 116, 0, 115, 115, 115, 115, 115, 117, 118, 20, 119, 120, 120, 120, 120, 119, 120, 0, 121, 122, 123, 123, 124, 91, 125, 126, 90, 125, 127, 127, 127, 127, 126, 91, 125, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 125, 126, 91, 128, 129, 130, 130, 130, 130, 130, 130, 130, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 134, 132, 134, 132, 134, 132, 134, 135, 130, 136, 132, 133, 0, 0, 27, 19, 0, 0, 18, 0, 0, 0, 0, 13, 8, 19, 0, 0, 0, 0, 18, 8, 59, 59, 59, 59, 59, 137, 59, 59, 59, 59, 59, 137, 138, 139, 61, 137, 59, 59, 66, 61, 59, 61, 59, 59, 59, 66, 140, 61, 59, 137, 59, 137, 59, 59, 66, 140, 59, 141, 142, 59, 137, 59, 59, 59, 59, 62, 59, 59, 59, 59, 59, 142, 139, 143, 61, 59, 140, 59, 144, 0, 138, 145, 144, 61, 139, 143, 144, 144, 139, 143, 140, 59, 140, 59, 61, 141, 59, 59, 66, 59, 59, 59, 59, 0, 61, 61, 66, 59, 20, 20, 30, 0, 20, 20, 146, 75, 0, 0, 4, 0, 147, 0, 0, 0, 148, 0, 0, 0, 81, 81, 148, 0, 20, 20, 35, 0, 149, 0, 0, 0, }; static RE_UINT8 re_decomposition_type_stage_5[] = { 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 10, 0, 0, 0, 0, 2, 0, 0, 10, 10, 2, 2, 0, 0, 2, 10, 10, 0, 17, 17, 17, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 2, 2, 1, 1, 1, 2, 2, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 2, 2, 1, 1, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 2, 10, 10, 10, 0, 10, 10, 0, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 10, 1, 1, 2, 1, 0, 1, 0, 1, 1, 2, 1, 2, 1, 1, 2, 0, 1, 1, 2, 2, 2, 2, 2, 4, 0, 4, 0, 0, 0, 0, 0, 4, 2, 0, 2, 2, 2, 0, 2, 0, 10, 10, 0, 0, 11, 0, 0, 0, 2, 2, 3, 2, 0, 2, 3, 3, 3, 3, 3, 3, 0, 3, 2, 0, 0, 3, 3, 3, 3, 3, 0, 0, 10, 2, 10, 0, 3, 0, 1, 0, 3, 0, 1, 1, 3, 3, 0, 3, 3, 2, 2, 2, 2, 3, 0, 2, 3, 0, 0, 0, 17, 17, 17, 17, 0, 17, 0, 0, 2, 2, 0, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, 9, 0, 11, 10, 0, 0, 13, 0, 0, 0, 2, 0, 1, 12, 0, 0, 1, 12, 16, 9, 9, 9, 16, 16, 16, 16, 2, 16, 16, 16, 2, 2, 2, 16, 3, 3, 1, 1, 8, 7, 8, 7, 5, 6, 8, 7, 8, 7, 5, 6, 8, 7, 0, 0, 0, 0, 0, 8, 7, 5, 6, 8, 7, 8, 7, 8, 7, 8, 8, 7, 5, 8, 7, 5, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 7, 7, 7, 7, 5, 5, 5, 7, 8, 0, 0, 5, 7, 5, 5, 7, 5, 7, 7, 5, 5, 7, 7, 5, 5, 7, 5, 5, 7, 7, 5, 7, 7, 5, 7, 5, 5, 5, 7, 0, 0, 5, 5, 5, 7, 7, 7, 5, 7, 5, 7, 8, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 12, 12, 2, 2, 2, 15, 15, 15, 0, 15, 15, 15, 15, 8, 6, 8, 0, 8, 0, 8, 6, 8, 6, 8, 6, 8, 8, 7, 8, 7, 8, 7, 5, 6, 8, 7, 8, 6, 8, 7, 5, 7, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 0, 0, 13, 13, 13, 0, 3, 0, 3, 3, 0, 0, 3, 0, 0, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 3, 3, 3, 0, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 2, 2, 2, 9, 16, 0, 0, 0, 16, 16, 16, 0, 9, 9, 0, 0, }; /* Decomposition_Type: 2872 bytes. */ RE_UINT32 re_get_decomposition_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_decomposition_type_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_decomposition_type_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_decomposition_type_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_decomposition_type_stage_4[pos + f] << 2; value = re_decomposition_type_stage_5[pos + code]; return value; } /* East_Asian_Width. */ static RE_UINT8 re_east_asian_width_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 15, }; static RE_UINT8 re_east_asian_width_stage_2[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 5, 15, 5, 16, 5, 5, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, 5, 5, 5, 5, 25, 5, 5, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 26, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 22, 22, 5, 5, 5, 28, 29, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 30, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 31, 32, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 33, 5, 34, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 35, }; static RE_UINT8 re_east_asian_width_stage_3[] = { 0, 0, 1, 1, 1, 1, 1, 2, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 11, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 17, 18, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 0, 20, 21, 20, 21, 0, 0, 0, 9, 19, 19, 19, 19, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 27, 0, 28, 0, 0, 0, 0, 0, 29, 30, 31, 0, 0, 32, 33, 34, 35, 34, 0, 36, 0, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 0, 46, 47, 48, 49, 0, 0, 0, 0, 0, 44, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 51, 19, 19, 19, 19, 19, 33, 19, 19, 52, 19, 53, 21, 54, 55, 56, 57, 0, 58, 59, 0, 0, 60, 0, 61, 0, 0, 62, 0, 62, 63, 19, 64, 19, 0, 0, 0, 65, 0, 38, 0, 66, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 70, 22, 22, 22, 22, 22, 71, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 72, 0, 73, 74, 22, 22, 75, 76, 22, 22, 22, 22, 77, 22, 22, 22, 22, 22, 22, 78, 22, 79, 76, 22, 22, 22, 22, 75, 22, 22, 80, 22, 22, 71, 22, 22, 75, 22, 22, 81, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 75, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 82, 22, 22, 22, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 82, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 71, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 84, 0, 22, 22, 85, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, 88, 88, 88, 88, 89, 90, 90, 90, 90, 91, 92, 93, 94, 65, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 19, 97, 19, 19, 19, 34, 19, 19, 96, 0, 0, 0, 0, 0, 0, 98, 22, 22, 80, 99, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 79, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 97, }; static RE_UINT8 re_east_asian_width_stage_4[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 0, 10, 0, 0, 11, 12, 11, 13, 14, 10, 9, 14, 8, 12, 9, 5, 15, 0, 0, 0, 16, 0, 12, 0, 0, 13, 12, 0, 17, 0, 11, 12, 9, 11, 7, 15, 13, 0, 0, 0, 0, 0, 0, 10, 5, 5, 5, 11, 0, 18, 17, 15, 11, 0, 7, 16, 7, 7, 7, 7, 17, 7, 7, 7, 19, 7, 14, 0, 20, 20, 20, 20, 18, 9, 14, 14, 9, 7, 0, 0, 8, 15, 12, 10, 0, 11, 0, 12, 17, 11, 0, 0, 0, 0, 21, 11, 12, 15, 15, 0, 12, 10, 0, 0, 22, 10, 12, 0, 12, 11, 12, 9, 7, 7, 7, 0, 7, 7, 14, 0, 0, 0, 15, 0, 0, 0, 14, 0, 10, 11, 0, 0, 0, 12, 0, 0, 8, 12, 18, 12, 15, 15, 10, 17, 18, 16, 7, 5, 0, 7, 0, 14, 0, 0, 11, 11, 10, 0, 0, 0, 14, 7, 13, 13, 13, 13, 0, 0, 0, 15, 15, 0, 0, 15, 0, 0, 0, 0, 0, 12, 0, 0, 23, 0, 7, 7, 19, 7, 7, 0, 0, 0, 13, 14, 0, 0, 13, 13, 0, 14, 14, 13, 18, 13, 14, 0, 0, 0, 13, 14, 0, 12, 0, 22, 15, 13, 0, 14, 0, 5, 5, 0, 0, 0, 19, 19, 9, 19, 0, 0, 0, 13, 0, 7, 7, 19, 19, 0, 7, 7, 0, 0, 0, 15, 0, 13, 7, 7, 0, 24, 1, 25, 0, 26, 0, 0, 0, 17, 14, 0, 20, 20, 27, 20, 20, 0, 0, 0, 20, 28, 0, 0, 20, 20, 20, 0, 29, 20, 20, 20, 20, 20, 20, 30, 31, 20, 20, 20, 20, 30, 31, 20, 0, 31, 20, 20, 20, 20, 20, 28, 20, 20, 30, 0, 20, 20, 7, 7, 20, 20, 20, 32, 20, 30, 0, 0, 20, 20, 28, 0, 30, 20, 20, 20, 20, 30, 20, 0, 33, 34, 34, 34, 34, 34, 34, 34, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 36, 38, 36, 38, 36, 38, 39, 34, 40, 36, 37, 28, 0, 0, 0, 7, 7, 9, 0, 7, 7, 7, 14, 30, 0, 0, 0, 20, 20, 32, 0, }; static RE_UINT8 re_east_asian_width_stage_5[] = { 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 1, 5, 5, 1, 5, 5, 1, 1, 0, 1, 0, 5, 1, 1, 5, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 3, 3, 3, 3, 0, 2, 0, 0, 0, 1, 1, 0, 0, 3, 3, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 5, 5, 0, 3, 3, 0, 3, 3, 3, 0, 0, 4, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 4, 4, 4, 0, }; /* East_Asian_Width: 1668 bytes. */ RE_UINT32 re_get_east_asian_width(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_east_asian_width_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_east_asian_width_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_east_asian_width_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_east_asian_width_stage_4[pos + f] << 2; value = re_east_asian_width_stage_5[pos + code]; return value; } /* Joining_Group. */ static RE_UINT8 re_joining_group_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_joining_group_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_joining_group_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_joining_group_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 0, 21, 0, 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_joining_group_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 3, 3, 43, 3, 45, 3, 4, 41, 4, 4, 13, 13, 13, 6, 6, 31, 31, 35, 35, 33, 33, 39, 39, 1, 1, 11, 11, 55, 55, 55, 0, 9, 29, 19, 22, 24, 26, 16, 43, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 29, 0, 3, 3, 3, 0, 3, 43, 43, 45, 4, 4, 4, 4, 4, 4, 4, 4, 13, 13, 13, 13, 13, 13, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 35, 35, 33, 33, 39, 1, 9, 9, 9, 9, 9, 9, 29, 29, 11, 38, 11, 19, 19, 19, 11, 11, 11, 11, 11, 11, 22, 22, 22, 22, 26, 26, 26, 26, 56, 21, 13, 41, 17, 17, 14, 43, 43, 43, 43, 43, 43, 43, 43, 55, 47, 55, 43, 45, 45, 46, 46, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 6, 31, 0, 0, 35, 33, 1, 0, 0, 21, 2, 0, 5, 12, 12, 7, 7, 15, 44, 50, 18, 42, 42, 48, 49, 20, 23, 25, 27, 36, 10, 8, 28, 32, 34, 30, 7, 37, 40, 5, 12, 7, 0, 0, 0, 0, 0, 51, 52, 53, 4, 4, 4, 4, 4, 4, 4, 13, 13, 6, 6, 31, 35, 1, 1, 1, 9, 9, 11, 11, 11, 24, 24, 26, 26, 26, 22, 31, 31, 35, 13, 13, 35, 31, 13, 3, 3, 55, 55, 45, 43, 43, 54, 54, 13, 35, 35, 19, 4, 0, 13, 39, 9, 29, 22, 24, 45, 45, 31, 43, 57, 0, 0, 0, }; /* Joining_Group: 481 bytes. */ RE_UINT32 re_get_joining_group(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_joining_group_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_joining_group_stage_2[pos + f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_joining_group_stage_3[pos + f] << 4; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_joining_group_stage_4[pos + f] << 3; value = re_joining_group_stage_5[pos + code]; return value; } /* Joining_Type. */ static RE_UINT8 re_joining_type_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_joining_type_stage_2[] = { 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 1, 16, 1, 1, 1, 17, 18, 19, 20, 21, 22, 23, 1, 1, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, 1, 1, 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 1, 29, 30, 31, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 1, 38, 39, 1, 1, 1, 1, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 44, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_joining_type_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 5, 6, 0, 0, 0, 0, 7, 8, 9, 10, 2, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 2, 23, 24, 25, 26, 0, 0, 27, 28, 29, 15, 30, 31, 0, 32, 33, 0, 34, 35, 0, 0, 0, 0, 36, 0, 0, 0, 37, 38, 39, 0, 0, 40, 41, 42, 43, 0, 44, 0, 0, 45, 46, 0, 43, 0, 47, 0, 0, 45, 48, 44, 0, 49, 47, 0, 0, 45, 50, 0, 43, 0, 44, 0, 0, 51, 46, 52, 43, 0, 53, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 43, 0, 0, 0, 0, 51, 58, 0, 43, 0, 0, 0, 0, 0, 46, 0, 43, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0, 65, 0, 66, 0, 0, 0, 67, 68, 69, 2, 70, 52, 0, 0, 0, 0, 0, 71, 72, 0, 73, 28, 74, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 76, 0, 43, 0, 43, 0, 0, 0, 77, 78, 79, 0, 0, 80, 0, 15, 15, 15, 15, 15, 81, 82, 15, 83, 0, 0, 0, 0, 0, 0, 0, 84, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 91, 53, 0, 92, 90, 93, 0, 94, 0, 0, 0, 95, 93, 0, 0, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 101, 96, 102, 0, 103, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 2, 2, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 93, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 105, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 107, 0, 20, 0, 0, 0, 0, 0, 93, 108, 0, 57, 0, 15, 15, 15, 109, 0, 0, 0, 0, 100, 0, 2, 93, 0, 0, 110, 0, 111, 93, 0, 0, 39, 0, 0, 112, 0, 0, 0, 0, 0, 0, 113, 114, 115, 0, 0, 0, 0, 0, 0, 116, 44, 0, 117, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 121, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 123, 101, 0, 0, 0, 93, 0, 0, 124, 0, 0, 0, 0, 39, 0, 125, 126, 0, 0, 0, 0, 93, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 131, 132, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, }; static RE_UINT8 re_joining_type_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 3, 2, 4, 0, 5, 2, 2, 2, 2, 2, 2, 6, 7, 6, 0, 0, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 16, 15, 17, 2, 0, 0, 0, 18, 19, 20, 15, 15, 15, 15, 21, 21, 21, 21, 22, 15, 15, 15, 15, 15, 23, 21, 21, 24, 25, 26, 2, 27, 2, 27, 28, 29, 0, 0, 18, 30, 0, 0, 0, 3, 31, 32, 22, 33, 15, 15, 34, 23, 2, 2, 8, 35, 15, 15, 32, 15, 15, 15, 13, 36, 24, 36, 22, 15, 0, 37, 2, 2, 9, 0, 0, 0, 0, 0, 18, 15, 15, 15, 38, 2, 2, 0, 39, 0, 0, 37, 6, 2, 2, 5, 5, 4, 36, 33, 12, 13, 15, 40, 5, 0, 41, 15, 25, 42, 0, 2, 2, 2, 2, 2, 2, 8, 8, 0, 0, 0, 0, 0, 43, 9, 5, 2, 9, 1, 5, 2, 0, 0, 37, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 9, 5, 9, 0, 1, 7, 0, 0, 0, 7, 3, 27, 4, 4, 1, 0, 0, 5, 6, 9, 1, 0, 0, 0, 27, 0, 43, 0, 0, 43, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 37, 9, 37, 28, 4, 0, 7, 0, 0, 0, 43, 0, 4, 0, 0, 43, 0, 37, 44, 0, 0, 1, 2, 8, 0, 0, 3, 2, 8, 1, 2, 6, 9, 0, 0, 2, 4, 0, 0, 4, 0, 0, 45, 1, 0, 5, 2, 2, 8, 2, 28, 0, 5, 2, 2, 5, 2, 2, 2, 2, 9, 0, 0, 0, 5, 28, 2, 7, 7, 0, 0, 4, 37, 5, 9, 0, 0, 43, 7, 0, 1, 37, 9, 0, 0, 0, 6, 2, 4, 0, 43, 5, 2, 2, 0, 0, 1, 0, 46, 47, 4, 15, 15, 0, 0, 0, 46, 15, 15, 15, 15, 48, 0, 8, 3, 9, 0, 43, 0, 5, 0, 0, 3, 27, 0, 0, 43, 2, 8, 44, 5, 2, 9, 3, 2, 2, 27, 2, 0, 0, 0, 0, 28, 8, 9, 0, 0, 3, 2, 4, 0, 0, 0, 37, 4, 6, 0, 0, 43, 4, 45, 0, 0, 0, 2, 2, 37, 0, 0, 8, 2, 2, 2, 28, 2, 9, 1, 0, 9, 0, 0, 2, 8, 0, 0, 0, 0, 3, 49, 0, 0, 37, 8, 2, 9, 37, 2, 0, 0, 37, 4, 0, 0, 7, 0, 8, 2, 2, 4, 43, 43, 3, 0, 50, 0, 0, 0, 0, 37, 2, 4, 0, 3, 2, 2, 3, 37, 4, 9, 0, 0, 5, 8, 7, 7, 0, 0, 3, 0, 0, 9, 28, 27, 9, 37, 0, 0, 0, 4, 0, 1, 9, 1, 0, 0, 0, 43, 0, 0, 5, 0, 5, 7, 0, 2, 0, 0, 8, 3, 0, 0, 2, 2, 3, 8, 7, 1, 0, 3, 2, 5, 2, 9, 0, 0, 0, 37, 2, 8, 0, 0, 3, 1, 2, 6, 0, 0, 0, 3, 4, 0, 3, 2, 2, 2, 8, 5, 2, 0, }; static RE_UINT8 re_joining_type_stage_5[] = { 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 5, 0, 5, 0, 0, 0, 2, 0, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 2, 2, 2, 3, 2, 2, 5, 0, 0, 2, 2, 5, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 2, 3, 2, 3, 2, 3, 2, 2, 3, 3, 0, 3, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 3, 3, 2, 0, 0, 2, 3, 5, 2, 2, 2, 3, 3, 3, 2, 2, 3, 2, 3, 2, 3, 2, 0, 3, 2, 2, 3, 2, 2, 2, 0, 0, 5, 5, 2, 2, 2, 5, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 2, 2, 3, 0, 0, 0, 0, 0, 5, 0, 5, 0, 5, 0, 0, 5, 0, 5, 0, 0, 0, 2, 0, 0, 1, 5, 2, 5, 2, 0, 0, 1, 5, 5, 2, 2, 4, 0, }; /* Joining_Type: 1896 bytes. */ RE_UINT32 re_get_joining_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_joining_type_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_joining_type_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_joining_type_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_joining_type_stage_4[pos + f] << 2; value = re_joining_type_stage_5[pos + code]; return value; } /* Line_Break. */ static RE_UINT8 re_line_break_stage_1[] = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 10, 10, 16, 10, 10, 10, 10, 17, 10, 18, 19, 20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 22, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, }; static RE_UINT8 re_line_break_stage_2[] = { 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 2, 2, 2, 2, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 2, 51, 2, 2, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 87, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 88, 79, 79, 79, 79, 79, 79, 79, 79, 89, 2, 2, 90, 91, 2, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, 101, 102, 103, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 79, 79, 79, 79, 110, 111, 2, 2, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 72, 122, 123, 124, 2, 125, 72, 72, 72, 72, 72, 72, 126, 72, 127, 128, 129, 72, 130, 72, 131, 72, 72, 72, 132, 72, 72, 72, 133, 134, 135, 136, 72, 72, 72, 72, 72, 72, 72, 72, 72, 137, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 2, 138, 72, 139, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 140, 141, 142, 2, 143, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 144, 72, 72, 72, 72, 72, 72, 72, 72, 72, 145, 146, 147, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 2, 148, 149, 150, 151, 72, 152, 72, 153, 154, 155, 2, 2, 156, 2, 157, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 158, 159, 72, 72, 160, 161, 162, 163, 164, 72, 165, 166, 167, 168, 169, 170, 171, 172, 173, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 174, 175, 72, 176, 177, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, }; static RE_UINT16 re_line_break_stage_3[] = { 0, 1, 2, 3, 4, 5, 4, 6, 7, 1, 8, 9, 4, 10, 4, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 12, 4, 4, 1, 1, 1, 1, 13, 14, 15, 16, 17, 4, 18, 4, 4, 4, 4, 4, 19, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20, 21, 4, 22, 21, 4, 23, 24, 1, 25, 26, 27, 28, 29, 30, 31, 4, 4, 32, 1, 33, 34, 4, 4, 4, 4, 4, 35, 36, 37, 38, 39, 4, 1, 40, 4, 4, 4, 4, 4, 41, 42, 37, 4, 32, 43, 4, 44, 45, 46, 4, 47, 48, 48, 48, 48, 49, 48, 48, 48, 50, 51, 52, 4, 4, 53, 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 58, 59, 66, 67, 68, 69, 70, 71, 18, 59, 72, 73, 74, 63, 75, 57, 58, 59, 72, 76, 77, 63, 20, 78, 79, 80, 81, 82, 83, 69, 84, 85, 86, 59, 87, 88, 89, 63, 90, 91, 86, 59, 92, 88, 93, 63, 94, 91, 86, 4, 95, 96, 97, 63, 98, 99, 100, 4, 101, 102, 103, 48, 104, 105, 106, 106, 107, 108, 109, 48, 48, 110, 111, 112, 113, 114, 115, 48, 48, 116, 117, 37, 118, 56, 4, 119, 120, 121, 122, 1, 123, 124, 125, 48, 48, 106, 106, 106, 106, 126, 106, 106, 106, 106, 127, 4, 4, 128, 4, 4, 4, 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, 131, 132, 132, 132, 132, 132, 4, 4, 4, 4, 133, 134, 4, 4, 133, 4, 4, 135, 136, 137, 4, 4, 4, 136, 4, 4, 4, 138, 139, 119, 4, 140, 4, 4, 4, 4, 4, 141, 142, 4, 4, 4, 4, 4, 4, 4, 142, 143, 4, 4, 4, 4, 144, 74, 145, 146, 4, 147, 4, 148, 145, 149, 106, 106, 106, 106, 106, 150, 151, 140, 152, 151, 4, 4, 4, 4, 4, 20, 4, 4, 153, 4, 4, 4, 4, 154, 4, 119, 155, 155, 156, 106, 157, 158, 106, 106, 159, 106, 160, 161, 4, 4, 4, 162, 106, 106, 106, 163, 106, 164, 151, 151, 157, 48, 48, 48, 48, 48, 165, 4, 4, 166, 167, 168, 169, 170, 171, 4, 172, 37, 4, 4, 41, 173, 4, 4, 166, 174, 175, 37, 4, 176, 48, 48, 48, 48, 20, 177, 178, 179, 4, 4, 4, 4, 1, 1, 180, 181, 4, 182, 4, 4, 182, 183, 4, 184, 4, 4, 4, 185, 185, 186, 4, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 119, 197, 198, 199, 1, 1, 200, 201, 202, 203, 4, 4, 204, 205, 206, 207, 206, 4, 4, 4, 208, 4, 4, 209, 210, 211, 212, 213, 214, 215, 4, 216, 217, 218, 219, 4, 4, 4, 4, 4, 220, 221, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 222, 4, 4, 223, 48, 224, 48, 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 205, 225, 225, 227, 225, 228, 229, 230, 231, 232, 233, 4, 234, 235, 4, 236, 237, 4, 238, 239, 4, 240, 4, 241, 242, 243, 244, 245, 246, 4, 4, 4, 4, 247, 248, 249, 225, 250, 4, 4, 251, 4, 252, 4, 253, 254, 4, 4, 4, 255, 4, 256, 4, 4, 4, 4, 119, 257, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 4, 4, 46, 4, 4, 46, 4, 4, 4, 4, 4, 4, 4, 4, 258, 259, 4, 4, 128, 4, 4, 4, 260, 261, 4, 223, 262, 262, 262, 262, 1, 1, 263, 264, 265, 266, 48, 48, 48, 48, 267, 268, 267, 267, 267, 267, 267, 222, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 269, 48, 270, 271, 272, 273, 274, 275, 267, 276, 267, 277, 278, 279, 267, 276, 267, 277, 280, 281, 267, 282, 283, 267, 267, 267, 267, 284, 267, 267, 285, 267, 267, 222, 286, 267, 284, 267, 267, 287, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 284, 267, 267, 267, 267, 4, 4, 4, 4, 267, 288, 267, 267, 267, 267, 267, 267, 289, 267, 267, 267, 290, 4, 4, 176, 291, 4, 292, 48, 4, 4, 258, 293, 4, 294, 4, 4, 4, 4, 4, 295, 46, 296, 224, 48, 48, 48, 48, 90, 297, 4, 298, 299, 4, 4, 4, 300, 301, 4, 4, 166, 302, 151, 1, 303, 37, 4, 304, 4, 305, 306, 129, 307, 52, 4, 4, 308, 309, 310, 48, 48, 4, 4, 311, 180, 312, 313, 106, 159, 106, 106, 106, 106, 314, 315, 32, 316, 317, 318, 262, 48, 48, 48, 48, 48, 48, 48, 48, 48, 4, 4, 319, 151, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 320, 321, 322, 323, 322, 324, 322, 323, 322, 325, 130, 326, 132, 132, 327, 328, 328, 328, 328, 328, 328, 328, 328, 223, 329, 330, 331, 332, 4, 4, 4, 4, 4, 4, 4, 333, 334, 4, 4, 4, 4, 4, 335, 48, 4, 4, 4, 4, 336, 4, 4, 20, 48, 48, 337, 1, 338, 180, 339, 340, 341, 342, 185, 4, 4, 4, 4, 4, 4, 4, 343, 344, 345, 267, 346, 267, 347, 348, 349, 4, 350, 4, 46, 351, 352, 353, 354, 355, 4, 137, 356, 184, 184, 48, 48, 4, 4, 4, 4, 4, 4, 4, 224, 357, 4, 4, 358, 4, 4, 4, 4, 224, 359, 48, 48, 48, 4, 4, 360, 4, 119, 4, 4, 4, 74, 48, 48, 4, 46, 296, 4, 224, 48, 48, 48, 4, 361, 4, 4, 362, 363, 48, 48, 4, 184, 151, 48, 48, 48, 48, 48, 364, 4, 4, 365, 4, 366, 48, 48, 4, 367, 4, 368, 48, 48, 48, 48, 4, 4, 4, 369, 48, 48, 48, 48, 370, 371, 4, 372, 20, 373, 4, 4, 4, 4, 4, 374, 4, 375, 4, 376, 4, 4, 4, 4, 377, 48, 48, 48, 48, 48, 48, 48, 48, 48, 4, 46, 171, 4, 4, 378, 379, 336, 380, 48, 171, 4, 4, 381, 382, 4, 377, 151, 171, 4, 305, 383, 384, 48, 48, 48, 171, 4, 4, 308, 385, 151, 48, 48, 4, 4, 32, 386, 151, 48, 48, 48, 4, 4, 4, 4, 4, 4, 46, 48, 4, 4, 4, 4, 4, 4, 387, 384, 4, 4, 4, 4, 4, 388, 4, 4, 389, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 390, 4, 4, 46, 48, 48, 48, 48, 48, 4, 4, 4, 377, 48, 48, 48, 48, 4, 4, 4, 4, 141, 391, 1, 51, 392, 171, 48, 48, 48, 48, 48, 48, 393, 48, 48, 48, 48, 48, 48, 48, 4, 4, 4, 4, 4, 4, 4, 154, 4, 4, 22, 4, 4, 4, 394, 1, 395, 4, 396, 4, 4, 184, 48, 48, 4, 4, 4, 4, 397, 48, 48, 48, 4, 4, 4, 4, 4, 223, 4, 333, 4, 4, 4, 4, 4, 185, 4, 4, 4, 145, 398, 399, 400, 4, 4, 4, 401, 402, 4, 403, 404, 86, 4, 4, 4, 4, 375, 4, 4, 4, 4, 4, 4, 4, 4, 4, 405, 406, 406, 406, 400, 4, 407, 408, 409, 410, 411, 412, 413, 359, 414, 359, 48, 48, 48, 333, 267, 267, 270, 267, 267, 267, 267, 267, 267, 222, 284, 415, 283, 283, 48, 48, 416, 225, 417, 225, 225, 225, 418, 225, 225, 416, 48, 48, 48, 48, 419, 420, 421, 267, 267, 285, 422, 393, 48, 48, 267, 267, 423, 424, 267, 267, 267, 289, 267, 222, 267, 425, 426, 48, 267, 423, 267, 267, 267, 284, 427, 267, 267, 267, 267, 267, 428, 429, 267, 267, 267, 430, 431, 432, 433, 434, 296, 267, 435, 48, 48, 48, 48, 48, 48, 48, 48, 436, 267, 267, 267, 267, 437, 48, 48, 48, 267, 267, 267, 267, 269, 48, 48, 48, 4, 4, 4, 4, 4, 4, 4, 296, 267, 267, 267, 267, 267, 267, 267, 282, 438, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, }; static RE_UINT8 re_line_break_stage_4[] = { 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 13, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, 14, 14, 14, 14, 16, 18, 19, 0, 0, 20, 0, 0, 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 14, 22, 28, 29, 28, 28, 26, 28, 30, 14, 14, 14, 24, 14, 14, 14, 14, 14, 14, 14, 24, 31, 28, 31, 14, 25, 14, 14, 14, 28, 28, 24, 32, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 34, 34, 35, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 36, 14, 14, 37, 36, 36, 14, 14, 14, 38, 38, 14, 14, 39, 14, 14, 14, 14, 14, 14, 14, 19, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 36, 36, 36, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 38, 39, 14, 14, 14, 14, 14, 14, 14, 40, 41, 36, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 19, 45, 0, 46, 36, 36, 36, 36, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 36, 36, 47, 49, 38, 36, 36, 36, 36, 36, 14, 14, 38, 14, 50, 51, 13, 14, 0, 0, 0, 0, 0, 52, 53, 54, 14, 14, 14, 14, 14, 19, 0, 0, 12, 12, 12, 12, 12, 55, 56, 14, 45, 14, 14, 14, 14, 14, 14, 14, 14, 14, 57, 0, 0, 0, 45, 19, 0, 0, 45, 19, 45, 0, 0, 14, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 39, 19, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 53, 39, 14, 14, 14, 14, 0, 0, 0, 0, 0, 45, 36, 36, 36, 36, 36, 36, 36, 0, 0, 14, 14, 58, 38, 36, 36, 14, 14, 14, 0, 0, 19, 0, 0, 0, 0, 19, 0, 19, 0, 0, 36, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 14, 14, 19, 0, 36, 38, 36, 36, 36, 36, 36, 36, 36, 36, 38, 14, 14, 14, 14, 14, 38, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 45, 0, 19, 0, 0, 0, 14, 14, 14, 14, 14, 0, 59, 12, 12, 12, 12, 12, 14, 14, 14, 14, 39, 14, 14, 14, 43, 0, 39, 14, 14, 14, 38, 39, 38, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 14, 38, 38, 36, 14, 14, 36, 45, 0, 0, 0, 53, 43, 53, 43, 0, 38, 36, 36, 36, 43, 36, 36, 14, 39, 14, 0, 36, 12, 12, 12, 12, 12, 14, 51, 14, 14, 50, 9, 36, 36, 43, 0, 39, 14, 14, 38, 36, 39, 38, 14, 39, 38, 14, 36, 53, 0, 0, 53, 36, 43, 53, 43, 0, 36, 43, 36, 36, 36, 39, 14, 38, 38, 36, 36, 36, 12, 12, 12, 12, 12, 0, 14, 19, 36, 36, 36, 36, 36, 43, 0, 39, 14, 14, 14, 14, 39, 38, 14, 39, 14, 14, 36, 45, 0, 0, 0, 0, 43, 0, 43, 0, 36, 38, 36, 36, 36, 36, 36, 36, 36, 9, 36, 36, 36, 36, 36, 36, 36, 0, 0, 53, 43, 53, 43, 0, 36, 36, 36, 36, 0, 36, 36, 14, 39, 36, 45, 39, 14, 14, 38, 36, 14, 38, 14, 14, 36, 39, 38, 38, 14, 36, 39, 38, 36, 14, 38, 36, 14, 14, 14, 14, 14, 14, 36, 36, 0, 0, 53, 36, 0, 53, 0, 0, 36, 38, 36, 36, 43, 36, 36, 36, 36, 14, 14, 14, 14, 9, 38, 36, 36, 43, 0, 39, 14, 14, 14, 38, 14, 38, 14, 14, 14, 14, 14, 14, 14, 14, 14, 39, 14, 14, 36, 39, 0, 0, 0, 53, 0, 53, 0, 0, 36, 36, 36, 43, 53, 14, 36, 36, 36, 36, 36, 36, 36, 14, 14, 14, 14, 36, 0, 39, 14, 14, 14, 38, 14, 14, 14, 39, 14, 14, 36, 45, 0, 36, 36, 43, 53, 36, 36, 36, 38, 39, 38, 36, 36, 36, 36, 36, 36, 14, 14, 14, 14, 14, 38, 39, 0, 0, 0, 53, 0, 53, 0, 0, 38, 36, 36, 36, 43, 36, 36, 36, 36, 14, 14, 14, 36, 60, 14, 14, 14, 36, 0, 39, 14, 14, 14, 14, 14, 14, 14, 14, 38, 36, 14, 14, 14, 14, 39, 14, 14, 14, 14, 39, 36, 14, 14, 14, 38, 36, 53, 36, 43, 0, 0, 53, 53, 0, 0, 0, 0, 36, 0, 38, 36, 36, 36, 36, 36, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 36, 42, 62, 62, 62, 62, 62, 62, 62, 64, 12, 12, 12, 12, 12, 59, 36, 36, 61, 63, 63, 61, 63, 63, 61, 36, 36, 36, 62, 62, 61, 62, 62, 62, 61, 62, 61, 61, 36, 62, 61, 62, 62, 62, 62, 62, 62, 61, 62, 36, 62, 62, 63, 63, 62, 62, 62, 36, 12, 12, 12, 12, 12, 36, 62, 62, 32, 65, 29, 65, 66, 67, 68, 54, 54, 69, 57, 14, 0, 14, 14, 14, 14, 14, 44, 19, 19, 70, 70, 0, 14, 14, 14, 14, 14, 14, 38, 36, 43, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 14, 14, 19, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 59, 14, 14, 14, 45, 14, 14, 38, 14, 65, 71, 14, 14, 72, 73, 36, 36, 12, 12, 12, 12, 12, 59, 14, 14, 12, 12, 12, 12, 12, 62, 62, 62, 14, 14, 14, 39, 36, 36, 39, 36, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 14, 14, 14, 14, 38, 14, 14, 36, 14, 14, 14, 38, 38, 14, 14, 36, 38, 14, 14, 36, 14, 14, 14, 38, 38, 14, 14, 36, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 14, 14, 14, 14, 14, 14, 14, 38, 43, 0, 27, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 36, 36, 14, 14, 38, 36, 36, 36, 36, 36, 77, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 78, 36, 14, 14, 14, 14, 14, 27, 59, 14, 14, 14, 14, 14, 14, 14, 38, 14, 14, 0, 53, 36, 36, 36, 36, 36, 14, 0, 1, 41, 36, 36, 36, 36, 14, 0, 36, 36, 36, 36, 36, 36, 38, 0, 36, 36, 36, 36, 36, 36, 62, 62, 59, 79, 77, 80, 62, 36, 12, 12, 12, 12, 12, 36, 36, 36, 14, 54, 59, 29, 54, 19, 0, 73, 14, 14, 14, 14, 19, 38, 36, 36, 14, 14, 14, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 36, 36, 38, 36, 54, 12, 12, 12, 12, 12, 62, 62, 62, 62, 62, 62, 62, 36, 62, 62, 63, 36, 36, 36, 36, 36, 62, 62, 62, 62, 62, 62, 36, 36, 62, 62, 62, 62, 62, 36, 36, 36, 12, 12, 12, 12, 12, 63, 36, 62, 14, 14, 14, 19, 0, 0, 36, 14, 62, 62, 62, 62, 62, 62, 62, 63, 62, 62, 62, 62, 62, 62, 63, 43, 0, 0, 45, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 45, 14, 14, 14, 36, 36, 12, 12, 12, 12, 12, 59, 27, 59, 77, 14, 14, 14, 14, 19, 0, 0, 0, 0, 14, 14, 14, 14, 38, 36, 0, 45, 14, 14, 14, 14, 14, 14, 19, 0, 0, 0, 0, 0, 0, 14, 0, 0, 36, 36, 36, 36, 14, 14, 0, 0, 0, 0, 36, 81, 59, 59, 12, 12, 12, 12, 12, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 59, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 14, 19, 14, 14, 0, 45, 38, 36, 36, 36, 36, 0, 0, 0, 53, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 14, 14, 14, 36, 14, 14, 14, 36, 14, 14, 14, 14, 39, 39, 39, 39, 14, 14, 14, 14, 14, 14, 14, 36, 14, 14, 38, 14, 14, 14, 14, 14, 14, 14, 36, 14, 14, 14, 39, 14, 36, 14, 38, 14, 14, 14, 32, 38, 59, 59, 59, 82, 59, 83, 0, 0, 82, 59, 84, 25, 85, 86, 85, 86, 28, 14, 87, 88, 89, 0, 0, 33, 51, 51, 51, 51, 7, 90, 91, 14, 14, 14, 92, 93, 91, 14, 14, 14, 14, 14, 14, 77, 59, 59, 27, 59, 94, 14, 38, 0, 0, 0, 0, 0, 14, 36, 25, 14, 14, 14, 16, 95, 24, 28, 25, 14, 14, 14, 16, 78, 23, 23, 23, 6, 23, 23, 23, 23, 23, 23, 23, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 53, 36, 36, 36, 36, 36, 36, 36, 14, 50, 24, 14, 50, 14, 14, 14, 14, 24, 14, 96, 14, 14, 14, 14, 24, 25, 14, 14, 14, 24, 14, 14, 14, 14, 28, 14, 14, 24, 14, 25, 28, 28, 28, 28, 28, 28, 14, 14, 28, 28, 28, 28, 28, 14, 14, 14, 14, 14, 14, 14, 24, 36, 36, 36, 14, 25, 25, 14, 14, 14, 14, 14, 25, 28, 14, 24, 25, 24, 14, 24, 24, 23, 24, 14, 14, 25, 24, 28, 25, 24, 24, 24, 28, 28, 25, 25, 14, 14, 28, 28, 14, 14, 28, 14, 14, 14, 14, 14, 25, 14, 25, 14, 14, 25, 14, 14, 14, 14, 14, 14, 28, 14, 28, 28, 14, 28, 14, 28, 14, 28, 14, 28, 14, 14, 14, 14, 14, 14, 24, 14, 24, 14, 14, 14, 14, 14, 24, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 24, 14, 25, 14, 14, 14, 97, 14, 14, 14, 14, 14, 14, 16, 98, 14, 14, 97, 97, 36, 36, 36, 36, 36, 36, 14, 14, 14, 38, 36, 36, 36, 36, 14, 14, 14, 14, 14, 38, 36, 36, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 25, 28, 28, 25, 14, 14, 14, 14, 14, 14, 28, 28, 14, 14, 14, 14, 14, 28, 24, 28, 28, 28, 14, 14, 14, 14, 28, 14, 28, 14, 14, 28, 14, 28, 14, 14, 28, 25, 24, 14, 28, 28, 14, 14, 14, 14, 14, 14, 14, 14, 28, 28, 14, 14, 14, 14, 24, 97, 97, 24, 25, 24, 14, 14, 28, 14, 14, 97, 28, 99, 97, 97, 97, 14, 14, 14, 14, 100, 97, 14, 14, 25, 25, 14, 14, 14, 14, 14, 14, 28, 24, 28, 24, 101, 25, 28, 24, 14, 14, 14, 14, 14, 14, 14, 100, 14, 14, 14, 14, 14, 14, 14, 28, 14, 14, 14, 14, 14, 14, 100, 97, 97, 97, 97, 97, 101, 28, 102, 100, 97, 102, 101, 28, 97, 28, 101, 102, 97, 24, 14, 14, 28, 101, 28, 28, 102, 97, 97, 102, 97, 101, 102, 97, 103, 97, 99, 14, 97, 97, 97, 14, 14, 14, 14, 24, 14, 7, 85, 5, 14, 54, 14, 14, 70, 70, 70, 70, 70, 70, 70, 28, 28, 28, 28, 28, 28, 28, 14, 14, 14, 14, 14, 14, 14, 14, 16, 98, 14, 14, 14, 14, 14, 14, 14, 70, 70, 70, 70, 70, 14, 16, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 98, 14, 14, 14, 14, 14, 14, 14, 70, 70, 14, 14, 14, 14, 14, 14, 14, 14, 70, 14, 14, 14, 24, 28, 28, 36, 36, 36, 14, 14, 14, 14, 14, 14, 14, 19, 0, 14, 36, 36, 105, 59, 77, 106, 14, 14, 14, 14, 36, 36, 36, 39, 41, 36, 36, 36, 36, 36, 36, 43, 14, 14, 14, 38, 14, 14, 14, 38, 85, 85, 85, 85, 85, 85, 85, 59, 59, 59, 59, 27, 107, 14, 85, 14, 85, 70, 70, 70, 70, 59, 59, 57, 59, 27, 77, 14, 14, 108, 36, 36, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 103, 97, 97, 97, 97, 97, 36, 36, 36, 36, 36, 97, 97, 97, 97, 97, 97, 36, 36, 18, 109, 110, 97, 70, 70, 70, 70, 70, 97, 70, 70, 70, 70, 111, 112, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 113, 97, 97, 110, 114, 97, 115, 116, 116, 116, 116, 97, 97, 97, 97, 116, 97, 97, 97, 97, 97, 97, 97, 116, 116, 116, 97, 97, 97, 117, 97, 97, 116, 118, 43, 119, 91, 114, 120, 116, 116, 116, 116, 97, 97, 97, 97, 97, 116, 117, 97, 110, 121, 114, 36, 36, 103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 36, 103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 122, 97, 97, 97, 97, 97, 122, 36, 36, 123, 123, 123, 123, 123, 123, 123, 123, 97, 97, 97, 97, 28, 28, 28, 28, 97, 97, 110, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 122, 36, 97, 97, 97, 122, 36, 36, 36, 36, 14, 14, 14, 14, 14, 14, 27, 106, 12, 12, 12, 12, 12, 14, 36, 36, 0, 45, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 36, 36, 36, 43, 0, 27, 59, 59, 36, 36, 36, 36, 14, 14, 36, 36, 36, 36, 36, 36, 14, 45, 14, 45, 14, 19, 14, 14, 14, 19, 0, 0, 14, 14, 36, 36, 14, 14, 14, 14, 124, 36, 36, 36, 14, 14, 65, 54, 36, 36, 36, 36, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 53, 36, 36, 36, 36, 59, 0, 14, 14, 14, 14, 14, 36, 36, 14, 14, 14, 0, 0, 0, 0, 59, 14, 14, 14, 19, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 39, 74, 74, 74, 74, 74, 74, 125, 36, 14, 19, 0, 0, 0, 0, 0, 0, 45, 14, 14, 27, 59, 14, 14, 39, 12, 12, 12, 12, 12, 36, 36, 14, 14, 14, 14, 14, 19, 0, 0, 0, 14, 19, 14, 14, 14, 14, 0, 36, 12, 12, 12, 12, 12, 36, 27, 59, 62, 63, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 62, 62, 59, 14, 19, 53, 36, 36, 36, 36, 39, 14, 14, 38, 39, 14, 14, 38, 39, 14, 14, 38, 36, 36, 36, 36, 14, 19, 0, 0, 0, 1, 0, 36, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 36, 36, 36, 36, 36, 36, 75, 75, 75, 128, 36, 129, 76, 76, 76, 76, 76, 76, 76, 76, 36, 36, 130, 130, 130, 130, 130, 130, 130, 130, 36, 39, 14, 14, 36, 36, 131, 132, 47, 47, 47, 47, 49, 47, 47, 47, 47, 47, 47, 48, 47, 47, 48, 48, 47, 131, 48, 47, 47, 47, 47, 47, 14, 36, 36, 36, 36, 36, 36, 36, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 70, 36, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 124, 36, 133, 134, 58, 135, 136, 36, 36, 36, 97, 97, 137, 104, 104, 104, 104, 104, 104, 104, 109, 137, 109, 97, 97, 97, 109, 78, 91, 54, 137, 104, 104, 109, 97, 97, 97, 122, 138, 139, 36, 36, 14, 14, 14, 14, 14, 14, 38, 140, 105, 97, 6, 97, 70, 97, 109, 109, 97, 97, 97, 97, 97, 91, 97, 141, 97, 97, 97, 97, 97, 137, 142, 97, 97, 97, 97, 97, 97, 137, 142, 137, 112, 70, 93, 143, 123, 123, 123, 123, 144, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 91, 36, 14, 14, 14, 36, 14, 14, 14, 36, 14, 14, 14, 36, 14, 38, 36, 22, 97, 138, 145, 14, 14, 14, 38, 36, 36, 36, 36, 43, 0, 146, 36, 14, 14, 14, 14, 14, 14, 39, 14, 14, 14, 14, 14, 14, 38, 14, 39, 59, 41, 36, 39, 14, 14, 14, 14, 14, 14, 36, 39, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 36, 14, 14, 14, 14, 14, 14, 19, 36, 14, 14, 14, 14, 14, 14, 14, 81, 14, 14, 36, 36, 14, 14, 14, 14, 77, 14, 14, 36, 36, 36, 36, 36, 14, 14, 14, 36, 38, 14, 14, 14, 14, 14, 14, 39, 38, 36, 38, 39, 14, 14, 14, 81, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 81, 14, 14, 14, 14, 14, 36, 36, 39, 14, 14, 14, 14, 36, 36, 36, 14, 19, 0, 43, 53, 36, 36, 0, 0, 14, 14, 39, 14, 39, 14, 14, 14, 14, 14, 36, 36, 0, 53, 36, 43, 59, 59, 59, 59, 38, 36, 36, 36, 14, 14, 14, 36, 81, 59, 59, 59, 14, 14, 14, 36, 14, 14, 14, 14, 14, 38, 36, 36, 14, 14, 14, 14, 14, 14, 14, 14, 38, 36, 36, 36, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 1, 77, 14, 14, 36, 14, 14, 14, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 45, 14, 59, 59, 36, 36, 36, 36, 36, 36, 36, 0, 0, 53, 12, 12, 12, 12, 12, 59, 59, 36, 36, 36, 36, 36, 36, 45, 14, 27, 77, 41, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 14, 38, 36, 36, 36, 36, 36, 36, 14, 14, 14, 14, 147, 70, 112, 14, 14, 98, 14, 70, 70, 14, 14, 14, 14, 14, 14, 14, 16, 112, 14, 14, 19, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 43, 97, 36, 36, 36, 36, 36, 36, 36, 14, 14, 19, 0, 0, 14, 19, 0, 0, 45, 19, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 45, 36, 36, 36, 36, 36, 36, 38, 39, 38, 39, 14, 38, 14, 14, 14, 14, 14, 14, 39, 39, 14, 14, 14, 39, 14, 14, 14, 14, 14, 14, 14, 14, 39, 14, 38, 39, 14, 14, 14, 38, 14, 14, 14, 38, 14, 14, 14, 14, 14, 14, 39, 14, 38, 14, 14, 38, 38, 36, 14, 14, 14, 14, 14, 14, 14, 14, 14, 36, 12, 12, 12, 12, 12, 12, 12, 12, 12, 39, 38, 38, 39, 39, 14, 14, 14, 14, 38, 14, 14, 39, 39, 36, 36, 36, 38, 36, 39, 39, 39, 39, 14, 39, 38, 38, 39, 39, 39, 39, 39, 39, 38, 38, 39, 14, 38, 14, 14, 14, 38, 14, 14, 39, 14, 38, 38, 14, 14, 14, 14, 14, 39, 14, 14, 39, 14, 39, 14, 14, 39, 14, 14, 103, 97, 97, 97, 97, 97, 97, 122, 28, 28, 28, 28, 28, 148, 36, 36, 28, 28, 28, 28, 28, 28, 28, 38, 28, 28, 28, 28, 28, 14, 36, 36, 36, 36, 36, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 97, 122, 36, 36, 36, 36, 36, 36, 97, 97, 97, 97, 122, 36, 36, 36, 122, 36, 36, 36, 36, 36, 36, 36, 97, 97, 97, 103, 97, 97, 97, 97, 97, 97, 99, 100, 97, 97, 100, 97, 97, 97, 122, 97, 97, 122, 36, 36, 122, 97, 97, 97, 97, 97, 97, 97, 100, 100, 100, 97, 97, 97, 97, 99, 99, 100, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 103, 97, 122, 36, 14, 14, 14, 100, 97, 97, 97, 97, 97, 97, 97, 99, 14, 14, 14, 14, 14, 14, 100, 97, 97, 97, 97, 97, 97, 14, 14, 14, 14, 14, 14, 36, 97, 97, 97, 97, 36, 36, 36, 36, 36, 36, 36, 36, 36, 103, 97, 97, 122, 36, 103, 97, 97, 97, 97, 97, 43, 36, 36, 36, 36, 36, 36, 36, }; static RE_UINT8 re_line_break_stage_5[] = { 16, 16, 16, 18, 22, 20, 20, 21, 19, 6, 3, 12, 9, 10, 12, 3, 1, 36, 12, 9, 8, 15, 8, 7, 11, 11, 8, 8, 12, 12, 12, 6, 12, 1, 9, 36, 18, 2, 12, 16, 16, 29, 4, 1, 10, 9, 9, 9, 12, 25, 25, 12, 25, 3, 12, 18, 25, 25, 17, 12, 25, 1, 17, 25, 12, 17, 16, 4, 4, 4, 4, 16, 0, 0, 8, 0, 12, 0, 0, 12, 0, 8, 18, 0, 0, 9, 0, 16, 18, 16, 16, 12, 6, 16, 37, 37, 37, 0, 37, 12, 12, 10, 10, 10, 16, 6, 16, 0, 6, 6, 10, 11, 11, 12, 6, 12, 8, 6, 18, 18, 0, 10, 0, 24, 24, 24, 24, 0, 24, 12, 17, 17, 4, 17, 17, 18, 4, 6, 4, 12, 1, 2, 18, 17, 12, 4, 4, 0, 31, 31, 32, 32, 33, 33, 18, 12, 2, 0, 5, 24, 18, 9, 0, 18, 18, 4, 18, 28, 26, 25, 3, 3, 1, 3, 14, 14, 14, 18, 20, 20, 3, 25, 5, 5, 8, 1, 2, 5, 30, 12, 2, 25, 9, 12, 13, 13, 2, 12, 13, 12, 12, 13, 13, 25, 25, 13, 0, 13, 2, 1, 0, 6, 6, 18, 1, 18, 26, 26, 2, 13, 13, 5, 5, 1, 2, 2, 13, 16, 5, 13, 0, 38, 13, 38, 38, 13, 38, 0, 16, 5, 5, 38, 38, 5, 13, 0, 38, 38, 10, 12, 31, 0, 34, 35, 35, 35, 32, 0, 0, 33, 27, 27, 0, 37, 16, 37, 8, 2, 2, 8, 6, 1, 2, 14, 13, 1, 13, 9, 10, 13, 0, 30, 13, 6, 13, 2, 12, 38, 38, 12, 9, 0, 23, 25, 1, 1, 25, 0, 39, 39, }; /* Line_Break: 7668 bytes. */ RE_UINT32 re_get_line_break(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_line_break_stage_1[f] << 5; f = code >> 7; code ^= f << 7; pos = (RE_UINT32)re_line_break_stage_2[pos + f] << 3; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_line_break_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_line_break_stage_4[pos + f] << 1; value = re_line_break_stage_5[pos + code]; return value; } /* Numeric_Type. */ static RE_UINT8 re_numeric_type_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11, 12, 13, 14, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 11, 17, 18, 11, 19, 20, 11, 11, 21, 11, 11, 11, 11, 11, 11, 11, 11, 22, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; static RE_UINT8 re_numeric_type_stage_2[] = { 0, 1, 1, 1, 1, 1, 2, 3, 1, 4, 5, 6, 7, 8, 9, 10, 11, 1, 1, 12, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1, 1, 1, 20, 21, 1, 1, 22, 1, 1, 23, 1, 1, 1, 1, 24, 1, 1, 1, 25, 26, 27, 1, 28, 1, 1, 1, 29, 1, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 32, 1, 33, 1, 34, 1, 1, 35, 1, 36, 1, 1, 1, 1, 1, 37, 38, 1, 1, 39, 40, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, 43, 1, 1, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 1, 51, 52, 53, 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 15, 1, 56, 1, 57, 58, 1, 1, 1, 59, 60, 61, 62, 1, 1, 63, 1, 64, 65, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 67, 1, 1, 1, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 70, 71, 1, 1, 1, 1, 1, 1, 1, 72, 73, 74, 1, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_numeric_type_stage_3[] = { 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 0, 0, 0, 0, 0, 18, 19, 20, 0, 0, 0, 0, 0, 0, 21, 22, 0, 0, 23, 0, 0, 0, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 30, 31, 0, 30, 32, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 37, 0, 26, 0, 38, 39, 40, 41, 36, 0, 0, 42, 0, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 50, 0, 0, 0, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 0, 0, 0, 56, 0, 3, 0, 0, 0, 0, 0, 61, 0, 62, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 63, 0, 55, 64, 26, 65, 66, 19, 67, 35, 0, 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, 71, 71, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 76, 77, 0, 0, 0, 1, 0, 78, 0, 0, 0, 0, 1, 0, 19, 19, 19, 79, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 82, 83, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 43, 0, 0, 0, 84, 0, 58, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, }; static RE_UINT8 re_numeric_type_stage_4[] = { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 3, 4, 1, 2, 0, 0, 5, 1, 0, 0, 5, 1, 6, 7, 5, 1, 8, 0, 5, 1, 9, 0, 5, 1, 0, 10, 5, 1, 11, 0, 1, 12, 13, 0, 0, 14, 15, 16, 0, 17, 18, 0, 1, 2, 19, 7, 0, 0, 1, 20, 1, 2, 1, 2, 0, 0, 21, 22, 23, 22, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 24, 7, 0, 0, 23, 25, 26, 27, 19, 23, 25, 13, 0, 28, 29, 30, 0, 0, 31, 32, 23, 33, 34, 0, 0, 0, 0, 35, 36, 0, 0, 0, 37, 7, 0, 9, 0, 0, 38, 0, 19, 7, 0, 0, 0, 19, 37, 19, 0, 0, 37, 19, 35, 0, 0, 0, 39, 0, 0, 0, 0, 40, 0, 0, 0, 35, 0, 0, 41, 42, 0, 0, 0, 43, 44, 0, 0, 0, 0, 36, 18, 0, 0, 36, 0, 18, 0, 0, 0, 0, 18, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 46, 0, 0, 47, 43, 0, 0, 48, 0, 0, 0, 0, 0, 0, 39, 0, 0, 42, 42, 0, 0, 0, 40, 0, 0, 0, 17, 0, 49, 18, 0, 0, 0, 0, 45, 0, 43, 0, 0, 0, 0, 40, 0, 0, 0, 45, 0, 0, 45, 39, 0, 42, 0, 0, 0, 45, 43, 0, 0, 0, 0, 0, 18, 17, 19, 0, 0, 0, 0, 11, 0, 0, 39, 39, 18, 0, 0, 50, 0, 36, 19, 19, 19, 19, 19, 13, 0, 19, 19, 19, 18, 13, 0, 0, 0, 42, 40, 0, 0, 0, 0, 51, 0, 0, 0, 0, 19, 0, 0, 17, 13, 52, 0, 0, 0, 0, 0, 0, 53, 23, 25, 19, 10, 0, 0, 54, 55, 56, 1, 0, 0, 0, 0, 5, 1, 9, 0, 0, 0, 19, 19, 7, 0, 0, 5, 1, 1, 1, 1, 1, 1, 23, 57, 0, 0, 40, 0, 0, 0, 39, 43, 0, 43, 0, 40, 0, 35, 0, 0, 0, 42, }; static RE_UINT8 re_numeric_type_stage_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, }; /* Numeric_Type: 2088 bytes. */ RE_UINT32 re_get_numeric_type(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_numeric_type_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_numeric_type_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_numeric_type_stage_3[pos + f] << 2; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_numeric_type_stage_4[pos + f] << 3; value = re_numeric_type_stage_5[pos + code]; return value; } /* Numeric_Value. */ static RE_UINT8 re_numeric_value_stage_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11, 12, 13, 14, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 11, 17, 18, 11, 19, 20, 11, 11, 21, 11, 11, 11, 11, 11, 11, 11, 11, 22, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; static RE_UINT8 re_numeric_value_stage_2[] = { 0, 1, 1, 1, 1, 1, 2, 3, 1, 4, 5, 6, 7, 8, 9, 10, 11, 1, 1, 12, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1, 1, 1, 20, 21, 1, 1, 22, 1, 1, 23, 1, 1, 1, 1, 24, 1, 1, 1, 25, 26, 27, 1, 28, 1, 1, 1, 29, 1, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, 32, 1, 33, 1, 34, 1, 1, 35, 1, 36, 1, 1, 1, 1, 1, 37, 38, 1, 1, 39, 40, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, 43, 1, 1, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 1, 51, 52, 53, 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 15, 1, 56, 1, 57, 58, 1, 1, 1, 59, 60, 61, 62, 1, 1, 63, 1, 64, 65, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 67, 1, 1, 1, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 70, 71, 1, 1, 1, 1, 1, 1, 1, 72, 73, 74, 1, 1, 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 79, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_numeric_value_stage_3[] = { 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 15, 3, 0, 0, 0, 0, 0, 16, 17, 18, 0, 0, 0, 0, 0, 0, 19, 20, 0, 0, 21, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 28, 29, 0, 28, 30, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 35, 0, 36, 0, 37, 38, 39, 40, 41, 0, 0, 42, 0, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 50, 0, 0, 0, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 0, 0, 0, 66, 0, 3, 0, 0, 0, 0, 0, 67, 0, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 69, 0, 70, 71, 72, 73, 74, 75, 76, 77, 0, 0, 0, 0, 78, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 85, 85, 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 87, 88, 0, 0, 0, 1, 0, 89, 0, 0, 0, 0, 1, 0, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 99, 0, 0, 0, 100, 0, 101, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, }; static RE_UINT8 re_numeric_value_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 4, 0, 5, 6, 1, 2, 3, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 7, 8, 9, 0, 10, 11, 0, 0, 7, 8, 9, 12, 13, 0, 0, 0, 7, 8, 9, 14, 0, 0, 0, 0, 7, 8, 9, 0, 0, 1, 15, 0, 7, 8, 9, 16, 17, 0, 0, 1, 2, 18, 19, 20, 0, 0, 0, 0, 0, 21, 2, 22, 23, 24, 25, 0, 0, 0, 26, 27, 0, 0, 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 0, 0, 1, 2, 28, 0, 0, 0, 0, 0, 29, 2, 3, 0, 0, 0, 0, 0, 30, 31, 32, 33, 34, 35, 36, 37, 34, 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, 0, 34, 35, 36, 41, 42, 34, 35, 36, 41, 42, 34, 35, 36, 41, 42, 0, 0, 0, 43, 44, 45, 46, 2, 47, 0, 0, 0, 0, 0, 48, 49, 50, 34, 35, 51, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 53, 0, 0, 0, 0, 0, 0, 21, 2, 3, 0, 0, 0, 54, 0, 0, 0, 0, 0, 48, 55, 0, 0, 34, 35, 56, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 63, 64, 65, 66, 0, 67, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 75, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 79, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 0, 0, 0, 0, 86, 87, 0, 88, 0, 0, 0, 0, 89, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 15, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 99, 68, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, 48, 49, 104, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 0, 0, 0, 0, 107, 0, 108, 0, 75, 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 111, 8, 9, 57, 58, 112, 113, 114, 115, 116, 117, 118, 0, 0, 0, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 122, 131, 132, 0, 0, 0, 103, 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 134, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 0, 0, 0, 0, 0, 0, 0, 0, 138, 139, 0, 0, 0, 0, 0, 140, 141, 0, 34, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 34, 142, 34, 35, 144, 145, 146, 147, 148, 149, 0, 0, 0, 0, 48, 49, 50, 150, 151, 152, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 8, 9, 49, 153, 35, 154, 2, 155, 156, 157, 9, 158, 159, 158, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 0, 0, 0, 0, 0, 0, 0, 34, 35, 144, 145, 171, 0, 0, 0, 0, 0, 0, 7, 8, 9, 1, 2, 172, 8, 9, 1, 2, 172, 8, 9, 173, 49, 174, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 176, 0, 0, 88, 0, 0, 0, 88, 0, 0, 101, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, }; static RE_UINT8 re_numeric_value_stage_5[] = { 0, 0, 0, 0, 2, 23, 25, 27, 29, 31, 33, 35, 37, 39, 0, 0, 0, 0, 25, 27, 0, 23, 0, 0, 11, 15, 19, 0, 0, 0, 2, 23, 25, 27, 29, 31, 33, 35, 37, 39, 3, 6, 9, 11, 19, 46, 0, 0, 0, 0, 11, 15, 19, 3, 6, 9, 40, 85, 94, 0, 23, 25, 27, 0, 40, 85, 94, 11, 15, 19, 0, 0, 37, 39, 15, 24, 26, 28, 30, 32, 34, 36, 38, 1, 0, 23, 25, 27, 37, 39, 40, 50, 60, 70, 80, 81, 82, 83, 84, 85, 103, 0, 0, 0, 0, 0, 47, 48, 49, 0, 0, 0, 37, 39, 23, 0, 2, 0, 0, 0, 7, 5, 4, 12, 18, 10, 14, 16, 20, 8, 21, 6, 13, 17, 22, 23, 23, 25, 27, 29, 31, 33, 35, 37, 39, 40, 41, 42, 80, 85, 89, 94, 94, 98, 103, 0, 0, 33, 80, 107, 112, 2, 0, 0, 43, 44, 45, 46, 47, 48, 49, 50, 0, 0, 2, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 23, 25, 27, 37, 39, 40, 2, 0, 0, 23, 25, 27, 29, 31, 33, 35, 37, 39, 40, 39, 40, 23, 25, 0, 15, 0, 0, 0, 0, 0, 2, 40, 50, 60, 0, 27, 29, 0, 0, 39, 40, 0, 0, 40, 50, 60, 70, 80, 81, 82, 83, 0, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 0, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 0, 31, 0, 0, 0, 0, 0, 25, 0, 0, 31, 0, 0, 35, 0, 0, 23, 0, 0, 35, 0, 0, 0, 103, 0, 27, 0, 0, 0, 39, 0, 0, 25, 0, 0, 0, 31, 0, 29, 0, 0, 0, 0, 115, 40, 0, 0, 0, 0, 0, 0, 94, 27, 0, 0, 0, 85, 0, 0, 0, 115, 0, 0, 0, 0, 0, 116, 0, 0, 25, 0, 37, 0, 33, 0, 0, 0, 40, 0, 94, 50, 60, 0, 0, 70, 0, 0, 0, 0, 27, 27, 27, 0, 0, 0, 29, 0, 0, 23, 0, 0, 0, 39, 50, 0, 0, 40, 0, 37, 0, 0, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 0, 85, 0, 0, 0, 29, 0, 0, 0, 25, 0, 0, 94, 0, 0, 0, 0, 33, 0, 33, 0, 0, 0, 0, 0, 2, 0, 35, 37, 39, 2, 11, 15, 19, 3, 6, 9, 0, 0, 0, 0, 0, 27, 0, 0, 0, 40, 0, 33, 0, 33, 0, 40, 0, 0, 0, 0, 0, 23, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 11, 15, 23, 31, 80, 89, 98, 107, 31, 40, 80, 85, 89, 94, 98, 31, 40, 80, 85, 89, 94, 103, 107, 40, 23, 23, 23, 25, 25, 25, 25, 31, 40, 40, 40, 40, 40, 60, 80, 80, 80, 80, 85, 87, 89, 89, 89, 89, 80, 15, 15, 18, 19, 0, 0, 0, 23, 31, 40, 80, 0, 84, 0, 0, 0, 0, 93, 0, 0, 23, 25, 40, 50, 85, 0, 0, 23, 25, 27, 40, 50, 85, 94, 103, 0, 0, 23, 40, 50, 85, 25, 27, 40, 50, 85, 94, 0, 23, 80, 0, 39, 40, 50, 60, 70, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 15, 11, 12, 18, 0, 50, 60, 70, 80, 81, 82, 83, 84, 85, 94, 2, 23, 35, 37, 39, 29, 39, 23, 25, 27, 37, 39, 23, 25, 27, 29, 31, 25, 27, 27, 29, 31, 23, 25, 27, 27, 29, 31, 113, 114, 29, 31, 27, 27, 29, 29, 29, 29, 33, 35, 35, 35, 37, 37, 39, 39, 39, 39, 25, 27, 29, 31, 33, 23, 25, 27, 29, 29, 31, 31, 25, 27, 23, 25, 12, 18, 21, 12, 18, 6, 11, 8, 11, 0, 83, 84, 0, 0, 37, 39, 2, 23, 2, 2, 23, 25, 35, 37, 39, 0, 29, 0, 0, 0, 0, 0, 0, 60, 0, 29, 0, 0, 39, 0, 0, 0, }; /* Numeric_Value: 2876 bytes. */ RE_UINT32 re_get_numeric_value(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 12; code = ch ^ (f << 12); pos = (RE_UINT32)re_numeric_value_stage_1[f] << 4; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_numeric_value_stage_2[pos + f] << 3; f = code >> 5; code ^= f << 5; pos = (RE_UINT32)re_numeric_value_stage_3[pos + f] << 3; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_numeric_value_stage_4[pos + f] << 2; value = re_numeric_value_stage_5[pos + code]; return value; } /* Bidi_Mirrored. */ static RE_UINT8 re_bidi_mirrored_stage_1[] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_bidi_mirrored_stage_2[] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static RE_UINT8 re_bidi_mirrored_stage_3[] = { 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 4, 5, 1, 6, 7, 8, 1, 9, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, 12, 1, 1, 1, 1, }; static RE_UINT8 re_bidi_mirrored_stage_4[] = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3, 3, 9, 3, 3, 10, 11, 12, 13, 14, 3, 3, 3, 3, 3, 3, 3, 3, 15, 3, 16, 3, 3, 3, 3, 3, 3, 17, 18, 19, 20, 21, 22, 3, 3, 3, 3, 23, 3, 3, 3, 3, 3, 3, 3, 24, 3, 3, 3, 3, 3, 3, 3, 3, 25, 3, 3, 26, 27, 3, 3, 3, 3, 3, 28, 29, 30, 31, 32, }; static RE_UINT8 re_bidi_mirrored_stage_5[] = { 0, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 30, 63, 98, 188, 87, 248, 15, 250, 255, 31, 60, 128, 245, 207, 255, 255, 255, 159, 7, 1, 204, 255, 255, 193, 0, 62, 195, 255, 255, 63, 255, 255, 0, 15, 0, 0, 3, 6, 0, 0, 0, 0, 0, 0, 0, 255, 63, 0, 121, 59, 120, 112, 252, 255, 0, 0, 248, 255, 255, 249, 255, 255, 0, 1, 63, 194, 55, 31, 58, 3, 240, 51, 0, 252, 255, 223, 83, 122, 48, 112, 0, 0, 128, 1, 48, 188, 25, 254, 255, 255, 255, 255, 207, 191, 255, 255, 255, 255, 127, 80, 124, 112, 136, 47, 60, 54, 0, 48, 255, 3, 0, 0, 0, 255, 243, 15, 0, 0, 0, 0, 0, 0, 0, 126, 48, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 0, 0, 168, 13, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, }; /* Bidi_Mirrored: 489 bytes. */ RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 16; code = ch ^ (f << 16); pos = (RE_UINT32)re_bidi_mirrored_stage_1[f] << 4; f = code >> 12; code ^= f << 12; pos = (RE_UINT32)re_bidi_mirrored_stage_2[pos + f] << 3; f = code >> 9; code ^= f << 9; pos = (RE_UINT32)re_bidi_mirrored_stage_3[pos + f] << 3; f = code >> 6; code ^= f << 6; pos = (RE_UINT32)re_bidi_mirrored_stage_4[pos + f] << 6; pos += code; value = (re_bidi_mirrored_stage_5[pos >> 3] >> (pos & 0x7)) & 0x1; return value; } /* Indic_Matra_Category. */ static RE_UINT8 re_indic_matra_category_stage_1[] = { 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_indic_matra_category_stage_2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 9, 0, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 19, 20, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_indic_matra_category_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 5, 6, 7, 4, 0, 0, 0, 0, 5, 8, 0, 0, 0, 0, 0, 0, 5, 9, 0, 4, 0, 0, 0, 0, 10, 11, 12, 4, 0, 0, 0, 0, 13, 14, 7, 0, 0, 0, 0, 0, 15, 16, 17, 4, 0, 0, 0, 0, 10, 18, 19, 4, 0, 0, 0, 0, 13, 20, 7, 4, 0, 0, 0, 0, 0, 21, 22, 0, 23, 0, 0, 0, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 0, 32, 33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 37, 0, 38, 0, 38, 0, 0, 0, 39, 40, 41, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 23, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 66, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 71, 72, 0, 0, 0, 0, 0, 0, 0, 73, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 69, 0, 0, 0, 0, }; static RE_UINT8 re_indic_matra_category_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 1, 7, 3, 8, 0, 0, 9, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 10, 11, 12, 13, 14, 0, 0, 0, 0, 15, 0, 0, 0, 0, 3, 10, 0, 9, 16, 9, 17, 0, 3, 4, 5, 9, 18, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 19, 3, 4, 10, 11, 20, 13, 21, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 17, 10, 0, 22, 12, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 7, 25, 6, 26, 6, 6, 0, 0, 0, 9, 10, 0, 0, 0, 0, 27, 7, 25, 18, 28, 29, 6, 0, 0, 0, 15, 25, 0, 0, 0, 0, 7, 3, 10, 22, 12, 23, 24, 0, 0, 0, 0, 0, 0, 16, 0, 15, 7, 6, 10, 10, 2, 30, 23, 31, 0, 7, 0, 0, 0, 0, 0, 0, 19, 7, 6, 6, 4, 10, 0, 0, 32, 32, 33, 9, 0, 0, 0, 16, 19, 7, 6, 6, 4, 9, 0, 0, 32, 32, 34, 0, 0, 0, 0, 0, 35, 36, 4, 37, 37, 6, 6, 0, 36, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 19, 17, 38, 6, 6, 0, 39, 16, 0, 0, 0, 0, 0, 7, 4, 0, 0, 0, 0, 25, 0, 15, 25, 0, 0, 0, 9, 6, 16, 0, 0, 0, 0, 0, 0, 15, 40, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 17, 10, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 17, 4, 41, 42, 22, 23, 0, 25, 0, 0, 0, 9, 43, 0, 0, 0, 0, 0, 0, 6, 44, 45, 46, 16, 0, 0, 0, 7, 7, 2, 22, 7, 8, 7, 7, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 38, 2, 0, 0, 47, 1, 19, 6, 17, 5, 44, 22, 22, 40, 16, 0, 0, 0, 0, 0, 0, 0, 15, 6, 4, 48, 49, 22, 23, 18, 25, 0, 0, 0, 0, 0, 0, 0, 17, 8, 6, 25, 0, 0, 0, 0, 0, 2, 50, 7, 10, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 15, 3, 1, 0, 0, 0, 0, 0, 0, 15, 7, 7, 7, 7, 7, 7, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 35, 4, 17, 4, 10, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 4, 22, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 17, 52, 40, 10, 0, 0, 0, 0, 0, 0, 1, 6, 53, 54, 55, 56, 33, 16, 0, 0, 0, 0, 0, 11, 5, 8, 0, 0, 0, 43, 0, 0, 0, 0, 0, 15, 19, 7, 44, 25, 35, 0, 57, 4, 9, 58, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 6, 6, 4, 4, 4, 6, 6, 16, 0, 0, 0, 0, 2, 3, 5, 1, 3, 0, 0, 0, 0, 0, 0, 9, 6, 4, 40, 37, 17, 59, 16, 0, 0, 0, 0, 0, 0, 15, 8, 4, 4, 4, 6, 18, 0, 0, 0, 0, 0, 0, 9, 8, }; static RE_UINT8 re_indic_matra_category_stage_5[] = { 0, 0, 5, 1, 1, 2, 1, 6, 6, 6, 6, 5, 5, 5, 1, 1, 2, 1, 0, 5, 6, 0, 0, 2, 2, 0, 0, 4, 4, 6, 0, 1, 5, 0, 5, 6, 5, 8, 1, 5, 9, 0, 10, 6, 2, 2, 4, 4, 4, 5, 1, 0, 7, 0, 8, 1, 8, 0, 8, 8, 9, 2, 4, 1, 3, 3, 3, 1, 3, 0, 0, 6, 5, 7, 7, 7, 6, 2, 0, 14, 2, 5, 9, 10, 4, 2, 14, 0, 6, 1, 1, 8, 8, 5, 14, 1, 6, 11, 7, 12, 2, 9, 11, 0, 5, 2, 6, 3, 3, 5, 5, 3, 1, 3, 0, 13, 13, 0, 6, 14, }; /* Indic_Matra_Category: 1336 bytes. */ RE_UINT32 re_get_indic_matra_category(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_indic_matra_category_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_indic_matra_category_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_indic_matra_category_stage_3[pos + f] << 3; f = code >> 1; code ^= f << 1; pos = (RE_UINT32)re_indic_matra_category_stage_4[pos + f] << 1; value = re_indic_matra_category_stage_5[pos + code]; return value; } /* Indic_Syllabic_Category. */ static RE_UINT8 re_indic_syllabic_category_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_indic_syllabic_category_stage_2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 1, 1, 1, 1, 1, 10, 1, 11, 12, 13, 14, 1, 1, 1, 1, 1, 1, 1, 1, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 17, 18, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 1, 1, 21, 22, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static RE_UINT8 re_indic_syllabic_category_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 8, 16, 17, 11, 12, 18, 19, 20, 0, 21, 22, 23, 12, 24, 25, 0, 8, 0, 10, 11, 12, 24, 26, 27, 8, 28, 29, 30, 31, 32, 33, 34, 0, 0, 35, 36, 12, 37, 38, 39, 8, 0, 40, 36, 12, 41, 38, 42, 8, 0, 40, 36, 4, 43, 44, 34, 8, 45, 46, 47, 4, 48, 49, 50, 0, 51, 52, 4, 53, 54, 55, 0, 0, 0, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 62, 4, 63, 64, 65, 66, 67, 68, 0, 0, 0, 0, 4, 4, 69, 70, 0, 71, 72, 73, 74, 75, 0, 0, 0, 0, 0, 0, 76, 77, 78, 77, 78, 79, 76, 80, 4, 4, 81, 82, 83, 84, 0, 0, 85, 63, 86, 87, 0, 4, 88, 89, 4, 4, 90, 91, 92, 0, 0, 0, 4, 93, 4, 4, 94, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 98, 78, 4, 99, 100, 0, 0, 0, 101, 4, 102, 103, 4, 4, 104, 105, 4, 4, 106, 107, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 111, 4, 112, 0, 4, 113, 114, 115, 116, 117, 4, 118, 119, 0, 0, 0, 120, 4, 121, 4, 122, 123, 0, 0, 124, 4, 4, 125, 126, 0, 0, 0, 127, 4, 128, 129, 130, 0, 4, 131, 4, 4, 4, 132, 133, 0, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 138, 0, 139, 140, 4, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 78, 4, 143, 144, 0, 0, 0, 145, 4, 4, 146, 0, 0, 0, 0, 147, 4, 148, 149, 0, 0, 0, 0, 150, 151, 4, 152, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 4, 155, 156, 0, 0, 0, 0, }; static RE_UINT8 re_indic_syllabic_category_stage_4[] = { 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 8, 9, 0, 10, 5, 5, 11, 0, 0, 0, 12, 3, 13, 5, 14, 15, 3, 16, 16, 4, 5, 5, 5, 5, 17, 5, 18, 19, 20, 7, 8, 21, 21, 22, 0, 23, 0, 24, 20, 0, 0, 0, 14, 15, 25, 26, 17, 27, 20, 28, 29, 23, 21, 30, 0, 0, 13, 18, 31, 32, 0, 0, 14, 15, 3, 33, 33, 4, 5, 5, 17, 13, 20, 7, 8, 34, 34, 30, 8, 21, 21, 30, 0, 35, 0, 24, 36, 0, 0, 0, 37, 15, 25, 12, 38, 39, 27, 17, 40, 41, 42, 19, 5, 5, 20, 35, 29, 35, 43, 30, 0, 23, 0, 0, 14, 15, 3, 38, 38, 4, 5, 5, 5, 13, 20, 44, 8, 43, 43, 30, 0, 45, 20, 0, 46, 15, 3, 38, 5, 13, 20, 7, 0, 45, 0, 47, 5, 5, 42, 44, 8, 43, 43, 48, 0, 0, 49, 50, 46, 15, 3, 3, 3, 25, 19, 5, 24, 5, 5, 36, 5, 42, 51, 23, 8, 52, 8, 8, 35, 0, 0, 0, 13, 5, 5, 5, 5, 5, 5, 42, 8, 8, 53, 0, 8, 34, 54, 55, 27, 56, 18, 36, 0, 5, 13, 5, 13, 57, 19, 27, 8, 8, 34, 58, 8, 59, 54, 60, 0, 0, 0, 20, 5, 5, 13, 5, 5, 5, 5, 41, 10, 8, 8, 61, 62, 63, 64, 65, 66, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 68, 69, 3, 70, 8, 8, 71, 72, 73, 74, 11, 75, 76, 77, 78, 79, 80, 81, 82, 5, 5, 83, 84, 54, 85, 0, 0, 86, 87, 88, 5, 5, 17, 6, 89, 0, 0, 88, 5, 5, 5, 6, 0, 0, 0, 90, 0, 0, 0, 91, 3, 3, 3, 3, 35, 8, 8, 8, 61, 92, 93, 94, 0, 0, 95, 96, 5, 5, 5, 8, 8, 97, 0, 98, 99, 100, 0, 101, 102, 102, 103, 104, 105, 0, 0, 5, 5, 5, 0, 8, 8, 8, 8, 106, 99, 107, 0, 5, 108, 8, 0, 5, 5, 5, 69, 88, 109, 99, 110, 111, 8, 8, 8, 8, 79, 107, 0, 112, 113, 3, 3, 5, 114, 8, 8, 8, 115, 5, 0, 116, 3, 117, 5, 118, 8, 119, 120, 0, 0, 121, 122, 5, 123, 8, 8, 124, 0, 0, 0, 5, 125, 8, 106, 99, 126, 0, 0, 0, 0, 0, 13, 127, 0, 0, 0, 0, 0, 0, 1, 33, 128, 129, 5, 108, 8, 0, 0, 5, 5, 5, 130, 131, 132, 133, 5, 134, 0, 0, 0, 135, 3, 3, 3, 117, 5, 5, 5, 5, 136, 8, 8, 8, 89, 0, 0, 0, 0, 19, 5, 130, 102, 137, 107, 5, 108, 8, 138, 139, 0, 0, 0, 140, 3, 4, 88, 141, 8, 8, 142, 89, 0, 0, 0, 3, 117, 5, 5, 5, 5, 81, 8, 143, 144, 0, 0, 99, 99, 99, 145, 13, 0, 146, 0, 8, 8, 8, 84, 147, 0, 0, 0, 117, 5, 108, 8, 0, 148, 0, 0, 5, 5, 5, 74, 149, 5, 150, 99, 151, 8, 29, 152, 81, 45, 0, 153, 5, 13, 13, 5, 5, 0, 0, 154, 155, 15, 3, 3, 5, 5, 8, 8, 8, 53, 0, 0, 156, 3, 3, 4, 8, 8, 157, 0, 156, 88, 5, 5, 5, 108, 8, 8, 158, 89, 0, 0, 156, 3, 3, 3, 4, 5, 5, 5, 108, 8, 8, 8, 63, 0, 0, 0, 3, 3, 117, 5, 5, 5, 129, 159, 8, 160, 0, 0, }; static RE_UINT8 re_indic_syllabic_category_stage_5[] = { 0, 0, 0, 0, 9, 0, 0, 0, 1, 1, 1, 2, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 4, 3, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 0, 7, 7, 7, 6, 6, 7, 7, 0, 0, 6, 6, 0, 10, 10, 10, 0, 1, 1, 2, 0, 6, 6, 6, 6, 0, 0, 6, 10, 0, 10, 10, 10, 0, 10, 0, 0, 0, 10, 10, 10, 10, 0, 0, 7, 0, 0, 7, 7, 5, 11, 0, 0, 0, 0, 7, 10, 10, 0, 10, 6, 6, 6, 0, 0, 0, 0, 6, 0, 10, 10, 0, 4, 0, 7, 7, 7, 7, 7, 0, 7, 5, 0, 0, 1, 0, 9, 9, 0, 14, 0, 0, 6, 6, 0, 6, 7, 7, 0, 7, 0, 0, 7, 7, 0, 10, 0, 0, 0, 0, 1, 17, 6, 0, 6, 6, 6, 10, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 10, 10, 10, 0, 7, 0, 7, 7, 0, 3, 7, 7, 0, 7, 7, 0, 0, 0, 1, 2, 0, 0, 10, 0, 7, 5, 12, 0, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 5, 0, 7, 0, 7, 0, 7, 7, 5, 0, 19, 19, 19, 19, 0, 1, 5, 0, 10, 0, 0, 10, 0, 10, 0, 10, 14, 14, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 7, 7, 1, 2, 7, 7, 1, 1, 5, 3, 0, 0, 16, 16, 16, 16, 16, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 0, 0, 10, 6, 6, 6, 6, 6, 6, 7, 7, 7, 1, 19, 2, 5, 5, 14, 14, 14, 14, 10, 10, 10, 6, 6, 7, 7, 10, 10, 10, 10, 14, 14, 14, 10, 7, 19, 19, 10, 10, 7, 7, 19, 19, 19, 19, 19, 10, 10, 10, 7, 7, 7, 7, 10, 10, 10, 10, 10, 14, 7, 7, 7, 7, 19, 19, 19, 10, 19, 0, 0, 19, 19, 7, 7, 0, 0, 6, 6, 6, 10, 5, 0, 0, 0, 10, 0, 7, 7, 10, 10, 10, 6, 7, 20, 20, 0, 12, 0, 0, 0, 0, 5, 5, 0, 3, 0, 0, 0, 9, 10, 10, 10, 7, 13, 13, 13, 15, 15, 1, 15, 15, 15, 15, 15, 15, 0, 0, 0, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 0, 0, 18, 18, 18, 18, 18, 0, 0, 0, 7, 15, 15, 15, 19, 19, 0, 0, 10, 10, 10, 7, 10, 14, 14, 15, 15, 15, 15, 0, 5, 7, 7, 7, 1, 1, 1, 12, 2, 6, 6, 6, 4, 7, 7, 7, 5, 10, 10, 10, 1, 12, 2, 6, 6, 6, 10, 10, 10, 13, 13, 13, 7, 7, 5, 5, 13, 13, 10, 10, 0, 0, 3, 10, 10, 10, 15, 15, 6, 6, 4, 7, 15, 15, 5, 5, 13, 13, 7, 7, 1, 1, 0, 4, 0, 0, 2, 2, 6, 6, 5, 10, 10, 10, 10, 1, 10, 10, 8, 8, 8, 8, 10, 10, 10, 10, 8, 13, 13, 10, 10, 10, 10, 13, 10, 1, 1, 2, 6, 6, 15, 7, 7, 7, 8, 8, 8, 19, 7, 7, 7, 15, 15, 15, 15, 5, 1, 1, 12, 2, 10, 10, 10, 4, 7, 13, 14, 14, 7, 7, 7, 14, 14, 14, 14, 0, 15, 15, 0, 0, 0, 0, 10, 19, 18, 19, 18, 0, 0, 2, 5, 0, 10, 6, 10, 10, 10, 10, 10, 15, 15, 15, 15, 7, 19, 5, 0, 0, 7, 0, 1, 2, 0, 0, 0, 5, 1, 1, 2, 0, 1, 1, 2, 6, 7, 5, 4, 0, 7, 7, 7, 5, 2, 7, 7, 7, 7, 7, 5, 4, }; /* Indic_Syllabic_Category: 1952 bytes. */ RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_indic_syllabic_category_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_indic_syllabic_category_stage_2[pos + f] << 4; f = code >> 4; code ^= f << 4; pos = (RE_UINT32)re_indic_syllabic_category_stage_3[pos + f] << 2; f = code >> 2; code ^= f << 2; pos = (RE_UINT32)re_indic_syllabic_category_stage_4[pos + f] << 2; value = re_indic_syllabic_category_stage_5[pos + code]; return value; } /* Alphanumeric. */ RE_UINT32 re_get_alphanumeric(RE_UINT32 ch) { return re_get_alphabetic(ch) || re_get_general_category(ch) == RE_PROP_ND; } /* Any. */ RE_UINT32 re_get_any(RE_UINT32 ch) { return 1; } /* ASCII. */ RE_UINT32 re_get_ascii(RE_UINT32 ch) { if (ch <= RE_ASCII_MAX) return 1; return 0; } /* Assigned. */ RE_UINT32 re_get_assigned(RE_UINT32 ch) { return re_get_general_category(ch) != RE_PROP_CN; } /* Blank. */ RE_UINT32 re_get_blank(RE_UINT32 ch) { return ch == 0x09 || re_get_general_category(ch) == RE_PROP_ZS; } /* Graph. */ RE_UINT32 re_get_graph(RE_UINT32 ch) { return !re_get_white_space(ch) && (RE_GRAPH_MASK & (1 << re_get_general_category(ch))) == 0; } /* Print. */ RE_UINT32 re_get_print(RE_UINT32 ch) { return (re_get_graph(ch) || re_get_blank(ch)) && re_get_general_category(ch) != RE_PROP_CC; } /* Word. */ RE_UINT32 re_get_word(RE_UINT32 ch) { return re_get_alphabetic(ch) || (RE_WORD_MASK & (1 << re_get_general_category(ch))) != 0 || re_get_join_control(ch); } /* XDigit. */ RE_UINT32 re_get_xdigit(RE_UINT32 ch) { return re_get_general_category(ch) == RE_PROP_ND || re_get_hex_digit(ch); } /* All_Cases. */ static RE_UINT8 re_all_cases_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_all_cases_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 10, 6, 11, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 17, 6, 6, 6, 18, 6, 6, 6, 6, 19, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_all_cases_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 9, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 18, 18, 18, 18, 18, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 34, 18, 18, 35, 18, 18, 18, 18, 18, 36, 18, 37, 38, 39, 18, 40, 41, 42, 43, 44, 45, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 18, 18, 18, 63, 64, 65, 65, 11, 11, 11, 11, 15, 15, 15, 15, 66, 66, 18, 18, 18, 18, 67, 68, 18, 18, 18, 18, 18, 18, 69, 70, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 71, 72, 72, 72, 73, 0, 74, 75, 75, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 77, 77, 77, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 81, 18, 18, 18, 18, 18, 82, 83, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 84, 85, 86, 87, 84, 85, 84, 85, 86, 87, 88, 89, 84, 85, 90, 91, 84, 85, 84, 85, 84, 85, 92, 93, 94, 95, 96, 97, 98, 99, 94, 100, 0, 0, 0, 0, 101, 102, 103, 0, 0, 104, 0, 0, 105, 105, 106, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 109, 109, 110, 110, 110, 111, 0, 0, 72, 72, 72, 72, 72, 73, 75, 75, 75, 75, 75, 76, 112, 113, 114, 115, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 37, 116, 117, 0, 118, 118, 118, 118, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 82, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 18, 68, 18, 18, 18, 18, 18, 18, 18, 0, 121, 18, 122, 37, 0, 18, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 11, 4, 5, 15, 15, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_all_cases_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 7, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 11, 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 13, 14, 15, 14, 15, 14, 15, 14, 15, 16, 17, 14, 15, 14, 15, 14, 15, 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 14, 15, 14, 15, 14, 15, 18, 14, 15, 14, 15, 14, 15, 19, 20, 21, 14, 15, 14, 15, 22, 14, 15, 23, 23, 14, 15, 0, 24, 25, 26, 14, 15, 23, 27, 28, 29, 30, 14, 15, 31, 0, 29, 32, 33, 34, 14, 15, 14, 15, 14, 15, 35, 14, 15, 35, 0, 0, 14, 15, 35, 14, 15, 36, 36, 14, 15, 14, 15, 37, 14, 15, 0, 0, 14, 15, 0, 38, 0, 0, 0, 0, 39, 40, 41, 39, 40, 41, 39, 40, 41, 14, 15, 14, 15, 14, 15, 14, 15, 42, 14, 15, 0, 39, 40, 41, 14, 15, 43, 44, 45, 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 0, 46, 14, 15, 47, 48, 49, 49, 14, 15, 50, 51, 52, 14, 15, 53, 54, 55, 56, 57, 0, 58, 58, 0, 59, 0, 60, 0, 0, 0, 0, 58, 0, 0, 61, 0, 62, 63, 0, 64, 65, 0, 66, 0, 0, 0, 65, 0, 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 71, 0, 0, 71, 0, 0, 0, 0, 71, 72, 73, 73, 74, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 14, 15, 14, 15, 0, 0, 14, 15, 0, 0, 0, 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 78, 78, 78, 0, 79, 0, 80, 80, 81, 1, 82, 1, 1, 83, 1, 1, 84, 85, 86, 1, 87, 1, 1, 1, 88, 89, 0, 90, 1, 1, 91, 1, 1, 92, 1, 1, 93, 94, 94, 94, 95, 5, 96, 5, 5, 97, 5, 5, 98, 99, 100, 5, 101, 5, 5, 5, 102, 103, 104, 105, 5, 5, 106, 5, 5, 107, 5, 5, 108, 109, 109, 110, 111, 112, 0, 0, 0, 113, 114, 115, 116, 117, 118, 0, 119, 120, 0, 14, 15, 121, 14, 15, 0, 45, 45, 45, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 14, 15, 14, 15, 124, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 125, 0, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 0, 0, 0, 0, 0, 128, 0, 0, 0, 129, 0, 0, 0, 130, 0, 0, 131, 132, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 133, 0, 0, 134, 0, 110, 110, 110, 110, 110, 110, 110, 110, 115, 115, 115, 115, 115, 115, 115, 115, 110, 110, 110, 110, 110, 110, 0, 0, 115, 115, 115, 115, 115, 115, 0, 0, 0, 110, 0, 110, 0, 110, 0, 110, 0, 115, 0, 115, 0, 115, 0, 115, 135, 135, 136, 136, 136, 136, 137, 137, 138, 138, 139, 139, 140, 140, 0, 0, 110, 110, 0, 141, 0, 0, 0, 0, 115, 115, 142, 142, 143, 0, 144, 0, 0, 0, 0, 141, 0, 0, 0, 0, 145, 145, 145, 145, 143, 0, 0, 0, 110, 110, 0, 146, 0, 0, 0, 0, 115, 115, 147, 147, 0, 0, 0, 0, 110, 110, 0, 148, 0, 118, 0, 0, 115, 115, 149, 149, 121, 0, 0, 0, 150, 150, 151, 151, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 0, 0, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 0, 0, 0, 0, 0, 0, 14, 15, 161, 162, 163, 164, 165, 14, 15, 14, 15, 14, 15, 166, 167, 168, 169, 0, 14, 15, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 170, 170, 0, 0, 0, 14, 15, 14, 15, 0, 0, 0, 14, 15, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 171, 0, 0, 0, 0, 0, 171, 0, 0, 0, 14, 15, 14, 15, 172, 14, 15, 0, 0, 0, 14, 15, 173, 0, 0, 14, 15, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176, 176, 176, 176, }; /* All_Cases: 1984 bytes. */ static RE_AllCases re_all_cases_table[] = { {{ 0, 0, 0}}, {{ 32, 0, 0}}, {{ 32, 232, 0}}, {{ 32, 8415, 0}}, {{ 32, 300, 0}}, {{ -32, 0, 0}}, {{ -32, 199, 0}}, {{ -32, 8383, 0}}, {{ -32, 268, 0}}, {{ 743, 775, 0}}, {{ 32, 8294, 0}}, {{ 7615, 0, 0}}, {{ -32, 8262, 0}}, {{ 121, 0, 0}}, {{ 1, 0, 0}}, {{ -1, 0, 0}}, {{ -199, 0, 0}}, {{ -232, 0, 0}}, {{ -121, 0, 0}}, {{ -300, -268, 0}}, {{ 195, 0, 0}}, {{ 210, 0, 0}}, {{ 206, 0, 0}}, {{ 205, 0, 0}}, {{ 79, 0, 0}}, {{ 202, 0, 0}}, {{ 203, 0, 0}}, {{ 207, 0, 0}}, {{ 97, 0, 0}}, {{ 211, 0, 0}}, {{ 209, 0, 0}}, {{ 163, 0, 0}}, {{ 213, 0, 0}}, {{ 130, 0, 0}}, {{ 214, 0, 0}}, {{ 218, 0, 0}}, {{ 217, 0, 0}}, {{ 219, 0, 0}}, {{ 56, 0, 0}}, {{ 1, 2, 0}}, {{ -1, 1, 0}}, {{ -2, -1, 0}}, {{ -79, 0, 0}}, {{ -97, 0, 0}}, {{ -56, 0, 0}}, {{ -130, 0, 0}}, {{ 10795, 0, 0}}, {{ -163, 0, 0}}, {{ 10792, 0, 0}}, {{ 10815, 0, 0}}, {{ -195, 0, 0}}, {{ 69, 0, 0}}, {{ 71, 0, 0}}, {{ 10783, 0, 0}}, {{ 10780, 0, 0}}, {{ 10782, 0, 0}}, {{ -210, 0, 0}}, {{ -206, 0, 0}}, {{ -205, 0, 0}}, {{ -202, 0, 0}}, {{ -203, 0, 0}}, {{ -207, 0, 0}}, {{ 42280, 0, 0}}, {{ 42308, 0, 0}}, {{ -209, 0, 0}}, {{ -211, 0, 0}}, {{ 10743, 0, 0}}, {{ 10749, 0, 0}}, {{ -213, 0, 0}}, {{ -214, 0, 0}}, {{ 10727, 0, 0}}, {{ -218, 0, 0}}, {{ -69, 0, 0}}, {{ -217, 0, 0}}, {{ -71, 0, 0}}, {{ -219, 0, 0}}, {{ 84, 116, 7289}}, {{ 38, 0, 0}}, {{ 37, 0, 0}}, {{ 64, 0, 0}}, {{ 63, 0, 0}}, {{ 7235, 0, 0}}, {{ 32, 62, 0}}, {{ 32, 96, 0}}, {{ 32, 57, 92}}, {{ -84, 32, 7205}}, {{ 32, 86, 0}}, {{ -743, 32, 0}}, {{ 32, 54, 0}}, {{ 32, 80, 0}}, {{ 31, 32, 0}}, {{ 32, 47, 0}}, {{ 32, 7549, 0}}, {{ -38, 0, 0}}, {{ -37, 0, 0}}, {{ 7219, 0, 0}}, {{ -32, 30, 0}}, {{ -32, 64, 0}}, {{ -32, 25, 60}}, {{ -116, -32, 7173}}, {{ -32, 54, 0}}, {{ -775, -32, 0}}, {{ -32, 22, 0}}, {{ -32, 48, 0}}, {{ -31, 1, 0}}, {{ -32, -1, 0}}, {{ -32, 15, 0}}, {{ -32, 7517, 0}}, {{ -64, 0, 0}}, {{ -63, 0, 0}}, {{ 8, 0, 0}}, {{ -62, -30, 0}}, {{ -57, -25, 35}}, {{ -47, -15, 0}}, {{ -54, -22, 0}}, {{ -8, 0, 0}}, {{ -86, -54, 0}}, {{ -80, -48, 0}}, {{ 7, 0, 0}}, {{ -92, -60, -35}}, {{ -96, -64, 0}}, {{ -7, 0, 0}}, {{ 80, 0, 0}}, {{ -80, 0, 0}}, {{ 15, 0, 0}}, {{ -15, 0, 0}}, {{ 48, 0, 0}}, {{ -48, 0, 0}}, {{ 7264, 0, 0}}, {{ 35332, 0, 0}}, {{ 3814, 0, 0}}, {{ 1, 59, 0}}, {{ -1, 58, 0}}, {{ -59, -58, 0}}, {{ -7615, 0, 0}}, {{ 74, 0, 0}}, {{ 86, 0, 0}}, {{ 100, 0, 0}}, {{ 128, 0, 0}}, {{ 112, 0, 0}}, {{ 126, 0, 0}}, {{ 9, 0, 0}}, {{ -74, 0, 0}}, {{ -9, 0, 0}}, {{ -7289, -7205, -7173}}, {{ -86, 0, 0}}, {{ -7235, 0, 0}}, {{ -100, 0, 0}}, {{ -7219, 0, 0}}, {{ -112, 0, 0}}, {{ -128, 0, 0}}, {{ -126, 0, 0}}, {{ -7549, -7517, 0}}, {{ -8415, -8383, 0}}, {{ -8294, -8262, 0}}, {{ 28, 0, 0}}, {{ -28, 0, 0}}, {{ 16, 0, 0}}, {{ -16, 0, 0}}, {{ 26, 0, 0}}, {{ -26, 0, 0}}, {{-10743, 0, 0}}, {{ -3814, 0, 0}}, {{-10727, 0, 0}}, {{-10795, 0, 0}}, {{-10792, 0, 0}}, {{-10780, 0, 0}}, {{-10749, 0, 0}}, {{-10783, 0, 0}}, {{-10782, 0, 0}}, {{-10815, 0, 0}}, {{ -7264, 0, 0}}, {{-35332, 0, 0}}, {{-42280, 0, 0}}, {{-42308, 0, 0}}, {{ 40, 0, 0}}, {{ -40, 0, 0}}, }; /* All_Cases: 1062 bytes. */ int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; RE_AllCases* all_cases; int count; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_all_cases_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_all_cases_stage_2[pos + f] << 5; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_all_cases_stage_3[pos + f] << 3; value = re_all_cases_stage_4[pos + code]; all_cases = &re_all_cases_table[value]; codepoints[0] = ch; count = 1; while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) { codepoints[count] = ch + all_cases->diffs[count - 1]; ++count; } return count; } /* Simple_Case_Folding. */ static RE_UINT8 re_simple_case_folding_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_simple_case_folding_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 6, 6, 6, 6, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_simple_case_folding_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 5, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 7, 8, 8, 7, 6, 6, 6, 6, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 8, 20, 6, 6, 21, 6, 6, 6, 6, 6, 22, 6, 23, 24, 25, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 27, 0, 28, 29, 1, 2, 30, 31, 0, 0, 32, 33, 34, 6, 6, 6, 35, 36, 37, 37, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 38, 7, 6, 6, 6, 6, 6, 6, 39, 40, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 41, 42, 42, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 45, 46, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 47, 48, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 49, 0, 50, 0, 49, 0, 49, 0, 50, 0, 51, 0, 49, 0, 0, 0, 49, 0, 49, 0, 49, 0, 52, 0, 53, 0, 54, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 60, 60, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 63, 63, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 43, 0, 0, 0, 0, 0, 0, 64, 65, 66, 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 68, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 47, 0, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 6, 6, 6, 6, 6, 6, 6, 0, 69, 6, 70, 23, 0, 6, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 72, 72, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_simple_case_folding_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 0, 3, 0, 3, 0, 0, 3, 0, 3, 0, 3, 0, 3, 4, 3, 0, 3, 0, 3, 0, 5, 0, 6, 3, 0, 3, 0, 7, 3, 0, 8, 8, 3, 0, 0, 9, 10, 11, 3, 0, 8, 12, 0, 13, 14, 3, 0, 0, 0, 13, 15, 0, 16, 3, 0, 3, 0, 3, 0, 17, 3, 0, 17, 0, 0, 3, 0, 17, 3, 0, 18, 18, 3, 0, 3, 0, 19, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 20, 3, 0, 20, 3, 0, 20, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 3, 0, 0, 20, 3, 0, 3, 0, 21, 22, 23, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 24, 3, 0, 25, 26, 0, 0, 3, 0, 27, 28, 29, 3, 0, 0, 0, 0, 0, 0, 30, 0, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 32, 32, 0, 33, 0, 34, 34, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 39, 0, 40, 41, 0, 0, 42, 43, 0, 3, 0, 44, 3, 0, 0, 23, 23, 23, 45, 45, 45, 45, 45, 45, 45, 45, 3, 0, 0, 0, 0, 0, 0, 0, 46, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 0, 0, 48, 0, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 49, 0, 0, 50, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 0, 51, 0, 51, 0, 51, 51, 51, 52, 52, 53, 0, 54, 0, 55, 55, 55, 55, 53, 0, 0, 0, 51, 51, 56, 56, 0, 0, 0, 0, 51, 51, 57, 57, 44, 0, 0, 0, 58, 58, 59, 59, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 3, 0, 66, 67, 68, 0, 0, 3, 0, 3, 0, 3, 0, 69, 70, 71, 72, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 73, 73, 0, 0, 0, 3, 0, 3, 0, 0, 0, 3, 0, 3, 0, 74, 3, 0, 0, 0, 0, 3, 0, 75, 0, 0, 3, 0, 76, 0, 0, 0, 0, 0, 77, 77, 77, 77, 77, 77, 77, 77, }; /* Simple_Case_Folding: 1456 bytes. */ static RE_INT32 re_simple_case_folding_table[] = { 0, 32, 775, 1, -121, -268, 210, 206, 205, 79, 202, 203, 207, 211, 209, 213, 214, 218, 217, 219, 2, -97, -56, -130, 10795, -163, 10792, -195, 69, 71, 116, 38, 37, 64, 63, 8, -30, -25, -15, -22, -54, -48, -60, -64, -7, 80, 15, 48, 7264, -58, -7615, -8, -74, -9, -7173, -86, -100, -112, -128, -126, -7517, -8383, -8262, 28, 16, 26, -10743, -3814, -10727, -10780, -10749, -10783, -10782, -10815, -35332, -42280, -42308, 40, }; /* Simple_Case_Folding: 312 bytes. */ RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; RE_INT32 diff; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_simple_case_folding_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_simple_case_folding_stage_2[pos + f] << 5; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_simple_case_folding_stage_3[pos + f] << 3; value = re_simple_case_folding_stage_4[pos + code]; diff = re_simple_case_folding_table[value]; return ch + diff; } /* Full_Case_Folding. */ static RE_UINT8 re_full_case_folding_stage_1[] = { 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static RE_UINT8 re_full_case_folding_stage_2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 6, 10, 6, 6, 11, 6, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 14, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 6, 6, 6, 16, 6, 6, 6, 6, 17, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static RE_UINT8 re_full_case_folding_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 6, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 8, 9, 9, 10, 7, 7, 7, 7, 7, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 9, 22, 7, 7, 23, 7, 7, 7, 7, 7, 24, 7, 25, 26, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 2, 33, 34, 35, 0, 36, 37, 38, 7, 7, 7, 39, 40, 41, 41, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 42, 43, 7, 7, 7, 7, 7, 7, 44, 45, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 46, 47, 47, 47, 48, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 51, 52, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 53, 54, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 55, 0, 56, 0, 55, 0, 55, 0, 56, 57, 58, 0, 55, 0, 0, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, 0, 0, 75, 76, 77, 0, 0, 0, 0, 0, 78, 78, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 81, 81, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 48, 0, 0, 0, 0, 0, 0, 82, 83, 84, 85, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 86, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 87, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 7, 43, 7, 7, 7, 7, 7, 7, 7, 0, 88, 7, 89, 25, 0, 7, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static RE_UINT8 re_full_case_folding_stage_4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 3, 4, 0, 4, 0, 4, 0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 0, 6, 4, 0, 4, 0, 4, 0, 7, 4, 0, 4, 0, 4, 0, 8, 0, 9, 4, 0, 4, 0, 10, 4, 0, 11, 11, 4, 0, 0, 12, 13, 14, 4, 0, 11, 15, 0, 16, 17, 4, 0, 0, 0, 16, 18, 0, 19, 4, 0, 4, 0, 4, 0, 20, 4, 0, 20, 0, 0, 4, 0, 20, 4, 0, 21, 21, 4, 0, 4, 0, 22, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 23, 4, 0, 23, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 4, 0, 24, 23, 4, 0, 4, 0, 25, 26, 27, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 28, 4, 0, 29, 30, 0, 0, 4, 0, 31, 32, 33, 4, 0, 0, 0, 0, 0, 0, 34, 0, 0, 4, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 35, 0, 36, 36, 36, 0, 37, 0, 38, 38, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, 45, 0, 46, 47, 0, 0, 48, 49, 0, 4, 0, 50, 4, 0, 0, 27, 27, 27, 51, 51, 51, 51, 51, 51, 51, 51, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 4, 0, 52, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 55, 0, 0, 4, 0, 4, 0, 4, 0, 56, 57, 58, 59, 60, 61, 0, 0, 62, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 64, 0, 65, 0, 66, 0, 67, 0, 0, 63, 0, 63, 0, 63, 0, 63, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 74, 75, 76, 0, 77, 78, 63, 63, 79, 79, 80, 0, 81, 0, 0, 0, 82, 83, 84, 0, 85, 86, 87, 87, 87, 87, 88, 0, 0, 0, 0, 0, 89, 90, 0, 0, 91, 92, 63, 63, 93, 93, 0, 0, 0, 0, 0, 0, 94, 95, 96, 0, 97, 98, 63, 63, 99, 99, 50, 0, 0, 0, 0, 0, 100, 101, 102, 0, 103, 104, 105, 105, 106, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 4, 0, 114, 115, 116, 0, 0, 4, 0, 4, 0, 4, 0, 117, 118, 119, 120, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 121, 121, 0, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 4, 0, 122, 4, 0, 0, 0, 0, 4, 0, 123, 0, 0, 4, 0, 124, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 131, 0, 0, 0, 0, 132, 133, 134, 135, 136, 137, 137, 137, 137, 137, 137, 137, 137, }; /* Full_Case_Folding: 1656 bytes. */ static RE_FullCaseFolding re_full_case_folding_table[] = { { 0, { 0, 0}}, { 32, { 0, 0}}, { 775, { 0, 0}}, { -108, { 115, 0}}, { 1, { 0, 0}}, { -199, { 775, 0}}, { 371, { 110, 0}}, { -121, { 0, 0}}, { -268, { 0, 0}}, { 210, { 0, 0}}, { 206, { 0, 0}}, { 205, { 0, 0}}, { 79, { 0, 0}}, { 202, { 0, 0}}, { 203, { 0, 0}}, { 207, { 0, 0}}, { 211, { 0, 0}}, { 209, { 0, 0}}, { 213, { 0, 0}}, { 214, { 0, 0}}, { 218, { 0, 0}}, { 217, { 0, 0}}, { 219, { 0, 0}}, { 2, { 0, 0}}, { -390, { 780, 0}}, { -97, { 0, 0}}, { -56, { 0, 0}}, { -130, { 0, 0}}, { 10795, { 0, 0}}, { -163, { 0, 0}}, { 10792, { 0, 0}}, { -195, { 0, 0}}, { 69, { 0, 0}}, { 71, { 0, 0}}, { 116, { 0, 0}}, { 38, { 0, 0}}, { 37, { 0, 0}}, { 64, { 0, 0}}, { 63, { 0, 0}}, { 41, { 776, 769}}, { 21, { 776, 769}}, { 8, { 0, 0}}, { -30, { 0, 0}}, { -25, { 0, 0}}, { -15, { 0, 0}}, { -22, { 0, 0}}, { -54, { 0, 0}}, { -48, { 0, 0}}, { -60, { 0, 0}}, { -64, { 0, 0}}, { -7, { 0, 0}}, { 80, { 0, 0}}, { 15, { 0, 0}}, { 48, { 0, 0}}, { -34, {1410, 0}}, { 7264, { 0, 0}}, { -7726, { 817, 0}}, { -7715, { 776, 0}}, { -7713, { 778, 0}}, { -7712, { 778, 0}}, { -7737, { 702, 0}}, { -58, { 0, 0}}, { -7723, { 115, 0}}, { -8, { 0, 0}}, { -7051, { 787, 0}}, { -7053, { 787, 768}}, { -7055, { 787, 769}}, { -7057, { 787, 834}}, { -128, { 953, 0}}, { -136, { 953, 0}}, { -112, { 953, 0}}, { -120, { 953, 0}}, { -64, { 953, 0}}, { -72, { 953, 0}}, { -66, { 953, 0}}, { -7170, { 953, 0}}, { -7176, { 953, 0}}, { -7173, { 834, 0}}, { -7174, { 834, 953}}, { -74, { 0, 0}}, { -7179, { 953, 0}}, { -7173, { 0, 0}}, { -78, { 953, 0}}, { -7180, { 953, 0}}, { -7190, { 953, 0}}, { -7183, { 834, 0}}, { -7184, { 834, 953}}, { -86, { 0, 0}}, { -7189, { 953, 0}}, { -7193, { 776, 768}}, { -7194, { 776, 769}}, { -7197, { 834, 0}}, { -7198, { 776, 834}}, { -100, { 0, 0}}, { -7197, { 776, 768}}, { -7198, { 776, 769}}, { -7203, { 787, 0}}, { -7201, { 834, 0}}, { -7202, { 776, 834}}, { -112, { 0, 0}}, { -118, { 953, 0}}, { -7210, { 953, 0}}, { -7206, { 953, 0}}, { -7213, { 834, 0}}, { -7214, { 834, 953}}, { -128, { 0, 0}}, { -126, { 0, 0}}, { -7219, { 953, 0}}, { -7517, { 0, 0}}, { -8383, { 0, 0}}, { -8262, { 0, 0}}, { 28, { 0, 0}}, { 16, { 0, 0}}, { 26, { 0, 0}}, {-10743, { 0, 0}}, { -3814, { 0, 0}}, {-10727, { 0, 0}}, {-10780, { 0, 0}}, {-10749, { 0, 0}}, {-10783, { 0, 0}}, {-10782, { 0, 0}}, {-10815, { 0, 0}}, {-35332, { 0, 0}}, {-42280, { 0, 0}}, {-42308, { 0, 0}}, {-64154, { 102, 0}}, {-64155, { 105, 0}}, {-64156, { 108, 0}}, {-64157, { 102, 105}}, {-64158, { 102, 108}}, {-64146, { 116, 0}}, {-64147, { 116, 0}}, {-62879, {1398, 0}}, {-62880, {1381, 0}}, {-62881, {1387, 0}}, {-62872, {1398, 0}}, {-62883, {1389, 0}}, { 40, { 0, 0}}, }; /* Full_Case_Folding: 1104 bytes. */ int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints) { RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; RE_FullCaseFolding* case_folding; int count; f = ch >> 13; code = ch ^ (f << 13); pos = (RE_UINT32)re_full_case_folding_stage_1[f] << 5; f = code >> 8; code ^= f << 8; pos = (RE_UINT32)re_full_case_folding_stage_2[pos + f] << 5; f = code >> 3; code ^= f << 3; pos = (RE_UINT32)re_full_case_folding_stage_3[pos + f] << 3; value = re_full_case_folding_stage_4[pos + code]; case_folding = &re_full_case_folding_table[value]; codepoints[0] = ch + case_folding->diff; count = 1; while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) { codepoints[count] = case_folding->codepoints[count - 1]; ++count; } return count; } /* Property function table. */ RE_GetPropertyFunc re_get_property[] = { re_get_general_category, re_get_block, re_get_script, re_get_word_break, re_get_grapheme_cluster_break, re_get_sentence_break, re_get_math, re_get_alphabetic, re_get_lowercase, re_get_uppercase, re_get_cased, re_get_case_ignorable, re_get_changes_when_lowercased, re_get_changes_when_uppercased, re_get_changes_when_titlecased, re_get_changes_when_casefolded, re_get_changes_when_casemapped, re_get_id_start, re_get_id_continue, re_get_xid_start, re_get_xid_continue, re_get_default_ignorable_code_point, re_get_grapheme_extend, re_get_grapheme_base, re_get_grapheme_link, re_get_white_space, re_get_bidi_control, re_get_join_control, re_get_dash, re_get_hyphen, re_get_quotation_mark, re_get_terminal_punctuation, re_get_other_math, re_get_hex_digit, re_get_ascii_hex_digit, re_get_other_alphabetic, re_get_ideographic, re_get_diacritic, re_get_extender, re_get_other_lowercase, re_get_other_uppercase, re_get_noncharacter_code_point, re_get_other_grapheme_extend, re_get_ids_binary_operator, re_get_ids_trinary_operator, re_get_radical, re_get_unified_ideograph, re_get_other_default_ignorable_code_point, re_get_deprecated, re_get_soft_dotted, re_get_logical_order_exception, re_get_other_id_start, re_get_other_id_continue, re_get_sterm, re_get_variation_selector, re_get_pattern_white_space, re_get_pattern_syntax, re_get_hangul_syllable_type, re_get_bidi_class, re_get_canonical_combining_class, re_get_decomposition_type, re_get_east_asian_width, re_get_joining_group, re_get_joining_type, re_get_line_break, re_get_numeric_type, re_get_numeric_value, re_get_bidi_mirrored, re_get_indic_matra_category, re_get_indic_syllabic_category, re_get_alphanumeric, re_get_any, re_get_ascii, re_get_assigned, re_get_blank, re_get_graph, re_get_print, re_get_word, re_get_xdigit, }; regex-2014.02.16/Python3/_regex_unicode.h0000666000000000000000000001602012226112251016040 0ustar 00000000000000typedef unsigned char RE_UINT8; typedef signed char RE_INT8; typedef unsigned short RE_UINT16; typedef signed short RE_INT16; typedef unsigned int RE_UINT32; typedef signed int RE_INT32; typedef unsigned char BOOL; enum {FALSE, TRUE}; #define RE_ASCII_MAX 0x7F #define RE_LOCALE_MAX 0xFF #define RE_UNICODE_MAX 0x10FFFF #define RE_MAX_CASES 4 #define RE_MAX_FOLDED 3 typedef struct RE_Property { RE_UINT16 name; RE_UINT8 id; RE_UINT8 value_set; } RE_Property; typedef struct RE_PropertyValue { RE_UINT16 name; RE_UINT8 value_set; RE_UINT8 id; } RE_PropertyValue; typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); #define RE_PROP_GC 0x0 #define RE_PROP_CASED 0xA #define RE_PROP_UPPERCASE 0x9 #define RE_PROP_LOWERCASE 0x8 #define RE_PROP_C 30 #define RE_PROP_L 31 #define RE_PROP_M 32 #define RE_PROP_N 33 #define RE_PROP_P 34 #define RE_PROP_S 35 #define RE_PROP_Z 36 #define RE_PROP_CN 0 #define RE_PROP_LU 1 #define RE_PROP_LL 2 #define RE_PROP_LT 3 #define RE_PROP_LM 4 #define RE_PROP_LO 5 #define RE_PROP_MN 6 #define RE_PROP_ME 7 #define RE_PROP_MC 8 #define RE_PROP_ND 9 #define RE_PROP_NL 10 #define RE_PROP_NO 11 #define RE_PROP_ZS 12 #define RE_PROP_ZL 13 #define RE_PROP_ZP 14 #define RE_PROP_CC 15 #define RE_PROP_CF 16 #define RE_PROP_CO 17 #define RE_PROP_CS 18 #define RE_PROP_PD 19 #define RE_PROP_PS 20 #define RE_PROP_PE 21 #define RE_PROP_PC 22 #define RE_PROP_PO 23 #define RE_PROP_SM 24 #define RE_PROP_SC 25 #define RE_PROP_SK 26 #define RE_PROP_SO 27 #define RE_PROP_PI 28 #define RE_PROP_PF 29 #define RE_PROP_C_MASK 0x00078001 #define RE_PROP_L_MASK 0x0000003E #define RE_PROP_M_MASK 0x000001C0 #define RE_PROP_N_MASK 0x00000E00 #define RE_PROP_P_MASK 0x30F80000 #define RE_PROP_S_MASK 0x0F000000 #define RE_PROP_Z_MASK 0x00007000 #define RE_PROP_ALNUM 0x460001 #define RE_PROP_ALPHA 0x070001 #define RE_PROP_ANY 0x470001 #define RE_PROP_ASCII 0x480001 #define RE_PROP_ASSIGNED 0x490001 #define RE_PROP_BLANK 0x4A0001 #define RE_PROP_CNTRL 0x00000F #define RE_PROP_DIGIT 0x000009 #define RE_PROP_GRAPH 0x4B0001 #define RE_PROP_LOWER 0x080001 #define RE_PROP_PRINT 0x4C0001 #define RE_PROP_PUNCT 0x000022 #define RE_PROP_SPACE 0x190001 #define RE_PROP_UPPER 0x090001 #define RE_PROP_WORD 0x4D0001 #define RE_PROP_XDIGIT 0x4E0001 #define RE_BREAK_OTHER 0 #define RE_BREAK_DOUBLEQUOTE 1 #define RE_BREAK_SINGLEQUOTE 2 #define RE_BREAK_HEBREWLETTER 3 #define RE_BREAK_CR 4 #define RE_BREAK_LF 5 #define RE_BREAK_NEWLINE 6 #define RE_BREAK_EXTEND 7 #define RE_BREAK_REGIONALINDICATOR 8 #define RE_BREAK_FORMAT 9 #define RE_BREAK_KATAKANA 10 #define RE_BREAK_ALETTER 11 #define RE_BREAK_MIDLETTER 12 #define RE_BREAK_MIDNUM 13 #define RE_BREAK_MIDNUMLET 14 #define RE_BREAK_NUMERIC 15 #define RE_BREAK_EXTENDNUMLET 16 #define RE_GBREAK_OTHER 0 #define RE_GBREAK_CR 1 #define RE_GBREAK_LF 2 #define RE_GBREAK_CONTROL 3 #define RE_GBREAK_EXTEND 4 #define RE_GBREAK_REGIONALINDICATOR 5 #define RE_GBREAK_SPACINGMARK 6 #define RE_GBREAK_L 7 #define RE_GBREAK_V 8 #define RE_GBREAK_T 9 #define RE_GBREAK_LV 10 #define RE_GBREAK_LVT 11 #define RE_GBREAK_PREPEND 12 extern char* re_strings[1155]; extern RE_Property re_properties[145]; extern RE_PropertyValue re_property_values[1244]; extern RE_UINT16 re_expand_on_folding[104]; extern RE_GetPropertyFunc re_get_property[79]; RE_UINT32 re_get_general_category(RE_UINT32 ch); RE_UINT32 re_get_block(RE_UINT32 ch); RE_UINT32 re_get_script(RE_UINT32 ch); RE_UINT32 re_get_word_break(RE_UINT32 ch); RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch); RE_UINT32 re_get_sentence_break(RE_UINT32 ch); RE_UINT32 re_get_math(RE_UINT32 ch); RE_UINT32 re_get_alphabetic(RE_UINT32 ch); RE_UINT32 re_get_lowercase(RE_UINT32 ch); RE_UINT32 re_get_uppercase(RE_UINT32 ch); RE_UINT32 re_get_cased(RE_UINT32 ch); RE_UINT32 re_get_case_ignorable(RE_UINT32 ch); RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch); RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch); RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch); RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch); RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch); RE_UINT32 re_get_id_start(RE_UINT32 ch); RE_UINT32 re_get_id_continue(RE_UINT32 ch); RE_UINT32 re_get_xid_start(RE_UINT32 ch); RE_UINT32 re_get_xid_continue(RE_UINT32 ch); RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch); RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch); RE_UINT32 re_get_grapheme_base(RE_UINT32 ch); RE_UINT32 re_get_grapheme_link(RE_UINT32 ch); RE_UINT32 re_get_white_space(RE_UINT32 ch); RE_UINT32 re_get_bidi_control(RE_UINT32 ch); RE_UINT32 re_get_join_control(RE_UINT32 ch); RE_UINT32 re_get_dash(RE_UINT32 ch); RE_UINT32 re_get_hyphen(RE_UINT32 ch); RE_UINT32 re_get_quotation_mark(RE_UINT32 ch); RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch); RE_UINT32 re_get_other_math(RE_UINT32 ch); RE_UINT32 re_get_hex_digit(RE_UINT32 ch); RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch); RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch); RE_UINT32 re_get_ideographic(RE_UINT32 ch); RE_UINT32 re_get_diacritic(RE_UINT32 ch); RE_UINT32 re_get_extender(RE_UINT32 ch); RE_UINT32 re_get_other_lowercase(RE_UINT32 ch); RE_UINT32 re_get_other_uppercase(RE_UINT32 ch); RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch); RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch); RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch); RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch); RE_UINT32 re_get_radical(RE_UINT32 ch); RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch); RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch); RE_UINT32 re_get_deprecated(RE_UINT32 ch); RE_UINT32 re_get_soft_dotted(RE_UINT32 ch); RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch); RE_UINT32 re_get_other_id_start(RE_UINT32 ch); RE_UINT32 re_get_other_id_continue(RE_UINT32 ch); RE_UINT32 re_get_sterm(RE_UINT32 ch); RE_UINT32 re_get_variation_selector(RE_UINT32 ch); RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch); RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch); RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch); RE_UINT32 re_get_bidi_class(RE_UINT32 ch); RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch); RE_UINT32 re_get_decomposition_type(RE_UINT32 ch); RE_UINT32 re_get_east_asian_width(RE_UINT32 ch); RE_UINT32 re_get_joining_group(RE_UINT32 ch); RE_UINT32 re_get_joining_type(RE_UINT32 ch); RE_UINT32 re_get_line_break(RE_UINT32 ch); RE_UINT32 re_get_numeric_type(RE_UINT32 ch); RE_UINT32 re_get_numeric_value(RE_UINT32 ch); RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch); RE_UINT32 re_get_indic_matra_category(RE_UINT32 ch); RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch); RE_UINT32 re_get_alphanumeric(RE_UINT32 ch); RE_UINT32 re_get_any(RE_UINT32 ch); RE_UINT32 re_get_ascii(RE_UINT32 ch); RE_UINT32 re_get_assigned(RE_UINT32 ch); RE_UINT32 re_get_blank(RE_UINT32 ch); RE_UINT32 re_get_graph(RE_UINT32 ch); RE_UINT32 re_get_print(RE_UINT32 ch); RE_UINT32 re_get_word(RE_UINT32 ch); RE_UINT32 re_get_xdigit(RE_UINT32 ch); int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints); RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch); int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints); regex-2014.02.16/README0000666000000000000000000000076111777613350012251 0ustar 00000000000000regex is an alternative to the re package in the Python standard library. It is intended to act as a drop in replacement, and one day to replace re. regex is supported on Python v2.5 to v2.7 and v3.1 to v3.3. For a full list of features see Python2/Features.rst or Python3/Features.rst. To build and install regex for your default Python run python setup.py install To install regex for a specific version run setup.py with that interpreter, e.g. python3.1 setup.py install regex-2014.02.16/setup.py0000666000000000000000000000341712300214541013062 0ustar 00000000000000#!/usr/bin/env python import os import sys from distutils.core import setup, Extension MAJOR, MINOR = sys.version_info[:2] BASE_DIR = os.path.dirname(os.path.abspath(__file__)) PKG_BASE = 'Python%i' % MAJOR DOCS_DIR = os.path.join(BASE_DIR, 'docs') setup( name='regex', version='2014.02.16', description='Alternative regular expression module, to replace re.', long_description=open(os.path.join(DOCS_DIR, 'Features.rst')).read(), # PyPI does spam protection on email addresses, no need to do it here author='Matthew Barnett', author_email='regex@mrabarnett.plus.com', maintainer='Matthew Barnett', maintainer_email='regex@mrabarnett.plus.com', url='https://code.google.com/p/mrab-regex-hg/', classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'License :: OSI Approved :: Python Software Foundation License', 'Operating System :: OS Independent', 'Programming Language :: Python :: 2.5', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.1', 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Topic :: Scientific/Engineering :: Information Analysis', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Text Processing', 'Topic :: Text Processing :: General', ], license='Python Software Foundation License', py_modules = ['regex', '_regex_core', 'test_regex'], package_dir={'': PKG_BASE}, ext_modules=[Extension('_regex', [os.path.join(PKG_BASE, '_regex.c'), os.path.join(PKG_BASE, '_regex_unicode.c')])], ) regex-2014.02.16/tools/0000777000000000000000000000000012300214544012506 5ustar 00000000000000regex-2014.02.16/tools/build_regex_unicode.py0000666000000000000000000020061311721570164017072 0ustar 00000000000000# -*- coding: utf-8 -*- # This script builds the Unicode tables used by the regex module. # # It downloads the data from the Unicode website, saving it locally, and then # calculates the minimum size of the tables. # # Finally, it creates 2 code files, namely "_regex_unicode.h" and # "_regex_unicode.c". # # Various parameters are stored in a local "shelve" file in order to reduce # the amount of recalculation. # # This script is written in Python 3. import os import shelve import sys import shutil from collections import defaultdict from contextlib import closing from urllib.parse import urljoin, urlparse from urllib.request import urlretrieve this_folder = os.path.dirname(__file__) # The location of the Unicode data folder. unicode_folder = os.path.join(this_folder, "Unicode") # The location of the C sources for the regex engine. c_folder = os.path.join(this_folder, "regex") # The paths of the source files to be generated. h_path = os.path.join(c_folder, "_regex_unicode.h") c_path = os.path.join(c_folder, "_regex_unicode.c") properties_path = os.path.join(this_folder, "UnicodeProperties.txt") # The paths of the C source files. c_header_path = os.path.join(c_folder, "_regex_unicode.h") c_source_path = os.path.join(c_folder, "_regex_unicode.c") # The path of the shelve file. shelf_path = os.path.splitext(__file__)[0] + ".shf" # The number of columns in each table. COLUMNS = 16 # The maximum number of codepoints. NUM_CODEPOINTS = 0x110000 # The maximum depth of the multi-stage tables. MAX_STAGES = 5 # Whether to force an update of the Unicode data. # # Data is downloaded if needed, but if the Unicode data has been updated on # the website then you need to force an update. FORCE_UPDATE = False # Whether to force recalculation of the smallest table size. FORCE_RECALC = False # Whether to count the number of codepoints as a check. COUNT_CODEPOINTS = False # If we update then we must recalculate. if FORCE_UPDATE: FORCE_RECALC = True # Ensure that the Unicode data folder exists. try: os.mkdir(unicode_folder) except OSError: pass # If the maximum number of stages has changed, then force recalculation. with closing(shelve.open(shelf_path, writeback=True)) as shelf: if shelf.get("MAXSTAGES") != MAX_STAGES: shelf["MAXSTAGES"] = MAX_STAGES FORCE_RECALC = True if FORCE_RECALC: try: del shelf["CASEFOLDING"] except KeyError: pass # Redefine "print" so that it flushes. real_print = print def print(*args, **kwargs): real_print(*args, **kwargs) sys.stdout.flush() class UnicodeDataError(Exception): pass def determine_data_type(min_value, max_value): "Determines the smallest C data type which can store values in a range." # 1 byte, unsigned and signed. if 0 <= min_value <= max_value <= 0xFF: return "RE_UINT8", 1 if -0x80 <= min_value <= max_value <= 0x7F: return "RE_INT8", 1 # 2 bytes, unsigned and signed. if 0 <= min_value <= max_value <= 0xFFFF: return "RE_UINT16", 2 if -0x8000 <= min_value <= max_value <= 0x7FFF: return "RE_INT16", 2 # 4 bytes, unsigned and signed. if 0 <= min_value <= max_value <= 0xFFFFFFFF: return "RE_UINT32", 4 if -0x80000000 <= min_value <= max_value <= 0x7FFFFFFF: return "RE_INT32", 4 raise ValueError("value range too big for 32 bits") def smallest_data_type(min_value, max_value): """Determines the smallest integer data type required to store all of the values in a range. """ return determine_data_type(min_value, max_value)[0] def smallest_bytesize(min_value, max_value): """Determines the minimum number of bytes required to store all of the values in a range. """ return determine_data_type(min_value, max_value)[1] def product(numbers): """Calculates the product of a series of numbers.""" if not product: raise ValueError("product of empty sequence") result = 1 for n in numbers: result *= n return result def mul_to_shift(number): "Converts a multiplier into a shift." shift = number.bit_length() - 1 if shift < 0 or (1 << shift) != number: raise ValueError("can't convert multiplier into shift") return shift class MultistageTable: "A multi-stage table." def __init__(self, block_sizes, stages, binary): self.block_sizes = block_sizes self.stages = stages self.binary = binary self.num_stages = len(self.block_sizes) + 1 # How many bytes of storage are needed for this table? self.bytesize = 0 for stage in self.stages[ : -1]: self.bytesize += (smallest_bytesize(min(stage), max(stage)) * len(stage)) if binary: self.bytesize += len(self.stages[-1]) // 8 else: self.bytesize += smallest_bytesize(min(self.stages[-1]), max(self.stages[-1])) * len(self.stages[-1]) # Calculate the block-size products for lookup. self._size_products = [] for stage in range(self.num_stages - 1): self._size_products.append(product(self.block_sizes[stage : ])) class PropertyValue: "A property value." def __init__(self, name, id): self.name = name self.id = id self.aliases = set() def use_pref_name(self): """Uses better names for the properties and values if the current one is poor. """ self.name, self.aliases = pick_pref_name(self.name, self.aliases) class Property: "A Unicode property." def __init__(self, name, entries, value_dict): self.name = name self.entries = entries self._value_list = [] self._value_dict = {} for name, value in sorted(value_dict.items(), key=lambda pair: pair[1]): val = PropertyValue(name, value) self._value_list.append(val) self._value_dict[name.upper()] = val self.binary = len(self._value_dict.values()) == 2 self.aliases = set() def add(self, val): "Adds a value." # Make it case-insensitive. upper_name = val.name.upper() if upper_name in self._value_dict: raise KeyError("duplicate value name: {}".format(val.name)) self._value_list.append(val) self._value_dict[upper_name] = val def use_pref_name(self): """Use a better name for a property or value if the current one is poor. """ self.name, self.aliases = pick_pref_name(self.name, self.aliases) def make_binary_property(self): "Makes this property a binary property." if self._value_list: raise UnicodeDataError("property '{}' already has values".format(self.name)) binary_values = [ ("No", 0, {"N", "False", "F"}), ("Yes", 1, {"Y", "True", "T"}) ] for name, v, aliases in binary_values: val = PropertyValue(name, v) val.aliases |= aliases self._value_list.append(val) self._value_dict[name.upper()] = val self.binary = True def generate_code(self, h_file, c_file, info): "Generates the code for a property." # Build the tables. self._build_tables() print("Generating code for {}".format(self.name)) table = self.table # Write the property tables. c_file.write(""" /* {name}. */ """.format(name=self.name)) self.generate_tables(c_file) # Write the lookup function. prototype = "RE_UINT32 re_get_{name}(RE_UINT32 ch)".format(name=self.name.lower()) h_file.write("{prototype};\n".format(prototype=prototype)) c_file.write(""" {prototype} {{ """.format(prototype=prototype)) self._generate_locals(c_file) c_file.write("\n") self._generate_lookup(c_file) c_file.write(""" return value; } """) def generate_tables(self, c_file): table = self.table for stage in range(table.num_stages): # The contents of this table. entries = table.stages[stage] # What data type should we use for the entries? if self.binary and stage == table.num_stages - 1: data_type = "RE_UINT8" entries = self._pack_to_bitflags(entries) else: data_type = smallest_data_type(min(entries), max(entries)) # The entries will be stored in an array. c_file.write(""" static {data_type} re_{name}_stage_{stage}[] = {{ """.format(data_type=data_type, name=self.name.lower(), stage=stage + 1)) # Write the entries, nicely aligned in columns. entries = ["{},".format(e) for e in entries] entry_width = max(len(e) for e in entries) entries = [e.rjust(entry_width) for e in entries] for start in range(0, len(entries), COLUMNS): c_file.write(" {}\n".format(" ".join(entries[start : start + COLUMNS]))) c_file.write("};\n") # Write how much storage will be used by all of the tables. c_file.write(""" /* {name}: {bytesize} bytes. */ """.format(name=self.name, bytesize=table.bytesize)) def _pack_to_bitflags(self, entries): entries = tuple(entries) new_entries = [] for start in range(0, len(entries), 8): new_entries.append(bitflag_dict[entries[start : start + 8]]) return new_entries def _generate_locals(self, c_file): c_file.write("""\ RE_UINT32 code; RE_UINT32 f; RE_UINT32 pos; RE_UINT32 value; """) def _generate_lookup(self, c_file): table = self.table name = self.name.lower() # Convert the block sizes into shift values. shifts = [mul_to_shift(size) for size in table.block_sizes] c_file.write("""\ f = ch >> {field_shift}; code = ch ^ (f << {field_shift}); pos = (RE_UINT32)re_{name}_stage_1[f] << {block_shift}; """.format(field_shift=sum(shifts), name=name, block_shift=shifts[0])) for stage in range(1, table.num_stages - 1): c_file.write("""\ f = code >> {field_shift}; code ^= f << {field_shift}; pos = (RE_UINT32)re_{name}_stage_{stage}[pos + f] << {block_shift}; """.format(field_shift=sum(shifts[stage : ]), name=name, stage=stage + 1, block_shift=shifts[stage])) # If it's a binary property, we're using bitflags. if self.binary: c_file.write("""\ pos += code; value = (re_{name}_stage_{stage}[pos >> 3] >> (pos & 0x7)) & 0x1; """.format(name=self.name.lower(), stage=table.num_stages)) else: c_file.write("""\ value = re_{name}_stage_{stage}[pos + code]; """.format(name=self.name.lower(), stage=table.num_stages)) def get(self, name, default=None): try: return self.__getitem__(name) except KeyError: return default def __len__(self): return len(self._value_list) def __getitem__(self, name): # Make it case-insensitive. upper_name = name.upper() val = self._value_dict.get(upper_name) if not val: # Can't find a value with that name, so collect the aliases and try # again. for val in self._value_list: for alias in {val.name} | val.aliases: self._value_dict[alias.upper()] = val val = self._value_dict.get(upper_name) if not val: raise KeyError(name) return val def __iter__(self): for val in self._value_list: yield val def _build_tables(self): "Builds the multi-stage tables." stored_name = reduce_name(self.name) # Do we already know the best block sizes? shelf = shelve.open(shelf_path, writeback=True) if FORCE_RECALC: # Force calculation of the block sizes and build the tables. table = self._build_smallest_table() else: try: # What are the best block sizes? block_sizes = shelf[stored_name]["block_sizes"] # Build the tables. table = self._build_multistage_table(block_sizes) except KeyError: # Something isn't known, so calculate the best block sizes and # build the tables. table = self._build_smallest_table() # Save the info. shelf[stored_name] = {} shelf[stored_name]["block_sizes"] = table.block_sizes shelf.close() self.table = table def _build_smallest_table(self): """Calculates the block sizes to give the smallest storage requirement and builds the multi-stage table. """ print("Determining smallest storage for {}".format(self.name)) # Initialise with a large value. best_block_sizes, smallest_bytesize = None, len(self.entries) * 4 # Try different numbers and sizes of blocks. for block_sizes, bytesize in self._table_sizes(self.entries, 1, self.binary): print("Block sizes are {}, bytesize is {}".format(block_sizes, bytesize)) if bytesize < smallest_bytesize: best_block_sizes, smallest_bytesize = block_sizes, bytesize print("Smallest for {} has block sizes {} and bytesize {}".format(self.name, best_block_sizes, smallest_bytesize)) return self._build_multistage_table(best_block_sizes) def _table_sizes(self, entries, num_stages, binary): """Yields different numbers and sizes of blocks, up to MAX_STAGES. All the sizes are powers of 2 and for a binary property the final block size is at least 8 because the final stage of the table will be using bitflags. """ # What if this is the top stage? if binary: bytesize = len(entries) // 8 else: bytesize = (smallest_bytesize(min(entries), max(entries)) * len(entries)) yield [], bytesize if num_stages >= MAX_STAGES: return entries = tuple(entries) # Initialise the block size and double it on each iteration. Usually an # index entry is 1 byte, so a data block should be at least 2 bytes. size = 16 if binary else 2 # There should be at least 2 blocks. while size * 2 <= len(entries) and len(entries) % size == 0: # Group the entries into blocks. indexes = [] block_dict = {} for start in range(0, len(entries), size): block = entries[start : start + size] indexes.append(block_dict.setdefault(block, len(block_dict))) # Collect all the blocks. blocks = [] for block in sorted(block_dict, key=lambda block: block_dict[block]): blocks.extend(block) # How much storage will the blocks stage need? if binary: block_bytesize = len(blocks) // 8 else: block_bytesize = (smallest_bytesize(min(blocks), max(blocks)) * len(blocks)) # Yield the higher stages for the indexes. for block_sizes, total_bytesize in self._table_sizes(indexes, num_stages + 1, False): yield block_sizes + [size], total_bytesize + block_bytesize # Next size up. size *= 2 def _build_multistage_table(self, block_sizes): "Builds a multi-stage table." if product(block_sizes) > len(self.entries): raise UnicodeDataError("product of block sizes greater than number of entries") # Build the stages from the bottom one up. entries = self.entries stages = [] for block_size in reversed(block_sizes): entries = tuple(entries) # Group the entries into blocks. block_dict = {} indexes = [] for start in range(0, len(entries), block_size): block = entries[start : start + block_size] indexes.append(block_dict.setdefault(block, len(block_dict))) # Collect all the blocks. blocks = [] for block in sorted(block_dict, key=lambda block: block_dict[block]): blocks.extend(block) # We have a new stage. stages.append(blocks) # Prepare for the next higher stage. entries = indexes # We have the top stage. stages.append(entries) # Put the stages into the correct order (top-down). stages.reverse() return MultistageTable(block_sizes, stages, self.binary) class AllCasesProperty(Property): "All Unicode cases." def __init__(self, name, entries, value_dict): self.name = name self.entries = entries self._value_list = [] self._value_dict = {} for name, value in sorted(value_dict.items(), key=lambda pair: pair[1]): val = PropertyValue(name, value) self._value_list.append(val) self._value_dict[name] = val self.binary = False self.aliases = set() # What data type should we use for the cases entries? rows = [list(val.name) for val in self._value_list] data = [e for r in rows for e in r] self.case_data_type = smallest_data_type(min(data), max(data)) def generate_code(self, h_file, c_file, info): "Generates the code for a property." print("Generating code for {}".format(self.name)) # Build the tables. self._build_tables() # Write the all-cases tables. c_file.write(""" /* {name}. */ """.format(name=self.name)) self.generate_tables(c_file) # What data type should we use for the cases entries? rows = [list(val.name) for val in self._value_list] data = [e for r in rows for e in r[1 : ]] data_type, data_size = determine_data_type(min(data), max(data)) self.case_data_type = data_type # Calculate the size of the struct. entry_size = data_size * (info["max_cases"] - 1) # Pad the cases entries to the same length. max_len = max(len(r) for r in rows) padding = [0] * (max_len - 1) rows = [(r + padding)[ : max_len] for r in rows] # Write the entries, nicely aligned in columns. rows = [[str(e) for e in r] for r in rows] entry_widths = [max(len(e) for e in c) for c in zip(*rows)] rows = [[e.rjust(w) for e, w in zip(r, entry_widths)] for r in rows] c_file.write(""" static RE_AllCases re_all_cases_table[] = { """) for r in rows: c_file.write(" {{{}}},\n".format(", ".join(r))) c_file.write("};\n") # Write how much storage will be used by the table. c_file.write(""" /* {name}: {bytesize} bytes. */ """.format(name=self.name, bytesize=entry_size * len(rows))) # Write the lookup function. prototype = "int re_get_{name}(RE_UINT32 ch, RE_UINT32* codepoints)".format(name=self.name.lower()) h_file.write("{prototype};\n".format(prototype=prototype)) c_file.write(""" {prototype} {{ """.format(name=self.name, prototype=prototype)) self._generate_locals(c_file) c_file.write("""\ RE_AllCases* all_cases; int count; """) self._generate_lookup(c_file) c_file.write(""" all_cases = &re_all_cases_table[value]; codepoints[0] = ch; count = 1; while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) { codepoints[count] = ch + all_cases->diffs[count - 1]; ++count; } return count; } """) class SimpleCaseFoldingProperty(Property): "Unicode simple case-folding." def __init__(self, name, entries, value_dict): self.name = name self.entries = entries self._value_list = [] self._value_dict = {} for name, value in sorted(value_dict.items(), key=lambda pair: pair[1]): val = PropertyValue(name, value) self._value_list.append(val) self._value_dict[name] = val self.binary = False self.aliases = set() def generate_code(self, h_file, c_file, info): "Generates the code for a property." print("Generating code for {}".format(self.name)) # Build the tables. self._build_tables() # Write the case-folding tables. c_file.write(""" /* {name}. */ """.format(name=self.name)) self.generate_tables(c_file) # What data type should we use for the case-folding entries? rows = [val.name for val in self._value_list] # Calculate the size of an entry, including alignment. entry_size = 4 # Write the entries, nicely aligned in columns. rows = [str(r) for r in rows] entry_width = max(len(r) for r in rows) rows = [r.rjust(entry_width) for r in rows] c_file.write(""" static RE_INT32 re_simple_case_folding_table[] = { """) for r in rows: c_file.write(" {},\n".format(r)) c_file.write("};\n") # Write how much storage will be used by the table. c_file.write(""" /* {name}: {bytesize} bytes. */ """.format(name=self.name, bytesize=entry_size * len(rows))) # Write the lookup function. prototype = "RE_UINT32 re_get_{name}(RE_UINT32 ch)".format(name=self.name.lower()) h_file.write("{prototype};\n".format(prototype=prototype)) c_file.write(""" {prototype} {{ """.format(name=self.name, prototype=prototype)) self._generate_locals(c_file) c_file.write("""\ RE_INT32 diff; """) self._generate_lookup(c_file) c_file.write(""" diff = re_simple_case_folding_table[value]; return ch + diff; } """) class FullCaseFoldingProperty(Property): "Unicode full case-folding." def __init__(self, name, entries, value_dict): self.name = name self.entries = entries self._value_list = [] self._value_dict = {} for name, value in sorted(value_dict.items(), key=lambda pair: pair[1]): val = PropertyValue(name, value) self._value_list.append(val) self._value_dict[name] = val self.binary = False self.aliases = set() def generate_code(self, h_file, c_file, info): "Generates the code for a property." print("Generating code for {}".format(self.name)) # Build the tables. self._build_tables() # Write the case-folding tables. c_file.write(""" /* {name}. */ """.format(name=self.name)) self.generate_tables(c_file) # What data type should we use for the case-folding entries? rows = [list(val.name) for val in self._value_list] # The diff entry needs to be signed 32-bit, the others should be OK # with unsigned 16-bit. data = [e for r in rows for e in r[1 : ]] # Verify that unsigned 16-bit is OK. data_type = smallest_data_type(min(data), max(data)) if data_type != "RE_UINT16": raise UnicodeDataError("full case-folding table entry too big") # Calculate the size of an entry, including alignment. entry_size = 4 + 2 * (info["max_folded"] - 1) excess = entry_size % 4 if excess > 0: entry_size += 4 - excess # Pad the case-folding entries to the same length and append the count. max_len = max(len(r) for r in rows) padding = [0] * (max_len - 1) rows = [(r + padding)[ : max_len] for r in rows] # Write the entries, nicely aligned in columns. rows = [[str(e) for e in r] for r in rows] entry_widths = [max(len(e) for e in c) for c in zip(*rows)] rows = [[e.rjust(w) for e, w in zip(r, entry_widths)] for r in rows] c_file.write(""" static RE_FullCaseFolding re_full_case_folding_table[] = { """) for r in rows: c_file.write(" {{{}}},\n".format(", ".join(r))) c_file.write("};\n") # Write how much storage will be used by the table. c_file.write(""" /* {name}: {bytesize} bytes. */ """.format(name=self.name, bytesize=entry_size * len(rows))) # Write the lookup function. prototype = "int re_get_{name}(RE_UINT32 ch, RE_UINT32* codepoints)".format(name=self.name.lower()) h_file.write("{prototype};\n".format(prototype=prototype)) c_file.write(""" {prototype} {{ """.format(name=self.name, prototype=prototype)) self._generate_locals(c_file) c_file.write("""\ RE_FullCaseFolding* case_folding; int count; """) self._generate_lookup(c_file) c_file.write(""" case_folding = &re_full_case_folding_table[value]; codepoints[0] = ch + case_folding->diff; count = 1; while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) { codepoints[count] = case_folding->codepoints[count - 1]; ++count; } return count; } """) class CompoundProperty(Property): "A compound Unicode property." def __init__(self, name, function): Property.__init__(self, name, [], {}) self.function = function def generate_code(self, h_file, c_file, info): "Generates the code for a property." print("Generating code for {}".format(self.name)) # Write the lookup function. prototype = "RE_UINT32 re_get_{name}(RE_UINT32 ch)".format(name=self.name.lower()) h_file.write("{prototype};\n".format(prototype=prototype)) c_file.write(""" /* {name}. */ {prototype} {{ {function}}} """.format(name=self.name, prototype=prototype, function=self.function)) class PropertySet: "An ordered set of Unicode properties." def __init__(self): self._property_list = [] self._property_dict = {} def add(self, prop): "Adds a property." # Make it case-insensitive. upper_name = prop.name.upper() if upper_name in self._property_dict: raise KeyError("duplicate property name: {}".format(prop.name)) prop.id = len(self._property_list) self._property_list.append(prop) self._property_dict[upper_name] = prop def use_pref_name(self): """Use a better name for a property or value if the current one is poor. """ for prop in self._property_list: prop.use_pref_name() def get(self, name, default=None): try: return self.__getitem__(name) except KeyError: return default def __len__(self): return len(self._property_list) def __getitem__(self, name): # Make it case-insensitive. upper_name = name.upper() prop = self._property_dict.get(upper_name) if not prop: # Can't find a property with that name, so collect the aliases and # try again. for prop in self._property_list: for alias in {prop.name} | prop.aliases: self._property_dict[alias.upper()] = prop prop = self._property_dict.get(upper_name) if not prop: raise KeyError(name) return prop def __iter__(self): for prop in self._property_list: yield prop def download_unicode_file(url, unicode_folder): "Downloads a Unicode file." name = urlparse(url).path.rsplit("/")[-1] path = os.path.join(unicode_folder, name) # Do we need to download it? if os.path.isfile(path) and not FORCE_UPDATE: return print("Downloading {} to {}".format(url, path)) new_path = os.path.splitext(path)[0] + ".new" try: urlretrieve(url, new_path) except ValueError: # Failed to download, so clean up and report it. try: os.remove(new_path) except OSError: pass raise os.remove(path) os.rename(new_path, path) # Is this a new version of the file? with open(path, encoding="utf-8") as file: # Normally the first line of the file contains its versioned name. line = file.readline() if line.startswith("#") and line.endswith(".txt\n"): versioned_name = line.strip("# \n") versioned_path = os.path.join(unicode_folder, versioned_name) if not os.path.isfile(versioned_path): # We don't have this version, so copy it. shutil.copy2(path, versioned_path) print("Updated to {}".format(versioned_name)) def reduce_name(name): "Reduces a name to uppercase without punctuation, unless it's numeric." r = reduced_names.get(name) if r is None: if all(part.isdigit() for part in name.lstrip("-").split("/", 1)): r = name else: r = name.translate(reduce_trans).upper() reduced_names[name] = r return r def std_name(name): "Standardises the form of a name to its first occurrence" r = reduce_name(name) s = standardised_names.get(r) if s is None: s = name.replace(" ", "_") standardised_names[r] = s return s def parse_property_aliases(unicode_folder, filename): "Parses the PropertyAliases data." print("Parsing '{}'".format(filename)) path = os.path.join(unicode_folder, filename) property_aliases = {} for line in open(path): line = line.partition("#")[0].strip() if line: # Format is: abbrev., pref., other... fields = [std_name(f.strip()) for f in line.split(";")] pref_name = fields.pop(1) aliases = set(fields) for name in {pref_name} | aliases: property_aliases[name] = (pref_name, aliases) return property_aliases def parse_value_aliases(unicode_folder, filename): "Parses the PropertyValueAliases data." print("Parsing '{}'".format(filename)) path = os.path.join(unicode_folder, filename) value_aliases = defaultdict(dict) for line in open(path): line = line.partition("#")[0].strip() if line: # Format is: property, abbrev., pref., other... # except for "ccc": property, numeric, abbrev., pref., other... fields = [std_name(f.strip()) for f in line.split(";")] prop_name = fields.pop(0) if prop_name == "ccc": pref_name = fields.pop(2) else: pref_name = fields.pop(1) aliases = set(fields) # Sometimes there's no abbreviated name, which is indicated by # "n/a". aliases.discard("n/a") prop = value_aliases[prop_name] for name in {pref_name} | aliases: prop[name] = (pref_name, aliases) return value_aliases def check_codepoint_count(entries, codepoint_counts): "Checks that the number of codepoints is correct." counts = defaultdict(int) for e in entries: counts[e] += 1 for name, value, expected in codepoint_counts: if counts[value] != expected: raise UnicodeDataError("codepoint count mismatch: expected {} with '{}' but saw {} [value is {}]".format(expected, name, counts[value], value)) def parse_data_file(filename, properties, numeric_values=False): "Parses a multi-value file." print("Parsing '{}'".format(filename)) path = os.path.join(unicode_folder, filename) # Initialise with the default value. entries = [0] * NUM_CODEPOINTS value_dict = {} aliases = {} prop_name = prop_alias = None default = default_alias = None val_alias = None listed_values = False value_field = 1 codepoint_counts = [] if numeric_values: prop_name = std_name("Numeric_Value") value_field = 3 # Parse the data file. # # There is a certain amount of variation in the file format, which is why # it takes so many lines of code to parse it. for line in open(path): if line.startswith("#"): if line.startswith("# Property:"): # The name of a property. prop_name = std_name(line.rsplit(None, 1)[-1]) prop_alias = None print(" Property '{}'".format(prop_name)) listed_values = True elif line.startswith("# Derived Property:"): # It's a new property. if prop_name: # Should we check the number of codepoints? if COUNT_CODEPOINTS: check_codepoint_count(entries, codepoint_counts) codepoint_counts = [] # Save the current property. if any(entries): prop = Property(prop_name, entries, value_dict) if prop_alias: prop.aliases.add(prop_alias) properties.add(prop) # Reset for the new property. entries = [0] * NUM_CODEPOINTS words = line.split() if words[-1].endswith(")"): # It ends with something in parentheses, possibly more # than one word. while not words[-1].startswith("("): words.pop() prop_name, prop_alias = words[-2], words[-1].strip("()") if prop_alias.lower() in {prop_name.lower(), "deprecated"}: prop_alias = None else: prop_name, prop_alias = words[-1], None prop_name = std_name(prop_name) if prop_alias: prop_alias = std_name(prop_alias) if prop_alias: print(" Property '{}' alias '{}'".format(prop_name, prop_alias)) else: print(" Property '{}'".format(prop_name)) elif line.startswith("# All code points not explicitly listed for "): # The name of a property. new = std_name(line.rsplit(None, 1)[1]) if prop_name: if new != prop_name: raise UnicodeDataError("property mismatch: saw '{}' and then '{}'".format(prop_name, new)) else: prop_name = new prop_alias = None print(" Property '{}'".format(prop_name)) listed_values = True elif line.startswith("# have the value "): # The name of the default value. words = line.rsplit(None, 2) default, default_alias = words[-1].rstrip("."), None if default[ : 1] + default[-1 : ] == "()": # The last word looks line an alias in parentheses. default, default_alias = words[-2], default[1 : -1] if default_alias in {default, "deprecated"}: default_alias = None default = std_name(default) if default_alias: default_alias = std_name(default_alias) value_dict.setdefault(default, 0) if default_alias: print(" Default '{}' alias '{}'".format(default, default_alias)) else: print(" Default '{}'".format(default)) listed_values = True elif line.startswith("# @missing:"): # The name of the default value. new = std_name(line.rsplit(None, 1)[-1]) if default: if new != default: raise UnicodeDataError("default mismatch: saw '{}' and then '{}'".format(default, new)) else: default = new value_dict.setdefault(default, 0) print(" Default '{}' => 0".format(default)) listed_values = True elif line.startswith("# Total code points:"): # The number of codepoints with this value or property. expected = int(line.rsplit(None, 1)[1]) if not listed_values: value = 1 codepoint_counts.append((v, value, expected)) elif prop_name and line.startswith("# {}=".format(prop_name)): # The alias of the value. val_alias = std_name(line.rsplit("=")[-1].strip()) print(" Value '{}'".format(val_alias)) elif ";" in line: # Discard any comment and then split into fields. fields = line.split("#", 1)[0].split(";") code_range = [int(f, 16) for f in fields[0].split("..")] v = std_name(fields[value_field].strip()) if listed_values: # The values of a property. if v in {default, default_alias}: value = 0 else: if not default: if val_alias: default = val_alias print(" Default '{}'".format(default)) else: raise UnicodeDataError("unknown default") value = value_dict.get(v) if value is None: value = value_dict.setdefault(v, len(value_dict)) if val_alias and val_alias != v: aliases[val_alias] = v print(" Value '{}' alias '{}' => {}".format(val_alias, v, value)) val_alias = None else: print(" Value '{}' => {}".format(v, value)) else: # It's a binary property. if v != prop_name: if prop_name: # Should we check the number of codepoints? if COUNT_CODEPOINTS: check_codepoint_count(entries, codepoint_counts) codepoint_counts = [] # Save the current property. prop = Property(prop_name, entries, value_dict) if prop_alias: prop.aliases.add(prop_alias) properties.add(prop) # Reset for the new property. entries = [0] * NUM_CODEPOINTS prop_name = v print(" Property '{}'".format(prop_name)) value = 1 # Store the entries in the range. for code in range(code_range[0], code_range[-1] + 1): entries[code] = value if not prop_name: raise UnicodeDataError("unknown property name") # Should we check the number of codepoints? if COUNT_CODEPOINTS: check_codepoint_count(entries, codepoint_counts) codepoint_counts = [] if "Grapheme" in filename: # In Unicode 6.1, there are no entries in the # "GraphemeBreakProperty.txt" file with the value "Prepend", so we need # to add it here in order not to break the code. value_dict.setdefault(std_name("Prepend"), len(value_dict)) # Save the property. prop = Property(prop_name, entries, value_dict) if prop_alias: prop.aliases.add(prop_alias) if listed_values and default_alias: if default_alias in value_dict: default, default_alias = default_alias, default prop[default].aliases.add(default_alias) for name, alias in aliases.items(): prop[alias].aliases.add(name) properties.add(prop) def parse_NumericValues_file(filename, properties): "Parses the 'NumericValues' file." parse_data_file(filename, properties, numeric_values=True) def parse_CaseFolding(file_name): "Parses the Unicode CaseFolding file." path = os.path.join(unicode_folder, file_name) print("Parsing '{}'".format(file_name)) # Initialise with the default value. simple_folding_entries = [0] * NUM_CODEPOINTS simple_folding_value_dict = {0: 0} full_folding_entries = [0] * NUM_CODEPOINTS full_folding_value_dict = {(0, ): 0} equivalent_dict = defaultdict(set) expand_set = set() turkic_set = set() for line in open(path): if not line.startswith("#") and ";" in line: fields = line.split(";") code = int(fields[0], 16) fold_type = fields[1].strip() folded = [int(f, 16) for f in fields[2].split()] if fold_type in "CFS": # Determine the equivalences. equiv_set = set() for c in [(code, ), tuple(folded)]: equiv_set |= equivalent_dict.get(c, {c}) for c in equiv_set: equivalent_dict[c] = equiv_set entry = [folded[0] - code] + folded[1 : ] if fold_type in "CS": value = simple_folding_value_dict.setdefault(entry[0], len(simple_folding_value_dict)) simple_folding_entries[code] = value if fold_type in "CF": value = full_folding_value_dict.setdefault(tuple(entry), len(full_folding_value_dict)) full_folding_entries[code] = value if len(entry) > 1: expand_set.add(code) if fold_type == "T": # Turkic folded cases. turkic_set.add((code, tuple(folded))) # Is the Turkic set what we expected? if turkic_set != {(0x49, (0x131, )), (0x130, (0x69, ))}: raise UnicodeDataError("Turkic set has changed") # Add the Turkic set to the equivalences. Note that: # # dotted_capital == dotted_small # # and: # # dotted_small == dotless_capital # # but: # # dotted_capital != dotless_capital # for code, folded in turkic_set: char1, char2 = (code, ), folded equivalent_dict[char1] = equivalent_dict[char1] | {char2} equivalent_dict[char2] = equivalent_dict[char2] | {char1} # Sort the equivalent cases. other_cases = [] for code, equiv_set in equivalent_dict.items(): if len(code) == 1: diff_list = [] for e in equiv_set - {code}: if len(e) == 1: diff_list.append(e[0] - code[0]) other_cases.append((code[0], sorted(diff_list))) other_cases.sort() # How many other cases can there be? max_other_cases = max(len(diff_list) for code, diff_list in other_cases) # Initialise with the default value. default_value = [0] * max_other_cases others_entries = [0] * NUM_CODEPOINTS others_value_dict = {tuple(default_value): 0} for code, diff_list in other_cases: entry = tuple(diff_list + default_value)[ : max_other_cases] value = others_value_dict.setdefault(entry, len(others_value_dict)) others_entries[code] = value # Save the all-cases property. all_prop = AllCasesProperty(std_name("All_Cases"), others_entries, others_value_dict) # Save the simple case-folding property. simple_folding_prop = SimpleCaseFoldingProperty(std_name("Simple_Case_Folding"), simple_folding_entries, simple_folding_value_dict) # Save the full case-folding property. full_folding_prop = FullCaseFoldingProperty(std_name("Full_Case_Folding"), full_folding_entries, full_folding_value_dict) info = dict(all_cases=all_prop, simple_case_folding=simple_folding_prop, full_case_folding=full_folding_prop, expand_set=expand_set) return info def define_Alphanumeric_property(properties): "Defines the Alphanumeric property." prop_name = std_name("Alphanumeric") print("Defining '{}'".format(prop_name)) function = """\ RE_UINT32 v; v = re_get_alphabetic(ch); if (v == 1) return 1; v = re_get_general_category(ch); if (v == RE_PROP_ND) return 1; return 0; """ properties.add(CompoundProperty(prop_name, function)) def define_Any_property(properties): "Defines the Any property." prop_name = std_name("Any") print("Defining '{}'".format(prop_name)) function = """\ return 1; """ properties.add(CompoundProperty(prop_name, function)) def define_Assigned_property(properties): "Defines the Assigned property." prop_name = std_name("Assigned") print("Defining '{}'".format(prop_name)) function = """\ if (re_get_general_category(ch) != RE_PROP_CN) return 1; return 0; """ properties.add(CompoundProperty(prop_name, function)) def define_Blank_property(properties): "Defines the Blank property." prop_name = std_name("Blank") print("Defining '{}'".format(prop_name)) function = """\ RE_UINT32 v; if (0x0A <= ch && ch <= 0x0D || ch == 0x85) return 0; v = re_get_white_space(ch); if (v == 0) return 0; v = re_get_general_category(ch); if ((RE_BLANK_MASK & (1 << v)) != 0) return 0; return 1; """ properties.add(CompoundProperty(prop_name, function)) def define_Graph_property(properties): "Defines the Graph property." prop_name = std_name("Graph") print("Defining '{}'".format(prop_name)) function = """\ RE_UINT32 v; v = re_get_white_space(ch); if (v == 1) return 0; v = re_get_general_category(ch); if ((RE_GRAPH_MASK & (1 << v)) != 0) return 0; return 1; """ properties.add(CompoundProperty(prop_name, function)) def define_Print_property(properties): "Defines the Print property." prop_name = std_name("Print") print("Defining '{}'".format(prop_name)) function = """\ RE_UINT32 v; v = re_get_general_category(ch); if (v == RE_PROP_CC) return 0; v = re_get_graph(ch); if (v == 1) return 1; v = re_get_blank(ch); if (v == 1) return 1; return 0; """ properties.add(CompoundProperty(prop_name, function)) def define_Word_property(properties): "Defines the Word property." prop_name = std_name("Word") print("Defining '{}'".format(prop_name)) function = """\ RE_UINT32 v; v = re_get_alphabetic(ch); if (v == 1) return 1; v = re_get_general_category(ch); if ((RE_WORD_MASK & (1 << v)) != 0) return 1; return 0; """ properties.add(CompoundProperty(prop_name, function)) def first_true(iterable): "Returns the first item which is true." for i in iterable: if i: return i return None def pick_pref_name(name, aliases): "Picks a better name if the current one is poor." if name.isupper() or name.isdigit(): aliases = aliases | {name} better_name = max(aliases, key=lambda name: len(name)) name = better_name aliases.remove(better_name) return name, aliases def write_properties_description(properties, properties_path): "Writes a list of the properties which are supported by this module." with open(properties_path, "w", encoding="utf-8", newline="\n") as p_file: p_file.write("The following is a list of the {} properties which are supported by this module:\n".format(len(properties))) sorted_properties = sorted(properties, key=lambda prop: prop.name) for prop in sorted_properties: p_file.write("\n") name = prop.name aliases = sorted(prop.aliases) if aliases: p_file.write("{} [{}]\n".format(name, ", ".join(aliases))) else: p_file.write("{}\n".format(name)) sorted_values = sorted(prop, key=lambda val: val.name) for val in sorted_values: name = val.name aliases = sorted(val.aliases) if aliases: p_file.write(" {} [{}]\n".format(name, ", ".join(aliases))) else: p_file.write(" {}\n".format(name)) def tabulate(rows): "Creates a table with right-justified columns." # Convert all the entries to strings. rows = [[str(e) for e in row] for row in rows] # Determine the widths of the columns. widths = [max(len(e) for e in column) for column in zip(*rows)] # Pad all the entries. rows = [[e.rjust(w) for e, w in zip(row, widths)] for row in rows] return rows def parse_unicode_data(): "Parses the Unicode data." # Parse the aliases. property_aliases = parse_property_aliases(unicode_folder, "PropertyAliases.txt") value_aliases = parse_value_aliases(unicode_folder, "PropertyValueAliases.txt") # The set of properties. properties = PropertySet() # The parsers for the various file formats. parsers = {"": parse_data_file, "NumericValues": parse_NumericValues_file} # Parse the property data files. for line in unicode_info.splitlines(): if line and line[0] != "#": url, sep, file_format = line.partition(":") if file_format != "~": filename = url.rpartition("/")[-1] parsers[file_format](filename, properties) # Parse the case-folding data specially. info = parse_CaseFolding("CaseFolding.txt") max_cases = max(len(val.name) for val in info["all_cases"]) + 1 max_folded = max(len(val.name) for val in info["full_case_folding"]) # Define some additional properties. define_Alphanumeric_property(properties) define_Any_property(properties) define_Assigned_property(properties) define_Blank_property(properties) define_Graph_property(properties) define_Print_property(properties) define_Word_property(properties) # The additional General_Category properties. gc_prop = properties["General_Category"] gc_short = {} gc_masks = defaultdict(int) for val in gc_prop: short_name = [a.upper() for a in {val.name} | val.aliases if len(a) == 2][0] gc_short[short_name] = val.id gc_masks[short_name[0]] |= 1 << val.id last_id = max(val.id for val in gc_prop) for name in sorted(gc_masks): last_id += 1 val = PropertyValue(name, last_id) val.aliases.add(name + "&") gc_prop.add(val) # Add the value aliases for the binary properties. print("Checking binary properties") for prop in properties: if len(prop) == 0: prop.make_binary_property() # Add the property and value aliases. print("Adding aliases") for prop in properties: try: pref_name, aliases = property_aliases[prop.name] prop_aliases = {prop.name, pref_name} | aliases prop.aliases |= prop_aliases - {prop.name} val_aliases = first_true(value_aliases.get(a) for a in prop_aliases) if val_aliases: for i, val in enumerate(prop): try: pref_name, aliases = val_aliases[val.name] aliases = {val.name, pref_name} | aliases val.aliases |= aliases - {val.name} except KeyError: pass except KeyError: pass # Additional aliases. prop = properties["Alphanumeric"] prop.aliases.add(std_name("AlNum")) prop = properties["Hex_Digit"] prop.aliases.add(std_name("XDigit")) # Ensure that all the properties and values use the preferred name. properties.use_pref_name() info.update(dict(properties=properties, max_cases=max_cases, max_folded=max_folded, gc_short=gc_short, gc_masks=gc_masks)) return info def generate_code(strings): "Generates the C files." h_file = open(h_path, "w", encoding="utf-8", newline="\n") c_file = open(c_path, "w", encoding="utf-8", newline="\n") # Useful definitions. h_file.write("""\ typedef unsigned char RE_UINT8; typedef signed char RE_INT8; typedef unsigned short RE_UINT16; typedef signed short RE_INT16; typedef unsigned int RE_UINT32; typedef signed int RE_INT32; typedef unsigned char BOOL; enum {{FALSE, TRUE}}; #define RE_ASCII_MAX 0x7F #define RE_LOCALE_MAX 0xFF #define RE_UNICODE_MAX 0x10FFFF #define RE_MAX_CASES {max_cases} #define RE_MAX_FOLDED {max_folded} typedef struct RE_Property {{ RE_UINT16 name; RE_UINT8 id; RE_UINT8 value_set; }} RE_Property; typedef struct RE_PropertyValue {{ RE_UINT16 name; RE_UINT8 value_set; RE_UINT8 id; }} RE_PropertyValue; typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); """.format(max_cases=info["max_cases"], max_folded=info["max_folded"])) for prop in ("GC", "Cased", "Uppercase", "Lowercase"): h_file.write("#define RE_PROP_{} 0x{:X}\n".format(prop.upper(), properties[prop].id)) h_file.write("\n") RE_Property_size = 4 RE_PropertyValue_size = 4 # Define the property types. last_val_id = max(info["gc_short"].values()) for val_id, name in enumerate(sorted(info["gc_masks"]), start=last_val_id + 1): h_file.write("#define RE_PROP_{} {}\n".format(name, val_id)) h_file.write("\n") # Write the General_Category properties. for name, val_id in sorted(info["gc_short"].items(), key=lambda pair: pair[1]): h_file.write("#define RE_PROP_{} {}\n".format(name, val_id)) h_file.write("\n") # Define a property masks. for name, mask in sorted(info["gc_masks"].items()): h_file.write("#define RE_PROP_{}_MASK 0x{:08X}\n".format(name, mask)) h_file.write("\n") # The common abbreviated properties. common_props = """ AlNum Alpha Any Assigned Blank Cntrl Digit Graph Lower Print Punct Space Upper Word XDigit """.split() for name in common_props: prop = properties.get(name) if prop is not None: h_file.write("#define RE_PROP_{} 0x{:06X}\n".format(name.upper(), prop.id << 16 | 1)) else: prop = properties["GC"] val = prop.get(name) if val is not None: h_file.write("#define RE_PROP_{} 0x{:06X}\n".format(name.upper(), prop.id << 16 | val.id)) else: raise UnicodeDataError("unknown abbreviated property: '{}'".format(name)) prop = properties["Block"] h_file.write("#define RE_PROP_ASCII 0x{:06X}\n".format((prop.id << 16) | prop["ASCII"].id)) h_file.write("\n") # Define the word-break values. for val in properties["Word_Break"]: name = reduce_name(val.name) h_file.write("#define RE_BREAK_{} {}\n".format(name, val.id)) h_file.write("\n") # Define the grapheme cluster-break values. for val in properties["Grapheme_Cluster_Break"]: name = reduce_name(val.name) h_file.write("#define RE_GBREAK_{} {}\n".format(name, val.id)) c_file.write('#include "_regex_unicode.h"\n') # Write the standardised strings. c_file.write(""" #define RE_BLANK_MASK ((1 << RE_PROP_ZL) | (1 << RE_PROP_ZP)) #define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN)) #define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC)) typedef struct RE_AllCases {{ {data_type} diffs[RE_MAX_CASES - 1]; }} RE_AllCases; typedef struct RE_FullCaseFolding {{ RE_INT32 diff; RE_UINT16 codepoints[RE_MAX_FOLDED - 1]; }} RE_FullCaseFolding; /* strings. */ char* re_strings[] = {{ """.format(data_type=info["all_cases"].case_data_type)) # Calculate the number and size of the string constants. bytesize = 0 for s in strings: s = reduce_name(s) c_file.write(" \"{}\",\n".format(s)) bytesize += len(s) + 1 h_file.write("\nextern char* re_strings[{}];\n".format(len(strings))) c_file.write("""}}; /* strings: {bytesize} bytes. */ """.format(bytesize=bytesize)) # Write the property name tables. # # Properties which are aliases have the same property id, and properties, # such as binary properties, which have the same set of values have the # same value set id. # The rows of the property and value tables. property_rows = [] value_rows = [] # The value sets. value_sets = {} # Give an id to each distinct property or value name. strings = {s: i for i, s in enumerate(strings)} for prop in properties: val_set = tuple(val.name for val in prop) new_val_set = val_set not in value_sets val_set_id = value_sets.setdefault(val_set, len(value_sets)) # name of property, id of property, id of value set property_rows.append((strings[prop.name], prop.id, val_set_id)) for alias in prop.aliases: property_rows.append((strings[alias], prop.id, val_set_id)) # We don't want to duplicate value sets. if new_val_set: for val in prop: # name of value, id of value set, value value_rows.append((strings[val.name], val_set_id, val.id)) for alias in val.aliases: value_rows.append((strings[alias], val_set_id, val.id)) # Fix the column widths of the tables. property_rows = tabulate(property_rows) value_rows = tabulate(value_rows) expand_set = info["expand_set"] expand_data_type, expand_data_size = determine_data_type(min(expand_set), max(expand_set)) # write the property tables and the corresponding lookup functions. c_file.write(""" /* properties. */ RE_Property re_properties[] = { """) h_file.write("""\ extern RE_Property re_properties[{prop_rows}]; extern RE_PropertyValue re_property_values[{val_rows}]; extern {data_type} re_expand_on_folding[{expand_rows}]; extern RE_GetPropertyFunc re_get_property[{func_count}]; """.format(prop_rows=len(property_rows), val_rows=len(value_rows), data_type=expand_data_type, expand_rows=len(expand_set), func_count=len(properties))) for row in property_rows: c_file.write(" {{{}}},\n".format(", ".join(row))) c_file.write("""\ }}; /* properties: {bytesize} bytes. */ /* property values. */ RE_PropertyValue re_property_values[] = {{ """.format(bytesize=RE_Property_size * len(property_rows))) for row in value_rows: c_file.write(" {{{}}},\n".format(", ".join(row))) c_file.write("""\ }}; /* property values: {bytesize} bytes. */ /* Codepoints which expand on full case-folding. */ {data_type} re_expand_on_folding[] = {{ """.format(bytesize=RE_PropertyValue_size * len(value_rows), data_type=expand_data_type)) items = ["{},".format(c) for c in sorted(expand_set)] width = max(len(i) for i in items) items = [i.rjust(width) for i in items] columns = 8 for start in range(0, len(items), columns): c_file.write(" {}\n".format(" ".join(items[start : start + columns]))) c_file.write("""}}; /* expand_on_folding: {bytesize} bytes. */ """.format(bytesize=len(items) * expand_data_size)) # Build and write the property data tables. for property in properties: property.generate_code(h_file, c_file, info) info["all_cases"].generate_code(h_file, c_file, info) info["simple_case_folding"].generate_code(h_file, c_file, info) info["full_case_folding"].generate_code(h_file, c_file, info) # Write the property function array. c_file.write(""" /* Property function table. */ RE_GetPropertyFunc re_get_property[] = { """) for prop in properties: c_file.write(" re_get_{},\n".format(prop.name.lower())) c_file.write("};\n") h_file.close() c_file.close() # Build a dict for converting 8-tuples into bytes. bitflag_dict = {} for value in range(0x100): bits = [] for pos in range(8): bits.append((value >> pos) & 0x1) bitflag_dict[tuple(bits)] = value # Storage and support for reduced names. # # A reduced name is a name converted to uppercase and with its punctuation # removed. reduced_names = {} reduce_trans = str.maketrans({" ": "", "_": "","-": ""}) # The names, converted to a standardised form. standardised_names = {} # The Unicode data files. unicode_data_base = "http://www.unicode.org/Public/UNIDATA/" unicode_info = """ auxiliary/GraphemeBreakProperty.txt auxiliary/SentenceBreakProperty.txt auxiliary/WordBreakProperty.txt Blocks.txt CaseFolding.txt:~ DerivedCoreProperties.txt extracted/DerivedBidiClass.txt extracted/DerivedBinaryProperties.txt extracted/DerivedCombiningClass.txt extracted/DerivedDecompositionType.txt extracted/DerivedEastAsianWidth.txt extracted/DerivedGeneralCategory.txt extracted/DerivedJoiningGroup.txt extracted/DerivedJoiningType.txt extracted/DerivedLineBreak.txt extracted/DerivedNumericType.txt extracted/DerivedNumericValues.txt:NumericValues HangulSyllableType.txt IndicMatraCategory.txt IndicSyllabicCategory.txt PropertyAliases.txt:~ PropertyValueAliases.txt:~ PropList.txt Scripts.txt #UnicodeData.txt """ # Download the Unicode data files. for line in unicode_info.splitlines(): if line and line[0] != "#": url = line.partition(":")[0] download_unicode_file(urljoin(unicode_data_base, url), unicode_folder) # Parse the Unicode data. info = parse_unicode_data() properties = info["properties"] write_properties_description(properties, properties_path) if len(properties) > 0x100: raise UnicodeDataError("more than 256 properties") for prop in properties: if len(prop) > 0x100: raise UnicodeDataError("more than 256 values: property '{}'".format(prop.name)) # Create the list of standardised strings. strings = set() for prop in properties: strings.add(prop.name) strings |= prop.aliases for val in prop: strings.add(val.name) strings |= val.aliases strings = sorted(set(strings), key=reduce_name) # Generate the code. generate_code(strings) print("\nThere are {} properties".format(len(properties))) import re code = open(c_path).read() sizes = defaultdict(int) for n, s in re.findall(r"(\w+(?: \w+)*): (\d+) bytes", code): sizes[n] += int(s) sizes = sorted(sizes.items(), key=lambda pair: pair[1], reverse=True) total_size = sum(s for n, s in sizes) print("\nTotal: {} bytes\n".format(total_size)) prop_width = max(len(row[0]) for row in sizes) prop_width = max(prop_width, 8) storage_width = max(len(str(row[1])) for row in sizes) storage_width = max(storage_width, 7) print("{:{}} {:{}} {}".format("Property", prop_width, "Storage", storage_width, "Percentage")) print("{:{}} {:{}} {}".format("--------", prop_width, "-------", storage_width, "----------")) format = "{{:<{}}} {{:>{}}} {{:>5.1%}}".format(prop_width, storage_width) for n, s in sizes: print(format.format(n, s, s / total_size)) print("\nFinished!")