Skip to content

Commit a65f03e

Browse files
authored
Arregla y wrapea library/re.po (#2873)
En `library/re.po` había una entrada que no estaba delineada correctamente con comillas dobles (si ven el diff entero es la última entrada en el diff, o pueden ver simplemente el primer commit de este PR). Esto hacía que `powrap --check` se saltara el archivo y no lo validara. Esto, a su vez, ocurría porque la utilidad `msgcat` de `gettext` identificaba el error de sintaxis, y fallaba al ser ejecutada. `powrap` no consideraba esos errores al momento de calcular el exit code del proceso, y por lo tanto el archivo no sólo seguía siendo inválido, sino que tampoco era verificado. De igual forma, el archivo no podía ser wrapeado correctamente usando `powrap library/re.po`. Ya abrí un PR contra `powrap` para cambiar este comportamiento en https://git.afpy.org/AFPy/powrap/pulls/4 (actualización: el PR ya fue mergeado, y una nuevs versión de powrap fue publicada, pornlo que también actualicé en este PR nuestra dependencia de powrap, además del pre-commit hook de powrap). Por otro lado, el resto de nuestras herramientas *no* consideraban este archivo como inválido, Esto es porque `polib` no hacía la validación correspondiente, e incorrectamente parseaba la entrada. También abrí un PR contra polib para esto en izimobil/polib#161. Actualización: en el intertanto también me di cuenta de que el paquete `babel` sufre del mismo problema, yo incorrectamente había asumido que babel dependía de polib; PR creada contra babel: python-babel/babel#1151. Después de corregir el error de sintaxis, ejecuté powrap de tal manera que ahora `library/re.po` está bien formateado. --------- Signed-off-by: Rodrigo Tobar <rtobar@icrar.org>
1 parent 875e5df commit a65f03e

File tree

4 files changed

+87
-80
lines changed

4 files changed

+87
-80
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ jobs:
7777
diff -Naur TRANSLATORS <(LANG=es python scripts/sort.py < TRANSLATORS)
7878
- name: Powrap
7979
if: steps.po-files-to-check.outputs.any_po_files_to_check == 'true'
80-
run: powrap --check --quiet ${{ steps.po-files-to-check.outputs.po_files_to_check }}
80+
run: powrap --diff --check --quiet ${{ steps.po-files-to-check.outputs.po_files_to_check }}
8181
- name: Sphinx lint
8282
if: steps.po-files-to-check.outputs.any_po_files_to_check == 'true'
8383
run: sphinx-lint ${{ steps.po-files-to-check.outputs.po_files_to_check }}

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
2-
- repo: https://github.com/JulienPalard/powrap
3-
rev: v0.4.0
2+
- repo: https://git.afpy.org/AFPy/powrap
3+
rev: v1.0.2
44
hooks:
55
- id: powrap
66
- repo: local

library/re.po

Lines changed: 83 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,10 @@ msgid ""
208208
"For example, the expression ``(?:a{6})*`` matches any multiple of six "
209209
"``'a'`` characters."
210210
msgstr ""
211-
"Los operadores de repetición o cuantificadores (``*``, ``+``, ``?``, ``{m,n}``, etc.) "
212-
"no pueden ser anidados directamente. Esto evita la ambigüedad con el sufijo "
213-
"modificador no codicioso ``?``, y con otros modificadores en "
214-
"otras implementaciones. Para aplicar una segunda repetición a una repetición "
211+
"Los operadores de repetición o cuantificadores (``*``, ``+``, ``?``, ``{m,n}"
212+
"``, etc.) no pueden ser anidados directamente. Esto evita la ambigüedad con "
213+
"el sufijo modificador no codicioso ``?``, y con otros modificadores en otras "
214+
"implementaciones. Para aplicar una segunda repetición a una repetición "
215215
"interna, se pueden usar paréntesis. Por ejemplo, la expresión ``(?:a{6})*`` "
216216
"coincide con cualquier múltiplo de seis caracteres ``'a'``."
217217

@@ -358,14 +358,14 @@ msgstr ""
358358
"permiten retroceder cuando la expresión que le sigue no coincide. Estos se "
359359
"conocen como cuantificadores :dfn:`possessive`. Por ejemplo, ``a*a`` "
360360
"coincidirá con ``'aaaa'`` porque la ``a*`` coincidirá con los 4 ``'a'``\\ s, "
361-
"pero, cuando se encuentra la ``'a'`` final, la expresión retrocede de "
362-
"modo que al final la ``a*`` termina coincidiendo con 3 ``'a'``\\ s total, y "
363-
"la cuarta ``'a'`` coincide con la final ``'a'``. Sin embargo, cuando "
364-
"``a*+a`` se usa para que coincida con ``'aaaa'``, el ``a*+`` coincidirá con "
365-
"los 4 ``'a'``, pero cuando el ``'a'`` final no encuentra más caracteres para "
366-
"coincidir, la expresión no puede retroceder y, por lo tanto, no "
367-
"coincidirá. ``x*+``, ``x++`` and ``x?+`` son equivalentes a ``(?>x*)``, ``(?"
368-
">x+)`` and ``(?>x?)`` correspondientemente."
361+
"pero, cuando se encuentra la ``'a'`` final, la expresión retrocede de modo "
362+
"que al final la ``a*`` termina coincidiendo con 3 ``'a'``\\ s total, y la "
363+
"cuarta ``'a'`` coincide con la final ``'a'``. Sin embargo, cuando ``a*+a`` "
364+
"se usa para que coincida con ``'aaaa'``, el ``a*+`` coincidirá con los 4 "
365+
"``'a'``, pero cuando el ``'a'`` final no encuentra más caracteres para "
366+
"coincidir, la expresión no puede retroceder y, por lo tanto, no coincidirá. "
367+
"``x*+``, ``x++`` and ``x?+`` son equivalentes a ``(?>x*)``, ``(?>x+)`` and "
368+
"``(?>x?)`` correspondientemente."
369369

370370
#: ../Doc/library/re.rst:187
371371
msgid "``{m}``"
@@ -782,12 +782,12 @@ msgstr ""
782782
"separada, y si tiene éxito, continúa coincidiendo con el resto del patrón "
783783
"que la sigue. Si el patrón posterior no coincide, la pila solo se puede "
784784
"desenrollar a un punto *antes* del ``(?>...)`` Porque una vez que salió, la "
785-
"expresión, conocida como :dfn:`grupo atomico <atomic group>`, ha desechado todos los puntos de pila "
786-
"dentro de sí misma. Por lo tanto, ``(?>.*).`` nunca coincidiría con nada "
787-
"porque primero el ``.*`` coincidiría con todos los caracteres posibles, "
788-
"luego, al no tener nada que igualar, el ``.`` final no coincidiría. Dado que "
789-
"no hay puntos de pila guardados en el Grupo Atómico, y no hay ningún punto "
790-
"de pila antes de él, toda la expresión no coincidiría."
785+
"expresión, conocida como :dfn:`grupo atomico <atomic group>`, ha desechado "
786+
"todos los puntos de pila dentro de sí misma. Por lo tanto, ``(?>.*).`` nunca "
787+
"coincidiría con nada porque primero el ``.*`` coincidiría con todos los "
788+
"caracteres posibles, luego, al no tener nada que igualar, el ``.`` final no "
789+
"coincidiría. Dado que no hay puntos de pila guardados en el Grupo Atómico, y "
790+
"no hay ningún punto de pila antes de él, toda la expresión no coincidiría."
791791

792792
#: ../Doc/library/re.rst:424
793793
msgid "``(?P<name>...)``"
@@ -869,8 +869,8 @@ msgid ""
869869
"In :class:`bytes` patterns, group *name* can only contain bytes in the ASCII "
870870
"range (``b'\\x00'``-``b'\\x7f'``)."
871871
msgstr ""
872-
"En patrones de tipo :class:`bytes`, el nombre del grupo *name* solo puede contener "
873-
"bytes en el rango ASCII (``b'\\x00'``-``b'\\x7f'``)."
872+
"En patrones de tipo :class:`bytes`, el nombre del grupo *name* solo puede "
873+
"contener bytes en el rango ASCII (``b'\\x00'``-``b'\\x7f'``)."
874874

875875
#: ../Doc/library/re.rst:430
876876
msgid "``(?P=name)``"
@@ -1006,9 +1006,9 @@ msgid ""
10061006
"Group *id* can only contain ASCII digits. In :class:`bytes` patterns, group "
10071007
"*name* can only contain bytes in the ASCII range (``b'\\x00'``-``b'\\x7f'``)."
10081008
msgstr ""
1009-
"El *id* del grupo solo puede contener dígitos ASCII. En patrones de "
1010-
"tipo :class:`bytes`, el *name* del grupo solo puede contener bytes "
1011-
"en el rango ASCII (``b'\\x00'``-``b'\\x7f'``)."
1009+
"El *id* del grupo solo puede contener dígitos ASCII. En patrones de tipo :"
1010+
"class:`bytes`, el *name* del grupo solo puede contener bytes en el rango "
1011+
"ASCII (``b'\\x00'``-``b'\\x7f'``)."
10121012

10131013
#: ../Doc/library/re.rst:506
10141014
msgid ""
@@ -1208,8 +1208,9 @@ msgid ""
12081208
"const:`ASCII` flag is used, only ``[a-zA-Z0-9_]`` is matched."
12091209
msgstr ""
12101210
"Coincide con los caracteres de palabras Unicode; esto incluye los caracteres "
1211-
"alfanuméricos (como se define por :meth:`str.isalnum`) así como el guión bajo "
1212-
"(``_``). Si se utiliza la bandera :const:`ASCII`, sólo coincide con ``[a-zA-Z0-9_]``."
1211+
"alfanuméricos (como se define por :meth:`str.isalnum`) así como el guión "
1212+
"bajo (``_``). Si se utiliza la bandera :const:`ASCII`, sólo coincide con "
1213+
"``[a-zA-Z0-9_]``."
12131214

12141215
#: ../Doc/library/re.rst:604
12151216
msgid ""
@@ -1254,8 +1255,8 @@ msgid ""
12541255
"string literals are also accepted by the regular expression parser::"
12551256
msgstr ""
12561257
"La mayoría de las :ref:`secuencias de escape <escape-sequences>` soportadas "
1257-
"por los literales de cadena de Python también son aceptadas por el analizador "
1258-
"de expresiones regulares::"
1258+
"por los literales de cadena de Python también son aceptadas por el "
1259+
"analizador de expresiones regulares::"
12591260

12601261
#: ../Doc/library/re.rst:644
12611262
msgid ""
@@ -1482,9 +1483,9 @@ msgid ""
14821483
msgstr ""
14831484
"Indica que no se aplica ninguna bandera, el valor es ``0``. Esta bandera "
14841485
"puede ser utilizada como valor predeterminado para un argumento de palabra "
1485-
"clave de función o como un valor que será condicionalmente combinado "
1486-
"con otras banderas usando el operador binario OR. Ejemplo de uso como "
1487-
"valor predeterminado::"
1486+
"clave de función o como un valor que será condicionalmente combinado con "
1487+
"otras banderas usando el operador binario OR. Ejemplo de uso como valor "
1488+
"predeterminado::"
14881489

14891490
#: ../Doc/library/re.rst:779
14901491
msgid ""
@@ -1503,13 +1504,15 @@ msgid ""
15031504
"include Unicode characters in matches. Since Python 3, Unicode characters "
15041505
"are matched by default."
15051506
msgstr ""
1506-
"En Python 2, esta bandera hacía que :ref:`secuencias especiales <re-special-sequences>` "
1507-
"incluyeran caracteres Unicode en las coincidencias. Desde Python 3, los caracteres "
1508-
"Unicode se coinciden por defecto."
1507+
"En Python 2, esta bandera hacía que :ref:`secuencias especiales <re-special-"
1508+
"sequences>` incluyeran caracteres Unicode en las coincidencias. Desde Python "
1509+
"3, los caracteres Unicode se coinciden por defecto."
15091510

15101511
#: ../Doc/library/re.rst:791
15111512
msgid "See :const:`A` for restricting matching on ASCII characters instead."
1512-
msgstr "Ver :const:`A` para restringir la coincidencia a caracteres ASCII en su lugar."
1513+
msgstr ""
1514+
"Ver :const:`A` para restringir la coincidencia a caracteres ASCII en su "
1515+
"lugar."
15131516

15141517
#: ../Doc/library/re.rst:793
15151518
msgid "This flag is only kept for backward compatibility."
@@ -1613,9 +1616,9 @@ msgid ""
16131616
"pattern; note that this is different from finding a zero-length match at "
16141617
"some point in the string."
16151618
msgstr ""
1616-
"Explora la cadena de caracteres *string* en busca de la primera ubicación donde el "
1617-
"patrón *pattern* de la expresión regular produce una coincidencia, y "
1618-
"retorna un :class:`~re.Match` correspondiente. Retorna ``None`` si ninguna "
1619+
"Explora la cadena de caracteres *string* en busca de la primera ubicación "
1620+
"donde el patrón *pattern* de la expresión regular produce una coincidencia, "
1621+
"y retorna un :class:`~re.Match` correspondiente. Retorna ``None`` si ninguna "
16191622
"posición en la cadena coincide con el patrón; nota que esto es diferente a "
16201623
"encontrar una coincidencia de longitud cero en algún punto de la cadena."
16211624

@@ -1626,8 +1629,8 @@ msgid ""
16261629
"``None`` if the string does not match the pattern; note that this is "
16271630
"different from a zero-length match."
16281631
msgstr ""
1629-
"Si cero o más caracteres al principio de la cadena *string* coinciden con "
1630-
"el patrón *pattern* de la expresión regular, retorna un :class:`~re.Match` "
1632+
"Si cero o más caracteres al principio de la cadena *string* coinciden con el "
1633+
"patrón *pattern* de la expresión regular, retorna un :class:`~re.Match` "
16311634
"correspondiente. Retorna ``None`` si la cadena no coincide con el patrón; "
16321635
"notar que esto es diferente de una coincidencia de longitud cero."
16331636

@@ -1654,10 +1657,10 @@ msgid ""
16541657
"corresponding :class:`~re.Match`. Return ``None`` if the string does not "
16551658
"match the pattern; note that this is different from a zero-length match."
16561659
msgstr ""
1657-
"Si toda la cadena *string* coincide con el patrón *pattern* de la "
1658-
"expresión regular, retorna un :class:`~re.Match` correspondiente. Retorna "
1659-
"``None`` si la cadena no coincide con el patrón; notar que esto es diferente "
1660-
"de una coincidencia de longitud cero."
1660+
"Si toda la cadena *string* coincide con el patrón *pattern* de la expresión "
1661+
"regular, retorna un :class:`~re.Match` correspondiente. Retorna ``None`` si "
1662+
"la cadena no coincide con el patrón; notar que esto es diferente de una "
1663+
"coincidencia de longitud cero."
16611664

16621665
#: ../Doc/library/re.rst:889
16631666
msgid ""
@@ -1752,10 +1755,10 @@ msgid ""
17521755
"scanned left-to-right, and matches are returned in the order found. Empty "
17531756
"matches are included in the result."
17541757
msgstr ""
1755-
"Retorna un :term:`iterador <iterator>` que produce objetos :class:`~re.Match` sobre "
1756-
"todas las coincidencias no superpuestas para el patrón de RE *pattern* en la "
1757-
"*string*. La *string* es examinada de izquierda a derecha, y las "
1758-
"coincidencias son retornadas en el orden en que se encuentran. Las "
1758+
"Retorna un :term:`iterador <iterator>` que produce objetos :class:`~re."
1759+
"Match` sobre todas las coincidencias no superpuestas para el patrón de RE "
1760+
"*pattern* en la *string*. La *string* es examinada de izquierda a derecha, y "
1761+
"las coincidencias son retornadas en el orden en que se encuentran. Las "
17591762
"coincidencias vacías se incluyen en el resultado."
17601763

17611764
#: ../Doc/library/re.rst:966
@@ -1869,9 +1872,9 @@ msgid ""
18691872
"strings, group *name* can only contain bytes in the ASCII range "
18701873
"(``b'\\x00'``-``b'\\x7f'``)."
18711874
msgstr ""
1872-
"El *id* del grupo solo puede contener dígitos ASCII. En las cadenas de reemplazo "
1873-
":class:`bytes`, el nombre del grupo *name* solo puede contener bytes en el rango ASCII "
1874-
"(``b'\\x00'``-``b'\\x7f'``)."
1875+
"El *id* del grupo solo puede contener dígitos ASCII. En las cadenas de "
1876+
"reemplazo :class:`bytes`, el nombre del grupo *name* solo puede contener "
1877+
"bytes en el rango ASCII (``b'\\x00'``-``b'\\x7f'``)."
18751878

18761879
#: ../Doc/library/re.rst:1041
18771880
msgid ""
@@ -1977,8 +1980,8 @@ msgid ""
19771980
":py:class:`re.Pattern` supports ``[]`` to indicate a Unicode (str) or bytes "
19781981
"pattern. See :ref:`types-genericalias`."
19791982
msgstr ""
1980-
":py:class:`re.Pattern` soporta ``[]`` para indicar un patrón Unicode (str) o de bytes. "
1981-
"Ver :ref:`types-genericalias`."
1983+
":py:class:`re.Pattern` soporta ``[]`` para indicar un patrón Unicode (str) o "
1984+
"de bytes. Ver :ref:`types-genericalias`."
19821985

19831986
#: ../Doc/library/re.rst:1140
19841987
msgid ""
@@ -1988,10 +1991,10 @@ msgid ""
19881991
"this is different from finding a zero-length match at some point in the "
19891992
"string."
19901993
msgstr ""
1991-
"Escanea a través de la cadena *string* buscando la primera ubicación "
1992-
"donde esta expresión regular produce una coincidencia, y retorna un :class:"
1993-
"`~re.Match` correspondiente. Retorna ``None`` si ninguna posición en la "
1994-
"cadena coincide con el patrón; notar que esto es diferente a encontrar una "
1994+
"Escanea a través de la cadena *string* buscando la primera ubicación donde "
1995+
"esta expresión regular produce una coincidencia, y retorna un :class:`~re."
1996+
"Match` correspondiente. Retorna ``None`` si ninguna posición en la cadena "
1997+
"coincide con el patrón; notar que esto es diferente a encontrar una "
19951998
"coincidencia de longitud cero en algún punto de la cadena."
19961999

19972000
#: ../Doc/library/re.rst:1145
@@ -2031,10 +2034,10 @@ msgid ""
20312034
"the string does not match the pattern; note that this is different from a "
20322035
"zero-length match."
20332036
msgstr ""
2034-
"Si cero o más caracteres en el comienzo *beginning* de la cadena "
2035-
"*string* coinciden con esta expresión regular, retorna un :class:`~re.Match` "
2036-
"correspondiente. Retorna ``None`` si la cadena no coincide con el patrón; notar "
2037-
"que esto es diferente de una coincidencia de longitud cero."
2037+
"Si cero o más caracteres en el comienzo *beginning* de la cadena *string* "
2038+
"coinciden con esta expresión regular, retorna un :class:`~re.Match` "
2039+
"correspondiente. Retorna ``None`` si la cadena no coincide con el patrón; "
2040+
"notar que esto es diferente de una coincidencia de longitud cero."
20382041

20392042
#: ../Doc/library/re.rst:1171 ../Doc/library/re.rst:1189
20402043
msgid ""
@@ -2059,10 +2062,10 @@ msgid ""
20592062
"corresponding :class:`~re.Match`. Return ``None`` if the string does not "
20602063
"match the pattern; note that this is different from a zero-length match."
20612064
msgstr ""
2062-
"Si toda la cadena *string* coincide con esta expresión regular, "
2063-
"retorna un :class:`~re.Match` correspondiente. Retorna ``None`` si la "
2064-
"cadena no coincide con el patrón; notar que esto es diferente de una "
2065-
"coincidencia de longitud cero."
2065+
"Si toda la cadena *string* coincide con esta expresión regular, retorna un :"
2066+
"class:`~re.Match` correspondiente. Retorna ``None`` si la cadena no "
2067+
"coincide con el patrón; notar que esto es diferente de una coincidencia de "
2068+
"longitud cero."
20662069

20672070
#: ../Doc/library/re.rst:1203
20682071
msgid "Identical to the :func:`split` function, using the compiled pattern."
@@ -2158,8 +2161,8 @@ msgid ""
21582161
":py:class:`re.Match` supports ``[]`` to indicate a Unicode (str) or bytes "
21592162
"match. See :ref:`types-genericalias`."
21602163
msgstr ""
2161-
":py:class:`re.Match` soporta ``[]`` para indicar una coincidencia Unicode (str) o de bytes. "
2162-
"Ver :ref:`types-genericalias`."
2164+
":py:class:`re.Match` soporta ``[]`` para indicar una coincidencia Unicode "
2165+
"(str) o de bytes. Ver :ref:`types-genericalias`."
21632166

21642167
#: ../Doc/library/re.rst:1283
21652168
msgid ""
@@ -2559,11 +2562,14 @@ msgstr "search() vs. match()"
25592562
#: ../Doc/library/re.rst:1591
25602563
msgid ""
25612564
"Python offers different primitive operations based on regular expressions:"
2562-
msgstr "Python ofrece diferentes operaciones primitivas basadas en expresiones regulares:"
2565+
msgstr ""
2566+
"Python ofrece diferentes operaciones primitivas basadas en expresiones "
2567+
"regulares:"
25632568

25642569
#: ../Doc/library/re.rst:1593
25652570
msgid ":func:`re.match` checks for a match only at the beginning of the string"
2566-
msgstr ":func:`re.match` verifica una coincidencia solo al principio de la cadena"
2571+
msgstr ""
2572+
":func:`re.match` verifica una coincidencia solo al principio de la cadena"
25672573

25682574
#: ../Doc/library/re.rst:1594
25692575
msgid ""
@@ -2575,7 +2581,8 @@ msgstr ""
25752581

25762582
#: ../Doc/library/re.rst:1596
25772583
msgid ":func:`re.fullmatch` checks for entire string to be a match"
2578-
msgstr ":func:`re.fullmatch` verifica si la cadena completa es una coincidencia"
2584+
msgstr ""
2585+
":func:`re.fullmatch` verifica si la cadena completa es una coincidencia"
25792586

25802587
#: ../Doc/library/re.rst:1608
25812588
msgid ""
@@ -2697,12 +2704,12 @@ msgid ""
26972704
"writer wanted to find all of the adverbs *and their positions* in some text, "
26982705
"they would use :func:`finditer` in the following manner::"
26992706
msgstr ""
2700-
"Si se desea obtener más información sobre todas las coincidencias de un patrón en "
2701-
"lugar del texto coincidente, :func:`finditer` es útil ya que proporciona :"
2702-
"class:`~re.Match` objetos en lugar de cadenas. "
2703-
"Continuando con el ejemplo anterior, si un escritor quisiera encontrar todos "
2704-
"los adverbios *y sus posiciones* en algún texto, usaría :func:`finditer` de "
2705-
"la siguiente manera::"
2707+
"Si se desea obtener más información sobre todas las coincidencias de un "
2708+
"patrón en lugar del texto coincidente, :func:`finditer` es útil ya que "
2709+
"proporciona :class:`~re.Match` objetos en lugar de cadenas. Continuando con "
2710+
"el ejemplo anterior, si un escritor quisiera encontrar todos los adverbios "
2711+
"*y sus posiciones* en algún texto, usaría :func:`finditer` de la siguiente "
2712+
"manera::"
27062713

27072714
#: ../Doc/library/re.rst:1736
27082715
msgid "Raw String Notation"
@@ -2810,7 +2817,7 @@ msgstr "$ (dólar)"
28102817

28112818
#: ../Doc/library/re.rst:123
28122819
msgid "* (asterisk)"
2813-
msgstr * (asterisco)"
2820+
msgstr "* (asterisco)"
28142821

28152822
#: ../Doc/library/re.rst:130
28162823
msgid "+ (plus)"

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ PyICU
77
polib
88
pospell>=1.1
99
potodo
10-
powrap
10+
powrap>=1.0.2
1111
python-docs-theme>=2022.1
1212
setuptools
1313
sphinx-intl>=2.3.0

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy